@yoryoboy/bi-mcp 1.16.0 → 1.19.0

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.
Files changed (158) hide show
  1. package/README.md +12 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/index.js +179 -6
  4. package/dist/index.js.map +2 -2
  5. package/dist/mcp-use.json +3 -6
  6. package/dist/src/config/__tests__/google-store.test.js +30 -0
  7. package/dist/src/config/__tests__/google-store.test.js.map +7 -0
  8. package/dist/src/config/__tests__/mcp-tool-deadline.test.js +64 -0
  9. package/dist/src/config/__tests__/mcp-tool-deadline.test.js.map +7 -0
  10. package/dist/src/config/google-store.js +18 -0
  11. package/dist/src/config/google-store.js.map +2 -2
  12. package/dist/src/config/mcp-tool-deadline-context.js +34 -0
  13. package/dist/src/config/mcp-tool-deadline-context.js.map +7 -0
  14. package/dist/src/config/mcp-tool-deadline.js +67 -0
  15. package/dist/src/config/mcp-tool-deadline.js.map +7 -0
  16. package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js +38 -3
  17. package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js.map +2 -2
  18. package/dist/src/services/mercadolibre/__tests__/mercadolibre-buyer-reconciliation.test.js +226 -0
  19. package/dist/src/services/mercadolibre/__tests__/mercadolibre-buyer-reconciliation.test.js.map +7 -0
  20. package/dist/src/services/mercadolibre/__tests__/mercadolibre-claim-reconciliation.test.js +127 -0
  21. package/dist/src/services/mercadolibre/__tests__/mercadolibre-claim-reconciliation.test.js.map +7 -0
  22. package/dist/src/services/mercadolibre/__tests__/mercadolibre-kits.test.js +103 -0
  23. package/dist/src/services/mercadolibre/__tests__/mercadolibre-kits.test.js.map +7 -0
  24. package/dist/src/services/mercadolibre/__tests__/mercadolibre-order-billing-info.test.js +582 -0
  25. package/dist/src/services/mercadolibre/__tests__/mercadolibre-order-billing-info.test.js.map +7 -0
  26. package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js +10 -0
  27. package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js.map +2 -2
  28. package/dist/src/services/mercadolibre/__tests__/mercadolibre-packs.test.js +36 -0
  29. package/dist/src/services/mercadolibre/__tests__/mercadolibre-packs.test.js.map +7 -0
  30. package/dist/src/services/mercadolibre/__tests__/mercadolibre-payments.test.js +137 -0
  31. package/dist/src/services/mercadolibre/__tests__/mercadolibre-payments.test.js.map +7 -0
  32. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-group-ads.test.js +105 -0
  33. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-group-ads.test.js.map +7 -0
  34. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-groups.test.js +143 -0
  35. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-groups.test.js.map +7 -0
  36. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-campaigns.test.js +100 -0
  37. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-campaigns.test.js.map +7 -0
  38. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads.test.js +350 -0
  39. package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads.test.js.map +7 -0
  40. package/dist/src/services/mercadolibre/__tests__/mercadolibre-return-reconciliation.test.js +228 -0
  41. package/dist/src/services/mercadolibre/__tests__/mercadolibre-return-reconciliation.test.js.map +7 -0
  42. package/dist/src/services/mercadolibre/__tests__/mercadolibre-shipping.test.js +58 -0
  43. package/dist/src/services/mercadolibre/__tests__/mercadolibre-shipping.test.js.map +7 -0
  44. package/dist/src/services/mercadolibre/mercadolibre-api.js +15 -3
  45. package/dist/src/services/mercadolibre/mercadolibre-api.js.map +2 -2
  46. package/dist/src/services/mercadolibre/mercadolibre-billing.js +110 -3
  47. package/dist/src/services/mercadolibre/mercadolibre-billing.js.map +2 -2
  48. package/dist/src/services/mercadolibre/mercadolibre-buyer-reconciliation.js +368 -0
  49. package/dist/src/services/mercadolibre/mercadolibre-buyer-reconciliation.js.map +7 -0
  50. package/dist/src/services/mercadolibre/mercadolibre-claim-reconciliation.js +399 -0
  51. package/dist/src/services/mercadolibre/mercadolibre-claim-reconciliation.js.map +7 -0
  52. package/dist/src/services/mercadolibre/mercadolibre-kits.js +55 -0
  53. package/dist/src/services/mercadolibre/mercadolibre-kits.js.map +7 -0
  54. package/dist/src/services/mercadolibre/mercadolibre-order-billing-info.js +392 -0
  55. package/dist/src/services/mercadolibre/mercadolibre-order-billing-info.js.map +7 -0
  56. package/dist/src/services/mercadolibre/mercadolibre-orders.js +8 -8
  57. package/dist/src/services/mercadolibre/mercadolibre-orders.js.map +2 -2
  58. package/dist/src/services/mercadolibre/mercadolibre-packs.js +21 -0
  59. package/dist/src/services/mercadolibre/mercadolibre-packs.js.map +7 -0
  60. package/dist/src/services/mercadolibre/mercadolibre-payments.js +60 -0
  61. package/dist/src/services/mercadolibre/mercadolibre-payments.js.map +7 -0
  62. package/dist/src/services/mercadolibre/mercadolibre-product-ads.js +429 -0
  63. package/dist/src/services/mercadolibre/mercadolibre-product-ads.js.map +7 -0
  64. package/dist/src/services/mercadolibre/mercadolibre-return-reconciliation.js +436 -0
  65. package/dist/src/services/mercadolibre/mercadolibre-return-reconciliation.js.map +7 -0
  66. package/dist/src/services/mercadolibre/mercadolibre-shipping.js +35 -0
  67. package/dist/src/services/mercadolibre/mercadolibre-shipping.js.map +7 -0
  68. package/dist/src/services/vtex/__tests__/vtex-api.test.js +67 -0
  69. package/dist/src/services/vtex/__tests__/vtex-api.test.js.map +7 -0
  70. package/dist/src/services/vtex/vtex-api.js +6 -0
  71. package/dist/src/services/vtex/vtex-api.js.map +2 -2
  72. package/dist/src/tools/config/__tests__/list-profiles.test.js +154 -0
  73. package/dist/src/tools/config/__tests__/list-profiles.test.js.map +7 -0
  74. package/dist/src/tools/config/list-profiles.js +39 -3
  75. package/dist/src/tools/config/list-profiles.js.map +2 -2
  76. package/dist/src/tools/mercadolibre/__tests__/get-order-billing-info.test.js +339 -0
  77. package/dist/src/tools/mercadolibre/__tests__/get-order-billing-info.test.js.map +7 -0
  78. package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-group-ads.test.js +225 -0
  79. package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-group-ads.test.js.map +7 -0
  80. package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-groups.test.js +148 -0
  81. package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-groups.test.js.map +7 -0
  82. package/dist/src/tools/mercadolibre/__tests__/product-ads-campaigns.test.js +60 -0
  83. package/dist/src/tools/mercadolibre/__tests__/product-ads-campaigns.test.js.map +7 -0
  84. package/dist/src/tools/mercadolibre/__tests__/product-ads-helpers.test.js +128 -0
  85. package/dist/src/tools/mercadolibre/__tests__/product-ads-helpers.test.js.map +7 -0
  86. package/dist/src/tools/mercadolibre/__tests__/product-ads-tools.test.js +435 -0
  87. package/dist/src/tools/mercadolibre/__tests__/product-ads-tools.test.js.map +7 -0
  88. package/dist/src/tools/mercadolibre/__tests__/reconcile-buyer-data.test.js +31 -0
  89. package/dist/src/tools/mercadolibre/__tests__/reconcile-buyer-data.test.js.map +7 -0
  90. package/dist/src/tools/mercadolibre/__tests__/reconcile-claim-data.test.js +36 -0
  91. package/dist/src/tools/mercadolibre/__tests__/reconcile-claim-data.test.js.map +7 -0
  92. package/dist/src/tools/mercadolibre/__tests__/validate-connection.test.js +205 -0
  93. package/dist/src/tools/mercadolibre/__tests__/validate-connection.test.js.map +7 -0
  94. package/dist/src/tools/mercadolibre/get-billing-provisions-by-order.js +313 -0
  95. package/dist/src/tools/mercadolibre/get-billing-provisions-by-order.js.map +7 -0
  96. package/dist/src/tools/mercadolibre/get-bundle-context-by-item.js +176 -0
  97. package/dist/src/tools/mercadolibre/get-bundle-context-by-item.js.map +7 -0
  98. package/dist/src/tools/mercadolibre/get-full-storage-charges.js +183 -0
  99. package/dist/src/tools/mercadolibre/get-full-storage-charges.js.map +7 -0
  100. package/dist/src/tools/mercadolibre/get-order-billing-info.js +189 -0
  101. package/dist/src/tools/mercadolibre/get-order-billing-info.js.map +7 -0
  102. package/dist/src/tools/mercadolibre/get-pack-context-by-order.js +150 -0
  103. package/dist/src/tools/mercadolibre/get-pack-context-by-order.js.map +7 -0
  104. package/dist/src/tools/mercadolibre/get-payment-details.js +322 -0
  105. package/dist/src/tools/mercadolibre/get-payment-details.js.map +7 -0
  106. package/dist/src/tools/mercadolibre/get-product-ads-ad-group-ads.js +144 -0
  107. package/dist/src/tools/mercadolibre/get-product-ads-ad-group-ads.js.map +7 -0
  108. package/dist/src/tools/mercadolibre/get-product-ads-advertisers.js +59 -0
  109. package/dist/src/tools/mercadolibre/get-product-ads-advertisers.js.map +7 -0
  110. package/dist/src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js +104 -0
  111. package/dist/src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js.map +7 -0
  112. package/dist/src/tools/mercadolibre/index.js +32 -0
  113. package/dist/src/tools/mercadolibre/index.js.map +2 -2
  114. package/dist/src/tools/mercadolibre/product-ads-helpers.js +130 -0
  115. package/dist/src/tools/mercadolibre/product-ads-helpers.js.map +7 -0
  116. package/dist/src/tools/mercadolibre/reconcile-buyer-data.js +27 -0
  117. package/dist/src/tools/mercadolibre/reconcile-buyer-data.js.map +7 -0
  118. package/dist/src/tools/mercadolibre/reconcile-claim-data.js +46 -0
  119. package/dist/src/tools/mercadolibre/reconcile-claim-data.js.map +7 -0
  120. package/dist/src/tools/mercadolibre/reconcile-return-data.js +25 -0
  121. package/dist/src/tools/mercadolibre/reconcile-return-data.js.map +7 -0
  122. package/dist/src/tools/mercadolibre/search-product-ads-ad-groups.js +162 -0
  123. package/dist/src/tools/mercadolibre/search-product-ads-ad-groups.js.map +7 -0
  124. package/dist/src/tools/mercadolibre/search-product-ads-ads.js +216 -0
  125. package/dist/src/tools/mercadolibre/search-product-ads-ads.js.map +7 -0
  126. package/dist/src/tools/mercadolibre/search-product-ads-campaigns.js +116 -0
  127. package/dist/src/tools/mercadolibre/search-product-ads-campaigns.js.map +7 -0
  128. package/dist/src/tools/mercadolibre/validate-connection.js +40 -12
  129. package/dist/src/tools/mercadolibre/validate-connection.js.map +2 -2
  130. package/dist/tests/meli/mercadolibre-billing-provisions.test.js +378 -0
  131. package/dist/tests/meli/mercadolibre-billing-provisions.test.js.map +2 -2
  132. package/dist/tests/meli/mercadolibre-order-billing-info-surface.test.js +123 -0
  133. package/dist/tests/meli/mercadolibre-order-billing-info-surface.test.js.map +7 -0
  134. package/dist/tests/meli/mercadolibre-payment-details.test.js +356 -0
  135. package/dist/tests/meli/mercadolibre-payment-details.test.js.map +7 -0
  136. package/dist/tests/meli/mercadolibre-payments.test.js +62 -0
  137. package/dist/tests/meli/mercadolibre-payments.test.js.map +7 -0
  138. package/dist/tests/meli/mercadolibre-product-ads-ad-groups-surface.test.js +90 -0
  139. package/dist/tests/meli/mercadolibre-product-ads-ad-groups-surface.test.js.map +7 -0
  140. package/dist/tests/meli/mercadolibre-product-ads-campaigns-surface.test.js +72 -0
  141. package/dist/tests/meli/mercadolibre-product-ads-campaigns-surface.test.js.map +7 -0
  142. package/dist/tests/meli/mercadolibre-tool-handlers-pack-kit-shipping.test.js +400 -0
  143. package/dist/tests/meli/mercadolibre-tool-handlers-pack-kit-shipping.test.js.map +7 -0
  144. package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js +31 -12
  145. package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js.map +2 -2
  146. package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js +1 -1
  147. package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js.map +1 -1
  148. package/package.json +1 -1
  149. package/dist/src/google-ads/report-utils.js +0 -78
  150. package/dist/src/google-ads/report-utils.js.map +0 -7
  151. package/dist/src/search-console/search-console-utils.js +0 -275
  152. package/dist/src/search-console/search-console-utils.js.map +0 -7
  153. package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js +0 -165
  154. package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js.map +0 -7
  155. package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js +0 -233
  156. package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js.map +0 -7
  157. package/dist/src/tools/vtex/catalog-admin-batch.js +0 -298
  158. package/dist/src/tools/vtex/catalog-admin-batch.js.map +0 -7
@@ -0,0 +1,150 @@
1
+ import { error, object } from "mcp-use/server";
2
+ import { z } from "zod";
3
+ import { formatMercadoLibreError } from "../../services/mercadolibre/mercadolibre-api.js";
4
+ import {
5
+ getMercadoLibreOrderDetailsBatch
6
+ } from "../../services/mercadolibre/mercadolibre-orders.js";
7
+ import {
8
+ getMercadoLibrePackBatch
9
+ } from "../../services/mercadolibre/mercadolibre-packs.js";
10
+ import { stripNulls } from "../../utils/strip-payload.js";
11
+ import { asArray, asRecord, normalizeScalarString, normalizeString } from "./helpers.js";
12
+ import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
13
+ import { mercadolibreProfileIdSchemaField } from "./write-helpers.js";
14
+ const MAX_ORDER_IDS = 50;
15
+ const packContextsSchema = [
16
+ "order_id",
17
+ "requested_pack_id",
18
+ "resolved_pack_id",
19
+ "pack_status",
20
+ "shipment_id",
21
+ "orders_in_pack_count",
22
+ "is_multi_order_pack",
23
+ "buyer_id",
24
+ "pack_created_at",
25
+ "pack_last_updated",
26
+ "order_status",
27
+ "order_status_detail",
28
+ "pack_order_ids"
29
+ ];
30
+ function compactPackOrderIds(pack) {
31
+ return asArray(pack.orders).map((order) => normalizeScalarString(order.id)).filter(Boolean).join(" | ");
32
+ }
33
+ function buildPackContextRow(params) {
34
+ const packOrders = params.pack ? asArray(params.pack.orders) : [];
35
+ return [
36
+ params.orderId,
37
+ normalizeScalarString(params.order.pack_id),
38
+ params.packId,
39
+ normalizeString(params.pack?.status),
40
+ normalizeScalarString(params.pack ? asRecord(params.pack.shipment).id : void 0),
41
+ packOrders.length,
42
+ packOrders.length > 1,
43
+ normalizeScalarString(params.pack ? asRecord(params.pack.buyer).id : void 0),
44
+ normalizeString(params.pack?.date_created),
45
+ normalizeString(params.pack?.last_updated),
46
+ normalizeString(params.order.status),
47
+ normalizeString(params.order.status_detail),
48
+ params.pack ? compactPackOrderIds(params.pack) : ""
49
+ ];
50
+ }
51
+ const meliGetPackContextByOrderSchema = z.object({
52
+ profileId: mercadolibreProfileIdSchemaField,
53
+ orderIds: z.array(z.string().trim().min(1).describe("MercadoLibre order id.")).min(1).max(MAX_ORDER_IDS).describe(
54
+ "One or more MercadoLibre order ids (up to 50). Returns the pack context for each order, including pack_id fallback behavior when the order is not attached to a pack."
55
+ )
56
+ });
57
+ async function meliGetPackContextByOrderHandler(params) {
58
+ try {
59
+ const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);
60
+ if (!profileResolution.ok) {
61
+ return profileResolution.response;
62
+ }
63
+ const profileId = profileResolution.value.profileId;
64
+ const uniqueOrderIds = Array.from(new Set(params.orderIds));
65
+ const ordersBatch = await getMercadoLibreOrderDetailsBatch(profileId, uniqueOrderIds, {
66
+ maxConcurrency: 10,
67
+ maxRetries: 2
68
+ });
69
+ const ordersById = /* @__PURE__ */ new Map();
70
+ ordersBatch.successful.forEach((entry) => {
71
+ ordersById.set(entry.id, entry.document);
72
+ });
73
+ const resolvedPackIds = Array.from(
74
+ new Set(
75
+ ordersBatch.successful.map((entry) => {
76
+ const order = entry.document;
77
+ return normalizeScalarString(order.pack_id) || entry.id;
78
+ }).filter(Boolean)
79
+ )
80
+ );
81
+ const packsBatch = await getMercadoLibrePackBatch(profileId, resolvedPackIds, {
82
+ maxConcurrency: 10,
83
+ maxRetries: 2
84
+ });
85
+ const packsById = /* @__PURE__ */ new Map();
86
+ packsBatch.successful.forEach((entry) => {
87
+ packsById.set(entry.id, entry.document);
88
+ });
89
+ const failures = [
90
+ ...ordersBatch.failed.map((failure) => ({
91
+ order_id: failure.id,
92
+ stage: "order",
93
+ message: failure.message,
94
+ status_code: failure.statusCode,
95
+ attempts: failure.attempts,
96
+ retryable: failure.retryable
97
+ })),
98
+ ...packsBatch.failed.map((failure) => ({
99
+ order_id: uniqueOrderIds.find((orderId) => {
100
+ const order = ordersById.get(orderId);
101
+ return normalizeScalarString(order?.pack_id) === failure.id || orderId === failure.id;
102
+ }),
103
+ pack_id: failure.id,
104
+ stage: "pack",
105
+ message: failure.message,
106
+ status_code: failure.statusCode,
107
+ attempts: failure.attempts,
108
+ retryable: failure.retryable
109
+ }))
110
+ ];
111
+ const packContexts = uniqueOrderIds.map((orderId) => {
112
+ const order = ordersById.get(orderId);
113
+ if (!order) {
114
+ return null;
115
+ }
116
+ const requestedPackId = normalizeScalarString(order.pack_id);
117
+ const resolvedPackId = requestedPackId || orderId;
118
+ return buildPackContextRow({
119
+ orderId,
120
+ order,
121
+ packId: resolvedPackId,
122
+ pack: packsById.get(resolvedPackId)
123
+ });
124
+ }).filter(Boolean);
125
+ return object(
126
+ stripNulls({
127
+ profile_id: profileId,
128
+ metadata: {
129
+ requested: uniqueOrderIds.length,
130
+ successful: packContexts.length,
131
+ failed: failures.length,
132
+ multi_order_packs: packContexts.filter((row) => row?.[6] === true).length,
133
+ single_order_packs: packContexts.filter((row) => row?.[6] === false).length,
134
+ packless_orders: packContexts.filter((row) => !row?.[2] || !row?.[3]).length,
135
+ has_failures: failures.length > 0
136
+ },
137
+ pack_contexts_schema: packContextsSchema,
138
+ pack_contexts: packContexts,
139
+ failures: failures.length > 0 ? failures : void 0
140
+ })
141
+ );
142
+ } catch (err) {
143
+ return error(formatMercadoLibreError(err, "Failed to fetch MercadoLibre pack context"));
144
+ }
145
+ }
146
+ export {
147
+ meliGetPackContextByOrderHandler,
148
+ meliGetPackContextByOrderSchema
149
+ };
150
+ //# sourceMappingURL=get-pack-context-by-order.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/mercadolibre/get-pack-context-by-order.ts"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n getMercadoLibreOrderDetailsBatch,\n} from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport {\n getMercadoLibrePackBatch,\n} from \"../../services/mercadolibre/mercadolibre-packs.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { asArray, asRecord, normalizeScalarString, normalizeString } from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nconst MAX_ORDER_IDS = 50;\n\nconst packContextsSchema = [\n \"order_id\",\n \"requested_pack_id\",\n \"resolved_pack_id\",\n \"pack_status\",\n \"shipment_id\",\n \"orders_in_pack_count\",\n \"is_multi_order_pack\",\n \"buyer_id\",\n \"pack_created_at\",\n \"pack_last_updated\",\n \"order_status\",\n \"order_status_detail\",\n \"pack_order_ids\",\n] as const;\n\nfunction compactPackOrderIds(pack: Record<string, unknown>): string {\n return asArray<Record<string, unknown>>(pack.orders)\n .map((order) => normalizeScalarString(order.id))\n .filter(Boolean)\n .join(\" | \");\n}\n\nfunction buildPackContextRow(params: {\n orderId: string;\n order: Record<string, unknown>;\n packId: string;\n pack: Record<string, unknown> | undefined;\n}) {\n const packOrders = params.pack ? asArray<Record<string, unknown>>(params.pack.orders) : [];\n\n return [\n params.orderId,\n normalizeScalarString(params.order.pack_id),\n params.packId,\n normalizeString(params.pack?.status),\n normalizeScalarString(params.pack ? asRecord(params.pack.shipment).id : undefined),\n packOrders.length,\n packOrders.length > 1,\n normalizeScalarString(params.pack ? asRecord(params.pack.buyer).id : undefined),\n normalizeString(params.pack?.date_created),\n normalizeString(params.pack?.last_updated),\n normalizeString(params.order.status),\n normalizeString(params.order.status_detail),\n params.pack ? compactPackOrderIds(params.pack) : \"\",\n ];\n}\n\nexport const meliGetPackContextByOrderSchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n orderIds: z\n .array(z.string().trim().min(1).describe(\"MercadoLibre order id.\"))\n .min(1)\n .max(MAX_ORDER_IDS)\n .describe(\n \"One or more MercadoLibre order ids (up to 50). Returns the pack context for each order, including pack_id fallback behavior when the order is not attached to a pack.\"\n ),\n});\n\nexport async function meliGetPackContextByOrderHandler(\n params: z.infer<typeof meliGetPackContextByOrderSchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n const uniqueOrderIds = Array.from(new Set(params.orderIds));\n const ordersBatch = await getMercadoLibreOrderDetailsBatch(profileId, uniqueOrderIds, {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n\n const ordersById = new Map<string, Record<string, unknown>>();\n ordersBatch.successful.forEach((entry) => {\n ordersById.set(entry.id, entry.document);\n });\n\n const resolvedPackIds = Array.from(\n new Set(\n ordersBatch.successful\n .map((entry) => {\n const order = entry.document;\n return normalizeScalarString(order.pack_id) || entry.id;\n })\n .filter(Boolean)\n )\n );\n\n const packsBatch = await getMercadoLibrePackBatch(profileId, resolvedPackIds, {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n\n const packsById = new Map<string, Record<string, unknown>>();\n packsBatch.successful.forEach((entry) => {\n packsById.set(entry.id, entry.document);\n });\n\n const failures = [\n ...ordersBatch.failed.map((failure) => ({\n order_id: failure.id,\n stage: \"order\" as const,\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n })),\n ...packsBatch.failed.map((failure) => ({\n order_id: uniqueOrderIds.find((orderId) => {\n const order = ordersById.get(orderId);\n return normalizeScalarString(order?.pack_id) === failure.id || orderId === failure.id;\n }),\n pack_id: failure.id,\n stage: \"pack\" as const,\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n })),\n ];\n\n const packContexts = uniqueOrderIds\n .map((orderId) => {\n const order = ordersById.get(orderId);\n if (!order) {\n return null;\n }\n\n const requestedPackId = normalizeScalarString(order.pack_id);\n const resolvedPackId = requestedPackId || orderId;\n return buildPackContextRow({\n orderId,\n order,\n packId: resolvedPackId,\n pack: packsById.get(resolvedPackId),\n });\n })\n .filter(Boolean);\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: {\n requested: uniqueOrderIds.length,\n successful: packContexts.length,\n failed: failures.length,\n multi_order_packs: packContexts.filter((row) => row?.[6] === true).length,\n single_order_packs: packContexts.filter((row) => row?.[6] === false).length,\n packless_orders: packContexts.filter((row) => !row?.[2] || !row?.[3]).length,\n has_failures: failures.length > 0,\n },\n pack_contexts_schema: packContextsSchema,\n pack_contexts: packContexts,\n failures: failures.length > 0 ? failures : undefined,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to fetch MercadoLibre pack context\"));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,322 @@
1
+ import { error, object } from "mcp-use/server";
2
+ import { z } from "zod";
3
+ import { formatMercadoLibreError } from "../../services/mercadolibre/mercadolibre-api.js";
4
+ import {
5
+ getMercadoLibrePaymentDetails,
6
+ getMercadoLibrePaymentDetailsBatch
7
+ } from "../../services/mercadolibre/mercadolibre-payments.js";
8
+ import { stripNulls } from "../../utils/strip-payload.js";
9
+ import {
10
+ asArray,
11
+ asRecord,
12
+ compactDateTime,
13
+ currencyBucket,
14
+ normalizeScalarString,
15
+ normalizeString,
16
+ roundMoney,
17
+ toNumber
18
+ } from "./helpers.js";
19
+ import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
20
+ import { mercadolibreProfileIdSchemaField } from "./write-helpers.js";
21
+ const MAX_PAYMENT_IDS = 250;
22
+ const paymentIdSchemaField = z.string().trim().min(1).describe("MercadoLibre payment id to inspect.");
23
+ const meliGetPaymentDetailsSchema = z.object({
24
+ profileId: mercadolibreProfileIdSchemaField,
25
+ paymentId: paymentIdSchemaField.optional().describe("Single MercadoLibre payment id to inspect."),
26
+ paymentIds: z.array(paymentIdSchemaField).min(1).max(MAX_PAYMENT_IDS).describe("One or more MercadoLibre payment ids to inspect in parallel (up to 250, processed in chunks of 50).").optional()
27
+ }).superRefine((value, ctx) => {
28
+ const hasPaymentId = Boolean(value.paymentId);
29
+ const hasPaymentIds = Boolean(value.paymentIds?.length);
30
+ if (hasPaymentId === hasPaymentIds) {
31
+ ctx.addIssue({
32
+ code: z.ZodIssueCode.custom,
33
+ message: "Provide exactly one of paymentId or paymentIds.",
34
+ path: ["paymentId"]
35
+ });
36
+ ctx.addIssue({
37
+ code: z.ZodIssueCode.custom,
38
+ message: "Provide exactly one of paymentId or paymentIds.",
39
+ path: ["paymentIds"]
40
+ });
41
+ }
42
+ });
43
+ const paymentsSchema = [
44
+ "payment_id",
45
+ "status",
46
+ "status_detail",
47
+ "currency_id",
48
+ "transaction_amount",
49
+ "total_paid_amount",
50
+ "net_received_amount",
51
+ "overpaid_amount",
52
+ "payment_method_id",
53
+ "payment_type_id",
54
+ "installments",
55
+ "date_created",
56
+ "date_last_updated",
57
+ "description",
58
+ "order_id",
59
+ "payer_id",
60
+ "payer_email",
61
+ "payer_type",
62
+ "payer_first_name",
63
+ "payer_last_name",
64
+ "fee_count",
65
+ "fee_total",
66
+ "external_reference"
67
+ ];
68
+ const paymentFeeDetailsSchema = ["payment_id", "fee_type", "fee_amount"];
69
+ function createCurrencyTotals() {
70
+ return {
71
+ count: 0,
72
+ transaction_amount: 0,
73
+ total_paid_amount: 0,
74
+ net_received_amount: 0,
75
+ overpaid_amount: 0,
76
+ fee_total: 0
77
+ };
78
+ }
79
+ function incrementCounter(store, key) {
80
+ const normalizedKey = key.trim() || "UNKNOWN";
81
+ store[normalizedKey] = (store[normalizedKey] ?? 0) + 1;
82
+ }
83
+ function projectPayment(payment) {
84
+ const paymentId = normalizeScalarString(payment.id) || "";
85
+ const transactionDetails = asRecord(payment.transaction_details);
86
+ const payer = asRecord(payment.payer);
87
+ const order = asRecord(payment.order);
88
+ const feeDetails = asArray(payment.fee_details);
89
+ const currencyId = normalizeString(payment.currency_id, "UNKNOWN") || "UNKNOWN";
90
+ const status = normalizeString(payment.status, "UNKNOWN") || "UNKNOWN";
91
+ const paymentMethodId = normalizeScalarString(payment.payment_method_id) || normalizeScalarString(asRecord(payment.payment_method).id) || "UNKNOWN";
92
+ const paymentTypeId = normalizeString(payment.payment_type_id) || "UNKNOWN";
93
+ const transactionAmount = toNumber(payment.transaction_amount);
94
+ const totalPaidAmount = toNumber(transactionDetails.total_paid_amount ?? payment.total_paid_amount);
95
+ const netReceivedAmount = toNumber(transactionDetails.net_received_amount);
96
+ const overpaidAmount = toNumber(transactionDetails.overpaid_amount);
97
+ const feeTotal = roundMoney(feeDetails.reduce((accumulator, fee) => accumulator + toNumber(fee.amount), 0));
98
+ const dateCreated = compactDateTime(payment.date_created);
99
+ const dateLastUpdated = compactDateTime(payment.date_last_updated ?? payment.last_updated);
100
+ const description = normalizeString(payment.description);
101
+ const orderId = normalizeScalarString(order.id) || null;
102
+ const payerId = normalizeScalarString(payer.id) || null;
103
+ const payerEmail = normalizeString(payer.email);
104
+ const payerType = normalizeString(payer.type);
105
+ const payerFirstName = normalizeString(payer.first_name);
106
+ const payerLastName = normalizeString(payer.last_name);
107
+ const externalReference = normalizeString(transactionDetails.external_reference);
108
+ return {
109
+ row: [
110
+ paymentId || null,
111
+ normalizeString(payment.status) || null,
112
+ normalizeString(payment.status_detail) || null,
113
+ currencyId,
114
+ transactionAmount,
115
+ totalPaidAmount,
116
+ netReceivedAmount,
117
+ overpaidAmount,
118
+ paymentMethodId,
119
+ paymentTypeId,
120
+ toNumber(payment.installments),
121
+ dateCreated,
122
+ dateLastUpdated,
123
+ description || null,
124
+ orderId,
125
+ payerId,
126
+ payerEmail || null,
127
+ payerType || null,
128
+ payerFirstName || null,
129
+ payerLastName || null,
130
+ feeDetails.length,
131
+ feeTotal,
132
+ externalReference || null
133
+ ],
134
+ feeRows: feeDetails.map((fee) => [
135
+ paymentId || null,
136
+ normalizeString(fee.type) || null,
137
+ toNumber(fee.amount)
138
+ ]),
139
+ paymentId,
140
+ currencyId,
141
+ status,
142
+ paymentMethodId,
143
+ paymentTypeId,
144
+ hasOrder: Boolean(orderId),
145
+ hasPayer: Boolean(payerId || payerEmail),
146
+ feeTotal
147
+ };
148
+ }
149
+ function buildBreakdownEntries(store) {
150
+ const total = Object.values(store).reduce((accumulator, value) => accumulator + value, 0);
151
+ return Object.entries(store).map(([key, count]) => ({
152
+ key,
153
+ count,
154
+ rate: total > 0 ? roundMoney(count / total) : 0
155
+ })).sort((left, right) => right.count - left.count || left.key.localeCompare(right.key));
156
+ }
157
+ function buildCurrencyBreakdowns(store) {
158
+ return Object.entries(store).map(([currencyId, totals]) => ({
159
+ currency_id: currencyId,
160
+ count: totals.count,
161
+ transaction_amount: roundMoney(totals.transaction_amount),
162
+ total_paid_amount: roundMoney(totals.total_paid_amount),
163
+ net_received_amount: roundMoney(totals.net_received_amount),
164
+ overpaid_amount: roundMoney(totals.overpaid_amount),
165
+ fee_total: roundMoney(totals.fee_total)
166
+ })).sort((left, right) => right.count - left.count || left.currency_id.localeCompare(right.currency_id));
167
+ }
168
+ function buildAlerts(params) {
169
+ const alerts = [];
170
+ if (params.failedCount > 0) {
171
+ alerts.push(`${params.failedCount} payment${params.failedCount === 1 ? "" : "s"} failed to fetch.`);
172
+ }
173
+ if (params.successfulCount === 0 && params.failedCount > 0) {
174
+ alerts.push("No payments were successfully retrieved.");
175
+ }
176
+ if (params.paymentsWithoutOrderCount > 0) {
177
+ alerts.push(
178
+ `${params.paymentsWithoutOrderCount} payment${params.paymentsWithoutOrderCount === 1 ? "" : "s"} do not include an order reference.`
179
+ );
180
+ }
181
+ if (params.paymentsWithoutPayerCount > 0) {
182
+ alerts.push(
183
+ `${params.paymentsWithoutPayerCount} payment${params.paymentsWithoutPayerCount === 1 ? "" : "s"} are missing payer data.`
184
+ );
185
+ }
186
+ if (params.currenciesObserved.length > 1) {
187
+ alerts.push(`Multiple currencies detected: ${params.currenciesObserved.join(", ")}.`);
188
+ }
189
+ return alerts;
190
+ }
191
+ function buildPaymentPayload(params) {
192
+ const currencyTotals = {};
193
+ const statusCounts = {};
194
+ const paymentMethodCounts = {};
195
+ const paymentTypeCounts = {};
196
+ const payments = [];
197
+ const feeDetailRows = [];
198
+ let paymentsWithOrderCount = 0;
199
+ let paymentsWithoutOrderCount = 0;
200
+ let paymentsWithoutPayerCount = 0;
201
+ for (const projection of params.successful) {
202
+ payments.push(projection.row);
203
+ feeDetailRows.push(...projection.feeRows);
204
+ const currencyBucketTotals = currencyBucket(currencyTotals, projection.currencyId, createCurrencyTotals);
205
+ currencyBucketTotals.count += 1;
206
+ currencyBucketTotals.transaction_amount += projection.row[4] ? Number(projection.row[4]) : 0;
207
+ currencyBucketTotals.total_paid_amount += projection.row[5] ? Number(projection.row[5]) : 0;
208
+ currencyBucketTotals.net_received_amount += projection.row[6] ? Number(projection.row[6]) : 0;
209
+ currencyBucketTotals.overpaid_amount += projection.row[7] ? Number(projection.row[7]) : 0;
210
+ currencyBucketTotals.fee_total += projection.feeTotal;
211
+ incrementCounter(statusCounts, projection.status);
212
+ incrementCounter(paymentMethodCounts, projection.paymentMethodId);
213
+ incrementCounter(paymentTypeCounts, projection.paymentTypeId);
214
+ if (projection.hasOrder) {
215
+ paymentsWithOrderCount += 1;
216
+ } else {
217
+ paymentsWithoutOrderCount += 1;
218
+ }
219
+ if (!projection.hasPayer) {
220
+ paymentsWithoutPayerCount += 1;
221
+ }
222
+ }
223
+ const currenciesObserved = Object.keys(currencyTotals).sort((left, right) => left.localeCompare(right));
224
+ const summary = {
225
+ requested_count: params.requestedPaymentIds.length,
226
+ successful_count: params.successful.length,
227
+ failed_count: params.failed.length,
228
+ payments_with_order_count: paymentsWithOrderCount,
229
+ payments_without_order_count: paymentsWithoutOrderCount,
230
+ payments_without_payer_count: paymentsWithoutPayerCount,
231
+ currency_totals: Object.fromEntries(
232
+ Object.entries(currencyTotals).map(([currencyId, totals]) => [currencyId, stripNulls({
233
+ count: totals.count,
234
+ transaction_amount: roundMoney(totals.transaction_amount),
235
+ total_paid_amount: roundMoney(totals.total_paid_amount),
236
+ net_received_amount: roundMoney(totals.net_received_amount),
237
+ overpaid_amount: roundMoney(totals.overpaid_amount),
238
+ fee_total: roundMoney(totals.fee_total)
239
+ })])
240
+ ),
241
+ status_counts: statusCounts,
242
+ payment_method_counts: paymentMethodCounts,
243
+ payment_type_counts: paymentTypeCounts
244
+ };
245
+ const breakdowns = stripNulls({
246
+ by_currency: buildCurrencyBreakdowns(currencyTotals),
247
+ by_status: buildBreakdownEntries(statusCounts),
248
+ by_payment_method: buildBreakdownEntries(paymentMethodCounts),
249
+ by_payment_type: buildBreakdownEntries(paymentTypeCounts)
250
+ });
251
+ const alerts = buildAlerts({
252
+ successfulCount: params.successful.length,
253
+ failedCount: params.failed.length,
254
+ paymentsWithoutOrderCount,
255
+ paymentsWithoutPayerCount,
256
+ currenciesObserved
257
+ });
258
+ const payload = stripNulls({
259
+ metadata: {
260
+ profile_id: params.profileId,
261
+ endpoint: "/v1/payments/{payment_id}",
262
+ mode: params.requestedPaymentIds.length === 1 ? "single" : "batch",
263
+ requested_count: params.requestedPaymentIds.length,
264
+ successful_count: params.successful.length,
265
+ failed_count: params.failed.length,
266
+ coverage_complete: params.failed.length === 0,
267
+ requested_payment_ids: params.requestedPaymentIds,
268
+ successful_payment_ids: params.successful.map((entry) => entry.paymentId),
269
+ failed_payment_ids: params.failed.map((entry) => entry.paymentId)
270
+ },
271
+ summary,
272
+ breakdowns,
273
+ alerts,
274
+ failures: params.failed
275
+ });
276
+ return {
277
+ ...payload,
278
+ payments_schema: paymentsSchema,
279
+ payments,
280
+ payment_fee_details_schema: paymentFeeDetailsSchema,
281
+ payment_fee_details: feeDetailRows
282
+ };
283
+ }
284
+ async function meliGetPaymentDetailsHandler(params) {
285
+ try {
286
+ const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);
287
+ if (!profileResolution.ok) {
288
+ return profileResolution.response;
289
+ }
290
+ const profileId = profileResolution.value.profileId;
291
+ if (params.paymentId) {
292
+ const payment = await getMercadoLibrePaymentDetails(profileId, params.paymentId);
293
+ const projected = projectPayment(payment);
294
+ return object(
295
+ buildPaymentPayload({
296
+ profileId,
297
+ requestedPaymentIds: [params.paymentId],
298
+ successful: [projected],
299
+ failed: []
300
+ })
301
+ );
302
+ }
303
+ const batch = await getMercadoLibrePaymentDetailsBatch(profileId, params.paymentIds ?? []);
304
+ return object(
305
+ buildPaymentPayload({
306
+ profileId,
307
+ requestedPaymentIds: params.paymentIds ?? [],
308
+ successful: batch.successful.map((entry) => projectPayment(entry.payment)),
309
+ failed: batch.failed
310
+ })
311
+ );
312
+ } catch (err) {
313
+ return error(formatMercadoLibreError(err, "Failed to fetch MercadoLibre payment details"));
314
+ }
315
+ }
316
+ export {
317
+ meliGetPaymentDetailsHandler,
318
+ meliGetPaymentDetailsSchema,
319
+ paymentFeeDetailsSchema,
320
+ paymentsSchema
321
+ };
322
+ //# sourceMappingURL=get-payment-details.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/tools/mercadolibre/get-payment-details.ts"],
4
+ "sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n getMercadoLibrePaymentDetails,\n getMercadoLibrePaymentDetailsBatch,\n} from \"../../services/mercadolibre/mercadolibre-payments.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n compactDateTime,\n currencyBucket,\n normalizeScalarString,\n normalizeString,\n roundMoney,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nconst MAX_PAYMENT_IDS = 250;\n\nconst paymentIdSchemaField = z\n .string()\n .trim()\n .min(1)\n .describe(\"MercadoLibre payment id to inspect.\");\n\nexport const meliGetPaymentDetailsSchema = z\n .object({\n profileId: mercadolibreProfileIdSchemaField,\n paymentId: paymentIdSchemaField.optional().describe(\"Single MercadoLibre payment id to inspect.\"),\n paymentIds: z\n .array(paymentIdSchemaField)\n .min(1)\n .max(MAX_PAYMENT_IDS)\n .describe(\"One or more MercadoLibre payment ids to inspect in parallel (up to 250, processed in chunks of 50).\")\n .optional(),\n })\n .superRefine((value, ctx) => {\n const hasPaymentId = Boolean(value.paymentId);\n const hasPaymentIds = Boolean(value.paymentIds?.length);\n\n if (hasPaymentId === hasPaymentIds) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Provide exactly one of paymentId or paymentIds.\",\n path: [\"paymentId\"],\n });\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Provide exactly one of paymentId or paymentIds.\",\n path: [\"paymentIds\"],\n });\n }\n });\n\nexport const paymentsSchema = [\n \"payment_id\",\n \"status\",\n \"status_detail\",\n \"currency_id\",\n \"transaction_amount\",\n \"total_paid_amount\",\n \"net_received_amount\",\n \"overpaid_amount\",\n \"payment_method_id\",\n \"payment_type_id\",\n \"installments\",\n \"date_created\",\n \"date_last_updated\",\n \"description\",\n \"order_id\",\n \"payer_id\",\n \"payer_email\",\n \"payer_type\",\n \"payer_first_name\",\n \"payer_last_name\",\n \"fee_count\",\n \"fee_total\",\n \"external_reference\",\n] as const;\n\nexport const paymentFeeDetailsSchema = [\"payment_id\", \"fee_type\", \"fee_amount\"] as const;\n\ntype PaymentRow = (string | number | null)[];\ntype FeeRow = (string | number | null)[];\n\ntype PaymentProjection = {\n row: PaymentRow;\n feeRows: FeeRow[];\n paymentId: string;\n currencyId: string;\n status: string;\n paymentMethodId: string;\n paymentTypeId: string;\n hasOrder: boolean;\n hasPayer: boolean;\n feeTotal: number;\n};\n\ntype CurrencyTotals = {\n count: number;\n transaction_amount: number;\n total_paid_amount: number;\n net_received_amount: number;\n overpaid_amount: number;\n fee_total: number;\n};\n\nfunction createCurrencyTotals(): CurrencyTotals {\n return {\n count: 0,\n transaction_amount: 0,\n total_paid_amount: 0,\n net_received_amount: 0,\n overpaid_amount: 0,\n fee_total: 0,\n };\n}\n\nfunction incrementCounter(store: Record<string, number>, key: string): void {\n const normalizedKey = key.trim() || \"UNKNOWN\";\n store[normalizedKey] = (store[normalizedKey] ?? 0) + 1;\n}\n\nfunction projectPayment(payment: Record<string, unknown>): PaymentProjection {\n const paymentId = normalizeScalarString(payment.id) || \"\";\n const transactionDetails = asRecord(payment.transaction_details);\n const payer = asRecord(payment.payer);\n const order = asRecord(payment.order);\n const feeDetails = asArray<Record<string, unknown>>(payment.fee_details);\n const currencyId = normalizeString(payment.currency_id, \"UNKNOWN\") || \"UNKNOWN\";\n const status = normalizeString(payment.status, \"UNKNOWN\") || \"UNKNOWN\";\n const paymentMethodId =\n normalizeScalarString(payment.payment_method_id) || normalizeScalarString(asRecord(payment.payment_method).id) || \"UNKNOWN\";\n const paymentTypeId = normalizeString(payment.payment_type_id) || \"UNKNOWN\";\n const transactionAmount = toNumber(payment.transaction_amount);\n const totalPaidAmount = toNumber(transactionDetails.total_paid_amount ?? payment.total_paid_amount);\n const netReceivedAmount = toNumber(transactionDetails.net_received_amount);\n const overpaidAmount = toNumber(transactionDetails.overpaid_amount);\n const feeTotal = roundMoney(feeDetails.reduce((accumulator, fee) => accumulator + toNumber(fee.amount), 0));\n const dateCreated = compactDateTime(payment.date_created);\n const dateLastUpdated = compactDateTime(payment.date_last_updated ?? payment.last_updated);\n const description = normalizeString(payment.description);\n const orderId = normalizeScalarString(order.id) || null;\n const payerId = normalizeScalarString(payer.id) || null;\n const payerEmail = normalizeString(payer.email);\n const payerType = normalizeString(payer.type);\n const payerFirstName = normalizeString(payer.first_name);\n const payerLastName = normalizeString(payer.last_name);\n const externalReference = normalizeString(transactionDetails.external_reference);\n\n return {\n row: [\n paymentId || null,\n normalizeString(payment.status) || null,\n normalizeString(payment.status_detail) || null,\n currencyId,\n transactionAmount,\n totalPaidAmount,\n netReceivedAmount,\n overpaidAmount,\n paymentMethodId,\n paymentTypeId,\n toNumber(payment.installments),\n dateCreated,\n dateLastUpdated,\n description || null,\n orderId,\n payerId,\n payerEmail || null,\n payerType || null,\n payerFirstName || null,\n payerLastName || null,\n feeDetails.length,\n feeTotal,\n externalReference || null,\n ],\n feeRows: feeDetails.map((fee) => [\n paymentId || null,\n normalizeString(fee.type) || null,\n toNumber(fee.amount),\n ]),\n paymentId,\n currencyId,\n status,\n paymentMethodId,\n paymentTypeId,\n hasOrder: Boolean(orderId),\n hasPayer: Boolean(payerId || payerEmail),\n feeTotal,\n };\n}\n\nfunction buildBreakdownEntries(store: Record<string, number>) {\n const total = Object.values(store).reduce((accumulator, value) => accumulator + value, 0);\n\n return Object.entries(store)\n .map(([key, count]) => ({\n key,\n count,\n rate: total > 0 ? roundMoney(count / total) : 0,\n }))\n .sort((left, right) => right.count - left.count || left.key.localeCompare(right.key));\n}\n\nfunction buildCurrencyBreakdowns(store: Record<string, CurrencyTotals>) {\n return Object.entries(store)\n .map(([currencyId, totals]) => ({\n currency_id: currencyId,\n count: totals.count,\n transaction_amount: roundMoney(totals.transaction_amount),\n total_paid_amount: roundMoney(totals.total_paid_amount),\n net_received_amount: roundMoney(totals.net_received_amount),\n overpaid_amount: roundMoney(totals.overpaid_amount),\n fee_total: roundMoney(totals.fee_total),\n }))\n .sort((left, right) => right.count - left.count || left.currency_id.localeCompare(right.currency_id));\n}\n\nfunction buildAlerts(params: {\n successfulCount: number;\n failedCount: number;\n paymentsWithoutOrderCount: number;\n paymentsWithoutPayerCount: number;\n currenciesObserved: string[];\n}): string[] {\n const alerts: string[] = [];\n\n if (params.failedCount > 0) {\n alerts.push(`${params.failedCount} payment${params.failedCount === 1 ? \"\" : \"s\"} failed to fetch.`);\n }\n\n if (params.successfulCount === 0 && params.failedCount > 0) {\n alerts.push(\"No payments were successfully retrieved.\");\n }\n\n if (params.paymentsWithoutOrderCount > 0) {\n alerts.push(\n `${params.paymentsWithoutOrderCount} payment${params.paymentsWithoutOrderCount === 1 ? \"\" : \"s\"} do not include an order reference.`\n );\n }\n\n if (params.paymentsWithoutPayerCount > 0) {\n alerts.push(\n `${params.paymentsWithoutPayerCount} payment${params.paymentsWithoutPayerCount === 1 ? \"\" : \"s\"} are missing payer data.`\n );\n }\n\n if (params.currenciesObserved.length > 1) {\n alerts.push(`Multiple currencies detected: ${params.currenciesObserved.join(\", \")}.`);\n }\n\n return alerts;\n}\n\nfunction buildPaymentPayload(params: {\n profileId: string;\n requestedPaymentIds: string[];\n successful: PaymentProjection[];\n failed: Array<{\n paymentId: string;\n message: string;\n statusCode?: number;\n attempts: number;\n retryable: boolean;\n }>;\n}) {\n const currencyTotals: Record<string, CurrencyTotals> = {};\n const statusCounts: Record<string, number> = {};\n const paymentMethodCounts: Record<string, number> = {};\n const paymentTypeCounts: Record<string, number> = {};\n const payments: PaymentRow[] = [];\n const feeDetailRows: FeeRow[] = [];\n let paymentsWithOrderCount = 0;\n let paymentsWithoutOrderCount = 0;\n let paymentsWithoutPayerCount = 0;\n\n for (const projection of params.successful) {\n payments.push(projection.row);\n feeDetailRows.push(...projection.feeRows);\n\n const currencyBucketTotals = currencyBucket(currencyTotals, projection.currencyId, createCurrencyTotals);\n currencyBucketTotals.count += 1;\n currencyBucketTotals.transaction_amount += projection.row[4] ? Number(projection.row[4]) : 0;\n currencyBucketTotals.total_paid_amount += projection.row[5] ? Number(projection.row[5]) : 0;\n currencyBucketTotals.net_received_amount += projection.row[6] ? Number(projection.row[6]) : 0;\n currencyBucketTotals.overpaid_amount += projection.row[7] ? Number(projection.row[7]) : 0;\n currencyBucketTotals.fee_total += projection.feeTotal;\n\n incrementCounter(statusCounts, projection.status);\n incrementCounter(paymentMethodCounts, projection.paymentMethodId);\n incrementCounter(paymentTypeCounts, projection.paymentTypeId);\n\n if (projection.hasOrder) {\n paymentsWithOrderCount += 1;\n } else {\n paymentsWithoutOrderCount += 1;\n }\n\n if (!projection.hasPayer) {\n paymentsWithoutPayerCount += 1;\n }\n }\n\n const currenciesObserved = Object.keys(currencyTotals).sort((left, right) => left.localeCompare(right));\n const summary = {\n requested_count: params.requestedPaymentIds.length,\n successful_count: params.successful.length,\n failed_count: params.failed.length,\n payments_with_order_count: paymentsWithOrderCount,\n payments_without_order_count: paymentsWithoutOrderCount,\n payments_without_payer_count: paymentsWithoutPayerCount,\n currency_totals: Object.fromEntries(\n Object.entries(currencyTotals).map(([currencyId, totals]) => [currencyId, stripNulls({\n count: totals.count,\n transaction_amount: roundMoney(totals.transaction_amount),\n total_paid_amount: roundMoney(totals.total_paid_amount),\n net_received_amount: roundMoney(totals.net_received_amount),\n overpaid_amount: roundMoney(totals.overpaid_amount),\n fee_total: roundMoney(totals.fee_total),\n })])\n ),\n status_counts: statusCounts,\n payment_method_counts: paymentMethodCounts,\n payment_type_counts: paymentTypeCounts,\n };\n\n const breakdowns = stripNulls({\n by_currency: buildCurrencyBreakdowns(currencyTotals),\n by_status: buildBreakdownEntries(statusCounts),\n by_payment_method: buildBreakdownEntries(paymentMethodCounts),\n by_payment_type: buildBreakdownEntries(paymentTypeCounts),\n });\n\n const alerts = buildAlerts({\n successfulCount: params.successful.length,\n failedCount: params.failed.length,\n paymentsWithoutOrderCount,\n paymentsWithoutPayerCount,\n currenciesObserved,\n });\n\n const payload = stripNulls({\n metadata: {\n profile_id: params.profileId,\n endpoint: \"/v1/payments/{payment_id}\",\n mode: params.requestedPaymentIds.length === 1 ? \"single\" : \"batch\",\n requested_count: params.requestedPaymentIds.length,\n successful_count: params.successful.length,\n failed_count: params.failed.length,\n coverage_complete: params.failed.length === 0,\n requested_payment_ids: params.requestedPaymentIds,\n successful_payment_ids: params.successful.map((entry) => entry.paymentId),\n failed_payment_ids: params.failed.map((entry) => entry.paymentId),\n },\n summary,\n breakdowns,\n alerts,\n failures: params.failed,\n });\n\n // Attach compact positional blocks after stripping nullish metadata so row length stays aligned.\n return {\n ...payload,\n payments_schema: paymentsSchema,\n payments,\n payment_fee_details_schema: paymentFeeDetailsSchema,\n payment_fee_details: feeDetailRows,\n };\n}\n\nexport async function meliGetPaymentDetailsHandler(\n params: z.infer<typeof meliGetPaymentDetailsSchema>\n) {\n try {\n const profileResolution = await resolveMercadoLibreProfileOrSelection(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const profileId = profileResolution.value.profileId;\n\n if (params.paymentId) {\n const payment = await getMercadoLibrePaymentDetails(profileId, params.paymentId);\n const projected = projectPayment(payment);\n\n return object(\n buildPaymentPayload({\n profileId,\n requestedPaymentIds: [params.paymentId],\n successful: [projected],\n failed: [],\n })\n );\n }\n\n const batch = await getMercadoLibrePaymentDetailsBatch(profileId, params.paymentIds ?? []);\n\n return object(\n buildPaymentPayload({\n profileId,\n requestedPaymentIds: params.paymentIds ?? [],\n successful: batch.successful.map((entry) => projectPayment(entry.payment)),\n failed: batch.failed,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to fetch MercadoLibre payment details\"));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }