From 737728e9f00487c4eb6a78a77ab099c15811f41f Mon Sep 17 00:00:00 2001 From: harid Date: Fri, 30 Jan 2026 16:54:10 +0700 Subject: [PATCH] =?UTF-8?q?=E0=B8=99=E0=B8=B3=E0=B9=80=E0=B8=82=E0=B9=89?= =?UTF-8?q?=E0=B8=B2=E0=B9=84=E0=B8=9F=E0=B8=A5=E0=B9=8C=E0=B9=80=E0=B8=AD?= =?UTF-8?q?=E0=B9=87=E0=B8=81=E0=B9=80=E0=B8=8B=E0=B8=A5=E0=B8=8A=E0=B9=88?= =?UTF-8?q?=E0=B8=AD=E0=B8=87=E0=B8=A7=E0=B8=B1=E0=B8=99=E0=B8=97=E0=B8=B5?= =?UTF-8?q?=E0=B9=88=E0=B8=9B=E0=B8=A3=E0=B8=B1=E0=B8=9A=E0=B9=83=E0=B8=AB?= =?UTF-8?q?=E0=B9=89=E0=B8=A3=E0=B8=AD=E0=B8=87=E0=B8=A3=E0=B8=B1=E0=B8=9A?= =?UTF-8?q?=E0=B8=97=E0=B8=B8=E0=B8=81=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/DevelopmentController.ts | 30 ++++++------ src/interfaces/extension.ts | 58 ++++++++++++++++-------- 2 files changed, 55 insertions(+), 33 deletions(-) diff --git a/src/controllers/DevelopmentController.ts b/src/controllers/DevelopmentController.ts index c49da70..cee267c 100644 --- a/src/controllers/DevelopmentController.ts +++ b/src/controllers/DevelopmentController.ts @@ -2966,13 +2966,13 @@ export class DevelopmentController extends Controller { .GetData(request, `/org/unauthorize/officer/citizen/${citizenId}`) .then(async (x: any) => { development = Object.assign(development, x); - development.dateStart = Extension.checkDateTime(item["วันที่เริ่มต้น"], "dd/MM/yyyy") as Date; - development.dateEnd = Extension.checkDateTime(item["วันที่สิ้นสุด"], "dd/MM/yyyy")as Date; + development.dateStart = Extension.checkDateTime(item["วันที่เริ่มต้น"]) as Date; + development.dateEnd = Extension.checkDateTime(item["วันที่สิ้นสุด"])as Date; development.order = item["เลขที่คำสั่ง/เลขที่หนังสืออนุมัติ"] == null ? null : item["เลขที่คำสั่ง/เลขที่หนังสืออนุมัติ"].toString(); - development.dateOrder = Extension.checkDateTime(item["คำสั่งลงวันที่/หนังสืออนุมัติลงวันที่"], "dd/MM/yyyy")as Date; + development.dateOrder = Extension.checkDateTime(item["คำสั่งลงวันที่/หนังสืออนุมัติลงวันที่"])as Date; development.trainingDays = item["จำนวนวันที่อบรม"] == null ? null : item["จำนวนวันที่อบรม"].toString(); development.posLevelId = x.posLevelId; @@ -2998,15 +2998,15 @@ export class DevelopmentController extends Controller { development.lastName = item["นามสกุล"] == null ? null : item["นามสกุล"].toString(); development.position = item["ตำแหน่ง"] == null ? null : item["ตำแหน่ง"].toString(); development.org = item["สังกัด"] == null ? null : item["สังกัด"].toString(); - development.dateStart = Extension.checkDateTime(item["วันที่เริ่มต้น"], "dd/MM/yyyy") as Date; - development.dateEnd = Extension.checkDateTime(item["วันที่สิ้นสุด"], "dd/MM/yyyy") as Date; + development.dateStart = Extension.checkDateTime(item["วันที่เริ่มต้น"]) as Date; + development.dateEnd = Extension.checkDateTime(item["วันที่สิ้นสุด"]) as Date; development.citizenId = citizenId; development.type = "OFFICER" == null ? _null : "OFFICER"; development.order = item["เลขที่คำสั่ง/เลขที่หนังสืออนุมัติ"] == null ? null : item["เลขที่คำสั่ง/เลขที่หนังสืออนุมัติ"].toString(); - development.dateOrder = Extension.checkDateTime(item["คำสั่งลงวันที่/หนังสืออนุมัติลงวันที่"], "dd/MM/yyyy") as Date; + development.dateOrder = Extension.checkDateTime(item["คำสั่งลงวันที่/หนังสืออนุมัติลงวันที่"]) as Date; development.trainingDays = item["จำนวนวันที่อบรม"] == null ? null : item["จำนวนวันที่อบรม"].toString(); development.posLevelId = x.posLevelId; @@ -3030,13 +3030,13 @@ export class DevelopmentController extends Controller { .GetData(request, `/org/unauthorize/employee/citizen/${citizenId}`) .then(async (x: any) => { development = Object.assign(development, x); - development.dateStart = Extension.checkDateTime(item["วันที่เริ่มต้น"], "dd/MM/yyyy") as Date; - development.dateEnd = Extension.checkDateTime(item["วันที่สิ้นสุด"], "dd/MM/yyyy") as Date; + development.dateStart = Extension.checkDateTime(item["วันที่เริ่มต้น"]) as Date; + development.dateEnd = Extension.checkDateTime(item["วันที่สิ้นสุด"]) as Date; development.order = item["เลขที่คำสั่ง/เลขที่หนังสืออนุมัติ"] == null ? null : item["เลขที่คำสั่ง/เลขที่หนังสืออนุมัติ"].toString(); - development.dateOrder = Extension.checkDateTime(item["คำสั่งลงวันที่/หนังสืออนุมัติลงวันที่"], "dd/MM/yyyy") as Date; + development.dateOrder = Extension.checkDateTime(item["คำสั่งลงวันที่/หนังสืออนุมัติลงวันที่"]) as Date; development.trainingDays = item["จำนวนวันที่อบรม"] == null ? null : item["จำนวนวันที่อบรม"].toString(); development.posLevelId = null; @@ -3061,15 +3061,15 @@ export class DevelopmentController extends Controller { development.lastName = item["นามสกุล"] == null ? null : item["นามสกุล"].toString(); development.position = item["ตำแหน่ง"] == null ? null : item["ตำแหน่ง"].toString(); development.org = item["สังกัด"] == null ? null : item["สังกัด"].toString(); - development.dateStart = Extension.checkDateTime(item["วันที่เริ่มต้น"], "dd/MM/yyyy") as Date; - development.dateEnd = Extension.checkDateTime(item["วันที่สิ้นสุด"], "dd/MM/yyyy") as Date; + development.dateStart = Extension.checkDateTime(item["วันที่เริ่มต้น"]) as Date; + development.dateEnd = Extension.checkDateTime(item["วันที่สิ้นสุด"]) as Date; development.citizenId = citizenId; development.type = "EMPLOYEE" == null ? _null : "EMPLOYEE"; development.order = item["เลขที่คำสั่ง/เลขที่หนังสืออนุมัติ"] == null ? null : item["เลขที่คำสั่ง/เลขที่หนังสืออนุมัติ"].toString(); - development.dateOrder = Extension.checkDateTime(item["คำสั่งลงวันที่/หนังสืออนุมัติลงวันที่"], "dd/MM/yyyy") as Date; + development.dateOrder = Extension.checkDateTime(item["คำสั่งลงวันที่/หนังสืออนุมัติลงวันที่"]) as Date; development.trainingDays = item["จำนวนวันที่อบรม"] == null ? null : item["จำนวนวันที่อบรม"].toString(); development.posLevelId = x.posLevelId; @@ -3096,15 +3096,15 @@ export class DevelopmentController extends Controller { development.lastName = item["นามสกุล"] == null ? null : item["นามสกุล"].toString(); development.position = item["ตำแหน่ง"] == null ? null : item["ตำแหน่ง"].toString(); development.org = item["สังกัด"] == null ? null : item["สังกัด"].toString(); - development.dateStart = Extension.checkDateTime(item["วันที่เริ่มต้น"], "dd/MM/yyyy") as Date; - development.dateEnd = Extension.checkDateTime(item["วันที่สิ้นสุด"], "dd/MM/yyyy") as Date; + development.dateStart = Extension.checkDateTime(item["วันที่เริ่มต้น"]) as Date; + development.dateEnd = Extension.checkDateTime(item["วันที่สิ้นสุด"]) as Date; development.citizenId = citizenId; development.type = "OTHER"; development.order = item["เลขที่คำสั่ง/เลขที่หนังสืออนุมัติ"] == null ? null : item["เลขที่คำสั่ง/เลขที่หนังสืออนุมัติ"].toString(); - development.dateOrder = Extension.checkDateTime(item["คำสั่งลงวันที่/หนังสืออนุมัติลงวันที่"], "dd/MM/yyyy") as Date; + development.dateOrder = Extension.checkDateTime(item["คำสั่งลงวันที่/หนังสืออนุมัติลงวันที่"]) as Date; development.trainingDays = item["จำนวนวันที่อบรม"] == null ? null : item["จำนวนวันที่อบรม"] .toString(); development.posLevelId = null; diff --git a/src/interfaces/extension.ts b/src/interfaces/extension.ts index 998159c..a52895d 100644 --- a/src/interfaces/extension.ts +++ b/src/interfaces/extension.ts @@ -1,38 +1,60 @@ class Extension { - public static checkDateTime(value: any, format: "dd/MM/yyyy" | "yyyy-MM-dd"): Date | null { - if (value == null) return null; + public static checkDateTime( + value: any, + format?: "dd/MM/yyyy" | "yyyy-MM-dd", + ): Date | null { + if (value == null || value === "") return null; - let dateStr = String(value).trim(); - if (!dateStr) return null; + // ===== Excel serial number ===== + if (typeof value === "number") { + if (value < 1) return null; + return new Date(Math.round((value - 25569) * 86400 * 1000)); + } - const parts = dateStr.replace(/-/g, "/").split("/"); + const raw = String(value).trim(); + if (!raw) return null; + + const parts = raw.replace(/-/g, "/").split("/"); if (parts.length !== 3) return null; let year = 0, month = 0, day = 0; - switch (format) { - case "dd/MM/yyyy": - year = Number(parts[2]); - month = Number(parts[1]); - day = Number(parts[0]); - break; - - case "yyyy-MM-dd": + // ===== use format if provided ===== + if (format === "dd/MM/yyyy") { + day = Number(parts[0]); + month = Number(parts[1]); + year = Number(parts[2]); + } else if (format === "yyyy-MM-dd") { + year = Number(parts[0]); + month = Number(parts[1]); + day = Number(parts[2]); + } + // ===== auto detect ===== + else { + if (parts[0].length === 4) { + // yyyy/MM/dd year = Number(parts[0]); month = Number(parts[1]); day = Number(parts[2]); - break; + } else if (parts[2].length === 4) { + // dd/MM/yyyy + day = Number(parts[0]); + month = Number(parts[1]); + year = Number(parts[2]); + } else { + return null; + } } - if (isNaN(year) || isNaN(month) || isNaN(day)) return null; + if ([year, month, day].some(Number.isNaN)) return null; - // พ.ศ. → ค.ศ. + // ===== Buddhist year ===== if (year > 2500) year -= 543; + if (year < 1800 || year > 2500) return null; - // clamp month + // ===== normalize ===== if (month < 1 || month > 12) month = 1; - // clamp day const maxDay = new Date(year, month, 0).getDate(); if (day < 1) day = 1; else if (day > maxDay) day = maxDay;