Bernt Christian Egeland 7 bulan lalu
induk
melakukan
0f6f42d8d6
1 mengubah file dengan 47 tambahan dan 0 penghapusan
  1. 47 0
      src/app/api/desktop/v1/work-orders/route.ts

+ 47 - 0
src/app/api/desktop/v1/work-orders/route.ts

@@ -96,11 +96,58 @@ export async function POST(request: Request) {
 
       const { partItems, laborItems, attachments, ...recordData } = data;
 
+      // Auto-generate invoice number if not provided
+      let invoiceNumber = recordData.invoiceNumber || undefined;
+      if (!invoiceNumber) {
+        const [settings, org] = await Promise.all([
+          db.appSetting.findMany({
+            where: {
+              organizationId,
+              key: { in: ["workshop.invoicePrefix", "workshop.invoiceStartNumber"] },
+            },
+          }),
+          db.organization.findUnique({
+            where: { id: organizationId },
+            select: { name: true },
+          }),
+        ]);
+        const settingsMap: Record<string, string> = {};
+        for (const s of settings) settingsMap[s.key] = s.value;
+
+        const rawPrefix = settingsMap["workshop.invoicePrefix"] || "{year}-";
+        const now = new Date();
+        const prefix = rawPrefix
+          .replace("{year}", now.getFullYear().toString())
+          .replace("{month}", String(now.getMonth() + 1).padStart(2, "0"));
+
+        const startNumber = parseInt(settingsMap["workshop.invoiceStartNumber"] || "0", 10);
+        const lastRecord = await db.serviceRecord.findFirst({
+          where: { vehicle: { customer: { organizationId } } },
+          orderBy: { createdAt: "desc" },
+          select: { invoiceNumber: true },
+        });
+        let nextNum = startNumber || 1001;
+        if (lastRecord?.invoiceNumber) {
+          const match = lastRecord.invoiceNumber.match(/(\d+)$/);
+          if (match) {
+            const lastNum = parseInt(match[1], 10) + 1;
+            nextNum = Math.max(nextNum, lastNum);
+          }
+        }
+        invoiceNumber = `${prefix}${nextNum}`;
+
+        // Also set shopName if not provided
+        if (!recordData.shopName && org?.name) {
+          (recordData as Record<string, unknown>).shopName = org.name;
+        }
+      }
+
       const workOrder = await db.$transaction(async (tx) => {
         const created = await tx.serviceRecord.create({
           data: {
             ...(body.id ? { id: body.id } : {}),
             ...recordData,
+            invoiceNumber,
             serviceDate: new Date(recordData.serviceDate),
           },
         });