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

class vnt_confirmar_cancelacion(models.TransientModel):
    _name = 'vnt.confirmar_cancelacion'
    _description = 'Confirmar Cancelación'
    _inherit = ['asw.generador_comprobante', 'asw.action.manager']

    cc_notas = fields.Many2many(
        string=u"Nota Débito",
        comodel_name='asw.comprobante',
        domain = [('comp_talonario.tal_codigo','=','NDEB')]
    )

    cc_facturas = fields.Many2many(
        string=u"Facturas Originales",
        comodel_name='asw.comprobante',
    )

    cc_cobro = fields.Many2one(
        string='Cobro',
        comodel_name='vnt.cobros',
    )

    def cancelar(self):
        self.chequear_cancelacion_notas()
        self.cancelar_facturas()
        self.cancelar_recibo()
        self.crear_notacred()
        self.cc_cobro.cancelar_cobro() 
    
    def cancelar_facturas(self):
        for fac in self.cc_facturas:
            if fac.comp_talonario.tal_codigo not in ['NDEB']:
                fac.comp_estado = 'a'

    def chequear_cancelacion_notas(self):
        for nota in self.cc_notas:
            if nota.comp_fecha_cancelacion == False:
                raise UserError("Todas las notas deben ser canceladas para continuar con la cancelación") 
    
    def cancelar_recibo(self):
        comprobante = self.cc_cobro.co_recibos.filtered(lambda t: t.comp_talonario.tal_menu == 'rec')
        comprobante.comp_fecha_cancelacion = datetime.today()

    def crear_notacred(self):

        lista =[]
        comprobantes = self.cc_cobro.co_recibos.filtered(lambda t: t.comp_talonario.tal_codigo == 'NDEB')

        for comprobante in comprobantes:
            referencia = 'Reintegro del comprobante : ' + comprobante.comp_talonario.tal_codigo + "/" +comprobante.comp_nro_letras
            talonario = self.env['asw.talonario'].search([('tal_pto_vta','=',comprobante.comp_talonario.tal_pto_vta),('tal_letra','=', comprobante.comp_talonario.tal_letra),('tal_codigo','=','NCRED')])
                        
            if talonario:
                contra_comprobante = self.generar_comprobante(
                    talonario        = talonario,
                    cliente          = comprobante.comp_cliente,
                    total            = comprobante.comp_total,
                    referencia       = referencia,
                    comp_estado      = comprobante.comp_estado,
                    comp_nro_letras  = comprobante.comp_nro_letras,
                    comp_subtotal    = comprobante.comp_subtotal,
                    comp_moneda      = comprobante.comp_moneda.id,
                    comp_nota_credito = comprobante.id
                )

                contra_comprobante.write({
                                'referencia_orig_ptv': comprobante.comp_talonario.tal_pto_vta,
                                'referencia_orig_numero': comprobante.comp_nro,
                                'referencia_orig_letra': comprobante.comp_talonario.tal_letra,
                                'referencia_orig_fact': comprobante.id,
                            })

                contra_comprobante.comp_fecha = datetime.today()
                
                #linea de NCred
                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': contra_comprobante.id,
                    'lcp_precio': comprobante.comp_total,
                    'lcp_importe': comprobante.comp_total,
                })

                contra_comprobante.validar()

                #se agrega al recibo original
                comprobante.write({
                    'comp_nota_credito' : contra_comprobante.id            
                })
                #La agrego a lista de faturas en cobro
                lista.append(contra_comprobante.id)
                self.cc_cobro.co_notascred = lista   
            else:
                raise UserError('No existe talonario para la Nota de Crédito correspondiente. Créelo o diríjase a soporte para que lo haga, y vuelva a este menú')