From b6b676f666d5b55edb28c4c0bde5a2e2c9ab10c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=BAria=20Mart=C3=ADn=20Xifr=C3=A9?= Date: Thu, 19 Mar 2020 11:45:35 +0100 Subject: [PATCH 01/32] [12.0][ADD]supplier_calendar --- supplier_calendar/README.rst | 120 +++++ supplier_calendar/__init__.py | 3 + supplier_calendar/__manifest__.py | 23 + supplier_calendar/models/__init__.py | 6 + supplier_calendar/models/product.py | 12 + supplier_calendar/models/purchase.py | 23 + supplier_calendar/models/res_partner.py | 50 ++ supplier_calendar/models/stock_rule.py | 25 + supplier_calendar/readme/CONFIGURE.rst | 9 + supplier_calendar/readme/CONTRIBUTORS.rst | 4 + supplier_calendar/readme/DESCRIPTION.rst | 6 + supplier_calendar/readme/USAGE.rst | 9 + supplier_calendar/static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 451 ++++++++++++++++++ supplier_calendar/tests/__init__.py | 2 + .../tests/test_supplier_calendar.py | 107 +++++ supplier_calendar/views/product_view.xml | 15 + supplier_calendar/views/res_partner_view.xml | 20 + 18 files changed, 885 insertions(+) create mode 100644 supplier_calendar/README.rst create mode 100644 supplier_calendar/__init__.py create mode 100644 supplier_calendar/__manifest__.py create mode 100644 supplier_calendar/models/__init__.py create mode 100644 supplier_calendar/models/product.py create mode 100644 supplier_calendar/models/purchase.py create mode 100644 supplier_calendar/models/res_partner.py create mode 100644 supplier_calendar/models/stock_rule.py create mode 100644 supplier_calendar/readme/CONFIGURE.rst create mode 100644 supplier_calendar/readme/CONTRIBUTORS.rst create mode 100644 supplier_calendar/readme/DESCRIPTION.rst create mode 100644 supplier_calendar/readme/USAGE.rst create mode 100644 supplier_calendar/static/description/icon.png create mode 100644 supplier_calendar/static/description/index.html create mode 100644 supplier_calendar/tests/__init__.py create mode 100644 supplier_calendar/tests/test_supplier_calendar.py create mode 100644 supplier_calendar/views/product_view.xml create mode 100644 supplier_calendar/views/res_partner_view.xml diff --git a/supplier_calendar/README.rst b/supplier_calendar/README.rst new file mode 100644 index 00000000000..245be061dd5 --- /dev/null +++ b/supplier_calendar/README.rst @@ -0,0 +1,120 @@ +================= +Supplier Calendar +================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/purchase-workflow/tree/12.0/supplier_calendar + :alt: OCA/purchase-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/purchase-workflow-12-0/purchase-workflow-12-0-supplier_calendar + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/142/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds a Calendar to the ResPartner model. This calendar can then +used as the basis of the proper computation of start/end dates based on the +delivery lead time of the supplier in this and other modules. + +In this module, the calendar is considered in the computation of the schedules +date of a stock picking and in the order date of a purchase order. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +* Go to *Settings* and activate the developer mode. + +* Go to *Settings > Technical > Resource > Working Time* and define your + resource calendar. + +* Go to *Contacts > Sales&Purchases > Purchase > Delay Calendar Type* + and assign Supplier Calendar and in *Factory Closing Days* assign the + Resource Calendar desired. + + +Usage +===== + +When a picking is created from a purchase order of a supplier, the lead +time used to calculate the scheduled date is computed in natural days. At the +same time, when a purchase order is created due to a a procurement +evaluation, its order date is also computed considering the lead time in +natural days. THis module adds the possibility of expressing the lead time +of a vendor in his own calendar. This way, the order dates of purchase +orders and the scheduled dates of receipts will only take into account the +supplier working days. + + +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 +~~~~~~~ + +* ForgeFlow + +Contributors +~~~~~~~~~~~~ + +* Núria Martín +* Jordi Ballester +* Lois Rilo + +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-Nuria Martin | image:: https://github.com/Nuria Martin .png?size=40px + :target: https://github.com/Nuria Martin + :alt: Nuria Martin +.. |maintainer-Jordi Ballester | image:: https://github.com/Jordi Ballester .png?size=40px + :target: https://github.com/Jordi Ballester + :alt: Jordi Ballester +.. |maintainer-Lois Rilo | image:: https://github.com/Lois Rilo .png?size=40px + :target: https://github.com/Lois Rilo + :alt: Lois Rilo + +Current `maintainers `__: + +|maintainer-Nuria Martin | |maintainer-Jordi Ballester | |maintainer-Lois Rilo | + +This module is part of the `OCA/purchase-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/supplier_calendar/__init__.py b/supplier_calendar/__init__.py new file mode 100644 index 00000000000..d9f9b6d497b --- /dev/null +++ b/supplier_calendar/__init__.py @@ -0,0 +1,3 @@ +# License LGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from . import models + diff --git a/supplier_calendar/__manifest__.py b/supplier_calendar/__manifest__.py new file mode 100644 index 00000000000..eca2c9e0043 --- /dev/null +++ b/supplier_calendar/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2020 ForgeFlow +# License LGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +{ + "name": "Supplier Calendar", + "summary": "Supplier Calendar", + 'version': '12.0.1.0.0', + "category": "Purchase Management", + "author": "ForgeFlow," + "Odoo Community Association (OCA)", + "maintainers": ["NuriaMForgeFlow"], + "license": "LGPL-3", + 'application': False, + 'installable': True, + 'auto_install': False, + "depends": [ + "purchase_stock", + "resource", + ], + "data": [ + 'views/res_partner_view.xml', + 'views/product_view.xml' + ], +} diff --git a/supplier_calendar/models/__init__.py b/supplier_calendar/models/__init__.py new file mode 100644 index 00000000000..723275adb3d --- /dev/null +++ b/supplier_calendar/models/__init__.py @@ -0,0 +1,6 @@ +# License LGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from . import res_partner +from . import product +from . import stock_rule +from . import purchase + diff --git a/supplier_calendar/models/product.py b/supplier_calendar/models/product.py new file mode 100644 index 00000000000..3260862db3e --- /dev/null +++ b/supplier_calendar/models/product.py @@ -0,0 +1,12 @@ +# Copyright 2020 ForgeFlow S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class ProductSupplierInfo(models.Model): + _inherit = "product.supplierinfo" + + delay_calendar_type = fields.Selection( + related='name.delay_calendar_type', + readonly=True) diff --git a/supplier_calendar/models/purchase.py b/supplier_calendar/models/purchase.py new file mode 100644 index 00000000000..483f13aa20c --- /dev/null +++ b/supplier_calendar/models/purchase.py @@ -0,0 +1,23 @@ +# Copyright 2020 ForgeFlow S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + +from odoo import models, api +from datetime import datetime + + +class PurchaseOrderLine(models.Model): + _inherit = 'purchase.order.line' + + @api.model + def _get_date_planned(self, seller, po=False): + date_planned = super(PurchaseOrderLine, self)._get_date_planned(seller, + po) + if seller.name.factory_calendar_id: + date_order = po.date_order if po else self.order_id.date_order + if date_order: + date_planned = seller.name.supplier_plan_days(date_order, + seller.delay) + else: + date_planned = seller.name.supplier_plan_days(datetime.today(), + seller.delay) + return date_planned diff --git a/supplier_calendar/models/res_partner.py b/supplier_calendar/models/res_partner.py new file mode 100644 index 00000000000..bda5d2233a6 --- /dev/null +++ b/supplier_calendar/models/res_partner.py @@ -0,0 +1,50 @@ +# Copyright 2020 ForgeFlow S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from datetime import datetime, timedelta + +from odoo import models, api, fields + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + factory_calendar_id = fields.Many2one(comodel_name='resource.calendar') + delay_calendar_type = fields.Selection([ + ('natural', 'Natural days'), + ('supplier_calendar', 'Supplier Calendar'), + ], default='natural', required=True) + + @api.onchange('delay_calendar_type') + def _onchange_delay_calendar_type(self): + for rec in self: + if rec.delay_calendar_type == 'natural': + rec.factory_calendar_id = False + + def supplier_plan_days(self, date_from, delta): + """Helper method to calculate supplier delay based on its + working days (if set). + + :param datetime date_from: reference date. + :param integer delta: delay established. + :return: datetime: resulting date. + """ + self.ensure_one() + if not isinstance(date_from, datetime): + date_from = fields.Datetime.to_datetime(date_from) + if delta == 0: + return date_from + if self.factory_calendar_id: + if delta < 0: + # We force the date planned to be at the beginning of the day. + # So no work intervals are found in the reference date. + dt_planned = date_from.replace(hour=0) + else: + # We force the date planned at the end of the day. + dt_planned = date_from.replace(hour=23) + date_result = self.factory_calendar_id.plan_days(delta, + dt_planned, + compute_leaves=True) + else: + date_result = date_from + timedelta(days=delta) + return date_result diff --git a/supplier_calendar/models/stock_rule.py b/supplier_calendar/models/stock_rule.py new file mode 100644 index 00000000000..c56f1390b81 --- /dev/null +++ b/supplier_calendar/models/stock_rule.py @@ -0,0 +1,25 @@ +# Copyright 2020 ForgeFlow S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) + +from odoo import models + + +class StockRule(models.Model): + _inherit = 'stock.rule' + + def _get_purchase_order_date(self, product_id, product_qty, product_uom, + values, partner, schedule_date): + res = super()._get_purchase_order_date( + product_id, + product_qty, product_uom, + values, partner, schedule_date) + seller = product_id.with_context(force_company=values[ + 'company_id'].id)._select_seller(partner_id=partner, + quantity=product_qty, + date=schedule_date and + schedule_date.date(), + uom_id=product_uom) + if seller: + delay = -1 * seller.delay + res = seller.name.supplier_plan_days(schedule_date, delay) + return res diff --git a/supplier_calendar/readme/CONFIGURE.rst b/supplier_calendar/readme/CONFIGURE.rst new file mode 100644 index 00000000000..b69f936df29 --- /dev/null +++ b/supplier_calendar/readme/CONFIGURE.rst @@ -0,0 +1,9 @@ +* Go to *Settings* and activate the developer mode. + +* Go to *Settings > Technical > Resource > Working Time* and define your + resource calendar. + +* Go to *Contacts > Sales&Purchases > Purchase > Delay Calendar Type* + and assign Supplier Calendar and in *Factory Closing Days* assign the + Resource Calendar desired. + diff --git a/supplier_calendar/readme/CONTRIBUTORS.rst b/supplier_calendar/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..20c4e69ea5d --- /dev/null +++ b/supplier_calendar/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ + +* Núria Martín +* Jordi Ballester +* Lois Rilo diff --git a/supplier_calendar/readme/DESCRIPTION.rst b/supplier_calendar/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..0c250a6aa20 --- /dev/null +++ b/supplier_calendar/readme/DESCRIPTION.rst @@ -0,0 +1,6 @@ +This module adds a Calendar to the ResPartner model. This calendar can then +used as the basis of the proper computation of start/end dates based on the +delivery lead time of the supplier in this and other modules. + +In this module, the calendar is considered in the computation of the schedules +date of a stock picking and in the order date of a purchase order. diff --git a/supplier_calendar/readme/USAGE.rst b/supplier_calendar/readme/USAGE.rst new file mode 100644 index 00000000000..3abc3b3fce8 --- /dev/null +++ b/supplier_calendar/readme/USAGE.rst @@ -0,0 +1,9 @@ +When a picking is created from a purchase order of a supplier, the lead +time used to calculate the scheduled date is computed in natural days. At the +same time, when a purchase order is created due to a a procurement +evaluation, its order date is also computed considering the lead time in +natural days. THis module adds the possibility of expressing the lead time +of a vendor in his own calendar. This way, the order dates of purchase +orders and the scheduled dates of receipts will only take into account the +supplier working days. + diff --git a/supplier_calendar/static/description/icon.png b/supplier_calendar/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 diff --git a/supplier_calendar/static/description/index.html b/supplier_calendar/static/description/index.html new file mode 100644 index 00000000000..b40f6c58d55 --- /dev/null +++ b/supplier_calendar/static/description/index.html @@ -0,0 +1,451 @@ + + + + + + +Supplier Calendar + + + +
+

Supplier Calendar

+ + +

Beta License: LGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runbot

+

This module adds a Calendar to the ResPartner model. This calendar can then +used as the basis of the proper computation of start/end dates based on the +delivery lead time of the supplier in this and other modules.

+

In this module, the calendar is considered in the computation of the schedules +date of a stock picking and in the order date of a purchase order.

+

Table of contents

+ +
+

Configuration

+
    +
  • Go to Settings and activate the developer mode.
  • +
  • Go to Settings > Technical > Resource > Working Time and define your +resource calendar.
  • +
  • Go to Contacts > Sales&Purchases > Purchase > Delay Calendar Type +and assign Supplier Calendar and in Factory Closing Days assign the +Resource Calendar desired.
  • +
+
+
+

Usage

+

When a picking is created from a purchase order of a supplier, the lead +time used to calculate the scheduled date is computed in natural days. At the +same time, when a purchase order is created due to a a procurement +evaluation, its order date is also computed considering the lead time in +natural days. THis module adds the possibility of expressing the lead time +of a vendor in his own calendar. This way, the order dates of purchase +orders and the scheduled dates of receipts will only take into account the +supplier working days.

+
+
+

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

+
    +
  • ForgeFlow
  • +
+
+
+

Contributors

+ +
+
+

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 maintainers:

+

Nuria Martin <nuria.martin@forgeflow.com> Jordi Ballester <jordi.ballester@forgeflow.com> Lois Rilo <lois.rilo@forgeflow.com>

+

This module is part of the OCA/purchase-workflow project on GitHub.

+

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

+
+
+
+ + diff --git a/supplier_calendar/tests/__init__.py b/supplier_calendar/tests/__init__.py new file mode 100644 index 00000000000..f73ec27681c --- /dev/null +++ b/supplier_calendar/tests/__init__.py @@ -0,0 +1,2 @@ +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). +from . import test_supplier_calendar diff --git a/supplier_calendar/tests/test_supplier_calendar.py b/supplier_calendar/tests/test_supplier_calendar.py new file mode 100644 index 00000000000..b867a41946f --- /dev/null +++ b/supplier_calendar/tests/test_supplier_calendar.py @@ -0,0 +1,107 @@ +# Copyright 2020 ForgeFlow S.L. +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import fields +from odoo.tests.common import TransactionCase + + +class TestStockWarehouseCalendar(TransactionCase): + + def setUp(self): + super(TestStockWarehouseCalendar, self).setUp() + self.move_obj = self.env['stock.move'] + self.company = self.env.ref('base.main_company') + self.company_partner = self.env.ref('base.main_partner') + self.calendar = self.env.ref('resource.resource_calendar_std') + self.supplier_info = self.env['product.supplierinfo'] + self.PurchaseOrder = self.env['purchase.order'] + self.PurchaseOrderLine = self.env['purchase.order.line'] + self.stock_location = self.env['ir.model.data'].xmlid_to_object( + 'stock.stock_location_stock') + self.customer_location = self.env['ir.model.data'].xmlid_to_object( + 'stock.stock_location_customers') + self.picking_type_out = self.env['ir.model.data'].xmlid_to_object( + 'stock.picking_type_out') + self.route_buy = self.env.ref('purchase_stock.route_warehouse0_buy').id + + # Create product + self.product = self.env['product.product'].create({ + 'name': 'test product', + 'default_code': 'PRD', + 'type': 'product', + 'route_ids': [(4, self.ref('stock.route_warehouse0_mto')), + (4, self.ref('purchase_stock.route_warehouse0_buy'))] + }) + + # Partner and Supplierinfo + self.company_partner.write({ + 'delay_calendar_type': 'supplier_calendar', + 'factory_calendar_id': self.calendar.id + + }) + self.seller_01 = self.supplier_info.create({ + 'name': self.company_partner.id, + "product_id": self.product.id, + 'product_tmpl_id': self.product.product_tmpl_id.id, + 'delay': 3 + }) + + def test_01_purchase_order_with_supplier_calendar(self): + # Create a customer picking + customer_picking = self.env['stock.picking'].create({ + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'partner_id': self.company_partner.id, + 'picking_type_id': self.picking_type_out.id, + }) + + customer_move = self.env['stock.move'].create({ + 'name': 'move out', + 'location_id': self.stock_location.id, + 'location_dest_id': self.customer_location.id, + 'product_id': self.product.id, + 'product_uom': self.product.uom_id.id, + 'product_uom_qty': 80.0, + 'procure_method': 'make_to_order', + 'picking_id': customer_picking.id, + 'date_expected': '2097-01-14 09:00:00' # Monday + }) + + customer_move._action_confirm() + + purchase_order = self.env['purchase.order'].search( + [('partner_id', '=', self.company_partner.id)]) + self.assertTrue(purchase_order, 'No purchase order created.') + date_order = fields.Date.to_date(purchase_order.date_order) + wednesday = fields.Date.to_date('2097-01-09 09:00:00') + self.assertEqual(date_order, wednesday) # Wednesday + + def test_02_purchase_order_supplier_calendar_global_leaves(self): + # Global leaves + self.calendar.write({ + 'global_leave_ids': [ + (0, False, { + 'name': 'Test', + 'date_from': '2097-01-14', # Monday + 'date_to': '2097-01-19', # Saturday + }), + ], + }) + + reference = "2097-01-14 09:00:00" # Monday + # With calendar + result = self.company_partner.supplier_plan_days(reference, 3).date() + next_wednesday = fields.Date.to_date("2097-01-23") + self.assertEquals(result, next_wednesday) + reference_2 = "2097-01-11 12:00:00" # friday + result = self.company_partner.supplier_plan_days(reference_2, 3).date() + self.assertEquals(result, next_wednesday) + # Without calendar + self.company_partner.write({ + 'delay_calendar_type': 'natural', + 'factory_calendar_id': False + }) + reference_3 = "2097-01-25 12:00:00" # friday + result = self.company_partner.supplier_plan_days(reference_3, 3).date() + monday = fields.Date.to_date("2097-01-28") + self.assertEquals(result, monday) diff --git a/supplier_calendar/views/product_view.xml b/supplier_calendar/views/product_view.xml new file mode 100644 index 00000000000..e9b16e93220 --- /dev/null +++ b/supplier_calendar/views/product_view.xml @@ -0,0 +1,15 @@ + + + + + product.supplierinfo.form.view + product.supplierinfo + + + + + + + + diff --git a/supplier_calendar/views/res_partner_view.xml b/supplier_calendar/views/res_partner_view.xml new file mode 100644 index 00000000000..ef4e6b61a71 --- /dev/null +++ b/supplier_calendar/views/res_partner_view.xml @@ -0,0 +1,20 @@ + + + + + partner.factory.calendar.form + res.partner + + + + + + + + + + + From 46054d5fa00422ae44ae0cd81c8cd7111da5ef5f Mon Sep 17 00:00:00 2001 From: oca-travis Date: Tue, 7 Apr 2020 09:24:40 +0000 Subject: [PATCH 02/32] [UPD] Update supplier_calendar.pot --- supplier_calendar/i18n/supplier_calendar.pot | 58 ++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 supplier_calendar/i18n/supplier_calendar.pot diff --git a/supplier_calendar/i18n/supplier_calendar.pot b/supplier_calendar/i18n/supplier_calendar.pot new file mode 100644 index 00000000000..c176385146a --- /dev/null +++ b/supplier_calendar/i18n/supplier_calendar.pot @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * supplier_calendar +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.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: supplier_calendar +#: model:ir.model,name:supplier_calendar.model_res_partner +msgid "Contact" +msgstr "" + +#. module: supplier_calendar +#: model:ir.model.fields,field_description:supplier_calendar.field_product_supplierinfo__delay_calendar_type +#: model:ir.model.fields,field_description:supplier_calendar.field_res_partner__delay_calendar_type +#: model:ir.model.fields,field_description:supplier_calendar.field_res_users__delay_calendar_type +msgid "Delay Calendar Type" +msgstr "" + +#. module: supplier_calendar +#: model:ir.model.fields,field_description:supplier_calendar.field_res_partner__factory_calendar_id +#: model:ir.model.fields,field_description:supplier_calendar.field_res_users__factory_calendar_id +msgid "Factory Calendar" +msgstr "" + +#. module: supplier_calendar +#: selection:res.partner,delay_calendar_type:0 +msgid "Natural days" +msgstr "" + +#. module: supplier_calendar +#: model:ir.model,name:supplier_calendar.model_purchase_order_line +msgid "Purchase Order Line" +msgstr "" + +#. module: supplier_calendar +#: model:ir.model,name:supplier_calendar.model_stock_rule +msgid "Stock Rule" +msgstr "" + +#. module: supplier_calendar +#: selection:res.partner,delay_calendar_type:0 +msgid "Supplier Calendar" +msgstr "" + +#. module: supplier_calendar +#: model:ir.model,name:supplier_calendar.model_product_supplierinfo +msgid "Supplier Pricelist" +msgstr "" + From b5f1adb9a6263edebf4e9489fa2f4b7a24251f75 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 7 Apr 2020 10:07:00 +0000 Subject: [PATCH 03/32] [UPD] README.rst --- supplier_calendar/README.rst | 17 ++++++----------- supplier_calendar/static/description/index.html | 4 ++-- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/supplier_calendar/README.rst b/supplier_calendar/README.rst index 245be061dd5..55274057b91 100644 --- a/supplier_calendar/README.rst +++ b/supplier_calendar/README.rst @@ -84,6 +84,7 @@ Authors Contributors ~~~~~~~~~~~~ + * Núria Martín * Jordi Ballester * Lois Rilo @@ -101,19 +102,13 @@ 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-Nuria Martin | image:: https://github.com/Nuria Martin .png?size=40px - :target: https://github.com/Nuria Martin - :alt: Nuria Martin -.. |maintainer-Jordi Ballester | image:: https://github.com/Jordi Ballester .png?size=40px - :target: https://github.com/Jordi Ballester - :alt: Jordi Ballester -.. |maintainer-Lois Rilo | image:: https://github.com/Lois Rilo .png?size=40px - :target: https://github.com/Lois Rilo - :alt: Lois Rilo +.. |maintainer-NuriaMForgeFlow| image:: https://github.com/NuriaMForgeFlow.png?size=40px + :target: https://github.com/NuriaMForgeFlow + :alt: NuriaMForgeFlow -Current `maintainers `__: +Current `maintainer `__: -|maintainer-Nuria Martin | |maintainer-Jordi Ballester | |maintainer-Lois Rilo | +|maintainer-NuriaMForgeFlow| This module is part of the `OCA/purchase-workflow `_ project on GitHub. diff --git a/supplier_calendar/static/description/index.html b/supplier_calendar/static/description/index.html index b40f6c58d55..3d55defa153 100644 --- a/supplier_calendar/static/description/index.html +++ b/supplier_calendar/static/description/index.html @@ -440,8 +440,8 @@

Maintainers

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 maintainers:

-

Nuria Martin <nuria.martin@forgeflow.com> Jordi Ballester <jordi.ballester@forgeflow.com> Lois Rilo <lois.rilo@forgeflow.com>

+

Current maintainer:

+

NuriaMForgeFlow

This module is part of the OCA/purchase-workflow project on GitHub.

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

From 840787475ed8b3e3450ad57931a1b16e957e1dd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=BAria=20Mart=C3=ADn=20Xifr=C3=A9?= Date: Mon, 4 May 2020 16:15:09 +0200 Subject: [PATCH 04/32] [IMP] : black, isort, prettier --- supplier_calendar/__init__.py | 1 - supplier_calendar/__manifest__.py | 21 +-- supplier_calendar/models/__init__.py | 1 - supplier_calendar/models/product.py | 6 +- supplier_calendar/models/purchase.py | 16 +- supplier_calendar/models/res_partner.py | 25 +-- supplier_calendar/models/stock_rule.py | 26 +-- supplier_calendar/readme/CONFIGURE.rst | 1 - supplier_calendar/readme/USAGE.rst | 1 - .../tests/test_supplier_calendar.py | 153 ++++++++++-------- supplier_calendar/views/product_view.xml | 8 +- supplier_calendar/views/res_partner_view.xml | 20 +-- 12 files changed, 146 insertions(+), 133 deletions(-) diff --git a/supplier_calendar/__init__.py b/supplier_calendar/__init__.py index d9f9b6d497b..5d9d2438128 100644 --- a/supplier_calendar/__init__.py +++ b/supplier_calendar/__init__.py @@ -1,3 +1,2 @@ # License LGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from . import models - diff --git a/supplier_calendar/__manifest__.py b/supplier_calendar/__manifest__.py index eca2c9e0043..5ba5afc73b6 100644 --- a/supplier_calendar/__manifest__.py +++ b/supplier_calendar/__manifest__.py @@ -3,21 +3,14 @@ { "name": "Supplier Calendar", "summary": "Supplier Calendar", - 'version': '12.0.1.0.0', + "version": "12.0.1.0.0", "category": "Purchase Management", - "author": "ForgeFlow," - "Odoo Community Association (OCA)", + "author": "ForgeFlow," "Odoo Community Association (OCA)", "maintainers": ["NuriaMForgeFlow"], "license": "LGPL-3", - 'application': False, - 'installable': True, - 'auto_install': False, - "depends": [ - "purchase_stock", - "resource", - ], - "data": [ - 'views/res_partner_view.xml', - 'views/product_view.xml' - ], + "application": False, + "installable": True, + "auto_install": False, + "depends": ["purchase_stock", "resource",], + "data": ["views/res_partner_view.xml", "views/product_view.xml"], } diff --git a/supplier_calendar/models/__init__.py b/supplier_calendar/models/__init__.py index 723275adb3d..9fdc3838d39 100644 --- a/supplier_calendar/models/__init__.py +++ b/supplier_calendar/models/__init__.py @@ -3,4 +3,3 @@ from . import product from . import stock_rule from . import purchase - diff --git a/supplier_calendar/models/product.py b/supplier_calendar/models/product.py index 3260862db3e..6ee662654eb 100644 --- a/supplier_calendar/models/product.py +++ b/supplier_calendar/models/product.py @@ -1,12 +1,12 @@ # Copyright 2020 ForgeFlow S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import models, fields +from odoo import fields, models class ProductSupplierInfo(models.Model): _inherit = "product.supplierinfo" delay_calendar_type = fields.Selection( - related='name.delay_calendar_type', - readonly=True) + related="name.delay_calendar_type", readonly=True + ) diff --git a/supplier_calendar/models/purchase.py b/supplier_calendar/models/purchase.py index 483f13aa20c..c67d929735b 100644 --- a/supplier_calendar/models/purchase.py +++ b/supplier_calendar/models/purchase.py @@ -1,23 +1,23 @@ # Copyright 2020 ForgeFlow S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) -from odoo import models, api from datetime import datetime +from odoo import api, models + class PurchaseOrderLine(models.Model): - _inherit = 'purchase.order.line' + _inherit = "purchase.order.line" @api.model def _get_date_planned(self, seller, po=False): - date_planned = super(PurchaseOrderLine, self)._get_date_planned(seller, - po) + date_planned = super(PurchaseOrderLine, self)._get_date_planned(seller, po) if seller.name.factory_calendar_id: date_order = po.date_order if po else self.order_id.date_order if date_order: - date_planned = seller.name.supplier_plan_days(date_order, - seller.delay) + date_planned = seller.name.supplier_plan_days(date_order, seller.delay) else: - date_planned = seller.name.supplier_plan_days(datetime.today(), - seller.delay) + date_planned = seller.name.supplier_plan_days( + datetime.today(), seller.delay + ) return date_planned diff --git a/supplier_calendar/models/res_partner.py b/supplier_calendar/models/res_partner.py index bda5d2233a6..b0174104f3e 100644 --- a/supplier_calendar/models/res_partner.py +++ b/supplier_calendar/models/res_partner.py @@ -3,22 +3,23 @@ from datetime import datetime, timedelta -from odoo import models, api, fields +from odoo import api, fields, models class ResPartner(models.Model): - _inherit = 'res.partner' + _inherit = "res.partner" - factory_calendar_id = fields.Many2one(comodel_name='resource.calendar') - delay_calendar_type = fields.Selection([ - ('natural', 'Natural days'), - ('supplier_calendar', 'Supplier Calendar'), - ], default='natural', required=True) + factory_calendar_id = fields.Many2one(comodel_name="resource.calendar") + delay_calendar_type = fields.Selection( + [("natural", "Natural days"), ("supplier_calendar", "Supplier Calendar"),], + default="natural", + required=True, + ) - @api.onchange('delay_calendar_type') + @api.onchange("delay_calendar_type") def _onchange_delay_calendar_type(self): for rec in self: - if rec.delay_calendar_type == 'natural': + if rec.delay_calendar_type == "natural": rec.factory_calendar_id = False def supplier_plan_days(self, date_from, delta): @@ -42,9 +43,9 @@ def supplier_plan_days(self, date_from, delta): else: # We force the date planned at the end of the day. dt_planned = date_from.replace(hour=23) - date_result = self.factory_calendar_id.plan_days(delta, - dt_planned, - compute_leaves=True) + date_result = self.factory_calendar_id.plan_days( + delta, dt_planned, compute_leaves=True + ) else: date_result = date_from + timedelta(days=delta) return date_result diff --git a/supplier_calendar/models/stock_rule.py b/supplier_calendar/models/stock_rule.py index c56f1390b81..8c84f574132 100644 --- a/supplier_calendar/models/stock_rule.py +++ b/supplier_calendar/models/stock_rule.py @@ -5,20 +5,22 @@ class StockRule(models.Model): - _inherit = 'stock.rule' + _inherit = "stock.rule" - def _get_purchase_order_date(self, product_id, product_qty, product_uom, - values, partner, schedule_date): + def _get_purchase_order_date( + self, product_id, product_qty, product_uom, values, partner, schedule_date + ): res = super()._get_purchase_order_date( - product_id, - product_qty, product_uom, - values, partner, schedule_date) - seller = product_id.with_context(force_company=values[ - 'company_id'].id)._select_seller(partner_id=partner, - quantity=product_qty, - date=schedule_date and - schedule_date.date(), - uom_id=product_uom) + product_id, product_qty, product_uom, values, partner, schedule_date + ) + seller = product_id.with_context( + force_company=values["company_id"].id + )._select_seller( + partner_id=partner, + quantity=product_qty, + date=schedule_date and schedule_date.date(), + uom_id=product_uom, + ) if seller: delay = -1 * seller.delay res = seller.name.supplier_plan_days(schedule_date, delay) diff --git a/supplier_calendar/readme/CONFIGURE.rst b/supplier_calendar/readme/CONFIGURE.rst index b69f936df29..2174bb6fd39 100644 --- a/supplier_calendar/readme/CONFIGURE.rst +++ b/supplier_calendar/readme/CONFIGURE.rst @@ -6,4 +6,3 @@ * Go to *Contacts > Sales&Purchases > Purchase > Delay Calendar Type* and assign Supplier Calendar and in *Factory Closing Days* assign the Resource Calendar desired. - diff --git a/supplier_calendar/readme/USAGE.rst b/supplier_calendar/readme/USAGE.rst index 3abc3b3fce8..02daadd61ad 100644 --- a/supplier_calendar/readme/USAGE.rst +++ b/supplier_calendar/readme/USAGE.rst @@ -6,4 +6,3 @@ natural days. THis module adds the possibility of expressing the lead time of a vendor in his own calendar. This way, the order dates of purchase orders and the scheduled dates of receipts will only take into account the supplier working days. - diff --git a/supplier_calendar/tests/test_supplier_calendar.py b/supplier_calendar/tests/test_supplier_calendar.py index b867a41946f..4bf67241b91 100644 --- a/supplier_calendar/tests/test_supplier_calendar.py +++ b/supplier_calendar/tests/test_supplier_calendar.py @@ -6,87 +6,107 @@ class TestStockWarehouseCalendar(TransactionCase): - def setUp(self): super(TestStockWarehouseCalendar, self).setUp() - self.move_obj = self.env['stock.move'] - self.company = self.env.ref('base.main_company') - self.company_partner = self.env.ref('base.main_partner') - self.calendar = self.env.ref('resource.resource_calendar_std') - self.supplier_info = self.env['product.supplierinfo'] - self.PurchaseOrder = self.env['purchase.order'] - self.PurchaseOrderLine = self.env['purchase.order.line'] - self.stock_location = self.env['ir.model.data'].xmlid_to_object( - 'stock.stock_location_stock') - self.customer_location = self.env['ir.model.data'].xmlid_to_object( - 'stock.stock_location_customers') - self.picking_type_out = self.env['ir.model.data'].xmlid_to_object( - 'stock.picking_type_out') - self.route_buy = self.env.ref('purchase_stock.route_warehouse0_buy').id + self.move_obj = self.env["stock.move"] + self.company = self.env.ref("base.main_company") + self.company_partner = self.env.ref("base.main_partner") + self.calendar = self.env.ref("resource.resource_calendar_std") + self.supplier_info = self.env["product.supplierinfo"] + self.PurchaseOrder = self.env["purchase.order"] + self.PurchaseOrderLine = self.env["purchase.order.line"] + self.stock_location = self.env["ir.model.data"].xmlid_to_object( + "stock.stock_location_stock" + ) + self.customer_location = self.env["ir.model.data"].xmlid_to_object( + "stock.stock_location_customers" + ) + self.picking_type_out = self.env["ir.model.data"].xmlid_to_object( + "stock.picking_type_out" + ) + self.route_buy = self.env.ref("purchase_stock.route_warehouse0_buy").id # Create product - self.product = self.env['product.product'].create({ - 'name': 'test product', - 'default_code': 'PRD', - 'type': 'product', - 'route_ids': [(4, self.ref('stock.route_warehouse0_mto')), - (4, self.ref('purchase_stock.route_warehouse0_buy'))] - }) + self.product = self.env["product.product"].create( + { + "name": "test product", + "default_code": "PRD", + "type": "product", + "route_ids": [ + (4, self.ref("stock.route_warehouse0_mto")), + (4, self.ref("purchase_stock.route_warehouse0_buy")), + ], + } + ) # Partner and Supplierinfo - self.company_partner.write({ - 'delay_calendar_type': 'supplier_calendar', - 'factory_calendar_id': self.calendar.id - - }) - self.seller_01 = self.supplier_info.create({ - 'name': self.company_partner.id, - "product_id": self.product.id, - 'product_tmpl_id': self.product.product_tmpl_id.id, - 'delay': 3 - }) + self.company_partner.write( + { + "delay_calendar_type": "supplier_calendar", + "factory_calendar_id": self.calendar.id, + } + ) + self.seller_01 = self.supplier_info.create( + { + "name": self.company_partner.id, + "product_id": self.product.id, + "product_tmpl_id": self.product.product_tmpl_id.id, + "delay": 3, + } + ) def test_01_purchase_order_with_supplier_calendar(self): # Create a customer picking - customer_picking = self.env['stock.picking'].create({ - 'location_id': self.stock_location.id, - 'location_dest_id': self.customer_location.id, - 'partner_id': self.company_partner.id, - 'picking_type_id': self.picking_type_out.id, - }) + customer_picking = self.env["stock.picking"].create( + { + "location_id": self.stock_location.id, + "location_dest_id": self.customer_location.id, + "partner_id": self.company_partner.id, + "picking_type_id": self.picking_type_out.id, + } + ) - customer_move = self.env['stock.move'].create({ - 'name': 'move out', - 'location_id': self.stock_location.id, - 'location_dest_id': self.customer_location.id, - 'product_id': self.product.id, - 'product_uom': self.product.uom_id.id, - 'product_uom_qty': 80.0, - 'procure_method': 'make_to_order', - 'picking_id': customer_picking.id, - 'date_expected': '2097-01-14 09:00:00' # Monday - }) + customer_move = self.env["stock.move"].create( + { + "name": "move out", + "location_id": self.stock_location.id, + "location_dest_id": self.customer_location.id, + "product_id": self.product.id, + "product_uom": self.product.uom_id.id, + "product_uom_qty": 80.0, + "procure_method": "make_to_order", + "picking_id": customer_picking.id, + "date_expected": "2097-01-14 09:00:00", # Monday + } + ) customer_move._action_confirm() - purchase_order = self.env['purchase.order'].search( - [('partner_id', '=', self.company_partner.id)]) - self.assertTrue(purchase_order, 'No purchase order created.') + purchase_order = self.env["purchase.order"].search( + [("partner_id", "=", self.company_partner.id)] + ) + self.assertTrue(purchase_order, "No purchase order created.") date_order = fields.Date.to_date(purchase_order.date_order) - wednesday = fields.Date.to_date('2097-01-09 09:00:00') + wednesday = fields.Date.to_date("2097-01-09 09:00:00") self.assertEqual(date_order, wednesday) # Wednesday def test_02_purchase_order_supplier_calendar_global_leaves(self): # Global leaves - self.calendar.write({ - 'global_leave_ids': [ - (0, False, { - 'name': 'Test', - 'date_from': '2097-01-14', # Monday - 'date_to': '2097-01-19', # Saturday - }), - ], - }) + self.calendar.write( + { + "global_leave_ids": [ + ( + 0, + False, + { + "name": "Test", + "date_from": "2097-01-14", # Monday + "date_to": "2097-01-19", # Saturday + }, + ), + ], + } + ) reference = "2097-01-14 09:00:00" # Monday # With calendar @@ -97,10 +117,9 @@ def test_02_purchase_order_supplier_calendar_global_leaves(self): result = self.company_partner.supplier_plan_days(reference_2, 3).date() self.assertEquals(result, next_wednesday) # Without calendar - self.company_partner.write({ - 'delay_calendar_type': 'natural', - 'factory_calendar_id': False - }) + self.company_partner.write( + {"delay_calendar_type": "natural", "factory_calendar_id": False} + ) reference_3 = "2097-01-25 12:00:00" # friday result = self.company_partner.supplier_plan_days(reference_3, 3).date() monday = fields.Date.to_date("2097-01-28") diff --git a/supplier_calendar/views/product_view.xml b/supplier_calendar/views/product_view.xml index e9b16e93220..bd7ee590fcc 100644 --- a/supplier_calendar/views/product_view.xml +++ b/supplier_calendar/views/product_view.xml @@ -1,14 +1,14 @@ - + - + product.supplierinfo.form.view product.supplierinfo - + - + diff --git a/supplier_calendar/views/res_partner_view.xml b/supplier_calendar/views/res_partner_view.xml index ef4e6b61a71..c0891c0966c 100644 --- a/supplier_calendar/views/res_partner_view.xml +++ b/supplier_calendar/views/res_partner_view.xml @@ -1,20 +1,22 @@ - + partner.factory.calendar.form res.partner - + - - - + + + - - From 893f67e7b9114d4f44d8eccb8503adc3d4f7f65a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=BAria=20Mart=C3=ADn=20Xifr=C3=A9?= Date: Mon, 4 May 2020 16:17:33 +0200 Subject: [PATCH 05/32] [13.0][MIG] supplier_calendar --- supplier_calendar/__manifest__.py | 4 ++-- supplier_calendar/models/res_partner.py | 2 +- supplier_calendar/models/stock_rule.py | 31 +++++++++++-------------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/supplier_calendar/__manifest__.py b/supplier_calendar/__manifest__.py index 5ba5afc73b6..141edc946ac 100644 --- a/supplier_calendar/__manifest__.py +++ b/supplier_calendar/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Supplier Calendar", "summary": "Supplier Calendar", - "version": "12.0.1.0.0", + "version": "13.0.1.0.0", "category": "Purchase Management", "author": "ForgeFlow," "Odoo Community Association (OCA)", "maintainers": ["NuriaMForgeFlow"], @@ -11,6 +11,6 @@ "application": False, "installable": True, "auto_install": False, - "depends": ["purchase_stock", "resource",], + "depends": ["purchase_stock", "resource"], "data": ["views/res_partner_view.xml", "views/product_view.xml"], } diff --git a/supplier_calendar/models/res_partner.py b/supplier_calendar/models/res_partner.py index b0174104f3e..1255e51f4f1 100644 --- a/supplier_calendar/models/res_partner.py +++ b/supplier_calendar/models/res_partner.py @@ -11,7 +11,7 @@ class ResPartner(models.Model): factory_calendar_id = fields.Many2one(comodel_name="resource.calendar") delay_calendar_type = fields.Selection( - [("natural", "Natural days"), ("supplier_calendar", "Supplier Calendar"),], + [("natural", "Natural days"), ("supplier_calendar", "Supplier Calendar")], default="natural", required=True, ) diff --git a/supplier_calendar/models/stock_rule.py b/supplier_calendar/models/stock_rule.py index 8c84f574132..285c49747f6 100644 --- a/supplier_calendar/models/stock_rule.py +++ b/supplier_calendar/models/stock_rule.py @@ -1,27 +1,24 @@ # Copyright 2020 ForgeFlow S.L. # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html) -from odoo import models +from dateutil.relativedelta import relativedelta + +from odoo import fields, models class StockRule(models.Model): _inherit = "stock.rule" - def _get_purchase_order_date( - self, product_id, product_qty, product_uom, values, partner, schedule_date - ): - res = super()._get_purchase_order_date( - product_id, product_qty, product_uom, values, partner, schedule_date - ) - seller = product_id.with_context( - force_company=values["company_id"].id - )._select_seller( - partner_id=partner, - quantity=product_qty, - date=schedule_date and schedule_date.date(), - uom_id=product_uom, + def _prepare_purchase_order(self, company_id, origins, values): + res = super()._prepare_purchase_order(company_id, origins, values) + dates = [fields.Datetime.from_string(value["date_planned"]) for value in values] + values = values[0] + partner = values["supplier"].name + procurement_date_planned = min(dates) + schedule_date = procurement_date_planned - relativedelta( + days=company_id.po_lead ) - if seller: - delay = -1 * seller.delay - res = seller.name.supplier_plan_days(schedule_date, delay) + delay = -1 * values["supplier"].delay + purchase_date = partner.supplier_plan_days(schedule_date, delay) + res["date_order"] = purchase_date return res From dec42119b7e1708e19691ca26fec08a5b6b14172 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Mon, 18 May 2020 11:34:10 +0000 Subject: [PATCH 06/32] [UPD] Update supplier_calendar.pot --- supplier_calendar/i18n/supplier_calendar.pot | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/supplier_calendar/i18n/supplier_calendar.pot b/supplier_calendar/i18n/supplier_calendar.pot index c176385146a..a8ff24274eb 100644 --- a/supplier_calendar/i18n/supplier_calendar.pot +++ b/supplier_calendar/i18n/supplier_calendar.pot @@ -1,12 +1,12 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * supplier_calendar +# * supplier_calendar # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 13.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" @@ -32,7 +32,7 @@ msgid "Factory Calendar" msgstr "" #. module: supplier_calendar -#: selection:res.partner,delay_calendar_type:0 +#: model:ir.model.fields.selection,name:supplier_calendar.selection__res_partner__delay_calendar_type__natural msgid "Natural days" msgstr "" @@ -47,7 +47,7 @@ msgid "Stock Rule" msgstr "" #. module: supplier_calendar -#: selection:res.partner,delay_calendar_type:0 +#: model:ir.model.fields.selection,name:supplier_calendar.selection__res_partner__delay_calendar_type__supplier_calendar msgid "Supplier Calendar" msgstr "" @@ -55,4 +55,3 @@ msgstr "" #: model:ir.model,name:supplier_calendar.model_product_supplierinfo msgid "Supplier Pricelist" msgstr "" - From c938288bc74b7414247d4c432c9da0879e62baba Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 18 May 2020 11:55:32 +0000 Subject: [PATCH 07/32] [UPD] README.rst --- supplier_calendar/README.rst | 12 +++++------- supplier_calendar/static/description/index.html | 6 +++--- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/supplier_calendar/README.rst b/supplier_calendar/README.rst index 55274057b91..3edc27d75c2 100644 --- a/supplier_calendar/README.rst +++ b/supplier_calendar/README.rst @@ -14,13 +14,13 @@ Supplier Calendar :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github - :target: https://github.com/OCA/purchase-workflow/tree/12.0/supplier_calendar + :target: https://github.com/OCA/purchase-workflow/tree/13.0/supplier_calendar :alt: OCA/purchase-workflow .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/purchase-workflow-12-0/purchase-workflow-12-0-supplier_calendar + :target: https://translation.odoo-community.org/projects/purchase-workflow-13-0/purchase-workflow-13-0-supplier_calendar :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/142/12.0 + :target: https://runbot.odoo-community.org/runbot/142/13.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -49,7 +49,6 @@ Configuration and assign Supplier Calendar and in *Factory Closing Days* assign the Resource Calendar desired. - Usage ===== @@ -62,14 +61,13 @@ of a vendor in his own calendar. This way, the order dates of purchase orders and the scheduled dates of receipts will only take into account the supplier working days. - 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. @@ -110,6 +108,6 @@ Current `maintainer `__: |maintainer-NuriaMForgeFlow| -This module is part of the `OCA/purchase-workflow `_ project on GitHub. +This module is part of the `OCA/purchase-workflow `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/supplier_calendar/static/description/index.html b/supplier_calendar/static/description/index.html index 3d55defa153..51e30a2da3f 100644 --- a/supplier_calendar/static/description/index.html +++ b/supplier_calendar/static/description/index.html @@ -367,7 +367,7 @@

Supplier Calendar

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

Beta License: LGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runbot

+

Beta License: LGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runbot

This module adds a Calendar to the ResPartner model. This calendar can then used as the basis of the proper computation of start/end dates based on the delivery lead time of the supplier in this and other modules.

@@ -414,7 +414,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.

@@ -442,7 +442,7 @@

Maintainers

promote its widespread use.

Current maintainer:

NuriaMForgeFlow

-

This module is part of the OCA/purchase-workflow project on GitHub.

+

This module is part of the OCA/purchase-workflow project on GitHub.

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

From b22a34e7dfdd03e1494e2fcf6fcb10a0bd793aee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthieu=20M=C3=A9quignon?= Date: Thu, 25 Jun 2020 17:11:24 +0200 Subject: [PATCH 08/32] fixup! fixup! fixup! fixup! [ADD] purchase_delays --- supplier_calendar/tests/test_supplier_calendar.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/supplier_calendar/tests/test_supplier_calendar.py b/supplier_calendar/tests/test_supplier_calendar.py index 4bf67241b91..6beeb3ec7ba 100644 --- a/supplier_calendar/tests/test_supplier_calendar.py +++ b/supplier_calendar/tests/test_supplier_calendar.py @@ -2,9 +2,11 @@ # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from odoo import fields +from odoo.tests import tagged from odoo.tests.common import TransactionCase +@tagged("post_install", "-at_install") class TestStockWarehouseCalendar(TransactionCase): def setUp(self): super(TestStockWarehouseCalendar, self).setUp() From 5e0e63861fd571e5ce4c6f0c0253fd81cd905a8c Mon Sep 17 00:00:00 2001 From: mreficent Date: Wed, 30 Sep 2020 11:53:09 +0200 Subject: [PATCH 09/32] [FIX] Delete empty " " spaces in same string line --- supplier_calendar/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/supplier_calendar/__manifest__.py b/supplier_calendar/__manifest__.py index 141edc946ac..1ba8a175524 100644 --- a/supplier_calendar/__manifest__.py +++ b/supplier_calendar/__manifest__.py @@ -5,7 +5,7 @@ "summary": "Supplier Calendar", "version": "13.0.1.0.0", "category": "Purchase Management", - "author": "ForgeFlow," "Odoo Community Association (OCA)", + "author": "ForgeFlow, Odoo Community Association (OCA)", "maintainers": ["NuriaMForgeFlow"], "license": "LGPL-3", "application": False, From fd8153a7adbc4fb18f86caf9b9c5c04066d395e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Marques?= Date: Thu, 5 Aug 2021 09:00:40 +0100 Subject: [PATCH 10/32] [IMP] *: pre-commit execution Fix pre-commit errors by addind the correct `website` key --- supplier_calendar/__manifest__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/supplier_calendar/__manifest__.py b/supplier_calendar/__manifest__.py index 1ba8a175524..42edbfe273a 100644 --- a/supplier_calendar/__manifest__.py +++ b/supplier_calendar/__manifest__.py @@ -4,6 +4,7 @@ "name": "Supplier Calendar", "summary": "Supplier Calendar", "version": "13.0.1.0.0", + "website": "https://github.com/OCA/purchase-workflow", "category": "Purchase Management", "author": "ForgeFlow, Odoo Community Association (OCA)", "maintainers": ["NuriaMForgeFlow"], From bc6875078589ee77497cf42f1cc55546211f87b2 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 3 Sep 2023 15:40:59 +0000 Subject: [PATCH 11/32] [UPD] README.rst --- supplier_calendar/README.rst | 15 ++++--- .../static/description/index.html | 44 ++++++++++--------- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/supplier_calendar/README.rst b/supplier_calendar/README.rst index 3edc27d75c2..fe5df902e0b 100644 --- a/supplier_calendar/README.rst +++ b/supplier_calendar/README.rst @@ -2,10 +2,13 @@ Supplier Calendar ================= -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:dc243cdd32d7160618f0d329cd26cdb5d3b95d9c760192ca9142db2994897860 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Supplier Calendar .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/purchase-workflow-13-0/purchase-workflow-13-0-supplier_calendar :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/142/13.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/purchase-workflow&target_branch=13.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module adds a Calendar to the ResPartner model. This calendar can then used as the basis of the proper computation of start/end dates based on the @@ -66,7 +69,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/supplier_calendar/static/description/index.html b/supplier_calendar/static/description/index.html index 51e30a2da3f..c9397095b32 100644 --- a/supplier_calendar/static/description/index.html +++ b/supplier_calendar/static/description/index.html @@ -1,20 +1,20 @@ - + - + Supplier Calendar -
-

Supplier Calendar

+
+ + +Odoo Community Association + +
+

Supplier Calendar

-

Beta License: LGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runboat

+

Beta License: LGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runboat

This module adds a Calendar to the ResPartner model. This calendar can then used as the basis of the proper computation of start/end dates based on the delivery lead time of the supplier in this and other @@ -392,7 +397,7 @@

Supplier Calendar

-

Configuration

+

Configuration

  • Go to Settings and activate the developer mode.
  • Go to Settings > Technical > Resource > Working Schedules and define @@ -403,7 +408,7 @@

    Configuration

-

Usage

+

Usage

When a picking is created from a purchase order of a supplier, the lead time used to calculate the scheduled date is computed in natural days. At the same time, when a purchase order is created due to a a @@ -414,31 +419,35 @@

Usage

only take into account the supplier working days.

-

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

  • ForgeFlow
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -448,10 +457,11 @@

Maintainers

promote its widespread use.

Current maintainer:

LoisRForgeFlow

-

This module is part of the OCA/purchase-workflow project on GitHub.

+

This module is part of the OCA/purchase-workflow project on GitHub.

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

+
diff --git a/supplier_calendar/tests/test_supplier_calendar.py b/supplier_calendar/tests/test_supplier_calendar.py index 749778615de..120c9b8cc07 100644 --- a/supplier_calendar/tests/test_supplier_calendar.py +++ b/supplier_calendar/tests/test_supplier_calendar.py @@ -2,52 +2,58 @@ # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from datetime import datetime -from odoo import fields +from odoo import Command, fields from odoo.tests import tagged -from odoo.tests.common import TransactionCase + +from odoo.addons.base.tests.common import BaseCommon @tagged("post_install", "-at_install") -class TestStockWarehouseCalendar(TransactionCase): - def setUp(self): - super().setUp() - self.move_obj = self.env["stock.move"] - self.company = self.env.ref("base.main_company") - self.company_partner = self.env.ref("base.main_partner") - self.calendar = self.env.ref("resource.resource_calendar_std") - self.supplier_info = self.env["product.supplierinfo"] - self.PurchaseOrder = self.env["purchase.order"] - self.PurchaseOrderLine = self.env["purchase.order.line"] - self.stock_location = self.env.ref("stock.stock_location_stock") - self.customer_location = self.env.ref("stock.stock_location_customers") - self.picking_type_out = self.env.ref("stock.picking_type_out") - self.route_buy = self.env.ref("purchase_stock.route_warehouse0_buy").id +class TestStockWarehouseCalendar(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.move_obj = cls.env["stock.move"] + cls.company = cls.env.ref("base.main_company") + cls.company_partner = cls.env.ref("base.main_partner") + cls.calendar = cls.env.ref("resource.resource_calendar_std") + cls.supplier_info = cls.env["product.supplierinfo"] + cls.PurchaseOrder = cls.env["purchase.order"] + cls.PurchaseOrderLine = cls.env["purchase.order.line"] + cls.stock_location = cls.env.ref("stock.stock_location_stock") + cls.customer_location = cls.env.ref("stock.stock_location_customers") + cls.picking_type_out = cls.env.ref("stock.picking_type_out") + cls.route_buy = cls.env.ref("purchase_stock.route_warehouse0_buy").id # Create product - self.product = self.env["product.product"].create( + cls.product = cls.env["product.product"].create( { "name": "test product", "default_code": "PRD", "is_storable": True, "route_ids": [ - (4, self.ref("stock.route_warehouse0_mto")), - (4, self.ref("purchase_stock.route_warehouse0_buy")), + Command.set( + [ + cls.env.ref("stock.route_warehouse0_mto").id, + cls.env.ref("purchase_stock.route_warehouse0_buy").id, + ] + ) ], } ) # Partner and Supplierinfo - self.company_partner.write( + cls.company_partner.write( { "delay_calendar_type": "supplier_calendar", - "factory_calendar_id": self.calendar.id, + "factory_calendar_id": cls.calendar.id, } ) - self.seller_01 = self.supplier_info.create( + cls.seller_01 = cls.supplier_info.create( { - "partner_id": self.company_partner.id, - "product_id": self.product.id, - "product_tmpl_id": self.product.product_tmpl_id.id, + "partner_id": cls.company_partner.id, + "product_id": cls.product.id, + "product_tmpl_id": cls.product.product_tmpl_id.id, "delay": 3, } ) @@ -65,7 +71,7 @@ def test_01_purchase_order_with_supplier_calendar(self): customer_move = self.env["stock.move"].create( { - "name": "move out", + "description_picking": "move out", "location_id": self.stock_location.id, "location_dest_id": self.customer_location.id, "product_id": self.product.id, @@ -92,9 +98,7 @@ def test_02_purchase_order_supplier_calendar_global_leaves(self): self.calendar.write( { "global_leave_ids": [ - ( - 0, - False, + Command.create( { "name": "Test", "date_from": "2097-01-14", # Monday