@zaamx/netme-pos 0.0.14 → 0.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/admin/index.js +6 -6
- package/.medusa/server/src/admin/index.mjs +6 -6
- package/.medusa/server/src/api/admin/netme-pos/products/helpers.js +8 -2
- package/.medusa/server/src/api/admin/orders/sales/pending-by-location/route.js +152 -0
- package/.medusa/server/src/api/admin/orders/sales/route.js +398 -0
- package/package.json +1 -1
|
@@ -1718,17 +1718,17 @@ const routeModule = {
|
|
|
1718
1718
|
const menuItemModule = {
|
|
1719
1719
|
menuItems: [
|
|
1720
1720
|
{
|
|
1721
|
-
label: config$
|
|
1722
|
-
icon: config$
|
|
1723
|
-
path: "/
|
|
1721
|
+
label: config$1.label,
|
|
1722
|
+
icon: config$1.icon,
|
|
1723
|
+
path: "/payment-options",
|
|
1724
1724
|
nested: void 0,
|
|
1725
1725
|
rank: void 0,
|
|
1726
1726
|
translationNs: void 0
|
|
1727
1727
|
},
|
|
1728
1728
|
{
|
|
1729
|
-
label: config$
|
|
1730
|
-
icon: config$
|
|
1731
|
-
path: "/
|
|
1729
|
+
label: config$2.label,
|
|
1730
|
+
icon: config$2.icon,
|
|
1731
|
+
path: "/operators",
|
|
1732
1732
|
nested: void 0,
|
|
1733
1733
|
rank: void 0,
|
|
1734
1734
|
translationNs: void 0
|
|
@@ -1715,17 +1715,17 @@ const routeModule = {
|
|
|
1715
1715
|
const menuItemModule = {
|
|
1716
1716
|
menuItems: [
|
|
1717
1717
|
{
|
|
1718
|
-
label: config$
|
|
1719
|
-
icon: config$
|
|
1720
|
-
path: "/
|
|
1718
|
+
label: config$1.label,
|
|
1719
|
+
icon: config$1.icon,
|
|
1720
|
+
path: "/payment-options",
|
|
1721
1721
|
nested: void 0,
|
|
1722
1722
|
rank: void 0,
|
|
1723
1723
|
translationNs: void 0
|
|
1724
1724
|
},
|
|
1725
1725
|
{
|
|
1726
|
-
label: config$
|
|
1727
|
-
icon: config$
|
|
1728
|
-
path: "/
|
|
1726
|
+
label: config$2.label,
|
|
1727
|
+
icon: config$2.icon,
|
|
1728
|
+
path: "/operators",
|
|
1729
1729
|
nested: void 0,
|
|
1730
1730
|
rank: void 0,
|
|
1731
1731
|
translationNs: void 0
|
|
@@ -131,6 +131,12 @@ exports.wrapVariantsWithInventoryQuantity = wrapVariantsWithInventoryQuantity;
|
|
|
131
131
|
* single requested stock location.
|
|
132
132
|
*/
|
|
133
133
|
const getVariantAvailabilityForLocation = async (query, variantIds, stockLocationId) => {
|
|
134
|
+
// NEVER cache availability: inventory is the most volatile data the POS
|
|
135
|
+
// reads, and Medusa's query cache only invalidates on module EVENTS. Any
|
|
136
|
+
// write that bypasses the API (WMS SQL, reserved_quantity reconciliation
|
|
137
|
+
// jobs, restored dumps) leaves the cached entry stale forever — seen in prod
|
|
138
|
+
// (07/08-sep-2026): POS kept serving day-old availability after the levels
|
|
139
|
+
// were corrected directly in the database.
|
|
134
140
|
const { data: variantInventoryItems } = await query.graph({
|
|
135
141
|
entity: "product_variant_inventory_items",
|
|
136
142
|
fields: [
|
|
@@ -140,7 +146,7 @@ const getVariantAvailabilityForLocation = async (query, variantIds, stockLocatio
|
|
|
140
146
|
"inventory.location_levels.*",
|
|
141
147
|
],
|
|
142
148
|
filters: { variant_id: variantIds },
|
|
143
|
-
}
|
|
149
|
+
});
|
|
144
150
|
const variantInventoriesMap = new Map();
|
|
145
151
|
variantInventoryItems.forEach((link) => {
|
|
146
152
|
const arr = variantInventoriesMap.get(link.variant_id) || [];
|
|
@@ -186,4 +192,4 @@ const getInventoryScope = (req) => {
|
|
|
186
192
|
return { salesChannelId, stockLocationId };
|
|
187
193
|
};
|
|
188
194
|
exports.getInventoryScope = getInventoryScope;
|
|
189
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcGkvYWRtaW4vbmV0bWUtcG9zL3Byb2R1Y3RzL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscURBTWtDO0FBZWxDOztHQUVHO0FBQ0ksTUFBTSxrQ0FBa0MsR0FBRyxDQUFDLFFBQWUsRUFBRSxFQUFFO0lBQ3BFLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEIsT0FBTTtRQUNSLENBQUM7UUFDRCxPQUFPLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUM1QyxDQUFDLFFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUN6QyxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUE7QUFUWSxRQUFBLGtDQUFrQyxzQ0FTOUM7QUFFRDs7Ozs7R0FLRztBQUNJLE1BQU0seUJBQXlCLEdBQUcsS0FBSyxFQUM1QyxHQUF1QixFQUN2QixRQUFlLEVBQ2YsRUFBRTtJQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLHFCQUFxQixJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUM5RSxPQUFNO0lBQ1IsQ0FBQztJQUVELElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3pELE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRWpELE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBTSxVQUFVLENBQUMsV0FBVyxDQUM1QyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUM5QixHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FDOUIsQ0FBVSxDQUFBO0lBRVgsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUE7SUFDNUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzNCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzNDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUMzQyxDQUFDO1FBQ0QsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3RELENBQUMsQ0FBQyxDQUFBO0lBRUYsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzNCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7WUFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUM5QixPQUFNO1lBQ1IsQ0FBQztZQUVELE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFBO1lBQzVELE1BQU0sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLEdBQUcsSUFBQSwrQkFBdUIsRUFBQztnQkFDaEUsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUI7Z0JBQ2xELFdBQVcsRUFBRSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsaUNBQWlDO2FBQ3hFLENBQUMsQ0FBQTtZQUNGLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsR0FBRyxZQUFZLENBQUE7WUFDbEUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLDZCQUE2QixHQUFHLGVBQWUsQ0FBQTtZQUV4RSxNQUFNLEVBQ0osWUFBWSxFQUFFLG9CQUFvQixFQUNsQyxlQUFlLEVBQUUsdUJBQXVCLEdBQ3pDLEdBQUcsSUFBQSwrQkFBdUIsRUFBQztnQkFDMUIsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlO2dCQUNoRCxXQUFXLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLCtCQUErQjthQUN0RSxDQUFDLENBQUE7WUFDRixPQUFPLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLEdBQUcsb0JBQW9CLENBQUE7WUFDeEUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLDJCQUEyQjtnQkFDbEQsdUJBQXVCLENBQUE7UUFDM0IsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQTtBQXZEWSxRQUFBLHlCQUF5Qiw2QkF1RHJDO0FBRUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxPQUFZLEVBQUUsRUFBRTtJQUNqQyxPQUFPLE9BQU8sQ0FBQyxRQUFRO1FBQ3JCLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7UUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzlCLE9BQU07UUFDUixDQUFDO1FBQ0QsT0FBTztZQUNMLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtZQUNkLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRTtZQUN0QixlQUFlLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDaEMsUUFBUSxFQUFFLENBQUM7WUFDWCxVQUFVLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQjtZQUN0RCxhQUFhLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGFBQWE7U0FDdEQsQ0FBQTtJQUNILENBQUMsQ0FBQztTQUNELE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQzVCLENBQUMsQ0FBQTtBQU9EOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0ksTUFBTSxpQ0FBaUMsR0FBRyxLQUFLLEVBQ3BELEdBQWtCLEVBQ2xCLFFBQWUsRUFDZixRQUF3QixFQUFFLEVBQzFCLEVBQUU7SUFDRixRQUFRLEtBQUssRUFBRSxDQUFBO0lBQ2YsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNoRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLE9BQU07SUFDUixDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFaEUsSUFBSSxZQUE2RCxDQUFBO0lBQ2pFLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzFCLFlBQVksR0FBRyxNQUFNLGlDQUFpQyxDQUNwRCxLQUFLLEVBQ0wsVUFBVSxFQUNWLEtBQUssQ0FBQyxlQUFlLENBQ3RCLENBQUE7SUFDSCxDQUFDO1NBQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDaEMsWUFBWSxHQUFHLE1BQU0sSUFBQSw4QkFBc0IsRUFBQyxLQUFLLEVBQUU7WUFDakQsV0FBVyxFQUFFLFVBQVU7WUFDdkIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGNBQWM7U0FDdkMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztTQUFNLENBQUM7UUFDTixZQUFZLEdBQUcsTUFBTSxJQUFBLG1DQUEyQixFQUFDLEtBQUssRUFBRTtZQUN0RCxXQUFXLEVBQUUsVUFBVTtTQUN4QixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDOUIsU0FBUTtRQUNWLENBQUM7UUFDRCxPQUFPLENBQUMsa0JBQWtCLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUE7SUFDckUsQ0FBQztBQUNILENBQUMsQ0FBQTtBQXJDWSxRQUFBLGlDQUFpQyxxQ0FxQzdDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxpQ0FBaUMsR0FBRyxLQUFLLEVBQzdDLEtBQVUsRUFDVixVQUFvQixFQUNwQixlQUF1QixFQUNtQyxFQUFFO0lBQzVELHdFQUF3RTtJQUN4RSx5RUFBeUU7SUFDekUseUVBQXlFO0lBQ3pFLDZFQUE2RTtJQUM3RSwyRUFBMkU7SUFDM0UsMkNBQTJDO0lBQzNDLE1BQU0sRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDeEQsTUFBTSxFQUFFLGlDQUFpQztRQUN6QyxNQUFNLEVBQUU7WUFDTixZQUFZO1lBQ1osbUJBQW1CO1lBQ25CLGFBQWE7WUFDYiw2QkFBNkI7U0FDOUI7UUFDRCxPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFO0tBQ3BDLENBQUMsQ0FBQTtJQUVGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUE7SUFDdEQscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7UUFDMUMsTUFBTSxHQUFHLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDNUQsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNkLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQ2pELENBQUMsQ0FBQyxDQUFBO0lBRUYsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUN0QixDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsRUFBRTtRQUNqQixNQUFNLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFBO1FBRXhELE1BQU0sbUJBQW1CLEdBQWEsRUFBRSxDQUFBO1FBQ3hDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUE7WUFDL0MsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FDdEUsQ0FBQyxHQUFXLEVBQUUsS0FBVSxFQUFFLEVBQUU7Z0JBQzFCLElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxlQUFlLEVBQUUsQ0FBQztvQkFDMUMsT0FBTyxHQUFHLENBQUE7Z0JBQ1osQ0FBQztnQkFDRCxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxrQkFBa0IsSUFBSSxDQUFDLENBQUMsQ0FBQTtZQUMvQyxDQUFDLEVBQ0QsQ0FBQyxDQUNGLENBQUE7WUFDRCxtQkFBbUIsQ0FBQyxJQUFJLENBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEdBQUcsZ0JBQWdCLENBQUMsQ0FDakQsQ0FBQTtRQUNILENBQUM7UUFFRCxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUc7WUFDZixZQUFZLEVBQUUsbUJBQW1CLENBQUMsTUFBTTtnQkFDdEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxtQkFBbUIsQ0FBQztnQkFDbEMsQ0FBQyxDQUFDLElBQUk7U0FDVCxDQUFBO1FBQ0QsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDLEVBQ0QsRUFBcUQsQ0FDdEQsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQUVEOzs7OztHQUtHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEdBQWtCLEVBQWtCLEVBQUU7SUFDdEUsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGNBQXFCLENBQUE7SUFFM0MsTUFBTSxlQUFlLEdBQUcsU0FBUyxFQUFFLGlCQUF1QyxDQUFBO0lBRTFFLElBQUksY0FBa0MsQ0FBQTtJQUN0QyxNQUFNLEtBQUssR0FBRyxTQUFTLEVBQUUsZ0JBQWdCLENBQUE7SUFDekMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNsRCxjQUFjLEdBQUcsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQ3hELENBQUM7SUFFRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxDQUFBO0FBQzVDLENBQUMsQ0FBQTtBQWJZLFFBQUEsaUJBQWlCLHFCQWE3QiJ9
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const route_1 = require("../route");
|
|
6
|
+
/**
|
|
7
|
+
* GET /admin/orders/sales/pending-by-location
|
|
8
|
+
* Un renglón por almacén: contacto (incluido el correo de los operadores
|
|
9
|
+
* asignados) y cuántas órdenes siguen pendientes de envío, por estado.
|
|
10
|
+
* `search` es el query string de /sales, sin el host.
|
|
11
|
+
*/
|
|
12
|
+
const GET = async (req, res) => {
|
|
13
|
+
const knex = req.scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
14
|
+
const whenSql = route_1.PENDING_FULFILLMENT_STATUSES
|
|
15
|
+
.map((status) => `WHEN ${(0, route_1.fulfillmentStatusOne)(status)} THEN '${status}'`)
|
|
16
|
+
.join("\n");
|
|
17
|
+
const countsResult = await knex.raw(`
|
|
18
|
+
WITH classified AS (
|
|
19
|
+
SELECT DISTINCT lfs.stock_location_id AS location_id, o.id AS order_id,
|
|
20
|
+
CASE
|
|
21
|
+
${whenSql}
|
|
22
|
+
ELSE NULL
|
|
23
|
+
END AS status
|
|
24
|
+
FROM "order" o
|
|
25
|
+
JOIN order_shipping os
|
|
26
|
+
ON os.order_id = o.id AND os.version = o.version AND os.deleted_at IS NULL
|
|
27
|
+
JOIN order_shipping_method osm
|
|
28
|
+
ON osm.id = os.shipping_method_id AND osm.deleted_at IS NULL
|
|
29
|
+
JOIN shipping_option so
|
|
30
|
+
ON so.id = osm.shipping_option_id AND so.deleted_at IS NULL
|
|
31
|
+
JOIN service_zone sz
|
|
32
|
+
ON sz.id = so.service_zone_id AND sz.deleted_at IS NULL
|
|
33
|
+
JOIN location_fulfillment_set lfs
|
|
34
|
+
ON lfs.fulfillment_set_id = sz.fulfillment_set_id AND lfs.deleted_at IS NULL
|
|
35
|
+
WHERE o.deleted_at IS NULL
|
|
36
|
+
AND o.is_draft_order = false
|
|
37
|
+
AND (${(0, route_1.settledPaymentSql)()})
|
|
38
|
+
)
|
|
39
|
+
SELECT location_id, status, count(DISTINCT order_id)::int AS count
|
|
40
|
+
FROM classified
|
|
41
|
+
WHERE status IS NOT NULL
|
|
42
|
+
GROUP BY location_id, status
|
|
43
|
+
`);
|
|
44
|
+
const locationsResult = await knex.raw(`
|
|
45
|
+
SELECT sl.id, sl.name,
|
|
46
|
+
sla.company, sla.phone, sla.address_1, sla.address_2,
|
|
47
|
+
sla.city, sla.province, sla.postal_code, sla.country_code
|
|
48
|
+
FROM stock_location sl
|
|
49
|
+
LEFT JOIN stock_location_address sla
|
|
50
|
+
ON sla.id = sl.address_id AND sla.deleted_at IS NULL
|
|
51
|
+
WHERE sl.deleted_at IS NULL
|
|
52
|
+
AND COALESCE(sl.metadata->>'wms_type', '') IS DISTINCT FROM 'IN_TRANSIT'
|
|
53
|
+
ORDER BY sl.name
|
|
54
|
+
`);
|
|
55
|
+
const usersResult = await knex.raw(`
|
|
56
|
+
SELECT u.id, u.email, u.first_name, u.last_name, assigned.location_id
|
|
57
|
+
FROM "user" u
|
|
58
|
+
JOIN (
|
|
59
|
+
SELECT u2.id AS user_id,
|
|
60
|
+
jsonb_array_elements_text(u2.metadata->'pos_stock_location_ids') AS location_id
|
|
61
|
+
FROM "user" u2
|
|
62
|
+
WHERE u2.deleted_at IS NULL
|
|
63
|
+
AND jsonb_typeof(u2.metadata->'pos_stock_location_ids') = 'array'
|
|
64
|
+
UNION
|
|
65
|
+
SELECT u2.id,
|
|
66
|
+
u2.metadata->>'pos_default_stock_location_id'
|
|
67
|
+
FROM "user" u2
|
|
68
|
+
WHERE u2.deleted_at IS NULL
|
|
69
|
+
AND COALESCE(u2.metadata->>'pos_default_stock_location_id', '') <> ''
|
|
70
|
+
UNION
|
|
71
|
+
SELECT u2.id,
|
|
72
|
+
jsonb_array_elements_text(u2.metadata->'wms_stock_location_ids')
|
|
73
|
+
FROM "user" u2
|
|
74
|
+
WHERE u2.deleted_at IS NULL
|
|
75
|
+
AND jsonb_typeof(u2.metadata->'wms_stock_location_ids') = 'array'
|
|
76
|
+
) assigned ON assigned.user_id = u.id
|
|
77
|
+
WHERE u.deleted_at IS NULL
|
|
78
|
+
AND assigned.location_id IS NOT NULL
|
|
79
|
+
`);
|
|
80
|
+
const counts = new Map();
|
|
81
|
+
for (const row of rowsOf(countsResult)) {
|
|
82
|
+
if (!row.location_id || !row.status)
|
|
83
|
+
continue;
|
|
84
|
+
const bucket = counts.get(row.location_id) ?? {};
|
|
85
|
+
bucket[row.status] = Number(row.count ?? 0);
|
|
86
|
+
counts.set(row.location_id, bucket);
|
|
87
|
+
}
|
|
88
|
+
const emails = new Map();
|
|
89
|
+
for (const row of rowsOf(usersResult)) {
|
|
90
|
+
if (!row.location_id || !row.email)
|
|
91
|
+
continue;
|
|
92
|
+
const list = emails.get(row.location_id) ?? [];
|
|
93
|
+
if (!list.some((item) => item.email === row.email)) {
|
|
94
|
+
list.push({
|
|
95
|
+
id: row.id ?? null,
|
|
96
|
+
email: row.email,
|
|
97
|
+
first_name: row.first_name ?? null,
|
|
98
|
+
last_name: row.last_name ?? null,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
emails.set(row.location_id, list);
|
|
102
|
+
}
|
|
103
|
+
const stock_locations = rowsOf(locationsResult).map((location) => {
|
|
104
|
+
const byStatus = {};
|
|
105
|
+
let total = 0;
|
|
106
|
+
for (const status of route_1.PENDING_FULFILLMENT_STATUSES) {
|
|
107
|
+
const count = counts.get(location.id ?? "")?.[status] ?? 0;
|
|
108
|
+
total += count;
|
|
109
|
+
byStatus[status] = {
|
|
110
|
+
count,
|
|
111
|
+
search: salesSearch(location.id ?? "", [status]),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const contacts = emails.get(location.id ?? "") ?? [];
|
|
115
|
+
return {
|
|
116
|
+
id: location.id,
|
|
117
|
+
name: location.name,
|
|
118
|
+
contact: {
|
|
119
|
+
company: location.company ?? null,
|
|
120
|
+
phone: location.phone ?? null,
|
|
121
|
+
address_1: location.address_1 ?? null,
|
|
122
|
+
address_2: location.address_2 ?? null,
|
|
123
|
+
city: location.city ?? null,
|
|
124
|
+
province: location.province ?? null,
|
|
125
|
+
postal_code: location.postal_code ?? null,
|
|
126
|
+
country_code: location.country_code ?? null,
|
|
127
|
+
email: contacts[0]?.email ?? null,
|
|
128
|
+
emails: contacts,
|
|
129
|
+
},
|
|
130
|
+
pending: {
|
|
131
|
+
total,
|
|
132
|
+
by_status: byStatus,
|
|
133
|
+
search: salesSearch(location.id ?? "", [...route_1.PENDING_FULFILLMENT_STATUSES]),
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
});
|
|
137
|
+
res.json({
|
|
138
|
+
stock_locations,
|
|
139
|
+
count: stock_locations.length,
|
|
140
|
+
pending_statuses: route_1.PENDING_FULFILLMENT_STATUSES,
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
exports.GET = GET;
|
|
144
|
+
function salesSearch(locationId, statuses) {
|
|
145
|
+
return `stockLocation=${locationId}&page=1&fulfillmentStatus=${statuses.join(",")}&paymentStatus=captured,pending_zero`;
|
|
146
|
+
}
|
|
147
|
+
function rowsOf(result) {
|
|
148
|
+
if (Array.isArray(result))
|
|
149
|
+
return result;
|
|
150
|
+
return result?.rows ?? [];
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL29yZGVycy9zYWxlcy9wZW5kaW5nLWJ5LWxvY2F0aW9uL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUFxRTtBQUNyRSxvQ0FJaUI7QUFFakI7Ozs7O0dBS0c7QUFDSSxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDbkUsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDdkUsTUFBTSxPQUFPLEdBQUcsb0NBQTRCO1NBQ3pDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsUUFBUSxJQUFBLDRCQUFvQixFQUFDLE1BQU0sQ0FBQyxVQUFVLE1BQU0sR0FBRyxDQUFDO1NBQ3hFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUViLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQzs7OztZQUkxQixPQUFPOzs7Ozs7Ozs7Ozs7Ozs7O2VBZ0JKLElBQUEseUJBQWlCLEdBQUU7Ozs7OztHQU0vQixDQUFDLENBQUE7SUFFRixNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUM7Ozs7Ozs7Ozs7R0FVdEMsQ0FBQyxDQUFBO0lBRUYsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3QmxDLENBQUMsQ0FBQTtJQUVGLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQyxDQUFBO0lBQ3hELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUks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
|
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PENDING_FULFILLMENT_STATUSES = exports.GET = void 0;
|
|
4
|
+
exports.settledPaymentSql = settledPaymentSql;
|
|
5
|
+
exports.fulfillmentStatusOne = fulfillmentStatusOne;
|
|
6
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
8
|
+
const TABLE_FIELDS = [
|
|
9
|
+
"id",
|
|
10
|
+
"display_id",
|
|
11
|
+
"status",
|
|
12
|
+
"created_at",
|
|
13
|
+
"updated_at",
|
|
14
|
+
"email",
|
|
15
|
+
"currency_code",
|
|
16
|
+
"customer_id",
|
|
17
|
+
"total",
|
|
18
|
+
"subtotal",
|
|
19
|
+
"tax_total",
|
|
20
|
+
"discount_total",
|
|
21
|
+
"shipping_total",
|
|
22
|
+
"metadata",
|
|
23
|
+
"billing_address.*",
|
|
24
|
+
"shipping_address.*",
|
|
25
|
+
"payment_collections.status",
|
|
26
|
+
"payment_collections.amount",
|
|
27
|
+
"payment_collections.captured_amount",
|
|
28
|
+
"payment_collections.refunded_amount",
|
|
29
|
+
"payment_collections.payments.provider_id",
|
|
30
|
+
"payment_collections.payments.captured_at",
|
|
31
|
+
"payment_collections.payments.refunds.id",
|
|
32
|
+
"fulfillments.id",
|
|
33
|
+
"fulfillments.canceled_at",
|
|
34
|
+
"fulfillments.shipped_at",
|
|
35
|
+
"fulfillments.packed_at",
|
|
36
|
+
"fulfillments.delivered_at",
|
|
37
|
+
"fulfillments.labels.tracking_number",
|
|
38
|
+
"fulfillments.labels.tracking_url",
|
|
39
|
+
"fulfillments.labels.label_url",
|
|
40
|
+
"shipping_methods.id",
|
|
41
|
+
"shipping_methods.name",
|
|
42
|
+
"shipping_methods.shipping_option_id",
|
|
43
|
+
];
|
|
44
|
+
const SORTS = {
|
|
45
|
+
created_at: "o.created_at",
|
|
46
|
+
updated_at: "o.updated_at",
|
|
47
|
+
display_id: "o.display_id",
|
|
48
|
+
email: "o.email",
|
|
49
|
+
total: "(sm.totals->>'current_order_total')::numeric",
|
|
50
|
+
billing_address: "ba.last_name",
|
|
51
|
+
};
|
|
52
|
+
const one = (value) => {
|
|
53
|
+
if (Array.isArray(value))
|
|
54
|
+
return value[0];
|
|
55
|
+
return value;
|
|
56
|
+
};
|
|
57
|
+
const text = (value) => {
|
|
58
|
+
const raw = one(value);
|
|
59
|
+
if (typeof raw !== "string")
|
|
60
|
+
return "";
|
|
61
|
+
const trimmed = raw.trim();
|
|
62
|
+
if (!trimmed || trimmed === "all")
|
|
63
|
+
return "";
|
|
64
|
+
return trimmed;
|
|
65
|
+
};
|
|
66
|
+
const flag = (value) => text(value) === "true";
|
|
67
|
+
/**
|
|
68
|
+
* Listado de ventas para la tabla de /sales.
|
|
69
|
+
* El admin de Medusa no filtra por shipping_option_id ni por proveedor de pago.
|
|
70
|
+
* Aquí el filtro corre en SQL (incluye el método de entrega / CEDIS) y luego
|
|
71
|
+
* se hidratan las filas de esa página con el mismo objeto que pinta la tabla.
|
|
72
|
+
*/
|
|
73
|
+
const GET = async (req, res) => {
|
|
74
|
+
const q = req.query ?? {};
|
|
75
|
+
const search = text(q.q) || text(q.search);
|
|
76
|
+
const regionId = text(q.region_id) || text(q.region);
|
|
77
|
+
const shippingOptionId = text(q.shipping_option_id) || text(q.shippingMethod);
|
|
78
|
+
const stockLocationId = text(q.stock_location_id) || text(q.stockLocation);
|
|
79
|
+
const paymentProviderId = text(q.payment_provider_id) || text(q.paymentMethod);
|
|
80
|
+
const paymentStatus = text(q.payment_status) || text(q.paymentStatus);
|
|
81
|
+
const fulfillmentStatus = text(q.fulfillment_status) || text(q.fulfillmentStatus);
|
|
82
|
+
const after = text(q.after);
|
|
83
|
+
const before = text(q.before);
|
|
84
|
+
const dateField = flag(q.updatedOrCreated) || text(q.date_field) === "updated_at"
|
|
85
|
+
? "updated_at"
|
|
86
|
+
: "created_at";
|
|
87
|
+
const sortBy = text(q.sort_by) || text(q.sortBy) || "created_at";
|
|
88
|
+
const descending = text(q.descending) !== "false";
|
|
89
|
+
const limit = clampInt(one(q.limit) ?? one(q.rowsPerPage), 100, 25);
|
|
90
|
+
const rawOffset = one(q.offset);
|
|
91
|
+
const offset = rawOffset === undefined || rawOffset === ""
|
|
92
|
+
? pageOffset(q, limit)
|
|
93
|
+
: clampInt(rawOffset, 1_000_000, 0);
|
|
94
|
+
if (after && Number.isNaN(Date.parse(after))) {
|
|
95
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "after no es una fecha");
|
|
96
|
+
}
|
|
97
|
+
if (before && Number.isNaN(Date.parse(before))) {
|
|
98
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "before no es una fecha");
|
|
99
|
+
}
|
|
100
|
+
const where = ["o.deleted_at IS NULL", "o.is_draft_order = false"];
|
|
101
|
+
const bindings = [];
|
|
102
|
+
const add = (sql, ...vals) => {
|
|
103
|
+
where.push(sql);
|
|
104
|
+
bindings.push(...vals);
|
|
105
|
+
};
|
|
106
|
+
if (regionId)
|
|
107
|
+
add("o.region_id = ?", regionId);
|
|
108
|
+
if (after)
|
|
109
|
+
add(`o.${dateField} >= ?`, new Date(after).toISOString());
|
|
110
|
+
if (before)
|
|
111
|
+
add(`o.${dateField} < ?`, new Date(before).toISOString());
|
|
112
|
+
if (shippingOptionId) {
|
|
113
|
+
add(`EXISTS (
|
|
114
|
+
SELECT 1
|
|
115
|
+
FROM order_shipping os
|
|
116
|
+
JOIN order_shipping_method osm ON osm.id = os.shipping_method_id
|
|
117
|
+
WHERE os.order_id = o.id
|
|
118
|
+
AND os.version = o.version
|
|
119
|
+
AND os.deleted_at IS NULL
|
|
120
|
+
AND osm.deleted_at IS NULL
|
|
121
|
+
AND osm.shipping_option_id = ?
|
|
122
|
+
)`, shippingOptionId);
|
|
123
|
+
}
|
|
124
|
+
if (stockLocationId) {
|
|
125
|
+
add(`EXISTS (
|
|
126
|
+
SELECT 1
|
|
127
|
+
FROM order_shipping os
|
|
128
|
+
JOIN order_shipping_method osm ON osm.id = os.shipping_method_id
|
|
129
|
+
JOIN shipping_option so ON so.id = osm.shipping_option_id
|
|
130
|
+
JOIN service_zone sz ON sz.id = so.service_zone_id
|
|
131
|
+
JOIN location_fulfillment_set lfs ON lfs.fulfillment_set_id = sz.fulfillment_set_id
|
|
132
|
+
WHERE os.order_id = o.id
|
|
133
|
+
AND os.version = o.version
|
|
134
|
+
AND os.deleted_at IS NULL
|
|
135
|
+
AND osm.deleted_at IS NULL
|
|
136
|
+
AND so.deleted_at IS NULL
|
|
137
|
+
AND sz.deleted_at IS NULL
|
|
138
|
+
AND lfs.deleted_at IS NULL
|
|
139
|
+
AND lfs.stock_location_id = ?
|
|
140
|
+
)`, stockLocationId);
|
|
141
|
+
}
|
|
142
|
+
if (paymentProviderId) {
|
|
143
|
+
add(`EXISTS (
|
|
144
|
+
SELECT 1
|
|
145
|
+
FROM order_payment_collection opc
|
|
146
|
+
JOIN payment p ON p.payment_collection_id = opc.payment_collection_id
|
|
147
|
+
WHERE opc.order_id = o.id
|
|
148
|
+
AND opc.deleted_at IS NULL
|
|
149
|
+
AND p.deleted_at IS NULL
|
|
150
|
+
AND p.canceled_at IS NULL
|
|
151
|
+
AND p.provider_id = ?
|
|
152
|
+
)`, paymentProviderId);
|
|
153
|
+
}
|
|
154
|
+
const paymentSql = paymentStatusFilter(paymentStatus);
|
|
155
|
+
if (paymentSql)
|
|
156
|
+
add(`(${paymentSql})`);
|
|
157
|
+
const fulfillmentSql = fulfillmentStatusFilter(fulfillmentStatus);
|
|
158
|
+
if (fulfillmentSql)
|
|
159
|
+
add(`(${fulfillmentSql})`);
|
|
160
|
+
if (search) {
|
|
161
|
+
const like = `%${search}%`;
|
|
162
|
+
add(`(
|
|
163
|
+
o.email ILIKE ?
|
|
164
|
+
OR o.display_id::text = ?
|
|
165
|
+
OR EXISTS (
|
|
166
|
+
SELECT 1 FROM order_address addr
|
|
167
|
+
WHERE addr.id = o.billing_address_id
|
|
168
|
+
AND addr.deleted_at IS NULL
|
|
169
|
+
AND (
|
|
170
|
+
addr.first_name ILIKE ?
|
|
171
|
+
OR addr.last_name ILIKE ?
|
|
172
|
+
OR concat_ws(' ', addr.first_name, addr.last_name) ILIKE ?
|
|
173
|
+
)
|
|
174
|
+
)
|
|
175
|
+
)`, like, search, like, like, like);
|
|
176
|
+
}
|
|
177
|
+
const sortExpr = SORTS[sortBy] ?? SORTS.created_at;
|
|
178
|
+
const direction = descending ? "DESC" : "ASC";
|
|
179
|
+
const joins = [];
|
|
180
|
+
if (sortBy === "total") {
|
|
181
|
+
joins.push(`LEFT JOIN order_summary sm ON sm.order_id = o.id AND sm.version = o.version AND sm.deleted_at IS NULL`);
|
|
182
|
+
}
|
|
183
|
+
if (sortBy === "billing_address") {
|
|
184
|
+
joins.push(`LEFT JOIN order_address ba ON ba.id = o.billing_address_id`);
|
|
185
|
+
}
|
|
186
|
+
const knex = req.scope.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
|
|
187
|
+
const whereSql = where.join(" AND ");
|
|
188
|
+
const countResult = await knex.raw(`SELECT count(*)::int AS count FROM "order" o WHERE ${whereSql}`, bindings);
|
|
189
|
+
const count = Number(rowsOf(countResult)[0]?.count ?? 0);
|
|
190
|
+
const pageResult = await knex.raw(`SELECT o.id
|
|
191
|
+
FROM "order" o
|
|
192
|
+
${joins.join("\n")}
|
|
193
|
+
WHERE ${whereSql}
|
|
194
|
+
ORDER BY ${sortExpr} ${direction} NULLS LAST, o.id ${direction}
|
|
195
|
+
LIMIT ? OFFSET ?`, [...bindings, limit, offset]);
|
|
196
|
+
const ids = rowsOf(pageResult)
|
|
197
|
+
.map((row) => row.id)
|
|
198
|
+
.filter((id) => typeof id === "string" && id.length > 0);
|
|
199
|
+
if (ids.length === 0) {
|
|
200
|
+
res.json({ orders: [], count, limit, offset });
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const { result } = await (0, core_flows_1.getOrdersListWorkflow)(req.scope).run({
|
|
204
|
+
input: {
|
|
205
|
+
fields: TABLE_FIELDS,
|
|
206
|
+
variables: {
|
|
207
|
+
filters: { id: ids },
|
|
208
|
+
skip: 0,
|
|
209
|
+
take: ids.length,
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
const listed = result;
|
|
214
|
+
const rows = Array.isArray(listed) ? listed : listed?.rows ?? [];
|
|
215
|
+
const byId = new Map(rows.map((order) => [order.id, order]));
|
|
216
|
+
const orders = ids.map((id) => byId.get(id)).filter(Boolean);
|
|
217
|
+
res.json({ orders, count, limit, offset });
|
|
218
|
+
};
|
|
219
|
+
exports.GET = GET;
|
|
220
|
+
function rowsOf(result) {
|
|
221
|
+
if (Array.isArray(result))
|
|
222
|
+
return result;
|
|
223
|
+
return result?.rows ?? [];
|
|
224
|
+
}
|
|
225
|
+
function clampInt(value, max, fallback) {
|
|
226
|
+
const parsed = typeof value === "number" ? value : parseInt(String(value ?? ""), 10);
|
|
227
|
+
if (!Number.isFinite(parsed))
|
|
228
|
+
return fallback;
|
|
229
|
+
return Math.min(max, Math.max(0, parsed)) || (parsed === 0 ? 0 : fallback);
|
|
230
|
+
}
|
|
231
|
+
function pageOffset(q, limit) {
|
|
232
|
+
const page = clampInt(one(q.page), 100000, 1);
|
|
233
|
+
if (page <= 1)
|
|
234
|
+
return 0;
|
|
235
|
+
return (page - 1) * limit;
|
|
236
|
+
}
|
|
237
|
+
function settledPaymentSql() {
|
|
238
|
+
return `((${paymentStatusOne("captured")}) OR (${pendingZeroSql()})) AND (${notRefundedSummarySql()})`;
|
|
239
|
+
}
|
|
240
|
+
function notRefundedSummarySql() {
|
|
241
|
+
return `EXISTS (
|
|
242
|
+
SELECT 1 FROM order_summary sm
|
|
243
|
+
WHERE sm.order_id = o.id
|
|
244
|
+
AND sm.version = o.version
|
|
245
|
+
AND sm.deleted_at IS NULL
|
|
246
|
+
AND COALESCE((sm.totals->>'refunded_total')::numeric, 0) = 0
|
|
247
|
+
)`;
|
|
248
|
+
}
|
|
249
|
+
function pendingZeroSql() {
|
|
250
|
+
return `EXISTS (
|
|
251
|
+
SELECT 1 FROM order_summary sm
|
|
252
|
+
WHERE sm.order_id = o.id
|
|
253
|
+
AND sm.version = o.version
|
|
254
|
+
AND sm.deleted_at IS NULL
|
|
255
|
+
AND COALESCE((sm.totals->>'pending_difference')::numeric, 0) = 0
|
|
256
|
+
AND COALESCE((sm.totals->>'refunded_total')::numeric, 0) = 0
|
|
257
|
+
)`;
|
|
258
|
+
}
|
|
259
|
+
function paymentStatusFilter(status) {
|
|
260
|
+
const statuses = status.split(",").map((item) => item.trim()).filter((item) => item && item !== "all");
|
|
261
|
+
if (statuses.length === 0)
|
|
262
|
+
return "";
|
|
263
|
+
if (statuses.length > 1) {
|
|
264
|
+
return statuses.map((item) => `(${paymentStatusOne(item)})`).join(" OR ");
|
|
265
|
+
}
|
|
266
|
+
return paymentStatusOne(statuses[0]);
|
|
267
|
+
}
|
|
268
|
+
function paymentStatusOne(status) {
|
|
269
|
+
const collection = `
|
|
270
|
+
SELECT 1
|
|
271
|
+
FROM order_payment_collection opc
|
|
272
|
+
JOIN payment_collection pc ON pc.id = opc.payment_collection_id
|
|
273
|
+
WHERE opc.order_id = o.id
|
|
274
|
+
AND opc.deleted_at IS NULL
|
|
275
|
+
AND pc.deleted_at IS NULL
|
|
276
|
+
`;
|
|
277
|
+
if (status === "requires_action")
|
|
278
|
+
return `EXISTS (${collection} AND pc.status = 'requires_action')`;
|
|
279
|
+
if (status === "refunded") {
|
|
280
|
+
return `EXISTS (${collection} AND COALESCE(pc.refunded_amount, 0) > 0 AND COALESCE(pc.refunded_amount, 0) >= COALESCE(pc.amount, 0))
|
|
281
|
+
AND NOT EXISTS (${collection} AND COALESCE(pc.refunded_amount, 0) > 0 AND COALESCE(pc.refunded_amount, 0) < COALESCE(pc.amount, 0))`;
|
|
282
|
+
}
|
|
283
|
+
if (status === "partially_refunded") {
|
|
284
|
+
return `EXISTS (${collection} AND COALESCE(pc.refunded_amount, 0) > 0 AND COALESCE(pc.refunded_amount, 0) < COALESCE(pc.amount, 0))`;
|
|
285
|
+
}
|
|
286
|
+
if (status === "captured") {
|
|
287
|
+
return `NOT EXISTS (${collection} AND COALESCE(pc.refunded_amount, 0) > 0)
|
|
288
|
+
AND EXISTS (${collection} AND COALESCE(pc.captured_amount, 0) > 0 AND COALESCE(pc.captured_amount, 0) >= COALESCE(pc.amount, 0) - 0.01)`;
|
|
289
|
+
}
|
|
290
|
+
if (status === "partially_captured") {
|
|
291
|
+
return `NOT EXISTS (${collection} AND COALESCE(pc.refunded_amount, 0) > 0)
|
|
292
|
+
AND EXISTS (${collection} AND COALESCE(pc.captured_amount, 0) > 0 AND COALESCE(pc.captured_amount, 0) < COALESCE(pc.amount, 0) - 0.01)`;
|
|
293
|
+
}
|
|
294
|
+
if (status === "authorized") {
|
|
295
|
+
return `NOT EXISTS (${collection} AND COALESCE(pc.captured_amount, 0) > 0)
|
|
296
|
+
AND NOT EXISTS (${collection} AND COALESCE(pc.refunded_amount, 0) > 0)
|
|
297
|
+
AND EXISTS (${collection} AND pc.status = 'authorized')`;
|
|
298
|
+
}
|
|
299
|
+
if (status === "partially_authorized") {
|
|
300
|
+
return `EXISTS (${collection} AND pc.status = 'partially_authorized')`;
|
|
301
|
+
}
|
|
302
|
+
if (status === "awaiting")
|
|
303
|
+
return `EXISTS (${collection} AND pc.status = 'awaiting')`;
|
|
304
|
+
if (status === "canceled") {
|
|
305
|
+
return `EXISTS (${collection} AND pc.status = 'canceled') AND NOT EXISTS (${collection} AND pc.status = 'completed')`;
|
|
306
|
+
}
|
|
307
|
+
if (status === "not_paid") {
|
|
308
|
+
return `NOT EXISTS (${collection} AND pc.status NOT IN ('not_paid', 'canceled'))`;
|
|
309
|
+
}
|
|
310
|
+
if (status === "pending_zero")
|
|
311
|
+
return pendingZeroSql();
|
|
312
|
+
if (status) {
|
|
313
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "payment_status no reconocido");
|
|
314
|
+
}
|
|
315
|
+
return "";
|
|
316
|
+
}
|
|
317
|
+
function fulfillmentStatusFilter(status) {
|
|
318
|
+
const statuses = status.split(",").map((item) => item.trim()).filter((item) => item && item !== "all");
|
|
319
|
+
if (statuses.length === 0)
|
|
320
|
+
return "";
|
|
321
|
+
if (statuses.length > 1) {
|
|
322
|
+
return statuses.map((item) => `(${fulfillmentStatusOne(item)})`).join(" OR ");
|
|
323
|
+
}
|
|
324
|
+
return fulfillmentStatusOne(statuses[0]);
|
|
325
|
+
}
|
|
326
|
+
exports.PENDING_FULFILLMENT_STATUSES = [
|
|
327
|
+
"not_fulfilled",
|
|
328
|
+
"partially_fulfilled",
|
|
329
|
+
"fulfilled",
|
|
330
|
+
"partially_shipped",
|
|
331
|
+
"partially_delivered",
|
|
332
|
+
];
|
|
333
|
+
function fulfillmentStatusOne(status) {
|
|
334
|
+
const active = `
|
|
335
|
+
SELECT 1
|
|
336
|
+
FROM order_fulfillment ofu
|
|
337
|
+
JOIN fulfillment f ON f.id = ofu.fulfillment_id
|
|
338
|
+
WHERE ofu.order_id = o.id
|
|
339
|
+
AND ofu.deleted_at IS NULL
|
|
340
|
+
AND f.deleted_at IS NULL
|
|
341
|
+
AND f.canceled_at IS NULL
|
|
342
|
+
`;
|
|
343
|
+
const openItems = `
|
|
344
|
+
SELECT 1 FROM order_item oi
|
|
345
|
+
WHERE oi.order_id = o.id
|
|
346
|
+
AND oi.version = o.version
|
|
347
|
+
AND oi.deleted_at IS NULL
|
|
348
|
+
AND COALESCE(oi.fulfilled_quantity, 0) < oi.quantity
|
|
349
|
+
`;
|
|
350
|
+
const anyFulfillment = `
|
|
351
|
+
SELECT 1 FROM order_fulfillment ofu
|
|
352
|
+
JOIN fulfillment f ON f.id = ofu.fulfillment_id
|
|
353
|
+
WHERE ofu.order_id = o.id AND ofu.deleted_at IS NULL AND f.deleted_at IS NULL
|
|
354
|
+
`;
|
|
355
|
+
if (status === "canceled") {
|
|
356
|
+
return `EXISTS (${anyFulfillment}) AND NOT EXISTS (${active})`;
|
|
357
|
+
}
|
|
358
|
+
if (status === "not_fulfilled") {
|
|
359
|
+
return `NOT EXISTS (${active} AND (f.packed_at IS NOT NULL OR f.shipped_at IS NOT NULL OR f.delivered_at IS NOT NULL))
|
|
360
|
+
AND NOT (EXISTS (${anyFulfillment}) AND NOT EXISTS (${active}))`;
|
|
361
|
+
}
|
|
362
|
+
if (status === "delivered") {
|
|
363
|
+
return `EXISTS (${active} AND f.delivered_at IS NOT NULL)
|
|
364
|
+
AND NOT EXISTS (${active} AND f.delivered_at IS NULL)
|
|
365
|
+
AND NOT EXISTS (${openItems})`;
|
|
366
|
+
}
|
|
367
|
+
if (status === "partially_delivered") {
|
|
368
|
+
return `EXISTS (${active} AND f.delivered_at IS NOT NULL)
|
|
369
|
+
AND (EXISTS (${active} AND f.delivered_at IS NULL) OR EXISTS (${openItems}))`;
|
|
370
|
+
}
|
|
371
|
+
if (status === "shipped") {
|
|
372
|
+
return `NOT EXISTS (${active} AND f.delivered_at IS NOT NULL)
|
|
373
|
+
AND EXISTS (${active} AND f.shipped_at IS NOT NULL)
|
|
374
|
+
AND NOT EXISTS (${active} AND f.shipped_at IS NULL)
|
|
375
|
+
AND NOT EXISTS (${openItems})`;
|
|
376
|
+
}
|
|
377
|
+
if (status === "partially_shipped") {
|
|
378
|
+
return `NOT EXISTS (${active} AND f.delivered_at IS NOT NULL)
|
|
379
|
+
AND EXISTS (${active} AND f.shipped_at IS NOT NULL)
|
|
380
|
+
AND (EXISTS (${active} AND f.shipped_at IS NULL) OR EXISTS (${openItems}))`;
|
|
381
|
+
}
|
|
382
|
+
if (status === "fulfilled") {
|
|
383
|
+
return `NOT EXISTS (${active} AND (f.shipped_at IS NOT NULL OR f.delivered_at IS NOT NULL))
|
|
384
|
+
AND EXISTS (${active} AND f.packed_at IS NOT NULL)
|
|
385
|
+
AND NOT EXISTS (${active} AND f.packed_at IS NULL)
|
|
386
|
+
AND NOT EXISTS (${openItems})`;
|
|
387
|
+
}
|
|
388
|
+
if (status === "partially_fulfilled") {
|
|
389
|
+
return `NOT EXISTS (${active} AND (f.shipped_at IS NOT NULL OR f.delivered_at IS NOT NULL))
|
|
390
|
+
AND EXISTS (${active} AND f.packed_at IS NOT NULL)
|
|
391
|
+
AND (EXISTS (${active} AND f.packed_at IS NULL) OR EXISTS (${openItems}))`;
|
|
392
|
+
}
|
|
393
|
+
if (status) {
|
|
394
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "fulfillment_status no reconocido");
|
|
395
|
+
}
|
|
396
|
+
return "";
|
|
397
|
+
}
|
|
398
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL29yZGVycy9zYWxlcy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFpUkEsOENBRUM7QUFnR0Qsb0RBZ0VDO0FBbGJELHFEQUdrQztBQUNsQyw0REFBbUU7QUFFbkUsTUFBTSxZQUFZLEdBQUc7SUFDbkIsSUFBSTtJQUNKLFlBQVk7SUFDWixRQUFRO0lBQ1IsWUFBWTtJQUNaLFlBQVk7SUFDWixPQUFPO0lBQ1AsZUFBZTtJQUNmLGFBQWE7SUFDYixPQUFPO0lBQ1AsVUFBVTtJQUNWLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLFVBQVU7SUFDVixtQkFBbUI7SUFDbkIsb0JBQW9CO0lBQ3BCLDRCQUE0QjtJQUM1Qiw0QkFBNEI7SUFDNUIscUNBQXFDO0lBQ3JDLHFDQUFxQztJQUNyQywwQ0FBMEM7SUFDMUMsMENBQTBDO0lBQzFDLHlDQUF5QztJQUN6QyxpQkFBaUI7SUFDakIsMEJBQTBCO0lBQzFCLHlCQUF5QjtJQUN6Qix3QkFBd0I7SUFDeEIsMkJBQTJCO0lBQzNCLHFDQUFxQztJQUNyQyxrQ0FBa0M7SUFDbEMsK0JBQStCO0lBQy9CLHFCQUFxQjtJQUNyQix1QkFBdUI7SUFDdkIscUNBQXFDO0NBQ3RDLENBQUE7QUFFRCxNQUFNLEtBQUssR0FBMkI7SUFDcEMsVUFBVSxFQUFFLGNBQWM7SUFDMUIsVUFBVSxFQUFFLGNBQWM7SUFDMUIsVUFBVSxFQUFFLGNBQWM7SUFDMUIsS0FBSyxFQUFFLFNBQVM7SUFDaEIsS0FBSyxFQUFFLDhDQUE4QztJQUNyRCxlQUFlLEVBQUUsY0FBYztDQUNoQyxDQUFBO0FBRUQsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFjLEVBQUUsRUFBRTtJQUM3QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxD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
|