UNPKG

@devx-commerce/plugin-loyalty

Version:

A starter for Medusa plugins.

90 lines (87 loc) 8.74 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateMonthlyReportStep = void 0; const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk"); const utils_1 = require("@medusajs/framework/utils"); const helper_1 = require("../../../utils/helper"); exports.generateMonthlyReportStep = (0, workflows_sdk_1.createStep)("generate-monthly-report-step", async (input, { container }) => { const knex = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION); const startUTC = new Date(input.start_date).toISOString(); const endDateObj = new Date(input.end_date); endDateObj.setHours(23, 59, 59, 999); const endUTC = endDateObj.toISOString(); // Single aggregated SQL query const { rows } = await knex.raw(` SELECT TO_CHAR(DATE_TRUNC('month', created_at + INTERVAL '5 hours 30 minutes'), 'Month YYYY') AS month_label, SUM(CASE WHEN type = 'credit' AND reference_type = 'manual' THEN points ELSE 0 END) AS credited_from_twt, SUM(CASE WHEN type = 'credit' AND (reference_type = 'order_return' OR (reference_type = 'order' AND (description = 'Points refunded for order cancellation' OR description = '[RECOVERY] Points refunded for order cancellation'))) THEN points ELSE 0 END) AS credited_from_order_refunds, SUM(CASE WHEN type = 'credit' AND reference_type = 'order' AND (description LIKE 'Points earned for order%' OR description LIKE '[RECOVERY] Points earned for order%') THEN points ELSE 0 END) AS credited_from_orders_delivered, SUM(CASE WHEN type = 'credit' AND reference_type IN ('referral', 'referral_order') AND description IN ('Referral points', '[RECOVERY] Referral points') THEN points ELSE 0 END) AS credited_from_referral, SUM(CASE WHEN type = 'credit' AND reference_type IN ('referral', 'referral_order') AND description IN ('Points for referring', '[RECOVERY] Points for referring') THEN points ELSE 0 END) AS credited_from_referring, SUM(CASE WHEN type = 'credit' THEN points ELSE 0 END) AS total_credited, SUM(CASE WHEN type = 'debit' AND reference_type = 'order' AND description NOT LIKE '%Expired%' THEN points ELSE 0 END) AS debited_from_orders_placed, SUM(CASE WHEN type = 'debit' AND reference_type = 'manual' THEN points ELSE 0 END) AS debited_from_twt, SUM(CASE WHEN type = 'debit' AND (reference_type = 'expired' OR (reference_type = 'order' AND description LIKE '%Expired%')) THEN points ELSE 0 END) AS debited_from_expired_points, SUM(CASE WHEN type = 'debit' THEN points ELSE 0 END) AS total_debited FROM loyalty_transaction WHERE deleted_at IS NULL AND created_at >= ? AND created_at <= ? GROUP BY DATE_TRUNC('month', created_at + INTERVAL '5 hours 30 minutes') ORDER BY DATE_TRUNC('month', created_at + INTERVAL '5 hours 30 minutes') ASC `, [startUTC, endUTC]); const reportRows = rows.map((r) => { const credited = Number(r.total_credited); const debited = Number(r.total_debited); const monthLabel = r.month_label.trim().replace(/\s+/, " "); return { month: monthLabel, credited_from_twt: Number(r.credited_from_twt), credited_from_order_refunds: Number(r.credited_from_order_refunds), credited_from_orders_delivered: Number(r.credited_from_orders_delivered), credited_from_referral: Number(r.credited_from_referral), credited_from_referring: Number(r.credited_from_referring), total_credited: credited, debited_from_orders_placed: Number(r.debited_from_orders_placed), debited_from_twt: Number(r.debited_from_twt), debited_from_expired_points: Number(r.debited_from_expired_points), total_debited: debited, net_balance: credited - debited, }; }); const headers = [ "Month", "Credited from TWT", "Credited from Order Refunds", "Credited from Orders delivered", "Credited from Referral", "Credited from Referring", "Total Credited", "Debited from Orders Placed", "Debited from TWT", "Debited from expired points", "Total Debited", "Net Balance", ]; const csvLines = [headers.join(",")]; for (const row of reportRows) { csvLines.push([ row.month, (0, helper_1.csvCell)(row.credited_from_twt), (0, helper_1.csvCell)(row.credited_from_order_refunds), (0, helper_1.csvCell)(row.credited_from_orders_delivered), (0, helper_1.csvCell)(row.credited_from_referral), (0, helper_1.csvCell)(row.credited_from_referring), (0, helper_1.csvCell)(row.total_credited), (0, helper_1.csvCell)(row.debited_from_orders_placed), (0, helper_1.csvCell)(row.debited_from_twt), (0, helper_1.csvCell)(row.debited_from_expired_points), (0, helper_1.csvCell)(row.total_debited), (0, helper_1.csvCell)(row.net_balance), ].join(",")); } const csv = csvLines.join("\n"); return new workflows_sdk_1.StepResponse({ csv, rows: reportRows }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtbW9udGhseS1yZXBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3BvaW50cy9zdGVwcy9nZW5lcmF0ZS1tb250aGx5LXJlcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxRUFBNkU7QUFDN0UscURBQXNFO0FBQ3RFLGtEQUFnRDtBQXNCbkMsUUFBQSx5QkFBeUIsR0FBRyxJQUFBLDBCQUFVLEVBQ2pELDhCQUE4QixFQUM5QixLQUFLLEVBQUUsS0FBcUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFFN0QsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUV4RSxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDMUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDckMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRXhDLDhCQUE4QjtJQUM5QixNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBc0IvQixFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFdkIsTUFBTSxVQUFVLEdBQXVCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtRQUN6RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzFDLE1B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