From 2317f9f133f906a41d75c3e1db52a7c5a53a4517 Mon Sep 17 00:00:00 2001 From: ypratama Date: Wed, 12 Aug 2026 14:32:00 +0700 Subject: [PATCH] Migrate architecture to PostgreSQL for Swarm HA --- .dockerignore | 13 + Dockerfile | 63 ++ check.js | 8 + docker-compose.yml | 34 +- inventory.zip | Bin 0 -> 212115 bytes prisma.config.ts | 14 + prisma/schema.prisma | 112 ++++ prisma/seed.ts | 60 ++ scripts/clear_data.js | 27 + scripts/clear_data.ts | 45 ++ scripts/resync.ts | 80 +++ seed.js | 16 + src/app/admin/categories/page.tsx | 166 ++++++ src/app/admin/items/page.tsx | 153 +++++ src/app/admin/settings/page.tsx | 280 +++++++++ src/app/admin/users/page.tsx | 381 ++++++++++++ src/app/api/auth/login/route.ts | 78 +++ src/app/api/auth/logout/route.ts | 20 + src/app/api/cron/email-recap-monthly/route.ts | 153 +++++ src/app/api/cron/telegram-recap/route.ts | 100 ++++ src/app/api/resync/route.ts | 85 +++ src/app/api/seed/route.ts | 25 + src/app/approvals/page.tsx | 549 ++++++++++++++++++ src/app/login/page.module.css | 35 ++ src/app/login/page.tsx | 83 +++ src/app/logs/page.tsx | 158 +++++ src/app/profile/page.tsx | 135 +++++ src/app/request/page.tsx | 517 +++++++++++++++++ src/components/AutoRefresh.tsx | 68 +++ src/components/CategorySelectListener.tsx | 18 + src/components/ExportButton.tsx | 53 ++ src/components/Navbar.module.css | 67 +++ src/components/Navbar.tsx | 51 ++ src/components/SelectAllCheckbox.tsx | 16 + src/lib/auth.ts | 66 +++ src/lib/email.ts | 38 ++ src/lib/prisma.ts | 11 + src/lib/telegram.ts | 33 ++ src/middleware.ts | 48 ++ 39 files changed, 3849 insertions(+), 10 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 check.js create mode 100644 inventory.zip create mode 100644 prisma.config.ts create mode 100644 prisma/schema.prisma create mode 100644 prisma/seed.ts create mode 100644 scripts/clear_data.js create mode 100644 scripts/clear_data.ts create mode 100644 scripts/resync.ts create mode 100644 seed.js create mode 100644 src/app/admin/categories/page.tsx create mode 100644 src/app/admin/items/page.tsx create mode 100644 src/app/admin/settings/page.tsx create mode 100644 src/app/admin/users/page.tsx create mode 100644 src/app/api/auth/login/route.ts create mode 100644 src/app/api/auth/logout/route.ts create mode 100644 src/app/api/cron/email-recap-monthly/route.ts create mode 100644 src/app/api/cron/telegram-recap/route.ts create mode 100644 src/app/api/resync/route.ts create mode 100644 src/app/api/seed/route.ts create mode 100644 src/app/approvals/page.tsx create mode 100644 src/app/login/page.module.css create mode 100644 src/app/login/page.tsx create mode 100644 src/app/logs/page.tsx create mode 100644 src/app/profile/page.tsx create mode 100644 src/app/request/page.tsx create mode 100644 src/components/AutoRefresh.tsx create mode 100644 src/components/CategorySelectListener.tsx create mode 100644 src/components/ExportButton.tsx create mode 100644 src/components/Navbar.module.css create mode 100644 src/components/Navbar.tsx create mode 100644 src/components/SelectAllCheckbox.tsx create mode 100644 src/lib/auth.ts create mode 100644 src/lib/email.ts create mode 100644 src/lib/prisma.ts create mode 100644 src/lib/telegram.ts create mode 100644 src/middleware.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..cc7ff4a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,13 @@ +Dockerfile +.dockerignore +node_modules +npm-debug.log +README.md +.next +.git +.env +.windsurf +.claude +dev.db +dev.db-journal +prisma/data/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f5c5213 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,63 @@ +FROM node:22-alpine AS base + +# Install dependencies only when needed +FROM base AS deps +# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. +RUN apk add --no-cache libc6-compat openssl +WORKDIR /app + +# Install dependencies based on the preferred package manager +COPY package.json package-lock.json* ./ +COPY prisma ./prisma/ +RUN npm install + +# Rebuild the source code only when needed +FROM base AS builder +RUN apk add --no-cache openssl +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Environment variables must be present at build time +ENV NEXT_TELEMETRY_DISABLED=1 +ENV DATABASE_URL="file:dev.db" + +# Generate Prisma Client +RUN npx prisma generate + +RUN npm run build + +# Production image, copy all the files and run next +FROM base AS runner +RUN apk add --no-cache openssl +WORKDIR /app + +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 +ENV DATABASE_URL="file:dev.db" + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +# Set the correct permission for prerender cache and sqlite +RUN mkdir .next +RUN chown nextjs:nodejs /app .next + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static +COPY --from=builder --chown=nextjs:nodejs /app/prisma ./prisma +COPY --from=builder --chown=nextjs:nodejs /app/prisma.config.ts ./prisma.config.ts + +USER nextjs + +EXPOSE 3000 + +ENV PORT=3000 + +# We need to run migrations before starting the app. +# Since we are using PostgreSQL and might not have migration files, we use db push +CMD ["sh", "-c", "npx prisma db push --accept-data-loss && node server.js"] diff --git a/check.js b/check.js new file mode 100644 index 0000000..6c8ec40 --- /dev/null +++ b/check.js @@ -0,0 +1,8 @@ +const { PrismaClient } = require('@prisma/client'); +const prisma = new PrismaClient(); + +async function check() { + const users = await prisma.user.findMany(); + console.log(users); +} +check().catch(console.error).finally(() => prisma.$disconnect()); diff --git a/docker-compose.yml b/docker-compose.yml index 7ca7f11..070a39c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,23 +1,37 @@ version: '3.8' services: - inventory-app: - image: inventory-app:latest - container_name: portal-inventory - ports: - - "3000:3000" + postgres-db: + image: postgres:15-alpine environment: - - NODE_ENV=production - - DATABASE_URL=file:/app/dev.db - - SESSION_SECRET=ganti_dengan_rahasia_acak_anda + - POSTGRES_USER=inventory_user + - POSTGRES_PASSWORD=sandi_rahasia_db_123 + - POSTGRES_DB=inventory_db volumes: - # PENTING: Ganti '/opt/inventory' dengan lokasi folder Anda di VPS Node Manager - - /opt/inventory/dev.db:/app/dev.db + # PENTING: Lokasi folder data PostgreSQL di Node Manager + - /opt/inventory/pgdata:/var/lib/postgresql/data deploy: mode: replicated replicas: 1 placement: constraints: + # Database tetap dikunci di Node Manager agar file data tidak hilang - node.role == manager restart_policy: condition: on-failure + + inventory-app: + image: inventory-app:latest + ports: + - "3000:3000" + environment: + - NODE_ENV=production + - DATABASE_URL=postgresql://inventory_user:sandi_rahasia_db_123@postgres-db:5432/inventory_db?schema=public + - SESSION_SECRET=ganti_dengan_rahasia_acak_anda + deploy: + mode: replicated + replicas: 2 # Aplikasi kini bisa disebar ke beberapa server! + restart_policy: + condition: on-failure + depends_on: + - postgres-db diff --git a/inventory.zip b/inventory.zip new file mode 100644 index 0000000000000000000000000000000000000000..fb9a7e6a8c8ffac65ba271f9522c1155777e127b GIT binary patch literal 212115 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 z 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 T^Cgdw3IooJI=#~Lc(QRM8 zW^+y-G@P!PTKWAIL$!J%NxeRotrm%+y&c-y*(W!`0TTxx8U_CfyZyFY8iXD?48c3=?>2gY%HA}d?W!#xjgc=j(#36V)KElXk_ z(r8kkP88HJKN}LTbp*?eYe$P#12X;fxCxhbi`@ zX7{Kk5{Q7C_uOlfG2UO7(Eng01i)WB;-pfL0{=FF&>;Uy!v32_X4ZCw|HUL5rHz<% zdiamz_~&Au+uhFW2>fQbx9_@k1eE?Fl70Ztl^?ITT*eg6CR*VmBTgJ6Onf;jP3z7& zG%cMrRHxlHEhCy;IkInfjcZ4adyz+520ToXwksk_eG$PTeSB2+eT##0kbSq#c2qY(_ z;S?Jktecpz*Eq*i6OWBa)DY-D65{4(gegixgYA@D4|)w|X!|1BWQy3=?K$E+V=l48 zY#T_x(^!BFi7zR~`UtBeqm_alsj z40kTC04{Mjk}>m@D2i% zt3`J_;p(D2>4fw#jng7e;c$cfd30vi zhMS?AfeWmXgFC^ayIBcDqqCTt|FCy@It&Pc4$DTHDLD_aNrD3iEkp0z?f^aw&%7XY9RfdlrhnjjvosN+*c&&5^UDk| zXhFCiz6yLg(PD5lgTG)68T?g|wQAm!tb&|vpUDLv@5OMg02cWm5>teBVX{W1sWd-$ zCI-)$dOjhn>;=ep-S3U@B{M&K@(OdGbu;XdqgzhKTnZ+sZfr+#;9D%gLLKWh^N@7! zdg6w5f{Yk`7T0NYS!&@|FT_ue5~8qJYM4fjG)KfCZ6b6-BP5%J5LqQZyY;)g)LZ$L z-Y1LXieO0&=tb>b^*DvznqQ|ulhR}pJw_IwF0)ZYwFxBbiWE>5qGp^X((*=@Z*rpm zWdYyyx_WKG5rIUim})dc31K1uPOFWjqY>*3RjDe(=_7{S^^^lKhSv(4*bUuq-Q!UJ zA8#oVc|xPir12ggST}HpI10mjA>B&B^qZhPfEp&rkBg&HV!S2f%h;@jIah(h${tun zOMt<>>jaWzFnGbPb#>KE)t``uUmF0LH{=4orZV~dUAV=UmfY;W(ZcWhM)((MxSBW` znOOfN-ZWEvP=WODAhUWJEzg%FtPmt)`K6zt`J%yT;;=Oj7t#9`KkU-#C)S0~jhxdQ z&*57rN{062$KQz&5lEuPf8|_HN;gN>#bkHg9mn|#SQ+uF3E7>KY@GroNZu{|#z?Tb`SRt+AckU(1V*+p-*>hY8jbF<+^# zHg?b-^uOYTLqM(l!Oqu|uJih!#EsUWgEFE1TI57;Nw){0m-q~p>QWD}vPOp%XuH$O zMqw01sA|ZQYh0d`z#R=wip95FDF6y3?xeqBJ8+$#;PCmhoCoWwF@mtSAh+Smig_uq zC?Bz|fFceH0y0*!JBcC;7c^6SG8q43up$3F`PjAQ$J|@)v_pH_RI<6Hy9vQB?DkTq zr;bGLv&Abf{(pm2mqWHl-?!bV__jNc z-#kzh5fGLUp|vrNR`#_*W`O_j;_ zk-H)G>R#5Ywg=CgG(PV3ple5$2Khsw?$eK@t2=x{2X@SW%NCs)J<(QFr_qakipU}) zH5ea=DR!xECe)ru_Lj@e%K4fy( zZWp?;cU5Ic3yBaAANuTEYJGX@37d9Y0=^u5Gsb-OU=i6(mw z(TL_p1g3(1*<%lq-_>g&u0Ucq7vwzLvdNNLQ?c!qrP|u26vNA9jmUtJ<_xbjC6hV3 z>&c@VO1%0MlLnVK;abne?vc)$##UwF7t>``2QaHw-ULOUaiKMjb%SnGhOMT76k2dBh@xZAIIeIILOI@`z`3QH zh3piojz%L#V`p5y+6*R@PZe&bv`$6IRY)yC@;8rQeOwnEN5;N4fvOWIduxP<)pHrwAaX5Y zC!XwN_NGK=cY>BOQ-?y#o>P6tzMpB%rt+MF>9+;Je>kqV9a7R#W zi9C4!S1qW5{>+bu;*o7`uAU>%^UsOz&JgwOIYFp@5Rqf0;8cg9!u0;3;{X6P-}};U z(f;T4?Uw;KIsVJF1pq*)`ge-&Xz71Z7}(qY(*XtmX!{N&{d1Df6en3m4UI1 zh3(&Hp`8Am_OGzhztdVco7ns-0i@)JZyq~uR@&9^2BBLM(l|8GXv{}qvUc5U z*NM9p4FQ=n2{T4n2QA2^oc81A3NUFs;dT3W7CG9!>PfjO1K9~G^uDpj_@h?@DYoNp zLJY@Q<|WIi=7Z!EiG%Komme7vqOkb>^j7RDv!&u$H9^L5Wt$zi_BWm47((D%$@62t zmZuaR>e-f=vN;X_r3eu4mR<>@*po|+3vs}d#GJUR_~~y!y)XanR8r4QxM72I%!297jhI7si(#$d#;qI=EAxsKP@qon&8xd}RF zA_7pg^(s{5TV&wQM--~bT1;`Ox%#EBQRVtYZJW1#5F)7fi+F`F(Yb0pZXjOHj*v!b z=j8y^RCFPY!OEC-Shds}?%-C%tpH z+*%r?gB~^m!gW2PQiTDrvZ>Jy!0wGocYCx(S@HK={MvCa7zB*bdMyoddkn`FFS9BJ zEfnBfEuq^)nNE{?0k`Z2BTDOSAJxtTeiI}2Zrn0U1HPHjZ>lIB<7})%VvY)q421sG zXzmRNq~|1OW=j4$UIQ4%>B$dQ$WC2>)K{aGp1Ex)H>!fcAmSTobgp%F`b7e30BP+Z z{akaWR1&9aT7A+%hly*{JdMmaP%u+by(tPmC?YmcmbK=xKp3VPN_XE3u^l2fN1~G@ zpK=&QN%8=z)jhN>>1_=3h_y4celpj(ELWtfySbG1azZxiA7nU;BJDdQD2^Tc7LY4d zlVT&H?H>g&A(;dzDFB42)@!yS+j+79b)*|Ivqi~G%6P`fS@|J!pE3nolk+gS8&*4R zS6}%gJ*R0vC}q?kQpGUhygLJ|Zs*bmMmdcH2`8ArimIiyF0PW40;V%^P!pR%Pn#H+ zq}5Xl0}?Flq;8`M_G?6a#h%sP4BZVyb9hYhHZ2;m4dGUNDC%P91qFh6ODP(rIMc$E zV&TkL+7RE5a5rPu0Y>D50{l6hX84U#!pOEaNwa!*5RZRIz|XPHu|w0c=c%!ghegKx zTvI%9LuKcZLb<#f-urMP7{#AM5&pC{OYLidVHb|ZUAI1Vx_0l%WFpl0LlCHb_1xo) zh@H1F1D;ovm_#UM=5hO`b4#;BVUa*41#A$@(zS6wGOvWAI^cHQ zn(iHX?Y8n$s*^`OD*~BxWm0+cU_vV(KC)MzDX?3Ijv31ws>)1e6XOcllN#AR9*$4! zA?9%9yw)f@i^sBTFRD`|rrlkoy3MwK#CC_pAJ}bF&2X9SI@3mI0Hbnd>9jY>7>f*o z{yffpCh3hW^&oaOqaI7spL#s68;V*TwBf){MpDgy3&X@bMCk!GGUJSt3rdV0J2VZ` z+N^VY!*@_O&L$Hd;O5uMZleS0e(Q%d#VQ`#;N8mBZ}%5{r=OPOEU;^4>GdkG!)R;gp}!zwSF?H=iqCHIvBjx%@oek-Um z993?700aG3-4CcE0Y^qnKddT{{t#umyp$+CF5w~&unfB9!hW^*juZ7v?yg~>6xRL= zjs6ow(EfjR-pRz-*}~TB@8Ccb1)|g0%>WVu1_1E;8%yy1_k;d{4@+tqvETUc^QIR4 zm0z>`#8K_aF&9YL7LtH~%>ij)5VB=qtKlJ@4c7zY_s$FGJIJtXR?$iWwjiNm=4uYc zj5kvbMk9H6Z~&1wNFstiiL?l|zf&<*g9KZqvn6P<+!7KcN#q|)5(yRge56IAfR2j1 z{Rep$j&!D6@dZ`|^wZmMxnMmDgis@_%NA#hw=F? zU%N3b!XFe_n9;rQ7J@@o`yx?X>6G&BMSIRTG$tAYziiQL9n+yA1R2=@EDZMmd5je; zss$?|L@E_~dqEj6dLBNHVZL5JMU@nb#c*~45R6PN$6aij+= zV)Z5kAsY3<(^l(T^vELN=&E`eVMd;YAb3!HHJo#lFUp5;p!|?k50y52{BHAgg)p)4 zn?le6EsNAP9h^US1~#nY!p7cYVZ&o~c(O%?wX=XjY<)_y$emqsd(wjZI`!Qch|VeX zsMWr=-VlCiQ{s;kyu3hkZkIs5RH#RtwFz@Em4h{&mtpOZ`VZ<&(l!swkZPL671$79 z=-;GADf$%k&Bmnmce4z1dFZla4cj57Uxw*1iAbbr)aZ@{IQ9Iu##8B{PFww zf`ymU=*TL8O?Bvd4ms&@0c2q3gd$ujnz5Aqf*SB%`h9+t2c7G^6!%K;D(NWRXpkbb zi70wjKG@lxxJo{U6B0hh_)g7F0MF%{uxFlzEQTGdBRbRfpQBj|IPGJLAXWkgWFF*b z<{vH9*sNJMdVD?sd&Xbow5)JOLnV_e<}jU!A8PL?zeY?!5Gf(ShcSeOOBzw({Uzxj zWGQIm7-7xAuh69^AoplU%8g3}hXo%^;;(R1qF`g1x}qZtGu+S$a&q?fgu3H47#Tl+zIwxbWuXQ* zz65ws_MSy{>pGg31kE_dJpp89ulgT3@~v2)KlH(dC&5Vwi#_@w(lqE=C)^w2$~y!h zK9Gj^(#(c#<=L4W*AiXaGad|_Eet1l+r>_`Y9?YZ5?oKBIgImUA$yMmsjZwW@@Icc+mE8W&*aaN(fbV8 zk3g39GZ+Pk&=(G!y@47_zkgBCdYQq;+@n3(fm7#9NA24c-W?HblJb_MLktK9#ubvZeS@!p*nc%fJ=^Y?n0XkhBEWm zh%3$UcIdzh|FRQGFlK_8@(=-O-T+dsp%V=Tu;h7G~WVwEVQ%$Bf zo=oetxm(yjuDc-re4E~4Yozx?kHzCjIbXXE92lB-jYzuQ>1Ufs_!VXA3i#)F)f6oc ziD={c*%P#brx#f{>L<#q®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

YTdNEmPo1%oFLa2O;G1L_zu zT?MoF+-^BcANkGc2Z_E`OZQwXBmMSXYK=4<@8@It4D8VXjh^Y31rTr)Gy+W^BZw#z z0tSP^iEs)E4o4F4cqjn|sH4Fwi+)a(B(qpQeluOXR=WX=Kv!Ro>GQ>>Bg>mTO00iX z-w$eUYNKb`y#N9XMIeF^jRHep2?Qbnizk8nNJ3%AI5-S}LSm5w5Vv$TeQU5-KbFH( z)Nn3S99^7hlfErd4bIxM?R2Lh7}g-vM$c4h0R##KkAPwkcoJCEA%lYoQ4|uEj3=YO zq81#5Ami{LanjEo6@(V+$8x-v&u9))3jK<}r;_F6-to{ttJ{Djwb3)(wEzN)0Fn`u z09NNHL@W|RgyL~fG9FF9gDQ;#Lr}0_yrz{Tn){o^d)iIvSlz!!oW8Y%q>Fg+T zNL+Qh1;|F!M$go50R$|V`V*;(9cVNKiAR7*2M!Czqd|p=!{EUe7#stqU)@K4UAiir z8>f8#)=H_Xv5NcWFtu@<^N?aWE53_kSj@$6#uM%6V&wk^gZ?Q+>|cy|i~KKlbS@Hq z%khR1I@$m0`u?mpIES402A*g^s7>gf6~w_$y$c}BU)o>J z9-RJ4TeK{#Dz;x6l%zxzS4jYuo&;^y3{)ace*orh@!_=i-?u2u%BH&NZBx*BFYtiQ z&BK+xKxpMY`#*1gnthH&mEBDzdw~s5NmEO8|M#8(27lhFIG~m+FkaDbXjx^(08!qj zs$*oR;6S3)`jAfP5)R4+A%VSBC(mmzZ3m+HfauvErfU81K?cb0tyR>gz+iI(S>cF- zJuOCsk`8L!e{Qg%1_2vH3ScM@e4P+r5^{6i6H=Tx17y#y?OW8-%V=dAn3;|I_vWqN zvh|(7eki+3DQy6$32>OzKDGaGmJATGo4t*ryTYHngbucDv=E^OB(A(!bSD=ZWF>gV zQn9O+qW}op1R!P~YEdCl@C*<~vbVcD*dwMu0(+Qg#rq{~YZ_fbd{sWPxt%qp91cWt z0t?VT$n+-s7XP>Z^zth_vxPS-p?wlK+_Ctz&aR9v5J-`3RH-w(RN#2K;bx`z(tpXvdtL(Ld=t%`zm$`>EP)Us7ryO|9x2h zNv8(b+k-&*uRZj18K-vAW?=E1Xb{N29Ko}`PZhl4&_BTrHei1`btf8qR^znU+5Nv_ zNYiy5y&wiy4@5(;P$U!s#lSEYHeeeR9k&RTrEuAPanqD0d$R*`)PR?J5dUz+0XLsz z zus{7C;$s62R->P*H+C#uvXSw7J_#5IJN*FSODwNQ;@Lz zhd|B!b1A&`&{-CM+VkgL&OjpppwSOp5Ql#No@7@d*?ukraihVqAPTNW#x(%(fxry( z5UH~e)Y`|%Yc53j8k1!~+;K@!tpsYi0@OrbnVffIgcyKbw%V$5Diep%bxVi_%Ss@= zK*#@mX18TivvaTuX+0bcf4LJ zy689yf!vz&M&)cip!T<(Mlzn{VB<(9zxU|bk;U^3sE6mAemI-esPZT0$+vMQJJ63; zom}ZE-AiP(v*1(})vT%Ld|=Ey{ByTIZg%~xb*g@Tv-pkj_Z&r9YcxsvB!65KZNAP{ z|I5@=POH4ut8P;Z??Jnyru_?@Yqdrt)=oG zC<}2){k)ZZDGv{x6OprJ9@Scwpz`~Ba53K5hR(m0#Xm$Z6`6CT&t@yC^vF5Vsc#?u z&k*5r2++G*=|T{{Z)~FV>*%B2rx)kK1_=ha;GM^&9xSLpx`1uy-R#D_EyPXt-qAZtaf8oEeDr1dn`l~Y;0$a}a7`s0t5@1AE=vW{NHnv#*^%2(Ra{{0 z8|+G;-(k)Zvk=BYVN}G?e`#ikprsZsyG510e2{=ZG|6*c;bA{Ni$%eE+JJeh0{BAf z5E0O4IZKsb^Y8MM{F95s!T-|tWr*NeJ6wgi*;7Xs3P?5&ywnY|v67K7JM zRN(8P7z2T=dCAHhNbn$_k4Kn{ir@!K< zS__yfejyfUjU%0lhyFr$rO?7eJ)LE-h*|XC9C^N!S?1q>K?@|-JO>CIA46++56nR0 z;t2B#&)F#p)gb3z&>;Ld$DbBq=>nAPS7}RsHvlb%+6536GE2nzt|d#|`3G_TMWS+f z*gnhU??KzNTt1gi?O!S%&p*8TF9OxSJ}-c<5SK%U+V_iRV+dsaF^YeYs9ak5eslS? z`uY1%MOrGt@4tn8S~L>begV)Qz4#Y^N`>M5JOE|-gBWS?FyEKPn|~x6Ene&3JiNIF z#L)sWOZrwWH44l>XNwkaVt5|lyi>Pm5jPB{xDPL(()s5+(IUPd`7gvdVOy|m5C2j% z@BDLe{z6gRgKzvd6!jPjS`tD@q5Vtcw)to4{FO}g3oMP~KPT3f9f-FZ-^N*XL1<{%M4MKPL1T6%Q wT1V?rs+xcN04+q?G$Z|C1hnGshaCKm^)MDN*MvaMfq#BGL7@KtOC*s02NdTkN&o-= literal 0 HcmV?d00001 diff --git a/prisma.config.ts b/prisma.config.ts new file mode 100644 index 0000000..831a20f --- /dev/null +++ b/prisma.config.ts @@ -0,0 +1,14 @@ +// This file was generated by Prisma, and assumes you have installed the following: +// npm install --save-dev prisma dotenv +import "dotenv/config"; +import { defineConfig } from "prisma/config"; + +export default defineConfig({ + schema: "prisma/schema.prisma", + migrations: { + path: "prisma/migrations", + }, + datasource: { + url: process.env["DATABASE_URL"], + }, +}); diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..682d81f --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,112 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model User { + id Int @id @default(autoincrement()) + username String? @unique + email String @unique + password String + name String + role String @default("user") // "user", "approver", "super_admin" + failedLoginAttempts Int @default(0) + lockoutUntil DateTime? + requests Request[] + approvals ApprovalLog[] + activityLogs ActivityLog[] + categories Category[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model SystemSettings { + id Int @id @default(1) + telegramBotToken String? + telegramChatId String? + isTelegramEnabled Boolean @default(false) + + // Email Config + isEmailEnabled Boolean @default(false) + smtpHost String? + smtpPort Int? + smtpUser String? + smtpPass String? + targetEmail String? // Comma separated for multiple + + updatedAt DateTime @updatedAt +} + +model Category { + id Int @id @default(autoincrement()) + name String @unique + users User[] + items Item[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Item { + id Int @id @default(autoincrement()) + name String @unique + totalQuantity Int @default(0) + borrowedQty Int @default(0) + trialQty Int @default(0) + billedQty Int @default(0) + availableQty Int @default(0) + damagedQty Int @default(0) + soldQty Int @default(0) + categoryId Int? + category Category? @relation(fields: [categoryId], references: [id]) + requests Request[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Request { + id Int @id @default(autoincrement()) + userId Int + itemId Int + quantity Int @default(1) + purpose String + company String + address String + requestDate DateTime @default(now()) + status String @default("pending") // "pending", "approved_1", "approved_2", "rejected" + type String @default("borrow") // "borrow", "trial", "billed", "purchase", "return_borrow", "return_trial", "return_billed" + notes String? + serialNumber String? + user User @relation(fields: [userId], references: [id]) + item Item @relation(fields: [itemId], references: [id]) + approvalLogs ApprovalLog[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model ApprovalLog { + id Int @id @default(autoincrement()) + requestId Int + approverId Int + approvalStep Int // 1 or 2 + status String // "approved", "rejected" + request Request @relation(fields: [requestId], references: [id]) + approver User @relation(fields: [approverId], references: [id]) + createdAt DateTime @default(now()) +} + +model ActivityLog { + id Int @id @default(autoincrement()) + userId Int + user User @relation(fields: [userId], references: [id]) + action String + details String + type String // "request", "approval", "admin_item", "admin_user" + createdAt DateTime @default(now()) +} diff --git a/prisma/seed.ts b/prisma/seed.ts new file mode 100644 index 0000000..fa7016d --- /dev/null +++ b/prisma/seed.ts @@ -0,0 +1,60 @@ +import { PrismaClient } from '@prisma/client' +import { PrismaLibSql } from '@prisma/adapter-libsql' +import 'dotenv/config' + +const adapter = new PrismaLibSql({ + url: process.env.DATABASE_URL || 'file:./dev.db', +}) +const prisma = new PrismaClient({ adapter }) + +async function main() { + const items = [ + 'BackOne Lite', + 'BackOne Pro', + 'BackOne Gateway', + 'BackOne Enterprise', + 'BackOne Ultimate' + ] + + console.log('Seeding initial items...') + + for (const itemName of items) { + const existing = await prisma.item.findUnique({ where: { name: itemName } }) + if (!existing) { + await prisma.item.create({ + data: { + name: itemName, + totalQuantity: 0, + }, + }) + console.log(`Created item: ${itemName}`) + } else { + console.log(`Item ${itemName} already exists.`) + } + } + + // Create an initial super admin + const existingAdmin = await prisma.user.findUnique({ where: { email: 'admin@backone.id' } }) + if (!existingAdmin) { + await prisma.user.create({ + data: { + name: 'Super Admin', + email: 'admin@backone.id', + password: 'password', // TODO: In production this should be hashed + role: 'super_admin' + } + }) + console.log('Created Super Admin (admin@backone.id / password)') + } + + console.log('Seeding finished.') +} + +main() + .catch((e) => { + console.error(e) + process.exit(1) + }) + .finally(async () => { + await prisma.$disconnect() + }) diff --git a/scripts/clear_data.js b/scripts/clear_data.js new file mode 100644 index 0000000..8019e2f --- /dev/null +++ b/scripts/clear_data.js @@ -0,0 +1,27 @@ +const { DatabaseSync } = require('node:sqlite'); + +const db = new DatabaseSync('dev.db'); + +try { + // 1. Delete all ApprovalLogs + db.exec('DELETE FROM ApprovalLog'); + console.log('Cleared all ApprovalLogs'); + + // 2. Delete all Requests + db.exec('DELETE FROM Request'); + console.log('Cleared all Requests'); + + // 3. Delete ActivityLogs + db.exec('DELETE FROM ActivityLog'); + console.log('Cleared all ActivityLogs'); + + // 4. Reset all Item quantities to 0 + db.exec('UPDATE Item SET totalQuantity = 0, borrowedQty = 0, trialQty = 0, billedQty = 0, availableQty = 0, damagedQty = 0, soldQty = 0'); + console.log('Reset all item quantities to 0'); + + console.log('Done!'); +} catch (err) { + console.error('Error:', err); +} finally { + db.close(); +} diff --git a/scripts/clear_data.ts b/scripts/clear_data.ts new file mode 100644 index 0000000..3c313f9 --- /dev/null +++ b/scripts/clear_data.ts @@ -0,0 +1,45 @@ +import { PrismaClient } from '@prisma/client' + +const prisma = new PrismaClient({ + datasources: { + db: { + url: 'file:dev.db' + } + } +}) + +async function main() { + console.log('Clearing data...') + + // 1. Delete all ApprovalLogs + await prisma.approvalLog.deleteMany({}) + console.log('Cleared all ApprovalLogs') + + // 2. Delete all Requests + await prisma.request.deleteMany({}) + console.log('Cleared all Requests') + + // 3. Delete ActivityLogs to clear history page completely + await prisma.activityLog.deleteMany({}) + console.log('Cleared all ActivityLogs') + + // 4. Reset all Item quantities to 0 + await prisma.item.updateMany({ + data: { + totalQuantity: 0, + borrowedQty: 0, + trialQty: 0, + billedQty: 0, + availableQty: 0, + damagedQty: 0, + soldQty: 0, + } + }) + console.log('Reset all item quantities to 0') + + console.log('Done!') +} + +main() + .catch(console.error) + .finally(() => prisma.$disconnect()) diff --git a/scripts/resync.ts b/scripts/resync.ts new file mode 100644 index 0000000..2cacef2 --- /dev/null +++ b/scripts/resync.ts @@ -0,0 +1,80 @@ +import { PrismaClient } from '@prisma/client' +import { PrismaLibSql } from '@prisma/adapter-libsql' +const adapter = new PrismaLibSql({ + url: 'file:dev.db', +}) +const prisma = new PrismaClient({ adapter }) + +async function main() { + const items = await prisma.item.findMany({ + include: { requests: { where: { status: 'approved_2' } } } + }) + + let updatedCount = 0; + + for (const item of items) { + let borrowedQty = 0; + let trialQty = 0; + let billedQty = 0; + let soldQty = 0; + let damagedQty = 0; + + for (const req of item.requests) { + const qty = req.quantity; + let type = req.type.toLowerCase(); + if (type === 'manage service') type = 'billed'; + if (type === 'outright purchase') type = 'outright_purchase'; + + if (type !== req.type) { + await prisma.request.update({ where: { id: req.id }, data: { type } }); + } + + // Borrowed + if (type === 'borrow') borrowedQty += qty; + if (type === 'return_borrow' || type === 'return_damaged_borrow') borrowedQty -= qty; + + // Trial + if (type === 'trial') trialQty += qty; + if (type === 'return_trial' || type === 'return_damaged_trial') trialQty -= qty; + + // Billed + if (type === 'billed') billedQty += qty; + if (type === 'return_billed' || type === 'return_damaged_billed') billedQty -= qty; + + // Sold + if (type === 'outright_purchase') soldQty += qty; + if (type === 'return_damaged_sold') soldQty -= qty; + + // Damaged + if (type === 'return_damaged_borrow' || type === 'return_damaged_trial' || type === 'return_damaged_billed' || type === 'return_damaged_sold') { + damagedQty += qty; + } + } + + borrowedQty = Math.max(0, borrowedQty); + trialQty = Math.max(0, trialQty); + billedQty = Math.max(0, billedQty); + soldQty = Math.max(0, soldQty); + damagedQty = Math.max(0, damagedQty); + + const availableQty = Math.max(0, item.totalQuantity - borrowedQty - trialQty - billedQty - damagedQty - soldQty); + + await prisma.item.update({ + where: { id: item.id }, + data: { + borrowedQty, + trialQty, + billedQty, + soldQty, + damagedQty, + availableQty + } + }) + updatedCount++; + } + console.log(`Resynced ${updatedCount} items.`); +} + +main() + .catch(console.error) + .finally(() => prisma.$disconnect()) diff --git a/seed.js b/seed.js new file mode 100644 index 0000000..07a7106 --- /dev/null +++ b/seed.js @@ -0,0 +1,16 @@ +const { PrismaClient } = require('@prisma/client'); +const prisma = new PrismaClient(); + +async function main() { + await prisma.user.create({ + data: { + name: 'Admin', + email: 'admin@backone.id', + password: 'password', + role: 'super_admin' + } + }); + console.log('Seeded admin user'); +} + +main().catch(console.error).finally(() => prisma.$disconnect()); diff --git a/src/app/admin/categories/page.tsx b/src/app/admin/categories/page.tsx new file mode 100644 index 0000000..c0e68b3 --- /dev/null +++ b/src/app/admin/categories/page.tsx @@ -0,0 +1,166 @@ +import { prisma } from '@/lib/prisma' +import { getSession } from '@/lib/auth' +import { redirect } from 'next/navigation' +import { revalidatePath } from 'next/cache' + +export default async function AdminCategoriesPage({ searchParams }: { searchParams: Promise<{ edit?: string, error?: string, name?: string }> }) { + const { edit, error, name: spName } = await searchParams + const session = await getSession() + if (!session || session.role !== 'super_admin') { + redirect('/') + } + + const categories = await prisma.category.findMany({ include: { _count: { select: { items: true, users: true } } } }) + const editingCategory = edit ? categories.find(c => c.id === parseInt(edit)) : null + + async function addCategory(formData: FormData) { + 'use server' + const name = formData.get('name') as string + + if (!name) { + redirect('/admin/categories?error=Category+name+is+required') + } + + const existing = await prisma.category.findUnique({ where: { name } }) + if (existing) { + redirect('/admin/categories?error=Category+already+exists') + } + + await prisma.category.create({ data: { name } }) + revalidatePath('/admin/categories') + redirect('/admin/categories') + } + + async function editCategory(formData: FormData) { + 'use server' + const id = parseInt(formData.get('id') as string) + const name = formData.get('name') as string + + if (!name) { + redirect(`/admin/categories?edit=${id}&error=Category+name+is+required`) + } + + const existingCategory = await prisma.category.findUnique({ where: { id } }) + if (!existingCategory) return + + if (name !== existingCategory.name) { + const checkName = await prisma.category.findUnique({ where: { name } }) + if (checkName) { + redirect(`/admin/categories?edit=${id}&error=Category+already+exists`) + } + } + + await prisma.category.update({ + where: { id }, + data: { name } + }) + + revalidatePath('/admin/categories') + redirect('/admin/categories') + } + + async function deleteCategory(formData: FormData) { + 'use server' + const id = parseInt(formData.get('id') as string) + const categoryToDelete = await prisma.category.findUnique({ where: { id }, include: { _count: { select: { items: true, users: true } } } }) + if (categoryToDelete) { + if (categoryToDelete._count.items > 0 || categoryToDelete._count.users > 0) { + redirect('/admin/categories?error=Cannot+delete+category+with+items+or+users') + } + await prisma.category.delete({ where: { id } }) + } + revalidatePath('/admin/categories') + redirect('/admin/categories') + } + + return ( +

+ ) +} diff --git a/src/app/admin/items/page.tsx b/src/app/admin/items/page.tsx new file mode 100644 index 0000000..5d7ef15 --- /dev/null +++ b/src/app/admin/items/page.tsx @@ -0,0 +1,153 @@ +import { prisma } from '@/lib/prisma' +import { getSession } from '@/lib/auth' +import { redirect } from 'next/navigation' +import { revalidatePath } from 'next/cache' + +export default async function AdminItemsPage() { + const session = await getSession() + if (!session || (session.role !== 'super_admin' && session.role !== 'approver')) { + redirect('/') + } + + const items = await prisma.item.findMany({ include: { category: true } }) + const categories = await prisma.category.findMany() + + async function addItem(formData: FormData) { + 'use server' + const name = formData.get('name') as string + const qtyStr = formData.get('quantity') as string + const qty = qtyStr ? parseInt(qtyStr) : 0 + const categoryIdStr = formData.get('categoryId') as string + const categoryId = categoryIdStr ? parseInt(categoryIdStr) : null + + if (!name) return + + const existing = await prisma.item.findUnique({ where: { name } }) + if (existing) { + const updateData: any = {} + if (qty > 0) { + updateData.totalQuantity = existing.totalQuantity + qty + updateData.availableQty = existing.availableQty + qty + } + if (categoryId) { + updateData.categoryId = categoryId + } + + await prisma.item.update({ + where: { id: existing.id }, + data: updateData + }) + + let details = `Updated existing item: ${name}` + if (qty > 0) details += ` (Added ${qty} stock)` + if (categoryId && categoryId !== existing.categoryId) details += ` (Updated Category)` + + await prisma.activityLog.create({ + data: { + userId: session!.id, + action: 'Update Item', + details, + type: 'admin_item' + } + }) + } else { + await prisma.item.create({ + data: { + name, + totalQuantity: qty > 0 ? qty : 0, + availableQty: qty > 0 ? qty : 0, + categoryId + } + }) + await prisma.activityLog.create({ + data: { + userId: session!.id, + action: 'Create New Item', + details: `Created new item: ${name} with ${qty} stock`, + type: 'admin_item' + } + }) + } + revalidatePath('/admin/items') + revalidatePath('/') + } + + return ( +
+

Item Management

+ +
+
+

Add Stock

+
+
+ + +
+
+ + + + {items.map(item => ( + +
+
+ + +
+ +
+

+ Select an existing item from the dropdown, or type a new name to create a new item. Set quantity to 0 if you only want to update the category of an existing item. +

+
+ +
+

Inventory Status

+
+ + + + + + + + + + + + + {items.map(item => ( + + + + + + + + + ))} + +
Item NameCategoryTotal StockAvailableDamagedSold
{item.name} + {item.category?.name || '-'} + {item.totalQuantity} + + {item.availableQty} + + {item.damagedQty}{item.soldQty}
+
+
+
+
+ ) +} diff --git a/src/app/admin/settings/page.tsx b/src/app/admin/settings/page.tsx new file mode 100644 index 0000000..db62c2c --- /dev/null +++ b/src/app/admin/settings/page.tsx @@ -0,0 +1,280 @@ +import { prisma } from '@/lib/prisma' +import { getSession } from '@/lib/auth' +import { redirect } from 'next/navigation' +import { revalidatePath } from 'next/cache' +import { sendTelegramMessage } from '@/lib/telegram' + +export default async function SettingsPage({ searchParams }: { searchParams: Promise<{ success?: string, test?: string, test_recap?: string }> }) { + const { success, test, test_recap } = await searchParams + + const session = await getSession() + if (!session || session.role !== 'super_admin') { + redirect('/') + } + + // Ensure settings record exists + let settings = await prisma.systemSettings.findFirst() + if (!settings) { + settings = await prisma.systemSettings.create({ + data: { isTelegramEnabled: false } + }) + } + + async function updateSettings(formData: FormData) { + 'use server' + const botToken = formData.get('botToken') as string + const chatId = formData.get('chatId') as string + const isEnabled = formData.get('isEnabled') === 'true' + + const smtpHost = formData.get('smtpHost') as string + const smtpPort = parseInt(formData.get('smtpPort') as string) || null + const smtpUser = formData.get('smtpUser') as string + const smtpPass = formData.get('smtpPass') as string + const targetEmail = formData.get('targetEmail') as string + const isEmailEnabled = formData.get('isEmailEnabled') === 'true' + + const existing = await prisma.systemSettings.findFirst() + + if (existing) { + await prisma.systemSettings.update({ + where: { id: existing.id }, + data: { + telegramBotToken: botToken || null, + telegramChatId: chatId || null, + isTelegramEnabled: isEnabled, + smtpHost: smtpHost || null, + smtpPort, + smtpUser: smtpUser || null, + smtpPass: smtpPass || null, + targetEmail: targetEmail || null, + isEmailEnabled + } + }) + } else { + await prisma.systemSettings.create({ + data: { + telegramBotToken: botToken || null, + telegramChatId: chatId || null, + isTelegramEnabled: isEnabled, + smtpHost: smtpHost || null, + smtpPort, + smtpUser: smtpUser || null, + smtpPass: smtpPass || null, + targetEmail: targetEmail || null, + isEmailEnabled + } + }) + } + + const session = await getSession() + if (session) { + await prisma.activityLog.create({ + data: { + userId: session.id, + action: 'Update System Settings', + details: 'Updated Telegram API configuration', + type: 'admin_user' // Reuse admin_user for system changes + } + }) + } + + redirect('/admin/settings?success=true') + } + + async function testTelegram() { + 'use server' + const success = await sendTelegramMessage('🔔 Test Notification\n\nJika pesan ini masuk, artinya integrasi API Telegram Portal Inventory Anda sudah berjalan dengan baik!') + if (success) { + redirect('/admin/settings?test=success') + } else { + redirect('/admin/settings?test=error') + } + } + + async function testTelegramRecap() { + 'use server' + const settings = await prisma.systemSettings.findFirst() + if (!settings || !settings.isTelegramEnabled) { + redirect('/admin/settings?test_recap=error') + } + + const now = new Date() + const firstDayPrevMonth = new Date(now.getFullYear(), now.getMonth() - 1, 1) + const lastDayPrevMonth = new Date(now.getFullYear(), now.getMonth(), 0, 23, 59, 59, 999) + + const totalRequests = await prisma.request.count({ + where: { createdAt: { gte: firstDayPrevMonth, lte: lastDayPrevMonth } } + }) + const approvedRequestsData = await prisma.request.findMany({ + where: { status: 'approved_2', createdAt: { gte: firstDayPrevMonth, lte: lastDayPrevMonth } } + }) + + const approvedRequests = approvedRequestsData.length; + let inCount = 0; let outCount = 0; + let inQty = 0; let outQty = 0; + + const breakdown: Record = { + purchase: { count: 0, qty: 0 }, + return_borrow: { count: 0, qty: 0 }, + return_trial: { count: 0, qty: 0 }, + return_billed: { count: 0, qty: 0 }, + return_damaged_borrow: { count: 0, qty: 0 }, + return_damaged_trial: { count: 0, qty: 0 }, + return_damaged_billed: { count: 0, qty: 0 }, + return_damaged_sold: { count: 0, qty: 0 }, + borrow: { count: 0, qty: 0 }, + trial: { count: 0, qty: 0 }, + billed: { count: 0, qty: 0 }, + outright_purchase: { count: 0, qty: 0 } + } + + approvedRequestsData.forEach(req => { + if (!breakdown[req.type]) { + breakdown[req.type] = { count: 0, qty: 0 }; + } + breakdown[req.type].count += 1; + breakdown[req.type].qty += req.quantity; + + if (['purchase', 'return_borrow', 'return_trial', 'return_billed', 'return_damaged_borrow', 'return_damaged_trial', 'return_damaged_billed', 'return_damaged_sold'].includes(req.type)) { + inCount += 1; inQty += req.quantity; + } else if (['borrow', 'trial', 'billed', 'outright_purchase'].includes(req.type)) { + outCount += 1; outQty += req.quantity; + } + }) + + const monthName = firstDayPrevMonth.toLocaleString('id-ID', { month: 'long', year: 'numeric' }) + let message = `📊 [TEST] Rekap Inventory Bulanan\nBulan: ${monthName}\n\nTotal Request: ${totalRequests}\nTotal Approved: ${approvedRequests}\n\n` + message += `📥 BARANG MASUK & RETURN\n` + message += `Total: ${inCount} transaksi (${inQty} barang)\n` + message += `• Purchase: ${breakdown.purchase?.count || 0}\n` + message += `• Return Borrow: ${breakdown.return_borrow?.count || 0}\n` + message += `• Return Trial: ${breakdown.return_trial?.count || 0}\n` + message += `• Return Manage Service: ${breakdown.return_billed?.count || 0}\n` + message += `• Return Damaged (Broken): ${(breakdown.return_damaged_borrow?.count || 0) + (breakdown.return_damaged_trial?.count || 0) + (breakdown.return_damaged_billed?.count || 0) + (breakdown.return_damaged_sold?.count || 0)}\n\n` + message += `📤 BARANG KELUAR\n` + message += `Total: ${outCount} transaksi (${outQty} barang)\n` + message += `• Borrow: ${breakdown.borrow?.count || 0}\n` + message += `• Trial: ${breakdown.trial?.count || 0}\n` + message += `• Manage Service: ${breakdown.billed?.count || 0}\n` + message += `• Outright Purchase: ${breakdown.outright_purchase?.count || 0}` + + const success = await sendTelegramMessage(message) + if (success) { + redirect('/admin/settings?test_recap=success') + } else { + redirect('/admin/settings?test_recap=error') + } + } + + return ( +
+

System Settings

+ + {success === 'true' && ( +
+ ✅ Pengaturan berhasil disimpan! +
+ )} + {test === 'success' && ( +
+ ✅ Pesan uji coba berhasil dikirim ke Telegram! +
+ )} + {test === 'error' && ( +
+ ❌ Gagal mengirim pesan. Pastikan Token Bot dan Chat ID sudah benar & disimpan. +
+ )} + {test_recap === 'success' && ( +
+ ✅ Laporan rekap bulanan berhasil dikirim ke Telegram! +
+ )} + {test_recap === 'error' && ( +
+ ❌ Gagal mengirim rekap. Pastikan integrasi Telegram sudah diaktifkan dan dikonfigurasi. +
+ )} + +
+

Telegram Notifications

+

+ Configure a Telegram Bot to receive real-time notifications for new requests and approvals. +

+ +
+
+ + +
+
+ + +
+
+ + +
+ +
+

+ 📧 Email Recap Configuration +

+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + + +
+
+
+
+ ) +} diff --git a/src/app/admin/users/page.tsx b/src/app/admin/users/page.tsx new file mode 100644 index 0000000..1a9af01 --- /dev/null +++ b/src/app/admin/users/page.tsx @@ -0,0 +1,381 @@ +import { prisma } from '@/lib/prisma' +import { getSession } from '@/lib/auth' +import { redirect } from 'next/navigation' +import { revalidatePath } from 'next/cache' + +export default async function AdminUsersPage({ searchParams }: { searchParams: Promise<{ edit?: string, error?: string, err_name?: string, err_email?: string, err_username?: string, err_password?: string, err_categories?: string, name?: string, email?: string, username?: string, role?: string }> }) { + const { edit, error, err_name, err_email, err_username, err_password, err_categories, name: spName, email: spEmail, username: spUsername, role: spRole } = await searchParams + const session = await getSession() + if (!session || session.role !== 'super_admin') { + redirect('/') + } + + const users = await prisma.user.findMany({ include: { categories: true } }) + const categories = await prisma.category.findMany() + const editingUser = edit ? users.find(u => u.id === parseInt(edit)) : null + + async function addUser(formData: FormData) { + 'use server' + const name = formData.get('name') as string + const email = formData.get('email') as string + const username = formData.get('username') as string + const password = formData.get('password') as string + const role = formData.get('role') as string + const categoryIds = formData.getAll('categories').map(id => parseInt(id as string)).filter(id => !isNaN(id)) + + const qs = `&name=${encodeURIComponent(name||'')}&email=${encodeURIComponent(email||'')}&username=${encodeURIComponent(username||'')}&role=${encodeURIComponent(role||'')}` + + let hasError = false; + let errName = '', errEmail = '', errUsername = '', errPassword = '', errCategories = ''; + + if (categoryIds.length === 0) { + errCategories = 'At least one group/category is required'; + hasError = true; + } + + if (!name || name.trim().split(/\s+/).length < 2) { + errName = 'Name must contain at least 2 words'; + hasError = true; + } + + if (username) { + const existingUsername = await prisma.user.findUnique({ where: { username } }) + if (existingUsername) { + errUsername = 'Username already exists'; + hasError = true; + } + } else { + errUsername = 'Username is required'; + hasError = true; + } + + if (email) { + const existing = await prisma.user.findUnique({ where: { email } }) + if (existing) { + errEmail = 'Email already exists'; + hasError = true; + } + } else { + errEmail = 'Email is required'; + hasError = true; + } + + if (!password || password.length < 8 || !/[A-Z]/.test(password) || !/[^a-zA-Z0-9]/.test(password)) { + errPassword = 'Password must be at least 8 chars, contain an uppercase letter and a special character'; + hasError = true; + } + + if (hasError) { + redirect(`/admin/users?err_name=${encodeURIComponent(errName)}&err_email=${encodeURIComponent(errEmail)}&err_username=${encodeURIComponent(errUsername)}&err_password=${encodeURIComponent(errPassword)}&err_categories=${encodeURIComponent(errCategories)}${qs}`) + } + + await prisma.user.create({ + data: { + name, + email, + username: username || null, + password, + role, + categories: { connect: categoryIds.map(id => ({ id })) } + } + }) + + const session = await getSession() + await prisma.activityLog.create({ + data: { + userId: session!.id, + action: 'Create New User', + details: `Created new user: ${name} (${email}) with role: ${role}`, + type: 'admin_user' + } + }) + revalidatePath('/admin/users') + } + + async function editUser(formData: FormData) { + 'use server' + const id = parseInt(formData.get('id') as string) + const name = formData.get('name') as string + const email = formData.get('email') as string + const username = formData.get('username') as string + const password = formData.get('password') as string + const role = formData.get('role') as string + const categoryIds = formData.getAll('categories').map(id => parseInt(id as string)).filter(id => !isNaN(id)) + + const qs = `&edit=${id}&name=${encodeURIComponent(name||'')}&email=${encodeURIComponent(email||'')}&username=${encodeURIComponent(username||'')}&role=${encodeURIComponent(role||'')}` + + const existingUser = await prisma.user.findUnique({ where: { id } }) + if (!existingUser) return + + let hasError = false; + let errName = '', errEmail = '', errUsername = '', errPassword = '', errCategories = ''; + + if (categoryIds.length === 0) { + errCategories = 'At least one group/category is required'; + hasError = true; + } + + if (name && name.trim().split(/\s+/).length < 2) { + errName = 'Name must contain at least 2 words'; + hasError = true; + } + + if (username) { + if (username !== existingUser.username) { + const checkUsername = await prisma.user.findUnique({ where: { username } }) + if (checkUsername) { + errUsername = 'Username already exists'; + hasError = true; + } + } + } else { + errUsername = 'Username is required'; + hasError = true; + } + + if (email) { + if (email !== existingUser.email) { + const checkEmail = await prisma.user.findUnique({ where: { email } }) + if (checkEmail) { + errEmail = 'Email already exists'; + hasError = true; + } + } + } else { + errEmail = 'Email is required'; + hasError = true; + } + + if (password) { + if (password.length < 8 || !/[A-Z]/.test(password) || !/[^a-zA-Z0-9]/.test(password)) { + errPassword = 'Password must be at least 8 chars, contain an uppercase letter and a special character'; + hasError = true; + } + } + + if (hasError) { + redirect(`/admin/users?err_name=${encodeURIComponent(errName)}&err_email=${encodeURIComponent(errEmail)}&err_username=${encodeURIComponent(errUsername)}&err_password=${encodeURIComponent(errPassword)}&err_categories=${encodeURIComponent(errCategories)}${qs}`) + } + + // Only update fields that are provided + const updateData: any = { role } + if (name) updateData.name = name + if (email) updateData.email = email + if (username) updateData.username = username + if (password) updateData.password = password + updateData.categories = { set: categoryIds.map(id => ({ id })) } + + await prisma.user.update({ + where: { id }, + data: updateData + }) + + const session = await getSession() + await prisma.activityLog.create({ + data: { + userId: session!.id, + action: 'Update User', + details: `Updated user: ${existingUser.name} (${email})`, + type: 'admin_user' + } + }) + + redirect('/admin/users') + } + + async function deleteUser(formData: FormData) { + 'use server' + const id = parseInt(formData.get('id') as string) + const userToDelete = await prisma.user.findUnique({ where: { id } }) + if (userToDelete) { + if (userToDelete.role === 'super_admin') { + redirect('/admin/users?error=Cannot+delete+super+admin') + } + + await prisma.user.delete({ where: { id } }) + + const session = await getSession() + await prisma.activityLog.create({ + data: { + userId: session!.id, + action: 'Delete User', + details: `Deleted user: ${userToDelete.name} (${userToDelete.email})`, + type: 'admin_user' + } + }) + } + redirect('/admin/users') // clear any edit states + } + + return ( +
+

User Management

+ + {error && ( +
+ ❌ {error} +
+ )} + +
+
+ {editingUser ? ( + <> +
+

Edit User

+ Cancel +
+
+ +
+ + + {err_name &&
{err_name}
} + {editingUser.role === 'super_admin' && ( + + )} +
+
+ + + {err_username &&
{err_username}
} +
+
+ + + {err_email &&
{err_email}
} +
+
+ + + {err_password &&
{err_password}
} +
+
+ + + {editingUser.role === 'super_admin' && ( + + )} +
+
+ +
+ {categories.map(cat => ( + + ))} +
+ {err_categories &&
{err_categories}
} +
+ +
+ + ) : ( + <> +

Add New User

+
+
+ + + {err_name &&
{err_name}
} +
+
+ + + {err_username &&
{err_username}
} +
+
+ + + {err_email &&
{err_email}
} +
+
+ + + {err_password &&
{err_password}
} +
+
+ + +
+
+ +
+ {categories.map(cat => ( + + ))} +
+ {err_categories &&
{err_categories}
} +
+ +
+ + )} +
+ +
+

Existing Users

+
+ + + + + + + + + + + + + {users.map(user => ( + + + + + + + + + ))} + +
NameUsernameEmailRoleGroupsActions
{user.name}{user.username || '-'}{user.email} + + {user.role.replace('_', ' ')} + + + {user.categories.length > 0 + ? user.categories.map(c => c.name).join(', ') + : -} + +
+ Edit + {user.email !== session.email && user.role !== 'super_admin' && ( +
+ + +
+ )} +
+
+
+
+
+
+ ) +} diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts new file mode 100644 index 0000000..89c8d7d --- /dev/null +++ b/src/app/api/auth/login/route.ts @@ -0,0 +1,78 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' +import { setSession } from '@/lib/auth' + +export async function POST(request: Request) { + try { + const { email, password } = await request.json() + + // In production, compare hashed password + const user = await prisma.user.findFirst({ + where: { + OR: [ + { email }, + { username: email } // treat 'email' field as identifier + ] + } + }) + + if (!user) { + return NextResponse.json({ error: 'Invalid credentials' }, { status: 401 }) + } + + // Check if locked out + if (user.lockoutUntil && user.lockoutUntil > new Date()) { + const remainingMs = user.lockoutUntil.getTime() - new Date().getTime() + const remainingMinutes = Math.ceil(remainingMs / 60000) + return NextResponse.json({ error: `Account locked. Try again in ${remainingMinutes} minutes.` }, { status: 429 }) + } + + if (user.password !== password) { + // Increment failed attempts + const newAttempts = user.failedLoginAttempts + 1 + let lockoutDate = null + + if (newAttempts >= 5) { + // Lockout for 10 minutes + lockoutDate = new Date(new Date().getTime() + 10 * 60000) + } + + await prisma.user.update({ + where: { id: user.id }, + data: { + failedLoginAttempts: newAttempts, + lockoutUntil: lockoutDate + } + }) + + if (lockoutDate) { + return NextResponse.json({ error: 'Too many failed attempts. Account locked for 10 minutes.' }, { status: 429 }) + } + + return NextResponse.json({ error: 'Invalid credentials' }, { status: 401 }) + } + + // Success! Reset attempts and lockout + await prisma.user.update({ + where: { id: user.id }, + data: { failedLoginAttempts: 0, lockoutUntil: null } + }) + + // Log the successful login + await prisma.activityLog.create({ + data: { + userId: user.id, + action: 'User Login', + details: 'Logged into the system successfully', + type: 'auth' + } + }) + + await setSession({ id: user.id, email: user.email, name: user.name, role: user.role }) + + return NextResponse.json({ success: true }) + } catch (error: any) { + console.error("Login API Error:", error) + return NextResponse.json({ error: error.message || 'Internal Server Error' }, { status: 500 }) + } +} diff --git a/src/app/api/auth/logout/route.ts b/src/app/api/auth/logout/route.ts new file mode 100644 index 0000000..e54941b --- /dev/null +++ b/src/app/api/auth/logout/route.ts @@ -0,0 +1,20 @@ +import { NextResponse } from 'next/server' +import { clearSession, getSession } from '@/lib/auth' +import { prisma } from '@/lib/prisma' + +export async function POST() { + const session = await getSession() + if (session) { + await prisma.activityLog.create({ + data: { + userId: session.id, + action: 'User Logout', + details: 'Logged out of the system', + type: 'auth' + } + }) + } + + await clearSession() + return NextResponse.json({ success: true }) +} diff --git a/src/app/api/cron/email-recap-monthly/route.ts b/src/app/api/cron/email-recap-monthly/route.ts new file mode 100644 index 0000000..e397e51 --- /dev/null +++ b/src/app/api/cron/email-recap-monthly/route.ts @@ -0,0 +1,153 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' +import { sendEmailRecap } from '@/lib/email' + +export async function GET() { + try { + const settings = await prisma.systemSettings.findFirst() + if (!settings || !settings.isEmailEnabled) { + return NextResponse.json({ error: 'Email recap is disabled in settings' }, { status: 400 }) + } + + // Get date range for LAST MONTH + const now = new Date() + // First day of last month + const firstDay = new Date(now.getFullYear(), now.getMonth() - 1, 1) + // Last day of last month (0th day of current month) + const lastDay = new Date(now.getFullYear(), now.getMonth(), 0, 23, 59, 59, 999) + + const requests = await prisma.request.findMany({ + where: { + status: 'approved_2', + updatedAt: { + gte: firstDay, + lte: lastDay + } + }, + include: { + item: { include: { category: true } }, + user: true + }, + orderBy: { updatedAt: 'desc' } + }) + + if (requests.length === 0) { + return NextResponse.json({ message: 'No approved requests found for the last month.' }) + } + + // Breakdown stats + let totalItems = 0; + const typeBreakdown: Record = {}; + const itemBreakdown: Record = {}; + + for (const req of requests) { + totalItems += req.quantity; + + // Type breakdown + if (!typeBreakdown[req.type]) { + typeBreakdown[req.type] = { count: 0, qty: 0 }; + } + typeBreakdown[req.type].count += 1; + typeBreakdown[req.type].qty += req.quantity; + + // Item breakdown + if (!itemBreakdown[req.item.name]) { + itemBreakdown[req.item.name] = { qty: 0 }; + } + itemBreakdown[req.item.name].qty += req.quantity; + } + + const formatType = (t: string) => { + if (t === 'billed') return 'Manage Service' + if (t === 'return_billed') return 'Return Manage Service' + if (t === 'return_damaged_billed') return 'Return Damaged Manage Service' + if (t === 'outright_purchase') return 'Outright Purchase' + if (t === 'return_damaged_sold') return 'Return Damaged Sold' + return t.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase()) + } + + const formatMonth = firstDay.toLocaleString('id-ID', { month: 'long', year: 'numeric' }) + + // Build HTML Template + let html = ` +
+
+

Laporan Bulanan Inventory

+

Periode: ${formatMonth}

+
+ +
+

Halo,

+

Berikut adalah rekapitulasi pergerakan barang (yang disetujui) selama bulan ${formatMonth}.

+ +
+
+

Total Transaksi

+

${requests.length}

+
+
+

Total Barang Bergerak

+

${totalItems}

+
+
+ +

Rekap Berdasarkan Tipe

+ + + + + + + + + + ${Object.entries(typeBreakdown).map(([type, data]) => ` + + + + + + `).join('')} + +
Tipe TransaksiJumlah TransaksiTotal Barang
${formatType(type)}${data.count}${data.qty}
+ +

Top Barang Bergerak

+ + + + + + + + + ${Object.entries(itemBreakdown) + .sort((a, b) => b[1].qty - a[1].qty) + .slice(0, 10) // Top 10 items + .map(([name, data]) => ` + + + + + `).join('')} + +
Nama BarangTotal Keluar/Masuk
${name}${data.qty}
+ +

+ Email ini dibuat secara otomatis oleh Portal Inventory System. +

+
+
+ ` + + const success = await sendEmailRecap(html) + if (success) { + return NextResponse.json({ message: 'Monthly email recap sent successfully' }) + } else { + return NextResponse.json({ error: 'Failed to send email recap. Check settings and SMTP credentials.' }, { status: 500 }) + } + + } catch (error) { + console.error('Email cron error:', error) + return NextResponse.json({ error: 'Internal Server Error' }, { status: 500 }) + } +} diff --git a/src/app/api/cron/telegram-recap/route.ts b/src/app/api/cron/telegram-recap/route.ts new file mode 100644 index 0000000..032e9f1 --- /dev/null +++ b/src/app/api/cron/telegram-recap/route.ts @@ -0,0 +1,100 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' +import { sendTelegramMessage } from '@/lib/telegram' + +export async function GET(request: Request) { + const { searchParams } = new URL(request.url) + const secret = searchParams.get('secret') + + if (secret !== (process.env.CRON_SECRET || 'inv-secret-123')) { + return NextResponse.json({ error: 'Unauthorized. Invalid or missing secret.' }, { status: 401 }) + } + + // Calculate previous month date range + const now = new Date() + const firstDayPrevMonth = new Date(now.getFullYear(), now.getMonth() - 1, 1) + const lastDayPrevMonth = new Date(now.getFullYear(), now.getMonth(), 0, 23, 59, 59, 999) + + const totalRequests = await prisma.request.count({ + where: { + createdAt: { + gte: firstDayPrevMonth, + lte: lastDayPrevMonth + } + } + }) + + const approvedRequestsData = await prisma.request.findMany({ + where: { + status: 'approved_2', + createdAt: { + gte: firstDayPrevMonth, + lte: lastDayPrevMonth + } + } + }) + + const approvedRequests = approvedRequestsData.length; + + let inCount = 0; + let outCount = 0; + let inQty = 0; + let outQty = 0; + + const breakdown: Record = { + purchase: { count: 0, qty: 0 }, + return_borrow: { count: 0, qty: 0 }, + return_trial: { count: 0, qty: 0 }, + return_billed: { count: 0, qty: 0 }, + return_damaged_borrow: { count: 0, qty: 0 }, + return_damaged_trial: { count: 0, qty: 0 }, + return_damaged_billed: { count: 0, qty: 0 }, + return_damaged_sold: { count: 0, qty: 0 }, + borrow: { count: 0, qty: 0 }, + trial: { count: 0, qty: 0 }, + billed: { count: 0, qty: 0 }, + outright_purchase: { count: 0, qty: 0 } + } + + approvedRequestsData.forEach(req => { + if (!breakdown[req.type]) { + breakdown[req.type] = { count: 0, qty: 0 }; + } + breakdown[req.type].count += 1; + breakdown[req.type].qty += req.quantity; + + if (['purchase', 'return_borrow', 'return_trial', 'return_billed', 'return_damaged_borrow', 'return_damaged_trial', 'return_damaged_billed', 'return_damaged_sold'].includes(req.type)) { + inCount += 1; + inQty += req.quantity; + } else if (['borrow', 'trial', 'billed', 'outright_purchase'].includes(req.type)) { + outCount += 1; + outQty += req.quantity; + } + }) + + const monthName = firstDayPrevMonth.toLocaleString('id-ID', { month: 'long', year: 'numeric' }) + let message = `📊 Rekap Inventory Bulanan\nBulan: ${monthName}\n\nTotal Request: ${totalRequests}\nTotal Approved: ${approvedRequests}\n\n` + + message += `📥 BARANG MASUK & RETURN\n` + message += `Total: ${inCount} transaksi (${inQty} barang)\n` + message += `• Purchase: ${breakdown.purchase?.count || 0}\n` + message += `• Return Borrow: ${breakdown.return_borrow?.count || 0}\n` + message += `• Return Trial: ${breakdown.return_trial?.count || 0}\n` + message += `• Return Manage Service: ${breakdown.return_billed?.count || 0}\n` + message += `• Return Damaged (Broken): ${(breakdown.return_damaged_borrow?.count || 0) + (breakdown.return_damaged_trial?.count || 0) + (breakdown.return_damaged_billed?.count || 0) + (breakdown.return_damaged_sold?.count || 0)}\n\n` + + message += `📤 BARANG KELUAR\n` + message += `Total: ${outCount} transaksi (${outQty} barang)\n` + message += `• Borrow: ${breakdown.borrow?.count || 0}\n` + message += `• Trial: ${breakdown.trial?.count || 0}\n` + message += `• Manage Service: ${breakdown.billed?.count || 0}\n` + message += `• Outright Purchase: ${breakdown.outright_purchase?.count || 0}` + + const success = await sendTelegramMessage(message) + + if (!success) { + return NextResponse.json({ error: 'Failed to send Telegram message or telegram is not enabled in settings' }, { status: 500 }) + } + + return NextResponse.json({ success: true, message: 'Recap sent successfully', data: { totalRequests, approvedRequests } }) +} diff --git a/src/app/api/resync/route.ts b/src/app/api/resync/route.ts new file mode 100644 index 0000000..7aba009 --- /dev/null +++ b/src/app/api/resync/route.ts @@ -0,0 +1,85 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' +import { getSession } from '@/lib/auth' + +export async function GET() { + const session = await getSession() + if (!session || session.role !== 'super_admin') { + return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }) + } + + try { + const items = await prisma.item.findMany({ + include: { requests: { where: { status: 'approved_2' } } } + }) + + let updatedCount = 0; + + for (const item of items) { + let borrowedQty = 0; + let trialQty = 0; + let billedQty = 0; + let soldQty = 0; + let damagedQty = 0; + + for (const req of item.requests) { + const qty = req.quantity; + let type = req.type.toLowerCase(); + if (type === 'manage service') type = 'billed'; + if (type === 'outright purchase') type = 'outright_purchase'; + + if (type !== req.type) { + await prisma.request.update({ where: { id: req.id }, data: { type } }); + } + + // Borrowed + if (type === 'borrow') borrowedQty += qty; + if (type === 'return_borrow' || type === 'return_damaged_borrow') borrowedQty -= qty; + + // Trial + if (type === 'trial') trialQty += qty; + if (type === 'return_trial' || type === 'return_damaged_trial') trialQty -= qty; + + // Billed + if (type === 'billed') billedQty += qty; + if (type === 'return_billed' || type === 'return_damaged_billed') billedQty -= qty; + + // Sold + if (type === 'outright_purchase') soldQty += qty; + if (type === 'return_damaged_sold') soldQty -= qty; + + // Damaged + if (type === 'return_damaged_borrow' || type === 'return_damaged_trial' || type === 'return_damaged_billed' || type === 'return_damaged_sold') { + damagedQty += qty; + } + } + + // Ensure no negative values just in case of weird data + borrowedQty = Math.max(0, borrowedQty); + trialQty = Math.max(0, trialQty); + billedQty = Math.max(0, billedQty); + soldQty = Math.max(0, soldQty); + damagedQty = Math.max(0, damagedQty); + + const availableQty = Math.max(0, item.totalQuantity - borrowedQty - trialQty - billedQty - damagedQty - soldQty); + + await prisma.item.update({ + where: { id: item.id }, + data: { + borrowedQty, + trialQty, + billedQty, + soldQty, + damagedQty, + availableQty + } + }) + updatedCount++; + } + + return NextResponse.json({ success: true, message: `Resynced ${updatedCount} items based on approval history.` }) + } catch (error: any) { + console.error(error) + return NextResponse.json({ error: error.message }, { status: 500 }) + } +} diff --git a/src/app/api/seed/route.ts b/src/app/api/seed/route.ts new file mode 100644 index 0000000..68b65bf --- /dev/null +++ b/src/app/api/seed/route.ts @@ -0,0 +1,25 @@ +import { NextResponse } from 'next/server' +import { prisma } from '@/lib/prisma' + +export async function GET() { + try { + const existing = await prisma.user.findFirst() + if (existing) { + return NextResponse.json({ message: 'Database already has users.' }) + } + + await prisma.user.create({ + data: { + name: 'Super Admin', + username: 'superadmin', + email: 'admin@backone.id', + password: 'password', + role: 'super_admin' + } + }) + + return NextResponse.json({ message: 'Admin user created successfully! You can now login with admin@backone.id / password' }) + } catch (error: any) { + return NextResponse.json({ error: error.message }, { status: 500 }) + } +} diff --git a/src/app/approvals/page.tsx b/src/app/approvals/page.tsx new file mode 100644 index 0000000..975f0e8 --- /dev/null +++ b/src/app/approvals/page.tsx @@ -0,0 +1,549 @@ +import { prisma } from '@/lib/prisma' +import { getSession } from '@/lib/auth' +import { redirect } from 'next/navigation' +import { revalidatePath } from 'next/cache' +import { sendTelegramMessage } from '@/lib/telegram' +import ExportButton from '@/components/ExportButton' +import SelectAllCheckbox from '@/components/SelectAllCheckbox' + +const formatType = (t: string) => { + if (t === 'billed') return 'Manage Service' + if (t === 'return_billed') return 'Return Manage Service' + if (t === 'return_damaged_billed') return 'Return Damaged Manage Service' + if (t === 'outright_purchase') return 'Outright Purchase' + if (t === 'return_damaged_sold') return 'Return Damaged Sold' + return t.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase()) +} + +export default async function ApprovalsPage({ searchParams }: { searchParams: Promise<{ historyGroup?: string, limit?: string, searchQuery?: string, typeFilter?: string }> }) { + const { historyGroup, limit, searchQuery, typeFilter } = await searchParams + const session = await getSession() + if (!session || (session.role !== 'approver' && session.role !== 'super_admin')) { + redirect('/') + } + + const approver = await prisma.user.findUnique({ where: { id: session.id }, include: { categories: true } }) + + let categoryFilter = {}; + if (session.role !== 'super_admin') { + const allowedCategoryIds = approver?.categories.map(c => c.id) || []; + categoryFilter = { item: { categoryId: { in: allowedCategoryIds } } }; + } + + // Get all requests + let allRequests = await prisma.request.findMany({ + where: categoryFilter, + include: { + user: true, + item: { include: { category: true } }, + approvalLogs: { include: { approver: true } } + }, + orderBy: { createdAt: 'desc' } + }) + + if (typeFilter) { + if (typeFilter === 'damaged') { + allRequests = allRequests.filter(r => r.type.includes('damaged')) + } else { + allRequests = allRequests.filter(r => r.type === typeFilter) + } + } + + const pendingRequests = allRequests.filter(r => r.status === 'pending' || r.status === 'approved_1') + let historyRequests = allRequests.filter(r => r.status === 'approved_2' || r.status === 'rejected') + + if (historyGroup && historyGroup !== 'all') { + historyRequests = historyRequests.filter(r => r.item.categoryId === parseInt(historyGroup)) + } + + if (searchQuery) { + const q = searchQuery.toLowerCase() + historyRequests = historyRequests.filter(r => + r.company.toLowerCase().includes(q) || + r.address.toLowerCase().includes(q) || + (r.serialNumber && r.serialNumber.toLowerCase().includes(q)) + ) + } + + let historyLimit = limit ? parseInt(limit) : 50; + if (isNaN(historyLimit)) historyLimit = 50; + historyRequests = historyRequests.slice(0, historyLimit) + + // Prepare export data + const exportHeaders = [ + { label: 'Date', key: 'date' }, + { label: 'Requester', key: 'requester' }, + { label: 'Item', key: 'item' }, + { label: 'Category', key: 'category' }, + { label: 'Type', key: 'type' }, + { label: 'Quantity', key: 'quantity' }, + { label: 'Company', key: 'company' }, + { label: 'Address', key: 'address' }, + { label: 'Project', key: 'purpose' }, + { label: 'Final Status', key: 'status' }, + { label: 'Serial Number', key: 'serialNumber' }, + { label: 'Approvers', key: 'approvers' }, + { label: 'Notes', key: 'notes' } + ] + + const mappedHistory = historyRequests.map(r => ({ + date: new Date(r.createdAt).toLocaleString('id-ID', { timeZone: 'Asia/Jakarta' }), + requester: r.user.name, + item: r.item.name, + category: r.item.category?.name || '-', + type: formatType(r.type), + quantity: r.quantity.toString(), + company: r.company, + address: r.address, + purpose: r.purpose, + status: r.status, + notes: r.notes || '-', + serialNumber: r.serialNumber || '-', + approvers: r.approvalLogs.map((l: any) => l.approver.name).join(', ') + })) + + async function processApproval(requestId: number, action: string, formData: FormData, skipTelegram: boolean = false) { + 'use server' + const snRaw = formData.get(`sn_${requestId}`) as string | null + const serialNumber = snRaw ? snRaw.trim() : null + const currentSession = await getSession() + if (!currentSession || currentSession.role === 'user') return + + const req = await prisma.request.findUnique({ + where: { id: requestId }, + include: { approvalLogs: true, item: true, user: true } + }) + if (!req) return + + // Cannot approve own request (unless super admin override) + if (req.userId === currentSession.id && currentSession.role !== 'super_admin') return + + if (action === 'reject') { + await prisma.request.update({ + where: { id: requestId }, + data: { status: 'rejected' } + }) + await prisma.approvalLog.create({ + data: { requestId, approverId: currentSession.id, approvalStep: req.status === 'pending' ? 1 : 2, status: 'rejected' } + }) + await prisma.activityLog.create({ + data: { + userId: currentSession.id, + action: 'Reject Request', + details: `Rejected request for ${req.quantity}x ${req.item.name} from ${req.user.name}`, + type: 'approval' + } + }) + + if (!skipTelegram) { + await sendTelegramMessage(`❌ Request Rejected\n\nItem: ${req.quantity}x ${req.item.name}\nUser: ${req.user.name}\nCompany: ${req.company}\nProject: ${req.purpose}\nRejected By: ${currentSession.name}`) + } + } else if (action === 'approve') { + let reqType = req.type; + const newTypeRaw = formData.get(`type_${requestId}`) as string | null + if (newTypeRaw && newTypeRaw !== req.type) { + reqType = newTypeRaw + await prisma.request.update({ + where: { id: requestId }, + data: { type: reqType } + }) + await prisma.activityLog.create({ + data: { + userId: currentSession.id, + action: 'Edit Request', + details: `Changed request type from ${formatType(req.type)} to ${formatType(reqType)} for ${req.item.name}`, + type: 'approval' + } + }) + } + + const isOneStep = ['purchase', 'return_borrow', 'return_trial', 'return_billed', 'return_damaged_borrow', 'return_damaged_trial', 'return_damaged_billed', 'return_damaged_sold'].includes(reqType) + + if (req.status === 'pending') { + if (isOneStep) { + // Finalize immediately (1-step approval) + await prisma.request.update({ + where: { id: requestId }, + data: { + status: 'approved_2', + ...(serialNumber && { serialNumber }) + } + }) + await prisma.approvalLog.create({ + data: { requestId, approverId: currentSession.id, approvalStep: 1, status: 'approved' } + }) + + // Update item quantities + const updateData: any = {} + if (reqType === 'purchase') { + updateData.totalQuantity = req.item.totalQuantity + req.quantity + updateData.availableQty = req.item.availableQty + req.quantity + } else if (reqType === 'return_borrow') { + updateData.availableQty = req.item.availableQty + req.quantity + updateData.borrowedQty = req.item.borrowedQty - req.quantity + } else if (reqType === 'return_trial') { + updateData.availableQty = req.item.availableQty + req.quantity + updateData.trialQty = req.item.trialQty - req.quantity + } else if (reqType === 'return_billed') { + updateData.availableQty = req.item.availableQty + req.quantity + updateData.billedQty = req.item.billedQty - req.quantity + } else if (reqType === 'return_damaged_borrow') { + updateData.damagedQty = req.item.damagedQty + req.quantity + updateData.borrowedQty = req.item.borrowedQty - req.quantity + } else if (reqType === 'return_damaged_trial') { + updateData.damagedQty = req.item.damagedQty + req.quantity + updateData.trialQty = req.item.trialQty - req.quantity + } else if (reqType === 'return_damaged_billed') { + updateData.damagedQty = req.item.damagedQty + req.quantity + updateData.billedQty = req.item.billedQty - req.quantity + } else if (reqType === 'return_damaged_sold') { + updateData.damagedQty = req.item.damagedQty + req.quantity + updateData.soldQty = req.item.soldQty - req.quantity + } + await prisma.item.update({ where: { id: req.itemId }, data: updateData }) + + await prisma.activityLog.create({ + data: { + userId: currentSession.id, + action: 'Approve Request (Final)', + details: `Approved (1-step) request for ${req.quantity}x ${req.item.name} from ${req.user.name}`, + type: 'approval' + } + }) + + await sendTelegramMessage(`🎉 Request Fully Approved (1-Step)\n\nItem: ${req.quantity}x ${req.item.name}\nUser: ${req.user.name}\nCompany: ${req.company}\nProject: ${req.purpose}\nApprover: ${currentSession.name}\nStatus: Finalized.`) + } else { + // Step 1 of 2-step + await prisma.request.update({ + where: { id: requestId }, + data: { + status: 'approved_1', + ...(serialNumber && { serialNumber }) + } + }) + await prisma.approvalLog.create({ + data: { requestId, approverId: currentSession.id, approvalStep: 1, status: 'approved' } + }) + await prisma.activityLog.create({ + data: { + userId: currentSession.id, + action: 'Approve Request (Step 1)', + details: `Provided 1st approval for ${req.quantity}x ${req.item.name} from ${req.user.name}`, + type: 'approval' + } + }) + + if (!skipTelegram) { + await sendTelegramMessage(`✅ Request Partially Approved (Step 1)\n\nItem: ${req.quantity}x ${req.item.name}\nUser: ${req.user.name}\nCompany: ${req.company}\nProject: ${req.purpose}\nApprover 1: ${currentSession.name}\n\nAwaiting final approval.`) + } + } + } else if (req.status === 'approved_1' && !isOneStep) { + // Step 2 (make sure not same user, unless super admin overriding) + const firstApproval = req.approvalLogs.find(log => log.approvalStep === 1) + if (firstApproval && firstApproval.approverId === currentSession.id && currentSession.role !== 'super_admin') { + // Cannot approve twice + return + } + + // Finalize approval + await prisma.request.update({ + where: { id: requestId }, + data: { + status: 'approved_2', + ...(serialNumber && { serialNumber }) + } + }) + await prisma.approvalLog.create({ + data: { requestId, approverId: currentSession.id, approvalStep: 2, status: 'approved' } + }) + + // Update item quantities + const updateData: any = { availableQty: req.item.availableQty - req.quantity } + if (reqType === 'borrow') updateData.borrowedQty = req.item.borrowedQty + req.quantity + else if (reqType === 'trial') updateData.trialQty = req.item.trialQty + req.quantity + else if (reqType === 'billed') updateData.billedQty = req.item.billedQty + req.quantity + else if (reqType === 'outright_purchase') updateData.soldQty = req.item.soldQty + req.quantity + + await prisma.item.update({ + where: { id: req.itemId }, + data: updateData + }) + + await prisma.activityLog.create({ + data: { + userId: currentSession.id, + action: 'Approve Request (Final)', + details: `Provided 2nd approval for ${req.quantity}x ${req.item.name} from ${req.user.name}`, + type: 'approval' + } + }) + + if (!skipTelegram) { + await sendTelegramMessage(`✅ Request Fully Approved (Step 2)\n\nItem: ${req.quantity}x ${req.item.name}\nUser: ${req.user.name}\nCompany: ${req.company}\nProject: ${req.purpose}\nApprover 2: ${currentSession.name}`) + } + } + } + if (!skipTelegram) { + revalidatePath('/approvals') + revalidatePath('/') + } + } + + async function bulkApprove(formData: FormData) { + 'use server' + const requestIds = formData.getAll('requestIds') as string[] + if (!requestIds || requestIds.length === 0) return + + let count = 0; + for (const reqId of requestIds) { + await processApproval(parseInt(reqId), 'approve', formData, true) + count++; + } + + if (count > 0) { + const currentSession = await getSession() + const adminName = currentSession?.name || 'Admin' + sendTelegramMessage(`✅ Bulk Approved\n\n${count} requests were approved simultaneously by ${adminName}.`).catch(console.error) + revalidatePath('/approvals') + revalidatePath('/') + } + } + + async function bulkReject(formData: FormData) { + 'use server' + const requestIds = formData.getAll('requestIds') as string[] + if (!requestIds || requestIds.length === 0) return + + let count = 0; + for (const reqId of requestIds) { + await processApproval(parseInt(reqId), 'reject', formData, true) + count++; + } + + if (count > 0) { + const currentSession = await getSession() + const adminName = currentSession?.name || 'Admin' + sendTelegramMessage(`❌ Bulk Rejected\n\n${count} requests were rejected simultaneously by ${adminName}.`).catch(console.error) + revalidatePath('/approvals') + revalidatePath('/') + } + } + + return ( +
+

Pending Approvals

+ +
+
+
+ + +
+
+ + + + + + + + + + + + + + + {pendingRequests.map((req, index) => { + const isOneStep = ['purchase', 'return_borrow', 'return_trial', 'return_billed'].includes(req.type) + const isStep2 = req.status === 'approved_1' + const firstApproverId = req.approvalLogs.find(l => l.approvalStep === 1)?.approverId + const isOwnRequest = req.userId === session.id + const canApprove = session.role === 'approver' && !isOwnRequest && (!isStep2 || firstApproverId !== session.id) + + return ( + + + + + + + + + + + ) + })} + {pendingRequests.length === 0 && ( + + + + )} + +
+ + No.RequesterItemCategoryDetailsStatusAction
+ + + {index + 1} + + {req.user.name}
+ {req.user.email} +
+ {req.item.name}
+ Type: {formatType(req.type)} | Qty: {req.quantity} +
+ {req.item.category?.name || '-'} + + + {isOneStep ? 'From:' : 'To:'} {req.company}
+ Address: {req.address}
+ Project: {req.purpose} + {req.notes && <>
Notes: {req.notes}} +
+
+ + {isOneStep ? 'Needs Approval (1-step)' : req.status === 'pending' ? 'Needs 1st Approval' : 'Needs 2nd Approval'} + + + {canApprove ? ( +
+ + +
+ + +
+
+ ) : ( + + {isOwnRequest ? 'Cannot approve own request' : 'Awaiting another approver'} + + )} +
+ No pending requests at the moment. +
+
+
+
+ +
+

Approval History

+
+
+ + + + +
+ +
+
+ +
+
+ + + + + + + + + + + + + {historyRequests.map((req, index) => { + const approvers = req.approvalLogs.map(log => log.approver.name).join(', ') + const isOneStep = ['purchase', 'return_borrow', 'return_trial', 'return_billed'].includes(req.type) + return ( + + + + + + + + + ) + })} + {historyRequests.length === 0 && ( + + + + )} + +
No.RequesterItemCategoryDetailsFinal Status
+ {index + 1} + + {req.user.name}
+ {req.user.email}
+ {new Date(req.createdAt).toLocaleString('id-ID', { timeZone: 'Asia/Jakarta' })} +
+ {req.item.name}
+ Type: {formatType(req.type)} | Qty: {req.quantity} +
+ {req.item.category?.name || '-'} + + + {isOneStep ? 'From:' : 'To:'} {req.company}
+ Address: {req.address}
+ Project: {req.purpose} + {req.notes && <>
Notes: {req.notes}} + {req.serialNumber && <>
SN: {req.serialNumber}} +
+
+ + {req.status === 'rejected' ? 'Rejected' : 'Approved (Final)'} + + {approvers && ( +
+ by: {approvers} +
+ )} +
+ No history found. +
+
+
+
+ ) +} diff --git a/src/app/login/page.module.css b/src/app/login/page.module.css new file mode 100644 index 0000000..f5076bb --- /dev/null +++ b/src/app/login/page.module.css @@ -0,0 +1,35 @@ +.container { + display: flex; + align-items: center; + justify-content: center; + min-height: 100vh; + padding: 1rem; +} + +.loginCard { + width: 100%; + max-width: 400px; + padding: 2.5rem 2rem; + text-align: center; +} + +.form { + display: flex; + flex-direction: column; + gap: 1.25rem; + margin-top: 2rem; + text-align: left; +} + +.error { + color: var(--danger); + font-size: 0.875rem; + text-align: center; + margin-top: 1rem; +} + +.submitBtn { + margin-top: 1rem; + width: 100%; + padding: 12px; +} diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx new file mode 100644 index 0000000..ab3cb84 --- /dev/null +++ b/src/app/login/page.tsx @@ -0,0 +1,83 @@ +'use client' + +import { useState } from 'react' +import { useRouter } from 'next/navigation' +import styles from './page.module.css' + +export default function LoginPage() { + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [error, setError] = useState('') + const [loading, setLoading] = useState(false) + const router = useRouter() + + const handleLogin = async (e: React.FormEvent) => { + e.preventDefault() + setLoading(true) + setError('') + + try { + const res = await fetch('/api/auth/login', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ email, password }) + }) + + if (res.ok) { + router.push('/') + router.refresh() + } else { + const data = await res.json() + setError(data.error || 'Failed to login') + } + } catch (err) { + setError('An error occurred. Please try again.') + } finally { + setLoading(false) + } + } + + return ( +
+
+

Portal Inventory

+

Sign in to manage requests and assets

+ +
+
+ + setEmail(e.target.value)} + required + /> +
+
+ + setPassword(e.target.value)} + required + /> +
+ + +
+ + {error &&
{error}
} +
+
+ ) +} diff --git a/src/app/logs/page.tsx b/src/app/logs/page.tsx new file mode 100644 index 0000000..53b85ea --- /dev/null +++ b/src/app/logs/page.tsx @@ -0,0 +1,158 @@ +import { prisma } from '@/lib/prisma' +import { getSession } from '@/lib/auth' +import { redirect } from 'next/navigation' +import ExportButton from '@/components/ExportButton' + +export default async function LogsPage(props: { searchParams: Promise<{ q?: string, date?: string }> }) { + const searchParams = await props.searchParams; + const session = await getSession() + if (!session || session.role === 'viewer') { + redirect('/') + } + + // Build filter conditions based on role + let whereClause = {} + + if (session.role === 'super_admin') { + // Super admin sees all logs + whereClause = {} + } else if (session.role === 'approver') { + // Approvers see their own actions, plus all approval and request actions from everyone? + // "tapi user sesuai kelompok, approvals atau user request" + // Let's make approvers see all 'approval', 'request', and 'admin_item' logs. + whereClause = { + type: { in: ['approval', 'request', 'admin_item'] } + } + } else { + // Regular users see only their own requests + whereClause = { + userId: session.id, + type: 'request' + } + } + + // Apply search filters + let filters: any[] = [whereClause] + + if (searchParams.q) { + const q = searchParams.q.toLowerCase() + filters.push({ + OR: [ + { details: { contains: q } }, + { action: { contains: q } }, + { user: { name: { contains: q } } } + ] + }) + } + + if (searchParams.date) { + // Force to Asia/Jakarta (+07:00) bounds + const startOfDay = new Date(`${searchParams.date}T00:00:00+07:00`) + const endOfDay = new Date(`${searchParams.date}T23:59:59.999+07:00`) + filters.push({ + createdAt: { + gte: startOfDay, + lte: endOfDay + } + }) + } + + const logs = await prisma.activityLog.findMany({ + where: { AND: filters }, + take: 50, + include: { user: true }, + orderBy: { createdAt: 'desc' } + }) + + return ( +
+
+

Activity Logs

+

Showing the latest 50 logs matching your criteria.

+
+ +
+
+
+ + +
+
+ + +
+
+ + {(searchParams.q || searchParams.date) && ( + Clear + )} +
+
+
+ +
+
+ + + + + + + + + + + {logs.map((log: any) => ( + + + + + + + ))} + {logs.length === 0 && ( + + + + )} + +
Date & TimeUserActionDetails
+ {new Date(log.createdAt).toLocaleString()} + + {log.user.name}
+ {log.user.role} +
+ + {log.action} + + + {log.details} +
+ No activity logs found. +
+
+
+
+ ) +} diff --git a/src/app/profile/page.tsx b/src/app/profile/page.tsx new file mode 100644 index 0000000..e92f7f5 --- /dev/null +++ b/src/app/profile/page.tsx @@ -0,0 +1,135 @@ +import { prisma } from '@/lib/prisma' +import { getSession } from '@/lib/auth' +import { redirect } from 'next/navigation' +import { revalidatePath } from 'next/cache' + +export default async function ProfilePage({ searchParams }: { searchParams: Promise<{ success?: string, error?: string, err_email?: string, err_username?: string, err_password?: string, email?: string, username?: string }> }) { + const { success, error, err_email, err_username, err_password, email: spEmail, username: spUsername } = await searchParams + const session = await getSession() + if (!session) { + redirect('/login') + } + + const user = await prisma.user.findUnique({ where: { id: session.id } }) + if (!user) redirect('/login') + + async function updateProfile(formData: FormData) { + 'use server' + const email = formData.get('email') as string + const username = formData.get('username') as string + const password = formData.get('password') as string + + const qs = `&email=${encodeURIComponent(email)}&username=${encodeURIComponent(username)}` + + let hasError = false; + let errEmail = '', errUsername = '', errPassword = ''; + + if (email) { + if (email !== user!.email) { + const checkEmail = await prisma.user.findUnique({ where: { email } }) + if (checkEmail) { + errEmail = 'Email already exists'; + hasError = true; + } + } + } else { + errEmail = 'Email is required'; + hasError = true; + } + + if (username) { + if (username !== user!.username) { + const checkUsername = await prisma.user.findUnique({ where: { username } }) + if (checkUsername) { + errUsername = 'Username already taken'; + hasError = true; + } + } + } else { + errUsername = 'Username is required'; + hasError = true; + } + + if (password) { + if (password.length < 8 || !/[A-Z]/.test(password) || !/[^a-zA-Z0-9]/.test(password)) { + errPassword = 'Password must be at least 8 chars, contain an uppercase letter and a special character'; + hasError = true; + } + } + + if (hasError) { + redirect(`/profile?err_email=${encodeURIComponent(errEmail)}&err_username=${encodeURIComponent(errUsername)}&err_password=${encodeURIComponent(errPassword)}${qs}`) + } + + const updateData: any = { email } + if (username) updateData.username = username + if (password) updateData.password = password + + await prisma.user.update({ + where: { id: session!.id }, + data: updateData + }) + + // Log activity + await prisma.activityLog.create({ + data: { + userId: session!.id, + action: 'Update Profile', + details: 'User updated their own profile credentials', + type: 'auth' + } + }) + + redirect('/profile?success=Profile+updated+successfully') + } + + return ( +
+
+

My Profile

+ + {error && ( +
+ ❌ {error} +
+ )} + + {success && ( +
+ ✅ {success} +
+ )} + +
+
+ + +
+
+ + +
+
+
+ + + {err_username &&
{err_username}
} +
+
+ + + {err_email &&
{err_email}
} +
+
+ + + {err_password &&
{err_password}
} +
+ +
+
+
+ ) +} diff --git a/src/app/request/page.tsx b/src/app/request/page.tsx new file mode 100644 index 0000000..519181f --- /dev/null +++ b/src/app/request/page.tsx @@ -0,0 +1,517 @@ +import { prisma } from '@/lib/prisma' +import { getSession } from '@/lib/auth' +import { redirect } from 'next/navigation' +import { revalidatePath } from 'next/cache' +import ExportButton from '@/components/ExportButton' +import { sendTelegramMessage } from '@/lib/telegram' +import CategorySelectListener from '@/components/CategorySelectListener' + +const formatType = (t: string) => { + if (t === 'billed') return 'Manage Service' + if (t === 'return_billed') return 'Return Manage Service' + if (t === 'return_damaged_billed') return 'Return Damaged Manage Service' + if (t === 'outright_purchase') return 'Outright Purchase' + if (t === 'return_damaged_sold') return 'Return Damaged Sold' + return t.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase()) +} + +export default async function RequestPage({ searchParams }: { searchParams: Promise<{ error?: string, historyGroup?: string, limit?: string, searchQuery?: string }> }) { + const { error, historyGroup, limit, searchQuery } = await searchParams + const session = await getSession() + if (!session || session.role === 'viewer') { + redirect('/') + } + + const user = await prisma.user.findUnique({ where: { id: session.id }, include: { categories: true } }) + const allowedCategories = session.role === 'super_admin' ? await prisma.category.findMany() : (user?.categories || []) + const allowedCategoryIds = allowedCategories.map(c => c.id) + + let items; + if (session.role === 'super_admin') { + items = await prisma.item.findMany({ include: { category: true } }) + } else { + items = await prisma.item.findMany({ + where: { categoryId: { in: allowedCategoryIds } }, + include: { category: true } + }) + } + + let userRequests = await prisma.request.findMany({ + where: { userId: session.id }, + include: { item: { include: { category: true } }, approvalLogs: { include: { approver: true } } }, + orderBy: { createdAt: 'desc' } + }) + + if (historyGroup && historyGroup !== 'all') { + userRequests = userRequests.filter(r => r.item.categoryId === parseInt(historyGroup)) + } + + if (searchQuery) { + const q = searchQuery.toLowerCase() + userRequests = userRequests.filter(r => + r.company.toLowerCase().includes(q) || + r.address.toLowerCase().includes(q) || + (r.serialNumber && r.serialNumber.toLowerCase().includes(q)) + ) + } + + let historyLimit = limit ? parseInt(limit) : 50; + if (isNaN(historyLimit)) historyLimit = 50; + userRequests = userRequests.slice(0, historyLimit) + + // Prepare export data + const exportHeaders = [ + { label: 'Date', key: 'date' }, + { label: 'Item', key: 'item' }, + { label: 'Category', key: 'category' }, + { label: 'Type', key: 'type' }, + { label: 'Quantity', key: 'quantity' }, + { label: 'Company', key: 'company' }, + { label: 'Address', key: 'address' }, + { label: 'Project', key: 'purpose' }, + { label: 'Status', key: 'status' }, + { label: 'Approvers', key: 'approvers' }, + { label: 'Serial Number', key: 'serialNumber' }, + { label: 'Notes', key: 'notes' } + ] + + const mappedRequests = userRequests.map(r => ({ + date: new Date(r.createdAt).toLocaleString('id-ID', { timeZone: 'Asia/Jakarta' }), + item: r.item.name, + category: r.item.category?.name || '-', + type: formatType(r.type), + quantity: r.quantity.toString(), + company: r.company, + address: r.address, + purpose: r.purpose, + status: r.status, + approvers: r.approvalLogs.map((l: any) => l.approver.name).join(', '), + serialNumber: r.serialNumber || '-', + notes: r.notes || '-' + })) + + async function submitRequest(formData: FormData) { + 'use server' + const itemIdStr = formData.get('itemId') as string + const newItemName = formData.get('newItemName') as string + const quantity = parseInt(formData.get('quantity') as string) + const type = formData.get('type') as string + const purpose = formData.get('purpose') as string + const company = formData.get('company') as string + const address = formData.get('address') as string + const categoryIdStr = formData.get('categoryId') as string + const notes = formData.get('notes') as string | null + + if (!itemIdStr || !quantity || !purpose || !company || !address || !type) return + + let item; + + if (itemIdStr === 'new') { + if (!newItemName) return // Error: Must provide name + const categoryId = categoryIdStr ? parseInt(categoryIdStr) : null + if (!categoryId) return // Error: Must select category + + // Case-insensitive search to prevent duplicates like "laptop" and "Laptop" + const allItems = await prisma.item.findMany() + const existingItem = allItems.find(i => i.name.toLowerCase() === newItemName.toLowerCase()) + + if (existingItem) { + item = existingItem + } else { + item = await prisma.item.create({ + data: { + name: newItemName, + categoryId, + availableQty: 0, + borrowedQty: 0, + trialQty: 0, + billedQty: 0 + } + }) + } + } else { + const itemId = parseInt(itemIdStr) + item = await prisma.item.findUnique({ where: { id: itemId } }) + } + + if (!item) return + + // Validation + if (['borrow', 'trial', 'billed', 'outright_purchase'].includes(type) && quantity > item.availableQty) { + // Cannot request more than available + redirect(`/request?error=Cannot+request+more+than+available+stock+(${item.availableQty})`) + } + if ((type === 'return_borrow' || type === 'return_damaged_borrow') && quantity > item.borrowedQty) return + if ((type === 'return_trial' || type === 'return_damaged_trial') && quantity > item.trialQty) return + if ((type === 'return_billed' || type === 'return_damaged_billed') && quantity > item.billedQty) return + if (type === 'return_damaged_sold' && quantity > item.soldQty) return + + const newReq = await prisma.request.create({ + data: { + userId: session!.id, + itemId: item.id, + quantity, + type, + purpose, + company, + address, + notes: notes || null, + status: 'pending' + } + }) + + const user = await prisma.user.findUnique({ where: { id: session!.id } }) + + // Log Activity + await prisma.activityLog.create({ + data: { + userId: session!.id, + action: 'Create Request', + details: `Requested ${quantity}x ${item.name} (${type.replace(/_/g, ' ')})`, + type: 'request' + } + }) + + // Send Telegram Notification + const typeStr = type.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase()) + const msg = `📢 New Request Submitted\n\nUser: ${user?.name || session?.name}\nItem: ${item.name}\nQty: ${quantity}\nType: ${typeStr}\nCompany: ${company}\nAddress: ${address}\nProject: ${purpose}\n\nPlease check the portal to approve or reject.` + await sendTelegramMessage(msg) + + revalidatePath('/request') + } + + async function bulkSubmitRequest(formData: FormData) { + 'use server' + const file = formData.get('csvFile') as File + if (!file || file.size === 0) return + + const text = await file.text() + const lines = text.split('\n').map(l => l.trim()).filter(l => l.length > 0) + if (lines.length < 2) return // No data rows + + const allItems = await prisma.item.findMany() + const sessionData = await getSession() + if (!sessionData) return + const user = await prisma.user.findUnique({ where: { id: sessionData.id } }) + + let successCount = 0 + // Skip header line + for (let i = 1; i < lines.length; i++) { + // Very simple CSV split handling (assumes no commas/semicolons inside quotes for now) + const cols = lines[i].includes(';') ? lines[i].split(';') : lines[i].split(',') + if (cols.length < 6) continue + + const itemName = cols[0].trim() + const quantity = parseInt(cols[1].trim()) + let type = cols[2].trim().toLowerCase() + if (type === 'manage service') type = 'billed'; + if (type === 'outright purchase') type = 'outright_purchase'; + + const purpose = cols[3].trim() + const company = cols[4].trim() + const address = cols[5].trim() + const serialNumber = cols[6] ? cols[6].trim() : null + const notes = cols[7] ? cols[7].trim() : null + + if (isNaN(quantity) || quantity <= 0) { + redirect(`/request?error=Invalid quantity at row ${i + 1}`) + } + + const item = allItems.find(it => it.name.toLowerCase() === itemName.toLowerCase()) + if (!item) { + redirect(`/request?error=Item "${itemName}" not found at row ${i + 1}`) + } + + const validTypes = ['borrow', 'trial', 'billed', 'outright_purchase', 'return_borrow', 'return_trial', 'return_billed', 'return_damaged_borrow', 'return_damaged_trial', 'return_damaged_billed', 'return_damaged_sold', 'purchase'] + if (!validTypes.includes(type)) { + redirect(`/request?error=Invalid type "${type}" at row ${i + 1}`) + } + + // Validation + if (['borrow', 'trial', 'billed', 'outright_purchase'].includes(type) && quantity > item.availableQty) { + redirect(`/request?error=Not enough available quantity for ${itemName} at row ${i + 1}`) + } + if ((type === 'return_borrow' || type === 'return_damaged_borrow') && quantity > item.borrowedQty) { + redirect(`/request?error=Not enough borrowed quantity for ${itemName} at row ${i + 1}`) + } + if ((type === 'return_trial' || type === 'return_damaged_trial') && quantity > item.trialQty) { + redirect(`/request?error=Not enough trial quantity for ${itemName} at row ${i + 1}`) + } + if ((type === 'return_billed' || type === 'return_damaged_billed') && quantity > item.billedQty) { + redirect(`/request?error=Not enough manage service quantity for ${itemName} at row ${i + 1}`) + } + if (type === 'return_damaged_sold' && quantity > item.soldQty) { + redirect(`/request?error=Not enough sold quantity for ${itemName} at row ${i + 1}`) + } + + await prisma.request.create({ + data: { + userId: sessionData.id, + itemId: item.id, + quantity, + type, + purpose, + company, + address, + notes, + serialNumber, + status: 'pending' + } + }) + successCount++ + } + + if (successCount > 0) { + await prisma.activityLog.create({ + data: { + userId: sessionData.id, + action: 'Bulk Create Request', + details: `Created ${successCount} requests via CSV upload`, + type: 'request' + } + }) + await sendTelegramMessage(`📢 Bulk Request Submitted\n\nUser: ${user?.name || sessionData.name}\nTotal Requests: ${successCount}\n\nPlease check the portal to approve or reject.`) + } + + revalidatePath('/request') + } + + return ( +
+

Item Requests

+ + {error && ( +
+ ❌ {error} +
+ )} + +
+
+
+

New Request

+
+ +
+ + + +
+
+ + +
+
+ + + + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ +
+

Bulk Upload Requests

+
+
+

+ Download the CSV template, fill it out in Excel, Save As CSV, and upload it here. +

+ + ⬇️ Download Template CSV + +
+
+ + +
+ +
+
+
+ +
+
+

Your Request History

+
+
+ + + + +
+ +
+
+
+ + + + + + + + + + + + + + {userRequests.map((req, index) => { + const approvers = req.approvalLogs.map(log => log.approver.name).join(', ') + const isReturn = req.type.includes('return') || req.type === 'purchase' + return ( + + + + + + + + + + ) + })} + {userRequests.length === 0 && ( + + + + )} + +
No.DateItemCategoryType/QtyDetailsStatus
+ {index + 1} + + {new Date(req.createdAt).toLocaleString('id-ID', { timeZone: 'Asia/Jakarta' })} + + {req.item.name} + + {req.item.category?.name || '-'} + + {formatType(req.type)} x{req.quantity} + + + {isReturn ? 'From:' : 'To:'} {req.company}
+ Address: {req.address}
+ Project: {req.purpose} +
+
+ + {req.status === 'approved_1' ? '1st Approval' : req.status === 'approved_2' ? 'Approved' : req.status} + + {approvers && ( +
+ by: {approvers} +
+ )} +
+ No requests found. +
+
+
+
+
+ ) +} diff --git a/src/components/AutoRefresh.tsx b/src/components/AutoRefresh.tsx new file mode 100644 index 0000000..f03c873 --- /dev/null +++ b/src/components/AutoRefresh.tsx @@ -0,0 +1,68 @@ +'use client' + +import { useEffect, useState, useRef } from 'react' +import { useRouter } from 'next/navigation' + +export default function AutoRefresh({ interval = 5000, pendingCount }: { interval?: number, pendingCount?: number }) { + const router = useRouter() + const prevCount = useRef(pendingCount) + const [showToast, setShowToast] = useState(false) + + useEffect(() => { + const timer = setInterval(() => { + router.refresh() + }, interval) + + return () => clearInterval(timer) + }, [router, interval]) + + useEffect(() => { + // If pendingCount increases, show a notification + if (pendingCount !== undefined && prevCount.current !== undefined && pendingCount > prevCount.current) { + // Play a simple beep sound if possible + try { + const audio = new Audio('data:audio/wav;base64,UklGRl9vT19XQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YU') // dummy or valid small beep, let's just use visual toast + } catch (e) {} + + setShowToast(true) + setTimeout(() => setShowToast(false), 5000) + } + prevCount.current = pendingCount + }, [pendingCount]) + + if (!showToast) return null + + return ( +
+
+ New Request Needs Approval! + + +
+ ) +} diff --git a/src/components/CategorySelectListener.tsx b/src/components/CategorySelectListener.tsx new file mode 100644 index 0000000..6214a13 --- /dev/null +++ b/src/components/CategorySelectListener.tsx @@ -0,0 +1,18 @@ +'use client' +import { useEffect } from 'react' + +export default function CategorySelectListener() { + useEffect(() => { + const catFilter = document.getElementById('categoryFilter') as HTMLSelectElement | null + const itemSelect = document.getElementById('itemSelect') as HTMLSelectElement | null + + if (catFilter && itemSelect) { + const listener = () => { + itemSelect.value = '' + } + catFilter.addEventListener('change', listener) + return () => catFilter.removeEventListener('change', listener) + } + }, []) + return null +} diff --git a/src/components/ExportButton.tsx b/src/components/ExportButton.tsx new file mode 100644 index 0000000..6b6481d --- /dev/null +++ b/src/components/ExportButton.tsx @@ -0,0 +1,53 @@ +'use client' + +import React from 'react' + +interface ExportButtonProps { + data: Record[] + filename: string + headers: { label: string, key: string }[] + text?: string +} + +export default function ExportButton({ data, filename, headers, text = 'Export to CSV' }: ExportButtonProps) { + const handleExport = () => { + // Generate CSV content + const csvRows = [] + + // Header row + csvRows.push(headers.map(h => `"${h.label}"`).join(';')) + + // Data rows + for (const row of data) { + const values = headers.map(h => { + const value = row[h.key] ?? '' + // Escape quotes + const stringValue = String(value).replace(/"/g, '""') + return `"${stringValue}"` + }) + csvRows.push(values.join(';')) + } + + const csvString = csvRows.join('\n') + const blob = new Blob([csvString], { type: 'text/csv;charset=utf-8;' }) + const link = document.createElement('a') + + const url = URL.createObjectURL(blob) + link.setAttribute('href', url) + link.setAttribute('download', `${filename}.csv`) + link.style.visibility = 'hidden' + document.body.appendChild(link) + link.click() + document.body.removeChild(link) + } + + return ( + + ) +} diff --git a/src/components/Navbar.module.css b/src/components/Navbar.module.css new file mode 100644 index 0000000..7b82247 --- /dev/null +++ b/src/components/Navbar.module.css @@ -0,0 +1,67 @@ +.navbar { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem 2rem; + margin: 1rem auto; + width: calc(100% - 2rem); + max-width: 1200px; + border-radius: 12px; + align-self: center; +} + +.logo { + font-weight: 700; + font-size: 1.25rem; + color: var(--accent); + text-align: center; +} + +.links { + display: flex; + gap: 1.5rem; + align-items: center; +} + +.links a { + font-size: 0.875rem; + font-weight: 500; + transition: color 0.2s ease; +} + +.links a:hover { + color: var(--accent); +} + +.logoutBtn { + background: rgba(239, 68, 68, 0.1); + color: var(--danger); + border: 1px solid rgba(239, 68, 68, 0.2); + padding: 6px 12px; + border-radius: 6px; + cursor: pointer; + font-weight: 500; + transition: all 0.2s ease; +} + +.logoutBtn:hover { + background: var(--danger); + color: white; +} + +@media (max-width: 768px) { + .navbar { + flex-direction: column; + gap: 1rem; + padding: 1rem; + width: calc(100% - 2rem); + margin: 1rem auto; + align-self: center; + } + + .links { + flex-wrap: wrap; + justify-content: center; + gap: 1rem; + } +} diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx new file mode 100644 index 0000000..b3d6aa5 --- /dev/null +++ b/src/components/Navbar.tsx @@ -0,0 +1,51 @@ +'use client' + +import Link from 'next/link' +import { useRouter } from 'next/navigation' +import styles from './Navbar.module.css' + +export default function Navbar({ role, name, pendingCount = 0 }: { role: string, name?: string, pendingCount?: number }) { + const router = useRouter() + + const handleLogout = async () => { + await fetch('/api/auth/logout', { method: 'POST' }) + router.push('/login') + router.refresh() + } + + return ( + + ) +} diff --git a/src/components/SelectAllCheckbox.tsx b/src/components/SelectAllCheckbox.tsx new file mode 100644 index 0000000..ad4788f --- /dev/null +++ b/src/components/SelectAllCheckbox.tsx @@ -0,0 +1,16 @@ +'use client'; + +export default function SelectAllCheckbox() { + return ( + { + const checkboxes = document.querySelectorAll('input[name="requestIds"]:not(:disabled)') as NodeListOf; + for (let cb of checkboxes) { + cb.checked = e.target.checked; + } + }} + style={{ cursor: 'pointer' }} + /> + ); +} diff --git a/src/lib/auth.ts b/src/lib/auth.ts new file mode 100644 index 0000000..d6b5d9b --- /dev/null +++ b/src/lib/auth.ts @@ -0,0 +1,66 @@ +import { jwtVerify, SignJWT } from 'jose' +import { cookies } from 'next/headers' + +const secretKey = process.env.SESSION_SECRET || 'super-secret-key-for-development' +const key = new TextEncoder().encode(secretKey) + +export async function encrypt(payload: any) { + return await new SignJWT(payload) + .setProtectedHeader({ alg: 'HS256' }) + .setIssuedAt() + .setExpirationTime('2h') + .sign(key) +} + +export async function decrypt(input: string): Promise { + const { payload } = await jwtVerify(input, key, { + algorithms: ['HS256'], + }) + return payload +} + +export async function getSession() { + const cookieStore = await cookies() + const session = cookieStore.get('session')?.value + if (!session) return null + try { + return await decrypt(session) + } catch (error) { + return null + } +} + +export async function setSession(user: { id: number, email: string, name?: string, role: string }) { + const session = await encrypt(user) + const cookieStore = await cookies() + cookieStore.set('session', session, { + httpOnly: true, + secure: false, // Set to false to allow login via IP over HTTP on local networks + sameSite: 'lax', + path: '/', + maxAge: 2 * 60 * 60 // 2 hours + }) +} + +export async function updateSession(request: any) { + const session = request.cookies.get('session')?.value + if (!session) return null + + try { + // Verify it + const parsed = await decrypt(session) + // Re-encrypt it to reset the '2h' expiration + const updatedSession = await encrypt({ id: parsed.id, email: parsed.email, name: parsed.name, role: parsed.role }) + + // Create new response if not available, but usually we just return the new cookie value + // In middleware, we set it on the response + return updatedSession + } catch { + return null + } +} + +export async function clearSession() { + const cookieStore = await cookies() + cookieStore.delete('session') +} diff --git a/src/lib/email.ts b/src/lib/email.ts new file mode 100644 index 0000000..71cfb27 --- /dev/null +++ b/src/lib/email.ts @@ -0,0 +1,38 @@ +import { prisma } from './prisma' +import nodemailer from 'nodemailer' + +export async function sendEmailRecap(htmlContent: string) { + try { + const settings = await prisma.systemSettings.findFirst() + if (!settings || !settings.isEmailEnabled || !settings.smtpHost || !settings.smtpPort || !settings.smtpUser || !settings.smtpPass || !settings.targetEmail) { + return false + } + + const transporter = nodemailer.createTransport({ + host: settings.smtpHost, + port: settings.smtpPort, + secure: settings.smtpPort === 465, // true for 465, false for other ports + auth: { + user: settings.smtpUser, + pass: settings.smtpPass, + }, + }) + + const targets = settings.targetEmail.split(',').map(e => e.trim()).filter(e => e.length > 0) + + if (targets.length === 0) return false + + const mailOptions = { + from: `"Inventory System" <${settings.smtpUser}>`, + to: targets.join(', '), + subject: `Laporan Rekap Bulanan Inventory - ${new Date().toLocaleString('id-ID', { month: 'long', year: 'numeric' })}`, + html: htmlContent, + } + + await transporter.sendMail(mailOptions) + return true + } catch (err) { + console.error('Error sending email:', err) + return false + } +} diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts new file mode 100644 index 0000000..d4cf44a --- /dev/null +++ b/src/lib/prisma.ts @@ -0,0 +1,11 @@ +import { PrismaClient } from '@prisma/client' +import { PrismaLibSql } from '@prisma/adapter-libsql' +const adapter = new PrismaLibSql({ + url: 'file:dev.db', +}) + +const globalForPrisma = globalThis as unknown as { prisma: PrismaClient } + +export const prisma = globalForPrisma.prisma || new PrismaClient({ adapter }) + +if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma diff --git a/src/lib/telegram.ts b/src/lib/telegram.ts new file mode 100644 index 0000000..af9a861 --- /dev/null +++ b/src/lib/telegram.ts @@ -0,0 +1,33 @@ +import { prisma } from './prisma' + +export async function sendTelegramMessage(text: string) { + try { + const settings = await prisma.systemSettings.findFirst() + if (!settings || !settings.isTelegramEnabled || !settings.telegramBotToken || !settings.telegramChatId) { + return false + } + + const url = `https://api.telegram.org/bot${settings.telegramBotToken}/sendMessage` + const res = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + chat_id: settings.telegramChatId, + text, + parse_mode: 'HTML' + }) + }) + + if (!res.ok) { + console.error('Failed to send telegram message:', await res.text()) + return false + } + + return true + } catch (err) { + console.error('Error sending telegram message:', err) + return false + } +} diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 0000000..38ceb31 --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,48 @@ +import { NextResponse } from 'next/server' +import type { NextRequest } from 'next/server' +import { updateSession } from '@/lib/auth' + +export async function middleware(request: NextRequest) { + const session = request.cookies.get('session')?.value + + const isAuthPage = request.nextUrl.pathname.startsWith('/login') + + if (!session && !isAuthPage) { + return NextResponse.redirect(new URL('/login', request.url)) + } + + if (session && isAuthPage) { + return NextResponse.redirect(new URL('/', request.url)) + } + + // Handle rolling session + let res = NextResponse.next() + + if (session && !isAuthPage) { + const newSessionToken = await updateSession(request) + if (newSessionToken) { + res.cookies.set('session', newSessionToken, { + httpOnly: true, + secure: false, + sameSite: 'lax', + path: '/', + maxAge: 2 * 60 * 60 // 2 hours + }) + } + } + + return res +} + +export const config = { + matcher: [ + /* + * Match all request paths except for the ones starting with: + * - api (API routes) + * - _next/static (static files) + * - _next/image (image optimization files) + * - favicon.ico (favicon file) + */ + '/((?!api|_next/static|_next/image|favicon.ico).*)', + ], +}
+

Category Management

+ + {error && ( +
+ ❌ {error} +
+ )} + +
+
+ {editingCategory ? ( + <> + +
+ +
+ + +
+ +
+ + ) : ( + <> +

Add New Category

+
+
+ + +
+ +
+ + )} +
+ +
+

Existing Categories

+
+ + + + + + + + + + + + {categories.map(category => ( + + + + + + + + ))} + {categories.length === 0 && ( + + + + )} + +
IDNameItems CountUsers CountActions
#{category.id}{category.name}{category._count.items}{category._count.users} +
+ + Edit + +
+ + +
+
+
+ No categories found. Create one to get started. +
+
+
+
+