Sto creando un modulo che lavora in maniera simile ad un ordine di vendita (documento testata dettaglio).
Prima della validazione del documento mi devo assicurare che l'importo dell'ordine non superi il budget disponibile e lo faccio con il decorator @api.constrains.
Nella create ho poi aggiunto la chiamata per generare il numero dell'ordine. Se tutto va a buon fine, non c'è nessun problema, se invece la funzione "collegata" ad @api.constrains solleva l'eccezione ValidationError, il contatore stacca (erroneamente) il numero di sequenza succesivo ma il documento non viene giustamente creato. Il documento che verrà creato dopo però non avrà il numero di sequenza corretto ma salterà di tante volte quante sono state le creazioni fallite a causa dell'eccezione.
Faccio un esempio:
1.Creo un nuovo documento di ordine: Sequence NR: ORD0001
2.Creo un nuovo documento di ordine ma viene sollevata un eccezione dal metodo legato ad @api.constrains
3.Creo un nuovo documento di ordine ma viene sollevata un eccezione dal metodo legato ad @api.constrains
4.Creo un nuovo documento di ordine: Sequence NR: ORD0004
Quando invece il Sequence number dell'ordine al passo 4 avrebbe dovuto essere ORD0002
@api.model
def create(self, vals):
# Sequence number generation
pdb.set_trace()
vals['name'] = self.env['ir.sequence'].next_by_code('job.orders')
res = super(PrizeOrder, self).create(vals)
return res
Il seguente metodo scatta alla validazione (quando si salva il documento) solo se viene modificata una delle righe di 'ord_lines' (one2many).
sarebbe stato più corretto mettere il campo 'amount_total' (che è l'importo totale dell'ordine) come parametro di @api.constrains, ma a quanto pare non accetta campi computed (e amount_total lo è)
@api.one
@api.constrains('ord_lines')
def _check_amount(self):
if self.amount_total > self.points:
raise exceptions.ValidationError("Not enough points! Remove some products.")