cobros.py 10.7 KB
# -*- coding: utf-8 -*-
from odoo.exceptions import UserError
from odoo import models, fields, api
from datetime import datetime

class vnt_cobros(models.Model):
    _name = 'vnt.cobros'
    _inherit = ['asw.generador_comprobante', 'asw.action.manager']

    co_cliente = fields.Many2one(
        string='Cliente',
        comodel_name='asw.cliente',
    )

    co_lin_deuda = fields.One2many(
        string=u"Línea Deuda",
        comodel_name='vnt.linea_deuda',
        inverse_name='ld_cobros',
    )

    co_resumen = fields.Text(
        string="Resumen",
    )

    co_total_deuda = fields.Float(
        string="Total Deuda",
        compute="_compute_co_total_deuda",

    )

    co_total_interes = fields.Float(
        string=u"Total Interés",
        compute="_compute_co_total_interes",
    )

    co_total = fields.Float(
        string="Total",
        compute="_compute_co_total",
    )

    co_deucarg = fields.Boolean(
        string="Deudas cargadas",
        default=False,
    )

    co_estado = fields.Selection(
        string=u'Estado Cobro',
        selection=[('b', 'Borrador'),('a', 'Confirmado'),('pr', 'Procesado'),('p', 'Cobrado'),('c', 'Cancelado')],
        readonly= True,
        default= 'b',
        store= True
    )

    #Calculos de totales 
    @api.depends('co_lin_deuda')
    def _compute_co_total_deuda(self):
        sumita = 0
        for record in self:
            for lin in record.co_lin_deuda:
                if lin.ld_select == True: 
                    sumita += lin.ld_comp_adeudado
            record.co_total_deuda = sumita 
    
    @api.depends('co_lin_deuda')
    def _compute_co_total_interes(self):
        sumita = 0
        for record in self:
            for lin in record.co_lin_deuda:
                if lin.ld_select == True: 
                    sumita += lin.ld_interes
            record.co_total_interes = sumita 

    @api.depends('co_total_deuda', 'co_total_interes')
    def _compute_co_total(self):
        sumita = 0
        for record in self:
            record.co_total = record.co_total_deuda + record.co_total_interes

    def traer_ld(self):
        self.co_deucarg = True
        #recupero comprobantes de venta, adeudados, con el cliente seleccionado
        comp_venta_adeud = self.env['asw.comprobante'].search([('comp_talonario.tal_menu','=','fac'),('comp_tipo_comp','=','e'),('comp_estado', '=', 'a'),('comp_cliente', '=', self.co_cliente.id)])
        if comp_venta_adeud:
            for comp in comp_venta_adeud:
                nva_linea = self.env['vnt.linea_deuda'].create({'ld_factura': comp.id, 'ld_cobros': self.id})
        else: 
            raise UserError("No hay deudas registradas del cliente seleccionado")

    def volver_borrador(self):
        if (self.co_estado == 'pr'):
            for lin in self.co_lin_deuda:
                nota = lin.ld_nd.id
                nota = self.env['asw.comprobante'].search([('id', '=', nota)])
                nota.comp_fecha_cancelacion = datetime.today()
        self.co_estado = 'b'
        

    def procesar_deuda(self):
        if self.co_total == 0:
            raise UserError('No hay valores seleccionados a confirmar')
        else:
            for li in self.co_lin_deuda:
                if li.ld_select:
                    if li.ld_cobro not in ['todo', 'negociado', 'perdido']:
                      raise UserError('Debe elegir un modo de cobro para cada línea seleccionada')  
            self.co_estado = 'a'

    def procesar_notas(self):
        for li in self.co_lin_deuda:
            if li.ld_select:
                #obtener total. si hay interes se hace nota de debito
                total_int = li.ld_interes
                if (total_int != 0.0): 
                    #crear notas de debito que queden en pendientes de pago

                    #talonario
                    fac_id = li.ld_factura.id
                    fac = self.env['asw.comprobante'].search([('id', '=', fac_id)])
                    tal_original = fac.comp_talonario 
                    tal_letra = tal_original.tal_letra
                    tal_pto = tal_original.tal_pto_vta
                    talonario = self.env['asw.talonario'].search([('tal_pto_vta','=',tal_pto),('tal_letra','=', tal_letra),('tal_codigo','=','NDEB')])
                    referencia = 'Nota de débito del comprobante : ' + fac.comp_talonario.tal_codigo + "/" +fac.comp_nro_letras

                    nota_debito = self.generar_comprobante(
                        talonario        = talonario,
                        cliente          = fac.comp_cliente,
                        total            = total_int,
                        referencia       = referencia,
                        comp_estado      = fac.comp_estado,
                        comp_nro_letras  = fac.comp_nro_letras,
                        comp_moneda      = fac.comp_moneda.id,
                        #comp_nota_credito = fac.id,
                    )
                    #crear lineas nd
                    inter_prod = self.env['asw.producto'].search([('prod_descripcion','=','INTERES')])
                    linea_comp = self.env['asw.linea_comprobante'].create({
                        'lcp_producto': inter_prod.id,
                        'lcp_comprobante': nota_debito.id,
                        'lcp_precio': total_int,
                        'lcp_importe': total_int,
                    })
                    #asociar nd a linea deuda tb
                    li.ld_nd = nota_debito.id
        self.co_estado = 'pr'

    
    def pagar_deuda(self):
        #wizard primero para validar cada nota y luego wizard pago 
        lista = []
        for li in self.co_lin_deuda:
            if li.ld_select:
                #lista tiene todas las nd 
                lista.append(li.ld_nd.id)

        datos = {'vnd_cliente': self.co_cliente.id, 
        'vnd_total': self.co_total,
        'vnd_cobro': self.id}
        nvo_w = self.env['vnt.validar_nd'].create(datos)
        nvo_w.vnd_notas = lista

        return {
            'type': 'ir.actions.act_window',
            'res_model': 'vnt.validar_nd',
            'view_mode': 'form',
            'view_type': 'form',
            'res_id': nvo_w.id,
            'target': 'new',
        }

        #         #paga factura original
        #         fac_id = li.ld_factura.id
        #         fac = self.env['asw.comprobante'].search([('id', '=', fac_id)])
        #         fac.comp_estado = 'p'

        #         #obtener total. si hay interes se hace nota de debito
        #         total_int = li.ld_interes
        #         if (total_int != 0.0): 
        #             #crear notas de debito
        #             tal_original = fac.comp_talonario 
        #             tal_letra = tal_original.tal_letra
        #             tal_pto = tal_original.tal_pto_vta
        #             referencia = 'Nota de débito del comprobante : ' + fac.comp_talonario.tal_codigo + "/" +fac.comp_nro_letras

        #             #crear talonario con mismo pto de venta y letra
        #             tipo_comprobante = self.env['asw.tipo_comprobante'].search([('tc_descripcion', '=', 'NOTA DE DEBITO A')])
        #             talonario_nvo = self.env['asw.talonario'].create({
        #                 'tal_pto_vta': tal_pto,
        #                 'tal_letra': tal_letra,
        #                 'tal_codigo': "NDEB"+ tal_original.tal_codigo + str(self.id),
        #                 'tal_descripcion': "NDEB-" + tal_original.tal_descripcion + str(self.id),
        #                 'tal_tipo': tal_original.tal_tipo,
        #                 'tal_menu': tal_original.tal_menu,
        #                 })

        #             talonario_nvo.tal_tpc_id = tipo_comprobante.id 

        #             contra_comprobante = self.generar_comprobante(
        #                 talonario        = talonario_nvo,
        #                 cliente          = fac.comp_cliente,
        #                 total            = total_int,
        #                 referencia       = referencia,
        #                 comp_estado      = fac.comp_estado,
        #                 comp_nro_letras  = fac.comp_nro_letras,
        #                 comp_moneda      = fac.comp_moneda.id,
        #                 comp_nota_credito = fac.id,
        #             )

             

        #             contra_comprobante.comp_fecha_validacion = datetime.today()
                    
        #             #crear lineas nd
        #             linea_comp = self.env['asw.linea_comprobante'].create({
        #                 'lcp_descripcion_producto': referencia,
        #                 'lcp_comprobante': contra_comprobante.id,
        #                 'lcp_importe': total_int
        #             })

        #             # contra_comprobante.comp_linea_facturas = (4,linea_comp.id)
                    
        #             #asociar nd a factura original
        #             fac.write({
        #                 'comp_nota_credito' : contra_comprobante.id            
        #             })
        #             #asociar nd a linea deuda tb
        #             li.ld_nd = contra_comprobante.id

        # self.co_estado = 'p'
                

    def cancelar(self):
        self.co_estado = 'c'
        #y marcar comprobantes como adeudados de nuevo
        #cancelar notas de debito
        for li in self.co_lin_deuda:
            if li.ld_select:
                fac_id = li.ld_factura.id
                fac = self.env['asw.comprobante'].search([('id', '=', fac_id)])
                fac.comp_estado = 'a'
                if li.ld_nd:
                    nd_id = li.ld_nd.id
                    nd = self.env['asw.comprobante'].search([('id', '=', nd_id)])
                    nd.comp_fecha_cancelacion = datetime.today()

    def cobrar_todo(self):
        for lin in self.co_lin_deuda:
            if lin.ld_select:
                lin.ld_cobro = 'todo'
        return (True)

    def cobrar_negociado(self):
        lista =[]
        for lin in self.co_lin_deuda:
            if lin.ld_select:
                lista.append(lin.id)
        #abrir wizard con in_ld self id 
        datos = {'in_interes':0.0,
        'in_intotal': self.co_total_interes,
        'in_deutotal': self.co_total_deuda,
        'in_cant_comp': len(lista),
        'in_tottot': self.co_total}

        nvo_w = self.env['vnt.interes_negociado'].create(datos)
        nvo_w.in_ld2 = lista 
        return {
            'type': 'ir.actions.act_window',
            'res_model': 'vnt.interes_negociado',
            'view_mode': 'form',
            'view_type': 'form',
            'res_id': nvo_w.id,
            'target': 'new',
        }
       
    
    def interes_perdido(self):
        for lin in self.co_lin_deuda:
            if lin.ld_select:
                lin.ld_cobro = 'perdido'
                lin.ld_interes = 0 
        return (True)