Rebuild order flow: settle after pricing, notifications, and invoice expiry.
Hide prices until admin sends the invoice, enforce status transitions, add customer/admin SMS+in-app notifications, schedule cash invoice reminders, and ship updated dist/prisma-client/deploy-bundle for git-pull deploys. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+83
@@ -0,0 +1,83 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ORDER_TRANSITIONS = void 0;
|
||||
exports.isFinalStatus = isFinalStatus;
|
||||
exports.allowedTransitions = allowedTransitions;
|
||||
exports.canTransition = canTransition;
|
||||
exports.assertTransition = assertTransition;
|
||||
const common_1 = require("@nestjs/common");
|
||||
const client_1 = require("@prisma/client");
|
||||
const order_status_1 = require("./order-status");
|
||||
exports.ORDER_TRANSITIONS = {
|
||||
awaiting_review: [client_1.OrderStatus.pricing],
|
||||
pricing: [client_1.OrderStatus.awaiting_settlement],
|
||||
awaiting_settlement: [
|
||||
client_1.OrderStatus.awaiting_cash_payment,
|
||||
client_1.OrderStatus.check_in_progress,
|
||||
client_1.OrderStatus.pricing,
|
||||
],
|
||||
awaiting_cash_payment: [
|
||||
client_1.OrderStatus.awaiting_cash_confirmation,
|
||||
client_1.OrderStatus.expired,
|
||||
],
|
||||
awaiting_cash_confirmation: [
|
||||
client_1.OrderStatus.cash_confirmed,
|
||||
client_1.OrderStatus.awaiting_cash_payment,
|
||||
],
|
||||
cash_confirmed: [client_1.OrderStatus.final_approved],
|
||||
check_in_progress: [client_1.OrderStatus.awaiting_check_review],
|
||||
awaiting_check_review: [
|
||||
client_1.OrderStatus.checks_approved,
|
||||
client_1.OrderStatus.check_needs_fix,
|
||||
],
|
||||
check_needs_fix: [client_1.OrderStatus.awaiting_check_review],
|
||||
checks_approved: [client_1.OrderStatus.final_approved],
|
||||
final_approved: [client_1.OrderStatus.preparing],
|
||||
preparing: [client_1.OrderStatus.ready_to_ship],
|
||||
ready_to_ship: [client_1.OrderStatus.shipped],
|
||||
shipped: [client_1.OrderStatus.delivered],
|
||||
delivered: [],
|
||||
cancelled: [],
|
||||
rejected: [],
|
||||
expired: [],
|
||||
cart: [client_1.OrderStatus.awaiting_review],
|
||||
submitted: [client_1.OrderStatus.awaiting_review],
|
||||
needs_correction: [client_1.OrderStatus.awaiting_review, client_1.OrderStatus.pricing],
|
||||
awaiting_settlement_fix: [client_1.OrderStatus.awaiting_settlement],
|
||||
cash_in_progress: [client_1.OrderStatus.awaiting_cash_payment],
|
||||
cash_invoice_issued: [client_1.OrderStatus.awaiting_cash_payment],
|
||||
cash_payment_submitted: [client_1.OrderStatus.awaiting_cash_confirmation],
|
||||
check_rejected: [client_1.OrderStatus.check_needs_fix],
|
||||
};
|
||||
const ADMIN_TERMINAL_TRANSITIONS = [
|
||||
client_1.OrderStatus.cancelled,
|
||||
client_1.OrderStatus.rejected,
|
||||
];
|
||||
const FINAL_STATUSES = [
|
||||
client_1.OrderStatus.delivered,
|
||||
client_1.OrderStatus.cancelled,
|
||||
client_1.OrderStatus.rejected,
|
||||
client_1.OrderStatus.expired,
|
||||
];
|
||||
function isFinalStatus(status) {
|
||||
return FINAL_STATUSES.includes(status);
|
||||
}
|
||||
function allowedTransitions(from) {
|
||||
const next = [...(exports.ORDER_TRANSITIONS[from] ?? [])];
|
||||
if (!isFinalStatus(from)) {
|
||||
for (const terminal of ADMIN_TERMINAL_TRANSITIONS) {
|
||||
if (!next.includes(terminal))
|
||||
next.push(terminal);
|
||||
}
|
||||
}
|
||||
return next;
|
||||
}
|
||||
function canTransition(from, to) {
|
||||
return allowedTransitions(from).includes(to);
|
||||
}
|
||||
function assertTransition(from, to) {
|
||||
if (canTransition(from, to))
|
||||
return;
|
||||
throw new common_1.BadRequestException(`تغییر وضعیت از «${order_status_1.ORDER_STATUS_LABELS[from]}» به «${order_status_1.ORDER_STATUS_LABELS[to]}» مجاز نیست`);
|
||||
}
|
||||
//# sourceMappingURL=order-transitions.js.map
|
||||
Reference in New Issue
Block a user