fix
All checks were successful
Build And Deploy Main / build-and-deploy (push) Successful in 30s

This commit is contained in:
2026-03-12 14:42:27 -04:00
parent 79694f8be6
commit d107bb4a3e
2 changed files with 53 additions and 23 deletions

View File

@@ -164,14 +164,6 @@ const findRelatedCustomersForReport = (route, customer, allRoutes) => {
return { relativeRouteCustomer, customerInOtherRoute, otherRoute, otherOutboundRoute };
};
const resolveNoteFromCandidates = (...candidates) => {
for (const candidate of candidates) {
const note = (candidate?.customer_note || "").toString().trim();
if (note) return note;
}
return "";
};
const hasEnterCenterTimeByCandidate = (...candidates) =>
candidates.some((item) => item?.customer_enter_center_time !== undefined && item?.customer_enter_center_time !== null && item?.customer_enter_center_time !== "");
@@ -188,7 +180,7 @@ const appendNoticeLine = (parts, text) => {
}
};
const buildRoutePdfBuffer = async (templateBytes, route, seqNum, driversMap, vehiclesMap, outboundCustomerStatuses, unicodeFontBytes, allRoutes, customerNotesById) => {
const buildRoutePdfBuffer = async (templateBytes, route, seqNum, driversMap, vehiclesMap, outboundCustomerStatuses, unicodeFontBytes, allRoutes, customerNotesById, debugRows) => {
const pdfDoc = await PDFDocument.load(templateBytes);
pdfDoc.registerFontkit(fontkit);
const unicodeFont = await pdfDoc.embedFont(unicodeFontBytes, { subset: true });
@@ -218,7 +210,7 @@ const buildRoutePdfBuffer = async (templateBytes, route, seqNum, driversMap, veh
safeSetField(form, `phone_${row}`, customer?.customer_phone || "");
const customerId = toObjectIdText(customer?.customer_id);
const profileNoteToDriver = (customerNotesById?.get(customerId) || "").toString().trim();
const customerNoteText = profileNoteToDriver || resolveNoteFromCandidates(customer, relativeRouteCustomer, customerInOtherRoute);
const customerNoteText = profileNoteToDriver;
safeSetField(form, `note_${row}`, customerNoteText);
const pickupTime = formatUtcToLocalHm(
@@ -229,6 +221,8 @@ const buildRoutePdfBuffer = async (templateBytes, route, seqNum, driversMap, veh
if (pickupTime) safeSetField(form, `pick_${row}`, pickupTime);
const hasEnterCenterTime = hasEnterCenterTimeByCandidate(customer, relativeRouteCustomer, customerInOtherRoute);
let yValue = "";
let nValue = "";
if (hasEnterCenterTime) {
const enterCenterTime = formatUtcToLocalHm(
customer?.customer_enter_center_time ||
@@ -238,14 +232,20 @@ const buildRoutePdfBuffer = async (templateBytes, route, seqNum, driversMap, veh
if (enterCenterTime) {
safeSetField(form, `arrive_${row}`, enterCenterTime);
}
safeSetField(form, `y_${row}`, "✓", { fontSize: 12, center: true, blackText: true });
safeSetField(form, `n_${row}`, "", { fontSize: 12, center: true, blackText: true });
yValue = "Y";
nValue = "";
safeSetField(form, `y_${row}`, yValue, { fontSize: 12, center: true, blackText: true });
safeSetField(form, `n_${row}`, nValue, { fontSize: 12, center: true, blackText: true });
} else if (hasInCenterStatusByCandidate(customer, relativeRouteCustomer, customerInOtherRoute)) {
safeSetField(form, `y_${row}`, "✓", { fontSize: 12, center: true, blackText: true });
safeSetField(form, `n_${row}`, "", { fontSize: 12, center: true, blackText: true });
yValue = "Y";
nValue = "";
safeSetField(form, `y_${row}`, yValue, { fontSize: 12, center: true, blackText: true });
safeSetField(form, `n_${row}`, nValue, { fontSize: 12, center: true, blackText: true });
} else {
safeSetField(form, `y_${row}`, "", { fontSize: 12, center: true, blackText: true });
safeSetField(form, `n_${row}`, "✕", { fontSize: 12, center: true, blackText: true });
yValue = "";
nValue = "N";
safeSetField(form, `y_${row}`, yValue, { fontSize: 12, center: true, blackText: true });
safeSetField(form, `n_${row}`, nValue, { fontSize: 12, center: true, blackText: true });
}
const outboundStatus = findOutboundStatusByCustomerId(outboundCustomerStatuses, customer?.customer_id);
@@ -307,8 +307,21 @@ const buildRoutePdfBuffer = async (templateBytes, route, seqNum, driversMap, veh
}
}
if (noticeParts.length > 0) {
safeSetField(form, `note_${row}`, noticeParts.join(" "));
if (noticeParts.length > 0) safeSetField(form, `note_${row}`, noticeParts.join(" "));
if (Array.isArray(debugRows)) {
debugRows.push({
route: route?.name || "",
row,
customer_id: customerId,
customer_name: customer?.customer_name || "",
hasEnterCenterTime,
hasInCenterStatus: hasInCenterStatusByCandidate(customer, relativeRouteCustomer, customerInOtherRoute),
y_field_value: yValue,
n_field_value: nValue,
note_to_driver: customerNoteText,
final_notice: noticeParts.join(" ")
});
}
});
@@ -435,6 +448,7 @@ exports.updateReport = (req, res) => {
exports.exportRouteReportZip = async (req, res) => {
try {
const date = req.query?.date;
const debugMode = `${req.query?.debug || ""}`.toLowerCase() === "1" || `${req.query?.debug || ""}`.toLowerCase() === "true";
if (!date) {
return res.status(400).send({ message: "date query is required." });
}
@@ -517,6 +531,7 @@ exports.exportRouteReportZip = async (req, res) => {
archive.pipe(res);
const filenameCounter = new Map();
const debugRows = [];
for (let i = 0; i < inboundRoutes.length; i += 1) {
const route = inboundRoutes[i];
const pdfBytes = await buildRoutePdfBuffer(
@@ -528,7 +543,8 @@ exports.exportRouteReportZip = async (req, res) => {
outboundCustomerStatuses,
unicodeFontBytes,
routes,
customerNotesById
customerNotesById,
debugMode ? debugRows : null
);
const base = sanitizeFileName(route?.name || `route_${i + 1}`) || `route_${i + 1}`;
const existingCount = filenameCounter.get(base) || 0;
@@ -537,6 +553,24 @@ exports.exportRouteReportZip = async (req, res) => {
archive.append(Buffer.from(pdfBytes), { name: finalName });
}
if (debugMode) {
archive.append(
Buffer.from(
JSON.stringify(
{
date,
site,
generated_at: new Date().toISOString(),
rows: debugRows
},
null,
2
)
),
{ name: "debug_export.json" }
);
}
archive.finalize();
} catch (err) {
console.error("Failed to export route report zip:", err);

View File

@@ -187,10 +187,6 @@ const RouteReportWithSignature = () => {
const getRouteNoteToDriverText = (customerId, ...customerCandidates) => {
const profileNote = (customerMetaById.get(customerId)?.notes_for_driver || '').toString().trim();
if (profileNote) return profileNote;
for (const item of customerCandidates) {
const noteText = (item?.customer_note || '').toString().trim();
if (noteText) return noteText;
}
return '';
};