In Odoo ci sono varie app che necessitano di una sequenza numerica, o alfanumerica. Penso ad esempio al modulo di fatturazione che ha svariati registri i quali richiedono una sequenza ANNO / Numero.
Ma se volessimo crearne uno totalmente da zero per una nostra app?
Visto che l’ho fatto giusto in questi giorni, mi sono trovato a leggere indicazioni piuttosto confusionarie che mi hanno fatto perdere tempo, per cui riporto il mio modo di comporre una “sequence”.
Parto dall’assunto che abbiamo già una nostra Class con il model di Odoo. Necessitiamo quindi un Field Char, visto che oltre al numero ci mettiamo anche una sigla. Mettiamo che si chiama “registro”.
registro = fields.Char( 'Etichetta', default=lambda self: _('Nuovo'), copy=False, readonly=True, tracking=True)
Come si vede il valore di default è una funzione Lambda, cioè una funziona anonima che ci servirà per impostare a “Nuovo” in modo temporaneo il valore di base. In aggiunta una serie di parametri di Char, come la sola lettura visto che non vogliamo modificarlo per non “spezzare” il registro, e un tracking necessario alle modifiche.
A questo punto dobbiamo costruire una funzione che vada ad elaborare il valore di default ed aumentarlo tramite la funzione “ir.sequence” di Odoo, che tiene traccia dei vari registri, nonché della numerazione. Cioè se il registro è arrivato al numero 5, ci verrà fornito il numero 6 e così via.
@api.model
def create(self, vals):
""" CREATE A SEQUENCE FOR REGISTRO """
if vals.get('registro', _('Nuovo')) == _('Nuovo'):
vals['registro'] = self.env['ir.sequence'].next_by_code('mymodel.mymodel') or _('Nuovo')
return super(mymodel, self).create(vals)
Cambiate “mymodel” con il nome del vostro model. A questo punto dobbiamo creare nelle view un nuovo file XML che chiameremo “registro_sequence.xml” e il cui interno avremo qualcosa di simile.
<!-- sequence data for tree -->
<data>
<record model="ir.sequence" id="seq_mymodel">
<field name="name">mymodel Sequence</field>
<field name="code">mymodel.mymodel</field>
<field name="prefix">REG-%(y)s-</field>
<field name="padding">4</field>
<field name="number_next">1</field>
</record>
</data>
Abbiate cura di modificare “mymodel” con il nome (_name) del vostro model, questo per la ID, opzionale per la “name” obbligatorio per il “code“. Interessante notare come la parola “registro” non compaia mai dentro questo file. Pongo invece l’attenzione sul “prefix” perché questa costruirà visivamente la nostra sequenza. Nel caso sopra otterremo “REG-24-0001“. Il “padding” infatti, andrà ad inserire il numero di valori numerici da comporre, cioè tre zeri e il numero se inferiore a dieci. Mentre sul Prefix dovrebbe essere abbastanza autoesplicativo. “%(y)s” andrà a scrivere le due cifre dell’anno corrente.
L’idea infatti è quella di ripartire da uno con la numerazione al primo di gennaio, o comunque al primo momento utile nell’anno successivo.
Per attivare la sequenza, o ad esempio farla partire da un altro numero diverso da uno, si può andare in Impostazioni, Impostazioni tecniche, quindi sequenze. Cercare la nostra e modificarla. Tuttavia, esiste un modo più elegante, quella di usare un file XML con lo scopo di pilotare l’installazione. Pertanto, andremo a creare una cartella “data” dentro la root della nostra applicazione, e dentro andremo a creare il file “data_sequence.xml”
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record model="ir.sequence" id="registro">
<field name="name">registro</field>
<field name="code">registro</field>
<field name="prefix">REG-%(y)s-</field>
<field name="padding">4</field>
<field name="number_increment">1</field>
<field name="use_data_range">True</field>
<field name="implementation">no_gap</field>
<field name="active">True</field>
</record>
</odoo>
Qui dentro sono inseriti i parametri da utilizzare in fase di installazione dell’app. Come si può notare il record model è “ir.sequence” relativo alla id “registro”, ovvero il file andrà a dare le corrette indicazioni da prendere senza dover passare manualmente per le impostazioni di sistema.
Per metterlo in funzione rimane da inserire il file “views/registro_sequence.xml” e “data/data_sequence.xml” all’interno della sezione data del file “__manifest__.py” e aggiungere il campo registro ( <field name=”registro”/> ) dove serve, cioè ad esempio dentro una “tree” o un “kanban”.
Nel momento in cui andremo a compilare la form, questa avrà come numerazione “Nuovo” ma nel momento in cui salviamo verrà applicato REG-24-000x
Va detto che la procedura qui sopra è soggetta a variabilità, ovvero non è l’unico modo per arrivare al risultato, in linea di massima questo dovrebbe essere il più semplice o quanto meno facile da essere compreso.