timeStamp report แบบ generate ตรง
Some checks failed
release-dev / release-dev (push) Failing after 13s
Some checks failed
release-dev / release-dev (push) Failing after 13s
This commit is contained in:
parent
0ee17ef586
commit
ef9fafecfc
2 changed files with 355 additions and 2 deletions
|
|
@ -26,7 +26,9 @@ using System.Diagnostics.Metrics;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using static Nest.JoinField;
|
using static Nest.JoinField;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using OfficeOpenXml;
|
||||||
|
using Microsoft.AspNetCore.Routing.Template;
|
||||||
namespace BMA.EHR.Leave.Service.Controllers
|
namespace BMA.EHR.Leave.Service.Controllers
|
||||||
{
|
{
|
||||||
[Route("api/v{version:apiVersion}/leave/report")]
|
[Route("api/v{version:apiVersion}/leave/report")]
|
||||||
|
|
@ -52,6 +54,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
||||||
private readonly IHttpContextAccessor _httpContextAccessor;
|
private readonly IHttpContextAccessor _httpContextAccessor;
|
||||||
private readonly PermissionRepository _permission;
|
private readonly PermissionRepository _permission;
|
||||||
private readonly LeaveBeginningRepository _leaveBeginningRepository;
|
private readonly LeaveBeginningRepository _leaveBeginningRepository;
|
||||||
|
private readonly IWebHostEnvironment _hostingEnvironment;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
@ -68,7 +71,8 @@ namespace BMA.EHR.Leave.Service.Controllers
|
||||||
UserCalendarRepository userCalendarRepository,
|
UserCalendarRepository userCalendarRepository,
|
||||||
IHttpContextAccessor httpContextAccessor,
|
IHttpContextAccessor httpContextAccessor,
|
||||||
PermissionRepository permission,
|
PermissionRepository permission,
|
||||||
LeaveBeginningRepository leaveBeginningRepository)
|
LeaveBeginningRepository leaveBeginningRepository,
|
||||||
|
IWebHostEnvironment hostingEnvironment)
|
||||||
{
|
{
|
||||||
_leaveRequestRepository = leaveRequestRepository;
|
_leaveRequestRepository = leaveRequestRepository;
|
||||||
_userProfileRepository = userProfileRepository;
|
_userProfileRepository = userProfileRepository;
|
||||||
|
|
@ -82,6 +86,7 @@ namespace BMA.EHR.Leave.Service.Controllers
|
||||||
_httpContextAccessor = httpContextAccessor;
|
_httpContextAccessor = httpContextAccessor;
|
||||||
_permission = permission;
|
_permission = permission;
|
||||||
_leaveBeginningRepository = leaveBeginningRepository;
|
_leaveBeginningRepository = leaveBeginningRepository;
|
||||||
|
_hostingEnvironment = hostingEnvironment;
|
||||||
}
|
}
|
||||||
private class LoopDate
|
private class LoopDate
|
||||||
{
|
{
|
||||||
|
|
@ -1678,6 +1683,354 @@ namespace BMA.EHR.Leave.Service.Controllers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// LV2_037 - รายงานการเข้างานจำแนกรายวัน รายสัปดาห์ รายเดือน แยกรายหน่วยงาน/ส่วนราชการ
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>
|
||||||
|
/// </returns>
|
||||||
|
/// <response code="200">เมื่อทำรายการสำเร็จ</response>
|
||||||
|
/// <response code="401">ไม่ได้ Login เข้าระบบ</response>
|
||||||
|
/// <response code="500">เมื่อเกิดข้อผิดพลาดในการทำงาน</response>
|
||||||
|
[HttpPost("download/time-records/{type}")]
|
||||||
|
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
|
||||||
|
public async Task<ActionResult<ResponseObject>> GetTimeRecordsNewOfficerReport([FromBody] GetLeaveDetailByNodeReportDto req, string type)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var getPermission = await _permission.GetPermissionAPIAsync("LIST", "SYS_LEAVE_REPORT");
|
||||||
|
var jsonData = JsonConvert.DeserializeObject<JObject>(getPermission);
|
||||||
|
if (jsonData["status"]?.ToString() != "200")
|
||||||
|
{
|
||||||
|
return Error(jsonData["message"]?.ToString(), StatusCodes.Status403Forbidden);
|
||||||
|
}
|
||||||
|
var profile = new List<GetProfileByKeycloakIdRootDto>();
|
||||||
|
string role = jsonData["result"]?.ToString();
|
||||||
|
var nodeId = string.Empty;
|
||||||
|
var profileAdmin = new GetUserOCAllDto();
|
||||||
|
profileAdmin = await _userProfileRepository.GetUserOCAll(Guid.Parse(UserId!), AccessToken);
|
||||||
|
if (role == "NORMAL" || role == "CHILD")
|
||||||
|
{
|
||||||
|
nodeId = profileAdmin?.Node == 4
|
||||||
|
? profileAdmin?.Child4DnaId
|
||||||
|
: profileAdmin?.Node == 3
|
||||||
|
? profileAdmin?.Child3DnaId
|
||||||
|
: profileAdmin?.Node == 2
|
||||||
|
? profileAdmin?.Child2DnaId
|
||||||
|
: profileAdmin?.Node == 1
|
||||||
|
? profileAdmin?.Child1DnaId
|
||||||
|
: profileAdmin?.Node == 0
|
||||||
|
? profileAdmin?.RootDnaId
|
||||||
|
: "";
|
||||||
|
}
|
||||||
|
else if (role == "ROOT")
|
||||||
|
{
|
||||||
|
nodeId = profileAdmin?.RootDnaId;
|
||||||
|
}
|
||||||
|
if (type.Trim().ToUpper() == "OFFICER")
|
||||||
|
{
|
||||||
|
profile = await _userProfileRepository.GetProfileByAdminRole(AccessToken, profileAdmin?.Node, nodeId, role, req.revisionId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
profile = await _userProfileRepository.GetEmployeeByAdminRole(AccessToken, profileAdmin?.Node, nodeId, role, req.revisionId);
|
||||||
|
}
|
||||||
|
var date = req.StartDate.Date;
|
||||||
|
|
||||||
|
var holidays = await _holidayRepository.GetHolidayAsync(req.StartDate.Date, req.EndDate.Date);
|
||||||
|
var weekend = _holidayRepository.GetWeekEnd(req.StartDate.Date, req.EndDate.Date);
|
||||||
|
var excludeDates = holidays.Union(weekend).ToList();
|
||||||
|
|
||||||
|
var dateList = new List<LoopDate>();
|
||||||
|
for (DateTime i = req.StartDate.Date; i <= req.EndDate.Date; i = i.AddDays(1))
|
||||||
|
{
|
||||||
|
|
||||||
|
if (holidays.Contains(i))
|
||||||
|
{
|
||||||
|
var d = await _holidayRepository.GetHolidayAsync(i);
|
||||||
|
dateList.Add(new LoopDate
|
||||||
|
{
|
||||||
|
date = i,
|
||||||
|
isHoliday = true,
|
||||||
|
isWeekEnd = false,
|
||||||
|
dateRemark = d
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (weekend.Contains(i))
|
||||||
|
{
|
||||||
|
dateList.Add(new LoopDate
|
||||||
|
{
|
||||||
|
date = i,
|
||||||
|
isHoliday = true,
|
||||||
|
isWeekEnd = false,
|
||||||
|
dateRemark = "วันหยุด"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dateList.Add(new LoopDate
|
||||||
|
{
|
||||||
|
date = i,
|
||||||
|
isHoliday = false,
|
||||||
|
isWeekEnd = false,
|
||||||
|
dateRemark = ""
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var employees = new List<DateResultReport>();
|
||||||
|
var count = 1;
|
||||||
|
|
||||||
|
var restTotal = 0;
|
||||||
|
var sickTotal = 0;
|
||||||
|
var lateTotal = 0;
|
||||||
|
var wfhTotal = 0;
|
||||||
|
var studyTotal = 0;
|
||||||
|
var workTotal = 0;
|
||||||
|
var seminarTotal = 0;
|
||||||
|
// กรองตามที่ fe ส่งมา
|
||||||
|
if (role == "ROOT" || role == "OWNER" || role == "CHILD")
|
||||||
|
{
|
||||||
|
profile = profile
|
||||||
|
.Where(x => req.node == 4 ? x.OrgChild4Id == req.nodeId : req.node == 3 ? x.OrgChild3Id == req.nodeId : req.node == 2 ? x.OrgChild2Id == req.nodeId : req.node == 1 ? x.OrgChild1Id == req.nodeId : req.node == 0 ? x.OrgRootId == req.nodeId : true)
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
|
var defaultRound = await _dutyTimeRepository.GetDefaultAsync();
|
||||||
|
if (defaultRound == null)
|
||||||
|
{
|
||||||
|
return Error("ไม่พบรอบการลงเวลา Default", StatusCodes.Status404NotFound);
|
||||||
|
}
|
||||||
|
foreach (var dd in dateList)
|
||||||
|
{
|
||||||
|
foreach (var p in profile)
|
||||||
|
{
|
||||||
|
var keycloakUserId = p.Keycloak ?? Guid.Empty;
|
||||||
|
|
||||||
|
var timeStamps = await _processUserTimeStampRepository.GetTimestampByDateAsync(keycloakUserId, dd.date);
|
||||||
|
|
||||||
|
var fullName = $"{p.Prefix}{p.FirstName} {p.LastName}";
|
||||||
|
|
||||||
|
var effectiveDate = await _userDutyTimeRepository.GetLastEffectRound(p.Id);
|
||||||
|
var roundId = effectiveDate != null ? effectiveDate.DutyTimeId : Guid.Empty;
|
||||||
|
var userRound = await _dutyTimeRepository.GetByIdAsync(roundId);
|
||||||
|
|
||||||
|
var duty = userRound ?? defaultRound;
|
||||||
|
|
||||||
|
// check วันลาของแต่ละคน
|
||||||
|
var leaveReq = await _leaveRequestRepository.GetLeavePeriodAsync(keycloakUserId, dd.date);
|
||||||
|
var remarkStr = string.Empty;
|
||||||
|
|
||||||
|
if (leaveReq != null)
|
||||||
|
{
|
||||||
|
switch (leaveReq.Type.Code.ToUpper())
|
||||||
|
{
|
||||||
|
case "LV-001":
|
||||||
|
case "LV-002":
|
||||||
|
case "LV-005":
|
||||||
|
remarkStr += leaveReq.Type.Name;
|
||||||
|
var leaveRange = leaveReq.LeaveRange == null ? "" : leaveReq.LeaveRange.ToUpper();
|
||||||
|
if (leaveRange == "MORNING")
|
||||||
|
remarkStr += "ครึ่งวันเช้า";
|
||||||
|
else if (leaveRange == "AFTERNOON")
|
||||||
|
remarkStr += "ครึ่งวันบ่าย";
|
||||||
|
|
||||||
|
|
||||||
|
var leaveRangeEnd = leaveReq.LeaveRangeEnd == null ? "" : leaveReq.LeaveRangeEnd.ToUpper();
|
||||||
|
if (leaveRangeEnd == "MORNING")
|
||||||
|
remarkStr += "ครึ่งวันเช้า";
|
||||||
|
else if (leaveRangeEnd == "AFTERNOON")
|
||||||
|
remarkStr += "ครึ่งวันบ่าย";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
remarkStr += leaveReq.Type.Name;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (timeStamps == null)
|
||||||
|
{
|
||||||
|
if (dd.date <= DateTime.Now.Date)
|
||||||
|
{
|
||||||
|
remarkStr = "ขาดราชการ";
|
||||||
|
if (dd.isHoliday == true)
|
||||||
|
{
|
||||||
|
remarkStr = $"วันหยุด ({dd.dateRemark})";
|
||||||
|
}
|
||||||
|
else if (dd.isWeekEnd)
|
||||||
|
{
|
||||||
|
remarkStr = dd.dateRemark;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else remarkStr = "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// check status ของการลงเวลา
|
||||||
|
if (timeStamps.CheckOut != null)
|
||||||
|
{
|
||||||
|
if (timeStamps.CheckOutStatus == "ABSENT")
|
||||||
|
remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckOut ? $" (นอกสถานที่:{timeStamps.CheckOutLocationName})".Trim() : "");
|
||||||
|
else if (timeStamps.CheckInStatus == "ABSENT")
|
||||||
|
remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
||||||
|
else if (timeStamps.CheckInStatus == "LATE")
|
||||||
|
{
|
||||||
|
remarkStr = "สาย" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
||||||
|
lateTotal += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
remarkStr = !timeStamps.IsLocationCheckIn ? $" นอกสถานที่:{timeStamps.CheckInLocationName}".Trim() : "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (timeStamps.CheckInStatus == "ABSENT")
|
||||||
|
remarkStr = "ขาดราชการ" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
||||||
|
else if (timeStamps.CheckInStatus == "LATE")
|
||||||
|
{
|
||||||
|
remarkStr = "สาย" + (!timeStamps.IsLocationCheckIn ? $" (นอกสถานที่:{timeStamps.CheckInLocationName})".Trim() : "");
|
||||||
|
lateTotal += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
remarkStr = !timeStamps.IsLocationCheckIn ? $" นอกสถานที่:{timeStamps.CheckInLocationName}".Trim() : "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var emp = new DateResultReport
|
||||||
|
{
|
||||||
|
no = count,
|
||||||
|
fullName = fullName,
|
||||||
|
dutyTimeName = $"{duty.StartTimeMorning} - {duty.EndTimeAfternoon} น.",
|
||||||
|
checkInLocation = timeStamps == null ? "" : timeStamps.CheckInPOI,
|
||||||
|
checkInTime = timeStamps == null ? "" : $"{timeStamps.CheckIn.ToString("HH:mm")} น.",
|
||||||
|
checkOutLocation = timeStamps == null ? "" : timeStamps.CheckOutPOI ?? "",
|
||||||
|
checkOutTime = timeStamps == null ? "" :
|
||||||
|
timeStamps.CheckOut != null ?
|
||||||
|
$"{timeStamps.CheckOut.Value.ToString("HH:mm")} น." :
|
||||||
|
"",
|
||||||
|
remark = remarkStr,
|
||||||
|
checkInDate = timeStamps == null ? dd.date.Date.ToThaiFullDate2() : timeStamps.CheckIn.Date.ToThaiFullDate2(),
|
||||||
|
checkedOutDate = timeStamps == null ? dd.date.Date.ToThaiFullDate2() :
|
||||||
|
timeStamps.CheckOut != null ?
|
||||||
|
timeStamps.CheckOut.Value.ToThaiFullDate2() :
|
||||||
|
"",
|
||||||
|
checkInTimeRaw = timeStamps?.CheckIn,
|
||||||
|
checkOutTimeRaw = timeStamps?.CheckOut,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (timeStamps != null)
|
||||||
|
{
|
||||||
|
workTotal += 1;
|
||||||
|
if (!timeStamps.IsLocationCheckIn)
|
||||||
|
{
|
||||||
|
if (timeStamps.CheckInLocationName == "ปฏิบัติงานที่บ้าน")
|
||||||
|
wfhTotal += 1;
|
||||||
|
else if (timeStamps.CheckInLocationName == "ไปประชุม/อบรม/สัมมนา/ปฏิบัติงานที่บ้านนอกสถานที่")
|
||||||
|
seminarTotal += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (leaveReq != null)
|
||||||
|
{
|
||||||
|
switch (leaveReq.Type.Code.ToUpper())
|
||||||
|
{
|
||||||
|
case "LV-001":
|
||||||
|
case "LV-002":
|
||||||
|
sickTotal += 1;
|
||||||
|
break;
|
||||||
|
case "LV-005":
|
||||||
|
restTotal += 1;
|
||||||
|
break;
|
||||||
|
case "LV-008":
|
||||||
|
studyTotal += 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
employees.Add(emp);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
employees = employees.OrderBy(x => x.checkInDate).ThenBy(x => x.checkInTimeRaw ?? DateTime.MaxValue).ThenBy(x => x.checkOutTimeRaw ?? DateTime.MaxValue).ToList();
|
||||||
|
for (int i = 0; i < employees.Count; i++)
|
||||||
|
{
|
||||||
|
employees[i].no = i + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
var enddate = req.EndDate.Date == req.StartDate.Date ? "" : $" - {req.EndDate.Date.ToThaiShortDate()}";
|
||||||
|
var org = _userProfileRepository.GetOc(Guid.Parse(req.nodeId), req.node, AccessToken);
|
||||||
|
var organizationName = $"{(!string.IsNullOrEmpty(org.Child4) ? org.Child4 + "/" : "")}{(!string.IsNullOrEmpty(org.Child3) ? org.Child3 + "/" : "")}{(!string.IsNullOrEmpty(org.Child2) ? org.Child2 + "/" : "")}{(!string.IsNullOrEmpty(org.Child1) ? org.Child1 + "/" : "")}{org.Root ?? ""}";
|
||||||
|
var dateTimeStamp = $"ประจำ ณ วัน{req.StartDate.Date.GetThaiDayOfWeek()} ที่ {req.StartDate.Date.ToThaiShortDate()}{enddate}";
|
||||||
|
var template = System.IO.Path.Combine(_hostingEnvironment.ContentRootPath, "Reports", "TimeStampRecords.xlsx");
|
||||||
|
FileInfo reportFile = new FileInfo(template);
|
||||||
|
using (var package = new ExcelPackage(reportFile))
|
||||||
|
{
|
||||||
|
var worksheet = package.Workbook.Worksheets[0];
|
||||||
|
worksheet.Cells[2, 1].Value = organizationName;
|
||||||
|
worksheet.Cells[3, 1].Value = dateTimeStamp;
|
||||||
|
int startRow = 5;
|
||||||
|
foreach (var emp in employees)
|
||||||
|
{
|
||||||
|
worksheet.Cells[startRow, 1].Value = emp.no;
|
||||||
|
worksheet.Cells[startRow, 2].Value = emp.fullName;
|
||||||
|
worksheet.Cells[startRow, 3].Value = emp.dutyTimeName;
|
||||||
|
worksheet.Cells[startRow, 4].Value = emp.checkInDate;
|
||||||
|
worksheet.Cells[startRow, 5].Value = emp.checkInLocation;
|
||||||
|
worksheet.Cells[startRow, 6].Value = emp.checkInTime;
|
||||||
|
worksheet.Cells[startRow, 7].Value = emp.checkedOutDate;
|
||||||
|
worksheet.Cells[startRow, 8].Value = emp.checkOutLocation;
|
||||||
|
worksheet.Cells[startRow, 9].Value = emp.checkOutTime;
|
||||||
|
worksheet.Cells[startRow, 10].Value = emp.remark;
|
||||||
|
// ใส่กรอบให้ตาราง
|
||||||
|
using (var range = worksheet.Cells[startRow, 1, startRow, 10])
|
||||||
|
{
|
||||||
|
range.Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
|
||||||
|
range.Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
|
||||||
|
range.Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
|
||||||
|
range.Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
|
||||||
|
}
|
||||||
|
startRow++;
|
||||||
|
}
|
||||||
|
int lastRow = startRow + 2;
|
||||||
|
worksheet.Cells[lastRow, 2].Value = type.Trim().ToUpper() == "OFFICER" ? "ข้าราชการทั้งหมด" : "ลูกจ้างประจำทั้งหมด";
|
||||||
|
worksheet.Cells[lastRow, 5].Value = profile?.Count;
|
||||||
|
worksheet.Cells[lastRow, 6].Value = "คน";
|
||||||
|
worksheet.Cells[lastRow, 8].Value = "นอกสถานที่ตั้ง";
|
||||||
|
worksheet.Cells[lastRow + 1, 2].Value = "มาปฏิบัติราชการ";
|
||||||
|
worksheet.Cells[lastRow + 1, 5].Value = workTotal;
|
||||||
|
worksheet.Cells[lastRow + 1, 6].Value = "คน";
|
||||||
|
worksheet.Cells[lastRow + 1, 8].Value = "WFH";
|
||||||
|
worksheet.Cells[lastRow + 1, 9].Value = wfhTotal;
|
||||||
|
worksheet.Cells[lastRow + 1, 10].Value = "คน";
|
||||||
|
worksheet.Cells[lastRow + 2, 2].Value = "ลาพักผ่อน";
|
||||||
|
worksheet.Cells[lastRow + 2, 5].Value = restTotal;
|
||||||
|
worksheet.Cells[lastRow + 2, 6].Value = "คน";
|
||||||
|
worksheet.Cells[lastRow + 2, 8].Value = "อบรม ประชุม สัมมนาฯ";
|
||||||
|
worksheet.Cells[lastRow + 2, 9].Value = seminarTotal;
|
||||||
|
worksheet.Cells[lastRow + 2, 10].Value = "คน";
|
||||||
|
worksheet.Cells[lastRow + 3, 2].Value = "ลาป่วย/ลากิจ";
|
||||||
|
worksheet.Cells[lastRow + 3, 5].Value = sickTotal;
|
||||||
|
worksheet.Cells[lastRow + 3, 6].Value = "คน";
|
||||||
|
worksheet.Cells[lastRow + 4, 2].Value = "มาสาย";
|
||||||
|
worksheet.Cells[lastRow + 4, 5].Value = lateTotal;
|
||||||
|
worksheet.Cells[lastRow + 4, 6].Value = "คน";
|
||||||
|
worksheet.Cells[lastRow + 6, 2].Value = "เรียน";
|
||||||
|
worksheet.Cells[lastRow + 7, 2].Value = "เพื่อโปรดทราบ";
|
||||||
|
worksheet.Cells[lastRow + 7, 9].Value = "ทราบ";
|
||||||
|
worksheet.Cells[lastRow + 8, 2].Value = "................................";
|
||||||
|
worksheet.Cells[lastRow + 8, 9].Value = "................................";
|
||||||
|
worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();
|
||||||
|
var fileBytes = package.GetAsByteArray();
|
||||||
|
return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "TimeStampRecords.xlsx");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return Error(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// LV2_035 - รายงานการเข้างานสาย จำแนกเป็นรายบุคคลและหรือรายหน่วยงาน/ส่วนราชการ
|
/// LV2_035 - รายงานการเข้างานสาย จำแนกเป็นรายบุคคลและหรือรายหน่วยงาน/ส่วนราชการ
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
BIN
BMA.EHR.Leave/Reports/TimeStampRecords.xlsx
Normal file
BIN
BMA.EHR.Leave/Reports/TimeStampRecords.xlsx
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue