@openmrs/esm-stock-management-app 1.0.1-pre.746 → 1.0.1-pre.747

Sign up to get free protection for your applications and to get access to all the features.
Files changed (25) hide show
  1. package/dist/18.js +1 -0
  2. package/dist/18.js.map +1 -0
  3. package/dist/main.js +1 -1
  4. package/dist/main.js.map +1 -1
  5. package/dist/openmrs-esm-stock-management-app.js +1 -1
  6. package/dist/openmrs-esm-stock-management-app.js.buildmanifest.json +31 -31
  7. package/dist/openmrs-esm-stock-management-app.js.map +1 -1
  8. package/dist/routes.json +1 -1
  9. package/package.json +1 -1
  10. package/src/core/api/types/stockItem/StockItemTransaction.ts +2 -0
  11. package/src/index.ts +7 -2
  12. package/src/routes.json +6 -2
  13. package/src/stock-items/add-stock-item/transactions/printout/{printable-transaction-header.component.tsx → printable-bincard-transaction-header.component.tsx} +2 -2
  14. package/src/stock-items/add-stock-item/transactions/printout/printable-stockcard-transaction-header.component.tsx +52 -0
  15. package/src/stock-items/add-stock-item/transactions/printout/{transactions-printout.component.tsx → transactions-bincard-printout.component.tsx} +4 -4
  16. package/src/stock-items/add-stock-item/transactions/printout/transactions-print-action.component.tsx +63 -4
  17. package/src/stock-items/add-stock-item/transactions/printout/{transactions-print-preview.modal.tsx → transactions-print-bincard-preview.modal.tsx} +5 -4
  18. package/src/stock-items/add-stock-item/transactions/printout/transactions-print-stockcard-preview.modal.tsx +41 -0
  19. package/src/stock-items/add-stock-item/transactions/printout/transactions-stockcard-printout.component.tsx +170 -0
  20. package/src/stock-items/add-stock-item/transactions/transactions.component.tsx +3 -3
  21. package/src/stock-items/add-stock-item/transactions/transactions.resource.tsx +2 -2
  22. package/src/stock-items/stock-items.resource.ts +1 -0
  23. package/src/stock-lookups/stock-lookups.resource.ts +8 -0
  24. package/dist/667.js +0 -1
  25. package/dist/667.js.map +0 -1
@@ -0,0 +1,170 @@
1
+ import React, { useEffect, useMemo, useState } from 'react';
2
+ import {
3
+ DataTable,
4
+ TableContainer,
5
+ Table,
6
+ TableHead,
7
+ TableRow,
8
+ TableHeader,
9
+ TableBody,
10
+ TableCell,
11
+ } from '@carbon/react';
12
+ import { useStockItem } from '../../../stock-items.resource';
13
+ import PrintableBincardTransactionHeader from './printable-bincard-transaction-header.component';
14
+ import PrintableStockcardTransactionHeader from './printable-stockcard-transaction-header.component';
15
+ import PrintableTransactionFooter from './printable-transaction-footer.component';
16
+ import styles from './printable-transaction.scss';
17
+ import StockOperationReference from '../../../../stock-operations/add-stock-operation/stock-operation-reference.component';
18
+ import { formatDisplayDate } from '../../../../core/utils/datetimeUtils';
19
+ import { ArrowLeft } from '@carbon/react/icons';
20
+ import { usePatient } from '../../../../stock-lookups/stock-lookups.resource';
21
+ import { openmrsFetch, restBaseUrl } from '@openmrs/esm-framework';
22
+
23
+ type Props = {
24
+ title: string;
25
+ columns: any;
26
+ items: any;
27
+ };
28
+
29
+ const TransactionsStockcardPrintout: React.FC<Props> = ({ columns, items, title }) => {
30
+ const [mappedData, setMappedData] = useState([]);
31
+ const [patientData, setPatientData] = useState({});
32
+
33
+ useEffect(() => {
34
+ const fetchPatients = async () => {
35
+ const patientPromises = items
36
+ .filter((item) => item.patientUuid) // Only fetch for items with patientUuid
37
+ .map(async (item) => {
38
+ const customePresentation = 'custom:(uuid,display,identifiers,links)';
39
+ const url = `${restBaseUrl}/patient/${item.patientUuid}?v=${customePresentation}`;
40
+ const response = await openmrsFetch(url); // Assume `openmrsFetch` is a fetch utility
41
+ return { uuid: item.patientUuid, data: response.data };
42
+ });
43
+
44
+ const resolvedPatients = await Promise.all(patientPromises);
45
+
46
+ // Map patient UUIDs to their data
47
+ const patientMap = {};
48
+ resolvedPatients.forEach((patient) => {
49
+ patientMap[patient.uuid] = patient.data;
50
+ });
51
+
52
+ setPatientData(patientMap); // Save patient data in state
53
+ };
54
+
55
+ fetchPatients();
56
+ }, [items]);
57
+
58
+ useEffect(() => {
59
+ // Map items with patient data
60
+ const data = items.map((stockItemTransaction) => {
61
+ const patient = stockItemTransaction.patientUuid ? patientData[stockItemTransaction.patientUuid] : null;
62
+
63
+ return {
64
+ ...stockItemTransaction,
65
+ id: stockItemTransaction?.uuid,
66
+ key: `key-${stockItemTransaction?.uuid}`,
67
+ uuid: `${stockItemTransaction?.uuid}`,
68
+ date: formatDisplayDate(stockItemTransaction?.dateCreated),
69
+ location:
70
+ stockItemTransaction.operationSourcePartyName && stockItemTransaction.operationDestinationPartyName ? (
71
+ stockItemTransaction.operationSourcePartyName === stockItemTransaction?.partyName ? (
72
+ stockItemTransaction.quantity > 0 ? (
73
+ <>
74
+ <span className="transaction-location">{stockItemTransaction.operationSourcePartyName}</span>
75
+ <ArrowLeft size={16} /> {stockItemTransaction.operationDestinationPartyName}
76
+ </>
77
+ ) : (
78
+ <>
79
+ <span className="transaction-location">{stockItemTransaction.operationSourcePartyName}</span>
80
+ <ArrowLeft size={16} /> {stockItemTransaction.operationDestinationPartyName}
81
+ </>
82
+ )
83
+ ) : stockItemTransaction.operationDestinationPartyName === stockItemTransaction?.partyName ? (
84
+ stockItemTransaction.quantity > 0 ? (
85
+ <>
86
+ <span className="transaction-location">{stockItemTransaction.operationDestinationPartyName}</span>
87
+ <ArrowLeft size={16} /> {stockItemTransaction.operationSourcePartyName}
88
+ </>
89
+ ) : (
90
+ <>
91
+ <span className="transaction-location">{stockItemTransaction.operationDestinationPartyName}</span>
92
+ <ArrowLeft size={16} /> {stockItemTransaction.operationSourcePartyName}
93
+ </>
94
+ )
95
+ ) : (
96
+ stockItemTransaction?.partyName
97
+ )
98
+ ) : (
99
+ stockItemTransaction?.partyName
100
+ ),
101
+ transaction: stockItemTransaction?.isPatientTransaction
102
+ ? 'Patient Dispense'
103
+ : stockItemTransaction.stockOperationTypeName,
104
+ quantity: `${stockItemTransaction?.quantity?.toLocaleString()} ${stockItemTransaction?.packagingUomName ?? ''}`,
105
+ batch: stockItemTransaction.stockBatchNo
106
+ ? `${stockItemTransaction.stockBatchNo}${
107
+ stockItemTransaction.expiration ? ` (${formatDisplayDate(stockItemTransaction.expiration)})` : ''
108
+ }`
109
+ : '',
110
+ out:
111
+ stockItemTransaction?.quantity < 0
112
+ ? `${(-1 * stockItemTransaction?.quantity)?.toLocaleString()} ${
113
+ stockItemTransaction?.packagingUomName ?? ''
114
+ } of ${stockItemTransaction.packagingUomFactor}`
115
+ : '',
116
+ totalout:
117
+ stockItemTransaction?.quantity < 0
118
+ ? `${-1 * stockItemTransaction?.quantity * Number(stockItemTransaction.packagingUomFactor)}`
119
+ : '',
120
+ patientId: stockItemTransaction?.patientId ?? '',
121
+ patientUuid: stockItemTransaction?.patientUuid ?? '',
122
+ patientName: patient?.display ?? '', // Use patient display name if available
123
+ patientIdentifier: '',
124
+ };
125
+ });
126
+
127
+ setMappedData(data);
128
+ }, [items, patientData]);
129
+
130
+ return (
131
+ <div>
132
+ <PrintableStockcardTransactionHeader itemName={title} />
133
+
134
+ <div className={styles.itemsContainer}>
135
+ <div className={styles.tableContainer}>
136
+ <DataTable data-floating-menu-container rows={mappedData} headers={columns} useZebraStyles>
137
+ {({ rows, headers, getHeaderProps, getTableProps, onInputChange }) => (
138
+ <div>
139
+ <TableContainer>
140
+ <Table {...getTableProps()}>
141
+ <TableHead>
142
+ <TableRow>
143
+ {headers.map((header) => (
144
+ <TableHeader {...getHeaderProps({ header })}>{header.header}</TableHeader>
145
+ ))}
146
+ </TableRow>
147
+ </TableHead>
148
+ <TableBody style={{ fontSize: '8px' }}>
149
+ {rows.map((row) => (
150
+ <TableRow key={row.id}>
151
+ {row.cells.map((cell) => (
152
+ <TableCell key={cell.id}>{cell.value}</TableCell>
153
+ ))}
154
+ </TableRow>
155
+ ))}
156
+ </TableBody>
157
+ </Table>
158
+ </TableContainer>
159
+ </div>
160
+ )}
161
+ </DataTable>
162
+ </div>
163
+ </div>
164
+
165
+ <PrintableTransactionFooter title={''} />
166
+ </div>
167
+ );
168
+ };
169
+
170
+ export default TransactionsStockcardPrintout;
@@ -12,7 +12,7 @@ import { useTranslation } from 'react-i18next';
12
12
  import StockOperationReference from '../../../stock-operations/add-stock-operation/stock-operation-reference.component';
13
13
  import { Add } from '@carbon/react/icons';
14
14
  import { Printer } from '@carbon/react/icons';
15
- import TransactionsPrintout from './printout/transactions-printout.component';
15
+ import TransactionsPrintout from './printout/transactions-bincard-printout.component';
16
16
  import TransactionsPrintAction from './printout/transactions-print-action.component';
17
17
 
18
18
  interface TransactionsProps {
@@ -32,7 +32,7 @@ const Transactions: React.FC<TransactionsProps> = ({ stockItemUuid }) => {
32
32
  setCurrentPage,
33
33
  setStockItemUuid,
34
34
  setLocationUuid,
35
- printHeaders,
35
+ binCardHeaders,
36
36
  } = useStockItemsTransactions(stockItemFilter);
37
37
 
38
38
  useEffect(() => {
@@ -127,7 +127,7 @@ const Transactions: React.FC<TransactionsProps> = ({ stockItemUuid }) => {
127
127
  <DataList
128
128
  children={() => (
129
129
  <>
130
- <TransactionsPrintAction columns={printHeaders} data={tableRows} itemUuid={stockItemUuid} />
130
+ <TransactionsPrintAction columns={binCardHeaders} data={tableRows} itemUuid={stockItemUuid} />
131
131
  <TransactionsLocationsFilter
132
132
  onLocationIdChange={(q) => {
133
133
  setLocationUuid(q);
@@ -76,7 +76,7 @@ export function useStockItemsTransactions(filter?: StockItemInventoryFilter) {
76
76
  [],
77
77
  );
78
78
 
79
- const printHeaders = useMemo(
79
+ const binCardHeaders = useMemo(
80
80
  () => [
81
81
  {
82
82
  key: 'date',
@@ -130,6 +130,6 @@ export function useStockItemsTransactions(filter?: StockItemInventoryFilter) {
130
130
  setLocationUuid,
131
131
  setPartyUuid,
132
132
  setStockBatchUuid,
133
- printHeaders,
133
+ binCardHeaders,
134
134
  };
135
135
  }
@@ -39,6 +39,7 @@ export interface StockItemInventoryFilter extends ResourceFilterCriteria {
39
39
  date?: string | null;
40
40
  includeStockItemName?: 'true' | 'false' | '0' | '1';
41
41
  excludeExpired?: boolean | null;
42
+ isPatientTransaction?: 'true' | 'false';
42
43
  }
43
44
 
44
45
  export interface StockItemPackagingUOMFilter extends ResourceFilterCriteria {
@@ -267,6 +267,14 @@ export function usePatients(filter: ConceptFilterCriteria) {
267
267
  };
268
268
  }
269
269
 
270
+ // get a Patient
271
+ export function usePatient(patientUuid: string) {
272
+ const customePresentation = 'custom:(uuid,display,identifiers,links)';
273
+ const url = `${restBaseUrl}/patient/${patientUuid}?v=${customePresentation}`;
274
+ const { isLoading, error, data } = useSWR<FetchResponse<Patient>>(url, openmrsFetch);
275
+ return { isLoading, error, patient: data?.data };
276
+ }
277
+
270
278
  type UserRole = {
271
279
  results: Array<{
272
280
  userUuid: string;