openapi: 3.0.3
info:
  title: 'Tequilas y Mezcales API Documentation'
  description: ''
  version: 1.0.0
servers:
  -
    url: 'https://tequilas-mezcales.test'
tags:
  -
    name: 'Autenticación 2FA'
    description: "\nControlador para manejar la autenticación de dos factores (2FA).\nPermite configurar y verificar códigos usando Email, WhatsApp y TOTP."
  -
    name: Base
    description: ''
  -
    name: Compras
    description: ''
  -
    name: Dashboard
    description: ''
  -
    name: Inventario
    description: ''
  -
    name: Login
    description: ''
  -
    name: Promociones
    description: ''
  -
    name: 'Punto de Venta'
    description: ''
components:
  securitySchemes:
    default:
      type: http
      scheme: bearer
      description: 'You can retrieve your token by visiting your dashboard and clicking <b>Generate API token</b>.'
security:
  -
    default: []
paths:
  /api/v1/2fa/configuracion-inicial:
    post:
      summary: 'Configuración inicial de 2FA'
      operationId: configuracinInicialDe2FA
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  data:
                    usuario_nombre: 'Juan Pérez'
                    metodos_disponibles:
                      -
                        tipo: Email
                        nombre: 'Correo Electrónico'
                        descripcion: 'Solicitaremos tu correo electrónico'
                        destino: 'u***r@domain.com'
                        icono: mail
                    mensaje: 'Necesitamos aumentar la seguridad de tu cuenta...'
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    type: object
                    properties:
                      usuario_nombre:
                        type: string
                        example: 'Juan Pérez'
                      metodos_disponibles:
                        type: array
                        example:
                          -
                            tipo: Email
                            nombre: 'Correo Electrónico'
                            descripcion: 'Solicitaremos tu correo electrónico'
                            destino: 'u***r@domain.com'
                            icono: mail
                        items:
                          type: object
                          properties:
                            tipo:
                              type: string
                              example: Email
                            nombre:
                              type: string
                              example: 'Correo Electrónico'
                            descripcion:
                              type: string
                              example: 'Solicitaremos tu correo electrónico'
                            destino:
                              type: string
                              example: 'u***r@domain.com'
                            icono:
                              type: string
                              example: mail
                      mensaje:
                        type: string
                        example: 'Necesitamos aumentar la seguridad de tu cuenta...'
      tags:
        - 'Autenticación 2FA'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                temp_token:
                  type: string
                  description: 'Token temporal de configuración.'
                  example: a1b2c3d4...
                  nullable: false
              required:
                - temp_token
  /api/v1/2fa/configurar-metodo-inicial:
    post:
      summary: 'Configurar método inicial de 2FA'
      operationId: configurarMtodoInicialDe2FA
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Escanea el código QR con Microsoft Authenticator'
                  require_qr_setup: true
                  qr_url: 'https://chart.googleapis.com/chart?chs=200x200...'
                  manual_key: JBSWY3DPEHPK3PXP
                  temp_token: a1b2c3d4...
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Escanea el código QR con Microsoft Authenticator'
                  require_qr_setup:
                    type: boolean
                    example: true
                  qr_url:
                    type: string
                    example: 'https://chart.googleapis.com/chart?chs=200x200...'
                  manual_key:
                    type: string
                    example: JBSWY3DPEHPK3PXP
                  temp_token:
                    type: string
                    example: a1b2c3d4...
      tags:
        - 'Autenticación 2FA'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                temp_token:
                  type: string
                  description: 'Token temporal.'
                  example: a1b2c3d4...
                  nullable: false
                metodo:
                  type: string
                  description: 'Método a configurar.'
                  example: TOTP
                  nullable: false
                numero_whatsapp:
                  type: string
                  description: 'Número de WhatsApp (requerido si método es WhatsApp).'
                  example: '+521234567890'
                  nullable: true
              required:
                - temp_token
                - metodo
  /api/v1/2fa/activar-totp-inicial:
    post:
      summary: 'Activar TOTP durante configuración inicial'
      operationId: activarTOTPDuranteConfiguracinInicial
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Microsoft Authenticator activado correctamente'
                  metodo_configurado: TOTP
                  temp_token: new_temp_token
                  redirect_to: 2fa-verification
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Microsoft Authenticator activado correctamente'
                  metodo_configurado:
                    type: string
                    example: TOTP
                  temp_token:
                    type: string
                    example: new_temp_token
                  redirect_to:
                    type: string
                    example: 2fa-verification
      tags:
        - 'Autenticación 2FA'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                temp_token:
                  type: string
                  description: 'Token temporal.'
                  example: a1b2c3d4...
                  nullable: false
                codigo:
                  type: string
                  description: 'Código TOTP de 6 dígitos.'
                  example: '123456'
                  nullable: false
              required:
                - temp_token
                - codigo
  /api/v1/2fa/seleccionar-metodo:
    post:
      summary: 'Seleccionar método de 2FA después del login'
      operationId: seleccionarMtodoDe2FADespusDelLogin
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  metodos:
                    -
                      tipo: Email
                      descripcion: 'Código enviado a tu correo electrónico'
                      destino: 'u***r@domain.com'
                  metodo_preferido: Email
                properties:
                  success:
                    type: boolean
                    example: true
                  metodos:
                    type: array
                    example:
                      -
                        tipo: Email
                        descripcion: 'Código enviado a tu correo electrónico'
                        destino: 'u***r@domain.com'
                    items:
                      type: object
                      properties:
                        tipo:
                          type: string
                          example: Email
                        descripcion:
                          type: string
                          example: 'Código enviado a tu correo electrónico'
                        destino:
                          type: string
                          example: 'u***r@domain.com'
                  metodo_preferido:
                    type: string
                    example: Email
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  code: 404
                  message: 'Usuario no encontrado'
                properties:
                  code:
                    type: integer
                    example: 404
                  message:
                    type: string
                    example: 'Usuario no encontrado'
      tags:
        - 'Autenticación 2FA'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                usuario_id:
                  type: string
                  description: 'ID del usuario codificado en base64.'
                  example: eyJpdiI6Ik...
                  nullable: false
              required:
                - usuario_id
  /api/v1/2fa/enviar-codigo:
    post:
      summary: 'Enviar código de verificación'
      operationId: enviarCdigoDeVerificacin
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Código enviado a tu correo electrónico'
                  destino: 'u***r@domain.com'
                  expira_en: 600
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Código enviado a tu correo electrónico'
                  destino:
                    type: string
                    example: 'u***r@domain.com'
                  expira_en:
                    type: integer
                    example: 600
      tags:
        - 'Autenticación 2FA'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                temp_token:
                  type: string
                  description: 'Token temporal de verificación (64 chars).'
                  example: a1b2c3d4...
                  nullable: false
                metodo:
                  type: string
                  description: 'Método de envío del código.'
                  example: Email
                  nullable: false
              required:
                - temp_token
                - metodo
  /api/v1/2fa/verificar-codigo:
    post:
      summary: 'Verificar código y completar login'
      operationId: verificarCdigoYCompletarLogin
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Verificación exitosa. Bienvenido.'
                  token: auth_token_here
                  usuario:
                    id: 1
                    nombre: 'Juan Pérez'
                    perfil: 2
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Verificación exitosa. Bienvenido.'
                  token:
                    type: string
                    example: auth_token_here
                  usuario:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      nombre:
                        type: string
                        example: 'Juan Pérez'
                      perfil:
                        type: integer
                        example: 2
      tags:
        - 'Autenticación 2FA'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                temp_token:
                  type: string
                  description: 'Token temporal de verificación.'
                  example: a1b2c3d4...
                  nullable: false
                metodo:
                  type: string
                  description: 'Método de 2FA utilizado.'
                  example: Email
                  nullable: false
                codigo:
                  type: string
                  description: 'Código de 6 caracteres.'
                  example: 1A2B3C
                  nullable: false
              required:
                - temp_token
                - metodo
                - codigo
  /api/v1/2fa/configurar:
    post:
      summary: 'Configurar 2FA para un usuario autenticado'
      operationId: configurar2FAParaUnUsuarioAutenticado
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  code: 200
                  message: '2FA habilitado con método: TOTP'
                  data:
                    metodo_activo: TOTP
                properties:
                  code:
                    type: integer
                    example: 200
                  message:
                    type: string
                    example: '2FA habilitado con método: TOTP'
                  data:
                    type: object
                    properties:
                      metodo_activo:
                        type: string
                        example: TOTP
      tags:
        - 'Autenticación 2FA'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                metodo:
                  type: string
                  description: 'Método de 2FA a configurar (null para deshabilitar).'
                  example: TOTP
                  nullable: true
                numero_whatsapp:
                  type: string
                  description: 'Número de WhatsApp (si aplica).'
                  example: '+521234567890'
                  nullable: true
  /api/v1/2fa/estado:
    get:
      summary: 'Obtener estado actual de 2FA del usuario autenticado'
      operationId: obtenerEstadoActualDe2FADelUsuarioAutenticado
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  data:
                    habilitado: true
                    metodo_activo: Email
                    tiene_secreto_totp: false
                    metodos_disponibles:
                      - Email
                      - TOTP
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    type: object
                    properties:
                      habilitado:
                        type: boolean
                        example: true
                      metodo_activo:
                        type: string
                        example: Email
                      tiene_secreto_totp:
                        type: boolean
                        example: false
                      metodos_disponibles:
                        type: array
                        example:
                          - Email
                          - TOTP
                        items:
                          type: string
      tags:
        - 'Autenticación 2FA'
  /api/v1/2fa/configurar-totp:
    post:
      summary: 'Configurar Microsoft Authenticator (generar QR)'
      operationId: configurarMicrosoftAuthenticatorgenerarQR
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Escanea el código QR con Microsoft Authenticator'
                  qr_url: 'https://chart.googleapis.com/chart?chs=200x200...'
                  manual_key: JBSWY3DPEHPK3PXP
                  issuer: 'Educa Deporte'
                  account: user@example.com
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Escanea el código QR con Microsoft Authenticator'
                  qr_url:
                    type: string
                    example: 'https://chart.googleapis.com/chart?chs=200x200...'
                  manual_key:
                    type: string
                    example: JBSWY3DPEHPK3PXP
                  issuer:
                    type: string
                    example: 'Educa Deporte'
                  account:
                    type: string
                    example: user@example.com
      tags:
        - 'Autenticación 2FA'
  /api/v1/2fa/activar-totp:
    post:
      summary: 'Verificar y activar Microsoft Authenticator'
      operationId: verificarYActivarMicrosoftAuthenticator
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  code: 200
                  message: 'Microsoft Authenticator activado correctamente'
                  data:
                    metodo_activo: TOTP
                properties:
                  code:
                    type: integer
                    example: 200
                  message:
                    type: string
                    example: 'Microsoft Authenticator activado correctamente'
                  data:
                    type: object
                    properties:
                      metodo_activo:
                        type: string
                        example: TOTP
      tags:
        - 'Autenticación 2FA'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                codigo:
                  type: string
                  description: 'Código TOTP de 6 dígitos.'
                  example: '123456'
                  nullable: false
              required:
                - codigo
  /api/v1/base/ruta/importar:
    post:
      summary: 'Importar rutas'
      operationId: importarRutas
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  /api/v1/base/ruta/autocomplete-web-php:
    get:
      summary: 'Autocomplete de rutas'
      operationId: autocompleteDeRutas
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
  /api/v1/base/ruta/accion-ruta:
    post:
      summary: 'Accion de ruta'
      operationId: accionDeRuta
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                rutaURL:
                  type: string
                  description: 'El url de la ruta'
                  example: 'http://kunze.biz/iste-laborum-eius-est-dolor.html'
                  nullable: false
                rutaMetodo:
                  type: string
                  description: 'El metodo de la ruta(get, post, put, delete)'
                  example: consequatur
                  nullable: false
                rutaClasificacion:
                  type: string
                  description: 'El clasificacion de la ruta(auxiliar, principal, multiple)'
                  example: consequatur
                  nullable: false
                rutaModulo:
                  type: string
                  description: 'El modulo de la ruta'
                  example: consequatur
                  nullable: false
                rutaDescripcion:
                  type: string
                  description: 'El descripcion de la ruta'
                  example: consequatur
                  nullable: false
                rutaControlador:
                  type: string
                  description: 'El controlador de la ruta'
                  example: consequatur
                  nullable: false
                idRuta:
                  type: integer
                  description: 'El id de la ruta'
                  example: 17
                  nullable: false
                rutaPermiso:
                  type: string
                  description: 'El permiso de la ruta'
                  example: consequatur
                  nullable: false
                rutaParametros:
                  type: string
                  description: 'nullable El parametros de la ruta'
                  example: consequatur
                  nullable: false
                rutaAccion:
                  type: string
                  description: 'nullable El accion de la ruta'
                  example: consequatur
                  nullable: false
                rutaMiddleware:
                  type: string
                  description: 'El middleware de la ruta'
                  example: consequatur
                  nullable: false
                rutaPrefix:
                  type: string
                  description: 'El prefix de la ruta'
                  example: consequatur
                  nullable: false
                rutaControladorDirectorio:
                  type: string
                  description: 'El controlador directorio de la ruta'
                  example: consequatur
                  nullable: false
              required:
                - rutaURL
                - rutaMetodo
                - rutaClasificacion
                - rutaModulo
                - rutaControlador
                - idRuta
                - rutaPermiso
  '/api/v1/base/ruta/eliminar/{idRuta}':
    post:
      summary: 'Eliminar ruta'
      operationId: eliminarRuta
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
    parameters:
      -
        in: path
        name: idRuta
        description: ''
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/ruta/validar:
    post:
      summary: ''
      operationId: postApiV1BaseRutaValidar
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  '/api/v1/base/ruta/activar/{id}':
    post:
      summary: 'Activar ruta'
      operationId: activarRuta
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the activar.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/ruta/lista:
    post:
      summary: 'Lista de rutas editado'
      operationId: listaDeRutasEditado
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  '/api/v1/base/ruta/ver-ruta/{id}':
    get:
      summary: 'Ver ruta'
      operationId: verRuta
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the ver rutum.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/ruta/info-ruta/{id}':
    get:
      summary: 'Informacion de ruta'
      operationId: informacionDeRuta
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the info rutum.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/usuario/lista:
    post:
      summary: 'Lista de usuarios'
      operationId: listaDeUsuarios
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  /api/v1/base/usuario/accion:
    post:
      summary: 'Accion de usuario'
      operationId: accionDeUsuario
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                usuarioNombre:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: vmqeopfuudtdsufvyvddq
                  nullable: false
                usuarioAlias:
                  type: string
                  description: 'Nombre del usuario.'
                  example: 'Juan Pérez'
                  nullable: false
                usuarioEmail:
                  type: string
                  description: 'Correo electrónico del usuario.'
                  example: juan@example.com
                  nullable: false
                idPerfil:
                  type: integer
                  description: 'ID del perfil asociado al usuario.'
                  example: 1
                  nullable: false
                usuarioPassword:
                  type: string
                  description: 'Contraseña del usuario.'
                  example: password123
                  nullable: false
                usuarioNotificacionWeb:
                  type: string
                  description: 'Indica si el usuario recibe notificaciones web. Valores permitidos: "Si" o "No".'
                  example: '"Si"'
                  nullable: true
                usuarioNotificacionWhatsApp:
                  type: string
                  description: 'Indica si el usuario recibe notificaciones por WhatsApp. Valores permitidos: "Si" o "No".'
                  example: '"No"'
                  nullable: true
                usuarioNotificacionMail:
                  type: string
                  description: 'Indica si el usuario recibe notificaciones por email. Valores permitidos: "Si" o "No".'
                  example: '"Si"'
                  nullable: true
                usuarioWhatsAppNumero:
                  type: string
                  description: 'Must be between 1 and 10 digits. Must match the regex /^[0-9]+$/.'
                  example: '1562'
                  nullable: true
                usuario2FAMetodo:
                  type: string
                  description: ''
                  example: SMS
                  nullable: true
                  enum:
                    - SMS
                    - Email
                    - 'Aplicación Google Authenticator'
              required:
                - usuarioNombre
                - usuarioAlias
                - usuarioEmail
                - idPerfil
                - usuarioPassword
  /api/v1/base/usuario/editar:
    post:
      summary: 'Editar usuario'
      operationId: editarUsuario
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                usuarioNombre:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: vmqeopfuudtdsufvyvddq
                  nullable: false
                usuarioAlias:
                  type: string
                  description: 'Must not be greater than 75 characters.'
                  example: amniihfqcoynlazghdtqt
                  nullable: false
                usuarioEmail:
                  type: string
                  description: 'Must be a valid email address. Must not be greater than 100 characters.'
                  example: andreanne00@example.org
                  nullable: false
                idPerfil:
                  type: string
                  description: 'The <code>idPerfil</code> of an existing record in the base_perfil table.'
                  example: consequatur
                  nullable: false
                usuarioNotificacionWeb:
                  type: string
                  description: ''
                  example: Si
                  nullable: true
                  enum:
                    - Si
                    - 'No'
                usuarioNotificacionWhatsApp:
                  type: string
                  description: ''
                  example: Si
                  nullable: true
                  enum:
                    - Si
                    - 'No'
                usuarioNotificacionMail:
                  type: string
                  description: ''
                  example: 'No'
                  nullable: true
                  enum:
                    - Si
                    - 'No'
                usuarioWhatsAppNumero:
                  type: string
                  description: 'Must be between 1 and 10 digits. Must match the regex /^[0-9]+$/.'
                  example: '1562'
                  nullable: true
                usuario2FAMetodo:
                  type: string
                  description: ''
                  example: Email
                  nullable: true
                  enum:
                    - SMS
                    - Email
                    - 'Aplicación Google Authenticator'
              required:
                - usuarioNombre
                - usuarioAlias
                - usuarioEmail
                - idPerfil
  '/api/v1/base/usuario/eliminar/{id}':
    delete:
      summary: 'Eliminar usuario'
      operationId: eliminarUsuario
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the eliminar.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/usuario/info-usuario/{id}':
    get:
      summary: 'Informacion de usuario'
      operationId: informacionDeUsuario
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the info usuario.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/usuario/activar/{id}':
    post:
      summary: 'Activar usuario'
      operationId: activarUsuario
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the activar.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/usuario/detalle/{id}':
    get:
      summary: 'Detalle de usuario'
      operationId: detalleDeUsuario
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the detalle.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/usuario/datosParaFormulario:
    post:
      summary: 'Datos para formulario'
      operationId: datosParaFormulario
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  /api/v1/base/usuario/guardarPerfilesUsuario:
    post:
      summary: 'Guardar perfiles de usuario'
      operationId: guardarPerfilesDeUsuario
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  '/api/v1/base/usuario/desbloquear/{id}':
    post:
      summary: 'Desbloquear usuario'
      operationId: desbloquearUsuario
      description: 'Desbloquea un usuario bloqueado, cambiando su estado a "Activo" y reseteando el contador de intentos fallidos a 0.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Usuario desbloqueado correctamente. El usuario ahora puede iniciar sesión.'
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Usuario desbloqueado correctamente. El usuario ahora puede iniciar sesión.'
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Usuario no encontrado.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Usuario no encontrado.'
        500:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Error al desbloquear el usuario.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Error al desbloquear el usuario.'
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'ID del usuario a desbloquear.'
        example: 1
        required: true
        schema:
          type: integer
  /api/v1/base/menu/lista:
    post:
      summary: 'Lista de menus'
      operationId: listaDeMenus
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  /api/v1/base/menu/accion:
    post:
      summary: 'Accion de menu'
      operationId: accionDeMenu
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                menuOrden:
                  type: integer
                  description: 'nullable Orden.'
                  example: 1
                  nullable: false
                menuTitulo:
                  type: string
                  description: 'nullable Título. No debe de aceptar numeros.'
                  example: 'Nuevo menú'
                  nullable: false
                menuURL:
                  type: string
                  description: 'nullable URL.'
                  example: /nuevo-menu
                  nullable: false
                menuIcono:
                  type: string
                  description: 'nullable Icono.'
                  example: icono-nuevo
                  nullable: true
                idMenuSuperior:
                  type: integer
                  description: 'nullable ID del menú padre.'
                  example: 2
                  nullable: false
  /api/v1/base/menu/editar:
    post:
      summary: 'Editar menú'
      operationId: editarMen
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                menuOrden:
                  type: integer
                  description: Orden.
                  example: 1
                  nullable: false
                menuTitulo:
                  type: string
                  description: 'Título. No debe de aceptar numeros.'
                  example: 'es una edición'
                  nullable: false
                menuURL:
                  type: string
                  description: URL.
                  example: /edicion-menu
                  nullable: false
                menuIcono:
                  type: string
                  description: 'nullable Icono.'
                  example: "icono-edicion\n..."
                  nullable: true
                idMenu:
                  type: integer
                  description: 'ID del menú a editar.'
                  example: 2
                  nullable: false
                idMenuSuperior:
                  type: integer
                  description: 'nullable ID del menú padre.'
                  example: 2
                  nullable: false
              required:
                - menuOrden
                - menuTitulo
                - menuURL
                - idMenu
  '/api/v1/base/menu/eliminar/{id}':
    delete:
      summary: 'Eliminar menú'
      operationId: eliminarMen
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idMenu:
                  type: integer
                  description: 'ID del menú a eliminar.'
                  example: 2
                  nullable: false
              required:
                - idMenu
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the eliminar.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/menu/info-menu/{id}':
    get:
      summary: 'Informacion de menu'
      operationId: informacionDeMenu
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idMenu:
                  type: integer
                  description: 'ID del menú a eliminar.'
                  example: 2
                  nullable: false
              required:
                - idMenu
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the info menu.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/menu/activar/{id}':
    post:
      summary: 'Activar menu'
      operationId: activarMenu
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idMenu:
                  type: integer
                  description: 'ID del menú a eliminar.'
                  example: 2
                  nullable: false
              required:
                - idMenu
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the activar.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/menu/datosParaFormulario:
    post:
      summary: 'Datos para formulario'
      operationId: datosParaFormulario
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  /api/v1/base/perfil/lista:
    post:
      summary: 'Lista de perfiles'
      operationId: listaDePerfiles
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  /api/v1/base/perfil/accion:
    post:
      summary: 'Accion de perfil'
      operationId: accionDePerfil
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                perfilNombre:
                  type: string
                  description: 'Must match the regex /^[A-Za-zÁÉÍÓÚáéíóúÑñ0-9\s\-]+$/. Must be at least 1 character. Must not be greater than 50 characters.'
                  example: vmqeopfuudtdsufvyvddq
                  nullable: false
                perfilURLInicial:
                  type: string
                  description: 'url del perfil.'
                  example: /admin
                  nullable: false
                perfilAlias:
                  type: string
                  description: 'Nombre del perfil.'
                  example: Administrador
                  nullable: false
              required:
                - perfilNombre
                - perfilAlias
  /api/v1/base/perfil/editar:
    post:
      summary: 'Editar perfil'
      operationId: editarPerfil
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                perfilNombre:
                  type: string
                  description: 'Must match the regex /^[A-Za-zÁÉÍÓÚáéíóúÑñ0-9\s\-]+$/. Must be at least 1 character. Must not be greater than 50 characters.'
                  example: vmqeopfuudtdsufvyvddq
                  nullable: false
                perfilURLInicial:
                  type: string
                  description: 'url del perfil.'
                  example: /admin
                  nullable: false
                idPerfil:
                  type: integer
                  description: 'ID del perfil a editar.'
                  example: 2
                  nullable: false
                perfilAlias:
                  type: string
                  description: 'Nombre del perfil.'
                  example: Administrador
                  nullable: false
              required:
                - perfilNombre
                - idPerfil
                - perfilAlias
  '/api/v1/base/perfil/eliminar/{id}':
    delete:
      summary: 'Eliminar perfil'
      operationId: eliminarPerfil
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idPerfil:
                  type: integer
                  description: 'ID del perfil a eliminar.'
                  example: 2
                  nullable: false
              required:
                - idPerfil
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the eliminar.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/perfil/info-perfil/{id}':
    get:
      summary: 'Informacion de perfil'
      operationId: informacionDePerfil
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idPerfil:
                  type: integer
                  description: 'ID del perfil a obtener.'
                  example: 2
                  nullable: false
              required:
                - idPerfil
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the info perfil.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/perfil/activar/{id}':
    post:
      summary: 'Activar perfil'
      operationId: activarPerfil
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idPerfil:
                  type: integer
                  description: 'ID del perfil a activar.'
                  example: 2
                  nullable: false
              required:
                - idPerfil
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the activar.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/perfil/lista-perfil-menu:
    post:
      summary: 'Lista de perfiles menus'
      operationId: listaDePerfilesMenus
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  /api/v1/base/perfil/accion-perfil-menu:
    post:
      summary: 'Accion de perfil menu'
      operationId: accionDePerfilMenu
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  '/api/v1/base/perfil/eliminar-perfil-menu/{id}':
    delete:
      summary: 'Eliminar perfil menu'
      operationId: eliminarPerfilMenu
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the eliminar perfil menu.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/perfil/lista-perfil-ruta:
    post:
      summary: 'Lista de perfiles rutas'
      operationId: listaDePerfilesRutas
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  /api/v1/base/perfil/accion-perfil-ruta:
    post:
      summary: 'Accion de perfil ruta'
      operationId: accionDePerfilRuta
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  '/api/v1/base/perfil/eliminar-perfil-ruta/{id}':
    delete:
      summary: 'Eliminar perfil ruta'
      operationId: eliminarPerfilRuta
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the eliminar perfil rutum.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/perfil/lista-menus/{id}':
    get:
      summary: 'Lista de menus'
      operationId: listaDeMenus
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the lista menu.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/perfil/lista-rutas/{id}':
    get:
      summary: 'Lista de rutas'
      operationId: listaDeRutas
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the lista ruta.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/pais/lista:
    post:
      summary: 'Lista de países'
      operationId: listaDePases
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  /api/v1/base/pais/accion:
    post:
      summary: 'Agregar país'
      operationId: agregarPas
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                paisAlias:
                  type: string
                  description: 'Nombre del país.'
                  example: Perú
                  nullable: false
              required:
                - paisAlias
  /api/v1/base/pais/editar:
    post:
      summary: 'Editar país'
      operationId: editarPas
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                paisAlias:
                  type: string
                  description: 'Nombre del país.'
                  example: Perú2
                  nullable: false
                idPais:
                  type: integer
                  description: 'ID del país a editar.'
                  example: 2
                  nullable: false
              required:
                - paisAlias
                - idPais
  '/api/v1/base/pais/eliminar/{id}':
    delete:
      summary: 'Eliminar país'
      operationId: eliminarPas
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idPais:
                  type: integer
                  description: 'ID del país a eliminar.'
                  example: 2
                  nullable: false
              required:
                - idPais
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the eliminar.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/pais/info-pais/{id}':
    get:
      summary: 'Información de país'
      operationId: informacinDePas
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idPais:
                  type: integer
                  description: 'ID del país a obtener.'
                  example: 2
                  nullable: false
              required:
                - idPais
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the info pai.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/pais/activar/{id}':
    post:
      summary: 'Activar país'
      operationId: activarPas
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idPais:
                  type: integer
                  description: 'ID del país a activar.'
                  example: 2
                  nullable: false
              required:
                - idPais
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the activar.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/pais/datosParaFormulario:
    post:
      summary: 'Datos para formulario de país'
      operationId: datosParaFormularioDePas
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  '/api/v1/base/estado/lista/{idPais}':
    post:
      summary: 'Lista de estados'
      operationId: listaDeEstados
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idPais:
                  type: integer
                  description: 'ID del país.'
                  example: 1
                  nullable: false
              required:
                - idPais
    parameters:
      -
        in: path
        name: idPais
        description: ''
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/estado/accion:
    post:
      summary: 'Agregar estado'
      operationId: agregarEstado
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                estadoAlias:
                  type: string
                  description: 'Nombre del estado.'
                  example: Lima
                  nullable: false
                idPais:
                  type: integer
                  description: 'ID del país.'
                  example: 1
                  nullable: false
              required:
                - estadoAlias
                - idPais
  /api/v1/base/estado/editar:
    post:
      summary: 'Editar estado'
      operationId: editarEstado
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                estadoAlias:
                  type: string
                  description: 'Nombre del estado.'
                  example: Limas
                  nullable: false
                idPais:
                  type: string
                  description: 'The <code>idPais</code> of an existing record in the base_pais table.'
                  example: consequatur
                  nullable: false
                idEstado:
                  type: integer
                  description: 'ID del estado a editar.'
                  example: 2
                  nullable: false
              required:
                - estadoAlias
                - idPais
                - idEstado
  '/api/v1/base/estado/eliminar/{id}':
    delete:
      summary: 'Eliminar estado'
      operationId: eliminarEstado
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idEstado:
                  type: integer
                  description: 'ID del estado a eliminar.'
                  example: 2
                  nullable: false
              required:
                - idEstado
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the eliminar.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/estado/info-estado/{id}':
    get:
      summary: 'Información de estado'
      operationId: informacinDeEstado
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idEstado:
                  type: integer
                  description: 'ID del estado a obtener.'
                  example: 2
                  nullable: false
              required:
                - idEstado
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the info estado.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/estado/activar/{id}':
    post:
      summary: 'Activar estado'
      operationId: activarEstado
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idEstado:
                  type: integer
                  description: 'ID del estado a activar.'
                  example: 2
                  nullable: false
              required:
                - idEstado
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the activar.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/estado/datosParaFormulario:
    post:
      summary: 'Datos para formulario de estado'
      operationId: datosParaFormularioDeEstado
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  '/api/v1/base/delegacion/lista/{idEstado}':
    post:
      summary: 'Lista de delegaciones'
      operationId: listaDeDelegaciones
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idEstado:
                  type: integer
                  description: 'ID del estado.'
                  example: 1
                  nullable: false
              required:
                - idEstado
    parameters:
      -
        in: path
        name: idEstado
        description: ''
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/delegacion/accion:
    post:
      summary: 'Agregar delegación'
      operationId: agregarDelegacin
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                delegacionAlias:
                  type: string
                  description: 'Nombre de la delegación.'
                  example: 'Delegación Lima'
                  nullable: false
                delegacionLada:
                  type: string
                  description: 'Must be at least 1 character. Must not be greater than 5 characters.'
                  example: amnii
                  nullable: true
                idEstado:
                  type: integer
                  description: 'ID del estado.'
                  example: 1
                  nullable: false
              required:
                - delegacionAlias
                - idEstado
  /api/v1/base/delegacion/editar:
    post:
      summary: 'Editar delegación'
      operationId: editarDelegacin
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                delegacionAlias:
                  type: string
                  description: 'Nombre de la delegación.'
                  example: 'Delegación Lima'
                  nullable: false
                delegacionLada:
                  type: string
                  description: 'Must be at least 1 character. Must not be greater than 5 characters.'
                  example: amnii
                  nullable: true
                idEstado:
                  type: string
                  description: 'The <code>idEstado</code> of an existing record in the base_estado table.'
                  example: consequatur
                  nullable: false
                idDelegacion:
                  type: integer
                  description: 'ID de la delegación a editar.'
                  example: 2
                  nullable: false
              required:
                - delegacionAlias
                - idEstado
                - idDelegacion
  '/api/v1/base/delegacion/eliminar/{id}':
    delete:
      summary: 'Eliminar delegación'
      operationId: eliminarDelegacin
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idDelegacion:
                  type: integer
                  description: 'ID de la delegación a eliminar.'
                  example: 2
                  nullable: false
              required:
                - idDelegacion
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the eliminar.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/delegacion/info-delegacion/{id}':
    get:
      summary: 'Información de delegación'
      operationId: informacinDeDelegacin
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idDelegacion:
                  type: integer
                  description: 'ID de la delegación a obtener.'
                  example: 2
                  nullable: false
              required:
                - idDelegacion
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the info delegacion.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/delegacion/activar/{id}':
    post:
      summary: 'Activar delegación'
      operationId: activarDelegacin
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the activar.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/delegacion/datosParaFormulario:
    post:
      summary: 'Datos para formulario de delegación'
      operationId: datosParaFormularioDeDelegacin
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  '/api/v1/base/colonia/lista/{idDelegacion}':
    post:
      summary: 'Lista de colonias'
      operationId: listaDeColonias
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idDelegacion:
                  type: integer
                  description: 'ID de la delegación.'
                  example: 1
                  nullable: false
              required:
                - idDelegacion
    parameters:
      -
        in: path
        name: idDelegacion
        description: ''
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/colonia/accion:
    post:
      summary: 'Agregar colonia'
      operationId: agregarColonia
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                coloniaAlias:
                  type: string
                  description: 'Nombre de la colonia.'
                  example: 'Colonia Lima'
                  nullable: false
                coloniaCodigoPostal:
                  type: string
                  description: 'Código postal de la colonia.'
                  example: '12345'
                  nullable: false
                idDelegacion:
                  type: integer
                  description: 'ID de la delegación.'
                  example: 1
                  nullable: false
              required:
                - coloniaAlias
                - coloniaCodigoPostal
                - idDelegacion
  /api/v1/base/colonia/editar:
    post:
      summary: 'Editar colonia'
      operationId: editarColonia
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                coloniaAlias:
                  type: string
                  description: 'Nombre de la colonia.'
                  example: 'Colonia Lima'
                  nullable: false
                coloniaCodigoPostal:
                  type: string
                  description: 'Código postal de la colonia.'
                  example: '12345'
                  nullable: false
                idDelegacion:
                  type: integer
                  description: 'ID de la delegación.'
                  example: 1
                  nullable: false
                idColonia:
                  type: integer
                  description: 'ID de la colonia a editar.'
                  example: 1
                  nullable: false
              required:
                - coloniaAlias
                - coloniaCodigoPostal
                - idDelegacion
                - idColonia
  '/api/v1/base/colonia/eliminar/{id}':
    delete:
      summary: 'Eliminar colonia'
      operationId: eliminarColonia
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the eliminar.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/colonia/info-colonia/{id}':
    get:
      summary: 'Información de colonia'
      operationId: informacinDeColonia
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the info colonium.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/colonia/activar/{id}':
    post:
      summary: 'Activar colonia'
      operationId: activarColonia
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the activar.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/colonia/datosParaFormulario:
    post:
      summary: 'Datos para formulario de colonia'
      operationId: datosParaFormularioDeColonia
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  /api/v1/base/codigo-postal/buscar:
    post:
      summary: 'Buscar información geográfica completa por código postal'
      operationId: buscarInformacinGeogrficaCompletaPorCdigoPostal
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                codigo_postal:
                  type: string
                  description: 'Código postal a buscar.'
                  example: '12345'
                  nullable: false
              required:
                - codigo_postal
  /api/v1/base/codigo-postal/colonias-select:
    post:
      summary: 'Obtener colonias para componente select'
      operationId: obtenerColoniasParaComponenteSelect
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                codigo_postal:
                  type: string
                  description: 'Código postal a buscar.'
                  example: '12345'
                  nullable: false
              required:
                - codigo_postal
  /api/v1/base/codigo-postal/validar:
    post:
      summary: 'Validar código postal'
      operationId: validarCdigoPostal
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                codigo_postal:
                  type: string
                  description: 'Código postal a validar.'
                  example: '12345'
                  nullable: false
              required:
                - codigo_postal
  /api/v1/base/codigo-postal/datos-formulario:
    post:
      summary: 'Datos para autocompletado de formularios'
      operationId: datosParaAutocompletadoDeFormularios
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                codigo_postal:
                  type: string
                  description: 'Código postal a buscar.'
                  example: '12345'
                  nullable: false
              required:
                - codigo_postal
  /api/v1/base/codigo-postal/busqueda-rapida:
    post:
      summary: 'Búsqueda rápida de código postal'
      operationId: bsquedaRpidaDeCdigoPostal
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                codigo_postal:
                  type: string
                  description: 'Código postal a buscar.'
                  example: '12345'
                  nullable: false
              required:
                - codigo_postal
  /api/v1/base/banco/lista:
    post:
      summary: 'Lista de bancos'
      operationId: listaDeBancos
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  /api/v1/base/banco/accion:
    post:
      summary: 'Agregar banco'
      operationId: agregarBanco
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                bancoAlias:
                  type: string
                  description: 'Nombre del banco.'
                  example: 'Banco de Prueba'
                  nullable: false
              required:
                - bancoAlias
  /api/v1/base/banco/editar:
    post:
      summary: 'Editar banco'
      operationId: editarBanco
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                bancoAlias:
                  type: string
                  description: 'Nombre del banco.'
                  example: 'Banco de Prueba'
                  nullable: false
                idBanco:
                  type: integer
                  description: 'ID del banco a editar base64.'
                  example: 0
                  nullable: false
              required:
                - bancoAlias
                - idBanco
  '/api/v1/base/banco/eliminar/{id}':
    delete:
      summary: 'Eliminar banco'
      operationId: eliminarBanco
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idBanco:
                  type: integer
                  description: 'ID del banco a eliminar.'
                  example: 1
                  nullable: false
              required:
                - idBanco
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the eliminar.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/banco/info-banco/{id}':
    get:
      summary: 'Informacion de banco'
      operationId: informacionDeBanco
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idBanco:
                  type: integer
                  description: 'ID del banco a eliminar.'
                  example: 1
                  nullable: false
              required:
                - idBanco
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the info banco.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/base/banco/activar/{id}':
    post:
      summary: 'Activar banco'
      operationId: activarBanco
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idBanco:
                  type: integer
                  description: 'ID del banco a activar.'
                  example: 1
                  nullable: false
              required:
                - idBanco
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the activar.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/base/banco/datosParaFormulario:
    post:
      summary: 'Datos para formulario'
      operationId: datosParaFormulario
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
  /api/v1/base/empresa/lista:
    post:
      summary: 'Lista de empresas'
      operationId: listaDeEmpresas
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                empresaNombre:
                  type: string
                  description: optional
                  example: 'Tequila y Mezcales'
                  nullable: false
                empresaRFC:
                  type: string
                  description: optional
                  example: TMX010203ABC
                  nullable: false
                empresaEmail:
                  type: string
                  description: optional
                  example: contacto@tms.com
                  nullable: false
                empresaTipo:
                  type: string
                  description: "optional ('Interna'|'Externa')"
                  example: Interna
                  nullable: false
                empresaTipoContribuyente:
                  type: string
                  description: "optional ('Fisica'|'Moral')"
                  example: Moral
                  nullable: false
                empresaEstado:
                  type: string
                  description: "optional ('Activo'|'Inactivo')"
                  example: Activo
                  nullable: false
                searchQuery:
                  type: string
                  description: 'optional Búsqueda general.'
                  example: tequila
                  nullable: false
                sort_field:
                  type: string
                  description: optional
                  example: idEmpresa
                  nullable: false
                sort_direction:
                  type: string
                  description: "optional ('asc'|'desc')"
                  example: asc
                  nullable: false
                perPage:
                  type: integer
                  description: optional
                  example: 10
                  nullable: false
  /api/v1/base/empresa/crear:
    post:
      summary: 'Crear empresa'
      operationId: crearEmpresa
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idEmpresa:
                  type: string
                  description: ''
                  example: null
                  nullable: true
                empresaNombre:
                  type: string
                  description: ''
                  example: 'Tequila y Mezcales'
                  nullable: false
                empresaDireccion:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: vmqeopfuudtdsufvyvddq
                  nullable: true
                empresaRazonSocial:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: amniihfqcoynlazghdtqt
                  nullable: true
                empresaRFC:
                  type: string
                  description: optional
                  example: TMX010203ABC
                  nullable: true
                empresaTelefono:
                  type: string
                  description: optional
                  example: '+52 33 1234 5678'
                  nullable: true
                empresaEmail:
                  type: string
                  description: optional
                  example: contacto@tms.com
                  nullable: true
                empresaCoordenadas:
                  type: string
                  description: 'Must not be greater than 50 characters.'
                  example: yvojcybzvrbyickznkygl
                  nullable: true
                empresaTipoContribuyente:
                  type: string
                  description: "optional ('Fisica'|'Moral')"
                  example: Moral
                  nullable: true
                empresaTipo:
                  type: string
                  description: "optional ('Interna'|'Externa')"
                  example: Interna
                  nullable: true
                empresaFechaAlta:
                  type: date
                  description: 'optional (YYYY-MM-DD)'
                  example: '2025-01-15'
                  nullable: false
                empresaEstado:
                  type: string
                  description: "optional ('Activo'|'Inactivo') Default: Activo"
                  example: consequatur
                  nullable: false
              required:
                - empresaNombre
  /api/v1/base/empresa/editar:
    post:
      summary: 'Editar empresa'
      operationId: editarEmpresa
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idEmpresa:
                  type: string
                  description: 'ID en base64.'
                  example: MQ==
                  nullable: true
                empresaNombre:
                  type: string
                  description: optional
                  example: consequatur
                  nullable: false
                empresaDireccion:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: vmqeopfuudtdsufvyvddq
                  nullable: true
                empresaRazonSocial:
                  type: string
                  description: 'Must not be greater than 100 characters.'
                  example: amniihfqcoynlazghdtqt
                  nullable: true
                empresaRFC:
                  type: string
                  description: optional
                  example: consequatur
                  nullable: true
                empresaTelefono:
                  type: string
                  description: optional
                  example: consequatur
                  nullable: true
                empresaEmail:
                  type: string
                  description: optional
                  example: qkunze@example.com
                  nullable: true
                empresaCoordenadas:
                  type: string
                  description: 'Must not be greater than 50 characters.'
                  example: yvojcybzvrbyickznkygl
                  nullable: true
                empresaTipoContribuyente:
                  type: string
                  description: "optional ('Fisica'|'Moral')"
                  example: consequatur
                  nullable: true
                empresaTipo:
                  type: string
                  description: "optional ('Interna'|'Externa')"
                  example: consequatur
                  nullable: true
                empresaFechaAlta:
                  type: date
                  description: 'optional (YYYY-MM-DD)'
                  example: consequatur
                  nullable: false
                empresaEstado:
                  type: string
                  description: "optional ('Activo'|'Inactivo')"
                  example: consequatur
                  nullable: false
              required:
                - idEmpresa
  '/api/v1/base/empresa/eliminar/{id}':
    delete:
      summary: 'Inactivar empresa'
      operationId: inactivarEmpresa
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/base/empresa/activar/{id}':
    post:
      summary: 'Activar empresa'
      operationId: activarEmpresa
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/base/empresa/form-data:
    get:
      summary: 'Datos para formulario de empresa'
      operationId: datosParaFormularioDeEmpresa
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
  '/api/v1/base/empresa/info/{id}':
    get:
      summary: 'Información de empresa'
      operationId: informacinDeEmpresa
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/base/empresa/detalle/{id}':
    get:
      summary: 'Datos para detalle de empresa'
      operationId: datosParaDetalleDeEmpresa
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/base/sucursal/lista:
    post:
      summary: 'Lista de sucursales'
      operationId: listaDeSucursales
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idSucursal:
                  type: string
                  description: 'optional ID de la sucursal (base64).'
                  example: MQ==
                  nullable: false
                idEmpresa:
                  type: string
                  description: 'optional ID de la empresa (base64).'
                  example: MQ==
                  nullable: false
                idSucursalSuperior:
                  type: string
                  description: 'optional ID de la sucursal superior (base64).'
                  example: Mg==
                  nullable: false
                sucursalNombre:
                  type: string
                  description: 'optional Nombre.'
                  example: 'Sucursal Centro'
                  nullable: false
                sucursalTipo:
                  type: string
                  description: "optional Tipo ('Almacén'|'Sucursal')."
                  example: Sucursal
                  nullable: false
                sucursalVentaNocturna:
                  type: string
                  description: "optional 'Si'|'No'."
                  example: 'No'
                  nullable: false
                sucursalEstado:
                  type: string
                  description: "optional 'Activo'|'Inactivo'."
                  example: Activo
                  nullable: false
                searchQuery:
                  type: string
                  description: 'Búsqueda general.'
                  example: Centro
                  nullable: false
  /api/v1/base/sucursal/form-data:
    get:
      summary: 'Datos para formulario de sucursal'
      operationId: datosParaFormularioDeSucursal
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
  '/api/v1/base/sucursal/info/{id}':
    get:
      summary: 'Información de sucursal'
      operationId: informacinDeSucursal
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/base/sucursal/crear:
    post:
      summary: 'Agregar sucursal'
      operationId: agregarSucursal
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idSucursal:
                  type: string
                  description: ''
                  example: null
                  nullable: true
                idEmpresa:
                  type: string
                  description: 'ID de la empresa (base64).'
                  example: MQ==
                  nullable: false
                idSucursalSuperior:
                  type: string
                  description: 'optional ID de la sucursal superior (base64).'
                  example: Mg==
                  nullable: true
                sucursalNombre:
                  type: string
                  description: Nombre.
                  example: 'Sucursal Centro'
                  nullable: false
                sucursalDireccion:
                  type: string
                  description: 'optional Dirección.'
                  example: 'Av. Reforma 123'
                  nullable: true
                sucursalTelefono:
                  type: string
                  description: 'optional Teléfono.'
                  example: 555-1234
                  nullable: true
                sucursalEmail:
                  type: string
                  description: 'optional Email.'
                  example: centro@empresa.com
                  nullable: true
                sucursalTipo:
                  type: string
                  description: "optional 'Almacén'|'Sucursal'."
                  example: Sucursal
                  nullable: true
                sucursalVentaNocturna:
                  type: string
                  description: "'Si'|'No'."
                  example: 'No'
                  nullable: false
                sucursalVentaNocturnaHoraInicio:
                  type: string
                  description: 'optional HH:mm (si Si).'
                  example: '20:00'
                  nullable: true
                sucursalVentaNocturnaHoraFin:
                  type: string
                  description: 'optional HH:mm (si Si).'
                  example: '23:00'
                  nullable: true
                sucursalVentaNocturnaPorcentaje:
                  type: number
                  description: 'optional 0–100 (si Si).'
                  example: 10.5
                  nullable: true
                sucursalEstado:
                  type: string
                  description: ''
                  example: null
                  nullable: true
              required:
                - idEmpresa
                - sucursalNombre
                - sucursalVentaNocturna
  /api/v1/base/sucursal/editar:
    post:
      summary: 'Editar sucursal'
      operationId: editarSucursal
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idSucursal:
                  type: string
                  description: 'ID de la sucursal (base64).'
                  example: MQ==
                  nullable: true
                idEmpresa:
                  type: string
                  description: 'ID de la empresa (base64).'
                  example: MQ==
                  nullable: false
                idSucursalSuperior:
                  type: string
                  description: 'optional ID sucursal superior (base64).'
                  example: Mg==
                  nullable: true
                sucursalNombre:
                  type: string
                  description: Nombre.
                  example: 'Sucursal Centro'
                  nullable: false
                sucursalDireccion:
                  type: string
                  description: 'optional Dirección.'
                  example: 'Av. Reforma 123'
                  nullable: true
                sucursalTelefono:
                  type: string
                  description: 'optional Teléfono.'
                  example: 555-1234
                  nullable: true
                sucursalEmail:
                  type: string
                  description: 'optional Email.'
                  example: centro@empresa.com
                  nullable: true
                sucursalTipo:
                  type: string
                  description: "optional 'Almacén'|'Sucursal'."
                  example: Sucursal
                  nullable: true
                sucursalVentaNocturna:
                  type: string
                  description: "'Si'|'No'."
                  example: 'No'
                  nullable: false
                sucursalVentaNocturnaHoraInicio:
                  type: string
                  description: 'optional HH:mm (si Si).'
                  example: '20:00'
                  nullable: true
                sucursalVentaNocturnaHoraFin:
                  type: string
                  description: 'optional HH:mm (si Si).'
                  example: '23:00'
                  nullable: true
                sucursalVentaNocturnaPorcentaje:
                  type: number
                  description: 'optional 0–100 (si Si).'
                  example: 10.5
                  nullable: true
                sucursalEstado:
                  type: string
                  description: "optional 'Activo'|'Inactivo'."
                  example: Activo
                  nullable: true
              required:
                - idSucursal
                - idEmpresa
                - sucursalNombre
                - sucursalVentaNocturna
  '/api/v1/base/sucursal/eliminar/{id}':
    delete:
      summary: 'Inactivar sucursal (eliminar lógico)'
      operationId: inactivarSucursaleliminarLgico
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/base/sucursal/activar/{id}':
    post:
      summary: 'Activar sucursal'
      operationId: activarSucursal
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/base/sucursal/detalle/{id}':
    get:
      summary: 'Datos para detalle de sucursal'
      operationId: datosParaDetalleDeSucursal
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/base/sucursal-usuario/lista:
    post:
      summary: 'Lista de asignaciones usuario-sucursal'
      operationId: listaDeAsignacionesUsuarioSucursal
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idSucursalUsuario:
                  type: string
                  description: 'optional ID de la asignación (base64).'
                  example: MQ==
                  nullable: false
                idUsuario:
                  type: string
                  description: 'optional ID del usuario (base64).'
                  example: MQ==
                  nullable: false
                idSucursal:
                  type: string
                  description: 'optional ID de la sucursal (base64).'
                  example: MQ==
                  nullable: false
                sucursalUsuarioEstado:
                  type: string
                  description: "optional 'Activo'|'Inactivo'."
                  example: Activo
                  nullable: false
                perPage:
                  type: integer
                  description: 'optional Registros por página.'
                  example: 10
                  nullable: false
                sort_field:
                  type: string
                  description: 'optional Campo de ordenamiento.'
                  example: idSucursalUsuario
                  nullable: false
                sort_direction:
                  type: string
                  description: "optional Dirección de ordenamiento ('asc'|'desc')."
                  example: asc
                  nullable: false
                typeData:
                  type: string
                  description: 'optional Si se envía, devuelve colección completa sin paginar.'
                  example: all
                  nullable: false
  /api/v1/base/sucursal-usuario/form-data:
    get:
      summary: "Datos para formulario de asignación\nDevuelve usuarios, todas las sucursales activas y, si se envía idUsuario, separa las sucursales en disponibles y asignadas."
      operationId: datosParaFormularioDeAsignacinDevuelveUsuariosTodasLasSucursalesActivasYSiSeEnvaIdUsuarioSeparaLasSucursalesEnDisponiblesYAsignadas
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idUsuario:
                  type: string
                  description: 'optional ID del usuario (base64) para precargar asignaciones.'
                  example: MQ==
                  nullable: false
  '/api/v1/base/sucursal-usuario/info/{id}':
    get:
      summary: 'Información de una asignación'
      operationId: informacinDeUnaAsignacin
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'ID de la asignación en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/base/sucursal-usuario/crear:
    post:
      summary: 'Crear/actualizar asignaciones usuario-sucursal (múltiple)'
      operationId: crearactualizarAsignacionesUsuarioSucursalmltiple
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idUsuario:
                  type: string
                  description: 'ID del usuario (base64).'
                  example: MQ==
                  nullable: false
                idSucursal:
                  type: integer
                  description: 'The <code>idSucursal</code> of an existing record in the base_sucursal table.'
                  example: 17
                  nullable: false
                sucursalUsuarioEstado:
                  type: string
                  description: ''
                  example: null
                  nullable: true
                idSucursales:
                  type: array
                  description: 'optional Arreglo de IDs de sucursales a asignar (numéricos, NO codificados). Si existe una relación inactiva, la reactiva.'
                  example:
                    - 1
                    - 2
                    - 3
                  items:
                    type: string
                sucursalesEliminadas:
                  type: array
                  description: 'optional Arreglo de IDs de SucursalUsuario a inactivar (numéricos, NO codificados).'
                  example:
                    - 4
                    - 5
                    - 6
                  items:
                    type: string
              required:
                - idUsuario
                - idSucursal
  /api/v1/base/sucursal-usuario/eliminar:
    post:
      summary: 'Inactivar asignaciones (eliminación lógica múltiple)'
      operationId: inactivarAsignacioneseliminacinLgicaMltiple
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                ids:
                  type: array
                  description: 'Arreglo de IDs de asignaciones a inactivar (numéricos, NO codificados).'
                  example:
                    - 1
                    - 2
                    - 3
                  items:
                    type: string
              required:
                - ids
  '/api/v1/base/sucursal-usuario/activar/{id}':
    post:
      summary: 'Activar asignación'
      operationId: activarAsignacin
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Base
    parameters:
      -
        in: path
        name: id
        description: 'ID de la asignación en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/compras/categoria-proveedor/lista:
    post:
      summary: 'Lista de categorías de proveedores'
      operationId: listaDeCategorasDeProveedores
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idCategoriaProveedorSuperior:
                  type: string
                  description: 'optional ID de la categoría del proveedor.'
                  example: MQ==
                  nullable: false
                categoriaProveedorAlias:
                  type: string
                  description: 'optional Alias de la categoría del proveedor.'
                  example: VIP
                  nullable: false
                categoriaProveedorEstado:
                  type: string
                  description: 'optional Estado de la categoría del proveedor.'
                  example: Activo
                  nullable: false
                searchQuery:
                  type: string
                  description: 'Búsqueda general en varios campos.'
                  example: Juan
                  nullable: false
  '/api/v1/compras/categoria-proveedor/info-categoria-proveedor/{id}':
    get:
      summary: 'Información de categoría proveedor'
      operationId: informacinDeCategoraProveedor
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Compras
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/compras/categoria-proveedor/accion:
    post:
      summary: 'Agregar categoría proveedor'
      operationId: agregarCategoraProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idCategoriaProveedorSuperior:
                  type: string
                  description: 'optional ID de la categoría del proveedor superior (codificado en base64, debe existir en com_categoriaproveedor).'
                  example: MQ==
                  nullable: true
                categoriaProveedorAlias:
                  type: string
                  description: 'Alias de la categoría del proveedor. Máximo 75 caracteres, debe ser único.'
                  example: VIP
                  nullable: false
              required:
                - categoriaProveedorAlias
  /api/v1/compras/categoria-proveedor/editar:
    post:
      summary: 'Editar categoría proveedor'
      operationId: editarCategoraProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idCategoriaProveedor:
                  type: string
                  description: 'ID de la categoría del proveedor (codificado en base64, debe existir en com_categoriaproveedor).'
                  example: MQ==
                  nullable: false
                idCategoriaProveedorSuperior:
                  type: string
                  description: 'optional ID de la categoría del proveedor superior (codificado en base64, debe existir en com_categoriaproveedor).'
                  example: MQ==
                  nullable: true
                categoriaProveedorAlias:
                  type: string
                  description: 'Alias de la categoría del proveedor. Máximo 70 caracteres, debe ser único (excepto el registro actual).'
                  example: VIP
                  nullable: false
              required:
                - idCategoriaProveedor
                - categoriaProveedorAlias
  '/api/v1/compras/categoria-proveedor/eliminar/{id}':
    delete:
      summary: 'Eliminar categoría proveedor'
      operationId: eliminarCategoraProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  '/api/v1/compras/categoria-proveedor/activar/{id}':
    post:
      summary: 'Activar categoría proveedor'
      operationId: activarCategoraProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/compras/proveedor/lista:
    post:
      summary: 'Lista de proveedores'
      operationId: listaDeProveedores
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idProveedor:
                  type: string
                  description: 'optional ID del proveedor.'
                  example: MQ==
                  nullable: false
                idBanco:
                  type: string
                  description: 'optional ID del banco.'
                  example: MQ==
                  nullable: false
                proveedorNombre:
                  type: string
                  description: 'optional Nombre del proveedor.'
                  example: VIP
                  nullable: false
                proveedorRazonSocial:
                  type: string
                  description: 'optional Razon social del proveedor.'
                  example: 'VIP S.A.'
                  nullable: false
                proveedorDireccion:
                  type: string
                  description: 'optional Dirección del proveedor.'
                  example: 'Calle 123'
                  nullable: false
                proveedorCuenta:
                  type: string
                  description: 'optional Cuenta del proveedor.'
                  example: '1234567890'
                  nullable: false
                proveedorTelefono:
                  type: integer
                  description: 'optional Teléfono del proveedor.'
                  example: 555
                  nullable: false
                proveedorEmail:
                  type: string
                  description: 'optional Email del proveedor.'
                  example: vip@example.com
                  nullable: false
                proveedorRFC:
                  type: string
                  description: 'optional RFC del proveedor.'
                  example: VIP123456789
                  nullable: false
                proveedorContacto:
                  type: string
                  description: 'optional Contacto del proveedor.'
                  example: 'Juan Perez'
                  nullable: false
                proveedorEstado:
                  type: string
                  description: 'optional Estado del proveedor.'
                  example: Activo
                  nullable: false
                searchQuery:
                  type: string
                  description: 'Búsqueda general en varios campos.'
                  example: Juan
                  nullable: false
  /api/v1/compras/proveedor/datos-para-formulario:
    post:
      summary: 'Datos para formulario de proveedor'
      operationId: datosParaFormularioDeProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
  '/api/v1/compras/proveedor/info-proveedor/{id}':
    get:
      summary: 'Informacion de proveedor'
      operationId: informacionDeProveedor
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Compras
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/compras/proveedor/accion:
    post:
      summary: 'Agregar proveedor'
      operationId: agregarProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idBanco:
                  type: string
                  description: 'ID del banco (debe existir en base_banco).'
                  example: MQ==
                  nullable: false
                idCategoriaProveedor:
                  type: string
                  description: 'ID de la categoría del proveedor (codificado en base64, debe existir en com_categoriaproveedor).'
                  example: Mg==
                  nullable: false
                proveedorNombre:
                  type: string
                  description: 'Nombre del proveedor. Máximo 75 caracteres, debe ser único.'
                  example: VIP
                  nullable: false
                proveedorRazonSocial:
                  type: string
                  description: 'optional Razón social del proveedor. Máximo 100 caracteres, debe ser única.'
                  example: 'VIP S.A.'
                  nullable: true
                proveedorDireccion:
                  type: string
                  description: 'optional Dirección del proveedor. Máximo 100 caracteres.'
                  example: 'Calle 123'
                  nullable: true
                proveedorCuenta:
                  type: numeric
                  description: 'optional Cuenta bancaria del proveedor. Máximo 25 caracteres, solo números.'
                  example: '1234567890'
                  nullable: true
                proveedorTelefono:
                  type: string
                  description: 'Teléfono del proveedor. Máximo 25 caracteres.'
                  example: 555-1234
                  nullable: false
                proveedorEmail:
                  type: string
                  description: 'optional Email del proveedor. Debe ser un email válido con DNS válido, máximo 100 caracteres.'
                  example: vip@example.com
                  nullable: true
                proveedorRFC:
                  type: string
                  description: 'optional RFC del proveedor. Exactamente 13 caracteres: 4 letras + 6 dígitos (fecha YYMMDD) + 3 caracteres alfanuméricos (homoclave). Ejemplo: ABC123456XYZ'
                  example: consequatur
                  nullable: true
                proveedorContacto:
                  type: string
                  description: 'optional Nombre del contacto del proveedor. Máximo 75 caracteres.'
                  example: 'Juan Perez'
                  nullable: true
              required:
                - idBanco
                - idCategoriaProveedor
                - proveedorNombre
                - proveedorTelefono
  /api/v1/compras/proveedor/editar:
    post:
      summary: 'Editar proveedor'
      operationId: editarProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idBanco:
                  type: string
                  description: 'ID del banco (debe existir en base_banco).'
                  example: MQ==
                  nullable: false
                idCategoriaProveedor:
                  type: string
                  description: 'ID de la categoría del proveedor (codificado en base64, debe existir en com_categoriaproveedor).'
                  example: Mg==
                  nullable: false
                idProveedor:
                  type: string
                  description: 'ID del proveedor (codificado en base64, debe existir en com_proveedor).'
                  example: MQ==
                  nullable: false
                proveedorNombre:
                  type: string
                  description: 'Nombre del proveedor. Máximo 75 caracteres, debe ser único (excepto el registro actual).'
                  example: VIP
                  nullable: false
                proveedorRazonSocial:
                  type: string
                  description: 'optional Razón social del proveedor. Máximo 100 caracteres, debe ser única (excepto el registro actual).'
                  example: 'VIP S.A.'
                  nullable: true
                proveedorDireccion:
                  type: string
                  description: 'optional Dirección del proveedor. Máximo 100 caracteres.'
                  example: 'Calle 123'
                  nullable: true
                proveedorCuenta:
                  type: numeric
                  description: 'optional Cuenta bancaria del proveedor. Máximo 25 caracteres, solo números.'
                  example: '1234567890'
                  nullable: true
                proveedorTelefono:
                  type: string
                  description: 'Teléfono del proveedor. Máximo 25 caracteres.'
                  example: 555-1234
                  nullable: false
                proveedorEmail:
                  type: string
                  description: 'optional Email del proveedor. Debe ser un email válido con DNS válido, máximo 100 caracteres.'
                  example: vip@example.com
                  nullable: true
                proveedorRFC:
                  type: string
                  description: 'optional RFC del proveedor. Exactamente 13 caracteres: 4 letras + 6 dígitos (fecha YYMMDD) + 3 caracteres alfanuméricos (homoclave). Ejemplo: ABC123456XYZ'
                  example: consequatur
                  nullable: true
                proveedorContacto:
                  type: string
                  description: 'optional Nombre del contacto del proveedor. Máximo 75 caracteres.'
                  example: 'Juan Perez'
                  nullable: true
              required:
                - idBanco
                - idCategoriaProveedor
                - idProveedor
                - proveedorNombre
                - proveedorTelefono
  '/api/v1/compras/proveedor/eliminar/{id}':
    post:
      summary: 'Eliminar proveedor'
      operationId: eliminarProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  '/api/v1/compras/proveedor/activar/{id}':
    post:
      summary: 'Activar proveedor'
      operationId: activarProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/compras/proveedor/exportar-pdf:
    post:
      summary: 'Exportar PDF proveedor'
      operationId: exportarPDFProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                searchQuery:
                  type: string
                  description: 'nullable El término de búsqueda.'
                  example: juan
                  nullable: false
                idProveedor:
                  type: string
                  description: 'optional ID del proveedor.'
                  example: MQ==
                  nullable: false
                idBanco:
                  type: string
                  description: 'optional ID del banco.'
                  example: MQ==
                  nullable: false
                proveedorNombre:
                  type: string
                  description: 'optional Nombre del proveedor.'
                  example: VIP
                  nullable: false
                proveedorRazonSocial:
                  type: string
                  description: 'optional Razon social del proveedor.'
                  example: 'VIP S.A.'
                  nullable: false
                proveedorDireccion:
                  type: string
                  description: 'optional Dirección del proveedor.'
                  example: 'Calle 123'
                  nullable: false
                proveedorCuenta:
                  type: string
                  description: 'optional Cuenta del proveedor.'
                  example: '1234567890'
                  nullable: false
                proveedorTelefono:
                  type: integer
                  description: 'optional Teléfono del proveedor.'
                  example: 555
                  nullable: false
                proveedorEmail:
                  type: string
                  description: 'optional Email del proveedor.'
                  example: vip@example.com
                  nullable: false
                proveedorRFC:
                  type: string
                  description: 'optional RFC del proveedor.'
                  example: VIP123456789
                  nullable: false
                proveedorContacto:
                  type: string
                  description: 'optional Contacto del proveedor.'
                  example: 'Juan Perez'
                  nullable: false
                proveedorEstado:
                  type: string
                  description: 'optional El estado del proveedor.'
                  example: Activo
                  nullable: false
  /api/v1/compras/proveedor/exportar-excel:
    post:
      summary: 'Exportar EXCEL proveedor'
      operationId: exportarEXCELProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                searchQuery:
                  type: string
                  description: 'nullable El término de búsqueda.'
                  example: juan
                  nullable: false
                idProveedor:
                  type: string
                  description: 'optional ID del proveedor.'
                  example: MQ==
                  nullable: false
                idBanco:
                  type: string
                  description: 'optional ID del banco.'
                  example: MQ==
                  nullable: false
                proveedorNombre:
                  type: string
                  description: 'optional Nombre del proveedor.'
                  example: VIP
                  nullable: false
                proveedorRazonSocial:
                  type: string
                  description: 'optional Razon social del proveedor.'
                  example: 'VIP S.A.'
                  nullable: false
                proveedorDireccion:
                  type: string
                  description: 'optional Dirección del proveedor.'
                  example: 'Calle 123'
                  nullable: false
                proveedorCuenta:
                  type: string
                  description: 'optional Cuenta del proveedor.'
                  example: '1234567890'
                  nullable: false
                proveedorTelefono:
                  type: integer
                  description: 'optional Teléfono del proveedor.'
                  example: 555
                  nullable: false
                proveedorEmail:
                  type: string
                  description: 'optional Email del proveedor.'
                  example: vip@example.com
                  nullable: false
                proveedorRFC:
                  type: string
                  description: 'optional RFC del proveedor.'
                  example: VIP123456789
                  nullable: false
                proveedorContacto:
                  type: string
                  description: 'optional Contacto del proveedor.'
                  example: 'Juan Perez'
                  nullable: false
                proveedorEstado:
                  type: string
                  description: 'optional El estado del proveedor.'
                  example: Activo
                  nullable: false
  /api/v1/compras/proveedor/subir-excel:
    post:
      summary: 'Subir EXCEL proveedor'
      operationId: subirEXCELProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                archivoExcel:
                  type: string
                  format: binary
                  description: 'Archivo Excel con los proveedores a importar.'
                  nullable: false
              required:
                - archivoExcel
  /api/v1/compras/proveedor/validar-duplicados:
    post:
      summary: 'Validar duplicados proveedor'
      operationId: validarDuplicadosProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                proveedoresSeleccionados:
                  type: array
                  description: 'Array de proveedores seleccionados para validar duplicados por nombre, RFC y razón social.'
                  example:
                    -
                      proveedorNombre: 'Proveedor 1'
                      proveedorRFC: ABC123456XYZ
                      proveedorRazonSocial: 'Proveedor 1 S.A.'
                    -
                      proveedorNombre: 'Proveedor 2'
                      proveedorRFC: DEF654321ABC
                      proveedorRazonSocial: 'Proveedor 2 S.A.'
                  items:
                    type: string
              required:
                - proveedoresSeleccionados
  /api/v1/compras/proveedor/resumen-proveedores:
    post:
      summary: 'Resumen final antes de importar'
      operationId: resumenFinalAntesDeImportar
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                proveedoresValidos:
                  type: array
                  description: 'Array de proveedores válidos.'
                  example:
                    -
                      proveedorNombre: 'Pedro López'
                      idCategoriaProveedor: 1
                      idListaPrecio: 1
                      proveedorFolio: FOLIO-456
                      proveedorDireccion: 'Calle Verdadera 456'
                      proveedorRFC: RFC987654321
                      proveedorEmail: pedro@example.com
                      proveedorTelefono: '7461200656'
                  items:
                    type: string
              required:
                - proveedoresValidos
  /api/v1/compras/proveedor/importar-confirmados:
    post:
      summary: 'Importar proveedores confirmados'
      operationId: importarProveedoresConfirmados
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                proveedoresConfirmados:
                  type: array
                  description: 'Array de proveedores confirmados para importar.'
                  example:
                    -
                      proveedorNombre: 'Pedro López'
                      proveedorFolio: FOLIO-456
                      proveedorDireccion: 'Calle Verdadera 456'
                      proveedorRFC: RFC987654321
                      proveedorEmail: pedro@example.com
                  items:
                    type: string
              required:
                - proveedoresConfirmados
  '/api/v1/compras/proveedor/datos-para-detalle/{id}':
    post:
      summary: 'Datos para detalle de proveedor'
      operationId: datosParaDetalleDeProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/compras/proveedor/descargar-plantilla:
    get:
      summary: 'Descargar plantilla de Excel para proveedores'
      operationId: descargarPlantillaDeExcelParaProveedores
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Compras
  /api/v1/compras/requisicion-externa/lista:
    post:
      summary: 'Lista de requisicion'
      operationId: listaDeRequisicion
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                requisicionNo:
                  type: string
                  description: 'Número de la requisición.'
                  example: 2025-0001
                  nullable: false
                requisicionFecha:
                  type: string
                  description: 'Fecha de la requisición.'
                  example: '2025-01-01'
                  nullable: false
                usuarioAlias:
                  type: string
                  description: 'Alias del usuario.'
                  example: Juan
                  nullable: false
                searchQuery:
                  type: string
                  description: 'Búsqueda general en varios campos.'
                  example: Juan
                  nullable: false
  /api/v1/compras/requisicion-externa/lista-historial:
    post:
      summary: 'Lista de historial requisicion'
      operationId: listaDeHistorialRequisicion
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                requisicionNo:
                  type: string
                  description: 'Número de la requisición.'
                  example: 2025-0001
                  nullable: false
                requisicionFecha:
                  type: string
                  description: 'Fecha de la requisición.'
                  example: '2025-01-01'
                  nullable: false
                usuarioAlias:
                  type: string
                  description: 'Alias del usuario.'
                  example: Juan
                  nullable: false
                pedidoFecha:
                  type: string
                  description: 'fecha del pedido.'
                  example: '2025-01-01'
                  nullable: false
                searchQuery:
                  type: string
                  description: 'Búsqueda general en varios campos.'
                  example: Juan
                  nullable: false
  /api/v1/compras/requisicion-externa/datos-para-formulario:
    post:
      summary: 'Datos para formulario de requisicion'
      operationId: datosParaFormularioDeRequisicion
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
  /api/v1/compras/requisicion-externa/producto-adicional:
    post:
      summary: 'Productos adicionales'
      operationId: productosAdicionales
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idProducto:
                  type: string
                  description: 'Id del producto en base64.'
                  example: MQ==
                  nullable: false
                cantidad:
                  type: integer
                  description: 'Cantidad del producto.'
                  example: 2
                  nullable: false
  '/api/v1/compras/requisicion-externa/info-requisicion/{id}':
    get:
      summary: 'informacion de requisicion'
      operationId: informacionDeRequisicion
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Compras
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  '/api/v1/compras/requisicion-externa/info-requisicion-detalle/{id}':
    get:
      summary: 'informacion requisicion detalle'
      operationId: informacionRequisicionDetalle
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Compras
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  '/api/v1/compras/requisicion-externa/info-requisicion-historial/{id}':
    get:
      summary: 'informacion requisicion historial'
      operationId: informacionRequisicionHistorial
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Compras
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/compras/requisicion-externa/accion:
    post:
      summary: 'Crear o editar requisición'
      operationId: crearOEditarRequisicin
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idRequisicion:
                  type: string
                  description: 'optional ID de la requisición en base64 (para editar).'
                  example: MQ==
                  nullable: true
                idSucursal:
                  type: string
                  description: 'optional ID de la sucursal en base64.'
                  example: MQ==
                  nullable: true
                idUsuario:
                  type: string
                  description: 'ID del usuario en base64.'
                  example: MQ==
                  nullable: false
                requisicionDescripcion:
                  type: string
                  description: 'optional Descripción de la requisición. Máximo 250 caracteres.'
                  example: 'Requisición de oficina'
                  nullable: true
                requisicionObservaciones:
                  type: string
                  description: 'optional Observaciones de la requisición. Máximo 250 caracteres.'
                  example: Urgente
                  nullable: true
                requisicionTipo:
                  type: string
                  description: 'Tipo de la requisición. Valores válidos: Interna, Externa.'
                  example: Externa
                  nullable: false
                productos:
                  type: array
                  description: 'Array de productos. Mínimo 1 producto. Cada producto debe contener: idProducto (string, base64, único), cantidad (integer, mínimo 1).'
                  example:
                    - consequatur
                  items:
                    type: string
                productosAdicionales:
                  type: array
                  description: 'optional Array de productos adicionales. Mismo formato que productos.'
                  example:
                    - consequatur
                  items:
                    type: string
              required:
                - idUsuario
                - requisicionTipo
                - productos
  '/api/v1/compras/requisicion-externa/eliminar/{id}':
    delete:
      summary: 'Eliminar requisicion'
      operationId: eliminarRequisicion
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  '/api/v1/compras/requisicion-externa/activar/{id}':
    post:
      summary: 'Activar requisicion'
      operationId: activarRequisicion
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/compras/requisicion-externa/solicitar-cotizacion:
    post:
      summary: 'Solicitar cotización'
      operationId: solicitarCotizacin
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: ''
                    type: object
                    example:
                      success: true
                      message: 'Todos los productos están relacionados'
                    properties:
                      success:
                        type: boolean
                        example: true
                      message:
                        type: string
                        example: 'Todos los productos están relacionados'
                  -
                    description: ''
                    type: object
                    example:
                      success: false
                      incluirNoRelacionados: true
                      idRequisicion: 1
                      idProveedores:
                        - 1
                        - 2
                        - 3
                      message: 'Existen productos que no están relacionados con los proveedores seleccionados...'
                    properties:
                      success:
                        type: boolean
                        example: false
                      incluirNoRelacionados:
                        type: boolean
                        example: true
                      idRequisicion:
                        type: integer
                        example: 1
                      idProveedores:
                        type: array
                        example:
                          - 1
                          - 2
                          - 3
                        items:
                          type: integer
                      message:
                        type: string
                        example: 'Existen productos que no están relacionados con los proveedores seleccionados...'
      tags:
        - Compras
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idRequisicion:
                  type: string
                  description: 'ID de la requisición en base64.'
                  example: MQ==
                  nullable: false
                idProveedores:
                  type: array
                  description: 'Array de IDs de proveedores (integer).'
                  example:
                    - 1
                    - 2
                    - 3
                  items:
                    type: string
              required:
                - idRequisicion
                - idProveedores
  /api/v1/compras/requisicion-externa/generar-cotizaciones:
    post:
      summary: 'Generar cotizaciones'
      operationId: generarCotizaciones
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: true
                  message: 'Cotizaciones generadas exitosamente.'
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: 'Cotizaciones generadas exitosamente.'
      tags:
        - Compras
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idRequisicion:
                  type: string
                  description: 'ID de la requisición en base64.'
                  example: MQ==
                  nullable: false
                idProveedores:
                  type: array
                  description: 'Array de IDs de proveedores (integer). Se puede enviar como array de integers, array con un string separado por comas, o un string directo separado por comas.'
                  example:
                    - 1
                    - 2
                    - 3
                  items:
                    type: string
                incluirNoRelacionados:
                  type: boolean
                  description: 'Indica si se deben incluir productos sin relación con los proveedores.'
                  example: true
                  nullable: false
              required:
                - idRequisicion
                - idProveedores
                - incluirNoRelacionados
  /api/v1/compras/pedidos-al-proveedor/lista:
    post:
      summary: 'Lista de pedidos Proveedor'
      operationId: listaDePedidosProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Compras
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                pedidoNo:
                  type: string
                  description: 'Número de la requisición.'
                  example: 2025-000
                  nullable: false
                pedidoFecha:
                  type: string
                  description: 'optional Razon social del proveedor.'
                  example: '2025-01-01'
                  nullable: false
                idProveedor:
                  type: string
                  description: 'optional ID del proveedor.'
                  example: MQ==
                  nullable: false
                pedidoFechaRecepcion:
                  type: string
                  description: 'optional Razon social del proveedor.'
                  example: '2025-01-01'
                  nullable: false
  /api/v1/compras/pedidos-al-proveedor/datos-para-formulario:
    get:
      summary: 'Datos para formulario de Lista'
      operationId: datosParaFormularioDeLista
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Compras
  /api/v1/dashboard/obtener-metricas:
    post:
      summary: 'Obtener todas las métricas del dashboard'
      operationId: obtenerTodasLasMtricasDelDashboard
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Dashboard
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idSucursal:
                  type: integer
                  description: 'optional ID de sucursal (null = todas).'
                  example: 1
                  nullable: false
                fecha_desde:
                  type: date
                  description: 'optional Fecha inicial (Y-m-d).'
                  example: '2025-01-01'
                  nullable: false
                fecha_hasta:
                  type: date
                  description: 'optional Fecha final (Y-m-d).'
                  example: '2025-12-31'
                  nullable: false
                periodo:
                  type: string
                  description: 'optional Diario|Semanal|Mensual|Anual.'
                  example: Mensual
                  nullable: false
  /api/v1/dashboard/total-ventas:
    post:
      summary: 'Calcular total en ventas (público y reutilizable)'
      operationId: calcularTotalEnVentaspblicoYReutilizable
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Dashboard
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                fecha_desde:
                  type: date
                  description: 'Fecha inicial.'
                  example: '2025-01-01'
                  nullable: false
                fecha_hasta:
                  type: date
                  description: 'Fecha final.'
                  example: '2025-12-31'
                  nullable: false
                idSucursal:
                  type: integer
                  description: 'optional ID sucursal.'
                  example: 1
                  nullable: false
              required:
                - fecha_desde
                - fecha_hasta
  /api/v1/dashboard/ganancias:
    post:
      summary: "Calcular ganancias (público y reutilizable)\nGanancia = (Precio Venta - Precio Compra) * Cantidad Vendida"
      operationId: calcularGananciaspblicoYReutilizableGananciaPrecioVentaPrecioCompraCantidadVendida
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Dashboard
  /api/v1/dashboard/perdidas:
    post:
      summary: "Calcular pérdidas (público y reutilizable)\nPérdidas = Costo * Cantidad perdida en Ajustes (Egreso)"
      operationId: calcularPrdidaspblicoYReutilizablePrdidasCostoCantidadPerdidaEnAjustesEgreso
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Dashboard
  /api/v1/dashboard/ingresos-egresos:
    post:
      summary: 'Calcular ingresos y egresos por periodo (público y reutilizable)'
      operationId: calcularIngresosYEgresosPorPeriodopblicoYReutilizable
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Dashboard
  /api/v1/dashboard/ultimas-ventas:
    post:
      summary: 'Obtener últimas ventas'
      operationId: obtenerltimasVentas
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Dashboard
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idSucursal:
                  type: integer
                  description: 'optional ID sucursal.'
                  example: 1
                  nullable: false
                limite:
                  type: integer
                  description: 'optional Número de registros.'
                  example: 5
                  nullable: false
  /api/v1/dashboard/ultimas-cotizaciones:
    post:
      summary: 'Obtener últimas cotizaciones'
      operationId: obtenerltimasCotizaciones
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Dashboard
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idSucursal:
                  type: integer
                  description: 'optional ID sucursal.'
                  example: 1
                  nullable: false
                limite:
                  type: integer
                  description: 'optional Número de registros.'
                  example: 5
                  nullable: false
  /api/v1/dashboard/top5-productos:
    post:
      summary: 'Obtener top 5 de productos'
      operationId: obtenerTop5DeProductos
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Dashboard
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                tipo:
                  type: string
                  description: 'optional mas_vendidos|menos_vendidos.'
                  example: mas_vendidos
                  nullable: false
                idSucursal:
                  type: integer
                  description: 'optional ID sucursal.'
                  example: 1
                  nullable: false
                fecha_desde:
                  type: date
                  description: 'optional Fecha inicial.'
                  example: '2025-01-01'
                  nullable: false
                fecha_hasta:
                  type: date
                  description: 'optional Fecha final.'
                  example: '2025-12-31'
                  nullable: false
  /api/v1/inventario/categoria-producto/lista:
    post:
      summary: 'Lista de categorías de productos'
      operationId: listaDeCategorasDeProductos
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idCategoriaProductoSuperior:
                  type: string
                  description: 'optional ID en base64 de la categoría padre.'
                  example: MQ==
                  nullable: false
                categoriaProductoAlias:
                  type: string
                  description: 'optional Alias de la categoría.'
                  example: Abarrotes
                  nullable: false
                categoriaProductoEstado:
                  type: string
                  description: "optional Estado ('Activo'|'Inactivo')."
                  example: Activo
                  nullable: false
                searchQuery:
                  type: string
                  description: 'Búsqueda general.'
                  example: Abar
                  nullable: false
                sort_field:
                  type: string
                  description: 'Campo de orden.'
                  example: idCategoriaProducto
                  nullable: false
                sort_direction:
                  type: string
                  description: "Dirección de orden ('asc'|'desc')."
                  example: asc
                  nullable: false
                perPage:
                  type: integer
                  description: 'Elementos por página.'
                  example: 10
                  nullable: false
  /api/v1/inventario/categoria-producto/accion:
    post:
      summary: 'Agregar categoría de producto'
      operationId: agregarCategoraDeProducto
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idCategoriaProducto:
                  type: string
                  description: ''
                  example: null
                  nullable: true
                idCategoriaProductoSuperior:
                  type: string
                  description: 'optional ID en base64 de la categoría padre.'
                  example: MQ==
                  nullable: true
                categoriaProductoAlias:
                  type: string
                  description: 'Alias de la categoría.'
                  example: Lácteos
                  nullable: false
                categoriaProductoIcono:
                  type: file|url
                  description: 'optional Ruta o URL de icono.'
                  example: /images/categorias/lacteos.png
                  nullable: true
                categoriaProductoEstado:
                  type: string
                  description: ''
                  example: Activo
                  nullable: true
                  enum:
                    - Activo
                    - Inactivo
              required:
                - categoriaProductoAlias
  /api/v1/inventario/categoria-producto/editar:
    post:
      summary: 'Editar categoría de producto'
      operationId: editarCategoraDeProducto
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idCategoriaProducto:
                  type: string
                  description: 'ID en base64.'
                  example: MQ==
                  nullable: true
                idCategoriaProductoSuperior:
                  type: string
                  description: 'optional ID en base64 de la categoría padre.'
                  example: MQ==
                  nullable: true
                categoriaProductoAlias:
                  type: string
                  description: Alias.
                  example: 'Lácteos frescos'
                  nullable: false
                categoriaProductoIcono:
                  type: string
                  description: 'optional Icono.'
                  example: /images/categorias/lacteos.png
                  nullable: true
                categoriaProductoEstado:
                  type: string
                  description: "optional Estado ('Activo'|'Inactivo')."
                  example: Activo
                  nullable: true
              required:
                - idCategoriaProducto
                - categoriaProductoAlias
  '/api/v1/inventario/categoria-producto/eliminar/{id}':
    delete:
      summary: 'Eliminar (inactivar) categoría de producto'
      operationId: eliminarinactivarCategoraDeProducto
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/inventario/categoria-producto/activar/{id}':
    post:
      summary: 'Activar categoría de producto'
      operationId: activarCategoraDeProducto
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/inventario/categoria-producto/form-data:
    get:
      summary: 'Datos para formulario de categoría (catálogos)'
      operationId: datosParaFormularioDeCategoracatlogos
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Inventario
  '/api/v1/inventario/categoria-producto/info/{id}':
    get:
      summary: 'Información puntual de categoría (por ID)'
      operationId: informacinPuntualDeCategoraporID
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/inventario/producto/lista:
    post:
      summary: 'Lista de productos'
      operationId: listaDeProductos
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idUnidad:
                  type: integer
                  description: 'optional ID de unidad.'
                  example: 3
                  nullable: false
                idCategoriaProducto:
                  type: integer
                  description: 'optional ID de categoria.'
                  example: 1
                  nullable: false
                idProductoCompuesto:
                  type: string
                  description: 'optional ID del producto padre (base64 o id).'
                  example: MQ==
                  nullable: false
                productoAlias:
                  type: string
                  description: 'optional Búsqueda por alias.'
                  example: Paracetamol
                  nullable: false
                productoMarca:
                  type: string
                  description: 'optional Marca.'
                  example: ACME
                  nullable: false
                productoCodigoBarras:
                  type: string
                  description: 'optional Código de barras.'
                  example: '7501234567890'
                  nullable: false
                productoSKU:
                  type: string
                  description: 'optional SKU.'
                  example: SKU-001
                  nullable: false
                productoTipo:
                  type: string
                  description: 'optional Tipo (char[1]).'
                  example: P
                  nullable: false
                productoSaldo:
                  type: string
                  description: 'optional Saldo (char[1]).'
                  example: S
                  nullable: false
                productoControlCaducidad:
                  type: string
                  description: 'optional Control de caducidad (Sí|No).'
                  example: Sí
                  nullable: false
                productoTasaIVA:
                  type: string
                  description: 'optional Tasa IVA (char[1]).'
                  example: A
                  nullable: false
                productoEstado:
                  type: string
                  description: 'optional Estado (Activo|Inactivo|Descontinuado).'
                  example: Activo
                  nullable: false
                searchQuery:
                  type: string
                  description: 'optional Búsqueda general.'
                  example: ACME
                  nullable: false
                sort_field:
                  type: string
                  description: 'optional Campo de orden.'
                  example: idProducto
                  nullable: false
                sort_direction:
                  type: string
                  description: 'optional Dirección de orden (asc|desc).'
                  example: asc
                  nullable: false
                perPage:
                  type: integer
                  description: 'optional Elementos por página.'
                  example: 10
                  nullable: false
  /api/v1/inventario/producto/accion:
    post:
      summary: 'Crear producto'
      operationId: crearProducto
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  code: 200
                  message: 'Producto agregado correctamente'
                  data:
                    idProducto: 9
                properties:
                  code:
                    type: integer
                    example: 200
                  message:
                    type: string
                    example: 'Producto agregado correctamente'
                  data:
                    type: object
                    properties:
                      idProducto:
                        type: integer
                        example: 9
                        description: 'ID del producto recién creado.'
                        enum: []
      tags:
        - Inventario
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                idProducto:
                  type: string
                  description: ''
                  example: null
                  nullable: true
                idProductoCompuesto:
                  type: string
                  description: 'optional ID del producto padre (base64 o id). Example:'
                  example: consequatur
                  nullable: true
                idCategoriaProducto:
                  type: integer
                  description: optional
                  example: 1
                  nullable: false
                idUnidad:
                  type: integer
                  description: ''
                  example: 1
                  nullable: false
                productoAlias:
                  type: string
                  description: ''
                  example: 'Paracetamol 500mg'
                  nullable: false
                Imagen:
                  type: string
                  format: binary
                  description: 'Imagen (jpg,jpeg,png,webp; máx 4MB)'
                  nullable: false
                productoMarca:
                  type: string
                  description: optional
                  example: ACME
                  nullable: true
                productoFabricante:
                  type: string
                  description: optional
                  example: 'Laboratorios Salud'
                  nullable: true
                productoModelo:
                  type: string
                  description: optional
                  example: X100
                  nullable: true
                productoSKU:
                  type: string
                  description: optional
                  example: PARA-500
                  nullable: true
                productoCodigoBarras:
                  type: string
                  description: ''
                  example: ABC-75
                  nullable: false
                productoSerie:
                  type: string
                  description: optional
                  example: S-0001
                  nullable: true
                productoPresentacion:
                  type: string
                  description: optional
                  example: 'Caja con 20 tabletas'
                  nullable: true
                productoTipoCompuesto:
                  type: string
                  description: optional
                  example: Caja
                  nullable: true
                productoComposicionCantidad:
                  type: number
                  description: optional
                  example: 500.0
                  nullable: true
                productoSabor:
                  type: string
                  description: optional
                  example: Fresa
                  nullable: true
                productoTipo:
                  type: string
                  description: ''
                  example: Simple
                  nullable: false
                productoSaldo:
                  type: string
                  description: ''
                  example: Sí
                  nullable: true
                productoTasaIVA:
                  type: string
                  description: ''
                  example: 16%
                  nullable: true
                productoIEPS:
                  type: number
                  description: optional
                  example: 8.0
                  nullable: true
                productoEstado:
                  type: string
                  description: optional
                  example: Activo
                  nullable: true
                productoControlCaducidad:
                  type: string
                  description: ''
                  example: Sí
                  nullable: true
              required:
                - idUnidad
                - productoAlias
                - Imagen
                - productoCodigoBarras
                - productoTipo
                - productoSaldo
                - productoTasaIVA
                - productoControlCaducidad
  /api/v1/inventario/producto/editar:
    post:
      summary: 'Editar producto'
      operationId: editarProducto
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                idProducto:
                  type: string
                  description: ''
                  example: MQ==
                  nullable: true
                idProductoCompuesto:
                  type: string
                  description: optional
                  example: MQ==
                  nullable: true
                idCategoriaProducto:
                  type: integer
                  description: optional
                  example: 1
                  nullable: false
                idUnidad:
                  type: integer
                  description: ''
                  example: 5
                  nullable: false
                productoAlias:
                  type: string
                  description: ''
                  example: 'Paracetamol 500mg tabs'
                  nullable: false
                Imagen:
                  type: string
                  format: binary
                  description: 'optional Nueva imagen (jpg,jpeg,png,webp; máx 4MB)'
                  nullable: false
                productoMarca:
                  type: string
                  description: optional
                  example: ACME
                  nullable: true
                productoFabricante:
                  type: string
                  description: optional
                  example: 'Laboratorios Salud'
                  nullable: true
                productoModelo:
                  type: string
                  description: optional
                  example: X101
                  nullable: true
                productoSKU:
                  type: string
                  description: optional
                  example: PARA-500
                  nullable: true
                productoCodigoBarras:
                  type: string
                  description: ''
                  example: ABC-75
                  nullable: false
                productoSerie:
                  type: string
                  description: optional
                  example: S-0002
                  nullable: true
                productoPresentacion:
                  type: string
                  description: optional
                  example: 'Caja con 20 tabletas'
                  nullable: true
                productoTipoCompuesto:
                  type: string
                  description: optional
                  example: Charola
                  nullable: true
                productoComposicionCantidad:
                  type: number
                  description: optional
                  example: 500.0
                  nullable: true
                productoSabor:
                  type: string
                  description: optional
                  example: Fresa
                  nullable: true
                productoTipo:
                  type: string
                  description: ''
                  example: Simple
                  nullable: false
                productoSaldo:
                  type: string
                  description: ''
                  example: Sí
                  nullable: true
                productoTasaIVA:
                  type: string
                  description: ''
                  example: 16%
                  nullable: true
                productoIEPS:
                  type: number
                  description: optional
                  example: 8.0
                  nullable: true
                productoEstado:
                  type: string
                  description: optional
                  example: Activo
                  nullable: true
                productoControlCaducidad:
                  type: string
                  description: ''
                  example: Sí
                  nullable: true
                precio_publico:
                  type: number
                  description: 'optional Si se envía, actualiza lista 1.'
                  example: 40.0
                  nullable: false
                precio_medio:
                  type: number
                  description: 'optional Si se envía, actualiza lista 2.'
                  example: 30.0
                  nullable: false
                precio_mayoreo:
                  type: number
                  description: 'optional Si se envía, actualiza lista 3.'
                  example: 25.0
                  nullable: false
                listas_precios:
                  type: object
                  description: "optional Alternativa a los 3 campos planos.\n - form-data: listas_precios[1]=40&listas_precios[2]=30&listas_precios[3]=25\n - JSON string: {\"1\":40,\"2\":30,\"3\":25}"
                  example: []
                  nullable: false
                  properties: {  }
              required:
                - idProducto
                - idUnidad
                - productoAlias
                - productoCodigoBarras
                - productoTipo
                - productoSaldo
                - productoTasaIVA
                - productoControlCaducidad
  '/api/v1/inventario/producto/eliminar/{id}':
    delete:
      summary: 'Inactivar producto'
      operationId: inactivarProducto
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/inventario/producto/activar/{id}':
    post:
      summary: 'Activar producto'
      operationId: activarProducto
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/inventario/producto/descontinuar/{id}':
    post:
      summary: 'Descontinuar producto'
      operationId: descontinuarProducto
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/inventario/producto/exportar/pdf:
    post:
      summary: 'Exportar PDF producto'
      operationId: exportarPDFProducto
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                searchQuery:
                  type: string
                  description: 'nullable Término de búsqueda.'
                  example: gansi
                  nullable: false
                idProducto:
                  type: string
                  description: 'optional ID del producto (base64).'
                  example: MQ==
                  nullable: false
                idUnidad:
                  type: string
                  description: 'optional ID de la unidad (base64).'
                  example: MQ==
                  nullable: false
                idCategoriaProducto:
                  type: string
                  description: 'optional ID de la categoría (base64).'
                  example: MQ==
                  nullable: false
                idProductoCompuesto:
                  type: string
                  description: 'optional ID del producto padre (base64).'
                  example: MQ==
                  nullable: false
                productoAlias:
                  type: string
                  description: 'optional Alias.'
                  example: 'Gansito 50g'
                  nullable: false
                productoMarca:
                  type: string
                  description: 'optional Marca.'
                  example: Marinela
                  nullable: false
                productoFabricante:
                  type: string
                  description: 'optional Fabricante.'
                  example: Bimbo
                  nullable: false
                productoModelo:
                  type: string
                  description: 'optional Modelo.'
                  example: '2024'
                  nullable: false
                productoSKU:
                  type: string
                  description: 'optional SKU.'
                  example: GAN-50
                  nullable: false
                productoCodigoBarras:
                  type: string
                  description: 'optional Código de barras.'
                  example: '75010001111'
                  nullable: false
                productoSerie:
                  type: string
                  description: 'optional Serie.'
                  example: S-001
                  nullable: false
                productoPresentacion:
                  type: string
                  description: 'optional Presentación.'
                  example: 50g
                  nullable: false
                productoTipoCompuesto:
                  type: string
                  description: 'optional Caja|Charola|Bolsa.'
                  example: Caja
                  nullable: false
                productoSabor:
                  type: string
                  description: 'optional Sabor.'
                  example: Chocolate
                  nullable: false
                productoTipo:
                  type: string
                  description: 'optional Simple|Compuesto.'
                  example: Simple
                  nullable: false
                productoSaldo:
                  type: string
                  description: 'optional Sí|No.'
                  example: Sí
                  nullable: false
                productoControlCaducidad:
                  type: string
                  description: 'optional Control de caducidad (Sí|No).'
                  example: Sí
                  nullable: false
                productoTasaIVA:
                  type: string
                  description: 'optional 0%|16%.'
                  example: 16%
                  nullable: false
                productoEstado:
                  type: string
                  description: 'optional Activo|Inactivo|Descontinuado.'
                  example: Activo
                  nullable: false
  /api/v1/inventario/producto/exportar/excel:
    post:
      summary: 'Exportar EXCEL producto'
      operationId: exportarEXCELProducto
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                searchQuery:
                  type: string
                  description: 'nullable Término de búsqueda.'
                  example: gansi
                  nullable: false
                idProducto:
                  type: string
                  description: 'optional ID del producto (base64).'
                  example: MQ==
                  nullable: false
                idUnidad:
                  type: string
                  description: 'optional ID de la unidad (base64).'
                  example: MQ==
                  nullable: false
                idCategoriaProducto:
                  type: string
                  description: 'optional ID de la categoría (base64).'
                  example: MQ==
                  nullable: false
                idProductoCompuesto:
                  type: string
                  description: 'optional ID del producto padre (base64).'
                  example: MQ==
                  nullable: false
                productoAlias:
                  type: string
                  description: 'optional Alias.'
                  example: 'Gansito 50g'
                  nullable: false
                productoMarca:
                  type: string
                  description: 'optional Marca.'
                  example: Marinela
                  nullable: false
                productoFabricante:
                  type: string
                  description: 'optional Fabricante.'
                  example: Bimbo
                  nullable: false
                productoModelo:
                  type: string
                  description: 'optional Modelo.'
                  example: '2024'
                  nullable: false
                productoSKU:
                  type: string
                  description: 'optional SKU.'
                  example: GAN-50
                  nullable: false
                productoCodigoBarras:
                  type: string
                  description: 'optional Código de barras.'
                  example: '75010001111'
                  nullable: false
                productoSerie:
                  type: string
                  description: 'optional Serie.'
                  example: S-001
                  nullable: false
                productoPresentacion:
                  type: string
                  description: 'optional Presentación.'
                  example: 50g
                  nullable: false
                productoTipoCompuesto:
                  type: string
                  description: 'optional Caja|Charola|Bolsa.'
                  example: Caja
                  nullable: false
                productoSabor:
                  type: string
                  description: 'optional Sabor.'
                  example: Chocolate
                  nullable: false
                productoTipo:
                  type: string
                  description: 'optional Simple|Compuesto.'
                  example: Simple
                  nullable: false
                productoSaldo:
                  type: string
                  description: 'optional Sí|No.'
                  example: Sí
                  nullable: false
                productoControlCaducidad:
                  type: string
                  description: 'optional Control de caducidad (Sí|No).'
                  example: Sí
                  nullable: false
                productoTasaIVA:
                  type: string
                  description: 'optional 0%|16%.'
                  example: 16%
                  nullable: false
                productoEstado:
                  type: string
                  description: 'optional Activo|Inactivo|Descontinuado.'
                  example: Activo
                  nullable: false
  /api/v1/inventario/producto/subir-excel:
    post:
      summary: 'Subir EXCEL productos (solo preview)'
      operationId: subirEXCELProductossoloPreview
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                archivoExcel:
                  type: string
                  format: binary
                  description: 'Archivo Excel con los productos a importar.'
                  nullable: false
              required:
                - archivoExcel
  /api/v1/inventario/producto/validar-duplicados:
    post:
      summary: 'Validar duplicados internos por Código de Barras dentro de la selección del usuario'
      operationId: validarDuplicadosInternosPorCdigoDeBarrasDentroDeLaSeleccinDelUsuario
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                productosSeleccionados:
                  type: array
                  description: ''
                  example:
                    -
                      productoAlias: Gansito
                      productoCodigoBarras: '75010001111'
                      idUnidad: MQ==
                  items:
                    type: string
              required:
                - productosSeleccionados
  /api/v1/inventario/producto/resumen:
    post:
      summary: 'Resumen final antes de importar (valida contra reglas)'
      operationId: resumenFinalAntesDeImportarvalidaContraReglas
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                productosSeleccionados:
                  type: array
                  description: ''
                  example:
                    - consequatur
                  items:
                    type: string
              required:
                - productosSeleccionados
  /api/v1/inventario/producto/confirmar:
    post:
      summary: 'Importar productos confirmados'
      operationId: importarProductosConfirmados
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                productosConfirmados:
                  type: array
                  description: ''
                  example:
                    - consequatur
                  items:
                    type: string
              required:
                - productosConfirmados
  /api/v1/inventario/producto/form-data:
    get:
      summary: 'Datos para formulario de producto (catálogos y combos)'
      operationId: datosParaFormularioDeProductocatlogosYCombos
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Inventario
  '/api/v1/inventario/producto/info/{id}':
    get:
      summary: 'Información puntual de producto (por ID)'
      operationId: informacinPuntualDeProductoporID
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/inventario/producto/detalle/{id}':
    get:
      summary: 'Datos para detalle de producto (prefill de formulario)'
      operationId: datosParaDetalleDeProductoprefillDeFormulario
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/inventario/producto/info-ajuste-precio/{id}':
    get:
      summary: 'Información de ajuste de precio de producto'
      operationId: informacinDeAjusteDePrecioDeProducto
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/inventario/producto/accion-ajuste-precio:
    post:
      summary: 'Ajustar precio de producto'
      operationId: ajustarPrecioDeProducto
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idListaPrecioDetalle:
                  type: string
                  description: 'ID del detalle de lista de precios (base64).'
                  example: MQ==
                  nullable: false
                precioVenta:
                  type: number
                  description: 'Nuevo precio del producto (>=0).'
                  example: 45.5
                  nullable: false
              required:
                - idListaPrecioDetalle
                - precioVenta
  /api/v1/inventario/producto/plantilla/con-precios:
    get:
      summary: 'Descargar plantilla de Excel Con Precios'
      operationId: descargarPlantillaDeExcelConPrecios
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Inventario
  /api/v1/inventario/producto/plantilla/sin-precios:
    get:
      summary: 'Descargar plantilla de Excel Sin Precios'
      operationId: descargarPlantillaDeExcelSinPrecios
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Inventario
  /api/v1/inventario/producto/compuesto/crear:
    post:
      summary: 'Crear producto compuesto'
      operationId: crearProductoCompuesto
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idProductoBase:
                  type: string
                  description: 'ID del producto base (id o base64).'
                  example: MQ==
                  nullable: false
                productoTipoCompuesto:
                  type: string
                  description: Caja|Charola|Bolsa.
                  example: Caja
                  nullable: false
                productoComposicionCantidad:
                  type: number
                  description: 'Cantidad de la composición (>0).'
                  example: 12.0
                  nullable: false
              required:
                - idProductoBase
                - productoTipoCompuesto
                - productoComposicionCantidad
  '/api/v1/inventario/producto/{id}/precios':
    post:
      summary: 'Guardar precios del producto en las listas 1,2,3'
      operationId: guardarPreciosDelProductoEnLasListas123
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: (URL)
                  description: 'path required ID del producto (id o base64).'
                  example: MQ==
                  nullable: false
                precio_publico:
                  type: number
                  description: 'optional Precio para Público en general (lista 1).'
                  example: 40.0
                  nullable: false
                precio_medio:
                  type: number
                  description: 'optional Precio para Medio mayoreo (lista 2).'
                  example: 30.0
                  nullable: false
                precio_mayoreo:
                  type: number
                  description: 'optional Precio para Mayoreo (lista 3).'
                  example: 25.0
                  nullable: false
                listas_precios:
                  type: object
                  description: "optional Alternativa a los 3 campos planos.\n - form-data: listas_precios[1]=40&listas_precios[2]=30&listas_precios[3]=25\n - JSON string: {\"1\":40,\"2\":30,\"3\":25}"
                  example: []
                  nullable: false
                  properties: {  }
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the producto.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/inventario/proveedor-producto/lista:
    post:
      summary: 'Lista de proveedores'
      operationId: listaDeProveedores
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idProveedor:
                  type: string
                  description: 'optional ID del proveedor.'
                  example: MQ==
                  nullable: false
                idProducto:
                  type: string
                  description: 'optional ID del producto.'
                  example: MQ==
                  nullable: false
                productoAlias:
                  type: string
                  description: 'optional Nombre del producto.'
                  example: VIP
                  nullable: false
                productoMarca:
                  type: string
                  description: 'optional Marca del producto.'
                  example: VIP
                  nullable: false
                productoPresentacion:
                  type: string
                  description: 'optional Presentación del producto.'
                  example: Caja
                  nullable: false
                unidadTipo:
                  type: string
                  description: 'optional Tipo de unidad del producto.'
                  example: Piezas
                  nullable: false
                proveedorProductoEstado:
                  type: string
                  description: 'optional Estado del producto en el proveedor.'
                  example: Activo
                  nullable: false
                searchQuery:
                  type: string
                  description: 'Búsqueda general en varios campos.'
                  example: Juan
                  nullable: false
  /api/v1/inventario/proveedor-producto/accion:
    post:
      summary: 'Agregar/reactivar producto al proveedor'
      operationId: agregarreactivarProductoAlProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idProveedor:
                  type: string
                  description: 'ID del proveedor (base64).'
                  example: Mg==
                  nullable: false
                idProducto:
                  type: string|array
                  description: 'Uno o varios IDs de producto (base64). Si existe una relación inactiva, la reactiva.'
                  example: 'MQ== o ["MQ==","Mg=="]'
                  nullable: false
              required:
                - idProveedor
                - idProducto
  '/api/v1/inventario/proveedor-producto/eliminar/{id}':
    delete:
      summary: 'Eliminar producto del proveedor'
      operationId: eliminarProductoDelProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  '/api/v1/inventario/proveedor-producto/activar/{id}':
    post:
      summary: 'Activar producto del proveedor'
      operationId: activarProductoDelProveedor
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/inventario/proveedor-producto/form-data:
    get:
      summary: 'Datos para formulario (catálogos y combos)'
      operationId: datosParaFormulariocatlogosYCombos
      description: ''
      parameters:
        -
          in: query
          name: idProveedor
          description: 'optional ID del proveedor en base64 para prefiltrar productos no relacionados.'
          example: MQ==
          required: false
          schema:
            type: string
            description: 'optional ID del proveedor en base64 para prefiltrar productos no relacionados.'
            example: MQ==
            nullable: false
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Inventario
  '/api/v1/inventario/proveedor-producto/info/{id}':
    get:
      summary: 'Información puntual de la relación proveedor-producto'
      operationId: informacinPuntualDeLaRelacinProveedorProducto
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID de la relación en base64 (idProveedorProducto).'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/inventario/proveedor-producto/detalle/{id}':
    get:
      summary: 'Datos para detalle (prefill de edición) de la relación proveedor-producto'
      operationId: datosParaDetalleprefillDeEdicinDeLaRelacinProveedorProducto
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID de la relación en base64 (idProveedorProducto).'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/inventario/unidad/lista:
    post:
      summary: 'Lista de unidades'
      operationId: listaDeUnidades
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                unidadTipo:
                  type: string
                  description: 'optional Alias/tipo de la unidad.'
                  example: Pieza
                  nullable: false
                unidadEstado:
                  type: string
                  description: "optional Estado ('Activo'|'Inactivo')."
                  example: Activo
                  nullable: false
                searchQuery:
                  type: string
                  description: 'optional Búsqueda general.'
                  example: Piez
                  nullable: false
                sort_field:
                  type: string
                  description: 'optional Campo de orden.'
                  example: idUnidad
                  nullable: false
                sort_direction:
                  type: string
                  description: "optional Dirección ('asc'|'desc')."
                  example: asc
                  nullable: false
                perPage:
                  type: integer
                  description: 'optional Elementos por página.'
                  example: 10
                  nullable: false
  /api/v1/inventario/unidad/accion:
    post:
      summary: 'Agregar unidad'
      operationId: agregarUnidad
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idUnidad:
                  type: string
                  description: ''
                  example: null
                  nullable: true
                unidadTipo:
                  type: string
                  description: 'Tipo de unidad. Máx 25.'
                  example: Pieza
                  nullable: false
                unidadEstado:
                  type: string
                  description: ''
                  example: Inactivo
                  nullable: true
                  enum:
                    - Activo
                    - Inactivo
              required:
                - unidadTipo
  /api/v1/inventario/unidad/editar:
    post:
      summary: 'Editar unidad'
      operationId: editarUnidad
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idUnidad:
                  type: string
                  description: 'ID en base64.'
                  example: MQ==
                  nullable: true
                unidadTipo:
                  type: string
                  description: 'Tipo de unidad.'
                  example: Pza
                  nullable: false
                unidadEstado:
                  type: string
                  description: "optional Estado ('Activo'|'Inactivo')."
                  example: Activo
                  nullable: true
              required:
                - idUnidad
                - unidadTipo
  '/api/v1/inventario/unidad/eliminar/{id}':
    delete:
      summary: 'Eliminar (inactivar) unidad'
      operationId: eliminarinactivarUnidad
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/inventario/unidad/activar/{id}':
    post:
      summary: 'Activar unidad'
      operationId: activarUnidad
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/inventario/unidad/form-data:
    get:
      summary: 'Datos para formulario de unidad (catálogos)'
      operationId: datosParaFormularioDeUnidadcatlogos
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Inventario
  '/api/v1/inventario/unidad/info/{id}':
    get:
      summary: 'Información puntual de unidad (por ID)'
      operationId: informacinPuntualDeUnidadporID
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/inventario/unidad/detalle/{id}':
    get:
      summary: 'Datos para detalle de unidad (prefill de edición)'
      operationId: datosParaDetalleDeUnidadprefillDeEdicin
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Inventario
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/inventario/Inventario/obtener-productos-kardex:
    post:
      summary: 'Obtener kardex de productos con paginación y renderizado responsivo'
      operationId: obtenerKardexDeProductosConPaginacinYRenderizadoResponsivo
      description: "Retorna un kardex procesado (historial de movimientos) con datos paginados\nque se renderizan en vistas parciales responsivas según el tipo de dispositivo.\nSolo responde a solicitudes AJAX.\n\nOPTIMIZACIONES IMPLEMENTADAS:\n- Agregación de datos directamente en la BD (SUM, GROUP BY) para reducir procesamiento en PHP\n- Índices en tablas para acelerar búsquedas (fecha, producto, sucursal)\n- Caching con tags (1 hora TTL) para evitar recálculos frecuentes\n- Selección de columnas específicas (sin traer campos innecesarios)\n- Joins eficientes en lugar de relaciones N+1"
      parameters:
        -
          in: query
          name: page
          description: 'optional Número de página para paginación.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'optional Número de página para paginación.'
            example: 1
            nullable: false
        -
          in: query
          name: dispositivo
          description: 'optional Tipo de dispositivo (Tablet|Desktop).'
          example: Tablet
          required: false
          schema:
            type: string
            description: 'optional Tipo de dispositivo (Tablet|Desktop).'
            example: Tablet
            nullable: false
        -
          in: query
          name: idProducto
          description: 'optional ID del producto para filtrar kardex.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'optional ID del producto para filtrar kardex.'
            example: 1
            nullable: false
        -
          in: query
          name: idSucursal
          description: 'optional ID de sucursal para filtrar.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'optional ID de sucursal para filtrar.'
            example: 1
            nullable: false
        -
          in: query
          name: desde
          description: 'date optional Fecha inicial en formato YYYY-MM-DD.'
          example: '2025-10-01'
          required: false
          schema:
            type: string
            description: 'date optional Fecha inicial en formato YYYY-MM-DD.'
            example: '2025-10-01'
            nullable: false
        -
          in: query
          name: hasta
          description: 'date optional Fecha final en formato YYYY-MM-DD.'
          example: '2025-10-31'
          required: false
          schema:
            type: string
            description: 'date optional Fecha final en formato YYYY-MM-DD.'
            example: '2025-10-31'
            nullable: false
        -
          in: query
          name: fecha
          description: 'date optional Fecha de referencia para el kardex.'
          example: '2025-10-31'
          required: false
          schema:
            type: string
            description: 'date optional Fecha de referencia para el kardex.'
            example: '2025-10-31'
            nullable: false
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: ''
                    type: object
                    example:
                      html: '<table>...</table>'
                      hasMore: true
                    properties:
                      html:
                        type: string
                        example: '<table>...</table>'
                        description: 'HTML renderizado de la vista parcial (Tablet o Desktop)'
                        enum: []
                      hasMore:
                        type: boolean
                        example: true
                        description: 'Indica si hay más páginas disponibles'
                        enum: []
                  -
                    description: ''
                    type: object
                    example:
                      html: ''
                      hasMore: false
                    properties:
                      html:
                        type: string
                        example: ''
                        description: 'HTML renderizado de la vista parcial (Tablet o Desktop)'
                        enum: []
                      hasMore:
                        type: boolean
                        example: false
                        description: 'Indica si hay más páginas disponibles'
                        enum: []
      tags:
        - Inventario
  /api/v1/inventario/Inventario/exportar-kardex-excel:
    post:
      summary: 'Exportar kardex de productos a Excel'
      operationId: exportarKardexDeProductosAExcel
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
  /api/v1/inventario/Inventario/exportar-kardex-pdf:
    post:
      summary: 'Exportar kardex de productos a PDF'
      operationId: exportarKardexDeProductosAPDF
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Inventario
  /api/v1/acceso:
    post:
      summary: Acceso
      operationId: acceso
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Login
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                usuarioAlias:
                  type: string
                  description: 'Must be at least 1 character.'
                  example: vmqeopfuudtdsufvyvddqamniihfqcoynlazghdtqtqxbajwbpilpmufinllwloauydlsmsju
                  nullable: false
                usuarioPassword:
                  type: string
                  description: 'Must be at least 1 character.'
                  example: ryvojcybzvrbyickznkygloigmkwxphlvazjrcnfbaqywuxhgjjmzuxjubqouzswiwxtrkimf
                  nullable: false
              required:
                - usuarioAlias
                - usuarioPassword
  /api/v1/validar-usuario:
    post:
      summary: 'Validar usuario'
      operationId: validarUsuario
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Login
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                usuarioEmail:
                  type: string
                  description: 'Must be a valid email address. Must match the regex /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.'
                  example: '1jXk@U.P{2,}'
                  nullable: false
              required:
                - usuarioEmail
  /api/v1/validar-codigo:
    post:
      summary: 'Validar codigo'
      operationId: validarCodigo
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Login
  /api/v1/solicitar-nuevo-codigo:
    post:
      summary: 'Solicitar nuevo codigo'
      operationId: solicitarNuevoCodigo
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Login
  /api/v1/actualizar-contrasena:
    post:
      summary: 'Actualizar contraseña'
      operationId: actualizarContrasea
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Login
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                usuarioPassword:
                  type: string
                  description: ''
                  example: consequatur
                  nullable: false
              required:
                - usuarioPassword
  /api/v1/cerrar-sesion:
    post:
      summary: 'Cerrar sesión'
      operationId: cerrarSesin
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Login
  /api/v1/promociones/combo/lista:
    post:
      summary: 'Lista de combos'
      operationId: listaDeCombos
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idCombo:
                  type: integer
                  description: 'optional ID del combo.'
                  example: 1
                  nullable: false
                idComboProducto:
                  type: integer
                  description: 'optional ID del producto del combo.'
                  example: 2
                  nullable: false
                idListaPrecioDetalle:
                  type: integer
                  description: 'optional ID de la lista de precios del combo.'
                  example: 3
                  nullable: false
                comboAlias:
                  type: string
                  description: 'optional Alias del combo.'
                  example: 'Combo 1'
                  nullable: false
                listaPrecioDetalleImporte:
                  type: integer
                  description: 'optional Importe de la lista de precios del combo.'
                  example: 100
                  nullable: false
                comboFechaInicio:
                  type: string
                  description: 'optional Fecha de inicio del combo.'
                  example: '2023-01-01'
                  nullable: false
                comboFechaFin:
                  type: string
                  description: 'optional Fecha de fin del combo.'
                  example: '2023-12-31'
                  nullable: false
                comboEstado:
                  type: string
                  description: 'optional Estado del combo.'
                  example: Activo
                  nullable: false
                searchQuery:
                  type: string
                  description: 'Búsqueda general en varios campos.'
                  example: Juan
                  nullable: false
  /api/v1/promociones/combo/datos-para-formulario:
    post:
      summary: 'Datos para formulario de creación/edición de combo'
      operationId: datosParaFormularioDeCreacinedicinDeCombo
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
  '/api/v1/promociones/combo/info-combo/{id}':
    get:
      summary: 'Información de un combo'
      operationId: informacinDeUnCombo
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Promociones
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64 o id.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/promociones/combo/crear-paso-1:
    post:
      summary: 'Crear o editar combo Paso 1'
      operationId: crearOEditarComboPaso1
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idCombo:
                  type: string
                  description: 'optional ID del combo en base64 (si se manda se edita; si no se crea).'
                  example: MQ==
                  nullable: true
                comboAlias:
                  type: string
                  description: 'Alias del combo. Máximo 75 caracteres. Debe ser único.'
                  example: 'Combo 1'
                  nullable: false
                comboFechaInicio:
                  type: string
                  description: 'optional Fecha de inicio del combo (formato date).'
                  example: '2023-01-01'
                  nullable: true
                comboFechaFin:
                  type: string
                  description: 'optional Fecha de fin del combo (formato date). Debe ser posterior a comboFechaInicio.'
                  example: '2023-12-31'
                  nullable: true
              required:
                - comboAlias
  /api/v1/promociones/combo/crear-paso-2:
    post:
      summary: 'Crear combo Paso 2'
      operationId: crearComboPaso2
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idCombo:
                  type: string
                  description: 'ID del combo en base64.'
                  example: MQ==
                  nullable: false
                productos:
                  type: array
                  description: 'Lista de productos del combo. Mínimo 1 producto. Cada producto debe contener: idProducto (string,), idComboProducto (string, ) cantidad (integer, mínimo 1).'
                  example:
                    - consequatur
                  items:
                    type: string
                listaPrecioDetalleImporte:
                  type: numeric
                  description: 'Importe de la lista de precios del combo. Mínimo 0.'
                  example: '100'
                  nullable: false
                idListaPrecioDetalle:
                  type: string
                  description: 'optional ID del detalle de la lista de precios en base64.'
                  example: MQ==
                  nullable: true
              required:
                - idCombo
                - productos
                - listaPrecioDetalleImporte
  /api/v1/promociones/combo/crear-paso-3:
    post:
      summary: 'Crear combo Paso 3 (Revisión final)'
      operationId: crearComboPaso3RevisinFinal
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  code: 200
                  data:
                    combo: {  }
                    productos: []
                    listaPrecioDetalle: {  }
                properties:
                  code:
                    type: integer
                    example: 200
                  data:
                    type: object
                    properties:
                      combo:
                        type: object
                        properties: {  }
                      productos:
                        type: array
                        example: []
                      listaPrecioDetalle:
                        type: object
                        properties: {  }
      tags:
        - Promociones
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idCombo:
                  type: string
                  description: 'ID del combo en base64.'
                  example: MQ==
                  nullable: false
              required:
                - idCombo
  /api/v1/promociones/combo/guardar-combo-final:
    post:
      summary: 'Guardar combo definitivo'
      operationId: guardarComboDefinitivo
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  code: 200
                  message: 'Combo guardado y activado correctamente'
                  data:
                    combo: {  }
                properties:
                  code:
                    type: integer
                    example: 200
                  message:
                    type: string
                    example: 'Combo guardado y activado correctamente'
                  data:
                    type: object
                    properties:
                      combo:
                        type: object
                        properties: {  }
      tags:
        - Promociones
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idCombo:
                  type: string
                  description: 'ID del combo en base64.'
                  example: MQ==
                  nullable: false
              required:
                - idCombo
  '/api/v1/promociones/combo/cancelar/{id}':
    post:
      summary: 'Cancelar combo'
      operationId: cancelarCombo
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  '/api/v1/promociones/combo/eliminar/{id}':
    post:
      summary: 'Eliminar combo'
      operationId: eliminarCombo
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  '/api/v1/promociones/combo/activar/{id}':
    post:
      summary: 'Activar combo'
      operationId: activarCombo
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/promociones/combo-producto/lista:
    post:
      summary: 'Lista de productos'
      operationId: listaDeProductos
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idCombo:
                  type: string
                  description: 'optional ID del combo base 64.'
                  example: MQ==
                  nullable: false
  /api/v1/promociones/combo-producto/accion:
    post:
      summary: 'Agregar producto al combo'
      operationId: agregarProductoAlCombo
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idProducto:
                  type: string
                  description: 'ID del producto (base64).'
                  example: MQ==
                  nullable: false
                idCombo:
                  type: string
                  description: 'ID del combo (base64).'
                  example: MQ==
                  nullable: false
                cantidad:
                  type: integer
                  description: 'Cantidad del producto en el combo.'
                  example: 2
                  nullable: true
              required:
                - idProducto
                - idCombo
                - cantidad
  '/api/v1/promociones/combo-producto/eliminar/{id}':
    delete:
      summary: 'Eliminar producto del combo'
      operationId: eliminarProductoDelCombo
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/promociones/promocion/lista-mixto:
    post:
      summary: 'Lista de promocion mixta'
      operationId: listaDePromocionMixta
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idProducto:
                  type: string
                  description: 'optional ID del producto.'
                  example: 'Producto MQ=='
                  nullable: false
                idProductoGratis:
                  type: string
                  description: 'optional ID del producto.'
                  example: 'Producto MQ=='
                  nullable: false
                promocionFechaInicio:
                  type: string
                  description: 'optional Fecha de inicio de la promoción.'
                  example: '2023-01-01'
                  nullable: false
                promocionFechaFin:
                  type: string
                  description: 'optional Fecha de fin de la promoción.'
                  example: '2023-01-31'
                  nullable: false
                searchQuery:
                  type: string
                  description: 'Búsqueda general en varios campos.'
                  example: Juan
                  nullable: false
  /api/v1/promociones/promocion/lista-gratis:
    post:
      summary: 'Lista de promocion gratis'
      operationId: listaDePromocionGratis
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idProducto:
                  type: string
                  description: 'optional ID del producto.'
                  example: 'Producto MQ=='
                  nullable: false
                promocionFechaInicio:
                  type: string
                  description: 'optional Fecha de inicio de la promoción.'
                  example: '2023-01-01'
                  nullable: false
                promocionFechaFin:
                  type: string
                  description: 'optional Fecha de fin de la promoción.'
                  example: '2023-01-31'
                  nullable: false
                searchQuery:
                  type: string
                  description: 'Búsqueda general en varios campos.'
                  example: Juan
                  nullable: false
  /api/v1/promociones/promocion/lista-metodo-pago:
    post:
      summary: 'Lista de promocion metodo de pago'
      operationId: listaDePromocionMetodoDePago
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idProducto:
                  type: string
                  description: 'optional ID del producto.'
                  example: 'Producto MQ=='
                  nullable: false
                detallePromocionPorcentaje:
                  type: decimal
                  description: 'optional Porcentaje del detalle de la promoción.'
                  example: '10.5'
                  nullable: false
                promocionFechaInicio:
                  type: string
                  description: 'optional Fecha de inicio de la promoción.'
                  example: '2023-01-01'
                  nullable: false
                promocionFechaFin:
                  type: string
                  description: 'optional Fecha de fin de la promoción.'
                  example: '2023-01-31'
                  nullable: false
                searchQuery:
                  type: string
                  description: 'Búsqueda general en varios campos.'
                  example: Juan
                  nullable: false
  '/api/v1/promociones/promocion/info-promocion/{id}':
    get:
      summary: 'Información detallada de un combo'
      operationId: informacinDetalladaDeUnCombo
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - Promociones
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64 o id.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/promociones/promocion/accion:
    post:
      summary: 'Crear o editar promoción'
      operationId: crearOEditarPromocin
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idPromocion:
                  type: string
                  description: 'optional ID de la promoción en base64 (para editar). Debe existir en la tabla pro_promocion.'
                  example: MQ==
                  nullable: true
                idProducto:
                  type: string
                  description: 'optional ID del producto en base64. Debe existir en la tabla inv_producto.'
                  example: MQ==
                  nullable: true
                idProductoGratis:
                  type: string
                  description: 'optional ID del producto gratis en base64. Debe existir en la tabla inv_producto.'
                  example: MQ==
                  nullable: true
                idPromocionProducto:
                  type: string
                  description: 'optional ID del producto de la promoción para editar en base64. Debe existir en la tabla pro_promocionproducto.'
                  example: MQ==
                  nullable: true
                idDetallePromocion:
                  type: string
                  description: 'optional ID del detalle de la promoción para editar en base64. Debe existir en la tabla pro_detallepromocion.'
                  example: MQ==
                  nullable: true
                promocionAlias:
                  type: string
                  description: 'Alias de la promoción. Requerido. Máximo 75 caracteres. Debe ser único.'
                  example: 'Promo Enero'
                  nullable: false
                promocionFechaInicio:
                  type: date
                  description: 'optional Fecha de inicio de la promoción. Formato YYYY-MM-DD.'
                  example: '2023-01-01'
                  nullable: true
                promocionFechaFin:
                  type: date
                  description: 'optional Fecha de fin de la promoción. Formato YYYY-MM-DD. Debe ser posterior a promocionFechaInicio.'
                  example: '2023-01-31'
                  nullable: true
                promocionTipo:
                  type: string
                  description: 'Tipo de promoción. Requerido. Valores permitidos: "Condición de Pago", "Método de Pago", "Mixto".'
                  example: 'Método de Pago'
                  nullable: false
                promocionDescripcion:
                  type: string
                  description: 'optional Descripción de la promoción. Máximo 250 caracteres.'
                  example: 'Descuento especial por año nuevo'
                  nullable: true
                detallePromocionMetodoPago:
                  type: string
                  description: 'optional Método de pago. Valores permitidos: "Transferencia", "Efectivo", "Tarjeta de Crédito", "Tarjeta de Débito".'
                  example: 'Tarjeta de Crédito'
                  nullable: true
                detallePromocionCantidadBonificada:
                  type: integer
                  description: 'optional Cantidad bonificada. Debe ser un número entero. Mínimo 1.'
                  example: 2
                  nullable: true
                detallePromocionMonto:
                  type: decimal
                  description: 'optional Monto del descuento. Debe ser un número decimal con 2 decimales. Mínimo 0.'
                  example: '50.75'
                  nullable: true
                detallePromocionPorcentaje:
                  type: decimal
                  description: 'optional Porcentaje del descuento. Debe ser un número decimal con 2 decimales. Mínimo 0, máximo 100.'
                  example: '10.5'
                  nullable: true
                detallePromocionCantidadRequerida:
                  type: integer
                  description: 'optional Cantidad requerida para aplicar la promoción. Debe ser un número entero. Mínimo 1.'
                  example: 5
                  nullable: true
              required:
                - promocionAlias
                - promocionTipo
  '/api/v1/promociones/promocion/eliminar/{id}':
    delete:
      summary: 'Eliminar promocion'
      operationId: eliminarPromocion
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  '/api/v1/promociones/promocion/activar/{id}':
    post:
      summary: 'Activar promocion'
      operationId: activarPromocion
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Promociones
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/punto-venta/categoria-cliente/lista:
    post:
      summary: 'Lista de categorías de clientes'
      operationId: listaDeCategorasDeClientes
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idCategoriaCliente:
                  type: integer
                  description: 'optional ID de la categoría del cliente.'
                  example: 2
                  nullable: false
                categoriaClienteAlias:
                  type: string
                  description: 'optional Alias de la categoría del cliente.'
                  example: VIP
                  nullable: false
                categoriaClienteObservaciones:
                  type: string
                  description: 'optional Observaciones de la categoría del cliente.'
                  example: 'Cliente importante'
                  nullable: false
                categoriaClienteEstado:
                  type: string
                  description: 'optional Estado de la categoría del cliente.'
                  example: Activo
                  nullable: false
                searchQuery:
                  type: string
                  description: 'Búsqueda general en varios campos.'
                  example: Juan
                  nullable: false
  '/api/v1/punto-venta/categoria-cliente/info-categoria-cliente/{id}':
    get:
      summary: 'Información de categoría cliente'
      operationId: informacinDeCategoraCliente
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/punto-venta/categoria-cliente/accion:
    post:
      summary: 'Agregar categoría cliente'
      operationId: agregarCategoraCliente
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                categoriaClienteAlias:
                  type: string
                  description: 'Alias de la categoría del cliente. Máximo 70 caracteres, debe ser único.'
                  example: VIP
                  nullable: false
                categoriaClienteObservaciones:
                  type: string
                  description: 'optional Observaciones de la categoría del cliente. Máximo 200 caracteres.'
                  example: 'Cliente importante'
                  nullable: true
              required:
                - categoriaClienteAlias
  /api/v1/punto-venta/categoria-cliente/editar:
    post:
      summary: 'Editar categoría cliente'
      operationId: editarCategoraCliente
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idCategoriaCliente:
                  type: string
                  description: 'ID de la categoría del cliente (codificado en base64, debe existir en ptv_categoriacliente).'
                  example: MQ==
                  nullable: false
                categoriaClienteAlias:
                  type: string
                  description: 'Alias de la categoría del cliente. Máximo 70 caracteres, debe ser único (excepto el registro actual).'
                  example: VIP
                  nullable: false
                categoriaClienteObservaciones:
                  type: string
                  description: 'optional Observaciones de la categoría del cliente. Máximo 200 caracteres.'
                  example: 'Cliente importante'
                  nullable: true
              required:
                - idCategoriaCliente
                - categoriaClienteAlias
  '/api/v1/punto-venta/categoria-cliente/eliminar/{id}':
    delete:
      summary: 'Eliminar categoría cliente'
      operationId: eliminarCategoraCliente
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  '/api/v1/punto-venta/categoria-cliente/activar/{id}':
    post:
      summary: 'Activar categoría cliente'
      operationId: activarCategoraCliente
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/punto-venta/cliente/lista:
    post:
      summary: 'Lista de clientes'
      operationId: listaDeClientes
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idCliente:
                  type: integer
                  description: 'optional ID del cliente.'
                  example: 1
                  nullable: false
                idCategoriaCliente:
                  type: integer
                  description: 'optional ID de la categoría del cliente.'
                  example: 2
                  nullable: false
                idListaPrecio:
                  type: integer
                  description: 'optional ID de la lista de precios del cliente.'
                  example: 3
                  nullable: false
                clienteNombre:
                  type: string
                  description: 'optional Nombre del cliente.'
                  example: 'Juan Pérez'
                  nullable: false
                clienteFolio:
                  type: string
                  description: 'optional Folio del cliente.'
                  example: C-1001
                  nullable: false
                clienteEmail:
                  type: string
                  description: 'optional Email del cliente.'
                  example: juan@example.com
                  nullable: false
                clienteTelefono:
                  type: string
                  description: 'optional Teléfono del cliente.'
                  example: 555-1234
                  nullable: false
                clienteEstado:
                  type: string
                  description: 'optional Estado del cliente.'
                  example: Activo
                  nullable: false
                searchQuery:
                  type: string
                  description: 'Búsqueda general en varios campos.'
                  example: Juan
                  nullable: false
  /api/v1/punto-venta/cliente/datos-para-formulario:
    post:
      summary: 'Datos para formulario de cliente'
      operationId: datosParaFormularioDeCliente
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
  '/api/v1/punto-venta/cliente/info-cliente/{id}':
    get:
      summary: 'Informacion de cliente'
      operationId: informacionDeCliente
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/punto-venta/cliente/accion:
    post:
      summary: 'Agregar cliente'
      operationId: agregarCliente
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idCategoriaCliente:
                  type: string
                  description: 'ID de la categoría del cliente (debe existir en ptv_categoriacliente).'
                  example: MQ==
                  nullable: false
                idListaPrecio:
                  type: string
                  description: 'optional ID de la lista de precios del cliente (debe existir en ptv_listaprecio).'
                  example: MQ==
                  nullable: true
                clienteNombre:
                  type: string
                  description: 'Nombre del cliente. Máximo 75 caracteres, debe ser único y no debe de permitir numeros.'
                  example: 'Juan Pérez'
                  nullable: false
                clienteFolio:
                  type: string
                  description: ''
                  example: null
                  nullable: false
                clienteEmail:
                  type: string
                  description: 'optional Email del cliente. Debe ser un email válido, máximo 100 caracteres.'
                  example: juan@example.com
                  nullable: true
                clienteTelefono:
                  type: string
                  description: 'Teléfono del cliente. Máximo 25 caracteres y no debe de permitir letras.'
                  example: 555-1234
                  nullable: false
                clienteEstado:
                  type: string
                  description: 'optional Estado del cliente. Debe ser "Activo" o "Inactivo".'
                  example: Activo
                  nullable: true
              required:
                - idCategoriaCliente
                - clienteNombre
                - clienteTelefono
  /api/v1/punto-venta/cliente/editar:
    post:
      summary: 'Editar cliente'
      operationId: editarCliente
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idCliente:
                  type: string
                  description: 'ID del cliente (codificado en base64, debe existir en ptv_cliente).'
                  example: MQ==
                  nullable: false
                idCategoriaCliente:
                  type: string
                  description: 'ID de la categoría del cliente (debe existir en ptv_categoriacliente).'
                  example: MQ==
                  nullable: false
                clienteNombre:
                  type: string
                  description: 'Nombre del cliente. Máximo 75 caracteres, debe ser único (excepto el registro actual).'
                  example: 'Juan Pérez'
                  nullable: false
                clienteEmail:
                  type: string
                  description: 'optional Email del cliente. Debe ser un email válido, máximo 100 caracteres.'
                  example: juan@example.com
                  nullable: true
                clienteTelefono:
                  type: string
                  description: 'Teléfono del cliente. Máximo 25 caracteres.'
                  example: 555-1234
                  nullable: false
                idListaPrecio:
                  type: string
                  description: 'optional ID de la lista de precios del cliente (debe existir en ptv_listaprecio).'
                  example: MQ==
                  nullable: false
                clienteEstado:
                  type: string
                  description: 'optional Estado del cliente. Debe ser "Activo" o "Inactivo".'
                  example: Activo
                  nullable: false
              required:
                - idCliente
                - idCategoriaCliente
                - clienteNombre
                - clienteTelefono
  '/api/v1/punto-venta/cliente/eliminar/{id}':
    post:
      summary: 'Eliminar cliente'
      operationId: eliminarCliente
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  '/api/v1/punto-venta/cliente/activar/{id}':
    post:
      summary: 'Activar cliente'
      operationId: activarCliente
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'Optional parameter. en base64.'
        required: true
        schema:
          type: string
        examples:
          omitted:
            summary: 'When the value is omitted'
            value: ''
          present:
            summary: 'When the value is present'
            value: MQ==
  /api/v1/punto-venta/cliente/exportar-pdf:
    post:
      summary: 'Exportar PDF clientes'
      operationId: exportarPDFClientes
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                searchQuery:
                  type: string
                  description: 'nullable El término de búsqueda.'
                  example: juan
                  nullable: false
                clienteAlias:
                  type: string
                  description: 'nullable El alias del cliente.'
                  example: 'Cliente 1'
                  nullable: false
                clienteTelefono:
                  type: string
                  description: 'Teléfono del cliente.'
                  example: 555-1234
                  nullable: false
                clienteEmail:
                  type: string
                  description: 'Email del cliente.'
                  example: juan@example.com
                  nullable: false
                clienteEstado:
                  type: string
                  description: 'nullable El estado del cliente.'
                  example: Activo
                  nullable: false
              required:
                - clienteTelefono
                - clienteEmail
  /api/v1/punto-venta/cliente/consultar-estado-exporta-pdf:
    get:
      summary: 'Consultar estado de exportación PDF'
      operationId: consultarEstadoDeExportacinPDF
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - 'Punto de Venta'
  /api/v1/punto-venta/cliente/exportar-excel:
    post:
      summary: 'Exportar EXCEL clientes'
      operationId: exportarEXCELClientes
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                searchQuery:
                  type: string
                  description: 'nullable El término de búsqueda.'
                  example: juan
                  nullable: false
                clienteAlias:
                  type: string
                  description: 'nullable El alias del cliente.'
                  example: 'Cliente 1'
                  nullable: false
                clienteTelefono:
                  type: string
                  description: 'Teléfono del cliente.'
                  example: 555-1234
                  nullable: false
                clienteEmail:
                  type: string
                  description: 'Email del cliente.'
                  example: juan@example.com
                  nullable: false
                clienteEstado:
                  type: string
                  description: 'nullable El estado del cliente.'
                  example: Activo
                  nullable: false
              required:
                - clienteTelefono
                - clienteEmail
  /api/v1/punto-venta/cliente/subir-excel:
    post:
      summary: 'Subir EXCEL clientes'
      operationId: subirEXCELClientes
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                archivoExcel:
                  type: string
                  format: binary
                  description: 'Archivo Excel con los clientes a importar.'
                  nullable: false
              required:
                - archivoExcel
  /api/v1/punto-venta/cliente/validar-duplicados:
    post:
      summary: 'Validar duplicados clientes'
      operationId: validarDuplicadosClientes
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                clientesSeleccionados:
                  type: array
                  description: 'Array de clientes seleccionados.'
                  example: null
                  items:
                    type: string
              required:
                - clientesSeleccionados
  /api/v1/punto-venta/cliente/resumen-clientes:
    post:
      summary: 'Resumen final antes de importar'
      operationId: resumenFinalAntesDeImportar
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                clientesValidos:
                  type: array
                  description: 'Array de clientes válidos.'
                  example:
                    -
                      clienteNombre: 'Pedro López'
                      idCategoriaCliente: 1
                      idListaPrecio: 1
                      clienteEmail: pedro@example.com
                      clienteTelefono: '7461200656'
                  items:
                    type: string
              required:
                - clientesValidos
  /api/v1/punto-venta/cliente/importar-confirmados:
    post:
      summary: 'Importar clientes confirmados'
      operationId: importarClientesConfirmados
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                clientesConfirmados:
                  type: array
                  description: 'Array de clientes confirmados para importar.'
                  example:
                    -
                      clienteNombre: 'Pedro López'
                      clienteEmail: pedro@example.com
                  items:
                    type: string
              required:
                - clientesConfirmados
  /api/v1/punto-venta/cliente/asociar-lista-precio:
    post:
      summary: 'Asociar lista de precios a cliente'
      operationId: asociarListaDePreciosACliente
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idListaPrecio:
                  type: string
                  description: 'idListaPrecio (base64).'
                  example: MQ==
                  nullable: false
                idCliente:
                  type: string
                  description: 'idCliente (base64).'
                  example: MQ==
                  nullable: false
              required:
                - idListaPrecio
                - idCliente
  /api/v1/punto-venta/cliente/descargar-plantilla:
    get:
      summary: 'Descargar plantilla de Excel para importar clientes'
      operationId: descargarPlantillaDeExcelParaImportarClientes
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - 'Punto de Venta'
  /api/v1/punto-venta/lista-precio/consultar-listas-precio:
    post:
      summary: 'Consulta Lista de precios (para selects, sin paginar)'
      operationId: consultaListaDePreciosparaSelectsSinPaginar
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                listaPrecioAlias:
                  type: string
                  description: 'optional Alias.'
                  example: 'Lista 1'
                  nullable: false
                listaPrecioDescripcion:
                  type: string
                  description: 'optional Descripción.'
                  example: 'Descripción de la lista 1'
                  nullable: false
                listaPrecioEstado:
                  type: string
                  description: "optional Estado ('Activo'|'Inactivo')."
                  example: Activo
                  nullable: false
                listaPrecioSwitch:
                  type: string
                  description: "optional Switch ('Prendida'|'Apagado')."
                  example: Prendida
                  nullable: false
  /api/v1/punto-venta/lista-precio/lista:
    post:
      summary: 'Lista precio'
      operationId: listaPrecio
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                searchQuery:
                  type: string
                  description: 'optional Búsqueda general.'
                  example: consequatur
                  nullable: false
                sort_field:
                  type: string
                  description: 'optional Campo de orden.'
                  example: idListaPrecio
                  nullable: false
                sort_direction:
                  type: string
                  description: "optional Dirección ('asc'|'desc')."
                  example: asc
                  nullable: false
                perPage:
                  type: integer
                  description: 'optional Elementos por página.'
                  example: 10
                  nullable: false
  /api/v1/punto-venta/lista-precio/crear:
    post:
      summary: 'Crear lista de precio'
      operationId: crearListaDePrecio
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idListaPrecio:
                  type: string
                  description: ''
                  example: null
                  nullable: true
                listaPrecioAlias:
                  type: string
                  description: Alias.
                  example: 'Lista 1'
                  nullable: false
                listaPrecioDescripcion:
                  type: string
                  description: 'optional Descripción.'
                  example: 'Descripción navideña'
                  nullable: true
                listaPrecioEstado:
                  type: string
                  description: ''
                  example: Inactivo
                  nullable: true
                  enum:
                    - Activo
                    - Inactivo
                listaPrecioSwitch:
                  type: string
                  description: ''
                  example: Apagado
                  nullable: true
                  enum:
                    - Prendida
                    - Apagado
              required:
                - listaPrecioAlias
  /api/v1/punto-venta/lista-precio/editar:
    post:
      summary: 'Editar lista de precio'
      operationId: editarListaDePrecio
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idListaPrecio:
                  type: string
                  description: 'ID en base64.'
                  example: MQ==
                  nullable: true
                listaPrecioAlias:
                  type: string
                  description: optional
                  example: 'Lista Black Friday'
                  nullable: false
                listaPrecioDescripcion:
                  type: string
                  description: optional
                  example: Actualizada
                  nullable: true
                listaPrecioEstado:
                  type: string
                  description: "optional ('Activo'|'Inactivo')"
                  example: Activo
                  nullable: true
                listaPrecioSwitch:
                  type: string
                  description: "optional ('Prendida'|'Apagado')"
                  example: Apagado
                  nullable: true
              required:
                - idListaPrecio
  '/api/v1/punto-venta/lista-precio/eliminar/{id}':
    delete:
      summary: 'Inactivar (eliminar lógico) lista de precio'
      operationId: inactivareliminarLgicoListaDePrecio
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/punto-venta/lista-precio/activar/{id}':
    post:
      summary: 'Activar lista de precio'
      operationId: activarListaDePrecio
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/punto-venta/lista-precio/alternar/{id}':
    post:
      summary: 'Alternar switch (Prendida/Apagado)'
      operationId: alternarSwitchPrendidaApagado
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/punto-venta/lista-precio/duplicar/{id}':
    post:
      summary: 'Duplicar lista de precio'
      operationId: duplicarListaDePrecio
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/punto-venta/lista-precio/form-data:
    get:
      summary: 'Datos para formulario de Lista de precio (catálogos)'
      operationId: datosParaFormularioDeListaDePreciocatlogos
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - 'Punto de Venta'
  '/api/v1/punto-venta/lista-precio/info/{id}':
    get:
      summary: 'Información puntual de una lista de precio'
      operationId: informacinPuntualDeUnaListaDePrecio
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/punto-venta/lista-precio/detalle/{id}':
    get:
      summary: 'Datos para detalle (prefill de edición) de una lista de precio'
      operationId: datosParaDetalleprefillDeEdicinDeUnaListaDePrecio
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/punto-venta/cotizacion/lista:
    post:
      summary: 'Lista de cotizaciones'
      operationId: listaDeCotizaciones
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idCliente:
                  type: integer
                  description: 'optional ID del cliente.'
                  example: 12
                  nullable: false
                idUsuario:
                  type: integer
                  description: 'optional ID del usuario.'
                  example: 7
                  nullable: false
                idSucursal:
                  type: integer
                  description: 'optional ID de la sucursal.'
                  example: 3
                  nullable: false
                cotizacionEstado:
                  type: string
                  description: 'optional Vigente|Vencida|Venta.'
                  example: Vigente
                  nullable: false
                fecha_desde:
                  type: date
                  description: 'optional Fecha inicial (Y-m-d).'
                  example: '2025-01-01'
                  nullable: false
                fecha_hasta:
                  type: date
                  description: 'optional Fecha final (Y-m-d).'
                  example: '2025-12-31'
                  nullable: false
                searchQuery:
                  type: string
                  description: 'optional Búsqueda (No/Observaciones).'
                  example: COT-2025-001
                  nullable: false
                sort_field:
                  type: string
                  description: 'optional Campo de orden.'
                  example: cotizacionFecha
                  nullable: false
                sort_direction:
                  type: string
                  description: 'optional asc|desc.'
                  example: desc
                  nullable: false
                perPage:
                  type: integer
                  description: 'optional Elementos por página.'
                  example: 10
                  nullable: false
  /api/v1/punto-venta/cotizacion/crear:
    post:
      summary: 'Crear cotización'
      operationId: crearCotizacin
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idCotizacion:
                  type: string
                  description: ''
                  example: null
                  nullable: true
                idCliente:
                  type: integer
                  description: 'nullable ID del cliente.'
                  example: 12
                  nullable: true
                idUsuario:
                  type: integer
                  description: 'ID usuario vendedor.'
                  example: 7
                  nullable: false
                idSucursal:
                  type: integer
                  description: 'ID sucursal.'
                  example: 3
                  nullable: false
                cotizacionFecha:
                  type: datetime
                  description: 'Fecha hora (Y-m-d H:i:s).'
                  example: '2025-09-22 13:45:00'
                  nullable: false
                cotizacionFechaVencimiento:
                  type: date
                  description: 'nullable Vencimiento (Y-m-d).'
                  example: '2025-10-01'
                  nullable: true
                cotizacionObservaciones:
                  type: string
                  description: 'nullable Observaciones.'
                  example: consequatur
                  nullable: true
                cotizacionSubtotal:
                  type: number
                  description: 'nullable Subtotal (10,2).'
                  example: 1000.0
                  nullable: true
                cotizacionTotal:
                  type: number
                  description: 'nullable Total (10,2).'
                  example: 1160.0
                  nullable: true
                cotizacionEstado:
                  type: string
                  description: Vigente|Vencida|Venta.
                  example: Vigente
                  nullable: false
                cotizacionNo:
                  type: string
                  description: 'No. único.'
                  example: COT-0001
                  nullable: false
              required:
                - idUsuario
                - idSucursal
                - cotizacionFecha
                - cotizacionEstado
                - cotizacionNo
  /api/v1/punto-venta/cotizacion/editar:
    post:
      summary: 'Editar cotización'
      operationId: editarCotizacin
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idCotizacion:
                  type: string
                  description: 'ID (base64 o id).'
                  example: MQ==
                  nullable: true
                idCliente:
                  type: integer
                  description: 'nullable ID del cliente.'
                  example: 12
                  nullable: true
                idUsuario:
                  type: integer
                  description: 'ID usuario vendedor.'
                  example: 7
                  nullable: false
                idSucursal:
                  type: integer
                  description: 'ID sucursal.'
                  example: 3
                  nullable: false
                cotizacionFecha:
                  type: datetime
                  description: 'Fecha hora (Y-m-d H:i:s).'
                  example: '2025-09-22 13:45:00'
                  nullable: false
                cotizacionFechaVencimiento:
                  type: date
                  description: 'nullable Vencimiento (Y-m-d).'
                  example: '2025-10-01'
                  nullable: true
                cotizacionObservaciones:
                  type: string
                  description: 'nullable Observaciones.'
                  example: consequatur
                  nullable: true
                cotizacionSubtotal:
                  type: number
                  description: 'nullable Subtotal (10,2).'
                  example: 1000.0
                  nullable: true
                cotizacionTotal:
                  type: number
                  description: 'nullable Total (10,2).'
                  example: 1160.0
                  nullable: true
                cotizacionEstado:
                  type: string
                  description: Vigente|Vencida|Venta.
                  example: Vigente
                  nullable: false
              required:
                - idCotizacion
                - idUsuario
                - idSucursal
                - cotizacionFecha
                - cotizacionEstado
  '/api/v1/punto-venta/cotizacion/reactivar/{id}':
    post:
      summary: 'Reactivar cotización'
      operationId: reactivarCotizacin
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idCotizacion:
                  type: string
                  description: 'ID (base64 o id).'
                  example: MQ==
                  nullable: false
              required:
                - idCotizacion
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the reactivar.'
        example: consequatur
        required: true
        schema:
          type: string
  '/api/v1/punto-venta/cotizacion/eliminar/{id}':
    delete:
      summary: 'Eliminar cotización'
      operationId: eliminarCotizacin
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'ID en base64.'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/punto-venta/cotizacion/exportar-pdf:
    post:
      summary: 'Exportar PDF'
      operationId: exportarPDF
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
  /api/v1/punto-venta/cotizacion/exportar-excel:
    post:
      summary: 'Exportar EXCEL'
      operationId: exportarEXCEL
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
  '/api/v1/punto-venta/cotizacion/imprimir/{id}':
    get:
      summary: ''
      operationId: getApiV1PuntoVentaCotizacionImprimirId
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the imprimir.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/v1/punto-venta/cotizacion/form-data:
    get:
      summary: 'Datos para formulario (catálogos)'
      operationId: datosParaFormulariocatlogos
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - 'Punto de Venta'
  '/api/v1/punto-venta/cotizacion/info/{id}':
    get:
      summary: 'Información puntual de una cotización'
      operationId: informacinPuntualDeUnaCotizacin
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'ID (base64 o id).'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/punto-venta/cotizacion/detalle/{id}':
    get:
      summary: 'Datos para detalle (prefill de edición)'
      operationId: datosParaDetalleprefillDeEdicin
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'ID (base64 o id).'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/punto-venta/lista-precio-detalle/lista:
    post:
      summary: 'Lista de productos asociados a una lista de precios'
      operationId: listaDeProductosAsociadosAUnaListaDePrecios
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idListaPrecio:
                  type: string
                  description: 'ID de la lista (base64).'
                  example: MQ==
                  nullable: false
                idProducto:
                  type: string
                  description: 'optional ID del producto (base64).'
                  example: MQ==
                  nullable: false
                searchQuery:
                  type: string
                  description: 'optional Búsqueda por alias/código del producto.'
                  example: johnnie
                  nullable: false
                listaPrecioDetalleEstado:
                  type: string
                  description: "optional 'A'|'I'."
                  example: A
                  nullable: false
                sort_field:
                  type: string
                  description: 'optional Campo de orden.'
                  example: idListaPrecioDetalle
                  nullable: false
                sort_direction:
                  type: string
                  description: "optional 'asc'|'desc'."
                  example: asc
                  nullable: false
                perPage:
                  type: integer
                  description: 'optional Elementos por página.'
                  example: 10
                  nullable: false
              required:
                - idListaPrecio
  /api/v1/punto-venta/lista-precio-detalle/accion:
    post:
      summary: 'Agregar un producto a la lista de precios (una fila)'
      operationId: agregarUnProductoALaListaDePreciosunaFila
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idListaPrecioDetalle:
                  type: string
                  description: ''
                  example: null
                  nullable: true
                idListaPrecio:
                  type: string
                  description: 'ID lista (base64).'
                  example: MQ==
                  nullable: false
                idProducto:
                  type: string
                  description: 'ID producto (base64).'
                  example: MQ==
                  nullable: false
                idPromocion:
                  type: integer
                  description: 'The <code>idPromocion</code> of an existing record in the pro_promocion table.'
                  example: 17
                  nullable: true
                idCombo:
                  type: integer
                  description: 'The <code>idCombo</code> of an existing record in the pro_combo table.'
                  example: 17
                  nullable: true
                listaPrecioDetalleImporte:
                  type: number
                  description: 'optional Precio detalle.'
                  example: 40.0
                  nullable: true
                listaPrecioDetalleFecha:
                  type: date
                  description: 'optional Fecha de vigencia (YYYY-MM-DD).'
                  example: '2025-12-12'
                  nullable: true
                listaPrecioDetallePorcentaje:
                  type: number
                  description: 'optional Descuento % (0-100).'
                  example: 0.0
                  nullable: true
                listaPrecioDetalleEstado:
                  type: string
                  description: ''
                  example: Inactivo
                  nullable: true
                  enum:
                    - Activo
                    - Inactivo
              required:
                - idListaPrecio
                - idProducto
  /api/v1/punto-venta/lista-precio-detalle/editar:
    post:
      summary: 'Editar una fila de la lista de precios'
      operationId: editarUnaFilaDeLaListaDePrecios
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idListaPrecioDetalle:
                  type: string
                  description: 'ID detalle (base64).'
                  example: MQ==
                  nullable: true
                idListaPrecio:
                  type: integer
                  description: 'The <code>idListaPrecio</code> of an existing record in the ptv_listaprecio table.'
                  example: 17
                  nullable: false
                idProducto:
                  type: integer
                  description: 'The <code>idProducto</code> of an existing record in the inv_producto table.'
                  example: 17
                  nullable: false
                idPromocion:
                  type: integer
                  description: 'The <code>idPromocion</code> of an existing record in the pro_promocion table.'
                  example: 17
                  nullable: true
                idCombo:
                  type: integer
                  description: 'The <code>idCombo</code> of an existing record in the pro_combo table.'
                  example: 17
                  nullable: true
                listaPrecioDetalleImporte:
                  type: number
                  description: 'optional Precio detalle.'
                  example: 41.0
                  nullable: true
                listaPrecioDetalleFecha:
                  type: date
                  description: 'optional Fecha.'
                  example: '2025-12-12'
                  nullable: true
                listaPrecioDetallePorcentaje:
                  type: number
                  description: 'optional % descuento.'
                  example: 5.0
                  nullable: true
                listaPrecioDetalleEstado:
                  type: string
                  description: "optional 'A'|'I'."
                  example: A
                  nullable: true
              required:
                - idListaPrecioDetalle
                - idListaPrecio
                - idProducto
  /api/v1/punto-venta/lista-precio-detalle/asociar:
    post:
      summary: "Asociar productos MASIVO (upsert por idListaPrecio + idProducto)\nRecibe varios items con idProducto y precios."
      operationId: asociarProductosMASIVOupsertPorIdListaPrecio+IdProductoRecibeVariosItemsConIdProductoYPrecios
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idListaPrecio:
                  type: string
                  description: 'ID lista (base64).'
                  example: MQ==
                  nullable: false
                items:
                  type: array
                  description: 'Arreglo de productos a asociar.'
                  example:
                    - consequatur
                  items:
                    type: string
              required:
                - idListaPrecio
                - items
  '/api/v1/punto-venta/lista-precio-detalle/eliminar/{id}':
    delete:
      summary: 'Inactivar fila'
      operationId: inactivarFila
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'ID detalle (base64).'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/punto-venta/lista-precio-detalle/activar/{id}':
    post:
      summary: 'Activar fila'
      operationId: activarFila
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'ID detalle (base64).'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/punto-venta/lista-precio-detalle/descuento-global:
    post:
      summary: 'Aplicar descuento global a una lista'
      operationId: aplicarDescuentoGlobalAUnaLista
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                idListaPrecio:
                  type: string
                  description: 'ID lista (base64).'
                  example: MQ==
                  nullable: false
                porcentaje:
                  type: number
                  description: 'Porcentaje 0–100.'
                  example: 10.0
                  nullable: false
              required:
                - idListaPrecio
                - porcentaje
  /api/v1/punto-venta/lista-precio-detalle/form-data:
    get:
      summary: 'Datos para formulario (catálogos, combos y sugerencias)'
      operationId: datosParaFormulariocatlogosCombosYSugerencias
      description: ''
      parameters:
        -
          in: query
          name: idListaPrecio
          description: 'optional ID lista (base64). Si viene, se excluyen productos ya asociados.'
          example: MQ==
          required: false
          schema:
            type: string
            description: 'optional ID lista (base64). Si viene, se excluyen productos ya asociados.'
            example: MQ==
            nullable: false
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - 'Punto de Venta'
  '/api/v1/punto-venta/lista-precio-detalle/info/{id}':
    get:
      summary: 'Información puntual de un detalle de lista (por ID)'
      operationId: informacinPuntualDeUnDetalleDeListaporID
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'ID detalle (base64).'
        example: MQ==
        required: true
        schema:
          type: string
  '/api/v1/punto-venta/lista-precio-detalle/detalle/{id}':
    get:
      summary: 'Datos para detalle (prefill de edición)'
      operationId: datosParaDetalleprefillDeEdicin
      description: ''
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  success: false
                  message: 'Token inválido o no autenticado.'
                  errors:
                    token:
                      - 'No tienes acceso a este recurso.'
                properties:
                  success:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: 'Token inválido o no autenticado.'
                  errors:
                    type: object
                    properties:
                      token:
                        type: array
                        example:
                          - 'No tienes acceso a este recurso.'
                        items:
                          type: string
      tags:
        - 'Punto de Venta'
    parameters:
      -
        in: path
        name: id
        description: 'ID detalle (base64).'
        example: MQ==
        required: true
        schema:
          type: string
  /api/v1/punto-venta/lista-precio-detalle/lista-diferenciada:
    post:
      summary: 'Lista de precios diferenciados'
      operationId: listaDePreciosDiferenciados
      description: ''
      parameters: []
      responses: {  }
      tags:
        - 'Punto de Venta'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                idListaPrecio:
                  type: array
                  description: 'optional IDs de las listas (base64).'
                  example:
                    - MQ==
                    - Mg==
                    - Mw==
                  items:
                    type: string
                idProducto:
                  type: string
                  description: 'optional ID del producto (base64).'
                  example: MQ==
                  nullable: false
                idAlmacen:
                  type: integer
                  description: 'optional Filtra inventario por almacén.'
                  example: 5
                  nullable: false
                con_stock:
                  type: boolean
                  description: 'optional Solo productos con stock > 0.'
                  example: true
                  nullable: false
                solo_activo_inventario:
                  type: boolean
                  description: 'optional Solo inventario "Activo". Default: true'
                  example: false
                  nullable: false
                searchQuery:
                  type: string
                  description: 'optional Búsqueda por alias/código del producto.'
                  example: johnnie
                  nullable: false
                listaPrecioDetalleEstado:
                  type: string
                  description: "optional 'A'|'I'."
                  example: A
                  nullable: false
                sort_field:
                  type: string
                  description: 'optional Campo de orden.'
                  example: idListaPrecioDetalle
                  nullable: false
                sort_direction:
                  type: string
                  description: "optional 'asc'|'desc'."
                  example: asc
                  nullable: false
                perPage:
                  type: integer
                  description: 'optional Elementos por página.'
                  example: 10
                  nullable: false
