diff options
Diffstat (limited to 'src/app/api/stock-opname/route.tsx')
| -rw-r--r-- | src/app/api/stock-opname/route.tsx | 111 |
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({ |
