Spaces:
Runtime error
Runtime error
import { logger } from '../../utils/logger'; | |
import Invoice from '../../models/invoice'; | |
import InvoiceDetail from '../../models/invoicedetail'; | |
import { createBill, uploadBill, uploadBillToOwnerPortal } from './propertyware.service'; | |
import { formatDate } from '../../utils/dataUtils'; | |
import ErrorLog from '../../models/errorLog'; | |
import { createAuditLog } from '../../controllers/auditLog.controller'; | |
import { updateInvoiceData } from '../../controllers/invoice/invoice.controller'; | |
import axios from 'axios'; | |
import FormData from 'form-data'; | |
interface ErrorResponse { | |
response: { | |
data: { | |
userMessage: string; | |
errorCode: string; | |
errors?: Array<{ key: string; message: string }>; | |
} | |
} | |
} | |
export const syncInvoicesService = async (): Promise<string> => { | |
try { | |
const invoices = await Invoice.findAll({ | |
where: { status: 'Approved' }, | |
include: [{ model: InvoiceDetail }] | |
}); | |
if (invoices.length === 0) { | |
return "No invoice to sync"; | |
} | |
const syncPromises = invoices.map(async (invoice) => { | |
const bill = { | |
billDate: formatDate(invoice.invoice_date), | |
billSplits: invoice.InvoiceDetails.map(detail => ({ | |
amount: detail.amount as number, | |
glAccountID: detail.pw_gl_account_id, | |
portfolioID: detail.pw_portfolio_id, | |
buildingID: detail.pw_building_id, | |
comments: detail.description, | |
paid: false, | |
unitID: detail.pw_unit_id | |
})), | |
dueDate: invoice.due_date ? formatDate(invoice.due_date) : null, | |
vendorID: invoice.pw_vendor_id?.toString(), | |
comments: invoice.description, | |
refNo: invoice.reference_number, | |
terms: invoice.term, | |
workOrderID: invoice.pw_work_order_id, | |
}; | |
try { | |
const response = await createBill(bill); | |
// Add audit log for Update Invoice | |
const auditLogData = { | |
invoice_id: invoice.id as number, | |
action_by: 1, | |
action: 'Invoice sync to PW', | |
details: `Bill for invoice ${bill.refNo} synced successfully. PW invoice id: ${response.id}` | |
}; | |
await createAuditLog(auditLogData); | |
try { | |
// upload invoice file to propertyware | |
if (invoice.filename) { | |
try { | |
const { data } = await axios.get(invoice.pdf_url as string, { | |
responseType: 'arraybuffer' | |
}); | |
const fileBuffer = Buffer.from(data); | |
const formData = new FormData(); | |
formData.append('file', fileBuffer, { | |
filename: invoice.filename | |
}); | |
const billDocumentResponse = await uploadBill(response.id, formData); | |
await uploadBillToOwnerPortal(billDocumentResponse.id, invoice.filename); | |
} catch (error) { | |
logger.error("Invoice file upload failed: "); | |
logger.error(error); | |
} | |
} | |
} catch (error) { | |
logger.error("Invoice file upload failed: "); | |
logger.error(error); | |
} | |
// Update Invoice status | |
await updateInvoiceData(invoice.id as number, { status: 'Sync success' }, 1); | |
logger.info(`Bill for invoice ${bill.refNo} synced successfully`); | |
} catch (error) { | |
let errorMessage = `Error syncing bill for invoice ${bill.refNo}.`; | |
const errorobj = (error as ErrorResponse); | |
const errordata = errorobj.response.data; | |
if (errordata) { | |
if (errordata.errors && Array.isArray(errordata.errors)) { | |
errorMessage += ` Errors: ${errordata.errors.map(e => `${e.key}: ${e.message}`).join(', ')}`; | |
} else { | |
errorMessage += ` ${errordata.userMessage}`; | |
} | |
logger.error(errorMessage); | |
logger.error(error); | |
// Add entry to error log | |
const errorLogData = { | |
invoice_id: invoice.id as number, | |
error_type: 'PW Sync Failed', | |
error_details: errorMessage | |
}; | |
await ErrorLog.create(errorLogData); | |
} else if (error instanceof Error) { | |
logger.error(`Error syncing bill for invoice ${bill.refNo}: ${error.message}`); | |
logger.error(error); | |
// Add entry to error log | |
const errorLogData = { | |
invoice_id: invoice.id as number, | |
error_type: 'PW Sync Failed', | |
error_details: `Error syncing bill for invoice ${bill.refNo}. ${error.message}` | |
}; | |
await ErrorLog.create(errorLogData); | |
} else { | |
logger.error(`Unknown error syncing bill for invoice ${bill.refNo}`); | |
logger.error(error); | |
// Add entry to error log | |
const errorLogData = { | |
invoice_id: invoice.id as number, | |
error_type: 'PW Sync Failed', | |
error_details: `Unknown error syncing bill for invoice ${bill.refNo}` | |
}; | |
await ErrorLog.create(errorLogData); | |
} | |
await updateInvoiceData(invoice.id as number, { status: 'Sync Failed' }, 1); | |
} | |
}); | |
await Promise.all(syncPromises); | |
return "Invoice data sync process completed successfully"; | |
} catch (error) { | |
logger.error('Error while syncing invoices to propertyware:'); | |
logger.error(error); | |
throw new Error('Error while syncing invoices to propertyware'); | |
} | |
}; | |