---
swagger: '2.0'
info:
  description: "Servicios que calculan y retornan fechas de entrega al cliente"
  version: 1.0.0
  title: "micro-service-delivery"
  contact:
    email: "customerorder.devops@irdigital.pe"
host: "qa.api.co.irdigital.pe"
basePath: "/business-irdgco-delivery/v1"
tags:
  - name: "delivery"
    description: "Cálculo y consulta de fechas de entrega al cliente"
  - name: "date"
    description: "Gestión de fechas de entrega al cliente"
schemes:
  - "https"
  - "http"
paths:
  /delivery/capacity:
    post:
      tags:
        - "delivery"
      summary: "Obtiene la fecha de entrega disponible para el grupo de productos especificado"
      description: "Cálcula la fecha de entrega de un grupo de productos basandose en los despachos que esta generaría, utilizando lógica de capacidad"
      operationId: "getDeliveryCapacity"
      consumes:
        - "application/json"
      produces:
        - "application/json"
      parameters:
        - in: "body"
          name: "body"
          description: "Lista de elementos a los cuáles se desea calcular la fecha de entrega"
          required: true
          schema:
            $ref: "#/definitions/DeliveryDateRequestDTO"
      responses:
        "200":
          description: "Fecha de entrega al cliente obtenida exitosamente"
          schema:
            type: "array"
            items:
              $ref: "#/definitions/DeliveryDateDTO"
        "400":
          description: "Solicitud inválida o parámetros incorrectos"
          schema:
            type: string
            example: "Bad Request"
        "404":
          description: "No se encontraron rutas para procesar el cálculo de fecha"
          schema:
            type: string
            example: "Not Found"
        "500":
          description: "Error calculando la fecha de entrega"
          schema:
            type: string
            example: "Internal Server Error"
definitions:
  DeliveryDateRequestDTO:
    type: "object"
    properties:
      purchaseDate:
        type: "string"
        description: "Fecha de compra"
        example: "2024-01-15"
      isLastRoute:
        type: "boolean"
        description: "Indica si es la última ruta"
      isPurchaseOrderDeliveryDateRequest:
        type: "boolean"
        description: "Indica si es una solicitud de fecha de entrega de orden de compra"
      items:
        type: "array"
        description: "Lista de items de despacho"
        items:
          $ref: "#/definitions/DispatchDTO"
  DispatchDTO:
    type: "object"
    properties:
      origin:
        type: "string"
        description: "Código de origen del despacho"
      entityType:
        type: "string"
        description: "Tipo de entidad"
        enum:
          - "CD"
          - "TD"
          - "PRV"
          - "SELLER"
      skuCode:
        type: "string"
        description: "Código SKU del producto"
      line:
        type: "string"
        description: "Línea o jerarquía del producto"
      zone:
        type: "string"
        description: "Zona de despacho"
      zoneByChannel:
        type: "string"
        description: "Zona por canal de venta"
      dispatchType:
        type: "string"
        description: "Tipo de despacho"
        enum:
          - "NORMAL"
          - "EXPRESS"
      quantity:
        type: "number"
        format: "double"
        description: "Cantidad del producto"
      measurable:
        type: "string"
        description: "Unidad de medida"
      destination:
        type: "string"
        description: "Destino del despacho"
      units:
        type: "integer"
        description: "Unidades"
      division:
        type: "string"
        description: "División del producto"
      province:
        type: "string"
        description: "Provincia de destino"
      weight:
        type: "number"
        format: "double"
        description: "Peso del producto"
      hasFreightAttributeConfiguration:
        type: "boolean"
        description: "Indica si tiene configuración de atributo de flete"
        default: false
      attributes:
        type: "array"
        description: "Atributos del producto"
        items:
          $ref: "#/definitions/ProductAttributesDTO"
      latitude:
        type: "number"
        format: "double"
        description: "Latitud de la dirección de entrega"
      longitude:
        type: "number"
        format: "double"
        description: "Longitud de la dirección de entrega"
      saleChannel:
        type: "string"
        description: "Canal de venta"
      presentationCode:
        type: "string"
        description: "Código de presentación"
      entityCode:
        type: "string"
        description: "Código de entidad"
      groupName:
        type: "string"
        description: "Nombre del grupo"
      deliveryMode:
        type: "string"
        description: "Modo de entrega"
        enum:
          - "HOME_DELIVERY"
          - "STORE_WITHDRAWAL"
  ProductAttributesDTO:
    type: "object"
    properties:
      attribute:
        type: "string"
        description: "Nombre del atributo"
      attributeValue:
        type: "string"
        description: "Valor del atributo"
      attributeCode:
        type: "string"
        description: "Código del atributo"
  DeliveryDateDTO:
    type: "object"
    properties:
      skuCode:
        type: "string"
        description: "Código SKU del producto"
      line:
        type: "string"
        description: "Línea o jerarquía del producto"
      dispatchCode:
        type: "string"
        description: "Código de despacho"
      deliveryCost:
        type: "number"
        format: "double"
        description: "Costo de entrega"
      measurable:
        type: "string"
        description: "Unidad de medida"
      origin:
        type: "string"
        description: "Origen del despacho"
      zone:
        type: "string"
        description: "Zona de entrega"
      pickingDays:
        type: "array"
        description: "Días de picking"
        items:
          type: "string"
      processingDays:
        type: "integer"
        description: "Días de procesamiento"
      leadTimes:
        type: "array"
        description: "Tiempos de entrega"
        items:
          type: "integer"
      routeDaysOfWeek:
        type: "array"
        description: "Días de la semana por ruta"
        items:
          type: "array"
          items:
            type: "string"
      route:
        type: "string"
        description: "Ruta de despacho"
      pickingDate:
        type: "string"
        format: "date"
        description: "Fecha de picking (yyyy-MM-dd)"
      deliveryDates:
        type: "array"
        description: "Fechas de entrega disponibles"
        items:
          type: "string"
          format: "date"
      deliveryTrace:
        type: "array"
        description: "Trazabilidad del despacho"
        items:
          $ref: "#/definitions/DeliveryTraceDTO"
      message:
        type: "string"
        description: "Mensaje informativo o de error"
      division:
        type: "string"
        description: "División del producto"
      arriveDates:
        type: "array"
        description: "Fechas de arribo por nodo"
        items:
          $ref: "#/definitions/ArriveDateDTO"
      detailedCapacityError:
        type: "array"
        description: "Detalle de errores de capacidad"
        items:
          $ref: "#/definitions/DetailedCapacityErrorItemDTO"
  DeliveryTraceDTO:
    type: "object"
    properties:
      deliveryDate:
        type: "string"
        format: "date"
        description: "Fecha de entrega (yyyy-MM-dd)"
      details:
        type: "array"
        description: "Detalles de la traza de entrega"
        items:
          $ref: "#/definitions/DeliveryTraceDetail"
      deliveryWindows:
        type: "array"
        description: "Ventanas de entrega disponibles"
        items:
          $ref: "#/definitions/DeliveryWindowDTO"
  DeliveryTraceDetail:
    type: "object"
    properties:
      sourceNode:
        type: "string"
        description: "Nodo origen"
      targetNode:
        type: "string"
        description: "Nodo destino"
      route:
        type: "string"
        description: "Identificador de ruta"
      usedDispatchCapacity:
        type: "integer"
        description: "Capacidad de despacho utilizada"
      usedPickingCapacity:
        type: "integer"
        description: "Capacidad de picking utilizada"
      dispatchDate:
        type: "string"
        format: "date"
        description: "Fecha de despacho (yyyy-MM-dd)"
      dispatchUnits:
        type: "integer"
        description: "Unidades despachadas"
      leadTime:
        type: "integer"
        description: "Tiempo de entrega en días"
      daysOfWeek:
        type: "string"
        description: "Días de la semana habilitados"
      departureDate:
        type: "string"
        format: "date"
        description: "Fecha de salida (yyyy-MM-dd)"
      receptionDate:
        type: "string"
        format: "date"
        description: "Fecha de recepción (yyyy-MM-dd)"
  DeliveryWindowDTO:
    type: "object"
    properties:
      deliveryWindow:
        type: "string"
        description: "Ventana de entrega"
      deliveryWindowStart:
        type: "string"
        description: "Hora de inicio de la ventana"
      deliveryWindowEnd:
        type: "string"
        description: "Hora de fin de la ventana"
      blocked:
        type: "boolean"
        description: "Indica si la ventana está bloqueada"
  ArriveDateDTO:
    type: "object"
    properties:
      node:
        type: "string"
        description: "Nodo de la ruta"
      nodePurchaseOrder:
        type: "string"
        description: "Nodo de la orden de compra"
      edgeId:
        type: "string"
        description: "Identificador del arco de la ruta"
      arriveDate:
        type: "string"
        format: "date"
        description: "Fecha de arribo (yyyy-MM-dd)"
      code:
        type: "integer"
        description: "Código de estado"
      message:
        type: "string"
        description: "Mensaje informativo"
  DetailedCapacityErrorItemDTO:
    type: "object"
    properties:
      code:
        type: "string"
        description: "Código de error de capacidad"
      details:
        type: "array"
        description: "Detalles del error de capacidad"
        items:
          $ref: "#/definitions/DetailedCapacityErrorDTO"
      providerDetails:
        $ref: "#/definitions/DetailedProviderCapacityDTO"
  DetailedCapacityErrorDTO:
    type: "object"
    properties:
      errorCode:
        type: "string"
        description: "Código de error"
      description:
        type: "string"
        description: "Descripción del error"
      sku:
        type: "string"
        description: "SKU del producto afectado"
      requestedQuantity:
        type: "number"
        format: "double"
        description: "Cantidad solicitada"
      availableQuantity:
        type: "number"
        format: "double"
        description: "Cantidad disponible"
  DetailedProviderCapacityDTO:
    type: "object"
    description: "Detalles de capacidad del proveedor"
    properties:
      providerCode:
        type: "string"
        description: "Código del proveedor"
      availableCapacity:
        type: "number"
        format: "double"
        description: "Capacidad disponible del proveedor"
      usedCapacity:
        type: "number"
        format: "double"
        description: "Capacidad utilizada del proveedor"
      totalCapacity:
        type: "number"
        format: "double"
        description: "Capacidad total del proveedor"
      date:
        type: "string"
        format: "date"
        description: "Fecha de la capacidad (yyyy-MM-dd)"

