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: 'Cost Centers' description: 'Endpoints for cost centers' - 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: 'Endpoints for reports' - 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: 41a6c147-dbfe-388b-bdc3-df2819c78a1b name: delectus-6aedfa3c8f813 display_name: 'Laudantium et non ullam.' permissions_count: null - id: a838ef73-4be4-35f1-baea-8a02bc939059 name: voluptatum-6aedfa3c938ef display_name: 'Aut est et et ut enim architecto odio iure.' 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: 41a6c147-dbfe-388b-bdc3-df2819c78a1b name: delectus-6aedfa3c8f813 display_name: 'Laudantium et non ullam.' permissions_count: null - id: a838ef73-4be4-35f1-baea-8a02bc939059 name: voluptatum-6aedfa3c938ef display_name: 'Aut est et et ut enim architecto odio iure.' permissions_count: null items: type: object properties: id: type: string example: 41a6c147-dbfe-388b-bdc3-df2819c78a1b name: type: string example: delectus-6aedfa3c8f813 display_name: type: string example: 'Laudantium et non ullam.' 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: - 09477fa9-9141-301a-b05a-5bdad15d2d08 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: - 7aa218e9-e0eb-34bb-bbba-4db7926cf300 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: 0b1ae0c7-5533-3fec-bfe9-1d85af51b1d2 name: facere-6aedfa3ca0835 display_name: 'Ipsam rem aut dolor magni velit exercitationem laboriosam.' permissions_count: null properties: data: type: object properties: id: type: string example: 0b1ae0c7-5533-3fec-bfe9-1d85af51b1d2 name: type: string example: facere-6aedfa3ca0835 display_name: type: string example: 'Ipsam rem aut dolor magni velit exercitationem laboriosam.' 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: eum display_name: 'Perspiciatis ut alias et reiciendis labore.' - id: null name: est display_name: 'Architecto pariatur aut odit velit exercitationem.' properties: data: type: array example: - id: null name: eum display_name: 'Perspiciatis ut alias et reiciendis labore.' - id: null name: est display_name: 'Architecto pariatur aut odit velit exercitationem.' items: type: object properties: id: type: string example: null nullable: true name: type: string example: eum display_name: type: string example: 'Perspiciatis ut alias et reiciendis labore.' 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: est display_name: 'Temporibus reprehenderit molestiae et tempore voluptatibus.' - id: null name: voluptas display_name: 'Ut qui magnam beatae dolores fugit dolorum earum ut.' 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: est display_name: 'Temporibus reprehenderit molestiae et tempore voluptatibus.' - id: null name: voluptas display_name: 'Ut qui magnam beatae dolores fugit dolorum earum ut.' items: type: object properties: id: type: string example: null nullable: true name: type: string example: est display_name: type: string example: 'Temporibus reprehenderit molestiae et tempore voluptatibus.' 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: maiores display_name: 'Id voluptatibus minus ullam quae aut rerum.' properties: data: type: object properties: id: type: string example: null nullable: true name: type: string example: maiores display_name: type: string example: 'Id voluptatibus minus ullam quae aut rerum.' 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: df399040-1489-3a8d-adbc-0d97a04468cb code: null type: saída payment_method: boleto amount: 5042.57 due_date: '2026-12-04T03: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: 'Sit eveniet et labore aspernatur et fuga ducimus commodi magni praesentium.' 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: sit field2: 8 field3: false notes: 'Aut aspernatur dolore id sed voluptates.' created_at: null updated_at: null - id: e781b60c-92e2-39e8-930a-bdfca10c0812 code: null type: entrada payment_method: cheque amount: 8125.51 due_date: '2026-12-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: 'Aut est et eligendi vitae aspernatur facere similique.' 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: neque field2: 44 field3: true notes: 'Harum suscipit sapiente voluptas impedit.' created_at: null updated_at: null properties: data: type: array example: - id: df399040-1489-3a8d-adbc-0d97a04468cb code: null type: saída payment_method: boleto amount: 5042.57 due_date: '2026-12-04T03: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: 'Sit eveniet et labore aspernatur et fuga ducimus commodi magni praesentium.' 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: sit field2: 8 field3: false notes: 'Aut aspernatur dolore id sed voluptates.' created_at: null updated_at: null - id: e781b60c-92e2-39e8-930a-bdfca10c0812 code: null type: entrada payment_method: cheque amount: 8125.51 due_date: '2026-12-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: 'Aut est et eligendi vitae aspernatur facere similique.' 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: neque field2: 44 field3: true notes: 'Harum suscipit sapiente voluptas impedit.' created_at: null updated_at: null items: type: object properties: id: type: string example: df399040-1489-3a8d-adbc-0d97a04468cb code: type: string example: null nullable: true type: type: string example: saída payment_method: type: string example: boleto amount: type: number example: 5042.57 due_date: type: string example: '2026-12-04T03: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: 'Sit eveniet et labore aspernatur et fuga ducimus commodi magni praesentium.' 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: sit field2: type: integer example: 8 field3: type: boolean example: false notes: type: string example: 'Aut aspernatur dolore id sed voluptates.' 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: - aut required: true schema: type: array description: 'The uuid of an existing record in the account_payable_receivables table.' example: - aut 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: - esse required: false schema: type: array description: 'The uuid of an existing record in the customers table.' example: - esse items: type: string - in: query name: suppliers description: 'The uuid of an existing record in the suppliers table.' example: - non required: false schema: type: array description: 'The uuid of an existing record in the suppliers table.' example: - non items: type: string - in: query name: works description: 'The uuid of an existing record in the works table.' example: - quo required: false schema: type: array description: 'The uuid of an existing record in the works table.' example: - quo items: type: string - in: query name: cost_centers description: 'The uuid of an existing record in the cost_centers table.' example: - reiciendis required: false schema: type: array description: 'The uuid of an existing record in the cost_centers table.' example: - reiciendis 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-11-06T13:03:08' required: false schema: type: string description: 'O campo value deve ser uma data válida.' example: '2026-11-06T13:03:08' nullable: true - in: query name: protest_date_end description: 'O campo value deve ser uma data válida.' example: '2026-11-06T13:03:08' required: false schema: type: string description: 'O campo value deve ser uma data válida.' example: '2026-11-06T13:03:08' nullable: true - in: query name: has_protest description: '' example: false required: false schema: type: boolean description: '' example: false 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: c31e5ac3-915a-3981-a2e2-2c41823b2a91 code: null type: saída payment_method: cheque amount: 982.09 due_date: '2026-11-23T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Velit molestiae id eius id quibusdam sint voluptatem quia nulla.' 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: fugiat field2: 87 field3: false notes: 'Eius quo est est sapiente sequi ut mollitia.' created_at: null updated_at: null - id: c6f2d6d9-9e9f-3a59-bb84-c8b6653332f2 code: null type: entrada payment_method: cheque amount: 6870.53 due_date: '2026-11-27T03: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 sit repellendus hic officia omnis amet dolorum et ut tenetur temporibus.' 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: deleniti field2: 73 field3: true notes: 'Dolor perferendis molestias sed quis assumenda.' 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: c31e5ac3-915a-3981-a2e2-2c41823b2a91 code: null type: saída payment_method: cheque amount: 982.09 due_date: '2026-11-23T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Velit molestiae id eius id quibusdam sint voluptatem quia nulla.' 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: fugiat field2: 87 field3: false notes: 'Eius quo est est sapiente sequi ut mollitia.' created_at: null updated_at: null - id: c6f2d6d9-9e9f-3a59-bb84-c8b6653332f2 code: null type: entrada payment_method: cheque amount: 6870.53 due_date: '2026-11-27T03: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 sit repellendus hic officia omnis amet dolorum et ut tenetur temporibus.' 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: deleniti field2: 73 field3: true notes: 'Dolor perferendis molestias sed quis assumenda.' created_at: null updated_at: null items: type: object properties: id: type: string example: c31e5ac3-915a-3981-a2e2-2c41823b2a91 code: type: string example: null nullable: true type: type: string example: saída payment_method: type: string example: cheque amount: type: number example: 982.09 due_date: type: string example: '2026-11-23T03:00:00.000000Z' status: type: string example: null nullable: true payment_date: type: string example: null nullable: true protest_date: type: string example: null nullable: true paid_amount: type: string example: null nullable: true interest_amount: type: string example: null nullable: true penalty_amount: type: string example: null nullable: true notary_fee_amount: type: string example: null nullable: true description: type: string example: 'Velit molestiae id eius id quibusdam sint voluptatem quia nulla.' 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: fugiat field2: type: integer example: 87 field3: type: boolean example: false notes: type: string example: 'Eius quo est est sapiente sequi ut mollitia.' 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: - officia required: false schema: type: array description: 'The uuid of an existing record in the customers table.' example: - officia items: type: string - in: query name: suppliers description: 'The uuid of an existing record in the suppliers table.' example: - est required: false schema: type: array description: 'The uuid of an existing record in the suppliers table.' example: - est items: type: string - in: query name: works description: 'The uuid of an existing record in the works table.' example: - rem required: false schema: type: array description: 'The uuid of an existing record in the works table.' example: - rem items: type: string - in: query name: cost_centers description: 'The uuid of an existing record in the cost_centers table.' example: - consequatur required: false schema: type: array description: 'The uuid of an existing record in the cost_centers table.' example: - consequatur items: type: string - in: query name: statuses description: '' example: - pago required: false schema: type: array description: '' example: - pago 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-11-06T13:03:08' required: false schema: type: string description: 'O campo value deve ser uma data válida.' example: '2026-11-06T13:03:08' nullable: true - in: query name: protest_date_end description: 'O campo value deve ser uma data válida.' example: '2026-11-06T13:03:08' required: false schema: type: string description: 'O campo value deve ser uma data válida.' example: '2026-11-06T13:03:08' nullable: true - in: query name: has_protest description: '' example: false required: false schema: type: boolean description: '' example: false 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: da773aa2-daff-32e7-a1c6-6234e7dbc2fc code: null type: saída payment_method: cheque amount: 8539.14 due_date: '2026-12-03T03: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: 'Magni ullam ipsum velit cupiditate dignissimos sequi consectetur.' 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: quos field2: 78 field3: true notes: 'Voluptas velit officia expedita.' created_at: null updated_at: null - id: ea160bca-de70-3796-8ba9-432be3a1bc48 code: null type: saída payment_method: boleto amount: 9607.61 due_date: '2026-11-20T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Cupiditate distinctio velit dolorem culpa et qui quos similique.' 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: eos field2: 33 field3: false notes: 'Dignissimos iure alias quod eligendi nam.' 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: da773aa2-daff-32e7-a1c6-6234e7dbc2fc code: null type: saída payment_method: cheque amount: 8539.14 due_date: '2026-12-03T03: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: 'Magni ullam ipsum velit cupiditate dignissimos sequi consectetur.' 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: quos field2: 78 field3: true notes: 'Voluptas velit officia expedita.' created_at: null updated_at: null - id: ea160bca-de70-3796-8ba9-432be3a1bc48 code: null type: saída payment_method: boleto amount: 9607.61 due_date: '2026-11-20T03:00:00.000000Z' status: null payment_date: null protest_date: null paid_amount: null interest_amount: null penalty_amount: null notary_fee_amount: null description: 'Cupiditate distinctio velit dolorem culpa et qui quos similique.' 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: eos field2: 33 field3: false notes: 'Dignissimos iure alias quod eligendi nam.' created_at: null updated_at: null items: type: object properties: id: type: string example: da773aa2-daff-32e7-a1c6-6234e7dbc2fc code: type: string example: null nullable: true type: type: string example: saída payment_method: type: string example: cheque amount: type: number example: 8539.14 due_date: type: string example: '2026-12-03T03: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: 'Magni ullam ipsum velit cupiditate dignissimos sequi consectetur.' 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: quos field2: type: integer example: 78 field3: type: boolean example: true notes: type: string example: 'Voluptas velit officia expedita.' 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: e3bd2ba9-5c44-389e-a2f9-d2d5aa0f5edf nullable: true customer_id: type: string description: 'Cliente. The uuid of an existing record in the customers table.' example: c3d7ed09-7427-3500-90ab-da18fb1ba376 nullable: true work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: 50af7513-b55f-3381-b8eb-d91c7141a602 nullable: true cost_center_id: type: string description: 'Cost center id. The uuid of an existing record in the cost_centers table.' example: db1ea72e-33e9-3709-8732-9215d6bf1343 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: 1e101d1b-c4fa-3349-8899-1a50eee58544 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 - cost_center_id /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: explicabo installment_ids: type: array description: 'The uuid of an existing record in the fiscal_document_installments table.' example: - ullam items: type: string payment_method: type: string description: '' example: cheque enum: - cheque - boleto - pix - cartao - outro nullable: true work_id: type: string description: 'The uuid of an existing record in the works table.' example: totam nullable: true cost_center_id: type: string description: 'The uuid of an existing record in the cost_centers table.' example: earum 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: velit 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: de7014d8-17a3-3111-ba39-f7aded1f6b20 code: null type: entrada payment_method: boleto amount: 8044.74 due_date: '2026-11-21T03: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: 'Est itaque fugit mollitia voluptas reprehenderit sint adipisci voluptas aspernatur.' 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: ex field2: 11 field3: true notes: 'Id minus id at sed et quo.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: de7014d8-17a3-3111-ba39-f7aded1f6b20 code: type: string example: null nullable: true type: type: string example: entrada payment_method: type: string example: boleto amount: type: number example: 8044.74 due_date: type: string example: '2026-11-21T03: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: 'Est itaque fugit mollitia voluptas reprehenderit sint adipisci voluptas aspernatur.' 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: ex field2: type: integer example: 11 field3: type: boolean example: true notes: type: string example: 'Id minus id at sed et quo.' 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: true 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: ba84e2a2-d687-3da0-89d8-c484332af22c nullable: true customer_id: type: string description: 'Customer id. The uuid of an existing record in the customers table.' example: e962fa44-001f-3b46-9067-39451079b821 nullable: true work_id: type: string description: 'Work id. The uuid of an existing record in the works table.' example: ee6c92f1-14d5-3716-9310-be700aa1698c nullable: true cost_center_id: type: string description: 'Cost center id. The uuid of an existing record in the cost_centers table.' example: be52003e-6688-3378-8506-ab95987981c2 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: beb1cab7-2fe3-3eba-96ac-3c2951277e83 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: - cost_center_id 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: sunt 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: yadira.donnelly@example.org 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: b6d55999-2df7-3c96-8d7e-8378437196bd name: 'Sidney Grimes Jr.' username: emerson.balistreri email: willy69@example.com 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: b6d55999-2df7-3c96-8d7e-8378437196bd name: type: string example: 'Sidney Grimes Jr.' username: type: string example: emerson.balistreri email: type: string example: willy69@example.com 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: heidi91 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: - cb6a82b5-55bf-3859-8557-b760d1910b7a items: type: string roles: type: array description: 'UUID da função. The uuid of an existing record in the roles table.' example: - da1e364e-febc-3df7-9c84-4c76c949dd12 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: cxivssmedaimfrwrhl 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: occaecati 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: eius 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: 1 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: 12 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: ca9662b4-3af7-3a37-9b61-8670c6d70a8d agency: '5664' account: 8966064-1 type: corrente balance: 4768.62 holder_type: pf alias: et limit: 2724.98 available_balance: 7493.6 used_limit: 0 available_limit: 2724.98 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: ca9662b4-3af7-3a37-9b61-8670c6d70a8d agency: type: string example: '5664' account: type: string example: 8966064-1 type: type: string example: corrente balance: type: number example: 4768.62 holder_type: type: string example: pf alias: type: string example: et limit: type: number example: 2724.98 available_balance: type: number example: 7493.6 used_limit: type: integer example: 0 available_limit: type: number example: 2724.98 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: 04f0a697-ec08-3524-b4f0-560a93fae321 agency: '4840' account: 3920333-8 type: poupança balance: 39.33 holder_type: pj alias: sint limit: 8726.74 available_balance: 8766.07 used_limit: 0 available_limit: 8726.74 is_default: null default_payment_method: null bank: id: null name: null code: null created_at: null updated_at: null - id: e36e4575-e626-3c74-8441-c5029416de68 agency: '1305' account: 2968714-7 type: corrente balance: 2787.68 holder_type: pj alias: consequatur limit: 5086.15 available_balance: 7873.83 used_limit: 0 available_limit: 5086.15 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: 04f0a697-ec08-3524-b4f0-560a93fae321 agency: '4840' account: 3920333-8 type: poupança balance: 39.33 holder_type: pj alias: sint limit: 8726.74 available_balance: 8766.07 used_limit: 0 available_limit: 8726.74 is_default: null default_payment_method: null bank: id: null name: null code: null created_at: null updated_at: null - id: e36e4575-e626-3c74-8441-c5029416de68 agency: '1305' account: 2968714-7 type: corrente balance: 2787.68 holder_type: pj alias: consequatur limit: 5086.15 available_balance: 7873.83 used_limit: 0 available_limit: 5086.15 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: 04f0a697-ec08-3524-b4f0-560a93fae321 agency: type: string example: '4840' account: type: string example: 3920333-8 type: type: string example: poupança balance: type: number example: 39.33 holder_type: type: string example: pj alias: type: string example: sint limit: type: number example: 8726.74 available_balance: type: number example: 8766.07 used_limit: type: integer example: 0 available_limit: type: number example: 8726.74 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: 9456642-5 bank_id: type: string description: 'Bank id. The uuid of an existing record in the banks table.' example: 51afef1d-5691-38d2-8cc0-9f8c4485664b 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: 3168706-6 bank_id: type: string description: 'Bank id. The uuid of an existing record in the banks table.' example: 77f9c59e-b176-3b8c-a64f-f68f8e17a2fc 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: e4e980d4-fbc5-3b22-8edf-8344aa6d0d97 agency: '1365' account: 9318664-9 type: corrente balance: 1998.26 holder_type: pj alias: reprehenderit limit: 6383.5 available_balance: 8381.76 used_limit: 0 available_limit: 6383.5 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: e4e980d4-fbc5-3b22-8edf-8344aa6d0d97 agency: type: string example: '1365' account: type: string example: 9318664-9 type: type: string example: corrente balance: type: number example: 1998.26 holder_type: type: string example: pj alias: type: string example: reprehenderit limit: type: number example: 6383.5 available_balance: type: number example: 8381.76 used_limit: type: integer example: 0 available_limit: type: number example: 6383.5 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: 3 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: est nullable: true sort_desc: type: boolean description: '' example: false nullable: true page: type: integer description: 'O campo value deve ser pelo menos 1.' example: 62 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: 2 nullable: true q: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: edvrlgbjbctra nullable: true type: type: string description: '' example: saída 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-11-06T13:03:09' 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: '2065-04-24' 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: 14 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: 19 required: true schema: type: integer - in: path name: bankStatement description: '' example: rem 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: 89c55070-7183-3f26-8481-cffcc9a06591 name: 'Gomes e Colaço Ltda.' code: '411' - id: ee247d4c-18f2-3673-a5e5-a7aa20343fc2 name: Rios-Furtado code: '863' 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: 89c55070-7183-3f26-8481-cffcc9a06591 name: 'Gomes e Colaço Ltda.' code: '411' - id: ee247d4c-18f2-3673-a5e5-a7aa20343fc2 name: Rios-Furtado code: '863' items: type: object properties: id: type: string example: 89c55070-7183-3f26-8481-cffcc9a06591 name: type: string example: 'Gomes e Colaço Ltda.' code: type: string example: '411' 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: 35d01543-f0a4-3be6-b022-631a772d413b name: 'Aragão e Arruda e Filhos' code: '737' properties: data: type: object properties: id: type: string example: 35d01543-f0a4-3be6-b022-631a772d413b name: type: string example: 'Aragão e Arruda e Filhos' code: type: string example: '737' 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: 'Nam ratione perferendis sed sunt laborum et.' required: false schema: type: string description: 'Description .' example: 'Nam ratione perferendis sed sunt laborum et.' - in: query name: categories description: 'The uuid of an existing record in the transaction_categories table.' example: - molestias required: false schema: type: array description: 'The uuid of an existing record in the transaction_categories table.' example: - molestias 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: - perferendis required: false schema: type: array description: 'The uuid of an existing record in the bank_accounts table.' example: - perferendis items: type: string - in: query name: customers description: 'The uuid of an existing record in the customers table.' example: - ea required: false schema: type: array description: 'The uuid of an existing record in the customers table.' example: - ea items: type: string - in: query name: suppliers description: 'The uuid of an existing record in the suppliers table.' example: - totam required: false schema: type: array description: 'The uuid of an existing record in the suppliers table.' example: - totam items: type: string - in: query name: works description: 'The uuid of an existing record in the works table.' example: - inventore required: false schema: type: array description: 'The uuid of an existing record in the works table.' example: - inventore items: type: string - in: query name: cost_centers description: 'The uuid of an existing record in the cost_centers table.' example: - numquam required: false schema: type: array description: 'The uuid of an existing record in the cost_centers table.' example: - numquam 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: 'Quaerat voluptatum veritatis qui molestias aspernatur mollitia molestiae enim.' required: false schema: type: string description: 'Description .' example: 'Quaerat voluptatum veritatis qui molestias aspernatur mollitia molestiae enim.' - in: query name: categories description: 'The uuid of an existing record in the transaction_categories table.' example: - omnis required: false schema: type: array description: 'The uuid of an existing record in the transaction_categories table.' example: - omnis 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: - aut required: false schema: type: array description: 'The uuid of an existing record in the bank_accounts table.' example: - aut 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: - ipsa required: false schema: type: array description: 'The uuid of an existing record in the suppliers table.' example: - ipsa items: type: string - in: query name: works description: 'The uuid of an existing record in the works table.' example: - voluptatem required: false schema: type: array description: 'The uuid of an existing record in the works table.' example: - voluptatem items: type: string - in: query name: cost_centers description: 'The uuid of an existing record in the cost_centers table.' example: - atque required: false schema: type: array description: 'The uuid of an existing record in the cost_centers table.' example: - atque items: type: string responses: 200: description: '' content: application/json: schema: type: object example: data: - id: ee2d3e59-5b8e-3414-8afd-5bf2a45171f6 code: FC-51892312 type: saque amount: -2968.41 description: 'Vero odit ratione ut voluptatem.' transaction_date: '2021-02-02T03:00:00.000000Z' transaction_category: id: null name: null type: null created_at: null updated_at: null - id: 8a20d714-3c99-37af-9d35-cb708248cb5f code: FC-06421289 type: saída amount: -1479.82 description: 'Consequatur voluptates iusto expedita aliquam.' transaction_date: '1983-02-15T03: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: ee2d3e59-5b8e-3414-8afd-5bf2a45171f6 code: FC-51892312 type: saque amount: -2968.41 description: 'Vero odit ratione ut voluptatem.' transaction_date: '2021-02-02T03:00:00.000000Z' transaction_category: id: null name: null type: null created_at: null updated_at: null - id: 8a20d714-3c99-37af-9d35-cb708248cb5f code: FC-06421289 type: saída amount: -1479.82 description: 'Consequatur voluptates iusto expedita aliquam.' transaction_date: '1983-02-15T03: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: ee2d3e59-5b8e-3414-8afd-5bf2a45171f6 code: type: string example: FC-51892312 type: type: string example: saque amount: type: number example: -2968.41 description: type: string example: 'Vero odit ratione ut voluptatem.' transaction_date: type: string example: '2021-02-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 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: 9fda7a3d-83d8-3a1f-a81c-6b512ab33643 transaction_category_id: type: string description: 'Transaction category id. The uuid of an existing record in the transaction_categories table.' example: 3f1783d2-cb2e-3d6b-9b56-1454ecf7428b bank_account_id: type: string description: 'Bank account id. The uuid of an existing record in the bank_accounts table.' example: 19bd60a8-6b24-3523-8041-e6929f5ad9c3 nullable: true customer_id: type: string description: 'Customer id. The uuid of an existing record in the customers table.' example: f649ce8b-0050-3059-af49-38a31b8d508e nullable: true supplier_id: type: string description: 'Supplier id. The uuid of an existing record in the suppliers table.' example: 5e0b9454-cd5a-32e4-8325-28f34c3c9570 nullable: true work_id: type: string description: 'Work id. The uuid of an existing record in the works table.' example: f365b3cf-260d-3d46-b8a2-253bb55cc885 nullable: true cost_center_id: type: string description: 'Cost center id. The uuid of an existing record in the cost_centers table.' example: 127ca393-c3ad-3e01-bffc-46d35d00ad56 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 - cost_center_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: d0dd9751-7711-3dc0-b0a4-226483ef6758 code: FC-50556747 type: pagamento amount: -3344.85 description: 'Nemo aut aut dolorem.' transaction_date: '1976-10-12T03: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: d0dd9751-7711-3dc0-b0a4-226483ef6758 code: type: string example: FC-50556747 type: type: string example: pagamento amount: type: number example: -3344.85 description: type: string example: 'Nemo aut aut dolorem.' transaction_date: type: string example: '1976-10-12T03: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: 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: 9c92e749-88c8-3041-9a28-cd65d04fb13d transaction_category_id: type: string description: 'Transaction category id. The uuid of an existing record in the transaction_categories table.' example: 79245e79-bca5-3ece-a696-62a09a388771 bank_account_id: type: string description: 'Bank account id. The uuid of an existing record in the bank_accounts table.' example: 3edc0755-df89-3670-b92a-48766a3aca09 nullable: true customer_id: type: string description: 'Customer id. The uuid of an existing record in the customers table.' example: 9df8846a-3531-38f5-bbdc-6fbe1fc14f16 nullable: true supplier_id: type: string description: 'Supplier id. The uuid of an existing record in the suppliers table.' example: 7cf37e4d-61f0-37f8-8ae4-f2df9b9c96a6 nullable: true work_id: type: string description: 'Work id. The uuid of an existing record in the works table.' example: 5f3ad9c2-2071-37fa-b2ad-57806ce1312c nullable: true cost_center_id: type: string description: 'Cost center id. The uuid of an existing record in the cost_centers table.' example: 7ca085f9-8479-3f19-9d20-903948943aae 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: - cost_center_id 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: 3 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: d9878a6a-f1ff-3229-91fa-01b704734a6a code: null opened_by: null opened_at: '2010-07-04T17:37:30.000000Z' closed_by: null closed_at: '1999-03-26T06:09:10.000000Z' opening_balance: 7687.1 closing_balance: 7941.58 total_income: 0 total_expense: 0 total_balance: 0 status: Aberto hasSnapshot: false created_at: '2009-03-03T02:20:11.000000Z' updated_at: '1974-05-15T15:40:43.000000Z' - id: a7b34977-1f7a-38a0-be99-a8c5f2354be5 code: null opened_by: null opened_at: '2005-05-10T00:11:48.000000Z' closed_by: null closed_at: '1991-01-05T03:26:07.000000Z' opening_balance: 6465.63 closing_balance: 5935.37 total_income: 0 total_expense: 0 total_balance: 0 status: Fechado hasSnapshot: false created_at: '1977-06-16T21:33:08.000000Z' updated_at: '1976-06-15T15:46:02.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: d9878a6a-f1ff-3229-91fa-01b704734a6a code: null opened_by: null opened_at: '2010-07-04T17:37:30.000000Z' closed_by: null closed_at: '1999-03-26T06:09:10.000000Z' opening_balance: 7687.1 closing_balance: 7941.58 total_income: 0 total_expense: 0 total_balance: 0 status: Aberto hasSnapshot: false created_at: '2009-03-03T02:20:11.000000Z' updated_at: '1974-05-15T15:40:43.000000Z' - id: a7b34977-1f7a-38a0-be99-a8c5f2354be5 code: null opened_by: null opened_at: '2005-05-10T00:11:48.000000Z' closed_by: null closed_at: '1991-01-05T03:26:07.000000Z' opening_balance: 6465.63 closing_balance: 5935.37 total_income: 0 total_expense: 0 total_balance: 0 status: Fechado hasSnapshot: false created_at: '1977-06-16T21:33:08.000000Z' updated_at: '1976-06-15T15:46:02.000000Z' items: type: object properties: id: type: string example: d9878a6a-f1ff-3229-91fa-01b704734a6a code: type: string example: null nullable: true opened_by: type: string example: null nullable: true opened_at: type: string example: '2010-07-04T17:37:30.000000Z' closed_by: type: string example: null nullable: true closed_at: type: string example: '1999-03-26T06:09:10.000000Z' opening_balance: type: number example: 7687.1 closing_balance: type: number example: 7941.58 total_income: type: integer example: 0 total_expense: type: integer example: 0 total_balance: type: integer example: 0 status: type: string example: Aberto hasSnapshot: type: boolean example: false created_at: type: string example: '2009-03-03T02:20:11.000000Z' updated_at: type: string example: '1974-05-15T15:40:43.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: 16c0beed-a080-3a61-9139-0689a21fa84a code: null opened_by: null opened_at: '1987-09-27T09:04:16.000000Z' closed_by: null closed_at: '1981-12-16T03:22:53.000000Z' opening_balance: 8386.96 closing_balance: 2526.43 total_income: 0 total_expense: 0 total_balance: 0 status: Aberto hasSnapshot: false created_at: '2020-12-30T10:24:23.000000Z' updated_at: '2014-03-03T10:45:36.000000Z' properties: data: type: object properties: id: type: string example: 16c0beed-a080-3a61-9139-0689a21fa84a code: type: string example: null nullable: true opened_by: type: string example: null nullable: true opened_at: type: string example: '1987-09-27T09:04:16.000000Z' closed_by: type: string example: null nullable: true closed_at: type: string example: '1981-12-16T03:22:53.000000Z' opening_balance: type: number example: 8386.96 closing_balance: type: number example: 2526.43 total_income: type: integer example: 0 total_expense: type: integer example: 0 total_balance: type: integer example: 0 status: type: string example: Aberto hasSnapshot: type: boolean example: false created_at: type: string example: '2020-12-30T10:24:23.000000Z' updated_at: type: string example: '2014-03-03T10:45:36.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: f0408cf7-6437-3f22-b20c-c0c14362edde 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: 4971d795-b828-33da-a7b3-d0461c7a762f 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: 043aeaf4-bc15-3943-b432-44c3ef263800 code: null opened_by: null opened_at: '2018-02-05T17:59:00.000000Z' closed_by: null closed_at: '2010-11-02T08:00:55.000000Z' opening_balance: 3699.16 closing_balance: 3264.13 total_income: 0 total_expense: 0 total_balance: 0 status: Aberto hasSnapshot: false created_at: '1995-10-27T14:50:13.000000Z' updated_at: '2011-09-18T16:51:43.000000Z' properties: data: type: object properties: id: type: string example: 043aeaf4-bc15-3943-b432-44c3ef263800 code: type: string example: null nullable: true opened_by: type: string example: null nullable: true opened_at: type: string example: '2018-02-05T17:59:00.000000Z' closed_by: type: string example: null nullable: true closed_at: type: string example: '2010-11-02T08:00:55.000000Z' opening_balance: type: number example: 3699.16 closing_balance: type: number example: 3264.13 total_income: type: integer example: 0 total_expense: type: integer example: 0 total_balance: type: integer example: 0 status: type: string example: Aberto hasSnapshot: type: boolean example: false created_at: type: string example: '1995-10-27T14:50:13.000000Z' updated_at: type: string example: '2011-09-18T16:51:43.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: 44ffcdf9-f7b7-3649-bf2a-07a4b75ccf70 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: eeb5a27f-7d34-37e5-9b4d-729c0902c5b6 name: 'voluptate aperiam' slug: null abbreviation: null tutorials_count: 0 - id: 1d6e85a3-80aa-3145-adfd-5382e40755ff name: 'maiores qui' slug: null abbreviation: null tutorials_count: 0 properties: data: type: array example: - id: eeb5a27f-7d34-37e5-9b4d-729c0902c5b6 name: 'voluptate aperiam' slug: null abbreviation: null tutorials_count: 0 - id: 1d6e85a3-80aa-3145-adfd-5382e40755ff name: 'maiores qui' slug: null abbreviation: null tutorials_count: 0 items: type: object properties: id: type: string example: eeb5a27f-7d34-37e5-9b4d-729c0902c5b6 name: type: string example: 'voluptate aperiam' 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: '' example: null required: false schema: type: array description: '' example: null items: type: string responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 6eb4e111-a9a5-3857-9dff-59c1f50da98c name: 'Unde nihil' slug: unde-nihil-158238 description: 'Dicta autem sit in velit nihil qui vel asperiores.' icon: null color: null sort_order: 0 is_active: true created_at: null updated_at: null - id: 07446c04-75dc-36c4-8839-edeaa897bca0 name: 'Saepe est' slug: saepe-est-297535 description: 'Quia consequatur sequi nisi deleniti eaque perferendis omnis.' icon: null color: null sort_order: 0 is_active: true created_at: null updated_at: null properties: data: type: array example: - id: 6eb4e111-a9a5-3857-9dff-59c1f50da98c name: 'Unde nihil' slug: unde-nihil-158238 description: 'Dicta autem sit in velit nihil qui vel asperiores.' icon: null color: null sort_order: 0 is_active: true created_at: null updated_at: null - id: 07446c04-75dc-36c4-8839-edeaa897bca0 name: 'Saepe est' slug: saepe-est-297535 description: 'Quia consequatur sequi nisi deleniti eaque perferendis omnis.' icon: null color: null sort_order: 0 is_active: true created_at: null updated_at: null items: type: object properties: id: type: string example: 6eb4e111-a9a5-3857-9dff-59c1f50da98c name: type: string example: 'Unde nihil' slug: type: string example: unde-nihil-158238 description: type: string example: 'Dicta autem sit in velit nihil qui vel asperiores.' icon: type: string example: null nullable: true color: type: string example: null nullable: true 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: 'O campo value deve ser um UUID válido. The uuid of an existing record in the tutorial_modules table.' example: - df0654f9-79cc-3ddb-afe1-d96e0b83af3a required: false schema: type: array description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the tutorial_modules table.' example: - df0654f9-79cc-3ddb-afe1-d96e0b83af3a items: type: string - in: query name: sector_id description: '' example: null required: false schema: type: array description: '' example: null items: type: string responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 143229c2-7b91-38a1-8238-005afe5e624e title: 'Unde in quaerat magnam' description: 'Voluptate similique optio eos provident sit quia.' cover_url: null status: draft published_at: null sort_order: 0 module: id: a3296004-fb42-4fd2-bc6a-a9ccb83c3de8 name: 'Quod incidunt' slug: quod-incidunt-684191 icon: null color: null created_at: null updated_at: null - id: 727498bb-56a1-33ed-be86-203d90ae04c3 title: 'Nemo dolorem et voluptatem' description: 'Nemo voluptates ut et ea.' cover_url: null status: draft published_at: null sort_order: 0 module: id: a3296004-fd60-47b9-aa03-1f7a77ed1068 name: 'Cumque repudiandae' slug: cumque-repudiandae-775793 icon: null color: 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: 143229c2-7b91-38a1-8238-005afe5e624e title: 'Unde in quaerat magnam' description: 'Voluptate similique optio eos provident sit quia.' cover_url: null status: draft published_at: null sort_order: 0 module: id: a3296004-fb42-4fd2-bc6a-a9ccb83c3de8 name: 'Quod incidunt' slug: quod-incidunt-684191 icon: null color: null created_at: null updated_at: null - id: 727498bb-56a1-33ed-be86-203d90ae04c3 title: 'Nemo dolorem et voluptatem' description: 'Nemo voluptates ut et ea.' cover_url: null status: draft published_at: null sort_order: 0 module: id: a3296004-fd60-47b9-aa03-1f7a77ed1068 name: 'Cumque repudiandae' slug: cumque-repudiandae-775793 icon: null color: null created_at: null updated_at: null items: type: object properties: id: type: string example: 143229c2-7b91-38a1-8238-005afe5e624e title: type: string example: 'Unde in quaerat magnam' description: type: string example: 'Voluptate similique optio eos provident sit quia.' cover_url: type: string example: null nullable: true 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: a3296004-fb42-4fd2-bc6a-a9ccb83c3de8 name: type: string example: 'Quod incidunt' slug: type: string example: quod-incidunt-684191 icon: type: string example: null nullable: true color: 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: - '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: 9733414e-32bd-33a0-a9dd-87bc8a244f5c title: 'Sit nisi eos omnis' description: 'Sint dolores impedit quasi.' cover_url: null status: draft published_at: null sort_order: 0 module: id: a3296005-041c-44bc-86ad-829822016d3f name: 'Est recusandae' slug: est-recusandae-566158 icon: null color: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 9733414e-32bd-33a0-a9dd-87bc8a244f5c title: type: string example: 'Sit nisi eos omnis' description: type: string example: 'Sint dolores impedit quasi.' cover_url: type: string example: null nullable: true 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: a3296005-041c-44bc-86ad-829822016d3f name: type: string example: 'Est recusandae' slug: type: string example: est-recusandae-566158 icon: type: string example: null nullable: true color: type: string example: null nullable: true 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: 56e93eb7-b29c-34be-9456-74c7736ea58b number: 134/2026 started_at: '2026-11-06' deadline_at: '2027-11-06' work: id: a3295ff6-ad2e-4105-894f-704d9cd4179e name: 'Dr. Malu Gabriela Deverso' created_at: null updated_at: null - id: da9370f5-5f42-3b35-8914-6ecabf59e32c number: 309/2026 started_at: '2026-11-06' deadline_at: '2027-11-06' work: id: a3295ff6-b64f-4df4-aede-426f3ed0b8e5 name: 'Srta. Mari Vasques Corona Jr.' 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: 56e93eb7-b29c-34be-9456-74c7736ea58b number: 134/2026 started_at: '2026-11-06' deadline_at: '2027-11-06' work: id: a3295ff6-ad2e-4105-894f-704d9cd4179e name: 'Dr. Malu Gabriela Deverso' created_at: null updated_at: null - id: da9370f5-5f42-3b35-8914-6ecabf59e32c number: 309/2026 started_at: '2026-11-06' deadline_at: '2027-11-06' work: id: a3295ff6-b64f-4df4-aede-426f3ed0b8e5 name: 'Srta. Mari Vasques Corona Jr.' created_at: null updated_at: null items: type: object properties: id: type: string example: 56e93eb7-b29c-34be-9456-74c7736ea58b number: type: string example: 134/2026 started_at: type: string example: '2026-11-06' deadline_at: type: string example: '2027-11-06' work: type: object properties: id: type: string example: a3295ff6-ad2e-4105-894f-704d9cd4179e name: type: string example: 'Dr. Malu Gabriela Deverso' 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: 0a0f9d9c-3d84-3e28-bfd0-c40162116b46 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: 13b97750-7e58-322f-bb46-fceff44b7c66 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: ba58d8ed-84fe-3444-b32d-624f678f3d29 number: 722/2026 started_at: '2026-11-06' deadline_at: '2027-11-06' work: id: a3295ff6-c41f-401c-b992-272fe4eea64a name: 'Sr. Luciano Robson Delvalle' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: ba58d8ed-84fe-3444-b32d-624f678f3d29 number: type: string example: 722/2026 started_at: type: string example: '2026-11-06' deadline_at: type: string example: '2027-11-06' work: type: object properties: id: type: string example: a3295ff6-c41f-401c-b992-272fe4eea64a name: type: string example: 'Sr. Luciano Robson Delvalle' 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: 9 required: true schema: type: integer - in: path name: contract description: 'Contract UUID' example: nihil 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: ducimus required: true schema: type: string /api/cost-centers/next-code: get: summary: 'Suggest next code' operationId: suggestNextCode description: 'Próximo código livre sob o pai informado. O código é sugestão e pode ser alterado antes de salvar.' parameters: - in: query name: parent_id description: 'UUID do centro de custo pai. Omitido, sugere no primeiro nível.' example: ipsam required: false schema: type: string description: 'UUID do centro de custo pai. Omitido, sugere no primeiro nível.' example: ipsam responses: 200: description: '' content: application/json: schema: type: object example: code: '001.002' properties: code: type: string example: '001.002' tags: - 'Cost Centers' requestBody: required: false content: application/json: schema: type: object properties: parent_id: type: string description: 'The uuid of an existing record in the cost_centers table.' example: molestiae nullable: true /api/cost-centers/requirement-config: get: summary: 'Cost center requirement' operationId: costCenterRequirement description: 'Data a partir da qual o centro de custo é obrigatório em lançamentos novos. A tela usa isso para marcar o campo como obrigatório sem precisar tentar salvar.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: required_from: '2026-11-03' required_now: true properties: required_from: type: string example: '2026-11-03' required_now: type: boolean example: true tags: - 'Cost Centers' put: summary: 'Update cost center requirement' operationId: updateCostCenterRequirement description: 'Ajusta a data de corte. Enviar nulo desliga a obrigatoriedade.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: required_from: '2026-11-03' required_now: true properties: required_from: type: string example: '2026-11-03' required_now: type: boolean example: true tags: - 'Cost Centers' requestBody: required: true content: application/json: schema: type: object properties: required_from: type: string description: 'Data no formato Y-m-d, ou nulo para desligar' example: '2026-11-03' required: - required_from /api/cost-centers/stock-config: get: summary: 'Stock cost center' operationId: stockCostCenter description: 'Centro de custo que recebe a compra de material. A conta a pagar gerada por NF-e de produto nasce nele, porque o custo do material chega à obra pela movimentação de estoque.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: cost_center: id: uuid code: '003.001' name: 'Estoque central' properties: cost_center: type: object properties: id: type: string example: uuid code: type: string example: '003.001' name: type: string example: 'Estoque central' tags: - 'Cost Centers' put: summary: 'Update stock cost center' operationId: updateStockCostCenter description: 'Aponta a configuração para outro centro. Nulo desliga: a conta da nota passa a nascer sem centro, para ser classificada na conferência.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: cost_center: id: uuid code: '003.001' name: 'Estoque central' properties: cost_center: type: object properties: id: type: string example: uuid code: type: string example: '003.001' name: type: string example: 'Estoque central' tags: - 'Cost Centers' requestBody: required: true content: application/json: schema: type: object properties: cost_center_id: type: string description: 'UUID do centro de custo, ou nulo' example: omnis required: - cost_center_id /api/cost-centers: get: summary: 'List cost centers' operationId: listCostCenters description: 'Lista plana ordenada por código, sem paginação. Cada item traz nível e caminho completo, para o cliente montar a árvore em memória.' parameters: - in: query name: q description: 'Busca por parte do nome ou do código.' example: vila required: false schema: type: string description: 'Busca por parte do nome ou do código.' example: vila nullable: true - in: query name: active description: 'Filtra por situação. Omitido, traz ativos e inativos.' example: true required: false schema: type: boolean description: 'Filtra por situação. Omitido, traz ativos e inativos.' example: true nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 0163de52-0f47-39a2-8f0c-cbc10af93972 code: '306' name: 'aut odit' level: 1 path: null is_active: true selectable: false created_at: null updated_at: null - id: cf91e2fe-a8fa-3708-8372-34801b2a0071 code: '493' name: 'itaque sint' level: 1 path: null is_active: true selectable: false created_at: null updated_at: null properties: data: type: array example: - id: 0163de52-0f47-39a2-8f0c-cbc10af93972 code: '306' name: 'aut odit' level: 1 path: null is_active: true selectable: false created_at: null updated_at: null - id: cf91e2fe-a8fa-3708-8372-34801b2a0071 code: '493' name: 'itaque sint' level: 1 path: null is_active: true selectable: false created_at: null updated_at: null items: type: object properties: id: type: string example: 0163de52-0f47-39a2-8f0c-cbc10af93972 code: type: string example: '306' name: type: string example: 'aut odit' level: type: integer example: 1 path: type: string example: null nullable: true is_active: type: boolean example: true selectable: type: boolean example: false created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Cost Centers' post: summary: 'Create cost center' operationId: createCostCenter description: 'Cadastra um centro de custo' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Cost Centers' requestBody: required: true content: application/json: schema: type: object properties: code: type: string description: 'Código. Must match the regex /^\d{3}(\.\d{3}){0,2}$/.' example: 'Example Code' name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' parent_id: type: string description: 'Centro de custo pai. The uuid of an existing record in the cost_centers table.' example: 6927a136-b3e0-3b9b-914f-69130594bf3a nullable: true work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: 3a015543-8199-30ef-bad2-7cf8f0397d76 nullable: true is_active: type: boolean description: Situação. example: true required: - code - name '/api/cost-centers/{costCenter}': get: summary: 'Show cost center' operationId: showCostCenter description: 'Detalhe de um centro de custo' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: id: 300209f5-0942-3145-84a5-17120f4b3da6 code: '370' name: 'eos molestiae' level: 1 path: null is_active: true selectable: false created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 300209f5-0942-3145-84a5-17120f4b3da6 code: type: string example: '370' name: type: string example: 'eos molestiae' level: type: integer example: 1 path: type: string example: null nullable: true is_active: type: boolean example: true selectable: type: boolean example: false created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Cost Centers' put: summary: 'Update cost center' operationId: updateCostCenter description: 'Atualiza um centro de custo, inclusive a situação (inativar e reativar)' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Cost Centers' requestBody: required: false content: application/json: schema: type: object properties: code: type: string description: 'Código. Must match the regex /^\d{3}(\.\d{3}){0,2}$/.' example: 'Example Code' name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' parent_id: type: string description: 'Centro de custo pai. The uuid of an existing record in the cost_centers table.' example: 63013f2a-f14a-34cd-bfaf-b35f0b7fde9f nullable: true work_id: type: string description: 'Obra. The uuid of an existing record in the works table.' example: 90195977-7fef-35cb-973e-170e0c26e38d nullable: true is_active: type: boolean description: Situação. example: true delete: summary: 'Delete cost center' operationId: deleteCostCenter description: 'Exclui um centro de custo. Só é permitido quando ele não tem centros abaixo nem lançamentos.' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Cost Centers' parameters: - in: path name: costCenter description: 'Cost center UUID' example: sit 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: 56938128-bb94-30cc-bb69-c65280ae9830 name: 'Matias Leon Lutero' email: montenegro.danilo@example.net phone: '(47) 3159-4164' document: 431.304.278-48 type: pf responsible: 'Srta. Kamila Meireles Ferraz 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: 2a07d594-2ada-323c-9b5e-eed382edd578 name: 'Ellen Cervantes' email: gbranco@example.net phone: '(11) 2507-4761' document: 438.680.406-41 type: pf responsible: 'Nádia Violeta Lourenço' 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: 56938128-bb94-30cc-bb69-c65280ae9830 name: 'Matias Leon Lutero' email: montenegro.danilo@example.net phone: '(47) 3159-4164' document: 431.304.278-48 type: pf responsible: 'Srta. Kamila Meireles Ferraz 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: 2a07d594-2ada-323c-9b5e-eed382edd578 name: 'Ellen Cervantes' email: gbranco@example.net phone: '(11) 2507-4761' document: 438.680.406-41 type: pf responsible: 'Nádia Violeta Lourenço' 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: 56938128-bb94-30cc-bb69-c65280ae9830 name: type: string example: 'Matias Leon Lutero' email: type: string example: montenegro.danilo@example.net phone: type: string example: '(47) 3159-4164' document: type: string example: 431.304.278-48 type: type: string example: pf responsible: type: string example: 'Srta. Kamila Meireles Ferraz 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: 0b5cbd76-2a8c-3501-b8c0-566fe9b69297 name: 'Bernardo Edilson Ferreira Neto' email: claudio.benites@example.com phone: '(42) 3386-3004' document: 955.120.995-82 type: pj responsible: 'Dr. Nádia Mônica de Freitas 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 properties: data: type: object properties: id: type: string example: 0b5cbd76-2a8c-3501-b8c0-566fe9b69297 name: type: string example: 'Bernardo Edilson Ferreira Neto' email: type: string example: claudio.benites@example.com phone: type: string example: '(42) 3386-3004' document: type: string example: 955.120.995-82 type: type: string example: pj responsible: type: string example: 'Dr. Nádia Mônica de Freitas 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 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: 4 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: caf2975c-c06b-36c9-b475-89d63cc0abb7 code: RDO-06-11-26 report_number: 1 date: '2026-11-06' status: id: a3295ff7-40db-4a97-a47c-0b67a884be92 slug: null name: null abbreviation: voluptates color: '#f6f1a5' text_color: '#2b7257' work: id: a3295ff7-37e3-4a76-ad0a-56541acdedb2 name: 'Sr. Marco Amaral Pedrosa' started_at: '1981-06-02 21:39:33' filled_by: id: a3295ff7-3d63-4beb-ab85-2816c12692cd name: 'Saul Watsica' contract_number: 940/2026 deadline_at: '2027-11-06' 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: 519ca545-6c30-3c7c-a116-a335c5aa3400 code: RDO-06-11-26 report_number: 1 date: '2026-11-06' status: id: a3295ff7-4b0c-406a-b731-4cf9d7db0a76 slug: null name: null abbreviation: nulla color: '#db669d' text_color: '#b33a09' work: id: a3295ff7-44e8-48e8-9374-7fcef62adacd name: 'Ester Perez Sobrinho' started_at: '1995-06-05 06:18:07' filled_by: id: a3295ff7-4941-4c30-9d6b-57223d7bd9ff name: 'Prof. Alphonso Spinka DVM' contract_number: 409/2026 deadline_at: '2027-11-06' 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: caf2975c-c06b-36c9-b475-89d63cc0abb7 code: RDO-06-11-26 report_number: 1 date: '2026-11-06' status: id: a3295ff7-40db-4a97-a47c-0b67a884be92 slug: null name: null abbreviation: voluptates color: '#f6f1a5' text_color: '#2b7257' work: id: a3295ff7-37e3-4a76-ad0a-56541acdedb2 name: 'Sr. Marco Amaral Pedrosa' started_at: '1981-06-02 21:39:33' filled_by: id: a3295ff7-3d63-4beb-ab85-2816c12692cd name: 'Saul Watsica' contract_number: 940/2026 deadline_at: '2027-11-06' 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: 519ca545-6c30-3c7c-a116-a335c5aa3400 code: RDO-06-11-26 report_number: 1 date: '2026-11-06' status: id: a3295ff7-4b0c-406a-b731-4cf9d7db0a76 slug: null name: null abbreviation: nulla color: '#db669d' text_color: '#b33a09' work: id: a3295ff7-44e8-48e8-9374-7fcef62adacd name: 'Ester Perez Sobrinho' started_at: '1995-06-05 06:18:07' filled_by: id: a3295ff7-4941-4c30-9d6b-57223d7bd9ff name: 'Prof. Alphonso Spinka DVM' contract_number: 409/2026 deadline_at: '2027-11-06' 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: caf2975c-c06b-36c9-b475-89d63cc0abb7 code: type: string example: RDO-06-11-26 report_number: type: integer example: 1 date: type: string example: '2026-11-06' status: type: object properties: id: type: string example: a3295ff7-40db-4a97-a47c-0b67a884be92 slug: type: string example: null nullable: true name: type: string example: null nullable: true abbreviation: type: string example: voluptates color: type: string example: '#f6f1a5' text_color: type: string example: '#2b7257' work: type: object properties: id: type: string example: a3295ff7-37e3-4a76-ad0a-56541acdedb2 name: type: string example: 'Sr. Marco Amaral Pedrosa' started_at: type: string example: '1981-06-02 21:39:33' filled_by: type: object properties: id: type: string example: a3295ff7-3d63-4beb-ab85-2816c12692cd name: type: string example: 'Saul Watsica' contract_number: type: string example: 940/2026 deadline_at: type: string example: '2027-11-06' 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: 4b36afdb-aea8-3546-8750-46396cb0d43f nullable: true contract_id: type: string description: 'Contrato. The uuid of an existing record in the contracts table.' example: 7f32d83f-9dc9-3c54-a87e-c413a2d204b5 nullable: true status_id: type: string description: 'Status. The uuid of an existing record in the statuses table.' example: a207375b-bf72-3b0f-8cdb-3d8cc627bfcd nullable: true filled_by: type: string description: 'Preenchido por. The uuid of an existing record in the users table.' example: 5b279b15-eafe-3b9e-8ec3-ff68ae947f52 nullable: true responsible_id: type: string description: 'Responsável. The uuid of an existing record in the users table.' example: a4da5c32-3367-3059-a8e9-927f3ea3090a 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: e81d2732-4b20-3ff9-82bf-9bec25b3ca4c 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: 63f19bd4-1a78-3e33-9ae7-9fb57b17e9dd code: RDO-06-11-26 report_number: 1 date: '2026-11-06' status: id: a3295ff7-6552-4095-8de3-d9988f320e83 slug: null name: null abbreviation: voluptatem color: '#23439f' text_color: '#c3fa65' work: id: a3295ff7-587f-4d9a-abf4-a05bcb05a374 name: 'Davi Maurício Maldonado Jr.' started_at: '2021-07-21 02:58:25' filled_by: id: a3295ff7-6363-4bf8-b5f5-8eb3218718d0 name: 'Prof. Eulalia Gaylord IV' contract_number: 895/2026 deadline_at: '2027-11-06' 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: 63f19bd4-1a78-3e33-9ae7-9fb57b17e9dd code: type: string example: RDO-06-11-26 report_number: type: integer example: 1 date: type: string example: '2026-11-06' status: type: object properties: id: type: string example: a3295ff7-6552-4095-8de3-d9988f320e83 slug: type: string example: null nullable: true name: type: string example: null nullable: true abbreviation: type: string example: voluptatem color: type: string example: '#23439f' text_color: type: string example: '#c3fa65' work: type: object properties: id: type: string example: a3295ff7-587f-4d9a-abf4-a05bcb05a374 name: type: string example: 'Davi Maurício Maldonado Jr.' started_at: type: string example: '2021-07-21 02:58:25' filled_by: type: object properties: id: type: string example: a3295ff7-6363-4bf8-b5f5-8eb3218718d0 name: type: string example: 'Prof. Eulalia Gaylord IV' contract_number: type: string example: 895/2026 deadline_at: type: string example: '2027-11-06' 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: f5749054-223c-4687-8ef7-2a6e2aa696f3 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: quidem 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: omnis 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: temporibus 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: sint 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: quaerat 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: dicta required: true schema: type: string - in: path name: id description: 'The ID of the photo.' example: ex required: true schema: type: string - in: path name: photo description: 'Photo (File) UUID' example: qui 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: deleniti required: true schema: type: string - in: path name: photo description: 'Photo (File) UUID' example: itaque 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: 4ba9bafb-631c-359c-9e5f-7fd2d960801b name: Culpa code: PJN description: 'Optio quas voluptas labore qui in cumque soluta.' active: true - id: 2454f261-dd60-3eda-aba6-dc8e1919d380 name: Id code: FBP description: 'Accusantium ut voluptas qui nihil ipsam.' 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: 4ba9bafb-631c-359c-9e5f-7fd2d960801b name: Culpa code: PJN description: 'Optio quas voluptas labore qui in cumque soluta.' active: true - id: 2454f261-dd60-3eda-aba6-dc8e1919d380 name: Id code: FBP description: 'Accusantium ut voluptas qui nihil ipsam.' active: true items: type: object properties: id: type: string example: 4ba9bafb-631c-359c-9e5f-7fd2d960801b name: type: string example: Culpa code: type: string example: PJN description: type: string example: 'Optio quas voluptas labore qui in cumque soluta.' 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: 1179d834-fbcd-39c9-a6f2-f024fa8ffc96 name: Porro code: BPA description: 'Est nulla eaque ea eum assumenda.' active: true properties: data: type: object properties: id: type: string example: 1179d834-fbcd-39c9-a6f2-f024fa8ffc96 name: type: string example: Porro code: type: string example: BPA description: type: string example: 'Est nulla eaque ea eum assumenda.' 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: dolorum 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: omnis 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: 453222a4-ae10-324a-b61a-25b0c7ecb3e6 name: 'Sr. Fabiano Adriel de Arruda Filho' description: 'Vel corrupti et nihil voluptas ipsum. Sit itaque excepturi ut aut consectetur quibusdam. Quia id ut est vel voluptatibus rerum et. Velit id autem consequatur perspiciatis id.' module: document - id: bbe7e4b7-98e2-373f-bcaf-02a69989f5da name: 'Emanuelly Michelle Assunção' description: 'Ut quasi nam culpa voluptatem eos dolores repellendus. Minus odio nulla qui error. Voluptas repudiandae voluptas rerum laborum pariatur perspiciatis ad iure. Est est veniam esse culpa qui aut ut.' 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: 453222a4-ae10-324a-b61a-25b0c7ecb3e6 name: 'Sr. Fabiano Adriel de Arruda Filho' description: 'Vel corrupti et nihil voluptas ipsum. Sit itaque excepturi ut aut consectetur quibusdam. Quia id ut est vel voluptatibus rerum et. Velit id autem consequatur perspiciatis id.' module: document - id: bbe7e4b7-98e2-373f-bcaf-02a69989f5da name: 'Emanuelly Michelle Assunção' description: 'Ut quasi nam culpa voluptatem eos dolores repellendus. Minus odio nulla qui error. Voluptas repudiandae voluptas rerum laborum pariatur perspiciatis ad iure. Est est veniam esse culpa qui aut ut.' module: document items: type: object properties: id: type: string example: 453222a4-ae10-324a-b61a-25b0c7ecb3e6 name: type: string example: 'Sr. Fabiano Adriel de Arruda Filho' description: type: string example: 'Vel corrupti et nihil voluptas ipsum. Sit itaque excepturi ut aut consectetur quibusdam. Quia id ut est vel voluptatibus rerum et. Velit id autem consequatur perspiciatis id.' 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: 8be74317-6cd5-3e37-a793-ea74f327b424 name: 'Dr. Diana Cervantes Jr.' description: 'Ad et est ut fuga voluptatem libero delectus. Et sit repudiandae ab nihil quidem quia quis. Dicta at neque quis aut aut odit ea.' module: document properties: data: type: object properties: id: type: string example: 8be74317-6cd5-3e37-a793-ea74f327b424 name: type: string example: 'Dr. Diana Cervantes Jr.' description: type: string example: 'Ad et est ut fuga voluptatem libero delectus. Et sit repudiandae ab nihil quidem quia quis. Dicta at neque quis aut aut odit ea.' 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: enim 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: - sed required: false schema: type: array description: 'The uuid of an existing record in the document_categories table.' example: - sed 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: culpa required: false schema: type: string description: 'Type of the related documentable entity. The type of an existing record in the documentables table.' example: culpa nullable: true - in: query name: customers description: 'The uuid of an existing record in the customers table.' example: - aut required: false schema: type: array description: 'The uuid of an existing record in the customers table.' example: - aut items: type: string - in: query name: suppliers description: 'The uuid of an existing record in the suppliers table.' example: - ratione required: false schema: type: array description: 'The uuid of an existing record in the suppliers table.' example: - ratione items: type: string responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 2cf68f69-bbbf-3672-91ab-03f52059e83a name: 'Teobaldo Isaac Campos Neto' file: id: null url: null extension: null created_at: null updated_at: null - id: 33987e3b-9f65-3525-ab74-03e584a4408b name: 'Eric das Dores Valente' 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: 2cf68f69-bbbf-3672-91ab-03f52059e83a name: 'Teobaldo Isaac Campos Neto' file: id: null url: null extension: null created_at: null updated_at: null - id: 33987e3b-9f65-3525-ab74-03e584a4408b name: 'Eric das Dores Valente' file: id: null url: null extension: null created_at: null updated_at: null items: type: object properties: id: type: string example: 2cf68f69-bbbf-3672-91ab-03f52059e83a name: type: string example: 'Teobaldo Isaac Campos 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 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: 395f8e06-1b17-39be-a66e-24de5efb7075 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: d5e39173-6f56-3a1a-887f-649d7dfe92e1 name: 'Cristian Emiliano Rico' file: id: null url: null extension: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: d5e39173-6f56-3a1a-887f-649d7dfe92e1 name: type: string example: 'Cristian Emiliano Rico' 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: 4e088904-8d7d-3505-96ef-8f50df227850 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: 10 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: eos nullable: true renewal_status: type: string description: '' example: pending enum: - pending - completed - ignored nullable: true urgency: type: string description: '' example: expires_30_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: non nullable: true epi_type_id: type: string description: 'The uuid of an existing record in the epi_types table.' example: possimus 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: minus 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: alias 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: 7e7963f3-7ce3-3cc0-9c73-2b07098ea5b6 name: 'aliquid et' default_validity_days: 557 requires_signature: false numero_ca: '38017' product: null available_quantity: null created_at: null updated_at: null - id: 5e98ff64-8fbd-37ff-b23c-3d1bfe7f46f2 name: 'qui sit' default_validity_days: 68 requires_signature: false numero_ca: '15674' 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: 7e7963f3-7ce3-3cc0-9c73-2b07098ea5b6 name: 'aliquid et' default_validity_days: 557 requires_signature: false numero_ca: '38017' product: null available_quantity: null created_at: null updated_at: null - id: 5e98ff64-8fbd-37ff-b23c-3d1bfe7f46f2 name: 'qui sit' default_validity_days: 68 requires_signature: false numero_ca: '15674' product: null available_quantity: null created_at: null updated_at: null items: type: object properties: id: type: string example: 7e7963f3-7ce3-3cc0-9c73-2b07098ea5b6 name: type: string example: 'aliquid et' default_validity_days: type: integer example: 557 requires_signature: type: boolean example: false numero_ca: type: string example: '38017' 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: error nullable: true stock_id: type: string description: 'The uuid of an existing record in the stocks table.' example: architecto 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: 0d3ccbfd-4635-35e7-a9e5-921e9e2d84c5 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: b24c5c56-ae3e-37ec-83f9-fc95ccc971be 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: maiores nullable: true stock_id: type: string description: 'The uuid of an existing record in the stocks table.' example: et 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: 29256266-2dd2-370d-9fda-9c08c4f7df3a name: 'autem id' default_validity_days: 216 requires_signature: false numero_ca: '40150' product: null available_quantity: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 29256266-2dd2-370d-9fda-9c08c4f7df3a name: type: string example: 'autem id' default_validity_days: type: integer example: 216 requires_signature: type: boolean example: false numero_ca: type: string example: '40150' 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: quam 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: eb254c05-38a6-3eb4-a3bb-16fe124faa80 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: bb5ef129-349c-33a8-b041-a4f52cd2d877 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: d6d493c3-012f-30cd-b8ae-2a226a4b82e9 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: f40c2139-5d53-3dc8-a6c6-c3864b26d7f7 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: c15f1dcc-0942-34f7-9377-678a3eda0964 required: - action parameters: - in: path name: epiType description: 'EPI type UUID' example: cumque 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: 55b35ae7-5ea3-424f-8b9d-49f0f9d3b6b9 name: delectus description: 'Qui autem aut nihil itaque laboriosam nulla autem.' created_at: null updated_at: null - id: b09d0096-b763-4495-8455-49707456a18e name: autem description: 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: 55b35ae7-5ea3-424f-8b9d-49f0f9d3b6b9 name: delectus description: 'Qui autem aut nihil itaque laboriosam nulla autem.' created_at: null updated_at: null - id: b09d0096-b763-4495-8455-49707456a18e name: autem description: null created_at: null updated_at: null items: type: object properties: id: type: string example: 55b35ae7-5ea3-424f-8b9d-49f0f9d3b6b9 name: type: string example: delectus description: type: string example: 'Qui autem aut nihil itaque laboriosam nulla 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: - '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: f964e01a-5e4a-46bf-9009-6b120f437473 name: dicta description: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: f964e01a-5e4a-46bf-9009-6b120f437473 name: type: string example: dicta 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: odit 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: 87 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: 10 nullable: true q: type: string description: '' example: minima nullable: true employee_id: type: string description: 'The uuid of an existing record in the employees table.' example: sapiente 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: - consequatur required: false schema: type: array description: 'The uuid of an existing record in the employee_roles table.' example: - consequatur 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: e21a79c3-bf03-4228-b522-ff9595b58f85 name: 'Máximo Ortiz Jr.' cpf: 323.792.263-85 rg: null ctps: null phone: '(43) 97072-0925' birthdate: '1989-08-26' email: null pis_pasep: null admission_date: '2004-10-24' daily_salary: '152.41' monthly_salary: null nationality: Tunísia 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: a3295ff7-feb3-4c24-b22e-f7ed89e473c8 name: qui created_at: null updated_at: null - id: b47b4cb8-0da5-4134-9a89-d9a6a9788c83 name: 'Juan Carrara Filho' cpf: 845.842.034-42 rg: null ctps: null phone: '(11) 2774-6180' birthdate: null email: carla56@example.com pis_pasep: '07798237010' admission_date: '1988-11-11' daily_salary: null monthly_salary: '5667.82' nationality: null 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: a3295ff8-01d0-44b0-ac80-e0f78ca87224 name: nesciunt created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: '/?page=86' next: null meta: current_page: 87 from: 861 last_page: 1 links: - url: '/?page=86' label: '« Anterior' page: 86 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: 862 total: 2 properties: data: type: array example: - id: e21a79c3-bf03-4228-b522-ff9595b58f85 name: 'Máximo Ortiz Jr.' cpf: 323.792.263-85 rg: null ctps: null phone: '(43) 97072-0925' birthdate: '1989-08-26' email: null pis_pasep: null admission_date: '2004-10-24' daily_salary: '152.41' monthly_salary: null nationality: Tunísia 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: a3295ff7-feb3-4c24-b22e-f7ed89e473c8 name: qui created_at: null updated_at: null - id: b47b4cb8-0da5-4134-9a89-d9a6a9788c83 name: 'Juan Carrara Filho' cpf: 845.842.034-42 rg: null ctps: null phone: '(11) 2774-6180' birthdate: null email: carla56@example.com pis_pasep: '07798237010' admission_date: '1988-11-11' daily_salary: null monthly_salary: '5667.82' nationality: null 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: a3295ff8-01d0-44b0-ac80-e0f78ca87224 name: nesciunt created_at: null updated_at: null items: type: object properties: id: type: string example: e21a79c3-bf03-4228-b522-ff9595b58f85 name: type: string example: 'Máximo Ortiz Jr.' cpf: type: string example: 323.792.263-85 rg: type: string example: null nullable: true ctps: type: string example: null nullable: true phone: type: string example: '(43) 97072-0925' birthdate: type: string example: '1989-08-26' email: type: string example: null nullable: true pis_pasep: type: string example: null nullable: true admission_date: type: string example: '2004-10-24' daily_salary: type: string example: '152.41' monthly_salary: type: string example: null nullable: true nationality: type: string example: Tunísia 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: a3295ff7-feb3-4c24-b22e-f7ed89e473c8 name: type: string example: qui 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=86' next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 87 from: type: integer example: 861 last_page: type: integer example: 1 links: type: array example: - url: '/?page=86' label: '« Anterior' page: 86 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=86' label: type: string example: '« Anterior' page: type: integer example: 86 active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 862 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: 363e5e81-4685-4f01-a8f9-74b81f974e64 name: 'Sr. Luan Gil Filho' cpf: 015.802.953-21 rg: null ctps: null phone: '(18) 99417-4973' birthdate: '2000-06-30' email: lorenzo.pontes@example.com pis_pasep: null admission_date: '1993-05-04' daily_salary: '143.83' monthly_salary: '7348.58' nationality: null 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: a3295ff8-175c-43b8-be07-550134046fac name: aut created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 363e5e81-4685-4f01-a8f9-74b81f974e64 name: type: string example: 'Sr. Luan Gil Filho' cpf: type: string example: 015.802.953-21 rg: type: string example: null nullable: true ctps: type: string example: null nullable: true phone: type: string example: '(18) 99417-4973' birthdate: type: string example: '2000-06-30' email: type: string example: lorenzo.pontes@example.com pis_pasep: type: string example: null nullable: true admission_date: type: string example: '1993-05-04' daily_salary: type: string example: '143.83' monthly_salary: type: string example: '7348.58' nationality: type: string example: null nullable: true 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: a3295ff8-175c-43b8-be07-550134046fac name: type: string example: aut 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: 3896eb9c-79be-4f17-ae20-4c54b577c330 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: - voluptas required: false schema: type: array description: 'The uuid of an existing record in the employee_roles table.' example: - voluptas 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: b475adef-1c10-4aa9-965c-cc68831af602 name: 'Dr. Agostinho Luciano Camacho' cpf: 844.851.508-94 rg: '940160858' ctps: null phone: '(54) 98684-4339' birthdate: null email: carolina82@example.com pis_pasep: null admission_date: '2010-06-01' daily_salary: null monthly_salary: '7985.23' nationality: Croácia 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: a3295ff8-0e1d-4134-b385-9f634ee9dfe1 name: quod created_at: null updated_at: null properties: data: type: object properties: id: type: string example: b475adef-1c10-4aa9-965c-cc68831af602 name: type: string example: 'Dr. Agostinho Luciano Camacho' cpf: type: string example: 844.851.508-94 rg: type: string example: '940160858' ctps: type: string example: null nullable: true phone: type: string example: '(54) 98684-4339' birthdate: type: string example: null nullable: true email: type: string example: carolina82@example.com pis_pasep: type: string example: null nullable: true admission_date: type: string example: '2010-06-01' daily_salary: type: string example: null nullable: true monthly_salary: type: string example: '7985.23' nationality: type: string example: Croácia 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: a3295ff8-0e1d-4134-b385-9f634ee9dfe1 name: type: string example: quod 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: f745f207-c0a7-4ecb-9bd1-225a0aa67b6a 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: 18 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: 618431ab-b306-4d3e-85b5-a3dff0a0502f name: 'Michelle Clarice Gonçalves' cpf: 155.696.868-14 rg: '339206686' ctps: null phone: '(28) 4526-4708' birthdate: '1984-03-18' email: daniel57@example.org pis_pasep: '64556637148' admission_date: '1998-11-01' daily_salary: null monthly_salary: '5480.19' nationality: null 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: a3295ff8-2610-4224-8c68-97cae160c8e5 name: ut created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 618431ab-b306-4d3e-85b5-a3dff0a0502f name: type: string example: 'Michelle Clarice Gonçalves' cpf: type: string example: 155.696.868-14 rg: type: string example: '339206686' ctps: type: string example: null nullable: true phone: type: string example: '(28) 4526-4708' birthdate: type: string example: '1984-03-18' email: type: string example: daniel57@example.org pis_pasep: type: string example: '64556637148' admission_date: type: string example: '1998-11-01' daily_salary: type: string example: null nullable: true monthly_salary: type: string example: '5480.19' nationality: type: string example: null nullable: true 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: a3295ff8-2610-4224-8c68-97cae160c8e5 name: type: string example: ut 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-11-06' 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: d5e26f3f-def7-4dfb-abec-d36b8ded8f77 name: 'Eric Azevedo Aguiar' cpf: 114.998.391-10 rg: '009453181' ctps: null phone: '(83) 2696-0084' birthdate: '2026-03-14' email: null pis_pasep: '54134947525' admission_date: '2016-06-30' daily_salary: '65.29' monthly_salary: null nationality: Croácia 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: a3295ff8-2c61-465c-aa75-406d184cbb78 name: perspiciatis created_at: null updated_at: null properties: data: type: object properties: id: type: string example: d5e26f3f-def7-4dfb-abec-d36b8ded8f77 name: type: string example: 'Eric Azevedo Aguiar' cpf: type: string example: 114.998.391-10 rg: type: string example: '009453181' ctps: type: string example: null nullable: true phone: type: string example: '(83) 2696-0084' birthdate: type: string example: '2026-03-14' email: type: string example: null nullable: true pis_pasep: type: string example: '54134947525' admission_date: type: string example: '2016-06-30' daily_salary: type: string example: '65.29' monthly_salary: type: string example: null nullable: true nationality: type: string example: Croácia 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: a3295ff8-2c61-465c-aa75-406d184cbb78 name: type: string example: perspiciatis 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-11-06' 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: rem agency: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: gubo account: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: q 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: mfluyriurccjzdwja 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: 1 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: enim agency: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: zodllleexsrlr account: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: rvfwto account_type: type: string description: '' example: poupança enum: - corrente - poupança pix_key: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: fzhdpaqfivbsnjqpvke nullable: true favorite: type: boolean description: '' 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: '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: temporibus 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: id 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: 2567b47a-8f67-314e-92d7-60df8ca8f4b2 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: 5a5c14cd-1d6e-47f7-b978-727bab24bbee nullable: true stock_id: type: string description: 'Estoque. The uuid of an existing record in the stocks table.' example: 3230b8ca-5c1f-3720-bd49-2f8b5280194a 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: facere 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: omnis 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: 7264860a-5116-3d7f-990d-72fa807cb1cf 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: fa3d581b-c38d-47d5-9e27-02d7f59fe248 nullable: true stock_id: type: string description: 'Estoque. The uuid of an existing record in the stocks table.' example: 1e7794cf-08ba-3212-a466-b49cbbf23070 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: 11 required: true schema: type: integer - in: path name: id description: 'EPI delivery UUID' example: voluptas required: true schema: type: string - in: path name: employee description: 'Employee UUID' example: odit 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: bbd4ca6b-5f8c-4a9c-b6ad-5e70a502a083 nullable: true stock_id: type: string description: 'Estoque. The uuid of an existing record in the stocks table.' example: 6927c6a7-b95c-3d9e-a9d7-fedfcb34ebba 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: 074e7ae6-78c7-31d1-92b7-ddc2c57c6e27 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: natus 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: est required: true schema: type: string - in: path name: id description: 'EPI delivery UUID' example: eligendi 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: aut required: true schema: type: string - in: path name: id description: 'EPI delivery UUID' example: quia 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: created_at 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: 47 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: 7 nullable: true q: type: string description: '' example: eaque nullable: true employee_id: type: string description: 'The uuid of an existing record in the employees table.' example: illum nullable: true has_term: type: boolean description: '' example: true nullable: true parameters: - in: path name: employee_id description: 'The ID of the employee.' example: 13 required: true schema: type: integer - in: path name: employee description: 'Employee UUID' example: voluptas 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: quaerat required: true schema: type: string - in: path name: kitUuid description: 'Kit UUID' example: 41209750-fb34-38d0-8ece-4b29de60703c 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: impedit required: true schema: type: string - in: path name: kitUuid description: 'Kit UUID' example: a0d570d8-84b4-38e0-9354-cddd77b3ed29 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: f29366c9-3745-3467-8f0d-b7a14da90660 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: dab52a22-5b65-30c4-841a-88106cf1014e 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: 205dd305-fbeb-3a6d-b852-95533632d867 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: 9b9666ba-0f64-3aa1-acfa-dac6c1ceabae document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '57346366959219299865659780501736487438170114' nfe_number: '505213' nfe_series: '44' issue_date: '1974-01-02T03:00:00.000000Z' total_value: '7560.09' emit: cnpj: '09659616498440' name: 'Gibson, Kozey and Runolfsdottir' dest: document: '42710274160507' name: Hyatt-Senger supplier: id: a3295ffa-4140-4049-bd34-ec714575ac5c name: 'Dr. Luis Nero Bonilha Neto' document: 62.226.435/0001-06 financial_status: pending products_imported_at: null created_at: null - id: de525b46-7eee-3164-85b2-fd0f74dff1e5 document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '91672342579726519026148026762199222333768146' nfe_number: '828122' nfe_series: '40' issue_date: '1981-07-23T03:00:00.000000Z' total_value: '1748.78' emit: cnpj: '25605107232023' name: 'Renner Ltd' dest: document: '47865344272827' name: 'Hermann Ltd' supplier: id: a3295ffa-4b22-48c3-a5c9-70fd75e395df name: 'Willian Brito Queirós Sobrinho' document: 89.547.100/0001-46 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: 9b9666ba-0f64-3aa1-acfa-dac6c1ceabae document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '57346366959219299865659780501736487438170114' nfe_number: '505213' nfe_series: '44' issue_date: '1974-01-02T03:00:00.000000Z' total_value: '7560.09' emit: cnpj: '09659616498440' name: 'Gibson, Kozey and Runolfsdottir' dest: document: '42710274160507' name: Hyatt-Senger supplier: id: a3295ffa-4140-4049-bd34-ec714575ac5c name: 'Dr. Luis Nero Bonilha Neto' document: 62.226.435/0001-06 financial_status: pending products_imported_at: null created_at: null - id: de525b46-7eee-3164-85b2-fd0f74dff1e5 document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '91672342579726519026148026762199222333768146' nfe_number: '828122' nfe_series: '40' issue_date: '1981-07-23T03:00:00.000000Z' total_value: '1748.78' emit: cnpj: '25605107232023' name: 'Renner Ltd' dest: document: '47865344272827' name: 'Hermann Ltd' supplier: id: a3295ffa-4b22-48c3-a5c9-70fd75e395df name: 'Willian Brito Queirós Sobrinho' document: 89.547.100/0001-46 financial_status: pending products_imported_at: null created_at: null items: type: object properties: id: type: string example: 9b9666ba-0f64-3aa1-acfa-dac6c1ceabae 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: '57346366959219299865659780501736487438170114' nfe_number: type: string example: '505213' nfe_series: type: string example: '44' issue_date: type: string example: '1974-01-02T03:00:00.000000Z' total_value: type: string example: '7560.09' emit: type: object properties: cnpj: type: string example: '09659616498440' name: type: string example: 'Gibson, Kozey and Runolfsdottir' dest: type: object properties: document: type: string example: '42710274160507' name: type: string example: Hyatt-Senger supplier: type: object properties: id: type: string example: a3295ffa-4140-4049-bd34-ec714575ac5c name: type: string example: 'Dr. Luis Nero Bonilha Neto' document: type: string example: 62.226.435/0001-06 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: corporis 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: exercitationem work_id: type: string description: 'The uuid of an existing record in the works table.' example: iusto products_status: type: string description: '' example: imported enum: - imported - pending financial_status: type: string description: '' example: partial enum: - pending - partial - generated start_date: type: string description: 'O campo value deve ser uma data válida.' example: '2026-11-06T13:03:12' 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: '2093-01-12' per_page: type: integer description: 'O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 2 cost_centers: type: array description: 'The uuid of an existing record in the cost_centers table.' example: - magni items: type: string 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: d8a61ba3-bfed-308b-b8c7-6364ff79e34a document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '72118191611829069103468322121241950635230136' nfe_number: '363397' nfe_series: '76' issue_date: '2013-10-08T03:00:00.000000Z' total_value: '479.20' emit: cnpj: '58768067191855' name: Langosh-Lakin dest: document: '46418936201386' name: "O'Keefe PLC" supplier: id: a3295ffa-5e5c-4f5e-aa05-4edec85c8dc5 name: 'Srta. Josefina Corona Lira' document: 30.520.863/0001-50 financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: d8a61ba3-bfed-308b-b8c7-6364ff79e34a 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: '72118191611829069103468322121241950635230136' nfe_number: type: string example: '363397' nfe_series: type: string example: '76' issue_date: type: string example: '2013-10-08T03:00:00.000000Z' total_value: type: string example: '479.20' emit: type: object properties: cnpj: type: string example: '58768067191855' name: type: string example: Langosh-Lakin dest: type: object properties: document: type: string example: '46418936201386' name: type: string example: "O'Keefe PLC" supplier: type: object properties: id: type: string example: a3295ffa-5e5c-4f5e-aa05-4edec85c8dc5 name: type: string example: 'Srta. Josefina Corona Lira' document: type: string example: 30.520.863/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: s3_file_path: type: string description: '' example: qui 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: - consequatur 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: 5f296db5-1214-31e8-b063-aa477968c966 document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '63573033282060467482259308540818556475134602' nfe_number: '894742' nfe_series: '63' issue_date: '1991-02-18T03:00:00.000000Z' total_value: '7485.56' emit: cnpj: '14336184247539' name: 'Sipes Inc' dest: document: '55665382584516' name: 'Feest LLC' supplier: id: a3295ffa-717c-49e6-a0a3-ce753b486b36 name: 'Dr. Thales Quintana' document: 57.763.545/0001-77 financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: 5f296db5-1214-31e8-b063-aa477968c966 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: '63573033282060467482259308540818556475134602' nfe_number: type: string example: '894742' nfe_series: type: string example: '63' issue_date: type: string example: '1991-02-18T03:00:00.000000Z' total_value: type: string example: '7485.56' emit: type: object properties: cnpj: type: string example: '14336184247539' name: type: string example: 'Sipes Inc' dest: type: object properties: document: type: string example: '55665382584516' name: type: string example: 'Feest LLC' supplier: type: object properties: id: type: string example: a3295ffa-717c-49e6-a0a3-ce753b486b36 name: type: string example: 'Dr. Thales Quintana' document: type: string example: 57.763.545/0001-77 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: maiores required: true schema: type: string '/api/fiscal-documents/{fiscalDocument}/cost-centers': get: summary: 'Fiscal document by cost center' operationId: fiscalDocumentByCostCenter description: 'Distribui a nota por centro de custo. NF-e de produto sai do estoque: o que a vinculação dos itens lançou em cada estoque de obra (quantidade × preço do lote, o mesmo cálculo do custo apropriado do painel), o que foi para o estoque principal e o que ainda não foi integrado. NFS-e sai das parcelas, pelo centro da conta gerada. As linhas somam o total da nota; a diferença vai para other_values, que pode ser negativo quando há desconto. Linhas zeradas são omitidas.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: total: '5074.19' source: stock rows: - kind: cost_center cost_center: id: uuid code: '002.001' name: 'Residencial Vila Nova' amount: '2100.00' share: 41.39 - kind: work_without_cost_center work: id: uuid name: 'Reforma Centro' amount: '474.19' share: 9.35 - kind: main_stock cost_center: id: uuid code: '003.001' name: 'Estoque central' amount: '1500.00' share: 29.56 - kind: not_integrated amount: '900.00' share: 17.74 - kind: other_values amount: '100.00' share: 1.97 properties: data: type: object properties: total: type: string example: '5074.19' source: type: string example: stock rows: type: array example: - kind: cost_center cost_center: id: uuid code: '002.001' name: 'Residencial Vila Nova' amount: '2100.00' share: 41.39 - kind: work_without_cost_center work: id: uuid name: 'Reforma Centro' amount: '474.19' share: 9.35 - kind: main_stock cost_center: id: uuid code: '003.001' name: 'Estoque central' amount: '1500.00' share: 29.56 - kind: not_integrated amount: '900.00' share: 17.74 - kind: other_values amount: '100.00' share: 1.97 items: type: object properties: kind: type: string example: cost_center cost_center: type: object properties: id: type: string example: uuid code: type: string example: '002.001' name: type: string example: 'Residencial Vila Nova' amount: type: string example: '2100.00' share: type: number example: 41.39 tags: - 'Fiscal Documents' parameters: - in: path name: fiscalDocument description: 'UUID da nota fiscal' example: ipsum 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: a87d6787-68ff-3219-96d0-e2b050145926 document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '99921916690155451162886394139840105648881274' nfe_number: '416382' nfe_series: '03' issue_date: '1976-07-06T03:00:00.000000Z' total_value: '8684.42' emit: cnpj: '55302163574486' name: 'Robel, Donnelly and Ebert' dest: document: '36416039269769' name: 'Torp Group' supplier: id: a3295ffa-9513-4fd5-b4f8-5b23646b73cb name: 'Dr. Marcos Renato Carmona' document: 11.320.016/0001-06 financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: a87d6787-68ff-3219-96d0-e2b050145926 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: '99921916690155451162886394139840105648881274' nfe_number: type: string example: '416382' nfe_series: type: string example: '03' issue_date: type: string example: '1976-07-06T03:00:00.000000Z' total_value: type: string example: '8684.42' emit: type: object properties: cnpj: type: string example: '55302163574486' name: type: string example: 'Robel, Donnelly and Ebert' dest: type: object properties: document: type: string example: '36416039269769' name: type: string example: 'Torp Group' supplier: type: object properties: id: type: string example: a3295ffa-9513-4fd5-b4f8-5b23646b73cb name: type: string example: 'Dr. Marcos Renato Carmona' document: type: string example: 11.320.016/0001-06 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: quae name: type: string description: '' example: ullam extension: type: string description: '' example: aut 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: et 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: efcd0d99-970e-3efa-a289-23b111c6e402 document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '96602636946465048270208530062591312471050083' nfe_number: '355005' nfe_series: '41' issue_date: '1971-08-14T03:00:00.000000Z' total_value: '9924.08' emit: cnpj: '17013285603447' name: 'Rutherford LLC' dest: document: '58823113202138' name: 'Kertzmann, Johnson and Vandervort' supplier: id: a3295ffa-a5fb-464e-949d-7f54226cbc2f name: 'Dr. Gustavo Carvalho Jr.' document: 63.657.673/0001-39 financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: efcd0d99-970e-3efa-a289-23b111c6e402 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: '96602636946465048270208530062591312471050083' nfe_number: type: string example: '355005' nfe_series: type: string example: '41' issue_date: type: string example: '1971-08-14T03:00:00.000000Z' total_value: type: string example: '9924.08' emit: type: object properties: cnpj: type: string example: '17013285603447' name: type: string example: 'Rutherford LLC' dest: type: object properties: document: type: string example: '58823113202138' name: type: string example: 'Kertzmann, Johnson and Vandervort' supplier: type: object properties: id: type: string example: a3295ffa-a5fb-464e-949d-7f54226cbc2f name: type: string example: 'Dr. Gustavo Carvalho Jr.' document: type: string example: 63.657.673/0001-39 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: consequatur required: true schema: type: string - in: path name: file description: 'UUID do arquivo anexado' example: magnam 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: df0710cd-2bdd-3b87-8090-bf05f7c5a32b document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '36492282433658096388601148392212878120732250' nfe_number: '779225' nfe_series: '24' issue_date: '2008-11-05T02:00:00.000000Z' total_value: '1022.69' emit: cnpj: '67440952846444' name: 'Gerlach Ltd' dest: document: '85041902037964' name: 'Sporer, Murray and Gutkowski' supplier: id: a3295ffa-b8bc-4d3b-9ca1-6220c4920539 name: 'Sr. Giovane Maicon Cervantes Neto' document: 10.605.945/0001-90 financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: df0710cd-2bdd-3b87-8090-bf05f7c5a32b 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: '36492282433658096388601148392212878120732250' nfe_number: type: string example: '779225' nfe_series: type: string example: '24' issue_date: type: string example: '2008-11-05T02:00:00.000000Z' total_value: type: string example: '1022.69' emit: type: object properties: cnpj: type: string example: '67440952846444' name: type: string example: 'Gerlach Ltd' dest: type: object properties: document: type: string example: '85041902037964' name: type: string example: 'Sporer, Murray and Gutkowski' supplier: type: object properties: id: type: string example: a3295ffa-b8bc-4d3b-9ca1-6220c4920539 name: type: string example: 'Sr. Giovane Maicon Cervantes Neto' document: type: string example: 10.605.945/0001-90 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: - at items: type: string parameters: - in: path name: fiscalDocument description: 'UUID da nota fiscal' example: et 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: 84abad8e-0def-3651-ab01-db4521d91381 document_type: nfe document_type_label: NF-e service_description: null nfe_access_key: '50095668849183015167179041654037945482319862' nfe_number: '763901' nfe_series: '76' issue_date: '2004-01-27T02:00:00.000000Z' total_value: '3609.42' emit: cnpj: '43600608156911' name: "Hermann, O'Connell and Swift" dest: document: '84717747139869' name: 'Lindgren, Senger and Halvorson' supplier: id: a3295ffa-cae2-4a26-8070-1ebd6895b107 name: 'Yasmin Marques Neto' document: 63.506.978/0001-40 financial_status: pending products_imported_at: null created_at: null properties: data: type: object properties: id: type: string example: 84abad8e-0def-3651-ab01-db4521d91381 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: '50095668849183015167179041654037945482319862' nfe_number: type: string example: '763901' nfe_series: type: string example: '76' issue_date: type: string example: '2004-01-27T02:00:00.000000Z' total_value: type: string example: '3609.42' emit: type: object properties: cnpj: type: string example: '43600608156911' name: type: string example: "Hermann, O'Connell and Swift" dest: type: object properties: document: type: string example: '84717747139869' name: type: string example: 'Lindgren, Senger and Halvorson' supplier: type: object properties: id: type: string example: a3295ffa-cae2-4a26-8070-1ebd6895b107 name: type: string example: 'Yasmin Marques Neto' document: type: string example: 63.506.978/0001-40 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: corrupti 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: 46883037-937c-3d34-a70c-10ac409054ef 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' fiscal_document: id: fiscal-document-uuid nfe_number: '123456' works: - id: work-uuid name: 'Hospital Bom Jesus' cost_center: id: cost-center-uuid code: '002.001' name: 'Hospital Bom Jesus' - id: work-uuid-2 name: 'Reforma Centro' cost_center: null 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' fiscal_document: type: object properties: id: type: string example: fiscal-document-uuid nfe_number: type: string example: '123456' works: type: array example: - id: work-uuid name: 'Hospital Bom Jesus' cost_center: id: cost-center-uuid code: '002.001' name: 'Hospital Bom Jesus' - id: work-uuid-2 name: 'Reforma Centro' cost_center: null items: type: object properties: id: type: string example: work-uuid name: type: string example: 'Hospital Bom Jesus' cost_center: type: object properties: id: type: string example: cost-center-uuid code: type: string example: '002.001' name: type: string example: 'Hospital Bom Jesus' 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: autem 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: quia 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: dolores 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: - odit items: type: string required: - mappings parameters: - in: path name: importId description: '' example: dignissimos 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: 'qui veniam' abbreviation: XK - id: null name: 'cupiditate ut' abbreviation: HS 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: 'qui veniam' abbreviation: XK - id: null name: 'cupiditate ut' abbreviation: HS items: type: object properties: id: type: string example: null nullable: true name: type: string example: 'qui veniam' abbreviation: type: string example: XK 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: vero nullable: true sort_desc: type: boolean description: '' example: false nullable: true page: type: integer description: 'O campo value deve ser pelo menos 1.' example: 21 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: 23 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: Dibberttown - id: null name: Wallaceville properties: data: type: array example: - id: null name: Dibberttown - id: null name: Wallaceville items: type: object properties: id: type: string example: null nullable: true name: type: string example: Dibberttown 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: ad required: false schema: type: string description: '' example: ad - in: query name: document description: '' example: incidunt required: false schema: type: string description: '' example: incidunt - 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: cost_center_id description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the cost_centers table.' example: 0cde452a-a564-3a1d-b326-738f9e51f654 required: false schema: type: string description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the cost_centers table.' example: 0cde452a-a564-3a1d-b326-738f9e51f654 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: dbcfdcd5-8567-3b77-93bf-8cf447c7ec8b receipt_number: REC-0806 receiver_type: custom receiver: id: null name: "Miss Sydni O'Reilly" document: 167.192.963-53 payment: amount: 3179.3 amount_in_words: 'Valor por extenso de teste' method: pix description: 'Velit a et facere qui consectetur nesciunt.' issuer: name: 'Hermiston and Sons' document: 42.084.544/4876-02 issue: date: '2026-11-03' city: Creolahaven state: RJ created_by: id: a3295ffb-315e-47d4-b216-79a68daf9b31 name: 'Prof. Karson Kulas' created_at: null updated_at: null - id: 71f7d359-76ef-33fd-bfe0-6409c64c97b5 receipt_number: REC-5704 receiver_type: employee receiver: id: null name: 'Samson Feest' document: 313.312.512-98 payment: amount: 7885.98 amount_in_words: 'Valor por extenso de teste' method: check description: 'Eveniet fuga fugiat dignissimos non aliquid esse quo sit.' issuer: name: 'Upton and Sons' document: 40.975.184/7122-96 issue: date: '2026-10-17' city: Batzport state: SP created_by: id: a3295ffb-3a1a-43e7-ba3a-f79411bfe616 name: 'Dr. Buford Kessler Sr.' 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: dbcfdcd5-8567-3b77-93bf-8cf447c7ec8b receipt_number: REC-0806 receiver_type: custom receiver: id: null name: "Miss Sydni O'Reilly" document: 167.192.963-53 payment: amount: 3179.3 amount_in_words: 'Valor por extenso de teste' method: pix description: 'Velit a et facere qui consectetur nesciunt.' issuer: name: 'Hermiston and Sons' document: 42.084.544/4876-02 issue: date: '2026-11-03' city: Creolahaven state: RJ created_by: id: a3295ffb-315e-47d4-b216-79a68daf9b31 name: 'Prof. Karson Kulas' created_at: null updated_at: null - id: 71f7d359-76ef-33fd-bfe0-6409c64c97b5 receipt_number: REC-5704 receiver_type: employee receiver: id: null name: 'Samson Feest' document: 313.312.512-98 payment: amount: 7885.98 amount_in_words: 'Valor por extenso de teste' method: check description: 'Eveniet fuga fugiat dignissimos non aliquid esse quo sit.' issuer: name: 'Upton and Sons' document: 40.975.184/7122-96 issue: date: '2026-10-17' city: Batzport state: SP created_by: id: a3295ffb-3a1a-43e7-ba3a-f79411bfe616 name: 'Dr. Buford Kessler Sr.' created_at: null updated_at: null items: type: object properties: id: type: string example: dbcfdcd5-8567-3b77-93bf-8cf447c7ec8b receipt_number: type: string example: REC-0806 receiver_type: type: string example: custom receiver: type: object properties: id: type: string example: null nullable: true name: type: string example: "Miss Sydni O'Reilly" document: type: string example: 167.192.963-53 payment: type: object properties: amount: type: number example: 3179.3 amount_in_words: type: string example: 'Valor por extenso de teste' method: type: string example: pix description: type: string example: 'Velit a et facere qui consectetur nesciunt.' issuer: type: object properties: name: type: string example: 'Hermiston and Sons' document: type: string example: 42.084.544/4876-02 issue: type: object properties: date: type: string example: '2026-11-03' city: type: string example: Creolahaven state: type: string example: RJ created_by: type: object properties: id: type: string example: a3295ffb-315e-47d4-b216-79a68daf9b31 name: type: string example: 'Prof. Karson Kulas' 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: 9007ace7-817d-448f-b632-da5133aa2360 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: 7e135069-639e-3e6d-831e-16c331425a04 nullable: true cost_center_id: type: string description: 'Cost center id. The uuid of an existing record in the cost_centers table.' example: 551baef9-77d0-3965-a90c-fc37cd971b82 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: 3908d31a-dc1e-30b2-8166-36efab3de5fe nullable: true required: - receiver_type - amount - payment_method - description - issuer_name - issuer_document - issue_date - city - state - cost_center_id /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: corporis required: false schema: type: string description: '' example: corporis - in: query name: document description: '' example: eaque required: false schema: type: string description: '' example: eaque - 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: cost_center_id description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the cost_centers table.' example: 2c10ac21-a902-33fd-868f-c1cf93dcfb74 required: false schema: type: string description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the cost_centers table.' example: 2c10ac21-a902-33fd-868f-c1cf93dcfb74 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: check 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: 2e7ab2fd-3c9e-3916-8cbf-5b7ff756031e receipt_number: REC-4697 receiver_type: custom receiver: id: null name: 'Jaunita Torp' document: 528.915.967-85 payment: amount: 8853.8 amount_in_words: 'Valor por extenso de teste' method: bank_transfer description: 'Dolores voluptates temporibus architecto dolores minima eius.' issuer: name: 'Lockman, McClure and Prohaska' document: 31.936.280/3093-93 issue: date: '2026-10-23' city: Keiraberg state: SC created_by: id: a3295ffb-5ff4-40a6-9717-43a17f501ab3 name: 'Casandra Franecki' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 2e7ab2fd-3c9e-3916-8cbf-5b7ff756031e receipt_number: type: string example: REC-4697 receiver_type: type: string example: custom receiver: type: object properties: id: type: string example: null nullable: true name: type: string example: 'Jaunita Torp' document: type: string example: 528.915.967-85 payment: type: object properties: amount: type: number example: 8853.8 amount_in_words: type: string example: 'Valor por extenso de teste' method: type: string example: bank_transfer description: type: string example: 'Dolores voluptates temporibus architecto dolores minima eius.' issuer: type: object properties: name: type: string example: 'Lockman, McClure and Prohaska' document: type: string example: 31.936.280/3093-93 issue: type: object properties: date: type: string example: '2026-10-23' city: type: string example: Keiraberg state: type: string example: SC created_by: type: object properties: id: type: string example: a3295ffb-5ff4-40a6-9717-43a17f501ab3 name: type: string example: 'Casandra Franecki' 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: 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: db1b29ef-0618-4f87-84c1-71b568acd464 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: 80212a3c-5535-3ab6-9a79-28139997228a nullable: true cost_center_id: type: string description: 'Cost center id. The uuid of an existing record in the cost_centers table.' example: 30819968-945f-3a4d-bd45-459cdc84d285 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: b8e0adb8-0542-3fd6-b040-2420d9794ba3 nullable: true required: - cost_center_id 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: 5a634ead-f262-3748-bf6f-38afcf475f99 receipt_number: REC-5913 receiver_type: custom receiver: id: null name: 'Rick Will' document: 603.882.945-06 payment: amount: 9235.18 amount_in_words: 'Valor por extenso de teste' method: cash description: 'Eos voluptas aut aperiam.' issuer: name: Hammes-Aufderhar document: 86.605.287/8940-68 issue: date: '2026-10-19' city: Rennerside state: SC created_by: id: a3295ffb-979b-44e0-b5a1-e958b4ba2d4d name: 'Dell Grimes' created_at: null updated_at: null - id: a345b796-7d4d-3b05-b80b-797240326a04 receipt_number: REC-2833 receiver_type: employee receiver: id: null name: 'Dr. Telly Stark Jr.' document: 147.506.999-91 payment: amount: 3755.27 amount_in_words: 'Valor por extenso de teste' method: bank_transfer description: 'Nulla ullam et praesentium dolorem inventore voluptatum mollitia.' issuer: name: 'Rodriguez, Dach and Trantow' document: 74.438.262/4375-73 issue: date: '2026-10-19' city: Davonteburgh state: PE created_by: id: a3295ffb-9a14-42f2-97fd-bcf85f1c23d5 name: 'Tracey Heaney' 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: 5a634ead-f262-3748-bf6f-38afcf475f99 receipt_number: REC-5913 receiver_type: custom receiver: id: null name: 'Rick Will' document: 603.882.945-06 payment: amount: 9235.18 amount_in_words: 'Valor por extenso de teste' method: cash description: 'Eos voluptas aut aperiam.' issuer: name: Hammes-Aufderhar document: 86.605.287/8940-68 issue: date: '2026-10-19' city: Rennerside state: SC created_by: id: a3295ffb-979b-44e0-b5a1-e958b4ba2d4d name: 'Dell Grimes' created_at: null updated_at: null - id: a345b796-7d4d-3b05-b80b-797240326a04 receipt_number: REC-2833 receiver_type: employee receiver: id: null name: 'Dr. Telly Stark Jr.' document: 147.506.999-91 payment: amount: 3755.27 amount_in_words: 'Valor por extenso de teste' method: bank_transfer description: 'Nulla ullam et praesentium dolorem inventore voluptatum mollitia.' issuer: name: 'Rodriguez, Dach and Trantow' document: 74.438.262/4375-73 issue: date: '2026-10-19' city: Davonteburgh state: PE created_by: id: a3295ffb-9a14-42f2-97fd-bcf85f1c23d5 name: 'Tracey Heaney' created_at: null updated_at: null items: type: object properties: id: type: string example: 5a634ead-f262-3748-bf6f-38afcf475f99 receipt_number: type: string example: REC-5913 receiver_type: type: string example: custom receiver: type: object properties: id: type: string example: null nullable: true name: type: string example: 'Rick Will' document: type: string example: 603.882.945-06 payment: type: object properties: amount: type: number example: 9235.18 amount_in_words: type: string example: 'Valor por extenso de teste' method: type: string example: cash description: type: string example: 'Eos voluptas aut aperiam.' issuer: type: object properties: name: type: string example: Hammes-Aufderhar document: type: string example: 86.605.287/8940-68 issue: type: object properties: date: type: string example: '2026-10-19' city: type: string example: Rennerside state: type: string example: SC created_by: type: object properties: id: type: string example: a3295ffb-979b-44e0-b5a1-e958b4ba2d4d name: type: string example: 'Dell Grimes' 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: 836e690e-5cf6-3f5b-a477-d304c16fc682 name: non display_name: 'Soluta accusantium neque est consequatur.' - id: 4ab72aec-dc40-3813-aee1-143da6e03d49 name: voluptas display_name: 'Excepturi voluptatum eligendi dolor sunt ad pariatur.' 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: 836e690e-5cf6-3f5b-a477-d304c16fc682 name: non display_name: 'Soluta accusantium neque est consequatur.' - id: 4ab72aec-dc40-3813-aee1-143da6e03d49 name: voluptas display_name: 'Excepturi voluptatum eligendi dolor sunt ad pariatur.' items: type: object properties: id: type: string example: 836e690e-5cf6-3f5b-a477-d304c16fc682 name: type: string example: non display_name: type: string example: 'Soluta accusantium neque est consequatur.' 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: 10802bf3-fce2-3906-86bc-66fa32904256 name: qui-asperiores-et display_name: 'repudiandae nam maiores' created_at: null updated_at: null - id: 1ae6a27c-848f-3b06-bb0d-a5b5041f45cd name: cumque-nam-sint display_name: 'sed eum ipsam' 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: 10802bf3-fce2-3906-86bc-66fa32904256 name: qui-asperiores-et display_name: 'repudiandae nam maiores' created_at: null updated_at: null - id: 1ae6a27c-848f-3b06-bb0d-a5b5041f45cd name: cumque-nam-sint display_name: 'sed eum ipsam' created_at: null updated_at: null items: type: object properties: id: type: string example: 10802bf3-fce2-3906-86bc-66fa32904256 name: type: string example: qui-asperiores-et display_name: type: string example: 'repudiandae nam maiores' 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: e754e2ea-76e7-3906-8d3b-2423182fda43 name: explicabo-id-vero display_name: 'recusandae velit non' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: e754e2ea-76e7-3906-8d3b-2423182fda43 name: type: string example: explicabo-id-vero display_name: type: string example: 'recusandae velit non' 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: c786111d-7d8d-322d-b2b7-046edfc85670 name: occaecati-eveniet-cupiditate display_name: 'labore natus id' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: c786111d-7d8d-322d-b2b7-046edfc85670 name: type: string example: occaecati-eveniet-cupiditate display_name: type: string example: 'labore natus id' 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: - b99efcd7-fbdd-39d1-9209-691eadce7438 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: 0a321d5e-2612-3c6a-8b0b-5f19ce7a7766 name: dignissimos-aut-qui display_name: 'natus praesentium incidunt' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 0a321d5e-2612-3c6a-8b0b-5f19ce7a7766 name: type: string example: dignissimos-aut-qui display_name: type: string example: 'natus praesentium incidunt' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Permission Groups' requestBody: required: true content: application/json: schema: type: object properties: permissions: type: array description: 'ID da permissão. O campo value deve ser um UUID válido. The uuid of an existing record in the permissions table.' example: - 1cb29fd2-c263-32bb-ad66-d907526d326e 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: 7e1e0713-d184-3003-8cff-46a651b6edc8 name: 'Stephanie Daniela Deverso Jr.' created_at: null updated_at: null - id: b067e867-f96b-3f3a-8cb2-17a7b1da59be name: 'Sr. Mário Manuel Carrara Jr.' 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: 7e1e0713-d184-3003-8cff-46a651b6edc8 name: 'Stephanie Daniela Deverso Jr.' created_at: null updated_at: null - id: b067e867-f96b-3f3a-8cb2-17a7b1da59be name: 'Sr. Mário Manuel Carrara Jr.' created_at: null updated_at: null items: type: object properties: id: type: string example: 7e1e0713-d184-3003-8cff-46a651b6edc8 name: type: string example: 'Stephanie Daniela Deverso Jr.' 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: aa01d287-adca-3921-9ce6-5684160625be name: 'Alma Beltrão Faro Jr.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: aa01d287-adca-3921-9ce6-5684160625be name: type: string example: 'Alma Beltrão Faro Jr.' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Product Brands' put: summary: 'Update product brand' operationId: updateProductBrand description: 'Update a product brand' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - 'Product Brands' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' required: - name delete: summary: 'Delete product brand' operationId: deleteProductBrand description: 'Delete a product brand' parameters: [] responses: 204: description: '' content: application/json: schema: type: object nullable: true tags: - 'Product Brands' parameters: - in: path name: productBrand description: 'Product brand UUID' example: excepturi 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: 73f31a9d-fe56-301c-9e62-4889ea52ca41 name: 'George Ricardo Gusmão Neto' is_epi: false created_at: null updated_at: null - id: 967c0d32-7c5b-3b63-9ffc-08784aff7d46 name: 'Dr. Amanda Catarina Serna' 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: 73f31a9d-fe56-301c-9e62-4889ea52ca41 name: 'George Ricardo Gusmão Neto' is_epi: false created_at: null updated_at: null - id: 967c0d32-7c5b-3b63-9ffc-08784aff7d46 name: 'Dr. Amanda Catarina Serna' is_epi: false created_at: null updated_at: null items: type: object properties: id: type: string example: 73f31a9d-fe56-301c-9e62-4889ea52ca41 name: type: string example: 'George Ricardo Gusmão Neto' 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: 37a0e428-589a-3f52-82b2-ef389135f9d4 name: 'Sra. Franciele Paloma Mendes Filho' is_epi: false created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 37a0e428-589a-3f52-82b2-ef389135f9d4 name: type: string example: 'Sra. Franciele Paloma Mendes 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: tempore 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: e1532b3a-8785-3f96-bbbb-5abf033270ab name: 'Ullam unde et aliquam.' description: null work: id: a3295ffc-3344-4eb5-9534-8e9e9667b22e name: 'Mauro Ferreira de Oliveira Sobrinho' user: id: a3295ffc-35f0-4962-8fc0-541b76dce414 name: 'Ms. Heloise Emard DVM' created_at: null updated_at: null - id: 17e55f38-9cb8-3cba-980f-889b47b7a760 name: 'Qui consectetur et.' description: null work: id: a3295ffc-3949-4dd6-bb6d-557af6915c28 name: 'Mari Noemi Abreu Neto' user: id: a3295ffc-3c00-410d-8814-3f4eb68e72e1 name: 'Lela Reynolds' 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: e1532b3a-8785-3f96-bbbb-5abf033270ab name: 'Ullam unde et aliquam.' description: null work: id: a3295ffc-3344-4eb5-9534-8e9e9667b22e name: 'Mauro Ferreira de Oliveira Sobrinho' user: id: a3295ffc-35f0-4962-8fc0-541b76dce414 name: 'Ms. Heloise Emard DVM' created_at: null updated_at: null - id: 17e55f38-9cb8-3cba-980f-889b47b7a760 name: 'Qui consectetur et.' description: null work: id: a3295ffc-3949-4dd6-bb6d-557af6915c28 name: 'Mari Noemi Abreu Neto' user: id: a3295ffc-3c00-410d-8814-3f4eb68e72e1 name: 'Lela Reynolds' created_at: null updated_at: null items: type: object properties: id: type: string example: e1532b3a-8785-3f96-bbbb-5abf033270ab name: type: string example: 'Ullam unde et aliquam.' description: type: string example: null nullable: true work: type: object properties: id: type: string example: a3295ffc-3344-4eb5-9534-8e9e9667b22e name: type: string example: 'Mauro Ferreira de Oliveira Sobrinho' user: type: object properties: id: type: string example: a3295ffc-35f0-4962-8fc0-541b76dce414 name: type: string example: 'Ms. Heloise Emard DVM' 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: 81bc507f-211b-35cc-899e-71d7530ad055 nullable: true user_id: type: string description: 'Usuário. The uuid of an existing record in the users table.' example: 27858add-9e1b-384b-b6f5-3a06505c1b79 nullable: true responsible_id: type: string description: 'Responsável. The uuid of an existing record in the users table.' example: 1bc2968d-c43b-3bd5-8b34-977748b56dc7 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: 0a7231ca-2e5d-3403-af35-ccf7e7c097b3 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: 0236b20f-5498-33bd-b88f-f975dae5e3c4 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: 6e18b351-3395-3d87-8d3f-a59ab94c0bd3 name: 'Similique suscipit consequatur numquam.' description: 'Officiis delectus et veniam reiciendis. Eos culpa aliquid doloribus reiciendis.' work: id: a3295ffc-43b0-4b63-a7d3-9c8a9c138564 name: 'Leandro Josué Benez' user: id: a3295ffc-46ad-4099-adfc-ddacd19a943a name: 'Kassandra Considine III' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 6e18b351-3395-3d87-8d3f-a59ab94c0bd3 name: type: string example: 'Similique suscipit consequatur numquam.' description: type: string example: 'Officiis delectus et veniam reiciendis. Eos culpa aliquid doloribus reiciendis.' work: type: object properties: id: type: string example: a3295ffc-43b0-4b63-a7d3-9c8a9c138564 name: type: string example: 'Leandro Josué Benez' user: type: object properties: id: type: string example: a3295ffc-46ad-4099-adfc-ddacd19a943a name: type: string example: 'Kassandra Considine III' created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Product Quantity Lists' put: summary: 'Update product quantity list' operationId: updateProductQuantityList description: 'Update a product quantity list. Can include items to replace all items in the list.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: data: object properties: data: type: string example: object tags: - 'Product Quantity Lists' requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'Nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' nullable: true description: type: string description: Descrição. example: 'Example Description' nullable: true items: type: array description: Itens. example: - null - null items: type: object properties: id: type: string description: 'ID do Item. The uuid of an existing record in the product_quantity_list_items table.' example: 72aa2c36-43ee-3824-a334-0a6709f50e62 product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: a6b733e3-1f32-3cfe-9162-eaff7d8e6a8d 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: et 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: 8629f2fe-814d-3b26-8202-110375f3ce15 product: id: a3295ffc-5c96-4171-b033-b0ed0db9c1ad name: 'Mauro Verdara Rico Jr.' code: PRD-431993 unit: id: a3295ffc-5a83-4f07-a2e3-195d3d90bb3d name: 'Betina Sanches Perez' abbreviation: 'Sra. Dayane Valentin Neto' quantity: 539.2014 observation: 'Aliquid quam rerum facilis aspernatur omnis sint.' created_at: null updated_at: null - id: 431783c2-a084-33e8-aa2e-6494a125486f product: id: a3295ffc-6c48-4f2a-90e0-13d8bd511447 name: 'Sr. Flávio Aguiar Madeira Sobrinho' code: PRD-773697 unit: id: a3295ffc-6b0c-4732-a3de-f7ffa0f25f32 name: 'Flávio Lira Aguiar Sobrinho' abbreviation: 'Dr. Erik Simon Padilha' quantity: 409.7053 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: 8629f2fe-814d-3b26-8202-110375f3ce15 product: id: a3295ffc-5c96-4171-b033-b0ed0db9c1ad name: 'Mauro Verdara Rico Jr.' code: PRD-431993 unit: id: a3295ffc-5a83-4f07-a2e3-195d3d90bb3d name: 'Betina Sanches Perez' abbreviation: 'Sra. Dayane Valentin Neto' quantity: 539.2014 observation: 'Aliquid quam rerum facilis aspernatur omnis sint.' created_at: null updated_at: null - id: 431783c2-a084-33e8-aa2e-6494a125486f product: id: a3295ffc-6c48-4f2a-90e0-13d8bd511447 name: 'Sr. Flávio Aguiar Madeira Sobrinho' code: PRD-773697 unit: id: a3295ffc-6b0c-4732-a3de-f7ffa0f25f32 name: 'Flávio Lira Aguiar Sobrinho' abbreviation: 'Dr. Erik Simon Padilha' quantity: 409.7053 observation: null created_at: null updated_at: null items: type: object properties: id: type: string example: 8629f2fe-814d-3b26-8202-110375f3ce15 product: type: object properties: id: type: string example: a3295ffc-5c96-4171-b033-b0ed0db9c1ad name: type: string example: 'Mauro Verdara Rico Jr.' code: type: string example: PRD-431993 unit: type: object properties: id: type: string example: a3295ffc-5a83-4f07-a2e3-195d3d90bb3d name: type: string example: 'Betina Sanches Perez' abbreviation: type: string example: 'Sra. Dayane Valentin Neto' quantity: type: number example: 539.2014 observation: type: string example: 'Aliquid quam rerum facilis aspernatur omnis sint.' 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: 7f292008-6863-3624-ab52-7c2001d4eeb4 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: - 8ff07637-e911-3c86-8e98-dabc44c8965f items: type: string required: - items parameters: - in: path name: productQuantityList description: 'Product Quantity List UUID' example: id 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: unde required: true schema: type: string - in: path name: item description: 'Product Quantity List Item UUID' example: sed 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: 01540724-9f3e-3086-b8d5-0047e4046223 product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: cf02bbb5-65ca-3ffa-9ed0-8ad99321898b 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: ea 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: 9583bc3a-e0fb-3c1b-a646-eb8ac04a441e 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: f65bbb61-9849-3a4f-9319-f1f0dc60e0ed 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: 6d4ac084-f6c5-367b-9023-d6a9a6a9ad36 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: alias 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: 414668be-857e-3e49-bfc1-2dde650196c0 quantity: 53.5578 fulfilled_at: '2026-10-23T12:18:04.000000Z' created_at: null - id: 3fde187e-41ae-3117-bfd8-2679cb861327 quantity: 96.8006 fulfilled_at: '2026-10-28T20:09:11.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: 414668be-857e-3e49-bfc1-2dde650196c0 quantity: 53.5578 fulfilled_at: '2026-10-23T12:18:04.000000Z' created_at: null - id: 3fde187e-41ae-3117-bfd8-2679cb861327 quantity: 96.8006 fulfilled_at: '2026-10-28T20:09:11.000000Z' created_at: null items: type: object properties: id: type: string example: 414668be-857e-3e49-bfc1-2dde650196c0 quantity: type: number example: 53.5578 fulfilled_at: type: string example: '2026-10-23T12:18:04.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: fugiat 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: cc1721a8-625f-3b0f-8f27-daa8e96974b0 product: id: a3296001-531a-4a31-b000-314d90e7d699 name: 'Beatriz Godói' code: PRD-487381 unit: id: a3296001-51e2-444a-bf93-bf5208df6127 name: 'Vitória Noa Espinoza' abbreviation: 'Guilherme Aaron Molina Jr.' quantity: 45.5158 quantity_fulfilled: 0 quantity_pending: 45.5158 is_fulfilled: false is_partially_fulfilled: false observation: 'Perspiciatis rerum nemo cum molestiae.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: cc1721a8-625f-3b0f-8f27-daa8e96974b0 product: type: object properties: id: type: string example: a3296001-531a-4a31-b000-314d90e7d699 name: type: string example: 'Beatriz Godói' code: type: string example: PRD-487381 unit: type: object properties: id: type: string example: a3296001-51e2-444a-bf93-bf5208df6127 name: type: string example: 'Vitória Noa Espinoza' abbreviation: type: string example: 'Guilherme Aaron Molina Jr.' quantity: type: number example: 45.5158 quantity_fulfilled: type: integer example: 0 quantity_pending: type: number example: 45.5158 is_fulfilled: type: boolean example: false is_partially_fulfilled: type: boolean example: false observation: type: string example: 'Perspiciatis rerum nemo cum molestiae.' 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: 3a37e85b-9ebf-3505-a1f2-9e82605ca4a2 nullable: true parameters: - in: path name: id description: 'The ID of the item.' example: perspiciatis required: true schema: type: string - in: path name: item description: 'Product Request Item UUID' example: earum 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: e632cc92-2732-3790-8404-59ad3d2613d5 product: id: a3296001-67e2-4a64-86cd-9316f0f5197d name: 'Jerônimo César Carvalho Sobrinho' code: PRD-258776 unit: id: a3296001-66ac-4b68-beaa-cbeb7336669b name: 'Srta. Stephanie Gomes Neto' abbreviation: 'Sr. Artur Urias Jr.' quantity: 674.5476 quantity_fulfilled: 0 quantity_pending: 674.5476 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: f6000afc-3629-3e91-b358-8d8d4b1695d9 product: id: a3296001-7db7-436c-bca4-0cb09387fe2f name: 'Sr. David Joaquin Amaral' code: PRD-572578 unit: id: a3296001-7cac-4936-b084-618033b395aa name: 'Dr. Gabriel Franco Queirós' abbreviation: 'Marisa Serra' quantity: 684.8509 quantity_fulfilled: 0 quantity_pending: 684.8509 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: e632cc92-2732-3790-8404-59ad3d2613d5 product: id: a3296001-67e2-4a64-86cd-9316f0f5197d name: 'Jerônimo César Carvalho Sobrinho' code: PRD-258776 unit: id: a3296001-66ac-4b68-beaa-cbeb7336669b name: 'Srta. Stephanie Gomes Neto' abbreviation: 'Sr. Artur Urias Jr.' quantity: 674.5476 quantity_fulfilled: 0 quantity_pending: 674.5476 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: f6000afc-3629-3e91-b358-8d8d4b1695d9 product: id: a3296001-7db7-436c-bca4-0cb09387fe2f name: 'Sr. David Joaquin Amaral' code: PRD-572578 unit: id: a3296001-7cac-4936-b084-618033b395aa name: 'Dr. Gabriel Franco Queirós' abbreviation: 'Marisa Serra' quantity: 684.8509 quantity_fulfilled: 0 quantity_pending: 684.8509 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null items: type: object properties: id: type: string example: e632cc92-2732-3790-8404-59ad3d2613d5 product: type: object properties: id: type: string example: a3296001-67e2-4a64-86cd-9316f0f5197d name: type: string example: 'Jerônimo César Carvalho Sobrinho' code: type: string example: PRD-258776 unit: type: object properties: id: type: string example: a3296001-66ac-4b68-beaa-cbeb7336669b name: type: string example: 'Srta. Stephanie Gomes Neto' abbreviation: type: string example: 'Sr. Artur Urias Jr.' quantity: type: number example: 674.5476 quantity_fulfilled: type: integer example: 0 quantity_pending: type: number example: 674.5476 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: suscipit 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: 757f674b-ac75-3189-9cd6-b980b2bbecf2 product: id: a3296001-91cb-4b5f-8a83-8b11534c751c name: 'Aaron Marques Barros' code: PRD-609435 unit: id: a3296001-90bc-4b70-a81f-e5d46d676eae name: 'Dr. Isadora Roque' abbreviation: 'Marta Sarah Verdugo Sobrinho' quantity: 729.685 quantity_fulfilled: 0 quantity_pending: 729.685 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: 05b9f4ce-2247-358d-b2b4-cdb2d5d02c15 product: id: a3296001-a30b-46e2-89fb-79db2ee627c5 name: 'Gael Cordeiro' code: PRD-200785 unit: id: a3296001-a1d8-4575-83c5-e60bf94a3ed4 name: 'Srta. Anita Rosa Sobrinho' abbreviation: 'Sra. Manuela Oliveira Filho' quantity: 547.5845 quantity_fulfilled: 0 quantity_pending: 547.5845 is_fulfilled: false is_partially_fulfilled: false observation: 'Ipsam aut iusto non ut officia itaque quam.' created_at: null updated_at: null properties: data: type: array example: - id: 757f674b-ac75-3189-9cd6-b980b2bbecf2 product: id: a3296001-91cb-4b5f-8a83-8b11534c751c name: 'Aaron Marques Barros' code: PRD-609435 unit: id: a3296001-90bc-4b70-a81f-e5d46d676eae name: 'Dr. Isadora Roque' abbreviation: 'Marta Sarah Verdugo Sobrinho' quantity: 729.685 quantity_fulfilled: 0 quantity_pending: 729.685 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: 05b9f4ce-2247-358d-b2b4-cdb2d5d02c15 product: id: a3296001-a30b-46e2-89fb-79db2ee627c5 name: 'Gael Cordeiro' code: PRD-200785 unit: id: a3296001-a1d8-4575-83c5-e60bf94a3ed4 name: 'Srta. Anita Rosa Sobrinho' abbreviation: 'Sra. Manuela Oliveira Filho' quantity: 547.5845 quantity_fulfilled: 0 quantity_pending: 547.5845 is_fulfilled: false is_partially_fulfilled: false observation: 'Ipsam aut iusto non ut officia itaque quam.' created_at: null updated_at: null items: type: object properties: id: type: string example: 757f674b-ac75-3189-9cd6-b980b2bbecf2 product: type: object properties: id: type: string example: a3296001-91cb-4b5f-8a83-8b11534c751c name: type: string example: 'Aaron Marques Barros' code: type: string example: PRD-609435 unit: type: object properties: id: type: string example: a3296001-90bc-4b70-a81f-e5d46d676eae name: type: string example: 'Dr. Isadora Roque' abbreviation: type: string example: 'Marta Sarah Verdugo Sobrinho' quantity: type: number example: 729.685 quantity_fulfilled: type: integer example: 0 quantity_pending: type: number example: 729.685 is_fulfilled: type: boolean example: false is_partially_fulfilled: type: boolean example: false observation: type: string example: null nullable: true created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - 'Product Request Fulfillment' parameters: - in: path name: product description: 'Product UUID' example: quam 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: 41be78ab-e1e2-359e-ae9a-d0de03ca7e66 code: null name: 'Omnis molestiae.' description: null work: id: a3295ffe-2039-4626-9874-06ce2d852834 name: 'Dr. Sophie Alessandra Lutero' user: id: a3295ffe-232b-4e89-b150-e30133e97529 name: 'Kristopher Dach' status: id: a3295ffe-2500-44ea-b09b-2ca56b275543 slug: null name: null description: 'Débora Delgado' abbreviation: omnis color: '#11e1d8' text_color: '#b69466' priority: medium priority_label: Média needed_at: '2026-11-19' approved_at: null rejection_reason: null created_at: null updated_at: null - id: 9191cc6b-18a3-34b8-b19a-13e91d8f33de code: null name: 'Nihil eos quia debitis.' description: null work: id: a3295ffe-2992-4d75-95da-99b1c6b1a7a3 name: 'Aaron Queirós' user: id: a3295ffe-2ca3-43f4-80cb-ab0319d4affb name: 'Amya Carroll' status: id: a3295ffe-2eb0-4c98-858e-cb762249202e slug: null name: null description: 'Sr. Simão Azevedo Batista' abbreviation: quia color: '#2710eb' text_color: '#6b9d89' priority: urgent priority_label: Urgente needed_at: null approved_at: null rejection_reason: null created_at: null updated_at: null links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: 41be78ab-e1e2-359e-ae9a-d0de03ca7e66 code: null name: 'Omnis molestiae.' description: null work: id: a3295ffe-2039-4626-9874-06ce2d852834 name: 'Dr. Sophie Alessandra Lutero' user: id: a3295ffe-232b-4e89-b150-e30133e97529 name: 'Kristopher Dach' status: id: a3295ffe-2500-44ea-b09b-2ca56b275543 slug: null name: null description: 'Débora Delgado' abbreviation: omnis color: '#11e1d8' text_color: '#b69466' priority: medium priority_label: Média needed_at: '2026-11-19' approved_at: null rejection_reason: null created_at: null updated_at: null - id: 9191cc6b-18a3-34b8-b19a-13e91d8f33de code: null name: 'Nihil eos quia debitis.' description: null work: id: a3295ffe-2992-4d75-95da-99b1c6b1a7a3 name: 'Aaron Queirós' user: id: a3295ffe-2ca3-43f4-80cb-ab0319d4affb name: 'Amya Carroll' status: id: a3295ffe-2eb0-4c98-858e-cb762249202e slug: null name: null description: 'Sr. Simão Azevedo Batista' abbreviation: quia color: '#2710eb' text_color: '#6b9d89' priority: urgent priority_label: Urgente needed_at: null approved_at: null rejection_reason: null created_at: null updated_at: null items: type: object properties: id: type: string example: 41be78ab-e1e2-359e-ae9a-d0de03ca7e66 code: type: string example: null nullable: true name: type: string example: 'Omnis molestiae.' description: type: string example: null nullable: true work: type: object properties: id: type: string example: a3295ffe-2039-4626-9874-06ce2d852834 name: type: string example: 'Dr. Sophie Alessandra Lutero' user: type: object properties: id: type: string example: a3295ffe-232b-4e89-b150-e30133e97529 name: type: string example: 'Kristopher Dach' status: type: object properties: id: type: string example: a3295ffe-2500-44ea-b09b-2ca56b275543 slug: type: string example: null nullable: true name: type: string example: null nullable: true description: type: string example: 'Débora Delgado' abbreviation: type: string example: omnis color: type: string example: '#11e1d8' text_color: type: string example: '#b69466' priority: type: string example: medium priority_label: type: string example: Média needed_at: type: string example: '2026-11-19' 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: f73fd794-51d0-3dfe-b41b-1d4113651a83 nullable: true work_location_id: type: string description: 'Local da obra. The uuid of an existing record in the work_locations table.' example: 47ea20da-a2e9-37d8-9012-4113dd1738c8 nullable: true user_id: type: string description: 'Usuário. The uuid of an existing record in the users table.' example: 789b581b-5151-3a51-8131-6240f2847381 nullable: true status_id: type: string description: 'Status. The uuid of an existing record in the statuses table.' example: c0018b70-0736-365f-8ecf-d99fa442c09b 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: 93933037-5e8e-35f4-a088-17ab6af7567a 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: 9695dc8e-511c-3e99-b317-8c6eaf488889 work_location_id: type: string description: 'Local da obra. The uuid of an existing record in the work_locations table.' example: a0064262-a0e3-39c4-8667-313fb748107e nullable: true status_id: type: string description: 'Status. The uuid of an existing record in the statuses table.' example: 8ec79828-c98c-37e6-b950-58c47cbe53a2 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: 6fb41ce7-f4df-345f-8a11-795554782546 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: 3aca14ab-99dc-30e4-8a35-29228fcd3d63 code: null name: 'Id nulla eaque et.' description: null work: id: a3295ffe-38cf-447d-acdc-c0f50763ec06 name: 'Srta. Mariah Vanessa Maia' user: id: a3295ffe-3bec-47c2-b2cb-d6b02c099a4c name: 'Bert Gusikowski' status: id: a3295ffe-3dfd-4849-b349-fee312e361aa slug: null name: null description: 'Srta. Anita Ávila Serna' abbreviation: explicabo color: '#a53c4c' text_color: '#49f568' priority: high priority_label: Alta needed_at: '2026-12-03' approved_at: null rejection_reason: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 3aca14ab-99dc-30e4-8a35-29228fcd3d63 code: type: string example: null nullable: true name: type: string example: 'Id nulla eaque et.' description: type: string example: null nullable: true work: type: object properties: id: type: string example: a3295ffe-38cf-447d-acdc-c0f50763ec06 name: type: string example: 'Srta. Mariah Vanessa Maia' user: type: object properties: id: type: string example: a3295ffe-3bec-47c2-b2cb-d6b02c099a4c name: type: string example: 'Bert Gusikowski' status: type: object properties: id: type: string example: a3295ffe-3dfd-4849-b349-fee312e361aa slug: type: string example: null nullable: true name: type: string example: null nullable: true description: type: string example: 'Srta. Anita Ávila Serna' abbreviation: type: string example: explicabo color: type: string example: '#a53c4c' text_color: type: string example: '#49f568' priority: type: string example: high priority_label: type: string example: Alta needed_at: type: string example: '2026-12-03' 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: d06976f9-8dd9-3d82-95ea-88c966d4b981 work_location_id: type: string description: 'Local da obra. The uuid of an existing record in the work_locations table.' example: 891f559e-48b5-3ba2-897f-de1db31db81c nullable: true status_id: type: string description: 'Status. The uuid of an existing record in the statuses table.' example: 59f7b17f-9eee-3d35-9c42-df1f70c89215 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: 261bf617-9659-3dd9-9329-a913e692cbdd product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: e9e77d7c-679f-314a-ad10-929f8dfddcef 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: quia 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: f25b01d0-a985-366c-8da4-8e485b8aafe3 product: id: a3295ffe-615c-467c-a108-6c7a291d9420 name: 'Vinícius Serna' code: PRD-742173 unit: id: a3295ffe-5ff2-415b-9bad-c5f1f6402ab8 name: 'Sra. Priscila Valente' abbreviation: 'Matheus Pedrosa Jr.' quantity: 225.992 quantity_fulfilled: 0 quantity_pending: 225.992 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: 8090862a-9e6c-32aa-adcb-e6a2a20aaefb product: id: a3295ffe-7a62-4bf7-9f65-df8d37d585a6 name: 'Miranda Padrão Jr.' code: PRD-215756 unit: id: a3295ffe-791a-4ec9-93b1-6353f91a006a name: 'Rayane Michelle Prado' abbreviation: 'Dayane Maiara Pacheco' quantity: 71.9137 quantity_fulfilled: 0 quantity_pending: 71.9137 is_fulfilled: false is_partially_fulfilled: false observation: 'Ut rem veritatis et architecto at.' 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: f25b01d0-a985-366c-8da4-8e485b8aafe3 product: id: a3295ffe-615c-467c-a108-6c7a291d9420 name: 'Vinícius Serna' code: PRD-742173 unit: id: a3295ffe-5ff2-415b-9bad-c5f1f6402ab8 name: 'Sra. Priscila Valente' abbreviation: 'Matheus Pedrosa Jr.' quantity: 225.992 quantity_fulfilled: 0 quantity_pending: 225.992 is_fulfilled: false is_partially_fulfilled: false observation: null created_at: null updated_at: null - id: 8090862a-9e6c-32aa-adcb-e6a2a20aaefb product: id: a3295ffe-7a62-4bf7-9f65-df8d37d585a6 name: 'Miranda Padrão Jr.' code: PRD-215756 unit: id: a3295ffe-791a-4ec9-93b1-6353f91a006a name: 'Rayane Michelle Prado' abbreviation: 'Dayane Maiara Pacheco' quantity: 71.9137 quantity_fulfilled: 0 quantity_pending: 71.9137 is_fulfilled: false is_partially_fulfilled: false observation: 'Ut rem veritatis et architecto at.' created_at: null updated_at: null items: type: object properties: id: type: string example: f25b01d0-a985-366c-8da4-8e485b8aafe3 product: type: object properties: id: type: string example: a3295ffe-615c-467c-a108-6c7a291d9420 name: type: string example: 'Vinícius Serna' code: type: string example: PRD-742173 unit: type: object properties: id: type: string example: a3295ffe-5ff2-415b-9bad-c5f1f6402ab8 name: type: string example: 'Sra. Priscila Valente' abbreviation: type: string example: 'Matheus Pedrosa Jr.' quantity: type: number example: 225.992 quantity_fulfilled: type: integer example: 0 quantity_pending: type: number example: 225.992 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: 7f7b640d-e1a2-391e-bda5-cf6f6ed46c55 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: - 36b9b998-9d93-3d69-97e9-13d115213a9e items: type: string required: - items parameters: - in: path name: productRequest description: 'Product Request UUID' example: similique 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: aperiam 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: et 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: 974b23b9-75b1-3e66-b8e8-44e06c38b4a4 product_id: type: string description: 'Produto. The uuid of an existing record in the products table.' example: 95faeb55-ae2f-3a7c-8f7c-7b5ea7ce16fc 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: ut 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: c106737c-737a-3d07-9b1b-0b6ec5ad7691 name: 'Dr. Marcos Marques Neto' code: PRD-237867 stock: 495 product_family: id: a3295ffb-cc51-4561-8370-cc2f97dce8ff name: 'Antonieta Andréia Campos' product_brand: id: a3295ffb-ce2e-4d26-9b40-859b838c980e name: 'Emanuelly Gil Ortega Jr.' unit: id: a3295ffb-cff1-417d-b3aa-3c6d63fcc959 name: 'Ester Fernanda Dominato' abbreviation: 'Sr. Raphael Soares Neto' image: id: null url: null epi_type: null description: 'Ipsam libero commodi dolores et quae.' created_at: null updated_at: null - id: 1c7137e5-548b-37c8-806a-eadd38ef4be8 name: 'Isabella Gabrielle Marin Neto' code: PRD-599156 stock: 77 product_family: id: a3295ffb-d35b-45c3-95ce-1b88455e8fe3 name: 'Dr. Abgail Fabiana de Freitas' product_brand: id: a3295ffb-d4de-4604-b5ab-8bfc1c9a2658 name: 'Elizabeth das Neves Teles Filho' unit: id: a3295ffb-d684-42d6-aab8-26414b4b842a name: 'Dr. Josué Sanches Salazar' abbreviation: 'Srta. Priscila Salazar Grego Neto' image: id: null url: null epi_type: null description: 'Ab eos voluptas molestias voluptatibus magnam et in ducimus.' 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: c106737c-737a-3d07-9b1b-0b6ec5ad7691 name: 'Dr. Marcos Marques Neto' code: PRD-237867 stock: 495 product_family: id: a3295ffb-cc51-4561-8370-cc2f97dce8ff name: 'Antonieta Andréia Campos' product_brand: id: a3295ffb-ce2e-4d26-9b40-859b838c980e name: 'Emanuelly Gil Ortega Jr.' unit: id: a3295ffb-cff1-417d-b3aa-3c6d63fcc959 name: 'Ester Fernanda Dominato' abbreviation: 'Sr. Raphael Soares Neto' image: id: null url: null epi_type: null description: 'Ipsam libero commodi dolores et quae.' created_at: null updated_at: null - id: 1c7137e5-548b-37c8-806a-eadd38ef4be8 name: 'Isabella Gabrielle Marin Neto' code: PRD-599156 stock: 77 product_family: id: a3295ffb-d35b-45c3-95ce-1b88455e8fe3 name: 'Dr. Abgail Fabiana de Freitas' product_brand: id: a3295ffb-d4de-4604-b5ab-8bfc1c9a2658 name: 'Elizabeth das Neves Teles Filho' unit: id: a3295ffb-d684-42d6-aab8-26414b4b842a name: 'Dr. Josué Sanches Salazar' abbreviation: 'Srta. Priscila Salazar Grego Neto' image: id: null url: null epi_type: null description: 'Ab eos voluptas molestias voluptatibus magnam et in ducimus.' created_at: null updated_at: null items: type: object properties: id: type: string example: c106737c-737a-3d07-9b1b-0b6ec5ad7691 name: type: string example: 'Dr. Marcos Marques Neto' code: type: string example: PRD-237867 stock: type: integer example: 495 product_family: type: object properties: id: type: string example: a3295ffb-cc51-4561-8370-cc2f97dce8ff name: type: string example: 'Antonieta Andréia Campos' product_brand: type: object properties: id: type: string example: a3295ffb-ce2e-4d26-9b40-859b838c980e name: type: string example: 'Emanuelly Gil Ortega Jr.' unit: type: object properties: id: type: string example: a3295ffb-cff1-417d-b3aa-3c6d63fcc959 name: type: string example: 'Ester Fernanda Dominato' abbreviation: type: string example: 'Sr. Raphael Soares Neto' 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: 'Ipsam libero commodi dolores et quae.' 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: bdd9edcb-9c8c-37c9-8872-a20726513cd0 product_brand_id: type: string description: 'Marca do Produto. The uuid of an existing record in the product_brands table.' example: 33d3c17b-faee-32dd-936c-a231f354a259 unit_id: type: string description: 'Unidade. The uuid of an existing record in the units table.' example: f4d15468-c876-39c5-8bc2-e9264fa255c8 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: 7680cd48-72a0-357a-a469-cb8818ea5b5b name: 'Anderson Solano' code: PRD-443935 stock: 8006961 product_family: id: a3295ffb-df05-4b97-8bde-98d47fd5f982 name: 'Sra. Michelle Corona Serna' product_brand: id: a3295ffb-e0b8-46bc-ac69-8da807343558 name: 'Dr. Emerson Benites Sobrinho' unit: id: a3295ffb-e256-43e1-ab8d-c8c22732adab name: 'Luciana Mascarenhas Marin Sobrinho' abbreviation: 'Miguel Gil Torres' image: id: null url: null epi_type: null description: 'Animi architecto ipsa ipsa fugit modi.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 7680cd48-72a0-357a-a469-cb8818ea5b5b name: type: string example: 'Anderson Solano' code: type: string example: PRD-443935 stock: type: integer example: 8006961 product_family: type: object properties: id: type: string example: a3295ffb-df05-4b97-8bde-98d47fd5f982 name: type: string example: 'Sra. Michelle Corona Serna' product_brand: type: object properties: id: type: string example: a3295ffb-e0b8-46bc-ac69-8da807343558 name: type: string example: 'Dr. Emerson Benites Sobrinho' unit: type: object properties: id: type: string example: a3295ffb-e256-43e1-ab8d-c8c22732adab name: type: string example: 'Luciana Mascarenhas Marin Sobrinho' abbreviation: type: string example: 'Miguel Gil Torres' 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: 'Animi architecto ipsa ipsa fugit modi.' 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: 28cf361a-1c74-3cb9-ab03-82c08ad5a61a product_brand_id: type: string description: 'Marca do Produto. The uuid of an existing record in the product_brands table.' example: 7c05a439-f445-3f0e-a371-e220207a5665 unit_id: type: string description: 'Unidade. The uuid of an existing record in the units table.' example: 5b296445-d764-3443-9224-bee464705ecc 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: aut 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: soluta 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: similique 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: cb867a04-a200-3dfe-ab41-85c461b248ab 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: 762cf6f7-2c38-37a0-8c16-4bfb3b33db7b 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: 6acf0ad0-bd23-3725-ae25-656074ddafaf 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: 26426e2d-b800-37c7-9d31-5e9b214bbddd 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: 7fd6fef6-e200-3970-8c94-4c417e0db12c 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: 02843c85-e1e8-364d-92a7-04d1a8d1cae1 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: 02843c85-e1e8-364d-92a7-04d1a8d1cae1 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: 58cea06a-4284-38b1-8eab-cc1dbc6cc0cf 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: 58cea06a-4284-38b1-8eab-cc1dbc6cc0cf 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: e418afa2-5c74-3104-b994-a2c1114c22f3 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: e418afa2-5c74-3104-b994-a2c1114c22f3 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: 0b5dbcc9-30e2-3a92-959f-1fc65f0111b6 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: 0b5dbcc9-30e2-3a92-959f-1fc65f0111b6 nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: ebdf5172-06d1-3261-904f-46753f7bb3ed name: 'Reiciendis occaecati nam' description: 'Error doloremque nihil sit minus.' current_version: 1 file: path: projects/2baa1786-2127-33fd-a3e6-953a8596259e.pdf size: '1783563' extension: pdf discipline: id: a3296001-ada5-47d8-adb6-39957a2722f1 name: Quasi code: ZZW created_at: null updated_at: null - id: fcdeaf6c-4a1b-3d54-9aa8-846d5bc44dbf name: 'Odio consequatur qui' description: 'Iste sit excepturi aut reiciendis vitae in molestias.' current_version: 1 file: path: projects/e03e398c-441d-304c-83d2-1457184ee155.pdf size: '1609415' extension: pdf discipline: id: a3296001-b091-4d83-9472-a84fceeab0c1 name: Nemo code: UDS 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: ebdf5172-06d1-3261-904f-46753f7bb3ed name: 'Reiciendis occaecati nam' description: 'Error doloremque nihil sit minus.' current_version: 1 file: path: projects/2baa1786-2127-33fd-a3e6-953a8596259e.pdf size: '1783563' extension: pdf discipline: id: a3296001-ada5-47d8-adb6-39957a2722f1 name: Quasi code: ZZW created_at: null updated_at: null - id: fcdeaf6c-4a1b-3d54-9aa8-846d5bc44dbf name: 'Odio consequatur qui' description: 'Iste sit excepturi aut reiciendis vitae in molestias.' current_version: 1 file: path: projects/e03e398c-441d-304c-83d2-1457184ee155.pdf size: '1609415' extension: pdf discipline: id: a3296001-b091-4d83-9472-a84fceeab0c1 name: Nemo code: UDS created_at: null updated_at: null items: type: object properties: id: type: string example: ebdf5172-06d1-3261-904f-46753f7bb3ed name: type: string example: 'Reiciendis occaecati nam' description: type: string example: 'Error doloremque nihil sit minus.' current_version: type: integer example: 1 file: type: object properties: path: type: string example: projects/2baa1786-2127-33fd-a3e6-953a8596259e.pdf size: type: string example: '1783563' extension: type: string example: pdf discipline: type: object properties: id: type: string example: a3296001-ada5-47d8-adb6-39957a2722f1 name: type: string example: Quasi code: type: string example: ZZW 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: 3adb07d1-d004-3ac5-8923-600f23f21bb9 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: 0c3118f2-7e22-3197-b2cc-2f4c1a12f88d 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: 8ed321f1-2574-312d-add9-1277fe9c3857 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: 52066aeb-2141-332e-ad3f-4b17ad607d95 name: 'Et unde est' description: 'Ut voluptas nihil occaecati eos quo.' current_version: 1 file: path: projects/72878fe6-590a-3b22-9cff-672fc549b18f.pdf size: '2535118' extension: pdf discipline: id: a3296001-b850-4512-93b5-6449bcf6cab2 name: Adipisci code: YLR created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 52066aeb-2141-332e-ad3f-4b17ad607d95 name: type: string example: 'Et unde est' description: type: string example: 'Ut voluptas nihil occaecati eos quo.' current_version: type: integer example: 1 file: type: object properties: path: type: string example: projects/72878fe6-590a-3b22-9cff-672fc549b18f.pdf size: type: string example: '2535118' extension: type: string example: pdf discipline: type: object properties: id: type: string example: a3296001-b850-4512-93b5-6449bcf6cab2 name: type: string example: Adipisci code: type: string example: YLR 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: be154304-d135-3ae1-ba71-a7129e07c7d7 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: 6bb5508d-dac6-3c30-b8fc-b871c3aab3ac 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: 398b4420-1724-3f8f-8328-c4286f227a87 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: 8afbf8af-8ac4-33ac-9f2b-75a23823d00a nullable: true parameters: - in: path name: id description: 'The ID of the project.' example: 1 required: true schema: type: integer - in: path name: project description: 'Project UUID' example: a 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: voluptas 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: quaerat 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: earum kit_uuid: type: string description: 'O campo value deve ser um UUID válido.' example: 60aa4ce2-81d7-3324-bfba-6828bd50f5cb 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: est required: - employee /api/reports/cost-center: get: summary: 'Cost center panel' operationId: costCenterPanel description: 'Totais por centro de custo no período, somados pela árvore. Devolve dois blocos declarados e separados: desembolso (fecha com o caixa e o banco) e custo apropriado por obra. Os dois não se somam — material comprado num mês e entregue em outro aparece em cada bloco no seu momento.' parameters: - in: query name: date_start description: 'Início do período. Must be a valid date in the format Y-m-d.' example: '2026-11-01' required: true schema: type: string description: 'Início do período. Must be a valid date in the format Y-m-d.' example: '2026-11-01' - in: query name: date_end description: 'Fim do período. Must be a valid date in the format Y-m-d. O campo value deve ser uma data posterior ou igual a date_start.' example: '2026-11-30' required: true schema: type: string description: 'Fim do período. Must be a valid date in the format Y-m-d. O campo value deve ser uma data posterior ou igual a date_start.' example: '2026-11-30' - in: query name: works description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the works table.' example: - f6b58205-c4eb-36b2-92c0-2e839d1be4a8 required: false schema: type: array description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the works table.' example: - f6b58205-c4eb-36b2-92c0-2e839d1be4a8 items: type: string - in: query name: cost_centers description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the cost_centers table.' example: - a838fb3c-5ac6-3d46-9353-57d3df136708 required: false schema: type: array description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the cost_centers table.' example: - a838fb3c-5ac6-3d46-9353-57d3df136708 items: type: string - in: query name: format description: 'Só na exportação: xlsx (padrão) ou csv.' example: xlsx required: false schema: type: string description: 'Só na exportação: xlsx (padrão) ou csv.' example: xlsx enum: - xlsx - csv nullable: true responses: 401: description: '' content: application/json: schema: type: object example: message: Unauthenticated. properties: message: type: string example: Unauthenticated. tags: - Reports /api/reports/cost-center/entries: get: summary: 'Cost center entries' operationId: costCenterEntries description: 'Lançamentos que formam um total do painel, paginados e em ordem de data. O centro informado inclui a subárvore, então clicar no total de um grupo lista o que veio dos filhos também.' parameters: - in: query name: search description: 'Texto livre em descrição, código, obra e fornecedor/recebedor, sem distinguir caixa nem acento. O total da paginação reflete a busca.' example: vero required: false schema: type: string description: 'Texto livre em descrição, código, obra e fornecedor/recebedor, sem distinguir caixa nem acento. O total da paginação reflete a busca.' example: vero - in: query name: sort_by description: 'date ou amount. Padrão: date.' example: date required: false schema: type: string description: 'date ou amount. Padrão: date.' example: date enum: - date - amount - in: query name: sort_desc description: 'Ordem decrescente. Padrão: 1.' example: true required: false schema: type: boolean description: 'Ordem decrescente. Padrão: 1.' example: true - in: query name: per_page description: 'Itens por página, até 100. Padrão: 10.' example: 12 required: false schema: type: integer description: 'Itens por página, até 100. Padrão: 10.' example: 12 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: date_start: type: string description: 'Must be a valid date in the format Y-m-d.' example: '2026-11-06' date_end: type: string description: 'Must be a valid date in the format Y-m-d. O campo value deve ser uma data posterior ou igual a date_start.' example: '2087-03-12' block: type: string description: '' example: work_cost enum: - disbursement - work_cost cost_center_id: type: string description: 'This field is required when without_cost_center is not present. O campo value deve ser um UUID válido. The uuid of an existing record in the cost_centers table.' example: f9bee4f1-4167-3593-a1d9-2ec06642c373 nullable: true without_cost_center: type: boolean description: 'This field is required when cost_center_id is not present.' example: false nullable: true type: type: string description: '' example: other enum: - material - labor - other nullable: true per_page: type: integer description: 'O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 22 nullable: true search: type: string description: 'O campo value não pode ser superior a 255 caracteres.' example: xdigiephlexuqndd nullable: true sort_by: type: string description: '' example: amount enum: - date - amount nullable: true sort_desc: type: boolean description: '' example: true nullable: true required: - date_start - date_end - block /api/reports/cost-center/excel: get: summary: 'Export cost center panel' operationId: exportCostCenterPanel description: 'Gera a planilha do painel com os filtros atuais. XLSX sai com três abas (um total por bloco, mais os lançamentos); CSV sai com as mesmas três coisas em seções. O arquivo é gerado em fila e chega por notificação.' parameters: - in: query name: date_start description: 'Início do período. Must be a valid date in the format Y-m-d.' example: '2026-11-01' required: true schema: type: string description: 'Início do período. Must be a valid date in the format Y-m-d.' example: '2026-11-01' - in: query name: date_end description: 'Fim do período. Must be a valid date in the format Y-m-d. O campo value deve ser uma data posterior ou igual a date_start.' example: '2026-11-30' required: true schema: type: string description: 'Fim do período. Must be a valid date in the format Y-m-d. O campo value deve ser uma data posterior ou igual a date_start.' example: '2026-11-30' - in: query name: works description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the works table.' example: - 2448bb79-e735-3794-a9fe-5e695b6d6496 required: false schema: type: array description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the works table.' example: - 2448bb79-e735-3794-a9fe-5e695b6d6496 items: type: string - in: query name: cost_centers description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the cost_centers table.' example: - 9f5850c2-3c4e-33dc-8fba-ed18f03a885f required: false schema: type: array description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the cost_centers table.' example: - 9f5850c2-3c4e-33dc-8fba-ed18f03a885f items: type: string - in: query name: format description: 'Só na exportação: xlsx (padrão) ou csv.' example: xlsx required: false schema: type: string description: 'Só na exportação: xlsx (padrão) ou csv.' example: xlsx enum: - xlsx - csv nullable: true responses: 202: description: '' content: application/json: schema: type: object example: message: 'Relatório sendo gerado. Você será notificado quando estiver pronto.' channel: 'reports.{uuid}' event: excel-report.completed properties: message: type: string example: 'Relatório sendo gerado. Você será notificado quando estiver pronto.' channel: type: string example: 'reports.{uuid}' event: type: string example: excel-report.completed tags: - Reports /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: dolorem required: false schema: type: string description: '' example: dolorem 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: 'Ipsum est dignissimos rerum voluptatem quo blanditiis inventore.' required: false schema: type: string description: '' example: 'Ipsum est dignissimos rerum voluptatem quo blanditiis inventore.' 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: - 76ba4a57-340f-3837-b741-11e894ac55c3 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: - 76ba4a57-340f-3837-b741-11e894ac55c3 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: - c7898385-c2bd-399d-b96e-9981a81dd365 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: - c7898385-c2bd-399d-b96e-9981a81dd365 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: - f1a80770-b251-3795-8043-1481d5b6c47f required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - f1a80770-b251-3795-8043-1481d5b6c47f items: type: string - in: query name: customers description: 'O campo value deve ser um UUID válido.' example: - 1a4f8530-7744-3a3e-9938-a553e12571a2 required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - 1a4f8530-7744-3a3e-9938-a553e12571a2 items: type: string - in: query name: suppliers description: 'O campo value deve ser um UUID válido.' example: - f3470f50-b682-35f8-a125-01e4f2540243 required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - f3470f50-b682-35f8-a125-01e4f2540243 items: type: string - in: query name: cash_session description: 'O campo value deve ser um UUID válido.' example: 9d1c3cf9-bcab-3712-836c-2336b6ff976a required: false schema: type: string description: 'O campo value deve ser um UUID válido.' example: 9d1c3cf9-bcab-3712-836c-2336b6ff976a nullable: true - in: query name: works description: 'O campo value deve ser um UUID válido.' example: - e334f56a-4b90-3c89-bb59-01f8755f062e required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - e334f56a-4b90-3c89-bb59-01f8755f062e 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: quibusdam required: false schema: type: string description: '' example: quibusdam 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: 'Sit totam sed sit ratione repudiandae.' required: false schema: type: string description: '' example: 'Sit totam sed sit ratione repudiandae.' 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: - b90512f0-7e45-39ed-8718-8a8056bb08c9 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: - b90512f0-7e45-39ed-8718-8a8056bb08c9 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: - f4fee5fa-7f31-301e-a4fc-e520bac4f7bb 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: - f4fee5fa-7f31-301e-a4fc-e520bac4f7bb 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: - ba63188a-7e9b-3e7b-bd98-b381b1675c73 required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - ba63188a-7e9b-3e7b-bd98-b381b1675c73 items: type: string - in: query name: customers description: 'O campo value deve ser um UUID válido.' example: - 09bc2e1b-0b6f-3185-bac6-30260d8b4dad required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - 09bc2e1b-0b6f-3185-bac6-30260d8b4dad items: type: string - in: query name: suppliers description: 'O campo value deve ser um UUID válido.' example: - 7d53f013-5ab1-3303-bcfc-a6e24a510814 required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - 7d53f013-5ab1-3303-bcfc-a6e24a510814 items: type: string - in: query name: cash_session description: 'O campo value deve ser um UUID válido.' example: 7a4b5252-b461-3c2f-b781-a4db27e33013 required: false schema: type: string description: 'O campo value deve ser um UUID válido.' example: 7a4b5252-b461-3c2f-b781-a4db27e33013 nullable: true - in: query name: works description: 'O campo value deve ser um UUID válido.' example: - 7f2504fd-6dfc-3a06-9f8b-73a68ab37d40 required: false schema: type: array description: 'O campo value deve ser um UUID válido.' example: - 7f2504fd-6dfc-3a06-9f8b-73a68ab37d40 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: 777c4645-75a9-3fdc-992c-c72501a27723 name: 'ut enim' slug: null description: null abbreviation: jya created_at: null updated_at: null - id: 405d7011-c7e4-3ef2-aa8c-c99131a95a7d name: 'asperiores occaecati' slug: null description: null abbreviation: 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: 777c4645-75a9-3fdc-992c-c72501a27723 name: 'ut enim' slug: null description: null abbreviation: jya created_at: null updated_at: null - id: 405d7011-c7e4-3ef2-aa8c-c99131a95a7d name: 'asperiores occaecati' slug: null description: null abbreviation: null created_at: null updated_at: null items: type: object properties: id: type: string example: 777c4645-75a9-3fdc-992c-c72501a27723 name: type: string example: 'ut enim' slug: type: string example: null nullable: true description: type: string example: null nullable: true abbreviation: type: string example: jya 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: 3d650da8-a949-3042-8c3b-deeb7ae48be3 name: 'natus provident' slug: null description: 'Incidunt tempora nemo velit voluptatem voluptas et et aut. Architecto sit aut ipsum sed est iusto magnam earum. Ut earum temporibus consequatur quibusdam sint. Quis dolores quod eum ut provident et.' abbreviation: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 3d650da8-a949-3042-8c3b-deeb7ae48be3 name: type: string example: 'natus provident' slug: type: string example: null nullable: true description: type: string example: 'Incidunt tempora nemo velit voluptatem voluptas et et aut. Architecto sit aut ipsum sed est iusto magnam earum. Ut earum temporibus consequatur quibusdam sint. Quis dolores quod eum ut provident et.' 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: 18 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: b3743eb8-1ac9-3441-b238-60625851a9fc name: 'Hiram Hegmann' username: trystan.ankunding email: fstamm@example.org certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: b1007f23-e8c2-3695-af50-78bfc77a260f name: "Celia D'Amore" username: lbradtke email: priscilla05@example.net certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] links: first: '/?page=1' last: '/?page=1' prev: null next: null meta: current_page: 1 from: 1 last_page: 1 links: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false path: / per_page: 10 to: 2 total: 2 properties: data: type: array example: - id: b3743eb8-1ac9-3441-b238-60625851a9fc name: 'Hiram Hegmann' username: trystan.ankunding email: fstamm@example.org certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: b1007f23-e8c2-3695-af50-78bfc77a260f name: "Celia D'Amore" username: lbradtke email: priscilla05@example.net certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] items: type: object properties: id: type: string example: b3743eb8-1ac9-3441-b238-60625851a9fc name: type: string example: 'Hiram Hegmann' username: type: string example: trystan.ankunding email: type: string example: fstamm@example.org certification: type: string example: null nullable: true crea: type: string example: null nullable: true last_login_at: type: string example: null nullable: true image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true sectors: type: array example: [] roles: type: array example: [] links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Sectors parameters: - in: path name: sector description: 'Sector UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/sectors/{sector}/users/attach': post: summary: 'Attach users to sector' operationId: attachUsersToSector description: 'Attach users to a sector without removing existing ones. Expects an array of user UUIDs in the "users" field.' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Users attached successfully' properties: message: type: string example: 'Users attached successfully' tags: - Sectors requestBody: required: false content: application/json: schema: type: object properties: users: type: array description: 'UUID do usuário. The uuid of an existing record in the users table.' example: - ccb81782-0fca-3b82-bb8f-4b7976ed58da 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: - 359b1a7c-f8e7-3fd6-9ab3-6676155b1fd1 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: - 37afe25e-ea66-39ff-b37b-4a78d2bd42c4 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: 'et libero' slug: corrupti-est-est-assumenda-animi-voluptatem-sit-qui - name: 'est ea' slug: aliquid-sed-eveniet-officiis-et-odio-nihil-a properties: data: type: array example: - name: 'et libero' slug: corrupti-est-est-assumenda-animi-voluptatem-sit-qui - name: 'est ea' slug: aliquid-sed-eveniet-officiis-et-odio-nihil-a items: type: object properties: name: type: string example: 'et libero' slug: type: string example: corrupti-est-est-assumenda-animi-voluptatem-sit-qui 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: 24869b0e-14c4-3ae6-bcf8-215d7907c3e9 slug: null name: null description: 'Nicolas de Freitas' abbreviation: consequuntur color: '#d50a56' text_color: '#9fc5bc' created_at: null updated_at: null - id: 8bb01fbb-3ae7-3e52-b2aa-e50d390b430a slug: null name: null description: 'Sr. José Torres Bonilha' abbreviation: ipsam color: '#960c72' text_color: '#da68b4' 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: 24869b0e-14c4-3ae6-bcf8-215d7907c3e9 slug: null name: null description: 'Nicolas de Freitas' abbreviation: consequuntur color: '#d50a56' text_color: '#9fc5bc' created_at: null updated_at: null - id: 8bb01fbb-3ae7-3e52-b2aa-e50d390b430a slug: null name: null description: 'Sr. José Torres Bonilha' abbreviation: ipsam color: '#960c72' text_color: '#da68b4' created_at: null updated_at: null items: type: object properties: id: type: string example: 24869b0e-14c4-3ae6-bcf8-215d7907c3e9 slug: type: string example: null nullable: true name: type: string example: null nullable: true description: type: string example: 'Nicolas de Freitas' abbreviation: type: string example: consequuntur color: type: string example: '#d50a56' text_color: type: string example: '#9fc5bc' 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: 09031b1f-7987-33f2-938a-00b7c998b8f8 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: ce1c5b29-3870-367a-b14b-ddaf2ab9c767 slug: null name: null description: 'Dr. Martinho Lozano Pena' abbreviation: omnis color: '#992f61' text_color: '#0b09f2' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: ce1c5b29-3870-367a-b14b-ddaf2ab9c767 slug: type: string example: null nullable: true name: type: string example: null nullable: true description: type: string example: 'Dr. Martinho Lozano Pena' abbreviation: type: string example: omnis color: type: string example: '#992f61' text_color: type: string example: '#0b09f2' 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: 8df45d5b-988c-3a81-8aa1-aa01719574b0 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: 771c8015-e3b4-33d2-94f6-825c13f0c96d quantity: 309.3971 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null - id: ee6bf7c9-8b94-3a20-9ce2-fa273d5e3e49 quantity: 179.731 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null properties: data: type: array example: - id: 771c8015-e3b4-33d2-94f6-825c13f0c96d quantity: 309.3971 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null - id: ee6bf7c9-8b94-3a20-9ce2-fa273d5e3e49 quantity: 179.731 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: 771c8015-e3b4-33d2-94f6-825c13f0c96d quantity: type: number example: 309.3971 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: 4f7ea0b1-06f1-381f-b2b2-545c7471578e name: 'Estoque Faro e Filhos' module: work is_active: true is_main: false created_at: null updated_at: null - id: 99140fd3-09e3-3c51-9969-6057ce36ebaa name: 'Estoque Benites Ltda.' 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: 4f7ea0b1-06f1-381f-b2b2-545c7471578e name: 'Estoque Faro e Filhos' module: work is_active: true is_main: false created_at: null updated_at: null - id: 99140fd3-09e3-3c51-9969-6057ce36ebaa name: 'Estoque Benites Ltda.' module: work is_active: true is_main: false created_at: null updated_at: null items: type: object properties: id: type: string example: 4f7ea0b1-06f1-381f-b2b2-545c7471578e name: type: string example: 'Estoque Faro e Filhos' 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: 9b36878e-77da-31e8-b2fc-c592fa710b75 name: 'Estoque Valdez-Delatorre' module: work is_active: true is_main: false created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 9b36878e-77da-31e8-b2fc-c592fa710b75 name: type: string example: 'Estoque Valdez-Delatorre' 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: 200e7051-9a8c-34bf-a741-703e3bbfc194 name: 'Estoque Deverso Ltda.' module: work is_active: true is_main: false created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 200e7051-9a8c-34bf-a741-703e3bbfc194 name: type: string example: 'Estoque Deverso 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 '/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: 6ff8fe92-038c-33fb-b120-c7b7116922e6 name: 'Estoque Godói 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: 6ff8fe92-038c-33fb-b120-c7b7116922e6 name: type: string example: 'Estoque Godói 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: 5f5144c0-950f-3fc9-ab1e-8f4648cfeb84 name: 'Estoque Correia 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: 5f5144c0-950f-3fc9-ab1e-8f4648cfeb84 name: type: string example: 'Estoque Correia Comercial Ltda.' module: type: string example: work is_active: type: boolean example: true is_main: type: boolean example: false created_at: type: string example: null nullable: true updated_at: type: string example: null nullable: true tags: - Stock requestBody: required: false content: application/json: schema: type: object properties: name: type: string description: 'nome. O campo value não pode ser superior a 255 caracteres.' example: 'Example Name' is_active: type: boolean description: ativo. example: true delete: summary: 'Delete stock' operationId: deleteStock description: 'Removes a stock (soft delete)' parameters: [] responses: { } tags: - Stock parameters: - in: path name: id description: 'The ID of the stock.' example: 1 required: true schema: type: integer - in: path name: stock description: 'Stock UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/stocks/{stock}/items': get: summary: 'List stock items' operationId: listStockItems description: 'Returns a paginated list of items/products in a stock' parameters: - in: query name: sort_by description: 'Field to sort by.' example: created_at required: false schema: type: string description: 'Field to sort by.' example: created_at nullable: true - in: query name: sort_desc description: 'Sort order (true for descending, false for ascending).' example: true required: false schema: type: boolean description: 'Sort order (true for descending, false for ascending).' example: true nullable: true - in: query name: page description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 required: false schema: type: integer description: 'Page number for pagination. O campo value deve ser pelo menos 1.' example: 1 nullable: true - in: query name: per_page description: 'Number of items per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 10 required: false schema: type: integer description: 'Number of items per page. O campo value deve ser pelo menos 1. O campo value não pode ser superior a 100.' example: 10 - in: query name: q description: 'Search by product name. O campo value não pode ser superior a 255 caracteres.' example: Cement required: false schema: type: string description: 'Search by product name. O campo value não pode ser superior a 255 caracteres.' example: Cement nullable: true - in: query name: below_minimum description: 'Filter items below minimum quantity.' example: true required: false schema: type: boolean description: 'Filter items below minimum quantity.' example: true nullable: true - in: query name: above_maximum description: 'Filter items above maximum quantity.' example: false required: false schema: type: boolean description: 'Filter items above maximum quantity.' example: false nullable: true responses: 200: description: '' content: application/json: schema: type: object example: data: - id: 3e3b892c-04d2-3195-a797-66140eaf08b1 quantity: 798.4635 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null - id: c7efb4b9-138d-3b7a-87ec-3993068f27ae quantity: 984.5773 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: 3e3b892c-04d2-3195-a797-66140eaf08b1 quantity: 798.4635 min_quantity: null max_quantity: null below_minimum: false above_maximum: false created_at: null updated_at: null - id: c7efb4b9-138d-3b7a-87ec-3993068f27ae quantity: 984.5773 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: 3e3b892c-04d2-3195-a797-66140eaf08b1 quantity: type: number example: 798.4635 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: 11b1dedc-6486-3aae-9b00-5fef217ce6d3 quantity: 382.4545 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: 11b1dedc-6486-3aae-9b00-5fef217ce6d3 quantity: type: number example: 382.4545 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: ad 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: 838fc981-c98f-3651-a445-03dc525f1dfb code: MOV-579883 type: compra type_name: PURCHASE is_entry: true is_exit: false quantity: 37.9901 previous_quantity: 573.8547 new_quantity: 611.8448 reason: null movement_date: '2026-10-08T05:39:26.000000Z' created_at: null - id: 6faa20fe-744b-34ab-a65c-64789e240f65 code: MOV-112379 type: 'ajuste entrada' type_name: ADJUSTMENT_IN is_entry: true is_exit: false quantity: 25.578 previous_quantity: 374.6659 new_quantity: 400.2439 reason: 'Officiis hic quia et nam ea sint velit quaerat.' movement_date: '2026-10-24T08:34:04.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: 838fc981-c98f-3651-a445-03dc525f1dfb code: MOV-579883 type: compra type_name: PURCHASE is_entry: true is_exit: false quantity: 37.9901 previous_quantity: 573.8547 new_quantity: 611.8448 reason: null movement_date: '2026-10-08T05:39:26.000000Z' created_at: null - id: 6faa20fe-744b-34ab-a65c-64789e240f65 code: MOV-112379 type: 'ajuste entrada' type_name: ADJUSTMENT_IN is_entry: true is_exit: false quantity: 25.578 previous_quantity: 374.6659 new_quantity: 400.2439 reason: 'Officiis hic quia et nam ea sint velit quaerat.' movement_date: '2026-10-24T08:34:04.000000Z' created_at: null items: type: object properties: id: type: string example: 838fc981-c98f-3651-a445-03dc525f1dfb code: type: string example: MOV-579883 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: 37.9901 previous_quantity: type: number example: 573.8547 new_quantity: type: number example: 611.8448 reason: type: string example: null nullable: true movement_date: type: string example: '2026-10-08T05:39:26.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: aa888bcf-0cc5-320f-ae75-f7e50f14827b code: MOV-139176 type: compra type_name: PURCHASE is_entry: true is_exit: false quantity: 86.4539 previous_quantity: 390.8058 new_quantity: 477.2597 reason: null movement_date: '2026-11-05T17:06:22.000000Z' created_at: null properties: data: type: object properties: id: type: string example: aa888bcf-0cc5-320f-ae75-f7e50f14827b code: type: string example: MOV-139176 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: 86.4539 previous_quantity: type: number example: 390.8058 new_quantity: type: number example: 477.2597 reason: type: string example: null nullable: true movement_date: type: string example: '2026-11-05T17:06:22.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: 7c89992b-8853-3356-aad9-e0a9cb22ecf7 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: 4aa6ceee-9e5d-34b5-9344-60f9131a252b code: MOV-196934 type: consumo type_name: CONSUMPTION is_entry: false is_exit: true quantity: 10.157 previous_quantity: 234.1904 new_quantity: 224.0334 reason: 'Sunt aut aut qui.' movement_date: '2026-10-29T06:00:52.000000Z' created_at: null properties: data: type: object properties: id: type: string example: 4aa6ceee-9e5d-34b5-9344-60f9131a252b code: type: string example: MOV-196934 type: type: string example: consumo type_name: type: string example: CONSUMPTION is_entry: type: boolean example: false is_exit: type: boolean example: true quantity: type: number example: 10.157 previous_quantity: type: number example: 234.1904 new_quantity: type: number example: 224.0334 reason: type: string example: 'Sunt aut aut qui.' movement_date: type: string example: '2026-10-29T06:00:52.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: 3cd92a8a-d6ea-391b-9bab-54a7adf896b8 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: 17b65c54-837e-3207-98d0-9f632df3231f 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: d9a6683a-1b6d-3855-af39-ef746669293d code: MOV-868004 type: 'entrada transferência' type_name: TRANSFER_IN is_entry: true is_exit: false quantity: 66.2108 previous_quantity: 10.3738 new_quantity: 76.5846 reason: null movement_date: '2026-11-01T04:01:40.000000Z' created_at: null properties: data: type: object properties: id: type: string example: d9a6683a-1b6d-3855-af39-ef746669293d code: type: string example: MOV-868004 type: type: string example: 'entrada transferência' type_name: type: string example: TRANSFER_IN is_entry: type: boolean example: true is_exit: type: boolean example: false quantity: type: number example: 66.2108 previous_quantity: type: number example: 10.3738 new_quantity: type: number example: 76.5846 reason: type: string example: null nullable: true movement_date: type: string example: '2026-11-01T04:01:40.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: 7693797f-b9f9-3aec-9970-1d086aa6b51c 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: bd380288-27a8-3d6e-8872-6a02969447cd code: MOV-404099 type: vencido type_name: EXPIRED is_entry: false is_exit: true quantity: 3.0073 previous_quantity: 242.8694 new_quantity: 239.8621 reason: 'Eos ad qui sint.' movement_date: '2026-10-21T14:41:11.000000Z' created_at: null properties: data: type: object properties: id: type: string example: bd380288-27a8-3d6e-8872-6a02969447cd code: type: string example: MOV-404099 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: 3.0073 previous_quantity: type: number example: 242.8694 new_quantity: type: number example: 239.8621 reason: type: string example: 'Eos ad qui sint.' movement_date: type: string example: '2026-10-21T14:41:11.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: 61204d8a-1e46-3bc1-be5b-92be424b5a55 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: bc910eae-cffa-368d-9768-87394dedf28b code: MOV-109275 type: 'ajuste entrada' type_name: ADJUSTMENT_IN is_entry: true is_exit: false quantity: 44.5977 previous_quantity: 150.2536 new_quantity: 194.8513 reason: null movement_date: '2026-11-01T13:06:02.000000Z' created_at: null properties: data: type: object properties: id: type: string example: bc910eae-cffa-368d-9768-87394dedf28b code: type: string example: MOV-109275 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: 44.5977 previous_quantity: type: number example: 150.2536 new_quantity: type: number example: 194.8513 reason: type: string example: null nullable: true movement_date: type: string example: '2026-11-01T13:06:02.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: e07b2990-cf80-331b-aafa-f352404e238d name: 'Dr. Ketlin Santacruz' email: paloma.gomes@example.com phone: '(71) 2255-5111' document: 15.444.382/0001-10 type: pj responsible: "Dr. Raissa Lourenço D'ávila" image: id: null url: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null - id: 7c2f9fee-5708-3692-b90c-6203cad20735 name: 'Sabrina Juliane Santana Sobrinho' email: santiago.filipe@example.org phone: '(87) 90357-3018' document: 35.469.275/0001-53 type: pj responsible: 'Bruna Prado Santos Sobrinho' 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: e07b2990-cf80-331b-aafa-f352404e238d name: 'Dr. Ketlin Santacruz' email: paloma.gomes@example.com phone: '(71) 2255-5111' document: 15.444.382/0001-10 type: pj responsible: "Dr. Raissa Lourenço D'ávila" image: id: null url: null address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null - id: 7c2f9fee-5708-3692-b90c-6203cad20735 name: 'Sabrina Juliane Santana Sobrinho' email: santiago.filipe@example.org phone: '(87) 90357-3018' document: 35.469.275/0001-53 type: pj responsible: 'Bruna Prado Santos Sobrinho' 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: e07b2990-cf80-331b-aafa-f352404e238d name: type: string example: 'Dr. Ketlin Santacruz' email: type: string example: paloma.gomes@example.com phone: type: string example: '(71) 2255-5111' document: type: string example: 15.444.382/0001-10 type: type: string example: pj responsible: type: string example: "Dr. Raissa Lourenço D'ávila" 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: 68d04f89-8839-39db-9b87-571a43392dd3 name: 'Stephany Toledo Sales' email: hcordeiro@example.net phone: '(44) 2567-7732' document: 35.524.489/0001-85 type: pj responsible: 'Dr. Josué Ferraz da Rosa' 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: 68d04f89-8839-39db-9b87-571a43392dd3 name: type: string example: 'Stephany Toledo Sales' email: type: string example: hcordeiro@example.net phone: type: string example: '(44) 2567-7732' document: type: string example: 35.524.489/0001-85 type: type: string example: pj responsible: type: string example: 'Dr. Josué Ferraz da Rosa' 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: 86aff075-444a-392e-bdcd-423142f69a81 name: 'Srta. Verônica Aranda Filho' description: 'Eaque eveniet eligendi nesciunt omnis itaque. Dolor consequatur dolorem temporibus officiis exercitationem.' type: saque - id: 321b3da4-e4a1-3cca-86f3-236626ab4d94 name: 'Cláudio Marinho Burgos Sobrinho' description: 'Dolor officiis quam molestias aliquid tenetur dolores pariatur. Veniam quam eaque rerum repellendus. Voluptas dignissimos deserunt est magnam asperiores.' type: ajuste 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: 86aff075-444a-392e-bdcd-423142f69a81 name: 'Srta. Verônica Aranda Filho' description: 'Eaque eveniet eligendi nesciunt omnis itaque. Dolor consequatur dolorem temporibus officiis exercitationem.' type: saque - id: 321b3da4-e4a1-3cca-86f3-236626ab4d94 name: 'Cláudio Marinho Burgos Sobrinho' description: 'Dolor officiis quam molestias aliquid tenetur dolores pariatur. Veniam quam eaque rerum repellendus. Voluptas dignissimos deserunt est magnam asperiores.' type: ajuste items: type: object properties: id: type: string example: 86aff075-444a-392e-bdcd-423142f69a81 name: type: string example: 'Srta. Verônica Aranda Filho' description: type: string example: 'Eaque eveniet eligendi nesciunt omnis itaque. Dolor consequatur dolorem temporibus officiis exercitationem.' type: type: string example: saque 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: 80af7ca8-61b7-35d2-959b-5e281a85f63e name: 'Sra. Flor Teles' description: 'Dolorem nam quo provident. Magnam eos et ratione eum cupiditate. Illum ut ad et eligendi. Nam itaque accusamus non velit tenetur.' type: juros properties: data: type: object properties: id: type: string example: 80af7ca8-61b7-35d2-959b-5e281a85f63e name: type: string example: 'Sra. Flor Teles' description: type: string example: 'Dolorem nam quo provident. Magnam eos et ratione eum cupiditate. Illum ut ad et eligendi. Nam itaque accusamus non velit tenetur.' type: type: string example: juros 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: voluptate 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: bd2884d9-6bd6-3852-8977-ba63f5b3d738 name: 'Vero doloremque' slug: vero-doloremque-642821 description: 'Exercitationem aut ut id dolores.' icon: null color: null sort_order: 0 is_active: true created_at: null updated_at: null - id: 7d32176b-9f08-3e65-bc51-9bc5259a5c7d name: 'Ducimus eos' slug: ducimus-eos-777784 description: 'Voluptas quis cum adipisci nam perferendis qui.' icon: null color: null 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: bd2884d9-6bd6-3852-8977-ba63f5b3d738 name: 'Vero doloremque' slug: vero-doloremque-642821 description: 'Exercitationem aut ut id dolores.' icon: null color: null sort_order: 0 is_active: true created_at: null updated_at: null - id: 7d32176b-9f08-3e65-bc51-9bc5259a5c7d name: 'Ducimus eos' slug: ducimus-eos-777784 description: 'Voluptas quis cum adipisci nam perferendis qui.' icon: null color: null sort_order: 0 is_active: true created_at: null updated_at: null items: type: object properties: id: type: string example: bd2884d9-6bd6-3852-8977-ba63f5b3d738 name: type: string example: 'Vero doloremque' slug: type: string example: vero-doloremque-642821 description: type: string example: 'Exercitationem aut ut id dolores.' icon: type: string example: null nullable: true color: type: string example: null nullable: true 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: 173d1d64-4c1d-36fe-af83-7dc2e35ef198 name: 'Tempora ut' slug: tempora-ut-218482 description: 'Quos veritatis quia voluptates alias perspiciatis.' icon: null color: null sort_order: 0 is_active: true created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 173d1d64-4c1d-36fe-af83-7dc2e35ef198 name: type: string example: 'Tempora ut' slug: type: string example: tempora-ut-218482 description: type: string example: 'Quos veritatis quia voluptates alias perspiciatis.' icon: type: string example: null nullable: true color: type: string example: null nullable: true 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 icon: type: string description: 'Ícone. O campo value não pode ser superior a 64 caracteres.' example: 'Example Icon' nullable: true color: type: string description: 'Cor. Must match the regex /^#[0-9a-fA-F]{6}$/.' example: 'Example Color' 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: cf276522-b822-3a0f-bdf6-2c2495fc4b8b name: 'Voluptates ut' slug: voluptates-ut-213947 description: 'Necessitatibus enim recusandae blanditiis omnis laboriosam voluptatem sit.' icon: null color: null sort_order: 0 is_active: true created_at: null updated_at: null properties: data: type: object properties: id: type: string example: cf276522-b822-3a0f-bdf6-2c2495fc4b8b name: type: string example: 'Voluptates ut' slug: type: string example: voluptates-ut-213947 description: type: string example: 'Necessitatibus enim recusandae blanditiis omnis laboriosam voluptatem sit.' icon: type: string example: null nullable: true color: type: string example: null nullable: true 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: daee5fb3-e6aa-34cc-ac9a-f8fecf92aa6f name: 'Officia labore' slug: officia-labore-472777 description: 'Placeat quia non quos blanditiis.' icon: null color: null sort_order: 0 is_active: true created_at: null updated_at: null properties: data: type: object properties: id: type: string example: daee5fb3-e6aa-34cc-ac9a-f8fecf92aa6f name: type: string example: 'Officia labore' slug: type: string example: officia-labore-472777 description: type: string example: 'Placeat quia non quos blanditiis.' icon: type: string example: null nullable: true color: type: string example: null nullable: true 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 icon: type: string description: 'Ícone. O campo value não pode ser superior a 64 caracteres.' example: 'Example Icon' nullable: true color: type: string description: 'Cor. Must match the regex /^#[0-9a-fA-F]{6}$/.' example: 'Example Color' 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: 'O campo value deve ser um UUID válido. The uuid of an existing record in the tutorial_modules table.' example: - 63e511d9-21d9-3a84-8742-fb13c4741d50 required: false schema: type: array description: 'O campo value deve ser um UUID válido. The uuid of an existing record in the tutorial_modules table.' example: - 63e511d9-21d9-3a84-8742-fb13c4741d50 items: type: string - in: query name: sector_id description: '' example: null required: false schema: type: array description: '' example: null items: type: string - 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: b259d7f4-093c-3631-bf85-81b885f4df90 title: 'Ipsa quo aut at' description: 'Provident itaque tempora eaque et.' cover_url: null status: draft published_at: null sort_order: 0 module: id: a3296004-85c0-40a1-88b1-4e000e4b7d48 name: 'Enim quaerat' slug: enim-quaerat-142284 icon: null color: null created_at: null updated_at: null - id: c9cd92c0-7fd9-397e-b695-daa17779afa6 title: 'Inventore eum voluptatem cupiditate' description: 'Officiis consequatur soluta voluptatum quae nobis eos inventore.' cover_url: null status: draft published_at: null sort_order: 0 module: id: a3296004-8907-4691-87c9-a3335bafabeb name: 'Architecto sit' slug: architecto-sit-755851 icon: null color: 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: b259d7f4-093c-3631-bf85-81b885f4df90 title: 'Ipsa quo aut at' description: 'Provident itaque tempora eaque et.' cover_url: null status: draft published_at: null sort_order: 0 module: id: a3296004-85c0-40a1-88b1-4e000e4b7d48 name: 'Enim quaerat' slug: enim-quaerat-142284 icon: null color: null created_at: null updated_at: null - id: c9cd92c0-7fd9-397e-b695-daa17779afa6 title: 'Inventore eum voluptatem cupiditate' description: 'Officiis consequatur soluta voluptatum quae nobis eos inventore.' cover_url: null status: draft published_at: null sort_order: 0 module: id: a3296004-8907-4691-87c9-a3335bafabeb name: 'Architecto sit' slug: architecto-sit-755851 icon: null color: null created_at: null updated_at: null items: type: object properties: id: type: string example: b259d7f4-093c-3631-bf85-81b885f4df90 title: type: string example: 'Ipsa quo aut at' description: type: string example: 'Provident itaque tempora eaque et.' cover_url: type: string example: null nullable: true 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: a3296004-85c0-40a1-88b1-4e000e4b7d48 name: type: string example: 'Enim quaerat' slug: type: string example: enim-quaerat-142284 icon: type: string example: null nullable: true color: 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: - '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: 8d1913e9-214f-3c1a-ad51-c65781c18abe title: 'Alias beatae officia minima' description: 'Quia sed harum quod esse.' cover_url: null status: draft published_at: null sort_order: 0 module: id: a3296004-93b1-4c9e-a907-f5f076386a02 name: 'Sed ex' slug: sed-ex-315598 icon: null color: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 8d1913e9-214f-3c1a-ad51-c65781c18abe title: type: string example: 'Alias beatae officia minima' description: type: string example: 'Quia sed harum quod esse.' cover_url: type: string example: null nullable: true 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: a3296004-93b1-4c9e-a907-f5f076386a02 name: type: string example: 'Sed ex' slug: type: string example: sed-ex-315598 icon: type: string example: null nullable: true color: type: string example: null nullable: 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: 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: 68927f6c-9d06-3cf8-b096-aae1d26c36c1 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: - 65ce4ae8-f084-3278-8cea-ef5d17eca32d items: type: string permissions: type: array description: 'Permissão. The name of an existing record in the permissions table.' example: - 286f8488-38a1-31c4-b942-03a3ef2b7fe4 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: e4665f00-9aba-3a5b-8384-60893d7836a2 title: 'Occaecati molestias dolor minus' description: 'Quidem a nihil nostrum quis.' cover_url: null status: draft published_at: null sort_order: 0 module: id: a3296004-a03c-4eb4-921a-bc253f3e9499 name: 'Repudiandae et' slug: repudiandae-et-46682 icon: null color: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: e4665f00-9aba-3a5b-8384-60893d7836a2 title: type: string example: 'Occaecati molestias dolor minus' description: type: string example: 'Quidem a nihil nostrum quis.' cover_url: type: string example: null nullable: true 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: a3296004-a03c-4eb4-921a-bc253f3e9499 name: type: string example: 'Repudiandae et' slug: type: string example: repudiandae-et-46682 icon: type: string example: null nullable: true color: type: string example: null nullable: true 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: f0497049-1a10-3318-933a-3fb971738e66 title: 'Eius et quo aut' description: 'Perferendis commodi tempora magnam rerum.' cover_url: null status: draft published_at: null sort_order: 0 module: id: a3296004-aaa1-461f-8592-a98f27ff2f8d name: 'Qui sed' slug: qui-sed-726873 icon: null color: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: f0497049-1a10-3318-933a-3fb971738e66 title: type: string example: 'Eius et quo aut' description: type: string example: 'Perferendis commodi tempora magnam rerum.' cover_url: type: string example: null nullable: true 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: a3296004-aaa1-461f-8592-a98f27ff2f8d name: type: string example: 'Qui sed' slug: type: string example: qui-sed-726873 icon: type: string example: null nullable: true color: type: string example: null nullable: 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: 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: f735e997-1014-3a1a-8de7-7631ae228255 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: - 9e4e8227-0f65-36ae-82e0-ea791834b0e8 items: type: string permissions: type: array description: 'Permissão. The name of an existing record in the permissions table.' example: - e315efbc-b095-3736-be4b-4080eb810d7a 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: 4b875982-94f1-32c3-b123-980814619e83 title: 'Magni repellendus mollitia sit' description: 'Architecto vel animi id aliquam.' cover_url: null status: draft published_at: null sort_order: 0 module: id: a3296004-b335-4ed9-9931-310582d1381c name: 'Laboriosam nesciunt' slug: laboriosam-nesciunt-463811 icon: null color: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 4b875982-94f1-32c3-b123-980814619e83 title: type: string example: 'Magni repellendus mollitia sit' description: type: string example: 'Architecto vel animi id aliquam.' cover_url: type: string example: null nullable: true 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: a3296004-b335-4ed9-9931-310582d1381c name: type: string example: 'Laboriosam nesciunt' slug: type: string example: laboriosam-nesciunt-463811 icon: type: string example: null nullable: true color: type: string example: null nullable: true 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: 5e8bfaa3-c410-390c-b841-d7d35d214d2f title: 'Vitae repudiandae dolor nam' description: 'Voluptatem asperiores ut facere illo in enim dolore.' cover_url: null status: draft published_at: null sort_order: 0 module: id: a3296004-b8a9-4612-828a-1544057858cb name: 'Perferendis labore' slug: perferendis-labore-406526 icon: null color: null created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 5e8bfaa3-c410-390c-b841-d7d35d214d2f title: type: string example: 'Vitae repudiandae dolor nam' description: type: string example: 'Voluptatem asperiores ut facere illo in enim dolore.' cover_url: type: string example: null nullable: true 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: a3296004-b8a9-4612-828a-1544057858cb name: type: string example: 'Perferendis labore' slug: type: string example: perferendis-labore-406526 icon: type: string example: null nullable: true color: type: string example: null nullable: true 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: 5307ded9-e723-3604-836c-2e4bd7909f37 type: pdf title: 'Sint ipsa tempora' mime_type: application/pdf size_bytes: 1428861 duration_seconds: null sort_order: 0 created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 5307ded9-e723-3604-836c-2e4bd7909f37 type: type: string example: pdf title: type: string example: 'Sint ipsa tempora' mime_type: type: string example: application/pdf size_bytes: type: integer example: 1428861 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: - a24f3e13-aff3-3096-a51c-0d8f774e81d7 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: 0c93cee4-1dbb-3f5b-b3a4-1118316360a3 type: pdf title: 'Et aut dolor' mime_type: application/pdf size_bytes: 1427481 duration_seconds: null sort_order: 0 created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 0c93cee4-1dbb-3f5b-b3a4-1118316360a3 type: type: string example: pdf title: type: string example: 'Et aut dolor' mime_type: type: string example: application/pdf size_bytes: type: integer example: 1427481 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: 24f20448-dacd-3dc8-8cc0-69bf28024ea5 name: 'Santiago Anderson Cervantes' abbreviation: 'Catarina Mary de Oliveira' description: 'Quia iure quia vel.' created_at: null updated_at: null - id: a15dfc00-8261-3488-9f94-9db8508fdf84 name: 'Srta. Mirella Salas Barreto Filho' abbreviation: 'Sr. Luiz Saito Carrara Neto' description: 'Quos est sit vitae est vitae.' 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: 24f20448-dacd-3dc8-8cc0-69bf28024ea5 name: 'Santiago Anderson Cervantes' abbreviation: 'Catarina Mary de Oliveira' description: 'Quia iure quia vel.' created_at: null updated_at: null - id: a15dfc00-8261-3488-9f94-9db8508fdf84 name: 'Srta. Mirella Salas Barreto Filho' abbreviation: 'Sr. Luiz Saito Carrara Neto' description: 'Quos est sit vitae est vitae.' created_at: null updated_at: null items: type: object properties: id: type: string example: 24f20448-dacd-3dc8-8cc0-69bf28024ea5 name: type: string example: 'Santiago Anderson Cervantes' abbreviation: type: string example: 'Catarina Mary de Oliveira' description: type: string example: 'Quia iure quia vel.' 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: 86534254-025c-39a6-8dee-f4b8e700faf4 name: 'Mônica Godói' abbreviation: 'Marcelo Flores Marinho' description: 'Illo qui numquam rerum atque.' created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 86534254-025c-39a6-8dee-f4b8e700faf4 name: type: string example: 'Mônica Godói' abbreviation: type: string example: 'Marcelo Flores Marinho' description: type: string example: 'Illo qui numquam rerum atque.' 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: aliquid 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: aliquid 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: c702d822-14ea-3b01-8846-e6d0f273c059 name: 'Freida Steuber' username: bell36 email: christa86@example.com certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: 6d4cf3d0-b2e8-33a5-b3e0-4e638a1c43c1 name: 'Lesly Kiehn' username: matilda32 email: mosciski.tressa@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: c702d822-14ea-3b01-8846-e6d0f273c059 name: 'Freida Steuber' username: bell36 email: christa86@example.com certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: 6d4cf3d0-b2e8-33a5-b3e0-4e638a1c43c1 name: 'Lesly Kiehn' username: matilda32 email: mosciski.tressa@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: c702d822-14ea-3b01-8846-e6d0f273c059 name: type: string example: 'Freida Steuber' username: type: string example: bell36 email: type: string example: christa86@example.com certification: type: string example: null nullable: true crea: type: string example: null nullable: true last_login_at: type: string example: null nullable: true image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true sectors: type: array example: [] roles: type: array example: [] links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Users post: summary: 'Create user' operationId: createUser description: 'Create a new user' parameters: [] responses: 201: description: '' content: application/json: schema: type: object example: message: string properties: message: type: string example: string tags: - Users requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Nome. example: 'Example Name' certification: type: string description: 'Certificação. O campo value não pode ser superior a 255 caracteres.' example: 'Example Certification' nullable: true crea: type: string description: 'CREA. O campo value não pode ser superior a 255 caracteres.' example: 'Example Crea' nullable: true email: type: string description: 'E-mail. O campo value deve ser um endereço de e-mail válido.' example: user@example.com username: type: string description: Usuário. example: grover.rohan 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: - 6e0e70b0-e568-3433-8116-61ba873844d8 items: type: string roles: type: array description: 'UUID da função. The uuid of an existing record in the roles table.' example: - 689c7c5c-8a97-3e1d-9cc4-1cf3323a8c08 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: c11981bb-164b-3f42-980a-0a52ec94e497 name: 'Brady Bernhard' username: flakin email: stracke.sally@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: c11981bb-164b-3f42-980a-0a52ec94e497 name: type: string example: 'Brady Bernhard' username: type: string example: flakin email: type: string example: stracke.sally@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: jmosciski 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: - eccb1387-7cae-309d-9c37-fcddf92f2b8e items: type: string roles: type: array description: 'UUID da função. The uuid of an existing record in the roles table.' example: - a20c2f16-e2b7-36c8-9917-7dd9442dc181 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: - cbac120b-225b-3f9d-87dc-52d1f45305d6 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: ad display_name: 'Doloribus eligendi et ad cum consequatur.' - id: null name: laboriosam display_name: 'Enim sunt et quae provident culpa.' properties: data: type: array example: - id: null name: ad display_name: 'Doloribus eligendi et ad cum consequatur.' - id: null name: laboriosam display_name: 'Enim sunt et quae provident culpa.' items: type: object properties: id: type: string example: null nullable: true name: type: string example: ad display_name: type: string example: 'Doloribus eligendi et ad cum consequatur.' 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: 0996bad9-ed9f-3530-8895-26f8e82a2df2 description: 'Sr. Alexandre da Cruz' work: id: null name: null documents: [] created_at: null updated_at: null - id: 83f7ebf2-c956-325a-a812-f8477144681d description: 'Cristian Santiago Filho' 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: 0996bad9-ed9f-3530-8895-26f8e82a2df2 description: 'Sr. Alexandre da Cruz' work: id: null name: null documents: [] created_at: null updated_at: null - id: 83f7ebf2-c956-325a-a812-f8477144681d description: 'Cristian Santiago Filho' work: id: null name: null documents: [] created_at: null updated_at: null items: type: object properties: id: type: string example: 0996bad9-ed9f-3530-8895-26f8e82a2df2 description: type: string example: 'Sr. Alexandre da Cruz' 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: c2956f09-ad3f-3832-a3d7-95497b42de42 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: 28e3bdc5-cc4c-38e3-a2d5-e833d0ac3a55 description: 'Matheus Saito Sobrinho' work: id: null name: null documents: [] created_at: null updated_at: null properties: data: type: object properties: id: type: string example: 28e3bdc5-cc4c-38e3-a2d5-e833d0ac3a55 description: type: string example: 'Matheus Saito 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 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: acffd96a-2634-38fd-b495-0cc2063cceb5 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: 1f7c5d5a-8e1b-3fce-a97f-c8c7e04a90c9 name: 'Téo Heitor Duarte Jr.' 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: '1981-04-10 09:11:33.000000' timezone_type: 3 timezone: America/Sao_Paulo created_at: null updated_at: null - id: 6a56c7d4-4d3c-3ca5-9f09-0da492468639 name: 'Srta. Dayana Maia Neto' address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null documents: [] locations: [] product_quantity_lists_count: 0 product_quantity_list_items_count: 0 product_requests_count: 0 product_request_items_count: 0 documents_count: 0 locations_documents_count: 0 total_documents_count: 0 daily_logs_count: 0 projects_count: 0 started_at: date: '2025-06-11 19:32:21.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: 1f7c5d5a-8e1b-3fce-a97f-c8c7e04a90c9 name: 'Téo Heitor Duarte Jr.' 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: '1981-04-10 09:11:33.000000' timezone_type: 3 timezone: America/Sao_Paulo created_at: null updated_at: null - id: 6a56c7d4-4d3c-3ca5-9f09-0da492468639 name: 'Srta. Dayana Maia Neto' address: street: null number: null complement: null neighborhood: null city: null state: null zip_code: null documents: [] locations: [] product_quantity_lists_count: 0 product_quantity_list_items_count: 0 product_requests_count: 0 product_request_items_count: 0 documents_count: 0 locations_documents_count: 0 total_documents_count: 0 daily_logs_count: 0 projects_count: 0 started_at: date: '2025-06-11 19:32:21.000000' timezone_type: 3 timezone: America/Sao_Paulo created_at: null updated_at: null items: type: object properties: id: type: string example: 1f7c5d5a-8e1b-3fce-a97f-c8c7e04a90c9 name: type: string example: 'Téo Heitor Duarte Jr.' 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: '1981-04-10 09:11:33.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: 26670cca-25d8-323d-a1f6-42fbde27e357 status_id: type: string description: 'Status id. The uuid of an existing record in the statuses table.' example: 95579e39-83a2-32bf-8b28-c9a065501dc3 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: aa309841-bbae-30a6-b69d-10867b1c2c37 name: 'Giovana Azevedo Jr.' 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: '1998-06-27 13:06:40.000000' timezone_type: 3 timezone: America/Sao_Paulo created_at: null updated_at: null properties: data: type: object properties: id: type: string example: aa309841-bbae-30a6-b69d-10867b1c2c37 name: type: string example: 'Giovana Azevedo Jr.' 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: '1998-06-27 13:06:40.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: 1258a364-7da7-30b9-bc36-f9fe5528c63e status_id: type: string description: 'Status id. The uuid of an existing record in the statuses table.' example: e574ab7f-72cd-3144-b348-d81a347b792f 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: 4f50409a-a376-38ef-8e0f-66857a004e1c name: 'Sandrine Nienow' username: prosacco.kasandra email: desiree.effertz@example.com certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: 8015d7d5-63f1-3a62-9f58-de7fc3099565 name: 'Prof. Irwin Lakin Sr.' username: missouri46 email: owill@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: 4f50409a-a376-38ef-8e0f-66857a004e1c name: 'Sandrine Nienow' username: prosacco.kasandra email: desiree.effertz@example.com certification: null crea: null last_login_at: null image: id: null url: null sectors: [] roles: [] - id: 8015d7d5-63f1-3a62-9f58-de7fc3099565 name: 'Prof. Irwin Lakin Sr.' username: missouri46 email: owill@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: 4f50409a-a376-38ef-8e0f-66857a004e1c name: type: string example: 'Sandrine Nienow' username: type: string example: prosacco.kasandra email: type: string example: desiree.effertz@example.com certification: type: string example: null nullable: true crea: type: string example: null nullable: true last_login_at: type: string example: null nullable: true image: type: object properties: id: type: string example: null nullable: true url: type: string example: null nullable: true sectors: type: array example: [] roles: type: array example: [] links: type: object properties: first: type: string example: '/?page=1' last: type: string example: '/?page=1' prev: type: string example: null nullable: true next: type: string example: null nullable: true meta: type: object properties: current_page: type: integer example: 1 from: type: integer example: 1 last_page: type: integer example: 1 links: type: array example: - url: null label: '« Anterior' page: null active: false - url: '/?page=1' label: '1' page: 1 active: true - url: null label: 'Próximo »' page: null active: false items: type: object properties: url: type: string example: null nullable: true label: type: string example: '« Anterior' page: type: string example: null nullable: true active: type: boolean example: false path: type: string example: / per_page: type: integer example: 10 to: type: integer example: 2 total: type: integer example: 2 tags: - Works parameters: - in: path name: work description: 'Work UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string '/api/works/{work}/responsibles/attach': post: summary: 'Attach responsibles to work' operationId: attachResponsiblesToWork description: 'Attach users as responsibles to a work without removing existing ones' parameters: [] responses: 200: description: '' content: application/json: schema: type: object example: message: 'Responsibles attached successfully' properties: message: type: string example: 'Responsibles attached successfully' tags: - Works requestBody: required: false content: application/json: schema: type: object properties: users: type: array description: 'UUID do usuário. The uuid of an existing record in the users table.' example: - c4494fb6-61bc-3ef6-8b35-f1361ef1d9d2 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: - 7777ff91-891b-3235-aec6-8ee2313dcba4 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: - 491d0f94-3c6e-392f-95db-98c265a94917 items: type: string parameters: - in: path name: work description: 'Work UUID' example: 019556e7-2e9f-777c-a177-30bbf0646c32 required: true schema: type: string