diff --git a/pos_order_to_sale_order/README.rst b/pos_order_to_sale_order/README.rst index 140e553225..4c3c7ac289 100644 --- a/pos_order_to_sale_order/README.rst +++ b/pos_order_to_sale_order/README.rst @@ -117,6 +117,10 @@ Contributors * Sylvain LE GAL (https://www.twitter.com/legalsylvain) +* `Binhex `_: + + * Adasat Torres de León + Maintainers ~~~~~~~~~~~ diff --git a/pos_order_to_sale_order/__manifest__.py b/pos_order_to_sale_order/__manifest__.py index ef2b7760a0..9a354ea821 100644 --- a/pos_order_to_sale_order/__manifest__.py +++ b/pos_order_to_sale_order/__manifest__.py @@ -15,11 +15,9 @@ "data": ["views/view_res_config_settings.xml"], "assets": { "point_of_sale.assets": [ - "pos_order_to_sale_order/static/src/css/pos.css", - "pos_order_to_sale_order/static/src/js/CreateOrderButton.js", - "pos_order_to_sale_order/static/src/js/CreateOrderPopup.js", - "pos_order_to_sale_order/static/src/xml/CreateOrderButton.xml", - "pos_order_to_sale_order/static/src/xml/CreateOrderPopup.xml", + "pos_order_to_sale_order/static/src/css/**.css", + "pos_order_to_sale_order/static/src/xml/**.xml", + "pos_order_to_sale_order/static/src/js/**.js", ], "web.assets_tests": [ "pos_order_to_sale_order/static/tests/**/*.js", diff --git a/pos_order_to_sale_order/models/pos_config.py b/pos_order_to_sale_order/models/pos_config.py index 4550447489..9a55380a69 100644 --- a/pos_order_to_sale_order/models/pos_config.py +++ b/pos_order_to_sale_order/models/pos_config.py @@ -47,6 +47,13 @@ class PosConfig(models.Model): " Only invoice payment process will be possible.", ) + iface_sale_order_allow_commitment_date = fields.Boolean( + string="Allow Add Commitment Date", + default=True, + help="If checked, the cashier will have the possibility to add" + " a commitment date on the sale order.", + ) + @api.depends( "iface_create_draft_sale_order", "iface_create_confirmed_sale_order", diff --git a/pos_order_to_sale_order/models/res_config_settings.py b/pos_order_to_sale_order/models/res_config_settings.py index e2c50a278f..b78faa5cde 100644 --- a/pos_order_to_sale_order/models/res_config_settings.py +++ b/pos_order_to_sale_order/models/res_config_settings.py @@ -23,3 +23,7 @@ class ResConfigSettings(models.TransientModel): pos_iface_create_invoiced_sale_order = fields.Boolean( related="pos_config_id.iface_create_invoiced_sale_order", readonly=False ) + + iface_sale_order_allow_commitment_date = fields.Boolean( + related="pos_config_id.iface_sale_order_allow_commitment_date", readonly=False + ) diff --git a/pos_order_to_sale_order/models/sale_order.py b/pos_order_to_sale_order/models/sale_order.py index 8ba87fc24c..700f7c4f1f 100644 --- a/pos_order_to_sale_order/models/sale_order.py +++ b/pos_order_to_sale_order/models/sale_order.py @@ -2,6 +2,8 @@ # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from datetime import datetime + from odoo import Command, _, api, models @@ -17,6 +19,12 @@ def _prepare_from_pos(self, order_data): Command.create(SaleOrderLine._prepare_from_pos(sequence, line_data[2])) for sequence, line_data in enumerate(order_data["lines"], start=1) ] + if order_data.get("commitment_date", False): + commitment_date = datetime.strptime( + order_data["commitment_date"], "%Y-%m-%dT%H:%M:%S.%fZ" + ) + else: + commitment_date = False return { "partner_id": order_data["partner_id"], "origin": _("Point of Sale %s") % (session.name), @@ -24,6 +32,7 @@ def _prepare_from_pos(self, order_data): "user_id": order_data["user_id"], "pricelist_id": order_data["pricelist_id"], "fiscal_position_id": order_data["fiscal_position_id"], + "commitment_date": commitment_date, "order_line": order_lines, } diff --git a/pos_order_to_sale_order/readme/CONTRIBUTORS.rst b/pos_order_to_sale_order/readme/CONTRIBUTORS.rst index e1525ce042..a4e025738a 100644 --- a/pos_order_to_sale_order/readme/CONTRIBUTORS.rst +++ b/pos_order_to_sale_order/readme/CONTRIBUTORS.rst @@ -1 +1,5 @@ * Sylvain LE GAL (https://www.twitter.com/legalsylvain) + +* `Binhex `_: + + * Adasat Torres de León diff --git a/pos_order_to_sale_order/static/description/index.html b/pos_order_to_sale_order/static/description/index.html index a2be2e5d81..53d1b979df 100644 --- a/pos_order_to_sale_order/static/description/index.html +++ b/pos_order_to_sale_order/static/description/index.html @@ -464,6 +464,10 @@

Authors

Contributors

diff --git a/pos_order_to_sale_order/static/src/js/CreateOrderPopup.js b/pos_order_to_sale_order/static/src/js/CreateOrderPopup.js index 3b8a6afc52..aadf827c49 100644 --- a/pos_order_to_sale_order/static/src/js/CreateOrderPopup.js +++ b/pos_order_to_sale_order/static/src/js/CreateOrderPopup.js @@ -4,13 +4,20 @@ odoo.define("point_of_sale.CreateOrderPopup", function (require) { const AbstractAwaitablePopup = require("point_of_sale.AbstractAwaitablePopup"); const Registries = require("point_of_sale.Registries"); const framework = require("web.framework"); - class CreateOrderPopup extends AbstractAwaitablePopup { setup() { super.setup(); this.createOrderClicked = false; } + get currentOrder() { + return this.env.pos.get_order(); + } + + async updateCommitmentDate(ev) { + await this.currentOrder.set_commitment_date(ev.target.value); + } + async createDraftSaleOrder() { await this._actionCreateSaleOrder("draft"); } @@ -30,10 +37,8 @@ odoo.define("point_of_sale.CreateOrderPopup", function (require) { async _actionCreateSaleOrder(order_state) { // Create Sale Order await this._createSaleOrder(order_state); - // Delete current order - const current_order = this.env.pos.get_order(); - this.env.pos.removeOrder(current_order); + this.env.pos.removeOrder(this.currentOrder); this.env.pos.add_new_order(); // Close popup @@ -41,13 +46,12 @@ odoo.define("point_of_sale.CreateOrderPopup", function (require) { } async _createSaleOrder(order_state) { - const current_order = this.env.pos.get_order(); framework.blockUI(); return await this.env.services .rpc({ model: "sale.order", method: "create_order_from_pos", - args: [current_order.export_as_JSON(), order_state], + args: [this.currentOrder.export_as_JSON(), order_state], }) .catch(function (error) { throw error; diff --git a/pos_order_to_sale_order/static/src/js/models.esm.js b/pos_order_to_sale_order/static/src/js/models.esm.js new file mode 100644 index 0000000000..fe6eb9ada4 --- /dev/null +++ b/pos_order_to_sale_order/static/src/js/models.esm.js @@ -0,0 +1,35 @@ +/** @odoo-module **/ + +import {Order} from "point_of_sale.models"; +import Registries from "point_of_sale.Registries"; + +const PosOrderToSaleOrderCommitmentDate = (OriginalOrder) => + class extends OriginalOrder { + constructor() { + super(...arguments); + this.commitment_date = false; + } + get_commitment_date() { + return this.commitment_date; + } + set_commitment_date(commitment_date) { + if (!commitment_date) { + this.commitment_date = false; + } else { + this.commitment_date = new Date(commitment_date).toISOString(); + } + } + export_as_JSON() { + const result = super.export_as_JSON(...arguments); + result.commitment_date = this.get_commitment_date(); + return result; + } + init_from_JSON(json) { + super.init_from_JSON(...arguments); + this.set_commitment_date(json.commitment_date || false); + } + }; + +Registries.Model.extend(Order, PosOrderToSaleOrderCommitmentDate); + +export default PosOrderToSaleOrderCommitmentDate; diff --git a/pos_order_to_sale_order/static/src/xml/CreateOrderPopup.xml b/pos_order_to_sale_order/static/src/xml/CreateOrderPopup.xml index dd2e74fe02..62a548df5b 100644 --- a/pos_order_to_sale_order/static/src/xml/CreateOrderPopup.xml +++ b/pos_order_to_sale_order/static/src/xml/CreateOrderPopup.xml @@ -1,17 +1,33 @@ - - diff --git a/pos_order_to_sale_order/static/tests/tours/PosOrderToSaleOrderTour.esm.js b/pos_order_to_sale_order/static/tests/tours/PosOrderToSaleOrderTour.esm.js index 2d8643baaa..89e88ed331 100644 --- a/pos_order_to_sale_order/static/tests/tours/PosOrderToSaleOrderTour.esm.js +++ b/pos_order_to_sale_order/static/tests/tours/PosOrderToSaleOrderTour.esm.js @@ -28,6 +28,7 @@ ProductScreen.do.clickPartnerButton(); ProductScreen.do.clickCustomer("Addison Olson"); PosOrderToSaleOrder.do.clickCreateOrderButton(); +PosOrderToSaleOrder.do.addCommitmentDate(); PosOrderToSaleOrder.do.clickCreateInvoicedOrderButton(); ProductScreen.check.isShown(); diff --git a/pos_order_to_sale_order/static/tests/tours/helpers/PosOrderToSaleOrderMethods.esm.js b/pos_order_to_sale_order/static/tests/tours/helpers/PosOrderToSaleOrderMethods.esm.js index 79adb560f8..29689d7487 100644 --- a/pos_order_to_sale_order/static/tests/tours/helpers/PosOrderToSaleOrderMethods.esm.js +++ b/pos_order_to_sale_order/static/tests/tours/helpers/PosOrderToSaleOrderMethods.esm.js @@ -32,6 +32,19 @@ class DoExt extends Do { }, ]; } + addCommitmentDate() { + return [ + { + content: "Add Commitment Date", + trigger: ".popup-create-sale-order input[name='commitment_date']", + run: () => { + this.trigger("input", { + target: {value: "2024-01-01T16:00:00"}, + }); + }, + }, + ]; + } } const methods = createTourMethods("PosOrderToSaleOrder", DoExt); diff --git a/pos_order_to_sale_order/tests/test_module.py b/pos_order_to_sale_order/tests/test_module.py index f28b61cb39..f000fcbc88 100644 --- a/pos_order_to_sale_order/tests/test_module.py +++ b/pos_order_to_sale_order/tests/test_module.py @@ -62,3 +62,10 @@ def test_pos_order_to_sale_order(self): order.order_line[1].name, "'Product Note' must not contains in sale order line description", ) + self.assertTrue( + order.commitment_date, + ) + self.assertEqual( + order.commitment_date.strftime("%Y-%m-%d %H:%M:%S"), + "2024-01-01 16:00:00", + ) diff --git a/pos_order_to_sale_order/views/view_res_config_settings.xml b/pos_order_to_sale_order/views/view_res_config_settings.xml index 8558ce7735..d70a749fa4 100644 --- a/pos_order_to_sale_order/views/view_res_config_settings.xml +++ b/pos_order_to_sale_order/views/view_res_config_settings.xml @@ -1,13 +1,10 @@ - res.config.settings - -

Sale Order Creation

@@ -18,7 +15,6 @@
-
@@ -27,7 +23,6 @@
-
@@ -36,7 +31,6 @@
-
@@ -45,6 +39,14 @@
+
+
+ +
+
+
+