{"openapi":"3.0.3","info":{"title":"Health In Box API","version":"1.0.0","description":"API para plataforma de entrega de medicamentos modelo okigusuri (置き薬): medicamentos na sua casa, pagamento apenas após o uso.","contact":{"name":"Health In Box Team","email":"api@healthinbox.example.com"}},"servers":[{"url":"http://localhost:4000","description":"Desenvolvimento local"},{"url":"https://api.healthinbox.example.com","description":"Produção"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"User":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["user","produtor","admin"]},"is_active":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"}}},"Producer":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"cnpj":{"type":"string"},"razao_social":{"type":"string"},"endereco":{"type":"string"},"cidade":{"type":"string"},"estado":{"type":"string"},"cep":{"type":"string"},"bairro":{"type":"string"},"telefone":{"type":"string"},"ativo":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"Medicamento":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"produtor_id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string"},"category":{"type":"string"},"packaging":{"type":"string"},"storage_condition":{"type":"string"},"price":{"type":"number","format":"float"},"cost":{"type":"number","format":"float"},"minimum_monthly":{"type":"integer"},"discount_percent":{"type":"number","format":"float"},"sku":{"type":"string"},"barcode":{"type":"string"},"image_url":{"type":"string","format":"uri"},"unit":{"type":"string"},"is_active":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"Box":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"user_id":{"type":"string","format":"uuid"},"produtor_id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","pending_use","delivered","closed","paid","expired"]},"note":{"type":"string"},"address":{"type":"string"},"city":{"type":"string"},"postal_code":{"type":"string"},"neighborhood":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"delivered_at":{"type":"string","format":"date-time"},"closed_at":{"type":"string","format":"date-time"},"close_reason":{"type":"string"}}},"Encomenda":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"box_id":{"type":"string","format":"uuid"},"medicamento_id":{"type":"string","format":"uuid"},"quantity":{"type":"integer"},"unit_price":{"type":"number","format":"float"},"discount_percent":{"type":"number","format":"float"},"status":{"type":"string","enum":["pending","ready","delivered","canceled"]},"note":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"Payment":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"box_id":{"type":"string","format":"uuid"},"amount":{"type":"number","format":"float"},"paid_at":{"type":"string","format":"date-time"},"method":{"type":"string"},"transaction_id":{"type":"string"},"payment_date":{"type":"string","format":"date"},"status":{"type":"string","enum":["pending","paid","failed"]},"note":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"Notification":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"message":{"type":"string"},"recipient_id":{"type":"string","format":"uuid"},"recipient_type":{"type":"string","enum":["user","produtor","admin"]},"read_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"Error":{"type":"object","properties":{"error":{"type":"string"},"details":{"type":"array","items":{"type":"object"}}}},"PaginatedResponse":{"type":"object","properties":{"data":{"type":"array","items":{}},"pagination":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"pages":{"type":"integer"}}}}},"AuthResponse":{"type":"object","properties":{"message":{"type":"string"},"user":{"$ref":"#/components/schemas/User"},"token":{"type":"string"}}}}},"security":[{"bearerAuth":[]}],"paths":{"/api":{"get":{"summary":"Informações da API","tags":["System"],"responses":{"200":{"description":"Informações da API","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/health":{"get":{"summary":"Health check","tags":["System"],"security":[],"responses":{"200":{"description":"Servidor saudável","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"database":{"type":"string"}}}}}},"503":{"description":"Banco de dados indisponível","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/auth/register":{"post":{"summary":"Registrar novo usuário","tags":["Auth"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","email","password"],"properties":{"name":{"type":"string","minLength":2},"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":6},"role":{"type":"string","enum":["user","produtor","admin"],"default":"user"},"produtor_id":{"type":"string","format":"uuid"}}}}}},"responses":{"201":{"description":"Usuário criado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}},"400":{"description":"Dados inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"E-mail já cadastrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/auth/login":{"post":{"summary":"Login","tags":["Auth"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email"},"password":{"type":"string"}}}}}},"responses":{"200":{"description":"Login bem-sucedido","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}},"401":{"description":"Credenciais inválidas","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/auth/change-password":{"patch":{"summary":"Alterar senha","tags":["Auth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["current_password","new_password"],"properties":{"current_password":{"type":"string"},"new_password":{"type":"string","minLength":6}}}}}},"responses":{"200":{"description":"Senha alterada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}}},"401":{"description":"Senha atual incorreta","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/users":{"get":{"summary":"Listar usuários (admin/produtor)","tags":["Users"],"responses":{"200":{"description":"Lista de usuários","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/User"}}}}},"403":{"description":"Permissão insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/users/me":{"get":{"summary":"Detalhes do usuário autenticado","tags":["Users"],"responses":{"200":{"description":"Dados do usuário","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}}}}},"/api/users/{id}":{"put":{"summary":"Atualizar usuário","tags":["Users"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["user","produtor","admin"]},"is_active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Usuário atualizado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"403":{"description":"Permissão insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Usuário não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Deletar usuário","tags":["Users"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Usuário removido","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}}},"403":{"description":"Permissão insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Usuário não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/produtores":{"get":{"summary":"Listar produtores","tags":["Producers"],"responses":{"200":{"description":"Lista de produtores","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Producer"}}}}},"403":{"description":"Permissão insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"Cadastrar produtor","tags":["Producers"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["user_id","cnpj","razao_social"],"properties":{"user_id":{"type":"string","format":"uuid"},"cnpj":{"type":"string"},"razao_social":{"type":"string"},"endereco":{"type":"string"},"cidade":{"type":"string"},"estado":{"type":"string","minLength":2,"maxLength":2},"cep":{"type":"string"},"bairro":{"type":"string"},"telefone":{"type":"string"},"ativo":{"type":"boolean"}}}}}},"responses":{"201":{"description":"Produtor criado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Producer"}}}},"400":{"description":"Dados inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"CNPJ já cadastrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/produtores/{id}":{"get":{"summary":"Detalhe do produtor","tags":["Producers"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Dados do produtor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Producer"}}}},"404":{"description":"Produtor não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"summary":"Atualizar produtor","tags":["Producers"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"cnpj":{"type":"string"},"razao_social":{"type":"string"},"endereco":{"type":"string"},"cidade":{"type":"string"},"estado":{"type":"string","minLength":2,"maxLength":2},"cep":{"type":"string"},"bairro":{"type":"string"},"telefone":{"type":"string"},"ativo":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Produtor atualizado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Producer"}}}},"403":{"description":"Permissão insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Produtor não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Deletar produtor","tags":["Producers"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Produtor removido","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}}},"403":{"description":"Permissão insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Produtor não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/medicamentos":{"get":{"summary":"Listar medicamentos","tags":["Medicamentos"],"parameters":[{"name":"produtor_id","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"category","in":"query","schema":{"type":"string"}},{"name":"is_active","in":"query","schema":{"type":"boolean"}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":100}}],"responses":{"200":{"description":"Lista paginada de medicamentos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponse"}}}}}},"post":{"summary":"Cadastrar medicamento","tags":["Medicamentos"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["produtor_id","name","price","cost","minimum_monthly"],"properties":{"produtor_id":{"type":"string","format":"uuid"},"name":{"type":"string","minLength":2},"description":{"type":"string"},"category":{"type":"string"},"packaging":{"type":"string"},"storage_condition":{"type":"string"},"price":{"type":"number","minimum":0},"cost":{"type":"number","minimum":0},"minimum_monthly":{"type":"integer","minimum":1},"discount_percent":{"type":"number","minimum":0,"maximum":100,"default":0},"sku":{"type":"string"},"barcode":{"type":"string"},"image_url":{"type":"string","format":"uri"},"unit":{"type":"string","default":"unidade"},"is_active":{"type":"boolean","default":true}}}}}},"responses":{"201":{"description":"Medicamento criado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Medicamento"}}}},"400":{"description":"Dados inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"SKU já existe para este produtor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/medicamentos/{id}":{"get":{"summary":"Detalhe do medicamento","tags":["Medicamentos"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Dados do medicamento","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Medicamento"}}}},"404":{"description":"Medicamento não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"summary":"Atualizar medicamento","tags":["Medicamentos"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"category":{"type":"string"},"packaging":{"type":"string"},"storage_condition":{"type":"string"},"price":{"type":"number","minimum":0},"cost":{"type":"number","minimum":0},"minimum_monthly":{"type":"integer","minimum":1},"discount_percent":{"type":"number","minimum":0,"maximum":100},"sku":{"type":"string"},"barcode":{"type":"string"},"image_url":{"type":"string","format":"uri"},"unit":{"type":"string"},"is_active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Medicamento atualizado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Medicamento"}}}},"403":{"description":"Permissão insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Medicamento não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"summary":"Deletar medicamento","tags":["Medicamentos"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Medicamento removido","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}}}}}},"403":{"description":"Permissão insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Medicamento não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/boxes":{"get":{"summary":"Listar caixas do usuário","tags":["Boxes"],"parameters":[{"name":"status","in":"query","schema":{"type":"string"}},{"name":"sellable_only","in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Lista de caixas","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Box"}}}}}}},"post":{"summary":"Cadastrar caixa","tags":["Boxes"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["address","city"],"properties":{"address":{"type":"string","minLength":5},"city":{"type":"string","minLength":2},"postal_code":{"type":"string"},"neighborhood":{"type":"string"},"notes":{"type":"string"}}}}}},"responses":{"201":{"description":"Caixa criada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"box":{"$ref":"#/components/schemas/Box"}}}}}},"400":{"description":"Dados inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/boxes/{id}":{"get":{"summary":"Detalhe da caixa","tags":["Boxes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Dados da caixa","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Box"}}}},"403":{"description":"Permissão insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Caixa não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/boxes/{id}/deliver":{"put":{"summary":"Entregar caixa (produtor)","tags":["Boxes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Caixa entregue","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"box":{"$ref":"#/components/schemas/Box"}}}}}},"403":{"description":"Permissão insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Caixa não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/boxes/{id}/consume":{"post":{"summary":"Registrar consumo","tags":["Boxes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["medicamento_id"],"properties":{"medicamento_id":{"type":"string","format":"uuid"},"quantity":{"type":"integer","minimum":1,"default":1},"used_at":{"type":"string","format":"date-time"}}}}}},"responses":{"200":{"description":"Consumo registrado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"box":{"$ref":"#/components/schemas/Box"}}}}}},"400":{"description":"Erro no registro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/boxes/{id}/close":{"put":{"summary":"Fechar caixa","tags":["Boxes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string"}}}}}},"responses":{"200":{"description":"Caixa fechada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"box":{"$ref":"#/components/schemas/Box"}}}}}},"403":{"description":"Permissão insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Caixa não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/boxes/expire":{"post":{"summary":"Expirar caixas não consumidas","tags":["Boxes"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"cutoff":{"type":"string","format":"date-time"}}}}}},"responses":{"200":{"description":"Caixas expiradas","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/encomendas":{"get":{"summary":"Listar encomendas","tags":["Encomendas"],"parameters":[{"name":"box_id","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"medicamento_id","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"limit","in":"query","schema":{"type":"integer","default":20,"maximum":100}}],"responses":{"200":{"description":"Lista de encomendas","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Encomenda"}}}}}}},"post":{"summary":"Cadastrar encomenda","tags":["Encomendas"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["box_id","medicamento_id","quantity"],"properties":{"box_id":{"type":"string","format":"uuid"},"medicamento_id":{"type":"string","format":"uuid"},"quantity":{"type":"integer","minimum":1},"unit_price":{"type":"number","minimum":0,"default":0},"discount_percent":{"type":"number","minimum":0,"maximum":100,"default":0}}}}}},"responses":{"201":{"description":"Encomenda criada","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"encomenda":{"$ref":"#/components/schemas/Encomenda"}}}}}},"400":{"description":"Dados inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/encomendas/{id}":{"get":{"summary":"Detalhe da encomenda","tags":["Encomendas"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Dados da encomenda","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Encomenda"}}}},"404":{"description":"Encomenda não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"summary":"Atualizar encomenda","tags":["Encomendas"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","ready","delivered","canceled"]},"note":{"type":"string"}}}}}},"responses":{"200":{"description":"Encomenda atualizada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Encomenda"}}}},"403":{"description":"Permissão insuficiente","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Encomenda não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/pagamentos":{"get":{"summary":"Listar pagamentos","tags":["Pagamentos"],"parameters":[{"name":"box_id","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"limit","in":"query","schema":{"type":"integer","default":20,"maximum":100}}],"responses":{"200":{"description":"Lista de pagamentos","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Payment"}}}}}}},"post":{"summary":"Registrar pagamento","tags":["Pagamentos"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["box_id","amount"],"properties":{"box_id":{"type":"string","format":"uuid"},"amount":{"type":"number","minimum":0.01},"paid_at":{"type":"string","format":"date-time"},"method":{"type":"string"},"transaction_id":{"type":"string"},"payment_date":{"type":"string","format":"date"},"status":{"type":"string","enum":["pending","paid","failed"],"default":"pending"},"note":{"type":"string"}}}}}},"responses":{"201":{"description":"Pagamento registrado","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"payment":{"$ref":"#/components/schemas/Payment"}}}}}},"400":{"description":"Dados inválidos","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/pagamentos/{id}":{"get":{"summary":"Detalhe do pagamento","tags":["Pagamentos"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Dados do pagamento","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Payment"}}}},"404":{"description":"Pagamento não encontrado","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/pagamentos/reconcile/{boxId}":{"post":{"summary":"Conciliar pagamentos de uma caixa","tags":["Pagamentos"],"parameters":[{"name":"boxId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Pagamentos reconciliados","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Caixa não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/notificacoes":{"get":{"summary":"Listar notificações do usuário","tags":["Notificações"],"parameters":[{"name":"read","in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Lista de notificações","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Notification"}}}}}}}},"/api/notificacoes/{id}/read":{"patch":{"summary":"Marcar notificação como lida","tags":["Notificações"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Notificação marcada como lida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Notification"}}}},"404":{"description":"Notificação não encontrada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}