156 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from dataclasses import dataclass
 | 
						|
import datetime
 | 
						|
 | 
						|
from facho import fe
 | 
						|
 | 
						|
class Habilitacion:
 | 
						|
 | 
						|
    @dataclass
 | 
						|
    class Metadata:
 | 
						|
        software_pin: str
 | 
						|
        software_id: str
 | 
						|
        nit: str
 | 
						|
        dv: str
 | 
						|
 | 
						|
    def __init__(self, metadata):
 | 
						|
        self.metadata = metadata
 | 
						|
 | 
						|
    def generar(self, zipname, fecha):
 | 
						|
        nominas = []
 | 
						|
        dianzip = fe.DianZIP(open(zipname, 'w'))
 | 
						|
 | 
						|
        fechabase = datetime.datetime.now()
 | 
						|
        consecutivo = 0
 | 
						|
        for _ in range(1, 11):
 | 
						|
            consecutivo += 1
 | 
						|
            fechabase += datetime.timedelta(days=1)
 | 
						|
            nomina = self._crear_nomina_individual()
 | 
						|
 | 
						|
            # pag 96
 | 
						|
            nombre = "nie%010d%s%08x.xml" % (int(self.nit), fecha.strftime('%s'), consecutivo)
 | 
						|
        
 | 
						|
    def _crear_nomina_individual_reemplazar(self, nomina, fechabase):
 | 
						|
        metadata = self.metadata
 | 
						|
 | 
						|
        fecha = fechabase.strftime('%Y-%m-%d')
 | 
						|
 | 
						|
        nomina_ajuste = fe.nomina.DIANNominaIndividualDeAjuste.Reemplazar()
 | 
						|
        self._poblar_nomina(nomina_ajuste, metadata, fecha, prefijo='R')
 | 
						|
        informacion_general = nomina.informacion_general()
 | 
						|
        
 | 
						|
        
 | 
						|
    def _poblar_nomina(self, nomina, metadata, fecha, prefijo='N', consecutivo='0001'):
 | 
						|
        nomina.asignar_fecha_pago(fecha)
 | 
						|
 | 
						|
        nomina.asignar_metadata(fe.nomina.Metadata(
 | 
						|
            secuencia=fe.nomina.NumeroSecuencia(
 | 
						|
                prefijo=prefijo,
 | 
						|
                consecutivo=consecutivo
 | 
						|
            ),
 | 
						|
            lugar_generacion=fe.nomina.Lugar(
 | 
						|
                pais = fe.nomina.Pais(
 | 
						|
                    code = 'CO'
 | 
						|
                ),
 | 
						|
                departamento = fe.nomina.Departamento(
 | 
						|
                    code = '05'
 | 
						|
                ),
 | 
						|
                municipio = fe.nomina.Municipio(
 | 
						|
                    code = '05001'
 | 
						|
                ),
 | 
						|
            ),
 | 
						|
            proveedor=fe.nomina.Proveedor(
 | 
						|
                nit=metadata.nit,
 | 
						|
                dv=metadata.dv,
 | 
						|
                software_id=metadata.software_id,
 | 
						|
                software_pin=metadata.software_pin
 | 
						|
            )
 | 
						|
        ))
 | 
						|
 | 
						|
        nomina.asignar_periodo(fe.nomina.Periodo(
 | 
						|
            fecha_ingreso=fecha,
 | 
						|
            fecha_liquidacion_inicio=fecha,
 | 
						|
            fecha_liquidacion_fin=fecha,
 | 
						|
            fecha_generacion=fecha,
 | 
						|
        ))
 | 
						|
        
 | 
						|
        nomina.asignar_informacion_general(fe.nomina.InformacionGeneral(
 | 
						|
            fecha_generacion = fecha,
 | 
						|
            hora_generacion = '20:09:00-05:00',
 | 
						|
            tipo_ambiente = fe.nomina.InformacionGeneral.AMBIENTE_PRUEBAS,
 | 
						|
            software_pin = metadata.software_pin,
 | 
						|
            periodo_nomina = fe.nomina.PeriodoNomina(code='1'),
 | 
						|
            tipo_moneda = fe.nomina.TipoMoneda(code='COP')
 | 
						|
        ))
 | 
						|
 | 
						|
        nomina.asignar_pago(fe.nomina.Pago(
 | 
						|
            forma=fe.nomina.FormaPago(
 | 
						|
                code='1',
 | 
						|
            ),
 | 
						|
            metodo=fe.nomina.MetodoPago(
 | 
						|
                code='10'
 | 
						|
            )
 | 
						|
        ))
 | 
						|
        nomina.asignar_empleador(fe.nomina.Empleador(
 | 
						|
            nit = metadata.nit,
 | 
						|
            dv = '0',
 | 
						|
            pais = fe.nomina.Pais(
 | 
						|
                code = 'CO'
 | 
						|
            ),
 | 
						|
            departamento = fe.nomina.Departamento(
 | 
						|
                code = '05'
 | 
						|
            ),
 | 
						|
            municipio = fe.nomina.Municipio(
 | 
						|
                code = '05001'
 | 
						|
            ),
 | 
						|
            direccion = 'calle etrivial'
 | 
						|
        ))
 | 
						|
 | 
						|
        nomina.asignar_trabajador(fe.nomina.Trabajador(
 | 
						|
            tipo_contrato = fe.nomina.TipoContrato(
 | 
						|
                code = '1'
 | 
						|
            ),
 | 
						|
            alto_riesgo = False,
 | 
						|
            tipo_documento = fe.nomina.TipoDocumento(
 | 
						|
                code = '11'
 | 
						|
            ),
 | 
						|
            primer_apellido = 'gnu',
 | 
						|
            segundo_apellido = 'emacs',
 | 
						|
            primer_nombre = 'facho',
 | 
						|
            lugar_trabajo = fe.nomina.LugarTrabajo(
 | 
						|
                pais = fe.nomina.Pais(code='CO'),
 | 
						|
                departamento = fe.nomina.Departamento(code='05'),
 | 
						|
                municipio = fe.nomina.Municipio(code='05001'),
 | 
						|
                direccion = 'calle facho'
 | 
						|
            ),
 | 
						|
            numero_documento = metadata.nit,
 | 
						|
            tipo = fe.nomina.TipoTrabajador(
 | 
						|
                code = '01'
 | 
						|
            ),
 | 
						|
            salario_integral = True,
 | 
						|
            sueldo = fe.nomina.Amount(1_500_000)
 | 
						|
        ))
 | 
						|
        
 | 
						|
        nomina.adicionar_devengado(fe.nomina.DevengadoBasico(
 | 
						|
            dias_trabajados = 60,
 | 
						|
            sueldo_trabajado = fe.nomina.Amount(3_500_000)
 | 
						|
        ))
 | 
						|
 | 
						|
        nomina.adicionar_deduccion(fe.nomina.DeduccionSalud(
 | 
						|
            porcentaje = fe.nomina.Amount(19),
 | 
						|
            deduccion = fe.nomina.Amount(1_000_000)
 | 
						|
        ))
 | 
						|
 | 
						|
        nomina.adicionar_deduccion(fe.nomina.DeduccionFondoPension(
 | 
						|
            porcentaje=fe.nomina.Amount(1),
 | 
						|
            deduccion=fe.nomina.Amount(10)
 | 
						|
        ))
 | 
						|
 | 
						|
    def _crear_nomina_individual(self, fechabase):
 | 
						|
        metadata = self.metadata
 | 
						|
 | 
						|
        fecha = fechabase.strftime('%Y-%m-%d')
 | 
						|
 | 
						|
        nomina = fe.nomina.DIANNominaIndividual()
 | 
						|
        self._poblar_nomina(nomina, metadata, fecha)
 | 
						|
                
 |