diff options
| author | Imanuel Marinao <imanuel.mariano.5@gmail.com> | 2024-07-04 13:40:28 +0700 |
|---|---|---|
| committer | Imanuel Marinao <imanuel.mariano.5@gmail.com> | 2024-07-04 13:40:28 +0700 |
| commit | d0c00e30f3f850f8452397db05f41e0c0ecef3f9 (patch) | |
| tree | 5a7a04fc6ac2480269b99c2a8fc21ab4b917731f /src/app/api/stock-opname/route.tsx | |
| parent | 9a80c0a767c6a35a489b9d45654ae60f7ddc6794 (diff) | |
<iman> update stock opname
Diffstat (limited to 'src/app/api/stock-opname/route.tsx')
| -rw-r--r-- | src/app/api/stock-opname/route.tsx | 231 |
1 files changed, 95 insertions, 136 deletions
diff --git a/src/app/api/stock-opname/route.tsx b/src/app/api/stock-opname/route.tsx index 9f44158..1ec79d1 100644 --- a/src/app/api/stock-opname/route.tsx +++ b/src/app/api/stock-opname/route.tsx @@ -2,253 +2,212 @@ import { StockOpnameLocationRes, StockOpnameRequest } from "@/common/types/stock import { Prisma, Team } from "prisma/generated/client"; import { NextRequest, NextResponse } from "next/server"; import { prisma } from "prisma/client"; -import _ from "lodash" +import _ from "lodash"; import getServerCredential from "@/common/libs/getServerCredential"; type Quantity = { - [key in keyof typeof Team]: number | null -} + [key in keyof typeof Team]: number | null; +}; 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 show = params.get('show') - const intPage = page ? parseInt(page) : 1 + const params = request.nextUrl.searchParams; + const companyId = params.get("companyId"); + const search = params.get("search"); + 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 }) + return NextResponse.json({ error: "Bad Request. Missing companyId" }, { status: 400 }); } const where: Prisma.ProductWhereInput = { AND: { stockOpnames: { some: {} }, companyId: parseInt(companyId), - isDifferent: show ? (show == 'diff' ? true : false) : undefined, + isDifferent: show ? (show == "diff" ? true : false) : undefined, OR: [ - { name: { mode: 'insensitive', contains: search ?? '' } }, - { itemCode: { mode: 'insensitive', contains: search ?? '' } }, - { barcode: { mode: 'insensitive', contains: search ?? '' } }, - { stockOpnames: { some: { location: { name: { mode: 'insensitive', contains: search ?? '' } } } } }, - ] - } - } + { name: { mode: "insensitive", contains: search ?? "" } }, + { itemCode: { mode: "insensitive", contains: search ?? "" } }, + { barcode: { mode: "insensitive", contains: search ?? "" } }, + { stockOpnames: { some: { location: { name: { mode: "insensitive", contains: search ?? "" } } } } }, + ], + }, + }; const products = await prisma.product.findMany({ skip: (intPage - 1) * PAGE_SIZE, take: PAGE_SIZE, - where - }) + where, + }); - const productCount = await prisma.product.count({ where }) + const productCount = await prisma.product.count({ where }); const pagination = { page: intPage, totalPage: Math.ceil(productCount / PAGE_SIZE), - } + }; - type ProductWithSum = typeof products[0] & { quantity: Quantity } + type ProductWithSum = (typeof products)[0] & { quantity: Quantity }; - const productsWithSum: ProductWithSum[] = [] + const productsWithSum: ProductWithSum[] = []; for (const product of products) { const quantity = await calculateOpnameQuantity({ productId: product.id, - companyId: parseInt(companyId) - }) - productsWithSum.push({ ...product, quantity }) + companyId: parseInt(companyId), + }); + productsWithSum.push({ ...product, quantity }); } return NextResponse.json({ result: productsWithSum, - ...pagination - }) + ...pagination, + }); } -const calculateOpnameQuantity = async ( - where: { - productId: number, - companyId: number - } -): Promise<Quantity> => { - const quantity: Quantity = { COUNT1: null, COUNT2: null, COUNT3: null, VERIFICATION: null } +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'], + by: ["productId", "team"], _sum: { quantity: true }, - where: { team, ...where } - }) - if (opnameQty.length === 0) continue - quantity[team] = opnameQty[0]._sum.quantity + where: { team, ...where }, + }); + if (opnameQty.length === 0) continue; + quantity[team] = opnameQty[0]._sum.quantity; } - return quantity -} + return quantity; +}; export async function POST(request: NextRequest) { - const credential = getServerCredential() + const credential = getServerCredential(); - if (!credential) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }) + if (!credential) return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); - const body: StockOpnameRequest = await request.json() + const body: StockOpnameRequest = await request.json(); - const { companyId, team } = credential + const { companyId, team } = credential; const query = { locationId: body.location, productId: body.product, companyId, - team - } + team, + }; - const stockOpname = await prisma.stockOpname.findFirst({ where: query }) + const stockOpname = await prisma.stockOpname.findFirst({ where: query }); const data = { ...query, userId: credential.id, quantity: body.quantity, - isDifferent: false - } + isDifferent: false, + }; - let newStockOpname = null + let newStockOpname = null; if (!stockOpname) { - newStockOpname = await prisma.stockOpname.create({ data }) + newStockOpname = await prisma.stockOpname.create({ data }); } else { newStockOpname = await prisma.stockOpname.update({ where: { id: stockOpname.id }, - data - }) + data, + }); } - await computeIsDifferent({ productId: body.product, companyId: companyId }) + await computeIsDifferent({ productId: body.product, companyId: companyId }); - return NextResponse.json(newStockOpname) + return NextResponse.json(newStockOpname); } -const SELF_HOST = process.env.SELF_HOST as string +const SELF_HOST = process.env.SELF_HOST as string; -const computeIsDifferent = async ({ - companyId, - productId -}: { - companyId: number, - productId: number -}) => { +const computeIsDifferent = async ({ companyId, productId }: { companyId: number; productId: number }) => { const totalQty: { [key in keyof typeof Team]: number | 0 } = { COUNT1: 0, COUNT2: 0, COUNT3: 0, - VERIFICATION: 0 - } + VERIFICATION: 0, + }; const searchParams = new URLSearchParams({ companyId: companyId.toString(), - productId: productId.toString() - }) + productId: productId.toString(), + }); - const stockOpnamesFetch = await fetch(`${SELF_HOST}/api/stock-opname/location?${searchParams}`) - const stockOpnames: StockOpnameLocationRes[] = await stockOpnamesFetch.json() + const stockOpnamesFetch = await fetch(`${SELF_HOST}/api/stock-opname/location?${searchParams}`); + const stockOpnames: StockOpnameLocationRes[] = await stockOpnamesFetch.json(); - let isDifferent: boolean = false - let verificationCounter: number = 0 + let isDifferent: boolean = false; + let verificationCounter: number = 0; for (const opname of stockOpnames) { - let { COUNT1, COUNT2, COUNT3, VERIFICATION } = opname + let { COUNT1, COUNT2, COUNT3, VERIFICATION } = opname; - 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 (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 (_.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 + 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; - if (_.isNumber(VERIFICATION.quantity)) verificationCounter++ + if (_.isNumber(VERIFICATION.quantity)) verificationCounter++; } - const product = await prisma.product.findFirst({ where: { id: productId } }) - if (!product) return + const product = await prisma.product.findFirst({ where: { id: productId } }); + if (!product) return; - const onhandQty = product.onhandQty - const allQty = totalQty['COUNT1'] + totalQty['COUNT2'] + totalQty['COUNT3'] + totalQty['VERIFICATION'] - const differenceQty = onhandQty - allQty + const onhandQty = product.onhandQty; + const allQty = totalQty["COUNT1"] + totalQty["COUNT2"] + totalQty["COUNT3"] + totalQty["VERIFICATION"]; + const differenceQty = onhandQty - allQty; // const differenceQty = product.differenceQty // const allQty = onhandQty + differenceQty const conditional = { verificationCheckAll: verificationCounter > 0 && verificationCounter === stockOpnames.length, // anyCountEqWithOnhand: [totalQty['COUNT1'], totalQty['COUNT2'], totalQty['COUNT3']].includes(onhandQty), - anyCountEqWithOnhand: totalQty['COUNT1'] === onhandQty || totalQty['COUNT2'] === onhandQty || totalQty['COUNT1'] === onhandQty , - anyCountEqWithAllQty: [totalQty['COUNT1'], totalQty['COUNT2'], totalQty['COUNT3']].includes(allQty), - count1EqWithCount2: totalQty['COUNT1'] !== null && totalQty['COUNT2'] !== null && totalQty['COUNT1'] === totalQty['COUNT2'] && totalQty['COUNT3'] === null, - count1EqWithCount3: totalQty['COUNT1'] !== null && totalQty['COUNT3'] !== null && totalQty['COUNT1'] === totalQty['COUNT3'], - count2EqWithCount3: totalQty['COUNT2'] !== null && totalQty['COUNT3'] !== null && totalQty['COUNT2'] === totalQty['COUNT3'], - } - - // isDifferent = !( - // conditional.verificationCheckAll || - // conditional.anyCountEqWithOnhand || - // conditional.anyCountEqWithAllQty || - // conditional.count1EqWithCount2 || - // conditional.count1EqWithCount3 || - // conditional.count2EqWithCount3 - // ) - if ( - conditional.verificationCheckAll || - conditional.anyCountEqWithOnhand || - conditional.count1EqWithCount2 || - conditional.count1EqWithCount3 || - conditional.count2EqWithCount3 - ) { + anyCountEqWithOnhand: totalQty["COUNT1"] === onhandQty || totalQty["COUNT2"] === onhandQty || totalQty["COUNT1"] === onhandQty, + anyCountEqWithAllQty: [totalQty["COUNT1"], totalQty["COUNT2"], totalQty["COUNT3"]].includes(allQty), + count1EqWithCount2: totalQty["COUNT1"] !== null && totalQty["COUNT2"] !== null && totalQty["COUNT1"] === totalQty["COUNT2"] && totalQty["COUNT3"] === null, + count1EqWithCount3: totalQty["COUNT1"] !== null && totalQty["COUNT3"] !== null && totalQty["COUNT1"] === totalQty["COUNT3"], + count2EqWithCount3: totalQty["COUNT2"] !== null && totalQty["COUNT3"] !== null && totalQty["COUNT2"] === totalQty["COUNT3"], + }; + + if (conditional.verificationCheckAll || conditional.anyCountEqWithOnhand || conditional.count1EqWithCount2 || conditional.count1EqWithCount3 || conditional.count2EqWithCount3) { isDifferent = false; } else { isDifferent = true; } for (const opname of stockOpnames) { - let { COUNT1, COUNT2, COUNT3, VERIFICATION } = opname + let { COUNT1, COUNT2, COUNT3, VERIFICATION } = opname; const detailCondition = { verificationCheckAll: _.isNumber(VERIFICATION.quantity), - anyCountEqWithOnhand: totalQty['COUNT1'] === onhandQty || totalQty['COUNT2'] === onhandQty || totalQty['COUNT3'] === onhandQty , - count1EqWithCount2: totalQty['COUNT3'] === 0 && COUNT1.quantity === COUNT2.quantity, + anyCountEqWithOnhand: totalQty["COUNT1"] === onhandQty || totalQty["COUNT2"] === onhandQty || totalQty["COUNT3"] === onhandQty, + count1EqWithCount2: totalQty["COUNT3"] === 0 && COUNT1.quantity === COUNT2.quantity, count1EqWithCount3: COUNT1.quantity === COUNT3.quantity, - count2EqWithCount3: COUNT2.quantity === COUNT3.quantity && (COUNT2.quantity === 0 && COUNT3.quantity === 0), + count2EqWithCount3: COUNT2.quantity === COUNT3.quantity && COUNT2.quantity !== 0 && COUNT3.quantity !== 0, // count3EqWithCount1_2: (COUNT3.quantity !== COUNT1.quantity) && (COUNT3.quantity !== COUNT2.quantity) && (COUNT1.quantity === COUNT2.quantity) && (COUNT3.quantity !== onhandQty) - } + }; - if ( - detailCondition.verificationCheckAll || - detailCondition.anyCountEqWithOnhand || - detailCondition.count1EqWithCount2 || - detailCondition.count1EqWithCount3 || - detailCondition.count2EqWithCount3 - ) { + if (detailCondition.verificationCheckAll || detailCondition.anyCountEqWithOnhand || detailCondition.count1EqWithCount2 || detailCondition.count1EqWithCount3 || detailCondition.count2EqWithCount3) { isDifferent = false; } else { isDifferent = true; break; } - console.log('----------------------------------BATAS SUCI ATAS NEW STOCK ------------------------------'); - console.log('Is Different2222:', isDifferent); - console.log('Conditions:', detailCondition); } - console.log('Total Quantity:', totalQty); - console.log('Onhand Quantity:', onhandQty); - console.log('Difference Quantity:', differenceQty); - console.log('Conditions:', conditional); - console.log('Is Different tambah data:', isDifferent); - console.log('----------------------------------BATAS SUCI BAWAH NEW STOCK------------------------------'); - await prisma.product.update({ where: { id: product.id }, - data: { isDifferent } - }) -}
\ No newline at end of file + data: { isDifferent }, + }); +}; |
