openapi: 3.0.3
info:
  title: Integração mPm+
  description: |
    Contrato da **API mPm+ externa** (`/mpm/*`) para sistemas parceiros (ERP).

    Autenticação por headers `empresa_id` + `token` (sem `Authorization: Bearer`).

    Sucesso típico: HTTP 2xx + `status === "success"` + (em criação) `data[0].id`.

    Exemplos usam credenciais fictícias (`TOKEN_FICTICIO`, `empresa_id` 9999).
  version: 1.1.0
servers:
  - url: https://mobtef.conexaoapi.com.br
    description: API mPm+ produção / homologação
tags:
  - name: Grupos
  - name: Unidades
  - name: Produtos
  - name: Clientes
  - name: Rotas
  - name: Finalizadoras
  - name: Planos
  - name: Funcionarios
  - name: Pedidos
paths:
  /mpm/grupos:
    post:
      tags: [Grupos]
      summary: Criar grupo
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GrupoCreate'
            example:
              nome: Bebidas
              integracao: "01"
              path_imagem: " "
              mobile: true
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessWithId'
        '502':
          description: Falha de integração no cliente parceiro
    put:
      tags: [Grupos]
      summary: Atualizar grupo
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
        - name: grupo_id
          in: header
          required: true
          schema: { type: integer }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GrupoUpdate'
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessStatus'
  /mpm/unidades:
    post:
      tags: [Unidades]
      summary: Criar unidade
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UnidadeCreate'
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessWithId'
    put:
      tags: [Unidades]
      summary: Atualizar unidade
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
        - name: unidade_id
          in: header
          required: true
          schema: { type: integer }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UnidadeUpdate'
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessStatus'
  /mpm/produtos:
    get:
      tags: [Produtos]
      summary: Listar / buscar produtos
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessStatus'
    post:
      tags: [Produtos]
      summary: Criar produto
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProdutoCreate'
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessWithId'
    put:
      tags: [Produtos]
      summary: Atualizar produto (sem integracao; com ativo)
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
        - name: produto_id
          in: header
          required: true
          schema: { type: integer }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProdutoUpdate'
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessStatus'
  /mpm/clientes:
    get:
      tags: [Clientes]
      summary: Listar / buscar clientes
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessStatus'
    post:
      tags: [Clientes]
      summary: Criar cliente (documento só no POST)
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClienteCreate'
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessWithId'
    put:
      tags: [Clientes]
      summary: Atualizar cliente (mobile + ativo)
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
        - name: cliente_id
          in: header
          required: true
          schema: { type: integer }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ClienteUpdate'
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessStatus'
  /mpm/clientes/rotas:
    post:
      tags: [Rotas]
      summary: Criar rota
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [nome, integracao]
              properties:
                nome: { type: string }
                integracao: { type: string }
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessWithId'
    put:
      tags: [Rotas]
      summary: Atualizar rota
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
        - name: rota_id
          in: header
          required: true
          schema: { type: integer }
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                nome: { type: string }
                ativo: { type: boolean }
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessStatus'
  /mpm/finalizadoras:
    get:
      tags: [Finalizadoras]
      summary: Listar finalizadoras
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
        - name: atualizacao
          in: header
          required: false
          schema: { type: string, example: '2010-01-01' }
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessStatus'
    put:
      tags: [Finalizadoras]
      summary: Associar código ERP (integracao)
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
        - name: finalizadora_id
          in: header
          required: true
          schema: { type: integer }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [integracao]
              properties:
                integracao: { type: string, description: Código no ERP }
            example:
              integracao: "01"
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessStatus'
  /mpm/finalizadoras/planos:
    get:
      tags: [Planos]
      summary: Listar planos
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessStatus'
    put:
      tags: [Planos]
      summary: Associar código ERP (integracao)
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
        - name: plano_id
          in: header
          required: true
          schema: { type: integer }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [integracao]
              properties:
                integracao: { type: string }
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessStatus'
  /mpm/funcionarios:
    get:
      tags: [Funcionarios]
      summary: Listar funcionários / usuários
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessStatus'
    put:
      tags: [Funcionarios]
      summary: Associar código ERP (integracao)
      description: |
        Header `funcionario_id` = `id` da listagem.
        O parceiro deve gravar localmente em `mpm_integracao` o id usado em `vendedor_id` nos pedidos
        (no padrão observado, pode ser `usuario_id` do registro).
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
        - name: funcionario_id
          in: header
          required: true
          schema: { type: integer }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [integracao]
              properties:
                integracao: { type: string }
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuccessStatus'
  /mpm/pedidos:
    get:
      tags: [Pedidos]
      summary: Consultar pedidos por período
      description: |
        Consulta sob demanda. Webhook não faz parte deste contrato.
        Headers `abertura` e `fechamento` definem o período.
      parameters:
        - $ref: '#/components/parameters/EmpresaId'
        - $ref: '#/components/parameters/Token'
        - $ref: '#/components/parameters/DispositivoId'
        - $ref: '#/components/parameters/DispositivoModel'
        - $ref: '#/components/parameters/DispositivoTipo'
        - $ref: '#/components/parameters/AppVersao'
        - $ref: '#/components/parameters/AppNome'
        - $ref: '#/components/parameters/Plataforma'
        - name: abertura
          in: header
          required: true
          schema: { type: string, example: '2026-07-01 00:00:00' }
        - name: fechamento
          in: header
          required: true
          schema: { type: string, example: '2026-07-29 23:59:59' }
      responses:
        '200':
          description: Sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PedidosResponse'

components:
  parameters:
    EmpresaId:
      name: empresa_id
      in: header
      required: true
      schema: { type: string, example: '9999' }
    Token:
      name: token
      in: header
      required: true
      schema: { type: string, example: TOKEN_FICTICIO }
    DispositivoId:
      name: dispositivo_id
      in: header
      required: true
      schema: { type: string, example: '1' }
    DispositivoModel:
      name: dispositivo_model
      in: header
      required: true
      schema: { type: string, example: '1' }
    DispositivoTipo:
      name: dispositivo_tipo
      in: header
      required: true
      schema: { type: string, example: '1' }
    AppVersao:
      name: app_versao
      in: header
      required: true
      schema: { type: string, example: '1.0.0' }
    AppNome:
      name: app_nome
      in: header
      required: true
      schema: { type: string, example: AppParceiro }
    Plataforma:
      name: plataforma
      in: header
      required: true
      schema: { type: string, example: Android }

  schemas:
    SuccessStatus:
      type: object
      properties:
        status:
          type: string
          example: success
        data:
          type: array
          items: { type: object }

    SuccessWithId:
      type: object
      properties:
        status:
          type: string
          example: success
        data:
          type: array
          items:
            type: object
            properties:
              id: { type: integer, example: 12345 }

    GrupoCreate:
      type: object
      required: [nome, integracao]
      properties:
        nome: { type: string }
        integracao: { type: string }
        path_imagem: { type: string }
        mobile: { type: boolean }

    GrupoUpdate:
      type: object
      properties:
        nome: { type: string }
        path_imagem: { type: string }
        mobile: { type: boolean }
        ativo: { type: boolean }

    UnidadeCreate:
      type: object
      required: [nome, sigla, casas_decimais, integracao]
      properties:
        nome: { type: string }
        sigla: { type: string }
        casas_decimais: { type: integer }
        integracao: { type: string }

    UnidadeUpdate:
      type: object
      properties:
        nome: { type: string }
        sigla: { type: string }
        casas_decimais: { type: integer }
        ativo: { type: boolean }

    ProdutoCreate:
      type: object
      required: [nome, grupo_id, unidade_id, integracao]
      properties:
        nome: { type: string }
        preco: { type: number }
        estoque: { type: number }
        grupo_id: { type: integer }
        unidade_id: { type: integer }
        path_imagem: { type: string }
        cean: { type: string }
        cest: { type: string }
        ncm: { type: string }
        caracteristicas: { type: string }
        orig: { type: integer }
        desc_max: { type: number }
        valor_entrega: { type: number, example: 0 }
        taxa_servico: { type: boolean, example: false }
        controla_estoque: { type: boolean }
        mobile: { type: boolean }
        integracao: { type: string }

    ProdutoUpdate:
      allOf:
        - type: object
          properties:
            nome: { type: string }
            preco: { type: number }
            estoque: { type: number }
            grupo_id: { type: integer }
            unidade_id: { type: integer }
            path_imagem: { type: string }
            cean: { type: string }
            cest: { type: string }
            ncm: { type: string }
            caracteristicas: { type: string }
            orig: { type: integer }
            desc_max: { type: number }
            valor_entrega: { type: number }
            taxa_servico: { type: boolean }
            controla_estoque: { type: boolean }
            mobile: { type: boolean }
            ativo: { type: boolean }
      description: Não inclui integracao

    ClienteCreate:
      type: object
      required: [razao, fantasia, indicador_ie, integracao]
      properties:
        razao: { type: string }
        fantasia: { type: string }
        indicador_ie: { type: integer }
        integracao: { type: string }
        documento: { type: string }
        ie_rg: { type: string }
        email: { type: string }
        telefone: { type: string, description: 'Prefixo 55...' }
        vendedor_id: { type: integer }
        rota_id: { type: integer }
        path_imagem: { type: string }

    ClienteUpdate:
      type: object
      properties:
        razao: { type: string }
        fantasia: { type: string }
        indicador_ie: { type: integer }
        integracao: { type: string }
        ie_rg: { type: string }
        email: { type: string }
        telefone: { type: string }
        vendedor_id: { type: integer }
        rota_id: { type: integer }
        path_imagem: { type: string }
        mobile: { type: boolean }
        ativo: { type: boolean }

    Pedido:
      type: object
      properties:
        id: { type: integer }
        cliente_nome: { type: string }
        cliente_id: { type: integer, nullable: true }
        cliente_documento: { type: string }
        cliente_whatsapp: { type: string }
        vendedor_id: { type: integer, nullable: true }
        emissao: { type: string }
        total: { type: number }
        troco: { type: number }
        status: { type: string, enum: [F, E, A, C] }
        itens:
          type: array
          items:
            type: object
            properties:
              item_id: { type: integer }
              produto_id: { type: integer }
              produto_nome: { type: string }
              quantidade: { type: number }
              unitario: { type: number }
              desconto_item: { type: number }
              desc_prod: { type: number }
              total_item: { type: number }
              sigla: { type: string }
              vendedor_prod: { type: integer, nullable: true }
        finalizadoras:
          type: array
          items:
            type: object
            properties:
              finalizadora_id: { type: integer }
              valor: { type: number }
              plano_id: { type: integer, nullable: true }

    PedidosResponse:
      type: object
      properties:
        status:
          type: string
          example: success
        data:
          type: array
          items:
            $ref: '#/components/schemas/Pedido'
