@zaamx/netme-bundle 0.0.8 → 0.0.10
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.
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GET /admin/special-packs?customer_id=cus_...
|
|
4
|
+
*
|
|
5
|
+
* Versión admin del endpoint de paquetes especiales.
|
|
6
|
+
* Consulta la disponibilidad de paquetes para un socio específico
|
|
7
|
+
* identificado por su customer_id de Medusa.
|
|
8
|
+
*
|
|
9
|
+
* Usado por el panel de administración para:
|
|
10
|
+
* - Ver cuántos paquetes tiene disponibles un socio
|
|
11
|
+
* - Revisar el historial de créditos de un socio
|
|
12
|
+
*
|
|
13
|
+
* Requiere: autenticación de admin (JWT de admin)
|
|
14
|
+
* Query params: customer_id (obligatorio)
|
|
15
|
+
*
|
|
16
|
+
* Respuesta 200:
|
|
17
|
+
* { available: number, packs: SpecialPackCredit[] }
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.GET = GET;
|
|
21
|
+
const bundles_1 = require("../../../modules/bundles");
|
|
22
|
+
async function GET(req, res) {
|
|
23
|
+
const customerId = req.query.customer_id;
|
|
24
|
+
if (!customerId) {
|
|
25
|
+
res.status(400).json({ error: "customer_id es requerido" });
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const bundleService = req.scope.resolve(bundles_1.BUNDLE_MODULE);
|
|
30
|
+
const [packs, pending] = await Promise.all([
|
|
31
|
+
bundleService.getAvailableSpecialPacks(customerId),
|
|
32
|
+
bundleService.countPendingSpecialPackOrders(customerId),
|
|
33
|
+
]);
|
|
34
|
+
const available = Math.max(0, packs.length - pending);
|
|
35
|
+
res.status(200).json({
|
|
36
|
+
available,
|
|
37
|
+
packs,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.error("[admin/special-packs] Error:", error);
|
|
42
|
+
res.status(500).json({ error: "Error al consultar paquetes disponibles" });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL3NwZWNpYWwtcGFja3Mvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHOztBQU1ILGtCQTRCQztBQS9CRCxzREFBd0Q7QUFHakQsS0FBSyxVQUFVLEdBQUcsQ0FDdkIsR0FBa0IsRUFDbEIsR0FBbUI7SUFFbkIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFpQyxDQUFBO0lBRTlELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSwwQkFBMEIsRUFBRSxDQUFDLENBQUE7UUFDM0QsT0FBTTtJQUNSLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyx1QkFBYSxDQUFrQixDQUFBO1FBQ3ZFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3pDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUM7WUFDbEQsYUFBYSxDQUFDLDZCQUE2QixDQUFDLFVBQVUsQ0FBQztTQUN4RCxDQUFDLENBQUE7UUFFRixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFBO1FBRXJELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25CLFNBQVM7WUFDVCxLQUFLO1NBQ04sQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ3BELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLHlDQUF5QyxFQUFFLENBQUMsQ0FBQTtJQUM1RSxDQUFDO0FBQ0gsQ0FBQyJ9
|
|
@@ -24,11 +24,14 @@ async function GET(req, res) {
|
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
26
|
try {
|
|
27
|
-
// Resolver netme_profile_id del customer via la link table
|
|
28
27
|
const bundleService = req.scope.resolve(bundles_1.BUNDLE_MODULE);
|
|
29
|
-
const packs = await
|
|
28
|
+
const [packs, pending] = await Promise.all([
|
|
29
|
+
bundleService.getAvailableSpecialPacks(customerId),
|
|
30
|
+
bundleService.countPendingSpecialPackOrders(customerId),
|
|
31
|
+
]);
|
|
32
|
+
const available = Math.max(0, packs.length - pending);
|
|
30
33
|
res.status(200).json({
|
|
31
|
-
available
|
|
34
|
+
available,
|
|
32
35
|
packs,
|
|
33
36
|
});
|
|
34
37
|
}
|
|
@@ -37,4 +40,4 @@ async function GET(req, res) {
|
|
|
37
40
|
res.status(500).json({ error: "Error al consultar paquetes disponibles" });
|
|
38
41
|
}
|
|
39
42
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3NwZWNpYWwtcGFja3Mvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHOztBQW9CSCxrQkE0QkM7QUE3Q0Qsc0RBQXdEO0FBaUJqRCxLQUFLLFVBQVUsR0FBRyxDQUN2QixHQUErQixFQUMvQixHQUFtQjtJQUVuQixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQTtJQUU3QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFBO1FBQ2pELE9BQU07SUFDUixDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsdUJBQWEsQ0FBa0IsQ0FBQTtRQUN2RSxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUN6QyxhQUFhLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDO1lBQ2xELGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxVQUFVLENBQUM7U0FDeEQsQ0FBQyxDQUFBO1FBRUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQTtRQUVyRCxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNuQixTQUFTO1lBQ1QsS0FBSztTQUNOLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM5QyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSx5Q0FBeUMsRUFBRSxDQUFDLENBQUE7SUFDNUUsQ0FBQztBQUNILENBQUMifQ==
|
|
@@ -64,21 +64,68 @@ class BundleService extends (0, utils_1.MedusaService)({
|
|
|
64
64
|
ORDER BY created_at ASC`, [profileId]);
|
|
65
65
|
return rows ?? [];
|
|
66
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Cuenta órdenes con paquetes especiales que están autorizadas pero
|
|
69
|
+
* aún no capturadas. Se usa para descontar del conteo disponible.
|
|
70
|
+
*/
|
|
71
|
+
async countPendingSpecialPackOrders(customerId) {
|
|
72
|
+
return this._countPendingSpecialPackOrders(customerId);
|
|
73
|
+
}
|
|
74
|
+
async _countPendingSpecialPackOrders(customerId, sharedContext) {
|
|
75
|
+
const rows = await sharedContext?.manager?.execute(`SELECT COUNT(DISTINCT o.id)::INT AS cnt
|
|
76
|
+
FROM "order" o
|
|
77
|
+
JOIN order_payment_collection opc ON opc.order_id = o.id
|
|
78
|
+
JOIN payment_collection pc ON pc.id = opc.payment_collection_id
|
|
79
|
+
JOIN order_item oi ON oi.order_id = o.id
|
|
80
|
+
JOIN order_line_item oli ON oli.id = oi.item_id
|
|
81
|
+
JOIN product_variant pv ON pv.id = oli.variant_id
|
|
82
|
+
JOIN product p ON p.id = pv.product_id
|
|
83
|
+
JOIN product_category_product pcp ON pcp.product_id = p.id
|
|
84
|
+
WHERE o.customer_id = ?
|
|
85
|
+
AND pcp.product_category_id = ?
|
|
86
|
+
AND o.status = 'pending'
|
|
87
|
+
AND pc.status IN ('authorized', 'awaiting')
|
|
88
|
+
AND o.deleted_at IS NULL`, [customerId, exports.SPECIAL_PACK_CATEGORY_ID]);
|
|
89
|
+
return Number(rows?.[0]?.cnt ?? 0);
|
|
90
|
+
}
|
|
67
91
|
/**
|
|
68
92
|
* Verifica si un customer puede comprar paquetes a precio especial.
|
|
69
|
-
*
|
|
93
|
+
* Descuenta del conteo disponible las órdenes con paquetes que ya están
|
|
94
|
+
* autorizadas pero aún no capturadas (pending/authorized) para evitar
|
|
95
|
+
* que un mismo crédito se use en dos órdenes simultáneas.
|
|
70
96
|
*/
|
|
71
97
|
async canPurchaseSpecialPack(customerId) {
|
|
72
98
|
const profileId = await this.getProfileIdFromCustomer(customerId);
|
|
73
99
|
if (!profileId)
|
|
74
100
|
return false;
|
|
75
|
-
return this._canPurchaseSpecialPack(profileId);
|
|
101
|
+
return this._canPurchaseSpecialPack(profileId, customerId);
|
|
76
102
|
}
|
|
77
|
-
async _canPurchaseSpecialPack(profileId, sharedContext) {
|
|
78
|
-
|
|
103
|
+
async _canPurchaseSpecialPack(profileId, customerId, sharedContext) {
|
|
104
|
+
// Créditos disponibles
|
|
105
|
+
const credRows = await sharedContext?.manager?.execute(`SELECT COUNT(*)::INT AS cnt
|
|
79
106
|
FROM netme_special_pack_credits
|
|
80
107
|
WHERE profile_id = ? AND status = 'available'`, [profileId]);
|
|
81
|
-
|
|
108
|
+
const available = Number(credRows?.[0]?.cnt ?? 0);
|
|
109
|
+
if (available === 0)
|
|
110
|
+
return false;
|
|
111
|
+
// Órdenes con paquetes especiales pendientes de captura
|
|
112
|
+
// (autorizadas pero aún no pagadas — el evento payment_captured no disparó)
|
|
113
|
+
const pendRows = await sharedContext?.manager?.execute(`SELECT COUNT(DISTINCT o.id)::INT AS cnt
|
|
114
|
+
FROM "order" o
|
|
115
|
+
JOIN order_payment_collection opc ON opc.order_id = o.id
|
|
116
|
+
JOIN payment_collection pc ON pc.id = opc.payment_collection_id
|
|
117
|
+
JOIN order_item oi ON oi.order_id = o.id
|
|
118
|
+
JOIN order_line_item oli ON oli.id = oi.item_id
|
|
119
|
+
JOIN product_variant pv ON pv.id = oli.variant_id
|
|
120
|
+
JOIN product p ON p.id = pv.product_id
|
|
121
|
+
JOIN product_category_product pcp ON pcp.product_id = p.id
|
|
122
|
+
WHERE o.customer_id = ?
|
|
123
|
+
AND pcp.product_category_id = ?
|
|
124
|
+
AND o.status = 'pending'
|
|
125
|
+
AND pc.status IN ('authorized', 'awaiting')
|
|
126
|
+
AND o.deleted_at IS NULL`, [customerId, exports.SPECIAL_PACK_CATEGORY_ID]);
|
|
127
|
+
const pending = Number(pendRows?.[0]?.cnt ?? 0);
|
|
128
|
+
return (available - pending) > 0;
|
|
82
129
|
}
|
|
83
130
|
/**
|
|
84
131
|
* Redime el paquete disponible más antiguo al completarse un pago.
|
|
@@ -175,7 +222,14 @@ __decorate([
|
|
|
175
222
|
(0, utils_1.InjectManager)(),
|
|
176
223
|
__param(1, (0, utils_1.MedusaContext)()),
|
|
177
224
|
__metadata("design:type", Function),
|
|
178
|
-
__metadata("design:paramtypes", [
|
|
225
|
+
__metadata("design:paramtypes", [String, Object]),
|
|
226
|
+
__metadata("design:returntype", Promise)
|
|
227
|
+
], BundleService.prototype, "_countPendingSpecialPackOrders", null);
|
|
228
|
+
__decorate([
|
|
229
|
+
(0, utils_1.InjectManager)(),
|
|
230
|
+
__param(2, (0, utils_1.MedusaContext)()),
|
|
231
|
+
__metadata("design:type", Function),
|
|
232
|
+
__metadata("design:paramtypes", [Number, String, Object]),
|
|
179
233
|
__metadata("design:returntype", Promise)
|
|
180
234
|
], BundleService.prototype, "_canPurchaseSpecialPack", null);
|
|
181
235
|
__decorate([
|
|
@@ -200,4 +254,4 @@ __decorate([
|
|
|
200
254
|
__metadata("design:returntype", Promise)
|
|
201
255
|
], BundleService.prototype, "_orderContainsSpecialPack", null);
|
|
202
256
|
exports.default = BundleService;
|
|
203
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2J1bmRsZXMvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBdUY7QUFHdkYsNENBQXdDO0FBRXhDLG9EQUFvRDtBQUN2QyxRQUFBLHdCQUF3QixHQUFHLGlDQUFpQyxDQUFBO0FBa0J6RSxNQUFNLGFBQWMsU0FBUSxJQUFBLHFCQUFhLEVBQUM7SUFDeEMsTUFBTSxFQUFOLGVBQU07Q0FDUCxDQUFDO0lBQ0EsS0FBSyxDQUFDLHFCQUFxQixDQUFDLFNBQWlCO1FBQzNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNwQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDZixTQUFTLEVBQUUsQ0FBQyxlQUFlLENBQUM7U0FDN0IsQ0FBQyxDQUFBO1FBQ0YsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFBO0lBQzFCLENBQUM7SUFFRCw2REFBNkQ7SUFFN0Q7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLHdCQUF3QixDQUFDLFVBQWtCO1FBQy9DLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ25ELENBQUM7SUFHYSxBQUFOLEtBQUssQ0FBQyx5QkFBeUIsQ0FDckMsVUFBa0IsRUFDRCxhQUFzQztRQUV2RCxNQUFNLElBQUksR0FBRyxNQUFNLGFBQWEsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUNoRDs7OztlQUlTLEVBQ1QsQ0FBQyxVQUFVLENBQUMsQ0FDb0IsQ0FBQTtRQUNsQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsSUFBSSxJQUFJLENBQUE7SUFDdEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxVQUFrQjtRQUMvQyxNQUFNLFNBQVMsR0FB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
|