@medusajs/core-flows
Version:
Set of workflow definitions for Medusa
141 lines • 6.05 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getLastFulfillmentStatus = exports.getLastPaymentStatus = void 0;
const utils_1 = require("@medusajs/framework/utils");
const getLastPaymentStatus = (order) => {
const PaymentStatus = {
NOT_PAID: "not_paid",
AWAITING: "awaiting",
CAPTURED: "captured",
PARTIALLY_CAPTURED: "partially_captured",
PARTIALLY_REFUNDED: "partially_refunded",
REFUNDED: "refunded",
CANCELED: "canceled",
REQUIRES_ACTION: "requires_action",
AUTHORIZED: "authorized",
PARTIALLY_AUTHORIZED: "partially_authorized",
};
let paymentStatus = {};
for (const status in PaymentStatus) {
paymentStatus[PaymentStatus[status]] = 0;
}
for (const paymentCollection of order.payment_collections) {
if (utils_1.MathBN.gt(paymentCollection.captured_amount ?? 0, 0) ||
((0, utils_1.isDefined)(paymentCollection.amount) &&
utils_1.MathBN.eq(paymentCollection.amount, 0))) {
paymentStatus[PaymentStatus.CAPTURED] += utils_1.MathBN.eq(paymentCollection.captured_amount, paymentCollection.amount)
? 1
: 0.5;
}
if (utils_1.MathBN.gt(paymentCollection.refunded_amount ?? 0, 0)) {
paymentStatus[PaymentStatus.REFUNDED] += utils_1.MathBN.eq(paymentCollection.refunded_amount, paymentCollection.amount)
? 1
: 0.5;
}
paymentStatus[paymentCollection.status] += 1;
}
const totalPayments = order.payment_collections.length;
const totalPaymentExceptCanceled = totalPayments - paymentStatus[PaymentStatus.CANCELED];
if (paymentStatus[PaymentStatus.REQUIRES_ACTION] > 0) {
return PaymentStatus.REQUIRES_ACTION;
}
if (paymentStatus[PaymentStatus.REFUNDED] > 0) {
if (paymentStatus[PaymentStatus.REFUNDED] ===
paymentStatus[PaymentStatus.CAPTURED]) {
return PaymentStatus.REFUNDED;
}
return PaymentStatus.PARTIALLY_REFUNDED;
}
if (paymentStatus[PaymentStatus.CAPTURED] > 0) {
if (paymentStatus[PaymentStatus.CAPTURED] === totalPaymentExceptCanceled) {
return PaymentStatus.CAPTURED;
}
return PaymentStatus.PARTIALLY_CAPTURED;
}
if (paymentStatus[PaymentStatus.AUTHORIZED] > 0) {
if (paymentStatus[PaymentStatus.AUTHORIZED] === totalPaymentExceptCanceled) {
return PaymentStatus.AUTHORIZED;
}
return PaymentStatus.PARTIALLY_AUTHORIZED;
}
if (paymentStatus[PaymentStatus.CANCELED] > 0 &&
paymentStatus[PaymentStatus.CANCELED] === totalPayments) {
return PaymentStatus.CANCELED;
}
if (paymentStatus[PaymentStatus.AWAITING] > 0) {
return PaymentStatus.AWAITING;
}
return PaymentStatus.NOT_PAID;
};
exports.getLastPaymentStatus = getLastPaymentStatus;
const getLastFulfillmentStatus = (order) => {
const FulfillmentStatus = {
NOT_FULFILLED: "not_fulfilled",
PARTIALLY_FULFILLED: "partially_fulfilled",
FULFILLED: "fulfilled",
PARTIALLY_SHIPPED: "partially_shipped",
SHIPPED: "shipped",
DELIVERED: "delivered",
PARTIALLY_DELIVERED: "partially_delivered",
CANCELED: "canceled",
};
let fulfillmentStatus = {};
for (const status in FulfillmentStatus) {
fulfillmentStatus[FulfillmentStatus[status]] = 0;
}
const statusMap = {
canceled_at: FulfillmentStatus.CANCELED,
delivered_at: FulfillmentStatus.DELIVERED,
shipped_at: FulfillmentStatus.SHIPPED,
packed_at: FulfillmentStatus.FULFILLED,
};
for (const fulfillmentCollection of order.fulfillments) {
// Note: The order of the statusMap keys is important as we break
// the loop when we have found a match. The match should be prioritized
// based on order of precedence of statuses
for (const key in statusMap) {
if (fulfillmentCollection[key]) {
fulfillmentStatus[statusMap[key]] += 1;
break;
}
}
}
const totalFulfillments = order.fulfillments.length;
const totalFulfillmentsExceptCanceled = totalFulfillments - fulfillmentStatus[FulfillmentStatus.CANCELED];
// Whenever there are any unfulfilled items in the order, it should be
// considered partially_[STATUS] where status is picked up from the hierarchy
// of statuses
const hasUnfulfilledItems = (order.items || [])?.filter((i) => (0, utils_1.isDefined)(i?.detail?.raw_fulfilled_quantity) &&
utils_1.MathBN.lt(i.detail.raw_fulfilled_quantity, i.raw_quantity)).length > 0;
if (fulfillmentStatus[FulfillmentStatus.DELIVERED] > 0) {
if (fulfillmentStatus[FulfillmentStatus.DELIVERED] ===
totalFulfillmentsExceptCanceled &&
!hasUnfulfilledItems) {
return FulfillmentStatus.DELIVERED;
}
return FulfillmentStatus.PARTIALLY_DELIVERED;
}
if (fulfillmentStatus[FulfillmentStatus.SHIPPED] > 0) {
if (fulfillmentStatus[FulfillmentStatus.SHIPPED] ===
totalFulfillmentsExceptCanceled &&
!hasUnfulfilledItems) {
return FulfillmentStatus.SHIPPED;
}
return FulfillmentStatus.PARTIALLY_SHIPPED;
}
if (fulfillmentStatus[FulfillmentStatus.FULFILLED] > 0) {
if (fulfillmentStatus[FulfillmentStatus.FULFILLED] ===
totalFulfillmentsExceptCanceled &&
!hasUnfulfilledItems) {
return FulfillmentStatus.FULFILLED;
}
return FulfillmentStatus.PARTIALLY_FULFILLED;
}
if (fulfillmentStatus[FulfillmentStatus.CANCELED] > 0 &&
fulfillmentStatus[FulfillmentStatus.CANCELED] === totalFulfillments) {
return FulfillmentStatus.CANCELED;
}
return FulfillmentStatus.NOT_FULFILLED;
};
exports.getLastFulfillmentStatus = getLastFulfillmentStatus;
//# sourceMappingURL=aggregate-status.js.map