openapi: 3.0.3
info:
  title: eCosif Masterdata API
  version: 0.7.01.202511281
  description: |
    API de gerenciamento de dados mestres do sistema eCosif.
    
    ## 📋 Funcionalidades
    
    Este serviço gerencia todos os dados mestres do sistema eCosif:
    
    - **🏢 Empresas e Filiais**: Cadastro e gerenciamento de empresas e suas filiais
    - **📊 Plano de Contas**: Estrutura contábil completa (contas sintéticas e analíticas)
    - **📅 Calendários**: Períodos contábeis, exercícios fiscais, abertura/fechamento de mês
    - **📝 Documentos**: Templates de documentos contábeis
    - **📋 Históricos**: Históricos padrão para lançamentos
    - **⚙️ Configurações**: Parâmetros e configurações do sistema
    - **👥 Acessos**: Controle de acesso por empresa/filial/rotina
    - **📈 Consolidações**: Configurações de consolidação contábil
    
    ## 🔐 Autenticação
    
    **IMPORTANTE**: Este serviço requer autenticação JWT.
    
    ### Como obter o token:
    1. Faça login no **ecosif-auth** (porta 8080): `POST /api/auth/signin`
    2. Copie o `accessToken` retornado
    3. Clique no botão **'Authorize'** 🔒 no topo desta página
    4. Digite: `Bearer <seu-token>`
    5. Clique em **'Authorize'**
    6. Agora você pode testar todos os endpoints
    
    ### Exemplo de Login:
    ```bash
    curl -X POST http://localhost:8080/api/auth/signin \
      -H "Content-Type: application/json" \
      -d '{"username":"admin","password":"senha"}'
    ```
  contact:
    name: eCosif Team
    email: support@ecosif.net.br
    url: https://www.ecosif.net.br
  license:
    name: Commercial License
    url: https://www.ecosif.net.br/licenses/

servers:
  - url: http://localhost:8081
    description: Servidor de desenvolvimento local
  - url: https://api.ecosif.net.br/ecosif-masterdata
    description: Servidor de produção

tags:
  - name: Empresas
    description: Gerenciamento de empresas (cadastro, consulta, atualização e exclusão)
  - name: Filiais
    description: Gerenciamento de filiais
  - name: Plano de Contas
    description: Gerenciamento do plano de contas contábil
  - name: Calendário
    description: Gerenciamento de calendários contábeis
  - name: Documentos
    description: Gerenciamento de documentos contábeis
  - name: Lançamentos
    description: Gerenciamento de lançamentos contábeis
  - name: Lotes
    description: Gerenciamento de lotes contábeis
  - name: Históricos
    description: Gerenciamento de históricos padrão
  - name: Grupos
    description: Gerenciamento de grupos de usuários
  - name: Configurações
    description: Configurações do sistema
  - name: Rotinas
    description: Gerenciamento de rotinas e acessos
  - name: Consolidação
    description: Processamento de consolidação contábil
  - name: Admin
    description: Endpoints administrativos

components:
  securitySchemes:
    bearer-jwt:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: |
        JWT token obtido através do ecosif-auth (porta 8080).
        Formato: Bearer <token>
        Exemplo: Bearer eyJhbGciOiJIUzI1NiJ9...
  
  schemas:
    CompanyDTO:
      type: object
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
          description: Nome da empresa
        cnpj:
          type: string
          description: CNPJ da empresa
        zipCode:
          type: string
          description: CEP da empresa
    
    BranchDTO:
      type: object
      properties:
        id:
          type: integer
          format: int64
        company:
          type: string
          description: Código da empresa
        branch:
          type: string
          description: Código da filial
        name:
          type: string
          description: Nome da filial
    
    ChartOfAccountsDTO:
      type: object
      properties:
        id:
          type: integer
          format: int64
        plan:
          type: string
          description: Plano de contas
        cdAccounting:
          type: string
          description: Código contábil
        cdReduced:
          type: string
          description: Código reduzido
        description:
          type: string
          description: Descrição da conta
        level:
          type: integer
          description: Nível hierárquico
        nrChildren:
          type: integer
          description: Número de filhos
    
    DocumentDTO:
      type: object
      properties:
        id:
          type: integer
          format: int64
        batchId:
          type: integer
          format: int64
        documentNumber:
          type: string
        day:
          type: string
    
    EntryDTO:
      type: object
      properties:
        id:
          type: integer
          format: int64
        documentId:
          type: integer
          format: int64
        account:
          type: string
        history:
          type: string
        debit:
          type: number
        credit:
          type: number
    
    BatchDTO:
      type: object
      properties:
        id:
          type: integer
          format: int64
        company:
          type: string
        branch:
          type: string
        month:
          type: string
        year:
          type: string
        informedDocuments:
          type: integer
    
    GenericResponse:
      type: object
      properties:
        success:
          type: boolean
        message:
          type: string

security:
  - bearer-jwt: []

paths:
  /company:
    post:
      tags:
        - Empresas
      summary: Criar empresa
      description: Cria uma nova empresa no sistema
      operationId: createCompany
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompanyDTO'
      responses:
        '201':
          description: Empresa criada com sucesso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyDTO'
        '400':
          description: Dados inválidos
        '401':
          description: Não autenticado

  /companies:
    get:
      tags:
        - Empresas
      summary: Listar empresas
      description: Retorna lista de todas as empresas
      operationId: listCompanies
      responses:
        '200':
          description: Lista de empresas
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CompanyDTO'
        '401':
          description: Não autenticado

  /companies/{id}:
    get:
      tags:
        - Empresas
      summary: Obter empresa por ID
      description: Retorna uma empresa específica pelo ID
      operationId: getCompanyById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Empresa encontrada
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompanyDTO'
        '404':
          description: Empresa não encontrada
        '401':
          description: Não autenticado

    put:
      tags:
        - Empresas
      summary: Atualizar empresa
      description: Atualiza uma empresa existente
      operationId: updateCompany
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompanyDTO'
      responses:
        '200':
          description: Empresa atualizada
        '404':
          description: Empresa não encontrada
        '401':
          description: Não autenticado

    delete:
      tags:
        - Empresas
      summary: Excluir empresa
      description: Exclui uma empresa do sistema
      operationId: deleteCompany
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Empresa excluída
        '404':
          description: Empresa não encontrada
        '401':
          description: Não autenticado

  /branch:
    post:
      tags:
        - Filiais
      summary: Criar filial
      description: Cria uma nova filial
      operationId: createBranch
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BranchDTO'
      responses:
        '201':
          description: Filial criada
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BranchDTO'
        '400':
          description: Dados inválidos
        '409':
          description: Código de filial já existe
        '401':
          description: Não autenticado

  /allbranch/{company}:
    get:
      tags:
        - Filiais
      summary: Listar filiais de uma empresa
      description: Retorna todas as filiais de uma empresa específica
      operationId: listBranchesByCompany
      parameters:
        - name: company
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Lista de filiais
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BranchDTO'
        '401':
          description: Não autenticado

  /chartOfAccounts:
    post:
      tags:
        - Plano de Contas
      summary: Criar conta
      description: Cria uma nova conta no plano de contas
      operationId: createChartOfAccount
      parameters:
        - name: confirmed
          in: query
          schema:
            type: boolean
            default: false
          description: Confirma criação mesmo se conta pai tiver filhos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChartOfAccountsDTO'
      responses:
        '201':
          description: Conta criada
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChartOfAccountsDTO'
        '406':
          description: Conta já existe ou conta pai não encontrada
        '401':
          description: Não autenticado

  /entry:
    post:
      tags:
        - Lançamentos
      summary: Criar lançamento
      description: Cria um novo lançamento contábil
      operationId: createEntry
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EntryDTO'
      responses:
        '201':
          description: Lançamento criado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntryDTO'
        '400':
          description: Dados inválidos
        '401':
          description: Não autenticado

  /batch:
    post:
      tags:
        - Lotes
      summary: Criar lote
      description: Cria um novo lote contábil
      operationId: createBatch
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchDTO'
      responses:
        '201':
          description: Lote criado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BatchDTO'
        '400':
          description: Dados inválidos
        '401':
          description: Não autenticado

  /runconsolidation:
    post:
      tags:
        - Consolidação
      summary: Executar consolidação
      description: Executa processo de consolidação contábil (assíncrono)
      operationId: runConsolidation
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                company:
                  type: string
                branch:
                  type: string
                month:
                  type: string
                year:
                  type: string
      responses:
        '200':
          description: Consolidação iniciada
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericResponse'
        '400':
          description: Dados inválidos
        '401':
          description: Não autenticado

  /actuator/health:
    get:
      tags:
        - Monitoramento
      summary: Health check
      description: Verifica o status de saúde da aplicação
      operationId: healthCheck
      security: []
      responses:
        '200':
          description: Aplicação saudável
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    example: UP

