From dc405051d8ac1c496f6bdac8188e70723e0fd4f5 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Mon, 11 Jul 2016 17:36:27 +0200 Subject: [PATCH 01/54] [ADD] new module 'product_margin_classification'; --- product_margin_classification/README.rst | 65 ++++++++++ product_margin_classification/__init__.py | 2 + product_margin_classification/__openerp__.py | 30 +++++ .../demo/product_margin_classification.xml | 24 ++++ .../demo/product_template.xml | 26 ++++ .../demo/res_groups.yml | 17 +++ .../models/__init__.py | 3 + .../models/product_margin_classification.py | 115 ++++++++++++++++++ .../models/product_template.py | 80 ++++++++++++ .../security/ir.model.access.csv | 3 + .../security/ir_rule.xml | 17 +++ .../static/description/icon.png | Bin 0 -> 4200 bytes .../margin_classification_form.png | Bin 0 -> 43456 bytes .../margin_classification_tree.png | Bin 0 -> 16024 bytes .../description/product_template_form.png | Bin 0 -> 45074 bytes .../views/action.xml | 17 +++ product_margin_classification/views/menu.xml | 14 +++ .../view_product_margin_classification.xml | 80 ++++++++++++ .../views/view_product_template.xml | 49 ++++++++ 19 files changed, 542 insertions(+) create mode 100644 product_margin_classification/README.rst create mode 100644 product_margin_classification/__init__.py create mode 100644 product_margin_classification/__openerp__.py create mode 100644 product_margin_classification/demo/product_margin_classification.xml create mode 100644 product_margin_classification/demo/product_template.xml create mode 100644 product_margin_classification/demo/res_groups.yml create mode 100644 product_margin_classification/models/__init__.py create mode 100644 product_margin_classification/models/product_margin_classification.py create mode 100644 product_margin_classification/models/product_template.py create mode 100644 product_margin_classification/security/ir.model.access.csv create mode 100644 product_margin_classification/security/ir_rule.xml create mode 100644 product_margin_classification/static/description/icon.png create mode 100644 product_margin_classification/static/description/margin_classification_form.png create mode 100644 product_margin_classification/static/description/margin_classification_tree.png create mode 100644 product_margin_classification/static/description/product_template_form.png create mode 100644 product_margin_classification/views/action.xml create mode 100644 product_margin_classification/views/menu.xml create mode 100644 product_margin_classification/views/view_product_margin_classification.xml create mode 100644 product_margin_classification/views/view_product_template.xml diff --git a/product_margin_classification/README.rst b/product_margin_classification/README.rst new file mode 100644 index 00000000..9777a809 --- /dev/null +++ b/product_margin_classification/README.rst @@ -0,0 +1,65 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + + +============================= +Product Margin Classification +============================= + +This module is designed to extend Sale Price computation in Odoo. + +This module add a new model 'Margin Classifications' linked to Product Templates. + +A margin classification has a margin field (and fields to manage rounding method, like Pricelist Item model). + +If product has a margin classification defined, an extra field +'Theoritical Price' is displayed, based on the Margin and the Cost Price. + +If the theoritical price is not the same as the sale price, a button is +available to change sale price. + +.. image:: /product_margin_classification/static/description/product_template_form.png + +On the Margin classification Form, user can change computation fields. +(Margin, Rounding method, ...) +Three buttons are available to apply theoritical prices to all products, or +only for products that have a too big or too little real margin. + +.. image:: /product_margin_classification/static/description/margin_classification_form.png + +User can so see easily products with incorrect margins and fix them massively : + +.. image:: /product_margin_classification/static/description/margin_classification_tree.png + +Note +==== + +You could be interested by native Pricelist functionnalities, setting sale +prices based on Cost prices. The main problem of this design is that sale price +change automaticaly when cost price changes, that is not desired in some user +cases. For exemple, if you have a shop, you want to changes sale prices when +customers is not in the shop, and after having changed labels in the shop. + + +Installation +============ + +Normal installation. + +Configuration +============= + +Once Installed : + +* Go to : 'Sale' / 'Products' / 'Margin Classifications' +* Create new classifications +* Set classification to your products + +Credits +======= + +Contributors +------------ + +* Sylvain LE GAL diff --git a/product_margin_classification/__init__.py b/product_margin_classification/__init__.py new file mode 100644 index 00000000..a0fdc10f --- /dev/null +++ b/product_margin_classification/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import models diff --git a/product_margin_classification/__openerp__.py b/product_margin_classification/__openerp__.py new file mode 100644 index 00000000..ac2774bc --- /dev/null +++ b/product_margin_classification/__openerp__.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2016-Today GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'Product Margin Classification', + 'version': '8.0.1.0.0', + 'category': 'Account', + 'author': 'GRAP', + 'website': 'http://www.grap.coop', + 'license': 'AGPL-3', + 'depends': [ + 'account', + ], + 'data': [ + 'security/ir_rule.xml', + 'security/ir.model.access.csv', + 'views/action.xml', + 'views/menu.xml', + 'views/view_product_template.xml', + 'views/view_product_margin_classification.xml', + ], + 'demo': [ + 'demo/res_groups.yml', + 'demo/product_margin_classification.xml', + 'demo/product_template.xml', + ], + 'installable': True, +} diff --git a/product_margin_classification/demo/product_margin_classification.xml b/product_margin_classification/demo/product_margin_classification.xml new file mode 100644 index 00000000..8901ec96 --- /dev/null +++ b/product_margin_classification/demo/product_margin_classification.xml @@ -0,0 +1,24 @@ + + + + + + + Normal Margin + 30 + 0.05 + + + + + Big Margin (with 95 cents) + 50 + 1 + -0.05 + + + diff --git a/product_margin_classification/demo/product_template.xml b/product_margin_classification/demo/product_template.xml new file mode 100644 index 00000000..a744b7f7 --- /dev/null +++ b/product_margin_classification/demo/product_template.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/product_margin_classification/demo/res_groups.yml b/product_margin_classification/demo/res_groups.yml new file mode 100644 index 00000000..8921c432 --- /dev/null +++ b/product_margin_classification/demo/res_groups.yml @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2016-Today: GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + + +- !record {model: res.groups, id: base.group_no_one}: + users: + - base.user_root + +- !record {model: res.groups, id: base.group_multi_company}: + users: + - base.user_root + +- !record {model: res.groups, id: base.group_sale_manager}: + users: + - base.user_root diff --git a/product_margin_classification/models/__init__.py b/product_margin_classification/models/__init__.py new file mode 100644 index 00000000..87381969 --- /dev/null +++ b/product_margin_classification/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from . import product_margin_classification +from . import product_template diff --git a/product_margin_classification/models/product_margin_classification.py b/product_margin_classification/models/product_margin_classification.py new file mode 100644 index 00000000..f65bb9df --- /dev/null +++ b/product_margin_classification/models/product_margin_classification.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2016-Today GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import api, models, fields, exceptions, _ +import openerp.addons.decimal_precision as dp + + +class ProductMarginClassification(models.Model): + _name = 'product.margin.classification' + + # Default Section + def _default_company_id(self): + return self.env['res.company'].browse(self.env.user._get_company()) + + # Column Section + name = fields.Char(string='Name', required=True) + + margin = fields.Float(string='Margin', required=True) + + company_id = fields.Many2one( + comodel_name='res.company', string='Company', + default=_default_company_id) + + template_ids = fields.One2many( + string='Products', comodel_name='product.template', + inverse_name='margin_classification_id', readonly=True) + + template_qty = fields.Integer( + string='Products Quantity', compute='_compute_template_qty', + store=True) + + template_different_price_qty = fields.Integer( + string='Products With Different Price', multi='differente_price', + store=True, compute='_compute_template_different_price_qty') + + template_cheap_qty = fields.Integer( + string='Products Cheaper', multi='differente_price', + store=True, compute='_compute_template_different_price_qty') + + template_expensive_qty = fields.Integer( + string='Products Too Expensive', multi='differente_price', + store=True, compute='_compute_template_different_price_qty') + + price_round = fields.Float( + string='Price Rounding', + digits_compute=dp.get_precision('Product Price'), + help="Sets the price so that it is a multiple of this value.\n" + "Rounding is applied after the margin and before the surcharge.\n" + "To have prices that end in 9.99, set rounding 10, surcharge -0.01") + + price_surcharge = fields.Float( + string='Price Surcharge', + digits_compute=dp.get_precision('Product Price'), + help="Specify the fixed amount to add or substract(if negative) to" + " the amount calculated with the discount.") + + # Default Section + @api.model + def _default_price_round(self): + decimal_obj = self.env['decimal.precision'] + return 10 ** (- decimal_obj.precision_get('Product Price')) + + # Compute Section + @api.multi + @api.depends('template_ids.theoritical_difference') + def _compute_template_different_price_qty(self): + for classification in self: + classification.template_cheap_qty =\ + classification.template_ids.mapped( + 'margin_state').count('cheap') + classification.template_expensive_qty =\ + classification.template_ids.mapped( + 'margin_state').count('expensive') + classification.template_different_price_qty =\ + classification.template_expensive_qty +\ + classification.template_cheap_qty + + @api.multi + @api.depends('template_ids.margin_classification_id') + def _compute_template_qty(self): + for classification in self: + classification.template_qty = len(classification.template_ids) + + # Constraint Section + @api.multi + @api.constrains('price_round') + def _check_price_round(self): + for classification in self: + if classification.price_round == 0: + raise exceptions.Warning( + _("Price Rounding can not be null.")) + + # Custom Section + @api.multi + def _apply_theoritical_price(self, state_list): + template_obj = self.env['product.template'] + for classification in self: + templates = template_obj.search([ + ('margin_classification_id', '=', classification.id), + ('margin_state', 'in', state_list)]) + templates.use_theoritical_price() + + @api.multi + def apply_theoritical_price(self): + self._apply_theoritical_price(['cheap', 'expensive']) + + @api.multi + def apply_theoritical_price_cheap(self): + self._apply_theoritical_price(['cheap']) + + @api.multi + def apply_theoritical_price_expensive(self): + self._apply_theoritical_price(['expensive']) diff --git a/product_margin_classification/models/product_template.py b/product_margin_classification/models/product_template.py new file mode 100644 index 00000000..c5fb6a81 --- /dev/null +++ b/product_margin_classification/models/product_template.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2016-Today GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import api, models, fields, exceptions, tools, _ +import openerp.addons.decimal_precision as dp + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + MARGIN_STATE_SELECTION = [ + ('ok', 'Correct Margin'), + ('cheap', 'Cheaper'), + ('expensive', 'Too Expensive'), + ] + + # Columns Section + margin_classification_id = fields.Many2one( + comodel_name='product.margin.classification', + string='Margin Classification') + + theoritical_price = fields.Float( + string='Theoritical Price', store=True, + digits=dp.get_precision('Product Price'), + compute='_compute_theoritical_multi', multi='theoritical_multi') + + theoritical_difference = fields.Float( + string='Theoritical Difference', store=True, + digits=dp.get_precision('Product Price'), + compute='_compute_theoritical_multi', multi='theoritical_multi') + + margin_state = fields.Selection( + string='Theoritical Price State', store=True, + selection=MARGIN_STATE_SELECTION, + compute='_compute_theoritical_multi', multi='theoritical_multi') + + # Compute Section + @api.multi + @api.depends( + 'standard_price', 'list_price', + 'margin_classification_id.margin', + 'margin_classification_id.price_round', + 'margin_classification_id.price_surcharge') + def _compute_theoritical_multi(self): + for template in self: + classification = template.margin_classification_id + if classification: + multi = 1 + (classification.margin / 100) + for tax in template.taxes_id: + if tax.amount_type != 'percent' or not tax.price_include: + raise exceptions.UserError(_( + "Unimplemented Feature\n" + "The Tax %s is not correctly set for computing" + " prices with coefficients for the product %s") % ( + tax.name, template.name)) + multi *= 1 + (tax.amount / 100) + template.theoritical_price = tools.float_round( + template.standard_price * multi, + precision_rounding=classification.price_round) +\ + classification.price_surcharge + else: + template.theoritical_price = template.list_price + difference = (template.list_price - template.theoritical_price) + if max(difference, -difference) < 10 ** -9: + difference = 0 + template.theoritical_difference = difference + if difference < 0: + template.margin_state = 'cheap' + elif difference > 0: + template.margin_state = 'expensive' + else: + template.margin_state = 'ok' + + # Custom Section + @api.multi + def use_theoritical_price(self): + for template in self: + template.list_price = template.theoritical_price diff --git a/product_margin_classification/security/ir.model.access.csv b/product_margin_classification/security/ir.model.access.csv new file mode 100644 index 00000000..bafc2eab --- /dev/null +++ b/product_margin_classification/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +product_margin_classification_user,product_margin_classification user,model_product_margin_classification,base.group_user,1,0,0,0 +product_margin_classification_manager,product_margin_classification manager,model_product_margin_classification,base.group_sale_manager,1,1,1,1 diff --git a/product_margin_classification/security/ir_rule.xml b/product_margin_classification/security/ir_rule.xml new file mode 100644 index 00000000..2a64fea3 --- /dev/null +++ b/product_margin_classification/security/ir_rule.xml @@ -0,0 +1,17 @@ + + + + + + + Product Margin Classification Rule + + + ['|', ('company_id', '=', user.company_id.id), ('company_id','=',False)] + + + diff --git a/product_margin_classification/static/description/icon.png b/product_margin_classification/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f05ec41b3358a9127823a2fc811c8799a5c94d24 GIT binary patch literal 4200 zcmbW5c{o&WAI1-ckS($=X^~JUvSbe-YcZC}7GoLvI(CCfQmKT(BxE1^`WuAGzKo?I z#7r`F*~iZN^#1d{fB(*P&YYP!*SY37-{*cl_x+tX6C)jFMm|Oef|&JmweEs5`tLzc z2VTFb+INE!%{(&qtlX%~U^g~Hu z`sjbLud*g4C*Ml!{I;~@uIgg@XuszLzkI$cA60*QyAC_)j$_+%-lf5ulPOZRk_@X& zh`~>KOZ}NN#vhc$G{U~u`OmWp3JNly9ok=#aRG}woSfRCqN0@fq1dLQJqexXJQ}vP zwl@?N%XJcjE=x!hrCd6}D&%d*g7^h{kgcgCB`!~V+RR@q}|=!2URYo zLO16$jE#+NC@J}onxn7<1$S!N6VA+rt~9nkeM*n3tLt}>UGEglaJ0A2toSEnOMJY> zqx+&^syF_F3Jg6p^^gt*la`fzOD2=kRYK)7H8ovj`9?D}PaLgxOTC#+ULrPSK=f#j zv8qfA1~W#d9vT{2R_4LkW_#0gVp>e_ED*Q`$KTygH^(pIx+%-!3=l0Xt?YXP zIS**HmD~0Lbg(&OTzFYZDgi3<{&f>R{5gC-r2Wa`$9mM3zF^=X8onr0UVMB!+-m#J z#Qf~64pdcH>3~3pP}%jSUN6)D)!Y43zvA2ajMIIj1S4J_xXee@+}mr2!T0sOjG<$m z+FAPzw~B~R-CiEo$sW*!WYc;N=CTuZHt=eGU!O3$k5!3L%|+M^19H9tSUKE%Ypa0jtxUF^zdQSv~KM9J1vbG~!ubp(n7s`Z>e5=?At zY+xTnxy`Yb_DRZ6ng9IVqP+_uBIOkocO(7TAbIy6tGc3S4EafRcJ@71CZ=zDTZ;o& zE1BNbR$7R(y!@iXx*iGjmsl$yLZ>@Ur7H)&iDeO_hM0Jyp$S~T(B|RvGLMpy(ukk% z)vKot_qRtN;cM6K-mgY-GBPsumpkZ$9UpE(=(;)u|35#iFe?YU8(=O@K#!h0p@t-F zKV$nw^Y5IWFiLv-=#kz0V2<>AgR!l}5%?~l$YO=>)A6-H=H;M;f;`gfY#tRlFHaOA zC8!;l?8n5!5cYr|z1OC+s|C5ZoB|}zoH+xj!{PA8#k%_X`yN2$ZhCrpW7TdW-t&VZ z5Q@*rd8EV|X-!0J%oxI*qFi{ni=mSD zn$&W2Ef7Bj5*V#^v#1t4ecHeN91Bab9E5)Mj1fLuU@BVeDVIjr8?AI+ndyq;D}wb` zDJ?&AM&3Ex#e(JAg2x-5WMy^s@wxhWcZUBt&(-MS`?YP8 zjiFZ~kHVnlBngW$pWkgw$C{bfV879MA1okNV&`8Yts z3`N^?A?F~J&`F52vQj#{)jpj43{G8#!xaW}uc1pzOYccZNSH3#+uJLk{s`Q@eH(&; zgM)Pq473alnVou55gXB_xdv3;qNA4+OC-UiOXA`;wY6z0Dl0w4f`WpeG9&c;T2Cr8 zywq`5!DS$eR@RV4Pe3iAp=D8x(eedVk5lDvQ)Hwp@;kjsD8-DNj7lI^s;a063JD1< zD5k%9_0eOpfwwVq`_}Ka7r&O4o&ybCwk(4HepV@zTR}kzkg%8-gQutG+)$ozOrN%v zmPfb$6fQ=8pXu%Sr>?H8p*mnCRCu!T#q25Ut#CXn#tL$N2g>xqFc2AmzPUq^iTi zhc0qy^CXfw3WciiB7Qg%v6H!XticBR-@X$Ido5z)tCoMs8u@GY(NBM@PpC znDlgTyJ9G1Df00Os|a`u5eR@@<+R4n#!&gg!$V#!t~O%Ce(?umsfN{?jTwpi+bg9@ zGkq9+d3kx&?Von-szTV>gn${!QpU& zfbJzFB?2lTRTY0{1JrnEaF8C#GtO{wcgH3f^tQA_IaR)=P$*1HOw)ZBCBm9!EK5$O z<5WZN#sXp1v%KG`)>Dv!oqdi>*3KU2$j`rI^iDboKt~vICw{h`KXZj(-q+XX@9k}8 zX~~lyq|(*2KHHTfA)pj^`RkW2F0y>QY;4WI_ltbK0A0+_%(P8UJDQuD`)~ zBIEPHy1v}Bad5EW`Sa&Jgi=yd3zz6vg|J;7uIJpss||~5K0rMD{M|s2*Hlz6x3XWS z=9ZhQBW0*=>+2WuT^AFJi|3Y_d39EEK_y0QheQLH3)}IIpo}{A;PKAx?w4QOI*(6R z)P&}Si_?%l;y6Tofg?O<2)YVpibqhexMboVKWFNXwYBn8AG5Ne|9UUKS3_o`boAM? zXM4K4e?RAysdMV(o5TggH+vLEmADE>+o1`VP1Hl6gv=#C?)PbF-K9-O_l!*fmwvo% zUM`rcKy<$YUjm~mbhvx>?z{KzJLiY;Dsi|}=G~!ETeSd##o=N_w4CIhW)8FDa3coOmpvjNjs$(E@Pmck-gm}F= z!{;pIvD zBsn3+dpl0_gNgOgudlK2-EprbLsB1PY72&|1?7i3vO~b~7`_Kz3ENsAEHoZtv6lg~ z^S7b2>u$N#NWy{?@#OdFu!x8V9;HC6_(*kBvtT$0$cfR~Pa$~S5k^aUR$iVPkZW~o z3qHcD8m0h|fY%0*lPuUcIUgS!guOGk_^#Ipk>^Hp#n!%5Uy~1ZANK`UUS`HYOGkH3 zT$~XCc6Cccombv7eSN|lbEW*dote4$Bq1YUak!x3PWG)97g-QKvb0Ywm$wViK&QF6 zY08GRazA|%mXOe=f%FYOMHm*rcGlX@P(ffB@+b#+tK_XbDd7dYjmkODAEBd0ZAJkL z8v_DnJ9UZ*x+Eo~V{Xp%kdgVj;VzGXNw3ybl~wK)=1&mSWkuA4c3 zv^V^OzyzeHr+>$hF{7{4k|_ZkRwMEY?5frrqo4FRK*A~vtjdY2x(!*o?C!5LE!zGx zc?;+Vv{1e0uWyY*t*}6U&7GZt<7z0y-O1V6Z@S}kSMJA;A3YJ(Z{MEw0M^yf(P6@A zSsz%OWSxEMMHSHU^4vgne`}^v;F7wY9z&E8>KS<=JDV7VbHqy4_&-iA|Irv)n{>GL zyS+SQ3;9ZGwhv?P<;4o|s6{CI`ugsGo{_TJz|8KsyoW3;EjubIu04s3tpqyj z>F6L$wZ>4TT^=$dMTjzW}EM1x0SkP zyeeCzyFxfIn)W1?GWuU+i`M`F3S4uf2OjZ#MF8Y(ajre4>|vX=2^6tlW7tS5;+rgA%!ol)&X8<++-d zz0S9`wGBF68*rD~*qzOoeZtJI;MBvD+Uq2Fzoutlta=>Q934$v6wbVBYH69TI)(U0 zK|#SXT-t3IYXuZvU_k`XE}XZU5So03Q9@PNHbrbwD7gbJj$oXMh_2H`t|P}uAfH~n za^;1FhK4K;)8^``oq++9+R=`~WSx(uwKM2q40Lrrf-DQVsrkjlZkxuC0({rc7lno5 zdwYBAP|9U1U;NRrX*poa1(5A|IXMH2sZ#`%0?R;O3f9{K@n*NJEG>V!TIA8M10BQv j&p`kF{Ue<>$5bqm7B^1gC|TgI0!UBWNUP+gUG#qd7qa{w literal 0 HcmV?d00001 diff --git a/product_margin_classification/static/description/margin_classification_form.png b/product_margin_classification/static/description/margin_classification_form.png new file mode 100644 index 0000000000000000000000000000000000000000..f87d8a0f8c1eedc0c0d89c7eef4bef4875defaa0 GIT binary patch literal 43456 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 literal 0 HcmV?d00001 diff --git a/product_margin_classification/static/description/margin_classification_tree.png b/product_margin_classification/static/description/margin_classification_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..4bcae68c2d79682d900301abb0bf14fc0286cdbb GIT binary patch literal 16024 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 MqOu~DLi+yyAKg082LJ#7 literal 0 HcmV?d00001 diff --git a/product_margin_classification/static/description/product_template_form.png b/product_margin_classification/static/description/product_template_form.png new file mode 100644 index 0000000000000000000000000000000000000000..39e70dcd1826d860faf1b5b1cd278c0577841ede GIT binary patch literal 45074 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 literal 0 HcmV?d00001 diff --git a/product_margin_classification/views/action.xml b/product_margin_classification/views/action.xml new file mode 100644 index 00000000..9848f540 --- /dev/null +++ b/product_margin_classification/views/action.xml @@ -0,0 +1,17 @@ + + + + + + Margin Classifications + ir.actions.act_window + product.margin.classification + form + tree,form + + + diff --git a/product_margin_classification/views/menu.xml b/product_margin_classification/views/menu.xml new file mode 100644 index 00000000..c8a05673 --- /dev/null +++ b/product_margin_classification/views/menu.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/product_margin_classification/views/view_product_margin_classification.xml b/product_margin_classification/views/view_product_margin_classification.xml new file mode 100644 index 00000000..5eb55383 --- /dev/null +++ b/product_margin_classification/views/view_product_margin_classification.xml @@ -0,0 +1,80 @@ + + + + + + + product.margin.classification + + + + + + + + + + + + + + + product.margin.classification + +
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
-
- + - + - - - - - - - - - - - - - - - - -
- - + + + + + + + + +
- - - - - - - - - + @@ -83,4 +116,17 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+ + Margin Classifications + ir.actions.act_window + product.margin.classification + form + tree,form + + + + diff --git a/product_margin_classification/views/view_product_template.xml b/product_margin_classification/views/view_product_template.xml index 84af8e12..b9ba85ab 100644 --- a/product_margin_classification/views/view_product_template.xml +++ b/product_margin_classification/views/view_product_template.xml @@ -10,18 +10,18 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). product.template - - - - - - - - + +
+ + +
+
+ + diff --git a/product_margin_classification/views/view_product_template.xml b/product_margin_classification/views/view_product_template.xml index b9ba85ab..7bff581e 100644 --- a/product_margin_classification/views/view_product_template.xml +++ b/product_margin_classification/views/view_product_template.xml @@ -7,50 +7,15 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - - product.template - - - - - - - - - - - -
-
- + - @@ -124,9 +185,11 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). tree,form
- + sequence="5" + />
diff --git a/product_margin_classification/views/view_product_product.xml b/product_margin_classification/views/view_product_product.xml index 4fb30f11..cfcec31f 100644 --- a/product_margin_classification/views/view_product_product.xml +++ b/product_margin_classification/views/view_product_product.xml @@ -1,42 +1,62 @@ - + - product.product - - - - - + + + + + - - -
- +
diff --git a/product_margin_classification/views/view_product_template.xml b/product_margin_classification/views/view_product_template.xml index 6331089e..ead9b46b 100644 --- a/product_margin_classification/views/view_product_template.xml +++ b/product_margin_classification/views/view_product_template.xml @@ -10,7 +10,7 @@ License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). product.template - + From 39b53ad0c92ca3ca28ad7e9f59e71831bdc7f4ea Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 9 Aug 2023 07:23:55 +0000 Subject: [PATCH 34/54] [UPD] Update product_margin_classification.pot --- .../i18n/product_margin_classification.pot | 117 ++++++++++-------- 1 file changed, 62 insertions(+), 55 deletions(-) diff --git a/product_margin_classification/i18n/product_margin_classification.pot b/product_margin_classification/i18n/product_margin_classification.pot index eab398a8..951a2dc7 100644 --- a/product_margin_classification/i18n/product_margin_classification.pot +++ b/product_margin_classification/i18n/product_margin_classification.pot @@ -1,12 +1,12 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * product_margin_classification +# * product_margin_classification # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: <>\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -14,21 +14,54 @@ msgstr "" "Plural-Forms: \n" #. module: product_margin_classification -#: code:addons/product_margin_classification/models/product_margin_classification.py:112 -#: code:addons/product_margin_classification/models/product_margin_classification.py:141 +#. odoo-python +#: code:addons/product_margin_classification/models/product_margin_classification.py:0 +#: code:addons/product_margin_classification/models/product_margin_classification.py:0 #, python-format msgid "-100 is not a valid Markup." msgstr "" #. module: product_margin_classification -#: code:addons/product_margin_classification/models/product_margin_classification.py:126 +#. odoo-python +#: code:addons/product_margin_classification/models/product_margin_classification.py:0 #, python-format msgid "100 is not a valid Profit Margin." msgstr "" +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Correct" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Incorrect" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Products" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Too Cheap" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Too Priced" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "%" +msgstr "" + #. module: product_margin_classification #: model:ir.model.fields,help:product_margin_classification.field_product_margin_classification__profit_margin -msgid "Also called 'Net margin' or 'Net Profit Ratio'.\n" +msgid "" +"Also called 'Net margin' or 'Net Profit Ratio'.\n" "It is computed with the following formula Profit Margin = 100 * (Sale Price - Cost) / Sale Price" msgstr "" @@ -53,13 +86,9 @@ msgid "Computation Method" msgstr "" #. module: product_margin_classification -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form -msgid "Correct" -msgstr "" - -#. module: product_margin_classification +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_product__margin_state__correct +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_template__margin_state__correct #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_search -#: selection:product.product,margin_state:0 msgid "Correct Margin" msgstr "" @@ -95,11 +124,6 @@ msgstr "" msgid "ID" msgstr "" -#. module: product_margin_classification -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form -msgid "Incorrect" -msgstr "" - #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_search msgid "Incorrect Margin" @@ -155,7 +179,8 @@ msgid "Price Rounding" msgstr "" #. module: product_margin_classification -#: code:addons/product_margin_classification/models/product_margin_classification.py:181 +#. odoo-python +#: code:addons/product_margin_classification/models/product_margin_classification.py:0 #, python-format msgid "Price Rounding can not be null." msgstr "" @@ -166,7 +191,7 @@ msgid "Price Surcharge" msgstr "" #. module: product_margin_classification -#: model:ir.model,name:product_margin_classification.model_product_product +#: model:ir.model,name:product_margin_classification.model_product_template msgid "Product" msgstr "" @@ -176,14 +201,13 @@ msgid "Product Margin Classification" msgstr "" #. module: product_margin_classification -#: model:ir.model,name:product_margin_classification.model_product_template -msgid "Product Template" +#: model:ir.model,name:product_margin_classification.model_product_product +msgid "Product Variant" msgstr "" #. module: product_margin_classification #: model:ir.actions.act_window,name:product_margin_classification.action_view_product_product_by_margin_classification #: model:ir.model.fields,field_description:product_margin_classification.field_product_margin_classification__product_ids -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form msgid "Products" msgstr "" @@ -199,7 +223,8 @@ msgstr "" #. module: product_margin_classification #: model:ir.model.fields,help:product_margin_classification.field_product_margin_classification__price_round -msgid "Sets the price so that it is a multiple of this value.\n" +msgid "" +"Sets the price so that it is a multiple of this value.\n" "Rounding is applied after the margin and before the surcharge.\n" "To have prices that end in 9.99, set rounding 1, surcharge -0.01" msgstr "" @@ -211,7 +236,9 @@ msgstr "" #. module: product_margin_classification #: model:ir.model.fields,help:product_margin_classification.field_product_margin_classification__price_surcharge -msgid "Specify the fixed amount to add or substract(if negative) to the amount calculated with the discount." +msgid "" +"Specify the fixed amount to add or substract(if negative) to the amount " +"calculated with the discount." msgstr "" #. module: product_margin_classification @@ -233,35 +260,29 @@ msgid "Theoretical Price State" msgstr "" #. module: product_margin_classification -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_product__margin_state__too_cheap +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_template__margin_state__too_cheap #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_search -#: selection:product.product,margin_state:0 msgid "Too Cheap" msgstr "" #. module: product_margin_classification -#: model:product.product,name:product_margin_classification.too_cheap_product #: model:product.template,name:product_margin_classification.too_cheap_product_product_template msgid "Too Cheap Product" msgstr "" #. module: product_margin_classification +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_product__margin_state__too_expensive +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_template__margin_state__too_expensive #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_search -#: selection:product.product,margin_state:0 msgid "Too Expensive" msgstr "" #. module: product_margin_classification -#: model:product.product,name:product_margin_classification.too_expensive_product #: model:product.template,name:product_margin_classification.too_expensive_product_product_template msgid "Too Expensive Product" msgstr "" -#. module: product_margin_classification -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form -msgid "Too Priced" -msgstr "" - #. module: product_margin_classification #: model:ir.model.fields,field_description:product_margin_classification.field_product_margin_classification__product_too_cheap_qty msgid "Total Products Too Cheap" @@ -283,20 +304,14 @@ msgid "Total Products With Incorrect Price" msgstr "" #. module: product_margin_classification -#: code:addons/product_margin_classification/models/product_product.py:68 +#. odoo-python +#: code:addons/product_margin_classification/models/product_product.py:0 #, python-format -msgid "Unimplemented Feature\n" +msgid "" +"Unimplemented Feature\n" "The sale taxes are not correctly set for computing prices with coefficients for the product %s" msgstr "" -#. module: product_margin_classification -#: model:product.product,uom_name:product_margin_classification.too_cheap_product -#: model:product.product,uom_name:product_margin_classification.too_expensive_product -#: model:product.template,uom_name:product_margin_classification.too_cheap_product_product_template -#: model:product.template,uom_name:product_margin_classification.too_expensive_product_product_template -msgid "Unit(s)" -msgstr "" - #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form msgid "Up to Theoretical Price" @@ -304,18 +319,11 @@ msgstr "" #. module: product_margin_classification #: model:ir.model.fields,help:product_margin_classification.field_product_margin_classification__markup -msgid "Value that help you to compute the sale price, based on your cost, as defined: Sale Price = (Cost * (100 + Markup)) / 100\n" +msgid "" +"Value that help you to compute the sale price, based on your cost, as defined: Sale Price = (Cost * (100 + Markup)) / 100\n" "It is computed with the following formula Markup = 100 * (Sale Price - Cost) / Cost" msgstr "" -#. module: product_margin_classification -#: model:product.product,weight_uom_name:product_margin_classification.too_cheap_product -#: model:product.product,weight_uom_name:product_margin_classification.too_expensive_product -#: model:product.template,weight_uom_name:product_margin_classification.too_cheap_product_product_template -#: model:product.template,weight_uom_name:product_margin_classification.too_expensive_product_product_template -msgid "kg" -msgstr "" - #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_form #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_template_form @@ -327,4 +335,3 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_template_form msgid "⇒ Increase Price" msgstr "" - From 9f620340964df3eb60376c113b585b029aac23ce Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 9 Aug 2023 07:27:45 +0000 Subject: [PATCH 35/54] [UPD] README.rst --- product_margin_classification/README.rst | 69 +++++++++--------- .../static/description/index.html | 73 ++++++++++--------- 2 files changed, 75 insertions(+), 67 deletions(-) diff --git a/product_margin_classification/README.rst b/product_margin_classification/README.rst index 7c83735a..342358af 100644 --- a/product_margin_classification/README.rst +++ b/product_margin_classification/README.rst @@ -14,13 +14,13 @@ Product Margin Classification :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmargin--analysis-lightgray.png?logo=github - :target: https://github.com/OCA/margin-analysis/tree/12.0/product_margin_classification + :target: https://github.com/OCA/margin-analysis/tree/16.0/product_margin_classification :alt: OCA/margin-analysis .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/margin-analysis-12-0/margin-analysis-12-0-product_margin_classification + :target: https://translation.odoo-community.org/projects/margin-analysis-16-0/margin-analysis-16-0-product_margin_classification :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/132/12.0 + :target: https://runbot.odoo-community.org/runbot/132/16.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -32,31 +32,6 @@ This module add a new model 'Margin Classifications' linked to Product variants. A margin classification has a 'Profit Margin' field and extra fields to manage computation method, like in Pricelist Item model (Markup Rate, Rounding and Surcharge fields) -If product has a margin classification defined and the theoretical price is -not the same as the sale price, an extra field 'Theoretical Price' is -displayed, based on the Margin Classification and a button is available to -change sale price. - -.. image:: https://raw.githubusercontent.com/OCA/margin-analysis/12.0/product_margin_classification/static/description/product_product_form.png - -On the Margin classification Form, user can change computation fields. -(Margin, Rounding method, ...) -Three buttons are available to apply theoretical prices: -* to all products, -* only for products that are too expensive -* only for products that are too cheap - -.. image:: https://raw.githubusercontent.com/OCA/margin-analysis/12.0/product_margin_classification/static/description/margin_classification_form.png - -By clicking on the smart buttons on the right part of the form, -all the products will be displayed, and user can easily change prices - -.. image:: https://raw.githubusercontent.com/OCA/margin-analysis/12.0/product_margin_classification/static/description/product_product_tree_incorrect_price.png - -User can also see easily products with incorrect margins in the margin classification tree views: - -.. image:: https://raw.githubusercontent.com/OCA/margin-analysis/12.0/product_margin_classification/static/description/margin_classification_tree.png - This module use both [Markup](https://en.wikipedia.org/wiki/Markup_(business)) and [Profit Margin](https://en.wikipedia.org/wiki/Profit_margin) concepts. @@ -78,12 +53,40 @@ Configuration * Create new classifications * Set classification to your products +On the Margin classification Form, user can change computation fields. +(Margin, Rounding method, ...) +Three buttons are available to apply theoretical prices: +* to all products, +* only for products that are too expensive +* only for products that are too cheap + +.. image:: https://raw.githubusercontent.com/OCA/margin-analysis/16.0/product_margin_classification/static/description/margin_classification_form.png + +By clicking on the smart buttons on the right part of the form, +all the products will be displayed, and user can easily change prices + +.. image:: https://raw.githubusercontent.com/OCA/margin-analysis/16.0/product_margin_classification/static/description/product_product_tree_incorrect_price.png + +User can also see easily products with incorrect margins in the margin classification tree views: + +.. image:: https://raw.githubusercontent.com/OCA/margin-analysis/16.0/product_margin_classification/static/description/margin_classification_tree.png + +Usage +===== + +If product has a margin classification defined and the theoretical price is +not the same as the sale price, an extra field 'Theoretical Price' is +displayed, based on the Margin Classification and a button is available to +change sale price. + +.. image:: https://raw.githubusercontent.com/OCA/margin-analysis/16.0/product_margin_classification/static/description/product_product_form.png + Known issues / Roadmap ====================== -* This module will not work for variants that have a not null ``price_extra`` value, due to the poor design of Odoo product module. This issue can be maybe fixed in new version of Odoo. - -* Onchanges features will works properly in the product.product form view. In the product.template form view, user have to save the current changes, to see the proposal of the new price displayed. +* This module will not work for variants that have a not null ``price_extra`` value, + due to the poor design of Odoo product module. + This issue can be maybe fixed in new version of Odoo. Bug Tracker =========== @@ -91,7 +94,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -130,6 +133,6 @@ Current `maintainer `__: |maintainer-legalsylvain| -This module is part of the `OCA/margin-analysis `_ project on GitHub. +This module is part of the `OCA/margin-analysis `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/product_margin_classification/static/description/index.html b/product_margin_classification/static/description/index.html index 06e50c88..58ca0361 100644 --- a/product_margin_classification/static/description/index.html +++ b/product_margin_classification/static/description/index.html @@ -367,28 +367,11 @@

Product Margin Classification

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -
+

Beta License: AGPL-3 OCA/margin-analysis Translate me on Weblate Try me on Runbot

This module is designed to extend Sale Price computation in Odoo.

This module add a new model ‘Margin Classifications’ linked to Product variants.

A margin classification has a ‘Profit Margin’ field and extra fields to manage computation method, like in Pricelist Item model (Markup Rate, Rounding and Surcharge fields)

-

If product has a margin classification defined and the theoretical price is -not the same as the sale price, an extra field ‘Theoretical Price’ is -displayed, based on the Margin Classification and a button is available to -change sale price.

-https://raw.githubusercontent.com/OCA/margin-analysis/12.0/product_margin_classification/static/description/product_product_form.png -

On the Margin classification Form, user can change computation fields. -(Margin, Rounding method, …) -Three buttons are available to apply theoretical prices: -* to all products, -* only for products that are too expensive -* only for products that are too cheap

-https://raw.githubusercontent.com/OCA/margin-analysis/12.0/product_margin_classification/static/description/margin_classification_form.png -

By clicking on the smart buttons on the right part of the form, -all the products will be displayed, and user can easily change prices

-https://raw.githubusercontent.com/OCA/margin-analysis/12.0/product_margin_classification/static/description/product_product_tree_incorrect_price.png -

User can also see easily products with incorrect margins in the margin classification tree views:

-https://raw.githubusercontent.com/OCA/margin-analysis/12.0/product_margin_classification/static/description/margin_classification_tree.png

This module use both [Markup](https://en.wikipedia.org/wiki/Markup_(business)) and [Profit Margin](https://en.wikipedia.org/wiki/Profit_margin) concepts.

You could be interested by native Pricelist functionalities, setting sale @@ -400,12 +383,13 @@

Product Margin Classification

+

On the Margin classification Form, user can change computation fields. +(Margin, Rounding method, …) +Three buttons are available to apply theoretical prices: +* to all products, +* only for products that are too expensive +* only for products that are too cheap

+https://raw.githubusercontent.com/OCA/margin-analysis/16.0/product_margin_classification/static/description/margin_classification_form.png +

By clicking on the smart buttons on the right part of the form, +all the products will be displayed, and user can easily change prices

+https://raw.githubusercontent.com/OCA/margin-analysis/16.0/product_margin_classification/static/description/product_product_tree_incorrect_price.png +

User can also see easily products with incorrect margins in the margin classification tree views:

+https://raw.githubusercontent.com/OCA/margin-analysis/16.0/product_margin_classification/static/description/margin_classification_tree.png +
+
+

Usage

+

If product has a margin classification defined and the theoretical price is +not the same as the sale price, an extra field ‘Theoretical Price’ is +displayed, based on the Margin Classification and a button is available to +change sale price.

+https://raw.githubusercontent.com/OCA/margin-analysis/16.0/product_margin_classification/static/description/product_product_form.png
-

Known issues / Roadmap

+

Known issues / Roadmap

    -
  • This module will not work for variants that have a not null price_extra value, due to the poor design of Odoo product module. This issue can be maybe fixed in new version of Odoo.
  • -
  • Onchanges features will works properly in the product.product form view. In the product.template form view, user have to save the current changes, to see the proposal of the new price displayed.
  • +
  • This module will not work for variants that have a not null price_extra value, +due to the poor design of Odoo product module. +This issue can be maybe fixed in new version of Odoo.
-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • GRAP
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association

OCA, or the Odoo Community Association, is a nonprofit organization whose @@ -457,7 +462,7 @@

Maintainers

promote its widespread use.

Current maintainer:

legalsylvain

-

This module is part of the OCA/margin-analysis project on GitHub.

+

This module is part of the OCA/margin-analysis project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

From 4a9d6b84ba977091dfad10b3b2d0f2cf8afc6ed2 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 9 Aug 2023 11:10:54 +0000 Subject: [PATCH 36/54] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: margin-analysis-16.0/margin-analysis-16.0-product_margin_classification Translate-URL: https://translation.odoo-community.org/projects/margin-analysis-16-0/margin-analysis-16-0-product_margin_classification/ --- product_margin_classification/i18n/es.po | 107 +++++++++++---------- product_margin_classification/i18n/fr.po | 113 +++++++++++++---------- 2 files changed, 126 insertions(+), 94 deletions(-) diff --git a/product_margin_classification/i18n/es.po b/product_margin_classification/i18n/es.po index 9385f8aa..214f603e 100644 --- a/product_margin_classification/i18n/es.po +++ b/product_margin_classification/i18n/es.po @@ -17,18 +17,49 @@ msgstr "" "Plural-Forms: \n" #. module: product_margin_classification -#: code:addons/product_margin_classification/models/product_margin_classification.py:112 -#: code:addons/product_margin_classification/models/product_margin_classification.py:141 +#. odoo-python +#: code:addons/product_margin_classification/models/product_margin_classification.py:0 #, python-format msgid "-100 is not a valid Markup." msgstr "-100 no es una Tasa de Margen." #. module: product_margin_classification -#: code:addons/product_margin_classification/models/product_margin_classification.py:126 +#. odoo-python +#: code:addons/product_margin_classification/models/product_margin_classification.py:0 #, python-format msgid "100 is not a valid Profit Margin." msgstr "100 no es un Marge Neto válido." +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Correct" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Incorrect" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Products" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Too Cheap" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Too Priced" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "%" +msgstr "" + #. module: product_margin_classification #: model:ir.model.fields,help:product_margin_classification.field_product_margin_classification__profit_margin msgid "" @@ -61,13 +92,9 @@ msgid "Computation Method" msgstr "Método calculado" #. module: product_margin_classification -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form -msgid "Correct" -msgstr "Correcto" - -#. module: product_margin_classification +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_product__margin_state__correct +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_template__margin_state__correct #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_search -#: selection:product.product,margin_state:0 msgid "Correct Margin" msgstr "Corregir Margen" @@ -103,11 +130,6 @@ msgstr "Bajar hasta el Precio Teórico" msgid "ID" msgstr "ID" -#. module: product_margin_classification -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form -msgid "Incorrect" -msgstr "Incorrecto" - #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_search msgid "Incorrect Margin" @@ -163,7 +185,8 @@ msgid "Price Rounding" msgstr "Redondeo precio" #. module: product_margin_classification -#: code:addons/product_margin_classification/models/product_margin_classification.py:181 +#. odoo-python +#: code:addons/product_margin_classification/models/product_margin_classification.py:0 #, python-format msgid "Price Rounding can not be null." msgstr "El Precio redondeado no puede ser nulo." @@ -174,7 +197,7 @@ msgid "Price Surcharge" msgstr "Recargo precio" #. module: product_margin_classification -#: model:ir.model,name:product_margin_classification.model_product_product +#: model:ir.model,name:product_margin_classification.model_product_template msgid "Product" msgstr "Producto" @@ -184,14 +207,13 @@ msgid "Product Margin Classification" msgstr "" #. module: product_margin_classification -#: model:ir.model,name:product_margin_classification.model_product_template -msgid "Product Template" -msgstr "Plantilla de producto" +#: model:ir.model,name:product_margin_classification.model_product_product +msgid "Product Variant" +msgstr "" #. module: product_margin_classification #: model:ir.actions.act_window,name:product_margin_classification.action_view_product_product_by_margin_classification #: model:ir.model.fields,field_description:product_margin_classification.field_product_margin_classification__product_ids -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form msgid "Products" msgstr "Productos" @@ -249,35 +271,29 @@ msgid "Theoretical Price State" msgstr "Estado del Precio Teórico" #. module: product_margin_classification -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_product__margin_state__too_cheap +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_template__margin_state__too_cheap #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_search -#: selection:product.product,margin_state:0 msgid "Too Cheap" msgstr "Demasiado Barato" #. module: product_margin_classification -#: model:product.product,name:product_margin_classification.too_cheap_product #: model:product.template,name:product_margin_classification.too_cheap_product_product_template msgid "Too Cheap Product" msgstr "" #. module: product_margin_classification +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_product__margin_state__too_expensive +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_template__margin_state__too_expensive #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_search -#: selection:product.product,margin_state:0 msgid "Too Expensive" msgstr "Demasiado caro" #. module: product_margin_classification -#: model:product.product,name:product_margin_classification.too_expensive_product #: model:product.template,name:product_margin_classification.too_expensive_product_product_template msgid "Too Expensive Product" msgstr "" -#. module: product_margin_classification -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form -msgid "Too Priced" -msgstr "Demasiado caro" - #. module: product_margin_classification #: model:ir.model.fields,field_description:product_margin_classification.field_product_margin_classification__product_too_cheap_qty msgid "Total Products Too Cheap" @@ -299,7 +315,8 @@ msgid "Total Products With Incorrect Price" msgstr "Cantidad de productos con el precio incorrecto" #. module: product_margin_classification -#: code:addons/product_margin_classification/models/product_product.py:68 +#. odoo-python +#: code:addons/product_margin_classification/models/product_product.py:0 #, python-format msgid "" "Unimplemented Feature\n" @@ -310,14 +327,6 @@ msgstr "" "Los impuestos de ventas no están correctamente establecidos para calcular " "los coeficientes por el producto %s" -#. module: product_margin_classification -#: model:product.product,uom_name:product_margin_classification.too_cheap_product -#: model:product.product,uom_name:product_margin_classification.too_expensive_product -#: model:product.template,uom_name:product_margin_classification.too_cheap_product_product_template -#: model:product.template,uom_name:product_margin_classification.too_expensive_product_product_template -msgid "Unit(s)" -msgstr "" - #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form msgid "Up to Theoretical Price" @@ -337,14 +346,6 @@ msgstr "" "Se calcula con la siguiente fórmula: Tasa de Margen = 100 * (Precio de Venta " "- Precio de Coste) / Precio de Coste" -#. module: product_margin_classification -#: model:product.product,weight_uom_name:product_margin_classification.too_cheap_product -#: model:product.product,weight_uom_name:product_margin_classification.too_expensive_product -#: model:product.template,weight_uom_name:product_margin_classification.too_cheap_product_product_template -#: model:product.template,weight_uom_name:product_margin_classification.too_expensive_product_product_template -msgid "kg" -msgstr "" - #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_form #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_template_form @@ -357,5 +358,17 @@ msgstr "⇒ Decrementar el Precio" msgid "⇒ Increase Price" msgstr "⇒ Incrementar el Precio" +#~ msgid "Correct" +#~ msgstr "Correcto" + +#~ msgid "Incorrect" +#~ msgstr "Incorrecto" + +#~ msgid "Product Template" +#~ msgstr "Plantilla de producto" + +#~ msgid "Too Priced" +#~ msgstr "Demasiado caro" + #~ msgid "product.margin.classification" #~ msgstr "product.margin.classification" diff --git a/product_margin_classification/i18n/fr.po b/product_margin_classification/i18n/fr.po index e1c45f46..9623af9a 100644 --- a/product_margin_classification/i18n/fr.po +++ b/product_margin_classification/i18n/fr.po @@ -17,18 +17,49 @@ msgstr "" "Plural-Forms: \n" #. module: product_margin_classification -#: code:addons/product_margin_classification/models/product_margin_classification.py:112 -#: code:addons/product_margin_classification/models/product_margin_classification.py:141 +#. odoo-python +#: code:addons/product_margin_classification/models/product_margin_classification.py:0 #, python-format msgid "-100 is not a valid Markup." msgstr "-100 n'est pas un taux de marge valide." #. module: product_margin_classification -#: code:addons/product_margin_classification/models/product_margin_classification.py:126 +#. odoo-python +#: code:addons/product_margin_classification/models/product_margin_classification.py:0 #, python-format msgid "100 is not a valid Profit Margin." msgstr "100 n'est pas un taux de marque valide." +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Correct" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Incorrect" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Products" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Too Cheap" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "Too Priced" +msgstr "" + +#. module: product_margin_classification +#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +msgid "%" +msgstr "" + #. module: product_margin_classification #: model:ir.model.fields,help:product_margin_classification.field_product_margin_classification__profit_margin msgid "" @@ -61,13 +92,9 @@ msgid "Computation Method" msgstr "Méthode de calcul" #. module: product_margin_classification -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form -msgid "Correct" -msgstr "Correct" - -#. module: product_margin_classification +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_product__margin_state__correct +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_template__margin_state__correct #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_search -#: selection:product.product,margin_state:0 msgid "Correct Margin" msgstr "Marge correcte" @@ -103,11 +130,6 @@ msgstr "Baisser jusqu'au prix théorique" msgid "ID" msgstr "ID" -#. module: product_margin_classification -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form -msgid "Incorrect" -msgstr "Incorrect" - #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_search msgid "Incorrect Margin" @@ -163,7 +185,8 @@ msgid "Price Rounding" msgstr "Arrondi du prix" #. module: product_margin_classification -#: code:addons/product_margin_classification/models/product_margin_classification.py:181 +#. odoo-python +#: code:addons/product_margin_classification/models/product_margin_classification.py:0 #, python-format msgid "Price Rounding can not be null." msgstr "La méthode d'arrondi ne peut être nulle" @@ -174,7 +197,7 @@ msgid "Price Surcharge" msgstr "Surcharge du prix" #. module: product_margin_classification -#: model:ir.model,name:product_margin_classification.model_product_product +#: model:ir.model,name:product_margin_classification.model_product_template msgid "Product" msgstr "Article" @@ -184,14 +207,13 @@ msgid "Product Margin Classification" msgstr "Catégorie de marge de produit" #. module: product_margin_classification -#: model:ir.model,name:product_margin_classification.model_product_template -msgid "Product Template" -msgstr "Modèle d'article" +#: model:ir.model,name:product_margin_classification.model_product_product +msgid "Product Variant" +msgstr "" #. module: product_margin_classification #: model:ir.actions.act_window,name:product_margin_classification.action_view_product_product_by_margin_classification #: model:ir.model.fields,field_description:product_margin_classification.field_product_margin_classification__product_ids -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form msgid "Products" msgstr "Articles" @@ -250,35 +272,29 @@ msgid "Theoretical Price State" msgstr "Etat de la marge" #. module: product_margin_classification -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_product__margin_state__too_cheap +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_template__margin_state__too_cheap #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_search -#: selection:product.product,margin_state:0 msgid "Too Cheap" msgstr "Pas assez cher" #. module: product_margin_classification -#: model:product.product,name:product_margin_classification.too_cheap_product #: model:product.template,name:product_margin_classification.too_cheap_product_product_template msgid "Too Cheap Product" msgstr "Produit pas assez cher" #. module: product_margin_classification +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_product__margin_state__too_expensive +#: model:ir.model.fields.selection,name:product_margin_classification.selection__product_template__margin_state__too_expensive #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_search -#: selection:product.product,margin_state:0 msgid "Too Expensive" msgstr "Trop cher" #. module: product_margin_classification -#: model:product.product,name:product_margin_classification.too_expensive_product #: model:product.template,name:product_margin_classification.too_expensive_product_product_template msgid "Too Expensive Product" msgstr "Produit trop cher" -#. module: product_margin_classification -#: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form -msgid "Too Priced" -msgstr "Trop cher" - #. module: product_margin_classification #: model:ir.model.fields,field_description:product_margin_classification.field_product_margin_classification__product_too_cheap_qty msgid "Total Products Too Cheap" @@ -300,7 +316,8 @@ msgid "Total Products With Incorrect Price" msgstr "Total des produits avec un prix incorrect" #. module: product_margin_classification -#: code:addons/product_margin_classification/models/product_product.py:68 +#. odoo-python +#: code:addons/product_margin_classification/models/product_product.py:0 #, python-format msgid "" "Unimplemented Feature\n" @@ -311,14 +328,6 @@ msgstr "" "Les taxes à la vente ne sont pas correctment configuré pour calculer les " "prix avec des coéfficients pour l'article %s" -#. module: product_margin_classification -#: model:product.product,uom_name:product_margin_classification.too_cheap_product -#: model:product.product,uom_name:product_margin_classification.too_expensive_product -#: model:product.template,uom_name:product_margin_classification.too_cheap_product_product_template -#: model:product.template,uom_name:product_margin_classification.too_expensive_product_product_template -msgid "Unit(s)" -msgstr "Unité(s)" - #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form msgid "Up to Theoretical Price" @@ -337,14 +346,6 @@ msgstr "" ". Il est calculé avec la formule suivante : Taux de Marge = (Prix de vente " "HT - Coût HT) / Coût HT" -#. module: product_margin_classification -#: model:product.product,weight_uom_name:product_margin_classification.too_cheap_product -#: model:product.product,weight_uom_name:product_margin_classification.too_expensive_product -#: model:product.template,weight_uom_name:product_margin_classification.too_cheap_product_product_template -#: model:product.template,weight_uom_name:product_margin_classification.too_expensive_product_product_template -msgid "kg" -msgstr "kg" - #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_product_form #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_template_form @@ -356,3 +357,21 @@ msgstr "⇒ Baisser le prix" #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_template_form msgid "⇒ Increase Price" msgstr "⇒ Augmenter le prix" + +#~ msgid "Correct" +#~ msgstr "Correct" + +#~ msgid "Incorrect" +#~ msgstr "Incorrect" + +#~ msgid "Product Template" +#~ msgstr "Modèle d'article" + +#~ msgid "Too Priced" +#~ msgstr "Trop cher" + +#~ msgid "Unit(s)" +#~ msgstr "Unité(s)" + +#~ msgid "kg" +#~ msgstr "kg" From 6cad86c7471aefe524d9175e0a182698e60b0166 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Fri, 18 Aug 2023 11:40:53 +0200 Subject: [PATCH 37/54] [FIX] product_margin_classification : do not loose margin classification when creating new product.template. For that purpose, use same algorithm as 'weight' field --- .../models/product_template.py | 21 ++++++++++++++++++- .../test_product_margin_classification.py | 12 +++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/product_margin_classification/models/product_template.py b/product_margin_classification/models/product_template.py index 2e807a4f..aa7a8c00 100644 --- a/product_margin_classification/models/product_template.py +++ b/product_margin_classification/models/product_template.py @@ -14,7 +14,7 @@ class ProductTemplate(models.Model): margin_classification_id = fields.Many2one( string="Margin Classification", compute="_compute_theoretical_multi_template", - readonly=False, + inverse="_inverse_margin_classification_id", comodel_name="product.margin.classification", ) @@ -34,6 +34,11 @@ class ProductTemplate(models.Model): selection=MARGIN_STATE_SELECTION, ) + def _get_related_fields_variant_template(self): + res = super()._get_related_fields_variant_template() + res.append("margin_classification_id") + return res + @api.onchange( "standard_price", "taxes_id", "margin_classification_id", "list_price" ) @@ -50,6 +55,13 @@ def _onchange_standard_price(self): self.list_price, ) + @api.depends( + "product_variant_ids", + "product_variant_ids.margin_classification_id", + "product_variant_ids.theoretical_price", + "product_variant_ids.theoretical_difference", + "product_variant_ids.margin_state", + ) def _compute_theoretical_multi_template(self): unique_variants = self.filtered( lambda template: len(template.product_variant_ids) == 1 @@ -66,6 +78,13 @@ def _compute_theoretical_multi_template(self): template.theoretical_difference = 0.0 template.margin_state = 0.0 + def _inverse_margin_classification_id(self): + for template in self: + if len(template.product_variant_ids) == 1: + template.product_variant_ids.margin_classification_id = ( + template.margin_classification_id + ) + # Custom Section def use_theoretical_price(self): self.mapped("product_variant_ids").use_theoretical_price() diff --git a/product_margin_classification/tests/test_product_margin_classification.py b/product_margin_classification/tests/test_product_margin_classification.py index d8c2403d..d366f60a 100644 --- a/product_margin_classification/tests/test_product_margin_classification.py +++ b/product_margin_classification/tests/test_product_margin_classification.py @@ -18,6 +18,7 @@ def setUp(self): self.classification_big_margin = self.env.ref( "product_margin_classification.classification_big_margin" ) + self.ProductTemplate = self.env["product.template"] def test_01_product_use_theoretical_price(self): """Apply a 100% Markup (with rounding method) for a product with @@ -86,3 +87,14 @@ def test_05_margin_classification_change_value(self): self.too_expensive_product.theoretical_price, "Change price_surcharge should change theoritical Price", ) + + def test_06_create_product_template(self): + template = self.ProductTemplate.create( + { + "name": "Template Name", + "margin_classification_id": self.classification_big_margin, + } + ) + self.assertEqual( + template.margin_classification_id, self.classification_big_margin + ) From 4143fd2a74f640987962bc991caa581613ebb5c2 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 24 Aug 2023 15:30:20 +0000 Subject: [PATCH 38/54] product_margin_classification 16.0.1.0.1 --- product_margin_classification/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/product_margin_classification/__manifest__.py b/product_margin_classification/__manifest__.py index 6eeca742..601ae242 100644 --- a/product_margin_classification/__manifest__.py +++ b/product_margin_classification/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Product Margin Classification", - "version": "16.0.1.0.0", + "version": "16.0.1.0.1", "category": "Account", "author": "GRAP,Odoo Community Association (OCA)", "maintainers": ["legalsylvain"], From 0f601910e27cecdd376c3b1012ede93c2508d589 Mon Sep 17 00:00:00 2001 From: Ivorra78 Date: Mon, 21 Aug 2023 15:15:40 +0000 Subject: [PATCH 39/54] Translated using Weblate (Spanish) Currently translated at 100.0% (57 of 57 strings) Translation: margin-analysis-16.0/margin-analysis-16.0-product_margin_classification Translate-URL: https://translation.odoo-community.org/projects/margin-analysis-16-0/margin-analysis-16-0-product_margin_classification/es/ --- product_margin_classification/i18n/es.po | 29 ++++++++++++------------ 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/product_margin_classification/i18n/es.po b/product_margin_classification/i18n/es.po index 214f603e..42bcc7c1 100644 --- a/product_margin_classification/i18n/es.po +++ b/product_margin_classification/i18n/es.po @@ -7,14 +7,15 @@ msgstr "" "Project-Id-Version: Odoo Server 10.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-08-01 07:49+0000\n" -"PO-Revision-Date: 2019-08-01 07:49+0000\n" -"Last-Translator: <>\n" +"PO-Revision-Date: 2023-09-02 18:17+0000\n" +"Last-Translator: Ivorra78 \n" "Language-Team: \n" -"Language: \n" +"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Plural-Forms: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" #. module: product_margin_classification #. odoo-python @@ -33,32 +34,32 @@ msgstr "100 no es un Marge Neto válido." #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form msgid "Correct" -msgstr "" +msgstr "Correcto" #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form msgid "Incorrect" -msgstr "" +msgstr "Incorrecto" #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form msgid "Products" -msgstr "" +msgstr "Productos" #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form msgid "Too Cheap" -msgstr "" +msgstr "Demasiado barato" #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form msgid "Too Priced" -msgstr "" +msgstr "Demasiado caro" #. module: product_margin_classification #: model_terms:ir.ui.view,arch_db:product_margin_classification.view_product_margin_classification_form msgid "%" -msgstr "" +msgstr "%" #. module: product_margin_classification #: model:ir.model.fields,help:product_margin_classification.field_product_margin_classification__profit_margin @@ -204,12 +205,12 @@ msgstr "Producto" #. module: product_margin_classification #: model:ir.model,name:product_margin_classification.model_product_margin_classification msgid "Product Margin Classification" -msgstr "" +msgstr "Clasificación del margen del producto" #. module: product_margin_classification #: model:ir.model,name:product_margin_classification.model_product_product msgid "Product Variant" -msgstr "" +msgstr "Variante del producto" #. module: product_margin_classification #: model:ir.actions.act_window,name:product_margin_classification.action_view_product_product_by_margin_classification @@ -280,7 +281,7 @@ msgstr "Demasiado Barato" #. module: product_margin_classification #: model:product.template,name:product_margin_classification.too_cheap_product_product_template msgid "Too Cheap Product" -msgstr "" +msgstr "Producto demasiado barato" #. module: product_margin_classification #: model:ir.model.fields.selection,name:product_margin_classification.selection__product_product__margin_state__too_expensive @@ -292,7 +293,7 @@ msgstr "Demasiado caro" #. module: product_margin_classification #: model:product.template,name:product_margin_classification.too_expensive_product_product_template msgid "Too Expensive Product" -msgstr "" +msgstr "Producto demasiado caro" #. module: product_margin_classification #: model:ir.model.fields,field_description:product_margin_classification.field_product_margin_classification__product_too_cheap_qty From 6b6d3f0f457c64da81a545e1384c384b7b105913 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 3 Sep 2023 14:37:30 +0000 Subject: [PATCH 40/54] [UPD] README.rst --- product_margin_classification/README.rst | 15 +++--- .../static/description/index.html | 48 ++++++++++--------- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/product_margin_classification/README.rst b/product_margin_classification/README.rst index 342358af..1404e3a6 100644 --- a/product_margin_classification/README.rst +++ b/product_margin_classification/README.rst @@ -2,10 +2,13 @@ Product Margin Classification ============================= -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:564d42ca1a20b896a819c2cd915ee70b6dad98562006da9199cc41985ad8514e + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Product Margin Classification .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/margin-analysis-16-0/margin-analysis-16-0-product_margin_classification :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/132/16.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/margin-analysis&target_branch=16.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module is designed to extend Sale Price computation in Odoo. @@ -93,7 +96,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed +If you spotted it first, help us to smash it by providing a detailed and welcomed `feedback `_. Do not contact contributors directly about support or help with technical issues. diff --git a/product_margin_classification/static/description/index.html b/product_margin_classification/static/description/index.html index 58ca0361..7c8d4010 100644 --- a/product_margin_classification/static/description/index.html +++ b/product_margin_classification/static/description/index.html @@ -1,20 +1,20 @@ - + - + Product Margin Classification

Beta License: AGPL-3 OCA/margin-analysis Translate me on Weblate Try me on Runbot