linea_deuda.py 6.17 KB
# -*- coding: utf-8 -*-
from odoo import models, fields, api, exceptions
from odoo.exceptions import UserError, ValidationError
from datetime import datetime 
from calendar import monthrange

class vnt_linea_deuda(models.Model):
    _name = 'vnt.linea_deuda'

    ld_factura = fields.Many2one(
        string='Factura',
        comodel_name='asw.comprobante',
        ondelete='restrict',
    ) 

    ld_fecha_vto = fields.Date(
        string=u'Fecha de Vencimiento',
        related='ld_factura.fecha_vencimiento_fact'
    )

    ld_estado = fields.Selection(
        string=u'Estado Factura',
        related='ld_factura.comp_estado',
    )

    ld_total = fields.Float(
        string=u'Total Factura',
        compute="_compute_ld_total",
    )

    ld_comp_adeudado = fields.Float(
        string=u'Total Adeudado Factura',
        compute="_compute_ld_total_adeudado",
    )


    ld_select = fields.Boolean(
        string="Seleccionar",
    )

    ld_nd = fields.Many2one(
        string='Nota Débito',
        comodel_name='asw.comprobante',
        ondelete='restrict',
    ) 

    ld_cobros = fields.Many2one(
        string='Cobros',
        comodel_name='vnt.cobros',
        ondelete='set null',
    )

    ld_co_estado = fields.Selection(
        related='ld_cobros.co_estado',
    )

    ld_interes = fields.Float(
        string=u'Total Interés',
        compute='_compute_ld_interes',
        store= True,
    )

    ld_fecha_calculo = fields.Date(
        string=u'Fecha de cálculo',
        default = datetime.today(),
    )

    ld_cobro = fields.Selection(
        string=u'Cobro',
        selection=[('todo', 'Cobro Total'), ('negociado', 'Cobro Negociado'), ('perdido', 'Interés perdido')], 
        readonly= True, 
    )

    #calculo del total de la factura a traves de comp_total 
    @api.depends('ld_factura')
    def _compute_ld_total(self):
        for record in self:
            record.ld_total = record.ld_factura.comp_total 
    
    @api.depends('ld_factura')
    def _compute_ld_total_adeudado(self):
        for record in self:
            record.ld_comp_adeudado = record.ld_factura.comp_adeudado

    @api.depends('ld_factura')
    def _compute_ld_interes(self):
        for record in self: 
            dias_mes = record.number_of_days_in_month(datetime.now().year, datetime.now().month)
            dias_anio = record.number_of_days_in_year(datetime.now().year)
            fmt = '%Y-%m-%d'
            d1= datetime.strptime(record.ld_fecha_vto, fmt)
            d2= datetime.strptime(record.ld_fecha_calculo, fmt)

            if d2>d1:
                dias_pasados= (d2 - d1).days
                cliente_id = record.ld_factura.comp_cliente.id
                config_int = self.env['vnt.interes'].search([('int_cliente', '=', cliente_id)], limit=1)
                if not config_int:
                    raise UserError("No hay configuración de interés para el cliente seleccionado")
                tasa_an = (config_int.int_tasa_anual * record.ld_total)/100 
                tasa_diaria = tasa_an/dias_anio 

                if config_int.int_ritmo == 'mensual':
                    #en d2 tengo la fecha de hoy y en d1 la del vto, resto los meses y agrego el q paso desde el vto
                    meses_pasados = d2.month - d1.month + 12*(d2.year - d1.year)
                    meses_pasados = meses_pasados + 1
                    anio = d1.year
                    #calculo del intres
                    calc_int = 0
                    for i in range (meses_pasados):
                        mes= d1.month
                        mes = mes + i
                        if (mes % 12 == 0):
                            mes = 12
                        else:
                            mes = mes % 12 
                        calc_int = calc_int + (tasa_diaria * record.number_of_days_in_month(anio, mes))
                        if (mes == 12):
                            anio = anio + 1
                    int_calculado = calc_int
                
                if config_int.int_ritmo == 'quincenal':
                    tasa_quincenal = tasa_diaria * 15
                    cociente = dias_pasados // 15 
                    cociente = cociente + 1
                    int_calculado = cociente * tasa_quincenal

                if config_int.int_ritmo == 'semanal':
                    tasa_semanal = tasa_diaria * 7
                    cociente = dias_pasados // 7 
                    cociente = cociente + 1
                    int_calculado = cociente * tasa_semanal

                if config_int.int_ritmo == 'diaria':
                    int_calculado = dias_pasados * tasa_diaria
            else:
                int_calculado = 0
            record.ld_interes = int_calculado

    #fx que devuelve nro de dias del mes
    def number_of_days_in_month(self, anio, mes):
        return monthrange(anio, mes)[1]

    #fx que devuelve nro de dias del anio
    def number_of_days_in_year(self, anio):
        suma = 0
        meses = range(1,13)
        for m in meses:
            suma += self.number_of_days_in_month(anio, m) 
        return suma 

    # def cobrar_todo(self):
    #     self.ld_cobro = 'todo'

    # def cobrar_negociado(self):
    #     self.ld_cobro = 'negociado'
    #     #abrir wizard con in_ld self id 
    #     datos = {'in_ld': self.id}
    #     nvo_w = self.env['vnt.interes_negociado'].create(datos)
    #     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):
    #     self.ld_cobro = 'perdido'
    #     self.ld_interes = 0 



    #no pude hacer funcionar la cosa como monetary, tuve q hacer el campo total como float 
    # ld_total = fields.Monetary(
    #     string=u'Total Factura',
    #     related='ld_factura.comp_total',
    # )

    # ld_moneda = fields.Many2one(
    #     string=u'Moneda',
    #     related='ld_factura.comp_moneda',
    # )

    # ld_moneda = fields.Many2one(
    #     string=u'Moneda',
    #     comodel_name='res.currency',
    #     ondelete='set null',
    #     default=lambda self: self.env.user.company_id.currency_id.id,
    # )