File size: 4,436 Bytes
9d33d07
8ff7834
 
9d33d07
8ff7834
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d747060
 
8ff7834
 
9d33d07
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2ef2e04
9d33d07
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2ef2e04
9d33d07
 
 
 
 
 
 
 
2ef2e04
 
9d33d07
d747060
 
9d33d07
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import { fetchAllWorkorders, fetchAllWorkordersJson, fetchLatestWorkordersJson, getIndexByLabel } from './propertyware.service';
import { logger } from '../../utils/logger';
import PwWorkOrders from '../../models/pwWorkOrders';
import PwUnit from '../../models/pwUnits';

export const syncWorkOrderDataService = async (): Promise<string> => {
    try {
        const workOrderData = await fetchAllWorkorders();
        const workOrderResponseData = workOrderData.map((workOrder: {
            id: number;
            number: number;
            location: string;
            portfolioID: number;
            buildingID: number;
            unitID: number;
            status: string;
            assignedVendors: string[];
        }) => ({
            pw_id: workOrder.id,
            number: workOrder.number,
            location: workOrder.location,
            portfolio_id: workOrder.portfolioID,
            building_id: workOrder.buildingID,
            unit_id: workOrder.unitID,
            status: workOrder.status,
            assignedVendors: workOrder.assignedVendors || [],
        }));

        await PwWorkOrders.bulkCreate(workOrderResponseData, {
            updateOnDuplicate: ['number', 'location', 'portfolio_id', 'building_id', 'unit_id', 'status', 'assigned_vendors'],
        });

        logger.info("Work order data synced successfully");
        return "Work order data synced successfully";
    } catch (error) {
        logger.error("Error syncing Work order");
        logger.error(error);
        throw new Error("Error syncing Work order");
    }
};

export const syncWorkOrderDataFromJsonService = async (syncAll = false): Promise<string> => {
    try {
        let workOrderData;
        if (syncAll) {
            workOrderData = await fetchAllWorkordersJson();
        } else {
            workOrderData = await fetchLatestWorkordersJson();
        }
        const indexes = {
            pw_id: getIndexByLabel(workOrderData.columns, "WO Entity ID"),
            number:getIndexByLabel(workOrderData.columns, "WO#"),
            portfolio: getIndexByLabel(workOrderData.columns, "Portfolio"),
            building: getIndexByLabel(workOrderData.columns, "Building"),
            unit: getIndexByLabel(workOrderData.columns, "Unit"),
            buildingID: getIndexByLabel(workOrderData.columns, "Building ID"),
            unitID: getIndexByLabel(workOrderData.columns, "Unit ID"),
            status: getIndexByLabel(workOrderData.columns, "Status"),
            assignedVendors: getIndexByLabel(workOrderData.columns, "Vendors"),
            location: getIndexByLabel(workOrderData.columns, "Address"),
        };
        const workOrderResponseData: any[] = [];

        for (const record of workOrderData.records) {
            const portfolioData = await PwUnit.findOne({
                where: {
                  pw_id: record[indexes.unitID as number], 
                },
                attributes: ['pw_portfolio_id'], 
              });
          
            const portfolio_id= portfolioData ? portfolioData.getDataValue('pw_portfolio_id') : null;
            workOrderResponseData.push({
                pw_id: record[indexes.pw_id as number],
                number: extractWorkOrderNumber(record[indexes.number as number]),
                portfolio_id: portfolio_id,
                building_id: record[indexes.buildingID as number],
                unit_id: record[indexes.unitID as number],
                location: record[indexes.location as number],
                status: record[indexes.status as number],
                assigned_vendors: record[indexes.assignedVendors as number] || []
            });
        }
        await PwWorkOrders.bulkCreate(workOrderResponseData, {
            updateOnDuplicate: ['number', 'location', 'portfolio_id', 'building_id', 'unit_id', 'status', 'assigned_vendors'],
        });

        logger.info("Total " + workOrderResponseData.length + " Work orders synced successfully");
        return "Total " + workOrderResponseData.length + " Work orders synced successfully";
    } catch (error) {
        logger.error("Error syncing Work order");
        logger.error(error);
        throw new Error("Error syncing Work order");
    }
};

const extractWorkOrderNumber = (workOrder: string): string | null => {
    const match = workOrder.match(/#(\d+)/); // Matches "#" followed by one or more digits
    return match ? match[1] : null;
}