async function processSubs()

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;
}