in src/homedelivery/export.ts [170:238]
async function processSubs(
downloadStream: ReadStream,
deliveryDate: Moment,
stage: string,
holidaySuspensions: Set<string>,
): Promise<string> {
const sentDate = moment().format('DD/MM/YYYY');
const chargeDay = deliveryDate.format('dddd');
const formattedDeliveryDate = deliveryDate.format('DD/MM/YYYY');
const config = await fetchConfig();
const folder = config.fulfilments.homedelivery.uploadFolder;
console.log('loaded ' + holidaySuspensions.size + ' holiday suspensions');
const csvFormatterStream = csvFormatterForSalesforce(outputHeaders);
const writeRowToCsvStream = (
row: Partial<InputRow>,
csvStream: csv.CsvFormatterStream<csv.FormatterRow, csv.FormatterRow>,
) => {
const subscriptionName = row[SUBSCRIPTION_NAME];
if (!holidaySuspensions.has(subscriptionName || '')) {
const outputCsvRow: Partial<OutputRow> = {};
outputCsvRow[CUSTOMER_REFERENCE] = subscriptionName;
outputCsvRow[CUSTOMER_TOWN] = row[CITY];
outputCsvRow[CUSTOMER_POSTCODE] = formatPostCode(row[POSTAL_CODE] || '');
outputCsvRow[CUSTOMER_ADDRESS_LINE_1] = row[ADDRESS_1];
outputCsvRow[CUSTOMER_ADDRESS_LINE_2] = row[ADDRESS_2];
outputCsvRow[CUSTOMER_FULL_NAME] = getFullName(
row[FIRST_NAME] || '',
row[LAST_NAME] || '',
);
outputCsvRow[DELIVERY_QUANTITY] = row[QUANTITY];
outputCsvRow[SENT_DATE] = sentDate;
outputCsvRow[DELIVERY_DATE] = formattedDeliveryDate;
outputCsvRow[CHARGE_DAY] = chargeDay;
outputCsvRow[CUSTOMER_PHONE] = ''; // Was row[WORK_PHONE]. Removed on 6-Apr-2021 due to no longer being necessary.
outputCsvRow[ADDITIONAL_INFORMATION] = formatDeliveryInstructions(
row[DELIVERY_INSTRUCTIONS] || '',
);
csvStream.write(outputCsvRow);
}
};
const writableCsvPromise = new Promise((resolve, reject) => {
downloadStream
.pipe(csv.parse({ headers: true }))
.on('error', (error) => {
console.log('Failed to write HomeDelivery CSV: ', error);
reject(error);
})
.on('data', (row) => writeRowToCsvStream(row, csvFormatterStream))
.on('end', (rowCount: number) => {
console.log(`Successfully written ${rowCount} rows`);
csvFormatterStream.end();
resolve(csvFormatterStream);
});
});
const outputFileName = generateFilename(deliveryDate, 'HOME_DELIVERY');
const stream = await writableCsvPromise;
/**
* WARNING: Although AWS S3.upload docs seem to indicate we can upload a stream object directly via
* 'Body: stream' params field, it does not seem to work with the stream provided by csv-parser,
* thus we had to convert the stream to string using get-stream package.
*/
const streamAsString = await getStream(stream as ReadStream);
await upload(streamAsString, outputFileName, folder);
return outputFileName.filename;
}