Forum

Benvenuto!

Questo è il forum ufficiale dell'Associazione Odoo Italia. Dopo esserti registrato potrai partecipare ponendo domande o rispondendo a quelle esistenti. Non scordarti di compilare il tuo profilo e consultare le linee guida prima di iniziare a scrivere.

0

[12] Impostazione Rate - field con compute e inverse

Avatar
Davide Ercole

Salve a tutti.Vorrei sottoporvi questo problema che al momento non riesco a risolvere.In pratica ho modificato il modello account.invoice ed aggiunto 4 rate per registrare un pagamento. Questi 4 fields di tipo Monetary vengono calcolati tramite una funzione richiamata nel parametro compute. Dopo ho inserito anche il parametro store=True e il parametro inverse per settarle qualora volessimo modificare l'importo delle rate.Vi mostro il codice per una maggiore chiarezza:

def round_up(n, decimals=0):
    multiplier = 10 ** decimals
    return math.ceil(n * multiplier) / multiplier
def round_down(n, decimals=0):
    multiplier = 10 ** decimals
    return math.floor(n * multiplier) / multiplier
class AccountInvoice(models.Model):
    _inherit='account.invoice'
    
    x_howmanyrate = fields.Integer(string="Numero di Rate da pagare", default=1, help="Se il pagamento è una tantum, allora lasciare il valore 1")
    x_rata01 = fields.Monetary(string="Prima Rata",compute='x_calcolorate',help="L'importo della prima rata sarà automaticamente calcolata in base all'ammontare totale da pagare", inverse='x_set_rata',store=True)
    x_rata01_check=fields.Boolean(string="check prima rata",default=False)
    
    x_rata02 = fields.Monetary(string="Seconda Rata", compute='x_calcolorate', help="L'importo della seconda rata sarà automaticamente calcolata in base all'ammontare totale da pagare", inverse='x_set_rata',store=True)
    x_rata02_check = fields.Boolean(string="check seconda rata", default=False)
    
    x_rata03 = fields.Monetary(string="Terza Rata", compute='x_calcolorate', help="L'importo della terza rata sarà automaticamente calcolata in base all'ammontare totale da pagare", inverse='x_set_rata',store=True)
    x_rata03_check = fields.Boolean(string="check terza rata", default=False)
    
    x_rata04 = fields.Monetary(string="Quarta Rata", compute='x_calcolorate',help="L'importo della quarta rata sarà automaticamente calcolata in base all'ammontare totale da pagare", store=True,inverse='x_set_rata')
    x_rata04_check = fields.Boolean(string="check quarta rata", default=False)
    
    @api.depends('x_howmanyrate', 'amount_total','partner_id','x_fissarata')
    def x_calcolorate(self):
        print("--COMPUTING LE RATE--")
        for record in self:
         
            totale = record.amount_total
            quanterate = record.x_howmanyrate
            rata = (totale / quanterate)
            record.x_fissarata=True
            
            if record.x_rata01_check == False:
                record.x_rata01 = round_up(rata,2)
            if record.x_rata02_check == False:
                record.x_rata02 = round_down(rata,2)
            if record.x_rata03_check == False:
                record.x_rata03 = round_down(rata,2)
            if record.x_rata04_check == False:
                record.x_rata04 = round_down(rata,2)
    
    def x_set_rata(self):
        print("ciao sono set rata")
        for record in self:
            print(record.x_rata01,record.x_rata02,record.x_rata03,record.x_rata04,record.x_fissarata)
            if record.x_rata01 != 0 and record.x_fissarata == True: continue
            if record.x_rata02 != 0 and record.x_fissarata == True: continue
            if record.x_rata03 != 0 and record.x_fissarata == True: continue
            if record.x_rata04 != 0 and record.x_fissarata == True: continue


Noto le seguenti cose:
-Quando salvo la fattura in stato di draft, automaticamente setta le rate seguendo la funzione x_calcolarate, nonostante io le abbia modificate a mano.
-quando provo a validare la fattura e passare in stato di open, noto sul display del server che viene sì attivata la funzione x_set_rata, ma poi Odoo richiama di nuovo la funzione x_calcolarate.
Sinceramente ho usato la stessa logica per impostare le date e quando le modificavo a mano, non le ricalcolava ma lasciava l'ultimo valore che avevo inserito a mano. Non so proprio come fare

Il mio obiettivo è quello di calcolare automaticamente le rate come la divisione in parti uguali dell'ammontare totale, ma poi l'utente deve essere libero di impostarle come vuole, purché rispetti la logica secondo cui la somma delle rate deve essere sempre uguale all'ammontare totale. 

Buonaserata

Avatar
Abbandona
1 risposta
0
Avatar
Sergio Corato
Migliore risposta

Ciao Davide,

magari parti da una cosa del genere https://github.com/sergiocorato/e-account/tree/12.0/account_invoice_dueamount

Avatar
Abbandona
0
Avatar
Davide Ercole
Migliore risposta

Ciao, puoi spiegarmi meglio cosa fa questo modulo. Ho letto il codice su github e provato ad installare ma non riesco a capire cosa faccia in proposito.


Grazie mille comunque

Avatar
Abbandona