From 13e37bda7c2976e2d00212aca3d51e7b8a065fe7 Mon Sep 17 00:00:00 2001 From: vlst Date: Thu, 13 Apr 2023 08:26:14 +0000 Subject: [PATCH] [IMP] pos_self_order: Allow ordering from web app Currently from the pos_self_order app a customer can only view the menu. This PR adds the option to order items. A customer of the restaurant will now be able to scan a qr code on their table, and navigate to a website where they will be able to order items from the pos. The customer can select product variants and add a specific notes for each of the ordered products. This version does not support online payment. This means that the customer will still have to pay by the usual methods. The pos can be configured such that a customer can add items to an existing order. For example, ordering a second coffee will result in an update of the existing pos order containing the first coffee. Alternatively, the pos can be configured such that each order made from the web app results in a new pos order. Orders made from the self order app will be placed in the same pos session as regular orders. Once a customer orders from the self order app, a new order will appear in the pos app. Thus, a waiter will be able to quickly see all the orders placed by customers from the self order app. He/She will then be able to send the order to the preparation display. This step has to be done manually. In the interest of security, each table now has an associated access token. It is included in url that the customer gets from the qr code. When sending the order, the self order app also sends back to the server this access token. The server will only process the order if it receives a valid access token. When placing an order, the server will respond with the pos_reference and access_token of the created order. The web app will keep this data and will send it back to the server as a proof of ownership in the event that it intends to get the latest state of the order or to update it. The server will only reveal information about an existing order when the request contains a valid pair of pos_reference and access_token. closes odoo/odoo#121029 Task: 3058586 Signed-off-by: Joseph Caburnay (jcb) --- .../views/point_of_sale_dashboard.xml | 4 +- addons/pos_self_order/__manifest__.py | 97 ++-- addons/pos_self_order/controllers/__init__.py | 3 +- .../pos_self_order/controllers/controllers.py | 199 -------- addons/pos_self_order/controllers/ordering.py | 464 ++++++++++++++++++ addons/pos_self_order/controllers/qr_menu.py | 136 +++++ addons/pos_self_order/controllers/utils.py | 51 ++ .../data/restaurant_table_data.xml | 6 + .../demo/pos_restaurant_demo.xml | 17 +- addons/pos_self_order/models/__init__.py | 9 +- addons/pos_self_order/models/ir_http.py | 4 +- addons/pos_self_order/models/pos_config.py | 204 +++++++- addons/pos_self_order/models/pos_order.py | 83 ++++ .../pos_self_order/models/pos_restaurant.py | 66 +++ .../models/pos_self_order_custom_link.py | 12 +- .../pos_self_order/models/product_product.py | 107 ++++ .../models/res_config_settings.py | 59 ++- .../static/img/default_background.jpg | Bin 0 -> 85459 bytes .../IncrementCounter/IncrementCounter.js | 8 + .../IncrementCounter/IncrementCounter.scss | 4 + .../IncrementCounter/IncrementCounter.xml | 14 + .../static/src/Components/Loading/Loading.js | 8 + .../static/src/Components/Loading/Loading.xml | 10 + .../src/Components/MainButton/MainButton.js | 8 + .../src/Components/MainButton/MainButton.xml | 11 + .../src/{ => Components}/NavBar/NavBar.js | 7 +- .../static/src/Components/NavBar/NavBar.scss | 10 + .../static/src/Components/NavBar/NavBar.xml | 18 + .../static/src/Components/Order/Order.js | 15 + .../static/src/Components/Order/Order.xml | 23 + .../src/Components/OrderLines/OrderLines.js | 19 + .../src/Components/OrderLines/OrderLines.xml | 11 + .../Components/PriceDetails/PriceDetails.js | 12 + .../Components/PriceDetails/PriceDetails.xml | 15 + .../src/Components/ProductCard/ProductCard.js | 55 +++ .../Components/ProductCard/ProductCard.scss | 41 ++ .../Components/ProductCard/ProductCard.xml | 59 +++ .../src/Components/TagSelector/TagSelector.js | 32 ++ .../Components/TagSelector/TagSelector.xml | 16 + .../static/src/Hooks/useDetection.js | 93 ++++ .../static/src/Hooks/useScrollDirection.js | 43 ++ .../static/src/NavBar/NavBar.xml | 17 - .../static/src/Pages/CartView/CartView.js | 26 + .../static/src/Pages/CartView/CartView.xml | 21 + .../{ => Pages}/LandingPage/LandingPage.js | 3 +- .../{ => Pages}/LandingPage/LandingPage.xml | 19 +- .../static/src/Pages/OrdersView/OrdersView.js | 16 + .../src/Pages/OrdersView/OrdersView.xml | 16 + .../src/Pages/ProductList/ProductList.js | 121 +++++ .../src/Pages/ProductList/ProductList.xml | 105 ++++ .../Pages/ProductMainView/ProductMainView.js | 97 ++++ .../Pages/ProductMainView/ProductMainView.xml | 125 +++++ .../static/src/ProductList/ProductList.js | 235 --------- .../static/src/ProductList/ProductList.xml | 112 ----- .../src/ProductMainView/ProductMainView.js | 21 - .../src/ProductMainView/ProductMainView.xml | 90 ---- .../static/src/SelfOrderRoot.js | 67 +-- .../static/src/SelfOrderRoot.xml | 10 +- .../static/src/SelfOrderService.js | 394 ++++++++++++++- .../static/src/pos_self_order_styles.scss | 60 +-- addons/pos_self_order/static/src/router.js | 30 +- ...self_order_tour.js => pos_qr_menu_tour.js} | 22 +- .../static/tests/tours/pos_self_order_tour.js | 64 +++ .../static/tests/tours/tour_utils.js | 68 +++ addons/pos_self_order/tests/test_frontend.py | 37 +- .../views/custom_link_views.xml | 2 - .../views/point_of_sale_dashboard.xml | 24 +- addons/pos_self_order/views/qr_code.xml | 50 +- .../views/res_config_settings_views.xml | 17 +- 69 files changed, 2993 insertions(+), 929 deletions(-) delete mode 100644 addons/pos_self_order/controllers/controllers.py create mode 100644 addons/pos_self_order/controllers/ordering.py create mode 100644 addons/pos_self_order/controllers/qr_menu.py create mode 100644 addons/pos_self_order/controllers/utils.py create mode 100644 addons/pos_self_order/data/restaurant_table_data.xml create mode 100644 addons/pos_self_order/models/pos_order.py create mode 100644 addons/pos_self_order/models/pos_restaurant.py create mode 100644 addons/pos_self_order/models/product_product.py create mode 100644 addons/pos_self_order/static/img/default_background.jpg create mode 100644 addons/pos_self_order/static/src/Components/IncrementCounter/IncrementCounter.js create mode 100644 addons/pos_self_order/static/src/Components/IncrementCounter/IncrementCounter.scss create mode 100644 addons/pos_self_order/static/src/Components/IncrementCounter/IncrementCounter.xml create mode 100644 addons/pos_self_order/static/src/Components/Loading/Loading.js create mode 100644 addons/pos_self_order/static/src/Components/Loading/Loading.xml create mode 100644 addons/pos_self_order/static/src/Components/MainButton/MainButton.js create mode 100644 addons/pos_self_order/static/src/Components/MainButton/MainButton.xml rename addons/pos_self_order/static/src/{ => Components}/NavBar/NavBar.js (57%) create mode 100644 addons/pos_self_order/static/src/Components/NavBar/NavBar.scss create mode 100644 addons/pos_self_order/static/src/Components/NavBar/NavBar.xml create mode 100644 addons/pos_self_order/static/src/Components/Order/Order.js create mode 100644 addons/pos_self_order/static/src/Components/Order/Order.xml create mode 100644 addons/pos_self_order/static/src/Components/OrderLines/OrderLines.js create mode 100644 addons/pos_self_order/static/src/Components/OrderLines/OrderLines.xml create mode 100644 addons/pos_self_order/static/src/Components/PriceDetails/PriceDetails.js create mode 100644 addons/pos_self_order/static/src/Components/PriceDetails/PriceDetails.xml create mode 100644 addons/pos_self_order/static/src/Components/ProductCard/ProductCard.js create mode 100644 addons/pos_self_order/static/src/Components/ProductCard/ProductCard.scss create mode 100644 addons/pos_self_order/static/src/Components/ProductCard/ProductCard.xml create mode 100644 addons/pos_self_order/static/src/Components/TagSelector/TagSelector.js create mode 100644 addons/pos_self_order/static/src/Components/TagSelector/TagSelector.xml create mode 100644 addons/pos_self_order/static/src/Hooks/useDetection.js create mode 100644 addons/pos_self_order/static/src/Hooks/useScrollDirection.js delete mode 100644 addons/pos_self_order/static/src/NavBar/NavBar.xml create mode 100644 addons/pos_self_order/static/src/Pages/CartView/CartView.js create mode 100644 addons/pos_self_order/static/src/Pages/CartView/CartView.xml rename addons/pos_self_order/static/src/{ => Pages}/LandingPage/LandingPage.js (85%) rename addons/pos_self_order/static/src/{ => Pages}/LandingPage/LandingPage.xml (81%) create mode 100644 addons/pos_self_order/static/src/Pages/OrdersView/OrdersView.js create mode 100644 addons/pos_self_order/static/src/Pages/OrdersView/OrdersView.xml create mode 100644 addons/pos_self_order/static/src/Pages/ProductList/ProductList.js create mode 100644 addons/pos_self_order/static/src/Pages/ProductList/ProductList.xml create mode 100644 addons/pos_self_order/static/src/Pages/ProductMainView/ProductMainView.js create mode 100644 addons/pos_self_order/static/src/Pages/ProductMainView/ProductMainView.xml delete mode 100644 addons/pos_self_order/static/src/ProductList/ProductList.js delete mode 100644 addons/pos_self_order/static/src/ProductList/ProductList.xml delete mode 100644 addons/pos_self_order/static/src/ProductMainView/ProductMainView.js delete mode 100644 addons/pos_self_order/static/src/ProductMainView/ProductMainView.xml rename addons/pos_self_order/static/tests/tours/{self_order_tour.js => pos_qr_menu_tour.js} (88%) create mode 100644 addons/pos_self_order/static/tests/tours/pos_self_order_tour.js create mode 100644 addons/pos_self_order/static/tests/tours/tour_utils.js diff --git a/addons/point_of_sale/views/point_of_sale_dashboard.xml b/addons/point_of_sale/views/point_of_sale_dashboard.xml index f3b3d973add..bbf9301168e 100644 --- a/addons/point_of_sale/views/point_of_sale_dashboard.xml +++ b/addons/point_of_sale/views/point_of_sale_dashboard.xml @@ -71,7 +71,7 @@