@openmrs/esm-stock-management-app 1.0.1-pre.783 → 1.0.1-pre.788

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.
Files changed (128) hide show
  1. package/__mocks__/index.ts +1 -0
  2. package/__mocks__/operation-type.mock.ts +532 -0
  3. package/dist/155.js +1 -0
  4. package/dist/155.js.map +1 -0
  5. package/dist/172.js +1 -1
  6. package/dist/20.js +1 -1
  7. package/dist/290.js +1 -1
  8. package/dist/493.js +2 -0
  9. package/dist/493.js.map +1 -0
  10. package/dist/606.js +1 -1
  11. package/dist/627.js +1 -1
  12. package/dist/922.js +1 -0
  13. package/dist/922.js.map +1 -0
  14. package/dist/main.js +1 -1
  15. package/dist/main.js.map +1 -1
  16. package/dist/openmrs-esm-stock-management-app.js +1 -1
  17. package/dist/openmrs-esm-stock-management-app.js.buildmanifest.json +75 -51
  18. package/dist/openmrs-esm-stock-management-app.js.map +1 -1
  19. package/dist/routes.json +1 -1
  20. package/package.json +1 -1
  21. package/src/config-schema.ts +6 -0
  22. package/src/core/utils/utils.ts +29 -0
  23. package/src/index.ts +4 -0
  24. package/src/routes.json +9 -0
  25. package/src/stock-items/add-stock-item/transactions/printout/transactions-stockcard-printout.component.tsx +8 -12
  26. package/src/stock-items/add-stock-item/transactions/transactions.component.tsx +8 -12
  27. package/src/stock-items/stock-items.resource.ts +5 -5
  28. package/src/stock-lookups/stock-lookups.resource.ts +2 -2
  29. package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-items-table.scss +34 -0
  30. package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-items-table.tsx +111 -0
  31. package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-operation-expanded-row.component.tsx +87 -0
  32. package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-operation-expanded-row.scss +31 -0
  33. package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-operations-status.tsx +45 -0
  34. package/src/stock-operations/edit-stock-operation/edit-stock-operation-action-menu.component.tsx +41 -16
  35. package/src/stock-operations/stock-operation-reference.component.tsx +64 -0
  36. package/src/stock-operations/stock-operation-status/stock-operation-status-row.tsx +77 -0
  37. package/src/stock-operations/stock-operation-status/stock-operation-status.scss +32 -0
  38. package/src/stock-operations/stock-operation-status/stock-operation-status.tsx +45 -0
  39. package/src/stock-operations/stock-operation-types-selector/stock-operation-types-selector.component.tsx +30 -29
  40. package/src/stock-operations/stock-operation.utils.tsx +16 -79
  41. package/src/stock-operations/stock-operations-dialog/stock-operations-issue-stock-button.component.tsx +27 -39
  42. package/src/stock-operations/stock-operations-dialog/stock-operations-print-button.component.tsx +51 -59
  43. package/src/stock-operations/{stock-item-selector/stock-item-selector.resource.tsx → stock-operations-forms/hooks/useFilterableStockItems.ts} +4 -4
  44. package/src/stock-operations/stock-operations-forms/hooks/useFilteredOperationTypesByRoles.ts +30 -0
  45. package/src/stock-operations/stock-operations-forms/hooks/useOperationTypePermisions.ts +29 -0
  46. package/src/stock-operations/stock-operations-forms/hooks/useParties.ts +73 -0
  47. package/src/stock-operations/{users-selector/users-selector.resource.tsx → stock-operations-forms/hooks/useSearchUser.ts} +9 -7
  48. package/src/stock-operations/{batch-no-selector/batch-no-selector.resource.tsx → stock-operations-forms/hooks/useStockItemBatchNumbers.ts} +3 -3
  49. package/src/stock-operations/stock-operations-forms/hooks/useStockOperationLinks.ts +20 -0
  50. package/src/stock-operations/stock-operations-forms/input-components/batch-no-selector.component.tsx +72 -0
  51. package/src/stock-operations/stock-operations-forms/input-components/batch-no-selector.test.tsx +90 -0
  52. package/src/stock-operations/{add-stock-operation/stock-item-search/stock-item-search.scss → stock-operations-forms/input-components/input-components-styles.scss} +2 -2
  53. package/src/stock-operations/stock-operations-forms/input-components/qty-uim-selector.test.tsx +157 -0
  54. package/src/stock-operations/stock-operations-forms/input-components/quantity-uom-selector.component.tsx +53 -0
  55. package/src/stock-operations/stock-operations-forms/input-components/stock-item-search.component.tsx +79 -0
  56. package/src/stock-operations/stock-operations-forms/input-components/stock-operation-reason-selector.component.tsx +59 -0
  57. package/src/stock-operations/stock-operations-forms/input-components/stock-operation-reason-selector.test.tsx +216 -0
  58. package/src/stock-operations/{batch-no-selector → stock-operations-forms/input-components}/unique-batch-no-entry-input.component.tsx +12 -7
  59. package/src/stock-operations/stock-operations-forms/input-components/user-selector.test.tsx +110 -0
  60. package/src/stock-operations/stock-operations-forms/input-components/users-selector.component.tsx +111 -0
  61. package/src/stock-operations/stock-operations-forms/step1.test.tsx +303 -0
  62. package/src/stock-operations/stock-operations-forms/step2.test.tsx +254 -0
  63. package/src/stock-operations/stock-operations-forms/step3.test.tsx +223 -0
  64. package/src/stock-operations/stock-operations-forms/steps/base-operation-details-form-step.tsx +241 -0
  65. package/src/stock-operations/stock-operations-forms/steps/quantity-uom-cell.component.tsx +33 -0
  66. package/src/stock-operations/stock-operations-forms/steps/received-items.component.tsx +110 -0
  67. package/src/stock-operations/stock-operations-forms/steps/stock-availability-cell.component.tsx +51 -0
  68. package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-batch-no-cell.component.tsx +40 -0
  69. package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-cell.component.tsx +50 -0
  70. package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-expiry-cell.component.tsx +41 -0
  71. package/src/stock-operations/stock-operations-forms/steps/stock-operation-items-form-step.component.tsx +281 -0
  72. package/src/stock-operations/stock-operations-forms/steps/stock-operation-items-form-step.scc.scss +64 -0
  73. package/src/stock-operations/stock-operations-forms/steps/stock-operation-submission-form-step.component.tsx +243 -0
  74. package/src/stock-operations/stock-operations-forms/stock-issue-form-initializer-with-related-requisition-operation.component.tsx +55 -0
  75. package/src/stock-operations/stock-operations-forms/stock-item-form/stock-item-form.scss +41 -0
  76. package/src/stock-operations/stock-operations-forms/stock-item-form/stock-item-form.workspace.tsx +211 -0
  77. package/src/stock-operations/stock-operations-forms/stock-operation-form-header.component.tsx +166 -0
  78. package/src/stock-operations/stock-operations-forms/stock-operation-form.component.tsx +205 -0
  79. package/src/stock-operations/stock-operations-forms/stock-operation-form.scss +111 -0
  80. package/src/stock-operations/stock-operations-forms/stock-operation-related-link.component.tsx +45 -0
  81. package/src/stock-operations/stock-operations-forms/stock-operation-stepper/stepper.scss +41 -0
  82. package/src/stock-operations/stock-operations-forms/stock-operation-stepper/stock-operation-stepper.component.tsx +52 -0
  83. package/src/stock-operations/stock-operations-forms/stock-operations-form-utils.ts +32 -0
  84. package/src/stock-operations/stock-operations-table.component.tsx +57 -92
  85. package/src/stock-operations/stock-operations.resource.ts +16 -13
  86. package/src/stock-operations/validation-schema.ts +72 -14
  87. package/dist/766.js +0 -2
  88. package/dist/766.js.map +0 -1
  89. package/dist/822.js +0 -1
  90. package/dist/822.js.map +0 -1
  91. package/src/stock-operations/add-stock-operation/add-stock-operation.component.tsx +0 -349
  92. package/src/stock-operations/add-stock-operation/add-stock-operation.resource.tsx +0 -27
  93. package/src/stock-operations/add-stock-operation/add-stock-operation.scss +0 -60
  94. package/src/stock-operations/add-stock-operation/add-stock-operation.test.tsx +0 -192
  95. package/src/stock-operations/add-stock-operation/add-stock-operation.utils.tsx +0 -152
  96. package/src/stock-operations/add-stock-operation/add-stock-utils.ts +0 -103
  97. package/src/stock-operations/add-stock-operation/base-operation-details.component.tsx +0 -439
  98. package/src/stock-operations/add-stock-operation/base-operation-details.scss +0 -30
  99. package/src/stock-operations/add-stock-operation/received-items.component.tsx +0 -93
  100. package/src/stock-operations/add-stock-operation/stock-item-search/stock-item-search.component.tsx +0 -70
  101. package/src/stock-operations/add-stock-operation/stock-items-addition-row.component.tsx +0 -357
  102. package/src/stock-operations/add-stock-operation/stock-items-addition-row.resource.tsx +0 -0
  103. package/src/stock-operations/add-stock-operation/stock-items-addition-row.scss +0 -12
  104. package/src/stock-operations/add-stock-operation/stock-items-addition-row.test.tsx +0 -10
  105. package/src/stock-operations/add-stock-operation/stock-items-addition.component.scss +0 -17
  106. package/src/stock-operations/add-stock-operation/stock-items-addition.component.tsx +0 -254
  107. package/src/stock-operations/add-stock-operation/stock-operation-context/useStockOperationContext.tsx +0 -16
  108. package/src/stock-operations/add-stock-operation/stock-operation-reference.component.tsx +0 -39
  109. package/src/stock-operations/add-stock-operation/stock-operation-related-link.component.tsx +0 -38
  110. package/src/stock-operations/add-stock-operation/stock-operation-status.component.tsx +0 -170
  111. package/src/stock-operations/add-stock-operation/stock-operation-submission.component.tsx +0 -189
  112. package/src/stock-operations/add-stock-operation/stock-operation-submission.test.tsx +0 -138
  113. package/src/stock-operations/add-stock-operation/types.ts +0 -55
  114. package/src/stock-operations/add-stock-operation/validationSchema.ts +0 -54
  115. package/src/stock-operations/batch-no-selector/batch-no-selector.component.tsx +0 -114
  116. package/src/stock-operations/batch-no-selector/batch-no-selector.scss +0 -0
  117. package/src/stock-operations/batch-no-selector/batch-no-selector.test.tsx +0 -101
  118. package/src/stock-operations/party-selector/party-selector.component.tsx +0 -59
  119. package/src/stock-operations/qty-uom-selector/qty-uom-selector.component.tsx +0 -65
  120. package/src/stock-operations/qty-uom-selector/qty-uom-selector.resource.tsx +0 -0
  121. package/src/stock-operations/qty-uom-selector/qty-uom-selector.scss +0 -0
  122. package/src/stock-operations/qty-uom-selector/qty-uom-selector.test.tsx +0 -10
  123. package/src/stock-operations/stock-item-selector/stock-item-selector.component.tsx +0 -69
  124. package/src/stock-operations/stock-item-selector/stock-item-selector.scss +0 -0
  125. package/src/stock-operations/stock-item-selector/stock-item-selector.test.tsx +0 -10
  126. package/src/stock-operations/stock-operation-reason-selector/stock-operation-reason-selector.component.tsx +0 -62
  127. package/src/stock-operations/users-selector/users-selector.component.tsx +0 -75
  128. /package/dist/{766.js.LICENSE.txt → 493.js.LICENSE.txt} +0 -0
@@ -1,10 +1,9 @@
1
- import React, { useCallback, useMemo, useState } from 'react';
2
- import { useStockOperationPages } from './stock-operations-table.resource';
3
- import { ResourceRepresentation } from '../core/api/api';
4
1
  import {
5
2
  DataTable,
6
- TabPanel,
7
3
  DataTableSkeleton,
4
+ DatePicker,
5
+ DatePickerInput,
6
+ InlineLoading,
8
7
  Pagination,
9
8
  Table,
10
9
  TableBody,
@@ -17,30 +16,30 @@ import {
17
16
  TableHeader,
18
17
  TableRow,
19
18
  TableToolbar,
19
+ TableToolbarAction,
20
20
  TableToolbarContent,
21
+ TableToolbarMenu,
21
22
  TableToolbarSearch,
23
+ TabPanel,
22
24
  Tile,
23
- DatePickerInput,
24
- DatePicker,
25
- TableToolbarMenu,
26
- TableToolbarAction,
27
- InlineLoading,
28
25
  } from '@carbon/react';
29
26
  import { ArrowRight } from '@carbon/react/icons';
30
- import { formatDisplayDate } from '../core/utils/datetimeUtils';
31
27
  import { isDesktop, restBaseUrl } from '@openmrs/esm-framework';
32
- import StockOperationTypesSelector from './stock-operation-types-selector/stock-operation-types-selector.component';
33
- import { launchAddOrEditDialog } from './stock-operation.utils';
34
- import { initialStockOperationValue } from '../core/utils/utils';
35
- import { StockOperationType } from '../core/api/types/stockOperation/StockOperationType';
28
+ import React, { useCallback, useMemo, useState } from 'react';
36
29
  import { useTranslation } from 'react-i18next';
37
- import EditStockOperationActionMenu from './edit-stock-operation/edit-stock-operation-action-menu.component';
38
- import StockOperationsFilters from './stock-operations-filters.component';
39
30
  import { DATE_PICKER_CONTROL_FORMAT, DATE_PICKER_FORMAT, StockFilters } from '../constants';
31
+ import { ResourceRepresentation } from '../core/api/api';
32
+ import { StockOperationType } from '../core/api/types/stockOperation/StockOperationType';
33
+ import { formatDisplayDate } from '../core/utils/datetimeUtils';
40
34
  import { handleMutate } from '../utils';
35
+ import EditStockOperationActionMenu from './edit-stock-operation/edit-stock-operation-action-menu.component';
36
+ import StockOperationTypesSelector from './stock-operation-types-selector/stock-operation-types-selector.component';
37
+ import StockOperationsFilters from './stock-operations-filters.component';
38
+ import { useStockOperationPages } from './stock-operations-table.resource';
41
39
 
40
+ import { Link } from '@carbon/react';
41
+ import StockOperationExpandedRow from './add-stock-operation/stock-operations-expanded-row/stock-operation-expanded-row.component';
42
42
  import styles from './stock-operations-table.scss';
43
- import StockOperationStatus from './add-stock-operation/stock-operation-status.component';
44
43
 
45
44
  interface StockOperationsTableProps {
46
45
  status?: string;
@@ -51,32 +50,6 @@ const StockOperations: React.FC<StockOperationsTableProps> = () => {
51
50
  const handleRefresh = () => {
52
51
  handleMutate(`${restBaseUrl}/stockmanagement/stockoperation`);
53
52
  };
54
- const operation: StockOperationType = useMemo(
55
- () => ({
56
- uuid: '',
57
- name: '',
58
- description: '',
59
- operationType: '',
60
- hasSource: false,
61
- sourceType: 'Location',
62
- hasDestination: false,
63
- destinationType: 'Location',
64
- hasRecipient: false,
65
- recipientRequired: false,
66
- availableWhenReserved: false,
67
- allowExpiredBatchNumbers: false,
68
- stockOperationTypeLocationScopes: [],
69
- creator: undefined,
70
- dateCreated: undefined,
71
- changedBy: undefined,
72
- dateChanged: undefined,
73
- dateVoided: undefined,
74
- voidedBy: undefined,
75
- voidReason: '',
76
- voided: false,
77
- }),
78
- [],
79
- );
80
53
 
81
54
  const [selectedFromDate, setSelectedFromDate] = useState(null);
82
55
  const [selectedToDate, setSelectedToDate] = useState(null);
@@ -98,8 +71,6 @@ const StockOperations: React.FC<StockOperationsTableProps> = () => {
98
71
  const filterApplied =
99
72
  selectedFromDate || selectedToDate || selectedSources.length || selectedStatus.length || selectedOperations.length;
100
73
 
101
- const [operations, setOperations] = useState<StockOperationType[]>([]);
102
-
103
74
  const handleOnFilterChange = useCallback((selectedItems, filterType) => {
104
75
  if (filterType === StockFilters.SOURCES) {
105
76
  setSelectedSources(selectedItems);
@@ -125,18 +96,15 @@ const StockOperations: React.FC<StockOperationsTableProps> = () => {
125
96
  }
126
97
  };
127
98
 
128
- const handleEditClick = useCallback(
129
- (stockOperation, isEditing) => {
130
- launchAddOrEditDialog(t, stockOperation, isEditing, operation, operations, false);
131
- },
132
- [t, operation, operations],
133
- );
134
-
135
99
  const tableRows = useMemo(() => {
136
100
  return items?.map((stockOperation, index) => {
137
- const commonNames = stockOperation?.stockOperationItems
138
- ? stockOperation?.stockOperationItems.map((item) => item.commonName).join(', ')
139
- : '';
101
+ const threshHold = 1;
102
+ const itemCountGreaterThanThreshhold = (stockOperation?.stockOperationItems?.length ?? 0) > threshHold;
103
+ const commonNames =
104
+ stockOperation?.stockOperationItems
105
+ ?.slice(0, itemCountGreaterThanThreshhold ? threshHold : undefined)
106
+ .map((item) => item.commonName)
107
+ .join(', ') ?? '';
140
108
 
141
109
  return {
142
110
  ...stockOperation,
@@ -144,17 +112,12 @@ const StockOperations: React.FC<StockOperationsTableProps> = () => {
144
112
  key: `key-${stockOperation?.uuid}`,
145
113
  operationTypeName: `${stockOperation?.operationTypeName}`,
146
114
  operationNumber: (
147
- <EditStockOperationActionMenu
148
- model={stockOperation}
149
- operations={operations}
150
- operationUuid={operation.uuid}
151
- operationNumber={''}
152
- onEdit={() => handleEditClick(stockOperation, true)}
153
- showIcon={false}
154
- showprops={true}
155
- />
115
+ <EditStockOperationActionMenu stockOperation={stockOperation} showIcon={false} showprops={true} />
156
116
  ),
157
- stockOperationItems: commonNames,
117
+ stockOperationItems: {
118
+ commonNames,
119
+ more: itemCountGreaterThanThreshhold ? stockOperation?.stockOperationItems?.length - threshHold : 0,
120
+ },
158
121
  status: `${stockOperation?.status}`,
159
122
  source: `${stockOperation?.sourceName ?? ''}`,
160
123
  destination: `${stockOperation?.destinationName ?? ''}`,
@@ -169,20 +132,10 @@ const StockOperations: React.FC<StockOperationsTableProps> = () => {
169
132
  stockOperation?.responsiblePersonFamilyName ?? stockOperation?.responsiblePersonOther ?? ''
170
133
  } ${stockOperation?.responsiblePersonGivenName ?? ''}`,
171
134
  operationDate: formatDisplayDate(stockOperation?.operationDate),
172
- actions: (
173
- <EditStockOperationActionMenu
174
- model={stockOperation}
175
- operations={operations}
176
- operationUuid={operation.uuid}
177
- operationNumber={''}
178
- onEdit={() => handleEditClick(stockOperation, true)}
179
- showIcon={true}
180
- showprops={false}
181
- />
182
- ),
135
+ actions: <EditStockOperationActionMenu stockOperation={stockOperation} showIcon={true} showprops={false} />,
183
136
  };
184
137
  });
185
- }, [items, operations, handleEditClick, operation]);
138
+ }, [items]);
186
139
 
187
140
  if (isLoading && !filterApplied) {
188
141
  return (
@@ -202,7 +155,16 @@ const StockOperations: React.FC<StockOperationsTableProps> = () => {
202
155
  headers={tableHeaders}
203
156
  isSortable={true}
204
157
  useZebraStyles={true}
205
- render={({ rows, headers, getHeaderProps, getTableProps, getRowProps, onInputChange }) => (
158
+ render={({
159
+ rows,
160
+ headers,
161
+ getHeaderProps,
162
+ getTableProps,
163
+ getRowProps,
164
+ onInputChange,
165
+ getExpandedRowProps,
166
+ expandRow,
167
+ }) => (
206
168
  <TableContainer>
207
169
  <TableToolbar
208
170
  style={{
@@ -243,14 +205,7 @@ const StockOperations: React.FC<StockOperationsTableProps> = () => {
243
205
  <TableToolbarAction onClick={handleRefresh}>Refresh</TableToolbarAction>
244
206
  </TableToolbarMenu>
245
207
 
246
- <StockOperationTypesSelector
247
- onOperationTypeSelected={(operation) => {
248
- launchAddOrEditDialog(t, initialStockOperationValue(), false, operation, operations, false);
249
- }}
250
- onOperationLoaded={(ops) => {
251
- setOperations(ops);
252
- }}
253
- />
208
+ <StockOperationTypesSelector />
254
209
  </TableToolbarContent>
255
210
  </TableToolbar>
256
211
  <Table {...getTableProps()}>
@@ -277,19 +232,29 @@ const StockOperations: React.FC<StockOperationsTableProps> = () => {
277
232
  </TableHead>
278
233
  <TableBody>
279
234
  {rows?.map((row: any, index) => {
235
+ const props = getRowProps({ row });
236
+ const expandedRowProps = getExpandedRowProps({ row });
280
237
  return (
281
238
  <React.Fragment key={row.id}>
282
- <TableExpandRow
283
- className={isDesktop ? styles.desktopRow : styles.tabletRow}
284
- {...getRowProps({ row })}
285
- >
239
+ <TableExpandRow className={isDesktop ? styles.desktopRow : styles.tabletRow} {...props}>
286
240
  {row.cells.map((cell) => (
287
- <TableCell key={cell.id}>{cell.value}</TableCell>
241
+ <TableCell key={cell.id}>
242
+ {cell?.info?.header === 'stockOperationItems' ? (
243
+ <span>
244
+ <span>{cell.value.commonNames}</span>
245
+ {cell.value.more > 0 && (
246
+ <Link onClick={() => expandRow(row.id)}>{`...(${cell.value.more} more)`}</Link>
247
+ )}
248
+ </span>
249
+ ) : (
250
+ cell.value
251
+ )}
252
+ </TableCell>
288
253
  ))}
289
254
  </TableExpandRow>
290
255
  {row.isExpanded ? (
291
256
  <TableExpandedRow colSpan={headers.length + 2}>
292
- <StockOperationStatus model={items[index]} />
257
+ <StockOperationExpandedRow model={items[index]} />
293
258
  </TableExpandedRow>
294
259
  ) : (
295
260
  <TableExpandedRow className={styles.hiddenRow} colSpan={headers.length + 2} />
@@ -2,9 +2,12 @@ import { FetchResponse, openmrsFetch, restBaseUrl } from '@openmrs/esm-framework
2
2
  import useSWR from 'swr';
3
3
  import { ResourceFilterCriteria, toQueryParams } from '../core/api/api';
4
4
  import { PageableResult } from '../core/api/types/PageableResult';
5
- import { StockOperationDTO } from '../core/api/types/stockOperation/StockOperationDTO';
6
- import { StopOperationAction } from '../core/api/types/stockOperation/StockOperationAction';
7
5
  import { InventoryGroupBy } from '../core/api/types/stockItem/StockItem';
6
+ import { StopOperationAction } from '../core/api/types/stockOperation/StockOperationAction';
7
+ import { StockOperationDTO } from '../core/api/types/stockOperation/StockOperationDTO';
8
+ import { StockOperationItemDtoSchema } from './validation-schema';
9
+ import { StockOperationItemCost } from '../core/api/types/stockOperation/StockOperationItemCost';
10
+ import { StockItemInventory } from '../core/api/types/stockItem/StockItemInventory';
8
11
 
9
12
  export interface StockOperationFilter extends ResourceFilterCriteria {
10
13
  status?: string | null | undefined;
@@ -63,7 +66,7 @@ export function useStockOperation(id: string | null) {
63
66
  const apiUrl = id ? `${restBaseUrl}/stockmanagement/stockoperation/${id}` : null;
64
67
  const { data, error, isLoading } = useSWR<{ data: StockOperationDTO }, Error>(apiUrl, apiUrl ? openmrsFetch : null);
65
68
  return {
66
- items: data?.data || {},
69
+ items: data?.data,
67
70
  isLoading,
68
71
  error,
69
72
  };
@@ -83,7 +86,7 @@ export function useStockOperationAndItems(id: string) {
83
86
  const apiUrl = `${restBaseUrl}/stockmanagement/stockoperation/${id}?v=full`;
84
87
  const { data, error, isLoading } = useSWR<{ data: StockOperationDTO }, Error>(apiUrl, openmrsFetch);
85
88
  return {
86
- items: data.data ? data.data : {},
89
+ items: data?.data,
87
90
  isLoading,
88
91
  error,
89
92
  };
@@ -124,30 +127,30 @@ export function deleteStockOperationItem(id: string) {
124
127
  }
125
128
 
126
129
  // createStockOperation
127
- export function createStockOperation(item: StockOperationDTO) {
130
+ export function createStockOperation(data: StockOperationItemDtoSchema) {
128
131
  const apiUrl = `${restBaseUrl}/stockmanagement/stockoperation`;
129
132
  const abortController = new AbortController();
130
- return openmrsFetch(apiUrl, {
133
+ return openmrsFetch<StockOperationDTO>(apiUrl, {
131
134
  method: 'POST',
132
135
  headers: {
133
136
  'Content-Type': 'application/json',
134
137
  },
135
138
  signal: abortController.signal,
136
- body: item,
139
+ body: data,
137
140
  });
138
141
  }
139
142
 
140
143
  // updateStockOperation
141
- export function updateStockOperation(item: StockOperationDTO) {
142
- const apiUrl = `${restBaseUrl}/stockmanagement/stockoperation/${item.uuid}`;
144
+ export function updateStockOperation(stockOperation: StockOperationDTO, data: StockOperationItemDtoSchema) {
145
+ const apiUrl = `${restBaseUrl}/stockmanagement/stockoperation/${stockOperation.uuid}`;
143
146
  const abortController = new AbortController();
144
- return openmrsFetch(apiUrl, {
147
+ return openmrsFetch<StockOperationDTO>(apiUrl, {
145
148
  method: 'POST',
146
149
  headers: {
147
150
  'Content-Type': 'application/json',
148
151
  },
149
152
  signal: abortController.signal,
150
- body: item,
153
+ body: data,
151
154
  });
152
155
  }
153
156
 
@@ -183,7 +186,7 @@ export function updateStockOperationBatchNumbers(item: StockOperationDTO, uuid:
183
186
  export function getStockOperationItemsCost(filter: StockOperationFilter) {
184
187
  const apiUrl = `${restBaseUrl}/stockmanagement/stockoperationitemcost?v=default&stockOperationUuid=${filter}`;
185
188
  const abortController = new AbortController();
186
- return openmrsFetch(apiUrl, {
189
+ return openmrsFetch<{ results: Array<StockOperationItemCost> }>(apiUrl, {
187
190
  method: 'GET',
188
191
  headers: {
189
192
  'Content-Type': 'application/json',
@@ -195,7 +198,7 @@ export function getStockOperationItemsCost(filter: StockOperationFilter) {
195
198
  export function getStockItemInventory(filter: StockItemInventoryFilter) {
196
199
  const apiUrl = `${restBaseUrl}/stockmanagement/stockiteminventory${toQueryParams(filter)}&v=default`;
197
200
  const abortController = new AbortController();
198
- return openmrsFetch(apiUrl, {
201
+ return openmrsFetch<{ results: Array<StockItemInventory> }>(apiUrl, {
199
202
  method: 'GET',
200
203
  headers: {
201
204
  'Content-Type': 'application/json',
@@ -114,9 +114,49 @@ export const stockOperationSchema = z.object({
114
114
  dispatchedByGivenName: z.string().nullish(),
115
115
  dispatchedByFamilyName: z.string().nullish(),
116
116
  dispatchedDate: z.coerce.date(),
117
- requisitionStockOperationUuid: z.string(),
117
+ requisitionStockOperationUuid: z.string().uuid().nullish(),
118
+ });
119
+ export const baseStockOperationItemSchema = z.object({
120
+ uuid: z.string().min(1, 'Required'),
121
+ stockItemUuid: z.string().min(1, { message: 'Required' }),
122
+ stockItemPackagingUOMUuid: z.string().min(1, { message: 'Required' }),
123
+ batchNo: z.string().min(1, { message: 'Required' }),
124
+ stockBatchUuid: z.string().optional(),
125
+ expiration: z.coerce.date({ required_error: 'Required' }),
126
+ quantity: z.coerce.number().min(1, { message: 'Required' }),
127
+ purchasePrice: z.coerce.number().nullish(),
128
+ hasExpiration: z.boolean().nullish(),
118
129
  });
119
130
 
131
+ export type BaseStockOperationItemFormData = z.infer<typeof baseStockOperationItemSchema>;
132
+
133
+ export const getStockOperationItemFormSchema = (operationType: OperationType) => {
134
+ switch (operationType) {
135
+ case OperationType.RECEIPT_OPERATION_TYPE:
136
+ case OperationType.OPENING_STOCK_OPERATION_TYPE:
137
+ return baseStockOperationItemSchema.omit({ stockBatchUuid: true });
138
+ case OperationType.REQUISITION_OPERATION_TYPE:
139
+ return baseStockOperationItemSchema.omit({
140
+ batchNo: true,
141
+ stockBatchUuid: true,
142
+ expiration: true,
143
+ purchasePrice: true,
144
+ });
145
+ case OperationType.ADJUSTMENT_OPERATION_TYPE:
146
+ case OperationType.DISPOSED_OPERATION_TYPE:
147
+ case OperationType.RETURN_OPERATION_TYPE:
148
+ case OperationType.STOCK_ISSUE_OPERATION_TYPE:
149
+ case OperationType.STOCK_TAKE_OPERATION_TYPE:
150
+ case OperationType.TRANSFER_OUT_OPERATION_TYPE:
151
+ return baseStockOperationItemSchema.omit({
152
+ batchNo: true,
153
+ expiration: true,
154
+ purchasePrice: true,
155
+ });
156
+ default:
157
+ return baseStockOperationItemSchema;
158
+ }
159
+ };
120
160
  export const stockOperationItemDtoSchema = z.object({
121
161
  operationDate: z.coerce.date(),
122
162
  sourceUuid: z.string({ required_error: 'Location Required' }).min(1, {
@@ -137,47 +177,65 @@ export const stockOperationItemDtoSchema = z.object({
137
177
  }),
138
178
  responsiblePersonOther: z.string().nullish(),
139
179
  remarks: z.string().nullish(),
180
+ operationTypeUuid: z.string().min(1, 'Operation type required').uuid('Invalid operation type'),
181
+ stockOperationItems: baseStockOperationItemSchema.array().nonempty('You must add atleast one stock item'),
182
+ requisitionStockOperationUuid: z.string().uuid().optional(), // Suplied only for stock issue operation
140
183
  });
141
184
 
142
185
  export type StockOperationItemDtoSchema = z.infer<typeof stockOperationItemDtoSchema>;
143
186
 
144
187
  export type StockOperationFormData = z.infer<typeof stockOperationSchema>;
145
188
 
146
- export const operationSchema = (operation: OperationType): z.Schema => {
189
+ export const getStockOperationFormSchema = (operation: OperationType): z.Schema => {
147
190
  switch (operation) {
148
191
  case OperationType.OPENING_STOCK_OPERATION_TYPE:
149
- return stockOperationItemDtoSchema.omit({
150
- destinationUuid: true,
151
- reasonUuid: true,
152
- });
192
+ return stockOperationItemDtoSchema
193
+ .omit({
194
+ destinationUuid: true,
195
+ reasonUuid: true,
196
+ })
197
+ .merge(
198
+ z.object({
199
+ stockOperationItems: getStockOperationItemFormSchema(operation)
200
+ .array()
201
+ .nonempty('You must add atleast one stock item'),
202
+ }),
203
+ );
153
204
  case OperationType.STOCK_TAKE_OPERATION_TYPE:
154
205
  case OperationType.ADJUSTMENT_OPERATION_TYPE:
155
206
  case OperationType.DISPOSED_OPERATION_TYPE:
156
- return stockOperationItemDtoSchema.omit({ destinationUuid: true });
207
+ return stockOperationItemDtoSchema.omit({ destinationUuid: true }).merge(
208
+ z.object({
209
+ stockOperationItems: getStockOperationItemFormSchema(operation)
210
+ .array()
211
+ .nonempty('You must add atleast one stock item'),
212
+ }),
213
+ );
157
214
  case OperationType.TRANSFER_OUT_OPERATION_TYPE:
158
215
  case OperationType.STOCK_ISSUE_OPERATION_TYPE:
159
216
  return stockOperationItemDtoSchema.omit({ reasonUuid: true }).merge(
160
217
  z.object({
218
+ // Merged to overid initial one with error message having location instead of destination
161
219
  destinationUuid: z.string({ required_error: 'Destination Required' }).min(1, {
162
220
  message: 'Destination Required',
163
221
  }),
222
+ stockOperationItems: getStockOperationItemFormSchema(operation)
223
+ .array()
224
+ .nonempty('You must add atleast one stock item'),
164
225
  }),
165
226
  );
166
227
  case OperationType.RETURN_OPERATION_TYPE:
167
228
  case OperationType.REQUISITION_OPERATION_TYPE:
168
- return stockOperationItemDtoSchema.omit({ reasonUuid: true }).merge(
169
- z.object({
170
- sourceUuid: z.string({ required_error: 'Source Required' }).min(1, {
171
- message: 'Source Required',
172
- }),
173
- }),
174
- );
175
229
  case OperationType.RECEIPT_OPERATION_TYPE:
176
230
  return stockOperationItemDtoSchema.omit({ reasonUuid: true }).merge(
177
231
  z.object({
232
+ // Merged to overid initial one with error message having location instead of source
178
233
  sourceUuid: z.string({ required_error: 'Source Required' }).min(1, {
179
234
  message: 'Source Required',
180
235
  }),
236
+ stockOperationItems: getStockOperationItemFormSchema(operation)
237
+ .array()
238
+ .nonempty('You must add atleast one stock item'),
181
239
  }),
182
240
  );
183
241
  }