summaryrefslogtreecommitdiff
path: root/src/app/api/stock-opname/route.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/api/stock-opname/route.tsx')
-rw-r--r--src/app/api/stock-opname/route.tsx111
1 files changed, 56 insertions, 55 deletions
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({