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