
    (8i
U                     ,   d dl Z d dlmZ d dlmZmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZmZmZmZ  e j"                  e      Zd dlmZmZmZ d d	lmZmZmZ d d
lmZmZmZm Z   e j"                  e      Z eddg      Z!e!jE                  dddeddide dde dd       eddd       eddd       eddd       eddd        ee	       ee      fd!ee#   d"ee   d#ee   d$ee#   d%dd&efd'       Z$e!jE                  d(d)d*edd+ide dde dd       edd,d-       eddd       eddd       eddd        ee	       ee      fd.ee#   d"ee   d#ee   d$ee#   d%dd&efd/       Z%e!jE                  d0d1d2edd3ide dde dd       edd4d       eddd       eddd       edd5d       edd6d       edd7d        edd8d9       ee	       ee      f	d!ee#   d:ee   d;ee   d<ee#   d=ee#   d>ee#   d?ee&   d%dd&efd@       Z'y)A    N)date)OptionalUnion)get_mysql_db)require_fix_token)AsyncSession)	APIRouterDependsQuerystatus)OmieContaReceberResponseOmieContaReceberBoletoResponseOmieBoletoCompletoResponse)OmieContaReceberServiceOmieContaReceberBoletoServiceOmieBoletoCompletoService)build_success_payloadto_schema_dictSuccessResponseErrorResponsez/contas-receberzOmie - Contas a Receber)prefixtags zListar contas a receber da Omieu  
Consulta a tabela **omie_contaReceber** no banco de dados **MySQL (DataLake)**.

**⚠️ IMPORTANTE:** Esta rota consulta dados da **Omie** armazenados no **MySQL**, diferente das rotas do sistema Alerta Fiscal que consultam o **SQL Server**.

**Tabela:** `omie_contaReceber` (MySQL)

**Filtros suportados (todos opcionais):**
- `cnpj`: Filtra por CNPJ (busca parcial)
- `data_inicio`: Data inicial para filtro de vencimento (formato: YYYY-MM-DD)
- `data_fim`: Data final para filtro de vencimento (formato: YYYY-MM-DD)
- `status`: Filtra por status da conta

**Exemplos:**

1. **Buscar todas as contas a receber:**
```bash
curl -X GET 'http://localhost:8000/contas-receber'   -H 'Authorization: Bearer <TOKEN>'
```

2. **Buscar por CNPJ:**
```bash
curl -X GET 'http://localhost:8000/contas-receber?cnpj=12345678000190'   -H 'Authorization: Bearer <TOKEN>'
```

3. **Buscar por período de vencimento:**
```bash
curl -X GET 'http://localhost:8000/contas-receber?data_inicio=2024-01-01&data_fim=2024-12-31'   -H 'Authorization: Bearer <TOKEN>'
```

4. **Buscar por status:**
```bash
curl -X GET 'http://localhost:8000/contas-receber?status=Pendente'   -H 'Authorization: Bearer <TOKEN>'
```

**SQL Base:**
```sql
SELECT * FROM omie_contaReceber
WHERE 
  (cnpj LIKE '%{cnpj}%' OR :cnpj IS NULL)
  AND (data_vencimento >= :data_inicio OR :data_inicio IS NULL)
  AND (data_vencimento <= :data_fim OR :data_fim IS NULL)
  AND (status = :status OR :status IS NULL)
```
descriptionzLista de contas a receberu"   Credenciais inválidas ou ausentes)r   modelzErro interno)   i  i  )summaryr   response_model	responsesz Filtrar por CNPJ (busca parcial)12345678000190)r   examplez3Data inicial para filtro de vencimento (YYYY-MM-DD)z
2024-01-01z1Data final para filtro de vencimento (YYYY-MM-DD)z
2024-12-31zFiltrar por statusPendentecnpjdata_iniciodata_fimr   _dbc           
        K   t         j                  d|  d| d| d|        	 t        j                  || |||       d {   }g }|D ]$  }	 t	        t
        |      }	|j                  |	       & t        |      }g }| r|j                  d|  d       |r|j                  d	| d       |r|j                  d
| d       |r|j                  d| d       |rddj                  |       nd}|dk(  rd| }n|dk(  rd| }n| d| }t         j                  d|        t        ||      S 7 # t        $ r}
t         j                  d|
         d }
~
ww xY w# t        $ r }
t         j                  d|
 d        d }
~
ww xY ww)Nz,Iniciando busca de contas a receber - CNPJ: , Data:  a 
, Status: )r#   r$   r%   r   $Erro ao converter item para schema: CNPJ contendo ''Vencimento a partir de '   Vencimento até 'Status ' com filtros: , r   r   z"Nenhuma conta a receber encontrada   z1 conta a receber encontradaz contas a receber encontradas   Busca concluída com sucesso: datamessagez!Erro ao listar contas a receber: Texc_info)loggerinfor   listarr   r   append	Exceptionerrorlenjoinr   )r#   r$   r%   r   r&   r'   itemsr7   item	convertedeqtdfiltrossufixor8   s                  6/srv/www/app-alerta/controllers/omie_contas_receber.pylistar_contas_receberrK      s    F KK>tfH[MY\]e\ffpqwpxyz*-44#
 
  	D*+CTJ	I&	 $iNN_TF!45NN5k]!DENN.xj:;NNXfXQ/0:A>$))G"4!56r!8:6(CGAX4VH=G:6(CG4WI>?$$@@K
  CA3GH4  8<tL_   "FE! D5E! !D70CE! 4F5E! 7	E EEE! !	F
*FF

Fz/boletoz+Listar boletos das contas a receber da Omieu  
Consulta a tabela **omie_contaReceber_boleto** no banco de dados **MySQL (DataLake)**.

**⚠️ IMPORTANTE:** Esta rota consulta dados da **Omie** armazenados no **MySQL**, diferente das rotas do sistema Alerta Fiscal que consultam o **SQL Server**.

**Tabela:** `omie_contaReceber_boleto` (MySQL)

**Filtros suportados (todos opcionais):**
- `codigo_lancamento`: Filtra por código do lançamento
- `data_inicio`: Data inicial para filtro de vencimento (formato: YYYY-MM-DD)
- `data_fim`: Data final para filtro de vencimento (formato: YYYY-MM-DD)
- `status`: Filtra por status do boleto

**Exemplos:**

1. **Buscar todos os boletos:**
```bash
curl -X GET 'http://localhost:8000/contas-receber/boleto'   -H 'Authorization: Bearer <TOKEN>'
```

2. **Buscar por código de lançamento:**
```bash
curl -X GET 'http://localhost:8000/contas-receber/boleto?codigo_lancamento=12345'   -H 'Authorization: Bearer <TOKEN>'
```

3. **Buscar por período de vencimento:**
```bash
curl -X GET 'http://localhost:8000/contas-receber/boleto?data_inicio=2024-01-01&data_fim=2024-12-31'   -H 'Authorization: Bearer <TOKEN>'
```

**SQL Base:**
```sql
SELECT * FROM omie_contaReceber_boleto
WHERE 
  (codigo_lancamento = :codigo_lancamento OR :codigo_lancamento IS NULL)
  AND (data_vencimento >= :data_inicio OR :data_inicio IS NULL)
  AND (data_vencimento <= :data_fim OR :data_fim IS NULL)
  AND (status = :status OR :status IS NULL)
```
zLista de boletosu"   Filtrar por código do lançamento12345codigo_lancamentoc           
        K   t         j                  d|  d| d| d|        	 t        j                  || |||       d {   }g }|D ]$  }	 t	        t
        |      }	|j                  |	       & t        |      }g }| r|j                  d|  d       |r|j                  d	| d       |r|j                  d
| d       |r|j                  d| d       |rddj                  |       nd}|dk(  rd| }n|dk(  rd| }n| d| }t         j                  d|        t        ||      S 7 # t        $ r}
t         j                  d|
         d }
~
ww xY w# t        $ r }
t         j                  d|
 d        d }
~
ww xY ww)Nu2   Iniciando busca de boletos - Código Lançamento: r)   r*   r+   )rN   r$   r%   r   r,   u   Código Lançamento 'r.   r/   r0   r1   r2   r3   r   r   zNenhum boleto encontrador4   z1 boleto encontradoz boletos encontradosr5   r6   zErro ao listar boletos: Tr9   )r;   r<   r   r=   r   r   r>   r?   r@   rA   rB   r   )rN   r$   r%   r   r&   r'   rC   r7   rD   rE   rF   rG   rH   rI   r8   s                  rJ   listar_boletosrP      s    z KKDEVDWW_`k_llopxoy  zD  EK  DL  M  N*3::/#
 
  	D*+I4P	I&	 $iNN23D2EQGHNN5k]!DENN.xj:;NNXfXQ/0:A>$))G"4!56r!809GAX+F84G1&:G4WI>?$$@@K
  CA3GH4  /s3dCrL   z/boleto/completoz:Listar boletos completos com dados da empresa e vencimentou  
Consulta **boletos com JOIN** nas tabelas **omie_contaReceber_boleto** e **omie_contaReceber** no banco de dados **MySQL (DataLake)**.

**⚠️ IMPORTANTE:** Esta rota retorna dados combinados de ambas as tabelas, incluindo:
- **Data de emissão do boleto** (`dDtEmBol` da tabela `omie_contaReceber_boleto`)
- **Data de vencimento** (`data_vencimento` da tabela `omie_contaReceber`)
- **CNPJ da empresa** (`cnpj` da tabela `omie_contaReceber`)
- Outros dados relevantes de ambas as tabelas

**Tabelas:** `omie_contaReceber_boleto` + `omie_contaReceber` (MySQL) com JOIN

**Filtros suportados (todos opcionais):**
- `cnpj`: Filtra por CNPJ da empresa (busca parcial)
- `data_vencimento_inicio`: Data inicial para filtro de vencimento (formato: YYYY-MM-DD)
- `data_vencimento_fim`: Data final para filtro de vencimento (formato: YYYY-MM-DD)
- `data_emissao_boleto_inicio`: Data inicial para filtro de emissão do boleto (formato: YYYY-MM-DD)
- `data_emissao_boleto_fim`: Data final para filtro de emissão do boleto (formato: YYYY-MM-DD)
- `status_titulo`: Filtra por status do título
- `pago`: Filtra por status de pagamento (true = apenas pagos, false = apenas não pagos)

**Exemplos:**

1. **Buscar todos os boletos completos:**
```bash
curl -X GET 'http://localhost:8000/contas-receber/boleto/completo'   -H 'Authorization: Bearer <TOKEN>'
```

2. **Buscar por CNPJ da empresa:**
```bash
curl -X GET 'http://localhost:8000/contas-receber/boleto/completo?cnpj=12345678000190'   -H 'Authorization: Bearer <TOKEN>'
```

3. **Buscar por período de vencimento:**
```bash
curl -X GET 'http://localhost:8000/contas-receber/boleto/completo?data_vencimento_inicio=2024-01-01&data_vencimento_fim=2024-12-31'   -H 'Authorization: Bearer <TOKEN>'
```

4. **Buscar por período de emissão do boleto:**
```bash
curl -X GET 'http://localhost:8000/contas-receber/boleto/completo?data_emissao_boleto_inicio=2024-01-01&data_emissao_boleto_fim=2024-12-31'   -H 'Authorization: Bearer <TOKEN>'
```

5. **Buscar por CNPJ e período de vencimento:**
```bash
curl -X GET 'http://localhost:8000/contas-receber/boleto/completo?cnpj=12345678000190&data_vencimento_inicio=2024-01-01&data_vencimento_fim=2024-12-31'   -H 'Authorization: Bearer <TOKEN>'
```

6. **Buscar apenas boletos PAGOS:**
```bash
curl -X GET 'http://localhost:8000/contas-receber/boleto/completo?pago=true'   -H 'Authorization: Bearer <TOKEN>'
```

7. **Buscar apenas boletos NÃO PAGOS:**
```bash
curl -X GET 'http://localhost:8000/contas-receber/boleto/completo?pago=false'   -H 'Authorization: Bearer <TOKEN>'
```

8. **Buscar boletos não pagos de uma empresa específica:**
```bash
curl -X GET 'http://localhost:8000/contas-receber/boleto/completo?cnpj=12345678000190&pago=false'   -H 'Authorization: Bearer <TOKEN>'
```

**SQL Base:**
```sql
SELECT 
    b.codigo_lancamento_omie,
    b.dDtEmBol as data_emissao_boleto,
    b.cNumBoleto as numero_boleto,
    b.cCodBarras as codigo_barras,
    b.cLinkBoleto as link_boleto,
    b.cCodStatus as status_boleto,
    b.cDesStatus as descricao_status,
    c.cnpj,
    c.data_vencimento,
    c.data_emissao,
    c.valor_documento,
    c.numero_documento,
    c.status_titulo,
    c.codigo_cliente_fornecedor
FROM omie_contaReceber_boleto b
INNER JOIN omie_contaReceber c 
    ON b.codigo_lancamento_omie = c.codigo_lancamento_omie
WHERE 
    (c.cnpj LIKE '%{cnpj}%' OR :cnpj IS NULL)
    AND (c.data_vencimento >= :data_vencimento_inicio OR :data_vencimento_inicio IS NULL)
    AND (c.data_vencimento <= :data_vencimento_fim OR :data_vencimento_fim IS NULL)
    AND (b.dDtEmBol >= :data_emissao_boleto_inicio OR :data_emissao_boleto_inicio IS NULL)
    AND (b.dDtEmBol <= :data_emissao_boleto_fim OR :data_emissao_boleto_fim IS NULL)
    AND (c.status_titulo = :status_titulo OR :status_titulo IS NULL)
    AND (
        (:pago IS NULL) OR
        (:pago = true AND (c.data_pagamento IS NOT NULL OR c.valor_pago > 0)) OR
        (:pago = false AND c.data_pagamento IS NULL AND (c.valor_pago IS NULL OR c.valor_pago = 0))
    )
```
zLista de boletos completosz+Filtrar por CNPJ da empresa (busca parcial)ud   Data inicial para filtro de emissão do boleto (YYYY-MM-DD). Deixe vazio ou omita para não filtrar.ub   Data final para filtro de emissão do boleto (YYYY-MM-DD). Deixe vazio ou omita para não filtrar.u   Filtrar por status do títulouP   Filtrar por status de pagamento (true = apenas pagos, false = apenas não pagos)Tdata_vencimento_iniciodata_vencimento_fimdata_emissao_boleto_iniciodata_emissao_boleto_fimstatus_titulopagoc	                 	  K   d }	d }
|r4|j                         r$	 t        j                  |j                               }	|r4|j                         r$	 t        j                  |j                               }
|	}|
}t
        j                  d|  d| d| d| d| d| d|        	 t        j                  || ||||||	       d {   }g }|D ]#  }	 t        |d
      r|j                  nd }t        |d      r|j                  nd }t        |d      r|j                  nd }t        |d      r|j                  nd }|(|&t
        j                  dt!        |dd       d|        d}|rt#        |      j%                         }|dv }|d uxs' |d uxr |d uxr t'        |      t'        |      k\  xs |}|t'        |      nd}|r|dk(  r|rt'        |      }i d|j(                  d|j*                  d|j,                  d|j.                  d|j0                  d|j2                  d|j4                  d|j6                  d|j8                  d|j:                  d|j                  rt'        |j                        ndd|j<                  d|j                  d |j>                  d
|d|d!|t!        |d"d       t!        |d#d       t!        |d$d       t!        |d%d       d&}|jA                  |       & tK        |      }g }| r|jA                  d-|  d.       |r|jA                  d/| d.       |r|jA                  d0| d.       |r|jA                  d1| d.       |r|jA                  d2| d.       |r|jA                  d3| d.       ||jA                  d4|rd5nd6        |rd7d8jM                  |       nd9}|dk(  rd:| }n|d;k(  rd<| }n| d=| }t
        j                  d>|        tO        ||?      S # t        t        f$ r t
        j                  d|        Y w xY w# t        t        f$ r t
        j                  d|        Y w xY w7 # tB        $ rP}t
        jE                  d'| d()       t
        j                  d*tG        |       d+tI        |      d d,          d }~ww xY w# tB        $ r }t
        jE                  d@| d()        d }~ww xY ww)ANu+   Data de emissão boleto início inválida: u'   Data de emissão boleto fim inválida: z-Iniciando busca de boletos completos - CNPJ: z, Vencimento: r*   u   , Emissão Boleto: r+   z, Pago: )r#   rQ   rR   rS   rT   rU   rV   data_pagamento
valor_pagorU   valor_documentoz	Registro codigo_lancamento_omiezN/Au=   : data_pagamento e valor_pago estão NULL, mas status_titulo=F)RECEBIDOPAGOBAIXADO	LIQUIDADOzRECEBIDO PARCIALMENTEzPAGO PARCIALMENTEg        r   data_emissao_boletonumero_boletocodigo_barraslink_boletostatus_boletodescricao_statusr#   data_vencimentodata_emissaonumero_documentocodigo_cliente_fornecedorrV   codigo_cliente_omiecnpj_clienterazao_social_clientenome_fantasia_cliente)rj   rk   rl   rm   u)   Erro ao converter item para dicionário: Tr9   zItem type: z, Item repr: r   r-   r.   r/   r0   u   Emissão boleto a partir de 'u   Emissão boleto até 'r1   zPago: Simu   Nãor2   r3   r   z!Nenhum boleto completo encontrador4   z1 boleto completo encontradoz boletos completos encontradosr5   r6   z"Erro ao listar boletos completos: )(stripr   fromisoformat
ValueErrorAttributeErrorr;   warningr<   r   listar_completohasattrrX   rY   rU   rZ   debuggetattrstrupperfloatr[   r`   ra   rb   rc   rd   re   r#   rf   rg   rh   ri   r>   r?   r@   typereprrA   rB   r   )r#   rQ   rR   rS   rT   rU   rV   r&   r'   !data_emissao_boleto_inicio_parseddata_emissao_boleto_fim_parsedrC   r7   rD   rX   rY   rZ   status_pagostatus_upperfoi_pagovalor_pago_final	item_dictrF   rG   rH   rI   r8   s                              rJ   listar_boletos_completosr      s    | 9=%59"!&@&F&F&H	g040B0BC]CcCcCe0f- #:#@#@#B	`-1-?-?@W@]@]@_-`*
 "C<
KK -.c2E1F G67s;R:S T / "	p/??#9 3'A$;'	
 	
  B	DA 9@FV8W!4!4]a07l0KT__QU
6=dO6T 2 2Z^:A$HY:Z$"6"6`d ")j.@LL9WT;SUZ-[,\  ]Z  [h  Zi  "j  k $ #&}#5#;#;#=L". 3 #K #$.  t+{t0K{PUV`Paejkze{P{   9C8N5#4TW  0A 5/',_'=$,d.I.I)4+C+C $T%7%7 $T%7%7	
 "4#3#3 $T%7%7 '(=(= DII &t';'; #D$5$5 &dFZFZuT-A-A'B`c '(=(= $T%7%7 01O1O %n  !"2!" H#& ,349NPT+U$+D.$$G,3D:PRV,W-4T;RTX-Y-	0 I&{B	H $iNN_TF!45!NN56L5MQOPNN./B.C1EF%NN:;U:VVWXY"NN34K3LANONNXm_A67NNVTEv#>?@:A>$))G"4!56r!89&BGAX4VH=G;F8DG4WI>?$$@@C N+ 	gNNHIcHdef	g N+ 	`NNDE\D]^_	` 	
V  HLW[\{4:,mDJtPSDTCUVW	D  9!=Ms   S$#O= S$#P+ 3.S$" R8 QR8 HQ/DR8 <S$='P($S$'P((S$+'QS$QS$R8 	R5%AR00R55R8 8	S!SS!!S$)(loggingdatetimer   typingr   r   core.databaser   	core.authr   sqlalchemy.ext.asyncior   fastapir	   r
   r   r   	getLogger__name__r;   schemas.omie_contas_receberr   r   r   services.omie_contas_receberr   r   r   core.api_responsesr   r   r   r   routergetrx   rK   rP   boolr        rJ   <module>r      s     " & ' / 5 5			8	$ | | z z d d			8	$	
#	$

 -0b #89AMZ+mDk  :x  2T^no"':o  zF  #G$T7j  uA   B!$4HR\]'(|,4
3-4$4 tn4 SM	4
 4 	4w:v4l 9*V #/0AMZ+mD_  4l (-T?cmt'u"':o  zF  #G$T7j  uA   B!$4HR\]'(|,4}4$4 tn4 SM	4
 4 	4k4j4l HgP #9:AMZ+mDY  qf  2_iyz-24Ez  EQ  .R*/Bu  @L  +M05d  Io  yE  1F-24  Fj  t@  .A#(;Zdn#o   4F  PT  U'(|,W
3-W$TNW "$W !)	W
 &c]W C=W 4.W W 	WeqdWr   