cobros.py 6.76 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', 'Adeudado'), ('p', 'Pagado'),('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_total
            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):
        self.co_estado = 'b'

    def procesar(self):
        if self.co_total == 0:
            raise UserError('No hay valores seleccionados a cobrar')
        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 pagar_deuda(self):
        for li in self.co_lin_deuda:
            if li.ld_select:
                #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,
                    )

                    print ("se genero nuevo comprobante? de id " + str(contra_comprobante.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
                    })

                    print ("se genero nueva linea de comprobante? de id " + str(linea_comp.id))

                    # 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()