@yoryoboy/bi-mcp 1.14.3 → 1.15.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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/mcp-use.json +2 -2
- package/dist/src/tools/mercadolibre/get-order-details.js +18 -4
- package/dist/src/tools/mercadolibre/get-order-details.js.map +2 -2
- package/dist/src/tools/mercadolibre/get-orders-summary.js +6 -2
- package/dist/src/tools/mercadolibre/get-orders-summary.js.map +2 -2
- package/dist/src/tools/mercadolibre/get-shipping-summary.js +50 -14
- package/dist/src/tools/mercadolibre/get-shipping-summary.js.map +2 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-medium-batch4.test.js +16 -4
- package/dist/tests/meli/mercadolibre-tool-handlers-medium-batch4.test.js.map +2 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch5.test.js +25 -3
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch5.test.js.map +2 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch6.test.js +141 -5
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch6.test.js.map +2 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch7.test.js +3 -2
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch7.test.js.map +2 -2
- package/package.json +1 -1
package/dist/mcp-use.json
CHANGED
|
@@ -3,7 +3,14 @@ import { z } from "zod";
|
|
|
3
3
|
import { formatMercadoLibreError } from "../../services/mercadolibre/mercadolibre-api.js";
|
|
4
4
|
import { getMercadoLibreOrder, getMercadoLibreOrderDetailsBatch } from "../../services/mercadolibre/mercadolibre-orders.js";
|
|
5
5
|
import { stripNulls } from "../../utils/strip-payload.js";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
asArray,
|
|
8
|
+
asRecord,
|
|
9
|
+
compactDateTime,
|
|
10
|
+
normalizeScalarString,
|
|
11
|
+
normalizeString,
|
|
12
|
+
toNumber
|
|
13
|
+
} from "./helpers.js";
|
|
7
14
|
import { resolveMercadoLibreProfileOrSelection } from "./profile-resolution.js";
|
|
8
15
|
import { mercadolibreProfileIdSchemaField } from "./write-helpers.js";
|
|
9
16
|
const MAX_ORDER_IDS = 50;
|
|
@@ -12,6 +19,7 @@ const meliGetOrderDetailsSchema = z.object({
|
|
|
12
19
|
orderIds: z.array(z.string().trim().min(1).describe("MercadoLibre order id.")).min(1).max(MAX_ORDER_IDS).describe("One or more MercadoLibre order ids (up to 50).")
|
|
13
20
|
});
|
|
14
21
|
function formatOrder(order) {
|
|
22
|
+
const optionalMoney = (value) => value == null || value === "" ? void 0 : toNumber(value);
|
|
15
23
|
return stripNulls({
|
|
16
24
|
order_id: normalizeString(order.id),
|
|
17
25
|
status: normalizeString(order.status),
|
|
@@ -22,7 +30,7 @@ function formatOrder(order) {
|
|
|
22
30
|
total_amount: toNumber(order.total_amount),
|
|
23
31
|
paid_amount: toNumber(order.paid_amount),
|
|
24
32
|
shipping: stripNulls({
|
|
25
|
-
id:
|
|
33
|
+
id: normalizeScalarString(asRecord(order.shipping).id),
|
|
26
34
|
status: normalizeString(asRecord(order.shipping).status),
|
|
27
35
|
substatus: normalizeString(asRecord(order.shipping).substatus),
|
|
28
36
|
mode: normalizeString(asRecord(order.shipping).mode),
|
|
@@ -49,11 +57,17 @@ function formatOrder(order) {
|
|
|
49
57
|
}),
|
|
50
58
|
payments: asArray(order.payments).map(
|
|
51
59
|
(payment) => stripNulls({
|
|
52
|
-
id:
|
|
60
|
+
id: normalizeScalarString(payment.id),
|
|
53
61
|
status: normalizeString(payment.status),
|
|
62
|
+
status_detail: normalizeString(payment.status_detail) || void 0,
|
|
63
|
+
payment_method_id: normalizeString(payment.payment_method_id) || void 0,
|
|
54
64
|
payment_type: normalizeString(payment.payment_type),
|
|
55
65
|
installments: toNumber(payment.installments),
|
|
56
|
-
total_paid_amount: toNumber(payment.total_paid_amount)
|
|
66
|
+
total_paid_amount: toNumber(payment.total_paid_amount),
|
|
67
|
+
transaction_amount: optionalMoney(payment.transaction_amount),
|
|
68
|
+
transaction_amount_refunded: optionalMoney(payment.transaction_amount_refunded),
|
|
69
|
+
shipping_cost: optionalMoney(payment.shipping_cost),
|
|
70
|
+
coupon_amount: optionalMoney(payment.coupon_amount)
|
|
57
71
|
})
|
|
58
72
|
),
|
|
59
73
|
tags: Array.isArray(order.tags) ? order.tags : void 0
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/get-order-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 { getMercadoLibreOrder, getMercadoLibreOrderDetailsBatch } from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {
|
|
5
|
-
"mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,+BAA+B;AACxC,SAAS,sBAAsB,wCAAwC;AACvE,SAAS,kBAAkB;AAC3B,
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatMercadoLibreError } from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport { getMercadoLibreOrder, getMercadoLibreOrderDetailsBatch } from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n compactDateTime,\n normalizeScalarString,\n normalizeString,\n toNumber,\n} from \"./helpers.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"./profile-resolution.js\";\nimport { mercadolibreProfileIdSchemaField } from \"./write-helpers.js\";\n\nconst MAX_ORDER_IDS = 50;\n\nexport const meliGetOrderDetailsSchema = 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(\"One or more MercadoLibre order ids (up to 50).\"),\n});\n\nfunction formatOrder(order: Record<string, unknown>) {\n const optionalMoney = (value: unknown) => (value == null || value === \"\" ? undefined : toNumber(value));\n\n return stripNulls({\n order_id: normalizeString(order.id),\n status: normalizeString(order.status),\n status_detail: normalizeString(order.status_detail),\n date_created: compactDateTime(order.date_created),\n date_closed: compactDateTime(order.date_closed),\n currency_id: normalizeString(order.currency_id, \"UNKNOWN\"),\n total_amount: toNumber(order.total_amount),\n paid_amount: toNumber(order.paid_amount),\n shipping: stripNulls({\n id: normalizeScalarString(asRecord(order.shipping).id),\n status: normalizeString(asRecord(order.shipping).status),\n substatus: normalizeString(asRecord(order.shipping).substatus),\n mode: normalizeString(asRecord(order.shipping).mode),\n logistic_type: normalizeString(asRecord(order.shipping).logistic_type),\n }),\n buyer: stripNulls({\n id: normalizeString(asRecord(order.buyer).id),\n nickname: normalizeString(asRecord(order.buyer).nickname),\n }),\n seller: stripNulls({\n id: normalizeString(asRecord(order.seller).id),\n nickname: normalizeString(asRecord(order.seller).nickname),\n }),\n items: asArray<Record<string, unknown>>(order.order_items).map((entry) => {\n const item = asRecord(entry.item);\n return stripNulls({\n item_id: normalizeString(item.id),\n title: normalizeString(item.title),\n variation_id: normalizeString(item.variation_id),\n quantity: toNumber(entry.quantity),\n unit_price: toNumber(entry.unit_price),\n full_unit_price: toNumber(entry.full_unit_price),\n });\n }),\n payments: asArray<Record<string, unknown>>(order.payments).map((payment) =>\n stripNulls({\n id: normalizeScalarString(payment.id),\n status: normalizeString(payment.status),\n status_detail: normalizeString(payment.status_detail) || undefined,\n payment_method_id: normalizeString(payment.payment_method_id) || undefined,\n payment_type: normalizeString(payment.payment_type),\n installments: toNumber(payment.installments),\n total_paid_amount: toNumber(payment.total_paid_amount),\n transaction_amount: optionalMoney(payment.transaction_amount),\n transaction_amount_refunded: optionalMoney(payment.transaction_amount_refunded),\n shipping_cost: optionalMoney(payment.shipping_cost),\n coupon_amount: optionalMoney(payment.coupon_amount),\n })\n ),\n tags: Array.isArray(order.tags) ? order.tags : undefined,\n });\n}\n\nexport async function meliGetOrderDetailsHandler(\n params: z.infer<typeof meliGetOrderDetailsSchema>\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\n if (uniqueOrderIds.length === 1) {\n const order = await getMercadoLibreOrder(profileId, uniqueOrderIds[0]);\n return object(\n stripNulls({\n metadata: {\n profile_id: profileId,\n requested: 1,\n successful: 1,\n failed: 0,\n },\n orders: [formatOrder(order)],\n })\n );\n }\n\n const batch = await getMercadoLibreOrderDetailsBatch(profileId, uniqueOrderIds, {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n\n return object(\n stripNulls({\n metadata: {\n profile_id: profileId,\n requested: uniqueOrderIds.length,\n successful: batch.successful.length,\n failed: batch.failed.length,\n has_failures: batch.failed.length > 0,\n },\n orders: batch.successful.map((entry) => formatOrder(entry.document)),\n failures: batch.failed.map((failure) => ({\n order_id: failure.id,\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n })),\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to fetch MercadoLibre order details\"));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -71,7 +71,9 @@ const ordersSchema = [
|
|
|
71
71
|
"first_item_sale_fee",
|
|
72
72
|
"first_item_listing_type",
|
|
73
73
|
"variation_attributes",
|
|
74
|
-
"stock_node_id"
|
|
74
|
+
"stock_node_id",
|
|
75
|
+
"payment_shipping_cost",
|
|
76
|
+
"payment_coupon_amount"
|
|
75
77
|
];
|
|
76
78
|
function compactStringList(values, separator = " | ") {
|
|
77
79
|
return asArray(values).map((value) => normalizeScalarString(value).trim()).filter(Boolean).join(separator);
|
|
@@ -929,7 +931,9 @@ function formatCompactOrder(order, metricsByCurrency) {
|
|
|
929
931
|
toNumber(firstOrderItem.sale_fee),
|
|
930
932
|
normalizeString(firstOrderItem.listing_type_id),
|
|
931
933
|
compactVariationAttributes(firstItem.variation_attributes),
|
|
932
|
-
normalizeString(stock.node_id)
|
|
934
|
+
normalizeString(stock.node_id),
|
|
935
|
+
toNumber(firstPayment.shipping_cost),
|
|
936
|
+
toNumber(firstPayment.coupon_amount)
|
|
933
937
|
];
|
|
934
938
|
}
|
|
935
939
|
const meliGetOrdersSummarySchema = z.object({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/mercadolibre/get-orders-summary.ts"],
|
|
4
|
-
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport {\n buildMercadoLibrePaginationMetadata,\n formatMercadoLibreError,\n normalizeMercadoLibrePaging,\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n searchMercadoLibreOrders,\n searchMercadoLibreOrdersBatch,\n} from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n compactDateTime,\n currencyBucket,\n mercadoLibreDateRegex,\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 PAGE_FETCH_CONCURRENCY = 15;\nconst PAGE_FETCH_MAX_RETRIES = 2;\nconst ORDER_DETAIL_MAX_PAGES_PER_CALL = 15;\nconst DEFAULT_ORDER_DETAIL_PAGE_LIMIT = 50;\nconst TOP_LIMIT = 10;\n\nconst ordersSchema = [\n \"id\",\n \"date_created\",\n \"status\",\n \"total_amount\",\n \"currency\",\n \"buyer\",\n \"shipping_status\",\n \"items\",\n \"date_closed\",\n \"last_updated\",\n \"paid_amount\",\n \"buyer_id\",\n \"seller\",\n \"seller_id\",\n \"shipping_id\",\n \"pack_id\",\n \"fulfilled\",\n \"tags\",\n \"channel\",\n \"site\",\n \"payment_id\",\n \"payment_status\",\n \"payment_status_detail\",\n \"payment_method\",\n \"payment_type\",\n \"payment_total_paid\",\n \"payment_transaction_amount\",\n \"installments\",\n \"coupon_amount\",\n \"available_actions\",\n \"feedback_buyer\",\n \"feedback_seller\",\n \"order_request_change\",\n \"order_request_return\",\n \"first_item_id\",\n \"first_item_title\",\n \"first_item_sku\",\n \"first_item_quantity\",\n \"first_item_unit_price\",\n \"first_item_sale_fee\",\n \"first_item_listing_type\",\n \"variation_attributes\",\n \"stock_node_id\",\n] as const;\n\nfunction compactStringList(values: unknown, separator = \" | \"): string {\n return asArray(values)\n .map((value) => normalizeScalarString(value).trim())\n .filter(Boolean)\n .join(separator);\n}\n\nfunction compactNestedValue(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n\n const scalar = normalizeScalarString(value);\n if (scalar) {\n return scalar;\n }\n\n if (Array.isArray(value)) {\n return value\n .map((entry) => compactNestedValue(entry))\n .filter(Boolean)\n .join(\" | \");\n }\n\n const record = asRecord(value);\n return Object.entries(record)\n .map(([key, entryValue]) => {\n const normalized = compactNestedValue(entryValue);\n return normalized ? `${key}:${normalized}` : \"\";\n })\n .filter(Boolean)\n .join(\" | \");\n}\n\nfunction compactVariationAttributes(value: unknown): string {\n return asArray<Record<string, unknown>>(value)\n .map((attribute) => {\n const name = normalizeString(attribute.name) || normalizeString(attribute.id);\n const normalizedValue =\n normalizeString(attribute.value_name) ||\n normalizeString(attribute.value_id) ||\n normalizeScalarString(attribute.value);\n\n if (!name || !normalizedValue) {\n return \"\";\n }\n\n return `${name}: ${normalizedValue}`;\n })\n .filter(Boolean)\n .join(\" | \");\n}\n\nfunction createMetricsBucket() {\n return {\n orders: 0,\n revenue: 0,\n avg_order_value: 0,\n };\n}\n\ntype FailedPage = {\n offset: number;\n limit: number;\n page_number: number;\n message: string;\n status_code?: number;\n attempts: number;\n retryable: boolean;\n};\n\ntype OrderSummaryMetadata = ReturnType<typeof buildOrdersSummaryMetadata>;\n\ntype BreakdownEntry = {\n key: string;\n orders: number;\n rate: number;\n};\n\ntype BreakdownResult = {\n entries: BreakdownEntry[];\n other_orders?: number;\n other_rate?: number;\n};\n\ntype CurrencyCalculation = {\n revenue_total: number;\n paid_amount_total: number;\n payment_total_paid_amount: number;\n transaction_amount_total: number;\n coupon_amount_total: number;\n sale_fee_total: number;\n avg_order_value: number;\n avg_paid_amount_per_order: number;\n avg_units_per_order: number;\n avg_distinct_items_per_order: number;\n avg_sale_fee_per_order: number;\n sale_fee_rate: number;\n};\n\ntype BuyerAggregate = {\n buyer_id: string;\n nickname: string;\n orders: number;\n revenue_by_currency: Record<string, number>;\n};\n\ntype ItemAggregate = {\n item_id: string;\n title: string;\n seller_sku: string;\n variation_summary: string;\n orders: number;\n units: number;\n revenue_by_currency: Record<string, number>;\n sale_fee_by_currency: Record<string, number>;\n};\n\ntype VariationAggregate = {\n variation_summary: string;\n orders: number;\n units: number;\n revenue_by_currency: Record<string, number>;\n};\n\ntype SkuAggregate = {\n seller_sku: string;\n orders: number;\n units: number;\n revenue_by_currency: Record<string, number>;\n};\n\ntype CurrencyMetricBucket = {\n orders: number;\n units: number;\n revenue: number;\n paidRevenue: number;\n paymentTotalPaid: number;\n transactionAmount: number;\n refundedAmount: number;\n cancelledGmv: number;\n saleFee: number;\n shippingCost: number;\n couponAmount: number;\n paymentCouponAmount: number;\n discountedGmv: number;\n notDeliveredGmv: number;\n cancelledOrders: number;\n refundedOrders: number;\n ordersWithShippingCost: number;\n ordersWithCoupon: number;\n discountedOrders: number;\n notDeliveredOrders: number;\n};\n\ntype FlowAggregate = {\n flow: string;\n orders: number;\n units: number;\n cancelled_orders: number;\n revenue_by_currency: Record<string, number>;\n paid_revenue_by_currency: Record<string, number>;\n sale_fee_by_currency: Record<string, number>;\n};\n\ntype SkuEconomicsAggregate = {\n seller_sku: string;\n item_id: string;\n title: string;\n orders: number;\n units: number;\n cancelled_orders: number;\n refunded_orders: number;\n revenue_by_currency: Record<string, number>;\n paid_revenue_by_currency: Record<string, number>;\n sale_fee_by_currency: Record<string, number>;\n refunded_amount_by_currency: Record<string, number>;\n};\n\nfunction safeRate(numerator: number, denominator: number): number {\n if (!Number.isFinite(denominator) || denominator <= 0) {\n return 0;\n }\n\n return Number((numerator / denominator).toFixed(4));\n}\n\nfunction topBreakdownFromMap(\n counts: Map<string, number>,\n totalOrders: number,\n limit = TOP_LIMIT\n): BreakdownResult {\n const sorted = Array.from(counts.entries())\n .filter(([, count]) => count > 0)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]));\n\n const entries = sorted.slice(0, limit).map(([key, orders]) => ({\n key,\n orders,\n rate: safeRate(orders, totalOrders),\n }));\n\n const otherOrders = sorted.slice(limit).reduce((sum, [, count]) => sum + count, 0);\n return stripNulls({\n entries,\n other_orders: otherOrders > 0 ? otherOrders : undefined,\n other_rate: otherOrders > 0 ? safeRate(otherOrders, totalOrders) : undefined,\n }) as BreakdownResult;\n}\n\nfunction incrementCount(map: Map<string, number>, key: string) {\n if (!key) {\n return;\n }\n\n map.set(key, (map.get(key) ?? 0) + 1);\n}\n\nfunction incrementCurrency(map: Record<string, number>, currencyId: string, amount: number) {\n map[currencyId] = roundMoney((map[currencyId] ?? 0) + amount);\n}\n\nfunction sortedCurrencyTotals(input: Record<string, number>) {\n return Object.fromEntries(\n Object.entries(input)\n .filter(([, amount]) => amount !== 0)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currency, amount]) => [currency, roundMoney(amount)])\n );\n}\n\nfunction createCurrencyMetricBucket(): CurrencyMetricBucket {\n return {\n orders: 0,\n units: 0,\n revenue: 0,\n paidRevenue: 0,\n paymentTotalPaid: 0,\n transactionAmount: 0,\n refundedAmount: 0,\n cancelledGmv: 0,\n saleFee: 0,\n shippingCost: 0,\n couponAmount: 0,\n paymentCouponAmount: 0,\n discountedGmv: 0,\n notDeliveredGmv: 0,\n cancelledOrders: 0,\n refundedOrders: 0,\n ordersWithShippingCost: 0,\n ordersWithCoupon: 0,\n discountedOrders: 0,\n notDeliveredOrders: 0,\n };\n}\n\nfunction incrementCurrencyMetric(\n map: Record<string, CurrencyMetricBucket>,\n currencyId: string,\n updater: (bucket: CurrencyMetricBucket) => void\n) {\n map[currencyId] = map[currencyId] ?? createCurrencyMetricBucket();\n updater(map[currencyId]);\n}\n\nfunction sortedCurrencyMetrics(\n input: Record<string, CurrencyMetricBucket>,\n mapper: (bucket: CurrencyMetricBucket) => Record<string, number>\n) {\n return Object.fromEntries(\n Object.entries(input)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currencyId, bucket]) => [currencyId, stripNulls(mapper(bucket))])\n );\n}\n\nfunction topAmountBreakdownFromMap(\n counts: Map<string, number>,\n amounts: Map<string, Record<string, number>>,\n totalOrders: number,\n limit = TOP_LIMIT\n) {\n const sorted = Array.from(counts.entries())\n .filter(([, count]) => count > 0)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]));\n\n const entries = sorted.slice(0, limit).map(([key, orders]) => ({\n key,\n orders,\n rate: safeRate(orders, totalOrders),\n amount_by_currency: sortedCurrencyTotals(amounts.get(key) ?? {}),\n }));\n\n const otherOrders = sorted.slice(limit).reduce((sum, [, count]) => sum + count, 0);\n return stripNulls({\n entries,\n other_orders: otherOrders > 0 ? otherOrders : undefined,\n other_rate: otherOrders > 0 ? safeRate(otherOrders, totalOrders) : undefined,\n });\n}\n\nfunction revenueSum(input: Record<string, number>) {\n return Object.values(input).reduce((sum, value) => sum + value, 0);\n}\n\nfunction compactFeedbackValue(value: unknown): string {\n const compact = compactNestedValue(value);\n return compact.trim();\n}\n\nfunction getFirstPayment(order: Record<string, unknown>) {\n return asRecord(asArray<Record<string, unknown>>(order.payments)[0]);\n}\n\nfunction getOrderCurrency(order: Record<string, unknown>) {\n return normalizeString(order.currency_id, \"UNKNOWN\");\n}\n\nfunction buildCalculations(\n orders: Array<Record<string, unknown>>,\n metadata: OrderSummaryMetadata,\n failedPages: FailedPage[]\n) {\n const ordersTotal = orders.length;\n const statusCounts = new Map<string, number>();\n const tagCounts = new Map<string, number>();\n const channelCounts = new Map<string, number>();\n const siteCounts = new Map<string, number>();\n const paymentStatusCounts = new Map<string, number>();\n const paymentStatusDetailCounts = new Map<string, number>();\n const paymentMethodCounts = new Map<string, number>();\n const paymentTypeCounts = new Map<string, number>();\n const installmentsCounts = new Map<string, number>();\n const stockNodeCounts = new Map<string, number>();\n const listingTypeCounts = new Map<string, number>();\n const variationValueCounts = new Map<string, number>();\n const buyers = new Map<string, BuyerAggregate>();\n const items = new Map<string, ItemAggregate>();\n const variations = new Map<string, VariationAggregate>();\n const skus = new Map<string, SkuAggregate>();\n const dailyMetrics = new Map<string, Record<string, CurrencyMetricBucket>>();\n const flowMetrics = new Map<string, FlowAggregate>();\n const skuEconomics = new Map<string, SkuEconomicsAggregate>();\n const cancelGroupCounts = new Map<string, number>();\n const cancelCodeCounts = new Map<string, number>();\n const cancelRequestedByCounts = new Map<string, number>();\n const cancelReasonCounts = new Map<string, number>();\n const cancelReasonAmounts = new Map<string, Record<string, number>>();\n\n let unitsTotal = 0;\n let fulfilledOrders = 0;\n let deliveredOrders = 0;\n let packOrders = 0;\n let discountedOrders = 0;\n let catalogOrders = 0;\n let ordersWithFeedback = 0;\n let ordersWithChangeRequest = 0;\n let ordersWithReturnRequest = 0;\n let feedbackBuyerCount = 0;\n let feedbackSellerCount = 0;\n let ordersWithShipping = 0;\n let singleItemOrders = 0;\n let multiItemOrders = 0;\n let ordersWithoutPaymentData = 0;\n let paymentApprovedOrders = 0;\n let itemLineCount = 0;\n let ordersWithAnyPostSaleIssue = 0;\n let ordersWithRefundedAmount = 0;\n let ordersWithShippingCostAmount = 0;\n let ordersWithCouponAmount = 0;\n let notDeliveredOrders = 0;\n let multiUnitItemLines = 0;\n let multiUnitSaleFeeObservations = 0;\n\n const itemsSeen = new Set<string>();\n const buyerSeen = new Set<string>();\n const financialRaw: Record<\n string,\n {\n orders: number;\n units: number;\n distinctItems: number;\n revenue: number;\n paidAmount: number;\n paymentTotalPaidAmount: number;\n transactionAmount: number;\n couponAmount: number;\n saleFee: number;\n }\n > = {};\n const currencyMetrics: Record<string, CurrencyMetricBucket> = {};\n\n for (const order of orders) {\n const currencyId = getOrderCurrency(order);\n const totalAmount = toNumber(order.total_amount);\n const paidAmount = toNumber(order.paid_amount);\n const couponAmount = toNumber(asRecord(order.coupon).amount);\n const payment = getFirstPayment(order);\n const orderItems = asArray<Record<string, unknown>>(order.order_items);\n const buyer = asRecord(order.buyer);\n const seller = asRecord(order.seller);\n const feedback = asRecord(order.feedback);\n const orderRequest = asRecord(order.order_request);\n const shipping = asRecord(order.shipping);\n const context = asRecord(order.context);\n const paymentStatus = normalizeString(payment.status);\n const paymentStatusDetail = normalizeString(payment.status_detail);\n const paymentMethod = normalizeString(payment.payment_method_id);\n const paymentType = normalizeString(payment.payment_type);\n const installments = normalizeScalarString(payment.installments);\n const tags = asArray(order.tags).map((tag) => normalizeScalarString(tag)).filter(Boolean);\n const cancelDetail = asRecord(order.cancel_detail);\n const isCancelled = normalizeString(order.status) === \"cancelled\";\n const refundedAmount = toNumber(payment.transaction_amount_refunded);\n const shippingCost = toNumber(payment.shipping_cost);\n const paymentCouponAmount = toNumber(payment.coupon_amount);\n const dayKey = compactDateTime(order.date_created)?.slice(0, 10) || \"UNKNOWN_DATE\";\n const flows = asArray(context.flows).map((flow) => normalizeScalarString(flow)).filter(Boolean);\n const effectiveFlows = flows.length > 0 ? flows : [\"NO_FLOW\"];\n const isDiscounted = tags.includes(\"order_has_discount\") || couponAmount > 0 || paymentCouponAmount > 0;\n const isNotDelivered = tags.includes(\"not_delivered\") || normalizeString(cancelDetail.group) === \"shipment\";\n const orderItemDistinctIds = new Set<string>();\n\n financialRaw[currencyId] = financialRaw[currencyId] ?? {\n orders: 0,\n units: 0,\n distinctItems: 0,\n revenue: 0,\n paidAmount: 0,\n paymentTotalPaidAmount: 0,\n transactionAmount: 0,\n couponAmount: 0,\n saleFee: 0,\n };\n\n financialRaw[currencyId].orders += 1;\n financialRaw[currencyId].revenue += totalAmount;\n financialRaw[currencyId].paidAmount += paidAmount;\n financialRaw[currencyId].paymentTotalPaidAmount += toNumber(payment.total_paid_amount);\n financialRaw[currencyId].transactionAmount += toNumber(payment.transaction_amount);\n financialRaw[currencyId].couponAmount += couponAmount;\n\n const dailyCurrencyMetrics = dailyMetrics.get(dayKey) ?? {};\n dailyMetrics.set(dayKey, dailyCurrencyMetrics);\n const updateOrderCurrencyMetrics = (bucket: CurrencyMetricBucket) => {\n bucket.orders += 1;\n bucket.revenue += totalAmount;\n bucket.paidRevenue += paidAmount;\n bucket.paymentTotalPaid += toNumber(payment.total_paid_amount);\n bucket.transactionAmount += toNumber(payment.transaction_amount);\n bucket.refundedAmount += refundedAmount;\n bucket.shippingCost += shippingCost;\n bucket.couponAmount += couponAmount;\n bucket.paymentCouponAmount += paymentCouponAmount;\n if (isCancelled) {\n bucket.cancelledOrders += 1;\n bucket.cancelledGmv += totalAmount;\n }\n if (refundedAmount > 0) {\n bucket.refundedOrders += 1;\n }\n if (shippingCost > 0) {\n bucket.ordersWithShippingCost += 1;\n }\n if (couponAmount > 0 || paymentCouponAmount > 0) {\n bucket.ordersWithCoupon += 1;\n }\n if (isDiscounted) {\n bucket.discountedOrders += 1;\n }\n if (isNotDelivered) {\n bucket.notDeliveredOrders += 1;\n }\n };\n incrementCurrencyMetric(currencyMetrics, currencyId, updateOrderCurrencyMetrics);\n incrementCurrencyMetric(dailyCurrencyMetrics, currencyId, updateOrderCurrencyMetrics);\n\n incrementCount(statusCounts, normalizeString(order.status));\n incrementCount(channelCounts, normalizeString(context.channel));\n incrementCount(siteCounts, normalizeString(context.site));\n\n if (paymentStatus) {\n incrementCount(paymentStatusCounts, paymentStatus);\n } else {\n ordersWithoutPaymentData += 1;\n }\n incrementCount(paymentStatusDetailCounts, paymentStatusDetail);\n incrementCount(paymentMethodCounts, paymentMethod);\n incrementCount(paymentTypeCounts, paymentType);\n incrementCount(installmentsCounts, installments);\n\n if (paymentStatus === \"approved\") {\n paymentApprovedOrders += 1;\n }\n\n if (order.fulfilled === true) {\n fulfilledOrders += 1;\n }\n\n if (normalizeScalarString(shipping.id)) {\n ordersWithShipping += 1;\n }\n\n if (orderItems.length === 1) {\n singleItemOrders += 1;\n } else if (orderItems.length > 1) {\n multiItemOrders += 1;\n }\n\n for (const tag of tags) {\n incrementCount(tagCounts, tag);\n }\n\n if (tags.includes(\"delivered\")) {\n deliveredOrders += 1;\n }\n if (tags.includes(\"pack_order\")) {\n packOrders += 1;\n }\n if (tags.includes(\"order_has_discount\")) {\n discountedOrders += 1;\n }\n if (tags.includes(\"catalog\")) {\n catalogOrders += 1;\n }\n if (refundedAmount > 0) {\n ordersWithRefundedAmount += 1;\n }\n if (shippingCost > 0) {\n ordersWithShippingCostAmount += 1;\n }\n if (couponAmount > 0 || paymentCouponAmount > 0) {\n ordersWithCouponAmount += 1;\n }\n if (isNotDelivered) {\n notDeliveredOrders += 1;\n }\n if (isCancelled) {\n const cancelGroup = normalizeString(cancelDetail.group, \"UNKNOWN_GROUP\");\n const cancelCode = normalizeString(cancelDetail.code, \"UNKNOWN_CODE\");\n const requestedBy = normalizeString(cancelDetail.requested_by, \"UNKNOWN_REQUESTER\");\n const reasonKey = `${cancelGroup}:${cancelCode}:${requestedBy}`;\n incrementCount(cancelGroupCounts, cancelGroup);\n incrementCount(cancelCodeCounts, cancelCode);\n incrementCount(cancelRequestedByCounts, requestedBy);\n incrementCount(cancelReasonCounts, reasonKey);\n const reasonAmount = cancelReasonAmounts.get(reasonKey) ?? {};\n incrementCurrency(reasonAmount, currencyId, totalAmount);\n cancelReasonAmounts.set(reasonKey, reasonAmount);\n }\n\n for (const flow of effectiveFlows) {\n const flowAggregate = flowMetrics.get(flow) ?? {\n flow,\n orders: 0,\n units: 0,\n cancelled_orders: 0,\n revenue_by_currency: {},\n paid_revenue_by_currency: {},\n sale_fee_by_currency: {},\n };\n flowAggregate.orders += 1;\n if (isCancelled) {\n flowAggregate.cancelled_orders += 1;\n }\n incrementCurrency(flowAggregate.revenue_by_currency, currencyId, totalAmount);\n incrementCurrency(flowAggregate.paid_revenue_by_currency, currencyId, paidAmount);\n flowMetrics.set(flow, flowAggregate);\n }\n\n const feedbackBuyer = compactFeedbackValue(feedback.buyer);\n const feedbackSeller = compactFeedbackValue(feedback.seller);\n const hasFeedback = Boolean(feedbackBuyer || feedbackSeller);\n if (hasFeedback) {\n ordersWithFeedback += 1;\n }\n if (feedbackBuyer) {\n feedbackBuyerCount += 1;\n }\n if (feedbackSeller) {\n feedbackSellerCount += 1;\n }\n\n const hasChangeRequest = Boolean(compactFeedbackValue(orderRequest.change));\n const hasReturnRequest = Boolean(compactFeedbackValue(orderRequest.return));\n if (hasChangeRequest) {\n ordersWithChangeRequest += 1;\n }\n if (hasReturnRequest) {\n ordersWithReturnRequest += 1;\n }\n if (hasFeedback || hasChangeRequest || hasReturnRequest) {\n ordersWithAnyPostSaleIssue += 1;\n }\n\n const buyerId = normalizeScalarString(buyer.id);\n const buyerNickname = normalizeString(buyer.nickname);\n if (buyerId || buyerNickname) {\n const buyerKey = buyerId || buyerNickname;\n buyerSeen.add(buyerKey);\n const currentBuyer = buyers.get(buyerKey) ?? {\n buyer_id: buyerId,\n nickname: buyerNickname,\n orders: 0,\n revenue_by_currency: {},\n };\n currentBuyer.orders += 1;\n incrementCurrency(currentBuyer.revenue_by_currency, currencyId, totalAmount);\n buyers.set(buyerKey, currentBuyer);\n }\n\n for (const orderItem of orderItems) {\n itemLineCount += 1;\n const item = asRecord(orderItem.item);\n const stock = asRecord(orderItem.stock);\n const itemId = normalizeString(item.id);\n const title = normalizeString(item.title);\n const sellerSku = normalizeString(item.seller_sku);\n const quantity = toNumber(orderItem.quantity);\n const unitPrice = toNumber(orderItem.unit_price);\n const saleFee = toNumber(orderItem.sale_fee);\n const listingType = normalizeString(orderItem.listing_type_id);\n const stockNode = normalizeString(stock.node_id);\n const variationSummary = compactVariationAttributes(item.variation_attributes);\n const itemKey = `${itemId}::${variationSummary}::${sellerSku}`;\n const skuKey = sellerSku || itemId || title || \"UNKNOWN_SKU\";\n const variationKey = variationSummary || \"NO_VARIATION\";\n const itemRevenue = unitPrice * quantity;\n const paidRevenueApprox = totalAmount > 0 ? paidAmount * (itemRevenue / totalAmount) : itemRevenue;\n const refundedAmountApprox = totalAmount > 0 ? refundedAmount * (itemRevenue / totalAmount) : refundedAmount;\n\n if (quantity > 1) {\n multiUnitItemLines += 1;\n if (saleFee > 0) {\n multiUnitSaleFeeObservations += 1;\n }\n }\n\n unitsTotal += quantity;\n financialRaw[currencyId].units += quantity;\n financialRaw[currencyId].saleFee += saleFee;\n const updateItemCurrencyMetrics = (bucket: CurrencyMetricBucket) => {\n bucket.units += quantity;\n bucket.saleFee += saleFee;\n if (isDiscounted) {\n bucket.discountedGmv += itemRevenue;\n }\n if (isNotDelivered) {\n bucket.notDeliveredGmv += itemRevenue;\n }\n };\n incrementCurrencyMetric(currencyMetrics, currencyId, updateItemCurrencyMetrics);\n incrementCurrencyMetric(dailyCurrencyMetrics, currencyId, updateItemCurrencyMetrics);\n\n for (const flow of effectiveFlows) {\n const flowAggregate = flowMetrics.get(flow);\n if (flowAggregate) {\n flowAggregate.units += quantity;\n incrementCurrency(flowAggregate.sale_fee_by_currency, currencyId, saleFee);\n }\n }\n\n if (itemId) {\n itemsSeen.add(itemId);\n orderItemDistinctIds.add(itemId);\n }\n\n incrementCount(listingTypeCounts, listingType);\n incrementCount(stockNodeCounts, stockNode);\n incrementCount(variationValueCounts, variationKey);\n\n const itemAggregate = items.get(itemKey) ?? {\n item_id: itemId,\n title,\n seller_sku: sellerSku,\n variation_summary: variationSummary,\n orders: 0,\n units: 0,\n revenue_by_currency: {},\n sale_fee_by_currency: {},\n };\n itemAggregate.orders += 1;\n itemAggregate.units += quantity;\n incrementCurrency(itemAggregate.revenue_by_currency, currencyId, unitPrice * quantity);\n incrementCurrency(itemAggregate.sale_fee_by_currency, currencyId, saleFee);\n items.set(itemKey, itemAggregate);\n\n const variationAggregate = variations.get(variationKey) ?? {\n variation_summary: variationSummary,\n orders: 0,\n units: 0,\n revenue_by_currency: {},\n };\n variationAggregate.orders += 1;\n variationAggregate.units += quantity;\n incrementCurrency(variationAggregate.revenue_by_currency, currencyId, unitPrice * quantity);\n variations.set(variationKey, variationAggregate);\n\n const skuAggregate = skus.get(skuKey) ?? {\n seller_sku: sellerSku,\n orders: 0,\n units: 0,\n revenue_by_currency: {},\n };\n skuAggregate.orders += 1;\n skuAggregate.units += quantity;\n incrementCurrency(skuAggregate.revenue_by_currency, currencyId, unitPrice * quantity);\n skus.set(skuKey, skuAggregate);\n\n const skuEconomicsAggregate = skuEconomics.get(skuKey) ?? {\n seller_sku: sellerSku,\n item_id: itemId,\n title,\n orders: 0,\n units: 0,\n cancelled_orders: 0,\n refunded_orders: 0,\n revenue_by_currency: {},\n paid_revenue_by_currency: {},\n sale_fee_by_currency: {},\n refunded_amount_by_currency: {},\n };\n skuEconomicsAggregate.orders += 1;\n skuEconomicsAggregate.units += quantity;\n if (isCancelled) {\n skuEconomicsAggregate.cancelled_orders += 1;\n }\n if (refundedAmount > 0) {\n skuEconomicsAggregate.refunded_orders += 1;\n }\n incrementCurrency(skuEconomicsAggregate.revenue_by_currency, currencyId, itemRevenue);\n incrementCurrency(skuEconomicsAggregate.paid_revenue_by_currency, currencyId, paidRevenueApprox);\n incrementCurrency(skuEconomicsAggregate.sale_fee_by_currency, currencyId, saleFee);\n incrementCurrency(skuEconomicsAggregate.refunded_amount_by_currency, currencyId, refundedAmountApprox);\n skuEconomics.set(skuKey, skuEconomicsAggregate);\n }\n\n financialRaw[currencyId].distinctItems += orderItemDistinctIds.size;\n }\n\n const financialByCurrency: Record<string, CurrencyCalculation> = {};\n for (const [currencyId, raw] of Object.entries(financialRaw)) {\n financialByCurrency[currencyId] = {\n revenue_total: roundMoney(raw.revenue),\n paid_amount_total: roundMoney(raw.paidAmount),\n payment_total_paid_amount: roundMoney(raw.paymentTotalPaidAmount),\n transaction_amount_total: roundMoney(raw.transactionAmount),\n coupon_amount_total: roundMoney(raw.couponAmount),\n sale_fee_total: roundMoney(raw.saleFee),\n avg_order_value: roundMoney(raw.revenue / Math.max(1, raw.orders)),\n avg_paid_amount_per_order: roundMoney(raw.paidAmount / Math.max(1, raw.orders)),\n avg_units_per_order: roundMoney(raw.units / Math.max(1, raw.orders)),\n avg_distinct_items_per_order: roundMoney(raw.distinctItems / Math.max(1, raw.orders)),\n avg_sale_fee_per_order: roundMoney(raw.saleFee / Math.max(1, raw.orders)),\n sale_fee_rate: safeRate(raw.saleFee, raw.revenue),\n };\n }\n\n const topItemsByRevenue = Array.from(items.values())\n .sort((left, right) => {\n const leftRevenue = Object.values(left.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n const rightRevenue = Object.values(right.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n return rightRevenue - leftRevenue || left.item_id.localeCompare(right.item_id);\n })\n .slice(0, TOP_LIMIT)\n .map((item) => ({\n ...item,\n revenue_by_currency: sortedCurrencyTotals(item.revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(item.sale_fee_by_currency),\n }));\n\n const topItemsByUnits = Array.from(items.values())\n .sort((left, right) => right.units - left.units || left.item_id.localeCompare(right.item_id))\n .slice(0, TOP_LIMIT)\n .map((item) => ({\n ...item,\n revenue_by_currency: sortedCurrencyTotals(item.revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(item.sale_fee_by_currency),\n }));\n\n const topItemsByOrders = Array.from(items.values())\n .sort((left, right) => right.orders - left.orders || left.item_id.localeCompare(right.item_id))\n .slice(0, TOP_LIMIT)\n .map((item) => ({\n ...item,\n revenue_by_currency: sortedCurrencyTotals(item.revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(item.sale_fee_by_currency),\n }));\n\n const topVariations = Array.from(variations.values())\n .filter((variation) => variation.variation_summary)\n .sort((left, right) => right.units - left.units || left.variation_summary.localeCompare(right.variation_summary))\n .slice(0, TOP_LIMIT)\n .map((variation) => ({\n ...variation,\n revenue_by_currency: sortedCurrencyTotals(variation.revenue_by_currency),\n }));\n\n const topSkus = Array.from(skus.values())\n .filter((sku) => sku.seller_sku)\n .sort((left, right) => right.units - left.units || left.seller_sku.localeCompare(right.seller_sku))\n .slice(0, TOP_LIMIT)\n .map((sku) => ({\n ...sku,\n revenue_by_currency: sortedCurrencyTotals(sku.revenue_by_currency),\n }));\n\n const topBuyersByRevenue = Array.from(buyers.values())\n .sort((left, right) => {\n const leftRevenue = Object.values(left.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n const rightRevenue = Object.values(right.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n return rightRevenue - leftRevenue || left.buyer_id.localeCompare(right.buyer_id);\n })\n .slice(0, TOP_LIMIT)\n .map((buyer) => ({\n ...buyer,\n revenue_by_currency: sortedCurrencyTotals(buyer.revenue_by_currency),\n }));\n\n const topBuyersByOrders = Array.from(buyers.values())\n .sort((left, right) => right.orders - left.orders || left.buyer_id.localeCompare(right.buyer_id))\n .slice(0, TOP_LIMIT)\n .map((buyer) => ({\n ...buyer,\n revenue_by_currency: sortedCurrencyTotals(buyer.revenue_by_currency),\n }));\n\n const buyersWithMultipleOrders = Array.from(buyers.values()).filter((buyer) => buyer.orders > 1).length;\n\n const topVariationValues = Array.from(variationValueCounts.entries())\n .filter(([key]) => key && key !== \"NO_VARIATION\")\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))\n .slice(0, TOP_LIMIT)\n .map(([key, occurrences]) => ({ key, occurrences }));\n\n const topSingleValue = (counts: Map<string, number>) =>\n Array.from(counts.entries())\n .filter(([key]) => key)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))[0]?.[0] ?? \"\";\n\n const revenueQuality = {\n by_currency: sortedCurrencyMetrics(currencyMetrics, (bucket) => ({\n gross_gmv: roundMoney(bucket.revenue),\n paid_gmv: roundMoney(bucket.paidRevenue),\n payment_total_paid_amount: roundMoney(bucket.paymentTotalPaid),\n transaction_amount_total: roundMoney(bucket.transactionAmount),\n refunded_amount_total: roundMoney(bucket.refundedAmount),\n net_after_refunds: roundMoney(bucket.transactionAmount - bucket.refundedAmount),\n cancelled_gmv: roundMoney(bucket.cancelledGmv),\n cancelled_rate_by_orders: safeRate(bucket.cancelledOrders, bucket.orders),\n cancelled_rate_by_gmv: safeRate(bucket.cancelledGmv, bucket.revenue),\n paid_rate_by_gmv: safeRate(bucket.paidRevenue, bucket.revenue),\n })),\n };\n\n const refundsCancellations = {\n by_currency: sortedCurrencyMetrics(currencyMetrics, (bucket) => ({\n refunded_amount_total: roundMoney(bucket.refundedAmount),\n refunded_orders: bucket.refundedOrders,\n refund_rate_by_orders: safeRate(bucket.refundedOrders, bucket.orders),\n refund_rate_by_transaction_amount: safeRate(bucket.refundedAmount, bucket.transactionAmount),\n cancelled_orders: bucket.cancelledOrders,\n cancelled_gmv: roundMoney(bucket.cancelledGmv),\n cancelled_rate_by_orders: safeRate(bucket.cancelledOrders, bucket.orders),\n cancelled_rate_by_gmv: safeRate(bucket.cancelledGmv, bucket.revenue),\n })),\n cancel_group_breakdown: topBreakdownFromMap(cancelGroupCounts, ordersTotal),\n cancel_code_breakdown: topBreakdownFromMap(cancelCodeCounts, ordersTotal),\n cancel_requested_by_breakdown: topBreakdownFromMap(cancelRequestedByCounts, ordersTotal),\n top_cancel_reasons: topAmountBreakdownFromMap(cancelReasonCounts, cancelReasonAmounts, ordersTotal),\n };\n\n const shippingAndDiscounts = {\n by_currency: sortedCurrencyMetrics(currencyMetrics, (bucket) => ({\n buyer_shipping_paid_total: roundMoney(bucket.shippingCost),\n orders_with_shipping_cost: bucket.ordersWithShippingCost,\n avg_shipping_paid_by_order_with_cost: roundMoney(bucket.shippingCost / Math.max(1, bucket.ordersWithShippingCost)),\n shipping_cost_rate_on_paid_gmv: safeRate(bucket.shippingCost, bucket.paidRevenue),\n coupon_amount_total: roundMoney(bucket.couponAmount),\n payment_coupon_amount_total: roundMoney(bucket.paymentCouponAmount),\n orders_with_coupon: bucket.ordersWithCoupon,\n coupon_rate_by_orders: safeRate(bucket.ordersWithCoupon, bucket.orders),\n coupon_rate_on_gmv: safeRate(bucket.couponAmount + bucket.paymentCouponAmount, bucket.revenue),\n discounted_orders: bucket.discountedOrders,\n discounted_order_rate: safeRate(bucket.discountedOrders, bucket.orders),\n discounted_gmv: roundMoney(bucket.discountedGmv),\n not_delivered_orders: bucket.notDeliveredOrders,\n not_delivered_gmv: roundMoney(bucket.notDeliveredGmv),\n not_delivered_rate_by_orders: safeRate(bucket.notDeliveredOrders, bucket.orders),\n not_delivered_rate_by_gmv: safeRate(bucket.notDeliveredGmv, bucket.revenue),\n })),\n };\n\n const dailyTrend = Array.from(dailyMetrics.entries())\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([date, byCurrency]) => ({\n date,\n by_currency: sortedCurrencyMetrics(byCurrency, (bucket) => ({\n orders: bucket.orders,\n units: bucket.units,\n revenue: roundMoney(bucket.revenue),\n paid_revenue: roundMoney(bucket.paidRevenue),\n cancelled_orders: bucket.cancelledOrders,\n refunded_amount: roundMoney(bucket.refundedAmount),\n avg_order_value: roundMoney(bucket.revenue / Math.max(1, bucket.orders)),\n })),\n }));\n\n const flowPerformance = Array.from(flowMetrics.values())\n .sort((left, right) => revenueSum(right.revenue_by_currency) - revenueSum(left.revenue_by_currency) || left.flow.localeCompare(right.flow))\n .slice(0, TOP_LIMIT)\n .map((flow) => ({\n flow: flow.flow,\n orders: flow.orders,\n units: flow.units,\n revenue_by_currency: sortedCurrencyTotals(flow.revenue_by_currency),\n paid_revenue_by_currency: sortedCurrencyTotals(flow.paid_revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(flow.sale_fee_by_currency),\n cancelled_orders: flow.cancelled_orders,\n cancelled_rate: safeRate(flow.cancelled_orders, flow.orders),\n fee_rate_by_currency: Object.fromEntries(\n Object.keys(flow.revenue_by_currency)\n .sort((left, right) => left.localeCompare(right))\n .map((currencyId) => [currencyId, safeRate(flow.sale_fee_by_currency[currencyId] ?? 0, flow.revenue_by_currency[currencyId] ?? 0)])\n ),\n }));\n\n const skuUnitEconomics = Array.from(skuEconomics.values())\n .sort((left, right) => revenueSum(right.revenue_by_currency) - revenueSum(left.revenue_by_currency) || left.seller_sku.localeCompare(right.seller_sku))\n .slice(0, TOP_LIMIT)\n .map((sku) => ({\n seller_sku: sku.seller_sku,\n item_id: sku.item_id,\n title: sku.title,\n orders: sku.orders,\n units: sku.units,\n revenue_by_currency: sortedCurrencyTotals(sku.revenue_by_currency),\n paid_revenue_by_currency: sortedCurrencyTotals(sku.paid_revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(sku.sale_fee_by_currency),\n refunded_amount_by_currency: sortedCurrencyTotals(sku.refunded_amount_by_currency),\n avg_unit_price_by_currency: Object.fromEntries(\n Object.keys(sku.revenue_by_currency)\n .sort((left, right) => left.localeCompare(right))\n .map((currencyId) => [currencyId, roundMoney((sku.revenue_by_currency[currencyId] ?? 0) / Math.max(1, sku.units))])\n ),\n fee_rate_by_currency: Object.fromEntries(\n Object.keys(sku.revenue_by_currency)\n .sort((left, right) => left.localeCompare(right))\n .map((currencyId) => [currencyId, safeRate(sku.sale_fee_by_currency[currencyId] ?? 0, sku.revenue_by_currency[currencyId] ?? 0)])\n ),\n cancelled_orders: sku.cancelled_orders,\n cancelled_rate: safeRate(sku.cancelled_orders, sku.orders),\n refunded_orders: sku.refunded_orders,\n refund_rate: safeRate(sku.refunded_orders, sku.orders),\n }));\n\n const feeDiagnostics = {\n sale_fee_assumption: \"order_items.sale_fee is used as returned by MercadoLibre and is not multiplied by quantity yet.\",\n multi_unit_item_lines: multiUnitItemLines,\n multi_unit_sale_fee_observations: multiUnitSaleFeeObservations,\n needs_sale_fee_granularity_validation: true,\n };\n\n return {\n overview: {\n orders_total: ordersTotal,\n units_total: unitsTotal,\n distinct_items_total: itemsSeen.size,\n distinct_buyers_total: buyerSeen.size,\n fulfilled_orders: fulfilledOrders,\n delivered_orders: deliveredOrders,\n pack_orders: packOrders,\n orders_with_discount: discountedOrders,\n orders_with_feedback: ordersWithFeedback,\n orders_with_change_request: ordersWithChangeRequest,\n orders_with_return_request: ordersWithReturnRequest,\n },\n financial_by_currency: financialByCurrency,\n revenue_quality: revenueQuality,\n refunds_cancellations: refundsCancellations,\n shipping_and_discounts: shippingAndDiscounts,\n daily_trend: dailyTrend,\n flow_performance: flowPerformance,\n sku_unit_economics: skuUnitEconomics,\n fee_diagnostics: feeDiagnostics,\n order_mix: {\n status_breakdown: topBreakdownFromMap(statusCounts, ordersTotal),\n tags_breakdown: topBreakdownFromMap(tagCounts, ordersTotal),\n channel_breakdown: topBreakdownFromMap(channelCounts, ordersTotal),\n site_breakdown: topBreakdownFromMap(siteCounts, ordersTotal),\n single_item_order_rate: safeRate(singleItemOrders, ordersTotal),\n multi_item_order_rate: safeRate(multiItemOrders, ordersTotal),\n fulfilled_rate: safeRate(fulfilledOrders, ordersTotal),\n delivered_rate: safeRate(deliveredOrders, ordersTotal),\n pack_order_rate: safeRate(packOrders, ordersTotal),\n discounted_order_rate: safeRate(discountedOrders, ordersTotal),\n catalog_order_rate: safeRate(catalogOrders, ordersTotal),\n },\n payment_mix: {\n payment_status_breakdown: topBreakdownFromMap(paymentStatusCounts, ordersTotal),\n payment_status_detail_breakdown: topBreakdownFromMap(paymentStatusDetailCounts, ordersTotal),\n payment_method_breakdown: topBreakdownFromMap(paymentMethodCounts, ordersTotal),\n payment_type_breakdown: topBreakdownFromMap(paymentTypeCounts, ordersTotal),\n installments_breakdown: topBreakdownFromMap(installmentsCounts, ordersTotal),\n payment_approved_rate: safeRate(paymentApprovedOrders, ordersTotal),\n orders_without_payment_data: ordersWithoutPaymentData,\n },\n fulfillment: {\n orders_with_shipping: ordersWithShipping,\n shipping_attached_rate: safeRate(ordersWithShipping, ordersTotal),\n shipping_id_coverage: ordersWithShipping,\n stock_node_breakdown: topBreakdownFromMap(stockNodeCounts, Math.max(1, itemLineCount)),\n listing_type_breakdown: topBreakdownFromMap(listingTypeCounts, Math.max(1, itemLineCount)),\n },\n post_sale_friction: {\n orders_with_feedback_rate: safeRate(ordersWithFeedback, ordersTotal),\n feedback_buyer_count: feedbackBuyerCount,\n feedback_seller_count: feedbackSellerCount,\n change_request_rate: safeRate(ordersWithChangeRequest, ordersTotal),\n return_request_rate: safeRate(ordersWithReturnRequest, ordersTotal),\n orders_with_any_post_sale_issue_rate: safeRate(ordersWithAnyPostSaleIssue, ordersTotal),\n },\n product_insights: {\n top_items_by_revenue: topItemsByRevenue,\n top_items_by_units: topItemsByUnits,\n top_items_by_orders: topItemsByOrders,\n top_variations: topVariations,\n top_skus: topSkus,\n top_listing_types: topBreakdownFromMap(listingTypeCounts, Math.max(1, itemLineCount)),\n top_stock_nodes: topBreakdownFromMap(stockNodeCounts, Math.max(1, itemLineCount)),\n },\n customer_insights: {\n top_buyers_by_revenue: topBuyersByRevenue,\n top_buyers_by_orders: topBuyersByOrders,\n repeat_buyer_rate: safeRate(buyersWithMultipleOrders, buyerSeen.size),\n buyers_with_multiple_orders: buyersWithMultipleOrders,\n },\n operational_context: {\n most_used_payment_method: topSingleValue(paymentMethodCounts),\n most_used_listing_type: topSingleValue(listingTypeCounts),\n most_used_stock_node: topSingleValue(stockNodeCounts),\n most_used_channel: topSingleValue(channelCounts),\n most_common_tag: topSingleValue(tagCounts),\n most_common_variation_values: topVariationValues,\n },\n coverage: {\n fetch_mode: metadata.fetch_mode,\n universe_fully_fetched: metadata.universe_fully_fetched,\n orders_returned: metadata.returned,\n pages_requested: metadata.pages_requested,\n pages_succeeded: metadata.pages_succeeded,\n pages_failed: metadata.pages_failed,\n failed_pages_count: failedPages.length,\n failed_pages: failedPages,\n },\n };\n}\n\nfunction buildOrdersSummaryMetadata(params: {\n total: number;\n effectiveLimit: number;\n effectiveOffset: number;\n returned: number;\n responseMode: \"calculations\" | \"orders_chunk\";\n pagesRequested: number;\n pagesSucceeded: number;\n pagesFailed: number;\n failedOffsets: number[];\n}) {\n const requestedWindowEndOffset = params.effectiveOffset + params.effectiveLimit * params.pagesRequested;\n const nextOffset = params.responseMode === \"orders_chunk\" ? requestedWindowEndOffset : params.effectiveOffset + params.returned;\n const hasMoreOrders = nextOffset < params.total;\n const universeFullyFetched =\n params.responseMode === \"calculations\" && params.pagesFailed === 0 && params.returned >= params.total;\n\n let continuation = \"No more pages for this query.\";\n if (params.pagesFailed > 0) {\n const offsets = params.failedOffsets.slice(0, 5).join(\", \");\n const moreOffsets =\n params.failedOffsets.length > 5\n ? ` y ${params.failedOffsets.length - 5} offsets adicionales`\n : \"\";\n continuation = params.responseMode === \"orders_chunk\"\n ? `Se recuperaron paginas parciales. Reintentar primero la misma tool con responseMode=\"orders_chunk\", offset=${params.failedOffsets[0]} y limit=${params.effectiveLimit}. Offsets fallidos: ${offsets}${moreOffsets}. Luego continuar con offset=${nextOffset} si hace falta.`\n : `Calculos parciales por paginas fallidas. Reintentar la misma tool con responseMode=\"calculations\". Offsets fallidos: ${offsets}${moreOffsets}.`;\n } else if (params.responseMode === \"orders_chunk\" && hasMoreOrders) {\n continuation = `Para continuar trayendo ordenes, volver a invocar meli_get_orders_summary con los mismos filtros, responseMode=\"orders_chunk\", offset=${nextOffset} y limit=${params.effectiveLimit}. Repetir hasta has_more=false.`;\n } else if (params.responseMode === \"calculations\") {\n continuation = 'Calculos completos. Si el usuario pide detalle de ordenes, invocar la misma tool con responseMode=\"orders_chunk\", offset=0 y limit=50.';\n }\n\n return {\n total: params.total,\n limit: params.effectiveLimit,\n offset: params.effectiveOffset,\n returned: params.returned,\n has_more: params.responseMode === \"orders_chunk\" ? hasMoreOrders || params.pagesFailed > 0 : params.pagesFailed > 0,\n next_offset: params.responseMode === \"orders_chunk\" && hasMoreOrders ? nextOffset : undefined,\n continuation,\n fetch_mode: params.responseMode === \"orders_chunk\" ? \"orders_chunk\" : \"full_calculations\",\n pages_per_call_limit: params.responseMode === \"orders_chunk\" ? ORDER_DETAIL_MAX_PAGES_PER_CALL : undefined,\n pages_requested: params.pagesRequested,\n pages_succeeded: params.pagesSucceeded,\n pages_failed: params.pagesFailed,\n universe_fully_fetched: universeFullyFetched,\n };\n}\n\nfunction formatCompactOrder(\n order: Record<string, unknown>,\n metricsByCurrency: Record<string, { orders: number; revenue: number; avg_order_value: number }>\n) {\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\n const totalAmount = toNumber(order.total_amount);\n const paidAmount = toNumber(order.paid_amount);\n const bucket = currencyBucket(metricsByCurrency, currencyId, createMetricsBucket);\n bucket.orders += 1;\n bucket.revenue += totalAmount;\n bucket.avg_order_value = bucket.orders > 0 ? bucket.revenue / bucket.orders : 0;\n\n const orderItems = asArray<Record<string, unknown>>(order.order_items);\n const firstOrderItem = asRecord(orderItems[0]);\n const firstItem = asRecord(firstOrderItem.item);\n const firstPayment = asRecord(asArray<Record<string, unknown>>(order.payments)[0]);\n const shipping = asRecord(order.shipping);\n const buyer = asRecord(order.buyer);\n const seller = asRecord(order.seller);\n const context = asRecord(order.context);\n const feedback = asRecord(order.feedback);\n const orderRequest = asRecord(order.order_request);\n const coupon = asRecord(order.coupon);\n const stock = asRecord(firstOrderItem.stock);\n\n return [\n normalizeScalarString(order.id),\n compactDateTime(order.date_created),\n normalizeString(order.status),\n totalAmount,\n currencyId,\n normalizeString(buyer.nickname) || normalizeScalarString(buyer.id),\n normalizeString(shipping.status),\n orderItems.length,\n compactDateTime(order.date_closed),\n compactDateTime(order.date_last_updated) || compactDateTime(order.last_updated),\n paidAmount,\n normalizeScalarString(buyer.id),\n normalizeString(seller.nickname) || normalizeScalarString(seller.id),\n normalizeScalarString(seller.id),\n normalizeScalarString(shipping.id),\n normalizeScalarString(order.pack_id),\n Boolean(order.fulfilled),\n compactStringList(order.tags),\n normalizeString(context.channel),\n normalizeString(context.site),\n normalizeScalarString(firstPayment.id),\n normalizeString(firstPayment.status),\n normalizeString(firstPayment.status_detail),\n normalizeString(firstPayment.payment_method_id),\n normalizeString(firstPayment.payment_type),\n toNumber(firstPayment.total_paid_amount),\n toNumber(firstPayment.transaction_amount),\n toNumber(firstPayment.installments),\n toNumber(coupon.amount),\n compactStringList(firstPayment.available_actions),\n compactNestedValue(feedback.buyer),\n compactNestedValue(feedback.seller),\n compactNestedValue(orderRequest.change),\n compactNestedValue(orderRequest.return),\n normalizeString(firstItem.id),\n normalizeString(firstItem.title),\n normalizeString(firstItem.seller_sku),\n toNumber(firstOrderItem.quantity),\n toNumber(firstOrderItem.unit_price),\n toNumber(firstOrderItem.sale_fee),\n normalizeString(firstOrderItem.listing_type_id),\n compactVariationAttributes(firstItem.variation_attributes),\n normalizeString(stock.node_id),\n ];\n}\n\nexport const meliGetOrdersSummarySchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n startDate: z.string().regex(mercadoLibreDateRegex).describe(\"Start date in YYYY-MM-DD format.\"),\n endDate: z.string().regex(mercadoLibreDateRegex).describe(\"End date in YYYY-MM-DD format.\"),\n status: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre order status filter.\"),\n q: z.string().trim().min(1).optional().describe(\"Optional free-text search query supported by MercadoLibre orders search.\"),\n sort: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre sort expression.\"),\n responseMode: z.enum([\"calculations\", \"orders_chunk\"]).optional().default(\"calculations\").describe(\"Response mode. calculations (default) fetches all matching orders internally and returns only aggregate KPIs. orders_chunk returns compact order rows for up to 15 MercadoLibre pages and includes continuation metadata.\"),\n offset: z.number().int().min(0).max(5000).optional().describe(\"Starting offset for responseMode=orders_chunk. Use metadata.next_offset to continue.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"MercadoLibre page size for responseMode=orders_chunk (1-50). Defaults to 50.\"),\n});\n\nexport async function meliGetOrdersSummaryHandler(\n params: z.infer<typeof meliGetOrdersSummarySchema>\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 responseMode = params.responseMode ?? \"calculations\";\n const requestedLimit = responseMode === \"orders_chunk\" ? params.limit ?? DEFAULT_ORDER_DETAIL_PAGE_LIMIT : DEFAULT_ORDER_DETAIL_PAGE_LIMIT;\n const requestedOffset = responseMode === \"orders_chunk\" ? params.offset ?? 0 : 0;\n const response = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n q: params.q,\n sort: params.sort,\n offset: requestedOffset,\n limit: requestedLimit,\n });\n\n const paging = normalizeMercadoLibrePaging(asRecord(response.paging));\n const baseOrders = asArray<Record<string, unknown>>(response.results);\n const metricsByCurrency: Record<string, { orders: number; revenue: number; avg_order_value: number }> = {};\n const effectiveLimit = paging.limit || requestedLimit || baseOrders.length;\n const effectiveOffset = paging.offset || requestedOffset || 0;\n const maxPagesForResponse = responseMode === \"orders_chunk\" ? ORDER_DETAIL_MAX_PAGES_PER_CALL : Infinity;\n\n const allOrders = [...baseOrders];\n const failedPages: FailedPage[] = [];\n let pagesRequested = 1;\n let pagesSucceeded = 1;\n\n if (effectiveLimit > 0 && paging.total > baseOrders.length) {\n const nextOffsets: number[] = [];\n const maxPagesRemaining = Math.max(0, maxPagesForResponse - 1);\n let pagesAdded = 0;\n\n for (let nextOffset = effectiveOffset + effectiveLimit; nextOffset < paging.total; nextOffset += effectiveLimit) {\n if (responseMode === \"orders_chunk\" && pagesAdded >= maxPagesRemaining) {\n break;\n }\n\n nextOffsets.push(nextOffset);\n pagesAdded += 1;\n }\n\n pagesRequested += nextOffsets.length;\n\n if (nextOffsets.length > 0) {\n const batch = await searchMercadoLibreOrdersBatch(\n profileId,\n {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n q: params.q,\n sort: params.sort,\n limit: effectiveLimit,\n },\n nextOffsets,\n {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }\n );\n\n pagesSucceeded += batch.successful.length;\n batch.successful.forEach((entry) => {\n allOrders.push(...asArray<Record<string, unknown>>(entry.document.results));\n });\n batch.failed.forEach((failure) => {\n const failedOffset = Number(failure.id);\n failedPages.push({\n offset: failedOffset,\n limit: effectiveLimit,\n page_number: Math.floor(failedOffset / effectiveLimit) + 1,\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n }\n }\n\n const compactOrders = responseMode === \"orders_chunk\"\n ? allOrders.map((order) => formatCompactOrder(order, metricsByCurrency))\n : [];\n\n if (responseMode === \"calculations\") {\n for (const order of allOrders) {\n formatCompactOrder(order, metricsByCurrency);\n }\n }\n\n for (const metrics of Object.values(metricsByCurrency)) {\n metrics.revenue = roundMoney(metrics.revenue);\n metrics.avg_order_value = roundMoney(metrics.avg_order_value);\n }\n\n const returned = responseMode === \"orders_chunk\" ? compactOrders.length : allOrders.length;\n const metadata = buildOrdersSummaryMetadata({\n total: paging.total,\n effectiveLimit,\n effectiveOffset,\n returned,\n responseMode,\n pagesRequested,\n pagesSucceeded,\n pagesFailed: failedPages.length,\n failedOffsets: failedPages.map((failure) => failure.offset),\n });\n\n const calculations = responseMode === \"calculations\" ? buildCalculations(allOrders, metadata, failedPages) : undefined;\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: responseMode === \"orders_chunk\"\n ? {\n ...buildMercadoLibrePaginationMetadata({\n total: paging.total,\n limit: effectiveLimit,\n offset: effectiveOffset,\n returned: compactOrders.length,\n nextField: \"offset\",\n }),\n ...metadata,\n }\n : metadata,\n metrics_by_currency: metricsByCurrency,\n orders_schema: responseMode === \"orders_chunk\" ? ordersSchema : undefined,\n orders: responseMode === \"orders_chunk\" ? compactOrders : undefined,\n calculations,\n failed_pages: failedPages.length > 0 ? failedPages : undefined,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to fetch MercadoLibre orders summary\"));\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport {\n buildMercadoLibrePaginationMetadata,\n formatMercadoLibreError,\n normalizeMercadoLibrePaging,\n} from \"../../services/mercadolibre/mercadolibre-api.js\";\nimport {\n searchMercadoLibreOrders,\n searchMercadoLibreOrdersBatch,\n} from \"../../services/mercadolibre/mercadolibre-orders.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport {\n asArray,\n asRecord,\n compactDateTime,\n currencyBucket,\n mercadoLibreDateRegex,\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 PAGE_FETCH_CONCURRENCY = 15;\nconst PAGE_FETCH_MAX_RETRIES = 2;\nconst ORDER_DETAIL_MAX_PAGES_PER_CALL = 15;\nconst DEFAULT_ORDER_DETAIL_PAGE_LIMIT = 50;\nconst TOP_LIMIT = 10;\n\nconst ordersSchema = [\n \"id\",\n \"date_created\",\n \"status\",\n \"total_amount\",\n \"currency\",\n \"buyer\",\n \"shipping_status\",\n \"items\",\n \"date_closed\",\n \"last_updated\",\n \"paid_amount\",\n \"buyer_id\",\n \"seller\",\n \"seller_id\",\n \"shipping_id\",\n \"pack_id\",\n \"fulfilled\",\n \"tags\",\n \"channel\",\n \"site\",\n \"payment_id\",\n \"payment_status\",\n \"payment_status_detail\",\n \"payment_method\",\n \"payment_type\",\n \"payment_total_paid\",\n \"payment_transaction_amount\",\n \"installments\",\n \"coupon_amount\",\n \"available_actions\",\n \"feedback_buyer\",\n \"feedback_seller\",\n \"order_request_change\",\n \"order_request_return\",\n \"first_item_id\",\n \"first_item_title\",\n \"first_item_sku\",\n \"first_item_quantity\",\n \"first_item_unit_price\",\n \"first_item_sale_fee\",\n \"first_item_listing_type\",\n \"variation_attributes\",\n \"stock_node_id\",\n \"payment_shipping_cost\",\n \"payment_coupon_amount\",\n] as const;\n\nfunction compactStringList(values: unknown, separator = \" | \"): string {\n return asArray(values)\n .map((value) => normalizeScalarString(value).trim())\n .filter(Boolean)\n .join(separator);\n}\n\nfunction compactNestedValue(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n\n const scalar = normalizeScalarString(value);\n if (scalar) {\n return scalar;\n }\n\n if (Array.isArray(value)) {\n return value\n .map((entry) => compactNestedValue(entry))\n .filter(Boolean)\n .join(\" | \");\n }\n\n const record = asRecord(value);\n return Object.entries(record)\n .map(([key, entryValue]) => {\n const normalized = compactNestedValue(entryValue);\n return normalized ? `${key}:${normalized}` : \"\";\n })\n .filter(Boolean)\n .join(\" | \");\n}\n\nfunction compactVariationAttributes(value: unknown): string {\n return asArray<Record<string, unknown>>(value)\n .map((attribute) => {\n const name = normalizeString(attribute.name) || normalizeString(attribute.id);\n const normalizedValue =\n normalizeString(attribute.value_name) ||\n normalizeString(attribute.value_id) ||\n normalizeScalarString(attribute.value);\n\n if (!name || !normalizedValue) {\n return \"\";\n }\n\n return `${name}: ${normalizedValue}`;\n })\n .filter(Boolean)\n .join(\" | \");\n}\n\nfunction createMetricsBucket() {\n return {\n orders: 0,\n revenue: 0,\n avg_order_value: 0,\n };\n}\n\ntype FailedPage = {\n offset: number;\n limit: number;\n page_number: number;\n message: string;\n status_code?: number;\n attempts: number;\n retryable: boolean;\n};\n\ntype OrderSummaryMetadata = ReturnType<typeof buildOrdersSummaryMetadata>;\n\ntype BreakdownEntry = {\n key: string;\n orders: number;\n rate: number;\n};\n\ntype BreakdownResult = {\n entries: BreakdownEntry[];\n other_orders?: number;\n other_rate?: number;\n};\n\ntype CurrencyCalculation = {\n revenue_total: number;\n paid_amount_total: number;\n payment_total_paid_amount: number;\n transaction_amount_total: number;\n coupon_amount_total: number;\n sale_fee_total: number;\n avg_order_value: number;\n avg_paid_amount_per_order: number;\n avg_units_per_order: number;\n avg_distinct_items_per_order: number;\n avg_sale_fee_per_order: number;\n sale_fee_rate: number;\n};\n\ntype BuyerAggregate = {\n buyer_id: string;\n nickname: string;\n orders: number;\n revenue_by_currency: Record<string, number>;\n};\n\ntype ItemAggregate = {\n item_id: string;\n title: string;\n seller_sku: string;\n variation_summary: string;\n orders: number;\n units: number;\n revenue_by_currency: Record<string, number>;\n sale_fee_by_currency: Record<string, number>;\n};\n\ntype VariationAggregate = {\n variation_summary: string;\n orders: number;\n units: number;\n revenue_by_currency: Record<string, number>;\n};\n\ntype SkuAggregate = {\n seller_sku: string;\n orders: number;\n units: number;\n revenue_by_currency: Record<string, number>;\n};\n\ntype CurrencyMetricBucket = {\n orders: number;\n units: number;\n revenue: number;\n paidRevenue: number;\n paymentTotalPaid: number;\n transactionAmount: number;\n refundedAmount: number;\n cancelledGmv: number;\n saleFee: number;\n shippingCost: number;\n couponAmount: number;\n paymentCouponAmount: number;\n discountedGmv: number;\n notDeliveredGmv: number;\n cancelledOrders: number;\n refundedOrders: number;\n ordersWithShippingCost: number;\n ordersWithCoupon: number;\n discountedOrders: number;\n notDeliveredOrders: number;\n};\n\ntype FlowAggregate = {\n flow: string;\n orders: number;\n units: number;\n cancelled_orders: number;\n revenue_by_currency: Record<string, number>;\n paid_revenue_by_currency: Record<string, number>;\n sale_fee_by_currency: Record<string, number>;\n};\n\ntype SkuEconomicsAggregate = {\n seller_sku: string;\n item_id: string;\n title: string;\n orders: number;\n units: number;\n cancelled_orders: number;\n refunded_orders: number;\n revenue_by_currency: Record<string, number>;\n paid_revenue_by_currency: Record<string, number>;\n sale_fee_by_currency: Record<string, number>;\n refunded_amount_by_currency: Record<string, number>;\n};\n\nfunction safeRate(numerator: number, denominator: number): number {\n if (!Number.isFinite(denominator) || denominator <= 0) {\n return 0;\n }\n\n return Number((numerator / denominator).toFixed(4));\n}\n\nfunction topBreakdownFromMap(\n counts: Map<string, number>,\n totalOrders: number,\n limit = TOP_LIMIT\n): BreakdownResult {\n const sorted = Array.from(counts.entries())\n .filter(([, count]) => count > 0)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]));\n\n const entries = sorted.slice(0, limit).map(([key, orders]) => ({\n key,\n orders,\n rate: safeRate(orders, totalOrders),\n }));\n\n const otherOrders = sorted.slice(limit).reduce((sum, [, count]) => sum + count, 0);\n return stripNulls({\n entries,\n other_orders: otherOrders > 0 ? otherOrders : undefined,\n other_rate: otherOrders > 0 ? safeRate(otherOrders, totalOrders) : undefined,\n }) as BreakdownResult;\n}\n\nfunction incrementCount(map: Map<string, number>, key: string) {\n if (!key) {\n return;\n }\n\n map.set(key, (map.get(key) ?? 0) + 1);\n}\n\nfunction incrementCurrency(map: Record<string, number>, currencyId: string, amount: number) {\n map[currencyId] = roundMoney((map[currencyId] ?? 0) + amount);\n}\n\nfunction sortedCurrencyTotals(input: Record<string, number>) {\n return Object.fromEntries(\n Object.entries(input)\n .filter(([, amount]) => amount !== 0)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currency, amount]) => [currency, roundMoney(amount)])\n );\n}\n\nfunction createCurrencyMetricBucket(): CurrencyMetricBucket {\n return {\n orders: 0,\n units: 0,\n revenue: 0,\n paidRevenue: 0,\n paymentTotalPaid: 0,\n transactionAmount: 0,\n refundedAmount: 0,\n cancelledGmv: 0,\n saleFee: 0,\n shippingCost: 0,\n couponAmount: 0,\n paymentCouponAmount: 0,\n discountedGmv: 0,\n notDeliveredGmv: 0,\n cancelledOrders: 0,\n refundedOrders: 0,\n ordersWithShippingCost: 0,\n ordersWithCoupon: 0,\n discountedOrders: 0,\n notDeliveredOrders: 0,\n };\n}\n\nfunction incrementCurrencyMetric(\n map: Record<string, CurrencyMetricBucket>,\n currencyId: string,\n updater: (bucket: CurrencyMetricBucket) => void\n) {\n map[currencyId] = map[currencyId] ?? createCurrencyMetricBucket();\n updater(map[currencyId]);\n}\n\nfunction sortedCurrencyMetrics(\n input: Record<string, CurrencyMetricBucket>,\n mapper: (bucket: CurrencyMetricBucket) => Record<string, number>\n) {\n return Object.fromEntries(\n Object.entries(input)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([currencyId, bucket]) => [currencyId, stripNulls(mapper(bucket))])\n );\n}\n\nfunction topAmountBreakdownFromMap(\n counts: Map<string, number>,\n amounts: Map<string, Record<string, number>>,\n totalOrders: number,\n limit = TOP_LIMIT\n) {\n const sorted = Array.from(counts.entries())\n .filter(([, count]) => count > 0)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]));\n\n const entries = sorted.slice(0, limit).map(([key, orders]) => ({\n key,\n orders,\n rate: safeRate(orders, totalOrders),\n amount_by_currency: sortedCurrencyTotals(amounts.get(key) ?? {}),\n }));\n\n const otherOrders = sorted.slice(limit).reduce((sum, [, count]) => sum + count, 0);\n return stripNulls({\n entries,\n other_orders: otherOrders > 0 ? otherOrders : undefined,\n other_rate: otherOrders > 0 ? safeRate(otherOrders, totalOrders) : undefined,\n });\n}\n\nfunction revenueSum(input: Record<string, number>) {\n return Object.values(input).reduce((sum, value) => sum + value, 0);\n}\n\nfunction compactFeedbackValue(value: unknown): string {\n const compact = compactNestedValue(value);\n return compact.trim();\n}\n\nfunction getFirstPayment(order: Record<string, unknown>) {\n return asRecord(asArray<Record<string, unknown>>(order.payments)[0]);\n}\n\nfunction getOrderCurrency(order: Record<string, unknown>) {\n return normalizeString(order.currency_id, \"UNKNOWN\");\n}\n\nfunction buildCalculations(\n orders: Array<Record<string, unknown>>,\n metadata: OrderSummaryMetadata,\n failedPages: FailedPage[]\n) {\n const ordersTotal = orders.length;\n const statusCounts = new Map<string, number>();\n const tagCounts = new Map<string, number>();\n const channelCounts = new Map<string, number>();\n const siteCounts = new Map<string, number>();\n const paymentStatusCounts = new Map<string, number>();\n const paymentStatusDetailCounts = new Map<string, number>();\n const paymentMethodCounts = new Map<string, number>();\n const paymentTypeCounts = new Map<string, number>();\n const installmentsCounts = new Map<string, number>();\n const stockNodeCounts = new Map<string, number>();\n const listingTypeCounts = new Map<string, number>();\n const variationValueCounts = new Map<string, number>();\n const buyers = new Map<string, BuyerAggregate>();\n const items = new Map<string, ItemAggregate>();\n const variations = new Map<string, VariationAggregate>();\n const skus = new Map<string, SkuAggregate>();\n const dailyMetrics = new Map<string, Record<string, CurrencyMetricBucket>>();\n const flowMetrics = new Map<string, FlowAggregate>();\n const skuEconomics = new Map<string, SkuEconomicsAggregate>();\n const cancelGroupCounts = new Map<string, number>();\n const cancelCodeCounts = new Map<string, number>();\n const cancelRequestedByCounts = new Map<string, number>();\n const cancelReasonCounts = new Map<string, number>();\n const cancelReasonAmounts = new Map<string, Record<string, number>>();\n\n let unitsTotal = 0;\n let fulfilledOrders = 0;\n let deliveredOrders = 0;\n let packOrders = 0;\n let discountedOrders = 0;\n let catalogOrders = 0;\n let ordersWithFeedback = 0;\n let ordersWithChangeRequest = 0;\n let ordersWithReturnRequest = 0;\n let feedbackBuyerCount = 0;\n let feedbackSellerCount = 0;\n let ordersWithShipping = 0;\n let singleItemOrders = 0;\n let multiItemOrders = 0;\n let ordersWithoutPaymentData = 0;\n let paymentApprovedOrders = 0;\n let itemLineCount = 0;\n let ordersWithAnyPostSaleIssue = 0;\n let ordersWithRefundedAmount = 0;\n let ordersWithShippingCostAmount = 0;\n let ordersWithCouponAmount = 0;\n let notDeliveredOrders = 0;\n let multiUnitItemLines = 0;\n let multiUnitSaleFeeObservations = 0;\n\n const itemsSeen = new Set<string>();\n const buyerSeen = new Set<string>();\n const financialRaw: Record<\n string,\n {\n orders: number;\n units: number;\n distinctItems: number;\n revenue: number;\n paidAmount: number;\n paymentTotalPaidAmount: number;\n transactionAmount: number;\n couponAmount: number;\n saleFee: number;\n }\n > = {};\n const currencyMetrics: Record<string, CurrencyMetricBucket> = {};\n\n for (const order of orders) {\n const currencyId = getOrderCurrency(order);\n const totalAmount = toNumber(order.total_amount);\n const paidAmount = toNumber(order.paid_amount);\n const couponAmount = toNumber(asRecord(order.coupon).amount);\n const payment = getFirstPayment(order);\n const orderItems = asArray<Record<string, unknown>>(order.order_items);\n const buyer = asRecord(order.buyer);\n const seller = asRecord(order.seller);\n const feedback = asRecord(order.feedback);\n const orderRequest = asRecord(order.order_request);\n const shipping = asRecord(order.shipping);\n const context = asRecord(order.context);\n const paymentStatus = normalizeString(payment.status);\n const paymentStatusDetail = normalizeString(payment.status_detail);\n const paymentMethod = normalizeString(payment.payment_method_id);\n const paymentType = normalizeString(payment.payment_type);\n const installments = normalizeScalarString(payment.installments);\n const tags = asArray(order.tags).map((tag) => normalizeScalarString(tag)).filter(Boolean);\n const cancelDetail = asRecord(order.cancel_detail);\n const isCancelled = normalizeString(order.status) === \"cancelled\";\n const refundedAmount = toNumber(payment.transaction_amount_refunded);\n const shippingCost = toNumber(payment.shipping_cost);\n const paymentCouponAmount = toNumber(payment.coupon_amount);\n const dayKey = compactDateTime(order.date_created)?.slice(0, 10) || \"UNKNOWN_DATE\";\n const flows = asArray(context.flows).map((flow) => normalizeScalarString(flow)).filter(Boolean);\n const effectiveFlows = flows.length > 0 ? flows : [\"NO_FLOW\"];\n const isDiscounted = tags.includes(\"order_has_discount\") || couponAmount > 0 || paymentCouponAmount > 0;\n const isNotDelivered = tags.includes(\"not_delivered\") || normalizeString(cancelDetail.group) === \"shipment\";\n const orderItemDistinctIds = new Set<string>();\n\n financialRaw[currencyId] = financialRaw[currencyId] ?? {\n orders: 0,\n units: 0,\n distinctItems: 0,\n revenue: 0,\n paidAmount: 0,\n paymentTotalPaidAmount: 0,\n transactionAmount: 0,\n couponAmount: 0,\n saleFee: 0,\n };\n\n financialRaw[currencyId].orders += 1;\n financialRaw[currencyId].revenue += totalAmount;\n financialRaw[currencyId].paidAmount += paidAmount;\n financialRaw[currencyId].paymentTotalPaidAmount += toNumber(payment.total_paid_amount);\n financialRaw[currencyId].transactionAmount += toNumber(payment.transaction_amount);\n financialRaw[currencyId].couponAmount += couponAmount;\n\n const dailyCurrencyMetrics = dailyMetrics.get(dayKey) ?? {};\n dailyMetrics.set(dayKey, dailyCurrencyMetrics);\n const updateOrderCurrencyMetrics = (bucket: CurrencyMetricBucket) => {\n bucket.orders += 1;\n bucket.revenue += totalAmount;\n bucket.paidRevenue += paidAmount;\n bucket.paymentTotalPaid += toNumber(payment.total_paid_amount);\n bucket.transactionAmount += toNumber(payment.transaction_amount);\n bucket.refundedAmount += refundedAmount;\n bucket.shippingCost += shippingCost;\n bucket.couponAmount += couponAmount;\n bucket.paymentCouponAmount += paymentCouponAmount;\n if (isCancelled) {\n bucket.cancelledOrders += 1;\n bucket.cancelledGmv += totalAmount;\n }\n if (refundedAmount > 0) {\n bucket.refundedOrders += 1;\n }\n if (shippingCost > 0) {\n bucket.ordersWithShippingCost += 1;\n }\n if (couponAmount > 0 || paymentCouponAmount > 0) {\n bucket.ordersWithCoupon += 1;\n }\n if (isDiscounted) {\n bucket.discountedOrders += 1;\n }\n if (isNotDelivered) {\n bucket.notDeliveredOrders += 1;\n }\n };\n incrementCurrencyMetric(currencyMetrics, currencyId, updateOrderCurrencyMetrics);\n incrementCurrencyMetric(dailyCurrencyMetrics, currencyId, updateOrderCurrencyMetrics);\n\n incrementCount(statusCounts, normalizeString(order.status));\n incrementCount(channelCounts, normalizeString(context.channel));\n incrementCount(siteCounts, normalizeString(context.site));\n\n if (paymentStatus) {\n incrementCount(paymentStatusCounts, paymentStatus);\n } else {\n ordersWithoutPaymentData += 1;\n }\n incrementCount(paymentStatusDetailCounts, paymentStatusDetail);\n incrementCount(paymentMethodCounts, paymentMethod);\n incrementCount(paymentTypeCounts, paymentType);\n incrementCount(installmentsCounts, installments);\n\n if (paymentStatus === \"approved\") {\n paymentApprovedOrders += 1;\n }\n\n if (order.fulfilled === true) {\n fulfilledOrders += 1;\n }\n\n if (normalizeScalarString(shipping.id)) {\n ordersWithShipping += 1;\n }\n\n if (orderItems.length === 1) {\n singleItemOrders += 1;\n } else if (orderItems.length > 1) {\n multiItemOrders += 1;\n }\n\n for (const tag of tags) {\n incrementCount(tagCounts, tag);\n }\n\n if (tags.includes(\"delivered\")) {\n deliveredOrders += 1;\n }\n if (tags.includes(\"pack_order\")) {\n packOrders += 1;\n }\n if (tags.includes(\"order_has_discount\")) {\n discountedOrders += 1;\n }\n if (tags.includes(\"catalog\")) {\n catalogOrders += 1;\n }\n if (refundedAmount > 0) {\n ordersWithRefundedAmount += 1;\n }\n if (shippingCost > 0) {\n ordersWithShippingCostAmount += 1;\n }\n if (couponAmount > 0 || paymentCouponAmount > 0) {\n ordersWithCouponAmount += 1;\n }\n if (isNotDelivered) {\n notDeliveredOrders += 1;\n }\n if (isCancelled) {\n const cancelGroup = normalizeString(cancelDetail.group, \"UNKNOWN_GROUP\");\n const cancelCode = normalizeString(cancelDetail.code, \"UNKNOWN_CODE\");\n const requestedBy = normalizeString(cancelDetail.requested_by, \"UNKNOWN_REQUESTER\");\n const reasonKey = `${cancelGroup}:${cancelCode}:${requestedBy}`;\n incrementCount(cancelGroupCounts, cancelGroup);\n incrementCount(cancelCodeCounts, cancelCode);\n incrementCount(cancelRequestedByCounts, requestedBy);\n incrementCount(cancelReasonCounts, reasonKey);\n const reasonAmount = cancelReasonAmounts.get(reasonKey) ?? {};\n incrementCurrency(reasonAmount, currencyId, totalAmount);\n cancelReasonAmounts.set(reasonKey, reasonAmount);\n }\n\n for (const flow of effectiveFlows) {\n const flowAggregate = flowMetrics.get(flow) ?? {\n flow,\n orders: 0,\n units: 0,\n cancelled_orders: 0,\n revenue_by_currency: {},\n paid_revenue_by_currency: {},\n sale_fee_by_currency: {},\n };\n flowAggregate.orders += 1;\n if (isCancelled) {\n flowAggregate.cancelled_orders += 1;\n }\n incrementCurrency(flowAggregate.revenue_by_currency, currencyId, totalAmount);\n incrementCurrency(flowAggregate.paid_revenue_by_currency, currencyId, paidAmount);\n flowMetrics.set(flow, flowAggregate);\n }\n\n const feedbackBuyer = compactFeedbackValue(feedback.buyer);\n const feedbackSeller = compactFeedbackValue(feedback.seller);\n const hasFeedback = Boolean(feedbackBuyer || feedbackSeller);\n if (hasFeedback) {\n ordersWithFeedback += 1;\n }\n if (feedbackBuyer) {\n feedbackBuyerCount += 1;\n }\n if (feedbackSeller) {\n feedbackSellerCount += 1;\n }\n\n const hasChangeRequest = Boolean(compactFeedbackValue(orderRequest.change));\n const hasReturnRequest = Boolean(compactFeedbackValue(orderRequest.return));\n if (hasChangeRequest) {\n ordersWithChangeRequest += 1;\n }\n if (hasReturnRequest) {\n ordersWithReturnRequest += 1;\n }\n if (hasFeedback || hasChangeRequest || hasReturnRequest) {\n ordersWithAnyPostSaleIssue += 1;\n }\n\n const buyerId = normalizeScalarString(buyer.id);\n const buyerNickname = normalizeString(buyer.nickname);\n if (buyerId || buyerNickname) {\n const buyerKey = buyerId || buyerNickname;\n buyerSeen.add(buyerKey);\n const currentBuyer = buyers.get(buyerKey) ?? {\n buyer_id: buyerId,\n nickname: buyerNickname,\n orders: 0,\n revenue_by_currency: {},\n };\n currentBuyer.orders += 1;\n incrementCurrency(currentBuyer.revenue_by_currency, currencyId, totalAmount);\n buyers.set(buyerKey, currentBuyer);\n }\n\n for (const orderItem of orderItems) {\n itemLineCount += 1;\n const item = asRecord(orderItem.item);\n const stock = asRecord(orderItem.stock);\n const itemId = normalizeString(item.id);\n const title = normalizeString(item.title);\n const sellerSku = normalizeString(item.seller_sku);\n const quantity = toNumber(orderItem.quantity);\n const unitPrice = toNumber(orderItem.unit_price);\n const saleFee = toNumber(orderItem.sale_fee);\n const listingType = normalizeString(orderItem.listing_type_id);\n const stockNode = normalizeString(stock.node_id);\n const variationSummary = compactVariationAttributes(item.variation_attributes);\n const itemKey = `${itemId}::${variationSummary}::${sellerSku}`;\n const skuKey = sellerSku || itemId || title || \"UNKNOWN_SKU\";\n const variationKey = variationSummary || \"NO_VARIATION\";\n const itemRevenue = unitPrice * quantity;\n const paidRevenueApprox = totalAmount > 0 ? paidAmount * (itemRevenue / totalAmount) : itemRevenue;\n const refundedAmountApprox = totalAmount > 0 ? refundedAmount * (itemRevenue / totalAmount) : refundedAmount;\n\n if (quantity > 1) {\n multiUnitItemLines += 1;\n if (saleFee > 0) {\n multiUnitSaleFeeObservations += 1;\n }\n }\n\n unitsTotal += quantity;\n financialRaw[currencyId].units += quantity;\n financialRaw[currencyId].saleFee += saleFee;\n const updateItemCurrencyMetrics = (bucket: CurrencyMetricBucket) => {\n bucket.units += quantity;\n bucket.saleFee += saleFee;\n if (isDiscounted) {\n bucket.discountedGmv += itemRevenue;\n }\n if (isNotDelivered) {\n bucket.notDeliveredGmv += itemRevenue;\n }\n };\n incrementCurrencyMetric(currencyMetrics, currencyId, updateItemCurrencyMetrics);\n incrementCurrencyMetric(dailyCurrencyMetrics, currencyId, updateItemCurrencyMetrics);\n\n for (const flow of effectiveFlows) {\n const flowAggregate = flowMetrics.get(flow);\n if (flowAggregate) {\n flowAggregate.units += quantity;\n incrementCurrency(flowAggregate.sale_fee_by_currency, currencyId, saleFee);\n }\n }\n\n if (itemId) {\n itemsSeen.add(itemId);\n orderItemDistinctIds.add(itemId);\n }\n\n incrementCount(listingTypeCounts, listingType);\n incrementCount(stockNodeCounts, stockNode);\n incrementCount(variationValueCounts, variationKey);\n\n const itemAggregate = items.get(itemKey) ?? {\n item_id: itemId,\n title,\n seller_sku: sellerSku,\n variation_summary: variationSummary,\n orders: 0,\n units: 0,\n revenue_by_currency: {},\n sale_fee_by_currency: {},\n };\n itemAggregate.orders += 1;\n itemAggregate.units += quantity;\n incrementCurrency(itemAggregate.revenue_by_currency, currencyId, unitPrice * quantity);\n incrementCurrency(itemAggregate.sale_fee_by_currency, currencyId, saleFee);\n items.set(itemKey, itemAggregate);\n\n const variationAggregate = variations.get(variationKey) ?? {\n variation_summary: variationSummary,\n orders: 0,\n units: 0,\n revenue_by_currency: {},\n };\n variationAggregate.orders += 1;\n variationAggregate.units += quantity;\n incrementCurrency(variationAggregate.revenue_by_currency, currencyId, unitPrice * quantity);\n variations.set(variationKey, variationAggregate);\n\n const skuAggregate = skus.get(skuKey) ?? {\n seller_sku: sellerSku,\n orders: 0,\n units: 0,\n revenue_by_currency: {},\n };\n skuAggregate.orders += 1;\n skuAggregate.units += quantity;\n incrementCurrency(skuAggregate.revenue_by_currency, currencyId, unitPrice * quantity);\n skus.set(skuKey, skuAggregate);\n\n const skuEconomicsAggregate = skuEconomics.get(skuKey) ?? {\n seller_sku: sellerSku,\n item_id: itemId,\n title,\n orders: 0,\n units: 0,\n cancelled_orders: 0,\n refunded_orders: 0,\n revenue_by_currency: {},\n paid_revenue_by_currency: {},\n sale_fee_by_currency: {},\n refunded_amount_by_currency: {},\n };\n skuEconomicsAggregate.orders += 1;\n skuEconomicsAggregate.units += quantity;\n if (isCancelled) {\n skuEconomicsAggregate.cancelled_orders += 1;\n }\n if (refundedAmount > 0) {\n skuEconomicsAggregate.refunded_orders += 1;\n }\n incrementCurrency(skuEconomicsAggregate.revenue_by_currency, currencyId, itemRevenue);\n incrementCurrency(skuEconomicsAggregate.paid_revenue_by_currency, currencyId, paidRevenueApprox);\n incrementCurrency(skuEconomicsAggregate.sale_fee_by_currency, currencyId, saleFee);\n incrementCurrency(skuEconomicsAggregate.refunded_amount_by_currency, currencyId, refundedAmountApprox);\n skuEconomics.set(skuKey, skuEconomicsAggregate);\n }\n\n financialRaw[currencyId].distinctItems += orderItemDistinctIds.size;\n }\n\n const financialByCurrency: Record<string, CurrencyCalculation> = {};\n for (const [currencyId, raw] of Object.entries(financialRaw)) {\n financialByCurrency[currencyId] = {\n revenue_total: roundMoney(raw.revenue),\n paid_amount_total: roundMoney(raw.paidAmount),\n payment_total_paid_amount: roundMoney(raw.paymentTotalPaidAmount),\n transaction_amount_total: roundMoney(raw.transactionAmount),\n coupon_amount_total: roundMoney(raw.couponAmount),\n sale_fee_total: roundMoney(raw.saleFee),\n avg_order_value: roundMoney(raw.revenue / Math.max(1, raw.orders)),\n avg_paid_amount_per_order: roundMoney(raw.paidAmount / Math.max(1, raw.orders)),\n avg_units_per_order: roundMoney(raw.units / Math.max(1, raw.orders)),\n avg_distinct_items_per_order: roundMoney(raw.distinctItems / Math.max(1, raw.orders)),\n avg_sale_fee_per_order: roundMoney(raw.saleFee / Math.max(1, raw.orders)),\n sale_fee_rate: safeRate(raw.saleFee, raw.revenue),\n };\n }\n\n const topItemsByRevenue = Array.from(items.values())\n .sort((left, right) => {\n const leftRevenue = Object.values(left.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n const rightRevenue = Object.values(right.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n return rightRevenue - leftRevenue || left.item_id.localeCompare(right.item_id);\n })\n .slice(0, TOP_LIMIT)\n .map((item) => ({\n ...item,\n revenue_by_currency: sortedCurrencyTotals(item.revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(item.sale_fee_by_currency),\n }));\n\n const topItemsByUnits = Array.from(items.values())\n .sort((left, right) => right.units - left.units || left.item_id.localeCompare(right.item_id))\n .slice(0, TOP_LIMIT)\n .map((item) => ({\n ...item,\n revenue_by_currency: sortedCurrencyTotals(item.revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(item.sale_fee_by_currency),\n }));\n\n const topItemsByOrders = Array.from(items.values())\n .sort((left, right) => right.orders - left.orders || left.item_id.localeCompare(right.item_id))\n .slice(0, TOP_LIMIT)\n .map((item) => ({\n ...item,\n revenue_by_currency: sortedCurrencyTotals(item.revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(item.sale_fee_by_currency),\n }));\n\n const topVariations = Array.from(variations.values())\n .filter((variation) => variation.variation_summary)\n .sort((left, right) => right.units - left.units || left.variation_summary.localeCompare(right.variation_summary))\n .slice(0, TOP_LIMIT)\n .map((variation) => ({\n ...variation,\n revenue_by_currency: sortedCurrencyTotals(variation.revenue_by_currency),\n }));\n\n const topSkus = Array.from(skus.values())\n .filter((sku) => sku.seller_sku)\n .sort((left, right) => right.units - left.units || left.seller_sku.localeCompare(right.seller_sku))\n .slice(0, TOP_LIMIT)\n .map((sku) => ({\n ...sku,\n revenue_by_currency: sortedCurrencyTotals(sku.revenue_by_currency),\n }));\n\n const topBuyersByRevenue = Array.from(buyers.values())\n .sort((left, right) => {\n const leftRevenue = Object.values(left.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n const rightRevenue = Object.values(right.revenue_by_currency).reduce((sum, value) => sum + value, 0);\n return rightRevenue - leftRevenue || left.buyer_id.localeCompare(right.buyer_id);\n })\n .slice(0, TOP_LIMIT)\n .map((buyer) => ({\n ...buyer,\n revenue_by_currency: sortedCurrencyTotals(buyer.revenue_by_currency),\n }));\n\n const topBuyersByOrders = Array.from(buyers.values())\n .sort((left, right) => right.orders - left.orders || left.buyer_id.localeCompare(right.buyer_id))\n .slice(0, TOP_LIMIT)\n .map((buyer) => ({\n ...buyer,\n revenue_by_currency: sortedCurrencyTotals(buyer.revenue_by_currency),\n }));\n\n const buyersWithMultipleOrders = Array.from(buyers.values()).filter((buyer) => buyer.orders > 1).length;\n\n const topVariationValues = Array.from(variationValueCounts.entries())\n .filter(([key]) => key && key !== \"NO_VARIATION\")\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))\n .slice(0, TOP_LIMIT)\n .map(([key, occurrences]) => ({ key, occurrences }));\n\n const topSingleValue = (counts: Map<string, number>) =>\n Array.from(counts.entries())\n .filter(([key]) => key)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))[0]?.[0] ?? \"\";\n\n const revenueQuality = {\n by_currency: sortedCurrencyMetrics(currencyMetrics, (bucket) => ({\n gross_gmv: roundMoney(bucket.revenue),\n paid_gmv: roundMoney(bucket.paidRevenue),\n payment_total_paid_amount: roundMoney(bucket.paymentTotalPaid),\n transaction_amount_total: roundMoney(bucket.transactionAmount),\n refunded_amount_total: roundMoney(bucket.refundedAmount),\n net_after_refunds: roundMoney(bucket.transactionAmount - bucket.refundedAmount),\n cancelled_gmv: roundMoney(bucket.cancelledGmv),\n cancelled_rate_by_orders: safeRate(bucket.cancelledOrders, bucket.orders),\n cancelled_rate_by_gmv: safeRate(bucket.cancelledGmv, bucket.revenue),\n paid_rate_by_gmv: safeRate(bucket.paidRevenue, bucket.revenue),\n })),\n };\n\n const refundsCancellations = {\n by_currency: sortedCurrencyMetrics(currencyMetrics, (bucket) => ({\n refunded_amount_total: roundMoney(bucket.refundedAmount),\n refunded_orders: bucket.refundedOrders,\n refund_rate_by_orders: safeRate(bucket.refundedOrders, bucket.orders),\n refund_rate_by_transaction_amount: safeRate(bucket.refundedAmount, bucket.transactionAmount),\n cancelled_orders: bucket.cancelledOrders,\n cancelled_gmv: roundMoney(bucket.cancelledGmv),\n cancelled_rate_by_orders: safeRate(bucket.cancelledOrders, bucket.orders),\n cancelled_rate_by_gmv: safeRate(bucket.cancelledGmv, bucket.revenue),\n })),\n cancel_group_breakdown: topBreakdownFromMap(cancelGroupCounts, ordersTotal),\n cancel_code_breakdown: topBreakdownFromMap(cancelCodeCounts, ordersTotal),\n cancel_requested_by_breakdown: topBreakdownFromMap(cancelRequestedByCounts, ordersTotal),\n top_cancel_reasons: topAmountBreakdownFromMap(cancelReasonCounts, cancelReasonAmounts, ordersTotal),\n };\n\n const shippingAndDiscounts = {\n by_currency: sortedCurrencyMetrics(currencyMetrics, (bucket) => ({\n buyer_shipping_paid_total: roundMoney(bucket.shippingCost),\n orders_with_shipping_cost: bucket.ordersWithShippingCost,\n avg_shipping_paid_by_order_with_cost: roundMoney(bucket.shippingCost / Math.max(1, bucket.ordersWithShippingCost)),\n shipping_cost_rate_on_paid_gmv: safeRate(bucket.shippingCost, bucket.paidRevenue),\n coupon_amount_total: roundMoney(bucket.couponAmount),\n payment_coupon_amount_total: roundMoney(bucket.paymentCouponAmount),\n orders_with_coupon: bucket.ordersWithCoupon,\n coupon_rate_by_orders: safeRate(bucket.ordersWithCoupon, bucket.orders),\n coupon_rate_on_gmv: safeRate(bucket.couponAmount + bucket.paymentCouponAmount, bucket.revenue),\n discounted_orders: bucket.discountedOrders,\n discounted_order_rate: safeRate(bucket.discountedOrders, bucket.orders),\n discounted_gmv: roundMoney(bucket.discountedGmv),\n not_delivered_orders: bucket.notDeliveredOrders,\n not_delivered_gmv: roundMoney(bucket.notDeliveredGmv),\n not_delivered_rate_by_orders: safeRate(bucket.notDeliveredOrders, bucket.orders),\n not_delivered_rate_by_gmv: safeRate(bucket.notDeliveredGmv, bucket.revenue),\n })),\n };\n\n const dailyTrend = Array.from(dailyMetrics.entries())\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([date, byCurrency]) => ({\n date,\n by_currency: sortedCurrencyMetrics(byCurrency, (bucket) => ({\n orders: bucket.orders,\n units: bucket.units,\n revenue: roundMoney(bucket.revenue),\n paid_revenue: roundMoney(bucket.paidRevenue),\n cancelled_orders: bucket.cancelledOrders,\n refunded_amount: roundMoney(bucket.refundedAmount),\n avg_order_value: roundMoney(bucket.revenue / Math.max(1, bucket.orders)),\n })),\n }));\n\n const flowPerformance = Array.from(flowMetrics.values())\n .sort((left, right) => revenueSum(right.revenue_by_currency) - revenueSum(left.revenue_by_currency) || left.flow.localeCompare(right.flow))\n .slice(0, TOP_LIMIT)\n .map((flow) => ({\n flow: flow.flow,\n orders: flow.orders,\n units: flow.units,\n revenue_by_currency: sortedCurrencyTotals(flow.revenue_by_currency),\n paid_revenue_by_currency: sortedCurrencyTotals(flow.paid_revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(flow.sale_fee_by_currency),\n cancelled_orders: flow.cancelled_orders,\n cancelled_rate: safeRate(flow.cancelled_orders, flow.orders),\n fee_rate_by_currency: Object.fromEntries(\n Object.keys(flow.revenue_by_currency)\n .sort((left, right) => left.localeCompare(right))\n .map((currencyId) => [currencyId, safeRate(flow.sale_fee_by_currency[currencyId] ?? 0, flow.revenue_by_currency[currencyId] ?? 0)])\n ),\n }));\n\n const skuUnitEconomics = Array.from(skuEconomics.values())\n .sort((left, right) => revenueSum(right.revenue_by_currency) - revenueSum(left.revenue_by_currency) || left.seller_sku.localeCompare(right.seller_sku))\n .slice(0, TOP_LIMIT)\n .map((sku) => ({\n seller_sku: sku.seller_sku,\n item_id: sku.item_id,\n title: sku.title,\n orders: sku.orders,\n units: sku.units,\n revenue_by_currency: sortedCurrencyTotals(sku.revenue_by_currency),\n paid_revenue_by_currency: sortedCurrencyTotals(sku.paid_revenue_by_currency),\n sale_fee_by_currency: sortedCurrencyTotals(sku.sale_fee_by_currency),\n refunded_amount_by_currency: sortedCurrencyTotals(sku.refunded_amount_by_currency),\n avg_unit_price_by_currency: Object.fromEntries(\n Object.keys(sku.revenue_by_currency)\n .sort((left, right) => left.localeCompare(right))\n .map((currencyId) => [currencyId, roundMoney((sku.revenue_by_currency[currencyId] ?? 0) / Math.max(1, sku.units))])\n ),\n fee_rate_by_currency: Object.fromEntries(\n Object.keys(sku.revenue_by_currency)\n .sort((left, right) => left.localeCompare(right))\n .map((currencyId) => [currencyId, safeRate(sku.sale_fee_by_currency[currencyId] ?? 0, sku.revenue_by_currency[currencyId] ?? 0)])\n ),\n cancelled_orders: sku.cancelled_orders,\n cancelled_rate: safeRate(sku.cancelled_orders, sku.orders),\n refunded_orders: sku.refunded_orders,\n refund_rate: safeRate(sku.refunded_orders, sku.orders),\n }));\n\n const feeDiagnostics = {\n sale_fee_assumption: \"order_items.sale_fee is used as returned by MercadoLibre and is not multiplied by quantity yet.\",\n multi_unit_item_lines: multiUnitItemLines,\n multi_unit_sale_fee_observations: multiUnitSaleFeeObservations,\n needs_sale_fee_granularity_validation: true,\n };\n\n return {\n overview: {\n orders_total: ordersTotal,\n units_total: unitsTotal,\n distinct_items_total: itemsSeen.size,\n distinct_buyers_total: buyerSeen.size,\n fulfilled_orders: fulfilledOrders,\n delivered_orders: deliveredOrders,\n pack_orders: packOrders,\n orders_with_discount: discountedOrders,\n orders_with_feedback: ordersWithFeedback,\n orders_with_change_request: ordersWithChangeRequest,\n orders_with_return_request: ordersWithReturnRequest,\n },\n financial_by_currency: financialByCurrency,\n revenue_quality: revenueQuality,\n refunds_cancellations: refundsCancellations,\n shipping_and_discounts: shippingAndDiscounts,\n daily_trend: dailyTrend,\n flow_performance: flowPerformance,\n sku_unit_economics: skuUnitEconomics,\n fee_diagnostics: feeDiagnostics,\n order_mix: {\n status_breakdown: topBreakdownFromMap(statusCounts, ordersTotal),\n tags_breakdown: topBreakdownFromMap(tagCounts, ordersTotal),\n channel_breakdown: topBreakdownFromMap(channelCounts, ordersTotal),\n site_breakdown: topBreakdownFromMap(siteCounts, ordersTotal),\n single_item_order_rate: safeRate(singleItemOrders, ordersTotal),\n multi_item_order_rate: safeRate(multiItemOrders, ordersTotal),\n fulfilled_rate: safeRate(fulfilledOrders, ordersTotal),\n delivered_rate: safeRate(deliveredOrders, ordersTotal),\n pack_order_rate: safeRate(packOrders, ordersTotal),\n discounted_order_rate: safeRate(discountedOrders, ordersTotal),\n catalog_order_rate: safeRate(catalogOrders, ordersTotal),\n },\n payment_mix: {\n payment_status_breakdown: topBreakdownFromMap(paymentStatusCounts, ordersTotal),\n payment_status_detail_breakdown: topBreakdownFromMap(paymentStatusDetailCounts, ordersTotal),\n payment_method_breakdown: topBreakdownFromMap(paymentMethodCounts, ordersTotal),\n payment_type_breakdown: topBreakdownFromMap(paymentTypeCounts, ordersTotal),\n installments_breakdown: topBreakdownFromMap(installmentsCounts, ordersTotal),\n payment_approved_rate: safeRate(paymentApprovedOrders, ordersTotal),\n orders_without_payment_data: ordersWithoutPaymentData,\n },\n fulfillment: {\n orders_with_shipping: ordersWithShipping,\n shipping_attached_rate: safeRate(ordersWithShipping, ordersTotal),\n shipping_id_coverage: ordersWithShipping,\n stock_node_breakdown: topBreakdownFromMap(stockNodeCounts, Math.max(1, itemLineCount)),\n listing_type_breakdown: topBreakdownFromMap(listingTypeCounts, Math.max(1, itemLineCount)),\n },\n post_sale_friction: {\n orders_with_feedback_rate: safeRate(ordersWithFeedback, ordersTotal),\n feedback_buyer_count: feedbackBuyerCount,\n feedback_seller_count: feedbackSellerCount,\n change_request_rate: safeRate(ordersWithChangeRequest, ordersTotal),\n return_request_rate: safeRate(ordersWithReturnRequest, ordersTotal),\n orders_with_any_post_sale_issue_rate: safeRate(ordersWithAnyPostSaleIssue, ordersTotal),\n },\n product_insights: {\n top_items_by_revenue: topItemsByRevenue,\n top_items_by_units: topItemsByUnits,\n top_items_by_orders: topItemsByOrders,\n top_variations: topVariations,\n top_skus: topSkus,\n top_listing_types: topBreakdownFromMap(listingTypeCounts, Math.max(1, itemLineCount)),\n top_stock_nodes: topBreakdownFromMap(stockNodeCounts, Math.max(1, itemLineCount)),\n },\n customer_insights: {\n top_buyers_by_revenue: topBuyersByRevenue,\n top_buyers_by_orders: topBuyersByOrders,\n repeat_buyer_rate: safeRate(buyersWithMultipleOrders, buyerSeen.size),\n buyers_with_multiple_orders: buyersWithMultipleOrders,\n },\n operational_context: {\n most_used_payment_method: topSingleValue(paymentMethodCounts),\n most_used_listing_type: topSingleValue(listingTypeCounts),\n most_used_stock_node: topSingleValue(stockNodeCounts),\n most_used_channel: topSingleValue(channelCounts),\n most_common_tag: topSingleValue(tagCounts),\n most_common_variation_values: topVariationValues,\n },\n coverage: {\n fetch_mode: metadata.fetch_mode,\n universe_fully_fetched: metadata.universe_fully_fetched,\n orders_returned: metadata.returned,\n pages_requested: metadata.pages_requested,\n pages_succeeded: metadata.pages_succeeded,\n pages_failed: metadata.pages_failed,\n failed_pages_count: failedPages.length,\n failed_pages: failedPages,\n },\n };\n}\n\nfunction buildOrdersSummaryMetadata(params: {\n total: number;\n effectiveLimit: number;\n effectiveOffset: number;\n returned: number;\n responseMode: \"calculations\" | \"orders_chunk\";\n pagesRequested: number;\n pagesSucceeded: number;\n pagesFailed: number;\n failedOffsets: number[];\n}) {\n const requestedWindowEndOffset = params.effectiveOffset + params.effectiveLimit * params.pagesRequested;\n const nextOffset = params.responseMode === \"orders_chunk\" ? requestedWindowEndOffset : params.effectiveOffset + params.returned;\n const hasMoreOrders = nextOffset < params.total;\n const universeFullyFetched =\n params.responseMode === \"calculations\" && params.pagesFailed === 0 && params.returned >= params.total;\n\n let continuation = \"No more pages for this query.\";\n if (params.pagesFailed > 0) {\n const offsets = params.failedOffsets.slice(0, 5).join(\", \");\n const moreOffsets =\n params.failedOffsets.length > 5\n ? ` y ${params.failedOffsets.length - 5} offsets adicionales`\n : \"\";\n continuation = params.responseMode === \"orders_chunk\"\n ? `Se recuperaron paginas parciales. Reintentar primero la misma tool con responseMode=\"orders_chunk\", offset=${params.failedOffsets[0]} y limit=${params.effectiveLimit}. Offsets fallidos: ${offsets}${moreOffsets}. Luego continuar con offset=${nextOffset} si hace falta.`\n : `Calculos parciales por paginas fallidas. Reintentar la misma tool con responseMode=\"calculations\". Offsets fallidos: ${offsets}${moreOffsets}.`;\n } else if (params.responseMode === \"orders_chunk\" && hasMoreOrders) {\n continuation = `Para continuar trayendo ordenes, volver a invocar meli_get_orders_summary con los mismos filtros, responseMode=\"orders_chunk\", offset=${nextOffset} y limit=${params.effectiveLimit}. Repetir hasta has_more=false.`;\n } else if (params.responseMode === \"calculations\") {\n continuation = 'Calculos completos. Si el usuario pide detalle de ordenes, invocar la misma tool con responseMode=\"orders_chunk\", offset=0 y limit=50.';\n }\n\n return {\n total: params.total,\n limit: params.effectiveLimit,\n offset: params.effectiveOffset,\n returned: params.returned,\n has_more: params.responseMode === \"orders_chunk\" ? hasMoreOrders || params.pagesFailed > 0 : params.pagesFailed > 0,\n next_offset: params.responseMode === \"orders_chunk\" && hasMoreOrders ? nextOffset : undefined,\n continuation,\n fetch_mode: params.responseMode === \"orders_chunk\" ? \"orders_chunk\" : \"full_calculations\",\n pages_per_call_limit: params.responseMode === \"orders_chunk\" ? ORDER_DETAIL_MAX_PAGES_PER_CALL : undefined,\n pages_requested: params.pagesRequested,\n pages_succeeded: params.pagesSucceeded,\n pages_failed: params.pagesFailed,\n universe_fully_fetched: universeFullyFetched,\n };\n}\n\nfunction formatCompactOrder(\n order: Record<string, unknown>,\n metricsByCurrency: Record<string, { orders: number; revenue: number; avg_order_value: number }>\n) {\n const currencyId = normalizeString(order.currency_id, \"UNKNOWN\");\n const totalAmount = toNumber(order.total_amount);\n const paidAmount = toNumber(order.paid_amount);\n const bucket = currencyBucket(metricsByCurrency, currencyId, createMetricsBucket);\n bucket.orders += 1;\n bucket.revenue += totalAmount;\n bucket.avg_order_value = bucket.orders > 0 ? bucket.revenue / bucket.orders : 0;\n\n const orderItems = asArray<Record<string, unknown>>(order.order_items);\n const firstOrderItem = asRecord(orderItems[0]);\n const firstItem = asRecord(firstOrderItem.item);\n const firstPayment = asRecord(asArray<Record<string, unknown>>(order.payments)[0]);\n const shipping = asRecord(order.shipping);\n const buyer = asRecord(order.buyer);\n const seller = asRecord(order.seller);\n const context = asRecord(order.context);\n const feedback = asRecord(order.feedback);\n const orderRequest = asRecord(order.order_request);\n const coupon = asRecord(order.coupon);\n const stock = asRecord(firstOrderItem.stock);\n\n return [\n normalizeScalarString(order.id),\n compactDateTime(order.date_created),\n normalizeString(order.status),\n totalAmount,\n currencyId,\n normalizeString(buyer.nickname) || normalizeScalarString(buyer.id),\n normalizeString(shipping.status),\n orderItems.length,\n compactDateTime(order.date_closed),\n compactDateTime(order.date_last_updated) || compactDateTime(order.last_updated),\n paidAmount,\n normalizeScalarString(buyer.id),\n normalizeString(seller.nickname) || normalizeScalarString(seller.id),\n normalizeScalarString(seller.id),\n normalizeScalarString(shipping.id),\n normalizeScalarString(order.pack_id),\n Boolean(order.fulfilled),\n compactStringList(order.tags),\n normalizeString(context.channel),\n normalizeString(context.site),\n normalizeScalarString(firstPayment.id),\n normalizeString(firstPayment.status),\n normalizeString(firstPayment.status_detail),\n normalizeString(firstPayment.payment_method_id),\n normalizeString(firstPayment.payment_type),\n toNumber(firstPayment.total_paid_amount),\n toNumber(firstPayment.transaction_amount),\n toNumber(firstPayment.installments),\n toNumber(coupon.amount),\n compactStringList(firstPayment.available_actions),\n compactNestedValue(feedback.buyer),\n compactNestedValue(feedback.seller),\n compactNestedValue(orderRequest.change),\n compactNestedValue(orderRequest.return),\n normalizeString(firstItem.id),\n normalizeString(firstItem.title),\n normalizeString(firstItem.seller_sku),\n toNumber(firstOrderItem.quantity),\n toNumber(firstOrderItem.unit_price),\n toNumber(firstOrderItem.sale_fee),\n normalizeString(firstOrderItem.listing_type_id),\n compactVariationAttributes(firstItem.variation_attributes),\n normalizeString(stock.node_id),\n toNumber(firstPayment.shipping_cost),\n toNumber(firstPayment.coupon_amount),\n ];\n}\n\nexport const meliGetOrdersSummarySchema = z.object({\n profileId: mercadolibreProfileIdSchemaField,\n startDate: z.string().regex(mercadoLibreDateRegex).describe(\"Start date in YYYY-MM-DD format.\"),\n endDate: z.string().regex(mercadoLibreDateRegex).describe(\"End date in YYYY-MM-DD format.\"),\n status: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre order status filter.\"),\n q: z.string().trim().min(1).optional().describe(\"Optional free-text search query supported by MercadoLibre orders search.\"),\n sort: z.string().trim().min(1).optional().describe(\"Optional MercadoLibre sort expression.\"),\n responseMode: z.enum([\"calculations\", \"orders_chunk\"]).optional().default(\"calculations\").describe(\"Response mode. calculations (default) fetches all matching orders internally and returns only aggregate KPIs. orders_chunk returns compact order rows for up to 15 MercadoLibre pages and includes continuation metadata.\"),\n offset: z.number().int().min(0).max(5000).optional().describe(\"Starting offset for responseMode=orders_chunk. Use metadata.next_offset to continue.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"MercadoLibre page size for responseMode=orders_chunk (1-50). Defaults to 50.\"),\n});\n\nexport async function meliGetOrdersSummaryHandler(\n params: z.infer<typeof meliGetOrdersSummarySchema>\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 responseMode = params.responseMode ?? \"calculations\";\n const requestedLimit = responseMode === \"orders_chunk\" ? params.limit ?? DEFAULT_ORDER_DETAIL_PAGE_LIMIT : DEFAULT_ORDER_DETAIL_PAGE_LIMIT;\n const requestedOffset = responseMode === \"orders_chunk\" ? params.offset ?? 0 : 0;\n const response = await searchMercadoLibreOrders(profileId, {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n q: params.q,\n sort: params.sort,\n offset: requestedOffset,\n limit: requestedLimit,\n });\n\n const paging = normalizeMercadoLibrePaging(asRecord(response.paging));\n const baseOrders = asArray<Record<string, unknown>>(response.results);\n const metricsByCurrency: Record<string, { orders: number; revenue: number; avg_order_value: number }> = {};\n const effectiveLimit = paging.limit || requestedLimit || baseOrders.length;\n const effectiveOffset = paging.offset || requestedOffset || 0;\n const maxPagesForResponse = responseMode === \"orders_chunk\" ? ORDER_DETAIL_MAX_PAGES_PER_CALL : Infinity;\n\n const allOrders = [...baseOrders];\n const failedPages: FailedPage[] = [];\n let pagesRequested = 1;\n let pagesSucceeded = 1;\n\n if (effectiveLimit > 0 && paging.total > baseOrders.length) {\n const nextOffsets: number[] = [];\n const maxPagesRemaining = Math.max(0, maxPagesForResponse - 1);\n let pagesAdded = 0;\n\n for (let nextOffset = effectiveOffset + effectiveLimit; nextOffset < paging.total; nextOffset += effectiveLimit) {\n if (responseMode === \"orders_chunk\" && pagesAdded >= maxPagesRemaining) {\n break;\n }\n\n nextOffsets.push(nextOffset);\n pagesAdded += 1;\n }\n\n pagesRequested += nextOffsets.length;\n\n if (nextOffsets.length > 0) {\n const batch = await searchMercadoLibreOrdersBatch(\n profileId,\n {\n seller: \"\",\n from: params.startDate,\n to: params.endDate,\n status: params.status,\n q: params.q,\n sort: params.sort,\n limit: effectiveLimit,\n },\n nextOffsets,\n {\n maxConcurrency: PAGE_FETCH_CONCURRENCY,\n maxRetries: PAGE_FETCH_MAX_RETRIES,\n }\n );\n\n pagesSucceeded += batch.successful.length;\n batch.successful.forEach((entry) => {\n allOrders.push(...asArray<Record<string, unknown>>(entry.document.results));\n });\n batch.failed.forEach((failure) => {\n const failedOffset = Number(failure.id);\n failedPages.push({\n offset: failedOffset,\n limit: effectiveLimit,\n page_number: Math.floor(failedOffset / effectiveLimit) + 1,\n message: failure.message,\n status_code: failure.statusCode,\n attempts: failure.attempts,\n retryable: failure.retryable,\n });\n });\n }\n }\n\n const compactOrders = responseMode === \"orders_chunk\"\n ? allOrders.map((order) => formatCompactOrder(order, metricsByCurrency))\n : [];\n\n if (responseMode === \"calculations\") {\n for (const order of allOrders) {\n formatCompactOrder(order, metricsByCurrency);\n }\n }\n\n for (const metrics of Object.values(metricsByCurrency)) {\n metrics.revenue = roundMoney(metrics.revenue);\n metrics.avg_order_value = roundMoney(metrics.avg_order_value);\n }\n\n const returned = responseMode === \"orders_chunk\" ? compactOrders.length : allOrders.length;\n const metadata = buildOrdersSummaryMetadata({\n total: paging.total,\n effectiveLimit,\n effectiveOffset,\n returned,\n responseMode,\n pagesRequested,\n pagesSucceeded,\n pagesFailed: failedPages.length,\n failedOffsets: failedPages.map((failure) => failure.offset),\n });\n\n const calculations = responseMode === \"calculations\" ? buildCalculations(allOrders, metadata, failedPages) : undefined;\n\n return object(\n stripNulls({\n profile_id: profileId,\n metadata: responseMode === \"orders_chunk\"\n ? {\n ...buildMercadoLibrePaginationMetadata({\n total: paging.total,\n limit: effectiveLimit,\n offset: effectiveOffset,\n returned: compactOrders.length,\n nextField: \"offset\",\n }),\n ...metadata,\n }\n : metadata,\n metrics_by_currency: metricsByCurrency,\n orders_schema: responseMode === \"orders_chunk\" ? ordersSchema : undefined,\n orders: responseMode === \"orders_chunk\" ? compactOrders : undefined,\n calculations,\n failed_pages: failedPages.length > 0 ? failedPages : undefined,\n })\n );\n } catch (err) {\n return error(formatMercadoLibreError(err, \"Failed to fetch MercadoLibre orders summary\"));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|