@yoryoboy/bi-mcp 1.14.2 → 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/services/vtex/__tests__/vtex-catalog.test.js +2 -5
- package/dist/src/services/vtex/__tests__/vtex-catalog.test.js.map +2 -2
- package/dist/src/services/vtex/vtex-catalog.js +1 -1
- package/dist/src/services/vtex/vtex-catalog.js.map +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/src/tools/vtex/__tests__/catalog-navigation-reads.test.js +21 -2
- package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js.map +2 -2
- package/dist/src/tools/vtex/catalog-navigation-reads.js +1 -1
- package/dist/src/tools/vtex/catalog-navigation-reads.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
|
@@ -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
|
}
|
|
@@ -38,8 +38,12 @@ const shipmentsSchema = [
|
|
|
38
38
|
"logistic_type",
|
|
39
39
|
"mode",
|
|
40
40
|
"currency_id",
|
|
41
|
-
"cost"
|
|
41
|
+
"cost",
|
|
42
|
+
"buyer_shipping_paid"
|
|
42
43
|
];
|
|
44
|
+
function getFirstPayment(order) {
|
|
45
|
+
return asRecord(asArray(order.payments)[0]);
|
|
46
|
+
}
|
|
43
47
|
function safeRate(numerator, denominator) {
|
|
44
48
|
if (!Number.isFinite(denominator) || denominator <= 0) {
|
|
45
49
|
return 0;
|
|
@@ -150,7 +154,8 @@ function formatCompactShipmentRow(params) {
|
|
|
150
154
|
params.logisticType,
|
|
151
155
|
params.mode,
|
|
152
156
|
params.currencyId,
|
|
153
|
-
params.cost
|
|
157
|
+
params.cost,
|
|
158
|
+
params.buyerShippingPaid
|
|
154
159
|
];
|
|
155
160
|
}
|
|
156
161
|
function buildShippingCalculations(params) {
|
|
@@ -162,6 +167,11 @@ function buildShippingCalculations(params) {
|
|
|
162
167
|
shipments: bucket.shipments,
|
|
163
168
|
shipments_with_cost: bucket.shipments_with_cost,
|
|
164
169
|
zero_cost_shipments: bucket.zero_cost_shipments,
|
|
170
|
+
buyer_shipping_paid_total: roundMoney(bucket.total_buyer_shipping_paid),
|
|
171
|
+
orders_with_buyer_shipping_paid: bucket.orders_with_buyer_shipping_paid,
|
|
172
|
+
avg_buyer_shipping_paid_per_order_with_payment: roundMoney(
|
|
173
|
+
bucket.total_buyer_shipping_paid / Math.max(1, bucket.orders_with_buyer_shipping_paid)
|
|
174
|
+
),
|
|
165
175
|
avg_cost_per_shipment: roundMoney(bucket.total_cost / Math.max(1, bucket.shipments)),
|
|
166
176
|
avg_cost_per_shipment_with_cost: roundMoney(
|
|
167
177
|
bucket.total_cost / Math.max(1, bucket.shipments_with_cost)
|
|
@@ -315,14 +325,22 @@ async function meliGetShippingSummaryHandler(params) {
|
|
|
315
325
|
const ordersWithShipping = allOrders.reduce((count, order) => {
|
|
316
326
|
return normalizeScalarString(asRecord(order.shipping).id) ? count + 1 : count;
|
|
317
327
|
}, 0);
|
|
318
|
-
const
|
|
328
|
+
const ordersByShipmentId = /* @__PURE__ */ new Map();
|
|
329
|
+
const primaryOrderByShipmentId = /* @__PURE__ */ new Map();
|
|
319
330
|
for (const order of allOrders) {
|
|
320
331
|
const shipmentId = normalizeScalarString(asRecord(order.shipping).id);
|
|
321
|
-
if (
|
|
322
|
-
|
|
332
|
+
if (!shipmentId) {
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
const shipmentOrders = ordersByShipmentId.get(shipmentId);
|
|
336
|
+
if (shipmentOrders) {
|
|
337
|
+
shipmentOrders.push(order);
|
|
338
|
+
} else {
|
|
339
|
+
ordersByShipmentId.set(shipmentId, [order]);
|
|
340
|
+
primaryOrderByShipmentId.set(shipmentId, order);
|
|
323
341
|
}
|
|
324
342
|
}
|
|
325
|
-
const shipmentIds = [...
|
|
343
|
+
const shipmentIds = [...ordersByShipmentId.keys()];
|
|
326
344
|
const statusCounts = /* @__PURE__ */ new Map();
|
|
327
345
|
const substatusCounts = /* @__PURE__ */ new Map();
|
|
328
346
|
const logisticTypeCounts = /* @__PURE__ */ new Map();
|
|
@@ -354,7 +372,7 @@ async function meliGetShippingSummaryHandler(params) {
|
|
|
354
372
|
);
|
|
355
373
|
shipmentsBatch.failed.forEach((failure) => {
|
|
356
374
|
failures.push({
|
|
357
|
-
order_id: normalizeScalarString(
|
|
375
|
+
order_id: normalizeScalarString(primaryOrderByShipmentId.get(failure.id)?.id),
|
|
358
376
|
shipment_id: failure.id,
|
|
359
377
|
stage: "shipment",
|
|
360
378
|
message: failure.message,
|
|
@@ -365,7 +383,7 @@ async function meliGetShippingSummaryHandler(params) {
|
|
|
365
383
|
});
|
|
366
384
|
costsBatch.failed.forEach((failure) => {
|
|
367
385
|
failures.push({
|
|
368
|
-
order_id: normalizeScalarString(
|
|
386
|
+
order_id: normalizeScalarString(primaryOrderByShipmentId.get(failure.id)?.id),
|
|
369
387
|
shipment_id: failure.id,
|
|
370
388
|
stage: "costs",
|
|
371
389
|
message: failure.message,
|
|
@@ -380,14 +398,26 @@ async function meliGetShippingSummaryHandler(params) {
|
|
|
380
398
|
if (!shipment || !costs) {
|
|
381
399
|
continue;
|
|
382
400
|
}
|
|
383
|
-
const
|
|
401
|
+
const shipmentOrders = ordersByShipmentId.get(shipmentId) ?? [];
|
|
402
|
+
const primaryOrder = primaryOrderByShipmentId.get(shipmentId);
|
|
384
403
|
const shipmentStatus = normalizeString(shipment.status, "unknown");
|
|
385
404
|
const shipmentSubstatus = normalizeString(shipment.substatus, "unknown");
|
|
386
405
|
const logisticType = normalizeString(shipment.logistic_type);
|
|
387
406
|
const mode = normalizeString(shipment.mode);
|
|
388
|
-
const currencyId = normalizeString(
|
|
407
|
+
const currencyId = normalizeString(primaryOrder?.currency_id, "UNKNOWN");
|
|
389
408
|
const shipmentCost = roundMoney(extractShipmentCost(costs));
|
|
390
|
-
const
|
|
409
|
+
const buyerShippingPaid = roundMoney(
|
|
410
|
+
shipmentOrders.reduce((sum, shipmentOrder) => {
|
|
411
|
+
return sum + roundMoney(toNumber(getFirstPayment(shipmentOrder).shipping_cost));
|
|
412
|
+
}, 0)
|
|
413
|
+
);
|
|
414
|
+
const ordersWithBuyerShippingPaid = shipmentOrders.reduce((count, shipmentOrder) => {
|
|
415
|
+
return roundMoney(toNumber(getFirstPayment(shipmentOrder).shipping_cost)) > 0 ? count + 1 : count;
|
|
416
|
+
}, 0);
|
|
417
|
+
const dayBucket = getLocalDateBucket(
|
|
418
|
+
normalizeString(primaryOrder?.date_created),
|
|
419
|
+
BUSINESS_TIME_ZONE
|
|
420
|
+
);
|
|
391
421
|
shipmentsInspected += 1;
|
|
392
422
|
incrementCount(statusCounts, shipmentStatus);
|
|
393
423
|
incrementCount(substatusCounts, shipmentSubstatus);
|
|
@@ -406,15 +436,19 @@ async function meliGetShippingSummaryHandler(params) {
|
|
|
406
436
|
shipments: 0,
|
|
407
437
|
shipments_with_cost: 0,
|
|
408
438
|
zero_cost_shipments: 0,
|
|
409
|
-
total_cost: 0
|
|
439
|
+
total_cost: 0,
|
|
440
|
+
total_buyer_shipping_paid: 0,
|
|
441
|
+
orders_with_buyer_shipping_paid: 0
|
|
410
442
|
}));
|
|
411
443
|
bucket.shipments += 1;
|
|
412
444
|
bucket.total_cost += shipmentCost;
|
|
445
|
+
bucket.total_buyer_shipping_paid += buyerShippingPaid;
|
|
413
446
|
if (shipmentCost > 0) {
|
|
414
447
|
bucket.shipments_with_cost += 1;
|
|
415
448
|
} else {
|
|
416
449
|
bucket.zero_cost_shipments += 1;
|
|
417
450
|
}
|
|
451
|
+
bucket.orders_with_buyer_shipping_paid += ordersWithBuyerShippingPaid;
|
|
418
452
|
if (dayBucket) {
|
|
419
453
|
const dayMetric = dailyMetrics.get(dayBucket) ?? {
|
|
420
454
|
date: dayBucket,
|
|
@@ -440,14 +474,15 @@ async function meliGetShippingSummaryHandler(params) {
|
|
|
440
474
|
if (responseMode === "shipments_chunk") {
|
|
441
475
|
shipmentRows.push(
|
|
442
476
|
formatCompactShipmentRow({
|
|
443
|
-
orderId: normalizeScalarString(
|
|
477
|
+
orderId: normalizeScalarString(primaryOrder?.id),
|
|
444
478
|
shipmentId,
|
|
445
479
|
status: shipmentStatus,
|
|
446
480
|
substatus: shipmentSubstatus,
|
|
447
481
|
logisticType,
|
|
448
482
|
mode,
|
|
449
483
|
currencyId,
|
|
450
|
-
cost: shipmentCost
|
|
484
|
+
cost: shipmentCost,
|
|
485
|
+
buyerShippingPaid
|
|
451
486
|
})
|
|
452
487
|
);
|
|
453
488
|
}
|
|
@@ -455,6 +490,7 @@ async function meliGetShippingSummaryHandler(params) {
|
|
|
455
490
|
}
|
|
456
491
|
for (const metrics of Object.values(costsByCurrency)) {
|
|
457
492
|
metrics.total_cost = roundMoney(metrics.total_cost);
|
|
493
|
+
metrics.total_buyer_shipping_paid = roundMoney(metrics.total_buyer_shipping_paid);
|
|
458
494
|
}
|
|
459
495
|
const metadata = buildShippingSummaryMetadata({
|
|
460
496
|
total: paging.total,
|