diff --git a/pos_order_to_sale_order/README.rst b/pos_order_to_sale_order/README.rst index 219b0216..03c108e3 100644 --- a/pos_order_to_sale_order/README.rst +++ b/pos_order_to_sale_order/README.rst @@ -6,154 +6,3 @@ PoS Order To Sale Order !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png - :target: https://odoo-community.org/page/development-status - :alt: Production/Stable -.. |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%2Fpos-lightgray.png?logo=github - :target: https://github.com/OCA/pos/tree/8.0/pos_order_to_sale_order - :alt: OCA/pos -.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/pos-8-0/pos-8-0-pos_order_to_sale_order - :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/184/8.0 - :alt: Try me on Runbot - -|badge1| |badge2| |badge3| |badge4| |badge5| - -This module extends the functionality of point of sale to allow sale orders -creation from the Point of Sale. - - -In the POS UI, buttons has been added to create a sale order and discard -the current POS order. - -This module is usefull in many cases, for exemple : - -* take orders with a very simple interface - -* if you have some customers that come every day in your shop, but want to - have a unique invoice at the end of the month. With that module, you can - create a sale order and deliver products every time to keep your stock value - correct, and to create a unique invoice, when you want. - - -Three options are available: - -* **Create a draft Order** - A new sale order in a draft mode will be created that can be changed later. - -.. figure:: https://raw.githubusercontent.com/OCA/pos/8.0/pos_order_to_sale_order/static/description/pos_create_picking_option_1.png - :width: 800 px - -* **Create a Confirmed Order** - A new sale order will be created and confirmed. - -.. figure:: https://raw.githubusercontent.com/OCA/pos/8.0/pos_order_to_sale_order/static/description/pos_create_picking_option_2.png - :width: 800 px - -* **Create Delivered Picking** (by default) - A new sale order will be created and confirmed. the associated picking - will be marked as delivered. - -.. figure:: https://raw.githubusercontent.com/OCA/pos/8.0/pos_order_to_sale_order/static/description/pos_create_picking_option_3.png - :width: 800 px - - -**Technical Notes** - -* Some hooks are defined in the JS file, to define custom behaviour after - having created the sale order (and the stock picking). - -* Some prepare functions are available in the sale.order model, to overload - the creation of the sale order. - -* You could be interested by another module, pos_sale_order, that completely - alter Point of Sale module, avoiding creating Pos Orders, and creating - allways Sale Orders. - This module is a WIP state, and is available here: - https://github.com/OCA/pos/pull/35 - -**Table of contents** - -.. contents:: - :local: - -Configuration -============= - -To configure this module, you need to: - -* Go to Point Of Sale / Configuration / Point of Sale -* Check the box 'Create Sale Orders' -* Select the desired default behaviour - -.. figure:: https://raw.githubusercontent.com/OCA/pos/8.0/pos_order_to_sale_order/static/description/pos_config_form.png - :width: 800 px - -Known issues / Roadmap -====================== - -* Because of the poor design of the Odoo Point of Sale, some basic features - are not available by default, like pricelist, fiscal position, etc ... - For that reason, unit price will be recomputed by default, when creating the - sale order, and the unit price of the current bill will not be used. - -Note that this problem is fixed if ``pos_pricelist`` is installed. -(same repository) In that cases, the pricelist, the unit prices and the taxes -will be the same in the order, as in the displayed bill. - -.. figure:: https://raw.githubusercontent.com/OCA/pos/8.0/pos_order_to_sale_order/static/description/pos_create_picking_confirm.png - :width: 800 px - -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 -~~~~~~~ - -* GRAP - -Contributors -~~~~~~~~~~~~ - -* Sylvain LE GAL (https://www.twitter.com/legalsylvain) - -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-legalsylvain| image:: https://github.com/legalsylvain.png?size=40px - :target: https://github.com/legalsylvain - :alt: legalsylvain - -Current `maintainer `__: - -|maintainer-legalsylvain| - -This module is part of the `OCA/pos `_ project on GitHub. - -You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/pos_order_to_sale_order/__init__.py b/pos_order_to_sale_order/__init__.py index a0fdc10f..0650744f 100644 --- a/pos_order_to_sale_order/__init__.py +++ b/pos_order_to_sale_order/__init__.py @@ -1,2 +1 @@ -# -*- coding: utf-8 -*- from . import models diff --git a/pos_order_to_sale_order/__openerp__.py b/pos_order_to_sale_order/__manifest__.py similarity index 63% rename from pos_order_to_sale_order/__openerp__.py rename to pos_order_to_sale_order/__manifest__.py index 98a2d7da..26bb8aa2 100644 --- a/pos_order_to_sale_order/__openerp__.py +++ b/pos_order_to_sale_order/__manifest__.py @@ -1,22 +1,20 @@ -# -*- coding: utf-8 -*- # Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { "name": "PoS Order To Sale Order", - "version": "8.0.3.0.0", + "version": "12.0.1.0.0", "author": "GRAP,Odoo Community Association (OCA)", "category": "Point Of Sale", "license": "AGPL-3", - "depends": ["point_of_sale",], + "depends": ["point_of_sale"], "maintainers": ["legalsylvain"], "development_status": "Production/Stable", - "website": "https://odoo-community.org/", + "website": "https://github.com/OCA/pos", "data": [ "views/view_pos_config.xml", - "views/pos_order_to_sale_order.xml", + "views/assets.xml", ], - "demo": ["demo/res_groups.xml",], - "qweb": ["static/src/xml/pos_order_to_sale_order.xml",], + "qweb": ["static/src/xml/pos_order_to_sale_order.xml"], } diff --git a/pos_order_to_sale_order/demo/res_groups.xml b/pos_order_to_sale_order/demo/res_groups.xml deleted file mode 100644 index 158b505f..00000000 --- a/pos_order_to_sale_order/demo/res_groups.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/pos_order_to_sale_order/i18n/fr.po b/pos_order_to_sale_order/i18n/fr.po index aeae042e..782e0889 100644 --- a/pos_order_to_sale_order/i18n/fr.po +++ b/pos_order_to_sale_order/i18n/fr.po @@ -1,16 +1,15 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * pos_order_to_sale_order +# * pos_order_to_sale_order # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 8.0\n" +"Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-23 15:48+0000\n" -"PO-Revision-Date: 2018-03-23 15:48+0000\n" +"POT-Creation-Date: 2020-01-19 23:40+0000\n" +"PO-Revision-Date: 2020-01-19 23:40+0000\n" "Last-Translator: <>\n" "Language-Team: \n" -"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" @@ -18,106 +17,83 @@ msgstr "" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:56 +#: code:addons/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml:15 #, python-format -msgid "" -"\n" -"Note if you have manually changed unit prices for some products, this " -"changes will not been taken into account in the sale order." -msgstr "" -"\n" -"Remarque : si vous aviez changé le prix unitaire de certains produits, ces " -"changements ne seront pas pris en compte dans la vente." +msgid "Back" +msgstr "Retour" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:151 +#: code:addons/pos_order_to_sale_order/static/src/js/screens.js:148 #, python-format msgid "Check your internet connection and try again." msgstr "Veuillez vérifier votre connexion internet et essayer de nouveau." #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:36 +#: code:addons/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml:26 #, python-format -msgid "Create Confirmed Order" +msgid "Create Confirmed Sale Order" msgstr "Créer une vente confirmée" #. module: pos_order_to_sale_order -#. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:37 -#, python-format -msgid "Create Confirmed Sale Order and discard the current PoS Order?" -msgstr "Créer une vente confirmée, et supprimer le ticket de caisse en cours ?" - -#. module: pos_order_to_sale_order -#: field:pos.config,iface_create_confirmed_sale_order:0 +#: model:ir.model.fields,field_description:pos_order_to_sale_order.field_pos_config__iface_create_confirmed_sale_order msgid "Create Confirmed Sale Orders" msgstr "Créer des ventes confirmées" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:45 +#: code:addons/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml:29 #, python-format -msgid "Create Delivered Order" -msgstr "Créer une vente livrée (BL)" +msgid "Create Delivered Sale Order" +msgstr "Créer une vente livrée" + +#. module: pos_order_to_sale_order +#: model:ir.model.fields,field_description:pos_order_to_sale_order.field_pos_config__iface_create_delivered_sale_order +msgid "Create Delivered Sale Orders" +msgstr "Créer des ventes livrées" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:46 +#: code:addons/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml:23 #, python-format -msgid "Create Delivered Sale Order and discard the current PoS Order?" -msgstr "" -"Créer une vente livrée (BL), et supprimer le ticket de caisse en cours ?" +msgid "Create Draft Sale Order" +msgstr "Créer un devis" #. module: pos_order_to_sale_order -#: field:pos.config,iface_create_delivered_sale_order:0 -msgid "Create Delivered Sale Orders" -msgstr "Créer des ventes livrées (BL)" +#: model:ir.model.fields,field_description:pos_order_to_sale_order.field_pos_config__iface_create_draft_sale_order +msgid "Create Draft Sale Orders" +msgstr "Créer des devis" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:27 +#: code:addons/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml:6 +#: code:addons/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml:18 #, python-format -msgid "Create Draft Order" -msgstr "Créer un devis en brouillon" +msgid "Create Sale Order" +msgstr "Créer une vente" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:28 +#: code:addons/pos_order_to_sale_order/static/src/js/screens.js:100 #, python-format -msgid "Create Draft Sale Order and discard the current PoS Order?" -msgstr "" -"Créer une vente en brouillon, et supprimer le ticket de caisse en cours ?" +msgid "Create Sale Order and discard the current PoS Order?" +msgstr "Créer une vente, et supprimer le ticket de caisse en cours ?" #. module: pos_order_to_sale_order -#: field:pos.config,iface_create_draft_sale_order:0 -msgid "Create Draft Sale Orders" -msgstr "Créer des ventes en brouillon" +#: model:ir.model.fields,field_description:pos_order_to_sale_order.field_pos_config__iface_create_sale_order +msgid "Create Sale Orders" +msgstr "Créer des ventes" #. module: pos_order_to_sale_order -#. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:78 -#, python-format -msgid "Empty Order" -msgstr "Commande vide" +#: model:ir.model.fields,help:pos_order_to_sale_order.field_pos_config__iface_create_confirmed_sale_order +msgid "If checked, the cashier will have the possibility to create a confirmed Sale Order, based on the current draft PoS Order." +msgstr "En cochant la case, le caissier aura la possibilité de créer une vente confirmée, à partir du ticket de caisse en cours." #. module: pos_order_to_sale_order -#: help:pos.config,iface_create_confirmed_sale_order:0 -msgid "" -"If checked, the cashier will have the possibility to create a confirmed Sale " -"Order, based on the current draft PoS Order." -msgstr "" -"En cochant la case, le caissier aura la possibilité de créer une vente " -"confirmée, à partir du ticket de caisse en cours." - -#. module: pos_order_to_sale_order -#: help:pos.config,iface_create_delivered_sale_order:0 -msgid "" -"If checked, the cashier will have the possibility to create a confirmed sale " -"Order, based on the current draft PoS Order.\n" -" the according picking will be marked as delivered. Only invoices process " -"will be possible." +#: model:ir.model.fields,help:pos_order_to_sale_order.field_pos_config__iface_create_delivered_sale_order +msgid "If checked, the cashier will have the possibility to create a confirmed sale Order, based on the current draft PoS Order.\n" +" the according picking will be marked as delivered. Only invoices process will be possible." msgstr "" "En cochant la case, le caissier aura la possibilité de créer une vente " "confirmée, à partir du ticket de caisse en cours.\n" @@ -125,89 +101,64 @@ msgstr "" "processus de facturation sera possible." #. module: pos_order_to_sale_order -#: help:pos.config,iface_create_draft_sale_order:0 -msgid "" -"If checked, the cashier will have the possibility to create a draft Sale " -"Order, based on the current draft PoS Order." +#: model:ir.model.fields,help:pos_order_to_sale_order.field_pos_config__iface_create_draft_sale_order +msgid "If checked, the cashier will have the possibility to create a draft Sale Order, based on the current draft PoS Order." msgstr "" "En cochant la case, le caissier aura la possibilité de créer une vente en " "brouillon, à partir du ticket de caisse en cours." #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:88 +#: code:addons/pos_order_to_sale_order/static/src/js/screens.js:29 #, python-format msgid "No customer defined" msgstr "Pas de client défini" #. module: pos_order_to_sale_order -#: code:addons/pos_order_to_sale_order/models/sale_order.py:19 +#: code:addons/pos_order_to_sale_order/models/sale_order.py:17 #, python-format msgid "Point of Sale %s" msgstr "Point de vente %s" #. module: pos_order_to_sale_order -#: model:ir.model,name:pos_order_to_sale_order.model_sale_order -msgid "Sales Order" -msgstr "Commande de ventes" +#: model:ir.model,name:pos_order_to_sale_order.model_pos_config +msgid "Point of Sale Configuration" +msgstr "Paramétrage du point de vente" #. module: pos_order_to_sale_order -#. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:150 -#, python-format -msgid "The order could not be sent" -msgstr "La commande n'a pas pu être envoyée" +#: model:ir.model,name:pos_order_to_sale_order.model_sale_order +msgid "Sale Order" +msgstr "Bon de commande" #. module: pos_order_to_sale_order -#. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:79 -#, python-format -msgid "There must be at least one product in your order to create Sale Order." -msgstr "" -"Il doit y avoir au moins un produit dans votre commande pour créer une vente" +#: model_terms:ir.ui.view,arch_db:pos_order_to_sale_order.view_pos_config_form +msgid "Sale Order Creations" +msgstr "Créations de Vente" #. module: pos_order_to_sale_order -#. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:40 -#, python-format -msgid "" -"This operation will permanently discard the current PoS Order and create a " -"confirmed Sale Order, based on the current order lines." -msgstr "" -"Cette opération va supprimer définitivement le ticket de caisse en cours, et " -"créer une vente confirmée, en se basant sur les lignes du ticket en cours." +#: model:ir.model,name:pos_order_to_sale_order.model_sale_order_line +msgid "Sales Order Line" +msgstr "Ligne de bons de commande" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:49 +#: code:addons/pos_order_to_sale_order/static/src/js/screens.js:147 #, python-format -msgid "" -"This operation will permanently discard the current PoS Order and create a " -"confirmed Sale Order, based on the current order lines. The according " -"picking will be marked as delivered." -msgstr "" -"Cette opération va supprimer définitivement le ticket de caisse en cours, et " -"créer une vente confirmée, en se basant sur les lignes du ticket en cours. " -"Le bon de livraison correspondant sera marqué comme livré." +msgid "The order could not be sent" +msgstr "La commande n'a pas pu être envoyée" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:31 +#: code:addons/pos_order_to_sale_order/static/src/js/screens.js:103 #, python-format -msgid "" -"This operation will permanently discard the current PoS Order and create a " -"draft Sale Order, based on the current order lines." +msgid "This operation will permanently discard the current PoS Order and create a Sale Order, based on the current order lines." msgstr "" "Cette opération va supprimer définitivement le ticket de caisse en cours, et " -"créer une vente en brouillon, en se basant sur les lignes du ticket en cours." +"créer une vente, en se basant sur les lignes du ticket en cours." #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:89 +#: code:addons/pos_order_to_sale_order/static/src/js/screens.js:30 #, python-format -msgid "" -"You should select a customer in order to create a Sale Order. Please select " -"one by clicking the order tab." -msgstr "" -"Vous devez sélectionner un client, afin de créer une vente. Veuillez en " -"sélectionner un en cliquant sur l'onglet de la commande." +msgid "You should select a customer in order to create a Sale Order." +msgstr "Vous devez sélectionner un client, afin de créer une vente." diff --git a/pos_order_to_sale_order/i18n/pos_order_to_sale_order.pot b/pos_order_to_sale_order/i18n/pos_order_to_sale_order.pot index d0ec24fa..1ec9191c 100644 --- a/pos_order_to_sale_order/i18n/pos_order_to_sale_order.pot +++ b/pos_order_to_sale_order/i18n/pos_order_to_sale_order.pot @@ -1,11 +1,13 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * pos_order_to_sale_order +# * pos_order_to_sale_order # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 8.0\n" +"Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-01-19 23:45+0000\n" +"PO-Revision-Date: 2020-01-19 23:45+0000\n" "Last-Translator: <>\n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -15,156 +17,140 @@ msgstr "" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:56 +#: code:addons/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml:15 #, python-format -msgid "\n" -"Note if you have manually changed unit prices for some products, this changes will not been taken into account in the sale order." +msgid "Back" msgstr "" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:151 +#: code:addons/pos_order_to_sale_order/static/src/js/screens.js:148 #, python-format msgid "Check your internet connection and try again." msgstr "" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:36 +#: code:addons/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml:26 #, python-format -msgid "Create Confirmed Order" +msgid "Create Confirmed Sale Order" msgstr "" #. module: pos_order_to_sale_order -#. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:37 -#, python-format -msgid "Create Confirmed Sale Order and discard the current PoS Order?" -msgstr "" - -#. module: pos_order_to_sale_order -#: field:pos.config,iface_create_confirmed_sale_order:0 +#: model:ir.model.fields,field_description:pos_order_to_sale_order.field_pos_config__iface_create_confirmed_sale_order msgid "Create Confirmed Sale Orders" msgstr "" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:45 +#: code:addons/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml:29 #, python-format -msgid "Create Delivered Order" +msgid "Create Delivered Sale Order" +msgstr "" + +#. module: pos_order_to_sale_order +#: model:ir.model.fields,field_description:pos_order_to_sale_order.field_pos_config__iface_create_delivered_sale_order +msgid "Create Delivered Sale Orders" msgstr "" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:46 +#: code:addons/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml:23 #, python-format -msgid "Create Delivered Sale Order and discard the current PoS Order?" +msgid "Create Draft Sale Order" msgstr "" #. module: pos_order_to_sale_order -#: field:pos.config,iface_create_delivered_sale_order:0 -msgid "Create Delivered Sale Orders" +#: model:ir.model.fields,field_description:pos_order_to_sale_order.field_pos_config__iface_create_draft_sale_order +msgid "Create Draft Sale Orders" msgstr "" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:27 +#: code:addons/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml:6 +#: code:addons/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml:18 #, python-format -msgid "Create Draft Order" +msgid "Create Sale Order" msgstr "" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:28 +#: code:addons/pos_order_to_sale_order/static/src/js/screens.js:100 #, python-format -msgid "Create Draft Sale Order and discard the current PoS Order?" -msgstr "" - -#. module: pos_order_to_sale_order -#: field:pos.config,iface_create_draft_sale_order:0 -msgid "Create Draft Sale Orders" +msgid "Create Sale Order and discard the current PoS Order?" msgstr "" #. module: pos_order_to_sale_order -#. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:78 -#, python-format -msgid "Empty Order" +#: model:ir.model.fields,field_description:pos_order_to_sale_order.field_pos_config__iface_create_sale_order +msgid "Create Sale Orders" msgstr "" #. module: pos_order_to_sale_order -#: help:pos.config,iface_create_confirmed_sale_order:0 +#: model:ir.model.fields,help:pos_order_to_sale_order.field_pos_config__iface_create_confirmed_sale_order msgid "If checked, the cashier will have the possibility to create a confirmed Sale Order, based on the current draft PoS Order." msgstr "" #. module: pos_order_to_sale_order -#: help:pos.config,iface_create_delivered_sale_order:0 +#: model:ir.model.fields,help:pos_order_to_sale_order.field_pos_config__iface_create_delivered_sale_order msgid "If checked, the cashier will have the possibility to create a confirmed sale Order, based on the current draft PoS Order.\n" " the according picking will be marked as delivered. Only invoices process will be possible." msgstr "" #. module: pos_order_to_sale_order -#: help:pos.config,iface_create_draft_sale_order:0 +#: model:ir.model.fields,help:pos_order_to_sale_order.field_pos_config__iface_create_draft_sale_order msgid "If checked, the cashier will have the possibility to create a draft Sale Order, based on the current draft PoS Order." msgstr "" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:88 +#: code:addons/pos_order_to_sale_order/static/src/js/screens.js:29 #, python-format msgid "No customer defined" msgstr "" #. module: pos_order_to_sale_order -#: code:addons/pos_order_to_sale_order/models/sale_order.py:19 +#: code:addons/pos_order_to_sale_order/models/sale_order.py:17 #, python-format msgid "Point of Sale %s" msgstr "" #. module: pos_order_to_sale_order -#: model:ir.model,name:pos_order_to_sale_order.model_sale_order -msgid "Sales Order" +#: model:ir.model,name:pos_order_to_sale_order.model_pos_config +msgid "Point of Sale Configuration" msgstr "" #. module: pos_order_to_sale_order -#. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:150 -#, python-format -msgid "The order could not be sent" +#: model:ir.model,name:pos_order_to_sale_order.model_sale_order +msgid "Sale Order" msgstr "" #. module: pos_order_to_sale_order -#. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:79 -#, python-format -msgid "There must be at least one product in your order to create Sale Order." +#: model_terms:ir.ui.view,arch_db:pos_order_to_sale_order.view_pos_config_form +msgid "Sale Order Creations" msgstr "" #. module: pos_order_to_sale_order -#. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:40 -#, python-format -msgid "This operation will permanently discard the current PoS Order and create a confirmed Sale Order, based on the current order lines." +#: model:ir.model,name:pos_order_to_sale_order.model_sale_order_line +msgid "Sales Order Line" msgstr "" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:49 +#: code:addons/pos_order_to_sale_order/static/src/js/screens.js:147 #, python-format -msgid "This operation will permanently discard the current PoS Order and create a confirmed Sale Order, based on the current order lines. The according picking will be marked as delivered." +msgid "The order could not be sent" msgstr "" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:31 +#: code:addons/pos_order_to_sale_order/static/src/js/screens.js:103 #, python-format -msgid "This operation will permanently discard the current PoS Order and create a draft Sale Order, based on the current order lines." +msgid "This operation will permanently discard the current PoS Order and create a Sale Order, based on the current order lines." msgstr "" #. module: pos_order_to_sale_order #. openerp-web -#: code:addons/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js:89 +#: code:addons/pos_order_to_sale_order/static/src/js/screens.js:30 #, python-format -msgid "You should select a customer in order to create a Sale Order. Please select one by clicking the order tab." +msgid "You should select a customer in order to create a Sale Order." msgstr "" - diff --git a/pos_order_to_sale_order/models/__init__.py b/pos_order_to_sale_order/models/__init__.py index b0ad68cf..1109a47e 100644 --- a/pos_order_to_sale_order/models/__init__.py +++ b/pos_order_to_sale_order/models/__init__.py @@ -1,3 +1,3 @@ -# -*- coding: utf-8 -*- from . import sale_order +from . import sale_order_line from . import pos_config diff --git a/pos_order_to_sale_order/models/pos_config.py b/pos_order_to_sale_order/models/pos_config.py index 64f2fdec..1b8c8841 100644 --- a/pos_order_to_sale_order/models/pos_config.py +++ b/pos_order_to_sale_order/models/pos_config.py @@ -1,14 +1,18 @@ -# -*- coding: utf-8 -*- # Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import models, fields +from odoo import api, fields, models class PosConfig(models.Model): _inherit = "pos.config" + iface_create_sale_order = fields.Boolean( + string="Create Sale Orders", + compute="_compute_iface_create_sale_order", + store=True) + iface_create_draft_sale_order = fields.Boolean( string="Create Draft Sale Orders", default=True, @@ -31,3 +35,16 @@ class PosConfig(models.Model): " the according picking will be marked as delivered. Only invoices" " process will be possible.", ) + + @api.depends( + "iface_create_draft_sale_order", + "iface_create_confirmed_sale_order", + "iface_create_delivered_sale_order", + ) + def _compute_iface_create_sale_order(self): + for config in self: + config.iface_create_sale_order = any([ + config.iface_create_draft_sale_order, + config.iface_create_confirmed_sale_order, + config.iface_create_delivered_sale_order, + ]) diff --git a/pos_order_to_sale_order/models/sale_order.py b/pos_order_to_sale_order/models/sale_order.py index 58b18d8b..56e95731 100644 --- a/pos_order_to_sale_order/models/sale_order.py +++ b/pos_order_to_sale_order/models/sale_order.py @@ -1,90 +1,61 @@ -# -*- coding: utf-8 -*- # Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) # @author: Sylvain LE GAL (https://twitter.com/legalsylvain) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from openerp import models, api, _ +from odoo import _, api, models class SaleOrder(models.Model): _inherit = "sale.order" @api.model - def _prepare_order_field_from_pos(self, order_data): - session_obj = self.env["pos.session"] - session = session_obj.browse(order_data["pos_session_id"]) - res = self.onchange_partner_id(order_data["partner_id"])["value"] - res.update( - { - "partner_id": order_data["partner_id"] or False, - "origin": _("Point of Sale %s") % (session.name), - "client_order_ref": order_data["name"], - "user_id": order_data["user_id"] or False, - "order_line": [], - } - ) - if self.env.context.get("is_pos_pricelist"): - res.update( - {"pricelist_id": order_data["pricelist_id"],} - ) - for line_data in order_data["lines"]: - res["order_line"].append( - [ - 0, - False, - self._prepare_order_line_field_from_pos(line_data[2], res), - ] - ) - return res + def _prepare_from_pos(self, order_data): + PosSession = self.env["pos.session"] + session = PosSession.browse(order_data["pos_session_id"]) + return { + "partner_id": order_data["partner_id"], + "origin": _("Point of Sale %s") % (session.name), + "client_order_ref": order_data["name"], + "user_id": order_data["user_id"], + "pricelist_id": order_data["pricelist_id"], + "fiscal_position_id": order_data["fiscal_position_id"], + } @api.model - def _prepare_order_line_field_from_pos(self, line_data, sale_order_data): - line_obj = self.env["sale.order.line"] - res = line_obj.product_id_change( - sale_order_data["pricelist_id"], - line_data["product_id"], - qty=line_data["qty"], - partner_id=sale_order_data["partner_id"], - )["value"] - res.update( - { - "product_id": line_data["product_id"], - "product_uom_qty": line_data["qty"], - "discount": line_data["discount"], - "tax_id": [(6, False, res["tax_id"])], - } - ) - if self.env.context.get("is_pos_pricelist"): - res.update( - { - "price_unit": line_data["price_unit"], - "tax_id": line_data["tax_ids"], - } - ) - return res + def create_order_from_pos(self, order_data, action): + SaleOrderLine = self.env["sale.order.line"] - @api.model - def create_order_from_pos(self, order_data): - is_pos_pricelist = len( - self.env["ir.module.module"].search( - [("name", "=", "pos_pricelist"), ("state", "=", "installed")] - ) - ) # Create Draft Sale order - sale_order = self.create( - self.with_context( - is_pos_pricelist=is_pos_pricelist - )._prepare_order_field_from_pos(order_data) - ) + order_vals = self._prepare_from_pos(order_data) + sale_order = self.create(order_vals.copy()) + sale_order.onchange_partner_id() + # we rewrite data, because onchange could alter some + # custom data (like pricelist) + sale_order.write(order_vals) + + # create Sale order lines + for order_line_data in order_data["lines"]: + # Create Sale order lines + order_line_vals = SaleOrderLine._prepare_from_pos( + sale_order, order_line_data[2]) + sale_order_line = SaleOrderLine.create( + order_line_vals.copy()) + sale_order_line.product_id_change() + # we rewrite data, because onchange could alter some + # data (like quantity, or price) + sale_order_line.write(order_line_vals) # Confirm Sale Order - if order_data["sale_order_state"] in ["confirmed", "delivered"]: - sale_order.action_button_confirm() + if action in ["confirmed", "delivered"]: + sale_order.action_confirm() # mark picking as delivered - if order_data["sale_order_state"] == "delivered": - sale_order.picking_ids.force_assign() - sale_order.picking_ids.do_transfer() + if action == "delivered": + # Mark all moves are delivered + for move in sale_order.mapped( + "picking_ids.move_ids_without_package"): + move.quantity_done = move.product_uom_qty + sale_order.mapped("picking_ids").button_validate() return { "sale_order_id": sale_order.id, diff --git a/pos_order_to_sale_order/models/sale_order_line.py b/pos_order_to_sale_order/models/sale_order_line.py new file mode 100644 index 00000000..aa65e6c4 --- /dev/null +++ b/pos_order_to_sale_order/models/sale_order_line.py @@ -0,0 +1,23 @@ +# Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) +# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, models + + +class SaleOrderLine(models.Model): + _inherit = "sale.order.line" + + @api.model + def _prepare_from_pos(self, sale_order, order_line_data): + ProductProduct = self.env["product.product"] + product = ProductProduct.browse(order_line_data["product_id"]) + return { + "order_id": sale_order.id, + "product_id": order_line_data["product_id"], + "name": product.name, + "product_uom_qty": order_line_data["qty"], + "discount": order_line_data["discount"], + "price_unit": order_line_data["price_unit"], + "tax_id": order_line_data["tax_ids"], + } diff --git a/pos_order_to_sale_order/readme/CONFIGURE.rst b/pos_order_to_sale_order/readme/CONFIGURE.rst index f77b4815..1b4c3c63 100644 --- a/pos_order_to_sale_order/readme/CONFIGURE.rst +++ b/pos_order_to_sale_order/readme/CONFIGURE.rst @@ -1,5 +1,3 @@ -To configure this module, you need to: - * Go to Point Of Sale / Configuration / Point of Sale * Check the box 'Create Sale Orders' * Select the desired default behaviour diff --git a/pos_order_to_sale_order/readme/DESCRIPTION.rst b/pos_order_to_sale_order/readme/DESCRIPTION.rst index 993e779e..aca0573c 100644 --- a/pos_order_to_sale_order/readme/DESCRIPTION.rst +++ b/pos_order_to_sale_order/readme/DESCRIPTION.rst @@ -1,8 +1,7 @@ This module extends the functionality of point of sale to allow sale orders creation from the Point of Sale. - -In the POS UI, buttons has been added to create a sale order and discard +In the POS UI, button has been added to create a sale order and discard the current POS order. This module is usefull in many cases, for exemple : @@ -14,39 +13,10 @@ This module is usefull in many cases, for exemple : create a sale order and deliver products every time to keep your stock value correct, and to create a unique invoice, when you want. - -Three options are available: - -* **Create a draft Order** - A new sale order in a draft mode will be created that can be changed later. - -.. figure:: ../static/description/pos_create_picking_option_1.png - :width: 800 px - -* **Create a Confirmed Order** - A new sale order will be created and confirmed. - -.. figure:: ../static/description/pos_create_picking_option_2.png - :width: 800 px - -* **Create Delivered Picking** (by default) - A new sale order will be created and confirmed. the associated picking - will be marked as delivered. - -.. figure:: ../static/description/pos_create_picking_option_3.png - :width: 800 px - - **Technical Notes** * Some hooks are defined in the JS file, to define custom behaviour after - having created the sale order (and the stock picking). - -* Some prepare functions are available in the sale.order model, to overload - the creation of the sale order. + having created the sale order. -* You could be interested by another module, pos_sale_order, that completely - alter Point of Sale module, avoiding creating Pos Orders, and creating - allways Sale Orders. - This module is a WIP state, and is available here: - https://github.com/OCA/pos/pull/35 +* Some prepare functions are available in the ``sale.order`` model and + ``sale.order.line`` models to overload the creation of the sale order. diff --git a/pos_order_to_sale_order/readme/ROADMAP.rst b/pos_order_to_sale_order/readme/ROADMAP.rst deleted file mode 100644 index ed6dd416..00000000 --- a/pos_order_to_sale_order/readme/ROADMAP.rst +++ /dev/null @@ -1,11 +0,0 @@ -* Because of the poor design of the Odoo Point of Sale, some basic features - are not available by default, like pricelist, fiscal position, etc ... - For that reason, unit price will be recomputed by default, when creating the - sale order, and the unit price of the current bill will not be used. - -Note that this problem is fixed if ``pos_pricelist`` is installed. -(same repository) In that cases, the pricelist, the unit prices and the taxes -will be the same in the order, as in the displayed bill. - -.. figure:: ../static/description/pos_create_picking_confirm.png - :width: 800 px diff --git a/pos_order_to_sale_order/readme/USAGE.rst b/pos_order_to_sale_order/readme/USAGE.rst new file mode 100644 index 00000000..ef015587 --- /dev/null +++ b/pos_order_to_sale_order/readme/USAGE.rst @@ -0,0 +1,23 @@ +* Open your Point of sale +* create a new order and select products +* select a customer + +* then, click on the "Create Sale Order" button + +.. figure:: ../static/description/pos_frontend_order.png + :width: 800 px + +Three options are available: + +* **Create a draft Order** + A new sale order in a draft mode will be created that can be changed later. + +* **Create a Confirmed Order** + A new sale order will be created and confirmed. + +* **Create Delivered Picking** (by default) + A new sale order will be created and confirmed. the associated picking + will be marked as delivered. + +.. figure:: ../static/description/pos_frontend_buttons.png + :width: 800 px diff --git a/pos_order_to_sale_order/static/description/pos_config_form.png b/pos_order_to_sale_order/static/description/pos_config_form.png index 54076c82..c108942f 100644 Binary files a/pos_order_to_sale_order/static/description/pos_config_form.png and b/pos_order_to_sale_order/static/description/pos_config_form.png differ diff --git a/pos_order_to_sale_order/static/description/pos_create_picking_confirm.png b/pos_order_to_sale_order/static/description/pos_create_picking_confirm.png deleted file mode 100644 index 436e20a7..00000000 Binary files a/pos_order_to_sale_order/static/description/pos_create_picking_confirm.png and /dev/null differ diff --git a/pos_order_to_sale_order/static/description/pos_create_picking_option_1.png b/pos_order_to_sale_order/static/description/pos_create_picking_option_1.png deleted file mode 100644 index b69fa6f1..00000000 Binary files a/pos_order_to_sale_order/static/description/pos_create_picking_option_1.png and /dev/null differ diff --git a/pos_order_to_sale_order/static/description/pos_create_picking_option_2.png b/pos_order_to_sale_order/static/description/pos_create_picking_option_2.png deleted file mode 100644 index 46739f6c..00000000 Binary files a/pos_order_to_sale_order/static/description/pos_create_picking_option_2.png and /dev/null differ diff --git a/pos_order_to_sale_order/static/description/pos_create_picking_option_3.png b/pos_order_to_sale_order/static/description/pos_create_picking_option_3.png deleted file mode 100644 index 28c3d02c..00000000 Binary files a/pos_order_to_sale_order/static/description/pos_create_picking_option_3.png and /dev/null differ diff --git a/pos_order_to_sale_order/static/description/pos_frontend_buttons.png b/pos_order_to_sale_order/static/description/pos_frontend_buttons.png new file mode 100644 index 00000000..fa0d9f08 Binary files /dev/null and b/pos_order_to_sale_order/static/description/pos_frontend_buttons.png differ diff --git a/pos_order_to_sale_order/static/description/pos_frontend_order.png b/pos_order_to_sale_order/static/description/pos_frontend_order.png new file mode 100644 index 00000000..fdbe05a8 Binary files /dev/null and b/pos_order_to_sale_order/static/description/pos_frontend_order.png differ diff --git a/pos_order_to_sale_order/static/src/css/pos_order_to_sale_order.css b/pos_order_to_sale_order/static/src/css/pos_order_to_sale_order.css deleted file mode 100644 index 11d8de8f..00000000 --- a/pos_order_to_sale_order/static/src/css/pos_order_to_sale_order.css +++ /dev/null @@ -1,12 +0,0 @@ -/* - Copyright (C) 2018 - Today: GRAP (http://www.grap.coop) - @author: Sylvain LE GAL (https://twitter.com/legalsylvain) - License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -*/ - -/*Redefine here, the style defined in web module (base.css), because this file -is not loaded in the point of sale.*/ -.blockUI.blockOverlay { - background-color: black; - opacity: 0.6; -} diff --git a/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js b/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js deleted file mode 100644 index 62bcdead..00000000 --- a/pos_order_to_sale_order/static/src/js/pos_order_to_sale_order.js +++ /dev/null @@ -1,225 +0,0 @@ -/* *************************************************************************** - Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) - @author: Sylvain LE GAL (https://twitter.com/legalsylvain) - License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -**************************************************************************** */ - -openerp.pos_order_to_sale_order = function (instance) { - - "use strict"; - - var module = instance.point_of_sale; - var _t = instance.web._t; - - /* ************************************************************************ - New Widget CreateSaleOrderButtonWidget - ************************************************************************ */ - module.CreateSaleOrderButtonWidget = module.PosBaseWidget.extend({ - template: 'CreateSaleOrderButtonWidget', - - /** - * Define all the confirmation messages. - */ - init: function (parent, options) { - this._super(parent, options); - this.sale_order_state = options.sale_order_state; - if (this.sale_order_state === 'draft') { - this.display_text = _t("Create Draft Order"); - this.confirmation_message = _t( - 'Create Draft Sale Order and discard the current' + - ' PoS Order?'); - this.confirmation_comment = _t( - "This operation will permanently discard the current PoS" + - " Order and create a draft Sale Order, based on the" + - " current order lines."); - } else if (options.sale_order_state === 'confirmed') { - this.display_text = _t("Create Confirmed Order"); - this.confirmation_message = _t( - 'Create Confirmed Sale Order and discard the current' + - ' PoS Order?'); - this.confirmation_comment = _t( - "This operation will permanently discard the current PoS" + - " Order and create a confirmed Sale Order, based on the" + - " current order lines."); - } else if (options.sale_order_state === 'delivered') { - this.display_text = _t("Create Delivered Order"); - this.confirmation_message = _t( - 'Create Delivered Sale Order and discard the current' + - ' PoS Order?'); - this.confirmation_comment = _t( - "This operation will permanently discard the current PoS" + - " Order and create a confirmed Sale Order, based on the" + - " current order lines. The according picking will be" + - " marked as delivered."); - } - if (! this.pos.pricelist_engine) { - this.confirmation_comment += _t( - "\nNote if you have manually changed unit prices for" + - " some products, this changes will not been taken into" + - " account in the sale order.") - } - }, - - /** - * Define onclick function when the button to create sale order is - * clicked. - * - On click, check if there is a customer defined, - * - ask confirmation call server to create sale order, and delete - * the current order. - */ - renderElement: function () { - var self = this; - this._super(); - this.$el.click(function () { - var current_order = self.pos.get('selectedOrder'); - // Prevent empty delivery order - if (current_order.get('orderLines').length === 0) { - self.pos_widget.screen_selector.show_popup('error', { - 'message': _t('Empty Order'), - 'comment': _t( - 'There must be at least one product in your' + - ' order to create Sale Order.'), - }); - return; - } - // Check Customer - if (!current_order.get('client')) { - self.pos_widget.screen_selector.show_popup('error', { - 'message': _t('No customer defined'), - 'comment': _t( - 'You should select a customer in order to create' + - ' a Sale Order. Please select one by clicking' + - ' the order tab.'), - }); - return; - } - self.pos.pos_widget.screen_selector.show_popup('confirm', { - message: self.confirmation_message, - comment: self.confirmation_comment, - confirm: function () { - var SaleOrderModel = - new instance.web.Model('sale.order'); - current_order.sale_order_state = self.sale_order_state; - instance.web.blockUI(); - SaleOrderModel.call('create_order_from_pos', [ - self.prepare_create_sale_order(current_order)] - ).then(function (result) { - instance.web.unblockUI(); - self.hook_create_sale_order_success(result); - }).fail(function (error, event) { - instance.web.unblockUI(); - self.hook_create_sale_order_error(error, event); - }); - }, - }); - }); - }, - - /** - * Overloadable function to send custom sale order data to server - */ - prepare_create_sale_order: function (order) { - var res = order.export_as_JSON(); - res.sale_order_state = this.sale_order_state; - return res; - }, - - /** - * Overloadable function to make custom action after Sale order - * Creation succeeded - */ - hook_create_sale_order_success: function (result) { - this.pos.get('selectedOrder').destroy(); - }, - - /** - * Overloadable function to make custom action after Sale order - * Creation failed - */ - hook_create_sale_order_error: function (error, event) { - event.preventDefault(); - if (error.code === 200) { - // Business Logic Error, not a connection problem - this.pos_widget.screen_selector.show_popup('error-traceback', { - message: error.data.message, - comment: error.data.debug, - }); - } else { - // Connexion problem - this.pos_widget.screen_selector.show_popup('error', { - message: _t('The order could not be sent'), - comment: _t( - 'Check your internet connection and try again.'), - }); - } - }, - - }); - - - /* ************************************************************************ - Extend PosWidget: - ************************************************************************ */ - module.PosWidget = module.PosWidget.extend({ - - /** - * Overload build_widgets(), to create new buttons, depending of the - * configuration - */ - build_widgets: function () { - this._super(); - if (this.pos.config.iface_create_draft_sale_order) { - this.create_draft_sale_order_button = - new module.CreateSaleOrderButtonWidget( - this, {'sale_order_state': 'draft'}); - this.create_draft_sale_order_button.appendTo( - this.pos_widget.$('ul.orderlines')); - } - if (this.pos.config.iface_create_confirmed_sale_order) { - this.create_confirmed_sale_order_button = - new module.CreateSaleOrderButtonWidget( - this, {'sale_order_state': 'confirmed'}); - this.create_confirmed_sale_order_button.appendTo( - this.pos_widget.$('ul.orderlines')); - } - if (this.pos.config.iface_create_delivered_sale_order) { - this.create_delivered_sale_order_button = - new module.CreateSaleOrderButtonWidget( - this, {'sale_order_state': 'delivered'}); - this.create_delivered_sale_order_button.appendTo( - this.pos_widget.$('ul.orderlines')); - } - }, - }); - - - /* ************************************************************************ - Extend OrderWidget - ************************************************************************ */ - module.OrderWidget = module.OrderWidget.extend({ - - /** - * Overload renderElement(), to display buttons when the order change. - */ - renderElement: function (scrollbottom) { - this._super(scrollbottom); - if (this.pos_widget.create_draft_sale_order_button) { - this.pos_widget.create_draft_sale_order_button.appendTo( - this.pos_widget.$('ul.orderlines') - ); - } - if (this.pos_widget.create_confirmed_sale_order_button) { - this.pos_widget.create_confirmed_sale_order_button.appendTo( - this.pos_widget.$('ul.orderlines') - ); - } - if (this.pos_widget.create_delivered_sale_order_button) { - this.pos_widget.create_delivered_sale_order_button.appendTo( - this.pos_widget.$('ul.orderlines') - ); - } - - }, - }); - -}; diff --git a/pos_order_to_sale_order/static/src/js/screens.js b/pos_order_to_sale_order/static/src/js/screens.js new file mode 100644 index 00000000..b548f38f --- /dev/null +++ b/pos_order_to_sale_order/static/src/js/screens.js @@ -0,0 +1,163 @@ +/** *************************************************************************** + Copyright (C) 2017 - Today: GRAP (http://www.grap.coop) + @author: Sylvain LE GAL (https://twitter.com/legalsylvain) + License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +******************************************************************************/ + +odoo.define('pos_order_to_sale_order.screens', function (require) { + "use strict"; + + var screens = require('point_of_sale.screens'); + var gui = require('point_of_sale.gui'); + var core = require('web.core'); + var framework = require('web.framework'); + var rpc = require('web.rpc'); + var _t = core._t; + + /** ********************************************************************** + New Widget CreateSaleOrderButtonWidget: + * On click, display a new screen to select the action to do + */ + var CreateSaleOrderButtonWidget = screens.ActionButtonWidget.extend({ + template: 'CreateSaleOrderButtonWidget', + + button_click: function () { + if (this.pos.get_order().get_client()) { + this.gui.show_screen('create_sale_order'); + } else { + this.gui.show_popup('error', { + 'title': _t('No customer defined'), + 'body': _t( + 'You should select a customer in order to create' + + ' a Sale Order.'), + }); + } + }, + + is_visible: function () { + return this.pos.get_order().orderlines.length > 0; + }, + + }); + + screens.define_action_button({ + 'name': 'create_sale_order', + 'widget': CreateSaleOrderButtonWidget, + 'condition': function () { + return this.pos.config.iface_create_sale_order; + }, + }); + + screens.OrderWidget.include({ + update_summary: function () { + this._super(); + if (this.getParent().action_buttons && + this.getParent().action_buttons.create_sale_order) { + this.getParent().action_buttons.create_sale_order.renderElement(); + } + }, + }); + + /** ********************************************************************** + New ScreenWidget CreateSaleOrderScreenWidget: + * On show, display all buttons, depending on the pos configuration + */ + var CreateSaleOrderScreenWidget = screens.ScreenWidget.extend({ + template: 'CreateSaleOrderScreenWidget', + auto_back: true, + + + show: function(){ + var self = this; + this._super(); + + this.renderElement(); + + this.$('.back').click(function(){ + self.gui.back(); + }); + + if (!this.pos.config.iface_create_draft_sale_order) { + this.$('#button-create-draft-order').addClass('oe_hidden'); + } + if (!this.pos.config.iface_create_confirmed_sale_order) { + this.$('#button-create-confirmed-order').addClass('oe_hidden'); + } + if (!this.pos.config.iface_create_delivered_sale_order) { + this.$('#button-create-delivered-order').addClass('oe_hidden'); + } + + this.$('.paymentmethod').click(function(event){ + self.click_sale_order_button(event.currentTarget.attributes.action.nodeValue); + }); + }, + + click_sale_order_button: function(action) { + var self = this; + console.log("click_sale_order_button : " + action); + + this.gui.show_popup('confirm', { + 'title': _t( + 'Create Sale Order and discard the current' + + ' PoS Order?'), + 'body': _t( + "This operation will permanently discard the current PoS" + + " Order and create a Sale Order, based on the" + + " current order lines."), + confirm: function(){ + framework.blockUI(); + rpc.query({ + model: 'sale.order', + method: 'create_order_from_pos', + args: [self.pos.get('selectedOrder').export_as_JSON(), action], + }).then(function (result) { + self.hook_create_sale_order_success(result); + }).fail(function (error, event) { + self.hook_create_sale_order_error(error, event); + }); + }, + }); + }, + + /** + * Overloadable function to make custom action after Sale order + * Creation succeeded + */ + hook_create_sale_order_success: function (result) { + framework.unblockUI(); + this.pos.get('selectedOrder').destroy(); + }, + + /** + * Overloadable function to make custom action after Sale order + * Creation failed + */ + hook_create_sale_order_error: function (error, event) { + framework.unblockUI(); + event.preventDefault(); + if (error.code === 200) { + // Business Logic Error, not a connection problem + this.gui.show_popup('error-traceback', { + 'title': error.data.message, + 'body': error.data.debug, + }); + } else { + // Connexion problem + this.gui.show_popup('error', { + 'title': _t('The order could not be sent'), + 'body': _t('Check your internet connection and try again.'), + }); + } + }, + + }); + + gui.define_screen({ + 'name': 'create_sale_order', + 'widget': CreateSaleOrderScreenWidget, + 'condition': function () { + return this.pos.config.iface_create_sale_order; + }, + }); + +}); diff --git a/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml b/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml index 8e838f0e..bd0dfdb4 100644 --- a/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml +++ b/pos_order_to_sale_order/static/src/xml/pos_order_to_sale_order.xml @@ -2,12 +2,38 @@ diff --git a/pos_order_to_sale_order/views/assets.xml b/pos_order_to_sale_order/views/assets.xml new file mode 100644 index 00000000..c8420256 --- /dev/null +++ b/pos_order_to_sale_order/views/assets.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/pos_order_to_sale_order/views/pos_order_to_sale_order.xml b/pos_order_to_sale_order/views/pos_order_to_sale_order.xml deleted file mode 100644 index 5c8992ba..00000000 --- a/pos_order_to_sale_order/views/pos_order_to_sale_order.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - diff --git a/pos_order_to_sale_order/views/view_pos_config.xml b/pos_order_to_sale_order/views/view_pos_config.xml index b02253e2..ce9e559e 100644 --- a/pos_order_to_sale_order/views/view_pos_config.xml +++ b/pos_order_to_sale_order/views/view_pos_config.xml @@ -1,16 +1,66 @@ - + - + pos.config - + - - - - - + + + +

Sale Order Creations

+
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+ + + + + -