@bjsdistribution/dms-client-return 0.1.16-prod → 0.1.17-prod

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 (57) hide show
  1. package/dist/common/date-picker/header/ClearDate.d.ts +1 -1
  2. package/dist/components/client-portal/DateFilterStore.d.ts +15 -0
  3. package/dist/components/client-portal/ReturnRTFilters.d.ts +3 -0
  4. package/dist/components/order-daily-overview/header/route-header/ClientRouterHeader.d.ts +11 -0
  5. package/dist/components/order-daily-overview/table-view/TableStyle.d.ts +4 -4
  6. package/dist/components/order-view/order-actions/types.d.ts +2 -2
  7. package/dist/components/order-view/types.d.ts +6 -0
  8. package/dist/components/order-view/utils.d.ts +8 -2
  9. package/dist/components/order-view/view-reminder/ViewReminder.d.ts +2 -0
  10. package/dist/dms-client-return.cjs.development.js +1780 -2272
  11. package/dist/dms-client-return.cjs.development.js.map +1 -1
  12. package/dist/dms-client-return.cjs.production.min.js +1 -1
  13. package/dist/dms-client-return.cjs.production.min.js.map +1 -1
  14. package/dist/dms-client-return.esm.js +1838 -2330
  15. package/dist/dms-client-return.esm.js.map +1 -1
  16. package/package.json +2 -2
  17. package/src/components/client-portal/DateFilterStore.ts +139 -0
  18. package/src/components/client-portal/OutstandingTable.tsx +16 -72
  19. package/src/components/client-portal/ReturnAfterSearchBar.tsx +42 -87
  20. package/src/components/client-portal/ReturnOverview.tsx +11 -2
  21. package/src/components/client-portal/ReturnRTFilters.tsx +140 -43
  22. package/src/components/client-portal/ReturnSearchBar.tsx +42 -153
  23. package/src/components/client-portal/ReturnStatus.tsx +30 -66
  24. package/src/components/client-portal/return-confirm/ConfirmedMain.tsx +12 -23
  25. package/src/components/client-portal/return-confirm/ReturnConfirmedTable.tsx +9 -86
  26. package/src/components/order-daily-overview/header/route-header/ClientRouterHeader.tsx +166 -0
  27. package/src/components/order-daily-overview/header/route-header/RouterHeader.tsx +2 -86
  28. package/src/components/order-daily-overview/header-filters/SelectionFilter.tsx +5 -2
  29. package/src/components/order-daily-overview/index.tsx +16 -4
  30. package/src/components/order-daily-overview/return-after-table/table-filters/ReturnFilterStore.ts +36 -36
  31. package/src/components/order-view/notification/ReminderTemplate.tsx +13 -5
  32. package/src/components/order-view/order-actions/actions/confirm-order/index.tsx +0 -29
  33. package/src/components/order-view/order-actions/actions/create-task-reminder/CreateReminderModal.tsx +86 -28
  34. package/src/components/order-view/order-actions/actions/force-debrief/ForceDebriefModal.tsx +35 -20
  35. package/src/components/order-view/order-actions/actions/force-debrief/order-info/RadioButtons.tsx +11 -62
  36. package/src/components/order-view/order-actions/index.tsx +1 -5
  37. package/src/components/order-view/order-actions/types.ts +2 -2
  38. package/src/components/order-view/order-details/expanded-content/footer/index.tsx +55 -80
  39. package/src/components/order-view/order-details/expanded-content/services-section/AssemblyType.tsx +9 -91
  40. package/src/components/order-view/order-details/expanded-content/services-section/OrderServices.tsx +10 -182
  41. package/src/components/order-view/store.ts +6 -0
  42. package/src/components/order-view/types.ts +6 -0
  43. package/src/components/order-view/utils.ts +0 -33
  44. package/src/components/order-view/view-reminder/AssigneeDropdown.tsx +85 -26
  45. package/src/components/order-view/view-reminder/ViewReminder.tsx +33 -14
  46. package/src/components/store.ts +1 -1
  47. package/src/index.tsx +17 -2
  48. package/dist/components/order-view/order-actions/actions/log-service-refusal/DeliveryPoint.d.ts +0 -7
  49. package/dist/components/order-view/order-actions/actions/log-service-refusal/Notes.d.ts +0 -7
  50. package/dist/components/order-view/order-actions/actions/log-service-refusal/OrderServices.d.ts +0 -7
  51. package/dist/components/order-view/order-actions/actions/log-service-refusal/helper.d.ts +0 -3
  52. package/dist/components/order-view/order-actions/actions/log-service-refusal/index.d.ts +0 -3
  53. package/src/components/order-view/order-actions/actions/log-service-refusal/DeliveryPoint.tsx +0 -50
  54. package/src/components/order-view/order-actions/actions/log-service-refusal/Notes.tsx +0 -50
  55. package/src/components/order-view/order-actions/actions/log-service-refusal/OrderServices.tsx +0 -57
  56. package/src/components/order-view/order-actions/actions/log-service-refusal/helper.ts +0 -26
  57. package/src/components/order-view/order-actions/actions/log-service-refusal/index.tsx +0 -130
@@ -56,11 +56,19 @@ function ReminderTemplate({ data, dismissReminder }: any) {
56
56
  {`${formatUtcToLocal(data?.due_datetime)?.date} ${
57
57
  formatUtcToLocal(data?.due_datetime)?.time
58
58
  }`}
59
- ), Assigned to: {data?.assigned_to} Completed On:{' '}
60
- {`${formatUtcToLocal(data?.completed_at)?.date} ${
61
- formatUtcToLocal(data?.completed_at)?.time
62
- }`}
63
- , By: {data?.completed_by}
59
+ )
60
+ {data?.assigned_to && (
61
+ <div>Assigned to: {data.assigned_to}</div>
62
+ )}
63
+ {data?.completed_at && (
64
+ <div>
65
+ Completed On:{' '}
66
+ {`${formatUtcToLocal(data.completed_at)?.date} ${
67
+ formatUtcToLocal(data.completed_at)?.time
68
+ }`}
69
+ </div>
70
+ )}
71
+ {data?.completed_by && <div>By: {data.completed_by}</div>}
64
72
  </StyledTitle>
65
73
  </>
66
74
  }
@@ -314,35 +314,6 @@ function ConfirmOrder(props: IProps) {
314
314
  setCurrentAction(undefined);
315
315
  };
316
316
 
317
- // const isDifferent = () => {
318
- // const keysToRemovefromOrders = [
319
- // 'order_locked',
320
- // 'order_communications',
321
- // 'updated_at',
322
- // 'updated_by',
323
- // 'order_services',
324
- // ];
325
- // const filteredOrderDetails = filterObject(
326
- // orderDetailsConfirmOrder,
327
- // keysToRemovefromOrders
328
- // );
329
- // const filteredPrevOrderDetails = filterObject(
330
- // prevOrderDetails,
331
- // keysToRemovefromOrders
332
- // );
333
- //
334
- // const orderDetailsSorted = JSON.stringify(filteredOrderDetails);
335
- // const prevOrderDetailsSorted = JSON.stringify(filteredPrevOrderDetails);
336
- // const isSame = orderDetailsSorted === prevOrderDetailsSorted;
337
- //
338
- // console.log(orderDetailsSorted, 'orderDetailsSorted');
339
- // console.log(prevOrderDetailsSorted, 'prevOrderDetailsSorted');
340
- // console.log(isSame, 'isSameisSame');
341
- //
342
- // newOrderServicesSorted === prevOrderServicesSorted;
343
- // return !isSame;
344
- // };
345
-
346
317
  const errorFound = () => {
347
318
  const isError =
348
319
  errorState.emailError.length > 0 ||
@@ -29,7 +29,7 @@ function CreateReminderModal() {
29
29
  const [displayDate, setDisplayDate] = useState<Date | null>();
30
30
  const [staticData] = useStaticData();
31
31
  const [departmentData, setDepartmentData] = useDeptData();
32
- const [selectedDeptId, setSelectedDeptId] = useState<any | null>(null);
32
+ const [selectedDeptId, setSelectedDeptId] = useState<string[]>([]);
33
33
  const [allUsers, setAllUsers] = useState<
34
34
  {
35
35
  fName: string;
@@ -58,21 +58,40 @@ function CreateReminderModal() {
58
58
  return staticData?.[0]?.priorities?.map((option: any) => {
59
59
  const colorMatch = priorityData?.find(p => p.id === option.id);
60
60
  return {
61
- label: option.name,
62
- value: option.id,
61
+ label: option?.name,
62
+ value: option?.id,
63
63
  color: colorMatch?.color || '#ccc',
64
64
  };
65
65
  });
66
66
  };
67
67
  const priorityOptions = getPriorityOptions(staticData);
68
68
 
69
- //subcategory change
70
- const handleDepartmentChange = (value: string, option: { label: string }) => {
71
- setSelectedDeptId(value);
72
- setReminderPayload((prevState: any) => ({
73
- ...prevState,
74
- department: option?.label,
75
- assigned_to: null,
69
+ const handleDepartmentChange = (
70
+ values: string[],
71
+ options: { label: string }[]
72
+ ) => {
73
+ setSelectedDeptId(values);
74
+
75
+ if (reminderPayload && reminderPayload?.assigned_to!?.length > 0) {
76
+ const matchedUsers = allUsers?.filter(
77
+ user => user?.deptId !== null && values?.includes(String(user?.deptId))
78
+ );
79
+
80
+ const filteredAssignedTo = reminderPayload?.assigned_to?.filter(
81
+ (id: any) => matchedUsers?.some(user => user.id === id)
82
+ );
83
+
84
+ setReminderPayload((prev: any) => ({
85
+ ...prev,
86
+ assigned_to: filteredAssignedTo,
87
+ }));
88
+ }
89
+
90
+ const deptLabels = options?.map(opt => opt.label);
91
+
92
+ setReminderPayload(prev => ({
93
+ ...prev,
94
+ department: deptLabels.join(', '),
76
95
  }));
77
96
  };
78
97
 
@@ -113,11 +132,16 @@ function CreateReminderModal() {
113
132
  };
114
133
 
115
134
  // sso Data get
116
- const { fetchData: getSSOData, data: fetchData } = useAxios<{
135
+ const {
136
+ fetchData: getSSOData,
137
+ data: fetchData,
138
+ loading: deptLoading,
139
+ } = useAxios<{
117
140
  data: ApiResponse[];
118
141
  }>({
119
142
  endpoint: `/sso/departments/`,
120
143
  method: 'GET',
144
+ showLoader: false,
121
145
  });
122
146
 
123
147
  useEffect(() => {
@@ -131,9 +155,12 @@ function CreateReminderModal() {
131
155
  fetchAllSSOData();
132
156
  }, []);
133
157
 
134
- const { fetchData: getUsersData } = useAxios<{ data: any }>({
158
+ const { fetchData: getUsersData, loading: userDataLoading } = useAxios<{
159
+ data: any;
160
+ }>({
135
161
  endpoint: `/sso/users/`,
136
162
  method: 'GET',
163
+ showLoader: false,
137
164
  });
138
165
 
139
166
  useEffect(() => {
@@ -207,24 +234,22 @@ function CreateReminderModal() {
207
234
  }));
208
235
 
209
236
  const handleAssignToMe = () => {
237
+ const storedUserJSON = localStorage.getItem('user_type');
238
+ if (!storedUserJSON) return;
239
+
210
240
  let storedUserID: string | null = null;
211
241
 
212
- const storedUserJSON = localStorage.getItem('User_iD');
213
- if (storedUserJSON) {
214
- try {
215
- const parsed = JSON.parse(storedUserJSON);
216
- storedUserID = parsed.user_id || null;
217
- } catch (e) {
218
- console.error('Failed to parse stored user ID', e);
219
- }
242
+ try {
243
+ const parsed = JSON.parse(storedUserJSON);
244
+ storedUserID = parsed?.user_id ?? null;
245
+ } catch (e) {
246
+ console.error('Failed to parse stored user_type from localStorage', e);
247
+ return;
220
248
  }
221
249
 
222
250
  if (!storedUserID) return;
223
- console.log(allUsers, 'allUsersallUsersallUsers');
224
- const matchedUser: any = allUsers?.find(user => user?.id === storedUserID);
225
251
 
226
- console.log(storedUserID, 'storedUserID');
227
- console.log(matchedUser, 'matchedUser');
252
+ const matchedUser: any = allUsers?.find(user => user?.id === storedUserID);
228
253
 
229
254
  const deptMatched =
230
255
  departmentData?.find((dept: any) => dept.value === matchedUser?.deptId)
@@ -244,9 +269,39 @@ function CreateReminderModal() {
244
269
  department: deptMatched,
245
270
  }));
246
271
 
247
- matchedUser && setSelectedDeptId(matchedUser?.department_id);
272
+ if (matchedUser?.deptId) {
273
+ setSelectedDeptId(matchedUser.deptId.toString());
274
+ }
248
275
  };
249
276
 
277
+ useEffect(() => {
278
+ if (
279
+ Array.isArray(selectedDeptId) &&
280
+ selectedDeptId?.length > 0 &&
281
+ allUsers?.length > 0
282
+ ) {
283
+ const matchedUsers = allUsers?.filter(
284
+ user =>
285
+ user?.deptId !== null &&
286
+ selectedDeptId?.includes(String(user?.deptId))
287
+ );
288
+ const currentAssigned = (reminderPayload?.assigned_to || []) as string[];
289
+
290
+ const currentAssignedUsers = allUsers?.filter(user =>
291
+ currentAssigned?.includes(user?.id || '')
292
+ );
293
+
294
+ const mergedUsers = [...matchedUsers, ...currentAssignedUsers];
295
+ const uniqueUsers = Array.from(
296
+ new Map(mergedUsers?.map(u => [u?.id, u]))?.values()
297
+ );
298
+
299
+ setFilteredUsers(uniqueUsers);
300
+ } else {
301
+ setFilteredUsers(allUsers);
302
+ }
303
+ }, [selectedDeptId, allUsers]);
304
+
250
305
  return (
251
306
  <Wrapper>
252
307
  <SplitContainer>
@@ -254,11 +309,13 @@ function CreateReminderModal() {
254
309
  <DoubleDropdownContainer>
255
310
  <StyledAntSelect
256
311
  options={deptData}
257
- style={{ width: '10vw' }}
258
- placeholder="Select Department"
312
+ style={{ width: '20vw' }}
313
+ placeholder="Select Department(s)"
259
314
  onChange={handleDepartmentChange}
260
- value={reminderPayload?.department || undefined}
315
+ value={selectedDeptId || []}
316
+ loading={deptLoading}
261
317
  showSearch
318
+ mode="multiple"
262
319
  />
263
320
  </DoubleDropdownContainer>
264
321
  </FormRow>
@@ -271,6 +328,7 @@ function CreateReminderModal() {
271
328
  value={reminderPayload?.assigned_to || []}
272
329
  showSearch
273
330
  mode="multiple"
331
+ loading={userDataLoading}
274
332
  filterOption={(input: string, option?: { label: string }) =>
275
333
  option?.label.toLowerCase().includes(input.toLowerCase())
276
334
  }
@@ -29,7 +29,6 @@ import BaseCharges from './charges/base-charge';
29
29
  import DeliveryAddOns from './charges/delivery-add-ons';
30
30
  import AdhocSection from './charges/adhoc';
31
31
  import OrderInfo from './order-info';
32
- import {} from '../../store';
33
32
  import ForceDebriefSelector from './Selector';
34
33
  import {
35
34
  Checkbox,
@@ -41,7 +40,7 @@ import Escalation from './escalation';
41
40
  import FDNotification from './notifications';
42
41
 
43
42
  import { compareOrderDetailsStates, filterObject } from '../../../utils';
44
- import { AdhocCharge, ApiResponse, OrderServiceType } from '../../../types';
43
+ import { AdhocCharge, ApiResponse, OrdersType } from '../../../types';
45
44
  import { notification } from 'antd';
46
45
  import BaseChargeConfirmationModal from './BaseChargeConfirmationModal';
47
46
  import { v4 as uuidv4 } from 'uuid';
@@ -223,7 +222,6 @@ function ForceDebriefModal(props: IProps) {
223
222
  'order_communications',
224
223
  'updated_at',
225
224
  'updated_by',
226
- 'order_services',
227
225
  ];
228
226
  const filteredOrderDetails = filterObject(
229
227
  orderDetails,
@@ -234,25 +232,9 @@ function ForceDebriefModal(props: IProps) {
234
232
  keysToRemovefromOrders
235
233
  );
236
234
 
237
- const newOrderServices =
238
- orderDetails?.order_services?.length > 0 &&
239
- orderDetails?.order_services?.sort(
240
- (a: OrderServiceType, b: OrderServiceType) => a.id! - b.id!
241
- );
242
-
243
- const prevOrderServices =
244
- prevOrderDetails?.order_services?.length > 0 &&
245
- prevOrderDetails?.order_services.sort(
246
- (a: OrderServiceType, b: OrderServiceType) => a.id! - b.id!
247
- );
248
-
249
- const newOrderServicesSorted = JSON.stringify(newOrderServices);
250
- const prevOrderServicesSorted = JSON.stringify(prevOrderServices);
251
235
  const orderDetailsSorted = JSON.stringify(filteredOrderDetails);
252
236
  const prevOrderDetailsSorted = JSON.stringify(filteredPrevOrderDetails);
253
- const isSame =
254
- orderDetailsSorted === prevOrderDetailsSorted &&
255
- newOrderServicesSorted === prevOrderServicesSorted;
237
+ const isSame = orderDetailsSorted === prevOrderDetailsSorted;
256
238
  return !isSame;
257
239
  };
258
240
 
@@ -285,6 +267,39 @@ function ForceDebriefModal(props: IProps) {
285
267
  orderDetails
286
268
  );
287
269
 
270
+ const serviceKeys = [
271
+ 'assemble',
272
+ 'disassemble',
273
+ 'unpack_items',
274
+ 'collect_disposal',
275
+ 'take_packaging_away',
276
+ 'assembly_type',
277
+ ];
278
+
279
+ let orderServicesPayload: Record<string, any> = {};
280
+
281
+ const includesKey = serviceKeys.some(key => key in ordersApiPayload);
282
+
283
+ if (includesKey) {
284
+ for (const key of serviceKeys) {
285
+ orderServicesPayload[key as keyof typeof ordersApiPayload] =
286
+ key in ordersApiPayload
287
+ ? ordersApiPayload[key as keyof typeof ordersApiPayload]
288
+ : orderDetails[key as keyof OrdersType];
289
+ delete ordersApiPayload[key as keyof typeof ordersApiPayload];
290
+ if (
291
+ orderServicesPayload?.assemble === false &&
292
+ orderServicesPayload?.disassemble === false
293
+ ) {
294
+ orderServicesPayload.assembly_type = null;
295
+ }
296
+ }
297
+ }
298
+
299
+ if (Object.keys(orderServicesPayload).length > 0) {
300
+ ordersApiPayload.order_services = [orderServicesPayload];
301
+ }
302
+
288
303
  try {
289
304
  let response = (await callUpdateOrderAPI({
290
305
  payload: [ordersApiPayload],
@@ -2,7 +2,7 @@ import { RadioButtonGroup } from '@bjsdistribution/dms-component-library';
2
2
  import React from 'react';
3
3
  import styled from 'styled-components';
4
4
  import { useOrderDetails, useOrderStaticData } from '../../../../store';
5
- import { OrderServiceType } from '../../../../types';
5
+ import { OrdersType } from '../../../../types';
6
6
  import { capitalize } from '../../../../utils';
7
7
 
8
8
  export const radioButtonFilterOptions = [
@@ -36,7 +36,6 @@ function RadioButtonGroups() {
36
36
  );
37
37
 
38
38
  const orderServicesOptions = orderStaticData?.order_service_list;
39
- const orderServices = orderDetails?.order_services;
40
39
  const deliveryPointId = orderDetails?.order_services_detail?.order_delivery_point_id?.toString();
41
40
  const serviceLevelId = orderDetails?.order_services_detail?.order_service_level_id?.toString();
42
41
  const orderTypeId = orderDetails?.order_type_id?.toString();
@@ -68,61 +67,15 @@ function RadioButtonGroups() {
68
67
  };
69
68
 
70
69
  const onChangeServices = (id: number) => {
71
- const clone = [...orderServices];
72
-
73
- // Check if the service already exists in the order
74
- const selectedService = clone.find(
75
- (s: OrderServiceType) => s.order_service_list_id === id
70
+ const selectedService = orderServicesOptions?.find(
71
+ (item: any) => item.id === id
76
72
  );
77
-
78
- if (selectedService !== undefined) {
79
- if (selectedService.new_id) {
80
- // It's a newly added service, just remove it
81
- const updatedOrderServices = clone.filter(
82
- (service: OrderServiceType) => service.id !== selectedService.id
83
- );
84
- const newData = {
85
- ...orderDetails,
86
- order_services: updatedOrderServices,
87
- };
88
- setOrderDetails(newData);
89
- } else {
90
- // It's an existing (persisted) service, toggle its `is_deleted` flag
91
- const updatedSelectedService = {
92
- ...selectedService,
93
- is_deleted: !selectedService.is_deleted,
94
- };
95
-
96
- const updatedOrderServices = clone
97
- .filter(
98
- (service: OrderServiceType) => service.id !== selectedService.id
99
- )
100
- .concat(updatedSelectedService);
101
-
102
- const newData = {
103
- ...orderDetails,
104
- order_services: updatedOrderServices,
105
- };
106
- setOrderDetails(newData);
107
- }
108
- } else {
109
- // Case 2: Service doesn't exist — add it as a new one
110
- const newService: OrderServiceType = {
111
- is_deleted: false,
112
- order_service_list_id: id,
113
- new_id: id,
114
- id: id,
115
- };
116
-
117
- clone.push(newService);
118
-
119
- const newData = {
120
- ...orderDetails,
121
- order_services: clone,
122
- };
123
-
124
- setOrderDetails(newData);
125
- }
73
+ const key = selectedService?.type;
74
+ const value = !orderDetails[key as keyof OrdersType];
75
+ setOrderDetails(prev => ({
76
+ ...prev,
77
+ [key]: value,
78
+ }));
126
79
  };
127
80
 
128
81
  return (
@@ -162,18 +115,14 @@ function RadioButtonGroups() {
162
115
  </Group>
163
116
 
164
117
  {orderServicesOptions?.map((service: any) => {
165
- const selected = !!orderServices?.find(
166
- (s: OrderServiceType) =>
167
- s?.order_service_list_id === service?.id && s.is_deleted === false
168
- );
169
-
118
+ const selected = orderDetails[service?.type as keyof OrdersType];
170
119
  return (
171
120
  <Group>
172
121
  <RadioButtonGroup
173
122
  heading={service?.type?.replaceAll('_', ' ')}
174
123
  onChange={() => onChangeServices(service?.id)}
175
124
  options={radioButtonFilterOptions || []}
176
- selectedValue={selected === false ? 'false' : 'true'}
125
+ selectedValue={selected ? 'true' : 'false'}
177
126
  direction="vertical"
178
127
  required={false}
179
128
  isDisabled
@@ -12,7 +12,6 @@ import {
12
12
  useStatusDetails,
13
13
  } from '../store';
14
14
  import SplitOrder from './actions/split-order';
15
- import LogServiceRefusal from './actions/log-service-refusal';
16
15
  import CancelOrder from './actions/cancel-order';
17
16
  import ConfirmOrder from './actions/confirm-order';
18
17
  import SendSmsModal from './actions/send-sms/SendSmsModal';
@@ -213,10 +212,7 @@ function OrderActions() {
213
212
  return <SplitOrder />;
214
213
  case 'release-order':
215
214
  return <ReleaseOrder />;
216
- // case 'unrelease-order':
217
- // return <UnreleaseOrder />;
218
- case 'log-service-refusal':
219
- return <LogServiceRefusal callOrdersApi={callOrdersApi} />;
215
+
220
216
  case 'cancel-order':
221
217
  return (
222
218
  <CancelOrder
@@ -31,7 +31,7 @@ export interface resolveTaskPayload {
31
31
  export interface CreateReminderPayload {
32
32
  due_datetime: Date | null;
33
33
  description: string | null;
34
- assigned_to: string | null;
34
+ assigned_to: any | null;
35
35
  order_id: number | null;
36
36
  priority: number | null;
37
37
  department: string | null;
@@ -49,7 +49,7 @@ export interface SingleResolvedPayload {
49
49
  export interface UpdateReminderPayload {
50
50
  due_datetime: any | null;
51
51
  description: any | null;
52
- assigned_to: string | null;
52
+ assigned_to: any | null;
53
53
  order_id: number | null;
54
54
  priority: number | null;
55
55
  department: any | null;
@@ -9,12 +9,12 @@ import {
9
9
  errorAtom,
10
10
  useCustomerInfo,
11
11
  useGlobalStateHitAuditLog,
12
- useOrderStaticData,
13
12
  useGlobalStateHitOrder,
13
+ useLiveRecalling,
14
14
  } from '../../../store';
15
15
  // import useUpdateOrder from '../../../hooks/useUpdateOrder';
16
16
  import { compareOrderDetailsStates, filterObject } from '../../../utils';
17
- import { ApiResponse, OrderServiceType } from '../../../types';
17
+ import { ApiResponse, OrdersType } from '../../../types';
18
18
  import { notification } from 'antd';
19
19
  import { useClientPortal } from '../../../../store';
20
20
 
@@ -25,10 +25,9 @@ function OrderDetailsFooter() {
25
25
  // const updateOrder = useUpdateOrder();
26
26
  const [errorState] = useAtom(errorAtom);
27
27
  const [, setRecallAuditLog] = useGlobalStateHitAuditLog();
28
- const [orderStaticData] = useOrderStaticData();
29
28
  const [, setRecallOrders] = useGlobalStateHitOrder();
30
29
  const [isClientPortal] = useClientPortal();
31
-
30
+ const [, setRecalling] = useLiveRecalling();
32
31
  //update order
33
32
  const { fetchData: callUpdateOrderAPI } = useAxios<{
34
33
  data: ApiResponse[];
@@ -55,7 +54,6 @@ function OrderDetailsFooter() {
55
54
  'order_communications',
56
55
  'updated_at',
57
56
  'updated_by',
58
- 'order_services',
59
57
  ];
60
58
  const filteredOrderDetails = filterObject(
61
59
  orderDetails,
@@ -66,97 +64,74 @@ function OrderDetailsFooter() {
66
64
  keysToRemovefromOrders
67
65
  );
68
66
 
69
- const newOrderServices =
70
- orderDetails?.order_services?.length > 0 &&
71
- orderDetails?.order_services?.sort(
72
- (a: OrderServiceType, b: OrderServiceType) => a.id! - b.id!
73
- );
74
-
75
- const prevOrderServices =
76
- prevOrderDetails?.order_services?.length > 0 &&
77
- prevOrderDetails?.order_services.sort(
78
- (a: OrderServiceType, b: OrderServiceType) => a.id! - b.id!
79
- );
80
-
81
- const newOrderServicesSorted = JSON.stringify(newOrderServices);
82
- const prevOrderServicesSorted = JSON.stringify(prevOrderServices);
83
67
  const orderDetailsSorted = JSON.stringify(filteredOrderDetails);
84
68
  const prevOrderDetailsSorted = JSON.stringify(filteredPrevOrderDetails);
85
- const isSame =
86
- orderDetailsSorted === prevOrderDetailsSorted &&
87
- newOrderServicesSorted === prevOrderServicesSorted;
69
+ const isSame = orderDetailsSorted === prevOrderDetailsSorted;
88
70
  return !isSame;
89
71
  };
90
72
 
91
73
  const onSave = async () => {
92
74
  setRecallAuditLog(false);
93
75
  setRecallOrders(false);
76
+ setRecalling(false);
94
77
  const payload = compareOrderDetailsStates(prevOrderDetails, orderDetails);
95
- const clone = [...orderDetails?.order_services];
96
78
 
97
- // ASSEMBLE AND DISASSEMBLE SERVICES CHECK FOR ASSEMBLE TYPE
98
- const assembleOrderService = orderStaticData?.order_service_list?.find(
99
- (x: any) => x?.type?.toLowerCase() === 'assemble'
100
- );
101
- const disassembleOrderService = orderStaticData?.order_service_list?.find(
102
- (x: any) => x?.type?.toLowerCase() === 'disassemble'
103
- );
79
+ const serviceKeys = [
80
+ 'assemble',
81
+ 'disassemble',
82
+ 'unpack_items',
83
+ 'collect_disposal',
84
+ 'take_packaging_away',
85
+ 'assembly_type',
86
+ ];
104
87
 
105
- const assemblyTypeService = clone?.find(
106
- (x: any) => x?.order_service_list_id === assembleOrderService?.id
107
- );
88
+ let orderServicesPayload: Record<string, any> = {};
89
+
90
+ const includesKey = serviceKeys.some(key => key in payload);
91
+
92
+ if (includesKey) {
93
+ for (const key of serviceKeys) {
94
+ orderServicesPayload[key as keyof typeof payload] =
95
+ key in payload
96
+ ? payload[key as keyof typeof payload]
97
+ : orderDetails[key as keyof OrdersType];
98
+ delete payload[key as keyof typeof payload];
99
+ if (
100
+ orderServicesPayload?.assemble === false &&
101
+ orderServicesPayload?.disassemble === false
102
+ ) {
103
+ orderServicesPayload.assembly_type = null;
104
+ }
105
+ }
106
+ }
108
107
 
109
- const disassemblyTypeService = clone?.find(
110
- (x: any) => x?.order_service_list_id === disassembleOrderService?.id
111
- );
108
+ if (Object.keys(orderServicesPayload).length > 0) {
109
+ payload.order_services = [orderServicesPayload];
110
+ }
112
111
 
113
- if (
114
- assemblyTypeService !== undefined &&
115
- assemblyTypeService?.is_deleted === false &&
116
- (assemblyTypeService?.service_category_id === undefined ||
117
- assemblyTypeService?.service_category_id === null)
118
- ) {
119
- notification.info({
120
- message: 'Info',
121
- description: 'Assembly Type is required',
112
+ let response = (await callUpdateOrderAPI({
113
+ payload: [payload],
114
+ })) as {
115
+ code: number | null;
116
+ error?: string | null | undefined;
117
+ [key: string]: any;
118
+ };
119
+ // const response = await updateOrder([payload]);
120
+ setRecallOrders(true);
121
+ if (response.code == 200 && response?.data?.length > 0) {
122
+ notification.success({
123
+ message: 'Success',
124
+ description: `${response?.message}`,
122
125
  });
123
- return;
124
- } else if (
125
- disassemblyTypeService !== undefined &&
126
- disassemblyTypeService?.is_deleted === false &&
127
- (disassemblyTypeService?.service_category_id === undefined ||
128
- disassemblyTypeService?.service_category_id === null)
129
- ) {
130
- notification.info({
131
- message: 'Info',
132
- description: 'Assembly Type is required',
126
+ setOrderDetails(response?.data[0]);
127
+ setPrevOrderDetails(response?.data[0]);
128
+ setCustomerInfo({
129
+ recipient_name: response?.data[0]?.order_recipient?.recipient_name,
130
+ postcode: response?.data[0]?.order_recipient?.postcode,
133
131
  });
134
- return;
132
+ setRecallAuditLog(true);
135
133
  } else {
136
- let response = (await callUpdateOrderAPI({
137
- payload: [payload],
138
- })) as {
139
- code: number | null;
140
- error?: string | null | undefined;
141
- [key: string]: any;
142
- };
143
- // const response = await updateOrder([payload]);
144
- setRecallOrders(true);
145
- if (response.code == 200 && response?.data?.length > 0) {
146
- notification.success({
147
- message: 'Success',
148
- description: `${response?.message}`,
149
- });
150
- setOrderDetails(response?.data[0]);
151
- setPrevOrderDetails(response?.data[0]);
152
- setCustomerInfo({
153
- recipient_name: response?.data[0]?.order_recipient?.recipient_name,
154
- postcode: response?.data[0]?.order_recipient?.postcode,
155
- });
156
- setRecallAuditLog(true);
157
- } else {
158
- setOrderDetails(prevOrderDetails);
159
- }
134
+ setOrderDetails(prevOrderDetails);
160
135
  }
161
136
  };
162
137