openapi: 3.0.3 info: title: 'BS Homolog API Documentation' description: '' version: 1.0.0 servers: - url: 'https://api.bs-homolog.pensou.app.br' tags: - name: ACL description: 'Endpoints for managing roles and permissions.' - name: 'Accounts Payable Receivable' description: 'Endpoints for accounts payable receivable' - name: Authentication description: 'Endpoints for authentication' - name: 'Bank Account Movements' description: 'Endpoints for bank account deposits, withdraws and transfers' - name: 'Bank Accounts' description: 'Endpoints for bank accounts' - name: 'Bank Statements' description: 'Endpoints for bank account statements (extrato bancário)' - name: Banks description: 'Endpoints for banks' - name: CEP description: '' - name: 'Cash Flow' description: 'Endpoints for cash flow' - name: 'Cash Session' description: 'Endpoints for cash session' - name: Contracts description: 'Endpoints for managing work contracts' - name: Customers description: 'Endpoints for customers' - name: 'Daily Logs (RDO)' description: 'Endpoints for managing daily work reports (RDO)' - name: Disciplines description: 'Endpoints for engineering disciplines' - name: 'Document Categories' description: 'Endpoints for document categories' - name: Documents description: 'Endpoints for documents' - name: 'EPI Renewals' description: 'Endpoints for EPI pending renewals' - name: 'EPI Types' description: 'Endpoints for EPI types catalog' - name: 'Employee Roles' description: 'Endpoints for employee roles' - name: Employees description: 'Endpoints for employees' - name: Endpoints description: '' - name: Files description: 'Endpoints for files' - name: 'Fiscal Documents' description: 'Endpoints para gerenciar notas fiscais (arquivos XML/PDF e vínculo com obras).' - name: Import description: 'Endpoints for managing NFe imports and product processing.' - name: Locations description: 'Endpoints for states and cities' - name: Notifications description: 'Endpoints for user notifications' - name: 'Payment Receipts' description: 'Endpoints for payment receipts' - name: 'Permission Groups' description: 'Endpoints for permission groups' - name: 'Product Brands' description: 'Endpoints for product brands' - name: 'Product Families' description: 'Endpoints for product families' - name: 'Product Quantity Lists' description: 'Endpoints for managing product quantity lists' - name: 'Product Request Fulfillment' description: 'Endpoints for fulfilling product request items' - name: 'Product Requests' description: 'Endpoints for managing product requests for works' - name: Products description: 'Endpoints for products' - name: 'Project Versions' description: 'Endpoints for project revisions' - name: Projects description: 'Endpoints for engineering projects' - name: Reports description: '' - name: Sectors description: 'Endpoints for sectors' - name: 'Status Modules' description: 'Endpoints for modules that have status' - name: Statuses description: 'Endpoints for statuses' - name: Stock description: 'Endpoints for stock management' - name: 'Stock Movements' description: 'Endpoints for stock movement management' - name: Suppliers description: 'Endpoints for suppliers' - name: 'System Types' description: 'Endpoints for system types' - name: 'Transaction Categories' description: 'Endpoints for transaction categories' - name: Units description: 'Endpoints for units' - name: Users description: 'Endpoints for users' - name: 'Work Locations' description: 'Endpoints for work locations' - name: Works description: 'Endpoints for works' components: securitySchemes: default: type: http scheme: bearer description: '' security: - default: [] paths: /api/acl/roles: get: summary: List operationId: list description: 'List roles.' parameters: - in: query name: q description: 'Search query.' example: 'Role name' required: false schema: type: string description: 'Search query.' example: 'Role name' nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 4798773c-b44f-3cc9-9543-670005461011 name: ipsum-6a723f63e0394 display_name: 'Qui delectus sint voluptatibus omnis fugiat.' permissions_count: null - id: 08020f46-91cf-32a8-b6ff-a3d50a82b7b7 name: voluptas-6a723f63e3bf2 display_name: 'Rerum ut quisquam sapiente et accusamus unde quas.' permissions_count: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 4798773c-b44f-3cc9-9543-670005461011 name: ipsum-6a723f63e0394 display_name: 'Qui delectus sint voluptatibus omnis fugiat.' permissions_count: null - id: 08020f46-91cf-32a8-b6ff-a3d50a82b7b7 name: voluptas-6a723f63e3bf2 display_name: 'Rerum ut quisquam sapiente et accusamus unde quas.' permissions_count: null items: type: object properties: id: type: string example: 4798773c-b44f-3cc9-9543-670005461011 name: type: string example: ipsum-6a723f63e0394 display_name: type: string example: 'Qui delectus sint voluptatibus omnis fugiat.' permissions_count: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - ACL post: summary: Create operationId: create description: 'Create a new role.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - ACL requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Name. example: 'Example Name' display_name: type: string description: 'Display name.' example: 'Example Name' permissions: type: array description: 'Permissions *. The uuid of an existing record in the permissions table.' example: - 3ada3ecf-409f-30c3-b208-7a88f4be4724 items: type: string required: - name - display_name '/api/acl/roles/{id}': put: summary: Update operationId: update description: 'Update a role.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - ACL requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: Name. example: 'Example Name' display_name: type: string description: 'Display name.' example: 'Example Name' permissions: type: array description: 'Permissions *. The uuid of an existing record in the permissions table.' example: - d34162fb-0b0c-372e-ae38-5ac47946f1a9 items: type: string get: summary: Show operationId: show description: 'Show a role.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 07750ebd-c711-3e75-9327-780cc69fdf69 name: sint-6a723f63ef0cd display_name: 'Nostrum soluta id sed occaecati voluptatum voluptatem ratione cum.' permissions_count: null properties: data: type: object properties: id: type: string example: 07750ebd-c711-3e75-9327-780cc69fdf69 name: type: string example: sint-6a723f63ef0cd display_name: type: string example: 'Nostrum soluta id sed occaecati voluptatum voluptatem ratione cum.' permissions_count: type: string example: null nullable: true tags: - ACL parameters: - in: path name: id description: 'The ID of the role.' example: 1 required: true schema: type: integer '/api/acl/roles/{role}/permissions': get: summary: 'Role Permissions' operationId: rolePermissions description: 'List permissions associated with a role.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: null name: modi display_name: 'Facilis vel deleniti voluptas qui omnis.' - id: null name: amet display_name: 'Et sit totam iusto blanditiis.' properties: data: type: array example: - id: null name: modi display_name: 'Facilis vel deleniti voluptas qui omnis.' - id: null name: amet display_name: 'Et sit totam iusto blanditiis.' items: type: object properties: id: type: string example: null nullable: true name: type: string example: modi display_name: type: string example: 'Facilis vel deleniti voluptas qui omnis.' tags: - ACL parameters: - in: path name: role description: 'The role.' example: 1 required: true schema: type: integer '/api/acl/roles/{role}': delete: summary: Delete operationId: delete description: 'Delete a role.' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - ACL parameters: - in: path name: role description: 'The role.' example: 1 required: true schema: type: integer /api/acl/permissions: get: summary: List operationId: list description: 'List permissions.' parameters: - in: query name: q description: 'Search query.' example: 'Permission name' required: false schema: type: string description: 'Search query.' example: 'Permission name' nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: null name: ex display_name: 'Sint atque voluptatem quis blanditiis.' - id: null name: ipsum display_name: 'Omnis qui eius aut quia voluptatum perferendis.' links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: null name: ex display_name: 'Sint atque voluptatem quis blanditiis.' - id: null name: ipsum display_name: 'Omnis qui eius aut quia voluptatum perferendis.' items: type: object properties: id: type: string example: null nullable: true name: type: string example: ex display_name: type: string example: 'Sint atque voluptatem quis blanditiis.' links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - ACL post: summary: Create operationId: create description: 'Create a new permission.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - ACL requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Name. example: 'Example Name' display_name: type: string description: 'Display name.' example: 'Example Name' required: - name - display_name '/api/acl/permissions/{id}': put: summary: Update operationId: update description: 'Update a permission.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - ACL requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: Name. example: 'Example Name' display_name: type: string description: 'Display name.' example: 'Example Name' get: summary: Show operationId: show description: 'Show a permission.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: null name: corporis display_name: 'Incidunt error laboriosam qui vitae dolores.' properties: data: type: object properties: id: type: string example: null nullable: true name: type: string example: corporis display_name: type: string example: 'Incidunt error laboriosam qui vitae dolores.' tags: - ACL parameters: - in: path name: id description: 'The ID of the permission.' example: 1 required: true schema: type: integer '/api/acl/permissions/{permission}': delete: summary: Delete operationId: delete description: 'Delete a permission.' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - ACL parameters: - in: path name: permission description: 'The permission.' example: 1 required: true schema: type: integer /api/accounts-payable-receivable/reminders: get: summary: 'List reminders for accounts payable receivable' operationId: listRemindersForAccountsPayableReceivable description: 'List reminders for accounts payable receivable that are about to expire soon' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 491447ac-ea5b-3988-a7f3-1377fb5f48f0 code: null type: entrada payment_method: boleto amount: 6059.32 due_date: '2026-08-22T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Qui maiores officiis aut in et dolores nam consequatur blanditiis reiciendis sed quia.' is_recurring: null recurrence_config: null parent_id: null recurrence_order: 1 total_recurrences: null children_count: 0 remaining_recurrences: null has_children: false field1: qui field2: 71 field3: true notes: 'Consequatur quia aspernatur et hic quam ut.' created_at: null updated_at: null - id: 0a8638c0-7459-3700-b526-e96f0216ecbb code: null type: entrada payment_method: cheque amount: 9475.44 due_date: '2026-08-13T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Quisquam dolores voluptas et incidunt esse est aut vel eos esse quibusdam sit.' is_recurring: null recurrence_config: null parent_id: null recurrence_order: 1 total_recurrences: null children_count: 0 remaining_recurrences: null has_children: false field1: quas field2: 37 field3: true notes: 'Atque rerum modi qui eum.' created_at: null updated_at: null properties: data: type: array example: - id: 491447ac-ea5b-3988-a7f3-1377fb5f48f0 code: null type: entrada payment_method: boleto amount: 6059.32 due_date: '2026-08-22T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Qui maiores officiis aut in et dolores nam consequatur blanditiis reiciendis sed quia.' is_recurring: null recurrence_config: null parent_id: null recurrence_order: 1 total_recurrences: null children_count: 0 remaining_recurrences: null has_children: false field1: qui field2: 71 field3: true notes: 'Consequatur quia aspernatur et hic quam ut.' created_at: null updated_at: null - id: 0a8638c0-7459-3700-b526-e96f0216ecbb code: null type: entrada payment_method: cheque amount: 9475.44 due_date: '2026-08-13T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Quisquam dolores voluptas et incidunt esse est aut vel eos esse quibusdam sit.' is_recurring: null recurrence_config: null parent_id: null recurrence_order: 1 total_recurrences: null children_count: 0 remaining_recurrences: null has_children: false field1: quas field2: 37 field3: true notes: 'Atque rerum modi qui eum.' created_at: null updated_at: null items: type: object properties: id: type: string example: 491447ac-ea5b-3988-a7f3-1377fb5f48f0 code: type: string example: null nullable: true type: type: string example: entrada payment_method: type: string example: boleto amount: type: number example: 6059.32 due_date: type: string example: '2026-08-22T03:00:00.000000Z' status: type: string example: null nullable: true payment_date: type: string example: null nullable: true protest_date: type: string example: null nullable: true paid_amount: type: string example: null nullable: true interest_amount: type: string example: null nullable: true penalty_amount: type: string example: null nullable: true notary_fee_amount: type: string example: null nullable: true description: type: string example: 'Qui maiores officiis aut in et dolores nam consequatur blanditiis reiciendis sed quia.' is_recurring: type: string example: null nullable: true recurrence_config: type: string example: null nullable: true parent_id: type: string example: null nullable: true recurrence_order: type: integer example: 1 total_recurrences: type: string example: null nullable: true children_count: type: integer example: 0 remaining_recurrences: type: string example: null nullable: true has_children: type: boolean example: false field1: type: string example: qui field2: type: integer example: 71 field3: type: boolean example: true notes: type: string example: 'Consequatur quia aspernatur et hic quam ut.' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Accounts Payable Receivable' /api/accounts-payable-receivable/reminders/mark-as-read: post: summary: 'Mark reminders as read' operationId: markRemindersAsRead description: 'Mark reminders for accounts payable receivable as read' parameters: - in: query name: items description: 'The uuid of an existing record in the account_payable_receivables table.' example: - odio required: true schema: type: array description: 'The uuid of an existing record in the account_payable_receivables table.' example: - odio items: type: string responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Accounts Payable Receivable' /api/accounts-payable-receivable/protests/summary: get: summary: 'Get protest summary' operationId: getProtestSummary description: 'Get summary of accounts with protest status' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: to_protest_count: integer protested_count: integer protesting_today_count: integer total_protest_amount: float properties: to_protest_count: type: string example: integer protested_count: type: string example: integer protesting_today_count: type: string example: integer total_protest_amount: type: string example: float tags: - 'Accounts Payable Receivable' /api/accounts-payable-receivable/protests: get: summary: 'List protested accounts' operationId: listProtestedAccounts description: 'List accounts with protest date that are not paid/canceled' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Items per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 10 required: false schema: type: integer description: 'Items per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 10 nullable: true - in: query name: q description: 'Search query.' example: Salary required: false schema: type: string description: 'Search query.' example: Salary nullable: true - in: query name: code description: 'Filter by account code.' example: CPR-000123 required: false schema: type: string description: 'Filter by account code.' example: CPR-000123 nullable: true - in: query name: type description: Type. example: entrada required: false schema: type: string description: Type. example: entrada enum: - entrada - saída nullable: true - in: query name: customers description: 'The uuid of an existing record in the customers table.' example: - maiores required: false schema: type: array description: 'The uuid of an existing record in the customers table.' example: - maiores items: type: string - in: query name: suppliers description: 'The uuid of an existing record in the suppliers table.' example: - itaque required: false schema: type: array description: 'The uuid of an existing record in the suppliers table.' example: - itaque items: type: string - in: query name: works description: 'The uuid of an existing record in the works table.' example: - exercitationem required: false schema: type: array description: 'The uuid of an existing record in the works table.' example: - exercitationem items: type: string - in: query name: statuses description: '' example: - 'a vencer' required: false schema: type: array description: '' example: - 'a vencer' items: type: string enum: - 'a vencer' - pago - pago_sem_lancamento - vencido - recebido - cancelado - 'a protestar' - protestado nullable: true - in: query name: payment_method description: 'Payment method.' example: cheque required: false schema: type: string description: 'Payment method.' example: cheque enum: - cheque - boleto - outro nullable: true - in: query name: date_start description: 'Start date. O campo value deve ser uma data válida.' example: '2023-01-01' required: false schema: type: string description: 'Start date. O campo value deve ser uma data válida.' example: '2023-01-01' nullable: true - in: query name: date_end description: 'End date. O campo value deve ser uma data válida.' example: '2023-12-31' required: false schema: type: string description: 'End date. O campo value deve ser uma data válida.' example: '2023-12-31' nullable: true - in: query name: protest_date_start description: 'O campo value deve ser uma data válida.' example: '2026-08-04T16:37:08' required: false schema: type: string description: 'O campo value deve ser uma data válida.' example: '2026-08-04T16:37:08' nullable: true - in: query name: protest_date_end description: 'O campo value deve ser uma data válida.' example: '2026-08-04T16:37:08' required: false schema: type: string description: 'O campo value deve ser uma data válida.' example: '2026-08-04T16:37:08' nullable: true - in: query name: has_protest description: '' example: true required: false schema: type: boolean description: '' example: true nullable: true - in: query name: has_children description: 'Filter accounts that have recurring children.' example: true required: false schema: type: boolean description: 'Filter accounts that have recurring children.' example: true nullable: true - in: query name: is_recurring description: 'Filter by recurring status (true: only recurring, false: only non-recurring, null: all).' example: true required: false schema: type: boolean description: 'Filter by recurring status (true: only recurring, false: only non-recurring, null: all).' example: true nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 5e64316e-474a-391f-901b-cc78212f2c9d code: null type: saída payment_method: boleto amount: 3528.81 due_date: '2026-08-20T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Qui modi ea ut provident quia fugit sapiente minus ut iste eius quae.' is_recurring: null recurrence_config: null parent_id: null recurrence_order: 1 total_recurrences: null children_count: 0 remaining_recurrences: null has_children: false field1: suscipit field2: 75 field3: false notes: 'Et fugiat tenetur fugit omnis.' created_at: null updated_at: null - id: 50d8c26e-4ea1-399e-af3d-710a4decbcde code: null type: entrada payment_method: cheque amount: 2698.18 due_date: '2026-08-28T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Repellat blanditiis sequi et dicta possimus est aut quasi aperiam atque nulla sequi ex.' is_recurring: null recurrence_config: null parent_id: null recurrence_order: 1 total_recurrences: null children_count: 0 remaining_recurrences: null has_children: false field1: exercitationem field2: 95 field3: true notes: 'Odio et doloribus odit qui.' created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 5e64316e-474a-391f-901b-cc78212f2c9d code: null type: saída payment_method: boleto amount: 3528.81 due_date: '2026-08-20T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Qui modi ea ut provident quia fugit sapiente minus ut iste eius quae.' is_recurring: null recurrence_config: null parent_id: null recurrence_order: 1 total_recurrences: null children_count: 0 remaining_recurrences: null has_children: false field1: suscipit field2: 75 field3: false notes: 'Et fugiat tenetur fugit omnis.' created_at: null updated_at: null - id: 50d8c26e-4ea1-399e-af3d-710a4decbcde code: null type: entrada payment_method: cheque amount: 2698.18 due_date: '2026-08-28T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Repellat blanditiis sequi et dicta possimus est aut quasi aperiam atque nulla sequi ex.' is_recurring: null recurrence_config: null parent_id: null recurrence_order: 1 total_recurrences: null children_count: 0 remaining_recurrences: null has_children: false field1: exercitationem field2: 95 field3: true notes: 'Odio et doloribus odit qui.' created_at: null updated_at: null items: type: object properties: id: type: string example: 5e64316e-474a-391f-901b-cc78212f2c9d code: type: string example: null nullable: true type: type: string example: saída payment_method: type: string example: boleto amount: type: number example: 3528.81 due_date: type: string example: '2026-08-20T03:00:00.000000Z' status: type: string example: null nullable: true payment_date: type: string example: null nullable: true protest_date: type: string example: null nullable: true paid_amount: type: string example: null nullable: true interest_amount: type: string example: null nullable: true penalty_amount: type: string example: null nullable: true notary_fee_amount: type: string example: null nullable: true description: type: string example: 'Qui modi ea ut provident quia fugit sapiente minus ut iste eius quae.' is_recurring: type: string example: null nullable: true recurrence_config: type: string example: null nullable: true parent_id: type: string example: null nullable: true recurrence_order: type: integer example: 1 total_recurrences: type: string example: null nullable: true children_count: type: integer example: 0 remaining_recurrences: type: string example: null nullable: true has_children: type: boolean example: false field1: type: string example: suscipit field2: type: integer example: 75 field3: type: boolean example: false notes: type: string example: 'Et fugiat tenetur fugit omnis.' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Accounts Payable Receivable' /api/accounts-payable-receivable: get: summary: 'List accounts payable receivable' operationId: listAccountsPayableReceivable description: 'List all accounts payable receivable' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Items per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 10 required: false schema: type: integer description: 'Items per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 10 nullable: true - in: query name: q description: 'Search query.' example: Salary required: false schema: type: string description: 'Search query.' example: Salary nullable: true - in: query name: code description: 'Filter by account code.' example: CPR-000123 required: false schema: type: string description: 'Filter by account code.' example: CPR-000123 nullable: true - in: query name: type description: Type. example: entrada required: false schema: type: string description: Type. example: entrada enum: - entrada - saída nullable: true - in: query name: customers description: 'The uuid of an existing record in the customers table.' example: - suscipit required: false schema: type: array description: 'The uuid of an existing record in the customers table.' example: - suscipit items: type: string - in: query name: suppliers description: 'The uuid of an existing record in the suppliers table.' example: - qui required: false schema: type: array description: 'The uuid of an existing record in the suppliers table.' example: - qui items: type: string - in: query name: works description: 'The uuid of an existing record in the works table.' example: - ut required: false schema: type: array description: 'The uuid of an existing record in the works table.' example: - ut items: type: string - in: query name: statuses description: '' example: - 'a vencer' required: false schema: type: array description: '' example: - 'a vencer' items: type: string enum: - 'a vencer' - pago - pago_sem_lancamento - vencido - recebido - cancelado - 'a protestar' - protestado nullable: true - in: query name: payment_method description: 'Payment method.' example: cheque required: false schema: type: string description: 'Payment method.' example: cheque enum: - cheque - boleto - outro nullable: true - in: query name: date_start description: 'Start date. O campo value deve ser uma data válida.' example: '2023-01-01' required: false schema: type: string description: 'Start date. O campo value deve ser uma data válida.' example: '2023-01-01' nullable: true - in: query name: date_end description: 'End date. O campo value deve ser uma data válida.' example: '2023-12-31' required: false schema: type: string description: 'End date. O campo value deve ser uma data válida.' example: '2023-12-31' nullable: true - in: query name: protest_date_start description: 'O campo value deve ser uma data válida.' example: '2026-08-04T16:37:08' required: false schema: type: string description: 'O campo value deve ser uma data válida.' example: '2026-08-04T16:37:08' nullable: true - in: query name: protest_date_end description: 'O campo value deve ser uma data válida.' example: '2026-08-04T16:37:08' required: false schema: type: string description: 'O campo value deve ser uma data válida.' example: '2026-08-04T16:37:08' nullable: true - in: query name: has_protest description: '' example: true required: false schema: type: boolean description: '' example: true nullable: true - in: query name: has_children description: 'Filter accounts that have recurring children.' example: true required: false schema: type: boolean description: 'Filter accounts that have recurring children.' example: true nullable: true - in: query name: is_recurring description: 'Filter by recurring status (true: only recurring, false: only non-recurring, null: all).' example: true required: false schema: type: boolean description: 'Filter by recurring status (true: only recurring, false: only non-recurring, null: all).' example: true nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: f7b94f07-1526-3427-ad3e-62eea59785a1 code: null type: entrada payment_method: cheque amount: 4306.4 due_date: '2026-08-23T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Unde deserunt nostrum dolores eius et nihil est itaque aut eveniet.' is_recurring: null recurrence_config: null parent_id: null recurrence_order: 1 total_recurrences: null children_count: 0 remaining_recurrences: null has_children: false field1: expedita field2: 39 field3: true notes: 'Quos quia repellendus repellat.' created_at: null updated_at: null - id: 9787968c-518e-32d8-bb54-b5a601ba63e0 code: null type: entrada payment_method: boleto amount: 5030.95 due_date: '2026-08-26T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Error dolores labore doloremque eum a et ullam at quaerat sed sit.' is_recurring: null recurrence_config: null parent_id: null recurrence_order: 1 total_recurrences: null children_count: 0 remaining_recurrences: null has_children: false field1: temporibus field2: 74 field3: true notes: 'Nesciunt qui illo quia et pariatur ipsum nobis.' created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: f7b94f07-1526-3427-ad3e-62eea59785a1 code: null type: entrada payment_method: cheque amount: 4306.4 due_date: '2026-08-23T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Unde deserunt nostrum dolores eius et nihil est itaque aut eveniet.' is_recurring: null recurrence_config: null parent_id: null recurrence_order: 1 total_recurrences: null children_count: 0 remaining_recurrences: null has_children: false field1: expedita field2: 39 field3: true notes: 'Quos quia repellendus repellat.' created_at: null updated_at: null - id: 9787968c-518e-32d8-bb54-b5a601ba63e0 code: null type: entrada payment_method: boleto amount: 5030.95 due_date: '2026-08-26T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Error dolores labore doloremque eum a et ullam at quaerat sed sit.' is_recurring: null recurrence_config: null parent_id: null recurrence_order: 1 total_recurrences: null children_count: 0 remaining_recurrences: null has_children: false field1: temporibus field2: 74 field3: true notes: 'Nesciunt qui illo quia et pariatur ipsum nobis.' created_at: null updated_at: null items: type: object properties: id: type: string example: f7b94f07-1526-3427-ad3e-62eea59785a1 code: type: string example: null nullable: true type: type: string example: entrada payment_method: type: string example: cheque amount: type: number example: 4306.4 due_date: type: string example: '2026-08-23T03:00:00.000000Z' status: type: string example: null nullable: true payment_date: type: string example: null nullable: true protest_date: type: string example: null nullable: true paid_amount: type: string example: null nullable: true interest_amount: type: string example: null nullable: true penalty_amount: type: string example: null nullable: true notary_fee_amount: type: string example: null nullable: true description: type: string example: 'Unde deserunt nostrum dolores eius et nihil est itaque aut eveniet.' is_recurring: type: string example: null nullable: true recurrence_config: type: string example: null nullable: true parent_id: type: string example: null nullable: true recurrence_order: type: integer example: 1 total_recurrences: type: string example: null nullable: true children_count: type: integer example: 0 remaining_recurrences: type: string example: null nullable: true has_children: type: boolean example: false field1: type: string example: expedita field2: type: integer example: 39 field3: type: boolean example: true notes: type: string example: 'Quos quia repellendus repellat.' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Accounts Payable Receivable' post: summary: 'Create accounts payable receivable' operationId: createAccountsPayableReceivable description: 'Create a new accounts payable receivable' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Accounts Payable Receivable' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: Tipo. example: 'Example Type' enum: - entrada - saída payment_method: type: string description: 'Forma de pagamento.' example: 'Example Payment method' enum: - cheque - boleto - outro due_date: type: string description: 'Data de vencimento. O campo value deve ser uma data válida.' example: '2024-01-01' amount: type: number description: Valor. example: 1.0 description: type: string description: Descrição. example: 'Example Description' supplier_id: type: string description: 'Fornecedor. The uuid of an existing record in the suppliers table.' example: 51464b5f-18bb-364d-8345-047729bd5702 nullable: true customer_id: type: string description: 'Cliente. The uuid of an existing record in the customers table.' example: b915e833-aa36-36f5-b106-78833477454e nullable: true work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: 98b08130-6722-3780-ad27-cb98cc63b703 nullable: true status: type: string description: Status. example: 'Example Status' enum: - 'a vencer' - pago - vencido - recebido - cancelado - 'a protestar' - protestado protest_date: type: string description: 'Protest date. O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a due_date.' example: '2024-01-01' nullable: true bank_account_id: type: string description: 'Bank account id. The uuid of an existing record in the bank_accounts table.' example: d0a04ee9-3990-3233-95af-9b0ed9df8c55 nullable: true custom_fields: type: object description: 'Custom fields.' example: - example1 - example2 properties: { } is_recurring: type: boolean description: 'Is recurring.' example: true recurrence_config: type: object description: 'Recurrence config.' example: - example1 - example2 properties: frequency_type: type: string description: 'Recurrence config frequency type.' example: 'Example Recurrence config frequency type' enum: - monthly - weekly - biweekly - yearly frequency_value: type: integer description: 'Recurrence config frequency value. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 31.' example: 1 end_date: type: string description: 'Recurrence config end date. O campo value deve ser uma data válida. O campo value deve ser uma data posterior a due_date.' example: '2024-01-01' nullable: true max_occurrences: type: integer description: 'Recurrence config max occurrences. O campo value deve ser pelo menos 1.' example: 1 nullable: true generation_days_ahead: type: integer description: 'Recurrence config generation days ahead. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 30.' example: 1 required: - type - payment_method - due_date - amount - description /api/accounts-payable-receivable/import-nfe: post: summary: 'Import NFe installments' operationId: importNFeInstallments description: 'Gera contas a pagar para as parcelas selecionadas de uma nota fiscal. A obra é opcional: quando omitida, só é herdada se a NF tiver exatamente uma obra vinculada.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string total: integer properties: message: type: string example: string total: type: string example: integer tags: - 'Accounts Payable Receivable' requestBody: required: true content: application/json: schema: type: object properties: fiscal_document_id: type: string description: 'The uuid of an existing record in the fiscal_documents table.' example: earum installment_ids: type: array description: 'The uuid of an existing record in the fiscal_document_installments table.' example: - tempore items: type: string payment_method: type: string description: '' example: cheque enum: - cheque - boleto - outro nullable: true work_id: type: string description: 'The uuid of an existing record in the works table.' example: iste nullable: true required: - fiscal_document_id '/api/accounts-payable-receivable/{accountPayableReceivable}/history': get: summary: 'Get account history' operationId: getAccountHistory description: 'Get the activity log history for an account payable receivable' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Accounts Payable Receivable' parameters: - in: path name: accountPayableReceivable description: '' example: est required: true schema: type: string '/api/accounts-payable-receivable/{accountPayableReceivable}': get: summary: 'Get accounts payable receivable' operationId: getAccountsPayableReceivable description: 'Get an accounts payable receivable' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: e3ffb713-f130-37b0-941e-21cbcc50933d code: null type: entrada payment_method: cheque amount: 3252.7 due_date: '2026-08-30T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Aspernatur animi rerum deserunt aut vel sequi consectetur ipsam.' is_recurring: null recurrence_config: null parent_id: null recurrence_order: 1 total_recurrences: null children_count: 0 remaining_recurrences: null has_children: false field1: saepe field2: 52 field3: false notes: 'Error sed cupiditate qui eveniet.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: e3ffb713-f130-37b0-941e-21cbcc50933d code: type: string example: null nullable: true type: type: string example: entrada payment_method: type: string example: cheque amount: type: number example: 3252.7 due_date: type: string example: '2026-08-30T03:00:00.000000Z' status: type: string example: null nullable: true payment_date: type: string example: null nullable: true protest_date: type: string example: null nullable: true paid_amount: type: string example: null nullable: true interest_amount: type: string example: null nullable: true penalty_amount: type: string example: null nullable: true notary_fee_amount: type: string example: null nullable: true description: type: string example: 'Aspernatur animi rerum deserunt aut vel sequi consectetur ipsam.' is_recurring: type: string example: null nullable: true recurrence_config: type: string example: null nullable: true parent_id: type: string example: null nullable: true recurrence_order: type: integer example: 1 total_recurrences: type: string example: null nullable: true children_count: type: integer example: 0 remaining_recurrences: type: string example: null nullable: true has_children: type: boolean example: false field1: type: string example: saepe field2: type: integer example: 52 field3: type: boolean example: false notes: type: string example: 'Error sed cupiditate qui eveniet.' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Accounts Payable Receivable' put: summary: 'Update accounts payable receivable' operationId: updateAccountsPayableReceivable description: 'Update an accounts payable receivable' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Accounts Payable Receivable' requestBody: required: false content: application/json: schema: type: object properties: type: type: string description: Type. example: 'Example Type' enum: - entrada - saída payment_method: type: string description: 'Payment method.' example: 'Example Payment method' enum: - cheque - boleto - outro due_date: type: string description: 'Due date. O campo value deve ser uma data válida.' example: '2024-01-01' amount: type: number description: Amount. example: 1.0 description: type: string description: Description. example: 'Example Description' supplier_id: type: string description: 'Supplier id. The uuid of an existing record in the suppliers table.' example: 0fad8a50-3b49-3b6e-bae0-e26e51e68698 nullable: true customer_id: type: string description: 'Customer id. The uuid of an existing record in the customers table.' example: fff994fa-7a52-31c9-8bb8-4de814fa95fe nullable: true work_id: type: string description: 'Work id. The uuid of an existing record in the works table.' example: 393f481e-8c5d-391a-b339-fc018ffc2006 nullable: true status: type: string description: Status. example: 'Example Status' enum: - 'a vencer' - pago - vencido - recebido - cancelado - 'a protestar' - protestado payment_date: type: string description: 'Payment date. O campo value deve ser uma data válida.' example: '2024-01-01' nullable: true protest_date: type: string description: 'Protest date. O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a due_date.' example: '2024-01-01' nullable: true paid_amount: type: number description: 'Paid amount. O campo value deve ser pelo menos 0.' example: 1.0 nullable: true interest_amount: type: number description: 'Interest amount. O campo value deve ser pelo menos 0.' example: 1.0 nullable: true penalty_amount: type: number description: 'Penalty amount. O campo value deve ser pelo menos 0.' example: 1.0 nullable: true notary_fee_amount: type: number description: 'Notary fee amount. O campo value deve ser pelo menos 0.' example: 1.0 nullable: true bank_account_id: type: string description: 'Bank account id. The uuid of an existing record in the bank_accounts table.' example: 7b4d784f-adb7-3e4b-a3cc-718dea8d2564 nullable: true custom_fields: type: object description: 'Custom fields.' example: - example1 - example2 properties: { } is_recurring: type: boolean description: 'Is recurring.' example: true recurrence_config: type: object description: 'Recurrence config.' example: - example1 - example2 properties: frequency_type: type: string description: 'Recurrence config frequency type.' example: 'Example Recurrence config frequency type' enum: - monthly - weekly - biweekly - yearly frequency_value: type: integer description: 'Recurrence config frequency value. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 31.' example: 1 end_date: type: string description: 'Recurrence config end date. O campo value deve ser uma data válida. O campo value deve ser uma data posterior a due_date.' example: '2024-01-01' nullable: true max_occurrences: type: integer description: 'Recurrence config max occurrences. O campo value deve ser pelo menos 1.' example: 1 nullable: true generation_days_ahead: type: integer description: 'Recurrence config generation days ahead. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 30.' example: 1 delete: summary: 'Delete accounts payable receivable' operationId: deleteAccountsPayableReceivable description: 'Delete an accounts payable receivable' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Accounts Payable Receivable' parameters: - in: path name: accountPayableReceivable description: '' example: est required: true schema: type: string /api/auth/login: post: summary: Login operationId: login description: 'Login with email and password' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: token: string properties: token: type: string example: string tags: - Authentication requestBody: required: true content: application/json: schema: type: object properties: email: type: string description: '' example: esperanza.wolf@example.net password: type: string description: 'User password.' example: password required: - email - password security: [] /api/auth/user: get: summary: Me operationId: me description: 'Get the current user' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 94177f3a-e02d-3283-bcb9-69ede3c7b5e3 name: 'Hellen Hansen' username: tziemann email: kennedi.reynolds@example.org ability: - action: read subject: Auth - action: listar subject: padrão roles: [] preferences: [] sectors: [] image: id: null url: null properties: data: type: object properties: id: type: string example: 94177f3a-e02d-3283-bcb9-69ede3c7b5e3 name: type: string example: 'Hellen Hansen' username: type: string example: tziemann email: type: string example: kennedi.reynolds@example.org ability: type: array example: - action: read subject: Auth - action: listar subject: padrão items: type: object properties: action: type: string example: read subject: type: string example: Auth roles: type: array example: [] preferences: type: array example: [] sectors: type: array example: [] image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true tags: - Authentication put: summary: 'Update Profile' operationId: updateProfile description: 'Update the current user profile' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Authentication requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' certification: type: string description: 'Certificação. O campo value não pode ser superior a 255 caracteres.' example: 'Example Certification' nullable: true crea: type: string description: 'CREA. O campo value não pode ser superior a 255 caracteres.' example: 'Example Crea' nullable: true email: type: string description: 'E-mail. O campo value deve ser um endereço de e-mail válido.' example: user@example.com username: type: string description: Usuário. example: joesph.mcdermott password: type: string description: Password. example: password123 image: type: object description: Imagem. example: - example1 - example2 properties: path: type: string description: 'Caminho da imagem. This field is required when image is present.' example: 'Example Image path' name: type: string description: 'Nome da imagem.' example: 'Example Name' nullable: true extension: type: string description: 'Extensão da imagem.' example: 'Example Image extension' nullable: true size: type: string description: 'Tamanho da imagem.' example: 'Example Image size' nullable: true sectors: type: array description: 'UUID do setor. The uuid of an existing record in the sectors table.' example: - 7b70d32e-25c1-3d1f-894c-16cf441643da items: type: string roles: type: array description: 'UUID da função. The uuid of an existing record in the roles table.' example: - 1cf8af83-d1d5-393d-b9a8-fb40b1e9d2e6 items: type: string /api/auth/logout: post: summary: Logout operationId: logout description: 'Logout the current user' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Authentication /api/auth/preferences: get: summary: 'Get user preferences' operationId: getUserPreferences description: 'Get all user preferences' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: theme: dark language: pt-br notifications: email: true sms: false properties: theme: type: string example: dark language: type: string example: pt-br notifications: type: object properties: email: type: boolean example: true sms: type: boolean example: false tags: - Authentication post: summary: 'Set user preference' operationId: setUserPreference description: 'Set or update a user preference' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Preference saved successfully' properties: message: type: string example: 'Preference saved successfully' tags: - Authentication requestBody: required: true content: application/json: schema: type: object properties: key: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: pfdrbbckcwrmlf value: type: object description: '' example: [] properties: { } required: - key - value '/api/auth/preferences/{key}': delete: summary: 'Delete user preference' operationId: deleteUserPreference description: 'Delete a specific user preference' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Preference deleted successfully' properties: message: type: string example: 'Preference deleted successfully' tags: - Authentication parameters: - in: path name: key description: '' example: porro required: true schema: type: string '/api/auth/{user}/token': post: summary: 'Generate user token' operationId: generateUserToken description: 'Generate a token for a specific user' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: token: string userData: id: uuid name: string username: string email: string ability: - array roles: - array preferences: - array sectors: - array image: id: uuid url: string properties: token: type: string example: string userData: type: object properties: id: type: string example: uuid name: type: string example: string username: type: string example: string email: type: string example: string ability: type: array example: - array items: type: string roles: type: array example: - array items: type: string preferences: type: array example: - array items: type: string sectors: type: array example: - array items: type: string image: type: object properties: id: type: string example: uuid url: type: string example: string tags: - Authentication parameters: - in: path name: user description: 'User UUID' example: 550e8400-e29b-41d4-a716-446655440000 required: true schema: type: string /api/bank-accounts/transfers: post: summary: 'Transfer between bank accounts' operationId: transferBetweenBankAccounts description: 'Transfers funds from a source account to a destination account' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string data: object properties: message: type: string example: string data: type: string example: object tags: - 'Bank Account Movements' requestBody: required: true content: application/json: schema: type: object properties: source_id: type: string description: 'Source id. The value and destination_id must be different. The uuid of an existing record in the bank_accounts table.' example: 'Example Source id' destination_id: type: string description: 'Destination id. The uuid of an existing record in the bank_accounts table.' example: 'Example Destination id' amount: type: number description: Amount. example: 1.0 description: type: string description: 'Description. O campo value não pode ser superior a 255 caracteres.' example: 'Example Description' nullable: true transaction_date: type: string description: 'Transaction date. Must be a valid date in the format Y-m-d H:i:s.' example: '2024-01-01' transaction_category_id: type: string description: 'Transaction category id. The uuid of an existing record in the transaction_categories table.' example: 'Example Transaction category id' nullable: true required: - source_id - destination_id - amount - transaction_date '/api/bank-accounts/transfers/{bankTransfer}': delete: summary: 'Delete a bank transfer' operationId: deleteABankTransfer description: 'Reverts a transfer by deleting both cash flows and the transfer record' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Bank Account Movements' parameters: - in: path name: bankTransfer description: '' example: aut required: true schema: type: string '/api/bank-accounts/{bankAccount}/deposit': post: summary: 'Deposit into bank account' operationId: depositIntoBankAccount description: 'Adds funds to a bank account' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Bank Account Movements' requestBody: required: true content: application/json: schema: type: object properties: amount: type: number description: Amount. example: 1.0 description: type: string description: 'Description. O campo value não pode ser superior a 255 caracteres.' example: 'Example Description' nullable: true transaction_date: type: string description: 'Transaction date. Must be a valid date in the format Y-m-d H:i:s.' example: '2024-01-01' transaction_category_id: type: string description: 'Transaction category id. The uuid of an existing record in the transaction_categories table.' example: 'Example Transaction category id' nullable: true required: - amount - transaction_date parameters: - in: path name: bankAccount description: '' example: 11 required: true schema: type: integer '/api/bank-accounts/{bankAccount}/withdraw': post: summary: 'Withdraw from bank account' operationId: withdrawFromBankAccount description: 'Removes funds from a bank account' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Bank Account Movements' requestBody: required: true content: application/json: schema: type: object properties: amount: type: number description: Amount. example: 1.0 description: type: string description: 'Description. O campo value não pode ser superior a 255 caracteres.' example: 'Example Description' nullable: true transaction_date: type: string description: 'Transaction date. Must be a valid date in the format Y-m-d H:i:s.' example: '2024-01-01' transaction_category_id: type: string description: 'Transaction category id. The uuid of an existing record in the transaction_categories table.' example: 'Example Transaction category id' nullable: true required: - amount - transaction_date parameters: - in: path name: bankAccount description: '' example: 10 required: true schema: type: integer /api/bank-accounts/balance-summary: get: summary: 'Get bank account balance summary' operationId: getBankAccountBalanceSummary description: 'Get the balance summary of all bank accounts' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: totalBalance: number totalBalancePositive: number totalBalanceNegative: number totalLimit: number totalAvailableBalance: number totalUsedLimit: number totalAvailableLimit: number accounts: '*': id: string bank: string balance: number limit: number available_balance: number used_limit: number available_limit: number properties: data: type: object properties: totalBalance: type: string example: number totalBalancePositive: type: string example: number totalBalanceNegative: type: string example: number totalLimit: type: string example: number totalAvailableBalance: type: string example: number totalUsedLimit: type: string example: number totalAvailableLimit: type: string example: number accounts: type: object properties: '*': type: object properties: id: type: string example: string bank: type: string example: string balance: type: string example: number limit: type: string example: number available_balance: type: string example: number used_limit: type: string example: number available_limit: type: string example: number tags: - 'Bank Accounts' /api/bank-accounts/default-by-payment-method: get: summary: 'Get default bank account by payment method' operationId: getDefaultBankAccountByPaymentMethod description: 'Returns the bank account configured as default for the given payment method. Responds 404 when no default is configured.' parameters: - in: query name: method description: 'Forma de pagamento (pix, bank_transfer, cash, check).' example: cash required: true schema: type: string description: 'Forma de pagamento (pix, bank_transfer, cash, check).' example: cash enum: - pix - bank_transfer - cash - check responses: 200: description: '' content: application/json: schema: type: object example: data: id: ab78bc14-d0dd-35c7-94c9-920cb024da3f agency: '6539' account: 5991581-5 type: corrente balance: 7981.19 holder_type: pf alias: fuga limit: 5032.66 available_balance: 13013.85 used_limit: 0 available_limit: 5032.66 is_default: null default_payment_method: null bank: id: null name: null code: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: ab78bc14-d0dd-35c7-94c9-920cb024da3f agency: type: string example: '6539' account: type: string example: 5991581-5 type: type: string example: corrente balance: type: number example: 7981.19 holder_type: type: string example: pf alias: type: string example: fuga limit: type: number example: 5032.66 available_balance: type: number example: 13013.85 used_limit: type: integer example: 0 available_limit: type: number example: 5032.66 is_default: type: string example: null nullable: true default_payment_method: type: string example: null nullable: true bank: type: object properties: id: type: string example: null nullable: true name: type: string example: null nullable: true code: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true 404: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Bank Accounts' /api/bank-accounts: get: summary: 'List bank accounts' operationId: listBankAccounts description: 'List all bank accounts' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: name required: false schema: type: string description: 'Search query.' example: name nullable: true - in: query name: is_default description: 'Filter by default account (1 or 0).' example: true required: false schema: type: boolean description: 'Filter by default account (1 or 0).' example: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 99fa6e8e-6682-3e13-9d96-2e775ed00494 agency: '7870' account: 8958340-3 type: caixa balance: 9318.82 holder_type: pf alias: ipsa limit: 3461.82 available_balance: 12780.64 used_limit: 0 available_limit: 3461.82 is_default: null default_payment_method: null bank: id: null name: null code: null created_at: null updated_at: null - id: 267a0d34-0965-3255-b0b7-371a120eefc2 agency: '0637' account: 4250445-8 type: corrente balance: 4623.3 holder_type: pf alias: sint limit: 9610.01 available_balance: 14233.31 used_limit: 0 available_limit: 9610.01 is_default: null default_payment_method: null bank: id: null name: null code: null created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 99fa6e8e-6682-3e13-9d96-2e775ed00494 agency: '7870' account: 8958340-3 type: caixa balance: 9318.82 holder_type: pf alias: ipsa limit: 3461.82 available_balance: 12780.64 used_limit: 0 available_limit: 3461.82 is_default: null default_payment_method: null bank: id: null name: null code: null created_at: null updated_at: null - id: 267a0d34-0965-3255-b0b7-371a120eefc2 agency: '0637' account: 4250445-8 type: corrente balance: 4623.3 holder_type: pf alias: sint limit: 9610.01 available_balance: 14233.31 used_limit: 0 available_limit: 9610.01 is_default: null default_payment_method: null bank: id: null name: null code: null created_at: null updated_at: null items: type: object properties: id: type: string example: 99fa6e8e-6682-3e13-9d96-2e775ed00494 agency: type: string example: '7870' account: type: string example: 8958340-3 type: type: string example: caixa balance: type: number example: 9318.82 holder_type: type: string example: pf alias: type: string example: ipsa limit: type: number example: 3461.82 available_balance: type: number example: 12780.64 used_limit: type: integer example: 0 available_limit: type: number example: 3461.82 is_default: type: string example: null nullable: true default_payment_method: type: string example: null nullable: true bank: type: object properties: id: type: string example: null nullable: true name: type: string example: null nullable: true code: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Bank Accounts' post: summary: 'Create bank account' operationId: createBankAccount description: 'Create a new bank account' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Bank Accounts' requestBody: required: true content: application/json: schema: type: object properties: agency: type: string description: Agency. example: 'Example Agency' account: type: string description: Account. example: 2585739-0 bank_id: type: string description: 'Bank id. The uuid of an existing record in the banks table.' example: 09968807-d981-31e7-8e09-fcfa381ed118 type: type: string description: Type. example: 'Example Type' enum: - corrente - poupança - caixa holder_type: type: string description: 'Holder type.' example: 'Example Holder type' enum: - pf - pj alias: type: string description: Alias. example: 'Example Alias' balance: type: number description: Balance. example: 1.0 limit: type: number description: Limit. example: 1.0 nullable: true is_default: type: boolean description: 'Is default.' example: true default_payment_method: type: string description: 'Default payment method.' example: 'Example Default payment method' enum: - pix - bank_transfer - cash - check nullable: true required: - agency - account - bank_id - type - holder_type - alias - balance '/api/bank-accounts/{bankAccount}': put: summary: 'Update bank account' operationId: updateBankAccount description: 'Update a bank account' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Bank Accounts' requestBody: required: false content: application/json: schema: type: object properties: agency: type: string description: Agency. example: 'Example Agency' account: type: string description: Account. example: 9584158-8 bank_id: type: string description: 'Bank id. The uuid of an existing record in the banks table.' example: 3500a3f3-41f4-34f5-8d32-35a691a9a0be type: type: string description: Type. example: 'Example Type' enum: - corrente - poupança - caixa holder_type: type: string description: 'Holder type.' example: 'Example Holder type' enum: - pf - pj alias: type: string description: Alias. example: 'Example Alias' nullable: true balance: type: number description: Balance. example: 1.0 limit: type: number description: Limit. example: 1.0 nullable: true is_default: type: boolean description: 'Is default.' example: true default_payment_method: type: string description: 'Default payment method.' example: 'Example Default payment method' enum: - pix - bank_transfer - cash - check nullable: true get: summary: 'Show bank account' operationId: showBankAccount description: 'Show a bank account' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 214040c7-0878-37ea-a5ad-7d5023c7164b agency: '9132' account: 7428767-5 type: poupança balance: 861.89 holder_type: pf alias: dolores limit: 8262.28 available_balance: 9124.17 used_limit: 0 available_limit: 8262.28 is_default: null default_payment_method: null bank: id: null name: null code: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 214040c7-0878-37ea-a5ad-7d5023c7164b agency: type: string example: '9132' account: type: string example: 7428767-5 type: type: string example: poupança balance: type: number example: 861.89 holder_type: type: string example: pf alias: type: string example: dolores limit: type: number example: 8262.28 available_balance: type: number example: 9124.17 used_limit: type: integer example: 0 available_limit: type: number example: 8262.28 is_default: type: string example: null nullable: true default_payment_method: type: string example: null nullable: true bank: type: object properties: id: type: string example: null nullable: true name: type: string example: null nullable: true code: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Bank Accounts' delete: summary: 'Delete bank account' operationId: deleteBankAccount description: 'Delete a bank account' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Bank Accounts' parameters: - in: path name: bankAccount description: '' example: 20 required: true schema: type: integer '/api/bank-accounts/{bankAccount}/statements/summary': get: summary: 'Bank statement summary' operationId: bankStatementSummary description: 'Get aggregated summary for the period' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: opening_balance: number closing_balance: number total_credit: number total_debit: number count: integer date_start: string date_end: string properties: data: type: object properties: opening_balance: type: string example: number closing_balance: type: string example: number total_credit: type: string example: number total_debit: type: string example: number count: type: string example: integer date_start: type: string example: string date_end: type: string example: string tags: - 'Bank Statements' requestBody: required: false content: application/json: schema: type: object properties: date_start: type: string description: 'Date start. O campo value deve ser uma data válida.' example: '2024-01-01' nullable: true date_end: type: string description: 'Date end. O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a date_start.' example: '2024-01-01' nullable: true parameters: - in: path name: bankAccount description: '' example: 5 required: true schema: type: integer '/api/bank-accounts/{bankAccount}/statements': get: summary: 'List bank statements' operationId: listBankStatements description: 'List statements for a bank account. Default period: last 30 days.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: null type: null amount: null balance_after: null description: null date: null statement_date: null created_at: null updated_at: null - id: null type: null amount: null balance_after: null description: null date: null statement_date: null created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: null type: null amount: null balance_after: null description: null date: null statement_date: null created_at: null updated_at: null - id: null type: null amount: null balance_after: null description: null date: null statement_date: null created_at: null updated_at: null items: type: object properties: id: type: string example: null nullable: true type: type: string example: null nullable: true amount: type: string example: null nullable: true balance_after: type: string example: null nullable: true description: type: string example: null nullable: true date: type: string example: null nullable: true statement_date: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Bank Statements' requestBody: required: false content: application/json: schema: type: object properties: sort_by: type: string description: '' example: ipsa nullable: true sort_desc: type: boolean description: '' example: true nullable: true page: type: integer description: 'O campo value deve ser pelo menos 1.' example: 78 nullable: true per_page: type: integer description: 'O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 25 nullable: true q: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: rwhnm nullable: true type: type: string description: '' example: depósito enum: - entrada - saída - tarifa - depósito - saque - transferência - pagamento - juros - ajuste - 'ajuste saída' nullable: true date_start: type: string description: 'O campo value deve ser uma data válida.' example: '2026-08-04T16:37:08' nullable: true date_end: type: string description: 'O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a date_start.' example: '2100-12-30' nullable: true cash_flow_id: type: string description: 'The uuid of an existing record in the cash_flows table.' example: null nullable: true parameters: - in: path name: bankAccount description: '' example: 20 required: true schema: type: integer '/api/bank-accounts/{bankAccount}/statements/{bankStatement}': get: summary: 'Show bank statement' operationId: showBankStatement description: 'Show a specific statement entry' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: null type: null amount: null balance_after: null description: null date: null statement_date: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: null nullable: true type: type: string example: null nullable: true amount: type: string example: null nullable: true balance_after: type: string example: null nullable: true description: type: string example: null nullable: true date: type: string example: null nullable: true statement_date: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Bank Statements' parameters: - in: path name: bankAccount description: '' example: 1 required: true schema: type: integer - in: path name: bankStatement description: '' example: dolore required: true schema: type: string /api/banks: get: summary: 'List banks' operationId: listBanks description: 'List all banks' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: 'Permission name' required: false schema: type: string description: 'Search query.' example: 'Permission name' nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 7af3e89d-c020-3450-8160-8f10a53cfe00 name: Queirós-Domingues code: '673' - id: ef81f769-2345-38d4-99e8-7a3cfafe476e name: 'Queirós S.A.' code: '911' links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 7af3e89d-c020-3450-8160-8f10a53cfe00 name: Queirós-Domingues code: '673' - id: ef81f769-2345-38d4-99e8-7a3cfafe476e name: 'Queirós S.A.' code: '911' items: type: object properties: id: type: string example: 7af3e89d-c020-3450-8160-8f10a53cfe00 name: type: string example: Queirós-Domingues code: type: string example: '673' links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Banks post: summary: 'Create bank' operationId: createBank description: 'Create a new bank' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Banks requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Name. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' code: type: string description: 'Code. O campo value não pode ser superior a 255 caracteres.' example: 'Example Code' required: - name - code '/api/banks/{bank}': put: summary: 'Update bank' operationId: updateBank description: 'Update a bank' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Banks requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Name. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' code: type: string description: 'Code. O campo value não pode ser superior a 255 caracteres.' example: 'Example Code' get: summary: 'Show bank' operationId: showBank description: 'Show a bank' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 1231a068-90a6-3190-9628-a0f2517b40f8 name: 'Uchoa e Jimenes Ltda.' code: '581' properties: data: type: object properties: id: type: string example: 1231a068-90a6-3190-9628-a0f2517b40f8 name: type: string example: 'Uchoa e Jimenes Ltda.' code: type: string example: '581' tags: - Banks delete: summary: 'Delete bank' operationId: deleteBank description: 'Delete a bank' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Banks parameters: - in: path name: bank description: 'The bank.' example: 1 required: true schema: type: integer '/api/cep/{cep}': get: summary: 'Search CEP' operationId: searchCEP description: 'Search for address information by CEP (Brazilian postal code)' parameters: [] responses: 200: description: '' content: application/json: schema: oneOf: - description: 'CEP found successfully' type: object example: data: cep: '01001000' street: 'Praça da Sé' district: Sé city: 'São Paulo' state: SP complement: 'lado ímpar' ibge: '3550308' ddd: '11' siafi: '7107' properties: data: type: object properties: cep: type: string example: '01001000' street: type: string example: 'Praça da Sé' district: type: string example: Sé city: type: string example: 'São Paulo' state: type: string example: SP complement: type: string example: 'lado ímpar' ibge: type: string example: '3550308' ddd: type: string example: '11' siafi: type: string example: '7107' - description: 'CEP not found' type: object example: data: cep: '99999999' street: null district: null city: null state: null complement: null ibge: null ddd: null siafi: null properties: data: type: object properties: cep: type: string example: '99999999' street: type: string example: null nullable: true district: type: string example: null nullable: true city: type: string example: null nullable: true state: type: string example: null nullable: true complement: type: string example: null nullable: true ibge: type: string example: null nullable: true ddd: type: string example: null nullable: true siafi: type: string example: null nullable: true tags: - CEP parameters: - in: path name: cep description: 'CEP to search for' example: '01001000' required: true schema: type: string /api/cash-flows/summary: get: summary: 'Get cash flow summary' operationId: getCashFlowSummary description: 'Get cash flow summary' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: Salary required: false schema: type: string description: 'Search query.' example: Salary nullable: true - in: query name: cash_session description: 'Cash session. The uuid of an existing record in the cash_sessions table.' example: uuid required: false schema: type: string description: 'Cash session. The uuid of an existing record in the cash_sessions table.' example: uuid nullable: true - in: query name: type description: 'Cash flow type.' example: entrada required: false schema: type: string description: 'Cash flow type.' example: entrada enum: - entrada - saída - tarifa - depósito - saque - transferência - pagamento - juros - ajuste - 'ajuste saída' nullable: true - in: query name: description description: 'Description .' example: 'Numquam velit ut delectus iure.' required: false schema: type: string description: 'Description .' example: 'Numquam velit ut delectus iure.' - in: query name: categories description: 'The uuid of an existing record in the transaction_categories table.' example: - quibusdam required: false schema: type: array description: 'The uuid of an existing record in the transaction_categories table.' example: - quibusdam items: type: string - in: query name: date_start description: 'Start date. O campo value deve ser uma data válida.' example: '2021-01-01' required: false schema: type: string description: 'Start date. O campo value deve ser uma data válida.' example: '2021-01-01' nullable: true - in: query name: date_end description: 'End date. O campo value deve ser uma data válida.' example: '2021-01-31' required: false schema: type: string description: 'End date. O campo value deve ser uma data válida.' example: '2021-01-31' nullable: true - in: query name: bank_accounts description: 'The uuid of an existing record in the bank_accounts table.' example: - sed required: false schema: type: array description: 'The uuid of an existing record in the bank_accounts table.' example: - sed items: type: string - in: query name: customers description: 'The uuid of an existing record in the customers table.' example: - eligendi required: false schema: type: array description: 'The uuid of an existing record in the customers table.' example: - eligendi items: type: string - in: query name: suppliers description: 'The uuid of an existing record in the suppliers table.' example: - accusantium required: false schema: type: array description: 'The uuid of an existing record in the suppliers table.' example: - accusantium items: type: string - in: query name: works description: 'The uuid of an existing record in the works table.' example: - illo required: false schema: type: array description: 'The uuid of an existing record in the works table.' example: - illo items: type: string responses: 200: description: '' content: application/json: schema: type: object example: data: total_income: number total_expense: number total_fee: number total_balance: number properties: data: type: object properties: total_income: type: string example: number total_expense: type: string example: number total_fee: type: string example: number total_balance: type: string example: number tags: - 'Cash Flow' /api/cash-flows: get: summary: 'List cash flow' operationId: listCashFlow description: 'List all cash flow' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: Salary required: false schema: type: string description: 'Search query.' example: Salary nullable: true - in: query name: cash_session description: 'Cash session. The uuid of an existing record in the cash_sessions table.' example: uuid required: false schema: type: string description: 'Cash session. The uuid of an existing record in the cash_sessions table.' example: uuid nullable: true - in: query name: type description: 'Cash flow type.' example: entrada required: false schema: type: string description: 'Cash flow type.' example: entrada enum: - entrada - saída - tarifa - depósito - saque - transferência - pagamento - juros - ajuste - 'ajuste saída' nullable: true - in: query name: description description: 'Description .' example: 'In ad illum beatae assumenda quos quam laudantium.' required: false schema: type: string description: 'Description .' example: 'In ad illum beatae assumenda quos quam laudantium.' - in: query name: categories description: 'The uuid of an existing record in the transaction_categories table.' example: - laborum required: false schema: type: array description: 'The uuid of an existing record in the transaction_categories table.' example: - laborum items: type: string - in: query name: date_start description: 'Start date. O campo value deve ser uma data válida.' example: '2021-01-01' required: false schema: type: string description: 'Start date. O campo value deve ser uma data válida.' example: '2021-01-01' nullable: true - in: query name: date_end description: 'End date. O campo value deve ser uma data válida.' example: '2021-01-31' required: false schema: type: string description: 'End date. O campo value deve ser uma data válida.' example: '2021-01-31' nullable: true - in: query name: bank_accounts description: 'The uuid of an existing record in the bank_accounts table.' example: - voluptatibus required: false schema: type: array description: 'The uuid of an existing record in the bank_accounts table.' example: - voluptatibus items: type: string - in: query name: customers description: 'The uuid of an existing record in the customers table.' example: - deleniti required: false schema: type: array description: 'The uuid of an existing record in the customers table.' example: - deleniti items: type: string - in: query name: suppliers description: 'The uuid of an existing record in the suppliers table.' example: - odio required: false schema: type: array description: 'The uuid of an existing record in the suppliers table.' example: - odio items: type: string - in: query name: works description: 'The uuid of an existing record in the works table.' example: - reiciendis required: false schema: type: array description: 'The uuid of an existing record in the works table.' example: - reiciendis items: type: string responses: 200: description: '' content: application/json: schema: type: object example: data: - id: d3df90a3-dd2f-3755-aad2-8f9bde5b841c code: FC-46689259 type: saída amount: -6497.22 description: 'Facere minima aut quia ut qui dolorem.' transaction_date: '2021-09-10T03:00:00.000000Z' transaction_category: id: null name: null type: null created_at: null updated_at: null - id: 96b23704-16df-3f79-8d2f-cb6be69b8786 code: FC-12909739 type: transferência amount: -4521.07 description: 'In et voluptatem sit error facilis nostrum.' transaction_date: '2007-10-02T03:00:00.000000Z' transaction_category: id: null name: null type: null created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: d3df90a3-dd2f-3755-aad2-8f9bde5b841c code: FC-46689259 type: saída amount: -6497.22 description: 'Facere minima aut quia ut qui dolorem.' transaction_date: '2021-09-10T03:00:00.000000Z' transaction_category: id: null name: null type: null created_at: null updated_at: null - id: 96b23704-16df-3f79-8d2f-cb6be69b8786 code: FC-12909739 type: transferência amount: -4521.07 description: 'In et voluptatem sit error facilis nostrum.' transaction_date: '2007-10-02T03:00:00.000000Z' transaction_category: id: null name: null type: null created_at: null updated_at: null items: type: object properties: id: type: string example: d3df90a3-dd2f-3755-aad2-8f9bde5b841c code: type: string example: FC-46689259 type: type: string example: saída amount: type: number example: -6497.22 description: type: string example: 'Facere minima aut quia ut qui dolorem.' transaction_date: type: string example: '2021-09-10T03:00:00.000000Z' transaction_category: type: object properties: id: type: string example: null nullable: true name: type: string example: null nullable: true type: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Cash Flow' post: summary: 'Create cash flow' operationId: createCashFlow description: 'Create a new cash flow' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Cash Flow' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: Type. example: 'Example Type' enum: - entrada - saída - tarifa - depósito - saque - transferência - pagamento - juros - ajuste - 'ajuste saída' cash_session_id: type: string description: 'Cash session id. The uuid of an existing record in the cash_sessions table.' example: dff1c295-47bd-31a6-b035-c43ebea7f0ea transaction_category_id: type: string description: 'Transaction category id. The uuid of an existing record in the transaction_categories table.' example: c0a0f41c-c37a-34fa-8804-4df45e912188 bank_account_id: type: string description: 'Bank account id. The uuid of an existing record in the bank_accounts table.' example: 4c2d7cbc-18f2-3b2e-bd66-985669257382 nullable: true customer_id: type: string description: 'Customer id. The uuid of an existing record in the customers table.' example: fd6b7bcf-cfa4-36e7-8724-7662a9a86e30 nullable: true supplier_id: type: string description: 'Supplier id. The uuid of an existing record in the suppliers table.' example: b7ac8249-952e-3e34-80f2-bf6d8c444f4f nullable: true work_id: type: string description: 'Work id. The uuid of an existing record in the works table.' example: 18b93b4f-0cce-338a-a6bc-a9a1ef32fe7b nullable: true amount: type: number description: Amount. example: 1.0 description: type: string description: Description. example: 'Example Description' nullable: true transaction_date: type: string description: 'Transaction date. O campo value deve ser uma data válida.' example: '2024-01-01' required: - type - cash_session_id - amount - transaction_date '/api/cash-flows/{cashFlow}': get: summary: 'Show cash flow' operationId: showCashFlow description: 'Show a cash flow' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: adb917ca-4900-3cb8-8747-c2121e16bfe1 code: FC-84269109 type: transferência amount: -4166.17 description: 'Libero omnis occaecati veritatis quibusdam.' transaction_date: '2014-07-05T03:00:00.000000Z' transaction_category: id: null name: null type: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: adb917ca-4900-3cb8-8747-c2121e16bfe1 code: type: string example: FC-84269109 type: type: string example: transferência amount: type: number example: -4166.17 description: type: string example: 'Libero omnis occaecati veritatis quibusdam.' transaction_date: type: string example: '2014-07-05T03:00:00.000000Z' transaction_category: type: object properties: id: type: string example: null nullable: true name: type: string example: null nullable: true type: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Cash Flow' put: summary: 'Update cash flow' operationId: updateCashFlow description: 'Update a cash flow' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Cash Flow' requestBody: required: false content: application/json: schema: type: object properties: type: type: string description: Type. example: 'Example Type' enum: - entrada - saída - tarifa - depósito - saque - transferência - pagamento - juros - ajuste - 'ajuste saída' cash_session_id: type: string description: 'Cash session id. The uuid of an existing record in the cash_sessions table.' example: ec846751-1e12-35c8-8e1f-de148413bca1 transaction_category_id: type: string description: 'Transaction category id. The uuid of an existing record in the transaction_categories table.' example: f8e4f1d5-fe91-33ba-8329-fe8fee57163b bank_account_id: type: string description: 'Bank account id. The uuid of an existing record in the bank_accounts table.' example: 9b43109d-cd3d-347b-b62c-7f4fc85accd9 nullable: true customer_id: type: string description: 'Customer id. The uuid of an existing record in the customers table.' example: c05bc298-ad58-3ad4-846b-23e340e61fd5 nullable: true supplier_id: type: string description: 'Supplier id. The uuid of an existing record in the suppliers table.' example: 575f2019-bcfe-3d3f-b697-6b3750ac7876 nullable: true work_id: type: string description: 'Work id. The uuid of an existing record in the works table.' example: ab50d3cf-884b-3126-b99f-1b6265548e9d nullable: true amount: type: number description: Amount. example: 1.0 description: type: string description: Description. example: 'Example Description' nullable: true transaction_date: type: string description: 'Transaction date. O campo value deve ser uma data válida.' example: '2024-01-01' delete: summary: 'Delete cash flow' operationId: deleteCashFlow description: 'Delete a cash flow' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Cash Flow' parameters: - in: path name: cashFlow description: '' example: 16 required: true schema: type: integer /api/cash-sessions: get: summary: 'List cash session' operationId: listCashSession description: 'List all cash session' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 5257c447-8ef4-3fdc-8a2b-84c5cac7edcb code: null opened_by: null opened_at: '2023-11-23T11:13:09.000000Z' closed_by: null closed_at: '2012-08-15T00:10:33.000000Z' opening_balance: 2520.79 closing_balance: 1761.87 total_income: 0 total_expense: 0 total_balance: 0 status: Fechado hasSnapshot: false created_at: '2017-05-08T08:32:08.000000Z' updated_at: '1996-06-15T23:30:34.000000Z' - id: 2189161f-32d6-36a4-af10-ec76435a3a38 code: null opened_by: null opened_at: '1972-07-19T06:02:04.000000Z' closed_by: null closed_at: '2004-05-20T02:55:29.000000Z' opening_balance: 1461.19 closing_balance: 8440.21 total_income: 0 total_expense: 0 total_balance: 0 status: Fechado hasSnapshot: false created_at: '1998-05-16T16:10:26.000000Z' updated_at: '1997-06-23T19:23:27.000000Z' links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 5257c447-8ef4-3fdc-8a2b-84c5cac7edcb code: null opened_by: null opened_at: '2023-11-23T11:13:09.000000Z' closed_by: null closed_at: '2012-08-15T00:10:33.000000Z' opening_balance: 2520.79 closing_balance: 1761.87 total_income: 0 total_expense: 0 total_balance: 0 status: Fechado hasSnapshot: false created_at: '2017-05-08T08:32:08.000000Z' updated_at: '1996-06-15T23:30:34.000000Z' - id: 2189161f-32d6-36a4-af10-ec76435a3a38 code: null opened_by: null opened_at: '1972-07-19T06:02:04.000000Z' closed_by: null closed_at: '2004-05-20T02:55:29.000000Z' opening_balance: 1461.19 closing_balance: 8440.21 total_income: 0 total_expense: 0 total_balance: 0 status: Fechado hasSnapshot: false created_at: '1998-05-16T16:10:26.000000Z' updated_at: '1997-06-23T19:23:27.000000Z' items: type: object properties: id: type: string example: 5257c447-8ef4-3fdc-8a2b-84c5cac7edcb code: type: string example: null nullable: true opened_by: type: string example: null nullable: true opened_at: type: string example: '2023-11-23T11:13:09.000000Z' closed_by: type: string example: null nullable: true closed_at: type: string example: '2012-08-15T00:10:33.000000Z' opening_balance: type: number example: 2520.79 closing_balance: type: number example: 1761.87 total_income: type: integer example: 0 total_expense: type: integer example: 0 total_balance: type: integer example: 0 status: type: string example: Fechado hasSnapshot: type: boolean example: false created_at: type: string example: '2017-05-08T08:32:08.000000Z' updated_at: type: string example: '1996-06-15T23:30:34.000000Z' links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Cash Session' /api/cash-sessions/open: post: summary: 'Open cash session' operationId: openCashSession description: 'Open a new cash session' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 2b993a65-1fb6-3c31-8104-fc6397b777ab code: null opened_by: null opened_at: '2010-06-16T10:32:37.000000Z' closed_by: null closed_at: '1985-07-24T01:19:33.000000Z' opening_balance: 2168.71 closing_balance: 3166.19 total_income: 0 total_expense: 0 total_balance: 0 status: Aberto hasSnapshot: false created_at: '2025-10-23T08:02:31.000000Z' updated_at: '1972-07-27T03:54:05.000000Z' properties: data: type: object properties: id: type: string example: 2b993a65-1fb6-3c31-8104-fc6397b777ab code: type: string example: null nullable: true opened_by: type: string example: null nullable: true opened_at: type: string example: '2010-06-16T10:32:37.000000Z' closed_by: type: string example: null nullable: true closed_at: type: string example: '1985-07-24T01:19:33.000000Z' opening_balance: type: number example: 2168.71 closing_balance: type: number example: 3166.19 total_income: type: integer example: 0 total_expense: type: integer example: 0 total_balance: type: integer example: 0 status: type: string example: Aberto hasSnapshot: type: boolean example: false created_at: type: string example: '2025-10-23T08:02:31.000000Z' updated_at: type: string example: '1972-07-27T03:54:05.000000Z' tags: - 'Cash Session' '/api/cash-sessions/close/{uuid}': post: summary: 'Close cash session' operationId: closeCashSession description: 'Close a cash session' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Cash Session' parameters: - in: path name: uuid description: '' example: 5c92b1fb-8c92-357f-b669-3ddb571b7de7 required: true schema: type: string '/api/cash-sessions/{uuid}/account-snapshot': get: summary: 'Cash session account snapshot' operationId: cashSessionAccountSnapshot description: 'List the account balance snapshot captured when the cash session was closed' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Cash Session' parameters: - in: path name: uuid description: '' example: 3fbd8864-1dfb-3577-89ac-50d69885495a required: true schema: type: integer '/api/cash-sessions/{uuid}': get: summary: 'Show cash session' operationId: showCashSession description: 'Show a cash session' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 2d1bf7ad-1b02-3ffd-8937-da87d8d855ef code: null opened_by: null opened_at: '1991-10-09T14:47:41.000000Z' closed_by: null closed_at: '1996-04-30T18:33:41.000000Z' opening_balance: 1906.35 closing_balance: 1781.7 total_income: 0 total_expense: 0 total_balance: 0 status: Fechado hasSnapshot: false created_at: '1996-08-06T17:28:44.000000Z' updated_at: '1994-11-25T12:20:54.000000Z' properties: data: type: object properties: id: type: string example: 2d1bf7ad-1b02-3ffd-8937-da87d8d855ef code: type: string example: null nullable: true opened_by: type: string example: null nullable: true opened_at: type: string example: '1991-10-09T14:47:41.000000Z' closed_by: type: string example: null nullable: true closed_at: type: string example: '1996-04-30T18:33:41.000000Z' opening_balance: type: number example: 1906.35 closing_balance: type: number example: 1781.7 total_income: type: integer example: 0 total_expense: type: integer example: 0 total_balance: type: integer example: 0 status: type: string example: Fechado hasSnapshot: type: boolean example: false created_at: type: string example: '1996-08-06T17:28:44.000000Z' updated_at: type: string example: '1994-11-25T12:20:54.000000Z' tags: - 'Cash Session' delete: summary: 'Delete cash session' operationId: deleteCashSession description: 'Delete a cash session' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Cash Session' parameters: - in: path name: uuid description: '' example: 9b524a1e-fc28-3198-8e46-d46b19721f4f required: true schema: type: integer /api/contracts: get: summary: 'List contracts' operationId: listContracts description: 'List all work contracts' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: b4bdb518-4dd1-3e60-a371-69312c2c4e34 number: 092/2026 started_at: '2026-08-04' deadline_at: '2027-08-04' work: id: a26c93fb-ab3b-42b7-8d9c-6a884cd9fa6b name: 'Sofia Noelí Zambrano' created_at: null updated_at: null - id: 79c8dfb2-61e6-3175-a616-a74fe43c1c70 number: 868/2026 started_at: '2026-08-04' deadline_at: '2027-08-04' work: id: a26c93fb-b8eb-405c-8348-19d2af4626da name: 'Dr. Andressa Jaqueline Soares Neto' created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: b4bdb518-4dd1-3e60-a371-69312c2c4e34 number: 092/2026 started_at: '2026-08-04' deadline_at: '2027-08-04' work: id: a26c93fb-ab3b-42b7-8d9c-6a884cd9fa6b name: 'Sofia Noelí Zambrano' created_at: null updated_at: null - id: 79c8dfb2-61e6-3175-a616-a74fe43c1c70 number: 868/2026 started_at: '2026-08-04' deadline_at: '2027-08-04' work: id: a26c93fb-b8eb-405c-8348-19d2af4626da name: 'Dr. Andressa Jaqueline Soares Neto' created_at: null updated_at: null items: type: object properties: id: type: string example: b4bdb518-4dd1-3e60-a371-69312c2c4e34 number: type: string example: 092/2026 started_at: type: string example: '2026-08-04' deadline_at: type: string example: '2027-08-04' work: type: object properties: id: type: string example: a26c93fb-ab3b-42b7-8d9c-6a884cd9fa6b name: type: string example: 'Sofia Noelí Zambrano' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Contracts requestBody: required: false content: application/json: schema: type: object properties: sort_by: type: string description: 'Sort by.' example: 'Example Sort by' nullable: true sort_desc: type: boolean description: 'Sort desc.' example: true nullable: true page: type: integer description: 'Page. O campo value deve ser pelo menos 1.' example: 1 nullable: true per_page: type: integer description: 'Per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 1 nullable: true work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: 83a2da2b-63c9-3006-80ba-77c3957a3e0c nullable: true post: summary: 'Create contract' operationId: createContract description: 'Create a new contract for a work' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - Contracts requestBody: required: true content: application/json: schema: type: object properties: work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: 5f7e6924-fd60-34d3-836d-f8a9cd0a53c8 number: type: string description: 'Número do contrato. O campo value não pode ser superior a 255 caracteres.' example: 'Example Number' started_at: type: string description: 'Data de início. O campo value deve ser uma data válida.' example: 'Example Started at' nullable: true deadline_at: type: string description: 'Prazo. O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a started_at.' example: 'Example Deadline at' nullable: true required: - work_id - number '/api/contracts/{id}': get: summary: 'Show contract' operationId: showContract description: 'Show a work contract' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 0236136e-560b-3c50-90a6-89eee6d4d661 number: 397/2026 started_at: '2026-08-04' deadline_at: '2027-08-04' work: id: a26c93fb-c637-4281-b867-6ed87da7306c name: 'Eloá Ariana Ramos' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 0236136e-560b-3c50-90a6-89eee6d4d661 number: type: string example: 397/2026 started_at: type: string example: '2026-08-04' deadline_at: type: string example: '2027-08-04' work: type: object properties: id: type: string example: a26c93fb-c637-4281-b867-6ed87da7306c name: type: string example: 'Eloá Ariana Ramos' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Contracts put: summary: 'Update contract' operationId: updateContract description: 'Update a work contract' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - Contracts requestBody: required: false content: application/json: schema: type: object properties: number: type: string description: 'Número do contrato. O campo value não pode ser superior a 255 caracteres.' example: 'Example Number' started_at: type: string description: 'Data de início. O campo value deve ser uma data válida.' example: 'Example Started at' nullable: true deadline_at: type: string description: 'Prazo. O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a started_at.' example: 'Example Deadline at' nullable: true parameters: - in: path name: id description: 'The ID of the contract.' example: 7 required: true schema: type: integer - in: path name: contract description: 'Contract UUID' example: vitae required: true schema: type: string '/api/contracts/{contract}': delete: summary: 'Delete contract' operationId: deleteContract description: 'Delete a work contract' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Contracts parameters: - in: path name: contract description: 'Contract UUID' example: et required: true schema: type: string /api/customers: get: summary: 'List customers' operationId: listCustomers description: 'List all customers' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: 'Customer name' required: false schema: type: string description: 'Search query.' example: 'Customer name' nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 055f3ce3-d0e3-34cc-ade5-a07ebd883366 name: 'David Pereira Barreto' email: melinda04@example.org phone: '(18) 90141-8736' document: 476.343.538-84 type: pj responsible: 'Dr. Hortência Estrada Benez Sobrinho' image: id: null url: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null documents_count: 0 - id: 2efda8f2-b99c-3da4-9767-2d34885b230c name: 'Srta. Simone Verdara Neto' email: zneves@example.net phone: '(41) 90999-8062' document: 920.866.658-14 type: pf responsible: 'Sr. Lorenzo Ramos' image: id: null url: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null documents_count: 0 links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 055f3ce3-d0e3-34cc-ade5-a07ebd883366 name: 'David Pereira Barreto' email: melinda04@example.org phone: '(18) 90141-8736' document: 476.343.538-84 type: pj responsible: 'Dr. Hortência Estrada Benez Sobrinho' image: id: null url: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null documents_count: 0 - id: 2efda8f2-b99c-3da4-9767-2d34885b230c name: 'Srta. Simone Verdara Neto' email: zneves@example.net phone: '(41) 90999-8062' document: 920.866.658-14 type: pf responsible: 'Sr. Lorenzo Ramos' image: id: null url: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null documents_count: 0 items: type: object properties: id: type: string example: 055f3ce3-d0e3-34cc-ade5-a07ebd883366 name: type: string example: 'David Pereira Barreto' email: type: string example: melinda04@example.org phone: type: string example: '(18) 90141-8736' document: type: string example: 476.343.538-84 type: type: string example: pj responsible: type: string example: 'Dr. Hortência Estrada Benez Sobrinho' image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true address: type: object properties: street: type: string example: null nullable: true number: type: string example: null nullable: true complement: type: string example: null nullable: true neighborhood: type: string example: null nullable: true city: type: string example: null nullable: true state: type: string example: null nullable: true zip_code: type: string example: null nullable: true documents_count: type: integer example: 0 links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Customers post: summary: 'Create customer' operationId: createCustomer description: 'Create a new customer' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Customers requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' email: type: string description: 'E-mail. O campo value deve ser um endereço de e-mail válido.' example: user@example.com phone: type: string description: Telefone. example: '(11) 99999-9999' document: type: string description: CPF/CNPJ. example: 'Example Document' type: type: string description: Tipo. example: 'Example Type' enum: - pf - pj responsible: type: string description: Responsável. example: 'Example Responsible' nullable: true image: type: object description: Imagem. example: - example1 - example2 properties: path: type: string description: 'Caminho da imagem. This field is required when image is present.' example: 'Example Image path' name: type: string description: 'Nome da imagem.' example: 'Example Name' nullable: true extension: type: string description: 'Extensão da imagem.' example: 'Example Image extension' nullable: true size: type: string description: 'Tamanho da imagem.' example: 'Example Image size' nullable: true address: type: object description: Endereço. example: - example1 - example2 properties: street: type: string description: Rua. example: 'Example Address street' number: type: string description: Número. example: 'Example Address number' complement: type: string description: Complemento. example: 'Example Address complement' neighborhood: type: string description: Bairro. example: 'Example Address neighborhood' city: type: string description: Cidade. example: 'Example Address city' state: type: string description: Estado. example: 'Example Address state' zip_code: type: string description: CEP. example: 'Example Address zip code' required: - street - number - neighborhood - city - state - zip_code required: - name - document - type - address '/api/customers/{id}': get: summary: 'Get customer' operationId: getCustomer description: 'Get a customer' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 0778bc51-1e79-3bd7-93c0-708d4b1a9707 name: 'Sophia Daniella Delatorre Filho' email: diogo.rezende@example.org phone: '(81) 3429-5457' document: 205.703.010-50 type: pf responsible: 'Sr. Agostinho Fabrício Fernandes' image: id: null url: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null documents_count: 0 properties: data: type: object properties: id: type: string example: 0778bc51-1e79-3bd7-93c0-708d4b1a9707 name: type: string example: 'Sophia Daniella Delatorre Filho' email: type: string example: diogo.rezende@example.org phone: type: string example: '(81) 3429-5457' document: type: string example: 205.703.010-50 type: type: string example: pf responsible: type: string example: 'Sr. Agostinho Fabrício Fernandes' image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true address: type: object properties: street: type: string example: null nullable: true number: type: string example: null nullable: true complement: type: string example: null nullable: true neighborhood: type: string example: null nullable: true city: type: string example: null nullable: true state: type: string example: null nullable: true zip_code: type: string example: null nullable: true documents_count: type: integer example: 0 tags: - Customers put: summary: 'Update customer' operationId: updateCustomer description: 'Update a customer' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Customers requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' email: type: string description: 'E-mail. O campo value deve ser um endereço de e-mail válido.' example: user@example.com phone: type: string description: Telefone. example: '(11) 99999-9999' document: type: string description: CPF/CNPJ. example: 'Example Document' type: type: string description: Tipo. example: 'Example Type' enum: - pf - pj responsible: type: string description: Responsável. example: 'Example Responsible' nullable: true image: type: object description: Imagem. example: - example1 - example2 properties: path: type: string description: 'Caminho da imagem. This field is required when image is present.' example: 'Example Image path' name: type: string description: 'Nome da imagem.' example: 'Example Name' nullable: true extension: type: string description: 'Extensão da imagem.' example: 'Example Image extension' nullable: true size: type: string description: 'Tamanho da imagem.' example: 'Example Image size' nullable: true address: type: object description: Endereço. example: - example1 - example2 properties: street: type: string description: Rua. example: 'Example Address street' number: type: string description: Número. example: 'Example Address number' complement: type: string description: Complemento. example: 'Example Address complement' neighborhood: type: string description: Bairro. example: 'Example Address neighborhood' city: type: string description: Cidade. example: 'Example Address city' state: type: string description: Estado. example: 'Example Address state' zip_code: type: string description: CEP. example: 'Example Address zip code' parameters: - in: path name: id description: 'The ID of the customer.' example: 13 required: true schema: type: integer - in: path name: customer description: 'Customer ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/customers/{customer}': delete: summary: 'Delete customer' operationId: deleteCustomer description: 'Delete a customer' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Customers parameters: - in: path name: customer description: 'Customer ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string /api/daily-logs: get: summary: 'List daily logs' operationId: listDailyLogs description: 'List all daily work reports (RDO)' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 9b1cbc60-a69c-3dd2-bd50-6974e9eaa8da code: RDO-001 report_number: 1 date: '2026-08-04' status: id: a26c93fc-189d-49fc-8889-cf8695654dfb slug: null name: null abbreviation: et color: '#7d341c' text_color: '#da3eee' work: id: a26c93fc-0ea9-41da-bfd7-73d56b75a188 name: 'Vicente Oliveira Filho' started_at: '1979-12-20 00:03:17' filled_by: id: a26c93fc-14d5-4943-8498-b717a7ce32d0 name: 'Janice Murray' contract_number: 029/2026 deadline_at: '2027-08-04' technical_responsible: name: null certification: null crea: null activities: [] occurrences: null next_day_forecast: null finalized_at: null content_hash: null gov_br_validation_url: null created_at: null updated_at: null - id: 3ab3521d-6d5f-334c-9170-affbd69d901f code: RDO-001 report_number: 1 date: '2026-08-04' status: id: a26c93fc-2429-470a-960f-ea5fdab880d0 slug: null name: null abbreviation: ipsum color: '#c3cde8' text_color: '#701f6e' work: id: a26c93fc-1da7-4c18-8dfa-24f14cad3668 name: 'Isabelly Vieira Faro' started_at: '2022-11-10 10:48:52' filled_by: id: a26c93fc-2260-4f43-8ba8-06e97ed931c6 name: 'Dr. Collin Crooks PhD' contract_number: 718/2026 deadline_at: '2027-08-04' technical_responsible: name: null certification: null crea: null activities: [] occurrences: null next_day_forecast: null finalized_at: null content_hash: null gov_br_validation_url: null created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 9b1cbc60-a69c-3dd2-bd50-6974e9eaa8da code: RDO-001 report_number: 1 date: '2026-08-04' status: id: a26c93fc-189d-49fc-8889-cf8695654dfb slug: null name: null abbreviation: et color: '#7d341c' text_color: '#da3eee' work: id: a26c93fc-0ea9-41da-bfd7-73d56b75a188 name: 'Vicente Oliveira Filho' started_at: '1979-12-20 00:03:17' filled_by: id: a26c93fc-14d5-4943-8498-b717a7ce32d0 name: 'Janice Murray' contract_number: 029/2026 deadline_at: '2027-08-04' technical_responsible: name: null certification: null crea: null activities: [] occurrences: null next_day_forecast: null finalized_at: null content_hash: null gov_br_validation_url: null created_at: null updated_at: null - id: 3ab3521d-6d5f-334c-9170-affbd69d901f code: RDO-001 report_number: 1 date: '2026-08-04' status: id: a26c93fc-2429-470a-960f-ea5fdab880d0 slug: null name: null abbreviation: ipsum color: '#c3cde8' text_color: '#701f6e' work: id: a26c93fc-1da7-4c18-8dfa-24f14cad3668 name: 'Isabelly Vieira Faro' started_at: '2022-11-10 10:48:52' filled_by: id: a26c93fc-2260-4f43-8ba8-06e97ed931c6 name: 'Dr. Collin Crooks PhD' contract_number: 718/2026 deadline_at: '2027-08-04' technical_responsible: name: null certification: null crea: null activities: [] occurrences: null next_day_forecast: null finalized_at: null content_hash: null gov_br_validation_url: null created_at: null updated_at: null items: type: object properties: id: type: string example: 9b1cbc60-a69c-3dd2-bd50-6974e9eaa8da code: type: string example: RDO-001 report_number: type: integer example: 1 date: type: string example: '2026-08-04' status: type: object properties: id: type: string example: a26c93fc-189d-49fc-8889-cf8695654dfb slug: type: string example: null nullable: true name: type: string example: null nullable: true abbreviation: type: string example: et color: type: string example: '#7d341c' text_color: type: string example: '#da3eee' work: type: object properties: id: type: string example: a26c93fc-0ea9-41da-bfd7-73d56b75a188 name: type: string example: 'Vicente Oliveira Filho' started_at: type: string example: '1979-12-20 00:03:17' filled_by: type: object properties: id: type: string example: a26c93fc-14d5-4943-8498-b717a7ce32d0 name: type: string example: 'Janice Murray' contract_number: type: string example: 029/2026 deadline_at: type: string example: '2027-08-04' technical_responsible: type: object properties: name: type: string example: null nullable: true certification: type: string example: null nullable: true crea: type: string example: null nullable: true activities: type: array example: [] occurrences: type: string example: null nullable: true next_day_forecast: type: string example: null nullable: true finalized_at: type: string example: null nullable: true content_hash: type: string example: null nullable: true gov_br_validation_url: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Daily Logs (RDO)' requestBody: required: false content: application/json: schema: type: object properties: sort_by: type: string description: 'Sort by.' example: 'Example Sort by' nullable: true sort_desc: type: boolean description: 'Sort desc.' example: true nullable: true page: type: integer description: 'Page. O campo value deve ser pelo menos 1.' example: 1 nullable: true per_page: type: integer description: 'Per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 1 nullable: true work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: fadb3131-0a17-378b-b95c-985a630662da nullable: true contract_id: type: string description: 'Contrato. The uuid of an existing record in the contracts table.' example: f3523054-be92-312d-a734-c954e2f52bd2 nullable: true status_id: type: string description: 'Status. The uuid of an existing record in the statuses table.' example: 1170fc66-e63e-3048-939c-193a48efda4d nullable: true filled_by: type: string description: 'Preenchido por. The uuid of an existing record in the users table.' example: dad38031-e0dd-305c-b150-3a142abbef46 nullable: true responsible_id: type: string description: 'Responsável. The uuid of an existing record in the users table.' example: 5e07a060-e038-3523-88f9-d14c766a2097 nullable: true date_from: type: string description: 'Data inicial. O campo value deve ser uma data válida.' example: '2024-01-01' nullable: true date_to: type: string description: 'Data final. O campo value deve ser uma data válida.' example: '2024-01-01' nullable: true post: summary: 'Create daily log' operationId: createDailyLog description: 'Open a new daily work report (RDO) for a work' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Daily Logs (RDO)' requestBody: required: true content: application/json: schema: type: object properties: contract_id: type: string description: 'Contrato. The uuid of an existing record in the contracts table.' example: 'Example Contract id' date: type: string description: 'Data do RDO. O campo value deve ser uma data válida.' example: '2024-01-01' status_id: type: string description: 'Status. The uuid of an existing record in the statuses table.' example: f2d74da8-053a-3931-9d4b-6df9e363910f nullable: true required: - contract_id - date /api/daily-logs/pending-days: get: summary: 'Pending RDO days' operationId: pendingRDODays description: 'List the days in a period that have no RDO for a given work' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - '2026-07-01' - '2026-07-02' properties: data: type: array example: - '2026-07-01' - '2026-07-02' items: type: string tags: - 'Daily Logs (RDO)' requestBody: required: true content: application/json: schema: type: object properties: contract_id: type: string description: 'Contrato. The uuid of an existing record in the contracts table.' example: 'Example Contract id' date_from: type: string description: 'Data inicial. O campo value deve ser uma data válida.' example: '2024-01-01' date_to: type: string description: 'Data final. O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a date_from. O campo value deve ser uma data anterior ou igual a 9999-12-31.' example: '2024-01-01' required: - contract_id - date_from - date_to '/api/daily-logs/{dailyLog}': get: summary: 'Show daily log' operationId: showDailyLog description: 'Show a daily work report (RDO)' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 1475e7d6-8063-3fb9-8e5c-3fec5832c430 code: RDO-001 report_number: 1 date: '2026-08-04' status: id: a26c93fc-376b-4f12-9a9b-9da4979788ca slug: null name: null abbreviation: velit color: '#8d20a4' text_color: '#239af6' work: id: a26c93fc-3104-4687-8bc5-39c80892b963 name: 'Leo Zamana Neto' started_at: '1991-03-23 09:03:05' filled_by: id: a26c93fc-35af-4cc6-85b9-058d019098a0 name: 'Mr. Skye Corkery III' contract_number: 089/2026 deadline_at: '2027-08-04' technical_responsible: name: null certification: null crea: null activities: [] occurrences: null next_day_forecast: null finalized_at: null content_hash: null gov_br_validation_url: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 1475e7d6-8063-3fb9-8e5c-3fec5832c430 code: type: string example: RDO-001 report_number: type: integer example: 1 date: type: string example: '2026-08-04' status: type: object properties: id: type: string example: a26c93fc-376b-4f12-9a9b-9da4979788ca slug: type: string example: null nullable: true name: type: string example: null nullable: true abbreviation: type: string example: velit color: type: string example: '#8d20a4' text_color: type: string example: '#239af6' work: type: object properties: id: type: string example: a26c93fc-3104-4687-8bc5-39c80892b963 name: type: string example: 'Leo Zamana Neto' started_at: type: string example: '1991-03-23 09:03:05' filled_by: type: object properties: id: type: string example: a26c93fc-35af-4cc6-85b9-058d019098a0 name: type: string example: 'Mr. Skye Corkery III' contract_number: type: string example: 089/2026 deadline_at: type: string example: '2027-08-04' technical_responsible: type: object properties: name: type: string example: null nullable: true certification: type: string example: null nullable: true crea: type: string example: null nullable: true activities: type: array example: [] occurrences: type: string example: null nullable: true next_day_forecast: type: string example: null nullable: true finalized_at: type: string example: null nullable: true content_hash: type: string example: null nullable: true gov_br_validation_url: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Daily Logs (RDO)' patch: summary: 'Update daily log' operationId: updateDailyLog description: 'Update a draft RDO: weather, team, activities, occurrences and next-day forecast' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Daily Logs (RDO)' requestBody: required: false content: application/json: schema: type: object properties: activities: type: string description: 'Atividades executadas.' example: 'Example Activities' nullable: true occurrences: type: string description: Ocorrências. example: 'Example Occurrences' nullable: true next_day_forecast: type: string description: 'Previsão do dia seguinte.' example: 'Example Next day forecast' nullable: true weather: type: array description: 'Registro do tempo.' example: - null - null items: type: object properties: shift: type: string description: 'Turno. This field is required when weather is present.' example: 'Example Weather * shift' enum: - manha - tarde - noite weather: type: string description: 'Clima. This field is required when weather is present.' example: 'Example Weather * weather' enum: - sol - sol_nuvens - chuva - tempestade teams: type: array description: 'Composição da equipe.' example: - null - null items: type: object properties: employee_role_id: type: string description: 'Função. This field is required when teams is present. The uuid of an existing record in the employee_roles table.' example: f8461be5-4ad4-4918-a9fc-f492d28e4af0 quantity: type: integer description: 'Quantidade. This field is required when teams is present. O campo value deve ser pelo menos 1.' example: 1 delete: summary: 'Delete daily log' operationId: deleteDailyLog description: 'Delete a draft daily work report (RDO)' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Daily Logs (RDO)' parameters: - in: path name: dailyLog description: 'Daily Log UUID' example: sunt required: true schema: type: string '/api/daily-logs/{dailyLog}/finalize': post: summary: 'Finalize daily log' operationId: finalizeDailyLog description: 'Validate, stamp and lock a draft RDO (Rascunho → Finalizado)' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Daily Logs (RDO)' parameters: - in: path name: dailyLog description: 'Daily Log UUID' example: occaecati required: true schema: type: string '/api/daily-logs/{dailyLog}/signed-document': post: summary: 'Attach gov.br signed document' operationId: attachGovbrSignedDocument description: 'Attach the gov.br-signed PDF and validation link to a finalized RDO' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Daily Logs (RDO)' requestBody: required: true content: application/json: schema: type: object properties: path: type: string description: 'Arquivo assinado.' example: 'Example Path' name: type: string description: 'Nome do arquivo.' example: 'Example Name' nullable: true size: type: string description: Size. example: 'Example Size' nullable: true extension: type: string description: Extension. example: 'Example Extension' nullable: true gov_br_validation_url: type: string description: 'Link de validação (gov.br). Must be a valid URL. Must match the regex /^https:\/\/([a-z0-9-]+\.)*gov\.br(\/|$)/i. O campo value não pode ser superior a 2048 caracteres.' example: 'https://example.com' required: - path - gov_br_validation_url parameters: - in: path name: dailyLog description: 'Daily Log UUID' example: consequatur required: true schema: type: string '/api/daily-logs/{dailyLog}/photos': post: summary: 'Attach photos' operationId: attachPhotos description: 'Attach photographs (already uploaded to storage) to a draft RDO' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Daily Logs (RDO)' requestBody: required: true content: application/json: schema: type: object properties: photos: type: array description: 'Fotos. O campo value deve ter pelo menos 1 itens.' example: - null - null items: type: object properties: path: type: string description: Arquivo. example: 'Example Photos * path' name: type: string description: 'Nome do arquivo.' example: 'Example Name' nullable: true size: type: string description: 'Photos * size.' example: 'Example Photos * size' nullable: true extension: type: string description: 'Photos * extension.' example: 'Example Photos * extension' nullable: true caption: type: string description: Legenda. example: 'Example Photos * caption' nullable: true required: - path required: - photos parameters: - in: path name: dailyLog description: 'Daily Log UUID' example: illo required: true schema: type: string '/api/daily-logs/{dailyLog}/photos/{id}': patch: summary: 'Update photo caption' operationId: updatePhotoCaption description: 'Update the caption of a photo in a draft RDO' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Daily Logs (RDO)' requestBody: required: false content: application/json: schema: type: object properties: caption: type: string description: Legenda. example: 'Example Caption' nullable: true parameters: - in: path name: dailyLog description: 'Daily Log UUID' example: necessitatibus required: true schema: type: string - in: path name: id description: 'The ID of the photo.' example: quo required: true schema: type: string - in: path name: photo description: 'Photo (File) UUID' example: alias required: true schema: type: string '/api/daily-logs/{dailyLog}/photos/{photo}': delete: summary: 'Delete photo' operationId: deletePhoto description: 'Remove a photo from a draft RDO' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Daily Logs (RDO)' parameters: - in: path name: dailyLog description: 'Daily Log UUID' example: numquam required: true schema: type: string - in: path name: photo description: 'Photo (File) UUID' example: ducimus required: true schema: type: string /api/disciplines: get: summary: 'List disciplines' operationId: listDisciplines description: 'List all disciplines' parameters: - in: query name: q description: 'Search query.' example: Elétrico required: false schema: type: string description: 'Search query.' example: Elétrico nullable: true - in: query name: active description: 'Filter by active status.' example: true required: false schema: type: string description: 'Filter by active status.' example: true enum: - 'true' - 'false' - '1' - '0' nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 35b895dd-a896-3794-8f9b-81eed86f892d name: Perspiciatis code: LHZ description: 'Rerum harum assumenda et quia rerum sit qui.' active: true - id: 191e4beb-1fc8-3c7d-8d3b-af2e1a56e748 name: Vel code: TBJ description: 'Ratione ipsa necessitatibus aut architecto iusto occaecati eligendi.' active: true links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 35b895dd-a896-3794-8f9b-81eed86f892d name: Perspiciatis code: LHZ description: 'Rerum harum assumenda et quia rerum sit qui.' active: true - id: 191e4beb-1fc8-3c7d-8d3b-af2e1a56e748 name: Vel code: TBJ description: 'Ratione ipsa necessitatibus aut architecto iusto occaecati eligendi.' active: true items: type: object properties: id: type: string example: 35b895dd-a896-3794-8f9b-81eed86f892d name: type: string example: Perspiciatis code: type: string example: LHZ description: type: string example: 'Rerum harum assumenda et quia rerum sit qui.' active: type: boolean example: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Disciplines post: summary: 'Create discipline' operationId: createDiscipline description: 'Create a new discipline' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Disciplines requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: nome. example: 'Example Name' code: type: string description: código. example: 'Example Code' nullable: true description: type: string description: descrição. example: 'Example Description' nullable: true active: type: boolean description: ativo. example: true required: - name '/api/disciplines/{id}': get: summary: 'Show discipline' operationId: showDiscipline description: 'Show a discipline' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: c731042e-cda5-3d35-82d8-a2cf73dcf009 name: Vel code: ZWA description: 'Quia in sit beatae doloremque aut.' active: true properties: data: type: object properties: id: type: string example: c731042e-cda5-3d35-82d8-a2cf73dcf009 name: type: string example: Vel code: type: string example: ZWA description: type: string example: 'Quia in sit beatae doloremque aut.' active: type: boolean example: true tags: - Disciplines put: summary: 'Update discipline' operationId: updateDiscipline description: 'Update a discipline' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Disciplines requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: nome. example: 'Example Name' code: type: string description: código. example: 'Example Code' nullable: true description: type: string description: descrição. example: 'Example Description' nullable: true active: type: boolean description: ativo. example: true required: - name parameters: - in: path name: id description: 'The ID of the discipline.' example: 1 required: true schema: type: integer - in: path name: discipline description: 'Discipline UUID' example: quo required: true schema: type: string '/api/disciplines/{discipline}': delete: summary: 'Delete discipline' operationId: deleteDiscipline description: 'Delete a discipline' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Disciplines parameters: - in: path name: discipline description: 'Discipline UUID' example: dolorum required: true schema: type: string /api/document-categories: get: summary: 'List document categories' operationId: listDocumentCategories description: 'List all document categories' parameters: - in: query name: q description: 'Search query.' example: Contracts required: false schema: type: string description: 'Search query.' example: Contracts nullable: true - in: query name: module description: 'Filter by module.' example: employee required: false schema: type: string description: 'Filter by module.' example: employee nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 3ed73c49-92bf-336e-b980-ec8b392bfcb1 name: 'Dr. Aline Quintana' description: 'Hic eum eum fugit quibusdam. Sint soluta asperiores tenetur provident aut. Consequatur error est ipsa.' module: document - id: 2e757f64-4030-3ff7-aa29-972741c94374 name: 'Sérgio Ítalo Valência' description: 'Ut porro minima quae ab unde qui nobis asperiores. Animi incidunt deserunt suscipit dolores velit. Non consequatur deleniti voluptatibus sint neque consectetur itaque corporis.' module: document links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 3ed73c49-92bf-336e-b980-ec8b392bfcb1 name: 'Dr. Aline Quintana' description: 'Hic eum eum fugit quibusdam. Sint soluta asperiores tenetur provident aut. Consequatur error est ipsa.' module: document - id: 2e757f64-4030-3ff7-aa29-972741c94374 name: 'Sérgio Ítalo Valência' description: 'Ut porro minima quae ab unde qui nobis asperiores. Animi incidunt deserunt suscipit dolores velit. Non consequatur deleniti voluptatibus sint neque consectetur itaque corporis.' module: document items: type: object properties: id: type: string example: 3ed73c49-92bf-336e-b980-ec8b392bfcb1 name: type: string example: 'Dr. Aline Quintana' description: type: string example: 'Hic eum eum fugit quibusdam. Sint soluta asperiores tenetur provident aut. Consequatur error est ipsa.' module: type: string example: document links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Document Categories' post: summary: 'Create document category' operationId: createDocumentCategory description: 'Create a new document category' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Document Categories' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Name. example: 'Example Name' description: type: string description: Description. example: 'Example Description' module: type: string description: Module. example: 'Example Module' required: - name - module '/api/document-categories/{documentCategory}': get: summary: 'Show document category' operationId: showDocumentCategory description: 'Show a document category' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: a77e5fae-53dc-3608-97c4-e3bd8e856011 name: 'Diogo de Arruda Jr.' description: 'Eaque voluptates dolor rem quo nemo. Distinctio vel qui at. Suscipit voluptates aliquid dolore occaecati. Tenetur quam aut sed molestias error modi distinctio.' module: document properties: data: type: object properties: id: type: string example: a77e5fae-53dc-3608-97c4-e3bd8e856011 name: type: string example: 'Diogo de Arruda Jr.' description: type: string example: 'Eaque voluptates dolor rem quo nemo. Distinctio vel qui at. Suscipit voluptates aliquid dolore occaecati. Tenetur quam aut sed molestias error modi distinctio.' module: type: string example: document tags: - 'Document Categories' put: summary: 'Update document category' operationId: updateDocumentCategory description: 'Update a document category' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Document Categories' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Name. example: 'Example Name' description: type: string description: Description. example: 'Example Description' module: type: string description: Module. example: 'Example Module' required: - name - module delete: summary: 'Delete document category' operationId: deleteDocumentCategory description: 'Delete a document category' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Document Categories' parameters: - in: path name: documentCategory description: 'Document category UUID' example: id required: true schema: type: string /api/documents: get: summary: 'List documents' operationId: listDocuments description: 'List all documents' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: '' example: 'Document name' required: false schema: type: string description: '' example: 'Document name' nullable: true - in: query name: categories description: 'The uuid of an existing record in the document_categories table.' example: - inventore required: false schema: type: array description: 'The uuid of an existing record in the document_categories table.' example: - inventore items: type: string - in: query name: documentable_type description: 'Type of the related documentable entity. The type of an existing record in the documentables table.' example: unde required: false schema: type: string description: 'Type of the related documentable entity. The type of an existing record in the documentables table.' example: unde nullable: true - in: query name: customers description: 'The uuid of an existing record in the customers table.' example: - neque required: false schema: type: array description: 'The uuid of an existing record in the customers table.' example: - neque items: type: string - in: query name: suppliers description: 'The uuid of an existing record in the suppliers table.' example: - autem required: false schema: type: array description: 'The uuid of an existing record in the suppliers table.' example: - autem items: type: string responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 6dd2d17d-2b60-35f8-a62a-9df0fb1fcdf8 name: 'Sr. Joaquim Kauan Saito' file: id: null url: null extension: null created_at: null updated_at: null - id: 2ad4bbbd-ec19-3347-b932-bcc8f1724972 name: 'Srta. Beatriz Zaragoça' file: id: null url: null extension: null created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 6dd2d17d-2b60-35f8-a62a-9df0fb1fcdf8 name: 'Sr. Joaquim Kauan Saito' file: id: null url: null extension: null created_at: null updated_at: null - id: 2ad4bbbd-ec19-3347-b932-bcc8f1724972 name: 'Srta. Beatriz Zaragoça' file: id: null url: null extension: null created_at: null updated_at: null items: type: object properties: id: type: string example: 6dd2d17d-2b60-35f8-a62a-9df0fb1fcdf8 name: type: string example: 'Sr. Joaquim Kauan Saito' file: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true extension: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Documents post: summary: 'Create document' operationId: createDocument description: 'Create a new document' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Documents requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' category_id: type: string description: 'Categoria. The uuid of an existing record in the document_categories table.' example: 83390706-450e-3580-88ba-8b25edb35b67 file: type: object description: Arquivo. example: - example1 - example2 properties: path: type: string description: 'Caminho do arquivo. This field is required when file is present.' example: 'Example File path' name: type: string description: 'Nome do arquivo.' example: 'Example Name' extension: type: string description: 'Extensão do arquivo.' example: 'Example File extension' size: type: string description: 'Tamanho do arquivo.' example: 'Example File size' required: - name - extension - size documentable_type: type: string description: 'Tipo de relacionado do documento.' example: 'Example Documentable type' enum: - customer - work - work_location - supplier - employee documentable_id: type: string description: 'Relacionado do documento.' example: 'Example Documentable id' required: - name - category_id - file - documentable_type - documentable_id '/api/documents/{id}': get: summary: 'Get document' operationId: getDocument description: 'Get a document' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 08e43db9-d74d-34ab-8b2c-84c9adea9abf name: 'Larissa Kamila Carrara' file: id: null url: null extension: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 08e43db9-d74d-34ab-8b2c-84c9adea9abf name: type: string example: 'Larissa Kamila Carrara' file: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true extension: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Documents put: summary: 'Update document' operationId: updateDocument description: 'Update a document' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Documents requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' category_id: type: string description: 'Categoria. The uuid of an existing record in the document_categories table.' example: f989cdc9-ed79-33cf-adf5-1f6e7c7980df file: type: object description: Arquivo. example: - example1 - example2 properties: path: type: string description: 'Caminho do arquivo. This field is required when file is present.' example: 'Example File path' name: type: string description: 'Nome do arquivo.' example: 'Example Name' extension: type: string description: 'Extensão do arquivo.' example: 'Example File extension' size: type: string description: 'Tamanho do arquivo.' example: 'Example File size' documentable_type: type: string description: 'Documentable type.' example: 'Example Documentable type' enum: - customer - work - work_location - supplier - employee documentable_id: type: string description: 'Documentable id.' example: 'Example Documentable id' parameters: - in: path name: id description: 'The ID of the document.' example: 1 required: true schema: type: integer - in: path name: document description: 'Document ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/documents/{document}': delete: summary: 'Delete document' operationId: deleteDocument description: 'Delete a document' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Documents parameters: - in: path name: document description: 'Document ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string /api/epi-renewals: get: summary: 'List EPI renewals' operationId: listEPIRenewals description: 'List pending/ignored (default) or completed EPI renewals. Ignored items remain in the default listing with renewal_status=ignored' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'EPI Renewals' requestBody: required: false content: application/json: schema: type: object properties: q: type: string description: '' example: omnis nullable: true renewal_status: type: string description: '' example: ignored enum: - pending - completed - ignored nullable: true urgency: type: string description: '' example: expires_7_days enum: - expired - expires_7_days - expires_30_days nullable: true employee_id: type: string description: 'The uuid of an existing record in the employees table.' example: fugit nullable: true epi_type_id: type: string description: 'The uuid of an existing record in the epi_types table.' example: nesciunt nullable: true /api/epi-renewals/summary: get: summary: 'EPI renewals summary' operationId: ePIRenewalsSummary description: 'Counts of renewals by urgency (pending and ignored; ignore only silences notifications)' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'EPI Renewals' '/api/epi-renewals/{id}/renew': post: summary: 'Renew EPI delivery' operationId: renewEPIDelivery description: 'Renew an EPI delivery with a new delivery date' parameters: [] responses: { } tags: - 'EPI Renewals' requestBody: required: false content: application/json: schema: type: object properties: quantity: type: integer description: 'Quantidade entregue. O campo value deve ser pelo menos 1.' example: 1 condition: type: string description: 'Condição do EPI.' example: new enum: - new - used - reformed lot: type: string description: 'Lote do EPI. O campo value não pode ser superior a 255 caracteres.' example: LOTE-001 nullable: true parameters: - in: path name: id description: 'EPI delivery UUID' example: eius required: true schema: type: string '/api/epi-renewals/{id}/ignore': post: summary: 'Ignore EPI renewal' operationId: ignoreEPIRenewal description: 'Ignore expiry alerts for an EPI delivery' parameters: [] responses: { } tags: - 'EPI Renewals' requestBody: required: true content: application/json: schema: type: object properties: ignore_reason: type: string description: 'Motivo para ignorar o alerta de vencimento. O campo value não pode ser superior a 500 caracteres.' example: 'Colaborador afastado temporariamente' required: - ignore_reason delete: summary: 'Unignore EPI renewal' operationId: unignoreEPIRenewal description: 'Resume expiry alerts for an EPI delivery' parameters: [] responses: 200: description: '' content: application/json: schema: type: object nullable: true tags: - 'EPI Renewals' parameters: - in: path name: id description: 'EPI delivery UUID' example: error required: true schema: type: string /api/epi-types: get: summary: 'List EPI types' operationId: listEPITypes description: 'List all EPI types' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 651aabac-688c-38e5-87f0-e08db412aff1 name: 'repudiandae ea' default_validity_days: 526 requires_signature: false created_at: null updated_at: null - id: fdb1d867-abef-30c7-a50a-0fa635217e3f name: 'error sed' default_validity_days: 342 requires_signature: false created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 651aabac-688c-38e5-87f0-e08db412aff1 name: 'repudiandae ea' default_validity_days: 526 requires_signature: false created_at: null updated_at: null - id: fdb1d867-abef-30c7-a50a-0fa635217e3f name: 'error sed' default_validity_days: 342 requires_signature: false created_at: null updated_at: null items: type: object properties: id: type: string example: 651aabac-688c-38e5-87f0-e08db412aff1 name: type: string example: 'repudiandae ea' default_validity_days: type: integer example: 526 requires_signature: type: boolean example: false created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'EPI Types' requestBody: required: false content: application/json: schema: type: object properties: q: type: string description: '' example: et nullable: true post: summary: 'Create EPI type' operationId: createEPIType description: 'Create a new EPI type' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'EPI Types' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' default_validity_days: type: integer description: 'Validade padrão (dias). O campo value deve ser pelo menos 1.' example: 1 requires_signature: type: boolean description: 'Exige assinatura.' example: true required: - name - default_validity_days '/api/epi-types/{epiType}': get: summary: 'Show EPI type' operationId: showEPIType description: 'Show an EPI type' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 12f98b97-b524-3d2e-a4cc-556423c69c8d name: 'reprehenderit voluptatum' default_validity_days: 394 requires_signature: false created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 12f98b97-b524-3d2e-a4cc-556423c69c8d name: type: string example: 'reprehenderit voluptatum' default_validity_days: type: integer example: 394 requires_signature: type: boolean example: false created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'EPI Types' put: summary: 'Update EPI type' operationId: updateEPIType description: 'Update an EPI type' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'EPI Types' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' default_validity_days: type: integer description: 'Validade padrão (dias). O campo value deve ser pelo menos 1.' example: 1 requires_signature: type: boolean description: 'Exige assinatura.' example: true required: - name - default_validity_days delete: summary: 'Delete EPI type' operationId: deleteEPIType description: 'Delete an EPI type' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'EPI Types' parameters: - in: path name: epiType description: 'EPI type UUID' example: vitae required: true schema: type: string /api/employee-roles: get: summary: 'List employee roles' operationId: listEmployeeRoles description: 'List all employee roles' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: Manager required: false schema: type: string description: 'Search query.' example: Manager nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 9b5a7fc7-7745-4824-bfcd-b6da51378e83 name: in description: 'Odio blanditiis et iusto maxime.' created_at: null updated_at: null - id: fdce0b9a-b57a-4a22-9596-4ab234bdaa87 name: velit description: 'Quod impedit est numquam sapiente nihil nulla.' created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 9b5a7fc7-7745-4824-bfcd-b6da51378e83 name: in description: 'Odio blanditiis et iusto maxime.' created_at: null updated_at: null - id: fdce0b9a-b57a-4a22-9596-4ab234bdaa87 name: velit description: 'Quod impedit est numquam sapiente nihil nulla.' created_at: null updated_at: null items: type: object properties: id: type: string example: 9b5a7fc7-7745-4824-bfcd-b6da51378e83 name: type: string example: in description: type: string example: 'Odio blanditiis et iusto maxime.' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Employee Roles' post: summary: 'Create employee role' operationId: createEmployeeRole description: 'Create a new employee role' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Employee Roles' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' description: type: string description: Descrição. example: 'Example Description' nullable: true required: - name '/api/employee-roles/{employeeRole}': get: summary: 'Show employee role' operationId: showEmployeeRole description: 'Show an employee role' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: bdaa5c97-0f85-4e9d-b9aa-204cac0c6c5d name: vero description: 'Fugiat similique quidem in delectus esse quia ut.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: bdaa5c97-0f85-4e9d-b9aa-204cac0c6c5d name: type: string example: vero description: type: string example: 'Fugiat similique quidem in delectus esse quia ut.' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Employee Roles' put: summary: 'Update employee role' operationId: updateEmployeeRole description: 'Update an employee role' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Employee Roles' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' description: type: string description: Descrição. example: 'Example Description' nullable: true delete: summary: 'Delete employee role' operationId: deleteEmployeeRole description: 'Delete an employee role' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Employee Roles' parameters: - in: path name: employeeRole description: 'Employee Role UUID' example: culpa required: true schema: type: string /api/epi-terms: get: summary: 'List EPI terms' operationId: listEPITerms description: 'List initial EPI kit terms globally' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Employees requestBody: required: false content: application/json: schema: type: object properties: sort_by: type: string description: '' example: delivery_date enum: - delivery_date - created_at nullable: true sort_desc: type: boolean description: '' example: true nullable: true page: type: integer description: 'O campo value deve ser pelo menos 1.' example: 10 nullable: true per_page: type: integer description: 'O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 22 nullable: true q: type: string description: '' example: amet nullable: true employee_id: type: string description: 'The uuid of an existing record in the employees table.' example: sunt nullable: true has_term: type: boolean description: '' example: true nullable: true /api/employees: get: summary: 'List employees' operationId: listEmployees description: 'List all employees' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: 'João Silva' required: false schema: type: string description: 'Search query.' example: 'João Silva' nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 5cda545c-0c4e-445a-bda2-a658027fd380 name: 'Allan Bonilha' cpf: 249.127.216-02 rg: null ctps: null phone: null birthdate: '1972-07-10T03:00:00.000000Z' email: nadia.lozano@example.org pis_pasep: null admission_date: '2003-12-13T02:00:00.000000Z' daily_salary: null monthly_salary: '5615.64' nationality: null place_of_birth: 'Victor do Norte' address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null employee_role: id: a26c93fc-e48b-4860-afaf-96e9e9c2bd96 name: et created_at: null updated_at: null - id: c9f41254-cbfd-468e-aea6-709e75ec328a name: 'Dr. Bárbara Saito' cpf: 550.815.124-60 rg: '073865905' ctps: '666564782' phone: null birthdate: '1972-12-20T03:00:00.000000Z' email: jimenes.gian@example.com pis_pasep: null admission_date: '2024-08-07T03:00:00.000000Z' daily_salary: '176.99' monthly_salary: null nationality: Suécia place_of_birth: 'Santa Leandro' address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null employee_role: id: a26c93fc-eb8e-4d0f-a03b-7c63362b810c name: similique created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: '/?page=9' next: null meta: current_page: 10 from: 91 last_page: 1 links: - url: '/?page=9' label: '« Anterior' page: 9 active: false - url: '/?page=1' label: '1' page: 1 active: false - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 92 total: 2 properties: data: type: array example: - id: 5cda545c-0c4e-445a-bda2-a658027fd380 name: 'Allan Bonilha' cpf: 249.127.216-02 rg: null ctps: null phone: null birthdate: '1972-07-10T03:00:00.000000Z' email: nadia.lozano@example.org pis_pasep: null admission_date: '2003-12-13T02:00:00.000000Z' daily_salary: null monthly_salary: '5615.64' nationality: null place_of_birth: 'Victor do Norte' address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null employee_role: id: a26c93fc-e48b-4860-afaf-96e9e9c2bd96 name: et created_at: null updated_at: null - id: c9f41254-cbfd-468e-aea6-709e75ec328a name: 'Dr. Bárbara Saito' cpf: 550.815.124-60 rg: '073865905' ctps: '666564782' phone: null birthdate: '1972-12-20T03:00:00.000000Z' email: jimenes.gian@example.com pis_pasep: null admission_date: '2024-08-07T03:00:00.000000Z' daily_salary: '176.99' monthly_salary: null nationality: Suécia place_of_birth: 'Santa Leandro' address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null employee_role: id: a26c93fc-eb8e-4d0f-a03b-7c63362b810c name: similique created_at: null updated_at: null items: type: object properties: id: type: string example: 5cda545c-0c4e-445a-bda2-a658027fd380 name: type: string example: 'Allan Bonilha' cpf: type: string example: 249.127.216-02 rg: type: string example: null nullable: true ctps: type: string example: null nullable: true phone: type: string example: null nullable: true birthdate: type: string example: '1972-07-10T03:00:00.000000Z' email: type: string example: nadia.lozano@example.org pis_pasep: type: string example: null nullable: true admission_date: type: string example: '2003-12-13T02:00:00.000000Z' daily_salary: type: string example: null nullable: true monthly_salary: type: string example: '5615.64' nationality: type: string example: null nullable: true place_of_birth: type: string example: 'Victor do Norte' address: type: object properties: street: type: string example: null nullable: true number: type: string example: null nullable: true complement: type: string example: null nullable: true neighborhood: type: string example: null nullable: true city: type: string example: null nullable: true state: type: string example: null nullable: true zip_code: type: string example: null nullable: true employee_role: type: object properties: id: type: string example: a26c93fc-e48b-4860-afaf-96e9e9c2bd96 name: type: string example: et created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: '/?page=9' next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 10 from: type: integer example: 91 last_page: type: integer example: 1 links: type: array example: - url: '/?page=9' label: '« Anterior' page: 9 active: false - url: '/?page=1' label: '1' page: 1 active: false - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: '/?page=9' label: type: string example: '« Anterior' page: type: integer example: 9 active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 92 total: type: integer example: 2 tags: - Employees post: summary: 'Create employee' operationId: createEmployee description: 'Create a new employee' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Employees requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' cpf: type: string description: 'CPF. O campo value deve ser 14 caracteres.' example: 'Example Cpf' rg: type: string description: 'RG. O campo value não pode ser superior a 20 caracteres.' example: 'Example Rg' nullable: true ctps: type: string description: 'CTPS. O campo value não pode ser superior a 20 caracteres.' example: 'Example Ctps' nullable: true phone: type: string description: 'Telefone. O campo value não pode ser superior a 20 caracteres.' example: '(11) 99999-9999' nullable: true birthdate: type: string description: 'Data de Nascimento. O campo value deve ser uma data válida.' example: '2024-01-01' nullable: true email: type: string description: 'E-mail. O campo value deve ser um endereço de e-mail válido.' example: user@example.com nullable: true employee_role_id: type: string description: 'Cargo. The uuid of an existing record in the employee_roles table.' example: 71853782-e11a-4849-a6aa-b586e07b19ad pis_pasep: type: string description: 'PIS/PASEP. O campo value deve ter 11 dígitos.' example: 'Example Pis pasep' nullable: true admission_date: type: string description: 'Data de Admissão. O campo value deve ser uma data válida.' example: '2024-01-01' nullable: true daily_salary: type: number description: 'Salário Diário. O campo value deve ser pelo menos 0.' example: 1.0 nullable: true monthly_salary: type: number description: 'Salário Mensal. O campo value deve ser pelo menos 0.' example: 1.0 nullable: true nationality: type: string description: 'Nacionalidade. O campo value não pode ser superior a 100 caracteres.' example: 'Example Nationality' nullable: true place_of_birth: type: string description: 'Naturalidade. O campo value não pode ser superior a 255 caracteres.' example: 'Example Place of birth' nullable: true address: type: object description: Endereço. example: - example1 - example2 properties: street: type: string description: Rua. example: 'Example Address street' nullable: true number: type: string description: Número. example: 'Example Address number' nullable: true complement: type: string description: Complemento. example: 'Example Address complement' nullable: true neighborhood: type: string description: Bairro. example: 'Example Address neighborhood' nullable: true city: type: string description: Cidade. example: 'Example Address city' nullable: true state: type: string description: Estado. example: 'Example Address state' nullable: true zip_code: type: string description: CEP. example: 'Example Address zip code' nullable: true nullable: true required: - name - cpf - employee_role_id '/api/employees/{id}': get: summary: 'Show employee' operationId: showEmployee description: 'Show an employee' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 9cd4a490-5e10-4fe2-9419-ec7a5429343c name: 'Clara Teles' cpf: 214.643.087-16 rg: null ctps: '488619712' phone: '(69) 96995-7350' birthdate: '2018-06-14T03:00:00.000000Z' email: null pis_pasep: null admission_date: null daily_salary: '201.93' monthly_salary: '8850.22' nationality: null place_of_birth: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null employee_role: id: a26c93fc-f2ac-454b-9b66-7a622f50006d name: illum created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 9cd4a490-5e10-4fe2-9419-ec7a5429343c name: type: string example: 'Clara Teles' cpf: type: string example: 214.643.087-16 rg: type: string example: null nullable: true ctps: type: string example: '488619712' phone: type: string example: '(69) 96995-7350' birthdate: type: string example: '2018-06-14T03:00:00.000000Z' email: type: string example: null nullable: true pis_pasep: type: string example: null nullable: true admission_date: type: string example: null nullable: true daily_salary: type: string example: '201.93' monthly_salary: type: string example: '8850.22' nationality: type: string example: null nullable: true place_of_birth: type: string example: null nullable: true address: type: object properties: street: type: string example: null nullable: true number: type: string example: null nullable: true complement: type: string example: null nullable: true neighborhood: type: string example: null nullable: true city: type: string example: null nullable: true state: type: string example: null nullable: true zip_code: type: string example: null nullable: true employee_role: type: object properties: id: type: string example: a26c93fc-f2ac-454b-9b66-7a622f50006d name: type: string example: illum created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Employees put: summary: 'Update employee' operationId: updateEmployee description: 'Update an employee' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Employees requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' cpf: type: string description: 'CPF. O campo value deve ser 14 caracteres.' example: 'Example Cpf' rg: type: string description: 'RG. O campo value não pode ser superior a 20 caracteres.' example: 'Example Rg' nullable: true ctps: type: string description: 'CTPS. O campo value não pode ser superior a 20 caracteres.' example: 'Example Ctps' nullable: true phone: type: string description: 'Telefone. O campo value não pode ser superior a 20 caracteres.' example: '(11) 99999-9999' nullable: true birthdate: type: string description: 'Data de Nascimento. O campo value deve ser uma data válida.' example: '2024-01-01' nullable: true email: type: string description: 'E-mail. O campo value deve ser um endereço de e-mail válido.' example: user@example.com nullable: true employee_role_id: type: string description: 'Cargo. The uuid of an existing record in the employee_roles table.' example: 7a77f419-5466-49fa-8fd2-1897bc633f17 pis_pasep: type: string description: 'PIS/PASEP. O campo value deve ter 11 dígitos.' example: 'Example Pis pasep' nullable: true admission_date: type: string description: 'Data de Admissão. O campo value deve ser uma data válida.' example: '2024-01-01' nullable: true daily_salary: type: number description: 'Salário Diário. O campo value deve ser pelo menos 0.' example: 1.0 nullable: true monthly_salary: type: number description: 'Salário Mensal. O campo value deve ser pelo menos 0.' example: 1.0 nullable: true nationality: type: string description: 'Nacionalidade. O campo value não pode ser superior a 100 caracteres.' example: 'Example Nationality' nullable: true place_of_birth: type: string description: 'Naturalidade. O campo value não pode ser superior a 255 caracteres.' example: 'Example Place of birth' nullable: true address: type: object description: Endereço. example: - example1 - example2 properties: street: type: string description: Rua. example: 'Example Address street' number: type: string description: Número. example: 'Example Address number' complement: type: string description: Complemento. example: 'Example Address complement' neighborhood: type: string description: Bairro. example: 'Example Address neighborhood' city: type: string description: Cidade. example: 'Example Address city' state: type: string description: Estado. example: 'Example Address state' zip_code: type: string description: CEP. example: 'Example Address zip code' parameters: - in: path name: id description: 'The ID of the employee.' example: 16 required: true schema: type: integer - in: path name: employee description: 'Employee ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/employees/{employee}': delete: summary: 'Delete employee' operationId: deleteEmployee description: 'Delete an employee' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Employees parameters: - in: path name: employee description: 'Employee ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/employees/{employee_id}/bank-account': get: summary: 'List employee bank accounts' operationId: listEmployeeBankAccounts description: 'List all bank accounts for an employee' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Employees post: summary: 'Create employee bank account' operationId: createEmployeeBankAccount description: 'Add a bank account to an employee' parameters: [] responses: 201: description: '' content: application/json: schema: type: object nullable: true tags: - Employees requestBody: required: true content: application/json: schema: type: object properties: bank_id: type: string description: 'The uuid of an existing record in the banks table.' example: qui agency: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: qnhhzwjplbdjcwjnlnzxhzx account: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: sqeysniow account_type: type: string description: '' example: corrente enum: - corrente - poupança pix_key: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: lkzofheahtwbgeo nullable: true favorite: type: boolean description: '' example: false required: - bank_id - agency - account - account_type parameters: - in: path name: employee_id description: 'The ID of the employee.' example: 2 required: true schema: type: integer - in: path name: employee description: 'Employee UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/employees/{employee_id}/bank-account/{id}': put: summary: 'Update employee bank account' operationId: updateEmployeeBankAccount description: 'Update a bank account for an employee' parameters: [] responses: { } tags: - Employees requestBody: required: false content: application/json: schema: type: object properties: bank_id: type: string description: 'The uuid of an existing record in the banks table.' example: iure agency: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: ivcpbvskijaccam account: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: jqvnibhfibdecnpmam account_type: type: string description: '' example: corrente enum: - corrente - poupança pix_key: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: cykemynmdyezexnumf nullable: true favorite: type: boolean description: '' example: false parameters: - in: path name: employee_id description: 'The ID of the employee.' example: 6 required: true schema: type: integer - in: path name: id description: 'Bank account UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c33 required: true schema: type: string - in: path name: employee description: 'Employee UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/employees/{employee}/bank-account/{id}': delete: summary: 'Delete employee bank account' operationId: deleteEmployeeBankAccount description: 'Delete a bank account from an employee' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Employees parameters: - in: path name: employee description: 'Employee UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string - in: path name: id description: 'Bank account UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c33 required: true schema: type: string '/api/employees/{employee_id}/epi-deliveries': get: summary: 'List employee EPI deliveries' operationId: listEmployeeEPIDeliveries description: 'List EPI deliveries for an employee' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Employees requestBody: required: false content: application/json: schema: type: object properties: q: type: string description: '' example: soluta nullable: true status: type: string description: '' example: valid enum: - valid - expiring - expired nullable: true epi_type_id: type: string description: 'The uuid of an existing record in the epi_types table.' example: sapiente nullable: true has_term: type: string description: '' example: null nullable: true post: summary: 'Create employee EPI delivery' operationId: createEmployeeEPIDelivery description: 'Register an EPI delivery for an employee' parameters: [] responses: 201: description: '' content: application/json: schema: type: object nullable: true tags: - Employees requestBody: required: true content: application/json: schema: type: object properties: epi_type_id: type: string description: 'Tipo de EPI. The uuid of an existing record in the epi_types table.' example: 04e7682b-1f0a-3d2f-88c7-bbc534a3f43c delivery_date: type: string description: 'Data de entrega. O campo value deve ser uma data válida.' example: '2024-01-01' quantity: type: integer description: 'Quantidade. O campo value deve ser pelo menos 1.' example: 1 condition: type: string description: Condicao. example: 'Example Condition' enum: - new - used - reformed lot: type: string description: 'Lote. O campo value não pode ser superior a 255 caracteres.' example: 'Example Lot' nullable: true required: - epi_type_id - delivery_date - condition parameters: - in: path name: employee_id description: 'The ID of the employee.' example: 17 required: true schema: type: integer - in: path name: employee description: 'Employee UUID' example: laboriosam required: true schema: type: string '/api/employees/{employee}/epi-deliveries/pending-renewals-count': get: summary: 'Pending EPI renewals count' operationId: pendingEPIRenewalsCount description: 'Count of pending EPI renewals for an employee' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Employees parameters: - in: path name: employee description: 'Employee UUID' example: fugit required: true schema: type: string '/api/employees/{employee_id}/epi-deliveries/{id}': get: summary: 'Show employee EPI delivery' operationId: showEmployeeEPIDelivery description: 'Show an EPI delivery for an employee' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Employees put: summary: 'Update employee EPI delivery' operationId: updateEmployeeEPIDelivery description: 'Update an EPI delivery for an employee' parameters: [] responses: { } tags: - Employees requestBody: required: false content: application/json: schema: type: object properties: epi_type_id: type: string description: 'Tipo de EPI. The uuid of an existing record in the epi_types table.' example: f67c4c9b-8c80-3366-a5d3-17174d3cde4a delivery_date: type: string description: 'Data de entrega. O campo value deve ser uma data válida.' example: '2024-01-01' quantity: type: integer description: 'Quantidade. O campo value deve ser pelo menos 1.' example: 1 condition: type: string description: Condição. example: 'Example Condition' enum: - new - used - reformed lot: type: string description: 'Lote. O campo value não pode ser superior a 255 caracteres.' example: 'Example Lot' nullable: true parameters: - in: path name: employee_id description: 'The ID of the employee.' example: 10 required: true schema: type: integer - in: path name: id description: 'EPI delivery UUID' example: neque required: true schema: type: string - in: path name: employee description: 'Employee UUID' example: ut required: true schema: type: string '/api/employees/{employee}/epi-deliveries/kit': post: summary: 'Create employee initial EPI kit' operationId: createEmployeeInitialEPIKit description: 'Register multiple EPI deliveries as initial kit' parameters: [] responses: 201: description: '' content: application/json: schema: type: object nullable: true tags: - Employees requestBody: required: true content: application/json: schema: type: object properties: delivery_date: type: string description: 'Data de entrega. O campo value deve ser uma data válida.' example: '2024-01-01' items: type: array description: 'Itens do kit. O campo value deve ter pelo menos 1 itens.' example: - null - null items: type: object properties: epi_type_id: type: string description: 'Tipo de EPI. The uuid of an existing record in the epi_types table.' example: f8a51412-fa88-3f14-a15d-485682ba4e2b quantity: type: integer description: 'Quantidade. O campo value deve ser pelo menos 1.' example: 1 condition: type: string description: Condição. example: 'Example Items * condition' enum: - new - used - reformed lot: type: string description: 'Lote. O campo value não pode ser superior a 255 caracteres.' example: 'Example Items * lot' nullable: true required: - epi_type_id - condition required: - delivery_date - items parameters: - in: path name: employee description: 'Employee UUID' example: officiis required: true schema: type: string '/api/employees/{employee}/epi-deliveries/{id}': delete: summary: 'Delete employee EPI delivery' operationId: deleteEmployeeEPIDelivery description: 'Delete an EPI delivery from an employee' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Employees parameters: - in: path name: employee description: 'Employee UUID' example: est required: true schema: type: string - in: path name: id description: 'EPI delivery UUID' example: aut required: true schema: type: string '/api/employees/{employee_id}/epi-terms': get: summary: 'List employee EPI terms' operationId: listEmployeeEPITerms description: 'List initial EPI kit terms for an employee' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Employees requestBody: required: false content: application/json: schema: type: object properties: sort_by: type: string description: '' example: delivery_date enum: - delivery_date - created_at nullable: true sort_desc: type: boolean description: '' example: false nullable: true page: type: integer description: 'O campo value deve ser pelo menos 1.' example: 24 nullable: true per_page: type: integer description: 'O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 4 nullable: true q: type: string description: '' example: nostrum nullable: true employee_id: type: string description: 'The uuid of an existing record in the employees table.' example: eos nullable: true has_term: type: boolean description: '' example: false nullable: true parameters: - in: path name: employee_id description: 'The ID of the employee.' example: 15 required: true schema: type: integer - in: path name: employee description: 'Employee UUID' example: tenetur required: true schema: type: string '/api/employees/{employee}/epi-terms/{kitUuid}/upload': post: summary: 'Upload signed EPI term' operationId: uploadSignedEPITerm description: 'Upload signed Termo de Ciência for an initial kit' parameters: [] responses: 201: description: '' content: application/json: schema: type: object nullable: true tags: - Employees requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' nullable: true file: type: object description: Arquivo. example: - example1 - example2 properties: path: type: string description: 'Caminho do arquivo.' example: 'Example File path' name: type: string description: 'Nome do arquivo.' example: 'Example Name' extension: type: string description: 'Extensão do arquivo.' example: 'Example File extension' size: type: string description: 'Tamanho do arquivo.' example: 'Example File size' mime_type: type: string description: 'File mime type.' example: 'Example File mime type' nullable: true required: - path - name - extension - size required: - file parameters: - in: path name: employee description: 'Employee UUID' example: iste required: true schema: type: string - in: path name: kitUuid description: 'Kit UUID' example: 80e8ad4f-d11d-3c32-9b5e-1673d4f1ce85 required: true schema: type: string '/api/employees/{employee}/epi-terms/{kitUuid}/document': get: summary: 'Download signed EPI term' operationId: downloadSignedEPITerm description: 'Get temporary download URL for signed term' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Employees parameters: - in: path name: employee description: 'Employee UUID' example: nostrum required: true schema: type: string - in: path name: kitUuid description: 'Kit UUID' example: c23cf65b-5f67-3ce9-a6a5-1681848167d6 required: true schema: type: string /api/up: get: summary: '' operationId: getApiUp description: '' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'API is running' properties: message: type: string example: 'API is running' tags: - Endpoints security: [] '/api/files/{uuid}': delete: summary: 'Delete file' operationId: deleteFile description: 'Delete a file' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Files parameters: - in: path name: uuid description: '' example: c57170af-54a1-324b-8178-293644457c77 required: true schema: type: integer '/api/files/{uuid}/info': get: summary: 'Get file info' operationId: getFileInfo description: 'Get file information' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: uuid: string name: string size: integer type: string extension: string path: string properties: uuid: type: string example: string name: type: string example: string size: type: string example: integer type: type: string example: string extension: type: string example: string path: type: string example: string tags: - Files parameters: - in: path name: uuid description: '' example: bad0bced-a99f-3715-88e8-4ae4ec14c9f0 required: true schema: type: integer '/api/files/{uuid}/download': get: summary: 'Generate download URL' operationId: generateDownloadURL description: 'Generate a signed URL for downloading a file' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: url: string filename: string size: integer type: string properties: url: type: string example: string filename: type: string example: string size: type: string example: integer type: type: string example: string tags: - Files parameters: - in: path name: uuid description: 'The UUID of the file to download' example: 118e22bd-56f8-3c1a-9b74-0b42072406d6 required: true schema: type: string /api/files/generate-upload-url: post: summary: 'Generate upload URL' operationId: generateUploadURL description: 'Generate a signed URL for uploading a file' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: url: string path: string headers: array properties: url: type: string example: string path: type: string example: string headers: type: string example: array tags: - Files requestBody: required: true content: application/json: schema: type: object properties: path: type: string description: Path. example: 'Example Path' mimetype: type: string description: Mimetype. example: 'Example Mimetype' public: type: boolean description: Public. example: true required: - path - mimetype - public /api/files/generate-bulk-upload-url: post: summary: 'Generate bulk upload URL' operationId: generateBulkUploadURL description: 'Generate signed URLs for uploading multiple files' parameters: [] responses: 200: description: '' content: application/json: schema: type: array items: type: object properties: url: type: string example: string path: type: string example: string headers: type: string example: array example: - url: string path: string headers: array tags: - Files requestBody: required: true content: application/json: schema: type: object properties: files: type: array description: Files. example: - null - null items: type: object properties: path: type: string description: 'Files * path.' example: 'Example Files * path' mimetype: type: string description: 'Files * mimetype.' example: 'Example Files * mimetype' public: type: boolean description: 'Files * public.' example: true required: - path - mimetype - public required: - files /api/fiscal-documents: get: summary: 'List fiscal documents' operationId: listFiscalDocuments description: 'Lista notas fiscais com filtros por busca, fornecedor, obra e período.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: null nfe_access_key: null nfe_number: null nfe_series: null issue_date: null total_value: null emit: cnpj: null name: null dest: document: null name: null financial_status: pending products_imported_at: null created_at: null - id: null nfe_access_key: null nfe_number: null nfe_series: null issue_date: null total_value: null emit: cnpj: null name: null dest: document: null name: null financial_status: pending products_imported_at: null created_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 15 to: 2 total: 2 properties: data: type: array example: - id: null nfe_access_key: null nfe_number: null nfe_series: null issue_date: null total_value: null emit: cnpj: null name: null dest: document: null name: null financial_status: pending products_imported_at: null created_at: null - id: null nfe_access_key: null nfe_number: null nfe_series: null issue_date: null total_value: null emit: cnpj: null name: null dest: document: null name: null financial_status: pending products_imported_at: null created_at: null items: type: object properties: id: type: string example: null nullable: true nfe_access_key: type: string example: null nullable: true nfe_number: type: string example: null nullable: true nfe_series: type: string example: null nullable: true issue_date: type: string example: null nullable: true total_value: type: string example: null nullable: true emit: type: object properties: cnpj: type: string example: null nullable: true name: type: string example: null nullable: true dest: type: object properties: document: type: string example: null nullable: true name: type: string example: null nullable: true financial_status: type: string example: pending products_imported_at: type: string example: null nullable: true created_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 15 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Fiscal Documents' requestBody: required: false content: application/json: schema: type: object properties: q: type: string description: '' example: explicabo supplier_id: type: string description: 'The uuid of an existing record in the suppliers table.' example: et work_id: type: string description: 'The uuid of an existing record in the works table.' example: illum start_date: type: string description: 'O campo value deve ser uma data válida.' example: '2026-08-04T16:37:10' end_date: type: string description: 'O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a start_date.' example: '2124-08-22' per_page: type: integer description: 'O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 19 post: summary: 'Create fiscal document' operationId: createFiscalDocument description: 'Registra uma NFe a partir do XML já enviado ao S3 e o vincula às obras informadas.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: null nfe_access_key: null nfe_number: null nfe_series: null issue_date: null total_value: null emit: cnpj: null name: null dest: document: null name: null financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: null nullable: true nfe_access_key: type: string example: null nullable: true nfe_number: type: string example: null nullable: true nfe_series: type: string example: null nullable: true issue_date: type: string example: null nullable: true total_value: type: string example: null nullable: true emit: type: object properties: cnpj: type: string example: null nullable: true name: type: string example: null nullable: true dest: type: object properties: document: type: string example: null nullable: true name: type: string example: null nullable: true financial_status: type: string example: pending products_imported_at: type: string example: null nullable: true created_at: type: string example: null nullable: true tags: - 'Fiscal Documents' requestBody: required: true content: application/json: schema: type: object properties: s3_file_path: type: string description: '' example: porro original_filename: type: string description: 'Must match the regex /\.xml$/i.' example: .xml$/i work_ids: type: array description: 'The uuid of an existing record in the works table.' example: - praesentium items: type: string required: - s3_file_path - original_filename '/api/fiscal-documents/{fiscalDocument}': get: summary: 'Get fiscal document' operationId: getFiscalDocument description: 'Detalha uma nota fiscal com arquivos e obras vinculadas.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: null nfe_access_key: null nfe_number: null nfe_series: null issue_date: null total_value: null emit: cnpj: null name: null dest: document: null name: null financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: null nullable: true nfe_access_key: type: string example: null nullable: true nfe_number: type: string example: null nullable: true nfe_series: type: string example: null nullable: true issue_date: type: string example: null nullable: true total_value: type: string example: null nullable: true emit: type: object properties: cnpj: type: string example: null nullable: true name: type: string example: null nullable: true dest: type: object properties: document: type: string example: null nullable: true name: type: string example: null nullable: true financial_status: type: string example: pending products_imported_at: type: string example: null nullable: true created_at: type: string example: null nullable: true tags: - 'Fiscal Documents' delete: summary: 'Delete fiscal document' operationId: deleteFiscalDocument description: 'Exclui definitivamente uma nota fiscal. Não permitido quando a nota já gerou parcelas no financeiro ou já teve produtos importados.' parameters: [] responses: 204: description: 'Nota fiscal excluída.' content: application/json: schema: type: object nullable: true tags: - 'Fiscal Documents' parameters: - in: path name: fiscalDocument description: 'UUID da nota fiscal' example: alias required: true schema: type: string '/api/fiscal-documents/{fiscalDocument}/files': post: summary: 'Attach file' operationId: attachFile description: 'Anexa um arquivo (ex.: PDF da NF) já enviado ao S3 à nota fiscal.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: null nfe_access_key: null nfe_number: null nfe_series: null issue_date: null total_value: null emit: cnpj: null name: null dest: document: null name: null financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: null nullable: true nfe_access_key: type: string example: null nullable: true nfe_number: type: string example: null nullable: true nfe_series: type: string example: null nullable: true issue_date: type: string example: null nullable: true total_value: type: string example: null nullable: true emit: type: object properties: cnpj: type: string example: null nullable: true name: type: string example: null nullable: true dest: type: object properties: document: type: string example: null nullable: true name: type: string example: null nullable: true financial_status: type: string example: pending products_imported_at: type: string example: null nullable: true created_at: type: string example: null nullable: true tags: - 'Fiscal Documents' requestBody: required: true content: application/json: schema: type: object properties: file: type: object description: '' example: [] properties: path: type: string description: '' example: voluptatem name: type: string description: '' example: enim extension: type: string description: '' example: animi size: type: string description: '' example: null nullable: true required: - path - name - extension required: - file parameters: - in: path name: fiscalDocument description: 'UUID da nota fiscal' example: eum required: true schema: type: string '/api/fiscal-documents/{fiscalDocument}/files/{file}': delete: summary: 'Detach file' operationId: detachFile description: 'Remove definitivamente um anexo da nota fiscal, inclusive o objeto no S3. O XML original da NFe não pode ser removido.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: null nfe_access_key: null nfe_number: null nfe_series: null issue_date: null total_value: null emit: cnpj: null name: null dest: document: null name: null financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: null nullable: true nfe_access_key: type: string example: null nullable: true nfe_number: type: string example: null nullable: true nfe_series: type: string example: null nullable: true issue_date: type: string example: null nullable: true total_value: type: string example: null nullable: true emit: type: object properties: cnpj: type: string example: null nullable: true name: type: string example: null nullable: true dest: type: object properties: document: type: string example: null nullable: true name: type: string example: null nullable: true financial_status: type: string example: pending products_imported_at: type: string example: null nullable: true created_at: type: string example: null nullable: true tags: - 'Fiscal Documents' parameters: - in: path name: fiscalDocument description: 'UUID da nota fiscal' example: nostrum required: true schema: type: string - in: path name: file description: 'UUID do arquivo anexado' example: vel required: true schema: type: string '/api/fiscal-documents/{fiscalDocument}/works': put: summary: 'Sync works' operationId: syncWorks description: 'Sincroniza o vínculo documental da nota fiscal com N obras.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: null nfe_access_key: null nfe_number: null nfe_series: null issue_date: null total_value: null emit: cnpj: null name: null dest: document: null name: null financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: null nullable: true nfe_access_key: type: string example: null nullable: true nfe_number: type: string example: null nullable: true nfe_series: type: string example: null nullable: true issue_date: type: string example: null nullable: true total_value: type: string example: null nullable: true emit: type: object properties: cnpj: type: string example: null nullable: true name: type: string example: null nullable: true dest: type: object properties: document: type: string example: null nullable: true name: type: string example: null nullable: true financial_status: type: string example: pending products_imported_at: type: string example: null nullable: true created_at: type: string example: null nullable: true tags: - 'Fiscal Documents' requestBody: required: false content: application/json: schema: type: object properties: work_ids: type: array description: 'The uuid of an existing record in the works table.' example: - similique items: type: string parameters: - in: path name: fiscalDocument description: 'UUID da nota fiscal' example: fugiat required: true schema: type: string /api/imports/nfe/products: post: summary: 'Create NFe Import' operationId: createNFeImport description: 'Upload and process a Brazilian NFe (Nota Fiscal Eletrônica) XML file. The file should be uploaded to S3 first, then this endpoint processes it asynchronously.' parameters: [] responses: 201: description: 'Import created successfully' content: application/json: schema: type: object example: import_id: 9d2f8e4a-1b3c-4d5e-6f7a-8b9c0d1e2f3a status: pending channel: import-progress.9d2f8e4a-1b3c-4d5e-6f7a-8b9c0d1e2f3a properties: import_id: type: string example: 9d2f8e4a-1b3c-4d5e-6f7a-8b9c0d1e2f3a status: type: string example: pending channel: type: string example: import-progress.9d2f8e4a-1b3c-4d5e-6f7a-8b9c0d1e2f3a 404: description: 'File not found in S3' content: application/json: schema: type: object example: error: 'Arquivo não encontrado no S3' properties: error: type: string example: 'Arquivo não encontrado no S3' 422: description: 'Invalid XML or not a valid NFe' content: application/json: schema: type: object example: error: 'Arquivo XML inválido ou não é uma NFe' properties: error: type: string example: 'Arquivo XML inválido ou não é uma NFe' tags: - Import requestBody: required: true content: application/json: schema: type: object properties: s3_file_path: type: string description: 'Path to the NFe XML file in S3 storage' example: imports/nfe_12345.xml original_filename: type: string description: 'Original filename of the uploaded NFe' example: nota_fiscal_001.xml import_type: type: string description: 'Type of import (currently only "nfe" is supported)' example: nfe fiscal_document_id: type: string description: 'Fiscal document id. The uuid of an existing record in the fiscal_documents table.' example: 019556e7-2e9f-777c-a177-30bbf0646c32 nullable: true required: - s3_file_path - original_filename - import_type /api/imports: get: summary: 'List Imports' operationId: listImports description: 'List all NFe imports with filtering and pagination options.' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of imports per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of imports per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 - in: query name: status description: 'Filter imports by status (pending, processing, completed, failed).' example: completed required: false schema: type: string description: 'Filter imports by status (pending, processing, completed, failed).' example: completed enum: - pending - processing - completed - failed - in: query name: import_type description: 'Filter imports by type.' example: nfe required: false schema: type: string description: 'Filter imports by type.' example: nfe enum: - initial_load - stock_update - nfe responses: 200: description: 'Imports retrieved successfully' content: application/json: schema: type: object example: data: - id: 9d2f8e4a-1b3c-4d5e-6f7a-8b9c0d1e2f3a status: completed import_type: nfe original_filename: nota_fiscal_001.xml nfe_number: '123456' nfe_date: '2023-12-01' total_products: 15 processed_products: 15 progress_percentage: 100.0 imported_at: '2023-12-01T10:30:00.000Z' supplier: name: 'Fornecedor Ltda' document: '12345678000199' properties: data: type: array example: - id: 9d2f8e4a-1b3c-4d5e-6f7a-8b9c0d1e2f3a status: completed import_type: nfe original_filename: nota_fiscal_001.xml nfe_number: '123456' nfe_date: '2023-12-01' total_products: 15 processed_products: 15 progress_percentage: 100 imported_at: '2023-12-01T10:30:00.000Z' supplier: name: 'Fornecedor Ltda' document: '12345678000199' items: type: object properties: id: type: string example: 9d2f8e4a-1b3c-4d5e-6f7a-8b9c0d1e2f3a status: type: string example: completed import_type: type: string example: nfe original_filename: type: string example: nota_fiscal_001.xml nfe_number: type: string example: '123456' nfe_date: type: string example: '2023-12-01' total_products: type: integer example: 15 processed_products: type: integer example: 15 progress_percentage: type: number example: 100.0 imported_at: type: string example: '2023-12-01T10:30:00.000Z' supplier: type: object properties: name: type: string example: 'Fornecedor Ltda' document: type: string example: '12345678000199' tags: - Import '/api/imports/{importId}': get: summary: 'Get Import Details' operationId: getImportDetails description: 'Retrieve detailed information about a specific NFe import, including progress and supplier data.' parameters: [] responses: 200: description: 'Import details retrieved successfully' content: application/json: schema: type: object example: import_id: 9d2f8e4a-1b3c-4d5e-6f7a-8b9c0d1e2f3a status: completed import_type: nfe original_filename: nota_fiscal_001.xml nfe_number: '123456' nfe_date: '2023-12-01' total_products: 15 processed_products: 10 progress_percentage: 66.67 auto_linked_count: 4 stock_launched_count: 7 pending_stock_launch_count: 3 imported_by: 'João Silva' imported_at: '2023-12-01T10:30:00.000Z' supplier: id: supplier-uuid name: 'Fornecedor Ltda' document: '12345678000199' channel: import-progress.9d2f8e4a-1b3c-4d5e-6f7a-8b9c0d1e2f3a properties: import_id: type: string example: 9d2f8e4a-1b3c-4d5e-6f7a-8b9c0d1e2f3a status: type: string example: completed import_type: type: string example: nfe original_filename: type: string example: nota_fiscal_001.xml nfe_number: type: string example: '123456' nfe_date: type: string example: '2023-12-01' total_products: type: integer example: 15 processed_products: type: integer example: 10 progress_percentage: type: number example: 66.67 auto_linked_count: type: integer example: 4 stock_launched_count: type: integer example: 7 pending_stock_launch_count: type: integer example: 3 imported_by: type: string example: 'João Silva' imported_at: type: string example: '2023-12-01T10:30:00.000Z' supplier: type: object properties: id: type: string example: supplier-uuid name: type: string example: 'Fornecedor Ltda' document: type: string example: '12345678000199' channel: type: string example: import-progress.9d2f8e4a-1b3c-4d5e-6f7a-8b9c0d1e2f3a tags: - Import delete: summary: 'Delete Import' operationId: deleteImport description: 'Delete an NFe import along with its supplier products and pending link mappings. Only allowed when no imported product has been linked to a system product and the import is not being processed.' parameters: [] responses: 204: description: 'Import deleted successfully' content: application/json: schema: type: object nullable: true 422: description: 'Import has linked products or is still processing' content: application/json: schema: type: object example: error: 'Não é possível excluir uma importação com produtos já vinculados.' properties: error: type: string example: 'Não é possível excluir uma importação com produtos já vinculados.' tags: - Import parameters: - in: path name: importId description: '' example: pariatur required: true schema: type: string '/api/imports/{importId}/products': get: summary: 'Get Import Products' operationId: getImportProducts description: 'List all products from a specific NFe import with filtering and pagination options.' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of products per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of products per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 - in: query name: status description: 'Filter products by processing status (pending, processed).' example: pending required: false schema: type: string description: 'Filter products by processing status (pending, processed).' example: pending enum: - pending - processed nullable: true - in: query name: q description: 'Search products by name / code / EAN. O campo value não pode ser superior a 255 caracteres.' example: 'Produto ABC' required: false schema: type: string description: 'Search products by name / code / EAN. O campo value não pode ser superior a 255 caracteres.' example: 'Produto ABC' nullable: true responses: 200: description: 'Products retrieved successfully' content: application/json: schema: type: object example: import: id: 9d2f8e4a-1b3c-4d5e-6f7a-8b9c0d1e2f3a total_products: 15 processed_products: 10 progress_percentage: 66.67 products: data: - id: product-uuid supplier_product_code: ABC123 ean_code: '7891234567890' name: 'Nome do Produto' unit: UN quantity: 10 unit_price: 15.5 total_price: 155.0 is_processed: false system_product: null linked_at: null linked_by: null has_stock_movement: false pagination: current_page: 1 per_page: 15 total: 15 last_page: 1 properties: import: type: object properties: id: type: string example: 9d2f8e4a-1b3c-4d5e-6f7a-8b9c0d1e2f3a total_products: type: integer example: 15 processed_products: type: integer example: 10 progress_percentage: type: number example: 66.67 products: type: object properties: data: type: array example: - id: product-uuid supplier_product_code: ABC123 ean_code: '7891234567890' name: 'Nome do Produto' unit: UN quantity: 10 unit_price: 15.5 total_price: 155 is_processed: false system_product: null linked_at: null linked_by: null has_stock_movement: false items: type: object properties: id: type: string example: product-uuid supplier_product_code: type: string example: ABC123 ean_code: type: string example: '7891234567890' name: type: string example: 'Nome do Produto' unit: type: string example: UN quantity: type: integer example: 10 unit_price: type: number example: 15.5 total_price: type: number example: 155.0 is_processed: type: boolean example: false system_product: type: string example: null nullable: true linked_at: type: string example: null nullable: true linked_by: type: string example: null nullable: true has_stock_movement: type: boolean example: false pagination: type: object properties: current_page: type: integer example: 1 per_page: type: integer example: 15 total: type: integer example: 15 last_page: type: integer example: 1 tags: - Import parameters: - in: path name: importId description: '' example: occaecati required: true schema: type: string '/api/imports/{importId}/distributions': get: summary: 'List Import Stock Distributions' operationId: listImportStockDistributions description: 'Return, per imported product, how the purchased quantity was distributed across stocks (works and main). Aggregated from stock movements generated by the import.' parameters: [] responses: 200: description: 'Distribution breakdown per product' content: application/json: schema: type: object example: data: - product: id: product-uuid name: 'Cano PVC XPTO' total: 50 by_stock: - stock: id: stock-uuid-a name: 'Obra A' is_main: false quantity: 10 - stock: id: stock-uuid-b name: 'Obra B' is_main: false quantity: 30 - stock: id: main-uuid name: Principal is_main: true quantity: 10 properties: data: type: array example: - product: id: product-uuid name: 'Cano PVC XPTO' total: 50 by_stock: - stock: id: stock-uuid-a name: 'Obra A' is_main: false quantity: 10 - stock: id: stock-uuid-b name: 'Obra B' is_main: false quantity: 30 - stock: id: main-uuid name: Principal is_main: true quantity: 10 items: type: object properties: product: type: object properties: id: type: string example: product-uuid name: type: string example: 'Cano PVC XPTO' total: type: integer example: 50 by_stock: type: array example: - stock: id: stock-uuid-a name: 'Obra A' is_main: false quantity: 10 - stock: id: stock-uuid-b name: 'Obra B' is_main: false quantity: 30 - stock: id: main-uuid name: Principal is_main: true quantity: 10 items: type: object properties: stock: type: object properties: id: type: string example: stock-uuid-a name: type: string example: 'Obra A' is_main: type: boolean example: false quantity: type: integer example: 10 tags: - Import parameters: - in: path name: importId description: '' example: et required: true schema: type: string '/api/imports/{importId}/products/link': post: summary: 'Link Products' operationId: linkProducts description: 'Inicia, de forma assíncrona, a vinculação de produtos do fornecedor a produtos do sistema ou criação de novos itens no estoque. Retorna 202 com o canal para acompanhar o progresso.' parameters: [] responses: 202: description: 'Linking accepted and started asynchronously' content: application/json: schema: type: object example: message: 'Vinculação de produtos iniciada com sucesso' total_mappings: 2 channel: 'imports.{import-uuid}' properties: message: type: string example: 'Vinculação de produtos iniciada com sucesso' total_mappings: type: integer example: 2 channel: type: string example: 'imports.{import-uuid}' 422: description: 'Error linking products' content: application/json: schema: type: object example: error: 'Erro ao vincular produtos: Product not found' properties: error: type: string example: 'Erro ao vincular produtos: Product not found' tags: - Import requestBody: required: true content: application/json: schema: type: object properties: mappings: type: array description: 'Array of product mappings' example: - ut items: type: string required: - mappings parameters: - in: path name: importId description: '' example: facere required: true schema: type: string /api/locations/states: get: summary: 'List states' operationId: listStates description: 'List all states paginated' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: null name: 'nam laborum' abbreviation: KN - id: null name: 'accusamus laudantium' abbreviation: SE links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 30 to: 2 total: 2 properties: data: type: array example: - id: null name: 'nam laborum' abbreviation: KN - id: null name: 'accusamus laudantium' abbreviation: SE items: type: object properties: id: type: string example: null nullable: true name: type: string example: 'nam laborum' abbreviation: type: string example: KN links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 30 to: type: integer example: 2 total: type: integer example: 2 tags: - Locations requestBody: required: false content: application/json: schema: type: object properties: sort_by: type: string description: '' example: voluptatum nullable: true sort_desc: type: boolean description: '' example: false nullable: true page: type: integer description: 'O campo value deve ser pelo menos 1.' example: 89 nullable: true per_page: type: integer description: 'O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 12 nullable: true '/api/locations/states/{state}/cities': get: summary: 'List cities by state' operationId: listCitiesByState description: 'List all cities for a given state' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: null name: Corwinborough - id: null name: 'North Sigmundchester' properties: data: type: array example: - id: null name: Corwinborough - id: null name: 'North Sigmundchester' items: type: object properties: id: type: string example: null nullable: true name: type: string example: Corwinborough tags: - Locations parameters: - in: path name: state description: 'State UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string /api/notifications: get: summary: 'List notifications' operationId: listNotifications description: 'List user notifications' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 - in: query name: module description: 'Filter by module name. O campo value não pode ser superior a 100 caracteres.' example: CashFlow required: false schema: type: string description: 'Filter by module name. O campo value não pode ser superior a 100 caracteres.' example: CashFlow nullable: true - in: query name: type description: 'Filter by type (ex.: info, success, warning, error). O campo value não pode ser superior a 100 caracteres.' example: success required: false schema: type: string description: 'Filter by type (ex.: info, success, warning, error). O campo value não pode ser superior a 100 caracteres.' example: success nullable: true - in: query name: priority description: 'Filter by priority number. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 255.' example: 10 required: false schema: type: integer description: 'Filter by priority number. O campo value deve ser pelo menos 0. O campo value não pode ser superior a 255.' example: 10 nullable: true - in: query name: unread_only description: 'Only unread notifications when true.' example: true required: false schema: type: boolean description: 'Only unread notifications when true.' example: true nullable: true - in: query name: read_status description: 'Filter by read status (all, read, unread).' example: unread required: false schema: type: string description: 'Filter by read status (all, read, unread).' example: unread enum: - all - read - unread nullable: true - in: query name: date_start description: 'Filter notifications created from this date (YYYY-MM-DD). O campo value deve ser uma data válida.' example: '2024-01-01' required: false schema: type: string description: 'Filter notifications created from this date (YYYY-MM-DD). O campo value deve ser uma data válida.' example: '2024-01-01' nullable: true - in: query name: date_end description: 'Filter notifications created until this date (YYYY-MM-DD). O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a date_start.' example: '2024-12-31' required: false schema: type: string description: 'Filter notifications created until this date (YYYY-MM-DD). O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a date_start.' example: '2024-12-31' nullable: true - in: query name: q description: 'Search by title/message. O campo value não pode ser superior a 255 caracteres.' example: 'erro faturamento' required: false schema: type: string description: 'Search by title/message. O campo value não pode ser superior a 255 caracteres.' example: 'erro faturamento' nullable: true responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Notifications /api/notifications/mark-as-read: post: summary: 'Mark notifications as read' operationId: markNotificationsAsRead description: 'Mark one or many notifications as read' parameters: [] responses: { } tags: - Notifications requestBody: required: true content: application/json: schema: type: object properties: notifications: type: array description: 'notificação. O campo value deve ser um UUID válido.' example: - 'Example Notifications *' items: type: string required: - notifications /api/notifications/mark-as-unread: post: summary: 'Mark notifications as unread' operationId: markNotificationsAsUnread description: 'Mark one or many notifications as unread' parameters: [] responses: { } tags: - Notifications requestBody: required: true content: application/json: schema: type: object properties: notifications: type: array description: 'notificação. O campo value deve ser um UUID válido.' example: - 'Example Notifications *' items: type: string required: - notifications /api/notifications/mark-all-as-read: post: summary: 'Mark all notifications as read' operationId: markAllNotificationsAsRead description: 'Mark all user notifications as read' parameters: [] responses: { } tags: - Notifications /api/notifications/unread-count: get: summary: 'Unread notifications count' operationId: unreadNotificationsCount description: 'Count of unread notifications for the user' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Notifications /api/payment-receipts: get: summary: 'List payment receipts' operationId: listPaymentReceipts description: 'List all payment receipts with filters' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 - in: query name: q description: 'Search query (searches in receiver name, document, and receipt number).' example: 'João Silva' required: false schema: type: string description: 'Search query (searches in receiver name, document, and receipt number).' example: 'João Silva' nullable: true - in: query name: employee_id description: 'Filter by employee UUID. The uuid of an existing record in the employees table.' example: a01edd80-bf3e-40f7-8613-ccb4be5831b3 required: false schema: type: string description: 'Filter by employee UUID. The uuid of an existing record in the employees table.' example: a01edd80-bf3e-40f7-8613-ccb4be5831b3 - in: query name: receiver_type description: 'Filter by receiver type.' example: employee required: false schema: type: string description: 'Filter by receiver type.' example: employee enum: - employee - custom - in: query name: start_date description: 'Filter by issue date (start). O campo value deve ser uma data válida.' example: '2025-01-01' required: false schema: type: string description: 'Filter by issue date (start). O campo value deve ser uma data válida.' example: '2025-01-01' - in: query name: end_date description: 'Filter by issue date (end). O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a start_date.' example: '2025-12-31' required: false schema: type: string description: 'Filter by issue date (end). O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a start_date.' example: '2025-12-31' - in: query name: min_amount description: 'Filter by minimum amount. O campo value deve ser pelo menos 0.' example: 100.0 required: false schema: type: number description: 'Filter by minimum amount. O campo value deve ser pelo menos 0.' example: 100.0 - in: query name: max_amount description: 'Filter by maximum amount. O campo value deve ser pelo menos 0.' example: 1000.0 required: false schema: type: number description: 'Filter by maximum amount. O campo value deve ser pelo menos 0.' example: 1000.0 - in: query name: payment_method description: 'Filter by payment method.' example: PIX required: false schema: type: string description: 'Filter by payment method.' example: PIX - in: query name: city description: 'Filter by city.' example: 'São Paulo' required: false schema: type: string description: 'Filter by city.' example: 'São Paulo' - in: query name: search description: '' example: modi required: false schema: type: string description: '' example: modi - in: query name: document description: '' example: dolorem required: false schema: type: string description: '' example: dolorem - in: query name: work_id description: 'Filter by work UUID. O campo value deve ser um UUID válido. The uuid of an existing record in the works table.' example: a01edd80-bf3e-40f7-8613-ccb4be5831b3 required: false schema: type: string description: 'Filter by work UUID. O campo value deve ser um UUID válido. The uuid of an existing record in the works table.' example: a01edd80-bf3e-40f7-8613-ccb4be5831b3 nullable: true - in: query name: bank_account_id description: 'Filter by bank account UUID. O campo value deve ser um UUID válido. The uuid of an existing record in the bank_accounts table.' example: a01edd80-bf3e-40f7-8613-ccb4be5831b3 required: false schema: type: string description: 'Filter by bank account UUID. O campo value deve ser um UUID válido. The uuid of an existing record in the bank_accounts table.' example: a01edd80-bf3e-40f7-8613-ccb4be5831b3 nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: ff115612-01aa-3b1b-a6cb-3379f4e68381 receipt_number: REC-8460 receiver_type: employee receiver: id: null name: 'Gerard Kohler' document: 773.406.599-33 payment: amount: 4821.02 amount_in_words: 'Valor por extenso de teste' method: check description: 'Aut vel vel dolor et.' issuer: name: "D'Amore-Langworth" document: 62.574.550/3156-20 issue: date: '2026-07-29' city: 'South Justina' state: SC created_by: id: a26c93fd-fb1e-4c2e-942f-9fa86c5da2c2 name: 'Christy Frami' created_at: null updated_at: null - id: 2261e0d3-bc6c-30c5-9006-d7c77ce04b0a receipt_number: REC-0299 receiver_type: employee receiver: id: null name: 'Turner Gleichner' document: 615.077.424-97 payment: amount: 6002.21 amount_in_words: 'Valor por extenso de teste' method: bank_transfer description: 'Cum atque nam explicabo minus atque nihil nihil.' issuer: name: 'Koepp, Koelpin and Champlin' document: 60.868.303/2981-60 issue: date: '2026-08-01' city: Jermaineborough state: RS created_by: id: a26c93fd-fe7b-4c53-931b-38cf323a9ae4 name: 'Ms. Opal Balistreri' created_at: null updated_at: null pagination: total: 2 count: 2 per_page: 10 current_page: 1 total_pages: 1 has_more_pages: false links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: ff115612-01aa-3b1b-a6cb-3379f4e68381 receipt_number: REC-8460 receiver_type: employee receiver: id: null name: 'Gerard Kohler' document: 773.406.599-33 payment: amount: 4821.02 amount_in_words: 'Valor por extenso de teste' method: check description: 'Aut vel vel dolor et.' issuer: name: "D'Amore-Langworth" document: 62.574.550/3156-20 issue: date: '2026-07-29' city: 'South Justina' state: SC created_by: id: a26c93fd-fb1e-4c2e-942f-9fa86c5da2c2 name: 'Christy Frami' created_at: null updated_at: null - id: 2261e0d3-bc6c-30c5-9006-d7c77ce04b0a receipt_number: REC-0299 receiver_type: employee receiver: id: null name: 'Turner Gleichner' document: 615.077.424-97 payment: amount: 6002.21 amount_in_words: 'Valor por extenso de teste' method: bank_transfer description: 'Cum atque nam explicabo minus atque nihil nihil.' issuer: name: 'Koepp, Koelpin and Champlin' document: 60.868.303/2981-60 issue: date: '2026-08-01' city: Jermaineborough state: RS created_by: id: a26c93fd-fe7b-4c53-931b-38cf323a9ae4 name: 'Ms. Opal Balistreri' created_at: null updated_at: null items: type: object properties: id: type: string example: ff115612-01aa-3b1b-a6cb-3379f4e68381 receipt_number: type: string example: REC-8460 receiver_type: type: string example: employee receiver: type: object properties: id: type: string example: null nullable: true name: type: string example: 'Gerard Kohler' document: type: string example: 773.406.599-33 payment: type: object properties: amount: type: number example: 4821.02 amount_in_words: type: string example: 'Valor por extenso de teste' method: type: string example: check description: type: string example: 'Aut vel vel dolor et.' issuer: type: object properties: name: type: string example: "D'Amore-Langworth" document: type: string example: 62.574.550/3156-20 issue: type: object properties: date: type: string example: '2026-07-29' city: type: string example: 'South Justina' state: type: string example: SC created_by: type: object properties: id: type: string example: a26c93fd-fb1e-4c2e-942f-9fa86c5da2c2 name: type: string example: 'Christy Frami' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true pagination: type: object properties: total: type: integer example: 2 count: type: integer example: 2 per_page: type: integer example: 10 current_page: type: integer example: 1 total_pages: type: integer example: 1 has_more_pages: type: boolean example: false links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Payment Receipts' post: summary: 'Create payment receipt' operationId: createPaymentReceipt description: 'Create a new payment receipt' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Payment Receipts' requestBody: required: true content: application/json: schema: type: object properties: receiver_type: type: string description: 'Tipo de Recebedor.' example: 'Example Receiver type' enum: - employee - custom employee_id: type: string description: 'Funcionário. This field is required when receiver_type is employee. The uuid of an existing record in the employees table.' example: aaf63b47-e513-487b-9c3d-c67609a112ea nullable: true receiver_name: type: string description: 'Nome do Recebedor. This field is required when receiver_type is custom. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' nullable: true receiver_document: type: string description: 'Documento do Recebedor. This field is required when receiver_type is custom. O campo value não pode ser superior a 255 caracteres.' example: 'Example Receiver document' nullable: true amount: type: number description: 'Valor. O campo value deve ser pelo menos 0.01.' example: 1.0 amount_in_words: type: string description: 'Valor por Extenso.' example: 'Example Amount in words' payment_method: type: string description: 'Método de Pagamento.' example: 'Example Payment method' enum: - pix - bank_transfer - cash - check description: type: string description: Descrição. example: 'Example Description' issuer_name: type: string description: 'Nome do Emissor. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' issuer_document: type: string description: 'Documento do Emissor. O campo value não pode ser superior a 255 caracteres.' example: 'Example Issuer document' issue_date: type: string description: 'Data de Emissão. O campo value deve ser uma data válida. O campo value deve ser uma data anterior ou igual a today.' example: '2024-01-01' city: type: string description: 'Cidade. O campo value não pode ser superior a 255 caracteres.' example: 'Example City' state: type: string description: 'Estado. O campo value não pode ser superior a 2 caracteres.' example: 'Example State' work_id: type: string description: 'Obra. O campo value deve ser um UUID válido. The uuid of an existing record in the works table.' example: 0e9ccb98-65e7-3de8-9cc0-c77767120f70 nullable: true bank_account_id: type: string description: 'Conta Bancária. O campo value deve ser um UUID válido. The uuid of an existing record in the bank_accounts table.' example: 496aa1a5-da22-3d39-adda-8728edcf9f33 nullable: true required: - receiver_type - amount - payment_method - description - issuer_name - issuer_document - issue_date - city - state /api/payment-receipts/cash-flow-config: get: summary: 'Show receipt cash flow config' operationId: showReceiptCashFlowConfig description: 'Lista cada forma de pagamento e se ela gera lancamento automatico no fluxo de caixa' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Payment Receipts' put: summary: 'Update receipt cash flow config' operationId: updateReceiptCashFlowConfig description: 'Define, por forma de pagamento, se o recibo gera lancamento automatico no fluxo de caixa' parameters: [] responses: { } tags: - 'Payment Receipts' requestBody: required: true content: application/json: schema: type: object properties: methods: type: array description: 'O campo value deve ter pelo menos 1 itens.' example: - [] items: type: object properties: method: type: string description: '' example: bank_transfer enum: - pix - bank_transfer - cash - check eligible: type: boolean description: '' example: false required: - method - eligible required: - methods '/api/payment-receipts/{receipt}': get: summary: 'Show payment receipt' operationId: showPaymentReceipt description: 'Show a payment receipt' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: d15fedc4-61cb-3117-8015-254de397cb62 receipt_number: REC-7442 receiver_type: custom receiver: id: null name: 'Ettie Douglas PhD' document: 048.869.898-38 payment: amount: 5985.98 amount_in_words: 'Valor por extenso de teste' method: cash description: 'Labore quasi quo ad nisi eum repellendus voluptatem.' issuer: name: 'Barrows and Sons' document: 87.454.897/6251-86 issue: date: '2026-07-19' city: Garrisonstad state: PE created_by: id: a26c93fe-0df5-4762-8d14-077e87bde825 name: 'Jeanie Kulas' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: d15fedc4-61cb-3117-8015-254de397cb62 receipt_number: type: string example: REC-7442 receiver_type: type: string example: custom receiver: type: object properties: id: type: string example: null nullable: true name: type: string example: 'Ettie Douglas PhD' document: type: string example: 048.869.898-38 payment: type: object properties: amount: type: number example: 5985.98 amount_in_words: type: string example: 'Valor por extenso de teste' method: type: string example: cash description: type: string example: 'Labore quasi quo ad nisi eum repellendus voluptatem.' issuer: type: object properties: name: type: string example: 'Barrows and Sons' document: type: string example: 87.454.897/6251-86 issue: type: object properties: date: type: string example: '2026-07-19' city: type: string example: Garrisonstad state: type: string example: PE created_by: type: object properties: id: type: string example: a26c93fe-0df5-4762-8d14-077e87bde825 name: type: string example: 'Jeanie Kulas' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Payment Receipts' put: summary: 'Update payment receipt' operationId: updatePaymentReceipt description: 'Update a payment receipt' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Payment Receipts' requestBody: required: false content: application/json: schema: type: object properties: receiver_type: type: string description: 'Tipo de Recebedor.' example: 'Example Receiver type' enum: - employee - custom employee_id: type: string description: 'Funcionário. This field is required when receiver_type is employee. The uuid of an existing record in the employees table.' example: a8053a0e-fe0f-48c6-b618-d75a227652cd nullable: true receiver_name: type: string description: 'Nome do Recebedor. This field is required when receiver_type is custom. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' nullable: true receiver_document: type: string description: 'Documento do Recebedor. This field is required when receiver_type is custom. O campo value não pode ser superior a 255 caracteres.' example: 'Example Receiver document' nullable: true amount: type: number description: 'Valor. O campo value deve ser pelo menos 0.01.' example: 1.0 amount_in_words: type: string description: 'Valor por Extenso.' example: 'Example Amount in words' payment_method: type: string description: 'Método de Pagamento.' example: 'Example Payment method' enum: - pix - bank_transfer - cash - check description: type: string description: Descrição. example: 'Example Description' issuer_name: type: string description: 'Nome do Emissor. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' issuer_document: type: string description: 'Documento do Emissor. O campo value não pode ser superior a 255 caracteres.' example: 'Example Issuer document' issue_date: type: string description: 'Data de Emissão. O campo value deve ser uma data válida. O campo value deve ser uma data anterior ou igual a today.' example: '2024-01-01' city: type: string description: 'Cidade. O campo value não pode ser superior a 255 caracteres.' example: 'Example City' state: type: string description: 'Estado. O campo value não pode ser superior a 2 caracteres.' example: 'Example State' work_id: type: string description: 'Obra. O campo value deve ser um UUID válido. The uuid of an existing record in the works table.' example: 5e7415ae-2693-387b-b336-238b4b97a53d nullable: true bank_account_id: type: string description: 'Conta Bancária. O campo value deve ser um UUID válido. The uuid of an existing record in the bank_accounts table.' example: df0b9ccd-f472-3a42-ac20-c33418e16f9a nullable: true delete: summary: 'Delete payment receipt' operationId: deletePaymentReceipt description: 'Delete a payment receipt' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Payment Receipts' parameters: - in: path name: receipt description: 'Payment Receipt ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/employees/{employee_id}/receipts': get: summary: 'List employee receipts' operationId: listEmployeeReceipts description: 'List all payment receipts for a specific employee' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 9bc0674a-ee27-37aa-a516-8d4cb8104714 receipt_number: REC-3028 receiver_type: custom receiver: id: null name: 'Kaelyn Thompson DDS' document: 164.193.879-19 payment: amount: 5138.47 amount_in_words: 'Valor por extenso de teste' method: bank_transfer description: 'Dolor cum at incidunt non optio enim rerum.' issuer: name: 'Weber Group' document: 35.162.275/3740-26 issue: date: '2026-07-18' city: 'Port Leonel' state: SP created_by: id: a26c93fe-3db6-453a-a461-35e4f00e4d7e name: 'Dennis Graham' created_at: null updated_at: null - id: 6ccbdc7c-2f31-317c-b2e5-00a9c71d1101 receipt_number: REC-4314 receiver_type: employee receiver: id: null name: 'Mr. Brett Lesch' document: 832.315.808-30 payment: amount: 2699.73 amount_in_words: 'Valor por extenso de teste' method: check description: 'Minima atque in perspiciatis cum autem sed exercitationem.' issuer: name: Klein-Wiza document: 31.633.661/5997-63 issue: date: '2026-07-08' city: 'West Sabina' state: PE created_by: id: a26c93fe-3fdc-4efc-a578-6128caf07e5d name: 'Malvina Wolff' created_at: null updated_at: null pagination: total: 2 count: 2 per_page: 10 current_page: 1 total_pages: 1 has_more_pages: false links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 9bc0674a-ee27-37aa-a516-8d4cb8104714 receipt_number: REC-3028 receiver_type: custom receiver: id: null name: 'Kaelyn Thompson DDS' document: 164.193.879-19 payment: amount: 5138.47 amount_in_words: 'Valor por extenso de teste' method: bank_transfer description: 'Dolor cum at incidunt non optio enim rerum.' issuer: name: 'Weber Group' document: 35.162.275/3740-26 issue: date: '2026-07-18' city: 'Port Leonel' state: SP created_by: id: a26c93fe-3db6-453a-a461-35e4f00e4d7e name: 'Dennis Graham' created_at: null updated_at: null - id: 6ccbdc7c-2f31-317c-b2e5-00a9c71d1101 receipt_number: REC-4314 receiver_type: employee receiver: id: null name: 'Mr. Brett Lesch' document: 832.315.808-30 payment: amount: 2699.73 amount_in_words: 'Valor por extenso de teste' method: check description: 'Minima atque in perspiciatis cum autem sed exercitationem.' issuer: name: Klein-Wiza document: 31.633.661/5997-63 issue: date: '2026-07-08' city: 'West Sabina' state: PE created_by: id: a26c93fe-3fdc-4efc-a578-6128caf07e5d name: 'Malvina Wolff' created_at: null updated_at: null items: type: object properties: id: type: string example: 9bc0674a-ee27-37aa-a516-8d4cb8104714 receipt_number: type: string example: REC-3028 receiver_type: type: string example: custom receiver: type: object properties: id: type: string example: null nullable: true name: type: string example: 'Kaelyn Thompson DDS' document: type: string example: 164.193.879-19 payment: type: object properties: amount: type: number example: 5138.47 amount_in_words: type: string example: 'Valor por extenso de teste' method: type: string example: bank_transfer description: type: string example: 'Dolor cum at incidunt non optio enim rerum.' issuer: type: object properties: name: type: string example: 'Weber Group' document: type: string example: 35.162.275/3740-26 issue: type: object properties: date: type: string example: '2026-07-18' city: type: string example: 'Port Leonel' state: type: string example: SP created_by: type: object properties: id: type: string example: a26c93fe-3db6-453a-a461-35e4f00e4d7e name: type: string example: 'Dennis Graham' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true pagination: type: object properties: total: type: integer example: 2 count: type: integer example: 2 per_page: type: integer example: 10 current_page: type: integer example: 1 total_pages: type: integer example: 1 has_more_pages: type: boolean example: false links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Payment Receipts' parameters: - in: path name: employee_id description: 'The ID of the employee.' example: 4 required: true schema: type: integer - in: path name: employee description: 'Employee ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string /api/permission-groups/ungrouped-permissions: get: summary: 'List ungrouped permissions' operationId: listUngroupedPermissions description: 'List all permissions that do not belong to any permission group.' parameters: - in: query name: q description: 'Search query.' example: 'Permission name' required: false schema: type: string description: 'Search query.' example: 'Permission name' nullable: true - in: query name: page description: 'Page number. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number. O campo value deve ser pelo menos 1.' example: 1 - in: query name: per_page description: 'Items per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 10 required: false schema: type: integer description: 'Items per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 10 responses: 200: description: '' content: application/json: schema: type: object example: data: - id: d58c2125-03b3-3928-91e7-9d7066d86619 name: eius display_name: 'Dignissimos culpa veritatis id.' - id: 6124b555-f024-3cf7-bb27-8b10eacba535 name: adipisci display_name: 'Et sed fugit quidem voluptas nemo.' links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: d58c2125-03b3-3928-91e7-9d7066d86619 name: eius display_name: 'Dignissimos culpa veritatis id.' - id: 6124b555-f024-3cf7-bb27-8b10eacba535 name: adipisci display_name: 'Et sed fugit quidem voluptas nemo.' items: type: object properties: id: type: string example: d58c2125-03b3-3928-91e7-9d7066d86619 name: type: string example: eius display_name: type: string example: 'Dignissimos culpa veritatis id.' links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Permission Groups' /api/permission-groups: get: summary: 'List permission groups' operationId: listPermissionGroups description: 'List all permission groups' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 823be50a-20f1-3147-b602-13a7f685c198 name: est-consequatur display_name: 'eveniet alias quia' created_at: null updated_at: null - id: 09d42195-f358-3453-ac4a-933c68ed29b2 name: a-mollitia display_name: 'nobis ab enim' created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 823be50a-20f1-3147-b602-13a7f685c198 name: est-consequatur display_name: 'eveniet alias quia' created_at: null updated_at: null - id: 09d42195-f358-3453-ac4a-933c68ed29b2 name: a-mollitia display_name: 'nobis ab enim' created_at: null updated_at: null items: type: object properties: id: type: string example: 823be50a-20f1-3147-b602-13a7f685c198 name: type: string example: est-consequatur display_name: type: string example: 'eveniet alias quia' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Permission Groups' post: summary: 'Create permission group' operationId: createPermissionGroup description: 'Create a new permission group' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Permission Groups' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Name. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' display_name: type: string description: 'Display name. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' required: - name - display_name '/api/permission-groups/{permissionGroup}': put: summary: 'Update permission group' operationId: updatePermissionGroup description: 'Update a permission group' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Permission Groups' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Name. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' display_name: type: string description: 'Display name. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' get: summary: 'Show permission group' operationId: showPermissionGroup description: 'Show a permission group' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: f0789a10-eb9b-3cae-90a9-271b40ec51d7 name: saepe-ea-architecto display_name: 'excepturi voluptas enim' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: f0789a10-eb9b-3cae-90a9-271b40ec51d7 name: type: string example: saepe-ea-architecto display_name: type: string example: 'excepturi voluptas enim' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Permission Groups' delete: summary: 'Delete permission group' operationId: deletePermissionGroup description: 'Delete a permission group' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Permission Groups' parameters: - in: path name: permissionGroup description: '' example: 1 required: true schema: type: integer '/api/permission-groups/{permissionGroup}/permissions': post: summary: 'Attach permissions to group' operationId: attachPermissionsToGroup description: 'Attach one or more permissions to a permission group. Permissions already in another group are moved to this group.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 11329154-3110-3c04-aaff-ebecdc04086d name: provident-culpa-reiciendis display_name: 'sit sed reiciendis' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 11329154-3110-3c04-aaff-ebecdc04086d name: type: string example: provident-culpa-reiciendis display_name: type: string example: 'sit sed reiciendis' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Permission Groups' requestBody: required: true content: application/json: schema: type: object properties: permissions: type: array description: 'ID da permissão. O campo value deve ser um UUID válido. The uuid of an existing record in the permissions table.' example: - e59c3be4-0ab4-3b2e-a886-387d591098f4 items: type: string required: - permissions delete: summary: 'Detach permissions from group' operationId: detachPermissionsFromGroup description: 'Detach one or more permissions from a permission group. Fails if any permission does not belong to the group.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: a05259e7-d755-3e84-9a26-0f531ccab0e5 name: occaecati-veritatis display_name: 'porro expedita incidunt' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: a05259e7-d755-3e84-9a26-0f531ccab0e5 name: type: string example: occaecati-veritatis display_name: type: string example: 'porro expedita incidunt' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Permission Groups' requestBody: required: true content: application/json: schema: type: object properties: permissions: type: array description: 'ID da permissão. O campo value deve ser um UUID válido. The uuid of an existing record in the permissions table.' example: - 74946861-0977-3553-a5d0-da9f0b75faf9 items: type: string required: - permissions parameters: - in: path name: permissionGroup description: '' example: 1 required: true schema: type: integer /api/product-brands: get: summary: 'List product brands' operationId: listProductBrands description: 'List all product brands' parameters: - in: query name: q description: '' example: Structure required: false schema: type: string description: '' example: Structure nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: b92bd9fb-76a5-3087-8d78-f57bfc19c4bf name: 'Srta. Nayara Pontes' created_at: null updated_at: null - id: 84da330b-7b1f-3a5f-9c7a-6dc8816d553c name: 'Sr. Ricardo Faria Lourenço Neto' created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: b92bd9fb-76a5-3087-8d78-f57bfc19c4bf name: 'Srta. Nayara Pontes' created_at: null updated_at: null - id: 84da330b-7b1f-3a5f-9c7a-6dc8816d553c name: 'Sr. Ricardo Faria Lourenço Neto' created_at: null updated_at: null items: type: object properties: id: type: string example: b92bd9fb-76a5-3087-8d78-f57bfc19c4bf name: type: string example: 'Srta. Nayara Pontes' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Product Brands' post: summary: 'Create product brand' operationId: createProductBrand description: 'Create a new product brand' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Product Brands' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' required: - name '/api/product-brands/{productBrand}': get: summary: 'Show product brand' operationId: showProductBrand description: 'Show a product brand' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 286af350-717f-3835-b83a-27a5d8553161 name: 'Sr. Luan Godói Alcantara Jr.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 286af350-717f-3835-b83a-27a5d8553161 name: type: string example: 'Sr. Luan Godói Alcantara Jr.' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Product Brands' put: summary: 'Update product brand' operationId: updateProductBrand description: 'Update a product brand' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Product Brands' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' required: - name delete: summary: 'Delete product brand' operationId: deleteProductBrand description: 'Delete a product brand' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Product Brands' parameters: - in: path name: productBrand description: 'Product brand UUID' example: et required: true schema: type: string /api/product-families: get: summary: 'List product families' operationId: listProductFamilies description: 'List all product families' parameters: - in: query name: q description: '' example: Structure required: false schema: type: string description: '' example: Structure nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: fbe640b0-48c1-3b3a-b28c-fdb0d6f85e25 name: 'Rogério Fabiano Maia' created_at: null updated_at: null - id: 38e25a47-d33c-39f0-9f3c-0bc7c0f76879 name: 'Benedito Caio Romero Neto' created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: fbe640b0-48c1-3b3a-b28c-fdb0d6f85e25 name: 'Rogério Fabiano Maia' created_at: null updated_at: null - id: 38e25a47-d33c-39f0-9f3c-0bc7c0f76879 name: 'Benedito Caio Romero Neto' created_at: null updated_at: null items: type: object properties: id: type: string example: fbe640b0-48c1-3b3a-b28c-fdb0d6f85e25 name: type: string example: 'Rogério Fabiano Maia' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Product Families' post: summary: 'Create product family' operationId: createProductFamily description: 'Create a new product family' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Product Families' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' required: - name '/api/product-families/{productFamily}': get: summary: 'Show product family' operationId: showProductFamily description: 'Show a product family' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 20ffb86b-3878-3472-94e4-73376bf00497 name: 'Cecília Marinho Carrara Sobrinho' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 20ffb86b-3878-3472-94e4-73376bf00497 name: type: string example: 'Cecília Marinho Carrara Sobrinho' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Product Families' put: summary: 'Update product family' operationId: updateProductFamily description: 'Update a product family' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Product Families' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' required: - name delete: summary: 'Delete product family' operationId: deleteProductFamily description: 'Delete a product family' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Product Families' parameters: - in: path name: productFamily description: 'Product family UUID' example: dolor required: true schema: type: string /api/product-quantity-lists: get: summary: 'List product quantity lists' operationId: listProductQuantityLists description: 'List all product quantity lists' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 8c860ac0-6d79-34d8-a00f-9228033b43b2 name: 'Dolores facilis explicabo doloribus.' description: 'Hic neque accusamus accusamus corporis sit voluptates dicta. Recusandae delectus placeat ducimus quia. Earum et quia consequatur quas commodi.' work: id: a26c93fe-c4d7-4bdb-b72d-324b5318682d name: 'Regina Mel Rocha Neto' user: id: a26c93fe-c791-4bbb-a7ab-43d15faa6a57 name: 'Vicky Lakin' created_at: null updated_at: null - id: fcee2273-62bd-3b97-9aa5-6411ba1cc99f name: 'Officia nulla maiores.' description: null work: id: a26c93fe-cadc-4208-a90b-de01fcacc5b3 name: 'Dr. Luciano Carvalho Bittencourt' user: id: a26c93fe-cd3b-41cf-b634-e7a9fb9ccd04 name: 'Lura Schimmel' created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 8c860ac0-6d79-34d8-a00f-9228033b43b2 name: 'Dolores facilis explicabo doloribus.' description: 'Hic neque accusamus accusamus corporis sit voluptates dicta. Recusandae delectus placeat ducimus quia. Earum et quia consequatur quas commodi.' work: id: a26c93fe-c4d7-4bdb-b72d-324b5318682d name: 'Regina Mel Rocha Neto' user: id: a26c93fe-c791-4bbb-a7ab-43d15faa6a57 name: 'Vicky Lakin' created_at: null updated_at: null - id: fcee2273-62bd-3b97-9aa5-6411ba1cc99f name: 'Officia nulla maiores.' description: null work: id: a26c93fe-cadc-4208-a90b-de01fcacc5b3 name: 'Dr. Luciano Carvalho Bittencourt' user: id: a26c93fe-cd3b-41cf-b634-e7a9fb9ccd04 name: 'Lura Schimmel' created_at: null updated_at: null items: type: object properties: id: type: string example: 8c860ac0-6d79-34d8-a00f-9228033b43b2 name: type: string example: 'Dolores facilis explicabo doloribus.' description: type: string example: 'Hic neque accusamus accusamus corporis sit voluptates dicta. Recusandae delectus placeat ducimus quia. Earum et quia consequatur quas commodi.' work: type: object properties: id: type: string example: a26c93fe-c4d7-4bdb-b72d-324b5318682d name: type: string example: 'Regina Mel Rocha Neto' user: type: object properties: id: type: string example: a26c93fe-c791-4bbb-a7ab-43d15faa6a57 name: type: string example: 'Vicky Lakin' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Product Quantity Lists' requestBody: required: false content: application/json: schema: type: object properties: q: type: string description: Busca. example: 'Example Q' nullable: true work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: d63f1d10-444a-38e0-b1fd-53a7dfcd53d4 nullable: true user_id: type: string description: 'Usuário. The uuid of an existing record in the users table.' example: f0c86231-e795-398b-bb63-ef7300f33a04 nullable: true responsible_id: type: string description: 'Responsável. The uuid of an existing record in the users table.' example: a3702791-1c7e-3b3a-8510-3dc2cda45cee nullable: true per_page: type: integer description: 'Itens por página. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 1 sort: type: string description: Ordenação. example: 'Example Sort' sort_desc: type: boolean description: 'Ordem decrescente.' example: true post: summary: 'Create product quantity list' operationId: createProductQuantityList description: 'Create a new product quantity list' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Product Quantity Lists' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' nullable: true description: type: string description: Descrição. example: 'Example Description' nullable: true work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: 00236b8e-9277-30fa-bcfd-d860986ac21a items: type: array description: Itens. example: - null - null items: type: object properties: product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: ca416a9a-e067-39e3-b55f-698d95fa93f4 quantity: type: number description: 'Quantidade. O campo value deve ser pelo menos 0.0001.' example: 1.0 observation: type: string description: Observação. example: 'Example Items * observation' nullable: true required: - product_id - quantity required: - work_id '/api/product-quantity-lists/{productQuantityList}': get: summary: 'Show product quantity list' operationId: showProductQuantityList description: 'Show a product quantity list' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: fcec759a-fb2c-3e90-821c-89e307b36074 name: 'Ratione suscipit et molestiae.' description: null work: id: a26c93fe-d3d3-4608-8f91-ad71c0624212 name: 'Nelson Jimenes Dominato Jr.' user: id: a26c93fe-d675-47ce-92f6-0b0811a11d03 name: 'Dejah Reinger III' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: fcec759a-fb2c-3e90-821c-89e307b36074 name: type: string example: 'Ratione suscipit et molestiae.' description: type: string example: null nullable: true work: type: object properties: id: type: string example: a26c93fe-d3d3-4608-8f91-ad71c0624212 name: type: string example: 'Nelson Jimenes Dominato Jr.' user: type: object properties: id: type: string example: a26c93fe-d675-47ce-92f6-0b0811a11d03 name: type: string example: 'Dejah Reinger III' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Product Quantity Lists' put: summary: 'Update product quantity list' operationId: updateProductQuantityList description: 'Update a product quantity list. Can include items to replace all items in the list.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Product Quantity Lists' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' nullable: true description: type: string description: Descrição. example: 'Example Description' nullable: true items: type: array description: Itens. example: - null - null items: type: object properties: id: type: string description: 'ID do Item. The uuid of an existing record in the product_quantity_list_items table.' example: da17f3a3-f9d0-31c2-84c4-cfcfed1180e0 product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: c8dc2884-88ae-3e4b-b661-0c39df9ccc70 quantity: type: number description: 'Quantidade. O campo value deve ser pelo menos 0.0001.' example: 1.0 observation: type: string description: Observação. example: 'Example Items * observation' nullable: true required: - product_id - quantity delete: summary: 'Delete product quantity list' operationId: deleteProductQuantityList description: 'Delete a product quantity list' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Product Quantity Lists' parameters: - in: path name: productQuantityList description: 'Product Quantity List UUID' example: dicta required: true schema: type: string '/api/product-quantity-lists/{productQuantityList}/items': get: summary: 'List items' operationId: listItems description: 'List all items from a product quantity list with pagination' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 3f674af7-e77b-38f1-91c0-6268085fc1c4 product: id: a26c93fe-e9f4-4a42-adde-6357bd20b457 name: 'Sra. Samanta Alícia Tamoio Sobrinho' code: PRD-633167 unit: id: a26c93fe-e82c-44d3-ab6b-4652a7d56b29 name: 'Sr. Walter Ramos Marques' abbreviation: 'Dr. Paula da Cruz Lutero Jr.' quantity: 749.8195 observation: 'Voluptas ad odio modi quia est consequatur.' created_at: null updated_at: null - id: 63022974-de44-3779-b9bf-6a0c08ca25bf product: id: a26c93fe-f821-4a2f-a8ff-d1adc3d09bd3 name: 'Dr. Louise Soto Filho' code: PRD-768970 unit: id: a26c93fe-f705-481b-b627-2f3f7cd7accb name: 'Marília Bárbara Sales' abbreviation: "Srta. Maria Tainara D'ávila Filho" quantity: 64.7939 observation: 'Architecto occaecati ducimus odio incidunt.' created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 3f674af7-e77b-38f1-91c0-6268085fc1c4 product: id: a26c93fe-e9f4-4a42-adde-6357bd20b457 name: 'Sra. Samanta Alícia Tamoio Sobrinho' code: PRD-633167 unit: id: a26c93fe-e82c-44d3-ab6b-4652a7d56b29 name: 'Sr. Walter Ramos Marques' abbreviation: 'Dr. Paula da Cruz Lutero Jr.' quantity: 749.8195 observation: 'Voluptas ad odio modi quia est consequatur.' created_at: null updated_at: null - id: 63022974-de44-3779-b9bf-6a0c08ca25bf product: id: a26c93fe-f821-4a2f-a8ff-d1adc3d09bd3 name: 'Dr. Louise Soto Filho' code: PRD-768970 unit: id: a26c93fe-f705-481b-b627-2f3f7cd7accb name: 'Marília Bárbara Sales' abbreviation: "Srta. Maria Tainara D'ávila Filho" quantity: 64.7939 observation: 'Architecto occaecati ducimus odio incidunt.' created_at: null updated_at: null items: type: object properties: id: type: string example: 3f674af7-e77b-38f1-91c0-6268085fc1c4 product: type: object properties: id: type: string example: a26c93fe-e9f4-4a42-adde-6357bd20b457 name: type: string example: 'Sra. Samanta Alícia Tamoio Sobrinho' code: type: string example: PRD-633167 unit: type: object properties: id: type: string example: a26c93fe-e82c-44d3-ab6b-4652a7d56b29 name: type: string example: 'Sr. Walter Ramos Marques' abbreviation: type: string example: 'Dr. Paula da Cruz Lutero Jr.' quantity: type: number example: 749.8195 observation: type: string example: 'Voluptas ad odio modi quia est consequatur.' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Product Quantity Lists' requestBody: required: false content: application/json: schema: type: object properties: per_page: type: integer description: 'Itens por página. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 1 q: type: string description: 'Busca. O campo value não pode ser superior a 255 caracteres.' example: 'Example Q' post: summary: 'Add items to list' operationId: addItemsToList description: 'Add one or more product items to the list' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: array properties: data: type: string example: array tags: - 'Product Quantity Lists' requestBody: required: true content: application/json: schema: type: object properties: items: type: array description: 'Itens. O campo value deve ter pelo menos 1 itens.' example: - null - null items: type: object properties: product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: d4e3e974-bd26-3317-a7c7-d6e30aed5fb7 quantity: type: number description: 'Quantidade. O campo value deve ser pelo menos 0.0001.' example: 1.0 observation: type: string description: Observação. example: 'Example Items * observation' nullable: true required: - product_id - quantity required: - items delete: summary: 'Remove items' operationId: removeItems description: 'Remove one or more product items from the list' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: deleted: integer properties: deleted: type: string example: integer tags: - 'Product Quantity Lists' requestBody: required: true content: application/json: schema: type: object properties: items: type: array description: 'Item. The uuid of an existing record in the product_quantity_list_items table.' example: - 6d01c7b3-169b-3fee-b60f-6ea23e69f0d4 items: type: string required: - items parameters: - in: path name: productQuantityList description: 'Product Quantity List UUID' example: quia required: true schema: type: string '/api/product-quantity-lists/items/{id}': put: summary: 'Update item' operationId: updateItem description: 'Update a product item in the list' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Product Quantity Lists' requestBody: required: false content: application/json: schema: type: object properties: quantity: type: number description: 'Quantidade. O campo value deve ser pelo menos 0.0001.' example: 1.0 observation: type: string description: Observação. example: 'Example Observation' nullable: true parameters: - in: path name: id description: 'The ID of the item.' example: earum required: true schema: type: string - in: path name: item description: 'Product Quantity List Item UUID' example: perferendis required: true schema: type: string '/api/product-quantity-lists/{productQuantityList}/sync-items': put: summary: 'Sync items' operationId: syncItems description: 'Replace all items in the list' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Product Quantity Lists' requestBody: required: true content: application/json: schema: type: object properties: items: type: array description: Itens. example: - null - null items: type: object properties: id: type: string description: 'ID do Item. The uuid of an existing record in the product_quantity_list_items table.' example: 352fbe8a-4ab9-3189-be09-b2f0bbf42756 product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: 06b9fd47-1d6c-3f13-8c40-73b574477f0e quantity: type: number description: 'Quantidade. O campo value deve ser pelo menos 0.0001.' example: 1.0 observation: type: string description: Observação. example: 'Example Items * observation' nullable: true required: - product_id - quantity required: - items parameters: - in: path name: productQuantityList description: 'Product Quantity List UUID' example: dolor required: true schema: type: string '/api/product-requests/items/{item}/fulfill': post: summary: 'Fulfill item' operationId: fulfillItem description: 'Fulfill a product request item via transfer or allocation' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Product Request Fulfillment' requestBody: required: true content: application/json: schema: type: object properties: fulfillment_type: type: string description: 'Tipo de atendimento.' example: 'Example Fulfillment type' enum: - transfer - entry stock_id: type: string description: 'Estoque de destino. This field is required when fulfillment_type is transfer. The uuid of an existing record in the stocks table.' example: bba6d48a-33cc-3220-9aa3-6735bfca2574 nullable: true quantity: type: number description: 'Quantidade. O campo value deve ser pelo menos 0.0001.' example: 1.0 source_stock_id: type: string description: 'Estoque de origem. This field is required when fulfillment_type is transfer. The value and stock_id must be different. The uuid of an existing record in the stocks table.' example: 100afad6-11b4-3e37-83b4-d2210521456a nullable: true reason: type: string description: 'Motivo. O campo value não pode ser superior a 500 caracteres.' example: 'Example Reason' nullable: true origins: type: array description: 'Origens (NFs).' example: - null - null items: type: object nullable: true properties: supplier_product_id: type: string description: 'NF de origem. This field is required when origins is present. The uuid of an existing record in the supplier_products table.' example: f070abee-1a3c-32b3-b2ee-a8ffbbfd3377 quantity: type: number description: 'Quantidade da origem. This field is required when origins is present. O campo value deve ser pelo menos 0.0001.' example: 1.0 required: - fulfillment_type - quantity parameters: - in: path name: item description: 'Product Request Item UUID' example: maxime required: true schema: type: string '/api/product-requests/items/{item}/fulfillments': get: summary: 'List item fulfillments' operationId: listItemFulfillments description: 'List all fulfillments for a product request item' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: d44e4fa4-396d-3b70-9c60-06a56f5a56cc quantity: 20.693 fulfilled_at: '2026-07-23T23:39:53.000000Z' created_at: null - id: 27ac4f1f-ebf6-3389-8419-f87a6df2acdc quantity: 13.2128 fulfilled_at: '2026-07-30T18:35:25.000000Z' created_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: d44e4fa4-396d-3b70-9c60-06a56f5a56cc quantity: 20.693 fulfilled_at: '2026-07-23T23:39:53.000000Z' created_at: null - id: 27ac4f1f-ebf6-3389-8419-f87a6df2acdc quantity: 13.2128 fulfilled_at: '2026-07-30T18:35:25.000000Z' created_at: null items: type: object properties: id: type: string example: d44e4fa4-396d-3b70-9c60-06a56f5a56cc quantity: type: number example: 20.693 fulfilled_at: type: string example: '2026-07-23T23:39:53.000000Z' created_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Product Request Fulfillment' requestBody: required: false content: application/json: schema: type: object properties: per_page: type: integer description: 'Per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 1 nullable: true page: type: integer description: 'Page. O campo value deve ser pelo menos 1.' example: 1 nullable: true parameters: - in: path name: item description: 'Product Request Item UUID' example: veritatis required: true schema: type: string '/api/product-requests/items/{id}': get: summary: 'Get item with fulfillment details' operationId: getItemWithFulfillmentDetails description: 'Get a single product request item with its fulfillment details' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 6e54e896-a564-364d-9b1b-85b4b6e3cb7d product: id: a26c9403-4c97-4a20-8aca-dc42bbd5297a name: 'Tainara Solano' code: PRD-476776 unit: id: a26c9403-4b62-41e0-86b3-d56ef55b53da name: 'Sophie Emilly Salas' abbreviation: 'Dr. Adriele Laura Prado Filho' quantity: 611.1282 quantity_fulfilled: 0 quantity_pending: 611.1282 is_fulfilled: false is_partially_fulfilled: false observation: 'At consequatur fuga harum temporibus vel architecto minus.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 6e54e896-a564-364d-9b1b-85b4b6e3cb7d product: type: object properties: id: type: string example: a26c9403-4c97-4a20-8aca-dc42bbd5297a name: type: string example: 'Tainara Solano' code: type: string example: PRD-476776 unit: type: object properties: id: type: string example: a26c9403-4b62-41e0-86b3-d56ef55b53da name: type: string example: 'Sophie Emilly Salas' abbreviation: type: string example: 'Dr. Adriele Laura Prado Filho' quantity: type: number example: 611.1282 quantity_fulfilled: type: integer example: 0 quantity_pending: type: number example: 611.1282 is_fulfilled: type: boolean example: false is_partially_fulfilled: type: boolean example: false observation: type: string example: 'At consequatur fuga harum temporibus vel architecto minus.' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Product Request Fulfillment' put: summary: 'Update item' operationId: updateItem description: 'Update a product item in the request' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Product Requests' requestBody: required: false content: application/json: schema: type: object properties: quantity: type: number description: 'Quantidade. O campo value deve ser pelo menos 0.0001.' example: 1.0 observation: type: string description: Observação. example: 'Example Observation' nullable: true status_id: type: string description: 'Status. The uuid of an existing record in the statuses table.' example: fc6b338a-1606-3993-989e-2a3a064654b8 nullable: true parameters: - in: path name: id description: 'The ID of the item.' example: perferendis required: true schema: type: string - in: path name: item description: 'Product Request Item UUID' example: labore required: true schema: type: string '/api/product-requests/{productRequest}/pending-items': get: summary: 'List pending items' operationId: listPendingItems description: 'List all pending items from a product request' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 43490de4-e056-36cd-922e-73d1eaba57f1 product: id: a26c9403-6ab2-4463-b536-ecff00aa427a name: 'Franco Igor Tamoio' code: PRD-435319 unit: id: a26c9403-6916-48ea-870d-cb6e0fe3fdc0 name: 'Olga Amanda Estrada Filho' abbreviation: 'Vitória Verônica Furtado Neto' quantity: 106.6956 quantity_fulfilled: 0 quantity_pending: 106.6956 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: c3801caf-0dc6-3016-a3fb-3abdb1f87661 product: id: a26c9403-7c3c-41d5-916c-f3d26e3b9f17 name: 'Dr. Maurício Rios Neto' code: PRD-360724 unit: id: a26c9403-7af5-4c21-8741-f128a9612407 name: 'Dr. Rodolfo Rios Escobar Sobrinho' abbreviation: 'Alma Aline Pontes Filho' quantity: 215.8843 quantity_fulfilled: 0 quantity_pending: 215.8843 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 43490de4-e056-36cd-922e-73d1eaba57f1 product: id: a26c9403-6ab2-4463-b536-ecff00aa427a name: 'Franco Igor Tamoio' code: PRD-435319 unit: id: a26c9403-6916-48ea-870d-cb6e0fe3fdc0 name: 'Olga Amanda Estrada Filho' abbreviation: 'Vitória Verônica Furtado Neto' quantity: 106.6956 quantity_fulfilled: 0 quantity_pending: 106.6956 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: c3801caf-0dc6-3016-a3fb-3abdb1f87661 product: id: a26c9403-7c3c-41d5-916c-f3d26e3b9f17 name: 'Dr. Maurício Rios Neto' code: PRD-360724 unit: id: a26c9403-7af5-4c21-8741-f128a9612407 name: 'Dr. Rodolfo Rios Escobar Sobrinho' abbreviation: 'Alma Aline Pontes Filho' quantity: 215.8843 quantity_fulfilled: 0 quantity_pending: 215.8843 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null items: type: object properties: id: type: string example: 43490de4-e056-36cd-922e-73d1eaba57f1 product: type: object properties: id: type: string example: a26c9403-6ab2-4463-b536-ecff00aa427a name: type: string example: 'Franco Igor Tamoio' code: type: string example: PRD-435319 unit: type: object properties: id: type: string example: a26c9403-6916-48ea-870d-cb6e0fe3fdc0 name: type: string example: 'Olga Amanda Estrada Filho' abbreviation: type: string example: 'Vitória Verônica Furtado Neto' quantity: type: number example: 106.6956 quantity_fulfilled: type: integer example: 0 quantity_pending: type: number example: 106.6956 is_fulfilled: type: boolean example: false is_partially_fulfilled: type: boolean example: false observation: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Product Request Fulfillment' requestBody: required: false content: application/json: schema: type: object properties: per_page: type: integer description: 'Per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 1 nullable: true page: type: integer description: 'Page. O campo value deve ser pelo menos 1.' example: 1 nullable: true parameters: - in: path name: productRequest description: 'Product Request UUID' example: cumque required: true schema: type: string '/api/product-requests/pending-by-product/{product}': get: summary: 'List pending items by product' operationId: listPendingItemsByProduct description: 'List all pending product request items for a specific product' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 731c483c-ab95-37a6-bfe4-9ef0e1356b1e product: id: a26c9403-9178-4a90-bee1-b6ff956d4d4b name: 'Sra. Mayara Escobar' code: PRD-040284 unit: id: a26c9403-903e-4da3-a060-2eccbbc4bd28 name: 'Agostinho Cauan Aragão' abbreviation: 'Deivid Carvalho Marin Filho' quantity: 557.7859 quantity_fulfilled: 0 quantity_pending: 557.7859 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: 295cf26c-9c4c-309e-b068-4ac270011cef product: id: a26c9403-a239-43b4-a409-c1a5d01546d1 name: 'Sra. Daniele Cordeiro Cervantes' code: PRD-265356 unit: id: a26c9403-a109-4d27-b28d-274edac6e1d3 name: 'André Leo Galvão' abbreviation: 'Constância Tamoio Sobrinho' quantity: 381.0916 quantity_fulfilled: 0 quantity_pending: 381.0916 is_fulfilled: false is_partially_fulfilled: false observation: 'Ut quas vero et quia voluptas ipsa.' created_at: null updated_at: null properties: data: type: array example: - id: 731c483c-ab95-37a6-bfe4-9ef0e1356b1e product: id: a26c9403-9178-4a90-bee1-b6ff956d4d4b name: 'Sra. Mayara Escobar' code: PRD-040284 unit: id: a26c9403-903e-4da3-a060-2eccbbc4bd28 name: 'Agostinho Cauan Aragão' abbreviation: 'Deivid Carvalho Marin Filho' quantity: 557.7859 quantity_fulfilled: 0 quantity_pending: 557.7859 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: 295cf26c-9c4c-309e-b068-4ac270011cef product: id: a26c9403-a239-43b4-a409-c1a5d01546d1 name: 'Sra. Daniele Cordeiro Cervantes' code: PRD-265356 unit: id: a26c9403-a109-4d27-b28d-274edac6e1d3 name: 'André Leo Galvão' abbreviation: 'Constância Tamoio Sobrinho' quantity: 381.0916 quantity_fulfilled: 0 quantity_pending: 381.0916 is_fulfilled: false is_partially_fulfilled: false observation: 'Ut quas vero et quia voluptas ipsa.' created_at: null updated_at: null items: type: object properties: id: type: string example: 731c483c-ab95-37a6-bfe4-9ef0e1356b1e product: type: object properties: id: type: string example: a26c9403-9178-4a90-bee1-b6ff956d4d4b name: type: string example: 'Sra. Mayara Escobar' code: type: string example: PRD-040284 unit: type: object properties: id: type: string example: a26c9403-903e-4da3-a060-2eccbbc4bd28 name: type: string example: 'Agostinho Cauan Aragão' abbreviation: type: string example: 'Deivid Carvalho Marin Filho' quantity: type: number example: 557.7859 quantity_fulfilled: type: integer example: 0 quantity_pending: type: number example: 557.7859 is_fulfilled: type: boolean example: false is_partially_fulfilled: type: boolean example: false observation: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Product Request Fulfillment' parameters: - in: path name: product description: 'Product UUID' example: sit required: true schema: type: string /api/product-requests: get: summary: 'List product requests' operationId: listProductRequests description: 'List all product requests' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: a3464b5f-6133-392c-85a6-4a36bbe1d508 code: null name: 'Necessitatibus nobis eligendi repellendus.' description: null work: id: a26c9400-7e77-41ed-b417-91110751ed6a name: 'Fabiano Mendonça' user: id: a26c9400-8161-42fc-9e33-7430c496725a name: 'Albertha Roberts' status: id: a26c9400-832f-47ab-8f54-188de6f3d7fa slug: null name: null description: 'Dr. Marina Serna Sobrinho' abbreviation: labore color: '#384090' text_color: '#d2cd59' priority: low priority_label: Baixa needed_at: null approved_at: null rejection_reason: null created_at: null updated_at: null - id: 51174f0f-f57a-319c-bdfc-ac036007e7b3 code: null name: 'Nihil libero nobis suscipit quasi.' description: 'Quo alias optio tempora beatae facere enim officia omnis. Iure quidem tempora et optio animi. Voluptatem dolores voluptates aut nihil et sit.' work: id: a26c9400-8751-421e-a242-00d6678bb135 name: 'Jennifer Lozano Jr.' user: id: a26c9400-8a52-4c6b-8fc7-541568ab9c62 name: 'Daija Kilback' status: id: a26c9400-8c1b-4568-a0c4-8b579784f3b1 slug: null name: null description: 'Cristian Rios' abbreviation: est color: '#e6abad' text_color: '#0e4700' priority: high priority_label: Alta needed_at: null approved_at: null rejection_reason: null created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: a3464b5f-6133-392c-85a6-4a36bbe1d508 code: null name: 'Necessitatibus nobis eligendi repellendus.' description: null work: id: a26c9400-7e77-41ed-b417-91110751ed6a name: 'Fabiano Mendonça' user: id: a26c9400-8161-42fc-9e33-7430c496725a name: 'Albertha Roberts' status: id: a26c9400-832f-47ab-8f54-188de6f3d7fa slug: null name: null description: 'Dr. Marina Serna Sobrinho' abbreviation: labore color: '#384090' text_color: '#d2cd59' priority: low priority_label: Baixa needed_at: null approved_at: null rejection_reason: null created_at: null updated_at: null - id: 51174f0f-f57a-319c-bdfc-ac036007e7b3 code: null name: 'Nihil libero nobis suscipit quasi.' description: 'Quo alias optio tempora beatae facere enim officia omnis. Iure quidem tempora et optio animi. Voluptatem dolores voluptates aut nihil et sit.' work: id: a26c9400-8751-421e-a242-00d6678bb135 name: 'Jennifer Lozano Jr.' user: id: a26c9400-8a52-4c6b-8fc7-541568ab9c62 name: 'Daija Kilback' status: id: a26c9400-8c1b-4568-a0c4-8b579784f3b1 slug: null name: null description: 'Cristian Rios' abbreviation: est color: '#e6abad' text_color: '#0e4700' priority: high priority_label: Alta needed_at: null approved_at: null rejection_reason: null created_at: null updated_at: null items: type: object properties: id: type: string example: a3464b5f-6133-392c-85a6-4a36bbe1d508 code: type: string example: null nullable: true name: type: string example: 'Necessitatibus nobis eligendi repellendus.' description: type: string example: null nullable: true work: type: object properties: id: type: string example: a26c9400-7e77-41ed-b417-91110751ed6a name: type: string example: 'Fabiano Mendonça' user: type: object properties: id: type: string example: a26c9400-8161-42fc-9e33-7430c496725a name: type: string example: 'Albertha Roberts' status: type: object properties: id: type: string example: a26c9400-832f-47ab-8f54-188de6f3d7fa slug: type: string example: null nullable: true name: type: string example: null nullable: true description: type: string example: 'Dr. Marina Serna Sobrinho' abbreviation: type: string example: labore color: type: string example: '#384090' text_color: type: string example: '#d2cd59' priority: type: string example: low priority_label: type: string example: Baixa needed_at: type: string example: null nullable: true approved_at: type: string example: null nullable: true rejection_reason: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Product Requests' requestBody: required: false content: application/json: schema: type: object properties: sort_by: type: string description: 'Sort by.' example: 'Example Sort by' nullable: true sort_desc: type: boolean description: 'Sort desc.' example: true nullable: true page: type: integer description: 'Page. O campo value deve ser pelo menos 1.' example: 1 nullable: true per_page: type: integer description: 'Per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 1 nullable: true q: type: string description: Busca. example: 'Example Q' nullable: true work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: f1c9c9a1-ef69-354e-b133-25b776023bb3 nullable: true work_location_id: type: string description: 'Local da obra. The uuid of an existing record in the work_locations table.' example: f9ab523d-85f8-329a-b697-db14055bd238 nullable: true user_id: type: string description: 'Usuário. The uuid of an existing record in the users table.' example: 87f9c0fb-8685-3f22-8fbf-506811c2b6e0 nullable: true status_id: type: string description: 'Status. The uuid of an existing record in the statuses table.' example: 3691e0f7-028c-3efd-a512-7bdd68f44325 nullable: true priority: type: string description: Prioridade. example: 'Example Priority' enum: - low - medium - high - urgent nullable: true needed_at_from: type: string description: 'Data de necessidade inicial. O campo value deve ser uma data válida.' example: 'Example Needed at from' nullable: true needed_at_to: type: string description: 'Data de necessidade final. O campo value deve ser uma data válida.' example: 'Example Needed at to' nullable: true responsible_id: type: string description: 'Responsável. The uuid of an existing record in the users table.' example: c5cc5b2c-9e23-3a9b-a793-225583e786b3 nullable: true post: summary: 'Create product request' operationId: createProductRequest description: 'Create a new product request' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Product Requests' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' nullable: true description: type: string description: Descrição. example: 'Example Description' nullable: true work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: 86b6895b-0831-3109-a941-914afe1810f8 work_location_id: type: string description: 'Local da obra. The uuid of an existing record in the work_locations table.' example: 698207dc-0ec1-3efb-8de2-d40bf4662c5d nullable: true status_id: type: string description: 'Status. The uuid of an existing record in the statuses table.' example: ddb79eaa-4876-3624-b09d-b2e62f440f08 nullable: true priority: type: string description: Prioridade. example: 'Example Priority' enum: - low - medium - high - urgent needed_at: type: string description: 'Data de necessidade. O campo value deve ser uma data válida.' example: 'Example Needed at' nullable: true items: type: array description: Itens. example: - null - null items: type: object properties: product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: f23d905b-bd69-3cee-85d2-eddb107c4172 quantity: type: number description: 'Quantidade. O campo value deve ser pelo menos 0.0001.' example: 1.0 observation: type: string description: Observação. example: 'Example Items * observation' nullable: true required: - product_id - quantity required: - work_id '/api/product-requests/{productRequest}': get: summary: 'Show product request' operationId: showProductRequest description: 'Show a product request' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 47e572cd-50aa-3c28-bbab-9b542c2ac81b code: null name: 'Minus explicabo.' description: 'Qui dolorem id libero vero tenetur dolor. Exercitationem placeat voluptates vel aut. Dolorum voluptatem laboriosam nemo in sunt quos.' work: id: a26c9400-9a1f-4bca-bdef-cf1086f7b433 name: 'Srta. Nádia Emília Rosa Jr.' user: id: a26c9400-9cb0-4510-8654-647b3ac55d0f name: "Prof. Delilah O'Conner Sr." status: id: a26c9400-9e61-44de-a172-ccb34786afb5 slug: null name: null description: 'Dr. Gael Beltrão Sobrinho' abbreviation: natus color: '#79bce3' text_color: '#464fd1' priority: high priority_label: Alta needed_at: null approved_at: null rejection_reason: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 47e572cd-50aa-3c28-bbab-9b542c2ac81b code: type: string example: null nullable: true name: type: string example: 'Minus explicabo.' description: type: string example: 'Qui dolorem id libero vero tenetur dolor. Exercitationem placeat voluptates vel aut. Dolorum voluptatem laboriosam nemo in sunt quos.' work: type: object properties: id: type: string example: a26c9400-9a1f-4bca-bdef-cf1086f7b433 name: type: string example: 'Srta. Nádia Emília Rosa Jr.' user: type: object properties: id: type: string example: a26c9400-9cb0-4510-8654-647b3ac55d0f name: type: string example: "Prof. Delilah O'Conner Sr." status: type: object properties: id: type: string example: a26c9400-9e61-44de-a172-ccb34786afb5 slug: type: string example: null nullable: true name: type: string example: null nullable: true description: type: string example: 'Dr. Gael Beltrão Sobrinho' abbreviation: type: string example: natus color: type: string example: '#79bce3' text_color: type: string example: '#464fd1' priority: type: string example: high priority_label: type: string example: Alta needed_at: type: string example: null nullable: true approved_at: type: string example: null nullable: true rejection_reason: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Product Requests' put: summary: 'Update product request' operationId: updateProductRequest description: 'Update a product request. Can include items to replace all items in the request.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Product Requests' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' nullable: true description: type: string description: Descrição. example: 'Example Description' nullable: true work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: 87076d3a-3366-31fa-9a76-a798ba44efbe work_location_id: type: string description: 'Local da obra. The uuid of an existing record in the work_locations table.' example: cf4b1fd4-233f-3cf2-a610-8f3ba0294b8c nullable: true status_id: type: string description: 'Status. The uuid of an existing record in the statuses table.' example: 51c44dd1-d7a0-3752-98c8-e39647d2c9e0 priority: type: string description: Prioridade. example: 'Example Priority' enum: - low - medium - high - urgent needed_at: type: string description: 'Data de necessidade. O campo value deve ser uma data válida.' example: 'Example Needed at' nullable: true items: type: array description: Itens. example: - null - null items: type: object properties: id: type: string description: 'ID do Item. The uuid of an existing record in the product_request_items table.' example: f65552a6-1aa3-3837-bfc4-7758b505fb94 product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: 1b756f1a-5099-39e6-8f3c-5a982be5e413 quantity: type: number description: 'Quantidade. O campo value deve ser pelo menos 0.0001.' example: 1.0 observation: type: string description: Observação. example: 'Example Items * observation' nullable: true required: - product_id - quantity delete: summary: 'Delete product request' operationId: deleteProductRequest description: 'Delete a product request' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Product Requests' parameters: - in: path name: productRequest description: 'Product Request UUID' example: tempora required: true schema: type: string '/api/product-requests/{productRequest}/items': get: summary: 'List items' operationId: listItems description: 'List all items from a product request with pagination' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 7ee759fe-db91-34d0-9b93-ae72b765232e product: id: a26c9400-ba15-4c52-b194-9fbec404256b name: 'Sr. Leonardo Tamoio Mendonça Filho' code: PRD-251518 unit: id: a26c9400-b8da-4ef1-a5db-aac3610b30b2 name: 'Mary Amaral Cortês' abbreviation: 'Sandro Carrara' quantity: 349.2003 quantity_fulfilled: 0 quantity_pending: 349.2003 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: eec19cf4-9dc0-33e8-bc38-32603553f8f6 product: id: a26c9400-cb8c-4ecc-a5ae-69b4a79ff419 name: 'Sra. Maitê Silvana Medina Neto' code: PRD-059326 unit: id: a26c9400-caa5-4488-bd1b-1e375f5c4fa7 name: 'Sr. Teobaldo Galindo Marques Neto' abbreviation: 'Débora Aguiar Quintana Jr.' quantity: 711.7946 quantity_fulfilled: 0 quantity_pending: 711.7946 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 7ee759fe-db91-34d0-9b93-ae72b765232e product: id: a26c9400-ba15-4c52-b194-9fbec404256b name: 'Sr. Leonardo Tamoio Mendonça Filho' code: PRD-251518 unit: id: a26c9400-b8da-4ef1-a5db-aac3610b30b2 name: 'Mary Amaral Cortês' abbreviation: 'Sandro Carrara' quantity: 349.2003 quantity_fulfilled: 0 quantity_pending: 349.2003 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: eec19cf4-9dc0-33e8-bc38-32603553f8f6 product: id: a26c9400-cb8c-4ecc-a5ae-69b4a79ff419 name: 'Sra. Maitê Silvana Medina Neto' code: PRD-059326 unit: id: a26c9400-caa5-4488-bd1b-1e375f5c4fa7 name: 'Sr. Teobaldo Galindo Marques Neto' abbreviation: 'Débora Aguiar Quintana Jr.' quantity: 711.7946 quantity_fulfilled: 0 quantity_pending: 711.7946 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null items: type: object properties: id: type: string example: 7ee759fe-db91-34d0-9b93-ae72b765232e product: type: object properties: id: type: string example: a26c9400-ba15-4c52-b194-9fbec404256b name: type: string example: 'Sr. Leonardo Tamoio Mendonça Filho' code: type: string example: PRD-251518 unit: type: object properties: id: type: string example: a26c9400-b8da-4ef1-a5db-aac3610b30b2 name: type: string example: 'Mary Amaral Cortês' abbreviation: type: string example: 'Sandro Carrara' quantity: type: number example: 349.2003 quantity_fulfilled: type: integer example: 0 quantity_pending: type: number example: 349.2003 is_fulfilled: type: boolean example: false is_partially_fulfilled: type: boolean example: false observation: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Product Requests' requestBody: required: false content: application/json: schema: type: object properties: q: type: string description: Busca. example: 'Example Q' nullable: true per_page: type: integer description: 'Itens por página. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 1 post: summary: 'Add items to request' operationId: addItemsToRequest description: 'Add one or more product items to the request' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: array properties: data: type: string example: array tags: - 'Product Requests' requestBody: required: true content: application/json: schema: type: object properties: items: type: array description: 'Itens. O campo value deve ter pelo menos 1 itens.' example: - null - null items: type: object properties: product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: d2510e8a-c809-392e-ab65-4b7cc14ab22c quantity: type: number description: 'Quantidade. O campo value deve ser pelo menos 0.0001.' example: 1.0 observation: type: string description: Observação. example: 'Example Items * observation' nullable: true required: - product_id - quantity required: - items delete: summary: 'Remove items' operationId: removeItems description: 'Remove one or more product items from the request' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: deleted: integer properties: deleted: type: string example: integer tags: - 'Product Requests' requestBody: required: true content: application/json: schema: type: object properties: items: type: array description: 'Item. The uuid of an existing record in the product_request_items table.' example: - 5519c8fe-b7c0-376f-920f-868f5e2a7b98 items: type: string required: - items parameters: - in: path name: productRequest description: 'Product Request UUID' example: rerum required: true schema: type: string '/api/product-requests/{productRequest}/approve': post: summary: 'Approve product request' operationId: approveProductRequest description: 'Approve a product request' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Product Requests' parameters: - in: path name: productRequest description: 'Product Request UUID' example: asperiores required: true schema: type: string '/api/product-requests/{productRequest}/reject': post: summary: 'Reject product request' operationId: rejectProductRequest description: 'Reject a product request with a reason' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Product Requests' requestBody: required: true content: application/json: schema: type: object properties: reason: type: string description: 'Motivo da rejeição. O campo value não pode ser superior a 1000 caracteres.' example: 'Example Reason' required: - reason parameters: - in: path name: productRequest description: 'Product Request UUID' example: adipisci required: true schema: type: string '/api/product-requests/{productRequest}/sync-items': put: summary: 'Sync items' operationId: syncItems description: 'Replace all items in the request' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Product Requests' requestBody: required: true content: application/json: schema: type: object properties: items: type: array description: Itens. example: - null - null items: type: object properties: id: type: string description: 'ID do Item. The uuid of an existing record in the product_request_items table.' example: 38ec89f7-6488-3420-a892-4615f94f5b23 product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: 39378076-0f6c-3adc-95ea-d8b71e023c59 quantity: type: number description: 'Quantidade. O campo value deve ser pelo menos 0.0001.' example: 1.0 observation: type: string description: Observação. example: 'Example Items * observation' nullable: true required: - product_id - quantity required: - items parameters: - in: path name: productRequest description: 'Product Request UUID' example: voluptas required: true schema: type: string /api/products: get: summary: 'List products' operationId: listProducts description: 'List all products' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: Brick required: false schema: type: string description: 'Search query.' example: Brick nullable: true - in: query name: code description: 'Filter by product code.' example: PROD-00003 required: false schema: type: string description: 'Filter by product code.' example: PROD-00003 nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: f837f195-fd17-363c-a1de-5e58cb580005 name: 'Sr. Juliano Henrique Rodrigues' code: PRD-211330 stock: 6165 product_family: id: a26c93fe-6863-4fd0-a427-4a8cf40c87b2 name: 'Guilherme Feliciano Beltrão' product_brand: id: a26c93fe-6af0-4044-b1d8-9d03775aa7f0 name: 'Miguel Pereira' unit: id: a26c93fe-6d2a-42f9-a2cd-73fb21a49dd6 name: 'Dr. Mateus Roque' abbreviation: 'Lorena Roque Jr.' image: id: null url: null description: 'Excepturi officiis aspernatur velit cum sed aspernatur.' created_at: null updated_at: null - id: 59592599-a3c5-3bd9-a3b9-27189a568fcd name: 'Alessandra Delvalle Solano' code: PRD-708662 stock: 6285 product_family: id: a26c93fe-7113-400b-9376-043bb23776f8 name: 'Bruna Caldeira Valente' product_brand: id: a26c93fe-727e-4520-9579-d3fd44f6a5d7 name: 'Madalena Valência' unit: id: a26c93fe-73ec-44a2-aef3-0fadcde18375 name: 'Eloá Brito Verdugo' abbreviation: 'Dr. Sarah Lourenço Ávila' image: id: null url: null description: 'Magni aperiam cum praesentium aut excepturi ut.' created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: f837f195-fd17-363c-a1de-5e58cb580005 name: 'Sr. Juliano Henrique Rodrigues' code: PRD-211330 stock: 6165 product_family: id: a26c93fe-6863-4fd0-a427-4a8cf40c87b2 name: 'Guilherme Feliciano Beltrão' product_brand: id: a26c93fe-6af0-4044-b1d8-9d03775aa7f0 name: 'Miguel Pereira' unit: id: a26c93fe-6d2a-42f9-a2cd-73fb21a49dd6 name: 'Dr. Mateus Roque' abbreviation: 'Lorena Roque Jr.' image: id: null url: null description: 'Excepturi officiis aspernatur velit cum sed aspernatur.' created_at: null updated_at: null - id: 59592599-a3c5-3bd9-a3b9-27189a568fcd name: 'Alessandra Delvalle Solano' code: PRD-708662 stock: 6285 product_family: id: a26c93fe-7113-400b-9376-043bb23776f8 name: 'Bruna Caldeira Valente' product_brand: id: a26c93fe-727e-4520-9579-d3fd44f6a5d7 name: 'Madalena Valência' unit: id: a26c93fe-73ec-44a2-aef3-0fadcde18375 name: 'Eloá Brito Verdugo' abbreviation: 'Dr. Sarah Lourenço Ávila' image: id: null url: null description: 'Magni aperiam cum praesentium aut excepturi ut.' created_at: null updated_at: null items: type: object properties: id: type: string example: f837f195-fd17-363c-a1de-5e58cb580005 name: type: string example: 'Sr. Juliano Henrique Rodrigues' code: type: string example: PRD-211330 stock: type: integer example: 6165 product_family: type: object properties: id: type: string example: a26c93fe-6863-4fd0-a427-4a8cf40c87b2 name: type: string example: 'Guilherme Feliciano Beltrão' product_brand: type: object properties: id: type: string example: a26c93fe-6af0-4044-b1d8-9d03775aa7f0 name: type: string example: 'Miguel Pereira' unit: type: object properties: id: type: string example: a26c93fe-6d2a-42f9-a2cd-73fb21a49dd6 name: type: string example: 'Dr. Mateus Roque' abbreviation: type: string example: 'Lorena Roque Jr.' image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true description: type: string example: 'Excepturi officiis aspernatur velit cum sed aspernatur.' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Products post: summary: 'Create product' operationId: createProduct description: 'Create a new product' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Products requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' product_family_id: type: string description: 'Família do Produto. The uuid of an existing record in the product_families table.' example: 2315c4ba-cfea-3c8b-a22d-5d4695f65840 product_brand_id: type: string description: 'Marca do Produto. The uuid of an existing record in the product_brands table.' example: f02647b4-c5d4-3707-a7b4-a757ff2b8538 unit_id: type: string description: 'Unidade. The uuid of an existing record in the units table.' example: 29f5ef88-7c5e-3d4b-89d0-5a5780f71ea7 description: type: string description: Descrição. example: 'Example Description' nullable: true stock: type: number description: 'Estoque. O campo value deve ser pelo menos 0.' example: 1.0 required: - name - product_family_id - product_brand_id - unit_id - stock '/api/products/{id}': get: summary: 'Show product' operationId: showProduct description: 'Show a product' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 16fe956b-39bd-38bd-ad35-f3281308cd2d name: 'Théo Fonseca Vale' code: PRD-017647 stock: 752816471 product_family: id: a26c93fe-7b73-4af9-b355-25890fc05ca2 name: 'Dr. Vitor Mendes Filho' product_brand: id: a26c93fe-7d03-410b-9519-19abc2f00cf7 name: 'Sr. César Padilha Pacheco Filho' unit: id: a26c93fe-7e88-4afd-a6a8-a4d438626960 name: 'Leonardo Murilo Paes Jr.' abbreviation: 'Laís Serrano Lira Filho' image: id: null url: null description: 'Quisquam aut voluptatibus excepturi repellat repellat voluptatem.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 16fe956b-39bd-38bd-ad35-f3281308cd2d name: type: string example: 'Théo Fonseca Vale' code: type: string example: PRD-017647 stock: type: integer example: 752816471 product_family: type: object properties: id: type: string example: a26c93fe-7b73-4af9-b355-25890fc05ca2 name: type: string example: 'Dr. Vitor Mendes Filho' product_brand: type: object properties: id: type: string example: a26c93fe-7d03-410b-9519-19abc2f00cf7 name: type: string example: 'Sr. César Padilha Pacheco Filho' unit: type: object properties: id: type: string example: a26c93fe-7e88-4afd-a6a8-a4d438626960 name: type: string example: 'Leonardo Murilo Paes Jr.' abbreviation: type: string example: 'Laís Serrano Lira Filho' image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true description: type: string example: 'Quisquam aut voluptatibus excepturi repellat repellat voluptatem.' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Products put: summary: 'Update product ' operationId: updateProduct description: 'Update a product ' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Products requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' product_family_id: type: string description: 'Família do Produto. The uuid of an existing record in the product_families table.' example: 35496a95-1e5b-3052-b3cd-7bbd64ae4bf1 product_brand_id: type: string description: 'Marca do Produto. The uuid of an existing record in the product_brands table.' example: ea3f076f-654f-3dad-a595-2d878abf9eb7 unit_id: type: string description: 'Unidade. The uuid of an existing record in the units table.' example: 95c684d7-85b6-3900-a250-810252899b9d stock: type: number description: 'Estoque. O campo value deve ser pelo menos 0.' example: 1.0 description: type: string description: Descrição. example: 'Example Description' nullable: true parameters: - in: path name: id description: 'The ID of the product.' example: 1 required: true schema: type: integer - in: path name: product description: 'Product UUID' example: nihil required: true schema: type: string '/api/products/{product}/available-origins': get: summary: 'List available origins' operationId: listAvailableOrigins description: 'List supplier_products (NF items) with available quantity for the given product, ordered FIFO by NF date.' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Products parameters: - in: path name: product description: 'Product UUID' example: sint required: true schema: type: string '/api/products/{product}': delete: summary: 'Delete product' operationId: deleteProduct description: 'Delete a product' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Products parameters: - in: path name: product description: 'Product UUID' example: exercitationem required: true schema: type: string '/api/projects/{projectUuid}/versions': post: summary: 'Create revision' operationId: createRevision description: 'Create a new revision and update the project current file' parameters: [] responses: 201: description: '' content: application/json: schema: type: object nullable: true tags: - 'Project Versions' requestBody: required: true content: application/json: schema: type: object properties: notes: type: string description: observação. example: 'Example Notes' nullable: true responsible_user_id: type: string description: 'responsável. O campo value deve ser um UUID válido. The uuid of an existing record in the users table.' example: f7a528e7-5f84-3c93-a530-e77f4289a4bf nullable: true file: type: object description: arquivo. example: - example1 - example2 properties: path: type: string description: 'caminho do arquivo. This field is required when file is present.' example: 'Example File path' name: type: string description: 'nome do arquivo.' example: 'Example Name' size: type: string description: 'tamanho do arquivo.' example: 'Example File size' nullable: true extension: type: string description: 'extensão do arquivo.' example: 'Example File extension' nullable: true required: - name required: - file get: summary: 'List revisions' operationId: listRevisions description: 'List all revisions of a project' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Project Versions' parameters: - in: path name: projectUuid description: 'Project UUID' example: 47bd0377-2838-30af-ab26-9c0697ea4527 required: true schema: type: string '/api/project-versions/{versionUuid}': get: summary: 'Show revision' operationId: showRevision description: 'Show a specific revision' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'Project Versions' delete: summary: 'Delete revision' operationId: deleteRevision description: 'Soft delete a revision' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Project Versions' parameters: - in: path name: versionUuid description: 'Revision UUID' example: cbed6a49-1b4f-3b23-93fd-1d3c31dc3acd required: true schema: type: string '/api/project-versions/{versionUuid}/download': get: summary: 'Download revision' operationId: downloadRevision description: 'Generate a signed URL to download a revision' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: url: string filename: string size: string version_number: integer properties: url: type: string example: string filename: type: string example: string size: type: string example: string version_number: type: string example: integer tags: - 'Project Versions' parameters: - in: path name: versionUuid description: 'Revision UUID' example: dacf592e-b8ee-332a-b336-cc63ef33ab16 required: true schema: type: string '/api/project-versions/{versionUuid}/restore': post: summary: 'Restore revision' operationId: restoreRevision description: 'Restore a revision as the current file' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Project Versions' parameters: - in: path name: versionUuid description: 'Revision UUID' example: 8b8957ff-4dcb-3002-9ad4-20a06c7eb046 required: true schema: type: string /api/projects: get: summary: 'List projects' operationId: listProjects description: 'List all projects' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: Elétrico required: false schema: type: string description: 'Search query.' example: Elétrico nullable: true - in: query name: discipline_id description: 'Filter by discipline UUID. O campo value deve ser um UUID válido. The uuid of an existing record in the disciplines table.' example: 82189e1d-2eec-3272-aa46-df2da12e0d8c required: false schema: type: string description: 'Filter by discipline UUID. O campo value deve ser um UUID válido. The uuid of an existing record in the disciplines table.' example: 82189e1d-2eec-3272-aa46-df2da12e0d8c nullable: true - in: query name: work_id description: 'Filter by work UUID. O campo value deve ser um UUID válido. The uuid of an existing record in the works table.' example: daa5ec8b-c810-310f-a407-9a4fa93d06ba required: false schema: type: string description: 'Filter by work UUID. O campo value deve ser um UUID válido. The uuid of an existing record in the works table.' example: daa5ec8b-c810-310f-a407-9a4fa93d06ba nullable: true - in: query name: status_id description: 'Filter by status UUID. O campo value deve ser um UUID válido. The uuid of an existing record in the statuses table.' example: 3e2ee36a-7cce-3424-8f04-89e3efe6025d required: false schema: type: string description: 'Filter by status UUID. O campo value deve ser um UUID válido. The uuid of an existing record in the statuses table.' example: 3e2ee36a-7cce-3424-8f04-89e3efe6025d nullable: true - in: query name: responsible_id description: 'Filter by responsible user UUID. O campo value deve ser um UUID válido. The uuid of an existing record in the users table.' example: c1d8a6d1-0967-3154-9f6d-4a6b0a4b7c14 required: false schema: type: string description: 'Filter by responsible user UUID. O campo value deve ser um UUID válido. The uuid of an existing record in the users table.' example: c1d8a6d1-0967-3154-9f6d-4a6b0a4b7c14 nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 3f69083b-7d39-378c-b2ea-da011e10269f name: 'Deserunt eos aut' description: 'Reiciendis nam minima aliquid.' current_version: 1 file: path: projects/58ba19ee-541e-3215-88b2-6477b5fce31b.pdf size: '1756687' extension: pdf discipline: id: a26c9403-a940-4cc4-8548-f736cf811579 name: Et code: AWW created_at: null updated_at: null - id: 6acd825a-bebd-3694-a2df-80600005d3e5 name: 'Aliquam reiciendis necessitatibus' description: 'Aperiam doloribus delectus qui saepe maxime nostrum possimus.' current_version: 1 file: path: projects/0388061b-1218-3983-a567-79159d28a9c9.pdf size: '916449' extension: pdf discipline: id: a26c9403-acff-45b8-92a0-0809ed213f2d name: Accusamus code: ZRH created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 3f69083b-7d39-378c-b2ea-da011e10269f name: 'Deserunt eos aut' description: 'Reiciendis nam minima aliquid.' current_version: 1 file: path: projects/58ba19ee-541e-3215-88b2-6477b5fce31b.pdf size: '1756687' extension: pdf discipline: id: a26c9403-a940-4cc4-8548-f736cf811579 name: Et code: AWW created_at: null updated_at: null - id: 6acd825a-bebd-3694-a2df-80600005d3e5 name: 'Aliquam reiciendis necessitatibus' description: 'Aperiam doloribus delectus qui saepe maxime nostrum possimus.' current_version: 1 file: path: projects/0388061b-1218-3983-a567-79159d28a9c9.pdf size: '916449' extension: pdf discipline: id: a26c9403-acff-45b8-92a0-0809ed213f2d name: Accusamus code: ZRH created_at: null updated_at: null items: type: object properties: id: type: string example: 3f69083b-7d39-378c-b2ea-da011e10269f name: type: string example: 'Deserunt eos aut' description: type: string example: 'Reiciendis nam minima aliquid.' current_version: type: integer example: 1 file: type: object properties: path: type: string example: projects/58ba19ee-541e-3215-88b2-6477b5fce31b.pdf size: type: string example: '1756687' extension: type: string example: pdf discipline: type: object properties: id: type: string example: a26c9403-a940-4cc4-8548-f736cf811579 name: type: string example: Et code: type: string example: AWW created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Projects post: summary: 'Create project' operationId: createProject description: 'Create a new project and its first revision (R00)' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Projects requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: nome. example: 'Example Name' description: type: string description: descrição. example: 'Example Description' nullable: true discipline_id: type: string description: 'disciplina. O campo value deve ser um UUID válido. The uuid of an existing record in the disciplines table.' example: 097962c1-325b-3d72-91b3-fe47f30497cd work_id: type: string description: 'obra. O campo value deve ser um UUID válido. The uuid of an existing record in the works table.' example: f7cc537f-c010-3ad4-acfa-12de2b208545 nullable: true responsible_user_id: type: string description: 'responsável. O campo value deve ser um UUID válido. The uuid of an existing record in the users table.' example: 9b1d7ff9-80e7-36f3-ad99-ad85e84e1595 nullable: true notes: type: string description: observação. example: 'Example Notes' nullable: true file: type: object description: arquivo. example: - example1 - example2 properties: path: type: string description: 'caminho do arquivo. This field is required when file is present.' example: 'Example File path' name: type: string description: 'nome do arquivo.' example: 'Example Name' size: type: string description: 'tamanho do arquivo.' example: 'Example File size' nullable: true extension: type: string description: 'extensão do arquivo.' example: 'Example File extension' nullable: true required: - name required: - name - discipline_id - file '/api/projects/{id}': get: summary: 'Show project' operationId: showProject description: 'Show a project' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 2d102e13-89b2-3142-be61-ed2f66c25ed5 name: 'Enim hic sit' description: 'Voluptate dolorum quasi est ut rerum debitis unde.' current_version: 1 file: path: projects/8ad2725f-a6aa-3185-a183-1f0fdc8a99b3.pdf size: '1575151' extension: pdf discipline: id: a26c9403-b524-482e-825f-aa1944c56bff name: Delectus code: XAG created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 2d102e13-89b2-3142-be61-ed2f66c25ed5 name: type: string example: 'Enim hic sit' description: type: string example: 'Voluptate dolorum quasi est ut rerum debitis unde.' current_version: type: integer example: 1 file: type: object properties: path: type: string example: projects/8ad2725f-a6aa-3185-a183-1f0fdc8a99b3.pdf size: type: string example: '1575151' extension: type: string example: pdf discipline: type: object properties: id: type: string example: a26c9403-b524-482e-825f-aa1944c56bff name: type: string example: Delectus code: type: string example: XAG created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Projects put: summary: 'Update project' operationId: updateProject description: 'Update a project (metadata only)' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Projects requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: nome. example: 'Example Name' description: type: string description: descrição. example: 'Example Description' nullable: true discipline_id: type: string description: 'disciplina. O campo value deve ser um UUID válido. The uuid of an existing record in the disciplines table.' example: 2d9eb9fd-0ab8-330c-82d3-3f33d5710798 work_id: type: string description: 'obra. O campo value deve ser um UUID válido. The uuid of an existing record in the works table.' example: 529c48d4-095f-3248-9d05-6251f428d0fc nullable: true responsible_user_id: type: string description: 'responsável. O campo value deve ser um UUID válido. The uuid of an existing record in the users table.' example: c19f6955-5beb-397c-ad42-5775ab4bae29 nullable: true status_id: type: string description: 'situação. O campo value deve ser um UUID válido. The uuid of an existing record in the statuses table.' example: d7ce3786-9885-3af8-a674-561c8035fdf5 nullable: true parameters: - in: path name: id description: 'The ID of the project.' example: 20 required: true schema: type: integer - in: path name: project description: 'Project UUID' example: est required: true schema: type: string '/api/projects/{project}': delete: summary: 'Delete project' operationId: deleteProject description: 'Delete a project and its revisions' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Projects parameters: - in: path name: project description: 'Project UUID' example: sequi required: true schema: type: string /api/reports/daily-log: get: summary: 'Generate RDO PDF' operationId: generateRDOPDF description: 'Dispatches async PDF generation. Frontend receives notification via Pusher when ready.' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Reports requestBody: required: true content: application/json: schema: type: object properties: daily_log: type: string description: 'The uuid of an existing record in the daily_logs table.' example: quia required: - daily_log /api/reports/epi-term: get: summary: 'Generate EPI term PDF' operationId: generateEPITermPDF description: 'Dispatches async PDF generation. Frontend receives notification via Pusher when ready.' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Reports requestBody: required: true content: application/json: schema: type: object properties: employee: type: string description: 'The uuid of an existing record in the employees table.' example: quia kit_uuid: type: string description: 'O campo value deve ser um UUID válido.' example: 6cddc606-683c-3aea-b74f-36b69055ec89 required: - employee - kit_uuid /api/reports/cash-flow/excel: get: summary: 'Export Cash Flow to Excel' operationId: exportCashFlowToExcel description: 'Dispatches async Excel generation. Frontend receives notification via Pusher when ready.' parameters: - in: query name: q description: '' example: sit required: false schema: type: string description: '' example: sit nullable: true - in: query name: type description: 'Tipo de lançamento.' example: entrada required: false schema: type: string description: 'Tipo de lançamento.' example: entrada enum: - entrada - saída - tarifa - depósito - saque - transferência - pagamento - juros - ajuste - 'ajuste saída' nullable: true - in: query name: description description: '' example: 'Cumque autem et ducimus sapiente sed accusamus quisquam.' required: false schema: type: string description: '' example: 'Cumque autem et ducimus sapiente sed accusamus quisquam.' nullable: true - in: query name: categories description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the transaction_categories table.' example: - 728065ae-054e-3ef1-b56b-76ab5e1b5556 required: false schema: type: array description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the transaction_categories table.' example: - 728065ae-054e-3ef1-b56b-76ab5e1b5556 items: type: string - in: query name: exclude_categories description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the transaction_categories table.' example: - a9a74b50-baf0-3162-aea6-a59e3c41e9af required: false schema: type: array description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the transaction_categories table.' example: - a9a74b50-baf0-3162-aea6-a59e3c41e9af items: type: string - in: query name: date_start description: 'Início do período (data). O campo value deve ser uma data válida.' example: '2026-01-01' required: false schema: type: string description: 'Início do período (data). O campo value deve ser uma data válida.' example: '2026-01-01' nullable: true - in: query name: date_end description: 'Fim do período (data). O campo value deve ser uma data válida.' example: '2026-12-31' required: false schema: type: string description: 'Fim do período (data). O campo value deve ser uma data válida.' example: '2026-12-31' nullable: true - in: query name: bank_accounts description: 'O campo value deve ser um UUID válido.' example: - 3a189b47-1605-3f2d-b626-2473bd8af93f required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - 3a189b47-1605-3f2d-b626-2473bd8af93f items: type: string - in: query name: customers description: 'O campo value deve ser um UUID válido.' example: - 4e1609f5-063a-30b4-8edc-cc0d032c0f32 required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - 4e1609f5-063a-30b4-8edc-cc0d032c0f32 items: type: string - in: query name: suppliers description: 'O campo value deve ser um UUID válido.' example: - 2ab3b7c6-0fa2-3aff-9d47-debf36a500f2 required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - 2ab3b7c6-0fa2-3aff-9d47-debf36a500f2 items: type: string - in: query name: cash_session description: 'O campo value deve ser um UUID válido.' example: 50d922db-b32f-362f-b887-e1829495f6a3 required: false schema: type: string description: 'O campo value deve ser um UUID válido.' example: 50d922db-b32f-362f-b887-e1829495f6a3 nullable: true - in: query name: works description: 'O campo value deve ser um UUID válido.' example: - aff93d5e-deda-3ec1-ba97-1f1a92bc97ca required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - aff93d5e-deda-3ec1-ba97-1f1a92bc97ca items: type: string - in: query name: url description: '' example: null required: false schema: type: string description: '' example: null - in: query name: base64 description: '' example: null required: false schema: type: string description: '' example: null - in: query name: aba_unica description: '' example: null required: false schema: type: string description: '' example: null responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Reports /api/reports/cash-flow: get: summary: '' operationId: getApiReportsCashFlow description: '' parameters: - in: query name: q description: '' example: ipsam required: false schema: type: string description: '' example: ipsam nullable: true - in: query name: type description: 'Tipo de lançamento.' example: entrada required: false schema: type: string description: 'Tipo de lançamento.' example: entrada enum: - entrada - saída - tarifa - depósito - saque - transferência - pagamento - juros - ajuste - 'ajuste saída' nullable: true - in: query name: description description: '' example: 'Omnis odio libero blanditiis molestias incidunt sed reprehenderit rerum.' required: false schema: type: string description: '' example: 'Omnis odio libero blanditiis molestias incidunt sed reprehenderit rerum.' nullable: true - in: query name: categories description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the transaction_categories table.' example: - fc8ce598-63ea-3281-9e3e-25dbbbbba1e3 required: false schema: type: array description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the transaction_categories table.' example: - fc8ce598-63ea-3281-9e3e-25dbbbbba1e3 items: type: string - in: query name: exclude_categories description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the transaction_categories table.' example: - 45a7b051-222b-376d-bf06-19f7b994ba09 required: false schema: type: array description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the transaction_categories table.' example: - 45a7b051-222b-376d-bf06-19f7b994ba09 items: type: string - in: query name: date_start description: 'Início do período (data). O campo value deve ser uma data válida.' example: '2026-01-01' required: false schema: type: string description: 'Início do período (data). O campo value deve ser uma data válida.' example: '2026-01-01' nullable: true - in: query name: date_end description: 'Fim do período (data). O campo value deve ser uma data válida.' example: '2026-12-31' required: false schema: type: string description: 'Fim do período (data). O campo value deve ser uma data válida.' example: '2026-12-31' nullable: true - in: query name: bank_accounts description: 'O campo value deve ser um UUID válido.' example: - 990de134-be9d-393c-ab29-6f0a868d048c required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - 990de134-be9d-393c-ab29-6f0a868d048c items: type: string - in: query name: customers description: 'O campo value deve ser um UUID válido.' example: - e4e59bdb-dbbe-35f6-ab29-30e5950fc6cc required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - e4e59bdb-dbbe-35f6-ab29-30e5950fc6cc items: type: string - in: query name: suppliers description: 'O campo value deve ser um UUID válido.' example: - 04722383-67b0-34fd-97b9-19ed32e98342 required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - 04722383-67b0-34fd-97b9-19ed32e98342 items: type: string - in: query name: cash_session description: 'O campo value deve ser um UUID válido.' example: ffc3e52c-a45b-3bac-99c4-69acf534937a required: false schema: type: string description: 'O campo value deve ser um UUID válido.' example: ffc3e52c-a45b-3bac-99c4-69acf534937a nullable: true - in: query name: works description: 'O campo value deve ser um UUID válido.' example: - 44e5eb13-26fa-39d1-b075-900552d87ce1 required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - 44e5eb13-26fa-39d1-b075-900552d87ce1 items: type: string - in: query name: url description: '' example: null required: false schema: type: string description: '' example: null - in: query name: base64 description: '' example: null required: false schema: type: string description: '' example: null - in: query name: aba_unica description: '' example: null required: false schema: type: string description: '' example: null responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Reports security: [] /api/reports/accounts-payable-receivable/excel: get: summary: 'Export Accounts Payable/Receivable to Excel' operationId: exportAccountsPayableReceivableToExcel description: 'Dispatches async Excel generation. Frontend receives notification via Pusher when ready.' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Reports /api/reports/accounts-payable-receivable: get: summary: '' operationId: getApiReportsAccountsPayableReceivable description: '' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Reports security: [] /api/sectors: get: summary: 'List sectors' operationId: listSectors description: 'List all sectors' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: Tecnologia required: false schema: type: string description: 'Search query.' example: Tecnologia nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: d9a98b9a-65b1-3e92-ac2c-5a5f1db1d499 name: 'quas laudantium' slug: null description: 'Cupiditate qui eius enim et qui quod quam et. In reiciendis quo eos numquam sunt unde est quaerat. Voluptas vel rem aliquid inventore vero. Ut ex ut voluptatibus voluptatem exercitationem vel.' abbreviation: vtb created_at: null updated_at: null - id: b2257361-7b4d-3f91-806c-c3f98c6fd970 name: 'distinctio repudiandae' slug: null description: null abbreviation: mil created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: d9a98b9a-65b1-3e92-ac2c-5a5f1db1d499 name: 'quas laudantium' slug: null description: 'Cupiditate qui eius enim et qui quod quam et. In reiciendis quo eos numquam sunt unde est quaerat. Voluptas vel rem aliquid inventore vero. Ut ex ut voluptatibus voluptatem exercitationem vel.' abbreviation: vtb created_at: null updated_at: null - id: b2257361-7b4d-3f91-806c-c3f98c6fd970 name: 'distinctio repudiandae' slug: null description: null abbreviation: mil created_at: null updated_at: null items: type: object properties: id: type: string example: d9a98b9a-65b1-3e92-ac2c-5a5f1db1d499 name: type: string example: 'quas laudantium' slug: type: string example: null nullable: true description: type: string example: 'Cupiditate qui eius enim et qui quod quam et. In reiciendis quo eos numquam sunt unde est quaerat. Voluptas vel rem aliquid inventore vero. Ut ex ut voluptatibus voluptatem exercitationem vel.' abbreviation: type: string example: vtb created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Sectors post: summary: 'Create sector' operationId: createSector description: 'Create a new sector' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Sectors requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' slug: type: string description: 'Slug. O campo value não pode ser superior a 255 caracteres.' example: 'Example Slug' description: type: string description: Descrição. example: 'Example Description' nullable: true abbreviation: type: string description: 'Abreviação. O campo value não pode ser superior a 10 caracteres.' example: 'Example Abbreviation' nullable: true image: type: object description: Imagem. example: - example1 - example2 properties: path: type: string description: 'Caminho da imagem. O campo value não pode ser superior a 255 caracteres.' example: 'Example Image path' nullable: true url: type: string description: 'URL da imagem. Must be a valid URL.' example: 'https://example.com' nullable: true name: type: string description: 'Nome da imagem. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' nullable: true size: type: string description: 'Tamanho da imagem. O campo value não pode ser superior a 50 caracteres.' example: 'Example Image size' nullable: true extension: type: string description: 'Extensão da imagem. O campo value não pode ser superior a 10 caracteres.' example: 'Example Image extension' nullable: true nullable: true required: - name '/api/sectors/{id}': get: summary: 'Get sector' operationId: getSector description: 'Get a sector' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 79d8605b-036f-30cc-b6ad-b2c6fcdf1ca7 name: 'iure qui' slug: null description: null abbreviation: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 79d8605b-036f-30cc-b6ad-b2c6fcdf1ca7 name: type: string example: 'iure qui' slug: type: string example: null nullable: true description: type: string example: null nullable: true abbreviation: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Sectors put: summary: 'Update sector' operationId: updateSector description: 'Update a sector' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Sectors requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' slug: type: string description: 'Slug. O campo value não pode ser superior a 255 caracteres.' example: 'Example Slug' description: type: string description: Descrição. example: 'Example Description' nullable: true abbreviation: type: string description: 'Abreviação. O campo value não pode ser superior a 10 caracteres.' example: 'Example Abbreviation' nullable: true image: type: object description: Imagem. example: - example1 - example2 properties: path: type: string description: 'Caminho da imagem. O campo value não pode ser superior a 255 caracteres.' example: 'Example Image path' nullable: true url: type: string description: 'URL da imagem. Must be a valid URL.' example: 'https://example.com' nullable: true name: type: string description: 'Nome da imagem. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' nullable: true size: type: string description: 'Tamanho da imagem. O campo value não pode ser superior a 50 caracteres.' example: 'Example Image size' nullable: true extension: type: string description: 'Extensão da imagem. O campo value não pode ser superior a 10 caracteres.' example: 'Example Image extension' nullable: true nullable: true delete: summary: 'Delete sector' operationId: deleteSector description: 'Delete a sector' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Sectors parameters: - in: path name: id description: 'The ID of the sector.' example: 3 required: true schema: type: integer - in: path name: sector description: 'Sector ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/sectors/{sector}/users': get: summary: 'List sector users' operationId: listSectorUsers description: 'List all users assigned to a sector' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: cbbd4042-1d0a-3797-84f7-723ce1cad390 name: 'Dr. Lauryn Kassulke' username: ztoy email: hester.daniel@example.org certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: fd9979ec-654b-3908-841c-827c89ef67f0 name: 'Joyce Reichel' username: pwilkinson email: tbernier@example.net certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: cbbd4042-1d0a-3797-84f7-723ce1cad390 name: 'Dr. Lauryn Kassulke' username: ztoy email: hester.daniel@example.org certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: fd9979ec-654b-3908-841c-827c89ef67f0 name: 'Joyce Reichel' username: pwilkinson email: tbernier@example.net certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] items: type: object properties: id: type: string example: cbbd4042-1d0a-3797-84f7-723ce1cad390 name: type: string example: 'Dr. Lauryn Kassulke' username: type: string example: ztoy email: type: string example: hester.daniel@example.org certification: type: string example: null nullable: true crea: type: string example: null nullable: true last_login_at: type: string example: null nullable: true image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true sectors: type: array example: [] roles: type: array example: [] links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Sectors parameters: - in: path name: sector description: 'Sector UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/sectors/{sector}/users/attach': post: summary: 'Attach users to sector' operationId: attachUsersToSector description: 'Attach users to a sector without removing existing ones. Expects an array of user UUIDs in the "users" field.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Users attached successfully' properties: message: type: string example: 'Users attached successfully' tags: - Sectors requestBody: required: false content: application/json: schema: type: object properties: users: type: array description: 'UUID do usuário. The uuid of an existing record in the users table.' example: - 366d589d-c606-3b7c-950b-7d8ab59c53c2 items: type: string parameters: - in: path name: sector description: 'Sector UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/sectors/{sector}/users/detach': post: summary: 'Detach users from sector' operationId: detachUsersFromSector description: 'Remove specific users from a sector. Expects an array of user UUIDs in the "users" field.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Users detached successfully' properties: message: type: string example: 'Users detached successfully' tags: - Sectors requestBody: required: false content: application/json: schema: type: object properties: users: type: array description: 'UUID do usuário. The uuid of an existing record in the users table.' example: - 905b6872-f3b4-3f4e-b0d1-6f7e32dcae9d items: type: string parameters: - in: path name: sector description: 'Sector UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/sectors/{sector}/users/sync': post: summary: 'Sync sector users' operationId: syncSectorUsers description: 'Replace all sector users with the provided list. Expects an array of user UUIDs in the "users" field.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Users synchronized successfully' properties: message: type: string example: 'Users synchronized successfully' tags: - Sectors requestBody: required: false content: application/json: schema: type: object properties: users: type: array description: 'UUID do usuário. The uuid of an existing record in the users table.' example: - dc9f651a-7f1a-30cb-ad33-59bcd4a3425e items: type: string parameters: - in: path name: sector description: 'Sector UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string /api/status-modules: get: summary: 'List status modules' operationId: listStatusModules description: 'List all modules that have status functionality' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - name: 'ex explicabo' slug: enim-inventore-voluptas-animi-aut-quae-voluptate-vitae - name: 'laborum sed' slug: eum-voluptas-recusandae-hic-atque-autem properties: data: type: array example: - name: 'ex explicabo' slug: enim-inventore-voluptas-animi-aut-quae-voluptate-vitae - name: 'laborum sed' slug: eum-voluptas-recusandae-hic-atque-autem items: type: object properties: name: type: string example: 'ex explicabo' slug: type: string example: enim-inventore-voluptas-animi-aut-quae-voluptate-vitae tags: - 'Status Modules' /api/statuses: get: summary: 'List statuses' operationId: listStatuses description: 'List all statuses' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: 'Em andamento' required: false schema: type: string description: 'Search query.' example: 'Em andamento' nullable: true - in: query name: module description: 'Filter by module slug. The slug of an existing record in the status_modules table.' example: work required: false schema: type: string description: 'Filter by module slug. The slug of an existing record in the status_modules table.' example: work nullable: true - in: query name: sector_id description: 'Filter by sector UUID. The uuid of an existing record in the sectors table.' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: false schema: type: string description: 'Filter by sector UUID. The uuid of an existing record in the sectors table.' example: 019556e7-2e9f-777c-a177-30bbf0646c32 nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 7948507e-1804-3d55-a37c-ee3b97eae6e4 slug: null name: null description: 'Dayana Galhardo Soares' abbreviation: quae color: '#6da692' text_color: '#dd2e96' created_at: null updated_at: null - id: b87998a8-0fdb-3e4d-bafd-38a83974bdde slug: null name: null description: 'Betina Verdara Marés' abbreviation: ut color: '#0670d5' text_color: '#63e55e' module: name: Obras slug: work created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 7948507e-1804-3d55-a37c-ee3b97eae6e4 slug: null name: null description: 'Dayana Galhardo Soares' abbreviation: quae color: '#6da692' text_color: '#dd2e96' created_at: null updated_at: null - id: b87998a8-0fdb-3e4d-bafd-38a83974bdde slug: null name: null description: 'Betina Verdara Marés' abbreviation: ut color: '#0670d5' text_color: '#63e55e' module: name: Obras slug: work created_at: null updated_at: null items: type: object properties: id: type: string example: 7948507e-1804-3d55-a37c-ee3b97eae6e4 slug: type: string example: null nullable: true name: type: string example: null nullable: true description: type: string example: 'Dayana Galhardo Soares' abbreviation: type: string example: quae color: type: string example: '#6da692' text_color: type: string example: '#dd2e96' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Statuses post: summary: 'Create status' operationId: createStatus description: 'Create a new status' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Statuses requestBody: required: true content: application/json: schema: type: object properties: slug: type: string description: 'Slug. O campo value não pode ser superior a 100 caracteres.' example: 'Example Slug' nullable: true name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' nullable: true description: type: string description: 'Descrição. O campo value não pode ser superior a 255 caracteres.' example: 'Example Description' abbreviation: type: string description: 'Abreviação. O campo value não pode ser superior a 255 caracteres.' example: 'Example Abbreviation' module: type: string description: Módulo. example: 'Example Module' sector_id: type: string description: 'Setor. The uuid of an existing record in the sectors table.' example: 47b1c751-df54-3ecf-ba25-f87aaf31debb color: type: string description: Cor. example: 'Example Color' nullable: true text_color: type: string description: 'Cor do texto.' example: 'Example Text color' nullable: true order: type: integer description: 'Ordem. O campo value deve ser pelo menos 0.' example: 1 nullable: true is_initial: type: boolean description: 'Status inicial.' example: true nullable: true is_final: type: boolean description: 'Status final.' example: true nullable: true required: - description - abbreviation - module - sector_id '/api/statuses/{id}': get: summary: 'Get status' operationId: getStatus description: 'Get a status' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: de805c14-ef87-3878-9ec5-65afabc34569 slug: null name: null description: 'Dr. Flor Arruda' abbreviation: ex color: '#141e89' text_color: '#d51dc0' module: name: 'Solicitação de Produtos' slug: product_request created_at: null updated_at: null properties: data: type: object properties: id: type: string example: de805c14-ef87-3878-9ec5-65afabc34569 slug: type: string example: null nullable: true name: type: string example: null nullable: true description: type: string example: 'Dr. Flor Arruda' abbreviation: type: string example: ex color: type: string example: '#141e89' text_color: type: string example: '#d51dc0' module: type: object properties: name: type: string example: 'Solicitação de Produtos' slug: type: string example: product_request created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Statuses put: summary: 'Update status' operationId: updateStatus description: 'Update a status' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Statuses requestBody: required: false content: application/json: schema: type: object properties: slug: type: string description: 'Slug. O campo value não pode ser superior a 100 caracteres.' example: 'Example Slug' nullable: true name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' nullable: true description: type: string description: 'Descrição. O campo value não pode ser superior a 255 caracteres.' example: 'Example Description' abbreviation: type: string description: 'Abreviação. O campo value não pode ser superior a 255 caracteres.' example: 'Example Abbreviation' module: type: string description: Módulo. example: 'Example Module' sector_id: type: string description: 'Setor. The uuid of an existing record in the sectors table.' example: d0955c09-2cf7-3cb9-9cd5-34a26cbfab8e color: type: string description: Cor. example: 'Example Color' nullable: true text_color: type: string description: 'Cor do texto.' example: 'Example Text color' nullable: true order: type: integer description: 'Ordem. O campo value deve ser pelo menos 0.' example: 1 is_initial: type: boolean description: 'Status inicial.' example: true is_final: type: boolean description: 'Status final.' example: true parameters: - in: path name: id description: 'The ID of the status.' example: 1 required: true schema: type: integer - in: path name: status description: 'Status ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/statuses/{status}': delete: summary: 'Delete status' operationId: deleteStatus description: 'Delete a status' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Statuses parameters: - in: path name: status description: 'Status ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string /api/stocks/available-for-transfer: get: summary: 'List stocks available for transfer' operationId: listStocksAvailableForTransfer description: 'Returns a list of stock items from other works that have the specified product available for transfer' parameters: - in: query name: product_id description: 'Product UUID to search for. O campo value deve ser um UUID válido. The uuid of an existing record in the products table.' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string description: 'Product UUID to search for. O campo value deve ser um UUID válido. The uuid of an existing record in the products table.' example: 019556e7-2e9f-777c-a177-30bbf0646c32 - in: query name: exclude_work_id description: 'Work UUID to exclude from results (usually the requesting work). O campo value deve ser um UUID válido. The uuid of an existing record in the works table.' example: 019556e7-2e9f-777c-a177-30bbf0646c33 required: false schema: type: string description: 'Work UUID to exclude from results (usually the requesting work). O campo value deve ser um UUID válido. The uuid of an existing record in the works table.' example: 019556e7-2e9f-777c-a177-30bbf0646c33 nullable: true - in: query name: min_quantity description: 'Minimum quantity available. O campo value deve ser pelo menos 0.0001.' example: 1.0 required: false schema: type: number description: 'Minimum quantity available. O campo value deve ser pelo menos 0.0001.' example: 1.0 nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 58f83f21-dcf3-31df-bb6f-c8e7228777a6 quantity: 532.0627 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null - id: 54bce805-be64-340d-b4a5-11fa068730f6 quantity: 875.0796 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null properties: data: type: array example: - id: 58f83f21-dcf3-31df-bb6f-c8e7228777a6 quantity: 532.0627 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null - id: 54bce805-be64-340d-b4a5-11fa068730f6 quantity: 875.0796 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null items: type: object properties: id: type: string example: 58f83f21-dcf3-31df-bb6f-c8e7228777a6 quantity: type: number example: 532.0627 min_quantity: type: string example: null nullable: true max_quantity: type: string example: null nullable: true below_minimum: type: boolean example: false above_maximum: type: boolean example: false created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Stock /api/stocks: get: summary: 'List stocks' operationId: listStocks description: 'Returns a paginated list of stocks' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 10 required: false schema: type: integer description: 'Number of items per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 10 - in: query name: q description: 'Search by stock name. O campo value não pode ser superior a 255 caracteres.' example: 'Main Stock' required: false schema: type: string description: 'Search by stock name. O campo value não pode ser superior a 255 caracteres.' example: 'Main Stock' nullable: true - in: query name: module description: 'Filter by module type (e.g., work, customer). O campo value não pode ser superior a 100 caracteres.' example: work required: false schema: type: string description: 'Filter by module type (e.g., work, customer). O campo value não pode ser superior a 100 caracteres.' example: work nullable: true - in: query name: is_active description: 'Filter by active status.' example: true required: false schema: type: boolean description: 'Filter by active status.' example: true nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 21753fea-9950-3818-918c-35ab3f994089 name: 'Estoque Ávila-Bonilha' module: work is_active: true is_main: false created_at: null updated_at: null - id: 8421417a-2cd0-3a19-b4e2-52d7ed80e7a2 name: 'Estoque de Souza e Rezende' module: work is_active: true is_main: false created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 21753fea-9950-3818-918c-35ab3f994089 name: 'Estoque Ávila-Bonilha' module: work is_active: true is_main: false created_at: null updated_at: null - id: 8421417a-2cd0-3a19-b4e2-52d7ed80e7a2 name: 'Estoque de Souza e Rezende' module: work is_active: true is_main: false created_at: null updated_at: null items: type: object properties: id: type: string example: 21753fea-9950-3818-918c-35ab3f994089 name: type: string example: 'Estoque Ávila-Bonilha' module: type: string example: work is_active: type: boolean example: true is_main: type: boolean example: false created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Stock post: summary: 'Create stock' operationId: createStock description: 'Creates a new stock linked to a module' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 1c90b30f-e508-37ff-907a-e001ddda0b5e name: 'Estoque Galvão e de Arruda' module: work is_active: true is_main: false created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 1c90b30f-e508-37ff-907a-e001ddda0b5e name: type: string example: 'Estoque Galvão e de Arruda' module: type: string example: work is_active: type: boolean example: true is_main: type: boolean example: false created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Stock requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' module: type: string description: 'módulo. O campo value não pode ser superior a 255 caracteres.' example: 'Example Module' id: type: string description: identificador. example: 'Example Id' is_active: type: boolean description: ativo. example: true required: - name - module - id /api/stocks/main: get: summary: 'Get main stock' operationId: getMainStock description: 'Returns the main stock' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 9a0b5ee2-2113-3b4d-99b1-1243f9fc2da2 name: 'Estoque de Aguiar e Associados' module: work is_active: true is_main: false created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 9a0b5ee2-2113-3b4d-99b1-1243f9fc2da2 name: type: string example: 'Estoque de Aguiar e Associados' module: type: string example: work is_active: type: boolean example: true is_main: type: boolean example: false created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Stock '/api/stocks/{id}': get: summary: 'Show stock' operationId: showStock description: 'Returns details of a specific stock' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: bedf7b15-cdc7-30bc-8755-7dfc1d71cdf8 name: 'Estoque Rivera e Reis' module: work is_active: true is_main: false created_at: null updated_at: null properties: data: type: object properties: id: type: string example: bedf7b15-cdc7-30bc-8755-7dfc1d71cdf8 name: type: string example: 'Estoque Rivera e Reis' module: type: string example: work is_active: type: boolean example: true is_main: type: boolean example: false created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Stock put: summary: 'Update stock' operationId: updateStock description: 'Updates an existing stock' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: ec28d10e-99ed-3cc7-9fbe-7a5a4515ca66 name: 'Estoque Torres Comercial Ltda.' module: work is_active: true is_main: false created_at: null updated_at: null properties: data: type: object properties: id: type: string example: ec28d10e-99ed-3cc7-9fbe-7a5a4515ca66 name: type: string example: 'Estoque Torres Comercial Ltda.' module: type: string example: work is_active: type: boolean example: true is_main: type: boolean example: false created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Stock requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' is_active: type: boolean description: ativo. example: true delete: summary: 'Delete stock' operationId: deleteStock description: 'Removes a stock (soft delete)' parameters: [] responses: { } tags: - Stock parameters: - in: path name: id description: 'The ID of the stock.' example: 1 required: true schema: type: integer - in: path name: stock description: 'Stock UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/stocks/{stock}/items': get: summary: 'List stock items' operationId: listStockItems description: 'Returns a paginated list of items/products in a stock' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 10 required: false schema: type: integer description: 'Number of items per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 10 - in: query name: q description: 'Search by product name. O campo value não pode ser superior a 255 caracteres.' example: Cement required: false schema: type: string description: 'Search by product name. O campo value não pode ser superior a 255 caracteres.' example: Cement nullable: true - in: query name: below_minimum description: 'Filter items below minimum quantity.' example: true required: false schema: type: boolean description: 'Filter items below minimum quantity.' example: true nullable: true - in: query name: above_maximum description: 'Filter items above maximum quantity.' example: false required: false schema: type: boolean description: 'Filter items above maximum quantity.' example: false nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: d8aff686-0fe0-31e4-ad10-95d0419dcd26 quantity: 41.8956 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null - id: daa51beb-94c0-3de0-9d03-e76c2a69b5ae quantity: 18.9765 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: d8aff686-0fe0-31e4-ad10-95d0419dcd26 quantity: 41.8956 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null - id: daa51beb-94c0-3de0-9d03-e76c2a69b5ae quantity: 18.9765 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null items: type: object properties: id: type: string example: d8aff686-0fe0-31e4-ad10-95d0419dcd26 quantity: type: number example: 41.8956 min_quantity: type: string example: null nullable: true max_quantity: type: string example: null nullable: true below_minimum: type: boolean example: false above_maximum: type: boolean example: false created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Stock parameters: - in: path name: stock description: 'Stock UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/stocks/{stock_id}/items/{id}': patch: summary: 'Update stock item' operationId: updateStockItem description: 'Updates min/max quantity thresholds for a stock item' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: c97c93ea-0569-3178-a912-b36f6a5752f9 quantity: 603.1837 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null properties: data: type: object properties: id: type: string example: c97c93ea-0569-3178-a912-b36f6a5752f9 quantity: type: number example: 603.1837 min_quantity: type: string example: null nullable: true max_quantity: type: string example: null nullable: true below_minimum: type: boolean example: false above_maximum: type: boolean example: false created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Stock requestBody: required: false content: application/json: schema: type: object properties: min_quantity: type: number description: 'Minimum quantity threshold for low stock alert. O campo value deve ser pelo menos 0.' example: 10.0 nullable: true max_quantity: type: number description: 'Maximum quantity threshold for over stock alert. O campo value deve ser pelo menos 0.' example: 100.0 nullable: true parameters: - in: path name: stock_id description: 'The ID of the stock.' example: 1 required: true schema: type: integer - in: path name: id description: 'The ID of the item.' example: atque required: true schema: type: string - in: path name: stock description: 'Stock UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string - in: path name: item description: 'Stock item UUID' example: 019556e7-3a1b-888d-b288-41ccf0757d43 required: true schema: type: string '/api/stocks/{stock}/summary': get: summary: 'Stock summary' operationId: stockSummary description: 'Returns a summary with totals and alerts for the stock' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: total_products: 15 total_quantity: 1250.5 total_value: 18750.4 current_value: 9000 consumed_value: 9750.4 unvalued_quantity: 5 items_below_minimum: 3 items_above_maximum: 1 properties: data: type: object properties: total_products: type: integer example: 15 total_quantity: type: number example: 1250.5 total_value: type: number example: 18750.4 current_value: type: integer example: 9000 consumed_value: type: number example: 9750.4 unvalued_quantity: type: integer example: 5 items_below_minimum: type: integer example: 3 items_above_maximum: type: integer example: 1 tags: - Stock parameters: - in: path name: stock description: 'Stock UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/stocks/{stock_id}/movements': get: summary: 'List movements' operationId: listMovements description: 'Returns a paginated list of movements for a stock' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 10 required: false schema: type: integer description: 'Number of items per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 10 - in: query name: type description: 'Filter by movement type (entry, consumption, transfer_in, transfer_out, adjustment_up, adjustment_down). O campo value não pode ser superior a 50 caracteres.' example: entry required: false schema: type: string description: 'Filter by movement type (entry, consumption, transfer_in, transfer_out, adjustment_up, adjustment_down). O campo value não pode ser superior a 50 caracteres.' example: entry nullable: true - in: query name: product_id description: 'Filter by product UUID. O campo value deve ser um UUID válido.' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: false schema: type: string description: 'Filter by product UUID. O campo value deve ser um UUID válido.' example: 019556e7-2e9f-777c-a177-30bbf0646c32 nullable: true - in: query name: date_start description: 'Filter movements from this date (YYYY-MM-DD). O campo value deve ser uma data válida.' example: '2024-01-01' required: false schema: type: string description: 'Filter movements from this date (YYYY-MM-DD). O campo value deve ser uma data válida.' example: '2024-01-01' nullable: true - in: query name: date_end description: 'Filter movements until this date (YYYY-MM-DD). O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a date_start.' example: '2024-12-31' required: false schema: type: string description: 'Filter movements until this date (YYYY-MM-DD). O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a date_start.' example: '2024-12-31' nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 8366dde0-28d3-33bd-8766-bd23576030c4 code: MOV-065851 type: compra type_name: PURCHASE is_entry: true is_exit: false quantity: 85.252 previous_quantity: 830.505 new_quantity: 915.757 reason: null movement_date: '2026-08-01T18:45:52.000000Z' created_at: null - id: d545c7a4-4e0f-3266-8fe9-379e9ac54fe5 code: MOV-767502 type: vencido type_name: EXPIRED is_entry: false is_exit: true quantity: 94.4874 previous_quantity: 479.2046 new_quantity: 384.7172 reason: 'Voluptas atque laborum et.' movement_date: '2026-07-08T14:50:54.000000Z' created_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 8366dde0-28d3-33bd-8766-bd23576030c4 code: MOV-065851 type: compra type_name: PURCHASE is_entry: true is_exit: false quantity: 85.252 previous_quantity: 830.505 new_quantity: 915.757 reason: null movement_date: '2026-08-01T18:45:52.000000Z' created_at: null - id: d545c7a4-4e0f-3266-8fe9-379e9ac54fe5 code: MOV-767502 type: vencido type_name: EXPIRED is_entry: false is_exit: true quantity: 94.4874 previous_quantity: 479.2046 new_quantity: 384.7172 reason: 'Voluptas atque laborum et.' movement_date: '2026-07-08T14:50:54.000000Z' created_at: null items: type: object properties: id: type: string example: 8366dde0-28d3-33bd-8766-bd23576030c4 code: type: string example: MOV-065851 type: type: string example: compra type_name: type: string example: PURCHASE is_entry: type: boolean example: true is_exit: type: boolean example: false quantity: type: number example: 85.252 previous_quantity: type: number example: 830.505 new_quantity: type: number example: 915.757 reason: type: string example: null nullable: true movement_date: type: string example: '2026-08-01T18:45:52.000000Z' created_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Stock Movements' post: summary: 'Create movement' operationId: createMovement description: 'Creates a new entry or exit movement in the stock' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 1e153473-cefc-3f40-a0ac-facaf42000e3 code: MOV-526641 type: devolução type_name: RETURN is_entry: true is_exit: false quantity: 9.3293 previous_quantity: 763.7988 new_quantity: 773.1281 reason: null movement_date: '2026-07-30T07:51:07.000000Z' created_at: null properties: data: type: object properties: id: type: string example: 1e153473-cefc-3f40-a0ac-facaf42000e3 code: type: string example: MOV-526641 type: type: string example: devolução type_name: type: string example: RETURN is_entry: type: boolean example: true is_exit: type: boolean example: false quantity: type: number example: 9.3293 previous_quantity: type: number example: 763.7988 new_quantity: type: number example: 773.1281 reason: type: string example: null nullable: true movement_date: type: string example: '2026-07-30T07:51:07.000000Z' created_at: type: string example: null nullable: true tags: - 'Stock Movements' requestBody: required: true content: application/json: schema: type: object properties: product_id: type: string description: 'produto. The uuid of an existing record in the products table.' example: 79c3e8e4-05dc-3d1d-bc94-5fd4a479a18a type: type: string description: 'tipo de movimentação.' example: 'Example Type' enum: - compra - produção - devolução - consumo - venda - perda - vencido - alocação quantity: type: number description: quantidade. example: 1.0 reason: type: string description: 'motivo. O campo value não pode ser superior a 500 caracteres.' example: 'Example Reason' nullable: true reference_type: type: string description: 'tipo de referência. O campo value não pode ser superior a 255 caracteres.' example: 'Example Reference type' nullable: true reference_id: type: integer description: referência. example: 1 nullable: true movement_date: type: string description: 'data da movimentação. O campo value deve ser uma data válida.' example: '2024-01-01' nullable: true required: - product_id - type - quantity parameters: - in: path name: stock_id description: 'The ID of the stock.' example: 1 required: true schema: type: integer - in: path name: stock description: 'Stock UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/stocks/{stock}/movements/transfer': post: summary: 'Transfer between stocks' operationId: transferBetweenStocks description: 'Transfers products from one stock to another' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 8b813f4a-9c6c-3266-9de9-f06a6535f152 code: MOV-775790 type: 'entrada transferência' type_name: TRANSFER_IN is_entry: true is_exit: false quantity: 60.9615 previous_quantity: 360.2432 new_quantity: 421.2047 reason: null movement_date: '2026-08-04T15:14:26.000000Z' created_at: null properties: data: type: object properties: id: type: string example: 8b813f4a-9c6c-3266-9de9-f06a6535f152 code: type: string example: MOV-775790 type: type: string example: 'entrada transferência' type_name: type: string example: TRANSFER_IN is_entry: type: boolean example: true is_exit: type: boolean example: false quantity: type: number example: 60.9615 previous_quantity: type: number example: 360.2432 new_quantity: type: number example: 421.2047 reason: type: string example: null nullable: true movement_date: type: string example: '2026-08-04T15:14:26.000000Z' created_at: type: string example: null nullable: true tags: - 'Stock Movements' requestBody: required: true content: application/json: schema: type: object properties: product_id: type: string description: 'produto. The uuid of an existing record in the products table.' example: 7b9297ba-3703-3d9a-8b98-13b1f5b0906e destination_stock_id: type: string description: 'estoque de destino. The value and stock must be different. The uuid of an existing record in the stocks table.' example: 005d531e-0163-35a1-be31-9fa69022aec3 quantity: type: number description: quantidade. example: 1.0 reason: type: string description: 'motivo. O campo value não pode ser superior a 500 caracteres.' example: 'Example Reason' nullable: true movement_date: type: string description: 'data da movimentação. O campo value deve ser uma data válida.' example: '2024-01-01' nullable: true required: - product_id - destination_stock_id - quantity parameters: - in: path name: stock description: 'Source stock UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/stocks/{stock}/movements/inventory': post: summary: 'Inventory adjustment' operationId: inventoryAdjustment description: 'Performs inventory adjustment to correct stock quantity' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: e0e0b90a-1fa5-327a-881e-fdf360caf86a code: MOV-655669 type: consumo type_name: CONSUMPTION is_entry: false is_exit: true quantity: 21.756 previous_quantity: 489.412 new_quantity: 467.656 reason: null movement_date: '2026-08-04T08:07:02.000000Z' created_at: null properties: data: type: object properties: id: type: string example: e0e0b90a-1fa5-327a-881e-fdf360caf86a code: type: string example: MOV-655669 type: type: string example: consumo type_name: type: string example: CONSUMPTION is_entry: type: boolean example: false is_exit: type: boolean example: true quantity: type: number example: 21.756 previous_quantity: type: number example: 489.412 new_quantity: type: number example: 467.656 reason: type: string example: null nullable: true movement_date: type: string example: '2026-08-04T08:07:02.000000Z' created_at: type: string example: null nullable: true tags: - 'Stock Movements' requestBody: required: true content: application/json: schema: type: object properties: product_id: type: string description: 'produto. The uuid of an existing record in the products table.' example: 88bfcc51-2eb2-327a-a7a5-7195e02c8a3a new_quantity: type: number description: 'nova quantidade.' example: 1.0 reason: type: string description: 'motivo. O campo value não pode ser superior a 500 caracteres.' example: 'Example Reason' nullable: true movement_date: type: string description: 'data da movimentação. O campo value deve ser uma data válida.' example: '2024-01-01' nullable: true required: - product_id - new_quantity parameters: - in: path name: stock description: 'Stock UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string /api/stock-movements/purchase: post: summary: 'Purchase entry' operationId: purchaseEntry description: 'Registers a purchase entry directly into the main stock' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 17326699-77a2-383c-93dd-ac008ec00b40 code: MOV-840805 type: vencido type_name: EXPIRED is_entry: false is_exit: true quantity: 76.343 previous_quantity: 839.6726 new_quantity: 763.3296 reason: null movement_date: '2026-07-28T17:21:08.000000Z' created_at: null properties: data: type: object properties: id: type: string example: 17326699-77a2-383c-93dd-ac008ec00b40 code: type: string example: MOV-840805 type: type: string example: vencido type_name: type: string example: EXPIRED is_entry: type: boolean example: false is_exit: type: boolean example: true quantity: type: number example: 76.343 previous_quantity: type: number example: 839.6726 new_quantity: type: number example: 763.3296 reason: type: string example: null nullable: true movement_date: type: string example: '2026-07-28T17:21:08.000000Z' created_at: type: string example: null nullable: true tags: - 'Stock Movements' requestBody: required: true content: application/json: schema: type: object properties: product_id: type: string description: 'produto. The uuid of an existing record in the products table.' example: e44cb042-e8b6-353f-babb-8b33736956e4 quantity: type: number description: 'quantidade. O campo value deve ser pelo menos 0.0001.' example: 1.0 reason: type: string description: 'motivo. O campo value não pode ser superior a 500 caracteres.' example: 'Example Reason' nullable: true movement_date: type: string description: 'data do movimento. O campo value deve ser uma data válida.' example: '2024-01-01' nullable: true required: - product_id - quantity '/api/stock-movements/{movement}': get: summary: 'Show movement' operationId: showMovement description: 'Returns details of a specific movement' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 2322fe0f-bda9-3d26-b24d-4ce5df888167 code: MOV-380120 type: 'ajuste saída' type_name: ADJUSTMENT_OUT is_entry: false is_exit: true quantity: 87.0391 previous_quantity: 665.6095 new_quantity: 578.5704 reason: 'Facilis harum debitis ab nostrum.' movement_date: '2026-07-18T17:37:27.000000Z' created_at: null properties: data: type: object properties: id: type: string example: 2322fe0f-bda9-3d26-b24d-4ce5df888167 code: type: string example: MOV-380120 type: type: string example: 'ajuste saída' type_name: type: string example: ADJUSTMENT_OUT is_entry: type: boolean example: false is_exit: type: boolean example: true quantity: type: number example: 87.0391 previous_quantity: type: number example: 665.6095 new_quantity: type: number example: 578.5704 reason: type: string example: 'Facilis harum debitis ab nostrum.' movement_date: type: string example: '2026-07-18T17:37:27.000000Z' created_at: type: string example: null nullable: true tags: - 'Stock Movements' parameters: - in: path name: movement description: 'Movement UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string /api/suppliers: get: summary: 'List suppliers' operationId: listSuppliers description: 'List all suppliers' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: 'Supplier name' required: false schema: type: string description: 'Search query.' example: 'Supplier name' nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 1c2dead9-11f2-3281-aac3-70ae834a9879 name: 'Sra. Elisa Mirella Ramires' email: fassuncao@example.org phone: '(96) 99424-6178' document: 04.035.957/0001-24 type: pf responsible: 'Sra. Ruth Léia Oliveira Neto' image: id: null url: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null - id: 28c86dde-b743-35cb-bb8f-7694ba7d38cd name: 'Maraisa Deverso Jr.' email: eric80@example.com phone: '(65) 96052-5731' document: 80.204.456/0001-02 type: pj responsible: 'Dr. Walter Molina Lira Neto' image: id: null url: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 1c2dead9-11f2-3281-aac3-70ae834a9879 name: 'Sra. Elisa Mirella Ramires' email: fassuncao@example.org phone: '(96) 99424-6178' document: 04.035.957/0001-24 type: pf responsible: 'Sra. Ruth Léia Oliveira Neto' image: id: null url: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null - id: 28c86dde-b743-35cb-bb8f-7694ba7d38cd name: 'Maraisa Deverso Jr.' email: eric80@example.com phone: '(65) 96052-5731' document: 80.204.456/0001-02 type: pj responsible: 'Dr. Walter Molina Lira Neto' image: id: null url: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null items: type: object properties: id: type: string example: 1c2dead9-11f2-3281-aac3-70ae834a9879 name: type: string example: 'Sra. Elisa Mirella Ramires' email: type: string example: fassuncao@example.org phone: type: string example: '(96) 99424-6178' document: type: string example: 04.035.957/0001-24 type: type: string example: pf responsible: type: string example: 'Sra. Ruth Léia Oliveira Neto' image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true address: type: object properties: street: type: string example: null nullable: true number: type: string example: null nullable: true complement: type: string example: null nullable: true neighborhood: type: string example: null nullable: true city: type: string example: null nullable: true state: type: string example: null nullable: true zip_code: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Suppliers post: summary: 'Create supplier' operationId: createSupplier description: 'Create a new supplier' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Suppliers requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' email: type: string description: 'E-mail. O campo value deve ser um endereço de e-mail válido.' example: user@example.com phone: type: string description: Telefone. example: '(11) 99999-9999' document: type: string description: CPF/CNPJ. example: 'Example Document' type: type: string description: Tipo. example: 'Example Type' enum: - pf - pj responsible: type: string description: Responsável. example: 'Example Responsible' nullable: true image: type: object description: Imagem. example: - example1 - example2 properties: path: type: string description: 'Caminho da imagem. This field is required when image is present.' example: 'Example Image path' name: type: string description: 'Nome da imagem.' example: 'Example Name' nullable: true extension: type: string description: 'Extensão da imagem.' example: 'Example Image extension' nullable: true size: type: string description: 'Tamanho da imagem.' example: 'Example Image size' nullable: true address: type: object description: Endereço. example: - example1 - example2 properties: street: type: string description: Rua. example: 'Example Address street' number: type: string description: Número. example: 'Example Address number' complement: type: string description: Complemento. example: 'Example Address complement' neighborhood: type: string description: Bairro. example: 'Example Address neighborhood' city: type: string description: Cidade. example: 'Example Address city' state: type: string description: Estado. example: 'Example Address state' zip_code: type: string description: CEP. example: 'Example Address zip code' required: - street - number - neighborhood - city - state - zip_code required: - name - document - type '/api/suppliers/{id}': get: summary: 'Get supplier' operationId: getSupplier description: 'Get a supplier' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 2a6d1efc-a78d-35c0-925f-6a1a3ce65ef3 name: 'Everton Gian Marés Filho' email: meireles.paulo@example.com phone: '(77) 98551-2489' document: 57.597.442/0001-84 type: pj responsible: 'Dr. Gabrielly Godói' image: id: null url: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null properties: data: type: object properties: id: type: string example: 2a6d1efc-a78d-35c0-925f-6a1a3ce65ef3 name: type: string example: 'Everton Gian Marés Filho' email: type: string example: meireles.paulo@example.com phone: type: string example: '(77) 98551-2489' document: type: string example: 57.597.442/0001-84 type: type: string example: pj responsible: type: string example: 'Dr. Gabrielly Godói' image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true address: type: object properties: street: type: string example: null nullable: true number: type: string example: null nullable: true complement: type: string example: null nullable: true neighborhood: type: string example: null nullable: true city: type: string example: null nullable: true state: type: string example: null nullable: true zip_code: type: string example: null nullable: true tags: - Suppliers put: summary: 'Update supplier' operationId: updateSupplier description: 'Update a supplier' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Suppliers requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' email: type: string description: 'E-mail. O campo value deve ser um endereço de e-mail válido.' example: user@example.com phone: type: string description: Telefone. example: '(11) 99999-9999' document: type: string description: CPF/CNPJ. example: 'Example Document' type: type: string description: Tipo. example: 'Example Type' enum: - pf - pj responsible: type: string description: Responsável. example: 'Example Responsible' nullable: true image: type: object description: Imagem. example: - example1 - example2 properties: path: type: string description: 'Caminho da imagem. This field is required when image is present.' example: 'Example Image path' name: type: string description: 'Nome da imagem.' example: 'Example Name' nullable: true extension: type: string description: 'Extensão da imagem.' example: 'Example Image extension' nullable: true size: type: string description: 'Tamanho da imagem.' example: 'Example Image size' nullable: true address: type: object description: Endereço. example: - example1 - example2 properties: street: type: string description: Rua. example: 'Example Address street' number: type: string description: Número. example: 'Example Address number' complement: type: string description: Complemento. example: 'Example Address complement' neighborhood: type: string description: Bairro. example: 'Example Address neighborhood' city: type: string description: Cidade. example: 'Example Address city' state: type: string description: Estado. example: 'Example Address state' zip_code: type: string description: CEP. example: 'Example Address zip code' parameters: - in: path name: id description: 'The ID of the supplier.' example: 1 required: true schema: type: integer - in: path name: supplier description: 'Supplier ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/suppliers/{supplier}': delete: summary: 'Delete supplier' operationId: deleteSupplier description: 'Delete a supplier' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Suppliers parameters: - in: path name: supplier description: 'Supplier ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string /api/system-types: get: summary: 'System Types' operationId: systemTypes description: 'Get the system types' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: bankAccountTypes: key: value fileTypes: key: value legalEntityTypes: key: value transactionTypes: key: value properties: data: type: object properties: bankAccountTypes: type: object properties: key: type: string example: value fileTypes: type: object properties: key: type: string example: value legalEntityTypes: type: object properties: key: type: string example: value transactionTypes: type: object properties: key: type: string example: value tags: - 'System Types' /api/transaction-categories: get: summary: 'List transaction categories' operationId: listTransactionCategories description: 'List all transaction categories' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: Salary required: false schema: type: string description: 'Search query.' example: Salary nullable: true - in: query name: type description: 'Transaction type.' example: entrada required: false schema: type: string description: 'Transaction type.' example: entrada enum: - entrada - saída - tarifa - depósito - saque - transferência - pagamento - juros - ajuste - 'ajuste saída' nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 3e440c82-5291-3a99-b3d1-e586aefa2a00 name: 'Sra. Franciele Montenegro Padrão' description: 'Sed ullam facere consequuntur et a illum et. Necessitatibus quis tenetur voluptatem ex qui in reprehenderit. Minus voluptas ad dolorem. Vel ad voluptatem quia dolores ea et.' type: ajuste - id: d2e88cbc-9884-365d-9dab-3e42ebbd3c8c name: 'Sra. Priscila Marés Marés' description: 'Eveniet inventore delectus quasi ut laudantium consequatur et. Consequatur ea ut est ipsam omnis. Exercitationem veniam alias eligendi doloremque amet sunt earum aut. Sed et provident ut iure ut.' type: juros links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 3e440c82-5291-3a99-b3d1-e586aefa2a00 name: 'Sra. Franciele Montenegro Padrão' description: 'Sed ullam facere consequuntur et a illum et. Necessitatibus quis tenetur voluptatem ex qui in reprehenderit. Minus voluptas ad dolorem. Vel ad voluptatem quia dolores ea et.' type: ajuste - id: d2e88cbc-9884-365d-9dab-3e42ebbd3c8c name: 'Sra. Priscila Marés Marés' description: 'Eveniet inventore delectus quasi ut laudantium consequatur et. Consequatur ea ut est ipsam omnis. Exercitationem veniam alias eligendi doloremque amet sunt earum aut. Sed et provident ut iure ut.' type: juros items: type: object properties: id: type: string example: 3e440c82-5291-3a99-b3d1-e586aefa2a00 name: type: string example: 'Sra. Franciele Montenegro Padrão' description: type: string example: 'Sed ullam facere consequuntur et a illum et. Necessitatibus quis tenetur voluptatem ex qui in reprehenderit. Minus voluptas ad dolorem. Vel ad voluptatem quia dolores ea et.' type: type: string example: ajuste links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Transaction Categories' post: summary: 'Create transaction category' operationId: createTransactionCategory description: 'Create a new transaction category' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Transaction Categories' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Name. example: 'Example Name' description: type: string description: Description. example: 'Example Description' type: type: string description: Type. example: 'Example Type' enum: - entrada - saída - tarifa - depósito - saque - transferência - pagamento - juros - ajuste - 'ajuste saída' required: - name - type '/api/transaction-categories/{transactionCategory}': get: summary: 'Show transaction category' operationId: showTransactionCategory description: 'Show a transaction category' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 7a0bdcd2-e706-3597-9031-1a693d497f67 name: 'Sra. Josefina Tessália Estrada' description: 'Reprehenderit maxime maxime harum rem quo itaque consequatur. Corporis necessitatibus sit magnam quis. Facilis soluta rerum animi nam. Nesciunt porro tempore beatae ab voluptatibus rerum.' type: ajuste properties: data: type: object properties: id: type: string example: 7a0bdcd2-e706-3597-9031-1a693d497f67 name: type: string example: 'Sra. Josefina Tessália Estrada' description: type: string example: 'Reprehenderit maxime maxime harum rem quo itaque consequatur. Corporis necessitatibus sit magnam quis. Facilis soluta rerum animi nam. Nesciunt porro tempore beatae ab voluptatibus rerum.' type: type: string example: ajuste tags: - 'Transaction Categories' put: summary: 'Update transaction category' operationId: updateTransactionCategory description: 'Update a transaction category' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Transaction Categories' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Name. example: 'Example Name' description: type: string description: Description. example: 'Example Description' type: type: string description: Type. example: 'Example Type' enum: - entrada - saída - tarifa - depósito - saque - transferência - pagamento - juros - ajuste - 'ajuste saída' required: - name - type delete: summary: 'Delete transaction category' operationId: deleteTransactionCategory description: 'Delete a transaction category' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Transaction Categories' parameters: - in: path name: transactionCategory description: 'Transaction category UUID' example: et required: true schema: type: string /api/units: get: summary: 'List units' operationId: listUnits description: 'List all units' parameters: - in: query name: q description: '' example: Structure required: false schema: type: string description: '' example: Structure nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 3eb19250-7b22-39c4-8cbf-06249346c619 name: 'Sr. Moisés David Marinho Neto' abbreviation: 'Dr. Michael Estrada Neto' description: 'Ipsum aperiam et autem.' created_at: null updated_at: null - id: b72e9d6d-c0d7-36a2-be48-b11995f595a9 name: 'Ana Franciele Carmona' abbreviation: 'Dr. Richard Delvalle Galvão' description: 'Dolores tenetur cum non odio.' created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 3eb19250-7b22-39c4-8cbf-06249346c619 name: 'Sr. Moisés David Marinho Neto' abbreviation: 'Dr. Michael Estrada Neto' description: 'Ipsum aperiam et autem.' created_at: null updated_at: null - id: b72e9d6d-c0d7-36a2-be48-b11995f595a9 name: 'Ana Franciele Carmona' abbreviation: 'Dr. Richard Delvalle Galvão' description: 'Dolores tenetur cum non odio.' created_at: null updated_at: null items: type: object properties: id: type: string example: 3eb19250-7b22-39c4-8cbf-06249346c619 name: type: string example: 'Sr. Moisés David Marinho Neto' abbreviation: type: string example: 'Dr. Michael Estrada Neto' description: type: string example: 'Ipsum aperiam et autem.' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Units post: summary: 'Create unit' operationId: createUnit description: 'Create a new unit' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Units requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Nome da unidade.' example: 'Example Name' abbreviation: type: string description: Abreviação. example: 'Example Abbreviation' description: type: string description: Descrição. example: 'Example Description' nullable: true required: - name - abbreviation '/api/units/{id}': get: summary: 'Show unit' operationId: showUnit description: 'Show a unit' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: dbff83db-df9d-3998-9e04-c05e110163cc name: 'Julieta Luna Urias' abbreviation: 'Bella Branco Valente' description: 'Natus officiis ipsam et quos.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: dbff83db-df9d-3998-9e04-c05e110163cc name: type: string example: 'Julieta Luna Urias' abbreviation: type: string example: 'Bella Branco Valente' description: type: string example: 'Natus officiis ipsam et quos.' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Units put: summary: 'Update unit' operationId: updateUnit description: 'Update a unit' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Units requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Nome da unidade.' example: 'Example Name' abbreviation: type: string description: Abreviação. example: 'Example Abbreviation' description: type: string description: Descrição. example: 'Example Description' nullable: true required: - name - abbreviation parameters: - in: path name: id description: 'The ID of the unit.' example: 1 required: true schema: type: integer - in: path name: unit description: 'Unit UUID' example: quae required: true schema: type: string '/api/units/{unit}': delete: summary: 'Delete unit' operationId: deleteUnit description: 'Delete a unit' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Units parameters: - in: path name: unit description: 'Unit UUID' example: in required: true schema: type: string /api/users: get: summary: 'List users' operationId: listUsers description: 'List all users' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query by name or email.' example: 'John Doe' required: false schema: type: string description: 'Search query by name or email.' example: 'John Doe' nullable: true - in: query name: sector_id description: 'Filter by sector UUID. The uuid of an existing record in the sectors table.' example: 123e4567-e89b-12d3-a456-426614174000 required: false schema: type: string description: 'Filter by sector UUID. The uuid of an existing record in the sectors table.' example: 123e4567-e89b-12d3-a456-426614174000 nullable: true - in: query name: role description: 'Filter by role name. The name of an existing record in the roles table.' example: ADMIN required: false schema: type: string description: 'Filter by role name. The name of an existing record in the roles table.' example: ADMIN nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: e7bb8253-914f-3b09-8464-07b659aff213 name: 'Maya Kohler' username: gudrun21 email: kenna48@example.com certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: 71162d40-eb34-3545-948c-44d1e34f16e7 name: 'Haylee Murray Jr.' username: zwyman email: twila78@example.com certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: e7bb8253-914f-3b09-8464-07b659aff213 name: 'Maya Kohler' username: gudrun21 email: kenna48@example.com certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: 71162d40-eb34-3545-948c-44d1e34f16e7 name: 'Haylee Murray Jr.' username: zwyman email: twila78@example.com certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] items: type: object properties: id: type: string example: e7bb8253-914f-3b09-8464-07b659aff213 name: type: string example: 'Maya Kohler' username: type: string example: gudrun21 email: type: string example: kenna48@example.com certification: type: string example: null nullable: true crea: type: string example: null nullable: true last_login_at: type: string example: null nullable: true image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true sectors: type: array example: [] roles: type: array example: [] links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Users post: summary: 'Create user' operationId: createUser description: 'Create a new user' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Users requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' certification: type: string description: 'Certificação. O campo value não pode ser superior a 255 caracteres.' example: 'Example Certification' nullable: true crea: type: string description: 'CREA. O campo value não pode ser superior a 255 caracteres.' example: 'Example Crea' nullable: true email: type: string description: 'E-mail. O campo value deve ser um endereço de e-mail válido.' example: user@example.com username: type: string description: Usuário. example: hegmann.pablo image: type: object description: Imagem. example: - example1 - example2 properties: path: type: string description: 'Caminho da imagem. This field is required when image is present.' example: 'Example Image path' name: type: string description: 'Nome da imagem.' example: 'Example Name' nullable: true extension: type: string description: 'Extensão da imagem.' example: 'Example Image extension' nullable: true size: type: string description: 'Tamanho da imagem.' example: 'Example Image size' nullable: true sectors: type: array description: 'UUID do setor. The uuid of an existing record in the sectors table.' example: - c51d0d31-b583-387e-b2fe-5faec223571d items: type: string roles: type: array description: 'UUID da função. The uuid of an existing record in the roles table.' example: - 92670d44-0e54-34cc-815d-41de78e5a716 items: type: string required: - name - email - username '/api/users/{id}': get: summary: 'Get user' operationId: getUser description: 'Get a user' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 53e6df48-2b0f-3db1-8b4e-33392f196441 name: 'Stuart Bins PhD' username: fcartwright email: adalberto.cormier@example.org certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] properties: data: type: object properties: id: type: string example: 53e6df48-2b0f-3db1-8b4e-33392f196441 name: type: string example: 'Stuart Bins PhD' username: type: string example: fcartwright email: type: string example: adalberto.cormier@example.org certification: type: string example: null nullable: true crea: type: string example: null nullable: true last_login_at: type: string example: null nullable: true image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true sectors: type: array example: [] roles: type: array example: [] tags: - Users put: summary: 'Update user' operationId: updateUser description: 'Update a user' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Users requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' certification: type: string description: 'Certificação. O campo value não pode ser superior a 255 caracteres.' example: 'Example Certification' nullable: true crea: type: string description: 'CREA. O campo value não pode ser superior a 255 caracteres.' example: 'Example Crea' nullable: true email: type: string description: 'E-mail. O campo value deve ser um endereço de e-mail válido.' example: user@example.com username: type: string description: Usuário. example: stokes.jaida password: type: string description: Password. example: password123 image: type: object description: Imagem. example: - example1 - example2 properties: path: type: string description: 'Caminho da imagem. This field is required when image is present.' example: 'Example Image path' name: type: string description: 'Nome da imagem.' example: 'Example Name' nullable: true extension: type: string description: 'Extensão da imagem.' example: 'Example Image extension' nullable: true size: type: string description: 'Tamanho da imagem.' example: 'Example Image size' nullable: true sectors: type: array description: 'UUID do setor. The uuid of an existing record in the sectors table.' example: - 7319d8c2-b8ed-3c84-a94f-a9b2c474e1c4 items: type: string roles: type: array description: 'UUID da função. The uuid of an existing record in the roles table.' example: - 058d9fa3-4d70-3508-a4cb-0c08a8d96ac1 items: type: string parameters: - in: path name: id description: 'The ID of the user.' example: 1 required: true schema: type: integer '/api/users/{user}': delete: summary: 'Delete user' operationId: deleteUser description: 'Delete a user' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Users parameters: - in: path name: user description: 'The user.' example: 1 required: true schema: type: integer '/api/users/{user}/password-reset': put: summary: 'Reset user password' operationId: resetUserPassword description: 'Reset a user password' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Password reset successfully to foobaar' properties: message: type: string example: 'Password reset successfully to foobaar' tags: - Users parameters: - in: path name: user description: 'User ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/users/{user}/permissions': put: summary: 'Attach permissions to user' operationId: attachPermissionsToUser description: 'Attach direct permissions to a user' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Permissions attached successfully' properties: message: type: string example: 'Permissions attached successfully' tags: - Users requestBody: required: false content: application/json: schema: type: object properties: permissions: type: array description: 'UUID da permissão. The uuid of an existing record in the permissions table.' example: - 09d72f59-805b-3022-8ea4-876ec79f3e64 items: type: string get: summary: 'List user direct permissions' operationId: listUserDirectPermissions description: 'List direct permissions associated with a user' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: null name: sit display_name: 'Voluptatem qui ab dicta quis culpa.' - id: null name: fugiat display_name: 'Consequatur quos quas rerum sequi.' properties: data: type: array example: - id: null name: sit display_name: 'Voluptatem qui ab dicta quis culpa.' - id: null name: fugiat display_name: 'Consequatur quos quas rerum sequi.' items: type: object properties: id: type: string example: null nullable: true name: type: string example: sit display_name: type: string example: 'Voluptatem qui ab dicta quis culpa.' tags: - Users parameters: - in: path name: user description: 'The user.' example: 1 required: true schema: type: integer /api/work-locations: get: summary: 'List work locations' operationId: listWorkLocations description: 'List all work locations' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: Tecnologia required: false schema: type: string description: 'Search query.' example: Tecnologia nullable: true - in: query name: work description: 'Work. The uuid of an existing record in the works table.' example: uuid required: false schema: type: string description: 'Work. The uuid of an existing record in the works table.' example: uuid nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 431793b7-a704-3891-8dbb-5318e5f7b832 description: 'Hugo Mauro Ferreira' work: id: null name: null documents: [] created_at: null updated_at: null - id: ac78099d-d41b-3a58-ab8c-24ebbde4a7de description: 'Dr. Flávio Pena' work: id: null name: null documents: [] created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 431793b7-a704-3891-8dbb-5318e5f7b832 description: 'Hugo Mauro Ferreira' work: id: null name: null documents: [] created_at: null updated_at: null - id: ac78099d-d41b-3a58-ab8c-24ebbde4a7de description: 'Dr. Flávio Pena' work: id: null name: null documents: [] created_at: null updated_at: null items: type: object properties: id: type: string example: 431793b7-a704-3891-8dbb-5318e5f7b832 description: type: string example: 'Hugo Mauro Ferreira' work: type: object properties: id: type: string example: null nullable: true name: type: string example: null nullable: true documents: type: array example: [] created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - 'Work Locations' post: summary: 'Create work location' operationId: createWorkLocation description: 'Create a new work location' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Work Locations' requestBody: required: true content: application/json: schema: type: object properties: description: type: string description: 'Descrição. O campo value não pode ser superior a 255 caracteres.' example: 'Example Description' work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: 36611be6-eef8-3d84-a758-3bd9711f3921 required: - description - work_id '/api/work-locations/{workLocation}': get: summary: 'Get work location' operationId: getWorkLocation description: 'Get a work location' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: c083ba4e-c341-3fe1-9afd-0e155d028443 description: 'Melina Ferreira Aguiar' work: id: null name: null documents: [] created_at: null updated_at: null properties: data: type: object properties: id: type: string example: c083ba4e-c341-3fe1-9afd-0e155d028443 description: type: string example: 'Melina Ferreira Aguiar' work: type: object properties: id: type: string example: null nullable: true name: type: string example: null nullable: true documents: type: array example: [] created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Work Locations' put: summary: 'Update work location' operationId: updateWorkLocation description: 'Update a work location' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Work Locations' requestBody: required: false content: application/json: schema: type: object properties: description: type: string description: 'Descrição. O campo value não pode ser superior a 255 caracteres.' example: 'Example Description' work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: 9ab9943b-481a-3d98-9ec6-95a5b5c0e806 delete: summary: 'Delete work location' operationId: deleteWorkLocation description: 'Delete a work location' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Work Locations' parameters: - in: path name: workLocation description: 'Work Location ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string /api/works: get: summary: 'List works' operationId: listWorks description: 'List all works' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search query.' example: Tecnologia required: false schema: type: string description: 'Search query.' example: Tecnologia nullable: true - in: query name: customer_id description: 'Filter by customer UUID. The uuid of an existing record in the customers table.' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: false schema: type: string description: 'Filter by customer UUID. The uuid of an existing record in the customers table.' example: 019556e7-2e9f-777c-a177-30bbf0646c32 nullable: true - in: query name: status_id description: 'Filter by status UUID. The uuid of an existing record in the statuses table.' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: false schema: type: string description: 'Filter by status UUID. The uuid of an existing record in the statuses table.' example: 019556e7-2e9f-777c-a177-30bbf0646c32 nullable: true - in: query name: responsible_id description: 'Filter by responsible user UUID. Only works if user has "work view-all" permission. The uuid of an existing record in the users table.' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: false schema: type: string description: 'Filter by responsible user UUID. Only works if user has "work view-all" permission. The uuid of an existing record in the users table.' example: 019556e7-2e9f-777c-a177-30bbf0646c32 nullable: true - in: query name: no_responsible description: 'Filter works without any responsible users.' example: true required: false schema: type: boolean description: 'Filter works without any responsible users.' example: true nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 5a45b6b9-7a32-305d-9ec2-5cc93a12f66b name: 'Lia Ramires' address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null documents: [] locations: [] product_quantity_lists_count: 0 product_quantity_list_items_count: 0 product_requests_count: 0 product_request_items_count: 0 documents_count: 0 locations_documents_count: 0 total_documents_count: 0 daily_logs_count: 0 projects_count: 0 started_at: date: '1972-03-11 15:45:10.000000' timezone_type: 3 timezone: America/Sao_Paulo created_at: null updated_at: null - id: ac594978-c5c4-3cfd-82e0-d030cffd2126 name: 'José Evandro Beltrão' address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null documents: [] locations: [] product_quantity_lists_count: 0 product_quantity_list_items_count: 0 product_requests_count: 0 product_request_items_count: 0 documents_count: 0 locations_documents_count: 0 total_documents_count: 0 daily_logs_count: 0 projects_count: 0 started_at: date: '1989-06-06 17:15:16.000000' timezone_type: 3 timezone: America/Sao_Paulo created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 5a45b6b9-7a32-305d-9ec2-5cc93a12f66b name: 'Lia Ramires' address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null documents: [] locations: [] product_quantity_lists_count: 0 product_quantity_list_items_count: 0 product_requests_count: 0 product_request_items_count: 0 documents_count: 0 locations_documents_count: 0 total_documents_count: 0 daily_logs_count: 0 projects_count: 0 started_at: date: '1972-03-11 15:45:10.000000' timezone_type: 3 timezone: America/Sao_Paulo created_at: null updated_at: null - id: ac594978-c5c4-3cfd-82e0-d030cffd2126 name: 'José Evandro Beltrão' address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null documents: [] locations: [] product_quantity_lists_count: 0 product_quantity_list_items_count: 0 product_requests_count: 0 product_request_items_count: 0 documents_count: 0 locations_documents_count: 0 total_documents_count: 0 daily_logs_count: 0 projects_count: 0 started_at: date: '1989-06-06 17:15:16.000000' timezone_type: 3 timezone: America/Sao_Paulo created_at: null updated_at: null items: type: object properties: id: type: string example: 5a45b6b9-7a32-305d-9ec2-5cc93a12f66b name: type: string example: 'Lia Ramires' address: type: object properties: street: type: string example: null nullable: true number: type: string example: null nullable: true complement: type: string example: null nullable: true neighborhood: type: string example: null nullable: true city: type: string example: null nullable: true state: type: string example: null nullable: true zip_code: type: string example: null nullable: true documents: type: array example: [] locations: type: array example: [] product_quantity_lists_count: type: integer example: 0 product_quantity_list_items_count: type: integer example: 0 product_requests_count: type: integer example: 0 product_request_items_count: type: integer example: 0 documents_count: type: integer example: 0 locations_documents_count: type: integer example: 0 total_documents_count: type: integer example: 0 daily_logs_count: type: integer example: 0 projects_count: type: integer example: 0 started_at: type: object properties: date: type: string example: '1972-03-11 15:45:10.000000' timezone_type: type: integer example: 3 timezone: type: string example: America/Sao_Paulo created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Works post: summary: 'Create work' operationId: createWork description: 'Create a new work' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Works requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' customer_id: type: string description: 'Cliente. The uuid of an existing record in the customers table.' example: 5c1dc12c-415a-3071-8742-6dc548ee6048 status_id: type: string description: 'Status id. The uuid of an existing record in the statuses table.' example: a62c280e-570f-31e7-8c14-439557101280 started_at: type: string description: 'Início da obra. O campo value deve ser uma data válida.' example: 'Example Started at' nullable: true address: type: object description: Endereço. example: - example1 - example2 properties: street: type: string description: Rua. example: 'Example Address street' number: type: string description: Número. example: 'Example Address number' complement: type: string description: Complemento. example: 'Example Address complement' neighborhood: type: string description: Bairro. example: 'Example Address neighborhood' city: type: string description: Cidade. example: 'Example Address city' state: type: string description: Estado. example: 'Example Address state' zip_code: type: string description: CEP. example: 'Example Address zip code' required: - street - number - neighborhood - city - state - zip_code required: - name - customer_id - status_id - address '/api/works/{id}': get: summary: 'Get work' operationId: getWork description: 'Get a work' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: ae97a92a-ae7e-326a-98a4-19f25d276bbd name: 'Kauan Corona Neto' address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null documents: [] locations: [] product_quantity_lists_count: 0 product_quantity_list_items_count: 0 product_requests_count: 0 product_request_items_count: 0 documents_count: 0 locations_documents_count: 0 total_documents_count: 0 daily_logs_count: 0 projects_count: 0 started_at: date: '2019-06-05 22:23:15.000000' timezone_type: 3 timezone: America/Sao_Paulo created_at: null updated_at: null properties: data: type: object properties: id: type: string example: ae97a92a-ae7e-326a-98a4-19f25d276bbd name: type: string example: 'Kauan Corona Neto' address: type: object properties: street: type: string example: null nullable: true number: type: string example: null nullable: true complement: type: string example: null nullable: true neighborhood: type: string example: null nullable: true city: type: string example: null nullable: true state: type: string example: null nullable: true zip_code: type: string example: null nullable: true documents: type: array example: [] locations: type: array example: [] product_quantity_lists_count: type: integer example: 0 product_quantity_list_items_count: type: integer example: 0 product_requests_count: type: integer example: 0 product_request_items_count: type: integer example: 0 documents_count: type: integer example: 0 locations_documents_count: type: integer example: 0 total_documents_count: type: integer example: 0 daily_logs_count: type: integer example: 0 projects_count: type: integer example: 0 started_at: type: object properties: date: type: string example: '2019-06-05 22:23:15.000000' timezone_type: type: integer example: 3 timezone: type: string example: America/Sao_Paulo created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Works put: summary: 'Update work' operationId: updateWork description: 'Update a work' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Works requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' customer_id: type: string description: 'Cliente. The uuid of an existing record in the customers table.' example: 15afb0af-b23c-347c-a1e7-4894f5c2de3e status_id: type: string description: 'Status id. The uuid of an existing record in the statuses table.' example: ad1fe9f2-3c11-3db7-ae66-ddf0126bca6e started_at: type: string description: 'Início da obra. O campo value deve ser uma data válida.' example: 'Example Started at' nullable: true address: type: object description: Endereço. example: - example1 - example2 properties: street: type: string description: Rua. example: 'Example Address street' number: type: string description: Número. example: 'Example Address number' complement: type: string description: Complemento. example: 'Example Address complement' neighborhood: type: string description: Bairro. example: 'Example Address neighborhood' city: type: string description: Cidade. example: 'Example Address city' state: type: string description: Estado. example: 'Example Address state' zip_code: type: string description: CEP. example: 'Example Address zip code' delete: summary: 'Delete work' operationId: deleteWork description: 'Delete a work' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - Works parameters: - in: path name: id description: 'The ID of the work.' example: 1 required: true schema: type: integer - in: path name: work description: 'Work ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/works/{work}/responsibles': get: summary: 'List work responsibles' operationId: listWorkResponsibles description: 'List all users responsible for a work' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 required: false schema: type: integer description: 'Number of items per page (max: 100). O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 15 nullable: true - in: query name: q description: 'Search by name or email.' example: John required: false schema: type: string description: 'Search by name or email.' example: John nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 7924b5a0-fba3-3b8f-bb2c-ce7ea204edfb name: 'Dr. Narciso Lynch' username: brady28 email: mgreenholt@example.com certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: 13e8bfd8-c720-339f-b454-3d229acaff08 name: 'Christophe Dach' username: arnold.huel email: qcollins@example.org certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 7924b5a0-fba3-3b8f-bb2c-ce7ea204edfb name: 'Dr. Narciso Lynch' username: brady28 email: mgreenholt@example.com certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: 13e8bfd8-c720-339f-b454-3d229acaff08 name: 'Christophe Dach' username: arnold.huel email: qcollins@example.org certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] items: type: object properties: id: type: string example: 7924b5a0-fba3-3b8f-bb2c-ce7ea204edfb name: type: string example: 'Dr. Narciso Lynch' username: type: string example: brady28 email: type: string example: mgreenholt@example.com certification: type: string example: null nullable: true crea: type: string example: null nullable: true last_login_at: type: string example: null nullable: true image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true sectors: type: array example: [] roles: type: array example: [] links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Works parameters: - in: path name: work description: 'Work UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/works/{work}/responsibles/attach': post: summary: 'Attach responsibles to work' operationId: attachResponsiblesToWork description: 'Attach users as responsibles to a work without removing existing ones' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Responsibles attached successfully' properties: message: type: string example: 'Responsibles attached successfully' tags: - Works requestBody: required: false content: application/json: schema: type: object properties: users: type: array description: 'UUID do usuário. The uuid of an existing record in the users table.' example: - 0f450af4-6450-3c71-a906-be266e8d19f0 items: type: string parameters: - in: path name: work description: 'Work UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/works/{work}/responsibles/detach': post: summary: 'Detach responsibles from work' operationId: detachResponsiblesFromWork description: 'Remove specific users as responsibles from a work' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Responsibles detached successfully' properties: message: type: string example: 'Responsibles detached successfully' tags: - Works requestBody: required: false content: application/json: schema: type: object properties: users: type: array description: 'UUID do usuário. The uuid of an existing record in the users table.' example: - 2c620457-d9f2-3e5e-989c-6233a3fb46de items: type: string parameters: - in: path name: work description: 'Work UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/works/{work}/responsibles/sync': post: summary: 'Sync work responsibles' operationId: syncWorkResponsibles description: 'Replace all responsibles of a work with the provided list' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Responsibles synchronized successfully' properties: message: type: string example: 'Responsibles synchronized successfully' tags: - Works requestBody: required: false content: application/json: schema: type: object properties: users: type: array description: 'UUID do usuário. The uuid of an existing record in the users table.' example: - fc3b5cc4-10a4-38d1-bd3a-718b80f08e40 items: type: string parameters: - in: path name: work description: 'Work UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string