cobro_discriminado.py 5.69 KB
# -*- coding: utf-8 -*-
###############################################################################
#    License, author and contributors information in:                         #
#    __manifest__.py file at the root folder of this module.                  #
###############################################################################

from odoo import models, fields, api, _
from odoo.exceptions import UserError, ValidationError
import datetime

class hgt_cobro_multiple(models.TransientModel):
    _name = 'hgt.cobro_multiple'
    _description = 'Cobro multiple avanzado'
    _inherit = ['asw.action.manager']

    # Informacion pago
    pcw_cliente = fields.Many2one(
        comodel_name='asw.cliente', 
        string='Cliente',
        readonly=True,
        compute='_compute_cliente',
    )

    nota = fields.Text(string='nota',readonly=True)
    
    pcw_referencia = fields.Char(
        string=u'Referencia',
    )    

    pcw_efectivo = fields.Monetary(
        string='Efectivo', 
        currency_field='cli_moneda_empresa'
    )

    pcw_retencion_recibida = fields.Monetary(
        string='Retención', 
        currency_field='cli_moneda_empresa'
    )
    
    pcw_cli_razon_social = fields.Char(
        string='Razon Social',
        related='pcw_cliente.cli_razon_social'
    )

    # Currency field
    cli_moneda_empresa = fields.Many2one(
        string=u'Moneda del saldo',
        comodel_name='res.currency',
        ondelete='set null', 
        related='pcw_cliente.create_uid.company_id.currency_id',        
    )

    # Formas de pago
    pcw_che_recibidos = fields.Many2many(
        comodel_name='asw.cheque', 
        relation='pago_cliente_chq_recibido', 
        column1='asw_cheque_id', 
        column2='asw_cliente_id', 
        string='Cheques Recibidos'
    )

    pcw_chq_emitidos = fields.Many2many(
        comodel_name='asw.cheque', 
        relation='pago_cliente_chq_emitido', 
        column1='asw_cheque_id', 
        column2='asw_cliente_id', 
        string='Cheques Emitidos'
    )

    pcw_transferencias_recibidas = fields.Many2many(
        comodel_name='asw.valores', 
        relation='pago_cliente_transferencia_recibida', 
        column1='pago_cliente_id', 
        column2='asw_valores_id', 
        string='Transferencias Recibidas'
    )

    pcw_transferencias_emitidas = fields.Many2many(
        comodel_name='asw.valores', 
        relation='pago_cliente_transferencia_emitida', 
        column1='pago_cliente_id', 
        column2='asw_valores_id', 
        string='Transferencias Emitidas'
    )

    pcw_tarjetas = fields.Many2many(
        comodel_name='asw.valores', 
        relation='pago_cliente_tarjeta', 
        column1='pago_cliente_id', 
        column2='asw_valores_id', 
        string='Tarjetas'
    )

    pcw_retenciones = fields.Many2many(
        comodel_name='asw.valores', 
        relation='pago_cliente_retencion', 
        column1='pago_cliente_id', 
        column2='asw_valores_id', 
        string='Retenciones'
    )
    # Total de pago
    pcw_total = fields.Monetary(
        string='Total Recibido',
        compute='_calcular_total',
        currency_field='cli_moneda_empresa'
    )

    pcw_recibo = fields.Many2one(
        string='Recibo',
        comodel_name='asw.comprobante'
    )

    @api.depends('pcw_total')
    def _compute_cliente(self):
        if not len(self.pcw_cliente) == 0:
            return(None)
        context = self.env.context
        active_ids = context.get('active_ids')
        facturas = self.env['asw.comprobante'].search([('id', 'in', active_ids)])
        idc = []
        Texto = "Facturas que se abonaran:"
        Total = 0
        for factura in facturas:
            if not factura.comp_cliente.id in idc:
                idc.append(factura.comp_cliente.id)
            if not factura.comp_adeudado > 0:
                raise UserError(f"Factura {factura.display_name} ya esta pagada o valor nulo")
            if factura.comp_estado in ["b","c"]:
                raise UserError(f"Factura {factura.display_name} en estado invalido para cobrar")
            #if (factura.comp_talonario.tal_tipo == "e"):
            #    raise UserError(f"El comprobante {factura.display_name} no es de venta")
            Total = Total + factura.comp_adeudado
            Texto = f"{Texto}\n{factura.display_name}    {factura.comp_adeudado}"
        if not len(idc) == 1:
            raise UserError("Solo se puede cobrar a un cliente a la vez")
        Texto = f"{Texto}\nTotal {Total}"
        self.pcw_cliente = idc[0]
        self.nota = Texto




    @api.multi
    def pago_facturas_masivo(self):
        context = self.env.context
        active_ids = context.get('active_ids')
        
        facturas = self.env['asw.comprobante'].search([('id', 'in', active_ids)])

        for factura in facturas:
            if factura.comp_adeudado > 0:
                factura.pago_rapido(self.forma_pago)

    @api.depends('pcw_efectivo', 'pcw_che_recibidos', 'pcw_transferencias_recibidas', 'pcw_tarjetas', 'pcw_chq_emitidos', 'pcw_transferencias_emitidas', 'pcw_retencion_recibida','pcw_retenciones')
    def _calcular_total(self):
        total = 0
        for record in self.pcw_che_recibidos:
            total = total + record.che_monto
        for record in self.pcw_transferencias_recibidas:
            total = total + record.val_monto
        for record in self.pcw_chq_emitidos:
            total = total + record.che_monto
        for record in self.pcw_transferencias_emitidas:
            total = total + record.val_monto
        for record in self.pcw_tarjetas:
            total = total + record.val_monto
        for record in self.pcw_retenciones:
            total = total + record.val_monto
        self.pcw_total = total + self.pcw_efectivo + self.pcw_retencion_recibida