コード例 #1
0
ファイル: models.py プロジェクト: jesusmaherrera/microsip_web
    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
コード例 #2
0
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