PageSourceSearch

https://dhruba-datta.netlify.app/assets/ABPharmacyPage-Dt7CfrXa.js

js dhruba-datta.netlify.app collected 2026-10-03 10:39:14 UTC 7,523 bytes, 1 lines download raw bytes

1import{j as e}from"./vendor-motion-C0Ykwh7C.js";import{m as s,h as i,n as a,o as t,p as r,q as c,r as d,f as m,g as h}from"./index-DQYSP24l.js";import{P as l}from"./ProjectPageTemplate-BukZfH_t.js";import{D as p,m as u,U as f,P as w,n as y,o as b,p as g,L as x,q as k}from"./vendor-icons-CZ0fHw8h.js";import"./vendor-react-D8ZVE-1i.js";import"./index-tD3BwZqC.js";import"./index-B32Yb0IV.js";import"./index-C9VRkwIY.js";import"./index-CMnRXDm6.js";import"./Footer-ClRpSHv8.js";import"./ProjectCard-BwLNlIzs.js";import"./projects-Clb5hPl-.js";import"./Seo-D8Plyq5-.js";const L=({isDark:o,toggleTheme:n})=>e.jsx(l,{isDark:o,toggleTheme:n,title:"AB Pharmacy",description:"AB Pharmacy is a wholesale medicine supplier in Bangladesh. Pharmacies used to order by phone and WhatsApp, and stock, packing and deliveries were tracked by hand. I led the build of the platform that now runs the business at abpharmacy.bd. Approved pharmacies use the storefront to browse the catalogue, order, track deliveries and file returns. Staff use the admin system for inventory with batch and expiry tracking, purchases, wholesale orders, packaging, deliveries, payments and customer accounts. It grew out of an order-management tool I built in 2025 and now runs as a Next.js frontend on a NestJS API, built with a team of three. The work also covered deployment, a code audit and end-to-end QA.",coverSrc:"/images/projects/AB Pharmacy.webp",chips:[{name:"Next.js 16",icon:e.jsx(s,{className:"w-3 sm:w-3.5 h-3 sm:h-3.5"})},{name:"React 19",icon:e.jsx(m,{className:"w-3 sm:w-3.5 h-3 sm:h-3.5"})},{name:"TypeScript",icon:e.jsx(h,{className:"w-3 sm:w-3.5 h-3 sm:h-3.5"})},{name:"NestJS 11",icon:e.jsx(a,{className:"w-3 sm:w-3.5 h-3 sm:h-3.5"})},{name:"Prisma",icon:e.jsx(t,{className:"w-3 sm:w-3.5 h-3 sm:h-3.5"})},{name:"PostgreSQL",icon:e.jsx(r,{className:"w-3 sm:w-3.5 h-3 sm:h-3.5"})}],secondaryUrl:"https://abpharmacy.bd/",secondaryLabel:"Check it out",features:[{id:"storefront",icon:e.jsx(u,{className:"w-4 sm:w-5 h-4 sm:h-5"}),title:"Wholesale Storefront",summary:"An installable web app where pharmacies order from the full catalogue",details:["Catalogue with product pages, a shop view and prices in taka (à§³)","Cart, checkout, order history and order tracking","Returns, notifications and account status in the customer's own dashboard","Installs to the home screen as a PWA, for pharmacy staff ordering from a phone"]},{id:"accounts",icon:e.jsx(f,{className:"w-4 sm:w-5 h-4 sm:h-5"}),title:"Approved Wholesale Accounts",summary:"Only verified pharmacies can see prices and place orders",details:["Pharmacies register, then staff approve, reject, pause or resume the account","Guests, pending, paused and approved customers each see a different version of the site","Profile changes wait for staff review before they take effect"]},{id:"inventory",icon:e.jsx(w,{className:"w-4 sm:w-5 h-4 sm:h-5"}
1),title:"Inventory With Batches and Expiry",summary:"Stock is tracked batch by batch, so nothing ships too close to its expiry date",details:["Products, price batches and stock batches, with a minimum shelf-life check before sale","Purchases from pharmaceutical companies, with purchase payments and history","Stock movements and manual adjustments, each recorded"]},{id:"fulfilment",icon:e.jsx(y,{className:"w-4 sm:w-5 h-4 sm:h-5"}),title:"Orders, Packaging and Delivery",summary:"The whole path from order to doorstep, in one system",details:["Wholesale orders placed online by customers or entered by staff","Packaging batches that group the day's orders by customer for the packing team","Deliveries assigned to delivery staff, with delivery history","Invoices, order payments, cash settlement and returns"]},{id:"crm",icon:e.jsx(b,{className:"w-4 sm:w-5 h-4 sm:h-5"}),title:"Customer and Supplier Records",summary:"Everyone the business deals with, in one place",details:["Customers, pharmaceutical companies, medical representatives, markets and delivery staff","A summary page for each, with its orders and activity","Announcements to customers, and reports for management"]},{id:"security",icon:e.jsx(g,{className:"w-4 sm:w-5 h-4 sm:h-5"}),title:"Security and Accountability",summary:"Audited and hardened before launch",details:["A code audit of the first version found authentication weaknesses, and they were fixed before launch","Hashed passwords, token-based sessions and rate limiting on the API","Admin and super-admin roles, and an audit log of staff actions"]},{id:"architecture",icon:e.jsx(x,{className:"w-4 sm:w-5 h-4 sm:h-5"}),title:"Split Into a Frontend and an API",summary:"Rebuilt from a single Next.js app into two independent services",details:["The frontend is a pure UI client and holds no database access at all","The NestJS API owns the data: 37 data models across inventory, wholesale, customers and admin","The user's session is passed to the API server-side, so tokens never reach the browser","The UI and API can be deployed and scaled separately"]},{id:"ordering",icon:e.jsx(k,{className:"w-4 sm:w-5 h-4 sm:h-5"}),title:"Where It Started: the Order Manager",summary:"The 2025 tool that took ordering off WhatsApp and paper",details:["A React and Firebase app for incoming orders, sorted into pending, regular and urgent","Inventory, sales history and contacts for companies and medical representatives","Order lists exported to PDF for suppliers","Its workflows became the basis of the current platform"]}],techSectionTitle:"Stack",techItems:[{icon:e.jsx(s,{className:"w-3.5 h-3.5 sm:w-4 sm:h-4"}),label:"Next.js 16 + React 19",description:"Storefront and admin panel, installable as a PWA."},{icon:e.jsx(i,{className:"w-3.5 h-3.5 sm:w-4 sm:h-4"}),label:"Tailwind CSS 4 + shadcn/ui",description:"Accessible Radix-based components for about 60 screens."},{icon:e.jsx(a,{className:"w-3.5 h-3.5 sm:w-4 sm:h-4"}),label:"NestJS 11",description:"REST API for inventory, wholesale, customers, storefront and admin."},{icon:e.jsx(t,{className:"w-3.5 h-3.5 sm:w-4 sm:h-4"}),label:"Prisma",description:"Typed data layer over 37 models."},{icon:e.jsx(r,{className:"w-3.5 h-3.5 sm:w-4 sm:h-4"}),label:"PostgreSQL",description:"Production database on Supabase."},{icon:e.jsx(p,{className:"w-3.5 h-3.5 sm:w-4 sm:h-4"}),label:"NextAuth, Zod, Zustand",description:"Sessions, validated forms and client state."},{icon:e.jsx(c,{className:"w-3.5 h-3.5 sm:w-4 sm:h-4"}),label:"Vercel",description:"Hosting for the frontend and the API."},{icon:e.jsx(d,{className:"w-3.5 h-3.5 sm:w-4 sm:h-4"}),label:"Firebase",description:"Data layer for the original order manager."}],useCases:["Wholesale distributors moving customers off phone and WhatsApp ordering","Businesses that need batch and expiry tracking, not just stock counts","Teams running packing and delivery from the same system as sales"],howToSectionTitle:"How It Works",howToSteps:["A pharmacy registers and is approved by AB Pharmacy staff.","It browses the catalogue and places an order from the storefront.","Staff check stock by batch and expiry, then pack the order in the day's packaging batch.","The order is assigned to a delivery person and invoiced, and payment is recorded.","The pharmacy tracks the order, and can file a return, from its own dashboard."],contactCTA:{title:"Running a business on phone calls and spreadsheets?",description:"I build ordering and operations platforms that replace manual work with one system your customers and staff both use.",primaryButtonText:"Get Started",secondaryButtonText:"View All Projects"}});export{L as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.