> ## Documentation Index
> Fetch the complete documentation index at: https://docs.x-mart.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Enrich order with taxes

> Calcula impuestos sobre líneas principales (`order.products[].price.totalPrice`) y modificadores según reglas fiscales
y guarda la orden en base de datos (upsert por `orderId`).
El cuerpo puede ser `OrderPayload` en la raíz o envuelto en un objeto con propiedad `payload`.
Requisitos: body no vacío; `orderId` presente en el payload para respuesta 200.




## OpenAPI

````yaml api-reference/openapi.json POST /enrich-order
openapi: 3.0.1
info:
  title: Api V3 documentación
  description: >-
    A sample API that uses a plant store as an example to demonstrate features
    in the OpenAPI specification
  license:
    name: MIT
  version: 1.0.0
servers:
  - url: https://api.artisn.desarrollo-redbrand.com/api
  - url: https://api.kfc-group.desarrollo-redbrand.com
  - url: https://{apiId}.execute-api.{region}.amazonaws.com/{stage}
    description: API Gateway (PRIVATE; invocación típica vía VPC endpoint).
    variables:
      apiId:
        default: '{api-id}'
        description: ID del API REST desplegado.
      region:
        default: us-east-1
      stage:
        default: dev
        description: Mismo valor que parámetro EnvironmentName del stack.
security:
  - bearerAuth: []
paths:
  /enrich-order:
    post:
      tags:
        - Orders
      summary: Enriquecer orden con impuestos
      description: >
        Calcula impuestos sobre líneas principales
        (`order.products[].price.totalPrice`) y modificadores según reglas
        fiscales

        y guarda la orden en base de datos (upsert por `orderId`).

        El cuerpo puede ser `OrderPayload` en la raíz o envuelto en un objeto
        con propiedad `payload`.

        Requisitos: body no vacío; `orderId` presente en el payload para
        respuesta 200.
      operationId: enrichOrder
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EnrichOrderRequest'
            examples:
              simple:
                summary: Payload mínimo
                description: >-
                  Una orden, una tienda, un ítem con precio; mismo cuerpo válido
                  para `/enrich-order-forward`.
                value:
                  payload:
                    orderId: ord-001
                    store:
                      id: '21'
                    order:
                      products:
                        - modifierGroups:
                            - selectedModifiers:
                                - productId: sku-001
                                  price:
                                    totalPrice:
                                      total: 10.5
              conPayload:
                summary: Forma recomendada — payload anidado
                description: >-
                  Orden bajo la propiedad `payload` (compatible con envoltorios
                  upstream).
                value:
                  payload:
                    orderId: ord-2025-001
                    source: pos
                    store:
                      id: store-br-01
                      code: BR01
                      name: Tienda Centro
                    order:
                      products:
                        - productId: sku-burger-001
                          modifierGroups:
                            - selectedModifiers:
                                - productId: mod-cheese
                                  quantity: 1
                                  price:
                                    unitPrice:
                                      currencyCode: BRL
                                      subtotalWithoutTaxes: 2.5
                    payments:
                      totals:
                        - currencyCode: BRL
                          total: 32.9
              plano:
                summary: OrderPayload en la raíz
                description: >-
                  Mismo contrato sin envoltorio `payload` (el handler acepta
                  ambos).
                value:
                  orderId: ord-2025-002
                  source: kiosk
                  store:
                    id: store-br-02
                  order:
                    products:
                      - productId: sku-drink-010
      responses:
        '200':
          description: Orden enriquecida y persistida
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnrichOrderSuccessResponse'
              examples:
                ok:
                  summary: Respuesta exitosa
                  value:
                    message: Orden enriquecida exitosamente.
                    orderDbId: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                    orderId: ord-2025-001
                    payload:
                      orderId: ord-2025-001
                      source: pos
                      store:
                        id: store-br-01
                      order:
                        products: []
        '400':
          description: >
            Body ausente, validación (p. ej. sin orderId), o datos fiscales
            incompletos:

            sin NCM/catálogo para un `productId`, sin regla en la matriz de la
            tienda para el NCM, o sin bloque `price.totalPrice`
            (null/undefined). Importes 0 en `totalPrice` no son error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnrichOrderErrorResponse'
              examples:
                sinBody:
                  summary: Sin cuerpo
                  value:
                    message: Body requerido.
                sinOrderId:
                  summary: Falta orderId
                  value:
                    message: No se encontro orderId en el payload.
                fiscalProducto:
                  summary: Producto sin NCM en catálogo
                  value:
                    message: >-
                      No se encontró categoría fiscal (NCM) para el producto con
                      productId="sku-123".
                    code: FISCAL_PRODUCTO_SIN_NCM
                fiscalMatriz:
                  summary: NCM sin regla en matriz de la tienda
                  value:
                    message: >-
                      No hay regla fiscal en la matriz de la tienda
                      (store_id=21) para NCM="21069090" (producto
                      productId="sku-123").
                    code: FISCAL_MATRIZ_SIN_NCM
                fiscalPrecio:
                  summary: Falta bloque totalPrice
                  value:
                    message: >-
                      Falta el bloque price.totalPrice para el producto
                      productId="sku-123".
                    code: FISCAL_PRECIO_AUSENTE
        '500':
          description: Error al enriquecer o al persistir
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnrichOrderErrorResponse'
              examples:
                error:
                  summary: Error interno
                  value:
                    message: No se pudo enriquecer la orden.
                    error: 'Error: ...'
components:
  schemas:
    EnrichOrderRequest:
      description: >
        Raíz flexible: puede incluir `payload` u omitirse (entonces los campos
        de orden van en la raíz).

        Se permiten propiedades adicionales no listadas.
      type: object
      additionalProperties: true
      properties:
        payload:
          $ref: '#/components/schemas/OrderPayload'
    EnrichOrderSuccessResponse:
      type: object
      required:
        - message
        - orderDbId
        - orderId
        - payload
      properties:
        message:
          type: string
          example: Orden enriquecida exitosamente.
        orderDbId:
          type: string
          format: uuid
          description: ID interno en Postgres (tabla de órdenes).
        orderId:
          type: string
          description: Identificador de negocio recibido en la petición.
        payload:
          description: >-
            Payload enriquecido: OrderPayload en la raíz, u objeto con propiedad
            `payload` anidando OrderPayload.
          oneOf:
            - $ref: '#/components/schemas/OrderPayload'
            - type: object
              required:
                - payload
              properties:
                payload:
                  $ref: '#/components/schemas/OrderPayload'
    EnrichOrderErrorResponse:
      type: object
      required:
        - message
      properties:
        message:
          type: string
        error:
          type: string
          description: Detalle encadenado en errores 500 o 502.
        code:
          type: string
          description: >
            Presente en 400 por datos fiscales: FISCAL_PRODUCTO_SIN_NCM,
            FISCAL_MATRIZ_SIN_NCM, FISCAL_PRECIO_AUSENTE (solo si falta el
            bloque `totalPrice`, no por importes en 0).
    OrderPayload:
      type: object
      additionalProperties: true
      description: >-
        Datos de la orden (productos, tienda, pagos). `orderId` obligatorio para
        200.
      properties:
        orderId:
          type: string
          example: ord-2025-001
        source:
          type: string
          example: pos
        store:
          type: object
          properties:
            id:
              type: string
            code:
              type: string
            name:
              type: string
        order:
          type: object
          properties:
            products:
              type: array
              items:
                type: object
        payments:
          type: object
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````