IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Odoo (ex-OpenERP) Discussion :

L'appel de la fonction "send_and_print_action" depuis "stock.picking"


Sujet :

Odoo (ex-OpenERP)

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Points : 8
    Points
    8
    Par défaut L'appel de la fonction "send_and_print_action" depuis "stock.picking"
    Bonjour

    Dans une tache demandée : On demande d'ajouter un bouton dans le module : "stock.picking" qui doit ou bien envoyer ( send ) ou imprimer ( print ) le "invoice" ( "account.move" ) concernée . Pour ceci , j'ai ajouté le bouton et créé une fonction qui fait appel à la fonction "send_and_print_action()" qui se trouve dans le model "account.invoice.send". Voici le code que j'ai pu établir :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    def send_and_print_invoice(self):
     
            print("Start Send and Print")
           # vals = {'invoice_ids' : self.sale_id.invoice_ids.ids}
            vals = []
            invoice_ids = self.sale_id.mapped('invoice_ids.id')
            for elt in invoice_ids :
                print(elt)
                vals.append(elt)
            print(self.sale_id.invoice_ids.id)
            try :
                print('try ok')
                self.env['account.invoice.send'].create({'invoice_ids': [(6, 0, vals)]})
               # self.env['account.invoice.send'].update({'group_id_test': [[6, 0, vals]]})
                #self.env['account.invoice.send'].write({'invoice_ids': [[6, 0, vals]]})
            except:
                traceback.print_exc()
            print("here")
            object = self.env['account.invoice.send'].search([])
           # object = self.env['account.invoice.send'].search([('id', '!=', 0)])
            if object :
                print('object existe')
              #for elt in object :
               # print(object.id)
                try :
                   object.send_and_print_action()
                except:
                    traceback.print_exc()
            else :
                print('object does not existe')

    le problème est sur la ligne :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    self.env['account.invoice.send'].create({'invoice_ids': [(6, 0, vals)]})
    C'est pour crée un record de "account.invoice.send" pour l'utiliser dans l'appel de la fonction avec : record.send_and_print_action().
    La fonction que j'ai créé indique ce message d'erreur :
    Traceback (most recent call last):
    File "/opt/odoo13/odoo/odoo-custom-addons/exercice1/models/exercice1_stock_picking.py", line 28, in send_and_print_invoice
    self.env['account.invoice.send'].create({'invoice_ids': [(6, 0, vals)]})
    File "<decorator-gen-3>", line 2, in create
    File "/opt/odoo13/odoo/odoo/api.py", line 335, in _model_create_multi
    return create(self, [arg])
    File "/opt/odoo13/odoo/odoo/models.py", line 3677, in create
    vals = self._add_missing_default_values(vals)
    File "/opt/odoo13/odoo/odoo/models.py", line 1738, in _add_missing_default_values
    defaults = self.default_get(list(missing_defaults))
    File "/opt/odoo13/odoo/addons/account/wizard/account_invoice_send.py", line 31, in default_get
    invoices = self.env['account.move'].browse(res_ids).filtered(lambda move: move.is_invoice(include_receipts=True))
    File "/opt/odoo13/odoo/odoo/models.py", line 5234, in filtered
    return self.browse([rec.id for rec in self if func(rec)])
    File "/opt/odoo13/odoo/odoo/models.py", line 5234, in <listcomp>
    return self.browse([rec.id for rec in self if func(rec)])
    File "/opt/odoo13/odoo/addons/account/wizard/account_invoice_send.py", line 31, in <lambda>
    invoices = self.env['account.move'].browse(res_ids).filtered(lambda move: move.is_invoice(include_receipts=True))
    File "/opt/odoo13/odoo/addons/account/models/account_move.py", line 1689, in is_invoice
    return self.type in self.get_invoice_types(include_receipts)
    File "/opt/odoo13/odoo/odoo/fields.py", line 1009, in __get__
    _("(Record: %s, User: %s)") % (record, env.uid),
    odoo.exceptions.MissingError: ('Record does not exist or has been deleted.\n(Record: account.move(33,), User: 2)', None)
    J'aimerais bien savoir, qu'est ce qui ne va pas dans ma fonction, ce qui cause cet erreur. Merci.

  2. #2
    Membre régulier
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Mars 2019
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 50
    Points : 72
    Points
    72
    Par défaut
    Bonjour,

    Pour imprimer la facture pas besoin de la créer et c'est ce qui est fait ici.

    Il faut juste:
    - trouver le sale.order associé
    - Prendre les factures associées à ce sale.order
    - Lancer l'action voulue sur ce recordset.

    Pour moi pas besoin d'appeler le wizard account.invoice.sent qui est le pop-up de rédaction de texte pour l'envoi de facture.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Bonjour Doscaal ,

    Merci pour votre réponse , oui effectivement , pour les deux premières parties c'est ce que j'ai fait ,J'ai regroupé les ids des factures dans une liste avec cette partie de code :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    vals = []
            obj = self.sale_id.mapped('invoice_ids.id')
            for elt in obj :
                print(elt)- Lancer l'action voulue sur ce recordset.
                vals.append(elt)
    Pour la troisième partie : "- Lancer l'action voulue sur ce recordset" , la fonction que je veux appeler (send_and_print_action() ) se trouve dans le model : "account.invoice.send" , alors je devrais l'appliquer sur un record du même modèle , sinon , de quelle action vous parlez ? car la fonction je construit là se trouve dans le model : "stock.picking" .

  4. #4
    Membre régulier
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Mars 2019
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 50
    Points : 72
    Points
    72
    Par défaut
    La fonction action_invoice_sent du modele account.move qui ouvre l'assistant de rédaction de message.

    Moi j'aurais fait quelque chose comme ca.

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def action_send_invoice(self):
        invoices = self.sale_id.mapped('invoice_ids')
        if invoices:
            return invoices.action_invoice_sent()

    Dans l'idéal faudrait mettre un filtered pour ne retourner que les factures validées et non payées.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Merci bien toujours pour vos reponses , oui vous avez raison ; je deverais utiliser la fonction action_invoice_sent du modele account.move .
    J'ai essayé votre proposition , mais ça indique le meme erreur que j'avais quand j'ai posté ici :
    Something went wrong !

    Record does not exist or has been deleted.
    (Record: account.move(37,), User: 2)
    Je vais penser à créer le record du model mail.compose.message , puis appliquer la fonction : action_send_mail() de account.move .

  6. #6
    Membre régulier
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Mars 2019
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 50
    Points : 72
    Points
    72
    Par défaut
    Un conseil, utilisez pdb pour débogguer. C'est très puissant et cela permet vraiment de comprendre le pourquoi et surtout la provenance des erreurs.

    Si je peux me permettre un autre conseil. Évitez les try/excepts. Priviliégier les contrôles a priori.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2020
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Merci Doscaal , j'utilise en fait les try/excepts , car on les utilise dans les modèles d'odoo dans addons .
    Merci encore pour vos conseils , je continue à réessayer en utilisant un autre logique .

Discussions similaires

  1. [Python 3.X] avec Kivy. Appel d'une fonction d'une classe depuis une autre classe
    Par michel4591 dans le forum GUI
    Réponses: 2
    Dernier message: 31/10/2019, 10h43
  2. Appel d'une fonction par une string depuis un plugin
    Par cahnory dans le forum jQuery
    Réponses: 1
    Dernier message: 04/06/2010, 21h11
  3. Réponses: 3
    Dernier message: 01/06/2009, 21h03
  4. Inverse de la fonction QUOTE() ?
    Par __fabrice dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 13/07/2006, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo