§
    (­h°8  ã                   ó„   — d dl Z d dlZd dlZd dlmZmZ d dlmZmZmZm	Z	 d dl
mZ d dlmZ d dlmZ  G d„ d¦  «        ZdS )	é    N)ÚdatetimeÚdate)ÚListÚDictÚAnyÚOptional)ÚInvoice)ÚCompany)Údbc                   óð  — e Zd ZdZd„ Z	 ddededededeee	f         f
d	„Z
dededededee         f
d
„Zdedee         dededef
d„Zdededededef
d„Zdedefd„Zdee         defd„Zdee         defd„Zdee         deeef         fd„Z	 ddededededeee	f         f
d„Zdedededeee	f         fd„Zdee         deeee	f                  fd„Zdee         deeee	f                  fd„ZdS )ÚReport606Servicez8Servicio para generar reportes en formato 606 de la DGIIc                 ó"   — d| _         d| _        d S )Nú|ú
)Úfield_separatorÚline_separator)Úselfs    úC/home/ubuntu/invoice-606-backend/src/services/report_606_service.pyÚ__init__zReport606Service.__init__   s   € Ø"ˆÔØ"ˆÔÐÐó    FÚ
company_idÚyearÚmonthÚinclude_pendingÚreturnc           
      ó
  — 	 t           j                             |¦  «        }|st          d¦  «        ‚|                      ||||¦  «        }|sddddddœS |                      ||||¦  «        }|                      |¦  «        }d|j        › d|› |d›d	�}	d
|	||                     ¦   «         |d›d|› �t          |¦  «        |d         |d         d„ |D ¦   «         dœ	S # t          $ r}
dt          |
¦  «        ddddœcY d}
~
S d}
~
ww xY w)uƒ  
        Genera el reporte 606 para una empresa en un perÃ­odo especÃ­fico
        
        Args:
            company_id: ID de la empresa
            year: AÃ±o del reporte
            month: Mes del reporte (1-12)
            include_pending: Si incluir facturas pendientes de aprobaciÃ³n
            
        Returns:
            Dict con el contenido del reporte y metadatos
        úEmpresa no encontradaFõ8   No se encontraron facturas para el perÃ­odo especificador   )ÚsuccessÚmessageÚtotal_invoicesÚtotal_amountÚtotal_itbisÚ606_Ú_Ú02dz.txtTú/r"   r#   c                 ó6   — g | ]}|                      ¦   «         ‘ŒS © )Úto_dict©Ú.0Úinvoices     r   ú
<listcomp>z8Report606Service.generate_606_report.<locals>.<listcomp>C   s"   € Ð$OÐ$OÐ$O¸7 W§_¢_Ñ%6Ô%6Ð$OÐ$OÐ$Or   )	r   ÚfilenameÚcontentÚcompanyÚperiodr!   r"   r#   Úinvoices_summary)r   Úerrorr!   r"   r#   N)r
   ÚqueryÚgetÚ
ValueErrorÚ_get_invoices_for_periodÚ_generate_606_contentÚ_calculate_totalsÚrncr*   ÚlenÚ	ExceptionÚstr)r   r   r   r   r   r1   ÚinvoicesÚreport_contentÚtotalsr/   Úes              r   Úgenerate_606_reportz$Report606Service.generate_606_report   s�  € ð.	å”m×'Ò'¨
Ñ3Ô3ˆGØð :Ý Ð!8Ñ9Ô9Ð9ð ×4Ò4°ZÀÀuÈoÑ^Ô^ˆHàð à$ØYØ&'Ø$%Ø#$ðð ð ð "×7Ò7¸ÀÈ4ÐQVÑWÔWˆNð ×+Ò+¨HÑ5Ô5ˆFð B˜gœkÐAÐA¨DÐA°%ÐAÐAÐAÐAˆHð  Ø$Ø)Ø"Ÿ?š?Ñ,Ô,Ø"Ð/Ð/Ð/¨Ð/Ð/Ý"% h¡-¤-Ø & ~Ô 6Ø% mÔ4Ø$OÐ$OÀhÐ$OÑ$OÔ$Oð
ð 
ð 
øõ ð 	ð 	ð 	à Ý˜Q™œØ"#Ø !Ø ðð ð ð ð ð ð ð øøøøð	øøøs%   ‚AC ÁBC Ã
DÃ#C=Ã7DÃ=Dc                 ó  — t           j                             t           j        |k    t	          j        dt           j        ¦  «        |k    t	          j        dt           j        ¦  «        |k    ¦  «        }|s$|                     t           j        dk    ¦  «        }n4|                     t           j                             ddg¦  «        ¦  «        }| 	                    t           j        t           j
        ¦  «                             ¦   «         S )u@   Obtiene las facturas de una empresa para un perÃ­odo especÃ­ficor   r   ÚapprovedÚpending)r	   r5   Úfilterr   r   ÚextractÚinvoice_dateÚstatusÚin_Úorder_byÚinvoice_numberÚall)r   r   r   r   r   r5   s         r   r8   z)Report606Service._get_invoices_for_periodO   sÅ   € õ ”×$Ò$ÝÔ *Ò,ÝŒJ�v�wÔ3Ñ4Ô4¸Ò<ÝŒJ�w¥Ô 4Ñ5Ô5¸Ò>ñ
ô 
ˆð ð 	NØ—L’L¥¤°:Ò!=Ñ>Ô>ˆEˆEà—L’L¥¤×!3Ò!3°ZÀÐ4KÑ!LÔ!LÑMÔMˆEà�~Š~�gÔ2µGÔ4JÑKÔK×OÒOÑQÔQÐQr   r1   r?   c                 ó  — g }|                       |||t          |¦  «        ¦  «        }|                     |¦  «         |D ],}|                      |¦  «        }|                     |¦  «         Œ-| j                             |¦  «        S )u@   Genera el contenido del archivo 606 segÃºn especificaciones DGII)Ú_generate_header_liner<   ÚappendÚ_generate_detail_liner   Újoin)	r   r1   r?   r   r   ÚlinesÚheaderr-   Údetail_lines	            r   r9   z&Report606Service._generate_606_content_   sŒ   € ð ˆð ×+Ò+¨G°T¸5Å#ÀhÁ-Ä-ÑPÔPˆØ�Š�VÑÔÐð  ð 	&ð 	&ˆGØ×4Ò4°WÑ=Ô=ˆKØ�LŠL˜Ñ%Ô%Ð%Ð%àÔ"×'Ò'¨Ñ.Ô.Ð.r   Útotal_recordsc                 ót   — |› |d›�}d|j         |t          |¦  «        g}| j                             |¦  «        S )u.   Genera la lÃ­nea de encabezado del formato 606r&   Ú606)r;   r>   r   rS   )r   r1   r   r   rW   r2   Úfieldss          r   rP   z&Report606Service._generate_header_lineo   sO   € ð Ð%˜%Ð%Ð%Ð%ˆð ØŒKØÝ�ÑÔð	
ˆð Ô#×(Ò(¨Ñ0Ô0Ð0r   r-   c                 óæ  — ddddœ}|                      |j        d¦  «        }d|j        pd||j        pd|j        pd|                      |j        ¦  «        |                      |j        ¦  «        |                      |j	        ¦  «        |                      |j
        ¦  «        |                      |j        ¦  «        |                      |j        ¦  «        |                      |j        ¦  «        |                      |j        ¦  «        |                      |j        ¦  «        |                      |j        ¦  «        |                      |j        ¦  «        |j        pdg}| j                             |¦  «        S )u,   Genera una lÃ­nea de detalle del formato 607Ú1Ú2Ú3)ÚRNCÚCEDULAÚ	PASAPORTEÚ607Ú Ú06)r6   Úsupplier_id_typeÚsupplier_rncÚncfÚncf_modifiedÚ_format_daterI   Úpayment_dateÚ_format_amountÚinvoiced_amountÚitbis_invoicedÚitbis_retainedÚitbis_perceivedÚincome_retentionÚisr_perceivedÚselective_consumption_taxÚother_taxesÚ	legal_tipÚexpense_typer   rS   )r   r-   Úid_type_mapÚid_type_coderZ   s        r   rR   z&Report606Service._generate_detail_line~   s`  € ð ØØð
ð 
ˆð
 #—’ wÔ'?ÀÑEÔEˆð ØÔ Ð& BØØŒKÐ˜2ØÔ Ð& BØ×Ò˜gÔ2Ñ3Ô3Ø×Ò˜gÔ2Ñ3Ô3Ø×Ò Ô 7Ñ8Ô8Ø×Ò Ô 6Ñ7Ô7Ø×Ò Ô 6Ñ7Ô7Ø×Ò Ô 7Ñ8Ô8Ø×Ò Ô 8Ñ9Ô9Ø×Ò Ô 5Ñ6Ô6Ø×Ò Ô AÑBÔBØ×Ò Ô 3Ñ4Ô4Ø×Ò Ô 1Ñ2Ô2ØÔ Ð( Dð#
ˆð( Ô#×(Ò(¨Ñ0Ô0Ð0r   Ú
date_valuec                 óÒ   — |€dS t          |t          ¦  «        r:	 t          j        |d¦  «                             ¦   «         }n# t
          $ r Y dS w xY w|                     d¦  «        S )z1Formatea una fecha para el reporte 606 (YYYYMMDD)Nrc   ú%Y-%m-%dz%Y%m%d)Ú
isinstancer>   r   Ústrptimer   r7   Ústrftime)r   rx   s     r   ri   zReport606Service._format_dateŸ   s~   € àð 	Ø�2å�j¥#Ñ&Ô&ð 	ðÝ%Ô.¨z¸:ÑFÔF×KÒKÑMÔM�
�
øÝð ð ð Ø�r�rðøøøð ×"Ò" 8Ñ,Ô,Ð,s   ›'A Á
AÁAÚamountc                 ór   — |�|dk    rdS t          t          |dz  ¦  «        ¦  «        }t          |¦  «        S )zFFormatea un monto para el reporte 606 (sin decimales, sin separadores)Nr   Ú0éd   )ÚintÚroundr>   )r   r~   Úamount_centss      r   rk   zReport606Service._format_amount¬   sC   € àð 	˜V qš[ð 	Ø�3õ �5 ¨#¡Ñ.Ô.Ñ/Ô/ˆÝ�<Ñ Ô Ð r   c                 óp   — t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }||dœS )z#Calcula los totales de las facturasc              3   ó(   K  — | ]}|j         pd V — ŒdS ©r   N)rl   r+   s     r   ú	<genexpr>z5Report606Service._calculate_totals.<locals>.<genexpr>·   s*   è è € ÐPÐP¸G˜7Ô2Ð7°aÐPÐPÐPÐPÐPÐPr   c              3   ó(   K  — | ]}|j         pd V — ŒdS r‡   )rm   r+   s     r   rˆ   z5Report606Service._calculate_totals.<locals>.<genexpr>¸   s*   è è € ÐNÐN¸'˜'Ô0Ð5°AÐNÐNÐNÐNÐNÐNr   )r"   r#   )Úsum)r   r?   r"   r#   s       r   r:   z"Report606Service._calculate_totalsµ   sQ   € åÐPÐPÀxÐPÑPÔPÑPÔPˆÝÐNÐNÀXÐNÑNÔNÑNÔNˆð )Ø&ð
ð 
ð 	
r   c                 óÆ  — 	 t           j                             |¦  «        }|st          d¦  «        ‚|                      ||||¦  «        }|sdddœS t          j        ¦   «         }t          j        |¦  «        }g d¢}	| 	                    |	¦  «         |D ]Ù}
|
j
        pd|
j        pd|
j        pd|
j        pd|
j        r|
j                             d¦  «        nd|
j        r|
j                             d¦  «        nd|
j        r	|
j        d›nd	|
j        r	|
j        d›nd	|
j        r	|
j        d›nd	|
j        r	|
j        d›nd	|
j        pd|
j        pd|
j        pdg}| 	                    |¦  «         ŒÚ|                     ¦   «         }|                     ¦   «          d
|j        › d|› |d›d�}d||t7          |¦  «        dœS # t8          $ r}dt;          |¦  «        dœcY d}~S d}~ww xY w)u/   Genera un reporte en formato CSV para anÃ¡lisisr   Fr   )r   r    )u   NÃºmero FacturaÚNCFÚ	ProveedorzRNC ProveedorzFecha Facturaz
Fecha PagozMonto FacturadozITBIS FacturadozITBIS Retenidou   RetenciÃ³n Rentaz
Tipo Gastou   DescripciÃ³n GastoÚEstadorc   rz   z.2fz0.00Ú	facturas_r%   r&   z.csvT)r   r/   r0   r!   ©r   r4   N)r
   r5   r6   r7   r8   ÚioÚStringIOÚcsvÚwriterÚwriterowrM   rg   Úsupplier_namerf   rI   r}   rj   rl   rm   rn   rp   ru   Úexpense_descriptionrJ   ÚgetvalueÚcloser;   r<   r=   r>   )r   r   r   r   r   r1   r?   Úoutputr”   Úheadersr-   ÚrowÚcsv_contentr/   rB   s                  r   Úgenerate_csv_reportz$Report606Service.generate_csv_report¿   s†  € ð<	Ý”m×'Ò'¨
Ñ3Ô3ˆGØð :Ý Ð!8Ñ9Ô9Ð9à×4Ò4°ZÀÀuÈoÑ^Ô^ˆHàð à$ØYðð ð õ ”[‘]”]ˆFÝ”Z Ñ'Ô'ˆFðð ð ˆGð
 �OŠO˜GÑ$Ô$Ð$ð $ð %ð %�àÔ*Ð0¨bØ”KÐ% 2ØÔ)Ð/¨RØÔ(Ð.¨BØAHÔAUÐ]�GÔ(×1Ò1°*Ñ=Ô=Ð=Ð[]ØAHÔAUÐ]�GÔ(×1Ò1°*Ñ=Ô=Ð=Ð[]Ø8?Ô8OÐ[�wÔ.Ð4Ð4Ð4ÐU[Ø7>Ô7MÐY�wÔ-Ð3Ð3Ð3ÐSYØ7>Ô7MÐY�wÔ-Ð3Ð3Ð3ÐSYØ9@Ô9QÐ]�wÔ/Ð5Ð5Ð5ÐW]ØÔ(Ð.¨BØÔ/Ð5°2Ø”NÐ( bð�ð —’ Ñ$Ô$Ð$Ð$à Ÿ/š/Ñ+Ô+ˆKØ�LŠL‰NŒNˆNàF 7¤;ÐFÐF°ÐF°uÐFÐFÐFÐFˆHð  Ø$Ø&Ý"% h¡-¤-ð	ð ð øõ ð 	ð 	ð 	à Ý˜Q™œðð ð ð ð ð ð ð øøøøð	øøøs%   ‚AF: ÁE(F: Æ:
G ÇGÇG ÇG c                 ó>  — 	 |                       |||d¬¦  «        }d„ |D ¦   «         }d„ |D ¦   «         }d„ |D ¦   «         }|                      |¦  «        }|                      |¦  «        }	|                      |¦  «        }
|                      |¦  «        }d|d›d|› �t	          |¦  «        |d         |d	         d
œt	          |¦  «        |	d         |	d	         d
œdt	          |¦  «        idœ|
|dd…         dœS # t
          $ r}dt          |¦  «        dœcY d}~S d}~ww xY w)u1   Obtiene un resumen del perÃ­odo para el dashboardT)r   c                 ó(   — g | ]}|j         d k    ¯|‘ŒS )rE   ©rJ   ©r,   Úinvs     r   r.   z7Report606Service.get_period_summary.<locals>.<listcomp>  ó$   € Ð UÐ UÐ U¨¸C¼JÈ*Ò<TÐ U Ð UÐ UÐ Ur   c                 ó(   — g | ]}|j         d k    ¯|‘ŒS )rF   r¡   r¢   s     r   r.   z7Report606Service.get_period_summary.<locals>.<listcomp>  s$   € ÐSÐSÐS¨¸3¼:ÈÒ;RÐS ÐSÐSÐSr   c                 ó(   — g | ]}|j         d k    ¯|‘ŒS )Úrejectedr¡   r¢   s     r   r.   z7Report606Service.get_period_summary.<locals>.<listcomp>  r¤   r   r&   r'   r"   r#   )Úcountr~   Úitbisr¨   )rE   rF   r§   Né
   )r   r2   rA   Úexpense_summaryÚsupplier_summaryFr�   )r8   r:   Ú_get_expense_type_summaryÚ_get_supplier_summaryr<   r=   r>   )r   r   r   r   r?   Úapproved_invoicesÚpending_invoicesÚrejected_invoicesÚapproved_totalsÚpending_totalsr«   r¬   rB   s                r   Úget_period_summaryz#Report606Service.get_period_summary   s·  € ð,	Ø×4Ò4°ZÀÀuÐ^bÐ4ÑcÔcˆHð !VÐ U°Ð UÑ UÔ UÐØSÐS¨xÐSÑSÔSÐØ UÐ U°Ð UÑ UÔ UÐð #×4Ò4Ð5FÑGÔGˆOØ!×3Ò3Ð4DÑEÔEˆNð #×<Ò<Ð=NÑOÔOˆOð  $×9Ò9Ð:KÑLÔLÐð  Ø"Ð/Ð/Ð/¨Ð/Ð/õ "%Ð%6Ñ!7Ô!7Ø"1°.Ô"AØ!0°Ô!?ð!ð !õ "%Ð%5Ñ!6Ô!6Ø"0°Ô"@Ø!/°Ô!>ð ð  ð  ¥Ð%6Ñ!7Ô!7ð!ðð ð $3Ø$4°S°b°SÔ$9ð'ð ð øõ, ð 	ð 	ð 	à Ý˜Q™œðð ð ð ð ð ð ð øøøøð	øøøs   ‚C3C6 Ã6
DÄ DÄDÄDc                 óü   — i }|D ]S}|j         pd}||vr||j        pddddœ||<   ||         dxx         dz  cc<   ||         dxx         |j        pdz  cc<   ŒTt          |                     ¦   «         d„ d	¬
¦  «        S )z Genera resumen por tipo de gastord   u   Sin descripciÃ³nr   )ÚtypeÚdescriptionr¨   r~   r¨   é   r~   c                 ó   — | d         S ©Nr~   r)   ©Úxs    r   ú<lambda>z<Report606Service._get_expense_type_summary.<locals>.<lambda>B  s
   € ¸Q¸x¼[€ r   T©ÚkeyÚreverse)ru   r—   rl   ÚsortedÚvalues)r   r?   Úexpense_totalsr-   ru   s        r   r­   z*Report606Service._get_expense_type_summary0  sÐ   € àˆàð 	Sð 	SˆGØ"Ô/Ð7°4ˆLØ >Ð1ð à(Ø#*Ô#>Ð#TÐBTØØð	0ð 0�˜|Ñ,ð ˜<Ô(¨Ð1Ð1Ô1°QÑ6Ð1Ð1Ñ1Ø˜<Ô(¨Ð2Ð2Ô2°gÔ6MÐ6RÐQRÑRÐ2Ð2Ñ2Ð2õ �n×+Ò+Ñ-Ô-Ð3HÐ3HÐRVÐWÑWÔWÐWr   c                 ó  — i }|D ]b}|j         › d|j        › �}||vr|j        pd|j         pddddœ||<   ||         dxx         dz  cc<   ||         dxx         |j        pdz  cc<   Œct          |                     ¦   «         d	„ d
¬¦  «        S )zGenera resumen por proveedorr%   z
Sin nombrezSin RNCr   )r–   rf   r¨   r~   r¨   r¸   r~   c                 ó   — | d         S rº   r)   r»   s    r   r½   z8Report606Service._get_supplier_summary.<locals>.<lambda>V  s
   € ¸aÀ¼k€ r   Tr¾   )rf   r–   rl   rÁ   rÂ   )r   r?   Úsupplier_totalsr-   Úsupplier_keys        r   r®   z&Report606Service._get_supplier_summaryD  sã   € àˆàð 	Tð 	TˆGØ%Ô2ÐLÐL°WÔ5JÐLÐLˆLØ ?Ð2ð à%,Ô%:Ð%J¸lØ$+Ô$8Ð$E¸IØØð	1ð 1� Ñ-ð ˜LÔ)¨'Ð2Ð2Ô2°aÑ7Ð2Ð2Ñ2Ø˜LÔ)¨(Ð3Ð3Ô3°wÔ7NÐ7SÐRSÑSÐ3Ð3Ñ3Ð3õ �o×,Ò,Ñ.Ô.Ð4IÐ4IÐSWÐXÑXÔXÐXr   N)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r‚   Úboolr   r>   r   rC   r   r	   r8   r
   r9   rP   rR   r   r   ri   Úfloatrk   r:   rž   r´   r­   r®   r)   r   r   r   r   
   sÍ  € € € € € ØBÐBð#ð #ð #ð
 49ð<ð <¨cð <¸ð <ÀSð <Ø,0ð<Ø=AÀ#ÀsÀ(¼^ð<ð <ð <ð <ð|R°3ð R¸cð RÈ#ð RØ15ðRØ:>¸w¼-ðRð Rð Rð Rð /¨Wð /ÀÀWÄð /Ø#&ð/Ø/2ð/Ø7:ð/ð /ð /ð /ð 1¨Wð 1¸Cð 1Èð 1Ø,/ð1Ø47ð1ð 1ð 1ð 1ð1¨Wð 1¸ð 1ð 1ð 1ð 1ðB- x°¤~ð -¸#ð -ð -ð -ð -ð! X¨e¤_ð !¸ð !ð !ð !ð !ð
¨$¨w¬-ð 
¸DÀÀeÀÔ<Lð 
ð 
ð 
ð 
ð 49ð?ð ?¨cð ?¸ð ?ÀSð ?Ø,0ð?Ø=AÀ#ÀsÀ(¼^ð?ð ?ð ?ð ?ðB.¨Sð .¸ð .ÀCð .ÈDÐQTÐVYÐQYÌNð .ð .ð .ð .ð`X°$°w´-ð XÀDÈÈcÐSVÈhÌÔDXð Xð Xð Xð Xð(Y¨d°7¬mð YÀÀTÈ#ÈsÈ(Ä^Ô@Tð Yð Yð Yð Yð Yð Yr   r   )Úosr“   r‘   r   r   Útypingr   r   r   r   Úsrc.models.invoicer	   Úsrc.models.companyr
   Úsrc.models.userr   r   r)   r   r   ú<module>rÓ      sØ   ðØ 	€	€	€	Ø 
€
€
€
Ø 	€	€	€	Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø &Ð &Ð &Ð &Ð &Ð &Ø &Ð &Ð &Ð &Ð &Ð &Ø Ð Ð Ð Ð Ð ðLYð LYð LYð LYð LYñ LYô LYð LYð LYð LYr   