washday-sdk 1.6.41 → 1.6.43

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.
@@ -38,3 +38,45 @@ export const createGlobalCFDI = function (data) {
38
38
  }
39
39
  });
40
40
  };
41
+ export const searchGlobalByPaymentMethodCandidates = function (data) {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ try {
44
+ const config = {
45
+ headers: { Authorization: `Bearer ${this.apiToken}` }
46
+ };
47
+ return yield this.axiosInstance.post(`${GET_SET_CFDI}/global-by-payment-method/search`, data, config);
48
+ }
49
+ catch (error) {
50
+ console.error('Error searchGlobalByPaymentMethodCandidates:', error);
51
+ throw error;
52
+ }
53
+ });
54
+ };
55
+ export const previewGlobalByPaymentMethodCFDI = function (data) {
56
+ return __awaiter(this, void 0, void 0, function* () {
57
+ try {
58
+ const config = {
59
+ headers: { Authorization: `Bearer ${this.apiToken}` }
60
+ };
61
+ return yield this.axiosInstance.post(`${GET_SET_CFDI}/global-by-payment-method/preview`, data, config);
62
+ }
63
+ catch (error) {
64
+ console.error('Error previewGlobalByPaymentMethodCFDI:', error);
65
+ throw error;
66
+ }
67
+ });
68
+ };
69
+ export const createGlobalByPaymentMethodCFDI = function (data) {
70
+ return __awaiter(this, void 0, void 0, function* () {
71
+ try {
72
+ const config = {
73
+ headers: { Authorization: `Bearer ${this.apiToken}` }
74
+ };
75
+ return yield this.axiosInstance.post(`${GET_SET_CFDI}/global-by-payment-method`, data, config);
76
+ }
77
+ catch (error) {
78
+ console.error('Error createGlobalByPaymentMethodCFDI:', error);
79
+ throw error;
80
+ }
81
+ });
82
+ };
@@ -429,3 +429,30 @@ export const exportScheduledDeliveriesReport = function (companyId, params) {
429
429
  }
430
430
  });
431
431
  };
432
+ export const exportServicesToDeliverReport = function (companyId, params) {
433
+ return __awaiter(this, void 0, void 0, function* () {
434
+ try {
435
+ const config = {
436
+ headers: {
437
+ Authorization: `Bearer ${this.apiToken}`,
438
+ 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
439
+ 'Content-disposition': 'attachment; filename=[file.xlsx]'
440
+ },
441
+ params: {
442
+ responseType: 'blob'
443
+ }
444
+ };
445
+ const queryParams = generateQueryParamsStr([
446
+ 'storeId',
447
+ 'dateFrom',
448
+ 'dateTo',
449
+ 'hideReady'
450
+ ], params);
451
+ return yield this.axiosInstance.get(`${GET_SET_REPORTS}/${companyId}/servicesToDeliver/export/csv?${queryParams}`, config);
452
+ }
453
+ catch (error) {
454
+ console.error('Error fetching exportServicesToDeliverReport:', error);
455
+ throw error;
456
+ }
457
+ });
458
+ };
package/dist/api/index.js CHANGED
@@ -77,6 +77,9 @@ const WashdayClient = function WashdayClient(apiToken, env = 'PROD', clientId, c
77
77
  getCFDIPreviewByOrderId: cfdiEndpoints.getModule.getCFDIPreviewByOrderId,
78
78
  createCFDI: cfdiEndpoints.postModule.createCFDI,
79
79
  createGlobalCFDI: cfdiEndpoints.postModule.createGlobalCFDI,
80
+ searchGlobalByPaymentMethodCandidates: cfdiEndpoints.postModule.searchGlobalByPaymentMethodCandidates,
81
+ previewGlobalByPaymentMethodCFDI: cfdiEndpoints.postModule.previewGlobalByPaymentMethodCFDI,
82
+ createGlobalByPaymentMethodCFDI: cfdiEndpoints.postModule.createGlobalByPaymentMethodCFDI,
80
83
  cancelCFDI: cfdiEndpoints.deleteModule.cancelCFDI
81
84
  });
82
85
  this.review = bindMethods(this, {
@@ -308,6 +311,7 @@ const WashdayClient = function WashdayClient(apiToken, env = 'PROD', clientId, c
308
311
  exportAttendanceReport: csvExportEndpoints.getModule.exportAttendanceReport,
309
312
  exportCashUpReportsByDateRange: csvExportEndpoints.getModule.exportCashUpReportsByDateRange,
310
313
  exportScheduledDeliveriesReport: csvExportEndpoints.getModule.exportScheduledDeliveriesReport,
314
+ exportServicesToDeliverReport: csvExportEndpoints.getModule.exportServicesToDeliverReport,
311
315
  });
312
316
  this.pdf = bindMethods(this, {
313
317
  exportUnpaidOrdersReportPDF: pdfExportEndpoints.getModule.exportUnpaidOrdersReportPDF,
@@ -327,6 +331,7 @@ const WashdayClient = function WashdayClient(apiToken, env = 'PROD', clientId, c
327
331
  getCashierBoxMovementsReport: reportsExportEndpoints.getModule.getCashierBoxMovementsReport,
328
332
  getUnpaidOrdersReport: reportsExportEndpoints.getModule.getUnpaidOrdersReport,
329
333
  getScheduledDeliveries: reportsExportEndpoints.getModule.getScheduledDeliveries,
334
+ getServicesToDeliver: reportsExportEndpoints.getModule.getServicesToDeliver,
330
335
  getAnnualSalesStatistics: reportsExportEndpoints.getModule.getAnnualSalesStatistics,
331
336
  getPaymentMethodStatistics: reportsExportEndpoints.getModule.getPaymentMethodStatistics,
332
337
  getProductsStatistics: reportsExportEndpoints.getModule.getProductsStatistics,
@@ -113,6 +113,8 @@ export const fetchOrdersForCFDI = function (params) {
113
113
  "fromDate",
114
114
  "toDate",
115
115
  "storeID",
116
+ "storeIds",
117
+ "includeAllStores",
116
118
  "customerID"
117
119
  ], params);
118
120
  return yield this.axiosInstance.get(`${GET_SET_ORDER_CFDI}/cfdiPreview?${queryParams}`, config);
@@ -432,3 +432,23 @@ export const getScheduledDeliveries = function (companyId, params) {
432
432
  }
433
433
  });
434
434
  };
435
+ export const getServicesToDeliver = function (companyId, params) {
436
+ return __awaiter(this, void 0, void 0, function* () {
437
+ try {
438
+ const config = {
439
+ headers: { Authorization: `Bearer ${this.apiToken}` }
440
+ };
441
+ const queryParams = generateQueryParamsStr([
442
+ 'storeId',
443
+ 'dateFrom',
444
+ 'dateTo',
445
+ 'hideReady',
446
+ ], params);
447
+ return yield this.axiosInstance.get(`${GET_SET_REPORTS}/${companyId}/servicesToDeliver?${queryParams}`, config);
448
+ }
449
+ catch (error) {
450
+ console.error('Error fetching getServicesToDeliver:', error);
451
+ throw error;
452
+ }
453
+ });
454
+ };
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as utils from './utils';
2
2
  import WashdayClient from './api';
3
3
  export * from './interfaces/Company';
4
+ export * from './interfaces/Cfdi';
4
5
  export { WashdayClient, utils };
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "washday-sdk",
3
- "version": "1.6.41",
3
+ "version": "1.6.43",
4
4
  "description": "Washday utilities functions and API",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -1,4 +1,8 @@
1
1
  import { WashdayClientInstance } from "../../interfaces/Api";
2
+ import {
3
+ GlobalByPaymentMethodCFDIPayload,
4
+ SearchGlobalByPaymentMethodCandidatesPayload,
5
+ } from "../../interfaces/Cfdi";
2
6
  import axiosInstance from "../axiosInstance";
3
7
  const GET_SET_CFDI = 'api/cfdi';
4
8
  const GET_SET_ORDERS_CFDI = (orderID: string) => `api/order/${orderID}/cfdi`;
@@ -58,3 +62,48 @@ export const createGlobalCFDI = async function (this: WashdayClientInstance, dat
58
62
  throw error;
59
63
  }
60
64
  };
65
+
66
+ export const searchGlobalByPaymentMethodCandidates = async function (
67
+ this: WashdayClientInstance,
68
+ data: SearchGlobalByPaymentMethodCandidatesPayload
69
+ ): Promise<any> {
70
+ try {
71
+ const config = {
72
+ headers: { Authorization: `Bearer ${this.apiToken}` }
73
+ };
74
+ return await this.axiosInstance.post(`${GET_SET_CFDI}/global-by-payment-method/search`, data, config);
75
+ } catch (error) {
76
+ console.error('Error searchGlobalByPaymentMethodCandidates:', error);
77
+ throw error;
78
+ }
79
+ };
80
+
81
+ export const previewGlobalByPaymentMethodCFDI = async function (
82
+ this: WashdayClientInstance,
83
+ data: GlobalByPaymentMethodCFDIPayload
84
+ ): Promise<any> {
85
+ try {
86
+ const config = {
87
+ headers: { Authorization: `Bearer ${this.apiToken}` }
88
+ };
89
+ return await this.axiosInstance.post(`${GET_SET_CFDI}/global-by-payment-method/preview`, data, config);
90
+ } catch (error) {
91
+ console.error('Error previewGlobalByPaymentMethodCFDI:', error);
92
+ throw error;
93
+ }
94
+ };
95
+
96
+ export const createGlobalByPaymentMethodCFDI = async function (
97
+ this: WashdayClientInstance,
98
+ data: GlobalByPaymentMethodCFDIPayload
99
+ ): Promise<any> {
100
+ try {
101
+ const config = {
102
+ headers: { Authorization: `Bearer ${this.apiToken}` }
103
+ };
104
+ return await this.axiosInstance.post(`${GET_SET_CFDI}/global-by-payment-method`, data, config);
105
+ } catch (error) {
106
+ console.error('Error createGlobalByPaymentMethodCFDI:', error);
107
+ throw error;
108
+ }
109
+ };
@@ -470,3 +470,33 @@ export const exportScheduledDeliveriesReport = async function (this: WashdayClie
470
470
  throw error;
471
471
  }
472
472
  };
473
+
474
+ export const exportServicesToDeliverReport = async function (this: WashdayClientInstance, companyId: string, params: {
475
+ storeId?: string
476
+ dateFrom?: string
477
+ dateTo?: string
478
+ hideReady?: string
479
+ }): Promise<any> {
480
+ try {
481
+ const config = {
482
+ headers: {
483
+ Authorization: `Bearer ${this.apiToken}`,
484
+ 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
485
+ 'Content-disposition': 'attachment; filename=[file.xlsx]'
486
+ },
487
+ params: {
488
+ responseType: 'blob'
489
+ }
490
+ };
491
+ const queryParams = generateQueryParamsStr([
492
+ 'storeId',
493
+ 'dateFrom',
494
+ 'dateTo',
495
+ 'hideReady'
496
+ ], params);
497
+ return await this.axiosInstance.get(`${GET_SET_REPORTS}/${companyId}/servicesToDeliver/export/csv?${queryParams}`, config);
498
+ } catch (error) {
499
+ console.error('Error fetching exportServicesToDeliverReport:', error);
500
+ throw error;
501
+ }
502
+ };
package/src/api/index.ts CHANGED
@@ -84,6 +84,9 @@ const WashdayClient: WashdayClientConstructor = function WashdayClient(this: Was
84
84
  getCFDIPreviewByOrderId: cfdiEndpoints.getModule.getCFDIPreviewByOrderId,
85
85
  createCFDI: cfdiEndpoints.postModule.createCFDI,
86
86
  createGlobalCFDI: cfdiEndpoints.postModule.createGlobalCFDI,
87
+ searchGlobalByPaymentMethodCandidates: cfdiEndpoints.postModule.searchGlobalByPaymentMethodCandidates,
88
+ previewGlobalByPaymentMethodCFDI: cfdiEndpoints.postModule.previewGlobalByPaymentMethodCFDI,
89
+ createGlobalByPaymentMethodCFDI: cfdiEndpoints.postModule.createGlobalByPaymentMethodCFDI,
87
90
  cancelCFDI: cfdiEndpoints.deleteModule.cancelCFDI
88
91
  });
89
92
  this.review = bindMethods(this, {
@@ -315,6 +318,7 @@ const WashdayClient: WashdayClientConstructor = function WashdayClient(this: Was
315
318
  exportAttendanceReport: csvExportEndpoints.getModule.exportAttendanceReport,
316
319
  exportCashUpReportsByDateRange: csvExportEndpoints.getModule.exportCashUpReportsByDateRange,
317
320
  exportScheduledDeliveriesReport: csvExportEndpoints.getModule.exportScheduledDeliveriesReport,
321
+ exportServicesToDeliverReport: csvExportEndpoints.getModule.exportServicesToDeliverReport,
318
322
  });
319
323
  this.pdf = bindMethods(this, {
320
324
  exportUnpaidOrdersReportPDF: pdfExportEndpoints.getModule.exportUnpaidOrdersReportPDF,
@@ -334,6 +338,7 @@ const WashdayClient: WashdayClientConstructor = function WashdayClient(this: Was
334
338
  getCashierBoxMovementsReport: reportsExportEndpoints.getModule.getCashierBoxMovementsReport,
335
339
  getUnpaidOrdersReport: reportsExportEndpoints.getModule.getUnpaidOrdersReport,
336
340
  getScheduledDeliveries: reportsExportEndpoints.getModule.getScheduledDeliveries,
341
+ getServicesToDeliver: reportsExportEndpoints.getModule.getServicesToDeliver,
337
342
  getAnnualSalesStatistics: reportsExportEndpoints.getModule.getAnnualSalesStatistics,
338
343
  getPaymentMethodStatistics: reportsExportEndpoints.getModule.getPaymentMethodStatistics,
339
344
  getProductsStatistics: reportsExportEndpoints.getModule.getProductsStatistics,
@@ -125,7 +125,9 @@ export const getCFDIOrdersByDateAndStore = async function (this: WashdayClientIn
125
125
  export const fetchOrdersForCFDI = async function (this: WashdayClientInstance, params: {
126
126
  fromDate: string
127
127
  toDate: string
128
- storeID: string
128
+ storeID?: string
129
+ storeIds?: string[]
130
+ includeAllStores?: boolean
129
131
  customerID?: string
130
132
  }): Promise<any> {
131
133
  try {
@@ -136,6 +138,8 @@ export const fetchOrdersForCFDI = async function (this: WashdayClientInstance, p
136
138
  "fromDate",
137
139
  "toDate",
138
140
  "storeID",
141
+ "storeIds",
142
+ "includeAllStores",
139
143
  "customerID"
140
144
  ], params);
141
145
  return await this.axiosInstance.get(`${GET_SET_ORDER_CFDI}/cfdiPreview?${queryParams}`, config);
@@ -206,4 +210,4 @@ export const getRequestedOrdersSummary = async function (this: WashdayClientInst
206
210
  console.error('Error fetching:', error);
207
211
  throw error;
208
212
  }
209
- }
213
+ }
@@ -484,3 +484,26 @@ export const getScheduledDeliveries = async function (this: WashdayClientInstanc
484
484
  throw error;
485
485
  }
486
486
  };
487
+
488
+ export const getServicesToDeliver = async function (this: WashdayClientInstance, companyId: string, params: {
489
+ storeId?: string
490
+ dateFrom?: string
491
+ dateTo?: string
492
+ hideReady?: string
493
+ }): Promise<any> {
494
+ try {
495
+ const config = {
496
+ headers: { Authorization: `Bearer ${this.apiToken}` }
497
+ };
498
+ const queryParams = generateQueryParamsStr([
499
+ 'storeId',
500
+ 'dateFrom',
501
+ 'dateTo',
502
+ 'hideReady',
503
+ ], params);
504
+ return await this.axiosInstance.get(`${GET_SET_REPORTS}/${companyId}/servicesToDeliver?${queryParams}`, config);
505
+ } catch (error) {
506
+ console.error('Error fetching getServicesToDeliver:', error);
507
+ throw error;
508
+ }
509
+ };
package/src/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as utils from './utils';
2
2
  import WashdayClient from './api';
3
3
  export * from './interfaces/Company';
4
+ export * from './interfaces/Cfdi';
4
5
 
5
6
  export { WashdayClient, utils };
@@ -68,7 +68,10 @@ export interface WashdayClientInstance {
68
68
  getCFDIPreview: typeof cfdiEndpoints.getModule.getCFDIPreview,
69
69
  getCFDIPreviewByOrderId: typeof cfdiEndpoints.getModule.getCFDIPreviewByOrderId,
70
70
  createCFDI: typeof cfdiEndpoints.postModule.createCFDI,
71
- createGlobalCFDI: typeof cfdiEndpoints.postModule.createGlobalCFDI
71
+ createGlobalCFDI: typeof cfdiEndpoints.postModule.createGlobalCFDI,
72
+ searchGlobalByPaymentMethodCandidates: typeof cfdiEndpoints.postModule.searchGlobalByPaymentMethodCandidates,
73
+ previewGlobalByPaymentMethodCFDI: typeof cfdiEndpoints.postModule.previewGlobalByPaymentMethodCFDI,
74
+ createGlobalByPaymentMethodCFDI: typeof cfdiEndpoints.postModule.createGlobalByPaymentMethodCFDI,
72
75
  cancelCFDI: typeof cfdiEndpoints.deleteModule.cancelCFDI
73
76
  }
74
77
  auth: {
@@ -294,6 +297,7 @@ export interface WashdayClientInstance {
294
297
  exportUnpaidOrdersReportCSV: typeof csvExportEndpoints.getModule.exportUnpaidOrdersReportCSV;
295
298
  exportCashUpReportsByDateRange: typeof csvExportEndpoints.getModule.exportCashUpReportsByDateRange;
296
299
  exportScheduledDeliveriesReport: typeof csvExportEndpoints.getModule.exportScheduledDeliveriesReport;
300
+ exportServicesToDeliverReport: typeof csvExportEndpoints.getModule.exportServicesToDeliverReport;
297
301
  exportOrdersList: typeof csvExportEndpoints.getModule.exportOrdersList,
298
302
  exportProductsList: typeof csvExportEndpoints.getModule.exportProductsList,
299
303
  exportCleanedOrdersReport: typeof csvExportEndpoints.getModule.exportCleanedOrdersReport,
@@ -319,6 +323,7 @@ export interface WashdayClientInstance {
319
323
  getCashierBoxMovementsReport: typeof reportsExportEndpoints.getModule.getCashierBoxMovementsReport;
320
324
  getUnpaidOrdersReport: typeof reportsExportEndpoints.getModule.getUnpaidOrdersReport;
321
325
  getScheduledDeliveries: typeof reportsExportEndpoints.getModule.getScheduledDeliveries;
326
+ getServicesToDeliver: typeof reportsExportEndpoints.getModule.getServicesToDeliver;
322
327
  getAnnualSalesStatistics: typeof reportsExportEndpoints.getModule.getAnnualSalesStatistics;
323
328
  getPaymentMethodStatistics: typeof reportsExportEndpoints.getModule.getPaymentMethodStatistics;
324
329
  getProductsStatistics: typeof reportsExportEndpoints.getModule.getProductsStatistics;
@@ -0,0 +1,71 @@
1
+ export type GlobalPaymentMethod = "cash" | "card" | "transfer" | "mercadopago";
2
+
3
+ export type GlobalPaymentMethodTaxSource = "order_taxes" | "no_taxes";
4
+
5
+ export interface GlobalPaymentMethodCfdiSettings {
6
+ product_key?: string;
7
+ unit_key?: string;
8
+ unit_name?: string;
9
+ tax_included?: boolean;
10
+ tax_source?: GlobalPaymentMethodTaxSource;
11
+ }
12
+
13
+ export interface GlobalPaymentMethodStoreFilters {
14
+ storeIds?: string[];
15
+ includeAllStores?: boolean;
16
+ }
17
+
18
+ export interface SearchGlobalByPaymentMethodCandidatesPayload extends GlobalPaymentMethodStoreFilters {
19
+ paymentMethod: GlobalPaymentMethod;
20
+ dateFrom: string;
21
+ dateTo: string;
22
+ }
23
+
24
+ export interface GlobalByPaymentMethodCandidate {
25
+ paymentLineId: string;
26
+ orderId: string;
27
+ orderSequence?: number | string;
28
+ folioPrefix?: string;
29
+ folio: string;
30
+ storeId: string;
31
+ storeName: string;
32
+ customerId?: string | null;
33
+ customerName?: string;
34
+ paymentDate: string | Date;
35
+ paymentMethod: GlobalPaymentMethod;
36
+ amountPaid: number;
37
+ defaultDescription: string;
38
+ isEligible: boolean;
39
+ ineligibilityReason?: string | null;
40
+ }
41
+
42
+ export interface SearchGlobalByPaymentMethodCandidatesResponse {
43
+ items: GlobalByPaymentMethodCandidate[];
44
+ summary: {
45
+ count: number;
46
+ totalAmount: number;
47
+ };
48
+ }
49
+
50
+ export interface GlobalByPaymentMethodSelectedLine {
51
+ paymentLineId: string;
52
+ description?: string;
53
+ }
54
+
55
+ export interface GlobalByPaymentMethodCFDIPayload extends SearchGlobalByPaymentMethodCandidatesPayload {
56
+ date?: string;
57
+ sendEmailInvoice?: boolean;
58
+ global: {
59
+ periodicity: string;
60
+ months: string;
61
+ year: string;
62
+ };
63
+ paymentLines: GlobalByPaymentMethodSelectedLine[];
64
+ }
65
+
66
+ export interface CreateGlobalByPaymentMethodCFDIResponse {
67
+ facturapiInvoiceID: string;
68
+ uuid?: string;
69
+ relatedPaymentLinesCount: number;
70
+ invoice?: any;
71
+ }
@@ -1,3 +1,5 @@
1
+ import { GlobalPaymentMethodCfdiSettings } from "./Cfdi";
2
+
1
3
  export interface ISubscriptionBillingInfo {
2
4
  legalName: string;
3
5
  rfc: string;
@@ -9,3 +11,22 @@ export interface ISubscriptionBillingInfo {
9
11
  export interface UpdateCompanySubscriptionBillingInfoPayload {
10
12
  subscriptionBillingInfo: ISubscriptionBillingInfo;
11
13
  }
14
+
15
+ export interface ICompanyTaxInfo {
16
+ name?: string;
17
+ legal_name?: string;
18
+ tax_system?: string;
19
+ website?: string;
20
+ support_email?: string;
21
+ phone?: string;
22
+ address?: {
23
+ zip?: string;
24
+ street?: string;
25
+ exterior?: string;
26
+ };
27
+ cfdiEmailSettings?: {
28
+ enabled: boolean;
29
+ email: string;
30
+ };
31
+ globalPaymentMethodCfdiSettings?: GlobalPaymentMethodCfdiSettings;
32
+ }
@@ -43,6 +43,19 @@ export interface IOrderPaymentLines {
43
43
  description: string,
44
44
  createdBy: IUser | string,
45
45
  facturapiPaymentInvoiceID?: string | null,
46
+ facturapiInvoiceID?: string | null,
47
+ facturapiInvoiceUUID?: string | null,
48
+ facturapiInvoiceType?: 'global_payment_method' | 'global_order' | 'order' | 'payment_complement' | '' | null,
49
+ invoicedAmount?: number,
50
+ invoiceAllocationStatus?: 'pending' | 'invoiced' | 'cancelled' | '' | null,
51
+ invoiceAllocationDate?: Date | string | null,
52
+ invoiceAllocationStoreId?: string | null,
53
+ invoiceAllocationMeta?: {
54
+ method?: 'cash' | 'card' | 'transfer' | 'mercadopago',
55
+ companyId?: string,
56
+ orderId?: string,
57
+ [key: string]: any
58
+ },
46
59
  }
47
60
 
48
61
  export interface IOrder {
@@ -75,12 +75,13 @@ export interface IOrderProduct extends IProduct {
75
75
 
76
76
  // Operational line-level status fields (added 2026-04-04)
77
77
  status?: OrderProductLineStatus,
78
- cleanedDateTime?: Date | null,
79
- readyDateTime?: Date | null,
78
+ cleanedDateTime?: Date | null, // set on → ready (cleaning completed)
79
+ readyDateTime?: Date | null, // set on → ready; currently always equals cleanedDateTime
80
80
  collectedDateTime?: Date | null,
81
81
  uncollectedDateTime?: Date | null,
82
82
  cancelledDateTime?: Date | null,
83
- markedCleanedBy?: IUser | string | null,
83
+ markedCleaningBy?: IUser | string | null, // who sent the line to cleaning (→ cleaning)
84
+ markedCleanedBy?: IUser | string | null, // who confirmed cleaning complete (→ ready)
84
85
  markedReadyBy?: IUser | string | null,
85
86
  markedCollectedBy?: IUser | string | null,
86
87
  markedUncollectedBy?: IUser | string | null,