# Fluxos: Modulo Finance - Gestao de Notas Fiscais (Colaboradores)

---

## 13.1 Upload de NF

```
Usuario
  ↓
Finance → Notas Fiscais → Upload
  ↓
GET /finance/invoices/upload/{id_invoice?}
  ↓
InvoicesController@upload
  ↓
CoreCollaborator (lista), FinanceInvoice (se editando)
  ↓
View: pages/finance/invoices/upload
  ↓
Seleciona colaborador, tipo (recorrencia/premio), mes/ano, valor, PDF
  ↓
POST /finance/invoices/upload/store
  ↓
InvoicesController@upload_store
  ↓
Validacao: nf_type, month_ref, year_ref, value, file (PDF max 10MB), collaborator
  ↓
BucketGoogleApiController::uploadToBucket (PDF → GCS)
BucketGoogleApiController::read_pdf (OCR)
OpenaiApiController::openia_nf_value (valida valor via AI)
  ↓
FinanceInvoice::create (ou update se substituindo)
  status='received' se valor confere
  status='expected' se valor diverge
  ↓
JSON {success, invoices, redirect}
```

**Tela inicial:** Upload de NF
**Acao do usuario:** Seleciona colaborador, preenche dados, faz upload do PDF
**Requisicao:** `POST /finance/invoices/upload/store`
**Controller:** `InvoicesController@upload_store`
**Services:** FormatHelper, BucketGoogleApiController, OpenaiApiController
**Tabelas alteradas:** `finance_invoices` (INSERT ou UPDATE)
**APIs chamadas:**
- Google Cloud Storage (upload PDF)
- Google Cloud Vision (OCR do PDF)
- OpenAI GPT-4 (validacao de valor da NF)
**Resultado esperado:** NF registrada com valor validado automaticamente
**Possiveis erros:**
- Arquivo invalido → 422
- Colaborador incompativel → 422
- Upload GCS falha → 500
- AI nao valida → NF criada com status 'expected' para revisao manual

---

## 13.2 Aprovar NF

```
Usuario
  ↓
Lista NFs → Botao "Aprovar"
  ↓
POST /finance/invoices/aprove/nfs
  ↓
InvoicesController@aprove_nfs
  ↓
FinanceInvoice::update(received_amount, status, notes)
  ↓
JSON {success}
```

**Tabelas alteradas:** `finance_invoices` (status, received_amount)

---

## 13.3 Rejeitar NF

```
Usuario
  ↓
Lista NFs → Botao "Rejeitar"
  ↓
POST /finance/invoices/reject/nfs
  ↓
InvoicesController@reject_nfs
  ↓
Validacao: idinvoice (exists), reason (required)
  ↓
DB::beginTransaction
  ↓
BucketGoogleApiController::deleteFile (remove PDF)
FinanceInvoice::update(status='rejected', filename=null, notes=reason)
FinanceMailService::sendFinanceTemplate (email rejeicao ao colaborador)
  ↓
DB::commit
  ↓
JSON {success}
```

**Tela inicial:** Detalhes da NF
**Acao do usuario:** Preenche motivo e rejeita
**Requisicao:** `POST /finance/invoices/reject/nfs`
**Controller:** `InvoicesController@reject_nfs`
**Services:** BucketGoogleApiController, FinanceMailService
**Tabelas alteradas:** `finance_invoices` (status='rejected', filename=null)
**APIs chamadas:** GCS (delete), SMTP (email rejeicao)
**Resultado esperado:** NF rejeitada, PDF removido, email enviado
**Possiveis erros:**
- NF nao encontrada → 404
- Delete GCS falha → 500
- Email falha → rollback

---

## 13.4 Editar NF

```
POST /finance/invoices/edit/store
  ↓
InvoicesController@edit_store
  ↓
FinanceInvoice::update(expected_amount, notes, status)
  ↓
JSON {success, redirect}
```

**Tabelas alteradas:** `finance_invoices` (expected_amount, notes, status)
