From 07819844d5ef7e323fd956eacfedecb2f4f4bb80 Mon Sep 17 00:00:00 2001
From: Rafi Zadanly <zadanlyr@gmail.com>
Date: Fri, 17 Nov 2023 15:16:23 +0700
Subject: Update result feature

---
 src/app/api/stock-opname/route.tsx | 111 +++++++++++++++++++------------------
 1 file changed, 56 insertions(+), 55 deletions(-)

(limited to 'src/app/api/stock-opname/route.tsx')

diff --git a/src/app/api/stock-opname/route.tsx b/src/app/api/stock-opname/route.tsx
index 50feacd..406981b 100644
--- a/src/app/api/stock-opname/route.tsx
+++ b/src/app/api/stock-opname/route.tsx
@@ -1,44 +1,23 @@
-import { Credential } from "@/common/types/auth";
 import { StockOpnameLocationRes, StockOpnameRequest } from "@/common/types/stockOpname";
 import { Team } from "@prisma/client";
 import { NextRequest, NextResponse } from "next/server";
 import { prisma } from "prisma/client";
+import _ from "lodash"
+import getServerCredential from "@/common/libs/getServerCredential";
 
 type Quantity = {
   [key in keyof typeof Team]: number | null
 }
 
-const calculateOpnameQuantity = async (
-  where: {
-    productId: number,
-    companyId: number
-  }
-): Promise<Quantity> => {
-  const quantity: Quantity = {
-    COUNT1: null,
-    COUNT2: null,
-    VERIFICATION: null,
-  }
-  for (const team of Object.values(Team)) {
-    const opnameQty = await prisma.stockOpname.groupBy({
-      by: ['productId', 'team'],
-      _sum: { quantity: true },
-      where: { team, ...where }
-    })
-    if (opnameQty.length === 0) continue
-    quantity[team] = opnameQty[0]._sum.quantity
-  }
-  return quantity
-}
-
 export async function GET(request: NextRequest) {
   const PAGE_SIZE = 30;
 
   const params = request.nextUrl.searchParams
   const companyId = params.get('companyId')
   const search = params.get('search')
-  const page = params.get('page') ?? null;
-  const intPage = page ? parseInt(page) : 1;
+  const page = params.get('page') ?? null
+  const show = params.get('show')
+  const intPage = page ? parseInt(page) : 1
 
   if (!companyId) {
     return NextResponse.json({ error: 'Bad Request. Missing companyId' }, { status: 400 })
@@ -48,6 +27,7 @@ export async function GET(request: NextRequest) {
     AND: {
       stockOpnames: { some: {} },
       companyId: parseInt(companyId),
+      isDifferent: show ? (show == 'diff' ? true : false) : undefined,
       OR: [
         { name: { contains: search ?? '' } },
         { itemCode: { contains: search ?? '' } },
@@ -96,9 +76,28 @@ export async function GET(request: NextRequest) {
   })
 }
 
+const calculateOpnameQuantity = async (
+  where: {
+    productId: number,
+    companyId: number
+  }
+): Promise<Quantity> => {
+  const quantity: Quantity = { COUNT1: null, COUNT2: null, COUNT3: null, VERIFICATION: null }
+
+  for (const team of Object.values(Team)) {
+    const opnameQty = await prisma.stockOpname.groupBy({
+      by: ['productId', 'team'],
+      _sum: { quantity: true },
+      where: { team, ...where }
+    })
+    if (opnameQty.length === 0) continue
+    quantity[team] = opnameQty[0]._sum.quantity
+  }
+  return quantity
+}
+
 export async function POST(request: NextRequest) {
-  const credentialStr = request.cookies.get('credential')?.value
-  const credential: Credential | null = credentialStr ? JSON.parse(credentialStr) : null
+  const credential = getServerCredential()
 
   if (!credential) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
 
@@ -135,7 +134,7 @@ export async function POST(request: NextRequest) {
     })
   }
 
-  computeIsDifferent({ productId: body.product, companyId: companyId })
+  await computeIsDifferent({ productId: body.product, companyId: companyId })
 
   return NextResponse.json(newStockOpname)
 }
@@ -152,6 +151,7 @@ const computeIsDifferent = async ({
   const totalQty: { [key in keyof typeof Team]: number | null } = {
     COUNT1: null,
     COUNT2: null,
+    COUNT3: null,
     VERIFICATION: null
   }
 
@@ -172,43 +172,44 @@ const computeIsDifferent = async ({
   let isDifferent: boolean = false
 
   for (const opname of stockOpnames) {
-    let { COUNT1, COUNT2, VERIFICATION } = opname
-
-    if (!totalQty['COUNT1'] && COUNT1.quantity) totalQty['COUNT1'] = 0
-    if (!totalQty['COUNT2'] && COUNT2.quantity) totalQty['COUNT2'] = 0
-    if (!totalQty['VERIFICATION'] && VERIFICATION.quantity) totalQty['VERIFICATION'] = 0
+    let { COUNT1, COUNT2, COUNT3, VERIFICATION } = opname
 
-    if (totalQty['COUNT1'] !== null && COUNT1.quantity) totalQty['COUNT1'] += COUNT1.quantity
-    if (totalQty['COUNT2'] !== null && COUNT2.quantity) totalQty['COUNT2'] += COUNT2.quantity
-    if (totalQty['VERIFICATION'] !== null && VERIFICATION.quantity) totalQty['VERIFICATION'] += VERIFICATION.quantity
+    if (totalQty['COUNT1'] === null && _.isNumber(COUNT1.quantity)) totalQty['COUNT1'] = 0
+    if (totalQty['COUNT2'] === null && _.isNumber(COUNT2.quantity)) totalQty['COUNT2'] = 0
+    if (totalQty['COUNT3'] === null && _.isNumber(COUNT3.quantity)) totalQty['COUNT3'] = 0
+    if (totalQty['VERIFICATION'] === null && _.isNumber(VERIFICATION.quantity)) totalQty['VERIFICATION'] = 0
 
-    if (isCount2Counted && COUNT1.quantity != COUNT2.quantity) {
-      isDifferent = true
-    }
+    if (_.isNumber(totalQty['COUNT1']) && _.isNumber(COUNT1.quantity)) totalQty['COUNT1'] += COUNT1.quantity
+    if (_.isNumber(totalQty['COUNT2']) && _.isNumber(COUNT2.quantity)) totalQty['COUNT2'] += COUNT2.quantity
+    if (_.isNumber(totalQty['COUNT3']) && _.isNumber(COUNT3.quantity)) totalQty['COUNT3'] += COUNT3.quantity
+    if (_.isNumber(totalQty['VERIFICATION']) && _.isNumber(VERIFICATION.quantity)) totalQty['VERIFICATION'] += VERIFICATION.quantity
   }
 
-  const product = await prisma.product.findFirst({
-    where: { id: productId }
-  })
+  const product = await prisma.product.findFirst({ where: { id: productId } })
   if (!product) return
 
   const onhandQty = product?.onhandQty || 0
 
   if (!isDifferent) {
-    if (
-      (typeof totalQty['VERIFICATION'] === 'number' && totalQty['VERIFICATION'] > 0) ||
-      totalQty['COUNT2'] == onhandQty ||
-      totalQty['COUNT1'] == onhandQty ||
-      totalQty['COUNT1'] == totalQty['COUNT2']
-    ) {
-      isDifferent = false
-    } else {
-      isDifferent = true
+    const conditional = {
+      wasVerified: typeof totalQty['VERIFICATION'] === 'number' && totalQty['VERIFICATION'] > 0,
+      anyCountEqWithOnhand: [totalQty['COUNT1'], totalQty['COUNT2'], totalQty['COUNT3']].includes(onhandQty),
+      count1EqWithCount2: totalQty['COUNT1'] !== null && totalQty['COUNT2'] !== null && totalQty['COUNT1'] === totalQty['COUNT2'],
+      count1EqWithCount3: totalQty['COUNT1'] !== null && totalQty['COUNT3'] !== null && totalQty['COUNT1'] === totalQty['COUNT3'],
+      count2EqWithCount3: totalQty['COUNT2'] !== null && totalQty['COUNT3'] !== null && totalQty['COUNT2'] === totalQty['COUNT3']
     }
 
-    if (isCount2Counted && totalQty['COUNT1'] != onhandQty) {
-      isDifferent = true
-    }
+    isDifferent = !(
+      conditional.wasVerified ||
+      conditional.anyCountEqWithOnhand ||
+      conditional.count1EqWithCount2 ||
+      conditional.count1EqWithCount3 ||
+      conditional.count2EqWithCount3
+    )
+
+    // if (isCount2Counted && totalQty['COUNT1'] != onhandQty) {
+    //   isDifferent = true
+    // }
   }
 
   await prisma.product.update({
-- 
cgit v1.2.3

