def next_folio(self, using=None): """ Generar un folio nuevo de una poliza e incrementa el consecutivo de folios """ tipo_poliza = self.tipo_poliza prefijo = tipo_poliza.prefijo if not prefijo: prefijo = "" tipo_consecutivo = tipo_poliza.tipo_consec try: if tipo_consecutivo == "M": tipo_poliza_det = TipoPolizaDetalle.objects.get( tipo_poliza=tipo_poliza, mes=self.fecha.month, ano=self.fecha.year ) elif tipo_consecutivo == "E": tipo_poliza_det = TipoPolizaDetalle.objects.get(tipo_poliza=tipo_poliza, ano=self.fecha.year, mes=0) elif tipo_consecutivo == "P": tipo_poliza_det = TipoPolizaDetalle.objects.get(tipo_poliza=tipo_poliza, mes=0, ano=0) except ObjectDoesNotExist: if tipo_consecutivo == "M": tipo_poliza_det = TipoPolizaDetalle.objects.create( id=next_id("ID_CATALOGOS", using), tipo_poliza=tipo_poliza, ano=self.fecha.year, mes=self.fecha.month, consecutivo=1, ) elif tipo_consecutivo == "E": # Si existe permanente toma su consecutivo para crear uno nuevo si no existe inicia en 1 consecutivo = TipoPolizaDetalle.objects.filter(tipo_poliza=tipo_poliza, mes=0, ano=0).aggregate( max=Sum("consecutivo") )["max"] if consecutivo == None: consecutivo = 1 tipo_poliza_det = TipoPolizaDetalle.objects.create( id=next_id("ID_CATALOGOS", using), tipo_poliza=tipo_poliza, ano=self.fecha.year, mes=0, consecutivo=consecutivo, ) elif tipo_consecutivo == "P": consecutivo = TipoPolizaDetalle.objects.all().aggregate(max=Sum("consecutivo"))["max"] if consecutivo == None: consecutivo = 1 tipo_poliza_det = TipoPolizaDetalle.objects.create( id=next_id("ID_CATALOGOS", using), tipo_poliza=tipo_poliza, ano=0, mes=0, consecutivo=consecutivo ) folio = "%s%s" % (prefijo, ("%09d" % tipo_poliza_det.consecutivo)[len(prefijo) :]) # CONSECUTIVO DE FOLIO DE POLIZA tipo_poliza_det.consecutivo += 1 tipo_poliza_det.save() return folio
def crear_polizas(origen_documentos, documentos, depto_co, informacion_contable, plantilla=None, crear_polizas_por='',crear_polizas_de=None, connection_name = None, usuario_micorsip='',**kwargs): """ Crea las polizas contables segun el tipo y origen de documentos que se mande """ msg = kwargs.get('msg', '') descripcion = kwargs.get('descripcion', '') tipo_documento = kwargs.get('tipo_documento', '') conceptos_poliza = [] error = 0 DocumentosData = [] cuenta = '' importe = 0 if origen_documentos == 'cuentas_por_cobrar': conceptos_poliza = DetallePlantillaPolizas_CC.objects.filter(plantilla_poliza_CC=plantilla).order_by('posicion') elif origen_documentos == 'cuentas_por_pagar': conceptos_poliza = DetallePlantillaPolizas_CP.objects.filter(plantilla_poliza_CP=plantilla).order_by('posicion') elif origen_documentos == 'ventas': conceptos_poliza = DetallePlantillaPolizas_V.objects.filter(plantilla_poliza_v=plantilla).order_by('posicion') elif origen_documentos == 'punto_de_venta': conceptos_poliza = DetallePlantillaPolizas_pv.objects.filter(plantilla_poliza_pv=plantilla).order_by('posicion') moneda_local = Moneda.objects.get(es_moneda_local='S') documento_numero = 0 polizas = [] detalles_polizas = [] moneda = moneda_local tipo_cambio = 1 totales_cuentas = TotalesCuentas(conceptos_poliza) for documento_no, documento in enumerate(documentos): #es_contado = documento.condicion_pago == informacion_contable.condicion_pago_contado #Descripcion extra descripcion_extra = '' if origen_documentos == 'cuentas_por_pagar': descripcion_extra = documento.proveedor.nombre elif origen_documentos == 'ventas': descripcion_extra = documento.folio siguente_documento = documentos[(documento_no +1)%len(documentos)] documento_numero = documento_no kwargs_totales, error, msg = documento.get_totales(informacion_contable.condicion_pago_contado) totales_cuentas.agregar_valorcuenta(kwargs_totales) if error == 0: #Cuando la fecha de la documento siguiente sea diferente y sea por DIA, o sea la ultima if (not documento.fecha == siguente_documento.fecha and crear_polizas_por == 'Dia') or documento_no +1 == len(documentos) or crear_polizas_por == 'Documento': #tipo_poliza if origen_documentos == 'ventas': if tipo_documento == 'F': tipo_poliza = informacion_contable.tipo_poliza_ve elif tipo_documento == 'D': tipo_poliza = informacion_contable.tipo_poliza_dev elif origen_documentos == 'cuentas_por_cobrar' or origen_documentos == 'cuentas_por_pagar': tipo_poliza = TipoPoliza.objects.filter(clave=documento.concepto.clave_tipo_poliza)[0] elif origen_documentos == 'punto_de_venta': if tipo_documento == 'V': tipo_poliza = TipoPoliza.objects.get(clave=Registry.objects.get(nombre='TIPO_POLIZA_VENTAS_PV').valor) elif tipo_documento == 'D': tipo_poliza = TipoPoliza.objects.get(clave=Registry.objects.get(nombre='TIPO_POLIZA_DEVOL_PV').valor) #form_reg.fields['tipo_poliza_cobros_cc'].initial = Registry.objects.get(nombre='TIPO_POLIZA_COBROS_CXC_PV').valor #Si no tiene una descripcion el documento se pone lo que esta indicado en la descripcion general if documento.descripcion: descripcion = documento.descripcion descripcion_doc = "(%s) %s"% (descripcion_extra, descripcion) referencia = documento.folio if crear_polizas_por == 'Dia': referencia = '' if crear_polizas_por == 'Documento': if origen_documentos == 'cuentas_por_pagar': moneda = documento.proveedor.moneda elif origen_documentos == 'cuentas_por_cobrar': moneda = documento.cliente.moneda else: moneda = documento.moneda tipo_cambio = documento.tipo_cambio poliza = ContabilidadDocumento( id = next_id('ID_DOCTOS', connection_name), tipo_poliza = tipo_poliza, fecha = documento.fecha, moneda = moneda, tipo_cambio = tipo_cambio, estatus = 'P', cancelado= 'N', aplicado = 'N', ajuste = 'N', integ_co = 'S', descripcion = descripcion_doc, forma_emitida = 'N', sistema_origen = 'CO', nombre = '', grupo_poliza_periodo = None, integ_ba = 'N', usuario_creador = usuario_micorsip, fechahora_creacion = datetime.datetime.now(), usuario_aut_creacion = None, usuario_ult_modif = usuario_micorsip, fechahora_ult_modif = datetime.datetime.now(), usuario_aut_modif = None, usuario_cancelacion = None, fechahora_cancelacion = None, usuario_aut_cancelacion = None, ) polizas.append(poliza) asientos_ordenados_keys = sorted(totales_cuentas.keys(), key = lambda x: totales_cuentas[x]['posicion']) for asiento_key in asientos_ordenados_keys: asiento = totales_cuentas[asiento_key] cuenta_co = ContabilidadCuentaContable.objects.get(cuenta=asiento['cuenta']) depto_co = ContabilidadDepartamento.objects.get(clave= asiento['departamento']) detalle_poliza = ContabilidadDocumentoDetalle( id = -1, docto_co = poliza, cuenta = cuenta_co, depto_co = depto_co, tipo_asiento = asiento['tipo_asiento'], importe = asiento['importe'], importe_mn = 0,#PENDIENTE ref = referencia, descripcion = '', posicion = -1, recordatorio = None, fecha = documento.fecha, cancelado = 'N', aplicado = 'N', ajuste = 'N', moneda = moneda, ) detalles_polizas.append(detalle_poliza) #DE NUEVO CONVIERTO LA VARIABLE A DICCIONARIO totales_cuentas.clear() documento.contabilizado ='S' documento.save(update_fields=['contabilizado']) if error == 0: for poliza in polizas: poliza.poliza = poliza.next_folio(using=connection_name) DocumentosData.append({ 'folio':poliza.poliza, }) ContabilidadDocumento.objects.bulk_create(polizas) ContabilidadDocumentoDetalle.objects.bulk_create(detalles_polizas) else: DocumentosData = [] polizas = [] detalles_polizas = [] return msg, DocumentosData