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: 'Central de Tutoriais' description: 'Consulta dos tutoriais liberados para quem está autenticado' - 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: 'Tutoriais (administração)' description: 'Cadastro do catálogo de módulos da Central de Tutoriais' - 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: 5ee9af7f-f27d-3562-ad9d-51d0b27fde97 name: ut-6ab3c7cfe723b display_name: 'Incidunt soluta cum illum numquam non.' permissions_count: null - id: 4c8b12bb-98b3-3439-983d-003d821a4d91 name: totam-6ab3c7cfeb667 display_name: 'Consequatur cupiditate totam totam in minus.' 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: 5ee9af7f-f27d-3562-ad9d-51d0b27fde97 name: ut-6ab3c7cfe723b display_name: 'Incidunt soluta cum illum numquam non.' permissions_count: null - id: 4c8b12bb-98b3-3439-983d-003d821a4d91 name: totam-6ab3c7cfeb667 display_name: 'Consequatur cupiditate totam totam in minus.' permissions_count: null items: type: object properties: id: type: string example: 5ee9af7f-f27d-3562-ad9d-51d0b27fde97 name: type: string example: ut-6ab3c7cfe723b display_name: type: string example: 'Incidunt soluta cum illum numquam non.' 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: - 1787ac69-ab5b-311c-bcd5-d3fbe652d3e6 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: - a5c93c2e-6be4-3ba7-aaf6-82ef7f887aa1 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: f03c2ad0-a21d-3c01-a55f-660f7f955d23 name: molestiae-6ab3c7d007826 display_name: 'Dicta quia suscipit vitae sapiente.' permissions_count: null properties: data: type: object properties: id: type: string example: f03c2ad0-a21d-3c01-a55f-660f7f955d23 name: type: string example: molestiae-6ab3c7d007826 display_name: type: string example: 'Dicta quia suscipit vitae sapiente.' 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: sapiente display_name: 'Qui dolorem et et ex.' - id: null name: dolor display_name: 'Doloribus occaecati sapiente quos dolor.' properties: data: type: array example: - id: null name: sapiente display_name: 'Qui dolorem et et ex.' - id: null name: dolor display_name: 'Doloribus occaecati sapiente quos dolor.' items: type: object properties: id: type: string example: null nullable: true name: type: string example: sapiente display_name: type: string example: 'Qui dolorem et et ex.' 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: soluta display_name: 'Nostrum ducimus nam quidem quas consequuntur quis beatae.' - id: null name: aut display_name: 'Quam eius est consectetur dolor eum consequatur.' 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: soluta display_name: 'Nostrum ducimus nam quidem quas consequuntur quis beatae.' - id: null name: aut display_name: 'Quam eius est consectetur dolor eum consequatur.' items: type: object properties: id: type: string example: null nullable: true name: type: string example: soluta display_name: type: string example: 'Nostrum ducimus nam quidem quas consequuntur quis beatae.' 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: ut display_name: 'Beatae earum voluptatibus recusandae voluptatem voluptatibus fuga blanditiis.' properties: data: type: object properties: id: type: string example: null nullable: true name: type: string example: ut display_name: type: string example: 'Beatae earum voluptatibus recusandae voluptatem voluptatibus fuga blanditiis.' 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: be99abeb-d62a-36fe-b9ee-5a51334472dd code: null type: saída payment_method: cheque amount: 9089.52 due_date: '2026-10-15T03: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: 'Aut architecto odit aliquid iure corporis aut.' 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: unde field2: 85 field3: false notes: 'Aspernatur nostrum non dicta consequatur.' created_at: null updated_at: null - id: b2b0151f-38e5-31e6-a337-0cbfeaa6e089 code: null type: saída payment_method: boleto amount: 3110.53 due_date: '2026-10-12T03: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: 'Eaque pariatur ratione iure ipsa amet id est est et et.' 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: eaque field2: 57 field3: false notes: 'Non sint odio sit.' created_at: null updated_at: null properties: data: type: array example: - id: be99abeb-d62a-36fe-b9ee-5a51334472dd code: null type: saída payment_method: cheque amount: 9089.52 due_date: '2026-10-15T03: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: 'Aut architecto odit aliquid iure corporis aut.' 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: unde field2: 85 field3: false notes: 'Aspernatur nostrum non dicta consequatur.' created_at: null updated_at: null - id: b2b0151f-38e5-31e6-a337-0cbfeaa6e089 code: null type: saída payment_method: boleto amount: 3110.53 due_date: '2026-10-12T03: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: 'Eaque pariatur ratione iure ipsa amet id est est et et.' 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: eaque field2: 57 field3: false notes: 'Non sint odio sit.' created_at: null updated_at: null items: type: object properties: id: type: string example: be99abeb-d62a-36fe-b9ee-5a51334472dd code: type: string example: null nullable: true type: type: string example: saída payment_method: type: string example: cheque amount: type: number example: 9089.52 due_date: type: string example: '2026-10-15T03: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: 'Aut architecto odit aliquid iure corporis aut.' 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: unde field2: type: integer example: 85 field3: type: boolean example: false notes: type: string example: 'Aspernatur nostrum non dicta consequatur.' 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: - quo required: true schema: type: array description: 'The uuid of an existing record in the account_payable_receivables table.' example: - quo 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: - doloremque required: false schema: type: array description: 'The uuid of an existing record in the customers table.' example: - doloremque items: type: string - in: query name: suppliers description: 'The uuid of an existing record in the suppliers table.' example: - consequatur required: false schema: type: array description: 'The uuid of an existing record in the suppliers table.' example: - consequatur items: type: string - in: query name: works description: 'The uuid of an existing record in the works table.' example: - eum required: false schema: type: array description: 'The uuid of an existing record in the works table.' example: - eum items: type: string - in: query name: statuses description: '' example: - 'a protestar' required: false schema: type: array description: '' example: - 'a protestar' 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 - pix - cartao - 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-09-23T09:36:32' required: false schema: type: string description: 'O campo value deve ser uma data válida.' example: '2026-09-23T09:36:32' nullable: true - in: query name: protest_date_end description: 'O campo value deve ser uma data válida.' example: '2026-09-23T09:36:32' required: false schema: type: string description: 'O campo value deve ser uma data válida.' example: '2026-09-23T09:36:32' 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: 65cafbf0-4789-3ae9-bccd-fb078200ab70 code: null type: saída payment_method: cheque amount: 1879.75 due_date: '2026-10-14T03: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: 'Facilis ipsum quis mollitia nihil eos occaecati ex modi expedita magni vel iure.' 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: consequatur field2: 58 field3: false notes: 'Ipsa qui consequatur nemo praesentium.' created_at: null updated_at: null - id: 44333011-6731-3e85-a333-21b2898355f1 code: null type: entrada payment_method: boleto amount: 7326.11 due_date: '2026-10-11T03: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: 'Consequatur porro accusamus qui vel non sed quos perferendis.' 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: quisquam field2: 26 field3: true notes: 'Qui deserunt ut fugiat et ut dolorem quod.' 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: 65cafbf0-4789-3ae9-bccd-fb078200ab70 code: null type: saída payment_method: cheque amount: 1879.75 due_date: '2026-10-14T03: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: 'Facilis ipsum quis mollitia nihil eos occaecati ex modi expedita magni vel iure.' 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: consequatur field2: 58 field3: false notes: 'Ipsa qui consequatur nemo praesentium.' created_at: null updated_at: null - id: 44333011-6731-3e85-a333-21b2898355f1 code: null type: entrada payment_method: boleto amount: 7326.11 due_date: '2026-10-11T03: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: 'Consequatur porro accusamus qui vel non sed quos perferendis.' 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: quisquam field2: 26 field3: true notes: 'Qui deserunt ut fugiat et ut dolorem quod.' created_at: null updated_at: null items: type: object properties: id: type: string example: 65cafbf0-4789-3ae9-bccd-fb078200ab70 code: type: string example: null nullable: true type: type: string example: saída payment_method: type: string example: cheque amount: type: number example: 1879.75 due_date: type: string example: '2026-10-14T03: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: 'Facilis ipsum quis mollitia nihil eos occaecati ex modi expedita magni vel iure.' 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: consequatur field2: type: integer example: 58 field3: type: boolean example: false notes: type: string example: 'Ipsa qui consequatur nemo praesentium.' 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: - dolores required: false schema: type: array description: 'The uuid of an existing record in the customers table.' example: - dolores items: type: string - in: query name: suppliers description: 'The uuid of an existing record in the suppliers table.' example: - repellendus required: false schema: type: array description: 'The uuid of an existing record in the suppliers table.' example: - repellendus items: type: string - in: query name: works description: 'The uuid of an existing record in the works table.' example: - id required: false schema: type: array description: 'The uuid of an existing record in the works table.' example: - id items: type: string - in: query name: statuses description: '' example: - cancelado required: false schema: type: array description: '' example: - cancelado 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 - pix - cartao - 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-09-23T09:36:32' required: false schema: type: string description: 'O campo value deve ser uma data válida.' example: '2026-09-23T09:36:32' nullable: true - in: query name: protest_date_end description: 'O campo value deve ser uma data válida.' example: '2026-09-23T09:36:32' required: false schema: type: string description: 'O campo value deve ser uma data válida.' example: '2026-09-23T09:36:32' 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: b7734f92-199e-3d78-ba29-8b76edf43eb7 code: null type: saída payment_method: cheque amount: 4510.59 due_date: '2026-10-06T03: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: 'Laboriosam dolore quaerat quibusdam saepe in dolorum commodi aliquid.' 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: 99 field3: false notes: 'Eos voluptatibus et eaque exercitationem.' created_at: null updated_at: null - id: 9de65840-14c8-30fe-8e83-f82704483847 code: null type: saída payment_method: boleto amount: 2981.13 due_date: '2026-10-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: 'Labore omnis voluptatibus culpa harum quos qui in quis inventore vero.' 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: ut field2: 99 field3: false notes: 'Quaerat voluptas earum inventore qui pariatur.' 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: b7734f92-199e-3d78-ba29-8b76edf43eb7 code: null type: saída payment_method: cheque amount: 4510.59 due_date: '2026-10-06T03: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: 'Laboriosam dolore quaerat quibusdam saepe in dolorum commodi aliquid.' 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: 99 field3: false notes: 'Eos voluptatibus et eaque exercitationem.' created_at: null updated_at: null - id: 9de65840-14c8-30fe-8e83-f82704483847 code: null type: saída payment_method: boleto amount: 2981.13 due_date: '2026-10-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: 'Labore omnis voluptatibus culpa harum quos qui in quis inventore vero.' 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: ut field2: 99 field3: false notes: 'Quaerat voluptas earum inventore qui pariatur.' created_at: null updated_at: null items: type: object properties: id: type: string example: b7734f92-199e-3d78-ba29-8b76edf43eb7 code: type: string example: null nullable: true type: type: string example: saída payment_method: type: string example: cheque amount: type: number example: 4510.59 due_date: type: string example: '2026-10-06T03: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: 'Laboriosam dolore quaerat quibusdam saepe in dolorum commodi aliquid.' 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: quas field2: type: integer example: 99 field3: type: boolean example: false notes: type: string example: 'Eos voluptatibus et eaque exercitationem.' 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 - pix - cartao - 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: 6a8e007d-90f6-38e1-901b-2ac789f2a500 nullable: true customer_id: type: string description: 'Cliente. The uuid of an existing record in the customers table.' example: 65c01407-d7ac-3836-8290-305cc17cdf57 nullable: true work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: 14913ec5-ebc5-3f28-94bd-39f501d3adee 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: 0c17cb06-16d0-3e20-ac1f-c58c1991f86b 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: voluptatem installment_ids: type: array description: 'The uuid of an existing record in the fiscal_document_installments table.' example: - dolor items: type: string payment_method: type: string description: '' example: cartao enum: - cheque - boleto - pix - cartao - outro nullable: true work_id: type: string description: 'The uuid of an existing record in the works table.' example: architecto 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: minima 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: 389ae9c2-5f98-3de8-912b-1c5868173a5a code: null type: entrada payment_method: cheque amount: 1711.4 due_date: '2026-09-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: 'Dolorem omnis assumenda et necessitatibus distinctio minus accusamus sapiente voluptate est aut.' 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: sint field2: 35 field3: false notes: 'Ad sapiente quibusdam atque ea perspiciatis.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 389ae9c2-5f98-3de8-912b-1c5868173a5a code: type: string example: null nullable: true type: type: string example: entrada payment_method: type: string example: cheque amount: type: number example: 1711.4 due_date: type: string example: '2026-09-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: 'Dolorem omnis assumenda et necessitatibus distinctio minus accusamus sapiente voluptate est aut.' 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: sint field2: type: integer example: 35 field3: type: boolean example: false notes: type: string example: 'Ad sapiente quibusdam atque ea perspiciatis.' 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 - pix - cartao - 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: 026cb615-0704-3554-a6c7-056dfa6d0b54 nullable: true customer_id: type: string description: 'Customer id. The uuid of an existing record in the customers table.' example: 63af8081-4f0a-31e5-b5da-b2f4e5a42a96 nullable: true work_id: type: string description: 'Work id. The uuid of an existing record in the works table.' example: 57acc5eb-d90b-3308-a29c-b5f87927aede 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: 7c84b07e-5ce0-3a49-9d10-fb93e40e2571 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: voluptatem 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: reichert.bo@example.com 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: 3f72bfd9-2425-3bef-ab7d-f55e868d4414 name: 'Emie Littel Sr.' username: kiehn.oswaldo email: celestine28@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: 3f72bfd9-2425-3bef-ab7d-f55e868d4414 name: type: string example: 'Emie Littel Sr.' username: type: string example: kiehn.oswaldo email: type: string example: celestine28@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: roslyn.considine 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: - c2f8da96-9882-3241-93bc-043dd6b594b1 items: type: string roles: type: array description: 'UUID da função. The uuid of an existing record in the roles table.' example: - 0cbbe412-965a-384f-908d-6ac661b013a5 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: qhhsyntnzpqnld 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: architecto 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: reiciendis 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: 5 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: 3 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: 9bd6e781-570c-3e4e-b842-b9fbca50ca02 agency: '7144' account: 4248441-1 type: caixa balance: 9960.6 holder_type: pf alias: aliquam limit: 3798.2 available_balance: 13758.8 used_limit: 0 available_limit: 3798.2 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: 9bd6e781-570c-3e4e-b842-b9fbca50ca02 agency: type: string example: '7144' account: type: string example: 4248441-1 type: type: string example: caixa balance: type: number example: 9960.6 holder_type: type: string example: pf alias: type: string example: aliquam limit: type: number example: 3798.2 available_balance: type: number example: 13758.8 used_limit: type: integer example: 0 available_limit: type: number example: 3798.2 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: 0b2ee3d4-24ed-387d-be4c-4a0823c56605 agency: '1221' account: 6769627-5 type: poupança balance: 3068.86 holder_type: pj alias: omnis limit: 80.8 available_balance: 3149.66 used_limit: 0 available_limit: 80.8 is_default: null default_payment_method: null bank: id: null name: null code: null created_at: null updated_at: null - id: d4295ba6-3828-342c-ab8d-99f12668d7d5 agency: '0605' account: 7124665-9 type: corrente balance: 2957.36 holder_type: pf alias: voluptatem limit: 5215.82 available_balance: 8173.18 used_limit: 0 available_limit: 5215.82 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: 0b2ee3d4-24ed-387d-be4c-4a0823c56605 agency: '1221' account: 6769627-5 type: poupança balance: 3068.86 holder_type: pj alias: omnis limit: 80.8 available_balance: 3149.66 used_limit: 0 available_limit: 80.8 is_default: null default_payment_method: null bank: id: null name: null code: null created_at: null updated_at: null - id: d4295ba6-3828-342c-ab8d-99f12668d7d5 agency: '0605' account: 7124665-9 type: corrente balance: 2957.36 holder_type: pf alias: voluptatem limit: 5215.82 available_balance: 8173.18 used_limit: 0 available_limit: 5215.82 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: 0b2ee3d4-24ed-387d-be4c-4a0823c56605 agency: type: string example: '1221' account: type: string example: 6769627-5 type: type: string example: poupança balance: type: number example: 3068.86 holder_type: type: string example: pj alias: type: string example: omnis limit: type: number example: 80.8 available_balance: type: number example: 3149.66 used_limit: type: integer example: 0 available_limit: type: number example: 80.8 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: 9052349-3 bank_id: type: string description: 'Bank id. The uuid of an existing record in the banks table.' example: 388ae55b-8868-312d-95b7-dad948247925 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: 7485772-9 bank_id: type: string description: 'Bank id. The uuid of an existing record in the banks table.' example: d667c5c7-4e78-303e-802d-a9becafef31e 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: 9ad28b96-4f08-3768-a715-3d8edc0b91c6 agency: '9023' account: 9702209-2 type: corrente balance: 2654.13 holder_type: pj alias: et limit: 936.48 available_balance: 3590.61 used_limit: 0 available_limit: 936.48 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: 9ad28b96-4f08-3768-a715-3d8edc0b91c6 agency: type: string example: '9023' account: type: string example: 9702209-2 type: type: string example: corrente balance: type: number example: 2654.13 holder_type: type: string example: pj alias: type: string example: et limit: type: number example: 936.48 available_balance: type: number example: 3590.61 used_limit: type: integer example: 0 available_limit: type: number example: 936.48 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: 1 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: consequatur nullable: true sort_desc: type: boolean description: '' example: true nullable: true page: type: integer description: 'O campo value deve ser pelo menos 1.' example: 36 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: 13 nullable: true q: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: egitrpynkncy nullable: true type: type: string description: '' example: tarifa 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-09-23T09:36:32' 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: '2112-01-14' 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: 5 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: 3 required: true schema: type: integer - in: path name: bankStatement description: '' example: molestiae 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: 82f99776-e706-35da-89c7-e024e550be39 name: 'Vale e Marin' code: '333' - id: f68767ed-a170-3b02-b734-5c63ce2ba85a name: 'Vale e Bezerra e Filhos' code: '838' 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: 82f99776-e706-35da-89c7-e024e550be39 name: 'Vale e Marin' code: '333' - id: f68767ed-a170-3b02-b734-5c63ce2ba85a name: 'Vale e Bezerra e Filhos' code: '838' items: type: object properties: id: type: string example: 82f99776-e706-35da-89c7-e024e550be39 name: type: string example: 'Vale e Marin' code: type: string example: '333' 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: 9b0e853c-a398-3290-b2e0-6ad1956ef854 name: 'Ramos Comercial Ltda.' code: '34' properties: data: type: object properties: id: type: string example: 9b0e853c-a398-3290-b2e0-6ad1956ef854 name: type: string example: 'Ramos Comercial Ltda.' code: type: string example: '34' 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: 'Nemo et maxime et dolore aut ducimus illum.' required: false schema: type: string description: 'Description .' example: 'Nemo et maxime et dolore aut ducimus illum.' - in: query name: categories description: 'The uuid of an existing record in the transaction_categories table.' example: - ratione required: false schema: type: array description: 'The uuid of an existing record in the transaction_categories table.' example: - ratione 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: - autem required: false schema: type: array description: 'The uuid of an existing record in the bank_accounts table.' example: - autem items: type: string - in: query name: customers description: 'The uuid of an existing record in the customers table.' example: - et required: false schema: type: array description: 'The uuid of an existing record in the customers table.' example: - et 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 - in: query name: works description: 'The uuid of an existing record in the works table.' example: - qui required: false schema: type: array description: 'The uuid of an existing record in the works table.' example: - qui 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: 'Doloremque ipsam quas molestiae aliquam autem repellat inventore non.' required: false schema: type: string description: 'Description .' example: 'Doloremque ipsam quas molestiae aliquam autem repellat inventore non.' - in: query name: categories description: 'The uuid of an existing record in the transaction_categories table.' example: - deserunt required: false schema: type: array description: 'The uuid of an existing record in the transaction_categories table.' example: - deserunt 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: - sit required: false schema: type: array description: 'The uuid of an existing record in the bank_accounts table.' example: - sit items: type: string - 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: - eos required: false schema: type: array description: 'The uuid of an existing record in the suppliers table.' example: - eos items: type: string - in: query name: works description: 'The uuid of an existing record in the works table.' example: - hic required: false schema: type: array description: 'The uuid of an existing record in the works table.' example: - hic items: type: string responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 9f414796-603a-37d1-825b-b8e7b28b8068 code: FC-80034277 type: ajuste amount: 2426.61 description: 'Autem iusto accusantium minima quidem.' transaction_date: '2015-02-24T03:00:00.000000Z' transaction_category: id: null name: null type: null created_at: null updated_at: null - id: 17b12e05-9e2a-33ba-ae0d-d318670e0036 code: FC-76582499 type: transferência amount: -73.9 description: 'Et aut maiores enim dolores dignissimos.' transaction_date: '1999-02-15T02: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: 9f414796-603a-37d1-825b-b8e7b28b8068 code: FC-80034277 type: ajuste amount: 2426.61 description: 'Autem iusto accusantium minima quidem.' transaction_date: '2015-02-24T03:00:00.000000Z' transaction_category: id: null name: null type: null created_at: null updated_at: null - id: 17b12e05-9e2a-33ba-ae0d-d318670e0036 code: FC-76582499 type: transferência amount: -73.9 description: 'Et aut maiores enim dolores dignissimos.' transaction_date: '1999-02-15T02: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: 9f414796-603a-37d1-825b-b8e7b28b8068 code: type: string example: FC-80034277 type: type: string example: ajuste amount: type: number example: 2426.61 description: type: string example: 'Autem iusto accusantium minima quidem.' transaction_date: type: string example: '2015-02-24T03: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: dec922c1-2499-31e1-bcdd-7ad5de82ada1 transaction_category_id: type: string description: 'Transaction category id. The uuid of an existing record in the transaction_categories table.' example: 424a88dc-057f-3edd-ad60-f12ec27869bb bank_account_id: type: string description: 'Bank account id. The uuid of an existing record in the bank_accounts table.' example: e0cede81-2a89-3549-8246-3a5b131b9696 nullable: true customer_id: type: string description: 'Customer id. The uuid of an existing record in the customers table.' example: ecb7f91d-ded6-3c94-a772-920b8aa8a020 nullable: true supplier_id: type: string description: 'Supplier id. The uuid of an existing record in the suppliers table.' example: b0f16a09-e63d-3652-9444-0613efae0ff0 nullable: true work_id: type: string description: 'Work id. The uuid of an existing record in the works table.' example: 1b20dca2-1f3c-37e3-b071-1a7a544077c8 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: 36e36816-322f-36fb-8bc7-8d9fb6c1aa15 code: FC-51321843 type: pagamento amount: -4247.24 description: 'Rem atque et corrupti consectetur.' transaction_date: '1977-06-02T03: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: 36e36816-322f-36fb-8bc7-8d9fb6c1aa15 code: type: string example: FC-51321843 type: type: string example: pagamento amount: type: number example: -4247.24 description: type: string example: 'Rem atque et corrupti consectetur.' transaction_date: type: string example: '1977-06-02T03: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: e5475903-6db1-3cc1-8391-805bcd7099bf transaction_category_id: type: string description: 'Transaction category id. The uuid of an existing record in the transaction_categories table.' example: 9b37c6b2-1e79-30a5-9c34-c85ef96e22d8 bank_account_id: type: string description: 'Bank account id. The uuid of an existing record in the bank_accounts table.' example: 17a3a88b-22f5-30ac-8f84-d4630cbd27ce nullable: true customer_id: type: string description: 'Customer id. The uuid of an existing record in the customers table.' example: 6d4fb8e0-c415-3bdc-bb18-a0edd703606a nullable: true supplier_id: type: string description: 'Supplier id. The uuid of an existing record in the suppliers table.' example: 843241c8-c6a3-3d75-b18e-9e183a9b9ce0 nullable: true work_id: type: string description: 'Work id. The uuid of an existing record in the works table.' example: f967869d-2660-333c-9b6c-b24de839e469 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: 5 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: 0fc32493-3538-313e-b14a-ea9c1fed1dc4 code: null opened_by: null opened_at: '2000-12-26T08:23:07.000000Z' closed_by: null closed_at: '2007-02-25T14:52:58.000000Z' opening_balance: 334.79 closing_balance: 6282.1 total_income: 0 total_expense: 0 total_balance: 0 status: Fechado hasSnapshot: false created_at: '1981-12-07T12:37:20.000000Z' updated_at: '1983-04-29T03:52:07.000000Z' - id: 82618c36-71ce-33f0-adb4-de1083eccd71 code: null opened_by: null opened_at: '1992-04-07T09:40:31.000000Z' closed_by: null closed_at: '2018-12-27T13:10:19.000000Z' opening_balance: 2270.41 closing_balance: 3666.73 total_income: 0 total_expense: 0 total_balance: 0 status: Fechado hasSnapshot: false created_at: '1993-11-03T16:12:20.000000Z' updated_at: '2013-02-08T21:57:09.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: 0fc32493-3538-313e-b14a-ea9c1fed1dc4 code: null opened_by: null opened_at: '2000-12-26T08:23:07.000000Z' closed_by: null closed_at: '2007-02-25T14:52:58.000000Z' opening_balance: 334.79 closing_balance: 6282.1 total_income: 0 total_expense: 0 total_balance: 0 status: Fechado hasSnapshot: false created_at: '1981-12-07T12:37:20.000000Z' updated_at: '1983-04-29T03:52:07.000000Z' - id: 82618c36-71ce-33f0-adb4-de1083eccd71 code: null opened_by: null opened_at: '1992-04-07T09:40:31.000000Z' closed_by: null closed_at: '2018-12-27T13:10:19.000000Z' opening_balance: 2270.41 closing_balance: 3666.73 total_income: 0 total_expense: 0 total_balance: 0 status: Fechado hasSnapshot: false created_at: '1993-11-03T16:12:20.000000Z' updated_at: '2013-02-08T21:57:09.000000Z' items: type: object properties: id: type: string example: 0fc32493-3538-313e-b14a-ea9c1fed1dc4 code: type: string example: null nullable: true opened_by: type: string example: null nullable: true opened_at: type: string example: '2000-12-26T08:23:07.000000Z' closed_by: type: string example: null nullable: true closed_at: type: string example: '2007-02-25T14:52:58.000000Z' opening_balance: type: number example: 334.79 closing_balance: type: number example: 6282.1 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: '1981-12-07T12:37:20.000000Z' updated_at: type: string example: '1983-04-29T03:52:07.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: 54bd5f00-268a-3858-9ab0-4820ea49c4ef code: null opened_by: null opened_at: '1973-07-22T07:21:53.000000Z' closed_by: null closed_at: '2005-05-15T06:31:50.000000Z' opening_balance: 9359.97 closing_balance: 3387.33 total_income: 0 total_expense: 0 total_balance: 0 status: Fechado hasSnapshot: false created_at: '1998-06-03T02:29:59.000000Z' updated_at: '1984-09-22T14:48:12.000000Z' properties: data: type: object properties: id: type: string example: 54bd5f00-268a-3858-9ab0-4820ea49c4ef code: type: string example: null nullable: true opened_by: type: string example: null nullable: true opened_at: type: string example: '1973-07-22T07:21:53.000000Z' closed_by: type: string example: null nullable: true closed_at: type: string example: '2005-05-15T06:31:50.000000Z' opening_balance: type: number example: 9359.97 closing_balance: type: number example: 3387.33 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: '1998-06-03T02:29:59.000000Z' updated_at: type: string example: '1984-09-22T14:48:12.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: 573458c5-59fb-3144-a65e-f4dc19752218 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: 3da9ea96-5527-310a-a8f3-ce553a3a1706 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: 48342f7d-20ce-3026-ad2c-b094111b062f code: null opened_by: null opened_at: '2025-07-18T20:47:33.000000Z' closed_by: null closed_at: '1970-05-28T18:03:36.000000Z' opening_balance: 6484.68 closing_balance: 6631.82 total_income: 0 total_expense: 0 total_balance: 0 status: Fechado hasSnapshot: false created_at: '1984-03-12T19:46:36.000000Z' updated_at: '1979-12-27T16:41:17.000000Z' properties: data: type: object properties: id: type: string example: 48342f7d-20ce-3026-ad2c-b094111b062f code: type: string example: null nullable: true opened_by: type: string example: null nullable: true opened_at: type: string example: '2025-07-18T20:47:33.000000Z' closed_by: type: string example: null nullable: true closed_at: type: string example: '1970-05-28T18:03:36.000000Z' opening_balance: type: number example: 6484.68 closing_balance: type: number example: 6631.82 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: '1984-03-12T19:46:36.000000Z' updated_at: type: string example: '1979-12-27T16:41:17.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: b485da10-5e1f-37f2-afbb-00e8ce10c676 required: true schema: type: integer /api/tutorials/sectors: get: summary: 'Setores da central' operationId: setoresDaCentral description: 'Setores da pessoa que tenham ao menos um tutorial visível, com a contagem' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: - id: a064d3d2-5257-3574-a9e3-d9dd6af8f2d7 name: 'minima quibusdam' slug: null abbreviation: null tutorials_count: 0 - id: f3e0855d-4b7c-3c3f-93bf-cc860c13609c name: 'ipsum ducimus' slug: null abbreviation: null tutorials_count: 0 properties: data: type: array example: - id: a064d3d2-5257-3574-a9e3-d9dd6af8f2d7 name: 'minima quibusdam' slug: null abbreviation: null tutorials_count: 0 - id: f3e0855d-4b7c-3c3f-93bf-cc860c13609c name: 'ipsum ducimus' slug: null abbreviation: null tutorials_count: 0 items: type: object properties: id: type: string example: a064d3d2-5257-3574-a9e3-d9dd6af8f2d7 name: type: string example: 'minima quibusdam' slug: type: string example: null nullable: true abbreviation: type: string example: null nullable: true tutorials_count: type: integer example: 0 tags: - 'Central de Tutoriais' /api/tutorials/modules: get: summary: 'Módulos da central' operationId: mdulosDaCentral description: 'Módulos ativos com tutoriais visíveis para a pessoa; aceita filtro de setor' parameters: - in: query name: sector_id description: 'Filtra os módulos pelos tutoriais de um setor, ou "__geral__" para o material sem setor marcado. O campo value deve ser um UUID válido. The uuid of an existing record in the sectors table.' example: 0d0b2983-5dc9-37a7-b729-a5acceb0eca5 required: false schema: type: string description: 'Filtra os módulos pelos tutoriais de um setor, ou "__geral__" para o material sem setor marcado. O campo value deve ser um UUID válido. The uuid of an existing record in the sectors table.' example: 0d0b2983-5dc9-37a7-b729-a5acceb0eca5 nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 59d3a3a2-5c90-3985-8c49-4a12d197169e name: 'Aut nemo' slug: aut-nemo-155730 description: 'Aperiam magnam odit debitis omnis unde.' sort_order: 0 is_active: true created_at: null updated_at: null - id: 8b488254-add4-3e4d-bbfd-b4a15b4a8a3c name: 'Reprehenderit fuga' slug: reprehenderit-fuga-917718 description: 'Officiis rerum maiores modi neque sed.' sort_order: 0 is_active: true created_at: null updated_at: null properties: data: type: array example: - id: 59d3a3a2-5c90-3985-8c49-4a12d197169e name: 'Aut nemo' slug: aut-nemo-155730 description: 'Aperiam magnam odit debitis omnis unde.' sort_order: 0 is_active: true created_at: null updated_at: null - id: 8b488254-add4-3e4d-bbfd-b4a15b4a8a3c name: 'Reprehenderit fuga' slug: reprehenderit-fuga-917718 description: 'Officiis rerum maiores modi neque sed.' sort_order: 0 is_active: true created_at: null updated_at: null items: type: object properties: id: type: string example: 59d3a3a2-5c90-3985-8c49-4a12d197169e name: type: string example: 'Aut nemo' slug: type: string example: aut-nemo-155730 description: type: string example: 'Aperiam magnam odit debitis omnis unde.' sort_order: type: integer example: 0 is_active: type: boolean example: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Central de Tutoriais' /api/tutorials: get: summary: 'Listar tutoriais' operationId: listarTutoriais description: 'Lista paginada dos tutoriais visíveis, com filtros de módulo, setor e busca por texto' 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: 'Busca por título ou descrição.' example: 'ordem de serviço' required: false schema: type: string description: 'Busca por título ou descrição.' example: 'ordem de serviço' nullable: true - in: query name: module_id description: 'Filtra pelo UUID do módulo. O campo value deve ser um UUID válido. The uuid of an existing record in the tutorial_modules table.' example: 91f8fdf6-5c9d-3392-ac67-6a3dce0320ab required: false schema: type: string description: 'Filtra pelo UUID do módulo. O campo value deve ser um UUID válido. The uuid of an existing record in the tutorial_modules table.' example: 91f8fdf6-5c9d-3392-ac67-6a3dce0320ab nullable: true - in: query name: sector_id description: 'Filtra pelo UUID do setor, ou "__geral__" para o material sem setor marcado. O campo value deve ser um UUID válido. The uuid of an existing record in the sectors table.' example: beff7622-39ad-335c-8873-595490adbbcf required: false schema: type: string description: 'Filtra pelo UUID do setor, ou "__geral__" para o material sem setor marcado. O campo value deve ser um UUID válido. The uuid of an existing record in the sectors table.' example: beff7622-39ad-335c-8873-595490adbbcf nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: e4eeaa71-a5fb-35e3-8188-36e28ab36556 title: 'Ipsam in aut facere' description: 'Ad non voluptatum nulla accusantium.' status: draft published_at: null sort_order: 0 module: id: a2d092d2-8627-446b-886d-b5b3fa18eb85 name: 'Omnis odio' slug: omnis-odio-554674 created_at: null updated_at: null - id: 7a5cf592-698e-3bcd-9542-44f8118bcb2b title: 'Nemo blanditiis qui suscipit' description: 'Magnam nesciunt qui voluptatem adipisci.' status: draft published_at: null sort_order: 0 module: id: a2d092d2-8833-4e00-8fc0-d9e4abb5249d name: 'Sint est' slug: sint-est-257464 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: e4eeaa71-a5fb-35e3-8188-36e28ab36556 title: 'Ipsam in aut facere' description: 'Ad non voluptatum nulla accusantium.' status: draft published_at: null sort_order: 0 module: id: a2d092d2-8627-446b-886d-b5b3fa18eb85 name: 'Omnis odio' slug: omnis-odio-554674 created_at: null updated_at: null - id: 7a5cf592-698e-3bcd-9542-44f8118bcb2b title: 'Nemo blanditiis qui suscipit' description: 'Magnam nesciunt qui voluptatem adipisci.' status: draft published_at: null sort_order: 0 module: id: a2d092d2-8833-4e00-8fc0-d9e4abb5249d name: 'Sint est' slug: sint-est-257464 created_at: null updated_at: null items: type: object properties: id: type: string example: e4eeaa71-a5fb-35e3-8188-36e28ab36556 title: type: string example: 'Ipsam in aut facere' description: type: string example: 'Ad non voluptatum nulla accusantium.' status: type: string example: draft published_at: type: string example: null nullable: true sort_order: type: integer example: 0 module: type: object properties: id: type: string example: a2d092d2-8627-446b-886d-b5b3fa18eb85 name: type: string example: 'Omnis odio' slug: type: string example: omnis-odio-554674 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: - 'Central de Tutoriais' '/api/tutorials/{id}': get: summary: 'Detalhe do tutorial' operationId: detalheDoTutorial description: 'Tutorial com os itens em ordem. Fora da visibilidade, responde 404.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 86b5c9e6-6009-3943-ac88-582d73e2acc5 title: 'Qui quod enim adipisci' description: 'Consequatur autem possimus assumenda.' status: draft published_at: null sort_order: 0 module: id: a2d092d2-8cc4-4a5e-b4d3-669f571f99f1 name: 'Inventore maxime' slug: inventore-maxime-377406 created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 86b5c9e6-6009-3943-ac88-582d73e2acc5 title: type: string example: 'Qui quod enim adipisci' description: type: string example: 'Consequatur autem possimus assumenda.' status: type: string example: draft published_at: type: string example: null nullable: true sort_order: type: integer example: 0 module: type: object properties: id: type: string example: a2d092d2-8cc4-4a5e-b4d3-669f571f99f1 name: type: string example: 'Inventore maxime' slug: type: string example: inventore-maxime-377406 created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Central de Tutoriais' parameters: - in: path name: id description: 'The ID of the tutorial.' example: 1 required: true schema: type: integer - in: path name: tutorial description: 'UUID do tutorial' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/tutorial-items/{tutorialItem}/url': get: summary: 'URL do item' operationId: uRLDoItem description: 'Devolve a URL assinada de curta validade para o arquivo no S3, ou o link externo do item. O caminho bruto do S3 nunca é exposto.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: type: string title: string url: string expires_in: integer mime_type: string size_bytes: integer properties: type: type: string example: string title: type: string example: string url: type: string example: string expires_in: type: string example: integer mime_type: type: string example: string size_bytes: type: string example: integer tags: - 'Central de Tutoriais' parameters: - in: path name: tutorialItem description: 'UUID do item' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string /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: eb2c5e71-0b9a-303a-93a2-6661b5ed0440 number: 885/2026 started_at: '2026-09-23' deadline_at: '2027-09-23' work: id: a2d092c5-9c10-4aa0-83e2-db5b9a7fb025 name: 'Dr. Théo Jean Carmona' created_at: null updated_at: null - id: e83900df-e3a1-3a0a-95fc-253ff6d07820 number: 128/2026 started_at: '2026-09-23' deadline_at: '2027-09-23' work: id: a2d092c5-a546-4b5d-9149-17f9b18d60ce name: 'Sr. Guilherme Rico Correia' 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: eb2c5e71-0b9a-303a-93a2-6661b5ed0440 number: 885/2026 started_at: '2026-09-23' deadline_at: '2027-09-23' work: id: a2d092c5-9c10-4aa0-83e2-db5b9a7fb025 name: 'Dr. Théo Jean Carmona' created_at: null updated_at: null - id: e83900df-e3a1-3a0a-95fc-253ff6d07820 number: 128/2026 started_at: '2026-09-23' deadline_at: '2027-09-23' work: id: a2d092c5-a546-4b5d-9149-17f9b18d60ce name: 'Sr. Guilherme Rico Correia' created_at: null updated_at: null items: type: object properties: id: type: string example: eb2c5e71-0b9a-303a-93a2-6661b5ed0440 number: type: string example: 885/2026 started_at: type: string example: '2026-09-23' deadline_at: type: string example: '2027-09-23' work: type: object properties: id: type: string example: a2d092c5-9c10-4aa0-83e2-db5b9a7fb025 name: type: string example: 'Dr. Théo Jean Carmona' 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: 0b53e2f8-7c31-30e8-8632-3f53c265f6fb 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: cce4e3aa-49f2-3e5f-99b9-60107ab00a7c 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: 372e3597-11de-3e92-968f-bc9b446dfbdf number: 875/2026 started_at: '2026-09-23' deadline_at: '2027-09-23' work: id: a2d092c5-b071-4835-962a-dc2911816e6a name: 'Srta. Natália Quintana Pontes' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 372e3597-11de-3e92-968f-bc9b446dfbdf number: type: string example: 875/2026 started_at: type: string example: '2026-09-23' deadline_at: type: string example: '2027-09-23' work: type: object properties: id: type: string example: a2d092c5-b071-4835-962a-dc2911816e6a name: type: string example: 'Srta. Natália Quintana Pontes' 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: 5 required: true schema: type: integer - in: path name: contract description: 'Contract UUID' example: praesentium 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: veritatis 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: 5093f8bf-2b95-3074-b6d2-d05ae2cd3123 name: 'Fátima Vasques' email: carlos.delatorre@example.net phone: '(74) 96087-4182' document: 703.528.706-05 type: pf responsible: 'Samanta Cordeiro Estrada Jr.' 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: b1df8a6f-fbc7-3a7f-8bc6-1aeec4635750 name: 'Juliane Saraiva Neto' email: nramires@example.com phone: '(81) 3213-6783' document: 462.254.838-02 type: pj responsible: 'Eduardo Alves Reis Filho' 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: 5093f8bf-2b95-3074-b6d2-d05ae2cd3123 name: 'Fátima Vasques' email: carlos.delatorre@example.net phone: '(74) 96087-4182' document: 703.528.706-05 type: pf responsible: 'Samanta Cordeiro Estrada Jr.' 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: b1df8a6f-fbc7-3a7f-8bc6-1aeec4635750 name: 'Juliane Saraiva Neto' email: nramires@example.com phone: '(81) 3213-6783' document: 462.254.838-02 type: pj responsible: 'Eduardo Alves Reis Filho' 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: 5093f8bf-2b95-3074-b6d2-d05ae2cd3123 name: type: string example: 'Fátima Vasques' email: type: string example: carlos.delatorre@example.net phone: type: string example: '(74) 96087-4182' document: type: string example: 703.528.706-05 type: type: string example: pf responsible: type: string example: 'Samanta Cordeiro Estrada Jr.' 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: de706600-0b2f-3839-8c60-439dd1d59767 name: 'Srta. Carolina Antonella Dominato Jr.' email: odelgado@example.net phone: '(94) 3681-7032' document: 931.246.194-04 type: pf responsible: 'Priscila Quintana Bezerra 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 properties: data: type: object properties: id: type: string example: de706600-0b2f-3839-8c60-439dd1d59767 name: type: string example: 'Srta. Carolina Antonella Dominato Jr.' email: type: string example: odelgado@example.net phone: type: string example: '(94) 3681-7032' document: type: string example: 931.246.194-04 type: type: string example: pf responsible: type: string example: 'Priscila Quintana Bezerra 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 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: 15 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: 45304d8f-ed90-3f95-a7c0-bd4b9ad08a10 code: RDO-23-09-26 report_number: 1 date: '2026-09-23' status: id: a2d092c5-f420-4661-9426-c607fba8910b slug: null name: null abbreviation: hic color: '#8acfe8' text_color: '#f21501' work: id: a2d092c5-e904-4567-84da-11129ece55b5 name: 'Ester Clarice Assunção' started_at: '2020-02-21 01:54:41' filled_by: id: a2d092c5-f052-45e9-94a2-f6e8f43f7f30 name: 'Ashley Koss' contract_number: 323/2026 deadline_at: '2027-09-23' technical_responsible: name: null certification: null crea: null activities: [] occurrences: null next_day_forecast: null finalized_at: null has_signed_document: false content_hash: null gov_br_validation_url: null created_at: null updated_at: null - id: 63bae095-f96f-3e4e-a3d0-175e8e1490fc code: RDO-23-09-26 report_number: 1 date: '2026-09-23' status: id: a2d092c5-fd93-4207-897f-86dd1a74a73f slug: null name: null abbreviation: nisi color: '#bbfa86' text_color: '#af8f6a' work: id: a2d092c5-f80f-4c3e-8538-27e2205ee1aa name: 'Emília Pedrosa Galhardo' started_at: '2009-06-26 20:31:02' filled_by: id: a2d092c5-fc10-4e90-b314-fd45a430c353 name: 'Ms. Nyah Dicki DDS' contract_number: 172/2026 deadline_at: '2027-09-23' technical_responsible: name: null certification: null crea: null activities: [] occurrences: null next_day_forecast: null finalized_at: null has_signed_document: false 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: 45304d8f-ed90-3f95-a7c0-bd4b9ad08a10 code: RDO-23-09-26 report_number: 1 date: '2026-09-23' status: id: a2d092c5-f420-4661-9426-c607fba8910b slug: null name: null abbreviation: hic color: '#8acfe8' text_color: '#f21501' work: id: a2d092c5-e904-4567-84da-11129ece55b5 name: 'Ester Clarice Assunção' started_at: '2020-02-21 01:54:41' filled_by: id: a2d092c5-f052-45e9-94a2-f6e8f43f7f30 name: 'Ashley Koss' contract_number: 323/2026 deadline_at: '2027-09-23' technical_responsible: name: null certification: null crea: null activities: [] occurrences: null next_day_forecast: null finalized_at: null has_signed_document: false content_hash: null gov_br_validation_url: null created_at: null updated_at: null - id: 63bae095-f96f-3e4e-a3d0-175e8e1490fc code: RDO-23-09-26 report_number: 1 date: '2026-09-23' status: id: a2d092c5-fd93-4207-897f-86dd1a74a73f slug: null name: null abbreviation: nisi color: '#bbfa86' text_color: '#af8f6a' work: id: a2d092c5-f80f-4c3e-8538-27e2205ee1aa name: 'Emília Pedrosa Galhardo' started_at: '2009-06-26 20:31:02' filled_by: id: a2d092c5-fc10-4e90-b314-fd45a430c353 name: 'Ms. Nyah Dicki DDS' contract_number: 172/2026 deadline_at: '2027-09-23' technical_responsible: name: null certification: null crea: null activities: [] occurrences: null next_day_forecast: null finalized_at: null has_signed_document: false content_hash: null gov_br_validation_url: null created_at: null updated_at: null items: type: object properties: id: type: string example: 45304d8f-ed90-3f95-a7c0-bd4b9ad08a10 code: type: string example: RDO-23-09-26 report_number: type: integer example: 1 date: type: string example: '2026-09-23' status: type: object properties: id: type: string example: a2d092c5-f420-4661-9426-c607fba8910b slug: type: string example: null nullable: true name: type: string example: null nullable: true abbreviation: type: string example: hic color: type: string example: '#8acfe8' text_color: type: string example: '#f21501' work: type: object properties: id: type: string example: a2d092c5-e904-4567-84da-11129ece55b5 name: type: string example: 'Ester Clarice Assunção' started_at: type: string example: '2020-02-21 01:54:41' filled_by: type: object properties: id: type: string example: a2d092c5-f052-45e9-94a2-f6e8f43f7f30 name: type: string example: 'Ashley Koss' contract_number: type: string example: 323/2026 deadline_at: type: string example: '2027-09-23' 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 has_signed_document: type: boolean example: false 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 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: f7265748-a611-3638-a5f1-4afd0262a8cc nullable: true contract_id: type: string description: 'Contrato. The uuid of an existing record in the contracts table.' example: 3d9395d3-de43-3a82-91aa-1bc021528029 nullable: true status_id: type: string description: 'Status. The uuid of an existing record in the statuses table.' example: 9416f9d0-89b6-3889-999f-dbdfc420b9ee nullable: true filled_by: type: string description: 'Preenchido por. The uuid of an existing record in the users table.' example: 0b0887d6-0255-34a7-b341-885aae6e4b20 nullable: true responsible_id: type: string description: 'Responsável. The uuid of an existing record in the users table.' example: 0d8e2c6a-1fb2-36ed-9a99-e40896a6eeb1 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: f5b40f93-6f10-3a88-87e4-e69f0d670668 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: 7518600d-e0b7-3827-8a2f-4ae305e2efda code: RDO-23-09-26 report_number: 1 date: '2026-09-23' status: id: a2d092c6-0f47-4077-9b5e-a6e1aed2a657 slug: null name: null abbreviation: esse color: '#ccd227' text_color: '#94d1d4' work: id: a2d092c6-09db-45af-ac8e-26da6cf9bf2b name: 'Paulo Grego Quintana' started_at: '1982-03-04 23:48:20' filled_by: id: a2d092c6-0dbe-4313-8846-c76ccfbae549 name: 'Dayna Greenholt Jr.' contract_number: 064/2026 deadline_at: '2027-09-23' technical_responsible: name: null certification: null crea: null activities: [] occurrences: null next_day_forecast: null finalized_at: null has_signed_document: false content_hash: null gov_br_validation_url: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 7518600d-e0b7-3827-8a2f-4ae305e2efda code: type: string example: RDO-23-09-26 report_number: type: integer example: 1 date: type: string example: '2026-09-23' status: type: object properties: id: type: string example: a2d092c6-0f47-4077-9b5e-a6e1aed2a657 slug: type: string example: null nullable: true name: type: string example: null nullable: true abbreviation: type: string example: esse color: type: string example: '#ccd227' text_color: type: string example: '#94d1d4' work: type: object properties: id: type: string example: a2d092c6-09db-45af-ac8e-26da6cf9bf2b name: type: string example: 'Paulo Grego Quintana' started_at: type: string example: '1982-03-04 23:48:20' filled_by: type: object properties: id: type: string example: a2d092c6-0dbe-4313-8846-c76ccfbae549 name: type: string example: 'Dayna Greenholt Jr.' contract_number: type: string example: 064/2026 deadline_at: type: string example: '2027-09-23' 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 has_signed_document: type: boolean example: false 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: 7e7fe59e-5fcc-4804-9e4d-9fbfac5d17c3 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: sit 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: nemo 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' nullable: true required: - path parameters: - in: path name: dailyLog description: 'Daily Log UUID' example: pariatur required: true schema: type: string '/api/daily-logs/{dailyLog}/reopen': post: summary: 'Reopen daily log' operationId: reopenDailyLog description: 'Send a finalized RDO back to draft (Finalizado → Rascunho). Refused when a gov.br-signed document is attached' 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: ullam 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: consequatur 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: exercitationem required: true schema: type: string - in: path name: id description: 'The ID of the photo.' example: aut required: true schema: type: string - in: path name: photo description: 'Photo (File) UUID' example: veniam 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: enim required: true schema: type: string - in: path name: photo description: 'Photo (File) UUID' example: alias 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: 039066e3-2f2a-3c6d-b6f2-5e9c7beb98f4 name: In code: LKG description: 'Necessitatibus velit vel quia sed quasi in.' active: true - id: 24cc5480-2899-3346-89ad-a83e9b89515e name: Dolor code: TRE description: 'Perferendis cum omnis sit sit.' 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: 039066e3-2f2a-3c6d-b6f2-5e9c7beb98f4 name: In code: LKG description: 'Necessitatibus velit vel quia sed quasi in.' active: true - id: 24cc5480-2899-3346-89ad-a83e9b89515e name: Dolor code: TRE description: 'Perferendis cum omnis sit sit.' active: true items: type: object properties: id: type: string example: 039066e3-2f2a-3c6d-b6f2-5e9c7beb98f4 name: type: string example: In code: type: string example: LKG description: type: string example: 'Necessitatibus velit vel quia sed quasi in.' 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: 44a18547-13f6-3920-861c-e80aa3ecc4af name: Pariatur code: ZDH description: 'Ullam sit repellat ut consequatur error aut doloremque ut.' active: true properties: data: type: object properties: id: type: string example: 44a18547-13f6-3920-861c-e80aa3ecc4af name: type: string example: Pariatur code: type: string example: ZDH description: type: string example: 'Ullam sit repellat ut consequatur error aut doloremque ut.' 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: voluptas 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: repellat 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: 6c19832e-59de-3509-b0a4-6828f3e3423b name: 'Pérola da Silva Fidalgo' description: 'Aut ratione adipisci est ipsum id dignissimos. Laborum ex sequi quam rem velit quis. Impedit magnam earum laboriosam corporis.' module: document - id: 7f25a5b8-f0b1-333d-99fe-b63d95099137 name: 'Noel Walter Vega Neto' description: 'Nam qui commodi reprehenderit corporis voluptatum. Ratione facere eum ea et tenetur sit. Modi inventore eos porro excepturi et. Quasi id occaecati cupiditate molestiae provident quas.' 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: 6c19832e-59de-3509-b0a4-6828f3e3423b name: 'Pérola da Silva Fidalgo' description: 'Aut ratione adipisci est ipsum id dignissimos. Laborum ex sequi quam rem velit quis. Impedit magnam earum laboriosam corporis.' module: document - id: 7f25a5b8-f0b1-333d-99fe-b63d95099137 name: 'Noel Walter Vega Neto' description: 'Nam qui commodi reprehenderit corporis voluptatum. Ratione facere eum ea et tenetur sit. Modi inventore eos porro excepturi et. Quasi id occaecati cupiditate molestiae provident quas.' module: document items: type: object properties: id: type: string example: 6c19832e-59de-3509-b0a4-6828f3e3423b name: type: string example: 'Pérola da Silva Fidalgo' description: type: string example: 'Aut ratione adipisci est ipsum id dignissimos. Laborum ex sequi quam rem velit quis. Impedit magnam earum laboriosam corporis.' 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: bb468a36-8d74-3a2d-a438-524a203b5f08 name: 'Dr. Felipe Marinho Galindo Filho' description: 'Quis tenetur consequatur id nesciunt. Provident sunt aut dolore beatae. Ea delectus ipsa sit fugit.' module: document properties: data: type: object properties: id: type: string example: bb468a36-8d74-3a2d-a438-524a203b5f08 name: type: string example: 'Dr. Felipe Marinho Galindo Filho' description: type: string example: 'Quis tenetur consequatur id nesciunt. Provident sunt aut dolore beatae. Ea delectus ipsa sit fugit.' 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: aut 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: - necessitatibus required: false schema: type: array description: 'The uuid of an existing record in the document_categories table.' example: - necessitatibus 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: deleniti required: false schema: type: string description: 'Type of the related documentable entity. The type of an existing record in the documentables table.' example: deleniti nullable: true - in: query name: customers description: 'The uuid of an existing record in the customers table.' example: - in required: false schema: type: array description: 'The uuid of an existing record in the customers table.' example: - in items: type: string - in: query name: suppliers description: 'The uuid of an existing record in the suppliers table.' example: - alias required: false schema: type: array description: 'The uuid of an existing record in the suppliers table.' example: - alias items: type: string responses: 200: description: '' content: application/json: schema: type: object example: data: - id: f56149ac-f28d-3fd0-a47f-b69cbd8e047e name: 'Sr. Ivan Jerônimo Serrano' file: id: null url: null extension: null created_at: null updated_at: null - id: 6f3f8241-d31d-3786-9409-84cb54a2b5a3 name: 'Srta. Flor Soares Jr.' 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: f56149ac-f28d-3fd0-a47f-b69cbd8e047e name: 'Sr. Ivan Jerônimo Serrano' file: id: null url: null extension: null created_at: null updated_at: null - id: 6f3f8241-d31d-3786-9409-84cb54a2b5a3 name: 'Srta. Flor Soares Jr.' file: id: null url: null extension: null created_at: null updated_at: null items: type: object properties: id: type: string example: f56149ac-f28d-3fd0-a47f-b69cbd8e047e name: type: string example: 'Sr. Ivan Jerônimo Serrano' 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: 8e7b2a85-a568-3a3e-9a92-942e6c7ca3ea 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: 23769cee-0431-3499-8ac4-669860e51922 name: 'Rosana Fidalgo Neto' file: id: null url: null extension: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 23769cee-0431-3499-8ac4-669860e51922 name: type: string example: 'Rosana Fidalgo Neto' 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: 33681457-df1f-3ae2-8909-69aea77049e0 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: 17 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: labore nullable: true renewal_status: type: string description: '' example: completed 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: sint nullable: true epi_type_id: type: string description: 'The uuid of an existing record in the epi_types table.' example: in 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 confirm_insufficient_stock: type: boolean description: '' example: false parameters: - in: path name: id description: 'EPI delivery UUID' example: quis 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: ut 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: 977c8652-cc52-3ef7-b39e-86a50f42a83a name: 'aliquid rerum' default_validity_days: 259 requires_signature: false numero_ca: '31481' product: null available_quantity: null created_at: null updated_at: null - id: 17df819a-64cb-34d7-ab03-5302a9144b3e name: 'exercitationem exercitationem' default_validity_days: 222 requires_signature: true numero_ca: '35182' product: null available_quantity: 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: 977c8652-cc52-3ef7-b39e-86a50f42a83a name: 'aliquid rerum' default_validity_days: 259 requires_signature: false numero_ca: '31481' product: null available_quantity: null created_at: null updated_at: null - id: 17df819a-64cb-34d7-ab03-5302a9144b3e name: 'exercitationem exercitationem' default_validity_days: 222 requires_signature: true numero_ca: '35182' product: null available_quantity: null created_at: null updated_at: null items: type: object properties: id: type: string example: 977c8652-cc52-3ef7-b39e-86a50f42a83a name: type: string example: 'aliquid rerum' default_validity_days: type: integer example: 259 requires_signature: type: boolean example: false numero_ca: type: string example: '31481' product: type: string example: null nullable: true available_quantity: 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: - 'EPI Types' requestBody: required: false content: application/json: schema: type: object properties: q: type: string description: '' example: maiores nullable: true stock_id: type: string description: 'The uuid of an existing record in the stocks table.' example: quo 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 numero_ca: type: string description: 'Número do CA. O campo value não pode ser superior a 20 caracteres.' example: 'Example Numero ca' nullable: true action: type: string description: Ação. example: 'Example Action' enum: - link_existing - create_new product_id: type: string description: 'Produto. This field is required when action is link_existing. The uuid of an existing record in the products table.' example: 608924d3-a9c4-38f1-8a4e-6fce04f2b84e product_family_id: type: string description: 'Família do produto. This field is required when action is create_new. The uuid of an existing record in the product_families table.' example: 511426cc-9223-3705-8a48-2bcba775ddba required: - name - default_validity_days - action /api/epi-types/candidates: get: summary: 'List catalog products that could become EPI' operationId: listCatalogProductsThatCouldBecomeEPI description: 'Products sitting in a family flagged as EPI that do not have EPI attributes yet. Being here does not make a product an EPI: it becomes one when someone gives it a validity, through the create endpoint with action link_existing.' parameters: [] responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - 'EPI Types' requestBody: required: false content: application/json: schema: type: object properties: q: type: string description: '' example: eum nullable: true stock_id: type: string description: 'The uuid of an existing record in the stocks table.' example: dolor nullable: true '/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: d59a9784-90ba-3d60-bc26-c221e95d5e1b name: 'inventore atque' default_validity_days: 260 requires_signature: false numero_ca: '12055' product: null available_quantity: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: d59a9784-90ba-3d60-bc26-c221e95d5e1b name: type: string example: 'inventore atque' default_validity_days: type: integer example: 260 requires_signature: type: boolean example: false numero_ca: type: string example: '12055' product: type: string example: null nullable: true available_quantity: type: string example: null nullable: true 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 numero_ca: type: string description: 'Número do CA. O campo value não pode ser superior a 20 caracteres.' example: 'Example Numero ca' nullable: 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: libero required: true schema: type: string /api/epi-types/link-products: post: summary: 'Link EPI types to catalog products in bulk' operationId: linkEPITypesToCatalogProductsInBulk description: 'Link several EPI types to catalog products at once, creating the product where it does not exist yet. All or nothing: one refusal rolls back the whole batch.' parameters: [] responses: { } tags: - 'EPI Types' 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: epi_type_id: type: string description: 'Tipo de EPI. The uuid of an existing record in the epi_types table.' example: 1a4e7c5d-5185-3751-b078-4ad440d0b7e3 action: type: string description: Ação. example: 'Example Items * action' enum: - link_existing - create_new product_id: type: string description: 'Produto. This field is required when items.*.action is link_existing. The uuid of an existing record in the products table.' example: 848f3e1a-152c-3a73-a3a0-e074dca8e877 product_family_id: type: string description: 'Família do produto. This field is required when items.*.action is create_new. The uuid of an existing record in the product_families table.' example: 7cb9f7e9-e496-385a-a167-dfdc4e0d9477 required: - epi_type_id - action required: - items '/api/epi-types/{epiType}/product': put: summary: 'Link an EPI type to a catalog product' operationId: linkAnEPITypeToACatalogProduct description: 'Link one EPI type to an existing product, or create the product from the EPI type name.' parameters: [] responses: { } tags: - 'EPI Types' requestBody: required: true content: application/json: schema: type: object properties: action: type: string description: Ação. example: 'Example Action' enum: - link_existing - create_new product_id: type: string description: 'Produto. This field is required when action is link_existing. The uuid of an existing record in the products table.' example: 47492f32-b8fd-34de-8074-4c2f1ea6dd40 product_family_id: type: string description: 'Família do produto. This field is required when action is create_new. The uuid of an existing record in the product_families table.' example: a3b997da-d15d-3c6c-a286-345b53aeef79 required: - action parameters: - in: path name: epiType description: 'EPI type UUID' example: omnis 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: 27886550-7113-44e6-a323-d6292580ebe6 name: fuga description: 'Aspernatur temporibus doloribus tenetur sapiente sed dolores sed.' created_at: null updated_at: null - id: aa536ead-47b3-4b70-88fa-fbb512c85449 name: est description: 'Rerum distinctio ut distinctio quia ut odio quis.' 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: 27886550-7113-44e6-a323-d6292580ebe6 name: fuga description: 'Aspernatur temporibus doloribus tenetur sapiente sed dolores sed.' created_at: null updated_at: null - id: aa536ead-47b3-4b70-88fa-fbb512c85449 name: est description: 'Rerum distinctio ut distinctio quia ut odio quis.' created_at: null updated_at: null items: type: object properties: id: type: string example: 27886550-7113-44e6-a323-d6292580ebe6 name: type: string example: fuga description: type: string example: 'Aspernatur temporibus doloribus tenetur sapiente sed dolores sed.' 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: 40396db3-d17e-419e-b34a-e07d80199292 name: doloremque description: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 40396db3-d17e-419e-b34a-e07d80199292 name: type: string example: doloremque description: type: string example: null nullable: true 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: incidunt 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: false nullable: true page: type: integer description: 'O campo value deve ser pelo menos 1.' example: 69 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: dolores nullable: true employee_id: type: string description: 'The uuid of an existing record in the employees table.' example: sequi nullable: true has_term: type: boolean description: '' example: false 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 - in: query name: status description: 'Filtrar por situação (active, inactive ou all). Sem o parâmetro, lista apenas ativos.' example: active required: false schema: type: string description: 'Filtrar por situação (active, inactive ou all). Sem o parâmetro, lista apenas ativos.' example: active enum: - active - inactive - all nullable: true - in: query name: employee_roles description: 'The uuid of an existing record in the employee_roles table.' example: - qui required: false schema: type: array description: 'The uuid of an existing record in the employee_roles table.' example: - qui items: type: string - in: query name: admission_date_from description: 'Data inicial do período de admissão. O campo value deve ser uma data válida.' example: '2026-01-01' required: false schema: type: string description: 'Data inicial do período de admissão. O campo value deve ser uma data válida.' example: '2026-01-01' nullable: true - in: query name: admission_date_to description: 'Data final do período de admissão. O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a admission_date_from.' example: '2026-12-31' required: false schema: type: string description: 'Data final do período de admissão. O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a admission_date_from.' example: '2026-12-31' nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 87656e6a-86e3-4bcf-a887-6f5929e5ab20 name: 'Paola Carla Paz Neto' cpf: 068.241.827-00 rg: null ctps: null phone: null birthdate: null email: marcelo96@example.net pis_pasep: null admission_date: '2009-02-14' daily_salary: '91.45' monthly_salary: null nationality: null place_of_birth: 'Paulo do Leste' status: active status_label: Ativo address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null employee_role: id: a2d092c6-addd-4410-b826-60a156bcfad0 name: impedit created_at: null updated_at: null - id: 8354f179-e4b5-4acc-826b-28fe84a3c080 name: 'Sr. Ronaldo Diogo Saraiva Jr.' cpf: 845.884.780-75 rg: null ctps: null phone: '(69) 99049-4142' birthdate: null email: null pis_pasep: null admission_date: '1981-12-16' daily_salary: '69.55' monthly_salary: '9530.28' nationality: null place_of_birth: 'Queirós do Leste' status: active status_label: Ativo address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null employee_role: id: a2d092c6-b266-4e83-ade6-2f735ad7a795 name: nisi created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: '/?page=68' next: null meta: current_page: 69 from: 681 last_page: 1 links: - url: '/?page=68' label: '« Anterior' page: 68 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: 682 total: 2 properties: data: type: array example: - id: 87656e6a-86e3-4bcf-a887-6f5929e5ab20 name: 'Paola Carla Paz Neto' cpf: 068.241.827-00 rg: null ctps: null phone: null birthdate: null email: marcelo96@example.net pis_pasep: null admission_date: '2009-02-14' daily_salary: '91.45' monthly_salary: null nationality: null place_of_birth: 'Paulo do Leste' status: active status_label: Ativo address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null employee_role: id: a2d092c6-addd-4410-b826-60a156bcfad0 name: impedit created_at: null updated_at: null - id: 8354f179-e4b5-4acc-826b-28fe84a3c080 name: 'Sr. Ronaldo Diogo Saraiva Jr.' cpf: 845.884.780-75 rg: null ctps: null phone: '(69) 99049-4142' birthdate: null email: null pis_pasep: null admission_date: '1981-12-16' daily_salary: '69.55' monthly_salary: '9530.28' nationality: null place_of_birth: 'Queirós do Leste' status: active status_label: Ativo address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null employee_role: id: a2d092c6-b266-4e83-ade6-2f735ad7a795 name: nisi created_at: null updated_at: null items: type: object properties: id: type: string example: 87656e6a-86e3-4bcf-a887-6f5929e5ab20 name: type: string example: 'Paola Carla Paz Neto' cpf: type: string example: 068.241.827-00 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: null nullable: true email: type: string example: marcelo96@example.net pis_pasep: type: string example: null nullable: true admission_date: type: string example: '2009-02-14' daily_salary: type: string example: '91.45' monthly_salary: type: string example: null nullable: true nationality: type: string example: null nullable: true place_of_birth: type: string example: 'Paulo do Leste' status: type: string example: active status_label: type: string example: Ativo 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: a2d092c6-addd-4410-b826-60a156bcfad0 name: type: string example: impedit 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=68' next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 69 from: type: integer example: 681 last_page: type: integer example: 1 links: type: array example: - url: '/?page=68' label: '« Anterior' page: 68 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=68' label: type: string example: '« Anterior' page: type: integer example: 68 active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 682 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: data: id: 646303f2-0c7f-4ebd-841c-b9677d29d890 name: 'Emanuelly Ferminiano Filho' cpf: 771.518.819-45 rg: null ctps: null phone: null birthdate: null email: suelen49@example.com pis_pasep: '89491124744' admission_date: '2014-08-24' daily_salary: '71.23' monthly_salary: null nationality: null place_of_birth: 'Solano do Leste' status: active status_label: Ativo address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null employee_role: id: a2d092c6-cfa6-4ba9-b501-e6174c4a5e98 name: quaerat created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 646303f2-0c7f-4ebd-841c-b9677d29d890 name: type: string example: 'Emanuelly Ferminiano Filho' cpf: type: string example: 771.518.819-45 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: null nullable: true email: type: string example: suelen49@example.com pis_pasep: type: string example: '89491124744' admission_date: type: string example: '2014-08-24' daily_salary: type: string example: '71.23' monthly_salary: type: string example: null nullable: true nationality: type: string example: null nullable: true place_of_birth: type: string example: 'Solano do Leste' status: type: string example: active status_label: type: string example: Ativo 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: a2d092c6-cfa6-4ba9-b501-e6174c4a5e98 name: type: string example: quaerat created_at: type: string example: null nullable: true updated_at: type: string example: null 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' 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: 8355134e-749b-4bef-83da-6ad7ee7dbcd0 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. O campo value deve ser uma data anterior ou igual a today.' 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/excel: get: summary: 'Export employees to Excel' operationId: exportEmployeesToExcel description: 'Dispatches async Excel generation using the same filters as the listing. Frontend is notified via Pusher when ready.' 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 - in: query name: status description: 'Filtrar por situação (active, inactive ou all). Sem o parâmetro, lista apenas ativos.' example: active required: false schema: type: string description: 'Filtrar por situação (active, inactive ou all). Sem o parâmetro, lista apenas ativos.' example: active enum: - active - inactive - all nullable: true - in: query name: employee_roles description: 'The uuid of an existing record in the employee_roles table.' example: - consequuntur required: false schema: type: array description: 'The uuid of an existing record in the employee_roles table.' example: - consequuntur items: type: string - in: query name: admission_date_from description: 'Data inicial do período de admissão. O campo value deve ser uma data válida.' example: '2026-01-01' required: false schema: type: string description: 'Data inicial do período de admissão. O campo value deve ser uma data válida.' example: '2026-01-01' nullable: true - in: query name: admission_date_to description: 'Data final do período de admissão. O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a admission_date_from.' example: '2026-12-31' required: false schema: type: string description: 'Data final do período de admissão. O campo value deve ser uma data válida. O campo value deve ser uma data posterior ou igual a admission_date_from.' example: '2026-12-31' nullable: true responses: 202: description: '' content: application/json: schema: type: object example: message: string channel: string event: string properties: message: type: string example: string channel: type: string example: string event: type: string example: string 422: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Employees '/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: 879a7a61-bdf2-4d5e-a549-f4e7010de0cf name: 'Raphael Campos Filho' cpf: 564.840.361-85 rg: '645847717' ctps: '536981911' phone: '(46) 4012-8653' birthdate: null email: vieira.gabrielle@example.net pis_pasep: '51209321095' admission_date: '2009-02-25' daily_salary: null monthly_salary: null nationality: 'Nova Guiné' place_of_birth: null status: active status_label: Ativo address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null employee_role: id: a2d092c6-c5d7-45a7-abd0-9eccbe2387e0 name: nesciunt created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 879a7a61-bdf2-4d5e-a549-f4e7010de0cf name: type: string example: 'Raphael Campos Filho' cpf: type: string example: 564.840.361-85 rg: type: string example: '645847717' ctps: type: string example: '536981911' phone: type: string example: '(46) 4012-8653' birthdate: type: string example: null nullable: true email: type: string example: vieira.gabrielle@example.net pis_pasep: type: string example: '51209321095' admission_date: type: string example: '2009-02-25' daily_salary: type: string example: null nullable: true monthly_salary: type: string example: null nullable: true nationality: type: string example: 'Nova Guiné' place_of_birth: type: string example: null nullable: true status: type: string example: active status_label: type: string example: Ativo 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: a2d092c6-c5d7-45a7-abd0-9eccbe2387e0 name: type: string example: nesciunt 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: 242faba4-0bf8-48bf-b20f-5404700d6dda 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. O campo value deve ser uma data anterior ou igual a today.' example: '2024-01-01' 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: 3 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}/dismiss': post: summary: 'Dismiss employee' operationId: dismissEmployee description: 'Register the dismissal of an active employee' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 7efe67a8-6175-4c17-83ed-7c726ca8c110 name: 'Noa Ávila' cpf: 205.117.363-73 rg: '848154376' ctps: '128918669' phone: null birthdate: '2026-06-24' email: abarros@example.org pis_pasep: null admission_date: '2011-04-18' daily_salary: '133.26' monthly_salary: '8986.53' nationality: null place_of_birth: 'Porto Filipe do Norte' status: active status_label: Ativo address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null employee_role: id: a2d092c6-dfec-4275-9190-8876dce1b13f name: quidem created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 7efe67a8-6175-4c17-83ed-7c726ca8c110 name: type: string example: 'Noa Ávila' cpf: type: string example: 205.117.363-73 rg: type: string example: '848154376' ctps: type: string example: '128918669' phone: type: string example: null nullable: true birthdate: type: string example: '2026-06-24' email: type: string example: abarros@example.org pis_pasep: type: string example: null nullable: true admission_date: type: string example: '2011-04-18' daily_salary: type: string example: '133.26' monthly_salary: type: string example: '8986.53' nationality: type: string example: null nullable: true place_of_birth: type: string example: 'Porto Filipe do Norte' status: type: string example: active status_label: type: string example: Ativo 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: a2d092c6-dfec-4275-9190-8876dce1b13f name: type: string example: quidem created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Employees requestBody: required: true content: application/json: schema: type: object properties: dismissal_date: type: string description: 'Data da baixa. O campo value deve ser uma data válida. O campo value deve ser uma data anterior ou igual a today.' example: '2026-09-23' dismissal_reason: type: string description: 'Motivo da saída.' example: resignation enum: - resignation - dismissal_without_cause - dismissal_with_cause - end_of_contract - retirement required: - dismissal_date - dismissal_reason parameters: - in: path name: employee description: 'Employee ID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/employees/{employee}/rehire': post: summary: 'Rehire employee' operationId: rehireEmployee description: 'Rehire an inactive employee with a new admission date' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 657c6acf-afee-41ec-95c6-04c96c311ada name: 'Juliana Prado Valentin Sobrinho' cpf: 089.163.385-77 rg: null ctps: '608641871' phone: '(45) 2328-8016' birthdate: '1985-01-07' email: alicia55@example.net pis_pasep: null admission_date: '2010-06-08' daily_salary: '287.73' monthly_salary: null nationality: Chile place_of_birth: 'Martinho do Leste' status: active status_label: Ativo address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null employee_role: id: a2d092c6-e803-47fd-86b6-32e6dcd095ae name: et created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 657c6acf-afee-41ec-95c6-04c96c311ada name: type: string example: 'Juliana Prado Valentin Sobrinho' cpf: type: string example: 089.163.385-77 rg: type: string example: null nullable: true ctps: type: string example: '608641871' phone: type: string example: '(45) 2328-8016' birthdate: type: string example: '1985-01-07' email: type: string example: alicia55@example.net pis_pasep: type: string example: null nullable: true admission_date: type: string example: '2010-06-08' daily_salary: type: string example: '287.73' monthly_salary: type: string example: null nullable: true nationality: type: string example: Chile place_of_birth: type: string example: 'Martinho do Leste' status: type: string example: active status_label: type: string example: Ativo 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: a2d092c6-e803-47fd-86b6-32e6dcd095ae name: type: string example: et created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Employees requestBody: required: true content: application/json: schema: type: object properties: admission_date: type: string description: 'Nova data de admissão. O campo value deve ser uma data válida. O campo value deve ser uma data anterior ou igual a today.' example: '2026-09-23' required: - admission_date parameters: - 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: voluptas agency: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: ykjbauwkqexvgnmlxnsiusugo account: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: oebtzbe 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: sdloujbzlyzdzfncpudjdbc 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: 3 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: consequatur agency: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: lpwjdwcsxzacfqxh account: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: tajugajsqbgsbmwnpdvp 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: e nullable: true favorite: type: boolean description: '' example: false parameters: - in: path name: employee_id description: 'The ID of the employee.' example: 16 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: quia nullable: true status: type: string description: '' example: expiring enum: - valid - expiring - expired nullable: true epi_type_id: type: string description: 'The uuid of an existing record in the epi_types table.' example: qui 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: 04ad3619-d876-3ee7-8be1-c3f1e5728c1d 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 delivered_by_employee_id: type: string description: 'Responsável pela entrega. The uuid of an existing record in the employees table.' example: d6f68773-6cec-448f-a03a-5842d98037f0 nullable: true stock_id: type: string description: 'Estoque. The uuid of an existing record in the stocks table.' example: 18149321-23af-30cd-b55e-2f54507e0928 nullable: true confirm_insufficient_stock: type: boolean description: 'Confirmar saldo insuficiente.' example: true required: - epi_type_id - delivery_date - condition parameters: - in: path name: employee_id description: 'The ID of the employee.' example: 5 required: true schema: type: integer - in: path name: employee description: 'Employee UUID' example: fugit 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: rem 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: d4b1b727-e1ab-34f9-91fe-b32a9c4b1f25 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 delivered_by_employee_id: type: string description: 'Responsável pela entrega. The uuid of an existing record in the employees table.' example: 16a1ad87-9522-4cfc-ae93-73cb18f2a1b3 nullable: true stock_id: type: string description: 'Estoque. The uuid of an existing record in the stocks table.' example: 135851c4-be1d-3e54-87e8-47e7a1ea1f41 nullable: true confirm_insufficient_stock: type: boolean description: 'Confirmar saldo insuficiente.' example: true parameters: - in: path name: employee_id description: 'The ID of the employee.' example: 17 required: true schema: type: integer - in: path name: id description: 'EPI delivery UUID' example: dolor required: true schema: type: string - in: path name: employee description: 'Employee UUID' example: qui 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' is_kit_initial: type: boolean description: 'Kit inicial.' example: true show_epi_receipt_text: type: boolean description: 'Exibir texto do recibo.' example: true delivered_by_employee_id: type: string description: 'Responsável pela entrega. The uuid of an existing record in the employees table.' example: 8f36bac8-7998-4437-8ebb-adf32d1d0cfe nullable: true stock_id: type: string description: 'Estoque. The uuid of an existing record in the stocks table.' example: 7c87b8ad-3c96-3946-8f8b-e626a6d9ca65 nullable: true confirm_insufficient_stock: type: boolean description: 'Confirmar saldo insuficiente.' example: true 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: f665774b-0f59-3b43-bda0-7e07fe3ed91a 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 required: - epi_type_id - condition required: - delivery_date - items parameters: - in: path name: employee description: 'Employee UUID' example: dolore required: true schema: type: string '/api/employees/{employee}/epi-deliveries/{id}/promote-to-kit': post: summary: 'Promote EPI delivery to kit' operationId: promoteEPIDeliveryToKit description: 'Turn a standalone EPI delivery into a single-item kit so it can generate the acknowledgement term. Idempotent: a delivery already belonging to a kit is returned unchanged.' parameters: [] responses: { } tags: - Employees parameters: - in: path name: employee description: 'Employee UUID' example: ut required: true schema: type: string - in: path name: id description: 'EPI delivery UUID' example: hic 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: assumenda required: true schema: type: string - in: path name: id description: 'EPI delivery UUID' example: aliquid 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: 12 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: 14 nullable: true q: type: string description: '' example: facilis nullable: true employee_id: type: string description: 'The uuid of an existing record in the employees table.' example: corporis nullable: true has_term: type: boolean description: '' example: false nullable: true parameters: - in: path name: employee_id description: 'The ID of the employee.' example: 3 required: true schema: type: integer - in: path name: employee description: 'Employee UUID' example: est 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: atque required: true schema: type: string - in: path name: kitUuid description: 'Kit UUID' example: 4f44596d-a935-34b5-8ab6-35a6f62dcb88 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: voluptatibus required: true schema: type: string - in: path name: kitUuid description: 'Kit UUID' example: 759c4351-900a-3123-9ecc-dcac62f4fb7c 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: 8bba2f93-c5a6-3d17-851c-01fd03815048 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: 5fbf5f83-2170-3dc2-bcba-3579f61495e6 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: 378200c8-e0f3-3e44-ae45-51ab3817a4f1 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: 2c93098f-7866-3f21-927a-324cad5bbc50 document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '04638366620555786251637862222849201300485959' nfe_number: '080046' nfe_series: '00' issue_date: '2011-03-17T03:00:00.000000Z' total_value: '9395.33' emit: cnpj: '25596553337627' name: Kerluke-Bosco dest: document: '14261629090538' name: 'Pfannerstill PLC' supplier: id: a2d092c8-8470-4ea4-8149-0f023d33c18e name: 'Sra. Graziela Lara Sandoval' document: 04.136.520/0001-87 financial_status: pending products_imported_at: null created_at: null - id: 84335b01-aa7e-398c-819c-3371acc6d45b document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '72949639969769657642309749892133587912792594' nfe_number: '675541' nfe_series: '28' issue_date: '2015-08-13T03:00:00.000000Z' total_value: '3596.29' emit: cnpj: '42616730581182' name: Dickinson-Doyle dest: document: '12185619061849' name: 'Parisian LLC' supplier: id: a2d092c8-89c9-47f2-870a-d3c8407109f1 name: 'Dr. Daniel Toledo Filho' document: 88.075.850/0001-08 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: 2c93098f-7866-3f21-927a-324cad5bbc50 document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '04638366620555786251637862222849201300485959' nfe_number: '080046' nfe_series: '00' issue_date: '2011-03-17T03:00:00.000000Z' total_value: '9395.33' emit: cnpj: '25596553337627' name: Kerluke-Bosco dest: document: '14261629090538' name: 'Pfannerstill PLC' supplier: id: a2d092c8-8470-4ea4-8149-0f023d33c18e name: 'Sra. Graziela Lara Sandoval' document: 04.136.520/0001-87 financial_status: pending products_imported_at: null created_at: null - id: 84335b01-aa7e-398c-819c-3371acc6d45b document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '72949639969769657642309749892133587912792594' nfe_number: '675541' nfe_series: '28' issue_date: '2015-08-13T03:00:00.000000Z' total_value: '3596.29' emit: cnpj: '42616730581182' name: Dickinson-Doyle dest: document: '12185619061849' name: 'Parisian LLC' supplier: id: a2d092c8-89c9-47f2-870a-d3c8407109f1 name: 'Dr. Daniel Toledo Filho' document: 88.075.850/0001-08 financial_status: pending products_imported_at: null created_at: null items: type: object properties: id: type: string example: 2c93098f-7866-3f21-927a-324cad5bbc50 document_type: type: string example: nfe document_type_label: type: string example: NF-e service_description: type: string example: null nullable: true nfe_access_key: type: string example: '04638366620555786251637862222849201300485959' nfe_number: type: string example: '080046' nfe_series: type: string example: '00' issue_date: type: string example: '2011-03-17T03:00:00.000000Z' total_value: type: string example: '9395.33' emit: type: object properties: cnpj: type: string example: '25596553337627' name: type: string example: Kerluke-Bosco dest: type: object properties: document: type: string example: '14261629090538' name: type: string example: 'Pfannerstill PLC' supplier: type: object properties: id: type: string example: a2d092c8-8470-4ea4-8149-0f023d33c18e name: type: string example: 'Sra. Graziela Lara Sandoval' document: type: string example: 04.136.520/0001-87 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: dolores document_type: type: string description: '' example: nfe enum: - nfe - nfse supplier_id: type: string description: 'The uuid of an existing record in the suppliers table.' example: laborum work_id: type: string description: 'The uuid of an existing record in the works table.' example: eum start_date: type: string description: 'O campo value deve ser uma data válida.' example: '2026-09-23T09:36:35' 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: '2110-05-05' per_page: type: integer description: 'O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 18 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: 3d19562d-3e61-3f67-9169-0375e2fc654d document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '18076026846351374667357315827247880976889266' nfe_number: '698422' nfe_series: '31' issue_date: '1985-04-02T03:00:00.000000Z' total_value: '191.41' emit: cnpj: '84713885452432' name: 'Hermiston, Spencer and Bergnaum' dest: document: '47034820017567' name: 'Mraz Ltd' supplier: id: a2d092c8-9b0c-4dd7-81b2-fb905ac9718c name: 'Dr. Fabiano Gusmão Neto' document: 26.285.389/0001-52 financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: 3d19562d-3e61-3f67-9169-0375e2fc654d document_type: type: string example: nfe document_type_label: type: string example: NF-e service_description: type: string example: null nullable: true nfe_access_key: type: string example: '18076026846351374667357315827247880976889266' nfe_number: type: string example: '698422' nfe_series: type: string example: '31' issue_date: type: string example: '1985-04-02T03:00:00.000000Z' total_value: type: string example: '191.41' emit: type: object properties: cnpj: type: string example: '84713885452432' name: type: string example: 'Hermiston, Spencer and Bergnaum' dest: type: object properties: document: type: string example: '47034820017567' name: type: string example: 'Mraz Ltd' supplier: type: object properties: id: type: string example: a2d092c8-9b0c-4dd7-81b2-fb905ac9718c name: type: string example: 'Dr. Fabiano Gusmão Neto' document: type: string example: 26.285.389/0001-52 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: quasi 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: - dolor 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: c41965b4-7a16-3dc8-9a0a-70cf01e23b1c document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '07607354157555169385590387921478529626089472' nfe_number: '461778' nfe_series: '77' issue_date: '2026-05-09T03:00:00.000000Z' total_value: '3234.93' emit: cnpj: '71273871757633' name: Paucek-Kilback dest: document: '84336125079152' name: Schumm-Ratke supplier: id: a2d092c8-a424-428b-beb2-f9e57963dc50 name: 'Ellen Cristina Marin' document: 60.605.832/0001-63 financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: c41965b4-7a16-3dc8-9a0a-70cf01e23b1c document_type: type: string example: nfe document_type_label: type: string example: NF-e service_description: type: string example: null nullable: true nfe_access_key: type: string example: '07607354157555169385590387921478529626089472' nfe_number: type: string example: '461778' nfe_series: type: string example: '77' issue_date: type: string example: '2026-05-09T03:00:00.000000Z' total_value: type: string example: '3234.93' emit: type: object properties: cnpj: type: string example: '71273871757633' name: type: string example: Paucek-Kilback dest: type: object properties: document: type: string example: '84336125079152' name: type: string example: Schumm-Ratke supplier: type: object properties: id: type: string example: a2d092c8-a424-428b-beb2-f9e57963dc50 name: type: string example: 'Ellen Cristina Marin' document: type: string example: 60.605.832/0001-63 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: natus 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: fd10065e-4880-3f7b-bb4e-e4d551e1e404 document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '34370383351674465593973302114245722789633064' nfe_number: '332101' nfe_series: '78' issue_date: '1982-04-28T03:00:00.000000Z' total_value: '3931.48' emit: cnpj: '00422249754979' name: 'Stiedemann Inc' dest: document: '95350817827502' name: 'Bednar Group' supplier: id: a2d092c8-b19d-46cb-9ea6-3d8478bdcf7d name: 'Dr. Miranda Galindo Salgado Sobrinho' document: 14.945.822/0001-50 financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: fd10065e-4880-3f7b-bb4e-e4d551e1e404 document_type: type: string example: nfe document_type_label: type: string example: NF-e service_description: type: string example: null nullable: true nfe_access_key: type: string example: '34370383351674465593973302114245722789633064' nfe_number: type: string example: '332101' nfe_series: type: string example: '78' issue_date: type: string example: '1982-04-28T03:00:00.000000Z' total_value: type: string example: '3931.48' emit: type: object properties: cnpj: type: string example: '00422249754979' name: type: string example: 'Stiedemann Inc' dest: type: object properties: document: type: string example: '95350817827502' name: type: string example: 'Bednar Group' supplier: type: object properties: id: type: string example: a2d092c8-b19d-46cb-9ea6-3d8478bdcf7d name: type: string example: 'Dr. Miranda Galindo Salgado Sobrinho' document: type: string example: 14.945.822/0001-50 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: quisquam name: type: string description: '' example: rerum extension: type: string description: '' example: et 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: deserunt 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: a4cc5917-e696-3e1b-a03e-d463a087df17 document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '34966518755256429647652023386613639741018863' nfe_number: '106070' nfe_series: '65' issue_date: '2007-09-03T03:00:00.000000Z' total_value: '7520.96' emit: cnpj: '04601418874413' name: 'Gerhold Ltd' dest: document: '84449296436645' name: Walsh-Deckow supplier: id: a2d092c8-baa0-4afc-8ec9-960ba652875c name: 'Dr. Eunice Vieira Vieira Filho' document: 56.863.326/0001-05 financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: a4cc5917-e696-3e1b-a03e-d463a087df17 document_type: type: string example: nfe document_type_label: type: string example: NF-e service_description: type: string example: null nullable: true nfe_access_key: type: string example: '34966518755256429647652023386613639741018863' nfe_number: type: string example: '106070' nfe_series: type: string example: '65' issue_date: type: string example: '2007-09-03T03:00:00.000000Z' total_value: type: string example: '7520.96' emit: type: object properties: cnpj: type: string example: '04601418874413' name: type: string example: 'Gerhold Ltd' dest: type: object properties: document: type: string example: '84449296436645' name: type: string example: Walsh-Deckow supplier: type: object properties: id: type: string example: a2d092c8-baa0-4afc-8ec9-960ba652875c name: type: string example: 'Dr. Eunice Vieira Vieira Filho' document: type: string example: 56.863.326/0001-05 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: corporis required: true schema: type: string - in: path name: file description: 'UUID do arquivo anexado' example: est 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: bf8da4c2-ce16-3e15-8f8d-cdcf77a5ed13 document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '53748647990406368380157897991422238917076393' nfe_number: '770392' nfe_series: '45' issue_date: '1977-12-13T03:00:00.000000Z' total_value: '417.58' emit: cnpj: '57434474950865' name: 'Pollich Ltd' dest: document: '08334009377836' name: Friesen-Keebler supplier: id: a2d092c8-c368-47b0-8d3a-f7212b738755 name: 'Dr. Eunice Valdez Sobrinho' document: 01.247.473/0001-50 financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: bf8da4c2-ce16-3e15-8f8d-cdcf77a5ed13 document_type: type: string example: nfe document_type_label: type: string example: NF-e service_description: type: string example: null nullable: true nfe_access_key: type: string example: '53748647990406368380157897991422238917076393' nfe_number: type: string example: '770392' nfe_series: type: string example: '45' issue_date: type: string example: '1977-12-13T03:00:00.000000Z' total_value: type: string example: '417.58' emit: type: object properties: cnpj: type: string example: '57434474950865' name: type: string example: 'Pollich Ltd' dest: type: object properties: document: type: string example: '08334009377836' name: type: string example: Friesen-Keebler supplier: type: object properties: id: type: string example: a2d092c8-c368-47b0-8d3a-f7212b738755 name: type: string example: 'Dr. Eunice Valdez Sobrinho' document: type: string example: 01.247.473/0001-50 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: - nam items: type: string parameters: - in: path name: fiscalDocument description: 'UUID da nota fiscal' example: nihil required: true schema: type: string '/api/fiscal-documents/{fiscalDocument}/installments': post: summary: 'Create installment' operationId: createInstallment description: 'Lança uma cobrança avulsa na nota fiscal, para o boleto que o fornecedor cobra além das duplicatas do XML. Nasce pendente e sem conta no financeiro; a geração continua sendo pelo import-nfe.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 840fa3b5-e506-3ede-85c6-7580cfddfd5a document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '21834293979215000928117602958267063287770411' nfe_number: '293234' nfe_series: '97' issue_date: '2025-07-13T03:00:00.000000Z' total_value: '2859.59' emit: cnpj: '24061442130483' name: 'Gulgowski, DuBuque and Champlin' dest: document: '05221824426984' name: 'Reichel Inc' supplier: id: a2d092c8-cd9b-445b-a644-8dfc1217eb40 name: 'Dr. Sueli Gisela Mendonça Sobrinho' document: 42.504.889/0001-94 financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: 840fa3b5-e506-3ede-85c6-7580cfddfd5a document_type: type: string example: nfe document_type_label: type: string example: NF-e service_description: type: string example: null nullable: true nfe_access_key: type: string example: '21834293979215000928117602958267063287770411' nfe_number: type: string example: '293234' nfe_series: type: string example: '97' issue_date: type: string example: '2025-07-13T03:00:00.000000Z' total_value: type: string example: '2859.59' emit: type: object properties: cnpj: type: string example: '24061442130483' name: type: string example: 'Gulgowski, DuBuque and Champlin' dest: type: object properties: document: type: string example: '05221824426984' name: type: string example: 'Reichel Inc' supplier: type: object properties: id: type: string example: a2d092c8-cd9b-445b-a644-8dfc1217eb40 name: type: string example: 'Dr. Sueli Gisela Mendonça Sobrinho' document: type: string example: 42.504.889/0001-94 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: due_date: type: string description: 'Vencimento. O campo value deve ser uma data válida.' example: '2024-01-01' amount: type: number description: Valor. example: 1.0 number: type: string description: 'Número da cobrança. O campo value não pode ser superior a 60 caracteres.' example: 'Example Number' nullable: true required: - due_date - amount parameters: - in: path name: fiscalDocument description: 'UUID da nota fiscal' example: quod 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: d4f6a3fd-9b64-3f61-9ed3-07de21f0464a 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: dignissimos 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: neque 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: est 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: - quis items: type: string required: - mappings parameters: - in: path name: importId description: '' example: amet 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: 'nihil eveniet' abbreviation: 'ON' - id: null name: 'saepe dolorum' abbreviation: DJ 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: 'nihil eveniet' abbreviation: 'ON' - id: null name: 'saepe dolorum' abbreviation: DJ items: type: object properties: id: type: string example: null nullable: true name: type: string example: 'nihil eveniet' abbreviation: type: string example: 'ON' 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: aut nullable: true sort_desc: type: boolean description: '' example: false nullable: true page: type: integer description: 'O campo value deve ser pelo menos 1.' example: 14 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: 5 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: Andersonstad - id: null name: Ashleyhaven properties: data: type: array example: - id: null name: Andersonstad - id: null name: Ashleyhaven items: type: object properties: id: type: string example: null nullable: true name: type: string example: Andersonstad 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: dolores required: false schema: type: string description: '' example: dolores - in: query name: document description: '' example: est required: false schema: type: string description: '' example: est - 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: 44536f68-982b-3574-a7ca-ecdc52dcd6e3 receipt_number: REC-2562 receiver_type: employee receiver: id: null name: 'Andrew Will' document: 107.811.644-43 payment: amount: 9883.18 amount_in_words: 'Valor por extenso de teste' method: pix description: 'Excepturi quisquam optio incidunt quis aliquam quo ut sapiente.' issuer: name: Pagac-Dare document: 91.785.425/2179-49 issue: date: '2026-09-04' city: 'Port Penelope' state: CE created_by: id: a2d092c9-01b4-41ce-a804-ea4acd819c5f name: 'Alice Hahn' created_at: null updated_at: null - id: fb81971a-1195-3649-a264-e9cf8d529312 receipt_number: REC-7975 receiver_type: employee receiver: id: null name: 'Prof. Adriel Durgan IV' document: 723.827.768-91 payment: amount: 8196.17 amount_in_words: 'Valor por extenso de teste' method: cash description: 'Voluptatibus explicabo vero deserunt cum reprehenderit repellat officia.' issuer: name: 'Simonis, Lynch and Schaefer' document: 64.499.584/9866-28 issue: date: '2026-08-31' city: Penelopeburgh state: MG created_by: id: a2d092c9-051a-4d1c-a6f8-e260359f2a41 name: 'Prof. Dedric Stokes PhD' 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: 44536f68-982b-3574-a7ca-ecdc52dcd6e3 receipt_number: REC-2562 receiver_type: employee receiver: id: null name: 'Andrew Will' document: 107.811.644-43 payment: amount: 9883.18 amount_in_words: 'Valor por extenso de teste' method: pix description: 'Excepturi quisquam optio incidunt quis aliquam quo ut sapiente.' issuer: name: Pagac-Dare document: 91.785.425/2179-49 issue: date: '2026-09-04' city: 'Port Penelope' state: CE created_by: id: a2d092c9-01b4-41ce-a804-ea4acd819c5f name: 'Alice Hahn' created_at: null updated_at: null - id: fb81971a-1195-3649-a264-e9cf8d529312 receipt_number: REC-7975 receiver_type: employee receiver: id: null name: 'Prof. Adriel Durgan IV' document: 723.827.768-91 payment: amount: 8196.17 amount_in_words: 'Valor por extenso de teste' method: cash description: 'Voluptatibus explicabo vero deserunt cum reprehenderit repellat officia.' issuer: name: 'Simonis, Lynch and Schaefer' document: 64.499.584/9866-28 issue: date: '2026-08-31' city: Penelopeburgh state: MG created_by: id: a2d092c9-051a-4d1c-a6f8-e260359f2a41 name: 'Prof. Dedric Stokes PhD' created_at: null updated_at: null items: type: object properties: id: type: string example: 44536f68-982b-3574-a7ca-ecdc52dcd6e3 receipt_number: type: string example: REC-2562 receiver_type: type: string example: employee receiver: type: object properties: id: type: string example: null nullable: true name: type: string example: 'Andrew Will' document: type: string example: 107.811.644-43 payment: type: object properties: amount: type: number example: 9883.18 amount_in_words: type: string example: 'Valor por extenso de teste' method: type: string example: pix description: type: string example: 'Excepturi quisquam optio incidunt quis aliquam quo ut sapiente.' issuer: type: object properties: name: type: string example: Pagac-Dare document: type: string example: 91.785.425/2179-49 issue: type: object properties: date: type: string example: '2026-09-04' city: type: string example: 'Port Penelope' state: type: string example: CE created_by: type: object properties: id: type: string example: a2d092c9-01b4-41ce-a804-ea4acd819c5f name: type: string example: 'Alice Hahn' 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: 99687392-d5ce-4e78-83db-2c058f284ed9 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: 0f251921-d3ad-3f1b-973d-ee5d77175647 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: f58f3889-e66e-3744-bca7-f2d5990cd9cd nullable: true required: - receiver_type - amount - payment_method - description - issuer_name - issuer_document - issue_date - city - state /api/payment-receipts/excel: get: summary: 'Export payment receipts to Excel' operationId: exportPaymentReceiptsToExcel description: 'Dispatches async Excel generation using the same filters as the listing. Frontend is notified via Pusher when ready.' 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: nulla required: false schema: type: string description: '' example: nulla - in: query name: document description: '' example: et required: false schema: type: string description: '' example: et - 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: 202: description: '' content: application/json: schema: type: object example: message: string channel: string event: string properties: message: type: string example: string channel: type: string example: string event: type: string example: string 422: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Payment Receipts' /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: pix enum: - pix - bank_transfer - cash - check eligible: type: boolean description: '' example: true 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: 0e54d123-0485-3411-b2e6-3f2608004626 receipt_number: REC-5405 receiver_type: employee receiver: id: null name: 'Dr. Herman Weber' document: 373.550.751-11 payment: amount: 9372.22 amount_in_words: 'Valor por extenso de teste' method: bank_transfer description: 'Ullam voluptatem consequatur illum doloribus corporis accusamus esse.' issuer: name: 'Hahn, Ondricka and Bailey' document: 69.870.471/7941-76 issue: date: '2026-09-01' city: 'West Alichester' state: BA created_by: id: a2d092c9-215e-4f21-9568-1c16ae279de1 name: 'Mrs. Alexandrine Johns' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 0e54d123-0485-3411-b2e6-3f2608004626 receipt_number: type: string example: REC-5405 receiver_type: type: string example: employee receiver: type: object properties: id: type: string example: null nullable: true name: type: string example: 'Dr. Herman Weber' document: type: string example: 373.550.751-11 payment: type: object properties: amount: type: number example: 9372.22 amount_in_words: type: string example: 'Valor por extenso de teste' method: type: string example: bank_transfer description: type: string example: 'Ullam voluptatem consequatur illum doloribus corporis accusamus esse.' issuer: type: object properties: name: type: string example: 'Hahn, Ondricka and Bailey' document: type: string example: 69.870.471/7941-76 issue: type: object properties: date: type: string example: '2026-09-01' city: type: string example: 'West Alichester' state: type: string example: BA created_by: type: object properties: id: type: string example: a2d092c9-215e-4f21-9568-1c16ae279de1 name: type: string example: 'Mrs. Alexandrine Johns' 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: e558d584-9aad-4717-b254-4a250624adc7 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: 78db6409-4771-3f6e-a456-d47079873920 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: 27a656d2-2e7c-3b48-a6da-cd3a8c516e12 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: c58cc5d6-2d23-3f39-922b-2ef02552968b receipt_number: REC-3561 receiver_type: custom receiver: id: null name: 'Evalyn Prosacco Jr.' document: 407.404.724-09 payment: amount: 8851.16 amount_in_words: 'Valor por extenso de teste' method: check description: 'Totam veritatis cumque fuga quia quaerat dolor.' issuer: name: Kerluke-Reinger document: 10.884.954/0570-40 issue: date: '2026-09-02' city: Maurineport state: RS created_by: id: a2d092c9-42e1-4856-a8a7-4ab7dfc7df51 name: 'Kaylah Mosciski' created_at: null updated_at: null - id: dc49fdf8-e4e4-33e6-a61f-be976379ee24 receipt_number: REC-8986 receiver_type: custom receiver: id: null name: 'Jazmyn Kiehn PhD' document: 559.161.997-32 payment: amount: 2796.94 amount_in_words: 'Valor por extenso de teste' method: check description: 'Voluptas neque earum tempore facere facilis.' issuer: name: Sauer-Grady document: 57.156.969/2225-38 issue: date: '2026-08-29' city: 'East Maurice' state: SC created_by: id: a2d092c9-4508-4273-bf35-5bbcee393fea name: 'Augustine Gutmann' 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: c58cc5d6-2d23-3f39-922b-2ef02552968b receipt_number: REC-3561 receiver_type: custom receiver: id: null name: 'Evalyn Prosacco Jr.' document: 407.404.724-09 payment: amount: 8851.16 amount_in_words: 'Valor por extenso de teste' method: check description: 'Totam veritatis cumque fuga quia quaerat dolor.' issuer: name: Kerluke-Reinger document: 10.884.954/0570-40 issue: date: '2026-09-02' city: Maurineport state: RS created_by: id: a2d092c9-42e1-4856-a8a7-4ab7dfc7df51 name: 'Kaylah Mosciski' created_at: null updated_at: null - id: dc49fdf8-e4e4-33e6-a61f-be976379ee24 receipt_number: REC-8986 receiver_type: custom receiver: id: null name: 'Jazmyn Kiehn PhD' document: 559.161.997-32 payment: amount: 2796.94 amount_in_words: 'Valor por extenso de teste' method: check description: 'Voluptas neque earum tempore facere facilis.' issuer: name: Sauer-Grady document: 57.156.969/2225-38 issue: date: '2026-08-29' city: 'East Maurice' state: SC created_by: id: a2d092c9-4508-4273-bf35-5bbcee393fea name: 'Augustine Gutmann' created_at: null updated_at: null items: type: object properties: id: type: string example: c58cc5d6-2d23-3f39-922b-2ef02552968b receipt_number: type: string example: REC-3561 receiver_type: type: string example: custom receiver: type: object properties: id: type: string example: null nullable: true name: type: string example: 'Evalyn Prosacco Jr.' document: type: string example: 407.404.724-09 payment: type: object properties: amount: type: number example: 8851.16 amount_in_words: type: string example: 'Valor por extenso de teste' method: type: string example: check description: type: string example: 'Totam veritatis cumque fuga quia quaerat dolor.' issuer: type: object properties: name: type: string example: Kerluke-Reinger document: type: string example: 10.884.954/0570-40 issue: type: object properties: date: type: string example: '2026-09-02' city: type: string example: Maurineport state: type: string example: RS created_by: type: object properties: id: type: string example: a2d092c9-42e1-4856-a8a7-4ab7dfc7df51 name: type: string example: 'Kaylah Mosciski' 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: 2 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: f184d7d1-d2fb-3486-ac80-9cfdf2c53164 name: consequuntur display_name: 'Quo et aliquid dolorem odio.' - id: ffafa2da-74c5-3c59-a348-e3fc3dc3f5d5 name: harum display_name: 'Rem amet et et est.' 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: f184d7d1-d2fb-3486-ac80-9cfdf2c53164 name: consequuntur display_name: 'Quo et aliquid dolorem odio.' - id: ffafa2da-74c5-3c59-a348-e3fc3dc3f5d5 name: harum display_name: 'Rem amet et et est.' items: type: object properties: id: type: string example: f184d7d1-d2fb-3486-ac80-9cfdf2c53164 name: type: string example: consequuntur display_name: type: string example: 'Quo et aliquid dolorem odio.' 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: 0394d163-4ed1-3022-8a3e-a52cd480ca8c name: nulla-unde-cupiditate display_name: 'unde architecto impedit' created_at: null updated_at: null - id: 92817cb0-70aa-36b9-817b-2efd7075e269 name: non-aut display_name: 'corrupti id sed' 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: 0394d163-4ed1-3022-8a3e-a52cd480ca8c name: nulla-unde-cupiditate display_name: 'unde architecto impedit' created_at: null updated_at: null - id: 92817cb0-70aa-36b9-817b-2efd7075e269 name: non-aut display_name: 'corrupti id sed' created_at: null updated_at: null items: type: object properties: id: type: string example: 0394d163-4ed1-3022-8a3e-a52cd480ca8c name: type: string example: nulla-unde-cupiditate display_name: type: string example: 'unde architecto impedit' 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: 3300ee0f-3c17-395c-9292-6c23deb32e00 name: qui-necessitatibus display_name: 'qui dolorem beatae' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 3300ee0f-3c17-395c-9292-6c23deb32e00 name: type: string example: qui-necessitatibus display_name: type: string example: 'qui dolorem beatae' 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: 2347690e-3a92-381c-82fe-5bb5967659dc name: et-voluptatum display_name: 'incidunt nesciunt soluta' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 2347690e-3a92-381c-82fe-5bb5967659dc name: type: string example: et-voluptatum display_name: type: string example: 'incidunt nesciunt soluta' 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: - 326e0f4d-cbe1-3d0b-96c0-2ead5123e0ea 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: b0c87fd5-953c-3a01-baa0-6a4306fdb5a7 name: nobis-tempora-perferendis display_name: 'quae labore illo' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: b0c87fd5-953c-3a01-baa0-6a4306fdb5a7 name: type: string example: nobis-tempora-perferendis display_name: type: string example: 'quae labore illo' 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: - eddb0574-1e04-355e-ad34-9a251b077e90 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: 38eb12da-b350-3ab1-8c2c-9f15400332e7 name: 'Heitor Padrão Neto' created_at: null updated_at: null - id: 1a5a4150-0cd9-3708-b982-ad6b0f1ebcfc name: 'Dr. Daiane Karine Quintana' 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: 38eb12da-b350-3ab1-8c2c-9f15400332e7 name: 'Heitor Padrão Neto' created_at: null updated_at: null - id: 1a5a4150-0cd9-3708-b982-ad6b0f1ebcfc name: 'Dr. Daiane Karine Quintana' created_at: null updated_at: null items: type: object properties: id: type: string example: 38eb12da-b350-3ab1-8c2c-9f15400332e7 name: type: string example: 'Heitor Padrão Neto' 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: 89fe69c8-6ab2-3220-9c03-bafbe5c45ef0 name: 'Srta. Tainara Galhardo Ferraz Sobrinho' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 89fe69c8-6ab2-3220-9c03-bafbe5c45ef0 name: type: string example: 'Srta. Tainara Galhardo Ferraz Sobrinho' 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: is_epi description: '' example: false required: false schema: type: boolean description: '' example: false - 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: f568109a-8143-399f-8463-0b6b135b2d60 name: 'Sr. Nelson Dante de Arruda' is_epi: false created_at: null updated_at: null - id: 0a70f620-791b-358f-b929-d08f04f7aa3d name: 'Srta. Heloise Ayla Fernandes' is_epi: 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: f568109a-8143-399f-8463-0b6b135b2d60 name: 'Sr. Nelson Dante de Arruda' is_epi: false created_at: null updated_at: null - id: 0a70f620-791b-358f-b929-d08f04f7aa3d name: 'Srta. Heloise Ayla Fernandes' is_epi: false created_at: null updated_at: null items: type: object properties: id: type: string example: f568109a-8143-399f-8463-0b6b135b2d60 name: type: string example: 'Sr. Nelson Dante de Arruda' is_epi: 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: - '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' is_epi: type: boolean description: 'É família de EPI.' example: true 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: 087eac34-a0ef-390e-9f38-5e8758cb6406 name: 'Betina Pacheco Filho' is_epi: false created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 087eac34-a0ef-390e-9f38-5e8758cb6406 name: type: string example: 'Betina Pacheco Filho' is_epi: type: boolean example: false 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' is_epi: type: boolean description: 'É família de EPI.' example: true 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: nobis 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: 945edc19-0454-32f6-89f7-dc017db967ef name: 'Voluptas qui minus est.' description: null work: id: a2d092c9-dd4d-494e-bcfb-df7c7be6cf17 name: 'Marta Bezerra' user: id: a2d092c9-e1a0-407a-905e-e8ebd47f9978 name: 'Danyka Hickle' created_at: null updated_at: null - id: 96c0e40f-0ae1-3a1a-ab50-b678cc50b4ec name: 'Velit ea quasi error.' description: 'Consequatur corrupti natus aut nostrum. Alias recusandae eveniet minus. Dolores deleniti nihil dolorem quae sunt. Ad fugit est consequatur modi saepe.' work: id: a2d092c9-e623-4e94-9393-f84090692b04 name: 'Antonieta Lozano' user: id: a2d092c9-e902-41f4-b845-37d6c92d8dd6 name: 'Jamal Hansen V' 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: 945edc19-0454-32f6-89f7-dc017db967ef name: 'Voluptas qui minus est.' description: null work: id: a2d092c9-dd4d-494e-bcfb-df7c7be6cf17 name: 'Marta Bezerra' user: id: a2d092c9-e1a0-407a-905e-e8ebd47f9978 name: 'Danyka Hickle' created_at: null updated_at: null - id: 96c0e40f-0ae1-3a1a-ab50-b678cc50b4ec name: 'Velit ea quasi error.' description: 'Consequatur corrupti natus aut nostrum. Alias recusandae eveniet minus. Dolores deleniti nihil dolorem quae sunt. Ad fugit est consequatur modi saepe.' work: id: a2d092c9-e623-4e94-9393-f84090692b04 name: 'Antonieta Lozano' user: id: a2d092c9-e902-41f4-b845-37d6c92d8dd6 name: 'Jamal Hansen V' created_at: null updated_at: null items: type: object properties: id: type: string example: 945edc19-0454-32f6-89f7-dc017db967ef name: type: string example: 'Voluptas qui minus est.' description: type: string example: null nullable: true work: type: object properties: id: type: string example: a2d092c9-dd4d-494e-bcfb-df7c7be6cf17 name: type: string example: 'Marta Bezerra' user: type: object properties: id: type: string example: a2d092c9-e1a0-407a-905e-e8ebd47f9978 name: type: string example: 'Danyka Hickle' 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: 97bf8b83-68eb-3534-af52-eb28c086a299 nullable: true user_id: type: string description: 'Usuário. The uuid of an existing record in the users table.' example: 6d9850d8-7914-354b-a629-8af8a5abeb51 nullable: true responsible_id: type: string description: 'Responsável. The uuid of an existing record in the users table.' example: 53478844-d7b9-3b0e-8b80-b9441ab04c41 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: 31088112-7654-328d-b5c3-8f2e057d7deb 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: 21256181-6f4b-36de-8b14-f4d5f26fc489 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: 283b4750-62d4-31fa-a02c-6996214b59da name: 'Officiis consectetur.' description: 'Deleniti rem nesciunt blanditiis voluptas nostrum nemo. Cum occaecati consequatur totam expedita repellendus. Voluptate qui deleniti reiciendis quo et perspiciatis. Aut quasi veniam molestiae ut necessitatibus omnis.' work: id: a2d092c9-f1e7-4921-a695-f91ebc31b97a name: 'Fabiano Rezende Rios' user: id: a2d092c9-f534-42fb-8366-2ab33c015e74 name: 'Desmond Wunsch Sr.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 283b4750-62d4-31fa-a02c-6996214b59da name: type: string example: 'Officiis consectetur.' description: type: string example: 'Deleniti rem nesciunt blanditiis voluptas nostrum nemo. Cum occaecati consequatur totam expedita repellendus. Voluptate qui deleniti reiciendis quo et perspiciatis. Aut quasi veniam molestiae ut necessitatibus omnis.' work: type: object properties: id: type: string example: a2d092c9-f1e7-4921-a695-f91ebc31b97a name: type: string example: 'Fabiano Rezende Rios' user: type: object properties: id: type: string example: a2d092c9-f534-42fb-8366-2ab33c015e74 name: type: string example: 'Desmond Wunsch Sr.' 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: ee52bee7-bf1d-3f43-9d88-718fd5e194b9 product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: 7202bb56-62d9-38de-8249-5c3d379f66c7 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: nemo 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: 8e4d010a-2ae2-33d1-94a3-32cea1c39be0 product: id: a2d092ca-15c1-4cd0-8a20-9b76d46add14 name: 'Flávio Serra' code: PRD-341013 unit: id: a2d092ca-1339-43e6-b6d9-eb2838f3b64a name: 'Sr. Thiago André Roque' abbreviation: 'Ingrid Laiane de Souza' quantity: 152.8613 observation: null created_at: null updated_at: null - id: 78562933-bf84-34f6-aae8-10fabf9450d8 product: id: a2d092ca-2885-4788-8714-4ad6d418f612 name: 'Kamila Maiara Feliciano Neto' code: PRD-203166 unit: id: a2d092ca-26d3-40c5-a358-cd1d264281c1 name: 'Alessandro Ávila Vieira' abbreviation: 'Dr. Analu Godói' quantity: 355.5236 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: 8e4d010a-2ae2-33d1-94a3-32cea1c39be0 product: id: a2d092ca-15c1-4cd0-8a20-9b76d46add14 name: 'Flávio Serra' code: PRD-341013 unit: id: a2d092ca-1339-43e6-b6d9-eb2838f3b64a name: 'Sr. Thiago André Roque' abbreviation: 'Ingrid Laiane de Souza' quantity: 152.8613 observation: null created_at: null updated_at: null - id: 78562933-bf84-34f6-aae8-10fabf9450d8 product: id: a2d092ca-2885-4788-8714-4ad6d418f612 name: 'Kamila Maiara Feliciano Neto' code: PRD-203166 unit: id: a2d092ca-26d3-40c5-a358-cd1d264281c1 name: 'Alessandro Ávila Vieira' abbreviation: 'Dr. Analu Godói' quantity: 355.5236 observation: null created_at: null updated_at: null items: type: object properties: id: type: string example: 8e4d010a-2ae2-33d1-94a3-32cea1c39be0 product: type: object properties: id: type: string example: a2d092ca-15c1-4cd0-8a20-9b76d46add14 name: type: string example: 'Flávio Serra' code: type: string example: PRD-341013 unit: type: object properties: id: type: string example: a2d092ca-1339-43e6-b6d9-eb2838f3b64a name: type: string example: 'Sr. Thiago André Roque' abbreviation: type: string example: 'Ingrid Laiane de Souza' quantity: type: number example: 152.8613 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 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: 61684f25-c7e5-39a4-b06c-a962c82d997f 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: - c0582b5c-3972-38c1-8417-0014d8d4b974 items: type: string required: - items parameters: - in: path name: productQuantityList description: 'Product Quantity List UUID' example: cum 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: fugiat required: true schema: type: string - in: path name: item description: 'Product Quantity List Item UUID' example: beatae 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: af03c64a-1587-38d1-9b16-aac9449b615f product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: c1bc086d-8e1c-3d6b-ba4d-df2c8be95c26 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: voluptatem 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: 26bc3af5-e117-363e-9408-37a5be022320 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: cb9bad58-acf2-3a37-bbdd-34cd99d17c93 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: 7078b2ad-050a-3514-9398-f3ba523aa601 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: repellendus 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: 23cf8548-c359-3333-8454-b6ec3b0a9cf0 quantity: 30.7904 fulfilled_at: '2026-09-14T07:22:39.000000Z' created_at: null - id: c978aaf1-2b86-36be-9d52-6ecaa9000095 quantity: 28.7409 fulfilled_at: '2026-09-11T04:14:46.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: 23cf8548-c359-3333-8454-b6ec3b0a9cf0 quantity: 30.7904 fulfilled_at: '2026-09-14T07:22:39.000000Z' created_at: null - id: c978aaf1-2b86-36be-9d52-6ecaa9000095 quantity: 28.7409 fulfilled_at: '2026-09-11T04:14:46.000000Z' created_at: null items: type: object properties: id: type: string example: 23cf8548-c359-3333-8454-b6ec3b0a9cf0 quantity: type: number example: 30.7904 fulfilled_at: type: string example: '2026-09-14T07:22:39.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: et 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: 1501e5a2-5efb-33c8-9bbe-7a3bcaa35a2d product: id: a2d092cf-296b-40bd-bb16-8e948b341b85 name: 'Dr. Mariah Gonçalves Carrara' code: PRD-821055 unit: id: a2d092cf-27ae-42ee-9a2d-c50de7e23e88 name: 'Fabiano Denis Abreu Filho' abbreviation: 'Bernardo Mascarenhas Caldeira Jr.' quantity: 777.327 quantity_fulfilled: 0 quantity_pending: 777.327 is_fulfilled: false is_partially_fulfilled: false observation: 'Quia ut quia recusandae quo odio.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 1501e5a2-5efb-33c8-9bbe-7a3bcaa35a2d product: type: object properties: id: type: string example: a2d092cf-296b-40bd-bb16-8e948b341b85 name: type: string example: 'Dr. Mariah Gonçalves Carrara' code: type: string example: PRD-821055 unit: type: object properties: id: type: string example: a2d092cf-27ae-42ee-9a2d-c50de7e23e88 name: type: string example: 'Fabiano Denis Abreu Filho' abbreviation: type: string example: 'Bernardo Mascarenhas Caldeira Jr.' quantity: type: number example: 777.327 quantity_fulfilled: type: integer example: 0 quantity_pending: type: number example: 777.327 is_fulfilled: type: boolean example: false is_partially_fulfilled: type: boolean example: false observation: type: string example: 'Quia ut quia recusandae quo odio.' 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: 0aa5a0b7-9ab3-30ce-a67d-03704cf372f3 nullable: true parameters: - in: path name: id description: 'The ID of the item.' example: voluptatibus required: true schema: type: string - in: path name: item description: 'Product Request Item UUID' example: magnam 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: acda36b5-f31f-3679-9f81-e273a392a46e product: id: a2d092cf-40d4-49c9-a088-cbce2dde0a88 name: 'Michele Ornela Rezende' code: PRD-363671 unit: id: a2d092cf-3f83-431f-b33b-95ec48c9c380 name: 'James Delgado' abbreviation: 'Dr. Lorenzo Mauro Leal' quantity: 852.548 quantity_fulfilled: 0 quantity_pending: 852.548 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: f461e7dd-fa34-3c68-9e2d-3388c139223a product: id: a2d092cf-52d7-41f2-8cf5-0fb3b2ec2660 name: 'Sra. Nayara Catarina Matos Sobrinho' code: PRD-058197 unit: id: a2d092cf-519e-4365-8784-d49599e6b70a name: 'Jorge Escobar' abbreviation: 'Agatha Ferminiano Grego Sobrinho' quantity: 961.1007 quantity_fulfilled: 0 quantity_pending: 961.1007 is_fulfilled: false is_partially_fulfilled: false observation: 'Quia perferendis mollitia earum qui et voluptatem.' 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: acda36b5-f31f-3679-9f81-e273a392a46e product: id: a2d092cf-40d4-49c9-a088-cbce2dde0a88 name: 'Michele Ornela Rezende' code: PRD-363671 unit: id: a2d092cf-3f83-431f-b33b-95ec48c9c380 name: 'James Delgado' abbreviation: 'Dr. Lorenzo Mauro Leal' quantity: 852.548 quantity_fulfilled: 0 quantity_pending: 852.548 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: f461e7dd-fa34-3c68-9e2d-3388c139223a product: id: a2d092cf-52d7-41f2-8cf5-0fb3b2ec2660 name: 'Sra. Nayara Catarina Matos Sobrinho' code: PRD-058197 unit: id: a2d092cf-519e-4365-8784-d49599e6b70a name: 'Jorge Escobar' abbreviation: 'Agatha Ferminiano Grego Sobrinho' quantity: 961.1007 quantity_fulfilled: 0 quantity_pending: 961.1007 is_fulfilled: false is_partially_fulfilled: false observation: 'Quia perferendis mollitia earum qui et voluptatem.' created_at: null updated_at: null items: type: object properties: id: type: string example: acda36b5-f31f-3679-9f81-e273a392a46e product: type: object properties: id: type: string example: a2d092cf-40d4-49c9-a088-cbce2dde0a88 name: type: string example: 'Michele Ornela Rezende' code: type: string example: PRD-363671 unit: type: object properties: id: type: string example: a2d092cf-3f83-431f-b33b-95ec48c9c380 name: type: string example: 'James Delgado' abbreviation: type: string example: 'Dr. Lorenzo Mauro Leal' quantity: type: number example: 852.548 quantity_fulfilled: type: integer example: 0 quantity_pending: type: number example: 852.548 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: rem 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: 570901e4-7ce2-37cc-8233-a4adb88118dd product: id: a2d092cf-6913-4b75-b1fd-9c6f5645b1a8 name: 'Dr. Fábio Godói' code: PRD-538715 unit: id: a2d092cf-67ab-4b8f-9fd6-d79e1d640a27 name: 'Isaac Rezende Domingues Filho' abbreviation: 'Srta. Talita Queirós Jr.' quantity: 66.5781 quantity_fulfilled: 0 quantity_pending: 66.5781 is_fulfilled: false is_partially_fulfilled: false observation: 'Minima voluptatum aut dolore pariatur velit laboriosam.' created_at: null updated_at: null - id: 5595ce84-989d-3ad4-bbcd-12699eb029c1 product: id: a2d092cf-7a1c-45be-bc42-a5d83966dcc3 name: 'Dr. Marília Rocha Jr.' code: PRD-629666 unit: id: a2d092cf-78e7-44cc-880c-2999c10b8b5b name: 'Diana Toledo' abbreviation: 'Srta. Fabiana de Arruda Sobrinho' quantity: 879.2465 quantity_fulfilled: 0 quantity_pending: 879.2465 is_fulfilled: false is_partially_fulfilled: false observation: 'Explicabo ut sequi et voluptatibus ut.' created_at: null updated_at: null properties: data: type: array example: - id: 570901e4-7ce2-37cc-8233-a4adb88118dd product: id: a2d092cf-6913-4b75-b1fd-9c6f5645b1a8 name: 'Dr. Fábio Godói' code: PRD-538715 unit: id: a2d092cf-67ab-4b8f-9fd6-d79e1d640a27 name: 'Isaac Rezende Domingues Filho' abbreviation: 'Srta. Talita Queirós Jr.' quantity: 66.5781 quantity_fulfilled: 0 quantity_pending: 66.5781 is_fulfilled: false is_partially_fulfilled: false observation: 'Minima voluptatum aut dolore pariatur velit laboriosam.' created_at: null updated_at: null - id: 5595ce84-989d-3ad4-bbcd-12699eb029c1 product: id: a2d092cf-7a1c-45be-bc42-a5d83966dcc3 name: 'Dr. Marília Rocha Jr.' code: PRD-629666 unit: id: a2d092cf-78e7-44cc-880c-2999c10b8b5b name: 'Diana Toledo' abbreviation: 'Srta. Fabiana de Arruda Sobrinho' quantity: 879.2465 quantity_fulfilled: 0 quantity_pending: 879.2465 is_fulfilled: false is_partially_fulfilled: false observation: 'Explicabo ut sequi et voluptatibus ut.' created_at: null updated_at: null items: type: object properties: id: type: string example: 570901e4-7ce2-37cc-8233-a4adb88118dd product: type: object properties: id: type: string example: a2d092cf-6913-4b75-b1fd-9c6f5645b1a8 name: type: string example: 'Dr. Fábio Godói' code: type: string example: PRD-538715 unit: type: object properties: id: type: string example: a2d092cf-67ab-4b8f-9fd6-d79e1d640a27 name: type: string example: 'Isaac Rezende Domingues Filho' abbreviation: type: string example: 'Srta. Talita Queirós Jr.' quantity: type: number example: 66.5781 quantity_fulfilled: type: integer example: 0 quantity_pending: type: number example: 66.5781 is_fulfilled: type: boolean example: false is_partially_fulfilled: type: boolean example: false observation: type: string example: 'Minima voluptatum aut dolore pariatur velit laboriosam.' 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: rerum 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: afd0fd8c-411f-3c9e-9ca3-055a50478bb8 code: null name: 'Reprehenderit dolorem sint aliquam.' description: null work: id: a2d092cc-2270-4ddd-a09d-cb6bb594b72c name: 'Fernando Mascarenhas Pedrosa Filho' user: id: a2d092cc-25a5-4bec-b9da-b478d6cde642 name: 'Lesley Morar IV' status: id: a2d092cc-27bf-4b31-b2cf-44f5fdf2c1c2 slug: null name: null description: 'Srta. Ariane Oliveira Jr.' abbreviation: officia color: '#15347e' text_color: '#98101b' priority: medium priority_label: Média needed_at: '2026-10-14' approved_at: null rejection_reason: null created_at: null updated_at: null - id: 3e5a990f-4f97-3e59-b5f8-0c841b20f932 code: null name: 'Delectus omnis occaecati vel.' description: null work: id: a2d092cc-2c69-454c-a825-fbf98f7621f6 name: 'Sra. Laiane Agustina Maia Jr.' user: id: a2d092cc-2f40-48ab-9d58-1f8d0f5d7c01 name: 'Mckenna Tillman' status: id: a2d092cc-30f8-4d1f-b0aa-72b32ba28151 slug: null name: null description: 'Sr. Cezar Casanova Filho' abbreviation: non color: '#78b63d' text_color: '#ee6bf1' priority: urgent priority_label: Urgente needed_at: '2026-09-26' 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: afd0fd8c-411f-3c9e-9ca3-055a50478bb8 code: null name: 'Reprehenderit dolorem sint aliquam.' description: null work: id: a2d092cc-2270-4ddd-a09d-cb6bb594b72c name: 'Fernando Mascarenhas Pedrosa Filho' user: id: a2d092cc-25a5-4bec-b9da-b478d6cde642 name: 'Lesley Morar IV' status: id: a2d092cc-27bf-4b31-b2cf-44f5fdf2c1c2 slug: null name: null description: 'Srta. Ariane Oliveira Jr.' abbreviation: officia color: '#15347e' text_color: '#98101b' priority: medium priority_label: Média needed_at: '2026-10-14' approved_at: null rejection_reason: null created_at: null updated_at: null - id: 3e5a990f-4f97-3e59-b5f8-0c841b20f932 code: null name: 'Delectus omnis occaecati vel.' description: null work: id: a2d092cc-2c69-454c-a825-fbf98f7621f6 name: 'Sra. Laiane Agustina Maia Jr.' user: id: a2d092cc-2f40-48ab-9d58-1f8d0f5d7c01 name: 'Mckenna Tillman' status: id: a2d092cc-30f8-4d1f-b0aa-72b32ba28151 slug: null name: null description: 'Sr. Cezar Casanova Filho' abbreviation: non color: '#78b63d' text_color: '#ee6bf1' priority: urgent priority_label: Urgente needed_at: '2026-09-26' approved_at: null rejection_reason: null created_at: null updated_at: null items: type: object properties: id: type: string example: afd0fd8c-411f-3c9e-9ca3-055a50478bb8 code: type: string example: null nullable: true name: type: string example: 'Reprehenderit dolorem sint aliquam.' description: type: string example: null nullable: true work: type: object properties: id: type: string example: a2d092cc-2270-4ddd-a09d-cb6bb594b72c name: type: string example: 'Fernando Mascarenhas Pedrosa Filho' user: type: object properties: id: type: string example: a2d092cc-25a5-4bec-b9da-b478d6cde642 name: type: string example: 'Lesley Morar IV' status: type: object properties: id: type: string example: a2d092cc-27bf-4b31-b2cf-44f5fdf2c1c2 slug: type: string example: null nullable: true name: type: string example: null nullable: true description: type: string example: 'Srta. Ariane Oliveira Jr.' abbreviation: type: string example: officia color: type: string example: '#15347e' text_color: type: string example: '#98101b' priority: type: string example: medium priority_label: type: string example: Média needed_at: type: string example: '2026-10-14' 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: d02c2b99-aed4-3a1c-9264-89b8517bfaf9 nullable: true work_location_id: type: string description: 'Local da obra. The uuid of an existing record in the work_locations table.' example: 990ff336-93e7-3eea-a9a1-74470d565b54 nullable: true user_id: type: string description: 'Usuário. The uuid of an existing record in the users table.' example: 7f41ce9d-0b5e-3a13-a8c5-e42448b2b9ba nullable: true status_id: type: string description: 'Status. The uuid of an existing record in the statuses table.' example: 646687e3-956e-3196-b0e0-3c68c4af629e 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: 7663e6ae-73ac-38d4-90f8-33c77d1a6bba 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: 9c5f8345-3b72-3761-8ed4-c297373625ef work_location_id: type: string description: 'Local da obra. The uuid of an existing record in the work_locations table.' example: d6b9e842-7ce5-3eb0-a821-da3e211e367a nullable: true status_id: type: string description: 'Status. The uuid of an existing record in the statuses table.' example: ca29a13e-30b8-391a-8fdf-ec6f40f307d4 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: d66ab071-069a-3749-866f-78b6064124b0 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: e253c7fb-dd0d-3504-a1d6-5513ed0311c0 code: null name: 'Velit nulla vel suscipit dolor.' description: null work: id: a2d092cc-3a06-4dd3-9ad3-d9bfb8cfeda8 name: 'Sr. George Teles' user: id: a2d092cc-3d25-441c-a723-f4072a714161 name: 'Rose Streich V' status: id: a2d092cc-3ef9-44ef-b2c9-95ba5aee2baa slug: null name: null description: 'Paulo Feliciano Matias' abbreviation: dolores color: '#4a9b96' text_color: '#3b2536' priority: urgent priority_label: Urgente needed_at: '2026-10-20' approved_at: null rejection_reason: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: e253c7fb-dd0d-3504-a1d6-5513ed0311c0 code: type: string example: null nullable: true name: type: string example: 'Velit nulla vel suscipit dolor.' description: type: string example: null nullable: true work: type: object properties: id: type: string example: a2d092cc-3a06-4dd3-9ad3-d9bfb8cfeda8 name: type: string example: 'Sr. George Teles' user: type: object properties: id: type: string example: a2d092cc-3d25-441c-a723-f4072a714161 name: type: string example: 'Rose Streich V' status: type: object properties: id: type: string example: a2d092cc-3ef9-44ef-b2c9-95ba5aee2baa slug: type: string example: null nullable: true name: type: string example: null nullable: true description: type: string example: 'Paulo Feliciano Matias' abbreviation: type: string example: dolores color: type: string example: '#4a9b96' text_color: type: string example: '#3b2536' priority: type: string example: urgent priority_label: type: string example: Urgente needed_at: type: string example: '2026-10-20' 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: b13aba9a-647b-3db9-ab6e-16f2acfd9f6f work_location_id: type: string description: 'Local da obra. The uuid of an existing record in the work_locations table.' example: 9178eabe-977d-3e89-b76a-ce4148a0d2f7 nullable: true status_id: type: string description: 'Status. The uuid of an existing record in the statuses table.' example: 59e337af-58c3-34d7-9f81-15d0527e1df3 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: d7c91dfc-3c15-3bcb-aba5-2069308868f8 product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: 49b18c7e-e79d-3948-963e-ad9120d9364a 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: vero 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: 14ff89f6-4287-3cbf-b06f-2ea9e9ca1d29 product: id: a2d092cc-5ba9-4841-a73c-53786e9a1a24 name: 'Valentina de Freitas Verdugo Filho' code: PRD-651499 unit: id: a2d092cc-5a68-42ac-bfab-e3c42d436cbb name: 'Dr. Ketlin Medina Dominato Filho' abbreviation: 'Nicolas Alcantara Carrara' quantity: 892.1107 quantity_fulfilled: 0 quantity_pending: 892.1107 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: 5f9a074d-97b3-343e-bf4e-fa4c31ebedb7 product: id: a2d092cc-705a-4bb0-9991-5066b743bb50 name: 'Gabrielle Graziela Neves' code: PRD-675553 unit: id: a2d092cc-6d6c-4ea9-886c-bf6bb5df28ed name: 'Máximo Barros Jr.' abbreviation: 'Dr. Sergio Adriel Ramires Sobrinho' quantity: 834.8442 quantity_fulfilled: 0 quantity_pending: 834.8442 is_fulfilled: false is_partially_fulfilled: false observation: 'Est dolores eum possimus officia nihil repellat.' 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: 14ff89f6-4287-3cbf-b06f-2ea9e9ca1d29 product: id: a2d092cc-5ba9-4841-a73c-53786e9a1a24 name: 'Valentina de Freitas Verdugo Filho' code: PRD-651499 unit: id: a2d092cc-5a68-42ac-bfab-e3c42d436cbb name: 'Dr. Ketlin Medina Dominato Filho' abbreviation: 'Nicolas Alcantara Carrara' quantity: 892.1107 quantity_fulfilled: 0 quantity_pending: 892.1107 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: 5f9a074d-97b3-343e-bf4e-fa4c31ebedb7 product: id: a2d092cc-705a-4bb0-9991-5066b743bb50 name: 'Gabrielle Graziela Neves' code: PRD-675553 unit: id: a2d092cc-6d6c-4ea9-886c-bf6bb5df28ed name: 'Máximo Barros Jr.' abbreviation: 'Dr. Sergio Adriel Ramires Sobrinho' quantity: 834.8442 quantity_fulfilled: 0 quantity_pending: 834.8442 is_fulfilled: false is_partially_fulfilled: false observation: 'Est dolores eum possimus officia nihil repellat.' created_at: null updated_at: null items: type: object properties: id: type: string example: 14ff89f6-4287-3cbf-b06f-2ea9e9ca1d29 product: type: object properties: id: type: string example: a2d092cc-5ba9-4841-a73c-53786e9a1a24 name: type: string example: 'Valentina de Freitas Verdugo Filho' code: type: string example: PRD-651499 unit: type: object properties: id: type: string example: a2d092cc-5a68-42ac-bfab-e3c42d436cbb name: type: string example: 'Dr. Ketlin Medina Dominato Filho' abbreviation: type: string example: 'Nicolas Alcantara Carrara' quantity: type: number example: 892.1107 quantity_fulfilled: type: integer example: 0 quantity_pending: type: number example: 892.1107 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: dacba0ac-da38-39c3-b0fa-eee42631767e 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: - fd27195a-5b50-3708-8c05-a31b2409c807 items: type: string required: - items parameters: - in: path name: productRequest description: 'Product Request UUID' example: laboriosam 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: et 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: commodi 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: 7c50bf3f-d60d-3491-a6b6-d74c6a849a32 product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: f979bdc3-7017-3af3-81c5-fd3fb144077c 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: in 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 - in: query name: is_epi description: 'Filter by products whose family is flagged as EPI.' example: true required: false schema: type: boolean description: 'Filter by products whose family is flagged as EPI.' example: true - in: query name: has_epi_type description: 'Filter by products that already are an EPI type. Pass 0 to list only products still available to become one.' example: false required: false schema: type: boolean description: 'Filter by products that already are an EPI type. Pass 0 to list only products still available to become one.' example: false responses: 200: description: '' content: application/json: schema: type: object example: data: - id: e26548da-e6d8-3efb-a0b1-b38f516e572d name: 'Murilo Gusmão Galhardo Jr.' code: PRD-909227 stock: 27935744 product_family: id: a2d092c9-6c99-4300-87a6-89850e512c93 name: 'Taís Pereira Neto' product_brand: id: a2d092c9-6e52-43e0-8427-4baa651bcb70 name: 'Dr. Maurício Matheus da Rosa Filho' unit: id: a2d092c9-7027-42ff-8a81-2934e0b2d135 name: 'Graziela Carvalho' abbreviation: 'Sra. Cecília Suellen Pacheco Filho' image: id: null url: null epi_type: null description: 'Magnam quae qui aliquid officiis laboriosam.' created_at: null updated_at: null - id: 69bc64c1-920a-36d8-9faf-8bb047015e45 name: 'Dr. Thaís Rosana Queirós' code: PRD-882880 stock: 18 product_family: id: a2d092c9-742b-4a34-8f3d-b0de214b48a1 name: 'Michael Gael Quintana Sobrinho' product_brand: id: a2d092c9-759e-454e-9439-35d346e57389 name: 'Leonardo Cláudio de Oliveira Jr.' unit: id: a2d092c9-7722-44d8-b483-29ac0ed662f9 name: 'Sra. Rebeca Azevedo Jr.' abbreviation: 'Juliane Luiza Queirós' image: id: null url: null epi_type: null description: 'Non temporibus ipsum porro.' 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: e26548da-e6d8-3efb-a0b1-b38f516e572d name: 'Murilo Gusmão Galhardo Jr.' code: PRD-909227 stock: 27935744 product_family: id: a2d092c9-6c99-4300-87a6-89850e512c93 name: 'Taís Pereira Neto' product_brand: id: a2d092c9-6e52-43e0-8427-4baa651bcb70 name: 'Dr. Maurício Matheus da Rosa Filho' unit: id: a2d092c9-7027-42ff-8a81-2934e0b2d135 name: 'Graziela Carvalho' abbreviation: 'Sra. Cecília Suellen Pacheco Filho' image: id: null url: null epi_type: null description: 'Magnam quae qui aliquid officiis laboriosam.' created_at: null updated_at: null - id: 69bc64c1-920a-36d8-9faf-8bb047015e45 name: 'Dr. Thaís Rosana Queirós' code: PRD-882880 stock: 18 product_family: id: a2d092c9-742b-4a34-8f3d-b0de214b48a1 name: 'Michael Gael Quintana Sobrinho' product_brand: id: a2d092c9-759e-454e-9439-35d346e57389 name: 'Leonardo Cláudio de Oliveira Jr.' unit: id: a2d092c9-7722-44d8-b483-29ac0ed662f9 name: 'Sra. Rebeca Azevedo Jr.' abbreviation: 'Juliane Luiza Queirós' image: id: null url: null epi_type: null description: 'Non temporibus ipsum porro.' created_at: null updated_at: null items: type: object properties: id: type: string example: e26548da-e6d8-3efb-a0b1-b38f516e572d name: type: string example: 'Murilo Gusmão Galhardo Jr.' code: type: string example: PRD-909227 stock: type: integer example: 27935744 product_family: type: object properties: id: type: string example: a2d092c9-6c99-4300-87a6-89850e512c93 name: type: string example: 'Taís Pereira Neto' product_brand: type: object properties: id: type: string example: a2d092c9-6e52-43e0-8427-4baa651bcb70 name: type: string example: 'Dr. Maurício Matheus da Rosa Filho' unit: type: object properties: id: type: string example: a2d092c9-7027-42ff-8a81-2934e0b2d135 name: type: string example: 'Graziela Carvalho' abbreviation: type: string example: 'Sra. Cecília Suellen Pacheco Filho' image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true epi_type: type: string example: null nullable: true description: type: string example: 'Magnam quae qui aliquid officiis laboriosam.' 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: 1d2fd657-c87d-3bf7-9eaa-42c1ed11ba35 product_brand_id: type: string description: 'Marca do Produto. The uuid of an existing record in the product_brands table.' example: 2dc0ea48-845b-315c-8fea-e4bc5977a458 unit_id: type: string description: 'Unidade. The uuid of an existing record in the units table.' example: de8d50be-2ff5-3725-81e5-bfbf6d8502dc 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: b9f83569-5c27-30ca-9998-fb4c3f3e9e61 name: 'Srta. Stephany das Dores Filho' code: PRD-473827 stock: 9874 product_family: id: a2d092c9-8728-4de1-bd78-e4cbb51903ae name: 'Dayane Pena Pena Neto' product_brand: id: a2d092c9-8917-4431-9ab3-611290481efe name: 'Samuel Eric Roque' unit: id: a2d092c9-8b05-489b-924d-b58bbcd74f1b name: 'Isabelly Santacruz Neto' abbreviation: 'Lara Aguiar' image: id: null url: null epi_type: null description: 'Deserunt ut eos repellat recusandae.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: b9f83569-5c27-30ca-9998-fb4c3f3e9e61 name: type: string example: 'Srta. Stephany das Dores Filho' code: type: string example: PRD-473827 stock: type: integer example: 9874 product_family: type: object properties: id: type: string example: a2d092c9-8728-4de1-bd78-e4cbb51903ae name: type: string example: 'Dayane Pena Pena Neto' product_brand: type: object properties: id: type: string example: a2d092c9-8917-4431-9ab3-611290481efe name: type: string example: 'Samuel Eric Roque' unit: type: object properties: id: type: string example: a2d092c9-8b05-489b-924d-b58bbcd74f1b name: type: string example: 'Isabelly Santacruz Neto' abbreviation: type: string example: 'Lara Aguiar' image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true epi_type: type: string example: null nullable: true description: type: string example: 'Deserunt ut eos repellat recusandae.' 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: c40d3860-dbd1-3739-9de1-116dad1e6148 product_brand_id: type: string description: 'Marca do Produto. The uuid of an existing record in the product_brands table.' example: e0c17139-8fea-34bd-b9f9-a60157f41e59 unit_id: type: string description: 'Unidade. The uuid of an existing record in the units table.' example: 946beda7-37a5-3658-840a-82f79a9eec01 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: nesciunt 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: veritatis 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: fugit 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: 3aeda288-c354-30b6-a4cb-14431ed36ff5 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: aca1fd24-aa35-3c18-87e7-6cbf35a70a20 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: dd970e86-7aa1-3e43-b8ee-62e3ffd50249 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: f6daa585-8671-33bd-8014-1b8a4a6f13f5 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: 8f364613-feb6-395c-9a2c-f5e0d1fff6bd 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: 4b1d2b2c-6fe7-3b93-839b-69ceb226e2a1 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: 4b1d2b2c-6fe7-3b93-839b-69ceb226e2a1 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: 6449dd32-386f-38bd-8b25-df1cdfa6993f 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: 6449dd32-386f-38bd-8b25-df1cdfa6993f 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: b37ada67-7b4c-363e-818b-65d453327c09 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: b37ada67-7b4c-363e-818b-65d453327c09 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: 790a0a48-ddf7-3b82-87a5-89294ace96f2 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: 790a0a48-ddf7-3b82-87a5-89294ace96f2 nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 14248d40-5aa0-3151-a35d-41b0dbd057e1 name: 'Ut recusandae ut' description: 'Nobis cupiditate architecto nam veritatis provident id non.' current_version: 1 file: path: projects/63999263-f2cf-372a-be03-79db021a5d35.pdf size: '2102002' extension: pdf discipline: id: a2d092cf-8b21-4a3d-b760-6f38a0dc1075 name: Ut code: AND created_at: null updated_at: null - id: ce418db5-91fd-3302-8dcd-28841011d891 name: 'Rerum iure est' description: 'Veniam enim cum repudiandae est id.' current_version: 1 file: path: projects/b2b79bfe-41b9-3fa8-bbc9-c2860270258b.pdf size: '1735949' extension: pdf discipline: id: a2d092cf-8eb0-47cb-9e51-632e53ad9039 name: Aliquid code: VMA 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: 14248d40-5aa0-3151-a35d-41b0dbd057e1 name: 'Ut recusandae ut' description: 'Nobis cupiditate architecto nam veritatis provident id non.' current_version: 1 file: path: projects/63999263-f2cf-372a-be03-79db021a5d35.pdf size: '2102002' extension: pdf discipline: id: a2d092cf-8b21-4a3d-b760-6f38a0dc1075 name: Ut code: AND created_at: null updated_at: null - id: ce418db5-91fd-3302-8dcd-28841011d891 name: 'Rerum iure est' description: 'Veniam enim cum repudiandae est id.' current_version: 1 file: path: projects/b2b79bfe-41b9-3fa8-bbc9-c2860270258b.pdf size: '1735949' extension: pdf discipline: id: a2d092cf-8eb0-47cb-9e51-632e53ad9039 name: Aliquid code: VMA created_at: null updated_at: null items: type: object properties: id: type: string example: 14248d40-5aa0-3151-a35d-41b0dbd057e1 name: type: string example: 'Ut recusandae ut' description: type: string example: 'Nobis cupiditate architecto nam veritatis provident id non.' current_version: type: integer example: 1 file: type: object properties: path: type: string example: projects/63999263-f2cf-372a-be03-79db021a5d35.pdf size: type: string example: '2102002' extension: type: string example: pdf discipline: type: object properties: id: type: string example: a2d092cf-8b21-4a3d-b760-6f38a0dc1075 name: type: string example: Ut code: type: string example: AND 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: ec40f95d-0a77-3ce9-bb95-03d52508dfc4 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: c5024f3a-50b0-31ad-accd-18f6dd9eee03 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: 763ed673-926a-370d-916c-8660c154b862 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: 92110d66-c342-3e99-bd48-e8df826bfeca name: 'Quas voluptatem veniam' description: 'Dicta est quidem in cupiditate rerum optio dolor.' current_version: 1 file: path: projects/0699582d-0a45-3e12-869e-bc883d3ef7f1.pdf size: '4061509' extension: pdf discipline: id: a2d092cf-97c8-4b73-b15d-3e479eeb614a name: Eaque code: FUO created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 92110d66-c342-3e99-bd48-e8df826bfeca name: type: string example: 'Quas voluptatem veniam' description: type: string example: 'Dicta est quidem in cupiditate rerum optio dolor.' current_version: type: integer example: 1 file: type: object properties: path: type: string example: projects/0699582d-0a45-3e12-869e-bc883d3ef7f1.pdf size: type: string example: '4061509' extension: type: string example: pdf discipline: type: object properties: id: type: string example: a2d092cf-97c8-4b73-b15d-3e479eeb614a name: type: string example: Eaque code: type: string example: FUO 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: 059467a7-b690-334d-a8da-243b56727264 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: 40ea0800-ac62-3b0d-ba38-8fc6dd78378e 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: ca56b0a3-0b64-347e-9111-c086f99c4e9e 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: 39132652-ba8d-3b97-bd72-7b9e62c63d76 nullable: true parameters: - in: path name: id description: 'The ID of the project.' example: 12 required: true schema: type: integer - in: path name: project description: 'Project UUID' example: vero 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: animi 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: dolor 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: incidunt kit_uuid: type: string description: 'O campo value deve ser um UUID válido.' example: 107a9b0c-af6d-3aab-b930-5418bec5344f required: - employee - kit_uuid /api/reports/employee-sheet: get: summary: 'Generate employee sheet PDF' operationId: generateEmployeeSheetPDF description: 'Dispatches async PDF generation of the employee record. 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 required: - employee /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: voluptas required: false schema: type: string description: '' example: voluptas 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: 'Delectus repellendus dolor nihil laborum quis quae voluptates.' required: false schema: type: string description: '' example: 'Delectus repellendus dolor nihil laborum quis quae voluptates.' 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: - abd35571-4317-3791-b699-8c57d9b6d2b5 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: - abd35571-4317-3791-b699-8c57d9b6d2b5 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: - 73fd097b-9e15-3b17-a7cb-9593df992f40 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: - 73fd097b-9e15-3b17-a7cb-9593df992f40 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: - fdcee41c-3865-30c0-9772-00c5a7ecf4a4 required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - fdcee41c-3865-30c0-9772-00c5a7ecf4a4 items: type: string - in: query name: customers description: 'O campo value deve ser um UUID válido.' example: - c9c9f6e3-7332-3615-8287-c7d13ca492e6 required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - c9c9f6e3-7332-3615-8287-c7d13ca492e6 items: type: string - in: query name: suppliers description: 'O campo value deve ser um UUID válido.' example: - 65407993-e7e8-3dcd-8bd3-6c1c11702ea3 required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - 65407993-e7e8-3dcd-8bd3-6c1c11702ea3 items: type: string - in: query name: cash_session description: 'O campo value deve ser um UUID válido.' example: b9071b42-19b3-3e8c-89f3-e712da002fd1 required: false schema: type: string description: 'O campo value deve ser um UUID válido.' example: b9071b42-19b3-3e8c-89f3-e712da002fd1 nullable: true - in: query name: works description: 'O campo value deve ser um UUID válido.' example: - ab321ddc-10fc-3853-91f0-91054cb7f2ca required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - ab321ddc-10fc-3853-91f0-91054cb7f2ca 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: aliquam required: false schema: type: string description: '' example: aliquam 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: 'Earum molestiae eveniet quod est.' required: false schema: type: string description: '' example: 'Earum molestiae eveniet quod est.' 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: - afaf0b29-1039-3269-9174-176f0848739e 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: - afaf0b29-1039-3269-9174-176f0848739e 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: - 77697f11-5eb1-39e1-b499-9d740002f154 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: - 77697f11-5eb1-39e1-b499-9d740002f154 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: - 830c78cc-1121-35c2-b475-34991cfd27b0 required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - 830c78cc-1121-35c2-b475-34991cfd27b0 items: type: string - in: query name: customers description: 'O campo value deve ser um UUID válido.' example: - ee9eb383-bc56-3010-a081-4762734b3761 required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - ee9eb383-bc56-3010-a081-4762734b3761 items: type: string - in: query name: suppliers description: 'O campo value deve ser um UUID válido.' example: - 2df2a6b7-66cd-3d92-88b0-02cb2de318cc required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - 2df2a6b7-66cd-3d92-88b0-02cb2de318cc items: type: string - in: query name: cash_session description: 'O campo value deve ser um UUID válido.' example: 39e287a8-1dfe-33b1-a79b-6053156e8389 required: false schema: type: string description: 'O campo value deve ser um UUID válido.' example: 39e287a8-1dfe-33b1-a79b-6053156e8389 nullable: true - in: query name: works description: 'O campo value deve ser um UUID válido.' example: - ead6e5e1-0524-33a9-83d7-66d24761ad7d required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - ead6e5e1-0524-33a9-83d7-66d24761ad7d 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: 53bda803-4ff4-3f7e-90ae-c206873b3e29 name: 'libero dolor' slug: null description: null abbreviation: nku created_at: null updated_at: null - id: c03bdc2d-40ce-315e-a5fe-1367790d4f2c name: 'non at' slug: null description: null abbreviation: dbt 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: 53bda803-4ff4-3f7e-90ae-c206873b3e29 name: 'libero dolor' slug: null description: null abbreviation: nku created_at: null updated_at: null - id: c03bdc2d-40ce-315e-a5fe-1367790d4f2c name: 'non at' slug: null description: null abbreviation: dbt created_at: null updated_at: null items: type: object properties: id: type: string example: 53bda803-4ff4-3f7e-90ae-c206873b3e29 name: type: string example: 'libero dolor' slug: type: string example: null nullable: true description: type: string example: null nullable: true abbreviation: type: string example: nku 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: d182dcd7-ef91-33ed-ae37-f1d8f701dd57 name: 'cupiditate voluptatem' slug: null description: null abbreviation: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: d182dcd7-ef91-33ed-ae37-f1d8f701dd57 name: type: string example: 'cupiditate voluptatem' 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: 6 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: 33f03d23-2775-3818-9404-f77825c90172 name: 'Mr. Willard Douglas II' username: csteuber email: frami.eli@example.com certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: 9b1b232e-4192-3872-b3da-b1f65787751e name: 'Mr. Jaycee Murazik' username: nikolaus.marie email: ppouros@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: 33f03d23-2775-3818-9404-f77825c90172 name: 'Mr. Willard Douglas II' username: csteuber email: frami.eli@example.com certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: 9b1b232e-4192-3872-b3da-b1f65787751e name: 'Mr. Jaycee Murazik' username: nikolaus.marie email: ppouros@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: 33f03d23-2775-3818-9404-f77825c90172 name: type: string example: 'Mr. Willard Douglas II' username: type: string example: csteuber email: type: string example: frami.eli@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: - 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: - 2d305ff8-4e9d-3263-b9eb-8a4e25948cbb 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: - 7242e9f5-3b12-336e-a11b-6e6df3bf20ee 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: - a03463e3-73af-3ed2-b119-a9839e7a03fe 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: 'laboriosam cupiditate' slug: enim-dolorem-consequatur-similique-recusandae-tempore - name: 'molestiae vitae' slug: velit-asperiores-alias-aut-qui-eum-ut-qui properties: data: type: array example: - name: 'laboriosam cupiditate' slug: enim-dolorem-consequatur-similique-recusandae-tempore - name: 'molestiae vitae' slug: velit-asperiores-alias-aut-qui-eum-ut-qui items: type: object properties: name: type: string example: 'laboriosam cupiditate' slug: type: string example: enim-dolorem-consequatur-similique-recusandae-tempore 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: 56ce5661-d7dc-351f-b743-ea78f4016b46 slug: null name: null description: 'Gael de Aguiar' abbreviation: laudantium color: '#329b30' text_color: '#6bf5a6' module: name: 'Solicitação de Produtos' slug: product_request created_at: null updated_at: null - id: ad705c8e-675e-3f75-9266-8f2a5d536683 slug: null name: null description: 'Srta. Noemi Duarte Godói Jr.' abbreviation: dolore color: '#739ef8' text_color: '#5e47f6' 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: 56ce5661-d7dc-351f-b743-ea78f4016b46 slug: null name: null description: 'Gael de Aguiar' abbreviation: laudantium color: '#329b30' text_color: '#6bf5a6' module: name: 'Solicitação de Produtos' slug: product_request created_at: null updated_at: null - id: ad705c8e-675e-3f75-9266-8f2a5d536683 slug: null name: null description: 'Srta. Noemi Duarte Godói Jr.' abbreviation: dolore color: '#739ef8' text_color: '#5e47f6' created_at: null updated_at: null items: type: object properties: id: type: string example: 56ce5661-d7dc-351f-b743-ea78f4016b46 slug: type: string example: null nullable: true name: type: string example: null nullable: true description: type: string example: 'Gael de Aguiar' abbreviation: type: string example: laudantium color: type: string example: '#329b30' text_color: type: string example: '#6bf5a6' 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 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: 0fa35de4-fbb6-3913-aa25-ccc88f9f2431 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: 345c4f71-5d2a-3df0-9209-aa35b379093b slug: null name: null description: 'Sandra Rivera Martines Jr.' abbreviation: soluta color: '#ae8da7' text_color: '#e45762' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 345c4f71-5d2a-3df0-9209-aa35b379093b slug: type: string example: null nullable: true name: type: string example: null nullable: true description: type: string example: 'Sandra Rivera Martines Jr.' abbreviation: type: string example: soluta color: type: string example: '#ae8da7' text_color: type: string example: '#e45762' 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: 0121123b-c93a-3830-a817-e69316077b66 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: a3128cce-51c0-391f-ad2e-f82db91e5853 quantity: 337.5403 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null - id: 094ea16c-d36e-306a-a146-9c884910a48b quantity: 771.1087 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null properties: data: type: array example: - id: a3128cce-51c0-391f-ad2e-f82db91e5853 quantity: 337.5403 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null - id: 094ea16c-d36e-306a-a146-9c884910a48b quantity: 771.1087 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: a3128cce-51c0-391f-ad2e-f82db91e5853 quantity: type: number example: 337.5403 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: 71a32dfb-a347-3fb3-875c-d69a2b79b1ea name: 'Estoque Beltrão-Burgos' module: work is_active: true is_main: false created_at: null updated_at: null - id: 79ccad25-b2a2-34ea-b3fe-3e68132fb8f2 name: 'Estoque Padilha e Cordeiro e Associados' 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: 71a32dfb-a347-3fb3-875c-d69a2b79b1ea name: 'Estoque Beltrão-Burgos' module: work is_active: true is_main: false created_at: null updated_at: null - id: 79ccad25-b2a2-34ea-b3fe-3e68132fb8f2 name: 'Estoque Padilha e Cordeiro e Associados' module: work is_active: true is_main: false created_at: null updated_at: null items: type: object properties: id: type: string example: 71a32dfb-a347-3fb3-875c-d69a2b79b1ea name: type: string example: 'Estoque Beltrão-Burgos' 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: 86e38500-541a-3541-beda-57fcf4db7df1 name: 'Estoque Tamoio-Serrano' module: work is_active: true is_main: false created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 86e38500-541a-3541-beda-57fcf4db7df1 name: type: string example: 'Estoque Tamoio-Serrano' 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: 06069441-2f50-3ff8-866f-e3aced9f25fb name: 'Estoque Bonilha-Ramos' module: work is_active: true is_main: false created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 06069441-2f50-3ff8-866f-e3aced9f25fb name: type: string example: 'Estoque Bonilha-Ramos' 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: 4ab7ffa0-fd53-310a-af4b-9979dd5b949a name: 'Estoque Escobar 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: 4ab7ffa0-fd53-310a-af4b-9979dd5b949a name: type: string example: 'Estoque Escobar 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 put: summary: 'Update stock' operationId: updateStock description: 'Updates an existing stock' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 522b2932-6b5b-3b55-8a9b-88f236834fb6 name: 'Estoque Saito S.A.' module: work is_active: true is_main: false created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 522b2932-6b5b-3b55-8a9b-88f236834fb6 name: type: string example: 'Estoque Saito S.A.' 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: 1eaa357f-f839-3e93-930f-0e9dc0e4cf82 quantity: 957.3054 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null - id: ee3d70e5-7603-3e11-abcc-2e8ee5edc90f quantity: 578.3346 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: 1eaa357f-f839-3e93-930f-0e9dc0e4cf82 quantity: 957.3054 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null - id: ee3d70e5-7603-3e11-abcc-2e8ee5edc90f quantity: 578.3346 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: 1eaa357f-f839-3e93-930f-0e9dc0e4cf82 quantity: type: number example: 957.3054 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: 06117300-719e-3b9a-9641-46acdfc3ac62 quantity: 610.3307 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: 06117300-719e-3b9a-9641-46acdfc3ac62 quantity: type: number example: 610.3307 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: dolorum 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: 0ed7e899-d014-3781-9f74-748005c719c3 code: MOV-835799 type: vencido type_name: EXPIRED is_entry: false is_exit: true quantity: 25.0371 previous_quantity: 52.1502 new_quantity: 27.1131 reason: null movement_date: '2026-09-19T06:16:42.000000Z' created_at: null - id: 8d92ff8c-5b3e-31e0-a434-13731d400c39 code: MOV-743389 type: 'saída transferência' type_name: TRANSFER_OUT is_entry: false is_exit: true quantity: 58.7713 previous_quantity: 79.2094 new_quantity: 20.4381 reason: null movement_date: '2026-08-26T16:44:09.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: 0ed7e899-d014-3781-9f74-748005c719c3 code: MOV-835799 type: vencido type_name: EXPIRED is_entry: false is_exit: true quantity: 25.0371 previous_quantity: 52.1502 new_quantity: 27.1131 reason: null movement_date: '2026-09-19T06:16:42.000000Z' created_at: null - id: 8d92ff8c-5b3e-31e0-a434-13731d400c39 code: MOV-743389 type: 'saída transferência' type_name: TRANSFER_OUT is_entry: false is_exit: true quantity: 58.7713 previous_quantity: 79.2094 new_quantity: 20.4381 reason: null movement_date: '2026-08-26T16:44:09.000000Z' created_at: null items: type: object properties: id: type: string example: 0ed7e899-d014-3781-9f74-748005c719c3 code: type: string example: MOV-835799 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: 25.0371 previous_quantity: type: number example: 52.1502 new_quantity: type: number example: 27.1131 reason: type: string example: null nullable: true movement_date: type: string example: '2026-09-19T06:16:42.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: 70ebbb01-dbed-31e9-a3d1-37c84aff845c code: MOV-399486 type: compra type_name: PURCHASE is_entry: true is_exit: false quantity: 55.3783 previous_quantity: 529.9587 new_quantity: 585.337 reason: null movement_date: '2026-08-28T08:21:10.000000Z' created_at: null properties: data: type: object properties: id: type: string example: 70ebbb01-dbed-31e9-a3d1-37c84aff845c code: type: string example: MOV-399486 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: 55.3783 previous_quantity: type: number example: 529.9587 new_quantity: type: number example: 585.337 reason: type: string example: null nullable: true movement_date: type: string example: '2026-08-28T08:21:10.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: c4d72ec7-186c-31d4-a498-5c52feb859d2 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: d1b19267-c3f3-3043-98e1-43b642fd9087 code: MOV-161091 type: 'ajuste entrada' type_name: ADJUSTMENT_IN is_entry: true is_exit: false quantity: 51.0205 previous_quantity: 582.6054 new_quantity: 633.6259 reason: null movement_date: '2026-09-22T02:00:21.000000Z' created_at: null properties: data: type: object properties: id: type: string example: d1b19267-c3f3-3043-98e1-43b642fd9087 code: type: string example: MOV-161091 type: type: string example: 'ajuste entrada' type_name: type: string example: ADJUSTMENT_IN is_entry: type: boolean example: true is_exit: type: boolean example: false quantity: type: number example: 51.0205 previous_quantity: type: number example: 582.6054 new_quantity: type: number example: 633.6259 reason: type: string example: null nullable: true movement_date: type: string example: '2026-09-22T02:00:21.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: ee41c45f-2dc4-3a6d-8af5-f499c8ba9b05 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: 4f7fffb2-3d86-3327-8b44-8661f6b638d4 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: 2c30bbf2-cf89-3107-9b3c-2c11dcd99423 code: MOV-972221 type: alocação type_name: ALLOCATION is_entry: true is_exit: false quantity: 77.3446 previous_quantity: 529.5263 new_quantity: 606.8709 reason: 'Enim et nemo quibusdam voluptatibus nihil dolorem.' movement_date: '2026-09-05T23:22:55.000000Z' created_at: null properties: data: type: object properties: id: type: string example: 2c30bbf2-cf89-3107-9b3c-2c11dcd99423 code: type: string example: MOV-972221 type: type: string example: alocação type_name: type: string example: ALLOCATION is_entry: type: boolean example: true is_exit: type: boolean example: false quantity: type: number example: 77.3446 previous_quantity: type: number example: 529.5263 new_quantity: type: number example: 606.8709 reason: type: string example: 'Enim et nemo quibusdam voluptatibus nihil dolorem.' movement_date: type: string example: '2026-09-05T23:22:55.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: 0bb8fb93-984a-3d5a-85ba-540b9ab86f1f 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: dd38ff88-f56f-398d-9e04-3f34d4ac3941 code: MOV-346199 type: venda type_name: SALE is_entry: false is_exit: true quantity: 98.7009 previous_quantity: 475.1323 new_quantity: 376.4314 reason: null movement_date: '2026-09-10T09:58:34.000000Z' created_at: null properties: data: type: object properties: id: type: string example: dd38ff88-f56f-398d-9e04-3f34d4ac3941 code: type: string example: MOV-346199 type: type: string example: venda type_name: type: string example: SALE is_entry: type: boolean example: false is_exit: type: boolean example: true quantity: type: number example: 98.7009 previous_quantity: type: number example: 475.1323 new_quantity: type: number example: 376.4314 reason: type: string example: null nullable: true movement_date: type: string example: '2026-09-10T09:58:34.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: 4f526700-f614-3b53-be2a-0c72c0e98bbb 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: 9cde4315-f0eb-3a54-8d8b-ccc5920ebb02 code: MOV-868888 type: venda type_name: SALE is_entry: false is_exit: true quantity: 43.0371 previous_quantity: 122.6035 new_quantity: 79.5664 reason: 'Et eaque consequatur voluptatem et.' movement_date: '2026-09-09T03:55:45.000000Z' created_at: null properties: data: type: object properties: id: type: string example: 9cde4315-f0eb-3a54-8d8b-ccc5920ebb02 code: type: string example: MOV-868888 type: type: string example: venda type_name: type: string example: SALE is_entry: type: boolean example: false is_exit: type: boolean example: true quantity: type: number example: 43.0371 previous_quantity: type: number example: 122.6035 new_quantity: type: number example: 79.5664 reason: type: string example: 'Et eaque consequatur voluptatem et.' movement_date: type: string example: '2026-09-09T03:55:45.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: 9cd4cb41-9385-3fcf-b2db-f75030dd619b name: 'Sra. Melissa Estrada Cruz' email: ferminiano.raissa@example.com phone: '(99) 99277-7953' document: 10.457.868/0001-79 type: pf responsible: 'Dr. Renan Ícaro Vega Jr.' image: id: null url: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null - id: 03eb181d-e509-3e79-be4f-603d10ddbd82 name: 'Luan Quintana Aranda' email: iasmin08@example.net phone: '(81) 95427-7336' document: 26.376.083/0001-01 type: pf responsible: 'Sra. Naiara Rezende' 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: 9cd4cb41-9385-3fcf-b2db-f75030dd619b name: 'Sra. Melissa Estrada Cruz' email: ferminiano.raissa@example.com phone: '(99) 99277-7953' document: 10.457.868/0001-79 type: pf responsible: 'Dr. Renan Ícaro Vega Jr.' image: id: null url: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null - id: 03eb181d-e509-3e79-be4f-603d10ddbd82 name: 'Luan Quintana Aranda' email: iasmin08@example.net phone: '(81) 95427-7336' document: 26.376.083/0001-01 type: pf responsible: 'Sra. Naiara Rezende' 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: 9cd4cb41-9385-3fcf-b2db-f75030dd619b name: type: string example: 'Sra. Melissa Estrada Cruz' email: type: string example: ferminiano.raissa@example.com phone: type: string example: '(99) 99277-7953' document: type: string example: 10.457.868/0001-79 type: type: string example: pf responsible: type: string example: 'Dr. Renan Ícaro Vega Jr.' 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: 66c65c6c-b0bd-3cb5-a206-9f4df1a71212 name: 'Norma Eloá Aranda Sobrinho' email: ldesouza@example.org phone: '(61) 2584-8529' document: 08.450.880/0001-00 type: pf responsible: 'Dr. Mateus Furtado' 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: 66c65c6c-b0bd-3cb5-a206-9f4df1a71212 name: type: string example: 'Norma Eloá Aranda Sobrinho' email: type: string example: ldesouza@example.org phone: type: string example: '(61) 2584-8529' document: type: string example: 08.450.880/0001-00 type: type: string example: pf responsible: type: string example: 'Dr. Mateus Furtado' 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: 8786f2f5-f4cb-3a2e-929f-4ba643e30c34 name: 'Dr. Thales Ortiz' description: 'Aut suscipit rerum earum nihil. Tenetur vel in autem. Ducimus aliquid recusandae aut laudantium. Odio consequatur maiores rerum eligendi veritatis perspiciatis illo dolorem.' type: depósito - id: 81b1165a-793f-3fcb-9c71-ff829221cbab name: 'Willian Fernandes Jr.' description: 'Accusantium beatae dolore et ipsum consequuntur. Quia modi beatae quam velit. Similique aliquid labore deleniti praesentium qui cupiditate et.' type: entrada 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: 8786f2f5-f4cb-3a2e-929f-4ba643e30c34 name: 'Dr. Thales Ortiz' description: 'Aut suscipit rerum earum nihil. Tenetur vel in autem. Ducimus aliquid recusandae aut laudantium. Odio consequatur maiores rerum eligendi veritatis perspiciatis illo dolorem.' type: depósito - id: 81b1165a-793f-3fcb-9c71-ff829221cbab name: 'Willian Fernandes Jr.' description: 'Accusantium beatae dolore et ipsum consequuntur. Quia modi beatae quam velit. Similique aliquid labore deleniti praesentium qui cupiditate et.' type: entrada items: type: object properties: id: type: string example: 8786f2f5-f4cb-3a2e-929f-4ba643e30c34 name: type: string example: 'Dr. Thales Ortiz' description: type: string example: 'Aut suscipit rerum earum nihil. Tenetur vel in autem. Ducimus aliquid recusandae aut laudantium. Odio consequatur maiores rerum eligendi veritatis perspiciatis illo dolorem.' type: type: string example: depósito 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: 3cb6ed2c-306e-31a7-9767-31a605192cc5 name: 'Maria Delgado' description: 'Facere dignissimos animi accusamus numquam aut perspiciatis esse. Et maxime quia sed itaque. Voluptates in tenetur dicta minima explicabo. Quos ut ut ut.' type: saída properties: data: type: object properties: id: type: string example: 3cb6ed2c-306e-31a7-9767-31a605192cc5 name: type: string example: 'Maria Delgado' description: type: string example: 'Facere dignissimos animi accusamus numquam aut perspiciatis esse. Et maxime quia sed itaque. Voluptates in tenetur dicta minima explicabo. Quos ut ut ut.' type: type: string example: saída 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: velit required: true schema: type: string /api/admin/tutorial-modules: get: summary: 'Listar módulos' operationId: listarMdulos description: 'Lista o catálogo de módulos de tutorial' 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: 'Busca por nome ou descrição.' example: Financeiro required: false schema: type: string description: 'Busca por nome ou descrição.' example: Financeiro nullable: true - in: query name: is_active description: 'Filtra por módulos ativos ou inativos.' example: true required: false schema: type: boolean description: 'Filtra por módulos ativos ou inativos.' example: true nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: cf264d3e-52da-300c-83b9-f5ae410cddaf name: 'Ullam repellat' slug: ullam-repellat-812892 description: 'Facilis et ut et ducimus aut sed quam.' sort_order: 0 is_active: true created_at: null updated_at: null - id: e9efa9c5-b0a8-3a4e-9e49-5696b3b13bfe name: 'Voluptatem consequuntur' slug: voluptatem-consequuntur-482477 description: 'Iure dolor quia quidem ratione nobis.' sort_order: 0 is_active: true 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: cf264d3e-52da-300c-83b9-f5ae410cddaf name: 'Ullam repellat' slug: ullam-repellat-812892 description: 'Facilis et ut et ducimus aut sed quam.' sort_order: 0 is_active: true created_at: null updated_at: null - id: e9efa9c5-b0a8-3a4e-9e49-5696b3b13bfe name: 'Voluptatem consequuntur' slug: voluptatem-consequuntur-482477 description: 'Iure dolor quia quidem ratione nobis.' sort_order: 0 is_active: true created_at: null updated_at: null items: type: object properties: id: type: string example: cf264d3e-52da-300c-83b9-f5ae410cddaf name: type: string example: 'Ullam repellat' slug: type: string example: ullam-repellat-812892 description: type: string example: 'Facilis et ut et ducimus aut sed quam.' sort_order: type: integer example: 0 is_active: type: boolean example: 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: - 'Tutoriais (administração)' post: summary: 'Cadastrar módulo' operationId: cadastrarMdulo description: 'Cria um módulo no catálogo. O slug é derivado do nome quando não informado.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: dd752d9a-7f57-36bc-a1c8-8759005c09d7 name: 'Praesentium amet' slug: praesentium-amet-500595 description: 'Velit deserunt eligendi qui earum assumenda molestias.' sort_order: 0 is_active: true created_at: null updated_at: null properties: data: type: object properties: id: type: string example: dd752d9a-7f57-36bc-a1c8-8759005c09d7 name: type: string example: 'Praesentium amet' slug: type: string example: praesentium-amet-500595 description: type: string example: 'Velit deserunt eligendi qui earum assumenda molestias.' sort_order: type: integer example: 0 is_active: type: boolean example: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Tutoriais (administração)' 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: 'Identificador. O campo value não pode ser superior a 255 caracteres.' example: 'Example Slug' nullable: true description: type: string description: Descrição. example: 'Example Description' nullable: true sort_order: type: integer description: 'Ordem. O campo value deve ser pelo menos 0.' example: 1 is_active: type: boolean description: Ativo. example: true required: - name '/api/admin/tutorial-modules/{tutorialModule}': get: summary: 'Visualizar módulo' operationId: visualizarMdulo description: 'Detalhe de um módulo do catálogo' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: b744ed58-c05d-37c7-9b37-a93284e9685f name: 'Excepturi odit' slug: excepturi-odit-448570 description: 'Et nisi nobis earum qui aut ratione quae.' sort_order: 0 is_active: true created_at: null updated_at: null properties: data: type: object properties: id: type: string example: b744ed58-c05d-37c7-9b37-a93284e9685f name: type: string example: 'Excepturi odit' slug: type: string example: excepturi-odit-448570 description: type: string example: 'Et nisi nobis earum qui aut ratione quae.' sort_order: type: integer example: 0 is_active: type: boolean example: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Tutoriais (administração)' put: summary: 'Atualizar módulo' operationId: atualizarMdulo description: 'Atualiza um módulo do catálogo' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: a114e5e3-f78f-313f-9216-e81404ec9a9a name: 'Modi nesciunt' slug: modi-nesciunt-718478 description: 'Amet eos ipsam fugiat aperiam.' sort_order: 0 is_active: true created_at: null updated_at: null properties: data: type: object properties: id: type: string example: a114e5e3-f78f-313f-9216-e81404ec9a9a name: type: string example: 'Modi nesciunt' slug: type: string example: modi-nesciunt-718478 description: type: string example: 'Amet eos ipsam fugiat aperiam.' sort_order: type: integer example: 0 is_active: type: boolean example: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Tutoriais (administração)' 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: 'Identificador. O campo value não pode ser superior a 255 caracteres.' example: 'Example Slug' nullable: true description: type: string description: Descrição. example: 'Example Description' nullable: true sort_order: type: integer description: 'Ordem. O campo value deve ser pelo menos 0.' example: 1 is_active: type: boolean description: Ativo. example: true delete: summary: 'Remover módulo' operationId: removerMdulo description: 'Remove o módulo e, junto, os tutoriais que pertenciam a ele' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Tutoriais (administração)' parameters: - in: path name: tutorialModule description: 'UUID do módulo' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string /api/admin/tutorials: get: summary: 'Listar tutoriais' operationId: listarTutoriais description: 'Lista os tutoriais em qualquer status, para quem administra' 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: 'Busca por título ou descrição.' example: 'ordem de serviço' required: false schema: type: string description: 'Busca por título ou descrição.' example: 'ordem de serviço' nullable: true - in: query name: module_id description: 'Filtra pelo UUID do módulo. O campo value deve ser um UUID válido. The uuid of an existing record in the tutorial_modules table.' example: b82107a0-fa59-323f-b34e-4b5481003f78 required: false schema: type: string description: 'Filtra pelo UUID do módulo. O campo value deve ser um UUID válido. The uuid of an existing record in the tutorial_modules table.' example: b82107a0-fa59-323f-b34e-4b5481003f78 nullable: true - in: query name: sector_id description: 'Filtra pelo UUID do setor vinculado. O campo value deve ser um UUID válido. The uuid of an existing record in the sectors table.' example: 539de693-92f0-3800-b63e-f2da5b16ac4b required: false schema: type: string description: 'Filtra pelo UUID do setor vinculado. O campo value deve ser um UUID válido. The uuid of an existing record in the sectors table.' example: 539de693-92f0-3800-b63e-f2da5b16ac4b nullable: true - in: query name: status description: 'Filtra por status (draft ou published).' example: published required: false schema: type: string description: 'Filtra por status (draft ou published).' example: published enum: - draft - published nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: f9d14e03-3690-3510-b6ed-82196ce5be6b title: 'Minima fuga voluptatum fugit' description: 'Et exercitationem illo eius culpa.' status: draft published_at: null sort_order: 0 module: id: a2d092d2-1af2-4324-8aee-c0ef3d6e9b18 name: 'Et iure' slug: et-iure-365854 created_at: null updated_at: null - id: b06e83d4-96d9-36c3-9c46-2969f4205f7c title: 'Deserunt quod nostrum voluptas' description: 'Dolores sunt nulla recusandae sapiente officiis eveniet sapiente.' status: draft published_at: null sort_order: 0 module: id: a2d092d2-1edb-4996-b58a-da5cd81c2a94 name: 'Tempora nostrum' slug: tempora-nostrum-655623 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: f9d14e03-3690-3510-b6ed-82196ce5be6b title: 'Minima fuga voluptatum fugit' description: 'Et exercitationem illo eius culpa.' status: draft published_at: null sort_order: 0 module: id: a2d092d2-1af2-4324-8aee-c0ef3d6e9b18 name: 'Et iure' slug: et-iure-365854 created_at: null updated_at: null - id: b06e83d4-96d9-36c3-9c46-2969f4205f7c title: 'Deserunt quod nostrum voluptas' description: 'Dolores sunt nulla recusandae sapiente officiis eveniet sapiente.' status: draft published_at: null sort_order: 0 module: id: a2d092d2-1edb-4996-b58a-da5cd81c2a94 name: 'Tempora nostrum' slug: tempora-nostrum-655623 created_at: null updated_at: null items: type: object properties: id: type: string example: f9d14e03-3690-3510-b6ed-82196ce5be6b title: type: string example: 'Minima fuga voluptatum fugit' description: type: string example: 'Et exercitationem illo eius culpa.' status: type: string example: draft published_at: type: string example: null nullable: true sort_order: type: integer example: 0 module: type: object properties: id: type: string example: a2d092d2-1af2-4324-8aee-c0ef3d6e9b18 name: type: string example: 'Et iure' slug: type: string example: et-iure-365854 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: - 'Tutoriais (administração)' post: summary: 'Cadastrar tutorial' operationId: cadastrarTutorial description: 'Cria um tutorial. Nasce como rascunho e só aparece na central depois de publicado.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: 6e366148-04a0-3301-a462-e5967eb64698 title: 'Repudiandae sit voluptas et' description: 'Quasi sed quos non sunt.' status: draft published_at: null sort_order: 0 module: id: a2d092d2-28a5-4c9a-a42f-51f5cf0edbd7 name: 'Nesciunt quia' slug: nesciunt-quia-894500 created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 6e366148-04a0-3301-a462-e5967eb64698 title: type: string example: 'Repudiandae sit voluptas et' description: type: string example: 'Quasi sed quos non sunt.' status: type: string example: draft published_at: type: string example: null nullable: true sort_order: type: integer example: 0 module: type: object properties: id: type: string example: a2d092d2-28a5-4c9a-a42f-51f5cf0edbd7 name: type: string example: 'Nesciunt quia' slug: type: string example: nesciunt-quia-894500 created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Tutoriais (administração)' requestBody: required: true content: application/json: schema: type: object properties: module_id: type: string description: 'Módulo. O campo value deve ser um UUID válido. The uuid of an existing record in the tutorial_modules table.' example: eb0f0111-0c14-39d4-bee7-6c081386a531 title: type: string description: 'Título. O campo value não pode ser superior a 255 caracteres.' example: 'Example Title' description: type: string description: Descrição. example: 'Example Description' nullable: true cover_path: type: string description: 'Capa. Must start with one of tutorials/.' example: 'Example Cover path' nullable: true sort_order: type: integer description: 'Ordem. O campo value deve ser pelo menos 0.' example: 1 sectors: type: array description: 'Setor. O campo value deve ser um UUID válido. The uuid of an existing record in the sectors table.' example: - f6443961-be69-3125-8ee8-28e34a6312da items: type: string permissions: type: array description: 'Permissão. The name of an existing record in the permissions table.' example: - 79f669aa-e8b5-3342-a81e-78facc3e597e items: type: string required: - module_id - title /api/admin/tutorials/upload-url: post: summary: 'Gerar URL de upload' operationId: gerarURLDeUpload description: 'Devolve uma URL assinada de curta validade para o cliente enviar o arquivo direto ao S3. O arquivo só é conferido depois, ao criar o item ou salvar a capa.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: url: string headers: array path: string expires_in: integer properties: url: type: string example: string headers: type: string example: array path: type: string example: string expires_in: type: string example: integer tags: - 'Tutoriais (administração)' requestBody: required: true content: application/json: schema: type: object properties: kind: type: string description: 'Tipo de arquivo.' example: 'Example Kind' enum: - pdf - video - cover filename: type: string description: 'Nome do arquivo. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' extension: type: string description: 'Extensão do arquivo.' example: 'Example Extension' enum: - null size_bytes: type: integer description: 'Tamanho do arquivo. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 0.' example: 1 required: - kind - filename - extension - size_bytes '/api/admin/tutorials/{id}': get: summary: 'Visualizar tutorial' operationId: visualizarTutorial description: 'Detalhe do tutorial com vínculos e itens' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 82dfd614-a8c2-3427-b758-cf135977add6 title: 'Quis facilis nobis reprehenderit' description: 'Id libero aperiam minus itaque.' status: draft published_at: null sort_order: 0 module: id: a2d092d2-37e7-4fc3-aa4d-c72317df388b name: 'Quo architecto' slug: quo-architecto-893459 created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 82dfd614-a8c2-3427-b758-cf135977add6 title: type: string example: 'Quis facilis nobis reprehenderit' description: type: string example: 'Id libero aperiam minus itaque.' status: type: string example: draft published_at: type: string example: null nullable: true sort_order: type: integer example: 0 module: type: object properties: id: type: string example: a2d092d2-37e7-4fc3-aa4d-c72317df388b name: type: string example: 'Quo architecto' slug: type: string example: quo-architecto-893459 created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Tutoriais (administração)' put: summary: 'Atualizar tutorial' operationId: atualizarTutorial description: 'Atualiza o tutorial e os vínculos de setor e permissão' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 02c15f20-fec7-3a25-a06d-56f4954d46e0 title: 'Ut ullam cum ducimus' description: 'Sunt debitis ullam odit voluptas magni impedit ea ipsam.' status: draft published_at: null sort_order: 0 module: id: a2d092d2-4015-4312-a945-dcb5e8a8c9f5 name: 'Velit vero' slug: velit-vero-999489 created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 02c15f20-fec7-3a25-a06d-56f4954d46e0 title: type: string example: 'Ut ullam cum ducimus' description: type: string example: 'Sunt debitis ullam odit voluptas magni impedit ea ipsam.' status: type: string example: draft published_at: type: string example: null nullable: true sort_order: type: integer example: 0 module: type: object properties: id: type: string example: a2d092d2-4015-4312-a945-dcb5e8a8c9f5 name: type: string example: 'Velit vero' slug: type: string example: velit-vero-999489 created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Tutoriais (administração)' requestBody: required: false content: application/json: schema: type: object properties: module_id: type: string description: 'Módulo. O campo value deve ser um UUID válido. The uuid of an existing record in the tutorial_modules table.' example: 5219812f-516f-3374-92ce-9cb2fa7fd582 title: type: string description: 'Título. O campo value não pode ser superior a 255 caracteres.' example: 'Example Title' description: type: string description: Descrição. example: 'Example Description' nullable: true cover_path: type: string description: 'Capa. Must start with one of tutorials/.' example: 'Example Cover path' nullable: true sort_order: type: integer description: 'Ordem. O campo value deve ser pelo menos 0.' example: 1 sectors: type: array description: 'Setor. O campo value deve ser um UUID válido. The uuid of an existing record in the sectors table.' example: - 3c24ba10-5134-3198-8a25-99e772cf1a3e items: type: string permissions: type: array description: 'Permissão. The name of an existing record in the permissions table.' example: - 9c20aab7-a7bd-3b1f-aac9-8e00f9c54b83 items: type: string delete: summary: 'Remover tutorial' operationId: removerTutorial description: 'Remove o tutorial, os itens e os arquivos correspondentes no S3' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Tutoriais (administração)' parameters: - in: path name: id description: 'The ID of the tutorial.' example: 1 required: true schema: type: integer - in: path name: tutorial description: 'UUID do tutorial' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/admin/tutorials/{tutorial}/publish': post: summary: 'Publicar tutorial' operationId: publicarTutorial description: 'Publica o tutorial e carimba a data de publicação' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 1b3ba34d-070a-32e0-8eb4-13d1d958302f title: 'Dolor omnis laboriosam sit' description: 'Fugiat voluptas maxime occaecati similique incidunt maxime omnis.' status: draft published_at: null sort_order: 0 module: id: a2d092d2-4814-4e21-a02b-5f2682e87efa name: 'Aut fugiat' slug: aut-fugiat-670460 created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 1b3ba34d-070a-32e0-8eb4-13d1d958302f title: type: string example: 'Dolor omnis laboriosam sit' description: type: string example: 'Fugiat voluptas maxime occaecati similique incidunt maxime omnis.' status: type: string example: draft published_at: type: string example: null nullable: true sort_order: type: integer example: 0 module: type: object properties: id: type: string example: a2d092d2-4814-4e21-a02b-5f2682e87efa name: type: string example: 'Aut fugiat' slug: type: string example: aut-fugiat-670460 created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Tutoriais (administração)' parameters: - in: path name: tutorial description: 'UUID do tutorial' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/admin/tutorials/{tutorial}/unpublish': post: summary: 'Despublicar tutorial' operationId: despublicarTutorial description: 'Devolve o tutorial ao rascunho e limpa a data de publicação' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 5663b95f-683f-3ee6-be94-032ad3824aec title: 'Doloribus vel alias omnis' description: 'Odit sit ullam hic libero voluptates.' status: draft published_at: null sort_order: 0 module: id: a2d092d2-4d62-4ab8-a6cd-26d4f689afd8 name: 'Est ex' slug: est-ex-866275 created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 5663b95f-683f-3ee6-be94-032ad3824aec title: type: string example: 'Doloribus vel alias omnis' description: type: string example: 'Odit sit ullam hic libero voluptates.' status: type: string example: draft published_at: type: string example: null nullable: true sort_order: type: integer example: 0 module: type: object properties: id: type: string example: a2d092d2-4d62-4ab8-a6cd-26d4f689afd8 name: type: string example: 'Est ex' slug: type: string example: est-ex-866275 created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Tutoriais (administração)' parameters: - in: path name: tutorial description: 'UUID do tutorial' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/admin/tutorials/{tutorial_id}/items': post: summary: 'Adicionar item ao tutorial' operationId: adicionarItemAoTutorial description: 'Cria o item a partir de um arquivo já enviado ao S3 (pdf ou video) ou de um link do YouTube/Vimeo. O arquivo é conferido aqui: existência, tamanho real e assinatura do conteúdo.' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: data: id: a236781b-981c-31ec-88f2-6a149836a423 type: pdf title: 'Repudiandae alias velit' mime_type: application/pdf size_bytes: 42921 duration_seconds: null sort_order: 0 created_at: null updated_at: null properties: data: type: object properties: id: type: string example: a236781b-981c-31ec-88f2-6a149836a423 type: type: string example: pdf title: type: string example: 'Repudiandae alias velit' mime_type: type: string example: application/pdf size_bytes: type: integer example: 42921 duration_seconds: type: string example: null nullable: true sort_order: type: integer example: 0 created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Tutoriais (administração)' requestBody: required: true content: application/json: schema: type: object properties: type: type: string description: Tipo. example: 'Example Type' enum: - pdf - video - link title: type: string description: 'Título. O campo value não pode ser superior a 255 caracteres.' example: 'Example Title' file_path: type: string description: 'Caminho do arquivo. Must start with one of tutorials/.' example: 'Example File path' external_url: type: string description: 'Link externo.' example: 'https://example.com' duration_seconds: type: integer description: 'Duração em segundos. O campo value deve ser pelo menos 0.' example: 1 nullable: true sort_order: type: integer description: 'Ordem. O campo value deve ser pelo menos 0.' example: 1 required: - type - title - file_path parameters: - in: path name: tutorial_id description: 'The ID of the tutorial.' example: 1 required: true schema: type: integer - in: path name: tutorial description: 'UUID do tutorial' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/admin/tutorials/{tutorial}/items/reorder': put: summary: 'Reordenar itens' operationId: reordenarItens description: 'Grava a ordem dos itens conforme a sequência de UUIDs enviada' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Itens reordenados com sucesso' properties: message: type: string example: 'Itens reordenados com sucesso' tags: - 'Tutoriais (administração)' requestBody: required: true content: application/json: schema: type: object properties: items: type: array description: 'Item. O campo value deve ser um UUID válido. The uuid of an existing record in the tutorial_items table.' example: - 3a948fbc-f9b0-3aa0-a40e-640154af0709 items: type: string required: - items parameters: - in: path name: tutorial description: 'UUID do tutorial' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/admin/tutorial-items/{tutorialItem}': put: summary: 'Atualizar item' operationId: atualizarItem description: 'Atualiza o item. O tipo não muda depois de criado.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: f588cd35-2476-3af6-8e89-aab85ca100b3 type: pdf title: 'Laudantium amet ea' mime_type: application/pdf size_bytes: 3167476 duration_seconds: null sort_order: 0 created_at: null updated_at: null properties: data: type: object properties: id: type: string example: f588cd35-2476-3af6-8e89-aab85ca100b3 type: type: string example: pdf title: type: string example: 'Laudantium amet ea' mime_type: type: string example: application/pdf size_bytes: type: integer example: 3167476 duration_seconds: type: string example: null nullable: true sort_order: type: integer example: 0 created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Tutoriais (administração)' requestBody: required: false content: application/json: schema: type: object properties: title: type: string description: 'Título. O campo value não pode ser superior a 255 caracteres.' example: 'Example Title' file_path: type: string description: 'Caminho do arquivo. Must start with one of tutorials/.' example: 'Example File path' external_url: type: string description: 'Link externo. O campo value não pode ser superior a 2048 caracteres.' example: 'https://example.com' duration_seconds: type: integer description: 'Duração em segundos. O campo value deve ser pelo menos 0.' example: 1 nullable: true sort_order: type: integer description: 'Ordem. O campo value deve ser pelo menos 0.' example: 1 delete: summary: 'Remover item' operationId: removerItem description: 'Remove o item e apaga o arquivo correspondente no S3' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Tutoriais (administração)' parameters: - in: path name: tutorialItem description: 'UUID do item' example: 019556e7-2e9f-777c-a177-30bbf0646c32 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: 1b63e13d-1ef6-3e15-be71-e215a7dd1495 name: 'Sr. Danilo Balestero Guerra Filho' abbreviation: 'Ziraldo Valente Sobrinho' description: 'Sint minus excepturi autem.' created_at: null updated_at: null - id: 36bbd26f-5bbb-3bc9-a8a6-74ac606c34b1 name: 'Luan Everton Rico' abbreviation: 'Paulina Sabrina Verdugo' description: 'Quasi itaque ut nemo quis.' 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: 1b63e13d-1ef6-3e15-be71-e215a7dd1495 name: 'Sr. Danilo Balestero Guerra Filho' abbreviation: 'Ziraldo Valente Sobrinho' description: 'Sint minus excepturi autem.' created_at: null updated_at: null - id: 36bbd26f-5bbb-3bc9-a8a6-74ac606c34b1 name: 'Luan Everton Rico' abbreviation: 'Paulina Sabrina Verdugo' description: 'Quasi itaque ut nemo quis.' created_at: null updated_at: null items: type: object properties: id: type: string example: 1b63e13d-1ef6-3e15-be71-e215a7dd1495 name: type: string example: 'Sr. Danilo Balestero Guerra Filho' abbreviation: type: string example: 'Ziraldo Valente Sobrinho' description: type: string example: 'Sint minus excepturi 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: eb43448f-e9bb-37b8-9850-c25aa998a1f1 name: 'Sr. Benjamin Medina Jr.' abbreviation: 'Eva Luísa Serra Filho' description: 'Illum sit dolore quia iusto.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: eb43448f-e9bb-37b8-9850-c25aa998a1f1 name: type: string example: 'Sr. Benjamin Medina Jr.' abbreviation: type: string example: 'Eva Luísa Serra Filho' description: type: string example: 'Illum sit dolore quia iusto.' 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: provident 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: expedita 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: 2f83ce8d-6237-3d84-b54e-5c67e563f8af name: 'Rhianna Turcotte' username: tristin97 email: greichel@example.org certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: 37d2fe17-e21e-3bfd-b235-f99e365759e1 name: 'Dr. Gerald Beahan' username: aurelia63 email: patrick.ziemann@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: 2f83ce8d-6237-3d84-b54e-5c67e563f8af name: 'Rhianna Turcotte' username: tristin97 email: greichel@example.org certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: 37d2fe17-e21e-3bfd-b235-f99e365759e1 name: 'Dr. Gerald Beahan' username: aurelia63 email: patrick.ziemann@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: 2f83ce8d-6237-3d84-b54e-5c67e563f8af name: type: string example: 'Rhianna Turcotte' username: type: string example: tristin97 email: type: string example: greichel@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: - 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: carroll53 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: - b9552a96-9393-3f66-b35a-e834a9025d1c items: type: string roles: type: array description: 'UUID da função. The uuid of an existing record in the roles table.' example: - 21b3a026-4dba-3c69-a029-54bdf686f124 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: 6db362aa-c5b0-3b8a-891c-702237f024fe name: 'Janessa Deckow II' username: murray.josiane email: dicki.juvenal@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: 6db362aa-c5b0-3b8a-891c-702237f024fe name: type: string example: 'Janessa Deckow II' username: type: string example: murray.josiane email: type: string example: dicki.juvenal@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: mbruen 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: - cab32564-5c72-302d-a6f3-447b8c1d092c items: type: string roles: type: array description: 'UUID da função. The uuid of an existing record in the roles table.' example: - 5e154cb9-0242-378c-9084-50215f14fddd 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: - 1a3884de-4274-3876-b28a-03ed401d6952 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: ex display_name: 'Quam et quod voluptatum saepe perspiciatis ipsa.' - id: null name: aut display_name: 'Quisquam et laudantium quibusdam quia voluptatem animi quis.' properties: data: type: array example: - id: null name: ex display_name: 'Quam et quod voluptatum saepe perspiciatis ipsa.' - id: null name: aut display_name: 'Quisquam et laudantium quibusdam quia voluptatem animi quis.' items: type: object properties: id: type: string example: null nullable: true name: type: string example: ex display_name: type: string example: 'Quam et quod voluptatum saepe perspiciatis ipsa.' 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: 5e28db9a-9945-3e53-8bcd-862b8d605132 description: 'Dr. Pâmela Angélica Padilha Sobrinho' work: id: null name: null documents: [] created_at: null updated_at: null - id: 1393c1b8-7825-3b57-bd67-4689b7f10267 description: 'Josué Quintana' 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: 5e28db9a-9945-3e53-8bcd-862b8d605132 description: 'Dr. Pâmela Angélica Padilha Sobrinho' work: id: null name: null documents: [] created_at: null updated_at: null - id: 1393c1b8-7825-3b57-bd67-4689b7f10267 description: 'Josué Quintana' work: id: null name: null documents: [] created_at: null updated_at: null items: type: object properties: id: type: string example: 5e28db9a-9945-3e53-8bcd-862b8d605132 description: type: string example: 'Dr. Pâmela Angélica Padilha Sobrinho' 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: 35f02360-4b78-369f-98a8-9fa21e4f8545 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: d1d5a11e-9d8c-3425-b499-df26181181ee description: 'Marcelo Artur Amaral' work: id: null name: null documents: [] created_at: null updated_at: null properties: data: type: object properties: id: type: string example: d1d5a11e-9d8c-3425-b499-df26181181ee description: type: string example: 'Marcelo Artur Amaral' 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: 75d46aed-1b1a-30a0-ba6e-69bbc416064a 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: bdd82986-d004-34f8-96b4-7089bc416b3b name: 'Srta. Milene Lutero Rocha Sobrinho' 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: '2022-07-27 21:05:17.000000' timezone_type: 3 timezone: America/Sao_Paulo created_at: null updated_at: null - id: 77af096d-0051-3ee0-a143-fe6563f5e2ad name: 'Lia Aline Vega' 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: '2010-05-04 22:29:19.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: bdd82986-d004-34f8-96b4-7089bc416b3b name: 'Srta. Milene Lutero Rocha Sobrinho' 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: '2022-07-27 21:05:17.000000' timezone_type: 3 timezone: America/Sao_Paulo created_at: null updated_at: null - id: 77af096d-0051-3ee0-a143-fe6563f5e2ad name: 'Lia Aline Vega' 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: '2010-05-04 22:29:19.000000' timezone_type: 3 timezone: America/Sao_Paulo created_at: null updated_at: null items: type: object properties: id: type: string example: bdd82986-d004-34f8-96b4-7089bc416b3b name: type: string example: 'Srta. Milene Lutero Rocha Sobrinho' 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: '2022-07-27 21:05:17.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: e80c8569-a468-31f6-9c45-8f8c2c6723f8 status_id: type: string description: 'Status id. The uuid of an existing record in the statuses table.' example: 30321051-4532-3c81-81b2-8d42027bb3d5 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: 3e3239c4-8f6d-348b-97c3-4b23b401587a name: 'Viviane Prado Sobrinho' 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: '2014-08-18 03:41:10.000000' timezone_type: 3 timezone: America/Sao_Paulo created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 3e3239c4-8f6d-348b-97c3-4b23b401587a name: type: string example: 'Viviane Prado Sobrinho' 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: '2014-08-18 03:41: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 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: e24d0a72-adc9-3f94-a548-ea3a9fb4d72e status_id: type: string description: 'Status id. The uuid of an existing record in the statuses table.' example: 8b1fd7f8-590f-39ca-ad3c-e440905499b8 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: 85906287-f7d2-34b9-b0b0-4bce3bc169ad name: 'Dr. Kristy Leuschke' username: heath.wiegand email: lgerhold@example.org certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: f14c0ecc-1151-31f0-8221-5261e4967be3 name: 'Mrs. Madisyn Zulauf' username: qstoltenberg email: uheathcote@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: 85906287-f7d2-34b9-b0b0-4bce3bc169ad name: 'Dr. Kristy Leuschke' username: heath.wiegand email: lgerhold@example.org certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: f14c0ecc-1151-31f0-8221-5261e4967be3 name: 'Mrs. Madisyn Zulauf' username: qstoltenberg email: uheathcote@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: 85906287-f7d2-34b9-b0b0-4bce3bc169ad name: type: string example: 'Dr. Kristy Leuschke' username: type: string example: heath.wiegand email: type: string example: lgerhold@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: - 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: - c3160ce3-956f-3754-81e0-806150c2588e 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: - c948e506-f6b6-3505-8acb-9991ff7544e1 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: - 6cff2914-f7c3-33f8-8eb0-a1ebf87b8853 items: type: string parameters: - in: path name: work description: 'Work UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string