From d1742542562634046086cdd8234e8d5b74b8503c Mon Sep 17 00:00:00 2001 From: Daniel Reis Date: Mon, 14 Jun 2021 22:24:37 +0100 Subject: [PATCH 1/6] [ADD] sale_margin_delivery_cost: include other costs in sales margins --- sale_margin_delivery_cost/README.rst | 1 + sale_margin_delivery_cost/__init__.py | 1 + sale_margin_delivery_cost/__manifest__.py | 20 ++++++ sale_margin_delivery_cost/models/__init__.py | 3 + .../models/delivery_carrier.py | 21 +++++++ .../models/sale_order.py | 63 +++++++++++++++++++ .../models/sale_order_other_cost.py | 42 +++++++++++++ .../readme/CONFIGURATION.rst | 9 +++ .../readme/DESCRIPTION.rst | 18 ++++++ sale_margin_delivery_cost/readme/USAGE.rst | 6 ++ .../security/ir.model.access.csv | 2 + .../views/delivery_carrier.xml | 12 ++++ .../views/sale_order.xml | 26 ++++++++ 13 files changed, 224 insertions(+) create mode 100644 sale_margin_delivery_cost/README.rst create mode 100644 sale_margin_delivery_cost/__init__.py create mode 100644 sale_margin_delivery_cost/__manifest__.py create mode 100644 sale_margin_delivery_cost/models/__init__.py create mode 100644 sale_margin_delivery_cost/models/delivery_carrier.py create mode 100644 sale_margin_delivery_cost/models/sale_order.py create mode 100644 sale_margin_delivery_cost/models/sale_order_other_cost.py create mode 100644 sale_margin_delivery_cost/readme/CONFIGURATION.rst create mode 100644 sale_margin_delivery_cost/readme/DESCRIPTION.rst create mode 100644 sale_margin_delivery_cost/readme/USAGE.rst create mode 100644 sale_margin_delivery_cost/security/ir.model.access.csv create mode 100644 sale_margin_delivery_cost/views/delivery_carrier.xml create mode 100644 sale_margin_delivery_cost/views/sale_order.xml diff --git a/sale_margin_delivery_cost/README.rst b/sale_margin_delivery_cost/README.rst new file mode 100644 index 000000000..876fdb5f4 --- /dev/null +++ b/sale_margin_delivery_cost/README.rst @@ -0,0 +1 @@ +Generated diff --git a/sale_margin_delivery_cost/__init__.py b/sale_margin_delivery_cost/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/sale_margin_delivery_cost/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sale_margin_delivery_cost/__manifest__.py b/sale_margin_delivery_cost/__manifest__.py new file mode 100644 index 000000000..fdf8600b0 --- /dev/null +++ b/sale_margin_delivery_cost/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright (C) 2021 Open Source Integrators (https://www.opensourceintegrators.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Sales Margin after other estimated costs", + "summary": "See sales margins after other expected costs, such as shipping and delivery", + "version": "14.0.1.0.0", + "category": "Sales", + "website": "https://github.com/OCA/margin-analysis", + "author": "Open Source Integrators, Odoo Community Association (OCA)", + "license": "AGPL-3", + "maintainers": ["dreispt"], + "development_status": "Beta", + "depends": ["sale_margin", "delivery"], + "data": [ + "security/ir.model.access.csv", + "views/delivery_carrier.xml", + "views/sale_order.xml", + ], + "installable": True, +} diff --git a/sale_margin_delivery_cost/models/__init__.py b/sale_margin_delivery_cost/models/__init__.py new file mode 100644 index 000000000..d568efbc2 --- /dev/null +++ b/sale_margin_delivery_cost/models/__init__.py @@ -0,0 +1,3 @@ +from . import delivery_carrier +from . import sale_order_other_cost +from . import sale_order diff --git a/sale_margin_delivery_cost/models/delivery_carrier.py b/sale_margin_delivery_cost/models/delivery_carrier.py new file mode 100644 index 000000000..7dbb1587e --- /dev/null +++ b/sale_margin_delivery_cost/models/delivery_carrier.py @@ -0,0 +1,21 @@ +# Copyright (C) 2021 Open Source Integrators (https://www.opensourceintegrators.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +from odoo import fields, models + + +class DeliveryCarrier(models.Model): + _inherit = "delivery.carrier" + + charge_policy = fields.Selection( + [ + ("sale", "As SO Line"), + ("other", "As Other Cost"), + ], + string="Charging Policy", + default="sale", + required=True, + help="How shipping costs are added to the sales order:" + " charged in a sales order line, estimated on an other costs line.", + ) diff --git a/sale_margin_delivery_cost/models/sale_order.py b/sale_margin_delivery_cost/models/sale_order.py new file mode 100644 index 000000000..beb5c65c5 --- /dev/null +++ b/sale_margin_delivery_cost/models/sale_order.py @@ -0,0 +1,63 @@ +# Copyright (C) 2021 Open Source Integrators (https://www.opensourceintegrators.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +from odoo import api, fields, models + + +class SaleOrder(models.Model): + _inherit = "sale.order" + + other_cost_ids = fields.One2many( + "sale.order.other.cost", + "order_id", + string="Other Costs", + states={"cancel": [("readonly", True)], "done": [("readonly", True)]}, + copy=True, + auto_join=True, + ) + + @api.depends("order_line.margin", "amount_untaxed", "other_cost_ids.price_unit") + def _compute_margin(self): + super()._compute_margin() + # Subtract other costs from the Sales Order margin + for order in self.filtered("other_cost_ids"): + other_costs = sum(order.mapped("other_cost_ids.price_unit")) + order.margin -= other_costs + order.margin_percent = ( + order.amount_untaxed and order.margin / order.amount_untaxed + ) + + def set_delivery_line(self, carrier, amount): + # Using the UPDATE SHIPPING COST button sets an Other Costs line with the cost, + # instead of a Sales Order line. + # This is because we are not charging this cost to the customer. + # We use it to have a better Sales Order margin calculation. + + # For "sale" charging policy, use standard logic - shipping as an SO line. + # For "other" charging policy, set the delivery cost in the Other Costs field. + if carrier.charge_policy == "sale": + super(SaleOrder, self).set_delivery_line(carrier, amount) + else: + for order in self: + order.carrier_id = carrier.id + carrier_with_partner_lang = carrier.with_context( + lang=self.partner_id.lang + ) + if carrier_with_partner_lang.product_id.description_sale: + so_description = "%s: %s" % ( + carrier_with_partner_lang.name, + carrier_with_partner_lang.product_id.description_sale, + ) + else: + so_description = carrier_with_partner_lang.name + values = { + "order_id": self.id, + "name": so_description, + "product_id": carrier.product_id.id, + "is_delivery": True, + "price_unit": amount, + } + order.other_cost_ids.filtered("is_delivery").unlink() + order.other_cost_ids.create(values) + return True diff --git a/sale_margin_delivery_cost/models/sale_order_other_cost.py b/sale_margin_delivery_cost/models/sale_order_other_cost.py new file mode 100644 index 000000000..04aa30555 --- /dev/null +++ b/sale_margin_delivery_cost/models/sale_order_other_cost.py @@ -0,0 +1,42 @@ +# Copyright (C) 2021 Open Source Integrators (https://www.opensourceintegrators.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +from odoo import api, fields, models + + +class SaleOrderOtherCost(models.Model): + _name = "sale.order.other.cost" + _description = "Sales Order Other Cost" + + order_id = fields.Many2one( + "sale.order", + string="Sales Order", + required=True, + ondelete="cascade", + index=True, + copy=False, + ) + name = fields.Text(string="Description", required=True) + product_id = fields.Many2one( + "product.product", + string="Product", + domain="[('type', '!=', 'product'), " + "'|', ('company_id', '=', False), ('company_id', '=', company_id)]", + change_default=True, + ondelete="restrict", + check_company=True, + ) + price_unit = fields.Float("Cost", digits="Product Price") + company_id = fields.Many2one( + related="order_id.company_id", store=True, readonly=True, index=True + ) + is_delivery = fields.Boolean(string="Is a Delivery", default=False) + recompute_delivery_price = fields.Boolean( + related="order_id.recompute_delivery_price" + ) + + @api.onchange("product_id") + def product_id_change(self): + if self.product_id: + self.name = self.product_id.display_name diff --git a/sale_margin_delivery_cost/readme/CONFIGURATION.rst b/sale_margin_delivery_cost/readme/CONFIGURATION.rst new file mode 100644 index 000000000..26ccbdebb --- /dev/null +++ b/sale_margin_delivery_cost/readme/CONFIGURATION.rst @@ -0,0 +1,9 @@ +On Shipping Methods there is a field to configure them to be +tracked under Other Costs instead of Sales Order Lines. + +Navigate to *Sales > Configuration > Sales Orders > Shipping Methods*: + +On a *Shipping Method*, set the *Charging Policy* field: + + - "As SO Line" is the standard behaviour + - "As Other Cost" add the cost as *Other Costs* sale order line. diff --git a/sale_margin_delivery_cost/readme/DESCRIPTION.rst b/sale_margin_delivery_cost/readme/DESCRIPTION.rst new file mode 100644 index 000000000..effd9aa9b --- /dev/null +++ b/sale_margin_delivery_cost/readme/DESCRIPTION.rst @@ -0,0 +1,18 @@ +Track expected shipping costs, allowing more accurate margin calculations. + +Costs could include packaging, documentation or customs expenses. +These may be consumables or services, not directly included in sales order lines +nor accounted with the invoice. +But we may still ant the Sales Order margin to consider these costs, +especially if business margins are tight. + +Also allows for carrier shipping costs to be estimated separately, +instead of being automatically added as a sales order line, to charge the customer. + +This is useful in the case the customer is charge with a shipping fee +that can be very different from the actual shipping cost, +or when no shipping fee is charged at all. + +In this case the expected shipping costs, computed by the UPDATE SHIPPING COSTS +button, can be stored as Other Costs and considered for the sales order margin, +instead being added as a sales order line and charged to the customer. diff --git a/sale_margin_delivery_cost/readme/USAGE.rst b/sale_margin_delivery_cost/readme/USAGE.rst new file mode 100644 index 000000000..634e55d3f --- /dev/null +++ b/sale_margin_delivery_cost/readme/USAGE.rst @@ -0,0 +1,6 @@ +In the Sales Order, add other sales costs in the "Other Costs" field, +after the sales order lines. + +Using the DUPDATE SHIPPING COSTS button will update the estimated cost +in the Other Costs field instead of a sales order line, +if the selected Shipping Method is configured that way. diff --git a/sale_margin_delivery_cost/security/ir.model.access.csv b/sale_margin_delivery_cost/security/ir.model.access.csv new file mode 100644 index 000000000..e24fbaa6b --- /dev/null +++ b/sale_margin_delivery_cost/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_sale_order_other_cost,access_sale_order_other_cost,model_sale_order_other_cost,sales_team.group_sale_salesman,1,1,1,1 diff --git a/sale_margin_delivery_cost/views/delivery_carrier.xml b/sale_margin_delivery_cost/views/delivery_carrier.xml new file mode 100644 index 000000000..d6900f6c6 --- /dev/null +++ b/sale_margin_delivery_cost/views/delivery_carrier.xml @@ -0,0 +1,12 @@ + + + Delivery Carrier: charge policy + delivery.carrier + + + + + + + + diff --git a/sale_margin_delivery_cost/views/sale_order.xml b/sale_margin_delivery_cost/views/sale_order.xml new file mode 100644 index 000000000..79e81c279 --- /dev/null +++ b/sale_margin_delivery_cost/views/sale_order.xml @@ -0,0 +1,26 @@ + + + Sale Order: other costs + sale.order + + + + + + + + + + + + + + + + + From c8adf20fa8d4ea7fede4b09b2b91fdd459a9a96d Mon Sep 17 00:00:00 2001 From: oca-travis Date: Fri, 11 Mar 2022 19:00:41 +0000 Subject: [PATCH 2/6] [UPD] Update sale_margin_delivery_cost.pot --- .../i18n/sale_margin_delivery_cost.pot | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 sale_margin_delivery_cost/i18n/sale_margin_delivery_cost.pot diff --git a/sale_margin_delivery_cost/i18n/sale_margin_delivery_cost.pot b/sale_margin_delivery_cost/i18n/sale_margin_delivery_cost.pot new file mode 100644 index 000000000..a855955c2 --- /dev/null +++ b/sale_margin_delivery_cost/i18n/sale_margin_delivery_cost.pot @@ -0,0 +1,129 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_margin_delivery_cost +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields.selection,name:sale_margin_delivery_cost.selection__delivery_carrier__charge_policy__other +msgid "As Other Cost" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields.selection,name:sale_margin_delivery_cost.selection__delivery_carrier__charge_policy__sale +msgid "As SO Line" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_delivery_carrier__charge_policy +msgid "Charging Policy" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order_other_cost__company_id +msgid "Company" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order_other_cost__price_unit +msgid "Cost" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order_other_cost__create_uid +msgid "Created by" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order_other_cost__create_date +msgid "Created on" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order_other_cost__recompute_delivery_price +msgid "Delivery cost should be recomputed" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order_other_cost__name +msgid "Description" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_delivery_carrier__display_name +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order__display_name +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order_other_cost__display_name +msgid "Display Name" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,help:sale_margin_delivery_cost.field_delivery_carrier__charge_policy +msgid "" +"How shipping costs are added to the sales order: charged in a sales order " +"line, estimated on an other costs line." +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_delivery_carrier__id +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order__id +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order_other_cost__id +msgid "ID" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order_other_cost__is_delivery +msgid "Is a Delivery" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_delivery_carrier____last_update +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order____last_update +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order_other_cost____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order_other_cost__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order_other_cost__write_date +msgid "Last Updated on" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order__other_cost_ids +#: model_terms:ir.ui.view,arch_db:sale_margin_delivery_cost.view_order_form_inherit +msgid "Other Costs" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order_other_cost__product_id +msgid "Product" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model,name:sale_margin_delivery_cost.model_sale_order +#: model:ir.model.fields,field_description:sale_margin_delivery_cost.field_sale_order_other_cost__order_id +msgid "Sales Order" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model,name:sale_margin_delivery_cost.model_sale_order_other_cost +msgid "Sales Order Other Cost" +msgstr "" + +#. module: sale_margin_delivery_cost +#: model:ir.model,name:sale_margin_delivery_cost.model_delivery_carrier +msgid "Shipping Methods" +msgstr "" From a6d558a1cd7699d1d530784d0b0bed778ff5c8e4 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 11 Mar 2022 19:14:28 +0000 Subject: [PATCH 3/6] [UPD] README.rst --- sale_margin_delivery_cost/README.rst | 104 ++++- .../static/description/index.html | 436 ++++++++++++++++++ 2 files changed, 539 insertions(+), 1 deletion(-) create mode 100644 sale_margin_delivery_cost/static/description/index.html diff --git a/sale_margin_delivery_cost/README.rst b/sale_margin_delivery_cost/README.rst index 876fdb5f4..12016125f 100644 --- a/sale_margin_delivery_cost/README.rst +++ b/sale_margin_delivery_cost/README.rst @@ -1 +1,103 @@ -Generated +======================================== +Sales Margin after other estimated costs +======================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :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/14.0/sale_margin_delivery_cost + :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-14-0/margin-analysis-14-0-sale_margin_delivery_cost + :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/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Track expected shipping costs, allowing more accurate margin calculations. + +Costs could include packaging, documentation or customs expenses. +These may be consumables or services, not directly included in sales order lines +nor accounted with the invoice. +But we may still ant the Sales Order margin to consider these costs, +especially if business margins are tight. + +Also allows for carrier shipping costs to be estimated separately, +instead of being automatically added as a sales order line, to charge the customer. + +This is useful in the case the customer is charge with a shipping fee +that can be very different from the actual shipping cost, +or when no shipping fee is charged at all. + +In this case the expected shipping costs, computed by the UPDATE SHIPPING COSTS +button, can be stored as Other Costs and considered for the sales order margin, +instead being added as a sales order line and charged to the customer. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +In the Sales Order, add other sales costs in the "Other Costs" field, +after the sales order lines. + +Using the DUPDATE SHIPPING COSTS button will update the estimated cost +in the Other Costs field instead of a sales order line, +if the selected Shipping Method is configured that way. + +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 `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Open Source Integrators + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-dreispt| image:: https://github.com/dreispt.png?size=40px + :target: https://github.com/dreispt + :alt: dreispt + +Current `maintainer `__: + +|maintainer-dreispt| + +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/sale_margin_delivery_cost/static/description/index.html b/sale_margin_delivery_cost/static/description/index.html new file mode 100644 index 000000000..707781790 --- /dev/null +++ b/sale_margin_delivery_cost/static/description/index.html @@ -0,0 +1,436 @@ + + + + + + +Sales Margin after other estimated costs + + + +
+

Sales Margin after other estimated costs

+ + +

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

+

Track expected shipping costs, allowing more accurate margin calculations.

+

Costs could include packaging, documentation or customs expenses. +These may be consumables or services, not directly included in sales order lines +nor accounted with the invoice. +But we may still ant the Sales Order margin to consider these costs, +especially if business margins are tight.

+

Also allows for carrier shipping costs to be estimated separately, +instead of being automatically added as a sales order line, to charge the customer.

+

This is useful in the case the customer is charge with a shipping fee +that can be very different from the actual shipping cost, +or when no shipping fee is charged at all.

+

In this case the expected shipping costs, computed by the UPDATE SHIPPING COSTS +button, can be stored as Other Costs and considered for the sales order margin, +instead being added as a sales order line and charged to the customer.

+

Table of contents

+ +
+

Usage

+

In the Sales Order, add other sales costs in the “Other Costs” field, +after the sales order lines.

+

Using the DUPDATE SHIPPING COSTS button will update the estimated cost +in the Other Costs field instead of a sales order line, +if the selected Shipping Method is configured that way.

+
+
+

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.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Open Source Integrators
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

dreispt

+

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 2108521bae082f3713201d549596418d7c257475 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 11 Mar 2022 19:14:28 +0000 Subject: [PATCH 4/6] [ADD] icon.png --- .../static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 sale_margin_delivery_cost/static/description/icon.png diff --git a/sale_margin_delivery_cost/static/description/icon.png b/sale_margin_delivery_cost/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 From 5908e6c9dc8b83220b3457a0ee1a73c886b484d9 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 3 Sep 2023 14:36:54 +0000 Subject: [PATCH 5/6] [UPD] README.rst --- sale_margin_delivery_cost/README.rst | 15 ++++---- .../static/description/index.html | 36 ++++++++++--------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/sale_margin_delivery_cost/README.rst b/sale_margin_delivery_cost/README.rst index 12016125f..d81dd9cad 100644 --- a/sale_margin_delivery_cost/README.rst +++ b/sale_margin_delivery_cost/README.rst @@ -2,10 +2,13 @@ Sales Margin after other estimated costs ======================================== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:382c9950e4cf0efbdac85a4c12665cd593d820d0baf87c213b7d901162fa5ed7 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Sales Margin after other estimated costs .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/margin-analysis-14-0/margin-analysis-14-0-sale_margin_delivery_cost :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/14.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=14.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| Track expected shipping costs, allowing more accurate margin calculations. @@ -64,7 +67,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/sale_margin_delivery_cost/static/description/index.html b/sale_margin_delivery_cost/static/description/index.html index 707781790..e9811d001 100644 --- a/sale_margin_delivery_cost/static/description/index.html +++ b/sale_margin_delivery_cost/static/description/index.html @@ -1,20 +1,20 @@ - + - + Sales Margin after other estimated costs -
-

Sales Margin after other estimated costs

+
+ + +Odoo Community Association + +
+

Sales Margin after other estimated costs

-

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

-

Track expected shipping costs, allowing more accurate margin calculations.

-

Costs could include packaging, documentation or customs expenses. -These may be consumables or services, not directly included in sales order lines -nor accounted with the invoice. -But we may still ant the Sales Order margin to consider these costs, -especially if business margins are tight.

+

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

+

Track expected shipping costs, allowing more accurate margin +calculations.

+

Costs could include packaging, documentation or customs expenses. These +may be consumables or services, not directly included in sales order +lines nor accounted with the invoice. But we may still ant the Sales +Order margin to consider these costs, especially if business margins are +tight.

Also allows for carrier shipping costs to be estimated separately, -instead of being automatically added as a sales order line, to charge the customer.

+instead of being automatically added as a sales order line, to charge +the customer.

This is useful in the case the customer is charge with a shipping fee -that can be very different from the actual shipping cost, -or when no shipping fee is charged at all.

-

In this case the expected shipping costs, computed by the UPDATE SHIPPING COSTS -button, can be stored as Other Costs and considered for the sales order margin, -instead being added as a sales order line and charged to the customer.

+that can be very different from the actual shipping cost, or when no +shipping fee is charged at all.

+

In this case the expected shipping costs, computed by the UPDATE +SHIPPING COSTS button, can be stored as Other Costs and considered for +the sales order margin, instead being added as a sales order line and +charged to the customer.

Table of contents

+
+

Configuration

+

On Shipping Methods there is a field to configure them to be tracked +under Other Costs instead of Sales Order Lines.

+

Navigate to Sales > Configuration > Sales Orders > Shipping Methods:

+

On a Shipping Method, set the Charging Policy field:

+
    +
  • “As SO Line” is the standard behaviour
  • +
  • “As Other Cost” add the cost as Other Costs sale order line.
  • +
+
-

Usage

+

Usage

In the Sales Order, add other sales costs in the “Other Costs” field, after the sales order lines.

Using the DUPDATE SHIPPING COSTS button will update the estimated cost -in the Other Costs field instead of a sales order line, -if the selected Shipping Method is configured that way.

+in the Other Costs field instead of a sales order line, if the selected +Shipping Method is configured that way.

-

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 to smash 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

  • Open Source Integrators
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

-Odoo Community Association + +Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

Current maintainer:

dreispt

-

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/sale_margin_delivery_cost/tests/__init__.py b/sale_margin_delivery_cost/tests/__init__.py new file mode 100644 index 000000000..fdb371d88 --- /dev/null +++ b/sale_margin_delivery_cost/tests/__init__.py @@ -0,0 +1 @@ +from . import test_sale_margin_delivery_cost diff --git a/sale_margin_delivery_cost/tests/test_sale_margin_delivery_cost.py b/sale_margin_delivery_cost/tests/test_sale_margin_delivery_cost.py new file mode 100644 index 000000000..3b6ad7753 --- /dev/null +++ b/sale_margin_delivery_cost/tests/test_sale_margin_delivery_cost.py @@ -0,0 +1,126 @@ +# Copyright (C) 2021 Open Source Integrators (https://www.opensourceintegrators.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tests.common import TransactionCase + + +class TestSaleMarginDeliveryCost(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.partner = cls.env["res.partner"].create({"name": "Test Partner"}) + cls.uom_unit = cls.env.ref("uom.product_uom_unit") + cls.product = cls.env["product.product"].create( + { + "name": "Test Product", + "type": "service", + "list_price": 100.0, + "standard_price": 60.0, + } + ) + cls.carrier_product = cls.env["product.product"].create( + { + "name": "Carrier Product", + "type": "service", + "list_price": 15.0, + } + ) + cls.carrier = cls.env["delivery.carrier"].create( + { + "name": "Test Carrier", + "product_id": cls.carrier_product.id, + "delivery_type": "fixed", + "charge_policy": "other", + } + ) + + def _create_sale_order(self): + return self.env["sale.order"].create( + { + "partner_id": self.partner.id, + "order_line": [ + ( + 0, + 0, + { + "product_id": self.product.id, + "product_uom_qty": 1, + "product_uom_id": self.uom_unit.id, + "price_unit": 100.0, + }, + ) + ], + } + ) + + def test_margin_with_other_cost(self): + order = self._create_sale_order() + order._compute_margin() + self.assertEqual(order.margin, 40.0) + self.env["sale.order.other.cost"].create( + { + "order_id": order.id, + "name": "Packaging", + "price_unit": 10.0, + } + ) + order._compute_margin() + self.assertEqual(order.margin, 30.0) + self.assertEqual(order.margin_percent, 0.3) + + def test_margin_with_other_cost_without_sales_amount(self): + order = self.env["sale.order"].create({"partner_id": self.partner.id}) + self.env["sale.order.other.cost"].create( + { + "order_id": order.id, + "name": "Packaging", + "price_unit": 10.0, + } + ) + + order._compute_margin() + + self.assertEqual(order.margin, -10.0) + self.assertFalse(order.margin_percent) + + def test_set_delivery_line_other_policy(self): + order = self._create_sale_order() + order.set_delivery_line(self.carrier, 15.0) + self.assertEqual(order.carrier_id, self.carrier) + self.assertFalse(order.order_line.filtered("is_delivery")) + self.assertEqual(len(order.other_cost_ids), 1) + self.assertEqual(order.other_cost_ids.price_unit, 15.0) + self.assertEqual(order.other_cost_ids.product_id, self.carrier_product) + order._compute_margin() + self.assertEqual(order.margin, 25.0) + + def test_set_delivery_line_other_policy_with_product_description(self): + self.carrier_product.description_sale = "Delivery description" + order = self._create_sale_order() + + order.set_delivery_line(self.carrier, 15.0) + + self.assertEqual( + order.other_cost_ids.name, + "Test Carrier: Delivery description", + ) + + def test_other_cost_product_onchange(self): + other_cost = self.env["sale.order.other.cost"].new() + + other_cost.product_id_change() + self.assertFalse(other_cost.name) + + other_cost.product_id = self.product + other_cost.product_id_change() + + self.assertEqual(other_cost.name, self.product.display_name) + + def test_set_delivery_line_sale_policy(self): + order = self._create_sale_order() + carrier = self.carrier.copy({"charge_policy": "sale"}) + order.set_delivery_line(carrier, 15.0) + delivery_lines = order.order_line.filtered("is_delivery") + self.assertEqual(len(delivery_lines), 1) + self.assertEqual(delivery_lines.price_unit, 15.0) + self.assertFalse(order.other_cost_ids) diff --git a/sale_margin_delivery_cost/views/sale_order.xml b/sale_margin_delivery_cost/views/sale_order.xml index 79e81c279..7a14806ee 100644 --- a/sale_margin_delivery_cost/views/sale_order.xml +++ b/sale_margin_delivery_cost/views/sale_order.xml @@ -9,15 +9,15 @@ - + - +