@argusoft/medplat-product-management 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{BrandsPage-CSA3meke.js → BrandsPage-BE3kn-8b.js} +77 -75
- package/dist/BrandsPage-BE3kn-8b.js.map +1 -0
- package/dist/{CategoriesPage-BrspzkJL.js → CategoriesPage-COqi3pMi.js} +71 -70
- package/dist/{CategoriesPage-BrspzkJL.js.map → CategoriesPage-COqi3pMi.js.map} +1 -1
- package/dist/{DashboardPage-CqaquOs2.js → DashboardPage-C_H1Jrey.js} +90 -89
- package/dist/DashboardPage-C_H1Jrey.js.map +1 -0
- package/dist/{FacilityPicker-Dv_H95WW.js → FacilityPicker-Diq2hnYg.js} +2 -2
- package/dist/{FacilityPicker-Dv_H95WW.js.map → FacilityPicker-Diq2hnYg.js.map} +1 -1
- package/dist/{InventoryPage-CPbzfDMR.js → InventoryPage-Bjpw6vTz.js} +106 -115
- package/dist/InventoryPage-Bjpw6vTz.js.map +1 -0
- package/dist/{MemberProfileCard-0vjO3Gzd.js → MemberProfileCard-BLUVRILO.js} +10 -9
- package/dist/MemberProfileCard-BLUVRILO.js.map +1 -0
- package/dist/{PaymentCreatePage-BYmDZAIB.js → PaymentCreatePage-B5VOgTx9.js} +173 -177
- package/dist/PaymentCreatePage-B5VOgTx9.js.map +1 -0
- package/dist/{PaymentsPage-BXPvKon-.js → PaymentsPage-DY6BclkN.js} +24 -23
- package/dist/{PaymentsPage-BXPvKon-.js.map → PaymentsPage-DY6BclkN.js.map} +1 -1
- package/dist/PickupCreatePage-CCSiyFQF.js +706 -0
- package/dist/PickupCreatePage-CCSiyFQF.js.map +1 -0
- package/dist/{PickupsPage-D66_Wta4.js → PickupsPage-DGi6T5Of.js} +83 -90
- package/dist/PickupsPage-DGi6T5Of.js.map +1 -0
- package/dist/PmGuard-C90yhpsN.js +592 -0
- package/dist/PmGuard-C90yhpsN.js.map +1 -0
- package/dist/{PmTable-B9970kPY.js → PmTable-BkK65bJQ.js} +98 -98
- package/dist/PmTable-BkK65bJQ.js.map +1 -0
- package/dist/{ProductEditPage-B8qFTCW9.js → ProductEditPage-CQj9egzW.js} +138 -137
- package/dist/ProductEditPage-CQj9egzW.js.map +1 -0
- package/dist/{ProductsPage-C7_r9cKn.js → ProductsPage-i8QVw_Jm.js} +65 -64
- package/dist/{ProductsPage-C7_r9cKn.js.map → ProductsPage-i8QVw_Jm.js.map} +1 -1
- package/dist/PurchaseCreatePage-Bp6bl9n8.js +591 -0
- package/dist/PurchaseCreatePage-Bp6bl9n8.js.map +1 -0
- package/dist/{PurchaseRequestDetailPage-C7aAwEqw.js → PurchaseRequestDetailPage-CNAqIFef.js} +216 -215
- package/dist/PurchaseRequestDetailPage-CNAqIFef.js.map +1 -0
- package/dist/{PurchaseRequestsPage-BwCkbpaX.js → PurchaseRequestsPage-BJqDlNrc.js} +57 -56
- package/dist/{PurchaseRequestsPage-BwCkbpaX.js.map → PurchaseRequestsPage-BJqDlNrc.js.map} +1 -1
- package/dist/{PurchasesPage-CvaZouVy.js → PurchasesPage-BQEToymQ.js} +76 -75
- package/dist/{PurchasesPage-CvaZouVy.js.map → PurchasesPage-BQEToymQ.js.map} +1 -1
- package/dist/{SaleCreatePage-DP1Qmltu.js → SaleCreatePage-DbfBK4PH.js} +149 -173
- package/dist/SaleCreatePage-DbfBK4PH.js.map +1 -0
- package/dist/{SalesPage-CO3cdYX5.js → SalesPage-CTBJMxZe.js} +50 -49
- package/dist/SalesPage-CTBJMxZe.js.map +1 -0
- package/dist/SettingsPage-CiwVmzM3.js +663 -0
- package/dist/SettingsPage-CiwVmzM3.js.map +1 -0
- package/dist/{StorageUnitsPage-B9Hr_RkW.js → StorageUnitsPage-BV7nK_iE.js} +57 -56
- package/dist/{StorageUnitsPage-B9Hr_RkW.js.map → StorageUnitsPage-BV7nK_iE.js.map} +1 -1
- package/dist/{TransactionsPage-HKIGwEZN.js → TransactionsPage-Cocn4901.js} +55 -54
- package/dist/TransactionsPage-Cocn4901.js.map +1 -0
- package/dist/TransferCreatePage-DbjcjuOg.js +316 -0
- package/dist/TransferCreatePage-DbjcjuOg.js.map +1 -0
- package/dist/TransfersPage-BFVF7Xvc.js +471 -0
- package/dist/TransfersPage-BFVF7Xvc.js.map +1 -0
- package/dist/VialsPage-BNzYTLVd.js +321 -0
- package/dist/VialsPage-BNzYTLVd.js.map +1 -0
- package/dist/index.js +652 -34
- package/dist/index.js.map +1 -1
- package/dist/settingsStore-KW217unV.js +417 -0
- package/dist/settingsStore-KW217unV.js.map +1 -0
- package/package.json +1 -1
- package/dist/BrandsPage-CSA3meke.js.map +0 -1
- package/dist/DashboardPage-CqaquOs2.js.map +0 -1
- package/dist/InventoryPage-CPbzfDMR.js.map +0 -1
- package/dist/MemberProfileCard-0vjO3Gzd.js.map +0 -1
- package/dist/PaymentCreatePage-BYmDZAIB.js.map +0 -1
- package/dist/PickupCreatePage-CMGwoAXj.js +0 -426
- package/dist/PickupCreatePage-CMGwoAXj.js.map +0 -1
- package/dist/PickupsPage-D66_Wta4.js.map +0 -1
- package/dist/PmTable-B9970kPY.js.map +0 -1
- package/dist/ProductEditPage-B8qFTCW9.js.map +0 -1
- package/dist/PurchaseCreatePage-CDfNDcKG.js +0 -627
- package/dist/PurchaseCreatePage-CDfNDcKG.js.map +0 -1
- package/dist/PurchaseRequestDetailPage-C7aAwEqw.js.map +0 -1
- package/dist/SaleCreatePage-DP1Qmltu.js.map +0 -1
- package/dist/SalesPage-CO3cdYX5.js.map +0 -1
- package/dist/SettingsPage-DvVRwSFw.js +0 -711
- package/dist/SettingsPage-DvVRwSFw.js.map +0 -1
- package/dist/TransactionsPage-HKIGwEZN.js.map +0 -1
- package/dist/TransferCreatePage-DMuZqQ3c.js +0 -363
- package/dist/TransferCreatePage-DMuZqQ3c.js.map +0 -1
- package/dist/TransfersPage-COIyouL4.js +0 -480
- package/dist/TransfersPage-COIyouL4.js.map +0 -1
- package/dist/VialsPage-BNPUwGCU.js +0 -922
- package/dist/VialsPage-BNPUwGCU.js.map +0 -1
- package/dist/currency-ClRLIEg2.js +0 -1372
- package/dist/currency-ClRLIEg2.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../routes/routes.jsx"],"sourcesContent":["import { lazy } from 'react';\nconst VerifyRoute = lazy(() => import('@/views/feature-components/VerifyRoute.jsx'));\n\nconst DashboardPage = lazy(() => import('../src/views/DashboardPage.jsx'));\nconst CategoriesPage = lazy(() => import('../src/views/CategoriesPage.jsx'));\nconst BrandsPage = lazy(() => import('../src/views/BrandsPage.jsx'));\nconst ProductsPage = lazy(() => import('../src/views/ProductsPage.jsx'));\nconst ProductEditPage = lazy(() => import('../src/views/ProductEditPage.jsx'));\nconst StorageUnitsPage = lazy(() => import('../src/views/StorageUnitsPage.jsx'));\nconst InventoryPage = lazy(() => import('../src/views/InventoryPage.jsx'));\nconst PurchasesPage = lazy(() => import('../src/views/PurchasesPage.jsx'));\nconst PurchaseCreatePage = lazy(() => import('../src/views/PurchaseCreatePage.jsx'));\nconst PurchaseRequestsPage = lazy(() => import('../src/views/PurchaseRequestsPage.jsx'));\nconst PurchaseRequestDetailPage = lazy(() => import('../src/views/PurchaseRequestDetailPage.jsx'));\nconst PickupsPage = lazy(() => import('../src/views/PickupsPage.jsx'));\nconst PickupCreatePage = lazy(() => import('../src/views/PickupCreatePage.jsx'));\nconst TransfersPage = lazy(() => import('../src/views/TransfersPage.jsx'));\nconst TransferCreatePage = lazy(() => import('../src/views/TransferCreatePage.jsx'));\nconst SalesPage = lazy(() => import('../src/views/SalesPage.jsx'));\nconst SaleCreatePage = lazy(() => import('../src/views/SaleCreatePage.jsx'));\nconst PaymentsPage = lazy(() => import('../src/views/PaymentsPage.jsx'));\nconst PaymentCreatePage = lazy(() => import('../src/views/PaymentCreatePage.jsx'));\nconst VialsPage = lazy(() => import('../src/views/VialsPage.jsx'));\nconst TransactionsPage = lazy(() => import('../src/views/TransactionsPage.jsx'));\nconst SettingsPage = lazy(() => import('../src/views/SettingsPage.jsx'));\n\nconst HEADER = 'Product Management';\n\nfunction pmRoute(path, Component, pageTitle = 'General') {\n return {\n path,\n element: (\n <VerifyRoute\n headerTitle={HEADER}\n pageTitle={pageTitle}\n url={\"medplat/manage/pm\"}\n component={Component}\n />\n ),\n };\n}\n\nconst routes = [\n pmRoute('medplat/manage/pm', DashboardPage, 'Dashboard'),\n pmRoute('medplat/manage/pm/categories', CategoriesPage, 'Categories'),\n pmRoute('medplat/manage/pm/brands', BrandsPage, 'Brands'),\n pmRoute('medplat/manage/pm/products', ProductsPage, 'Products'),\n pmRoute('medplat/manage/pm/products/:productId', ProductEditPage, 'Product'),\n pmRoute('medplat/manage/pm/storage-units', StorageUnitsPage, 'Storage Units'),\n pmRoute('medplat/manage/pm/inventory', InventoryPage, 'Inventory'),\n pmRoute('medplat/manage/pm/purchases', PurchasesPage, 'Purchases'),\n pmRoute('medplat/manage/pm/purchases/new', PurchaseCreatePage, 'New Purchase'),\n pmRoute('medplat/manage/pm/purchase-requests', PurchaseRequestsPage, 'Purchase Requests'),\n pmRoute('medplat/manage/pm/purchase-requests/:requestId', PurchaseRequestDetailPage, 'Purchase Request'),\n pmRoute('medplat/manage/pm/pickups', PickupsPage, 'Pickups'),\n pmRoute('medplat/manage/pm/pickups/new', PickupCreatePage, 'New Pickup'),\n pmRoute('medplat/manage/pm/transfers', TransfersPage, 'Transfers'),\n pmRoute('medplat/manage/pm/transfers/new', TransferCreatePage, 'New Transfer'),\n pmRoute('medplat/manage/pm/sales', SalesPage, 'Sales'),\n // memberId is passed in by the caller — Sales / Payments only render the\n // create flow when they have one. Plain /sales/new or /payments fall back\n // to a friendly \"no member selected\" state.\n pmRoute('medplat/manage/pm/sales/new', SaleCreatePage, 'New Sale'),\n pmRoute('medplat/manage/pm/sales/new/:memberId', SaleCreatePage, 'New Sale'),\n pmRoute('medplat/manage/pm/payments', PaymentsPage, 'Payments'),\n // Payment-collection flow mirrors Sales: the create page receives the\n // member id via the URL (passed in by an upstream flow). The bare /new\n // path lands on a \"no member selected\" warning.\n pmRoute('medplat/manage/pm/payments/new', PaymentCreatePage, 'Collect Payment'),\n pmRoute('medplat/manage/pm/payments/new/:memberId', PaymentCreatePage, 'Collect Payment'),\n pmRoute('medplat/manage/pm/vials', VialsPage, 'Open Vials'),\n pmRoute('medplat/manage/pm/transactions', TransactionsPage, 'Stock Ledger'),\n pmRoute('medplat/manage/pm/settings', SettingsPage, 'Settings'),\n];\n\nexport default routes;\n"],"mappings":";;;AACA,IAAM,IAAc,QAAW,OAAO,6CAA6C,GAE7E,IAAgB,QAAW,OAAO,8BAAiC,GACnE,IAAiB,QAAW,OAAO,+BAAkC,GACrE,IAAa,QAAW,OAAO,2BAA8B,GAC7D,IAAe,QAAW,OAAO,6BAAgC,GACjE,IAAkB,QAAW,OAAO,gCAAmC,GACvE,IAAmB,QAAW,OAAO,iCAAoC,GACzE,IAAgB,QAAW,OAAO,8BAAiC,GACnE,IAAgB,QAAW,OAAO,8BAAiC,GACnE,IAAqB,QAAW,OAAO,mCAAsC,GAC7E,IAAuB,QAAW,OAAO,qCAAwC,GACjF,IAA4B,QAAW,OAAO,0CAA6C,GAC3F,IAAc,QAAW,OAAO,4BAA+B,GAC/D,IAAmB,QAAW,OAAO,iCAAoC,GACzE,IAAgB,QAAW,OAAO,8BAAiC,GACnE,IAAqB,QAAW,OAAO,mCAAsC,GAC7E,IAAY,QAAW,OAAO,0BAA6B,GAC3D,IAAiB,QAAW,OAAO,+BAAkC,GACrE,IAAe,QAAW,OAAO,6BAAgC,GACjE,IAAoB,QAAW,OAAO,kCAAqC,GAC3E,IAAY,QAAW,OAAO,0BAA6B,GAC3D,IAAmB,QAAW,OAAO,iCAAoC,GACzE,IAAe,QAAW,OAAO,6BAAgC,GAEjE,IAAS;AAEf,SAAS,EAAQ,GAAM,GAAW,IAAY,WAAW;CACvD,OAAO;EACL;EACA,SACE,kBAAC,GAAD;GACE,aAAa;GACF;GACX,KAAK;GACL,WAAW;EACZ,CAAA;CAEL;AACF;AAEA,IAAM,IAAS;CACb,EAAQ,qBAAqB,GAAe,WAAW;CACvD,EAAQ,gCAAgC,GAAgB,YAAY;CACpE,EAAQ,4BAA4B,GAAY,QAAQ;CACxD,EAAQ,8BAA8B,GAAc,UAAU;CAC9D,EAAQ,yCAAyC,GAAiB,SAAS;CAC3E,EAAQ,mCAAmC,GAAkB,eAAe;CAC5E,EAAQ,+BAA+B,GAAe,WAAW;CACjE,EAAQ,+BAA+B,GAAe,WAAW;CACjE,EAAQ,mCAAmC,GAAoB,cAAc;CAC7E,EAAQ,uCAAuC,GAAsB,mBAAmB;CACxF,EAAQ,kDAAkD,GAA2B,kBAAkB;CACvG,EAAQ,6BAA6B,GAAa,SAAS;CAC3D,EAAQ,iCAAiC,GAAkB,YAAY;CACvE,EAAQ,+BAA+B,GAAe,WAAW;CACjE,EAAQ,mCAAmC,GAAoB,cAAc;CAC7E,EAAQ,2BAA2B,GAAW,OAAO;CAIrD,EAAQ,+BAA+B,GAAgB,UAAU;CACjE,EAAQ,yCAAyC,GAAgB,UAAU;CAC3E,EAAQ,8BAA8B,GAAc,UAAU;CAI9D,EAAQ,kCAAkC,GAAmB,iBAAiB;CAC9E,EAAQ,4CAA4C,GAAmB,iBAAiB;CACxF,EAAQ,2BAA2B,GAAW,YAAY;CAC1D,EAAQ,kCAAkC,GAAkB,cAAc;CAC1E,EAAQ,8BAA8B,GAAc,UAAU;AAChE"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../routes/routes.jsx","../src/components/ProductAdministrationDialog.jsx"],"sourcesContent":["import { lazy } from 'react';\nconst VerifyRoute = lazy(() => import('@/views/feature-components/VerifyRoute.jsx'));\n\nconst DashboardPage = lazy(() => import('../src/views/DashboardPage.jsx'));\nconst CategoriesPage = lazy(() => import('../src/views/CategoriesPage.jsx'));\nconst BrandsPage = lazy(() => import('../src/views/BrandsPage.jsx'));\nconst ProductsPage = lazy(() => import('../src/views/ProductsPage.jsx'));\nconst ProductEditPage = lazy(() => import('../src/views/ProductEditPage.jsx'));\nconst StorageUnitsPage = lazy(() => import('../src/views/StorageUnitsPage.jsx'));\nconst InventoryPage = lazy(() => import('../src/views/InventoryPage.jsx'));\nconst PurchasesPage = lazy(() => import('../src/views/PurchasesPage.jsx'));\nconst PurchaseCreatePage = lazy(() => import('../src/views/PurchaseCreatePage.jsx'));\nconst PurchaseRequestsPage = lazy(() => import('../src/views/PurchaseRequestsPage.jsx'));\nconst PurchaseRequestDetailPage = lazy(() => import('../src/views/PurchaseRequestDetailPage.jsx'));\nconst PickupsPage = lazy(() => import('../src/views/PickupsPage.jsx'));\nconst PickupCreatePage = lazy(() => import('../src/views/PickupCreatePage.jsx'));\nconst TransfersPage = lazy(() => import('../src/views/TransfersPage.jsx'));\nconst TransferCreatePage = lazy(() => import('../src/views/TransferCreatePage.jsx'));\nconst SalesPage = lazy(() => import('../src/views/SalesPage.jsx'));\nconst SaleCreatePage = lazy(() => import('../src/views/SaleCreatePage.jsx'));\nconst PaymentsPage = lazy(() => import('../src/views/PaymentsPage.jsx'));\nconst PaymentCreatePage = lazy(() => import('../src/views/PaymentCreatePage.jsx'));\nconst VialsPage = lazy(() => import('../src/views/VialsPage.jsx'));\nconst TransactionsPage = lazy(() => import('../src/views/TransactionsPage.jsx'));\nconst SettingsPage = lazy(() => import('../src/views/SettingsPage.jsx'));\n\nconst HEADER = 'Product Management';\n\nfunction pmRoute(path, Component, pageTitle = 'General') {\n return {\n path,\n element: (\n <VerifyRoute\n headerTitle={HEADER}\n pageTitle={pageTitle}\n url={\"medplat/manage/pm\"}\n component={Component}\n />\n ),\n };\n}\n\nconst routes = [\n pmRoute('medplat/manage/pm', DashboardPage, 'Dashboard'),\n pmRoute('medplat/manage/pm/categories', CategoriesPage, 'Categories'),\n pmRoute('medplat/manage/pm/brands', BrandsPage, 'Brands'),\n pmRoute('medplat/manage/pm/products', ProductsPage, 'Products'),\n pmRoute('medplat/manage/pm/products/:productId', ProductEditPage, 'Product'),\n pmRoute('medplat/manage/pm/storage-units', StorageUnitsPage, 'Storage Units'),\n pmRoute('medplat/manage/pm/inventory', InventoryPage, 'Inventory'),\n pmRoute('medplat/manage/pm/purchases', PurchasesPage, 'Purchases'),\n pmRoute('medplat/manage/pm/purchases/new', PurchaseCreatePage, 'New Purchase'),\n pmRoute('medplat/manage/pm/purchase-requests', PurchaseRequestsPage, 'Purchase Requests'),\n pmRoute('medplat/manage/pm/purchase-requests/:requestId', PurchaseRequestDetailPage, 'Purchase Request'),\n pmRoute('medplat/manage/pm/pickups', PickupsPage, 'Pickups'),\n pmRoute('medplat/manage/pm/pickups/new', PickupCreatePage, 'New Pickup'),\n pmRoute('medplat/manage/pm/transfers', TransfersPage, 'Transfers'),\n pmRoute('medplat/manage/pm/transfers/new', TransferCreatePage, 'New Transfer'),\n pmRoute('medplat/manage/pm/sales', SalesPage, 'Sales'),\n // memberId is passed in by the caller — Sales / Payments only render the\n // create flow when they have one. Plain /sales/new or /payments fall back\n // to a friendly \"no member selected\" state.\n pmRoute('medplat/manage/pm/sales/new', SaleCreatePage, 'New Sale'),\n pmRoute('medplat/manage/pm/sales/new/:memberId', SaleCreatePage, 'New Sale'),\n pmRoute('medplat/manage/pm/payments', PaymentsPage, 'Payments'),\n // Payment-collection flow mirrors Sales: the create page receives the\n // member id via the URL (passed in by an upstream flow). The bare /new\n // path lands on a \"no member selected\" warning.\n pmRoute('medplat/manage/pm/payments/new', PaymentCreatePage, 'Collect Payment'),\n pmRoute('medplat/manage/pm/payments/new/:memberId', PaymentCreatePage, 'Collect Payment'),\n pmRoute('medplat/manage/pm/vials', VialsPage, 'Open Vials'),\n pmRoute('medplat/manage/pm/transactions', TransactionsPage, 'Stock Ledger'),\n pmRoute('medplat/manage/pm/settings', SettingsPage, 'Settings'),\n];\n\nexport default routes;\n","import { useEffect, useMemo, useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport {\n Alert,\n Box,\n Button,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n LinearProgress,\n Radio,\n Stack,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n TextField,\n Tooltip,\n Typography,\n} from \"@mui/material\";\nimport VaccinesRoundedIcon from \"@mui/icons-material/VaccinesRounded\";\nimport { showToast } from \"@/common/toaster/toaster\";\nimport { PmSelect } from \"@pm/components/PmTable\";\nimport {\n getProducts,\n listFacilities,\n listVialsForProduct,\n listBatches,\n listMyOpenPickups,\n} from \"@pm/services/pmApi\";\nimport {\n VACCINES_CATEGORY_CODE,\n VIAL_STATUSES,\n labelOf,\n} from \"@pm/utils/constants\";\nimport { formatDate, formatDateTime, formatNumber } from \"@pm/utils/format\";\nimport {\n isClean,\n validatePositiveNumber,\n validateRequired,\n} from \"@pm/utils/validation\";\nimport { useFieldErrors } from \"@pm/utils/useFieldErrors\";\nimport { usePmSettings } from \"@pm/utils/settingsStore\";\n\nfunction effectiveVialExpiry(v) {\n const vialT = v.expiresAt ? new Date(v.expiresAt).getTime() : Infinity;\n let batchT = Infinity;\n if (v.batchExpiryDate) {\n const d = new Date(v.batchExpiryDate);\n d.setHours(23, 59, 59, 999);\n batchT = d.getTime();\n }\n return Math.min(vialT, batchT);\n}\n\nfunction batchExpiryMs(b) {\n return b.expiryDate ? new Date(b.expiryDate).getTime() : Infinity;\n}\n\nconst EMPTY_VACCINE_DIALOG = {\n step: \"product\", // 'product' | 'select'\n mode: \"use-existing\", // 'use-existing' | 'open-new'\n productId: \"\",\n ownerType: \"\",\n ownerId: \"\",\n personalSource: \"\",\n allVials: [],\n allBatches: [],\n sources: [],\n vialCandidates: [],\n batchCandidates: [],\n selectedVialId: \"\",\n selectedBatchId: \"\",\n volumeMl: \"\",\n loading: false,\n};\n\nexport default function ProductAdministrationDialog({\n open,\n preselectedProductId,\n onConfirm,\n onCancel,\n}) {\n const [vaccineDialog, setVaccineDialog] = useState(EMPTY_VACCINE_DIALOG);\n const [products, setProducts] = useState([]);\n const [batches, setBatches] = useState([]);\n const [facilities, setFacilities] = useState([]);\n const [openSessions, setOpenSessions] = useState([]);\n const [loadingMetadata, setLoadingMetadata] = useState(false);\n const vaccineFieldErrors = useFieldErrors();\n const settings = usePmSettings();\n const allowPersonalPurchase = settings?.allowPersonalPurchase !== false;\n\n // Load basic metadata on open\n useEffect(() => {\n if (open) {\n vaccineFieldErrors.reset();\n setVaccineDialog({\n ...EMPTY_VACCINE_DIALOG,\n productId: preselectedProductId || \"\",\n });\n\n async function loadMetadata() {\n setLoadingMetadata(true);\n try {\n const [p, b, f, sessions] = await Promise.all([\n getProducts(),\n listBatches(),\n listFacilities().catch(() => []),\n listMyOpenPickups().catch(() => []),\n ]);\n setProducts(p);\n setBatches(b);\n setFacilities(f);\n setOpenSessions(sessions);\n } catch (err) {\n showToast({\n message: err?.message || \"Failed to load metadata\",\n type: \"error\",\n });\n } finally {\n setLoadingMetadata(false);\n }\n }\n void loadMetadata();\n }\n }, [open, preselectedProductId]);\n\n // Set the product ID if preselectedProductId changes or metadata finishes loading\n useEffect(() => {\n if (open && preselectedProductId) {\n setVaccineDialog((d) => ({\n ...d,\n productId: preselectedProductId,\n }));\n }\n }, [open, preselectedProductId]);\n\n // Vaccine products filter\n const vaccineProducts = useMemo(() => {\n const activeVaccines = products\n .filter((p) => p.categoryCode === VACCINES_CATEGORY_CODE && p.isActive)\n .sort((a, b) => a.name.localeCompare(b.name));\n\n if (preselectedProductId) {\n return activeVaccines.filter((p) => p.id === preselectedProductId);\n }\n return activeVaccines;\n }, [products, preselectedProductId]);\n\n function fefoBatchesForProduct(productId, pool = batches) {\n const todayMs = new Date().setHours(0, 0, 0, 0);\n return pool\n .filter(\n (b) =>\n b.productId === productId &&\n b.qtyRemaining > 0 &&\n !b.isQuarantined &&\n (!b.expiryDate || new Date(b.expiryDate).getTime() >= todayMs),\n )\n .sort((a, b) => batchExpiryMs(a) - batchExpiryMs(b));\n }\n\n function filterCandidatesByOwner(\n allVials,\n allBatches,\n ownerType,\n ownerId,\n personalSource,\n ) {\n if (!ownerType) return { vials: [], batches: [] };\n const wantSource =\n ownerType === \"USER\" && personalSource\n ? personalSource === \"OUTREACH\"\n ? \"PICKUP\"\n : \"PURCHASE\"\n : null;\n const matchVial = (v) =>\n v.ownerType === ownerType &&\n (ownerType === \"USER\"\n ? !wantSource || v.batchSourceType === wantSource\n : v.ownerId === ownerId);\n const matchBatch = (b) =>\n b.ownerType === ownerType &&\n (ownerType === \"USER\"\n ? !wantSource || b.sourceType === wantSource\n : b.ownerId === ownerId);\n return {\n vials: allVials.filter(matchVial),\n batches: allBatches.filter(matchBatch),\n };\n }\n\n async function proceedFromProductStep() {\n if (!vaccineDialog.productId) {\n vaccineFieldErrors.markAllTouched();\n return;\n }\n setVaccineDialog((d) => ({ ...d, loading: true }));\n try {\n const [list, freshBatches, freshFacilities] = await Promise.all([\n listVialsForProduct(vaccineDialog.productId),\n listBatches().catch(() => batches),\n listFacilities().catch(() => facilities),\n ]);\n setBatches(freshBatches);\n setFacilities(freshFacilities);\n const now = Date.now();\n const usableVials = list\n .filter(\n (v) =>\n v.status === \"OPEN\" &&\n !v.expired &&\n effectiveVialExpiry(v) > now &&\n Number(v.volumeRemainingMl) > 0,\n )\n .sort((a, b) => effectiveVialExpiry(a) - effectiveVialExpiry(b));\n\n const openCountByBatch = list.reduce((acc, v) => {\n if (v.status === \"OPEN\") acc[v.batchId] = (acc[v.batchId] || 0) + 1;\n return acc;\n }, {});\n\n const product = products.find((p) => p.id === vaccineDialog.productId);\n const cfg = product?.vaccineConfig;\n const maxConcurrent = cfg?.maxConcurrentOpenVials ?? 2;\n const fefo = fefoBatchesForProduct(\n vaccineDialog.productId,\n freshBatches,\n ).filter((b) => (openCountByBatch[b.id] || 0) < maxConcurrent);\n\n const sourceKeys = new Set();\n const sources = [];\n function pushSource(ownerType, ownerId, label, personalSource = \"\") {\n const key = `${ownerType}::${ownerId ?? \"\"}::${personalSource ?? \"\"}`;\n if (sourceKeys.has(key)) return;\n sourceKeys.add(key);\n sources.push({\n key,\n ownerType,\n ownerId: ownerId ?? null,\n personalSource: personalSource || null,\n label,\n });\n }\n\n const hasOutreach =\n usableVials.some(\n (v) => v.ownerType === \"USER\" && v.batchSourceType === \"PICKUP\",\n ) ||\n fefo.some((b) => b.ownerType === \"USER\" && b.sourceType === \"PICKUP\");\n if (hasOutreach)\n pushSource(\"USER\", null, \"Personal (Outreach)\", \"OUTREACH\");\n\n const hasPurchase =\n usableVials.some(\n (v) => v.ownerType === \"USER\" && v.batchSourceType === \"PURCHASE\",\n ) ||\n fefo.some((b) => b.ownerType === \"USER\" && b.sourceType === \"PURCHASE\");\n if (allowPersonalPurchase && hasPurchase)\n pushSource(\"USER\", null, \"Personal (Purchase)\", \"PURCHASE\");\n\n const facilityIds = new Set();\n usableVials.forEach((v) => {\n if (v.ownerType === \"FACILITY\" && v.ownerId) facilityIds.add(v.ownerId);\n });\n fefo.forEach((b) => {\n if (b.ownerType === \"FACILITY\" && b.ownerId) facilityIds.add(b.ownerId);\n });\n facilityIds.forEach((fid) => {\n const fac = freshFacilities.find((x) => x.id === fid);\n pushSource(\"FACILITY\", fid, `Facility — ${fac?.name ?? fid}`);\n });\n\n const defaultSource = sources.length === 1 ? sources[0] : null;\n const defaultOwnerType = defaultSource?.ownerType ?? \"\";\n const defaultOwnerId = defaultSource?.ownerId ?? \"\";\n const defaultPersonalSource = defaultSource?.personalSource ?? \"\";\n\n const filtered = filterCandidatesByOwner(\n usableVials,\n fefo,\n defaultOwnerType,\n defaultOwnerId,\n defaultPersonalSource,\n );\n\n const defaultMode =\n filtered.vials.length > 0 ? \"use-existing\" : \"open-new\";\n setVaccineDialog((d) => ({\n ...d,\n loading: false,\n step: \"select\",\n mode: defaultMode,\n ownerType: defaultOwnerType,\n ownerId: defaultOwnerId,\n personalSource: defaultPersonalSource,\n allVials: usableVials,\n allBatches: fefo,\n sources,\n vialCandidates: filtered.vials,\n batchCandidates: filtered.batches,\n selectedVialId: filtered.vials[0]?.id ?? \"\",\n selectedBatchId: filtered.batches[0]?.id ?? \"\",\n volumeMl:\n defaultMode === \"use-existing\"\n ? filtered.vials[0]?.adultDoseMl ?? cfg?.adultDoseMl ?? \"\"\n : cfg?.adultDoseMl ?? \"\",\n }));\n } catch (err) {\n setVaccineDialog((d) => ({ ...d, loading: false }));\n showToast({\n message: err?.message ?? \"Failed to load vials\",\n type: \"error\",\n });\n }\n }\n\n function pickSource(sourceKey) {\n const next = vaccineDialog.sources.find((s) => s.key === sourceKey);\n if (!next) return;\n const filtered = filterCandidatesByOwner(\n vaccineDialog.allVials,\n vaccineDialog.allBatches,\n next.ownerType,\n next.ownerId,\n next.personalSource,\n );\n const product = products.find((p) => p.id === vaccineDialog.productId);\n const cfg = product?.vaccineConfig;\n const nextMode = filtered.vials.length > 0 ? \"use-existing\" : \"open-new\";\n setVaccineDialog((d) => ({\n ...d,\n ownerType: next.ownerType,\n ownerId: next.ownerId ?? \"\",\n personalSource: next.personalSource ?? \"\",\n mode: nextMode,\n vialCandidates: filtered.vials,\n batchCandidates: filtered.batches,\n selectedVialId: filtered.vials[0]?.id ?? \"\",\n selectedBatchId: filtered.batches[0]?.id ?? \"\",\n volumeMl:\n nextMode === \"use-existing\"\n ? filtered.vials[0]?.adultDoseMl ?? cfg?.adultDoseMl ?? \"\"\n : cfg?.adultDoseMl ?? \"\",\n }));\n }\n\n function switchMode(nextMode) {\n setVaccineDialog((d) => ({ ...d, mode: nextMode }));\n }\n\n const vaccineSelectedVial = vaccineDialog.vialCandidates.find(\n (v) => v.id === vaccineDialog.selectedVialId,\n );\n const vaccineSelectedBatch = vaccineDialog.batchCandidates.find(\n (b) => b.id === vaccineDialog.selectedBatchId,\n );\n const vaccineSelectedProduct = products.find(\n (p) => p.id === vaccineDialog.productId,\n );\n const vaccineCfg = vaccineSelectedProduct?.vaccineConfig;\n\n const vaccineErrors = (() => {\n if (vaccineDialog.step === \"product\") {\n return {\n productId: validateRequired(vaccineDialog.productId, \"Vaccine\"),\n };\n }\n const errs = {\n ownerType: validateRequired(vaccineDialog.ownerType, \"Source\"),\n volumeMl: validatePositiveNumber(vaccineDialog.volumeMl, \"Volume\", {\n required: true,\n }),\n };\n if (vaccineDialog.mode === \"use-existing\") {\n errs.selectedVialId = validateRequired(\n vaccineDialog.selectedVialId,\n \"Vial\",\n );\n if (!errs.volumeMl && vaccineSelectedVial) {\n const vol = Number(vaccineDialog.volumeMl);\n const remaining = Number(vaccineSelectedVial.volumeRemainingMl);\n if (vol > remaining) {\n errs.volumeMl =\n vaccineDialog.batchCandidates.length > 0\n ? `Only ${remaining.toFixed(2)} ml remaining in this vial — open another vial instead.`\n : `Only ${remaining.toFixed(2)} ml remaining in this vial.`;\n }\n }\n } else {\n errs.selectedBatchId = validateRequired(\n vaccineDialog.selectedBatchId,\n \"Batch\",\n );\n if (!errs.volumeMl && vaccineCfg?.vialVolumeMl) {\n const vol = Number(vaccineDialog.volumeMl);\n const total = Number(vaccineCfg.vialVolumeMl);\n if (vol > total)\n errs.volumeMl = `A fresh vial holds ${total.toFixed(2)} ml`;\n }\n }\n return errs;\n })();\n\n const vaccineIsValid = isClean(vaccineErrors);\n\n function handleConfirm() {\n if (!vaccineIsValid) {\n vaccineFieldErrors.markAllTouched();\n return;\n }\n const result = {\n productId: vaccineDialog.productId,\n ownerType: vaccineDialog.ownerType,\n ownerId:\n vaccineDialog.ownerType === \"FACILITY\"\n ? vaccineDialog.ownerId || null\n : null,\n personalSource:\n vaccineDialog.ownerType === \"USER\"\n ? vaccineDialog.personalSource || null\n : null,\n volumeMl: Number(vaccineDialog.volumeMl),\n };\n if (vaccineDialog.mode === \"use-existing\") {\n result.openVialId = vaccineSelectedVial.id;\n result.batchId = vaccineSelectedVial.batchId;\n } else {\n result.batchId = vaccineSelectedBatch.id;\n result.openVialId = null;\n }\n onConfirm(result);\n }\n\n function handleBack() {\n setVaccineDialog((d) => ({\n ...d,\n step: \"product\",\n vialCandidates: [],\n batchCandidates: [],\n sources: [],\n }));\n }\n\n return (\n <Dialog open={open} onClose={onCancel} fullWidth maxWidth=\"md\">\n <DialogTitle>\n {vaccineDialog.step === \"product\"\n ? \"Administer Vaccine — Select Vaccine\"\n : vaccineDialog.mode === \"use-existing\"\n ? \"Administer Vaccine — Select Open Vial\"\n : \"Administer Vaccine — Open & Administer\"}\n </DialogTitle>\n <DialogContent dividers>\n {loadingMetadata ? <LinearProgress /> : null}\n\n {vaccineDialog.step === \"product\" ? (\n <Box sx={{ mt: 1 }}>\n {preselectedProductId && vaccineProducts.length === 0 ? (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n No PM product is linked to this vaccine. Administration cannot\n proceed.\n </Alert>\n ) : null}\n <PmSelect\n label=\"Vaccine\"\n required\n value={vaccineDialog.productId}\n onChange={(v) =>\n setVaccineDialog({ ...vaccineDialog, productId: v })\n }\n onBlur={vaccineFieldErrors.onBlur(\"productId\")}\n error={\n vaccineFieldErrors.show(\"productId\") &&\n !!vaccineErrors.productId\n }\n options={vaccineProducts.map((p) => ({\n value: p.id,\n label: `${p.name}${p.vaccineConfig?.vaccineCode ? ` · ${p.vaccineConfig.vaccineCode}` : \"\"}`,\n }))}\n noOptionsText=\"No active vaccine products\"\n helperText={\n vaccineFieldErrors.show(\"productId\") && vaccineErrors.productId\n ? vaccineErrors.productId\n : \"Open vials for this vaccine will be shown next. If none are open, a fresh vial can be opened on the same screen.\"\n }\n />\n </Box>\n ) : (\n <Stack spacing={2} sx={{ pt: 1 }}>\n {vaccineDialog.loading ? <LinearProgress /> : null}\n\n {vaccineDialog.sources.length === 0 ? (\n <Alert severity=\"warning\">\n No stock available for this vaccine — neither in your personal\n stock nor at an assigned facility.\n </Alert>\n ) : vaccineDialog.sources.length > 1 ? (\n <PmSelect\n label=\"Administer from\"\n required\n value={\n vaccineDialog.ownerType\n ? `${vaccineDialog.ownerType}::${vaccineDialog.ownerId ?? \"\"}::${vaccineDialog.personalSource ?? \"\"}`\n : \"\"\n }\n onChange={(v) => pickSource(v)}\n onBlur={vaccineFieldErrors.onBlur(\"ownerType\")}\n error={\n vaccineFieldErrors.show(\"ownerType\") &&\n !!vaccineErrors.ownerType\n }\n options={vaccineDialog.sources.map((s) => ({\n value: s.key,\n label: s.label,\n }))}\n helperText={\n vaccineFieldErrors.show(\"ownerType\") &&\n vaccineErrors.ownerType\n ? vaccineErrors.ownerType\n : \"Personal (outreach), personal (purchase) and facility stock are separate vial pools — pick which one this dose comes from.\"\n }\n />\n ) : (\n <Alert severity=\"info\">\n Administering from{\" \"}\n <strong>{vaccineDialog.sources[0]?.label}</strong>.\n </Alert>\n )}\n\n {vaccineDialog.ownerType === \"USER\" &&\n vaccineDialog.personalSource === \"OUTREACH\" &&\n openSessions[0] ? (\n <Box\n sx={{\n p: 1.5,\n borderRadius: 2,\n border: \"1px solid\",\n borderColor: \"divider\",\n bgcolor: (t) => t.palette.action.hover,\n }}\n >\n <Typography\n variant=\"overline\"\n sx={{\n fontWeight: 800,\n letterSpacing: 0.6,\n color: \"text.secondary\",\n }}\n >\n Outreach session\n </Typography>\n <Typography variant=\"body2\" sx={{ fontWeight: 800 }}>\n {openSessions[0].sessionName || \"—\"}\n </Typography>\n {openSessions[0].sessionSite ? (\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ display: \"block\" }}\n >\n Site: {openSessions[0].sessionSite}\n </Typography>\n ) : null}\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ display: \"block\" }}\n >\n {openSessions[0].sessionStartTime\n ? formatDateTime(openSessions[0].sessionStartTime)\n : \"—\"}\n {openSessions[0].sessionExpectedEndTime\n ? ` → ${formatDateTime(openSessions[0].sessionExpectedEndTime)}`\n : \"\"}\n </Typography>\n {openSessions[0].sessionDescription ? (\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ display: \"block\", mt: 0.5, whiteSpace: \"pre-wrap\" }}\n >\n {openSessions[0].sessionDescription}\n </Typography>\n ) : null}\n </Box>\n ) : null}\n\n {vaccineDialog.mode === \"use-existing\" ? (\n <>\n {!vaccineDialog.ownerType ? (\n <Alert severity=\"info\">\n Pick an administration source above to see the available\n open vials.\n </Alert>\n ) : (\n (() => {\n const vol = Number(vaccineDialog.volumeMl);\n const validVol = !Number.isNaN(vol) && vol > 0;\n const someVialFits =\n validVol &&\n vaccineDialog.vialCandidates.some(\n (v) => Number(v.volumeRemainingMl) >= vol,\n );\n return (\n <Alert\n severity=\"info\"\n action={\n someVialFits ? null : (\n <Button\n color=\"inherit\"\n size=\"small\"\n onClick={() => switchMode(\"open-new\")}\n >\n Open another vial instead\n </Button>\n )\n }\n >\n {someVialFits\n ? \"Pick an open vial — earliest-expiry-first is preselected. An existing vial can hold the requested dose, so no new vial is needed.\"\n : \"Pick an open vial — earliest-expiry-first is preselected. The requested dose does not fit in any open vial; you can open another vial from stock.\"}\n </Alert>\n );\n })()\n )}\n <TableContainer>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell />\n <TableCell sx={{ fontWeight: 800 }}>Lot</TableCell>\n <TableCell sx={{ fontWeight: 800 }}>\n Vial expires\n </TableCell>\n <TableCell sx={{ fontWeight: 800 }}>\n Batch expires\n </TableCell>\n <TableCell sx={{ fontWeight: 800 }} align=\"right\">\n Remaining (ml)\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {vaccineDialog.vialCandidates.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={5}\n sx={{ py: 4, textAlign: \"center\" }}\n >\n <Stack alignItems=\"center\" spacing={1}>\n <VaccinesRoundedIcon\n sx={{\n fontSize: 36,\n color: \"text.disabled\",\n opacity: 0.7,\n }}\n />\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 700 }}\n >\n No usable open vials for this vaccine\n </Typography>\n {vaccineDialog.batchCandidates.length > 0 ? (\n <Button\n size=\"small\"\n variant=\"outlined\"\n onClick={() => switchMode(\"open-new\")}\n >\n Open a new vial instead\n </Button>\n ) : (\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n >\n No stock available either — receive a purchase\n first.\n </Typography>\n )}\n </Stack>\n </TableCell>\n </TableRow>\n ) : (\n vaccineDialog.vialCandidates.map((v, idx) => {\n const selected =\n vaccineDialog.selectedVialId === v.id;\n return (\n <TableRow\n key={v.id}\n hover\n selected={selected}\n onClick={() =>\n setVaccineDialog({\n ...vaccineDialog,\n selectedVialId: v.id,\n volumeMl:\n v.adultDoseMl ?? vaccineDialog.volumeMl,\n })\n }\n sx={{ cursor: \"pointer\" }}\n >\n <TableCell padding=\"checkbox\">\n <Radio checked={selected} />\n </TableCell>\n <TableCell sx={{ fontFamily: \"monospace\" }}>\n {v.lotNumber || \"—\"}\n {idx === 0 ? (\n <Chip\n size=\"small\"\n color=\"primary\"\n label=\"Use first\"\n sx={{ ml: 1 }}\n />\n ) : null}\n </TableCell>\n <TableCell>{formatDateTime(v.expiresAt)}</TableCell>\n <TableCell>\n {v.batchExpiryDate\n ? formatDate(v.batchExpiryDate)\n : \"—\"}\n </TableCell>\n <TableCell\n align=\"right\"\n sx={{ fontWeight: 700 }}\n >\n {formatNumber(v.volumeRemainingMl)} /{\" \"}\n {formatNumber(v.volumeTotalMl)}\n </TableCell>\n </TableRow>\n );\n })\n )}\n </TableBody>\n </Table>\n </TableContainer>\n </>\n ) : (\n <>\n {!vaccineDialog.ownerType ? (\n <Alert severity=\"info\">\n Pick an administration source above to see the available\n batches.\n </Alert>\n ) : vaccineDialog.batchCandidates.length === 0 ? (\n <Alert\n severity=\"error\"\n action={\n vaccineDialog.vialCandidates.length > 0 ? (\n <Button\n color=\"inherit\"\n size=\"small\"\n onClick={() => switchMode(\"use-existing\")}\n >\n Use an open vial\n </Button>\n ) : null\n }\n >\n No batches available — every batch is either out of stock,\n expired, or already at the maximum concurrent open vials.\n Receive a purchase or finish the open vials first.\n </Alert>\n ) : (\n <>\n <Alert\n severity=\"warning\"\n action={\n vaccineDialog.vialCandidates.length > 0 ? (\n <Button\n color=\"inherit\"\n size=\"small\"\n onClick={() => switchMode(\"use-existing\")}\n >\n Use an open vial instead\n </Button>\n ) : null\n }\n >\n {vaccineDialog.vialCandidates.length > 0\n ? \"Opening a new vial from stock. Existing open vials are still available if the dose fits.\"\n : \"No open vials for this vaccine. A new vial will be opened from the selected batch and the dose recorded in one step.\"}\n </Alert>\n <TableContainer>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell />\n <TableCell sx={{ fontWeight: 800 }}>Lot</TableCell>\n <TableCell sx={{ fontWeight: 800 }}>\n Batch expires\n </TableCell>\n <TableCell sx={{ fontWeight: 800 }} align=\"right\">\n Qty available\n </TableCell>\n <TableCell sx={{ fontWeight: 800 }}>\n Storage\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {vaccineDialog.batchCandidates.map((b, idx) => {\n const selected =\n vaccineDialog.selectedBatchId === b.id;\n return (\n <TableRow\n key={b.id}\n hover\n selected={selected}\n onClick={() =>\n setVaccineDialog({\n ...vaccineDialog,\n selectedBatchId: b.id,\n })\n }\n sx={{ cursor: \"pointer\" }}\n >\n <TableCell padding=\"checkbox\">\n <Radio checked={selected} />\n </TableCell>\n <TableCell sx={{ fontFamily: \"monospace\" }}>\n {b.lotNumber || \"—\"}\n {idx === 0 ? (\n <Chip\n size=\"small\"\n color=\"primary\"\n label=\"Use first\"\n sx={{ ml: 1 }}\n />\n ) : null}\n </TableCell>\n <TableCell>\n {b.expiryDate ? formatDate(b.expiryDate) : \"—\"}\n </TableCell>\n <TableCell\n align=\"right\"\n sx={{ fontWeight: 700 }}\n >\n {b.qtyRemaining}\n </TableCell>\n <TableCell>{b.storageUnitName || \"—\"}</TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </TableContainer>\n </>\n )}\n </>\n )}\n\n {(vaccineDialog.mode === \"use-existing\" && vaccineSelectedVial) ||\n (vaccineDialog.mode === \"open-new\" && vaccineSelectedBatch) ? (\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n flexWrap=\"wrap\"\n >\n {vaccineDialog.mode === \"use-existing\" ? (\n <>\n {vaccineSelectedVial.adultDoseMl ? (\n <Button\n size=\"small\"\n onClick={() =>\n setVaccineDialog({\n ...vaccineDialog,\n volumeMl: vaccineSelectedVial.adultDoseMl,\n })\n }\n >\n Adult dose ({vaccineSelectedVial.adultDoseMl} ml)\n </Button>\n ) : null}\n {vaccineSelectedVial.childDoseMl ? (\n <Button\n size=\"small\"\n onClick={() =>\n setVaccineDialog({\n ...vaccineDialog,\n volumeMl: vaccineSelectedVial.childDoseMl,\n })\n }\n >\n Child dose ({vaccineSelectedVial.childDoseMl} ml)\n </Button>\n ) : null}\n </>\n ) : (\n <>\n {vaccineCfg?.adultDoseMl ? (\n <Button\n size=\"small\"\n onClick={() =>\n setVaccineDialog({\n ...vaccineDialog,\n volumeMl: vaccineCfg.adultDoseMl,\n })\n }\n >\n Adult dose ({vaccineCfg.adultDoseMl} ml)\n </Button>\n ) : null}\n {vaccineCfg?.childDoseMl ? (\n <Button\n size=\"small\"\n onClick={() =>\n setVaccineDialog({\n ...vaccineDialog,\n volumeMl: vaccineCfg.childDoseMl,\n })\n }\n >\n Child dose ({vaccineCfg.childDoseMl} ml)\n </Button>\n ) : null}\n </>\n )}\n <TextField\n required\n label=\"Volume (ml)\"\n size=\"small\"\n type=\"number\"\n inputProps={{\n step: \"0.01\",\n min: 0,\n max:\n vaccineDialog.mode === \"use-existing\"\n ? vaccineSelectedVial?.volumeRemainingMl\n : vaccineCfg?.vialVolumeMl,\n }}\n value={vaccineDialog.volumeMl}\n onChange={(e) =>\n setVaccineDialog({\n ...vaccineDialog,\n volumeMl: e.target.value,\n })\n }\n onBlur={vaccineFieldErrors.onBlur(\"volumeMl\")}\n error={\n vaccineFieldErrors.show(\"volumeMl\") &&\n !!vaccineErrors.volumeMl\n }\n helperText={\n vaccineFieldErrors.show(\"volumeMl\")\n ? vaccineErrors.volumeMl\n : \"\"\n }\n />\n </Stack>\n ) : null}\n </Stack>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onCancel}>Cancel</Button>\n {vaccineDialog.step === \"select\" ? (\n <Button onClick={handleBack}>Back</Button>\n ) : null}\n {vaccineDialog.step === \"product\" ? (\n <Button\n variant=\"contained\"\n disabled={\n !vaccineDialog.productId ||\n vaccineDialog.loading ||\n (preselectedProductId && vaccineProducts.length === 0)\n }\n onClick={() => void proceedFromProductStep()}\n >\n Next\n </Button>\n ) : (\n <Button\n variant=\"contained\"\n disabled={!vaccineIsValid || vaccineDialog.loading}\n onClick={handleConfirm}\n >\n {vaccineDialog.mode === \"use-existing\"\n ? \"Administer\"\n : \"Open & Administer\"}\n </Button>\n )}\n </DialogActions>\n </Dialog>\n );\n}\n\nProductAdministrationDialog.propTypes = {\n open: PropTypes.bool.isRequired,\n preselectedProductId: PropTypes.string,\n onConfirm: PropTypes.func.isRequired,\n onCancel: PropTypes.func.isRequired,\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import { useEffect as e, useState as t } from "react";
|
|
2
|
+
import { api as n } from "@/common/interceptors/AxiosInterceptor";
|
|
3
|
+
import { execute as r } from "@/common/services/QueryBuilder.js";
|
|
4
|
+
import { currencyCodeForCountry as i } from "@/common/constants/countries";
|
|
5
|
+
//#region src/services/pmApi.js
|
|
6
|
+
var a = "/pm";
|
|
7
|
+
async function o() {
|
|
8
|
+
return (await n.get(`${a}/settings`)).data;
|
|
9
|
+
}
|
|
10
|
+
async function ee(e) {
|
|
11
|
+
return (await n.put(`${a}/settings`, e)).data;
|
|
12
|
+
}
|
|
13
|
+
async function te() {
|
|
14
|
+
return (await n.get(`${a}/settings/tables`)).data ?? [];
|
|
15
|
+
}
|
|
16
|
+
async function ne(e) {
|
|
17
|
+
return (await n.get(`${a}/settings/tables/${encodeURIComponent(e)}/uuid-columns`)).data ?? [];
|
|
18
|
+
}
|
|
19
|
+
async function re(e) {
|
|
20
|
+
return (await n.get(`${a}/settings/tables/${encodeURIComponent(e)}/text-columns`)).data ?? [];
|
|
21
|
+
}
|
|
22
|
+
async function ie(e) {
|
|
23
|
+
return (await n.get(`${a}/settings/tables/${encodeURIComponent(e)}/date-columns`)).data ?? [];
|
|
24
|
+
}
|
|
25
|
+
async function ae() {
|
|
26
|
+
return ((await r({
|
|
27
|
+
code: "FETCH_IMMUNISATION_MASTER",
|
|
28
|
+
parameters: {}
|
|
29
|
+
}, { showLoader: !1 }))?.data?.result ?? []).map((e) => ({
|
|
30
|
+
id: e.id,
|
|
31
|
+
vaccineCode: e.vaccine_code,
|
|
32
|
+
vaccineName: e.vaccine_name
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
async function s(e, t = !1) {
|
|
36
|
+
let r = {};
|
|
37
|
+
return e && (r.lastModifiedDate = e), t && (r.includeInactive = !0), (await n.get(`${a}/categories`, { params: r })).data ?? [];
|
|
38
|
+
}
|
|
39
|
+
async function c(e) {
|
|
40
|
+
return (await n.post(`${a}/categories`, e)).data;
|
|
41
|
+
}
|
|
42
|
+
async function l(e, t = !1) {
|
|
43
|
+
let r = {};
|
|
44
|
+
return e && (r.lastModifiedDate = e), t && (r.includeInactive = !0), (await n.get(`${a}/brands`, { params: r })).data ?? [];
|
|
45
|
+
}
|
|
46
|
+
async function u(e) {
|
|
47
|
+
return (await n.post(`${a}/brands`, e)).data;
|
|
48
|
+
}
|
|
49
|
+
async function d(e, t = !1) {
|
|
50
|
+
let r = {};
|
|
51
|
+
return e && (r.lastModifiedDate = e), t && (r.includeInactive = !0), (await n.get(`${a}/products`, { params: r })).data ?? [];
|
|
52
|
+
}
|
|
53
|
+
async function f(e) {
|
|
54
|
+
return (await n.get(`${a}/products/${e}`)).data;
|
|
55
|
+
}
|
|
56
|
+
async function p(e) {
|
|
57
|
+
return (await n.post(`${a}/products`, e)).data;
|
|
58
|
+
}
|
|
59
|
+
async function m({ facilityId: e, activeOnly: t = !1 } = {}) {
|
|
60
|
+
let r = { activeOnly: t };
|
|
61
|
+
return e && (r.facilityId = e), (await n.get(`${a}/storage-units`, { params: r })).data ?? [];
|
|
62
|
+
}
|
|
63
|
+
async function h(e) {
|
|
64
|
+
return (await n.post(`${a}/storage-units`, e)).data;
|
|
65
|
+
}
|
|
66
|
+
async function g() {
|
|
67
|
+
return (await n.get(`${a}/facilities`)).data ?? [];
|
|
68
|
+
}
|
|
69
|
+
async function _(e) {
|
|
70
|
+
let t = (e ?? []).filter(Boolean);
|
|
71
|
+
return t.length === 0 ? [] : (await n.get(`${a}/facilities/by-ids`, { params: { ids: t.join(",") } })).data ?? [];
|
|
72
|
+
}
|
|
73
|
+
async function v(e) {
|
|
74
|
+
if (!e) return null;
|
|
75
|
+
try {
|
|
76
|
+
return (await n.get(`${a}/members/${e}`)).data ?? null;
|
|
77
|
+
} catch (e) {
|
|
78
|
+
if (e?.response?.status === 404) return null;
|
|
79
|
+
throw e;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function y(e) {
|
|
83
|
+
let t = (e ?? []).filter(Boolean);
|
|
84
|
+
return t.length === 0 ? [] : (await n.get(`${a}/members/by-ids`, { params: { ids: t.join(",") } })).data ?? [];
|
|
85
|
+
}
|
|
86
|
+
async function b() {
|
|
87
|
+
return (await n.get(`${a}/inventory/dues/by-member`)).data ?? [];
|
|
88
|
+
}
|
|
89
|
+
async function x(e) {
|
|
90
|
+
return (await n.get(`${a}/inventory/dues/by-member/${e}`)).data;
|
|
91
|
+
}
|
|
92
|
+
async function S() {
|
|
93
|
+
return (await n.get(`${a}/inventory/batches`)).data ?? [];
|
|
94
|
+
}
|
|
95
|
+
async function C() {
|
|
96
|
+
return (await n.get(`${a}/inventory/vials/open`)).data ?? [];
|
|
97
|
+
}
|
|
98
|
+
async function w(e) {
|
|
99
|
+
return (await n.get(`${a}/inventory/vials/by-product/${e}`)).data ?? [];
|
|
100
|
+
}
|
|
101
|
+
async function T(e = 0, t = 25) {
|
|
102
|
+
return (await n.get(`${a}/inventory/purchases`, { params: {
|
|
103
|
+
page: e,
|
|
104
|
+
size: t
|
|
105
|
+
} })).data ?? [];
|
|
106
|
+
}
|
|
107
|
+
async function E(e = 0, t = 25) {
|
|
108
|
+
return (await n.get(`${a}/inventory/sales`, { params: {
|
|
109
|
+
page: e,
|
|
110
|
+
size: t
|
|
111
|
+
} })).data ?? [];
|
|
112
|
+
}
|
|
113
|
+
async function D(e = 0, t = 25) {
|
|
114
|
+
return (await n.get(`${a}/inventory/payments`, { params: {
|
|
115
|
+
page: e,
|
|
116
|
+
size: t
|
|
117
|
+
} })).data ?? [];
|
|
118
|
+
}
|
|
119
|
+
async function O(e = 0, t = 50) {
|
|
120
|
+
return (await n.get(`${a}/inventory/transactions`, { params: {
|
|
121
|
+
page: e,
|
|
122
|
+
size: t
|
|
123
|
+
} })).data?.content ?? [];
|
|
124
|
+
}
|
|
125
|
+
async function k(e = {}) {
|
|
126
|
+
let { types: t, ...r } = e;
|
|
127
|
+
return (await n.get(`${a}/inventory/transactions`, {
|
|
128
|
+
params: {
|
|
129
|
+
...r,
|
|
130
|
+
types: Array.isArray(t) ? t : void 0
|
|
131
|
+
},
|
|
132
|
+
paramsSerializer: { serialize: (e) => {
|
|
133
|
+
let t = new URLSearchParams();
|
|
134
|
+
return Object.entries(e).forEach(([e, n]) => {
|
|
135
|
+
n == null || n === "" || (Array.isArray(n) ? n.forEach((n) => t.append(e, n)) : t.append(e, n));
|
|
136
|
+
}), t.toString();
|
|
137
|
+
} }
|
|
138
|
+
})).data ?? {
|
|
139
|
+
content: [],
|
|
140
|
+
totalElements: 0,
|
|
141
|
+
totalPages: 0,
|
|
142
|
+
page: 0,
|
|
143
|
+
size: 50
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
async function A(e) {
|
|
147
|
+
return (await n.post(`${a}/inventory/purchase`, e)).data;
|
|
148
|
+
}
|
|
149
|
+
async function oe(e) {
|
|
150
|
+
return (await n.post(`${a}/inventory/transfer`, e)).data;
|
|
151
|
+
}
|
|
152
|
+
async function j(e, t) {
|
|
153
|
+
return (await n.post(`${a}/inventory/transfer/${e}/confirm`, t ?? {})).data;
|
|
154
|
+
}
|
|
155
|
+
async function M(e, t) {
|
|
156
|
+
return (await n.post(`${a}/inventory/transfer/${e}/cancel`, t ?? {})).data;
|
|
157
|
+
}
|
|
158
|
+
async function N() {
|
|
159
|
+
return (await n.get(`${a}/inventory/transfers`)).data ?? [];
|
|
160
|
+
}
|
|
161
|
+
async function P(e) {
|
|
162
|
+
return (await n.post(`${a}/inventory/pickup`, e)).data;
|
|
163
|
+
}
|
|
164
|
+
async function F(e, t) {
|
|
165
|
+
return (await n.post(`${a}/inventory/pickup/${e}/return`, t)).data;
|
|
166
|
+
}
|
|
167
|
+
async function I(e, t) {
|
|
168
|
+
return (await n.post(`${a}/inventory/pickup/${e}/topup`, t)).data;
|
|
169
|
+
}
|
|
170
|
+
async function L() {
|
|
171
|
+
return (await n.get(`${a}/inventory/pickups`)).data ?? [];
|
|
172
|
+
}
|
|
173
|
+
async function R() {
|
|
174
|
+
return (await n.get(`${a}/inventory/pickups/mine/open`)).data ?? [];
|
|
175
|
+
}
|
|
176
|
+
async function z(e) {
|
|
177
|
+
return (await n.post(`${a}/inventory/purchase-request`, e)).data;
|
|
178
|
+
}
|
|
179
|
+
async function B() {
|
|
180
|
+
return (await n.get(`${a}/inventory/purchase-requests/mine`)).data ?? [];
|
|
181
|
+
}
|
|
182
|
+
async function V() {
|
|
183
|
+
return (await n.get(`${a}/inventory/purchase-requests/pending`)).data ?? [];
|
|
184
|
+
}
|
|
185
|
+
async function H(e) {
|
|
186
|
+
return (await n.get(`${a}/inventory/purchase-requests/${e}`)).data;
|
|
187
|
+
}
|
|
188
|
+
async function U(e, t) {
|
|
189
|
+
return (await n.post(`${a}/inventory/purchase-request/${e}/decision`, t)).data;
|
|
190
|
+
}
|
|
191
|
+
async function W(e) {
|
|
192
|
+
return (await n.post(`${a}/inventory/purchase-request/${e}/cancel`)).data;
|
|
193
|
+
}
|
|
194
|
+
async function G(e) {
|
|
195
|
+
return (await n.post(`${a}/inventory/sale`, e)).data;
|
|
196
|
+
}
|
|
197
|
+
async function K(e) {
|
|
198
|
+
return (await n.post(`${a}/inventory/payment`, e)).data;
|
|
199
|
+
}
|
|
200
|
+
async function q(e) {
|
|
201
|
+
return (await n.post(`${a}/inventory/vial/close`, e)).data;
|
|
202
|
+
}
|
|
203
|
+
async function se(e) {
|
|
204
|
+
return (await n.post(`${a}/inventory/batch/quarantine`, e)).data;
|
|
205
|
+
}
|
|
206
|
+
async function ce(e) {
|
|
207
|
+
return (await n.post(`${a}/inventory/batch/unquarantine`, e)).data;
|
|
208
|
+
}
|
|
209
|
+
var le = Object.fromEntries([
|
|
210
|
+
{
|
|
211
|
+
code: "INR",
|
|
212
|
+
symbol: "₹",
|
|
213
|
+
name: "Indian Rupee"
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
code: "USD",
|
|
217
|
+
symbol: "$",
|
|
218
|
+
name: "US Dollar"
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
code: "EUR",
|
|
222
|
+
symbol: "€",
|
|
223
|
+
name: "Euro"
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
code: "GBP",
|
|
227
|
+
symbol: "£",
|
|
228
|
+
name: "British Pound"
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
code: "JPY",
|
|
232
|
+
symbol: "¥",
|
|
233
|
+
name: "Japanese Yen"
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
code: "CNY",
|
|
237
|
+
symbol: "¥",
|
|
238
|
+
name: "Chinese Yuan"
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
code: "KRW",
|
|
242
|
+
symbol: "₩",
|
|
243
|
+
name: "South Korean Won"
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
code: "THB",
|
|
247
|
+
symbol: "฿",
|
|
248
|
+
name: "Thai Baht"
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
code: "VND",
|
|
252
|
+
symbol: "₫",
|
|
253
|
+
name: "Vietnamese Dong"
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
code: "NGN",
|
|
257
|
+
symbol: "₦",
|
|
258
|
+
name: "Nigerian Naira"
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
code: "BDT",
|
|
262
|
+
symbol: "৳",
|
|
263
|
+
name: "Bangladeshi Taka"
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
code: "PKR",
|
|
267
|
+
symbol: "₨",
|
|
268
|
+
name: "Pakistani Rupee"
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
code: "LKR",
|
|
272
|
+
symbol: "₨",
|
|
273
|
+
name: "Sri Lankan Rupee"
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
code: "NPR",
|
|
277
|
+
symbol: "₨",
|
|
278
|
+
name: "Nepalese Rupee"
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
code: "AUD",
|
|
282
|
+
symbol: "A$",
|
|
283
|
+
name: "Australian Dollar"
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
code: "CAD",
|
|
287
|
+
symbol: "C$",
|
|
288
|
+
name: "Canadian Dollar"
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
code: "CHF",
|
|
292
|
+
symbol: "Fr",
|
|
293
|
+
name: "Swiss Franc"
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
code: "SGD",
|
|
297
|
+
symbol: "S$",
|
|
298
|
+
name: "Singapore Dollar"
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
code: "HKD",
|
|
302
|
+
symbol: "HK$",
|
|
303
|
+
name: "Hong Kong Dollar"
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
code: "MYR",
|
|
307
|
+
symbol: "RM",
|
|
308
|
+
name: "Malaysian Ringgit"
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
code: "AED",
|
|
312
|
+
symbol: "د.إ",
|
|
313
|
+
name: "UAE Dirham"
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
code: "SAR",
|
|
317
|
+
symbol: "﷼",
|
|
318
|
+
name: "Saudi Riyal"
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
code: "ZAR",
|
|
322
|
+
symbol: "R",
|
|
323
|
+
name: "South African Rand"
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
code: "BRL",
|
|
327
|
+
symbol: "R$",
|
|
328
|
+
name: "Brazilian Real"
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
code: "MXN",
|
|
332
|
+
symbol: "MX$",
|
|
333
|
+
name: "Mexican Peso"
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
code: "KES",
|
|
337
|
+
symbol: "KSh",
|
|
338
|
+
name: "Kenyan Shilling"
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
code: "GHS",
|
|
342
|
+
symbol: "GH₵",
|
|
343
|
+
name: "Ghanaian Cedi"
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
code: "EGP",
|
|
347
|
+
symbol: "E£",
|
|
348
|
+
name: "Egyptian Pound"
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
code: "PHP",
|
|
352
|
+
symbol: "₱",
|
|
353
|
+
name: "Philippine Peso"
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
code: "IDR",
|
|
357
|
+
symbol: "Rp",
|
|
358
|
+
name: "Indonesian Rupiah"
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
code: "TRY",
|
|
362
|
+
symbol: "₺",
|
|
363
|
+
name: "Turkish Lira"
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
code: "RUB",
|
|
367
|
+
symbol: "₽",
|
|
368
|
+
name: "Russian Ruble"
|
|
369
|
+
}
|
|
370
|
+
].map((e) => [e.code, e]));
|
|
371
|
+
function ue(e) {
|
|
372
|
+
return e ? le[e]?.symbol ?? e : "₹";
|
|
373
|
+
}
|
|
374
|
+
//#endregion
|
|
375
|
+
//#region src/utils/settingsStore.js
|
|
376
|
+
var de = {
|
|
377
|
+
memberTableName: null,
|
|
378
|
+
memberIdColumn: null,
|
|
379
|
+
memberIdentifierColumn: null,
|
|
380
|
+
memberFamilyIdColumn: null,
|
|
381
|
+
memberNameColumn: null,
|
|
382
|
+
memberDobColumn: null,
|
|
383
|
+
countryCode: "IN",
|
|
384
|
+
currencyCode: "INR",
|
|
385
|
+
managePurchaseAmounts: !0,
|
|
386
|
+
manageSales: !0,
|
|
387
|
+
allowPersonalPurchase: !0,
|
|
388
|
+
requirePurchaseConfirmation: !1
|
|
389
|
+
}, J = null, Y = null, X = /* @__PURE__ */ new Set();
|
|
390
|
+
function Z(e) {
|
|
391
|
+
let t = {
|
|
392
|
+
...de,
|
|
393
|
+
...e ?? {}
|
|
394
|
+
};
|
|
395
|
+
return t.currencyCode = i(t.countryCode), t.managePurchaseAmounts = t.managePurchaseAmounts !== !1, t.manageSales = t.manageSales !== !1, t.allowPersonalPurchase = t.allowPersonalPurchase !== !1, t.requirePurchaseConfirmation = t.requirePurchaseConfirmation === !0, t;
|
|
396
|
+
}
|
|
397
|
+
function Q() {
|
|
398
|
+
X.forEach((e) => e(J));
|
|
399
|
+
}
|
|
400
|
+
async function $(e = !1) {
|
|
401
|
+
return !e && J ? J : (!e && Y || (Y = o().then((e) => (J = Z(e), Y = null, Q(), J)).catch((e) => {
|
|
402
|
+
throw Y = null, J || (J = Z(null), Q()), e;
|
|
403
|
+
})), Y);
|
|
404
|
+
}
|
|
405
|
+
function fe(e) {
|
|
406
|
+
J = Z(e), Q();
|
|
407
|
+
}
|
|
408
|
+
function pe() {
|
|
409
|
+
let [n, r] = t(J ?? Z(null));
|
|
410
|
+
return e(() => (X.add(r), !J && !Y ? $().catch(() => {}) : J && r(J), () => {
|
|
411
|
+
X.delete(r);
|
|
412
|
+
}), []), n;
|
|
413
|
+
}
|
|
414
|
+
//#endregion
|
|
415
|
+
export { p as $, B as A, N as B, H as C, ie as D, S as E, te as F, P as G, w as H, T as I, oe as J, F as K, E as L, D as M, V as N, g as O, L as P, c as Q, re as R, d as S, m as T, se as U, ne as V, k as W, ce as X, z as Y, u as Z, x as _, W as a, y as b, j as c, G as d, ee as et, U as f, ae as g, _ as h, ue as i, C as j, R as k, K as l, s as m, fe as n, M as o, l as p, I as q, pe as r, q as s, $ as t, h as tt, A as u, b as v, o as w, f as x, v as y, O as z };
|
|
416
|
+
|
|
417
|
+
//# sourceMappingURL=settingsStore-KW217unV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settingsStore-KW217unV.js","names":[],"sources":["../src/services/pmApi.js","../src/utils/currency.js","../src/utils/settingsStore.js"],"sourcesContent":["import { api } from \"@/common/interceptors/AxiosInterceptor\";\nimport { execute } from \"@/common/services/QueryBuilder.js\";\n\nconst BASE = \"/pm\";\n\n// ---------- Module settings (subject mappings + currency) ----------\nexport async function getSettings() {\n const response = await api.get(`${BASE}/settings`);\n return response.data;\n}\n\nexport async function upsertSettings(payload) {\n const response = await api.put(`${BASE}/settings`, payload);\n return response.data;\n}\n\nexport async function listPublicTables() {\n const response = await api.get(`${BASE}/settings/tables`);\n return response.data ?? [];\n}\n\nexport async function listUuidColumns(tableName) {\n const response = await api.get(\n `${BASE}/settings/tables/${encodeURIComponent(tableName)}/uuid-columns`,\n );\n return response.data ?? [];\n}\n\nexport async function listTextColumns(tableName) {\n const response = await api.get(\n `${BASE}/settings/tables/${encodeURIComponent(tableName)}/text-columns`,\n );\n return response.data ?? [];\n}\n\nexport async function listDateColumns(tableName) {\n const response = await api.get(\n `${BASE}/settings/tables/${encodeURIComponent(tableName)}/date-columns`,\n );\n return response.data ?? [];\n}\n\n// ---------- Reference data (from medplat shared query master) ----------\n// Returns rows from medplat_immunization_master via the FETCH_IMMUNISATION_MASTER query.\n// Each row carries id, vaccine_name, vaccine_code, etc. We expose only what the\n// product-management UI needs.\nexport async function getImmunizationMaster() {\n const response = await execute(\n { code: \"FETCH_IMMUNISATION_MASTER\", parameters: {} },\n { showLoader: false },\n );\n const rows = response?.data?.result ?? [];\n return rows.map((row) => ({\n id: row.id,\n vaccineCode: row.vaccine_code,\n vaccineName: row.vaccine_name,\n }));\n}\n\n// ---------- Categories ----------\n// `includeInactive` is for management screens that need to see (and re-activate)\n// deactivated rows; dropdowns/pickers leave it false so they only show active.\nexport async function getCategories(lastModifiedDate, includeInactive = false) {\n const params = {};\n if (lastModifiedDate) params.lastModifiedDate = lastModifiedDate;\n if (includeInactive) params.includeInactive = true;\n const response = await api.get(`${BASE}/categories`, { params });\n return response.data ?? [];\n}\n\nexport async function upsertCategory(payload) {\n const response = await api.post(`${BASE}/categories`, payload);\n return response.data;\n}\n\n// ---------- Brands ----------\nexport async function getBrands(lastModifiedDate, includeInactive = false) {\n const params = {};\n if (lastModifiedDate) params.lastModifiedDate = lastModifiedDate;\n if (includeInactive) params.includeInactive = true;\n const response = await api.get(`${BASE}/brands`, { params });\n return response.data ?? [];\n}\n\nexport async function upsertBrand(payload) {\n const response = await api.post(`${BASE}/brands`, payload);\n return response.data;\n}\n\n// ---------- Products ----------\nexport async function getProducts(lastModifiedDate, includeInactive = false) {\n const params = {};\n if (lastModifiedDate) params.lastModifiedDate = lastModifiedDate;\n if (includeInactive) params.includeInactive = true;\n const response = await api.get(`${BASE}/products`, { params });\n return response.data ?? [];\n}\n\nexport async function getProduct(productId) {\n const response = await api.get(`${BASE}/products/${productId}`);\n return response.data;\n}\n\nexport async function upsertProduct(payload) {\n const response = await api.post(`${BASE}/products`, payload);\n return response.data;\n}\n\n// ---------- Storage Units ----------\nexport async function getStorageUnits({ facilityId, activeOnly = false } = {}) {\n const params = { activeOnly };\n if (facilityId) params.facilityId = facilityId;\n const response = await api.get(`${BASE}/storage-units`, { params });\n return response.data ?? [];\n}\n\nexport async function upsertStorageUnit(payload) {\n const response = await api.post(`${BASE}/storage-units`, payload);\n return response.data;\n}\n\n// ---------- Health facilities ----------\n// Scoped server-side to the current operator's assignments\n// (user_health_infrastructure JOIN health_infrastructure_details). The list\n// is small enough that the picker filters client-side — no q/limit.\nexport async function listFacilities() {\n const response = await api.get(`${BASE}/facilities`);\n return response.data ?? [];\n}\n\n// Bulk-hydrate facility names for a known set of ids. Used by list views\n// that already have saved ownerIds and just need to render display names\n// without pulling the full directory.\nexport async function getFacilitiesByIds(ids) {\n const list = (ids ?? []).filter(Boolean);\n if (list.length === 0) return [];\n const response = await api.get(`${BASE}/facilities/by-ids`, {\n params: { ids: list.join(\",\") },\n });\n return response.data ?? [];\n}\n\n// ---------- Members ----------\n// Sales/Payments pages receive the memberId via route param, so the API\n// surface is profile-by-id (rich card payload) + bulk-by-ids (display\n// names for list tables). No search endpoint — the picker is upstream.\n\n// Full member profile (identifier, family id, name, dob) for one member.\n// Returns null when the row doesn't exist or the mapping is incomplete.\nexport async function getMemberProfile(memberId) {\n if (!memberId) return null;\n try {\n const response = await api.get(`${BASE}/members/${memberId}`);\n return response.data ?? null;\n } catch (err) {\n if (err?.response?.status === 404) return null;\n throw err;\n }\n}\n\n// Bulk-hydrate display names for a known set of member ids. Used by list\n// views (sales / payments history) that already have memberIds and need\n// names.\nexport async function getMembersByIds(ids) {\n const list = (ids ?? []).filter(Boolean);\n if (list.length === 0) return [];\n const response = await api.get(`${BASE}/members/by-ids`, {\n params: { ids: list.join(\",\") },\n });\n return response.data ?? [];\n}\n\n// Per-member outstanding dues, aggregated from pm_sale.due_amount on the\n// backend. Returns [{ memberId, totalDue }]; only members with non-zero dues\n// are included.\nexport async function getMemberOutstandingDues() {\n const response = await api.get(`${BASE}/inventory/dues/by-member`);\n return response.data ?? [];\n}\n\n// Full dues details for one member: total, oldestDueDate, lastSaleDate, and\n// the open sales with item-level breakdown. Powers the Collect Payment screen.\nexport async function getMemberDuesDetails(memberId) {\n const response = await api.get(\n `${BASE}/inventory/dues/by-member/${memberId}`,\n );\n return response.data;\n}\n\n// ---------- Inventory (read) ----------\nexport async function getStockSnapshot(updatedSince) {\n const response = await api.get(`${BASE}/inventory/stock`, {\n params: updatedSince ? { updatedSince } : {},\n });\n return response.data;\n}\n\nexport async function listBatches() {\n const response = await api.get(`${BASE}/inventory/batches`);\n return response.data ?? [];\n}\n\nexport async function getBatch(batchId) {\n const response = await api.get(`${BASE}/inventory/batches/${batchId}`);\n return response.data;\n}\n\nexport async function listOpenVials() {\n const response = await api.get(`${BASE}/inventory/vials/open`);\n return response.data ?? [];\n}\n\nexport async function listVialsForProduct(productId) {\n const response = await api.get(\n `${BASE}/inventory/vials/by-product/${productId}`,\n );\n return response.data ?? [];\n}\n\nexport async function listPurchases(page = 0, size = 25) {\n const response = await api.get(`${BASE}/inventory/purchases`, {\n params: { page, size },\n });\n return response.data ?? [];\n}\n\nexport async function getPurchase(purchaseId) {\n const response = await api.get(`${BASE}/inventory/purchases/${purchaseId}`);\n return response.data;\n}\n\nexport async function listSales(page = 0, size = 25) {\n const response = await api.get(`${BASE}/inventory/sales`, {\n params: { page, size },\n });\n return response.data ?? [];\n}\n\nexport async function getSale(saleId) {\n const response = await api.get(`${BASE}/inventory/sales/${saleId}`);\n return response.data;\n}\n\nexport async function listPayments(page = 0, size = 25) {\n const response = await api.get(`${BASE}/inventory/payments`, {\n params: { page, size },\n });\n return response.data ?? [];\n}\n\nexport async function getPayment(paymentId) {\n const response = await api.get(`${BASE}/inventory/payments/${paymentId}`);\n return response.data;\n}\n\nexport async function listTransactions(page = 0, size = 50) {\n // Back-compat wrapper for places that only need the content array (e.g.\n // the Dashboard). New code should call queryTransactions for the full\n // PageResponse + filter support.\n const response = await api.get(`${BASE}/inventory/transactions`, {\n params: { page, size },\n });\n return response.data?.content ?? [];\n}\n\nexport async function queryTransactions(params = {}) {\n // `params` accepts: page, size, dateFrom, dateTo, types (array → joined),\n // productId, batchId, ownerType, ownerId, search.\n const { types, ...rest } = params;\n const response = await api.get(`${BASE}/inventory/transactions`, {\n params: {\n ...rest,\n // Spring binds repeated query params (types=A&types=B) onto List<String>\n types: Array.isArray(types) ? types : undefined,\n },\n // Repeat the key for each array entry (Spring's default binding).\n paramsSerializer: {\n serialize: (q) => {\n const sp = new URLSearchParams();\n Object.entries(q).forEach(([k, v]) => {\n if (v == null || v === \"\") return;\n if (Array.isArray(v)) v.forEach((item) => sp.append(k, item));\n else sp.append(k, v);\n });\n return sp.toString();\n },\n },\n });\n return (\n response.data ?? {\n content: [],\n totalElements: 0,\n totalPages: 0,\n page: 0,\n size: 50,\n }\n );\n}\n\nexport async function txnsForBatch(batchId) {\n const response = await api.get(\n `${BASE}/inventory/transactions/by-batch/${batchId}`,\n );\n return response.data ?? [];\n}\n\nexport async function txnsForVial(openVialId) {\n const response = await api.get(\n `${BASE}/inventory/transactions/by-vial/${openVialId}`,\n );\n return response.data ?? [];\n}\n\n// ---------- Inventory (commands) ----------\nexport async function createPurchase(payload) {\n const response = await api.post(`${BASE}/inventory/purchase`, payload);\n return response.data;\n}\n\n// ---------- Stock Transfers (facility → facility, two-step) ----------\nexport async function shipTransfer(payload) {\n const response = await api.post(`${BASE}/inventory/transfer`, payload);\n return response.data;\n}\n\nexport async function confirmTransfer(id, payload) {\n const response = await api.post(\n `${BASE}/inventory/transfer/${id}/confirm`,\n payload ?? {},\n );\n return response.data;\n}\n\nexport async function cancelTransfer(id, payload) {\n const response = await api.post(\n `${BASE}/inventory/transfer/${id}/cancel`,\n payload ?? {},\n );\n return response.data;\n}\n\nexport async function listTransfers() {\n const response = await api.get(`${BASE}/inventory/transfers`);\n return response.data ?? [];\n}\n\nexport async function getTransfer(id) {\n const response = await api.get(`${BASE}/inventory/transfers/${id}`);\n return response.data;\n}\n\n// ---------- Stock Pickups (user checks out facility stock + returns it) ----------\nexport async function recordPickup(payload) {\n const response = await api.post(`${BASE}/inventory/pickup`, payload);\n return response.data;\n}\n\nexport async function recordPickupReturn(id, payload) {\n const response = await api.post(\n `${BASE}/inventory/pickup/${id}/return`,\n payload,\n );\n return response.data;\n}\n\nexport async function recordPickupTopup(id, payload) {\n const response = await api.post(\n `${BASE}/inventory/pickup/${id}/topup`,\n payload,\n );\n return response.data;\n}\n\nexport async function cancelPickup(id, payload) {\n const response = await api.post(\n `${BASE}/inventory/pickup/${id}/cancel`,\n payload ?? {},\n );\n return response.data;\n}\n\nexport async function listPickups() {\n const response = await api.get(`${BASE}/inventory/pickups`);\n return response.data ?? [];\n}\n\nexport async function listMyOpenPickups() {\n const response = await api.get(`${BASE}/inventory/pickups/mine/open`);\n return response.data ?? [];\n}\n\nexport async function getPickup(id) {\n const response = await api.get(`${BASE}/inventory/pickups/${id}`);\n return response.data;\n}\n\n// ---------- Purchase Requests (approval workflow) ----------\nexport async function submitPurchaseRequest(payload) {\n const response = await api.post(\n `${BASE}/inventory/purchase-request`,\n payload,\n );\n return response.data;\n}\n\nexport async function listMyPurchaseRequests() {\n const response = await api.get(`${BASE}/inventory/purchase-requests/mine`);\n return response.data ?? [];\n}\n\nexport async function listPendingPurchaseRequests() {\n const response = await api.get(`${BASE}/inventory/purchase-requests/pending`);\n return response.data ?? [];\n}\n\nexport async function getPurchaseRequest(id) {\n const response = await api.get(`${BASE}/inventory/purchase-requests/${id}`);\n return response.data;\n}\n\nexport async function decidePurchaseRequest(id, payload) {\n const response = await api.post(\n `${BASE}/inventory/purchase-request/${id}/decision`,\n payload,\n );\n return response.data;\n}\n\nexport async function cancelPurchaseRequest(id) {\n const response = await api.post(\n `${BASE}/inventory/purchase-request/${id}/cancel`,\n );\n return response.data;\n}\n\nexport async function createSale(payload) {\n const response = await api.post(`${BASE}/inventory/sale`, payload);\n return response.data;\n}\n\nexport async function createPayment(payload) {\n const response = await api.post(`${BASE}/inventory/payment`, payload);\n return response.data;\n}\n\nexport async function openVial(payload) {\n const response = await api.post(`${BASE}/inventory/vial/open`, payload);\n return response.data;\n}\n\nexport async function administerDose(payload) {\n const response = await api.post(`${BASE}/inventory/vial/administer`, payload);\n return response.data;\n}\n\nexport async function closeVial(payload) {\n const response = await api.post(`${BASE}/inventory/vial/close`, payload);\n return response.data;\n}\n\nexport async function quarantineBatch(payload) {\n const response = await api.post(\n `${BASE}/inventory/batch/quarantine`,\n payload,\n );\n return response.data;\n}\n\nexport async function unquarantineBatch(payload) {\n const response = await api.post(\n `${BASE}/inventory/batch/unquarantine`,\n payload,\n );\n return response.data;\n}\n","// Curated list of currencies the operator can pick from when configuring the\n// module per deployment. Codes are ISO-4217; symbols match what shows up on\n// the local cash register / receipt rather than always falling back to the\n// ISO code. New deployments only need a row added here.\n\nexport const CURRENCY_OPTIONS = [\n { code: 'INR', symbol: '₹', name: 'Indian Rupee' },\n { code: 'USD', symbol: '$', name: 'US Dollar' },\n { code: 'EUR', symbol: '€', name: 'Euro' },\n { code: 'GBP', symbol: '£', name: 'British Pound' },\n { code: 'JPY', symbol: '¥', name: 'Japanese Yen' },\n { code: 'CNY', symbol: '¥', name: 'Chinese Yuan' },\n { code: 'KRW', symbol: '₩', name: 'South Korean Won' },\n { code: 'THB', symbol: '฿', name: 'Thai Baht' },\n { code: 'VND', symbol: '₫', name: 'Vietnamese Dong' },\n { code: 'NGN', symbol: '₦', name: 'Nigerian Naira' },\n { code: 'BDT', symbol: '৳', name: 'Bangladeshi Taka' },\n { code: 'PKR', symbol: '₨', name: 'Pakistani Rupee' },\n { code: 'LKR', symbol: '₨', name: 'Sri Lankan Rupee' },\n { code: 'NPR', symbol: '₨', name: 'Nepalese Rupee' },\n { code: 'AUD', symbol: 'A$', name: 'Australian Dollar' },\n { code: 'CAD', symbol: 'C$', name: 'Canadian Dollar' },\n { code: 'CHF', symbol: 'Fr', name: 'Swiss Franc' },\n { code: 'SGD', symbol: 'S$', name: 'Singapore Dollar' },\n { code: 'HKD', symbol: 'HK$', name: 'Hong Kong Dollar' },\n { code: 'MYR', symbol: 'RM', name: 'Malaysian Ringgit' },\n { code: 'AED', symbol: 'د.إ', name: 'UAE Dirham' },\n { code: 'SAR', symbol: '﷼', name: 'Saudi Riyal' },\n { code: 'ZAR', symbol: 'R', name: 'South African Rand' },\n { code: 'BRL', symbol: 'R$', name: 'Brazilian Real' },\n { code: 'MXN', symbol: 'MX$', name: 'Mexican Peso' },\n { code: 'KES', symbol: 'KSh', name: 'Kenyan Shilling' },\n { code: 'GHS', symbol: 'GH₵', name: 'Ghanaian Cedi' },\n { code: 'EGP', symbol: 'E£', name: 'Egyptian Pound' },\n { code: 'PHP', symbol: '₱', name: 'Philippine Peso' },\n { code: 'IDR', symbol: 'Rp', name: 'Indonesian Rupiah' },\n { code: 'TRY', symbol: '₺', name: 'Turkish Lira' },\n { code: 'RUB', symbol: '₽', name: 'Russian Ruble' },\n];\n\nconst CODE_TO_OPTION = Object.fromEntries(CURRENCY_OPTIONS.map((c) => [c.code, c]));\n\n/** Resolve an ISO code to a render symbol; unknown codes fall back to the code itself. */\nexport function currencySymbol(code) {\n if (!code) return '₹';\n return CODE_TO_OPTION[code]?.symbol ?? code;\n}\n\n/** Human label, e.g. \"Indian Rupee (₹)\". */\nexport function currencyLabel(code) {\n const opt = CODE_TO_OPTION[code];\n if (!opt) return code || '';\n return `${opt.name} (${opt.symbol})`;\n}\n","import { useEffect, useState } from 'react';\nimport { getSettings } from '@pm/services/pmApi';\nimport { currencyCodeForCountry } from '@/common/constants/countries';\n\n// Module-scoped cache + tiny subscriber model so settings-aware components\n// (PmMoney, PmNav, PurchaseCreatePage, …) can read the same snapshot without\n// re-fetching per page.\n//\n// Lifecycle:\n// - first usePmSettings() call from anywhere triggers the fetch\n// - subsequent renders read from the cache synchronously\n// - SettingsPage calls updateLocalPmSettings() after saving so the change\n// propagates without a round-trip\n\nconst DEFAULT_SETTINGS = {\n memberTableName: null,\n memberIdColumn: null,\n memberIdentifierColumn: null,\n memberFamilyIdColumn: null,\n memberNameColumn: null,\n memberDobColumn: null,\n countryCode: 'IN',\n // Derived from countryCode at hydrate time so PmMoney etc. can keep\n // reading a stable currencyCode field without knowing about countries.\n currencyCode: 'INR',\n managePurchaseAmounts: true,\n manageSales: true,\n allowPersonalPurchase: true,\n requirePurchaseConfirmation: false,\n};\n\nlet _settings = null;\nlet _pending = null;\nconst _listeners = new Set();\n\nfunction hydrate(raw) {\n const base = { ...DEFAULT_SETTINGS, ...(raw ?? {}) };\n // Derive currency from country every load — country is the source of truth.\n base.currencyCode = currencyCodeForCountry(base.countryCode);\n base.managePurchaseAmounts = base.managePurchaseAmounts !== false; // default true\n base.manageSales = base.manageSales !== false; // default true\n base.allowPersonalPurchase = base.allowPersonalPurchase !== false; // default true\n base.requirePurchaseConfirmation = base.requirePurchaseConfirmation === true; // default false\n return base;\n}\n\nfunction notify() {\n _listeners.forEach((cb) => cb(_settings));\n}\n\nexport async function loadPmSettings(force = false) {\n if (!force && _settings) return _settings;\n if (!force && _pending) return _pending;\n _pending = getSettings()\n .then((s) => {\n _settings = hydrate(s);\n _pending = null;\n notify();\n return _settings;\n })\n .catch((err) => {\n _pending = null;\n if (!_settings) {\n _settings = hydrate(null);\n notify();\n }\n throw err;\n });\n return _pending;\n}\n\nexport function updateLocalPmSettings(next) {\n _settings = hydrate(next);\n notify();\n}\n\nexport function getCachedPmSettings() {\n return _settings;\n}\n\nexport function usePmSettings() {\n const [snap, setSnap] = useState(_settings ?? hydrate(null));\n useEffect(() => {\n _listeners.add(setSnap);\n if (!_settings && !_pending) {\n void loadPmSettings().catch(() => {});\n } else if (_settings) {\n setSnap(_settings);\n }\n return () => {\n _listeners.delete(setSnap);\n };\n }, []);\n return snap;\n}\n"],"mappings":"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"}
|