Questo sito utilizza cookie per le proprie funzionalità e per inviarti pubblicità e servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina o cliccando qualunque suo elemento acconsenti all’uso dei cookie.

Accedendo al link http://www.odoo-italia.org/index.php/home/cookie-policy puoi leggere in dettaglio le modalità di trattamento dei cookie da parte dell'Associazione Odoo Italia.

Benvenuto, Ospite
Nome utente: Password: Ricordami
Ricordati di inserire la versioni di Odoo per cui poni la domanda

ARGOMENTO: Qweb: mostrare i prodotti di un abbonamento

Qweb: mostrare i prodotti di un abbonamento 1 Anno 10 Mesi fa #27565

  • ndrini
  • Avatar di ndrini
  • Offline
  • Gold Boarder
  • Messaggi: 291
  • Ringraziamenti ricevuti 22
  • Karma: 0
Sono in vendita, contratti.
Un contratto (abbonamento) può avere un importo fisso ed uno sulla base delle ore di lavoro.

L'importo fisso è legato ad un ordine di vendita (sale.order), mentre quello sulle ore di lavoro ad un hr.analytics.timesheet.

Io vorrei stampare queste informazioni in report.


So creare un report personalizzato ( www.odoo.yenthevg.com/creating-custom-reports-odoo-8/ )
ma non so come dire a qweb:
"prendi i sales.order in cui i conto analitico sia lo stesso del contratto che stai stampando".

Dovrebbe essere una questione di impostare il domain.
Credo ...
:)

Andrea
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Qweb: mostrare i prodotti di un abbonamento 1 Anno 10 Mesi fa #27567

  • gigidn
  • Avatar di gigidn
  • Offline
  • Platinum Boarder
  • Messaggi: 1925
  • Ringraziamenti ricevuti 446
  • Karma: 22
Un report lo fai su un "modello" (oggetto) ... questo è il comportamento di default del motore. Definisci il report su quell'oggetto lui prende gli active_id e te li rende disponibili per la stampa. Se l'informazione è raggiungibile da questi oggetti ... bene usi la catena per stamparla se non lo è le cose si complicano.

La soluzione pulita in tutti i casi diversi da quello di cui sopra è sovrascrivere il metodo render_html (nella v8 ... su 9 e 10 non mi è ancora capitato e potrebbe avere un nome diverso) li fai tutte le query che vuoi, popoli gli oggetti per il report che a questo punto saranno disponibili per usarli come meglio credi.

Puoi anche crearti tuoi dict da passare se è il caso ... ma comunque devi mettere mano al codice, lo standard lavora un oggetto un report.
@KTec
www.ktec.it
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Ringraziano per il messaggio: ndrini

Qweb: mostrare i prodotti di un abbonamento 1 Anno 10 Mesi fa #27581

  • ndrini
  • Avatar di ndrini
  • Offline
  • Gold Boarder
  • Messaggi: 291
  • Ringraziamenti ricevuti 22
  • Karma: 0
gigidn ha scritto:
Puoi anche crearti tuoi dict da passare se è il caso ... ma comunque devi mettere mano al codice, lo standard lavora un oggetto un report.

Grandissimo gigidn.

Si parla di casi simili in vari tutoriales
www.odoo.com/documentation/8.0/reference/reports.html
www.odooninja.com/call-python-function-qweb-report/

Per quello che ho capito, nel dizionario docargs, oltre ai classici campi ('doc_ids': self._ids, 'doc_model': report.model, 'docs': self), carico pure gli altri campi o funzioni da utilizzare nel qweb (e poi a cascata nel report).

Effettivamente io pensavo al dizionario docs come unico, ma forse ne posso mettere più di uno.

def render_html(self, data=None):
    report = self.env['report']._get_report_from_name('sale.report_saleorder')
    docargs = {
        'doc_ids': self._ids,
        'doc_model': report.model,
        'docs': self.env['sale.order'].browse(self._ids),
        'split_text': split_text
        }
Se, all'interno di docsargs, definissi anche
'ciccio': self.env.browse(self._ids),
forse potrei utilizzare tutti i clienti, nel report, e non solo quello specificato nel contratto.

Ora, una domanda che io trovo difficile.


Dal contratto si accede al preventivo di vendita per mezzo si una azione. Se, in modo sviluppatore, vado sopra al link dell'azione, mi appare il contesto utilizzato per l'azione:
    {
    'default_partner_id':[partner_id], 
    'search_default_project_id':[active_id],
    'default_project_id':[active_id],
    'default_pricelist_id': pricelist_id
    }

Io voglio salvarmi nella variabile related_id_pedido_de_compra, l'id del preventivo di vendita relazionato con il contratto attivo.

Va bene una ricerca come questa?
related_id_pedido_de_compra = self.env['sale.order'].sudo().search([
    ('partner_id', '=', self.partner_id), 
    ('project_id', '=', self.id),
    ])

Non so come tradurre nella ricerca questi due:
'search_default_project_id':[active_id],
'default_pricelist_id': pricelist_id

:(
Ultima modifica: 1 Anno 10 Mesi fa da ndrini.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Qweb: mostrare i prodotti di un abbonamento 1 Anno 10 Mesi fa #27601

  • ndrini
  • Avatar di ndrini
  • Offline
  • Gold Boarder
  • Messaggi: 291
  • Ringraziamenti ricevuti 22
  • Karma: 0
eh eh eh
ho trovato un search che può fare al caso mio.

E' interessante perché fra sale.order e contratto non c'è un collegamento diretto, ma una query di mezzo.
def _fix_price_to_invoice_calc(self, cr, uid, ids, name, arg, context=None):
    sale_obj = self.pool.get('sale.order')
    res = {}
    for account in self.browse(cr, uid, ids, context=context):
        res[account.id] = 0.0
        sale_ids = sale_obj.search(cr, uid, [('project_id','=', account.id), ('state', '=', 'manual')], context=context)
        for sale in sale_obj.browse(cr, uid, sale_ids, context=context):
                res[account.id] += sale.amount_untaxed
                for invoice in sale.invoice_ids:
                    if invoice.state != 'cancel':
                        res[account.id] -= invoice.amount_untaxed
        return res

Mi aiutate a decifrarla?
Io capisco che:
sale_obj = self.pool.get('sale.order')
#prende tutti gli oggetti (il pool è praticamente il database) tipo sale.order

res = {}
# preparo una variabile, tipo dizionario, per il risultato 
# (e non "svuoto il dizionario delle resource (res, informalmente, per odoo)")

for account in self.browse(cr, uid, ids, context=context):
# per tutti i contratti? (account è già i contratti?) dove si definisce il context?
        res[account.id] = 0.0     
        # imposto la chiave account.id al valore 0.0 
        
        sale_ids = sale_obj.search(cr, uid, [('project_id','=', account.id), ('state', '=', 'manual')], context=context)
        # raccolgo gli id delle vendite legate a 
        #      questo contratto ('project_id','=', account.id)
        #      che non sia ancora stato fatturato, ma che sia stato confermato

        for sale in sale_obj.browse(cr, uid, sale_ids, context=context):
        # il medoto browse()  prende una lista di id, in questo caso gli id degli ordini di vendita raccolti sopra.
        # cr, uid sono cursor e user id
        # restituisce un recordset = una lista di record 

                res[account.id] += sale.amount_untaxed
                for invoice in sale.invoice_ids:
                    if invoice.state != 'cancel':
                        res[account.id] -= invoice.amount_untaxed
        return res
        # restituisce un dizionario, non un valore?!?
Ultima modifica: 1 Anno 10 Mesi fa da ndrini.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Qweb: mostrare i prodotti di un abbonamento 1 Anno 10 Mesi fa #27603

  • gigidn
  • Avatar di gigidn
  • Offline
  • Platinum Boarder
  • Messaggi: 1925
  • Ringraziamenti ricevuti 446
  • Karma: 22
Da quello che ho intuito usi la 8 ... ma tale campo è valido anche per 9 e 10 ... il collegamento tra ordine e conto analitico / contratto è il campo project_id ed è una relazione 1 ad 1 a meno di non configurare conti analitici multipli sulle vendite (opzione rimossa dopo la 8 credo).

Sulle fatture invece la relazione non è sulla singola fattura ma sulla riga, fattura generata a partire da ordini multipli.

Per quando riguarda la funzione _fix_price_to_invoice_calc ... con la premesse che son abbastanza cotto ... sembra che:

Dato un / una serie di conti analitici sommi tutti gli ordini riferiti a quel conto

Dopo di che scorpori l'ammontare fatturato (anche in bozza)

In pratica dovrebbe essere il totale degli ordini per quel progetto/conto analitico ordinato ma non ancora fatturato.

Ritorna un dizionario perché la funzione si può' applicare ad un singolo progetto ma anche a diversi progetti / conti analitici (selezione multipla).

La chiave del dizionario è l'id del progetto/conto mentre il suo valore è il totale non ancora fatturato espresso nella formula di cui sopra.

Magari domani rileggo e scopro di aver detto baggianate ... ma dopo aver fatto avanti ed indietro da Roma in giornata (e non abito a fiumicino :D) i miei neuroni si rifiutano di essere più' precisi :D :D :D
@KTec
www.ktec.it
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Ringraziano per il messaggio: ndrini

Qweb: mostrare i prodotti di un abbonamento 1 Anno 10 Mesi fa #27647

  • ndrini
  • Avatar di ndrini
  • Offline
  • Gold Boarder
  • Messaggi: 291
  • Ringraziamenti ricevuti 22
  • Karma: 0
Grazie,
quando si entra nel merito è sempre interessante discutere.

Per non sovrascrivere il render_html alla fine ho creato un campo in più:
un one2many che inverter il collegamento many2one della vendita.

Più complesso il collegamento (che per ora non sono riuscito a fare) con il hr.worksheet.
Là non c'è un collegamento diretto al progetto, ma si passa per l'utente, mi pare.

Andrea
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Tempo creazione pagina: 0.132 secondi

Odoo Italia Associazione - C.F: 94200470485 - Sede: Viale dei Cadorna, 83 - Firenze - Italy

Protected by R Antispam