@@ -87,6 +87,7 @@ class AccountJournal(models.Model):
8787 # "TXT Perc/Ret IIBB aplicadas ARBA desde 01/03/2026: Percepciones Act. 7 método Percibido (quincenal)",
8888 # ),
8989 # ('other', 'Other')
90+ ("percepciones_sircip" , "TXT Percepciones Aplicadas SIRCIP" ),
9091 ]
9192 )
9293
@@ -1786,3 +1787,121 @@ def iibb_aplicado_arba_desde_01032026_files_values(self, move_lines, act_7=None)
17861787 "txt_content" : ret ,
17871788 },
17881789 ]
1790+
1791+ def percepciones_sircip_files_values (self , move_lines ):
1792+ """Implementado según especificación indicada en tarea 60704.
1793+ La longitud de los campos, ejemplo 'Numérico 2' es la máxima permitida.
1794+ Ej. de registro:
1795+ 30100100106,34,03/03/2026,11,1,,904,1,A,2,3431222,12342.03,2.00,246.84,,,A
1796+ Aclaración: Las validaciones del archivo cargado se realizan con posterioridad a la carga.
1797+ El resultado del procesamiento, se informará en la propia aplicación. En caso de errores,
1798+ se generará un archivo con los mismos, para ser descargado por el agente"""
1799+ self .ensure_one ()
1800+ content = ""
1801+ for line in move_lines .sorted (key = lambda r : (r .date , r .id )):
1802+ # 1 Nro de CUIT del Contribuyente (Numérico 11, ejemplo 30100100106)
1803+ content += line .partner_id .ensure_vat () + ","
1804+
1805+ # 2 CRC del contribuyente período (Numérico 2, ejemplo: 34)
1806+ # TODO consultar
1807+ content += " " + ","
1808+
1809+ # 3 Fecha de Percepción (dd/mm/aaaa, ejemplo: 03/03/2026)
1810+ content += fields .Date .from_string (line .date ).strftime ("%d/%m/%Y" ) + ","
1811+
1812+ # 4 Tipo de Régimen de Percepción (código correspondiente según tabla
1813+ # definida por la jurisdicción, numérico 3, ejemplo: 11)
1814+ # TODO consultar
1815+ content += " " + ","
1816+
1817+ # 5 Tipo de Registro (1-Percepción, 2-Informativo, 3-Excluido, 4-No Inscripto
1818+ # 5-Sobretasa, 6-Anulada, 7-Omitida). (Numérico 2, ejemplo: 1)
1819+ # TODO consultar: solo 1 va?
1820+ content += "1" + ","
1821+
1822+ # 6 Código de Operación Exceptuada (sólo para tipo de registro 3-Excluido).
1823+ # Definir tabla de valores. (Numérico 2)
1824+ content += " " + ","
1825+
1826+ # 7 Jurisdicción a imputar (No inscripto o Sobretasa), o donde se realizó la
1827+ # operación (Percepción, Informativo o Excluiodo). (Numérico 3, ejemplo: 904)
1828+ tax = line ._get_settlement_tax ()
1829+ content += tax .l10n_ar_state_id .jurisdiction_code + ","
1830+
1831+ # 8 Tipo de Comprobante. Numérico 3, ejemplo: 1. 1 factura, 2 nota de débito, 3
1832+ # recibo, 4 nota de venta al contado, 5 factura de exportación, 6 nota de débito
1833+ # para op. c/exterior, 7 liquidacíon, 20 otros comprobantes de débito,
1834+ # 102 nota crédito, 106 nota crédito op. c/exterior, 120 otros comprobantes
1835+ # de crédito, 900 devolución. (numérico 3, ejemplo: 1)
1836+ internal_type = line .l10n_latam_document_type_id .internal_type
1837+ tipo_comp = ""
1838+ if line .l10n_latam_document_type_id .code == "19" :
1839+ tipo_comp = "5"
1840+ elif line .l10n_latam_document_type_id .code in ["17" , "18" , "63" , "64" , "27" , "28" , "29" ]:
1841+ tipo_comp = "7"
1842+ elif internal_type == "invoice" :
1843+ tipo_comp = "1"
1844+ elif internal_type == "debit_note" :
1845+ tipo_comp = "2"
1846+ elif internal_type == "credit_note" :
1847+ tipo_comp = "102"
1848+ content += tipo_comp + ","
1849+
1850+ # 9 letra del comprobante (A,B,C,E o M, según tipo de comprobante).
1851+ # Char 1, ejemplo: A.
1852+ content += line .l10n_latam_document_type_id .l10n_ar_letter + ","
1853+
1854+ document_parts = line .move_id ._l10n_ar_get_document_number_parts (
1855+ line .move_id .l10n_latam_document_number , line .l10n_latam_document_type_id .code
1856+ )
1857+ # 10 punto de venta. Numérico 5, ejemplo: 2.
1858+ content += "{:0>5d}" .format (document_parts ["point_of_sale" ])[- 5 :] + ","
1859+
1860+ # 11 número de comprobante. Numérico 8, ejemplo: 3431222.
1861+ content += "{:0>8d}" .format (document_parts ["invoice_number" ])[- 8 :] + ","
1862+
1863+ # 12 Monto Sujeto a Percepción (numérico sin separador de miles y “Punto”
1864+ # como separador decimal). Numérico 13, ejemplo: 12342.03
1865+ content += format_amount (- get_line_tax_base (line ), 13 , 2 , "." ) + ","
1866+
1867+ # 13 Alícuota (en porcentaje y “Punto” como separador decimal)
1868+ # Numérico(3,2), ejemplo: 2.00
1869+ content += "%03.2f" % tax .amount + ","
1870+
1871+ # 14 Monto Percibido o Devuelto (numérico sin separador de miles, se
1872+ # obtiene de multiplicar el campo 12 por el campo 13 y dividirlo por 100)
1873+ # Numérico 10, ejemplo: 246.84
1874+ content += "%0.2f" % (- line .balance ) + ","
1875+
1876+ # 15 Número de comprobante original (sólo para las Anulaciones/Devoluciones)
1877+ # (Tipo, Letra, Punto de venta y Número de Comprobante). Alfanumérico (17)
1878+ comp_original = ""
1879+ if reversed_entry := line .move_id .reversed_entry_id :
1880+ reversed_internal_type = reversed_entry .l10n_latam_document_type_id .internal_type
1881+ if reversed_entry .l10n_latam_document_type_id .code == "19" :
1882+ comp_original += "5"
1883+ elif reversed_entry .l10n_latam_document_type_id .code in ["17" , "18" , "63" , "64" , "27" , "28" , "29" ]:
1884+ comp_original += "7"
1885+ elif reversed_internal_type == "invoice" :
1886+ comp_original += "1"
1887+ elif reversed_internal_type == "debit_note" :
1888+ comp_original += "2"
1889+ comp_original += reversed_entry .l10n_latam_document_type_id .l10n_ar_letter
1890+ reversed_entry_document_parts = reversed_entry ._l10n_ar_get_document_number_parts (
1891+ reversed_entry .l10n_latam_document_number , reversed_entry .l10n_latam_document_type_id .code
1892+ )
1893+ comp_original += "{:0>5d}" .format (reversed_entry_document_parts ["point_of_sale" ])[- 5 :]
1894+ comp_original += "{:0>8d}" .format (reversed_entry_document_parts ["invoice_number" ])[- 8 :]
1895+ content += comp_original .ljust (17 ) + ","
1896+ # 16 CRC del contribuyente devolución. Numérico(2)
1897+ content += " " + ","
1898+
1899+ # 17 ABM (Indica si es un registro de Alta, Modificación o Baja).
1900+ # Alfanumérico(1), ejemplo: A
1901+ content += "A" + "\r \n "
1902+ return [
1903+ {
1904+ "txt_filename" : "Percepciones_sircip.txt" ,
1905+ "txt_content" : content ,
1906+ }
1907+ ]
0 commit comments