sunrise-cms/temp/legacy.importFromCSV.js

951 lines
47 KiB
JavaScript

import fs from 'node:fs';
import papa from 'papaparse';
import sqlite from 'better-sqlite3';
import { lotOccupancyDB as databasePath } from '../data/databasePaths.js';
import * as importIds from './legacy.importFromCsv.ids.js';
import * as importData from './legacy.importFromCsv.data.js';
import { addMap } from '../helpers/lotOccupancyDB/addMap.js';
import { getMap as getMapFromDatabase } from '../helpers/lotOccupancyDB/getMap.js';
import { addLot } from '../helpers/lotOccupancyDB/addLot.js';
import { updateLotStatus } from '../helpers/lotOccupancyDB/updateLot.js';
import { addLotOccupancy } from '../helpers/lotOccupancyDB/addLotOccupancy.js';
import { addLotOccupancyOccupant } from '../helpers/lotOccupancyDB/addLotOccupancyOccupant.js';
import { addLotOccupancyComment } from '../helpers/lotOccupancyDB/addLotOccupancyComment.js';
import { addOrUpdateLotOccupancyField } from '../helpers/lotOccupancyDB/addOrUpdateLotOccupancyField.js';
import { getLot, getLotByLotName } from '../helpers/lotOccupancyDB/getLot.js';
import { getLotOccupancies } from '../helpers/lotOccupancyDB/getLotOccupancies.js';
import { addLotOccupancyFee } from '../helpers/lotOccupancyDB/addLotOccupancyFee.js';
import { addLotOccupancyTransaction } from '../helpers/lotOccupancyDB/addLotOccupancyTransaction.js';
import { addWorkOrder } from '../helpers/lotOccupancyDB/addWorkOrder.js';
import { addWorkOrderLot } from '../helpers/lotOccupancyDB/addWorkOrderLot.js';
import { addWorkOrderLotOccupancy } from '../helpers/lotOccupancyDB/addWorkOrderLotOccupancy.js';
import { getWorkOrder, getWorkOrderByWorkOrderNumber } from '../helpers/lotOccupancyDB/getWorkOrder.js';
import { reopenWorkOrder } from '../helpers/lotOccupancyDB/reopenWorkOrder.js';
import { addWorkOrderMilestone } from '../helpers/lotOccupancyDB/addWorkOrderMilestone.js';
import { closeWorkOrder } from '../helpers/lotOccupancyDB/closeWorkOrder.js';
import { dateIntegerToString, dateToString } from '@cityssm/expressjs-server-js/dateTimeFns.js';
const user = {
user: {
userName: 'import.unix',
userProperties: {
canUpdate: true,
isAdmin: false,
apiKey: ''
}
}
};
function purgeTables() {
console.time('purgeTables');
const database = sqlite(databasePath);
database.prepare('delete from WorkOrderMilestones').run();
database.prepare('delete from WorkOrderComments').run();
database.prepare('delete from WorkOrderLots').run();
database.prepare('delete from WorkOrderLotOccupancies').run();
database.prepare('delete from WorkOrders').run();
database.prepare('delete from LotOccupancyTransactions').run();
database.prepare('delete from LotOccupancyFees').run();
database.prepare('delete from LotOccupancyFields').run();
database.prepare('delete from LotOccupancyComments').run();
database.prepare('delete from LotOccupancyOccupants').run();
database.prepare('delete from LotOccupancies').run();
database.prepare('delete from LotFields').run();
database.prepare('delete from LotComments').run();
database.prepare('delete from Lots').run();
database
.prepare("delete from sqlite_sequence where name in ('Lots', 'LotComments', 'LotOccupancies', 'LotOccupancyComments', 'WorkOrders', 'WorkOrderComments', 'WorkOrderMilestones')")
.run();
database.close();
console.timeEnd('purgeTables');
}
function purgeConfigTables() {
console.time('purgeConfigTables');
const database = sqlite(databasePath);
database.prepare('delete from Maps').run();
database.prepare("delete from sqlite_sequence where name in ('Maps')").run();
database.close();
console.timeEnd('purgeConfigTables');
}
function getMapByMapDescription(mapDescription) {
const database = sqlite(databasePath, {
readonly: true
});
const map = database
.prepare('select * from Maps where mapDescription = ?')
.get(mapDescription);
database.close();
return map;
}
function formatDateString(year, month, day) {
return (('0000' + year).slice(-4) +
'-' +
('00' + month).slice(-2) +
'-' +
('00' + day).slice(-2));
}
function formatTimeString(hour, minute) {
return ('00' + hour).slice(-2) + ':' + ('00' + minute).slice(-2);
}
const cemeteryToMapName = {
'00': 'Crematorium',
GC: 'New Greenwood - Columbarium',
HC: 'Holy Sepulchre - Columbarium',
HS: 'Holy Sepulchre',
MA: 'Holy Sepulchre - Mausoleum',
NG: 'New Greenwood',
NW: 'Niche Wall',
OG: 'Old Greenwood',
PG: 'Pine Grove',
UG: 'New Greenwood - Urn Garden',
WK: 'West Korah'
};
const mapCache = new Map();
async function getMap(dataRow) {
const mapCacheKey = dataRow.cemetery;
if (mapCache.has(mapCacheKey)) {
return mapCache.get(mapCacheKey);
}
let map = getMapByMapDescription(mapCacheKey);
if (!map) {
console.log('Creating map: ' + dataRow.cemetery);
const mapId = await addMap({
mapName: cemeteryToMapName[dataRow.cemetery] ?? dataRow.cemetery,
mapDescription: dataRow.cemetery,
mapSVG: '',
mapLatitude: '',
mapLongitude: '',
mapAddress1: '',
mapAddress2: '',
mapCity: 'Sault Ste. Marie',
mapProvince: 'ON',
mapPostalCode: '',
mapPhoneNumber: ''
}, user);
map = await getMapFromDatabase(mapId);
}
mapCache.set(mapCacheKey, map);
return map;
}
async function importFromMasterCSV() {
console.time('importFromMasterCSV');
let masterRow;
const rawData = fs.readFileSync('./temp/CMMASTER.csv').toString();
const cmmaster = papa.parse(rawData, {
delimiter: ',',
header: true,
skipEmptyLines: true
});
for (const parseError of cmmaster.errors) {
console.log(parseError);
}
try {
for (masterRow of cmmaster.data) {
const map = await getMap({
cemetery: masterRow.CM_CEMETERY
});
const lotName = importData.buildLotName({
cemetery: masterRow.CM_CEMETERY,
block: masterRow.CM_BLOCK,
range1: masterRow.CM_RANGE1,
range2: masterRow.CM_RANGE2,
lot1: masterRow.CM_LOT1,
lot2: masterRow.CM_LOT2,
grave1: masterRow.CM_GRAVE1,
grave2: masterRow.CM_GRAVE2,
interment: masterRow.CM_INTERMENT
});
const lotTypeId = importIds.getLotTypeId({
cemetery: masterRow.CM_CEMETERY
});
let lotId;
if (masterRow.CM_CEMETERY !== '00') {
lotId = await addLot({
lotName,
lotTypeId,
lotStatusId: importIds.availableLotStatusId,
mapId: map.mapId,
mapKey: lotName.includes(',') ? lotName.split(',')[0] : lotName,
lotLatitude: '',
lotLongitude: ''
}, user);
}
let preneedOccupancyStartDateString;
let preneedLotOccupancyId;
if (masterRow.CM_PRENEED_OWNER !== '' || masterRow.CM_STATUS === 'P') {
preneedOccupancyStartDateString = formatDateString(masterRow.CM_PURCHASE_YR, masterRow.CM_PURCHASE_MON, masterRow.CM_PURCHASE_DAY);
let occupancyEndDateString = '';
if (masterRow.CM_INTERMENT_YR !== '' &&
masterRow.CM_INTERMENT_YR !== '0') {
occupancyEndDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY);
}
if (preneedOccupancyStartDateString === '0000-00-00' &&
occupancyEndDateString !== '') {
preneedOccupancyStartDateString = occupancyEndDateString;
}
if (preneedOccupancyStartDateString === '0000-00-00' &&
masterRow.CM_DEATH_YR !== '' &&
masterRow.CM_DEATH_YR !== '0') {
preneedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
if (occupancyEndDateString === '0000-00-00' ||
occupancyEndDateString === '') {
occupancyEndDateString = preneedOccupancyStartDateString;
}
}
if (preneedOccupancyStartDateString === '' ||
preneedOccupancyStartDateString === '0000-00-00') {
preneedOccupancyStartDateString = '0001-01-01';
}
preneedLotOccupancyId = await addLotOccupancy({
occupancyTypeId: importIds.preneedOccupancyType.occupancyTypeId,
lotId,
occupancyStartDateString: preneedOccupancyStartDateString,
occupancyEndDateString,
occupancyTypeFieldIds: ''
}, user);
const occupantPostalCode = `${masterRow.CM_POST1} ${masterRow.CM_POST2}`.trim();
await addLotOccupancyOccupant({
lotOccupancyId: preneedLotOccupancyId,
lotOccupantTypeId: importIds.preneedOwnerLotOccupantTypeId,
occupantName: masterRow.CM_PRENEED_OWNER,
occupantAddress1: masterRow.CM_ADDRESS,
occupantAddress2: '',
occupantCity: masterRow.CM_CITY,
occupantProvince: masterRow.CM_PROV,
occupantPostalCode,
occupantPhoneNumber: '',
occupantEmailAddress: ''
}, user);
if (masterRow.CM_REMARK1 !== '') {
await addLotOccupancyComment({
lotOccupancyId: preneedLotOccupancyId,
lotOccupancyCommentDateString: preneedOccupancyStartDateString,
lotOccupancyCommentTimeString: '00:00',
lotOccupancyComment: masterRow.CM_REMARK1
}, user);
}
if (masterRow.CM_REMARK2 !== '') {
await addLotOccupancyComment({
lotOccupancyId: preneedLotOccupancyId,
lotOccupancyCommentDateString: preneedOccupancyStartDateString,
lotOccupancyCommentTimeString: '00:00',
lotOccupancyComment: masterRow.CM_REMARK2
}, user);
}
if (occupancyEndDateString === '') {
await updateLotStatus(lotId, importIds.reservedLotStatusId, user);
}
}
let deceasedOccupancyStartDateString;
let deceasedLotOccupancyId;
if (masterRow.CM_DECEASED_NAME !== '') {
deceasedOccupancyStartDateString = formatDateString(masterRow.CM_INTERMENT_YR, masterRow.CM_INTERMENT_MON, masterRow.CM_INTERMENT_DAY);
if (deceasedOccupancyStartDateString === '0000-00-00' &&
masterRow.CM_DEATH_YR !== '' &&
masterRow.CM_DEATH_YR !== '0') {
deceasedOccupancyStartDateString = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
}
if (deceasedOccupancyStartDateString === '' ||
deceasedOccupancyStartDateString === '0000-00-00') {
deceasedOccupancyStartDateString = '0001-01-01';
}
const deceasedOccupancyEndDateString = lotId
? ''
: deceasedOccupancyStartDateString;
const occupancyType = lotId
? importIds.deceasedOccupancyType
: importIds.cremationOccupancyType;
deceasedLotOccupancyId = await addLotOccupancy({
occupancyTypeId: occupancyType.occupancyTypeId,
lotId,
occupancyStartDateString: deceasedOccupancyStartDateString,
occupancyEndDateString: deceasedOccupancyEndDateString,
occupancyTypeFieldIds: ''
}, user);
const deceasedPostalCode = `${masterRow.CM_POST1} ${masterRow.CM_POST2}`.trim();
await addLotOccupancyOccupant({
lotOccupancyId: deceasedLotOccupancyId,
lotOccupantTypeId: importIds.deceasedLotOccupantTypeId,
occupantName: masterRow.CM_DECEASED_NAME,
occupantAddress1: masterRow.CM_ADDRESS,
occupantAddress2: '',
occupantCity: masterRow.CM_CITY,
occupantProvince: masterRow.CM_PROV,
occupantPostalCode: deceasedPostalCode,
occupantPhoneNumber: '',
occupantEmailAddress: ''
}, user);
if (masterRow.CM_DEATH_YR !== '') {
const lotOccupancyFieldValue = formatDateString(masterRow.CM_DEATH_YR, masterRow.CM_DEATH_MON, masterRow.CM_DEATH_DAY);
await addOrUpdateLotOccupancyField({
lotOccupancyId: deceasedLotOccupancyId,
occupancyTypeFieldId: occupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return occupancyTypeField.occupancyTypeField === 'Death Date';
}).occupancyTypeFieldId,
lotOccupancyFieldValue
}, user);
}
if (masterRow.CM_AGE !== '') {
await addOrUpdateLotOccupancyField({
lotOccupancyId: deceasedLotOccupancyId,
occupancyTypeFieldId: occupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return occupancyTypeField.occupancyTypeField === 'Death Age';
}).occupancyTypeFieldId,
lotOccupancyFieldValue: masterRow.CM_AGE
}, user);
}
if (masterRow.CM_PERIOD !== '') {
await addOrUpdateLotOccupancyField({
lotOccupancyId: deceasedLotOccupancyId,
occupancyTypeFieldId: occupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return (occupancyTypeField.occupancyTypeField === 'Death Age Period');
}).occupancyTypeFieldId,
lotOccupancyFieldValue: masterRow.CM_PERIOD
}, user);
}
if (masterRow.CM_FUNERAL_HOME !== '') {
const funeralHomeOccupant = importData.getFuneralHomeLotOccupancyOccupantData(masterRow.CM_FUNERAL_HOME);
await addLotOccupancyOccupant({
lotOccupancyId: deceasedLotOccupancyId,
lotOccupantTypeId: funeralHomeOccupant.lotOccupantTypeId,
occupantName: funeralHomeOccupant.occupantName,
occupantAddress1: funeralHomeOccupant.occupantAddress1,
occupantAddress2: funeralHomeOccupant.occupantAddress2,
occupantCity: funeralHomeOccupant.occupantCity,
occupantProvince: funeralHomeOccupant.occupantProvince,
occupantPostalCode: funeralHomeOccupant.occupantPostalCode,
occupantPhoneNumber: funeralHomeOccupant.occupantPhoneNumber,
occupantEmailAddress: funeralHomeOccupant.occupantEmailAddress
}, user);
}
if (masterRow.CM_FUNERAL_YR !== '') {
const lotOccupancyFieldValue = formatDateString(masterRow.CM_FUNERAL_YR, masterRow.CM_FUNERAL_MON, masterRow.CM_FUNERAL_DAY);
await addOrUpdateLotOccupancyField({
lotOccupancyId: deceasedLotOccupancyId,
occupancyTypeFieldId: occupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return (occupancyTypeField.occupancyTypeField === 'Funeral Date');
}).occupancyTypeFieldId,
lotOccupancyFieldValue
}, user);
}
if (occupancyType.occupancyType !== 'Cremation') {
if (masterRow.CM_CONTAINER_TYPE !== '') {
await addOrUpdateLotOccupancyField({
lotOccupancyId: deceasedLotOccupancyId,
occupancyTypeFieldId: occupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return (occupancyTypeField.occupancyTypeField === 'Container Type');
}).occupancyTypeFieldId,
lotOccupancyFieldValue: masterRow.CM_CONTAINER_TYPE
}, user);
}
if (masterRow.CM_COMMITTAL_TYPE !== '') {
let commitalType = masterRow.CM_COMMITTAL_TYPE;
if (commitalType === 'GS') {
commitalType = 'Graveside';
}
await addOrUpdateLotOccupancyField({
lotOccupancyId: deceasedLotOccupancyId,
occupancyTypeFieldId: occupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return (occupancyTypeField.occupancyTypeField === 'Committal Type');
}).occupancyTypeFieldId,
lotOccupancyFieldValue: commitalType
}, user);
}
}
if (masterRow.CM_REMARK1 !== '') {
await addLotOccupancyComment({
lotOccupancyId: deceasedLotOccupancyId,
lotOccupancyCommentDateString: deceasedOccupancyStartDateString,
lotOccupancyCommentTimeString: '00:00',
lotOccupancyComment: masterRow.CM_REMARK1
}, user);
}
if (masterRow.CM_REMARK2 !== '') {
await addLotOccupancyComment({
lotOccupancyId: deceasedLotOccupancyId,
lotOccupancyCommentDateString: deceasedOccupancyStartDateString,
lotOccupancyCommentTimeString: '00:00',
lotOccupancyComment: masterRow.CM_REMARK2
}, user);
}
await updateLotStatus(lotId, importIds.takenLotStatusId, user);
if (masterRow.CM_PRENEED_OWNER !== '') {
await addLotOccupancyOccupant({
lotOccupancyId: deceasedLotOccupancyId,
lotOccupantTypeId: importIds.preneedOwnerLotOccupantTypeId,
occupantName: masterRow.CM_PRENEED_OWNER,
occupantAddress1: '',
occupantAddress2: '',
occupantCity: '',
occupantProvince: '',
occupantPostalCode: '',
occupantPhoneNumber: '',
occupantEmailAddress: ''
}, user);
}
}
}
}
catch (error) {
console.error(error);
console.log(masterRow);
}
console.timeEnd('importFromMasterCSV');
}
async function importFromPrepaidCSV() {
console.time('importFromPrepaidCSV');
let prepaidRow;
const rawData = fs.readFileSync('./temp/CMPRPAID.csv').toString();
const cmprpaid = papa.parse(rawData, {
delimiter: ',',
header: true,
skipEmptyLines: true
});
for (const parseError of cmprpaid.errors) {
console.log(parseError);
}
try {
for (prepaidRow of cmprpaid.data) {
if (!prepaidRow.CMPP_PREPAID_FOR_NAME) {
continue;
}
let cemetery = prepaidRow.CMPP_CEMETERY;
if (cemetery === '.m') {
cemetery = 'HC';
}
let lot;
if (cemetery !== '') {
const map = await getMap({
cemetery
});
const lotName = importData.buildLotName({
cemetery,
block: prepaidRow.CMPP_BLOCK,
range1: prepaidRow.CMPP_RANGE1,
range2: prepaidRow.CMPP_RANGE2,
lot1: prepaidRow.CMPP_LOT1,
lot2: prepaidRow.CMPP_LOT2,
grave1: prepaidRow.CMPP_GRAVE1,
grave2: prepaidRow.CMPP_GRAVE2,
interment: prepaidRow.CMPP_INTERMENT
});
lot = await getLotByLotName(lotName);
if (!lot) {
const lotTypeId = importIds.getLotTypeId({
cemetery
});
const lotId = await addLot({
lotName,
lotTypeId,
lotStatusId: importIds.reservedLotStatusId,
mapId: map.mapId,
mapKey: lotName.includes(',') ? lotName.split(',')[0] : lotName,
lotLatitude: '',
lotLongitude: ''
}, user);
lot = await getLot(lotId);
}
}
if (lot && lot.lotStatusId === importIds.availableLotStatusId) {
await updateLotStatus(lot.lotId, importIds.reservedLotStatusId, user);
}
const occupancyStartDateString = formatDateString(prepaidRow.CMPP_PURCH_YR, prepaidRow.CMPP_PURCH_MON, prepaidRow.CMPP_PURCH_DAY);
let lotOccupancyId;
if (lot) {
const possibleLotOccupancies = await getLotOccupancies({
lotId: lot.lotId,
occupancyTypeId: importIds.preneedOccupancyType.occupancyTypeId,
occupantName: prepaidRow.CMPP_PREPAID_FOR_NAME,
occupancyStartDateString
}, {
includeOccupants: false,
limit: -1,
offset: 0
});
if (possibleLotOccupancies.lotOccupancies.length > 0) {
lotOccupancyId =
possibleLotOccupancies.lotOccupancies[0].lotOccupancyId;
}
}
if (!lotOccupancyId) {
lotOccupancyId = await addLotOccupancy({
lotId: lot ? lot.lotId : '',
occupancyTypeId: importIds.preneedOccupancyType.occupancyTypeId,
occupancyStartDateString,
occupancyEndDateString: ''
}, user);
}
await addLotOccupancyOccupant({
lotOccupancyId,
lotOccupantTypeId: importIds.preneedOwnerLotOccupantTypeId,
occupantName: prepaidRow.CMPP_PREPAID_FOR_NAME,
occupantAddress1: prepaidRow.CMPP_ADDRESS,
occupantAddress2: '',
occupantCity: prepaidRow.CMPP_CITY,
occupantProvince: prepaidRow.CMPP_PROV.slice(0, 2),
occupantPostalCode: prepaidRow.CMPP_POSTAL1 + ' ' + prepaidRow.CMPP_POSTAL2,
occupantPhoneNumber: '',
occupantEmailAddress: ''
}, user);
if (prepaidRow.CMPP_ARRANGED_BY_NAME) {
await addLotOccupancyOccupant({
lotOccupancyId,
lotOccupantTypeId: importIds.purchaserLotOccupantTypeId,
occupantName: prepaidRow.CMPP_ARRANGED_BY_NAME,
occupantAddress1: '',
occupantAddress2: '',
occupantCity: '',
occupantProvince: '',
occupantPostalCode: '',
occupantPhoneNumber: '',
occupantEmailAddress: ''
}, user);
}
if (prepaidRow.CMPP_FEE_GRAV_SD !== '0.0') {
await addLotOccupancyFee({
lotOccupancyId,
feeId: importIds.getFeeIdByFeeDescription('CMPP_FEE_GRAV_SD'),
quantity: 1,
feeAmount: prepaidRow.CMPP_FEE_GRAV_SD,
taxAmount: prepaidRow.CMPP_GST_GRAV_SD
}, user);
}
if (prepaidRow.CMPP_FEE_GRAV_DD !== '0.0') {
await addLotOccupancyFee({
lotOccupancyId,
feeId: importIds.getFeeIdByFeeDescription('CMPP_FEE_GRAV_DD'),
quantity: 1,
feeAmount: prepaidRow.CMPP_FEE_GRAV_DD,
taxAmount: prepaidRow.CMPP_GST_GRAV_DD
}, user);
}
if (prepaidRow.CMPP_FEE_CHAP_SD !== '0.0') {
await addLotOccupancyFee({
lotOccupancyId,
feeId: importIds.getFeeIdByFeeDescription('CMPP_FEE_CHAP_SD'),
quantity: 1,
feeAmount: prepaidRow.CMPP_FEE_CHAP_SD,
taxAmount: prepaidRow.CMPP_GST_CHAP_SD
}, user);
}
if (prepaidRow.CMPP_FEE_CHAP_DD !== '0.0') {
await addLotOccupancyFee({
lotOccupancyId,
feeId: importIds.getFeeIdByFeeDescription('CMPP_FEE_CHAP_DD'),
quantity: 1,
feeAmount: prepaidRow.CMPP_FEE_CHAP_DD,
taxAmount: prepaidRow.CMPP_GST_CHAP_DD
}, user);
}
if (prepaidRow.CMPP_FEE_ENTOMBMENT !== '0.0') {
await addLotOccupancyFee({
lotOccupancyId,
feeId: importIds.getFeeIdByFeeDescription('CMPP_FEE_ENTOMBMENT'),
quantity: 1,
feeAmount: prepaidRow.CMPP_FEE_ENTOMBMENT,
taxAmount: prepaidRow.CMPP_GST_ENTOMBMENT
}, user);
}
if (prepaidRow.CMPP_FEE_CREM !== '0.0') {
await addLotOccupancyFee({
lotOccupancyId,
feeId: importIds.getFeeIdByFeeDescription('CMPP_FEE_CREM'),
quantity: 1,
feeAmount: prepaidRow.CMPP_FEE_CREM,
taxAmount: prepaidRow.CMPP_GST_CREM
}, user);
}
if (prepaidRow.CMPP_FEE_NICHE !== '0.0') {
await addLotOccupancyFee({
lotOccupancyId,
feeId: importIds.getFeeIdByFeeDescription('CMPP_FEE_NICHE'),
quantity: 1,
feeAmount: prepaidRow.CMPP_FEE_NICHE,
taxAmount: prepaidRow.CMPP_GST_NICHE
}, user);
}
if (prepaidRow.CMPP_FEE_DISINTERMENT !== '0.0' &&
prepaidRow.CMPP_FEE_DISINTERMENT !== '20202.02') {
await addLotOccupancyFee({
lotOccupancyId,
feeId: importIds.getFeeIdByFeeDescription('CMPP_FEE_DISINTERMENT'),
quantity: 1,
feeAmount: prepaidRow.CMPP_FEE_DISINTERMENT,
taxAmount: prepaidRow.CMPP_GST_DISINTERMENT
}, user);
}
const transactionAmount = Number.parseFloat(prepaidRow.CMPP_FEE_GRAV_SD) +
Number.parseFloat(prepaidRow.CMPP_GST_GRAV_SD) +
Number.parseFloat(prepaidRow.CMPP_FEE_GRAV_DD) +
Number.parseFloat(prepaidRow.CMPP_GST_GRAV_DD) +
Number.parseFloat(prepaidRow.CMPP_FEE_CHAP_SD) +
Number.parseFloat(prepaidRow.CMPP_GST_CHAP_SD) +
Number.parseFloat(prepaidRow.CMPP_FEE_CHAP_DD) +
Number.parseFloat(prepaidRow.CMPP_GST_CHAP_DD) +
Number.parseFloat(prepaidRow.CMPP_FEE_ENTOMBMENT) +
Number.parseFloat(prepaidRow.CMPP_GST_ENTOMBMENT) +
Number.parseFloat(prepaidRow.CMPP_FEE_CREM) +
Number.parseFloat(prepaidRow.CMPP_GST_CREM) +
Number.parseFloat(prepaidRow.CMPP_FEE_NICHE) +
Number.parseFloat(prepaidRow.CMPP_GST_NICHE) +
Number.parseFloat(prepaidRow.CMPP_FEE_DISINTERMENT === '20202.02'
? '0'
: prepaidRow.CMPP_FEE_DISINTERMENT) +
Number.parseFloat(prepaidRow.CMPP_GST_DISINTERMENT === '20202.02'
? '0'
: prepaidRow.CMPP_GST_DISINTERMENT);
await addLotOccupancyTransaction({
lotOccupancyId,
externalReceiptNumber: '',
transactionAmount,
transactionDateString: occupancyStartDateString,
transactionNote: 'Order Number: ' + prepaidRow.CMPP_ORDER_NO
}, user);
if (prepaidRow.CMPP_REMARK1) {
await addLotOccupancyComment({
lotOccupancyId,
lotOccupancyCommentDateString: occupancyStartDateString,
lotOccupancyComment: prepaidRow.CMPP_REMARK1
}, user);
}
if (prepaidRow.CMPP_REMARK2) {
await addLotOccupancyComment({
lotOccupancyId,
lotOccupancyCommentDateString: occupancyStartDateString,
lotOccupancyComment: prepaidRow.CMPP_REMARK2
}, user);
}
}
}
catch (error) {
console.error(error);
console.log(prepaidRow);
}
console.timeEnd('importFromPrepaidCSV');
}
async function importFromWorkOrderCSV() {
console.time('importFromWorkOrderCSV');
let workOrderRow;
const rawData = fs.readFileSync('./temp/CMWKORDR.csv').toString();
const cmwkordr = papa.parse(rawData, {
delimiter: ',',
header: true,
skipEmptyLines: true
});
for (const parseError of cmwkordr.errors) {
console.log(parseError);
}
const currentDateString = dateToString(new Date());
try {
for (workOrderRow of cmwkordr.data) {
const workOrderNumber = ('000000' + workOrderRow.WO_WORK_ORDER).slice(-6);
let workOrder = await getWorkOrderByWorkOrderNumber(workOrderNumber);
const workOrderOpenDateString = dateIntegerToString(Number.parseInt(workOrderRow.WO_INITIATION_DATE, 10));
if (workOrder) {
if (workOrder.workOrderCloseDate) {
await reopenWorkOrder(workOrder.workOrderId, user);
delete workOrder.workOrderCloseDate;
delete workOrder.workOrderCloseDateString;
}
}
else {
const workOrderId = await addWorkOrder({
workOrderNumber,
workOrderTypeId: importIds.workOrderTypeId,
workOrderDescription: (workOrderRow.WO_REMARK1 +
' ' +
workOrderRow.WO_REMARK2 +
' ' +
workOrderRow.WO_REMARK3).trim(),
workOrderOpenDateString
}, user);
workOrder = await getWorkOrder(workOrderId, {
includeLotsAndLotOccupancies: true,
includeComments: true,
includeMilestones: true
});
}
let lot;
if (workOrderRow.WO_CEMETERY !== '00') {
const lotName = importData.buildLotName({
cemetery: workOrderRow.WO_CEMETERY,
block: workOrderRow.WO_BLOCK,
range1: workOrderRow.WO_RANGE1,
range2: workOrderRow.WO_RANGE2,
lot1: workOrderRow.WO_LOT1,
lot2: workOrderRow.WO_LOT2,
grave1: workOrderRow.WO_GRAVE1,
grave2: workOrderRow.WO_GRAVE2,
interment: workOrderRow.WO_INTERMENT
});
lot = await getLotByLotName(lotName);
if (!lot) {
const map = await getMap({ cemetery: workOrderRow.WO_CEMETERY });
const lotTypeId = importIds.getLotTypeId({
cemetery: workOrderRow.WO_CEMETERY
});
const lotId = await addLot({
mapId: map.mapId,
lotName,
mapKey: lotName.includes(',') ? lotName.split(',')[0] : lotName,
lotStatusId: importIds.takenLotStatusId,
lotTypeId,
lotLatitude: '',
lotLongitude: ''
}, user);
lot = await getLot(lotId);
}
else {
await updateLotStatus(lot.lotId, importIds.takenLotStatusId, user);
}
const workOrderContainsLot = workOrder.workOrderLots.find((possibleLot) => {
return (possibleLot.lotId = lot.lotId);
});
if (!workOrderContainsLot) {
await addWorkOrderLot({
workOrderId: workOrder.workOrderId,
lotId: lot.lotId
}, user);
workOrder.workOrderLots.push(lot);
}
}
let occupancyStartDateString = workOrderOpenDateString;
if (workOrderRow.WO_INTERMENT_YR) {
occupancyStartDateString = formatDateString(workOrderRow.WO_INTERMENT_YR, workOrderRow.WO_INTERMENT_MON, workOrderRow.WO_INTERMENT_DAY);
}
const occupancyType = lot
? importIds.deceasedOccupancyType
: importIds.cremationOccupancyType;
const lotOccupancyId = await addLotOccupancy({
lotId: lot ? lot.lotId : '',
occupancyTypeId: occupancyType.occupancyTypeId,
occupancyStartDateString,
occupancyEndDateString: ''
}, user);
await addLotOccupancyOccupant({
lotOccupancyId,
lotOccupantTypeId: importIds.deceasedLotOccupantTypeId,
occupantName: workOrderRow.WO_DECEASED_NAME,
occupantAddress1: workOrderRow.WO_ADDRESS,
occupantAddress2: '',
occupantCity: workOrderRow.WO_CITY,
occupantProvince: workOrderRow.WO_PROV.slice(0, 2),
occupantPostalCode: workOrderRow.WO_POST1 + ' ' + workOrderRow.WO_POST2,
occupantPhoneNumber: '',
occupantEmailAddress: ''
}, user);
if (workOrderRow.WO_DEATH_YR !== '') {
const lotOccupancyFieldValue = formatDateString(workOrderRow.WO_DEATH_YR, workOrderRow.WO_DEATH_MON, workOrderRow.WO_DEATH_DAY);
await addOrUpdateLotOccupancyField({
lotOccupancyId,
occupancyTypeFieldId: occupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return occupancyTypeField.occupancyTypeField === 'Death Date';
}).occupancyTypeFieldId,
lotOccupancyFieldValue
}, user);
}
if (workOrderRow.WO_DEATH_PLACE !== '') {
await addOrUpdateLotOccupancyField({
lotOccupancyId,
occupancyTypeFieldId: occupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return occupancyTypeField.occupancyTypeField === 'Death Place';
}).occupancyTypeFieldId,
lotOccupancyFieldValue: workOrderRow.WO_DEATH_PLACE
}, user);
}
if (workOrderRow.WO_AGE !== '') {
await addOrUpdateLotOccupancyField({
lotOccupancyId,
occupancyTypeFieldId: occupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return occupancyTypeField.occupancyTypeField === 'Death Age';
}).occupancyTypeFieldId,
lotOccupancyFieldValue: workOrderRow.WO_AGE
}, user);
}
if (workOrderRow.WO_PERIOD !== '') {
await addOrUpdateLotOccupancyField({
lotOccupancyId,
occupancyTypeFieldId: occupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return (occupancyTypeField.occupancyTypeField === 'Death Age Period');
}).occupancyTypeFieldId,
lotOccupancyFieldValue: workOrderRow.WO_PERIOD
}, user);
}
if (workOrderRow.WO_FUNERAL_HOME !== '') {
const funeralHomeOccupant = importData.getFuneralHomeLotOccupancyOccupantData(workOrderRow.WO_FUNERAL_HOME);
await addLotOccupancyOccupant({
lotOccupancyId,
lotOccupantTypeId: funeralHomeOccupant.lotOccupantTypeId,
occupantName: funeralHomeOccupant.occupantName,
occupantAddress1: funeralHomeOccupant.occupantAddress1,
occupantAddress2: funeralHomeOccupant.occupantAddress2,
occupantCity: funeralHomeOccupant.occupantCity,
occupantProvince: funeralHomeOccupant.occupantProvince,
occupantPostalCode: funeralHomeOccupant.occupantPostalCode,
occupantPhoneNumber: funeralHomeOccupant.occupantPhoneNumber,
occupantEmailAddress: funeralHomeOccupant.occupantEmailAddress
}, user);
}
if (workOrderRow.WO_FUNERAL_YR !== '') {
const lotOccupancyFieldValue = formatDateString(workOrderRow.WO_FUNERAL_YR, workOrderRow.WO_FUNERAL_MON, workOrderRow.WO_FUNERAL_DAY);
await addOrUpdateLotOccupancyField({
lotOccupancyId,
occupancyTypeFieldId: occupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return occupancyTypeField.occupancyTypeField === 'Funeral Date';
}).occupancyTypeFieldId,
lotOccupancyFieldValue
}, user);
}
if (occupancyType.occupancyType !== 'Cremation') {
if (workOrderRow.WO_CONTAINER_TYPE !== '') {
await addOrUpdateLotOccupancyField({
lotOccupancyId,
occupancyTypeFieldId: occupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return (occupancyTypeField.occupancyTypeField === 'Container Type');
}).occupancyTypeFieldId,
lotOccupancyFieldValue: workOrderRow.WO_CONTAINER_TYPE
}, user);
}
if (workOrderRow.WO_COMMITTAL_TYPE !== '') {
let commitalType = workOrderRow.WO_COMMITTAL_TYPE;
if (commitalType === 'GS') {
commitalType = 'Graveside';
}
await addOrUpdateLotOccupancyField({
lotOccupancyId,
occupancyTypeFieldId: occupancyType.occupancyTypeFields.find((occupancyTypeField) => {
return (occupancyTypeField.occupancyTypeField === 'Committal Type');
}).occupancyTypeFieldId,
lotOccupancyFieldValue: commitalType
}, user);
}
}
await addWorkOrderLotOccupancy({
workOrderId: workOrder.workOrderId,
lotOccupancyId
}, user);
let hasIncompleteMilestones = !workOrderRow.WO_CONFIRMATION_IN;
let maxMilestoneCompletionDateString = workOrderOpenDateString;
if (importIds.acknowledgedWorkOrderMilestoneTypeId) {
await addWorkOrderMilestone({
workOrderId: workOrder.workOrderId,
workOrderMilestoneTypeId: importIds.acknowledgedWorkOrderMilestoneTypeId,
workOrderMilestoneDateString: workOrderOpenDateString,
workOrderMilestoneDescription: '',
workOrderMilestoneCompletionDateString: workOrderRow.WO_CONFIRMATION_IN
? workOrderOpenDateString
: undefined,
workOrderMilestoneCompletionTimeString: workOrderRow.WO_CONFIRMATION_IN ? '00:00' : undefined
}, user);
}
if (workOrderRow.WO_DEATH_YR) {
const workOrderMilestoneDateString = formatDateString(workOrderRow.WO_DEATH_YR, workOrderRow.WO_DEATH_MON, workOrderRow.WO_DEATH_DAY);
if (importIds.deathWorkOrderMilestoneTypeId) {
await addWorkOrderMilestone({
workOrderId: workOrder.workOrderId,
workOrderMilestoneTypeId: importIds.deathWorkOrderMilestoneTypeId,
workOrderMilestoneDateString,
workOrderMilestoneDescription: 'Death Place: ' + workOrderRow.WO_DEATH_PLACE,
workOrderMilestoneCompletionDateString: workOrderMilestoneDateString < currentDateString
? workOrderMilestoneDateString
: undefined,
workOrderMilestoneCompletionTimeString: workOrderMilestoneDateString < currentDateString
? '00:00'
: undefined
}, user);
}
if (workOrderMilestoneDateString > maxMilestoneCompletionDateString) {
maxMilestoneCompletionDateString = workOrderMilestoneDateString;
}
if (workOrderMilestoneDateString >= currentDateString) {
hasIncompleteMilestones = true;
}
}
if (workOrderRow.WO_FUNERAL_YR) {
const workOrderMilestoneDateString = formatDateString(workOrderRow.WO_FUNERAL_YR, workOrderRow.WO_FUNERAL_MON, workOrderRow.WO_FUNERAL_DAY);
let funeralHour = Number.parseInt(workOrderRow.WO_FUNERAL_HR, 10);
if (funeralHour <= 6) {
funeralHour += 12;
}
const workOrderMilestoneTimeString = formatTimeString(funeralHour.toString(), workOrderRow.WO_FUNERAL_MIN);
if (importIds.funeralWorkOrderMilestoneTypeId) {
await addWorkOrderMilestone({
workOrderId: workOrder.workOrderId,
workOrderMilestoneTypeId: importIds.funeralWorkOrderMilestoneTypeId,
workOrderMilestoneDateString,
workOrderMilestoneTimeString,
workOrderMilestoneDescription: 'Funeral Home: ' + workOrderRow.WO_FUNERAL_HOME,
workOrderMilestoneCompletionDateString: workOrderMilestoneDateString < currentDateString
? workOrderMilestoneDateString
: undefined,
workOrderMilestoneCompletionTimeString: workOrderMilestoneDateString < currentDateString
? workOrderMilestoneTimeString
: undefined
}, user);
}
if (workOrderMilestoneDateString > maxMilestoneCompletionDateString) {
maxMilestoneCompletionDateString = workOrderMilestoneDateString;
}
if (workOrderMilestoneDateString >= currentDateString) {
hasIncompleteMilestones = true;
}
}
if (workOrderRow.WO_CREMATION === 'Y' &&
importIds.cremationWorkOrderMilestoneTypeId) {
await addWorkOrderMilestone({
workOrderId: workOrder.workOrderId,
workOrderMilestoneTypeId: importIds.cremationWorkOrderMilestoneTypeId,
workOrderMilestoneDateString: maxMilestoneCompletionDateString,
workOrderMilestoneDescription: '',
workOrderMilestoneCompletionDateString: maxMilestoneCompletionDateString < currentDateString
? maxMilestoneCompletionDateString
: undefined,
workOrderMilestoneCompletionTimeString: maxMilestoneCompletionDateString < currentDateString
? '00:00'
: undefined
}, user);
}
if (workOrderRow.WO_INTERMENT_YR) {
const workOrderMilestoneDateString = formatDateString(workOrderRow.WO_INTERMENT_YR, workOrderRow.WO_INTERMENT_MON, workOrderRow.WO_INTERMENT_DAY);
if (importIds.intermentWorkOrderMilestoneTypeId) {
await addWorkOrderMilestone({
workOrderId: workOrder.workOrderId,
workOrderMilestoneTypeId: importIds.intermentWorkOrderMilestoneTypeId,
workOrderMilestoneDateString,
workOrderMilestoneDescription: 'Depth: ' + workOrderRow.WO_DEPTH,
workOrderMilestoneCompletionDateString: workOrderMilestoneDateString < currentDateString
? workOrderMilestoneDateString
: undefined,
workOrderMilestoneCompletionTimeString: workOrderMilestoneDateString < currentDateString
? '23:59'
: undefined
}, user);
}
if (workOrderMilestoneDateString > maxMilestoneCompletionDateString) {
maxMilestoneCompletionDateString = workOrderMilestoneDateString;
}
if (workOrderMilestoneDateString >= currentDateString) {
hasIncompleteMilestones = true;
}
}
if (!hasIncompleteMilestones) {
await closeWorkOrder({
workOrderId: workOrder.workOrderId,
workOrderCloseDateString: maxMilestoneCompletionDateString
}, user);
}
}
}
catch (error) {
console.error(error);
console.log(workOrderRow);
}
console.timeEnd('importFromWorkOrderCSV');
}
console.log('Started ' + new Date().toLocaleString());
console.time('importFromCsv');
purgeTables();
await importFromMasterCSV();
await importFromPrepaidCSV();
await importFromWorkOrderCSV();
console.timeEnd('importFromCsv');
console.log('Finished ' + new Date().toLocaleString());