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

[10.0] Problema domain filter su One2many rel

Avatar
Francesco

Ciao a tutti,
ho realizzato un semplice modulo che nella vista res.partner riporta tutte le fatture di vendita scadute.

Ho banalmente aggiunto una relazione one2many con account.invoice e "filtrata" tramite domain:


class ResPartner(models.Model):

_inherit = 'res.partner'
overdue_invoices_ids = fields.One2many('account.invoice', 'partner_id', domain = 
[
'&',
('state', '=', 'open'),
'&',
('type', '=', 'out_invoice'),
'&',
('date_due', '<', datetime.today().strftime("%Y-%m-%d"))
]
)


Ho notato che, randomicamente, il campo overdue_invoices_ids mostra valori differenti. 

Es. se da "Contabilità > Fatture" ho 2 fatture scadute, overdue_invoices_ids nella scheda cliente a volte perde 1 record fattura.

Non riesco ad intercettare la problematica perchè è un comportamento del tutto randomico.

Ho solo notato che dopo un riavvio dell'istanza la situazione si "stabilizza" per alcuni giorni.


Grazie per il supporto


Avatar
Abbandona
5 Risposte
0
Avatar
Luigi Di Naro
Migliore risposta

Non ho letto attentamente il codice, quindi una indicazione puntuale sul problema non riesco a dartela.

Pero' ti consiglio un approccio diverso, mettere le fatture scadute sulla form del partner ti costringe a fare quelle query ogni volta che entri nel partner rendendo lentissima la sua apertura all'aumentare delle fatture e sovraccaricando inutilmente il server odoo.

Io metterei uno smart button, usa il codice che gia' c'e' per lo smart di tutte le fatture (o ordini) e modifichi la ricerca ... hai il codice di esempio, non esci scemo ma sopratutto non spacchi odoo.

my 2 cents

Avatar
Abbandona
0
Avatar
Sergio Corato
Migliore risposta

Non usare quel campo così per la stampa sul report, ma filtralo nel report.

Verifica se la soluzione proposta funziona.

Il dominio sul campo funziona ma il python viene eseguito lato server, quindi non è previsto per essere immediato come il codice eseguito lato client (quindi un dominio su dei campi non variabili al volo).

Avatar
Abbandona
0
Avatar
Francesco
Migliore risposta

Ciao Sergio,
ho provato a riportare il domain sulla vista ma non filtra correttamente le fatture.

Nel model ora ho questa definizione:

overdue_invoices_ids = fields.One2many('account.invoice', 'partner_id')


Mentre la vista è questa:

    <record id="view_partner_inherit_overdue_form_id" model="ir.ui.view">
        <field name="name">res.partner.overdue.form.inherit</field>
        <field name="inherit_id" ref="base.view_partner_form" />
        <field name="model">res.partner</field>
        <field name="arch" type="xml">
            <page name="accounting" position='after'>
                <page string="Payment Follow-up" groups="account.group_account_invoice" name="overdue_tab">         
                    <separator string="Overdue Invoices" />                                                                               
                    <field name="overdue_invoices_ids"
                            domain="[('state', '=', 'open'), ('type', '=', 'out_invoice'), ('date_due', '&lt;', context_today().strftime('%Y-%m-%d'))]">

                        <tree editable="bottom" create="false"
                            delete="false"
                            colors="red:(not date_due or date_due&lt;=current_date) and residual&gt;0">
                            <field name="state" invisible="1" />
                            <field name="type" invisible="1" />
                            <field name="date" />
                            <field name="number" />
                            <field name="name" />
                            <field name="date_due" />
                            <field name="amount_total" />
                            <field name="residual" />
                        </tree>
                    </field>
                    <separator string="Followup History" />
                    <field name="followup_history">
                        <tree create="false" edit="false" default_order='id desc'>
                            <field name="followup_line"/>
                            <field name="elaboration_date"/>
                            <field name="invoices"/>
                        </tree>
                    </field> 
                </page>
            </page>
        </field>
    </record>
   

 Grazie!

Avatar
Abbandona
0
Avatar
Sergio Corato
Migliore risposta

Ciao Francesco,

una soluzione direi potrebbe essere spostare il dominio nella vista xml, che è aggiornata al volo, invece di metterlo nel campo.

Avatar
Abbandona
0
Avatar
Francesco
Migliore risposta

Ciao Sergio,
grazie per il suggerimento. Quel campo lo utilizzo anche in altri contesti, es. la stampa di un report:

for invoice in self.overdue_invoices_ids:
    ...

In quel caso mi suggerisci di sostituirlo con una search preventiva? Es.

overdue_invoices_ids = self.env['account.invoice'].search([
    ('state', '=', 'open'),
    ('type', '=', 'out_invoice'),
    ('date_due', '<', datetime.today().strftime("%Y-%m-%d"))
])
for invoice in overdue_invoices_ids: 
   ...


A questo punto quando ha senso utilizzare il filtro sul dominio direttamente su un campo? 


Grazie mille

Avatar
Abbandona