From acf693afa3279fe6e0fd9d2738074671efc0730c Mon Sep 17 00:00:00 2001 From: "Luis M. Ontalba" Date: Tue, 23 Oct 2018 17:57:14 +0200 Subject: [PATCH] [ADD] stock_valued_picking_report_triple_discount (#39) --- oca_dependencies.txt | 2 + .../README.rst | 79 +++++++++++++++++ .../__init__.py | 3 + .../__manifest__.py | 22 +++++ .../i18n/es.po | 82 +++++++++++++++++ .../models/__init__.py | 3 + .../models/stock_pack_operation.py | 43 +++++++++ ..._valued_picking_report_triple_discount.xml | 41 +++++++++ .../tests/__init__.py | 3 + ...k_picking_valued_report_triple_discount.py | 88 +++++++++++++++++++ 10 files changed, 366 insertions(+) create mode 100644 oca_dependencies.txt create mode 100644 stock_valued_picking_report_triple_discount/README.rst create mode 100644 stock_valued_picking_report_triple_discount/__init__.py create mode 100644 stock_valued_picking_report_triple_discount/__manifest__.py create mode 100644 stock_valued_picking_report_triple_discount/i18n/es.po create mode 100644 stock_valued_picking_report_triple_discount/models/__init__.py create mode 100644 stock_valued_picking_report_triple_discount/models/stock_pack_operation.py create mode 100644 stock_valued_picking_report_triple_discount/report/stock_valued_picking_report_triple_discount.xml create mode 100644 stock_valued_picking_report_triple_discount/tests/__init__.py create mode 100644 stock_valued_picking_report_triple_discount/tests/test_stock_picking_valued_report_triple_discount.py diff --git a/oca_dependencies.txt b/oca_dependencies.txt new file mode 100644 index 0000000..0a529d2 --- /dev/null +++ b/oca_dependencies.txt @@ -0,0 +1,2 @@ +sale-workflow + diff --git a/stock_valued_picking_report_triple_discount/README.rst b/stock_valued_picking_report_triple_discount/README.rst new file mode 100644 index 0000000..a94a626 --- /dev/null +++ b/stock_valued_picking_report_triple_discount/README.rst @@ -0,0 +1,79 @@ +.. 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 + +=========================================== +Stock Valued Picking Report Triple Discount +=========================================== + +Add triple discount information to valued Delivery Slip report for partners +where the check to avoid valued picking is set. + +Configuration +============= + +#. Go to *Customers > (select one of your choice) > Sales & Purchases*. +#. Set *Valued picking* field on. +#. Go to *Sales > Configuration > Settings*. +#. Set *Allow discounts on sales order lines* field on. + +Usage +===== + +To get the triple discount stock picking valued report: + +#. Create a Sale Order with stockable products a *Valued picking* able + customer. +#. Create different discounts in sale order lines. +#. Confirm the Sale Order. +#. Click on *Deliveries* stat button. +#. Go to *Print > Delivery Slip*. + + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/151/10.0 + +Known issues / Roadmap +====================== + +* If there are several sale order lines with same product but different +price or taxes the picking value is not valid. + +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. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Luis M. Ontalba + +Do not contact contributors directly about support or help with technical issues. + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +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. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/stock_valued_picking_report_triple_discount/__init__.py b/stock_valued_picking_report_triple_discount/__init__.py new file mode 100644 index 0000000..cde864b --- /dev/null +++ b/stock_valued_picking_report_triple_discount/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models diff --git a/stock_valued_picking_report_triple_discount/__manifest__.py b/stock_valued_picking_report_triple_discount/__manifest__.py new file mode 100644 index 0000000..05388ee --- /dev/null +++ b/stock_valued_picking_report_triple_discount/__manifest__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Luis M. Ontalba - Tecnativa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Stock Valued Picking Report Triple Discount", + "summary": "Adding Triple Discount on Valued Picking Report", + "version": "10.0.1.0.0", + "author": "Tecnativa, " + "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/stock-logistics-reporting", + "category": "Warehouse Management", + "license": "AGPL-3", + "depends": [ + "sale_triple_discount", + "stock_valued_picking_report", + ], + "data": [ + 'report/stock_valued_picking_report_triple_discount.xml', + ], + "installable": True, +} diff --git a/stock_valued_picking_report_triple_discount/i18n/es.po b/stock_valued_picking_report_triple_discount/i18n/es.po new file mode 100644 index 0000000..9302b25 --- /dev/null +++ b/stock_valued_picking_report_triple_discount/i18n/es.po @@ -0,0 +1,82 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * stock_valued_picking_report_triple_discount +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-10-09 11:11+0000\n" +"PO-Revision-Date: 2017-10-09 11:11+0000\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: stock_valued_picking_report_triple_discount +#: model:ir.ui.view,arch_db:stock_valued_picking_report_triple_discount.valued_report_picking +msgid "Lot/Serial Number" +msgstr "Número Lote/Serie" + +#. module: stock_valued_picking_report_triple_discount +#: model:ir.ui.view,arch_db:stock_valued_picking_report_triple_discount.valued_report_picking +msgid "Delivered Quantity" +msgstr "Cantidad entregada" + +#. module: stock_valued_picking_report_triple_discount +#: model:ir.ui.view,arch_db:stock_valued_picking_report_triple_discount.valued_report_picking +msgid "Disc.2(%)" +msgstr "Dto.2(%)" + +#. module: stock_valued_picking_report_triple_discount +#: model:ir.ui.view,arch_db:stock_valued_picking_report_triple_discount.valued_report_picking +msgid "Disc.3(%)" +msgstr "Dto.3(%)" + +#. module: stock_valued_picking_report_triple_discount +#: model:ir.ui.view,arch_db:stock_valued_picking_report_triple_discount.valued_report_picking +msgid "Discount(%)" +msgstr "Descuento(%)" + +#. module: stock_valued_picking_report_triple_discount +#: model:ir.ui.view,arch_db:stock_valued_picking_report_triple_discount.valued_report_picking +msgid "Ordered Quantity" +msgstr "Cantidad pedida" + +#. module: stock_valued_picking_report_triple_discount +#: model:ir.ui.view,arch_db:stock_valued_picking_report_triple_discount.valued_report_picking +msgid "Product" +msgstr "Producto" + +#. module: stock_valued_picking_report_triple_discount +#: model:ir.ui.view,arch_db:stock_valued_picking_report_triple_discount.valued_report_picking +msgid "Subtotal" +msgstr "Subtotal" + +#. module: stock_valued_picking_report_triple_discount +#: model:ir.ui.view,arch_db:stock_valued_picking_report_triple_discount.valued_report_picking +msgid "Taxes" +msgstr "Impuestos" + +#. module: stock_valued_picking_report_triple_discount +#: model:ir.ui.view,arch_db:stock_valued_picking_report_triple_discount.valued_report_picking +msgid "Unit Price" +msgstr "Precio Unidad" + +#. module: stock_valued_picking_report_triple_discount +#: model:ir.model,name:stock_valued_picking_report_triple_discount.model_stock_pack_operation +msgid "Packing Operation" +msgstr "Operación de empaquetado" + +#. module: stock_valued_picking_report_triple_discount +#: model:ir.model.fields,field_description:stock_valued_picking_report_triple_discount.field_stock_pack_operation_sale_discount2 +msgid "Sale discount 2 (%)" +msgstr "Descuento 2 de venta (%)" + +#. module: stock_valued_picking_report_triple_discount +#: model:ir.model.fields,field_description:stock_valued_picking_report_triple_discount.field_stock_pack_operation_sale_discount3 +msgid "Sale discount 3 (%)" +msgstr "Descuento 3 de venta (%)" + diff --git a/stock_valued_picking_report_triple_discount/models/__init__.py b/stock_valued_picking_report_triple_discount/models/__init__.py new file mode 100644 index 0000000..55509b6 --- /dev/null +++ b/stock_valued_picking_report_triple_discount/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import stock_pack_operation diff --git a/stock_valued_picking_report_triple_discount/models/stock_pack_operation.py b/stock_valued_picking_report_triple_discount/models/stock_pack_operation.py new file mode 100644 index 0000000..3ae94b7 --- /dev/null +++ b/stock_valued_picking_report_triple_discount/models/stock_pack_operation.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Luis M. Ontalba - Tecnativa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from odoo.addons import decimal_precision as dp + + +class StockPackOperation(models.Model): + _inherit = "stock.pack.operation" + + sale_discount2 = fields.Float( + compute='_compute_sale_order_line_fields', + digits=dp.get_precision('Discount'), + string="Sale discount 2 (%)") + sale_discount3 = fields.Float( + compute='_compute_sale_order_line_fields', + digits=dp.get_precision('Discount'), + string="Sale discount 3 (%)") + + @api.multi + def sale_lines_values(self, sale_lines): + sum_qty = sum_discount2 = sum_discount3 = 0.0 + prev_price_unit = {} + for sale_line in sale_lines: + sum_qty += sale_line.product_uom_qty + sum_discount2 += sale_line.discount2 * sale_line.product_uom_qty + sum_discount3 += sale_line.discount3 * sale_line.product_uom_qty + prev_price_unit['sale_line.id'] = sale_line.price_unit + new_price = sale_line.price_unit * ( + 1 - ((sale_line.discount2 or 0.0) / 100)) * ( + 1 - ((sale_line.discount3 or 0.0) / 100)) + sale_line.update({ + 'price_unit': new_price, + }) + res = super(StockPackOperation, self).sale_lines_values(sale_lines) + res['sale_discount2'] = sum_discount2 / (sum_qty or 1) + res['sale_discount3'] = sum_discount3 / (sum_qty or 1) + for sale_line in sale_lines: + sale_line.update({ + 'price_unit': prev_price_unit['sale_line.id'] + }) + return res diff --git a/stock_valued_picking_report_triple_discount/report/stock_valued_picking_report_triple_discount.xml b/stock_valued_picking_report_triple_discount/report/stock_valued_picking_report_triple_discount.xml new file mode 100644 index 0000000..fee9f5e --- /dev/null +++ b/stock_valued_picking_report_triple_discount/report/stock_valued_picking_report_triple_discount.xml @@ -0,0 +1,41 @@ + + + + diff --git a/stock_valued_picking_report_triple_discount/tests/__init__.py b/stock_valued_picking_report_triple_discount/tests/__init__.py new file mode 100644 index 0000000..dd278c1 --- /dev/null +++ b/stock_valued_picking_report_triple_discount/tests/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import test_stock_picking_valued_report_triple_discount diff --git a/stock_valued_picking_report_triple_discount/tests/test_stock_picking_valued_report_triple_discount.py b/stock_valued_picking_report_triple_discount/tests/test_stock_picking_valued_report_triple_discount.py new file mode 100644 index 0000000..e62fbff --- /dev/null +++ b/stock_valued_picking_report_triple_discount/tests/test_stock_picking_valued_report_triple_discount.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +# Copyright 2017 Luis M. Ontalba - Tecnativa +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.tests import common + + +class TestStockPickingValuedTripleDiscount(common.SavepointCase): + + @classmethod + def setUpClass(cls): + super(TestStockPickingValuedTripleDiscount, cls).setUpClass() + cls.partner = cls.env['res.partner'].create({ + 'name': 'Mr. Odoo', + }) + cls.product1 = cls.env['product.product'].create({ + 'name': 'Test Product 1', + }) + cls.product2 = cls.env['product.product'].create({ + 'name': 'Test Product 2', + }) + cls.tax = cls.env['account.tax'].create({ + 'name': 'TAX 15%', + 'amount_type': 'percent', + 'type_tax_use': 'sale', + 'amount': 15.0, + }) + cls.order = cls.env['sale.order'].create({ + 'partner_id': cls.partner.id + }) + so_line = cls.env['sale.order.line'] + cls.so_line1 = so_line.create({ + 'order_id': cls.order.id, + 'product_id': cls.product1.id, + 'name': 'Line 1', + 'product_uom_qty': 1.0, + 'tax_id': [(6, 0, [cls.tax.id])], + 'price_unit': 600.0, + }) + cls.so_line2 = so_line.create({ + 'order_id': cls.order.id, + 'product_id': cls.product2.id, + 'name': 'Line 2', + 'product_uom_qty': 10.0, + 'tax_id': [(6, 0, [cls.tax.id])], + 'price_unit': 60.0, + }) + + def test_valued_picking_classic_discount(self): + """ Tests with single discount """ + self.so_line1.discount = 50.0 + self.so_line2.discount = 75.0 + self.assertEqual(self.so_line1.price_subtotal, 300.0) + self.assertEqual(self.so_line2.price_subtotal, 150.0) + self.assertEqual(self.order.amount_untaxed, 450.0) + self.assertEqual(self.order.amount_tax, 67.5) + self.order.action_confirm() + self.assertTrue(len(self.order.picking_ids)) + for picking in self.order.picking_ids: + self.assertEqual(picking.amount_untaxed, 450.0) + self.assertEqual(picking.amount_tax, 67.5) + self.assertEqual(picking.amount_total, 517.5) + + def test_valued_picking_classic_discount_mix_taxed(self): + """ Mix taxed and untaxed """ + self.so_line1.tax_id = False + self.so_line1.discount = 50.0 + self.so_line2.discount = 75.0 + self.assertEqual(self.order.amount_tax, 22.5) + self.order.action_confirm() + self.assertTrue(len(self.order.picking_ids)) + for picking in self.order.picking_ids: + self.assertEqual(picking.amount_tax, 22.5) + + def test_valued_picking_triple_discount(self): + """ Tests with triple discount """ + self.so_line1.discount = 50.0 + self.so_line1.discount2 = 50.0 + self.so_line1.discount3 = 50.0 + self.assertEqual(self.so_line1.price_subtotal, 75.0) + self.assertEqual(self.order.amount_untaxed, 675.0) + self.assertEqual(self.order.amount_tax, 101.25) + self.order.action_confirm() + self.assertTrue(len(self.order.picking_ids)) + for picking in self.order.picking_ids: + self.assertEqual(picking.amount_untaxed, 675.0) + self.assertEqual(picking.amount_tax, 101.25) + self.assertEqual(picking.amount_total, 776.25)