diff --git a/BMA.EHR.Domain/Models/Leave/TimeAttendants/ProcessUserTimeStamp.cs b/BMA.EHR.Domain/Models/Leave/TimeAttendants/ProcessUserTimeStamp.cs
index c6368502..7bfd6efd 100644
--- a/BMA.EHR.Domain/Models/Leave/TimeAttendants/ProcessUserTimeStamp.cs
+++ b/BMA.EHR.Domain/Models/Leave/TimeAttendants/ProcessUserTimeStamp.cs
@@ -65,5 +65,11 @@ namespace BMA.EHR.Domain.Models.Leave.TimeAttendants
[Comment("สถานะ Check-Out")]
public string? CheckOutStatus { get; set; } = string.Empty;
+
+ [Comment("สถานะการของลงเวลาพิเศษ")]
+ public string? EditStatus { get; set; } = string.Empty;
+
+ [Comment("เหตุผลการอนุมัติ/ไม่อนุมัติขอลงเวลาพิเศษ")]
+ public string? EditReason { get; set; } = string.Empty;
}
}
diff --git a/BMA.EHR.Infrastructure/Migrations/LeaveDb/20231124094317_change editStatus and editReason to ProcessUserTimeStamp Table.Designer.cs b/BMA.EHR.Infrastructure/Migrations/LeaveDb/20231124094317_change editStatus and editReason to ProcessUserTimeStamp Table.Designer.cs
new file mode 100644
index 00000000..38c3586a
--- /dev/null
+++ b/BMA.EHR.Infrastructure/Migrations/LeaveDb/20231124094317_change editStatus and editReason to ProcessUserTimeStamp Table.Designer.cs
@@ -0,0 +1,552 @@
+//
+using System;
+using BMA.EHR.Infrastructure.Persistence;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace BMA.EHR.Infrastructure.Migrations.LeaveDb
+{
+ [DbContext(typeof(LeaveDbContext))]
+ [Migration("20231124094317_change editStatus and editReason to ProcessUserTimeStamp Table")]
+ partial class changeeditStatusandeditReasontoProcessUserTimeStampTable
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "7.0.9")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ modelBuilder.Entity("BMA.EHR.Domain.Models.Leave.TimeAttendants.AdditionalCheckRequest", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)")
+ .HasColumnOrder(0)
+ .HasComment("PrimaryKey")
+ .HasAnnotation("Relational:JsonPropertyName", "id");
+
+ b.Property("CheckDate")
+ .HasColumnType("datetime(6)")
+ .HasComment("*วันที่ลงเวลา");
+
+ b.Property("CheckInEdit")
+ .HasColumnType("tinyint(1)")
+ .HasComment("*ขอลงเวลาช่วงเช้า");
+
+ b.Property("CheckOutEdit")
+ .HasColumnType("tinyint(1)")
+ .HasComment("*ขอลงเวลาช่วงบ่าย");
+
+ b.Property("Comment")
+ .HasColumnType("longtext")
+ .HasComment("หมายเหตุในการการอนุมัติ/ไม่อนุมัติ");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(100)
+ .HasComment("สร้างข้อมูลเมื่อ");
+
+ b.Property("CreatedFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(104)
+ .HasComment("ชื่อ User ที่สร้างข้อมูล");
+
+ b.Property("CreatedUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(101)
+ .HasComment("User Id ที่สร้างข้อมูล");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("*หมายเหตุขอลงเวลาพิเศษ");
+
+ b.Property("KeycloakUserId")
+ .HasColumnType("char(36)")
+ .HasComment("รหัส User ของ Keycloak ที่ร้องขอ");
+
+ b.Property("LastUpdateFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(105)
+ .HasComment("ชื่อ User ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdateUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(103)
+ .HasComment("User Id ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(102)
+ .HasComment("แก้ไขข้อมูลล่าสุดเมื่อ");
+
+ b.Property("Status")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("สถานะการอนุมัติ");
+
+ b.HasKey("Id");
+
+ b.ToTable("AdditionalCheckRequests");
+ });
+
+ modelBuilder.Entity("BMA.EHR.Domain.Models.Leave.TimeAttendants.DutyTime", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)")
+ .HasColumnOrder(0)
+ .HasComment("PrimaryKey")
+ .HasAnnotation("Relational:JsonPropertyName", "id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(100)
+ .HasComment("สร้างข้อมูลเมื่อ");
+
+ b.Property("CreatedFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(104)
+ .HasComment("ชื่อ User ที่สร้างข้อมูล");
+
+ b.Property("CreatedUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(101)
+ .HasComment("User Id ที่สร้างข้อมูล");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("คำอธิบาย");
+
+ b.Property("EndTimeAfternoon")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("เวลาออกงานช่วงบ่าย");
+
+ b.Property("EndTimeMorning")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("เวลาออกงานช่วงเช้า");
+
+ b.Property("IsActive")
+ .HasColumnType("tinyint(1)")
+ .HasComment("สถานะการเปิดใช้งาน (เปิด/ปิด)");
+
+ b.Property("IsDefault")
+ .HasColumnType("tinyint(1)")
+ .HasComment("สถานะว่ารอบใดเป็นค่า Default ของข้าราชการ (สำหรับทุกคนที่ยังไม่ได้ทำการเลือกรอบ)");
+
+ b.Property("LastUpdateFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(105)
+ .HasComment("ชื่อ User ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdateUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(103)
+ .HasComment("User Id ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(102)
+ .HasComment("แก้ไขข้อมูลล่าสุดเมื่อ");
+
+ b.Property("StartTimeAfternoon")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("เวลาเข้างานช่วงบ่าย");
+
+ b.Property("StartTimeMorning")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("เวลาเข้างานช่วงเช้า");
+
+ b.HasKey("Id");
+
+ b.ToTable("DutyTimes");
+ });
+
+ modelBuilder.Entity("BMA.EHR.Domain.Models.Leave.TimeAttendants.ProcessUserTimeStamp", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)")
+ .HasColumnOrder(0)
+ .HasComment("PrimaryKey")
+ .HasAnnotation("Relational:JsonPropertyName", "id");
+
+ b.Property("CheckIn")
+ .HasColumnType("datetime(6)")
+ .HasComment("วัน เวลา เข้างาน");
+
+ b.Property("CheckInImageUrl")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("รูปถ่ายสถานที่ Check-In");
+
+ b.Property("CheckInLat")
+ .HasColumnType("double")
+ .HasComment("พิกัดละติจูด Check-In");
+
+ b.Property("CheckInLocationName")
+ .HasColumnType("longtext")
+ .HasComment("กรณีเลือกนอกสถานที่ตั้ง ต้องระบุข้อมูลชื่อสถานะที่ Check-In");
+
+ b.Property("CheckInLon")
+ .HasColumnType("double")
+ .HasComment("พิกัดลองจิจูด Check-In");
+
+ b.Property("CheckInPOI")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("ชื่อสถานที่ ได้มาจากระบบ ArcGis ของกองสารสนเทศภูมิศาสตร์ Check-In");
+
+ b.Property("CheckInRemark")
+ .HasColumnType("longtext")
+ .HasComment("ข้อความหมายเหตุที่ต้องการระบุเพิ่ม(มีเผื่อไว้อาจไม่ได้ใช้) Check-In");
+
+ b.Property("CheckInStatus")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("สถานะ Check-In");
+
+ b.Property("CheckOut")
+ .HasColumnType("datetime(6)")
+ .HasComment("วัน เวลา ออกงาน");
+
+ b.Property("CheckOutImageUrl")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("รูปถ่ายสถานที่ Check-Out");
+
+ b.Property("CheckOutLat")
+ .HasColumnType("double")
+ .HasComment("พิกัดละติจูด Check-Out");
+
+ b.Property("CheckOutLocationName")
+ .HasColumnType("longtext")
+ .HasComment("กรณีเลือกนอกสถานที่ตั้ง ต้องระบุข้อมูลชื่อสถานะที่ Check-Out");
+
+ b.Property("CheckOutLon")
+ .HasColumnType("double")
+ .HasComment("พิกัดลองจิจูด Check-Out");
+
+ b.Property("CheckOutPOI")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("ชื่อสถานที่ ได้มาจากระบบ ArcGis ของกองสารสนเทศภูมิศาสตร์ Check-Out");
+
+ b.Property("CheckOutRemark")
+ .HasColumnType("longtext")
+ .HasComment("ข้อความหมายเหตุที่ต้องการระบุเพิ่ม(มีเผื่อไว้อาจไม่ได้ใช้) Check-Out");
+
+ b.Property("CheckOutStatus")
+ .HasColumnType("longtext")
+ .HasComment("สถานะ Check-Out");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(100)
+ .HasComment("สร้างข้อมูลเมื่อ");
+
+ b.Property("CreatedFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(104)
+ .HasComment("ชื่อ User ที่สร้างข้อมูล");
+
+ b.Property("CreatedUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(101)
+ .HasComment("User Id ที่สร้างข้อมูล");
+
+ b.Property("EditReason")
+ .HasColumnType("longtext")
+ .HasComment("เหตุผลการอนุมัติ/ไม่อนุมัติขอลงเวลาพิเศษ");
+
+ b.Property("EditStatus")
+ .HasColumnType("longtext")
+ .HasComment("สถานะการของลงเวลาพิเศษ");
+
+ b.Property("IsLocationCheckIn")
+ .HasColumnType("tinyint(1)")
+ .HasComment("true คือ ณ สถานที่ตั้ง, false คือ นอกสถานที่ตั้ง Check-In");
+
+ b.Property("IsLocationCheckOut")
+ .HasColumnType("tinyint(1)")
+ .HasComment("true คือ ณ สถานที่ตั้ง, false คือ นอกสถานที่ตั้ง Check-Out");
+
+ b.Property("IsProcess")
+ .HasColumnType("tinyint(1)")
+ .HasComment("นำไปประมวลผลแล้วหรือยัง");
+
+ b.Property("KeycloakUserId")
+ .HasColumnType("char(36)")
+ .HasComment("รหัส User ของ Keycloak");
+
+ b.Property("LastUpdateFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(105)
+ .HasComment("ชื่อ User ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdateUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(103)
+ .HasComment("User Id ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(102)
+ .HasComment("แก้ไขข้อมูลล่าสุดเมื่อ");
+
+ b.HasKey("Id");
+
+ b.ToTable("ProcessUserTimeStamps");
+ });
+
+ modelBuilder.Entity("BMA.EHR.Domain.Models.Leave.TimeAttendants.UserDutyTime", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)")
+ .HasColumnOrder(0)
+ .HasComment("PrimaryKey")
+ .HasAnnotation("Relational:JsonPropertyName", "id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(100)
+ .HasComment("สร้างข้อมูลเมื่อ");
+
+ b.Property("CreatedFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(104)
+ .HasComment("ชื่อ User ที่สร้างข้อมูล");
+
+ b.Property("CreatedUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(101)
+ .HasComment("User Id ที่สร้างข้อมูล");
+
+ b.Property("DutyTimeId")
+ .HasColumnType("char(36)")
+ .HasComment("รหัสรอบการลงเวลา");
+
+ b.Property("EffectiveDate")
+ .HasColumnType("datetime(6)")
+ .HasComment("วันที่มีผล");
+
+ b.Property("IsProcess")
+ .HasColumnType("tinyint(1)")
+ .HasComment("ทำการประมวลผลแล้วหรือยัง");
+
+ b.Property("LastUpdateFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(105)
+ .HasComment("ชื่อ User ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdateUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(103)
+ .HasComment("User Id ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(102)
+ .HasComment("แก้ไขข้อมูลล่าสุดเมื่อ");
+
+ b.Property("ProfileId")
+ .HasColumnType("char(36)")
+ .HasComment("รหัส Profile ในระบบทะเบียนประวัติ");
+
+ b.Property("Remark")
+ .HasColumnType("longtext")
+ .HasComment("หมายเหตุ");
+
+ b.HasKey("Id");
+
+ b.HasIndex("DutyTimeId");
+
+ b.ToTable("UserDutyTimes");
+ });
+
+ modelBuilder.Entity("BMA.EHR.Domain.Models.Leave.TimeAttendants.UserTimeStamp", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)")
+ .HasColumnOrder(0)
+ .HasComment("PrimaryKey")
+ .HasAnnotation("Relational:JsonPropertyName", "id");
+
+ b.Property("CheckIn")
+ .HasColumnType("datetime(6)")
+ .HasComment("วัน เวลา เข้างาน");
+
+ b.Property("CheckInImageUrl")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("รูปถ่ายสถานที่ Check-In");
+
+ b.Property("CheckInLat")
+ .HasColumnType("double")
+ .HasComment("พิกัดละติจูด Check-In");
+
+ b.Property("CheckInLocationName")
+ .HasColumnType("longtext")
+ .HasComment("กรณีเลือกนอกสถานที่ตั้ง ต้องระบุข้อมูลชื่อสถานะที่ Check-In");
+
+ b.Property("CheckInLon")
+ .HasColumnType("double")
+ .HasComment("พิกัดลองจิจูด Check-In");
+
+ b.Property("CheckInPOI")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("ชื่อสถานที่ ได้มาจากระบบ ArcGis ของกองสารสนเทศภูมิศาสตร์ Check-In");
+
+ b.Property("CheckInRemark")
+ .HasColumnType("longtext")
+ .HasComment("ข้อความหมายเหตุที่ต้องการระบุเพิ่ม(มีเผื่อไว้อาจไม่ได้ใช้) Check-In");
+
+ b.Property("CheckOut")
+ .HasColumnType("datetime(6)")
+ .HasComment("วัน เวลา ออกงาน");
+
+ b.Property("CheckOutImageUrl")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("รูปถ่ายสถานที่ Check-Out");
+
+ b.Property("CheckOutLat")
+ .HasColumnType("double")
+ .HasComment("พิกัดละติจูด Check-Out");
+
+ b.Property("CheckOutLocationName")
+ .HasColumnType("longtext")
+ .HasComment("กรณีเลือกนอกสถานที่ตั้ง ต้องระบุข้อมูลชื่อสถานะที่ Check-Out");
+
+ b.Property("CheckOutLon")
+ .HasColumnType("double")
+ .HasComment("พิกัดลองจิจูด Check-Out");
+
+ b.Property("CheckOutPOI")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("ชื่อสถานที่ ได้มาจากระบบ ArcGis ของกองสารสนเทศภูมิศาสตร์ Check-Out");
+
+ b.Property("CheckOutRemark")
+ .HasColumnType("longtext")
+ .HasComment("ข้อความหมายเหตุที่ต้องการระบุเพิ่ม(มีเผื่อไว้อาจไม่ได้ใช้) Check-Out");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(100)
+ .HasComment("สร้างข้อมูลเมื่อ");
+
+ b.Property("CreatedFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(104)
+ .HasComment("ชื่อ User ที่สร้างข้อมูล");
+
+ b.Property("CreatedUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(101)
+ .HasComment("User Id ที่สร้างข้อมูล");
+
+ b.Property("IsLocationCheckIn")
+ .HasColumnType("tinyint(1)")
+ .HasComment("true คือ ณ สถานที่ตั้ง, false คือ นอกสถานที่ตั้ง Check-In");
+
+ b.Property("IsLocationCheckOut")
+ .HasColumnType("tinyint(1)")
+ .HasComment("true คือ ณ สถานที่ตั้ง, false คือ นอกสถานที่ตั้ง Check-Out");
+
+ b.Property("IsProcess")
+ .HasColumnType("tinyint(1)")
+ .HasComment("นำไปประมวลผลแล้วหรือยัง");
+
+ b.Property("KeycloakUserId")
+ .HasColumnType("char(36)")
+ .HasComment("รหัส User ของ Keycloak");
+
+ b.Property("LastUpdateFullName")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("varchar(200)")
+ .HasColumnOrder(105)
+ .HasComment("ชื่อ User ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdateUserId")
+ .IsRequired()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnOrder(103)
+ .HasComment("User Id ที่แก้ไขข้อมูลล่าสุด");
+
+ b.Property("LastUpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasColumnOrder(102)
+ .HasComment("แก้ไขข้อมูลล่าสุดเมื่อ");
+
+ b.HasKey("Id");
+
+ b.ToTable("UserTimeStamps");
+ });
+
+ modelBuilder.Entity("BMA.EHR.Domain.Models.Leave.TimeAttendants.UserDutyTime", b =>
+ {
+ b.HasOne("BMA.EHR.Domain.Models.Leave.TimeAttendants.DutyTime", "DutyTime")
+ .WithMany()
+ .HasForeignKey("DutyTimeId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("DutyTime");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/BMA.EHR.Infrastructure/Migrations/LeaveDb/20231124094317_change editStatus and editReason to ProcessUserTimeStamp Table.cs b/BMA.EHR.Infrastructure/Migrations/LeaveDb/20231124094317_change editStatus and editReason to ProcessUserTimeStamp Table.cs
new file mode 100644
index 00000000..5d51e847
--- /dev/null
+++ b/BMA.EHR.Infrastructure/Migrations/LeaveDb/20231124094317_change editStatus and editReason to ProcessUserTimeStamp Table.cs
@@ -0,0 +1,42 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace BMA.EHR.Infrastructure.Migrations.LeaveDb
+{
+ ///
+ public partial class changeeditStatusandeditReasontoProcessUserTimeStampTable : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AddColumn(
+ name: "EditReason",
+ table: "ProcessUserTimeStamps",
+ type: "longtext",
+ nullable: true,
+ comment: "เหตุผลการอนุมัติ/ไม่อนุมัติขอลงเวลาพิเศษ")
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.AddColumn(
+ name: "EditStatus",
+ table: "ProcessUserTimeStamps",
+ type: "longtext",
+ nullable: true,
+ comment: "สถานะการของลงเวลาพิเศษ")
+ .Annotation("MySql:CharSet", "utf8mb4");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropColumn(
+ name: "EditReason",
+ table: "ProcessUserTimeStamps");
+
+ migrationBuilder.DropColumn(
+ name: "EditStatus",
+ table: "ProcessUserTimeStamps");
+ }
+ }
+}
diff --git a/BMA.EHR.Infrastructure/Migrations/LeaveDb/LeaveDbContextModelSnapshot.cs b/BMA.EHR.Infrastructure/Migrations/LeaveDb/LeaveDbContextModelSnapshot.cs
index 29000785..36430ef1 100644
--- a/BMA.EHR.Infrastructure/Migrations/LeaveDb/LeaveDbContextModelSnapshot.cs
+++ b/BMA.EHR.Infrastructure/Migrations/LeaveDb/LeaveDbContextModelSnapshot.cs
@@ -283,6 +283,14 @@ namespace BMA.EHR.Infrastructure.Migrations.LeaveDb
.HasColumnOrder(101)
.HasComment("User Id ที่สร้างข้อมูล");
+ b.Property("EditReason")
+ .HasColumnType("longtext")
+ .HasComment("เหตุผลการอนุมัติ/ไม่อนุมัติขอลงเวลาพิเศษ");
+
+ b.Property("EditStatus")
+ .HasColumnType("longtext")
+ .HasComment("สถานะการของลงเวลาพิเศษ");
+
b.Property("IsLocationCheckIn")
.HasColumnType("tinyint(1)")
.HasComment("true คือ ณ สถานที่ตั้ง, false คือ นอกสถานที่ตั้ง Check-In");
diff --git a/BMA.EHR.Leave.Service/Controllers/LeaveController.cs b/BMA.EHR.Leave.Service/Controllers/LeaveController.cs
index 1a18c2c9..4ed97007 100644
--- a/BMA.EHR.Leave.Service/Controllers/LeaveController.cs
+++ b/BMA.EHR.Leave.Service/Controllers/LeaveController.cs
@@ -520,7 +520,7 @@ namespace BMA.EHR.Leave.Service.Controllers
var checkin_base = DateTime.Parse($"{DateTime.Now.ToString("yyyy-MM-dd")} {duty.StartTimeMorning}");
var checkout_base = DateTime.Parse($"{DateTime.Now.ToString("yyyy-MM-dd")} {duty.EndTimeAfternoon}");
- var data = (await _userTimeStampRepository.GetTimeStampHistoryAsync(userId, year))
+ var data = (await _processUserTimeStampRepository.GetTimeStampHistoryAsync(userId, year))
.Select(d => new CheckInHistoryDto
{
CheckInId = d.Id,
@@ -540,6 +540,9 @@ namespace BMA.EHR.Leave.Service.Controllers
"LATE" :
"NORMAL",
+ EditReason = d.EditReason ?? "",
+ EditStatus = d.EditStatus ?? ""
+
})
.ToList();
@@ -590,14 +593,14 @@ namespace BMA.EHR.Leave.Service.Controllers
CheckInLocation = d.CheckInPOI,
CheckInLat = d.CheckInLat,
CheckInLon = d.CheckInLon,
- //CheckInImageUrl = $"{imgUrl}/{d.CheckInImageUrl}",
+ CheckInImage = $"{imgUrl}/{d.CheckInImageUrl}",
CheckOutDate = d.CheckOut == null ? null : d.CheckOut.Value.Date,
CheckOutTime = d.CheckOut == null ? "" : d.CheckOut.Value.ToString("HH:mm:ss"),
CheckOutLocation = d.CheckOut == null ? "" : d.CheckOutPOI,
CheckOutLat = d.CheckOut == null ? null : d.CheckOutLat,
CheckOutLon = d.CheckOut == null ? null : d.CheckOutLon,
- //CheckOutImageUrl = d.CheckOut == null ? "" : $"{imgUrl}/{d.CheckOutImageUrl}",
+ CheckOutImage = d.CheckOut == null ? "" : $"{imgUrl}/{d.CheckOutImageUrl}",
})
.ToList();
@@ -846,9 +849,10 @@ namespace BMA.EHR.Leave.Service.Controllers
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task> CreateChangeRoundAsync([FromBody] CreateChangeRoundDto req)
{
- if (req.EffectiveDate.Date < DateTime.Now.Date)
+ var currentDate = DateTime.Now.Date;
+ if (req.EffectiveDate.Date < currentDate)
{
- return Error(new Exception("วันที่มีผลต้องมากกว่าหรือเท่ากับวันที่ปัจจุบัน"), StatusCodes.Status400BadRequest);
+ return Error(new Exception($"วันที่มีผลต้องมากกว่าหรือเท่ากับวันที่ปัจจุบัน({currentDate.ToString("yyyy-MM-dd")})"), StatusCodes.Status400BadRequest);
}
var old = await _userDutyTimeRepository.GetExist(req.ProfileId, req.EffectiveDate);
@@ -1088,6 +1092,9 @@ namespace BMA.EHR.Leave.Service.Controllers
};
+ processTimeStamp.EditStatus = "APPROVE";
+ processTimeStamp.EditReason = req.Reason;
+
await _processUserTimeStampRepository.AddAsync(processTimeStamp);
}
else
@@ -1110,6 +1117,10 @@ namespace BMA.EHR.Leave.Service.Controllers
processTimeStamp.CheckOutPOI = "ลงเวลากรณีพิเศษ";
}
+
+ processTimeStamp.EditStatus = "APPROVE";
+ processTimeStamp.EditReason = req.Reason;
+
await _processUserTimeStampRepository.UpdateAsync(processTimeStamp);
}
@@ -1138,6 +1149,17 @@ namespace BMA.EHR.Leave.Service.Controllers
return Error(GlobalMessages.DataNotFound, StatusCodes.Status404NotFound);
}
+ // change user timestamp
+ var processTimeStamp = await _processUserTimeStampRepository.GetTimestampByDateAsync(requestData.KeycloakUserId, requestData.CheckDate.Date);
+
+ if (processTimeStamp != null)
+ {
+ processTimeStamp.EditStatus = "REJECT";
+ processTimeStamp.EditReason = req.Reason;
+
+ await _processUserTimeStampRepository.UpdateAsync(processTimeStamp);
+ }
+
requestData.Status = "REJECT";
requestData.Comment = req.Reason;
await _additionalCheckRequestRepository.UpdateAsync(requestData);
diff --git a/BMA.EHR.Leave.Service/DTOs/CheckIn/CheckInHistoryDto.cs b/BMA.EHR.Leave.Service/DTOs/CheckIn/CheckInHistoryDto.cs
index 3d49d782..9a21b13e 100644
--- a/BMA.EHR.Leave.Service/DTOs/CheckIn/CheckInHistoryDto.cs
+++ b/BMA.EHR.Leave.Service/DTOs/CheckIn/CheckInHistoryDto.cs
@@ -19,5 +19,9 @@
public string? CheckOutLocation { get; set; } = string.Empty;
public string? CheckOutStatus { get; set; } = string.Empty;
+
+ public string EditStatus { get; set; } = string.Empty;
+
+ public string EditReason { get; set; } = string.Empty;
}
}
diff --git a/BMA.EHR.Leave.Service/DTOs/CheckIn/CheckInHistoryForAdminDto.cs b/BMA.EHR.Leave.Service/DTOs/CheckIn/CheckInHistoryForAdminDto.cs
index eb0bb771..eb9ece53 100644
--- a/BMA.EHR.Leave.Service/DTOs/CheckIn/CheckInHistoryForAdminDto.cs
+++ b/BMA.EHR.Leave.Service/DTOs/CheckIn/CheckInHistoryForAdminDto.cs
@@ -16,7 +16,7 @@
public double? CheckInLon { get; set; } = 0;
- //public string? CheckInImageUrl { get; set; } = string.Empty;
+ public string? CheckInImage { get; set; } = string.Empty;
public DateTime? CheckOutDate { get; set; } = DateTime.MinValue;
@@ -28,6 +28,6 @@
public double? CheckOutLon { get; set; } = 0;
- //public string? CheckOutImageUrl { get; set; } = string.Empty;
+ public string? CheckOutImage { get; set; } = string.Empty;
}
}