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 :

Module ajout colonne dans vue produit


Sujet :

Odoo (ex-OpenERP)

  1. #1
    nma
    nma est déconnecté
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut Module ajout colonne dans vue produit
    Bonjour @ tous,

    Je suis débutant en prog openerp, python.
    Je cherche à ajouter une colonne prix ttc dans la vue produits, et je souhaiterais votre aide.

    Voila mes 4 fichiers :
    Repertoire : product_ttc

    __init__.py
    __openerp__.py
    Code : 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
    {
        'name' : 'product_ttc',
        'version' : '0',
        'author' : 'Nicolas',
        'category' : 'Sales Management',
        'description' : '',
        'website': '',
        'images' : [],
        'depends' : ['product', 'account'],
        'data': [],
        'js': [],
        'qweb' : [],
        'css':[],
        'demo': [],
        'test': [],
        'installable': True,
        'auto_install': False,
    }
    product_ttc.py
    Code : 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
    from openerp.osv import fields, osv
    
    
    #----------------------------------------------------------
    # Products
    #----------------------------------------------------------
    
    class product_template(osv.osv):
        _inherit = "product.template"
        _columns = {
            'price_ttc': fields.float('price_ttc',digits=(2,1)),
        }
        
    _defaults = { 
        'price_ttc': 0, # Valeur par default si pb
    } 
    
    product_template()
    product_ttc_view.xml
    Code : 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
    <?xml version="1.0" encoding="utf-8"?>
    <openerp>
        <data>
            
            <!-- Adding the fields from product.product to the screen -->
                    <record id="product_normal_form_view" model="ir.ui.view">
                        <field name="name">base.product.defaults.product.form</field>
                        <field name="model">product.product</field>
                        <field name="inherit_id" ref="product.product_normal_form_view"/>
                        <field name="arch" type="xml">
                            <field name='default_code' position='before'>
                                <field name="price_ttc"/>
                            </field>
                        </field>
                    </record>
            
        </data>
    </openerp>
    Pourriez vous me dire si tout vous semble correct.
    Car je pense que je dois attaquer le plus dur ....
    Récupérer le tax_amount, le prix, si la taxe est comprise ou non et calculer si nécessaire le montant ttc voir si taxe comprise le montant ht et éventuellement modifier du coup le nom de la colonne en prix ht.
    Mais pour être honnête je n'ai aucune idée de comment my prendre à partir de la.
    Si vous avez une petite idée ce serait génial !!
    Merci par avance
    Nicolas

  2. #2
    nma
    nma est déconnecté
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    Me revoili !!!

    J'ai essayer d'avancer avec grande peine :o((
    Et modifier quelque peu mon fichier

    product_ttc.py
    Code : 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
    31
    32
    33
    from openerp.osv import fields, osv
    
    
    #----------------------------------------------------------
    # Products
    #----------------------------------------------------------
    
    class product_template(osv.osv):
        _inherit = "product.template"
        _columns = {
        # Code trouver dans product.py addon account afin d'ajouter les champs taxes
        # Mais la je n'ai que le code pas la valeur
            'taxes_id': fields.many2many('account.tax', 'product_taxes_rel',
                    'prod_id', 'tax_id', 'Customer Taxes',
                    domain=[('parent_id','=',False),('type_tax_use','in',['sale','all'])]),
        
            'price_ttc':fields.function(_ttc_calc,type='float'),
        }
        
        _defaults = { 
            'price_ttc': 0, # Valeur par default si pb
        } 
    
        def _ttc_calc(self,cr,uid,ids,field,arg,context=None): 
            res = {} 
            for prod in self.browse(cr,uid,ids,context=context): 
                # La je devrais faire mon calcul conditionner si taxe incluse ou non
                ttc =  0  
                res[price_ttc] = ttc 
                return res 
    
    product_template()
    Esperant être sur la bonne voie !!!!

    Merci de vos commentaires et suggestion, bien que le réveillon s'approchant pas trop bavard sur le forum )

    Nicolas

  3. #3
    nma
    nma est déconnecté
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    J'ai remodifier deux fichier et j'ai reussi à installer ce module, mais la colonne n'apparait pas, j'ai sans aucun doute oublier quelque choses. Cependant dans la liste des champs (mode dev) mon champ price ttc apparait !!

    product_ttc.py
    Code : 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
    31
    32
    33
    34
    from openerp.osv import fields, osv
    
    
    #----------------------------------------------------------
    # Products
    #----------------------------------------------------------
    
    class product_template(osv.osv):
        _inherit = "product.template"
        
        def _ttc_calc(self,cr,uid,ids,field,arg,context=None): 
                res = {} 
                    #for prod in self.browse(cr,uid,ids,context=context): 
                    # La je devrais faire mon calcul conditionner si taxe incluse ou non
                ttc =  self.pool.get('list_price')*1.2  
                res[price_ttc] = ttc 
                return res    
        
        _columns = {
        # Code trouver dans product.py addon account afin d'ajouter les champs taxes
        # Mais la je n'ai que le code pas la valeur
        #    'taxes_id': fields.many2many('account.tax', 'product_taxes_rel',
        #            'prod_id', 'tax_id', 'Customer Taxes',
        #            domain=[('parent_id','=',False),('type_tax_use','in',['sale','all'])]),
        
            'price_ttc':fields.function(_ttc_calc,type='float'),
        }
        
        _defaults = { 
            'price_ttc': 0, # Valeur par default si pb
        } 
    
    
    product_template()
    product_ttct_view.xml
    Code : 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
    <?xml version="1.0" encoding="utf-8"?>
    <openerp>
        <data>
            
            <!-- Adding the fields from product.product to the screen -->
                    <record id="product_normal_form_view" model="ir.ui.view">
                        <field name="name">base.product.defaults.product.form</field>
                        <field name="model">product.product</field>
                        <field name="inherit_id" ref="product.product_normal_form_view"/>
                        <field name="arch" type="xml">
                            <field name='price' position='after'>
                                <field name="price_ttc"/>
                            </field>
                        </field>
                    </record>
            
        </data>
    </openerp>
    Avez vous une idée ?
    Merci Nicolas

  4. #4
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Bonjour,

    Je n'ai pas tout lu, mais ta classe hérite du model product.template, alors que ta vue herite du model product.product.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    _inherit = "product.template"
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <field name="model">product.product</field>

  5. #5
    nma
    nma est déconnecté
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    Bonjour @ tous et bonne année,

    Merci pour votre aide,
    Après beaucoup de recherche et de test voila ou j'en suis .....

    product_ttc.py
    Code : 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
    from openerp.osv import fields, osv
    
    
    #----------------------------------------------------------
    # Products
    #----------------------------------------------------------
    
    class product_product(osv.osv):
        _name = 'product.product'
        _inherit = "product.product" # qui herite elle meme de product.template
        
        def _ttc_calc(self,cr,uid,ids,field,arg,context=None): 
                res = {}
                for c in self.browse(cr,uid,ids,context=context):
                   res[price_ttc] = 'test'
                return res
        
        _columns = {
            'price_ttc': fields.function(_ttc_calc, 'Ttc' ,type='char'),
        }
        
       
    product_product()
    et mon
    product_ttc_view.xml
    Code : 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
    <?xml version="1.0" encoding="utf-8"?>
    <openerp>
        <data>
            
            <!-- Adding the fields from product.product to the screen -->
                    <record id="product_normal_form_view" model="ir.ui.view">
                        <field name="name">base.product.defaults.product.form</field>
                        <field name="model">product.product</field>
                        <field name="inherit_id" ref="product.product_product_tree_view"/>
                        <field name="arch" type="xml">
                            <field name='price' position='after'>
                                <field name="price_ttc"/>
                            </field>
                        </field>
                    </record>
            
        </data>
    </openerp>
    Je peus l'installer sans probleme mais quand j'appel la view tree j'obtient l'erreur suivante ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    File "C:\Program Files (x86)\OpenERP 7.0-20130522-231057\Server\server\openerp\addons\product_ttc\product_ttc.py", line 21, in _ttc_calc
    NameError: global name 'price_ttc' is not defined
    Malgrés quelque recherche je reste bloqué ..
    Si vous aviez une petite idée et une xplication je dois avouez que j'ai un peu de mal à comprendre, mon code est similaire à beaucoup d'autre code y compris celui du memento alors .....
    Nicolas

  6. #6
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Le problème n'est pas dans ta vue mais dans ton code PY.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def _ttc_calc(self,cr,uid,ids,field,arg,context=None): 
        if context is None:
            context = {}
     
        res = {}
     
        for obj in self.browse(cr,uid,ids,context=context):
            res[obj.id]= 'test'
     
        return res

    Comme c'est le champ price_ttc qui appelle cette fonction, cela lui renverra 'test'

    Entre parenthèses, je ne sais pas comment tu va faire pour récupérer le prix ttc d'un produit en sachant qu'il te faudra tenir compte des listes de prix et des diverses taxes.

  7. #7
    nma
    nma est déconnecté
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    Merci beaucoup pour cette aide, Ca marche !!!!!!
    je dois avouer que j'ai un peu de mal avec la logique du code python et j'essaye de comprendre en modifiant des codes que je récupère dans les modules.
    Et petit à petit avec quelques conseils et corrections avisé cela me permet d'avancer.
    Pour répondre à ta question dans le module account, il y a un code qui permet de mettre la tva dans la vue form

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Code trouver dans product.py addon account afin d'ajouter les champs taxes
        # Mais la je n'ai que le code pas la valeur
            'taxes_id': fields.many2many('account.tax', 'product_taxes_rel',
                    'prod_id', 'tax_id', 'Customer Taxes',
                    domain=[('parent_id','=',False),('type_tax_use','in',['sale','all'])]),
    Avec cela je crois qu'il recupere le code tva, je me dis qu'a partir de la je pourrais peut etre recupéré le tax_amout (taux). il va falloir que je planche sur la question car je suis encore loin de comprendre ce code, mais il se sert de la relation entre la table product et tax. Et effectivement cela ne me permettra de calculer le montant ttc que pour les tax rattaché au produits, sans prendre en compte le client, pays, circonstance et toutes les choses qui peuvent faire varier cette taxe. Mais c'est le cas dans la plupart des gestion co. Le montant ttc afficher dans les vues articles ne prend en compte que la tva lié au produit.
    En te remerciant encore
    et si tu as un commentaire pour la suite je suis bien sur preneur !!


    Nicolas

  8. #8
    nma
    nma est déconnecté
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    re,
    voila un premier calcul basé sur le principe tva a 20% et point barre
    Code : 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
    # -*- coding: utf-8 -*-
    ##############################################################################
    #
    #
    ##############################################################################
    
    from openerp.osv import fields, osv
    
    
    #----------------------------------------------------------
    # Products
    #----------------------------------------------------------
    
    class product_product(osv.osv):
        _name = 'product.product'
        _inherit = "product.product" # qui herite elle meme de product.template
        
        def _ttc_calc(self,cr,uid,ids,field,arg,context=None): 
            if context is None:
                context = {}
            res = {}
            for obj in self.browse(cr,uid,ids,context=context):
                res[obj.id] = obj.list_price*1.2
            return res
     
        _columns = {
            'price_ttc': fields.function(_ttc_calc, type='float'),
        }
        
    product_product()
    reste à récupéré le taux de tva !!!

    J'ai aussi un petit problème avec l’entête de colonne unknown
    Je pense que c'est dans la vue mais bon je vais continuer à gratter

  9. #9
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    le champ 'taxes_id': fields.many2many

    Ça veut dire que dans la vue form d'un produit (dans l'onglet comptabilité), tu as un champ dans lequel doivent apparaitre les tva ("les", car si tu as plusieurs compagnies, tu dois mettre la tva de vente/achat pour chaque compagnie dans le même produit.

    Pour info, le truc n'est pas pratique lorsque tu commences à avoir un paquet de compagnies, car tu dois sélectionner les taxes unes par unes. Elles apparaissent alors comme des tags dans le champ.

    Quand tu as 600 produits et une 30taine de sociétés c'est carrément pénible.

    pour parer à ça, j'ai modifié la vue form comme ceci dans un module:

    Code xml : 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
        	<record id="product_normal_form_view" model="ir.ui.view">
                <field name="name">product.normal.form.inherit</field>
                <field name="model">product.product</field>
                <field name="priority">5</field>
                <field name="inherit_id" ref="account.product_normal_form_view"/>
                <field name="arch" type="xml">
                    <xpath expr="//page[@string='Accounting']" position="replace">
                        <page string="Accounting" groups="account.group_account_invoice">
                            <group name="properties">
                            <separator string="Sales Properties" colspan="2"/>
                            <field name="property_account_income" domain="[('type','=','other')]" groups="account.group_account_user"/>
                            <div colspan="2"> 
                                <separator string=" "/>
                                <label for="taxes_id"/>
                                <field name="taxes_id" attrs="{'readonly':[('sale_ok','=',0)]}" />
                            </div>
                            <separator string="Purchase Properties" colspan="2"/>
                            <field name="property_account_expense" domain="[('type','=','other')]" groups="account.group_account_user"/>
                            <div colspan="2"> 
                                <separator string=" "/>
                                <label for="supplier_taxes_id"/>
                                <field name="supplier_taxes_id"/>
                            </div>
                        </group>
                        </page>
                    </xpath>
                </field>
            </record>

    Mais maintenant, j'ai un tableau avec un bouton "ajouter", puis un wizard apparait et tu peux cocher toutes les taxes d'un coup.
    En s'organisant bien avec un filtre taxes à la vente + taxes à l'achat, en 2 clics tu ajoutes tes 30 taxes.

    note : il faut faire la même chose avec product.template si tu l'utilises.

    Ça m'a particulièrement bien aidé hier quand il a fallu que je passe tous les produits à 20%. Ça m'a pris quand même +6heures car il faut les supprimer une par une... pour tous les produits....

  10. #10
    nma
    nma est déconnecté
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    Merci pour ces précisions, mais puis je abuser de ton temps je sais que tu es très occuper !
    Voila j'aimerais savoir si je peu "voir" le contenu d'un objet, comme par exemple le taxes_id (champ et valeur)

    mais aussi voir ce que l'on récupère avec des fonctions comme celle ci :
    account_tax_obj = self.pool.get('account.tax')
    J'aimerais pouvoir afficher le contenu de account_tax_obj

    As tu une idée ?
    En te remerciant
    Nicolas

  11. #11
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    account_tax_obj = self.pool.get('account.tax')
    C'est un peu comme si tu te connectais à la table account.tax

    account_tax_obj est un objet qui contient les valeurs de la table account.tax

    Une fois que tu as récupéré les données dans account_tax_obj, tu dois parcourir l'objet pour récupérer les valeurs selon l'ID envoyé

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    account_tax = account_tax_obj.browse(cr, uid, id, context=context)
    # id = l'ID de l'enregistrement

    Ensuite, tu peux "lire" les valeurs des champs en utilisant la syntaxe à point :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    account_name = account_tax.name
    account_value = account_tax.value
    etc..

    En gros, quand tu veux récupérer quelque chose dans la DB
    1. tu te "connectes" à la table avec pool.get()
    2. tu cherches des enregistrements avec search() - qui ne retourne que les IDs
    3. tu peux donc parcourir les enregistrements avec browse() - en utilisant les IDs renvoyés par search()


    voici un autre exemple (tiré d'un module que j'ai fait) :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    obj_m_data = self.pool.get('ir.model.data')
        m_data_ids = obj_m_data.search(cr, uid, [('name', '=', 'menu_gallery_menu')])
     
        if m_data_ids:
            m_data = obj_m_data.browse(cr, uid, m_data_ids[0])
            parent_menu_id = m_data.res_id

    Ici, on cherche les menus dans la table ir.model.data dont le nom est égal à "menu_gallery_menu"

    Si on en trouve (if m_data_ids: ), on parcoure alors obj_m_data en envoyant le 1er ID (m_datas_ids[0])
    Et on récupère la valeur du champ res_id

    Je te recommande de (re)lire le Memento technique. Notamment le chapitre "Méthodes de l'ORM sur les objets osv.Model "
    Tout est dedans.

    Ce n'est pas très parlant, mais tu t'apercevras qu'il y a tout ce qu'il faut pour bricoler ton OpenER.

  12. #12
    nma
    nma est déconnecté
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    Bonjour @ tous,

    Merci et encore merci Thierry, ton aide est précieuse, j'ai relu le memento et c'est vrais qu'avec tes explications plus l'analyse des codes des modules certaines choses me paraissent un peu plus clair.
    J'ai essayer d'analyser ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'taxes_id': fields.many2many('account.tax', 'product_taxes_rel',
                'prod_id', 'tax_id', 'Customer Taxes',
                domain=[('parent_id','=',False),('type_tax_use','in',['sale','all'])]),
    Ainsi que la table account.tax et la table product_taxes_rel
    J'ai aussi fait des test avec openerp et plusieurs tva c'est bien la m.....
    car le choix de la taxe à appliquer quand il y a plusieurs tva se fait manuellement dans le devis !!

    Donc je vais devoir choisir arbitrairement le premier code tva et limiter ce module pour une instal mono company.

  13. #13
    nma
    nma est déconnecté
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    Bon voila je continue l'aventure,
    J'essaye maintenant bettement d'ajouter à la même vue une secondes colonne dans laquelle je mettrai par exemple le taux de tva !!
    j'ai créer exactement le même champ que le premier qui s'affiche et la j'ai rien du tout nada podeballe .............
    Je dois etre une vrais quiche!!!

    voici mes codes :

    product_ttc.py
    Code : 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
    31
    32
    from openerp.osv import fields, osv
    
    class product_product(osv.osv):
        _name = 'product.product'
        _inherit = "product.product" # qui herite elle meme de product.template
        
        def _ttc_calc(self,cr,uid,ids,field,arg,context=None): 
            if context is None:
                context = {}
                 
            res = {}
            for obj in self.browse(cr,uid,ids,context=context):
                res[obj.id] = obj.lst_price*1.2
            return res
     
        def _ttc_calc2(self,cr,uid,ids,field,arg,context=None): 
                if context is None:
                    context = {}
                     
                res1 = {}
                for obj1 in self.browse(cr,uid,ids,context=context):
                    res1[obj1.id] = obj1.lst_price
                return res1
     
        _columns = {
            'price_ttc': fields.function(_ttc_calc, string='Ttc', type='float'),
            'taux_tax': fields.function(_ttc_calc2, string='Taxes', type='float'),
                     
        }
        
    product_product()
    et mon product_ttc_view.xml
    Code : 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
    <?xml version="1.0" encoding="utf-8"?>
    <openerp>
        <data>
            
            <!-- Adding the fields from product.product to the screen -->
                    <record id="product_normal_form_view" model="ir.ui.view">
                        <field name="name">base.product.defaults.product.form</field>
                        <field name="model">product.product</field>
                        <field name="inherit_id" ref="product.product_product_tree_view"/>
                        <field name="arch" type="xml">
                            <field name='price' position='after'>
                                <field name="taux_tax"/>
                                <field name="price_ttc"/>
                            </field>
                        </field>
                    </record>
            
        </data>
    </openerp>
    J'ai bien sur redemarrer le serveur, vider le cache des navigateur, je ne comprend pas pourquoi la seconde colonne est ignorer !!
    Si vous avez une idée merci de votre aide.
    Nicolas

  14. #14
    nma
    nma est déconnecté
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    Je me repond a moi même pour mon dernier pb et grace à la reponse de thierry sur un autre post. La vue est enregistrer directement dans la base donc j'ai simplement modifier grace a pgadmin la vue dans la table.
    Merci
    je continue et reviens vers vous pour la suite
    Nicolas

  15. #15
    nma
    nma est déconnecté
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    Voila je penses avoir réussi voici mes codes :

    product_ttc.py
    Code : 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
    31
    32
    33
    34
    35
    36
    37
    38
    from openerp.osv import fields, osv
    
    class product_product(osv.osv):
        _name = 'product.product'
        _inherit = "product.product" # qui herite elle meme de product.template
        
        def _ttc_calc(self,cr,uid,ids,field,arg,context=None): 
            if context is None:
                context = {}
    
            res = {}
            for obj in self.browse(cr,uid,ids,context=context):
                val = 0.0
                for c in self.pool.get('account.tax').compute_all(cr, uid, obj.taxes_id, obj.lst_price, 1, obj.id)['taxes']:
                    val += c.get('amount', 0.0)
                    
                res[obj.id] = obj.lst_price + val
            return res
        
        def _amount(self,cr,uid,ids,field,arg,context=None): 
                if context is None:
                    context = {}
                res2 = {}
                for line in self.browse(cr, uid, ids, context=context):
                  val = 0.0
                  for c in self.pool.get('account.tax').compute_all(cr, uid, line.taxes_id, line.lst_price, 1, line.id)['taxes']:
                    val += c.get('amount', 0.0)
                    
                  res2[line.id] = val
                return res2
    
        _columns = {
            'price_ttc': fields.function(_ttc_calc, string='Ttc', type='float'),
            'taux_tax': fields.function(_amount, string='Taxes', type='float'),
                     
        }
        
    product_product()
    product_ttc_view.xml
    Code : 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
    <?xml version="1.0" encoding="utf-8"?>
    <openerp>
        <data>
            
            <!-- Adding the fields from product.product to the screen -->
                    <record id="product_normal_form_view" model="ir.ui.view">
                        <field name="name">base.product.defaults.product.form</field>
                        <field name="model">product.product</field>
                        <field name="inherit_id" ref="product.product_product_tree_view"/>
                        <field name="arch" type="xml">
                            <field name='price' position='after'>
                                <field name="taux_tax"/>
                                <field name="price_ttc"/>
                            </field>
                        </field>
                    </record>
            
        </data>
    </openerp>
    Merci de vos commentaires
    Merci de votre aide.

    PS/ Je n'ai pas encore tester toutes les tva simple et multiple mais je vous tiens au courant

    Nicolas

  16. #16
    nma
    nma est déconnecté
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    Après quelques tests rapides :

    taux tva unique (pas inclus) OK c bon c ce que j'avais besoin
    taux tva multiple (pas inclus) Les taux se cumulent comme dans une commande si on ne supprime pas ceux ou celui de trop.

    Pour toutes les situation ou le taux est inclus dans le prix (case cocher dans tva), cela ne fonctionne pas (calcul est faux), mais ou est l’intérêt de ce module si on coche cette case les prix afficher sont déjà en ttc. Je pourrais éventuellement tester si la case est cocher ou non, mais je dois avouer que je n'ai pas réussi à parcourir la table account.tax avec le taxes_id, je n'obtient que des champ vide ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    taxes_obj = self.pool.get('account.tax')  # Recup table des taxes
    # taxes_id champs many2many ->> liste des id tax par produit
    for tax in taxes_obj.browse(cr, uid, obj.taxes_id[0], context=context)
    	res[obj.id] = tax.amount   OU  res[obj.id] = tax.price_include
    j'ai essayé différentes variantes de ce code mais rien ne fonctionne, il doit y avoir un truc que je ne comprend pas
    Si toutefois vous avez un commentaire
    Nicolas

  17. #17
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Bon, mais on part du principe que le prix de l'article est HT, ok ?

    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 _ttc_calc(self, cr, uid, ids, name, value, args, context=None):
        if context is None:
            context = {}
     
        res = {}
     
        for obj in self.browse(cr,uid,ids,context=context):
     
            if obj.taxes_id:
     
                obj_tax = self.pool.get('account.tax')
     
                # ici on récupère les taxes pour la company de l'utilisateur
                taxes_ids = obj_tax.search(cr, uid, [('id', 'in', obj.taxes_ids), ('company_id', '=', user.company_id.id)])
                if taxes_ids:
     
                    # ici on récupère les valeurs de la 1ere taxe
                    tax = obj_tax.browse(cr, uid, taxes_ids[0])
                    tax_amount = tax.amount 
                    tax_type = tax.type
     
                    # le prix du produit
                    p_price = obj.p_price
     
                    if tax_type == 'percent':
                        res[obj.id] = p_price + (p_price * tax_amount)
                    else:
                        res[obj.id] = p_price + tax_amount
     
        return res

    Je n'ai pas testé.Il faut peut etre le bricoler un peu

  18. #18
    nma
    nma est déconnecté
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    Après avoir tester ce code qui me parait très clair j’obtiens la même erreur que j'avais et que je n'arrive pas à solutionner

    AttributeError: 'NoneType' object has no attribute 'search'
    ligne : taxes_ids = obj_tax.search(cr, uid, [('id', 'in', obj.taxes_ids), ('company_id', '=', user.company_id.id)])

    J'ai essayer avec obj.taxes_ids et obj.taxes_id

    Je n'ai pas réussi a faire un search ou un browse à partir du champ many2many taxes_id, c'est pour cela que je suis partie sur le compute_all

    Edit--
    j'ai aussi changer
    obj_tax = self.pool.get('account_tax') en obj_tax = self.pool.get('account.tax')
    et j'ai virer pour l'instant la condition user qui est inconnu pour l'instant

    j'obtiens maintenant cette erreur pour la même ligne
    NotImplementedError: Iteration is not allowed on browse_record(account.tax, 2)




    Nicolas

  19. #19
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Effectivement, je me suis trompé, c'est bien account.tax (j'ai corrigé)

    Quant à user voici la correction également:

    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
    31
    32
    33
    34
    def _ttc_calc(self, cr, uid, ids, name, value, args, context=None):
        if context is None:
            context = {}
     
        res = {}
     
        for obj in self.browse(cr,uid,ids,context=context):
     
            if obj.taxes_id:
     
                obj_tax = self.pool.get('account.tax')
     
                # permet de récupérer la company_id du user
                obj_user = self.pool.get('res.users')
                user = obj_user.browse(cr, uid, uid)
     
                # ici on récupère les taxes pour la company de l'utilisateur
                taxes_ids = obj_tax.search(cr, uid, [('id', 'in', obj.taxes_ids), ('company_id', '=', user.company_id.id)])
                if taxes_ids:
     
                    # ici on récupère les valeurs de la 1ere taxe
                    tax = obj_tax.browse(cr, uid, taxes_ids[0])
                    tax_amount = tax.amount 
                    tax_type = tax.type
     
                    # le prix du produit
                    p_price = obj.p_price
     
                    if tax_type == 'percent':
                        res[obj.id] = p_price + (p_price * tax_amount)
                    else:
                        res[obj.id] = p_price + tax_amount
     
        return res

  20. #20
    nma
    nma est déconnecté
    Membre régulier
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 225
    Points : 108
    Points
    108
    Par défaut
    Bonjour,
    Apres plusieurs tests et modifications :
    Je reste bloqué sur une erreur,

    Cas 1 :
    taxes_ids = obj_tax.search(cr, uid, [('id', 'in', obj.taxes_ids), ('company_id', '=', user.company_id.id)])
    AttributeError: "Field 'taxes_ids' does not exist in object 'browse_record(product.product, 3)'"

    Cas 2 :
    taxes_ids = obj_tax.search(cr, uid, [('id', 'in', obj.taxes_id), ('company_id', '=', user.company_id.id)])
    NotImplementedError: Iteration is not allowed on browse_record(account.tax, 2) La fameuse erreur

    Cas 3 :
    taxes_ids = obj_tax.search(cr, uid, [('id', 'in', [2,3,4,5,34]), ('company_id', '=', user.company_id.id)])
    PAS d'erreur, cependant le calcul est faux bien sur.

    J'ai l'intuition que le pb vient du champ many2many mais sans pouvoir l'expliquer : Ce code provient du fichier : product.py - addon : account
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'taxes_id': fields.many2many('account.tax', 'product_taxes_rel', 'prod_id', 'tax_id', 'Customer Taxes', domain=[('parent_id','=',False), ('type_tax_use', 'in', ['sale','all'])]),
    Est ce normal que la table de lien soit avec des _ au lieu de .

    Si vous avez une idée je continue mes investigations.

    Nicolas

Discussions similaires

  1. Module ajout colonne category dans vue product.tree
    Par nma dans le forum Odoo (ex-OpenERP)
    Réponses: 4
    Dernier message: 06/01/2014, 01h20
  2. [WD 14] Ajout Colonne dans un tableau !
    Par Grammaton54 dans le forum WinDev
    Réponses: 2
    Dernier message: 12/05/2009, 16h56
  3. ajout colonne dans fichier directement
    Par Strami dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/02/2009, 11h09
  4. Ajout colonnes Dans Table
    Par cjacquel dans le forum Access
    Réponses: 3
    Dernier message: 11/12/2006, 22h29
  5. [VBA] Ajout colonne dans recordset
    Par le_niak dans le forum Access
    Réponses: 25
    Dernier message: 31/07/2006, 12h35

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