Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
performance
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zry
performance
Commits
35c049ae
Commit
35c049ae
authored
Jun 09, 2022
by
ruyun.zhang@suvalue.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
还原到老版查询个人绩效
parent
ee39c22e
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
234 additions
and
38 deletions
+234
-38
performance/Performance.DtoModels/Response/OwnerPerformanceDto.cs
+2
-0
performance/Performance.Repository/PerforReportRepository .cs
+9
-4
performance/Performance.Services/AllotService.cs
+223
-34
No files found.
performance/Performance.DtoModels/Response/OwnerPerformanceDto.cs
View file @
35c049ae
...
...
@@ -50,6 +50,8 @@ public class OwnerMobileItemDto
}
public
class
OwnerMobileItemDetailDto
{
public
OwnerMobileItemDetailDto
()
{
}
public
OwnerMobileItemDetailDto
(
string
title
,
decimal
amount
,
string
date
)
{
Title
=
title
;
...
...
performance/Performance.Repository/PerforReportRepository .cs
View file @
35c049ae
...
...
@@ -396,13 +396,18 @@ public List<view_allot_result> GetOwnerPerformance(List<int> hospitalId, string
string
sql
=
"SELECT * FROM view_allot_result WHERE States IN (6,8) AND HospitalID IN @HospitalID AND JobNumber=@JobNumber"
;
return
DapperQuery
<
view_allot_result
>(
sql
,
new
{
HospitalID
=
hospitalId
,
JobNumber
=
jobNumber
})?.
ToList
();
}
public
List
<
view_allot_sign_emp
>
GetOwnerPerformance
(
string
jobNumber
)
public
List
<
view_allot_result
>
GetOwnerPerformance
(
string
jobNumber
)
{
string
sql
=
"SELECT * FROM
freeze_allot_sign_emp WHERE (States = 8 OR IFNULL(Batch,'') != ''
) AND JobNumber=@JobNumber"
;
return
DapperQuery
<
view_allot_
sign_emp
>(
sql
,
new
{
JobNumber
=
jobNumber
})?.
ToList
();
string
sql
=
"SELECT * FROM
view_allot_result WHERE States IN (6,8
) AND JobNumber=@JobNumber"
;
return
DapperQuery
<
view_allot_
result
>(
sql
,
new
{
JobNumber
=
jobNumber
})?.
ToList
();
}
//public List<view_allot_sign_emp> GetOwnerPerformance(string jobNumber)
//{
// string sql = "SELECT * FROM freeze_allot_sign_emp WHERE (States = 8 OR IFNULL(Batch,'') != '') AND JobNumber=@JobNumber";
// return DapperQuery<view_allot_sign_emp>(sql, new { JobNumber = jobNumber })?.ToList();
//}
/// <summary>
/// 个人绩效查询 医院其他绩效
/// </summary>
...
...
performance/Performance.Services/AllotService.cs
View file @
35c049ae
...
...
@@ -775,21 +775,192 @@ public List<OwnerPerformanceDto> GetOwnerPerformance(int userid)
return
res
?.
OrderByDescending
(
w
=>
w
.
Year
).
ThenByDescending
(
w
=>
w
.
Month
).
ToList
();
}
#
region
新版要合并到
develop
上才能使用
///// <summary>
///// 格式转换
///// </summary>
///// <param name="jobNumber"></param>
///// <param name="beginDate"></param>
///// <param name="endDate"></param>
///// <returns></returns>
//public List<OwnerMobilePerformanceDto> GetOwnerMobilePerformance(string jobNumber, DateTime beginDate, DateTime endDate)
//{
// List<OwnerMobilePerformanceDto> dtos = new List<OwnerMobilePerformanceDto>();
// var datas = _reportRepository.GetOwnerPerformance(jobNumber) ?? new List<view_allot_sign_emp>();
// var otherAmounts = _reportRepository.GetOwnerOtherAmount(jobNumber) ?? new List<view_other_amount>();
// var otherAmountHides = _reportRepository.GetOwnerOtherAmountHide(jobNumber) ?? new List<view_other_amount>();
// var filterDatas = datas.Where(w => (new DateTime(w.Year, w.Month, 1)) >= beginDate && (new DateTime(w.Year, w.Month, 1)) < endDate);
// var groupDatas = filterDatas.GroupBy(w => w.JobNumber);
// foreach (var item in groupDatas)
// {
// var perforSumFee = new OwnerMobileItemDto
// {
// Title = "业绩绩效",
// Amount = item.Sum(w => w.PerforSumFee),
// Details = item
// .Where(w => (w.PerforSumFee) != 0)
// .Select(w => new OwnerMobileItemDetailDto(w.AccountingUnit, w.PerforSumFee, w.BatchDate)).ToList()
// };
// var perforManagementFee = new OwnerMobileItemDto
// {
// Title = "管理绩效",
// Amount = item.Sum(w => w.PerforManagementFee),
// Details = item
// .Where(w => w.PerforManagementFee != 0)
// .Select(w => new OwnerMobileItemDetailDto(w.AccountingUnit, w.PerforManagementFee, w.BatchDate)).ToList()
// };
// var nightWorkPerfor = new OwnerMobileItemDto
// {
// Title = "夜班绩效",
// Amount = item.Sum(w => w.NightWorkPerfor),
// Details = item
// .Where(w => w.NightWorkPerfor != 0)
// .Select(w => new OwnerMobileItemDetailDto(w.AccountingUnit, w.NightWorkPerfor, w.BatchDate)).ToList()
// };
// var otherPerfor = new OwnerMobileItemDto
// {
// Title = "医院其他绩效",
// Amount = item.Sum(w => w.OtherPerfor),
// Details = new List<OwnerMobileItemDetailDto>()
// };
// foreach (var p in item)
// {
// var qt = otherAmounts.Where(w => w.AllotId == p.AllotId).Select(w => new OwnerMobileItemDetailDto(w.PerforType, w.Amount, p.BatchDate));
// if (qt.Any()) otherPerfor.Details.AddRange(qt);
// }
// var hideOtherPerfor = new OwnerMobileItemDto
// {
// Title = "不公示其他绩效",
// Amount = item.Sum(w => w.HideOtherPerfor),
// Details = new List<OwnerMobileItemDetailDto>()
// };
// foreach (var p in item)
// {
// var qt = otherAmountHides.Where(w => w.AllotId == p.AllotId).Select(w => new OwnerMobileItemDetailDto(w.PerforType, w.Amount, p.BatchDate));
// if (qt.Any()) hideOtherPerfor.Details.AddRange(qt);
// }
// var reservedRatioFee = new OwnerMobileItemDto
// {
// Title = "预留绩效",
// Amount = item.Sum(w => w.ReservedRatioFee),
// Details = new List<OwnerMobileItemDetailDto>()
// };
// var dto = new OwnerMobilePerformanceDto { Total = item.Sum(w => w.RealGiveFee), Items = new List<OwnerMobileItemDto>() };
// if (perforSumFee.Amount != 0) dto.Items.Add(perforSumFee);
// if (perforManagementFee.Amount != 0) dto.Items.Add(perforManagementFee);
// if (nightWorkPerfor.Amount != 0) dto.Items.Add(nightWorkPerfor);
// if (otherPerfor.Amount != 0) dto.Items.Add(otherPerfor);
// if (hideOtherPerfor.Amount != 0) dto.Items.Add(hideOtherPerfor);
// if (reservedRatioFee.Amount != 0) dto.Items.Add(reservedRatioFee);
// dtos.Add(dto);
// }
// return dtos;
//}
#
endregion
/// <summary>
/// 格式转换
/// </summary>
/// <param name="
userid
"></param>
/// <param name="
jobNumber
"></param>
/// <param name="beginDate"></param>
/// <param name="endDate"></param>
/// <returns></returns>
public
List
<
OwnerMobilePerformanceDto
>
GetOwnerMobilePerformance
(
string
jobNumber
,
DateTime
beginDate
,
DateTime
endDate
)
{
List
<
OwnerMobilePerformanceDto
>
dtos
=
new
List
<
OwnerMobilePerformanceDto
>();
var
datas
=
_reportRepository
.
GetOwnerPerformance
(
jobNumber
)
??
new
List
<
view_allot_sign_emp
>();
var
otherAmounts
=
_reportRepository
.
GetOwnerOtherAmount
(
jobNumber
)
??
new
List
<
view_other_amount
>();
var
otherAmountHides
=
_reportRepository
.
GetOwnerOtherAmountHide
(
jobNumber
)
??
new
List
<
view_other_amount
>();
var
owner
=
_reportRepository
.
GetOwnerPerformance
(
jobNumber
);
var
filterDatas
=
datas
.
Where
(
w
=>
(
new
DateTime
(
w
.
Year
,
w
.
Month
,
1
))
>=
beginDate
&&
(
new
DateTime
(
w
.
Year
,
w
.
Month
,
1
))
<
endDate
);
if
(
owner
==
null
||
!
owner
.
Any
())
return
dtos
;
var
employees
=
_perforPeremployeeRepository
.
GetEntities
(
w
=>
w
.
PersonnelNumber
==
jobNumber
);
var
allotIds
=
owner
.
Select
(
w
=>
w
.
AllotId
).
Distinct
().
ToList
();
var
batchs
=
_batchRepository
.
GetEntities
(
w
=>
allotIds
.
Contains
(
w
.
AllotId
));
var
allots
=
_allotRepository
.
GetEntities
(
w
=>
allotIds
.
Contains
(
w
.
ID
));
// 发放时间 归档状态永远显示,如果没有发放时间则使用归档时间,绩效下发状态下显示标记发放时间
Func
<
OwnerPerformanceDto
,
string
>
getIssueDate
=
(
owner
)
=>
{
var
batch
=
batchs
.
FirstOrDefault
(
p
=>
p
.
AllotId
==
owner
.
AllotId
&&
p
.
UnitType
==
owner
.
UnitType
&&
p
.
AccountingUnit
==
owner
.
AccountingUnit
&&
p
.
PersonnelNumber
==
owner
.
JobNumber
);
var
allot
=
allots
.
FirstOrDefault
(
w
=>
w
.
ID
==
owner
.
AllotId
);
if
(
batch
?.
BatchDate
!=
null
&&
batch
.
BatchDate
.
HasValue
)
return
batch
.
BatchDate
.
Value
.
ToString
(
"yyyy年MM月dd日 HH:mm"
);
else
if
(
allot
?.
States
==
(
int
)
AllotStates
.
Archive
)
{
if
(
allot
?.
PigeonholeDate
!=
null
&&
allot
.
PigeonholeDate
.
HasValue
)
return
allot
.
PigeonholeDate
.
Value
.
ToString
(
"yyyy年MM月dd日 HH:mm"
);
return
$"
{
allot
.
Year
}
年
{
allot
}
月"
;
}
return
""
;
};
var
res
=
owner
.
Where
(
w
=>
w
.
States
==
(
int
)
AllotStates
.
Archive
)
.
GroupBy
(
w
=>
new
{
w
.
AllotId
,
w
.
Year
,
w
.
Month
,
w
.
JobNumber
})
.
Select
(
w
=>
new
OwnerPerformanceDto
{
AllotId
=
w
.
Key
.
AllotId
,
Year
=
w
.
Key
.
Year
,
Month
=
w
.
Key
.
Month
,
JobNumber
=
w
.
Key
.
JobNumber
,
PerforSumFee
=
Math
.
Round
(
w
.
Sum
(
p
=>
p
.
PerforSumFee
)
??
0
,
2
,
MidpointRounding
.
AwayFromZero
),
// 业绩绩效
PerforManagementFee
=
Math
.
Round
(
w
.
Sum
(
p
=>
p
.
PerforManagementFee
)
??
0
,
2
,
MidpointRounding
.
AwayFromZero
),
// 管理绩效
NightWorkPerfor
=
Math
.
Round
(
w
.
Sum
(
p
=>
p
.
NightWorkPerfor
)
??
0
,
2
,
MidpointRounding
.
AwayFromZero
),
// 夜班绩效
AdjustLaterOtherFee
=
Math
.
Round
(
w
.
Sum
(
p
=>
p
.
AdjustLaterOtherFee
)
??
0
,
2
,
MidpointRounding
.
AwayFromZero
),
// 调节后其他绩效
OtherPerfor
=
Math
.
Round
(
w
.
Sum
(
p
=>
p
.
OtherPerfor
)
??
0
,
2
,
MidpointRounding
.
AwayFromZero
),
// 医院其他绩效
HideOtherPerfor
=
Math
.
Round
(
w
.
Sum
(
p
=>
p
.
HideOtherPerfor
)
??
0
,
2
,
MidpointRounding
.
AwayFromZero
),
// 不公示其他绩效
RealPerformance
=
Math
.
Round
(
w
.
Sum
(
p
=>
p
.
RealPerformance
)
??
0
,
2
,
MidpointRounding
.
AwayFromZero
),
// 中转使用: 业绩绩效+管理绩效+调节后其他绩效
Detail
=
w
.
Where
(
p
=>
p
.
Year
==
w
.
Key
.
Year
&&
p
.
Month
==
w
.
Key
.
Month
&&
p
.
JobNumber
==
w
.
Key
.
JobNumber
)
.
Select
(
detial
=>
{
var
dto
=
_mapper
.
Map
<
OwnerPerformanceDto
>(
detial
);
dto
.
Source
=
string
.
IsNullOrEmpty
(
detial
.
SourceItem
)
?
detial
.
Source
:
$"
{
detial
.
Source
}
-
{
detial
.
SourceItem
}
"
;
dto
.
IssueDate
=
getIssueDate
(
dto
);
// 应发绩效
dto
.
ShouldGiveFee
=
Math
.
Round
((
dto
.
RealPerformance
??
0
)
+
(
dto
.
OtherPerfor
??
0
)
+
(
dto
.
HideOtherPerfor
??
0
)
+
(
dto
.
NightWorkPerfor
??
0
),
2
,
MidpointRounding
.
AwayFromZero
);
dto
.
ReservedRatio
=
employees
?.
FirstOrDefault
(
emp
=>
emp
.
AllotId
==
dto
.
AllotId
&&
emp
.
PersonnelNumber
==
jobNumber
)?.
ReservedRatio
??
0
;
// 预留比例
dto
.
ReservedRatioFee
=
Math
.
Round
((
dto
.
RealPerformance
??
0
)
*
(
dto
.
ReservedRatio
??
0
),
2
,
MidpointRounding
.
AwayFromZero
);
// 预留绩效
dto
.
RealGiveFee
=
Math
.
Round
(
dto
.
ShouldGiveFee
-
(
dto
.
ReservedRatioFee
??
0
)
??
0
,
2
,
MidpointRounding
.
AwayFromZero
);
// 实发绩效
return
dto
;
})
.
Where
(
w
=>
!
string
.
IsNullOrEmpty
(
w
.
IssueDate
)),
})
.
ToList
();
foreach
(
var
item
in
res
)
{
item
.
UnitType
=
employees
?.
FirstOrDefault
(
w
=>
w
.
AllotId
==
item
.
AllotId
&&
w
.
PersonnelNumber
==
jobNumber
)?.
UnitType
??
""
;
item
.
AccountingUnit
=
employees
?.
FirstOrDefault
(
w
=>
w
.
AllotId
==
item
.
AllotId
&&
w
.
PersonnelNumber
==
jobNumber
)?.
AccountingUnit
??
""
;
item
.
EmployeeName
=
employees
?.
FirstOrDefault
(
w
=>
w
.
AllotId
==
item
.
AllotId
&&
w
.
PersonnelNumber
==
jobNumber
)?.
DoctorName
??
""
;
// 全部是0的记录不显示
item
.
Detail
=
item
.
Detail
.
Where
(
w
=>
!(
w
.
PerforSumFee
==
0
&&
w
.
PerforManagementFee
==
0
&&
w
.
ShouldGiveFee
==
0
&&
w
.
OtherPerfor
==
0
&&
w
.
HideOtherPerfor
==
0
&&
w
.
RealGiveFee
==
0
));
// 为了保证总额一致
item
.
ShouldGiveFee
=
Math
.
Round
(
item
.
Detail
?.
Sum
(
w
=>
w
.
ShouldGiveFee
)
??
0
,
2
,
MidpointRounding
.
AwayFromZero
);
// 应发绩效
item
.
ReservedRatio
=
employees
?.
FirstOrDefault
(
w
=>
w
.
AllotId
==
item
.
AllotId
&&
w
.
PersonnelNumber
==
jobNumber
)?.
ReservedRatio
??
0
;
// 预留比例
item
.
ReservedRatioFee
=
Math
.
Round
(
item
.
Detail
?.
Sum
(
w
=>
w
.
ReservedRatioFee
)
??
0
,
2
,
MidpointRounding
.
AwayFromZero
);
// 预留绩效
item
.
RealGiveFee
=
Math
.
Round
(
item
.
Detail
?.
Sum
(
w
=>
w
.
RealGiveFee
)
??
0
,
2
,
MidpointRounding
.
AwayFromZero
);
// 实发绩效
}
var
datas
=
res
?.
OrderByDescending
(
w
=>
w
.
Year
).
ThenByDescending
(
w
=>
w
.
Month
).
ToList
();
if
(
datas
==
null
||
datas
.
Count
==
0
)
return
dtos
;
var
filterDatas
=
datas
.
Where
(
w
=>
(
new
DateTime
(
w
.
Year
,
w
.
Month
,
1
))
>=
beginDate
&&
(
new
DateTime
(
w
.
Year
,
w
.
Month
,
1
))
<
endDate
);
var
groupDatas
=
filterDatas
.
GroupBy
(
w
=>
w
.
JobNumber
);
foreach
(
var
item
in
groupDatas
)
...
...
@@ -797,55 +968,72 @@ public List<OwnerMobilePerformanceDto> GetOwnerMobilePerformance(string jobNumbe
var
perforSumFee
=
new
OwnerMobileItemDto
{
Title
=
"业绩绩效"
,
Amount
=
item
.
Sum
(
w
=>
w
.
PerforSumFee
),
Details
=
item
.
Where
(
w
=>
(
w
.
PerforSumFee
)
!=
0
)
.
Select
(
w
=>
new
OwnerMobileItemDetailDto
(
w
.
AccountingUnit
,
w
.
PerforSumFee
,
w
.
BatchDate
)).
ToList
()
Amount
=
item
.
Sum
(
w
=>
w
.
PerforSumFee
)
??
0
,
Details
=
item
.
SelectMany
(
w
=>
w
.
Detail
)
.
Where
(
w
=>
(
w
.
PerforSumFee
??
0
)
!=
0
&&
!
string
.
IsNullOrEmpty
(
w
.
IssueDate
))
.
Select
(
w
=>
new
OwnerMobileItemDetailDto
{
Title
=
w
.
AccountingUnit
,
Amount
=
w
.
PerforSumFee
??
0
,
Date
=
w
.
IssueDate
,
}).
ToList
()
};
var
perforManagementFee
=
new
OwnerMobileItemDto
{
Title
=
"管理绩效"
,
Amount
=
item
.
Sum
(
w
=>
w
.
PerforManagementFee
),
Details
=
item
.
Where
(
w
=>
w
.
PerforManagementFee
!=
0
)
.
Select
(
w
=>
new
OwnerMobileItemDetailDto
(
w
.
AccountingUnit
,
w
.
PerforManagementFee
,
w
.
BatchDate
)).
ToList
()
Amount
=
item
.
Sum
(
w
=>
w
.
PerforManagementFee
)
??
0
,
Details
=
item
.
SelectMany
(
w
=>
w
.
Detail
)
.
Where
(
w
=>
(
w
.
PerforManagementFee
??
0
)
!=
0
&&
!
string
.
IsNullOrEmpty
(
w
.
IssueDate
))
.
Select
(
w
=>
new
OwnerMobileItemDetailDto
{
Title
=
w
.
AccountingUnit
,
Amount
=
w
.
PerforManagementFee
??
0
,
Date
=
w
.
IssueDate
,
}).
ToList
()
};
var
nightWorkPerfor
=
new
OwnerMobileItemDto
{
Title
=
"夜班绩效"
,
Amount
=
item
.
Sum
(
w
=>
w
.
NightWorkPerfor
),
Details
=
item
.
Where
(
w
=>
w
.
NightWorkPerfor
!=
0
)
.
Select
(
w
=>
new
OwnerMobileItemDetailDto
(
w
.
AccountingUnit
,
w
.
NightWorkPerfor
,
w
.
BatchDate
)).
ToList
()
Amount
=
item
.
Sum
(
w
=>
w
.
NightWorkPerfor
)
??
0
,
Details
=
item
.
SelectMany
(
w
=>
w
.
Detail
)
.
Where
(
w
=>
(
w
.
NightWorkPerfor
??
0
)
!=
0
&&
!
string
.
IsNullOrEmpty
(
w
.
IssueDate
))
.
Select
(
w
=>
new
OwnerMobileItemDetailDto
{
Title
=
w
.
AccountingUnit
,
Amount
=
w
.
NightWorkPerfor
??
0
,
Date
=
w
.
IssueDate
,
}).
ToList
()
};
var
otherPerfor
=
new
OwnerMobileItemDto
{
Title
=
"医院其他绩效"
,
Amount
=
item
.
Sum
(
w
=>
w
.
OtherPerfor
),
Details
=
new
List
<
OwnerMobileItemDetailDto
>(
)
};
foreach
(
var
p
in
item
)
Amount
=
item
.
Sum
(
w
=>
w
.
OtherPerfor
)
??
0
,
Details
=
item
.
SelectMany
(
w
=>
w
.
Detail
)
.
Where
(
w
=>
(
w
.
OtherPerfor
??
0
)
!=
0
&&
!
string
.
IsNullOrEmpty
(
w
.
IssueDate
))
.
Select
(
w
=>
new
OwnerMobileItemDetailDto
{
var
qt
=
otherAmounts
.
Where
(
w
=>
w
.
AllotId
==
p
.
AllotId
).
Select
(
w
=>
new
OwnerMobileItemDetailDto
(
w
.
PerforType
,
w
.
Amount
,
p
.
BatchDate
));
if
(
qt
.
Any
())
otherPerfor
.
Details
.
AddRange
(
qt
);
}
Title
=
w
.
SourceItem
,
Amount
=
w
.
OtherPerfor
??
0
,
Date
=
w
.
IssueDate
,
}).
ToList
()
};
var
hideOtherPerfor
=
new
OwnerMobileItemDto
{
Title
=
"不公示其他绩效"
,
Amount
=
item
.
Sum
(
w
=>
w
.
HideOtherPerfor
),
Details
=
new
List
<
OwnerMobileItemDetailDto
>(
)
};
foreach
(
var
p
in
item
)
Amount
=
item
.
Sum
(
w
=>
w
.
HideOtherPerfor
)
??
0
,
Details
=
item
.
SelectMany
(
w
=>
w
.
Detail
)
.
Where
(
w
=>
(
w
.
HideOtherPerfor
??
0
)
!=
0
&&
!
string
.
IsNullOrEmpty
(
w
.
IssueDate
))
.
Select
(
w
=>
new
OwnerMobileItemDetailDto
{
var
qt
=
otherAmountHides
.
Where
(
w
=>
w
.
AllotId
==
p
.
AllotId
).
Select
(
w
=>
new
OwnerMobileItemDetailDto
(
w
.
PerforType
,
w
.
Amount
,
p
.
BatchDate
));
if
(
qt
.
Any
())
hideOtherPerfor
.
Details
.
AddRange
(
qt
);
}
Title
=
w
.
SourceItem
,
Amount
=
w
.
HideOtherPerfor
??
0
,
Date
=
w
.
IssueDate
,
}).
ToList
()
};
var
reservedRatioFee
=
new
OwnerMobileItemDto
{
Title
=
"预留绩效"
,
Amount
=
item
.
Sum
(
w
=>
w
.
ReservedRatioFee
),
Amount
=
item
.
Sum
(
w
=>
w
.
ReservedRatioFee
)
??
0
,
Details
=
new
List
<
OwnerMobileItemDetailDto
>()
};
...
...
@@ -862,5 +1050,6 @@ public List<OwnerMobilePerformanceDto> GetOwnerMobilePerformance(string jobNumbe
return
dtos
;
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment