From b81b0951965b5d7200f05a7b6e1a0717a7005bc6 Mon Sep 17 00:00:00 2001 From: Ernesto Tejeda Date: Wed, 23 Sep 2020 16:18:11 -0400 Subject: [PATCH 01/21] [ADD] website_sale_stock_provisioning_date: new module. Show the future provisioning date closest to the current date for a product in the eCommerce. --- .../README.rst | 101 ++++ .../__init__.py | 2 + .../__manifest__.py | 21 + .../i18n/es.po | 55 +++ .../website_sale_stock_provisioning_date.pot | 44 ++ .../models/__init__.py | 3 + .../models/product_product.py | 23 + .../models/product_template.py | 41 ++ .../readme/CONTRIBUTORS.rst | 5 + .../readme/DESCRIPTION.rst | 4 + .../readme/USAGE.rst | 17 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 447 ++++++++++++++++++ .../website_sale_stock_provisioning_date.js | 15 + ...bsite_sale_stock_provisioning_date_tour.js | 39 ++ ...ebsite_sale_stock_product_availability.xml | 16 + .../tests/__init__.py | 2 + ...st_website_sale_stock_provisioning_date.py | 51 ++ .../views/assets.xml | 13 + .../views/product_template_views.xml | 14 + 20 files changed, 913 insertions(+) create mode 100644 website_sale_stock_provisioning_date/README.rst create mode 100644 website_sale_stock_provisioning_date/__init__.py create mode 100644 website_sale_stock_provisioning_date/__manifest__.py create mode 100644 website_sale_stock_provisioning_date/i18n/es.po create mode 100644 website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot create mode 100644 website_sale_stock_provisioning_date/models/__init__.py create mode 100644 website_sale_stock_provisioning_date/models/product_product.py create mode 100644 website_sale_stock_provisioning_date/models/product_template.py create mode 100644 website_sale_stock_provisioning_date/readme/CONTRIBUTORS.rst create mode 100644 website_sale_stock_provisioning_date/readme/DESCRIPTION.rst create mode 100644 website_sale_stock_provisioning_date/readme/USAGE.rst create mode 100644 website_sale_stock_provisioning_date/static/description/icon.png create mode 100644 website_sale_stock_provisioning_date/static/description/index.html create mode 100644 website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js create mode 100644 website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js create mode 100644 website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml create mode 100644 website_sale_stock_provisioning_date/tests/__init__.py create mode 100644 website_sale_stock_provisioning_date/tests/test_website_sale_stock_provisioning_date.py create mode 100644 website_sale_stock_provisioning_date/views/assets.xml create mode 100644 website_sale_stock_provisioning_date/views/product_template_views.xml diff --git a/website_sale_stock_provisioning_date/README.rst b/website_sale_stock_provisioning_date/README.rst new file mode 100644 index 0000000000..f90bab17af --- /dev/null +++ b/website_sale_stock_provisioning_date/README.rst @@ -0,0 +1,101 @@ +==================================== +Website Sale Stock Provisioning Date +==================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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%2Fe--commerce-lightgray.png?logo=github + :target: https://github.com/OCA/e-commerce/tree/12.0/website_sale_stock_provisioning_date + :alt: OCA/e-commerce +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/e-commerce-12-0/e-commerce-12-0-website_sale_stock_provisioning_date + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/113/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the functionality of website to show you the +future provisioning date closest to the current date for a product +in the eCommerce. + + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +#. Go to *Sales > Products > Products*, create a new product or edit an + existing one. +#. Check 'Show Next Provisioning Date' field under eCommerce tab. +#. Go to Website Shop. +#. Click on a product that have 'Show Next Provisioning Date' checked. +#. If it is true for that product that + `'quantity on hand' - 'outgoing quantity' <= 0`, + then you will see the future provisioning date closest to + the current date for this product under the 'Add to Cart' button + (If there is such a date). + +Note: The closest future provisioning date is the date of the future +stock movement and the closest to the current date. This can be +generated after confirming a purchase order to receive the product on +a date after the current date. + +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 +~~~~~~~ + +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* `Tecnativa `_: + + * Ernesto Tejeda + * Pedro M. Baeza + * Sergio Teruel + +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. + +This module is part of the `OCA/e-commerce `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/website_sale_stock_provisioning_date/__init__.py b/website_sale_stock_provisioning_date/__init__.py new file mode 100644 index 0000000000..3275ac2adf --- /dev/null +++ b/website_sale_stock_provisioning_date/__init__.py @@ -0,0 +1,2 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import models diff --git a/website_sale_stock_provisioning_date/__manifest__.py b/website_sale_stock_provisioning_date/__manifest__.py new file mode 100644 index 0000000000..1404b23d34 --- /dev/null +++ b/website_sale_stock_provisioning_date/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright 2020 Tecnativa - Ernesto Tejeda +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + 'name': 'Website Sale Stock Provisioning Date', + 'summary': 'Display provisioning date for a product in shop online', + 'version': '12.0.1.0.0', + 'development_status': 'Beta', + 'category': 'Website', + 'website': 'https://github.com/OCA/e-commerce', + 'author': 'Tecnativa, Odoo Community Association (OCA)', + 'license': 'AGPL-3', + 'application': False, + 'installable': True, + 'depends': [ + 'website_sale_stock', + ], + 'data': [ + 'views/assets.xml', + 'views/product_template_views.xml', + ], +} diff --git a/website_sale_stock_provisioning_date/i18n/es.po b/website_sale_stock_provisioning_date/i18n/es.po new file mode 100644 index 0000000000..ef2bb4b338 --- /dev/null +++ b/website_sale_stock_provisioning_date/i18n/es.po @@ -0,0 +1,55 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * website_sale_stock_provisioning_date +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-23 20:14+0000\n" +"PO-Revision-Date: 2020-09-23 16:17-0400\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"X-Generator: Poedit 2.0.6\n" + +#. module: website_sale_stock_provisioning_date +#. openerp-web +#: code:addons/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml:10 +#, python-format +msgid "Next provisioning date:" +msgstr "Fecha de aprovisionamiento:" + +#. module: website_sale_stock_provisioning_date +#: model:ir.model,name:website_sale_stock_provisioning_date.model_product_product +msgid "Product" +msgstr "Producto" + +#. module: website_sale_stock_provisioning_date +#: model:ir.model,name:website_sale_stock_provisioning_date.model_product_template +msgid "Product Template" +msgstr "Plantilla de producto" + +#. module: website_sale_stock_provisioning_date +#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_product__show_next_provisioning_date +#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_template__show_next_provisioning_date +msgid "Show Next Provisioning Date" +msgstr "Mostrar fecha de aprovisionamiento" + +#. module: website_sale_stock_provisioning_date +#: model:ir.model.fields,help:website_sale_stock_provisioning_date.field_product_product__show_next_provisioning_date +#: model:ir.model.fields,help:website_sale_stock_provisioning_date.field_product_template__show_next_provisioning_date +msgid "" +"Shows the next provisioning date in the website shop if the product is out " +"of stock. This option may not make sense if you don't select an " +"'Availability' option that shows the inventory of the product in the website " +"shop." +msgstr "" +"Muestra en la tienda online la fecha de aprovisionamiento prevista si el " +"producto está sin existencias. Esta opción puede no tener sentido si usted " +"no selecciona una opción de disponibilidad que muestre el inventario del " +"producto en la tienda online." diff --git a/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot b/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot new file mode 100644 index 0000000000..53e5ae50f9 --- /dev/null +++ b/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot @@ -0,0 +1,44 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * website_sale_stock_provisioning_date +# +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: website_sale_stock_provisioning_date +#. openerp-web +#: code:addons/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml:10 +#, python-format +msgid "Next provisioning date:" +msgstr "" + +#. module: website_sale_stock_provisioning_date +#: model:ir.model,name:website_sale_stock_provisioning_date.model_product_product +msgid "Product" +msgstr "" + +#. module: website_sale_stock_provisioning_date +#: model:ir.model,name:website_sale_stock_provisioning_date.model_product_template +msgid "Product Template" +msgstr "" + +#. module: website_sale_stock_provisioning_date +#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_product__show_next_provisioning_date +#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_template__show_next_provisioning_date +msgid "Show Next Provisioning Date" +msgstr "" + +#. module: website_sale_stock_provisioning_date +#: model:ir.model.fields,help:website_sale_stock_provisioning_date.field_product_product__show_next_provisioning_date +#: model:ir.model.fields,help:website_sale_stock_provisioning_date.field_product_template__show_next_provisioning_date +msgid "Shows the next provisioning date in the website shop if the product is out of stock. This option may not make sense if you don't select an 'Availability' option that shows the inventory of the product in the website shop." +msgstr "" + diff --git a/website_sale_stock_provisioning_date/models/__init__.py b/website_sale_stock_provisioning_date/models/__init__.py new file mode 100644 index 0000000000..4218bd2646 --- /dev/null +++ b/website_sale_stock_provisioning_date/models/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import product_product +from . import product_template diff --git a/website_sale_stock_provisioning_date/models/product_product.py b/website_sale_stock_provisioning_date/models/product_product.py new file mode 100644 index 0000000000..24f9a834cb --- /dev/null +++ b/website_sale_stock_provisioning_date/models/product_product.py @@ -0,0 +1,23 @@ +# Copyright 2019 Tecnativa - Ernesto Tejeda +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ProductProduct(models.Model): + _inherit = 'product.product' + + def _get_next_provisioning_date(self): + domain = [ + ("company_id", "=", self.env.user.company_id.id), + ("product_id", "in", self.ids), + ("state", "not in", ["draft", "done", "cancel"]), + ("location_id.usage", "=", "supplier"), + ("location_dest_id.usage", "=", "internal"), + ("date_expected", ">=", fields.Datetime.now()), + ] + move = ( + self.env["stock.move"] + .sudo() + .search(domain, order="date_expected", limit=1) + ) + return move and move.date_expected.date() or False diff --git a/website_sale_stock_provisioning_date/models/product_template.py b/website_sale_stock_provisioning_date/models/product_template.py new file mode 100644 index 0000000000..5f5adbc955 --- /dev/null +++ b/website_sale_stock_provisioning_date/models/product_template.py @@ -0,0 +1,41 @@ +# Copyright 2019 Tecnativa - Ernesto Tejeda +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + show_next_provisioning_date = fields.Boolean( + help="Shows the next provisioning date in the website shop " + "if the product is out of stock. This option may not make " + "sense if you don't select an 'Availability' option that " + "shows the inventory of the product in the website shop." + ) + + def _get_next_provisioning_date(self): + return self.product_variant_ids._get_next_provisioning_date() + + @api.multi + def _get_combination_info(self, combination=False, product_id=False, + add_qty=1, pricelist=False, + parent_combination=False, only_template=False): + combination_info = super()._get_combination_info( + combination=combination, + product_id=product_id, + add_qty=add_qty, + pricelist=pricelist, + parent_combination=parent_combination, + only_template=only_template, + ) + if combination_info['product_id']: + product = self.env['product.product'].sudo().browse( + combination_info['product_id']) + else: + product = self.sudo() + provisioning_date = False + if (product.show_next_provisioning_date + and product.qty_available - product.outgoing_qty <= 0): + provisioning_date = product._get_next_provisioning_date() + combination_info.update(provisioning_date=provisioning_date) + return combination_info diff --git a/website_sale_stock_provisioning_date/readme/CONTRIBUTORS.rst b/website_sale_stock_provisioning_date/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..0c71102569 --- /dev/null +++ b/website_sale_stock_provisioning_date/readme/CONTRIBUTORS.rst @@ -0,0 +1,5 @@ +* `Tecnativa `_: + + * Ernesto Tejeda + * Pedro M. Baeza + * Sergio Teruel diff --git a/website_sale_stock_provisioning_date/readme/DESCRIPTION.rst b/website_sale_stock_provisioning_date/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..6e0e80d192 --- /dev/null +++ b/website_sale_stock_provisioning_date/readme/DESCRIPTION.rst @@ -0,0 +1,4 @@ +This module extends the functionality of website to show you the +future provisioning date closest to the current date for a product +in the eCommerce. + diff --git a/website_sale_stock_provisioning_date/readme/USAGE.rst b/website_sale_stock_provisioning_date/readme/USAGE.rst new file mode 100644 index 0000000000..ba38632717 --- /dev/null +++ b/website_sale_stock_provisioning_date/readme/USAGE.rst @@ -0,0 +1,17 @@ +To use this module, you need to: + +#. Go to *Sales > Products > Products*, create a new product or edit an + existing one. +#. Check 'Show Next Provisioning Date' field under eCommerce tab. +#. Go to Website Shop. +#. Click on a product that have 'Show Next Provisioning Date' checked. +#. If it is true for that product that + `'quantity on hand' - 'outgoing quantity' <= 0`, + then you will see the future provisioning date closest to + the current date for this product under the 'Add to Cart' button + (If there is such a date). + +Note: The closest future provisioning date is the date of the future +stock movement and the closest to the current date. This can be +generated after confirming a purchase order to receive the product on +a date after the current date. diff --git a/website_sale_stock_provisioning_date/static/description/icon.png b/website_sale_stock_provisioning_date/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/website_sale_stock_provisioning_date/static/description/index.html b/website_sale_stock_provisioning_date/static/description/index.html new file mode 100644 index 0000000000..8275f9e2c9 --- /dev/null +++ b/website_sale_stock_provisioning_date/static/description/index.html @@ -0,0 +1,447 @@ + + + + + + +Website Sale Stock Provisioning Date + + + +
+

Website Sale Stock Provisioning Date

+ + +

Beta License: AGPL-3 OCA/e-commerce Translate me on Weblate Try me on Runbot

+

This module extends the functionality of website to show you the +future provisioning date closest to the current date for a product +in the eCommerce.

+

Table of contents

+ +
+

Usage

+

To use this module, you need to:

+
    +
  1. Go to Sales > Products > Products, create a new product or edit an +existing one.
  2. +
  3. Check ‘Show Next Provisioning Date’ field under eCommerce tab.
  4. +
  5. Go to Website Shop.
  6. +
  7. Click on a product that have ‘Show Next Provisioning Date’ checked.
  8. +
  9. If it is true for that product that +‘quantity on hand’ - ‘outgoing quantity’ <= 0, +then you will see the future provisioning date closest to +the current date for this product under the ‘Add to Cart’ button +(If there is such a date).
  10. +
+

Note: The closest future provisioning date is the date of the future +stock movement and the closest to the current date. This can be +generated after confirming a purchase order to receive the product on +a date after the current date.

+
+
+

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

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+
    +
  • Tecnativa:
      +
    • Ernesto Tejeda
    • +
    • Pedro M. Baeza
    • +
    • Sergio Teruel
    • +
    +
  • +
+
+
+

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.

+

This module is part of the OCA/e-commerce project on GitHub.

+

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

+
+
+
+ + diff --git a/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js new file mode 100644 index 0000000000..b5c0c25928 --- /dev/null +++ b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js @@ -0,0 +1,15 @@ +/* Copyright 2020 Tecnativa - Ernesto Tejeda + * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ +odoo.define('website_sale_stock_provisioning_date.load', function (require) { + 'use strict'; + var ajax = require('web.ajax'); + var core = require('web.core'); + var QWeb = core.qweb; + var load_xml = ajax.loadXML( + '/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml', + QWeb + ); + load_xml.then(function() { + $('.oe_website_sale').find('input[name="add_qty"]').trigger('change'); + }); +}); diff --git a/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js new file mode 100644 index 0000000000..55561944b0 --- /dev/null +++ b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js @@ -0,0 +1,39 @@ +/* Copyright 2020 Tecnativa - Ernesto Tejeda + * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ +odoo.define("website_sale_stock_provisioning_date.tour", function (require) { + "use strict"; + + var tour = require("web_tour.tour"); + var base = require("web_editor.base"); + + var steps = [ + { + content: "search provisioning date", + trigger: 'form input[name="search"]', + run: "text provisioning date", + }, + { + content: "search provisioning date", + trigger: 'form:has(input[name="search"]) .oe_search_button', + }, + { + content: "click on product test", + trigger: '.oe_product_cart a:contains("provisioning date")', + }, + { + trigger: "a#add_to_cart", + extra_trigger: ".availability_messages:has(span:contains('Next provisioning date:'))", + }, + ]; + tour.register("website_sale_stock_provisioning_date", + { + url: "/shop", + test: true, + wait_for: base.ready(), + }, + steps + ); + return { + steps: steps, + }; +}); diff --git a/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml b/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml new file mode 100644 index 0000000000..36dc818de2 --- /dev/null +++ b/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml @@ -0,0 +1,16 @@ + + + + + + +
+ + Next provisioning date: + +
+
+
+
diff --git a/website_sale_stock_provisioning_date/tests/__init__.py b/website_sale_stock_provisioning_date/tests/__init__.py new file mode 100644 index 0000000000..871b1f4cdc --- /dev/null +++ b/website_sale_stock_provisioning_date/tests/__init__.py @@ -0,0 +1,2 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import test_website_sale_stock_provisioning_date diff --git a/website_sale_stock_provisioning_date/tests/test_website_sale_stock_provisioning_date.py b/website_sale_stock_provisioning_date/tests/test_website_sale_stock_provisioning_date.py new file mode 100644 index 0000000000..84b7cd1bdf --- /dev/null +++ b/website_sale_stock_provisioning_date/tests/test_website_sale_stock_provisioning_date.py @@ -0,0 +1,51 @@ +# Copyright 2020 Tecnativa - Ernesto Tejeda +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from datetime import datetime, timedelta +from odoo.tests.common import Form, HttpCase + + +class WebsiteSaleStockProvisioningDate(HttpCase): + + def setUp(self): + super().setUp() + product = self.env['product.product'].create({ + 'name': 'product test - provisioning date', + 'type': 'product', + 'website_published': True, + 'show_next_provisioning_date': True, + }) + incoming_picking_type = self.env['stock.picking.type'].search( + [ + ('code', '=', 'incoming'), + '|', + ('warehouse_id.company_id', '=', self.env.user.company_id.id), + ('warehouse_id', '=', False) + ], + limit=1, + ) + picking_form = Form( + recordp=self.env['stock.picking'].with_context( + default_picking_type_id=incoming_picking_type.id), + view="stock.view_picking_form", + ) + with picking_form.move_ids_without_package.new() as move: + move.product_id = product + move.product_uom_qty = 10 + picking = picking_form.save() + picking_form = Form(picking) + picking_form.scheduled_date = datetime.now() + timedelta(days=2) + picking = picking_form.save() + picking.action_confirm() + + def test_ui_website(self): + """Test frontend tour.""" + tour = ( + "odoo.__DEBUG__.services['web_tour.tour']", + "website_sale_stock_provisioning_date", + ) + self.browser_js( + url_path="/shop", + code="%s.run('%s')" % tour, + ready="%s.tours['%s'].ready" % tour, + login="admin" + ) diff --git a/website_sale_stock_provisioning_date/views/assets.xml b/website_sale_stock_provisioning_date/views/assets.xml new file mode 100644 index 0000000000..4ad4cd6ac7 --- /dev/null +++ b/website_sale_stock_provisioning_date/views/assets.xml @@ -0,0 +1,13 @@ + + + +