From 1918a36fb969f851541d651efa92495d92f27724 Mon Sep 17 00:00:00 2001 From: Tri Nanda Date: Thu, 7 May 2020 10:06:42 +0700 Subject: [PATCH 1/2] pos_order_mgmt 13.0.0.0.1 --- pos_order_mgmt/README.rst | 134 +++++ pos_order_mgmt/__init__.py | 1 + pos_order_mgmt/__manifest__.py | 29 ++ pos_order_mgmt/i18n/es.po | 313 +++++++++++ pos_order_mgmt/i18n/fr.po | 272 ++++++++++ pos_order_mgmt/i18n/it.po | 246 +++++++++ pos_order_mgmt/i18n/pos_order_mgmt.pot | 231 ++++++++ pos_order_mgmt/i18n/pt.po | 246 +++++++++ pos_order_mgmt/models/__init__.py | 2 + pos_order_mgmt/models/pos_config.py | 45 ++ pos_order_mgmt/models/pos_order.py | 154 ++++++ pos_order_mgmt/readme/CONFIGURE.rst | 18 + pos_order_mgmt/readme/CONTRIBUTORS.rst | 6 + pos_order_mgmt/readme/DESCRIPTION.rst | 3 + pos_order_mgmt/readme/ROADMAP.rst | 4 + pos_order_mgmt/readme/USAGE.rst | 19 + pos_order_mgmt/static/description/icon.png | Bin 0 -> 15006 bytes pos_order_mgmt/static/description/index.html | 477 +++++++++++++++++ .../static/description/order-mgmt-config.png | Bin 0 -> 13968 bytes .../static/description/order-mgmt-icon.png | Bin 0 -> 26304 bytes .../static/description/order-mgmt-list.png | Bin 0 -> 39015 bytes pos_order_mgmt/static/src/css/pos.css | 45 ++ pos_order_mgmt/static/src/js/models.js | 30 ++ pos_order_mgmt/static/src/js/widgets.js | 492 ++++++++++++++++++ pos_order_mgmt/static/src/xml/pos.xml | 104 ++++ pos_order_mgmt/tests/__init__.py | 1 + pos_order_mgmt/tests/test_module.py | 80 +++ pos_order_mgmt/views/assets.xml | 13 + pos_order_mgmt/views/view_pos_config.xml | 47 ++ pos_order_mgmt/views/view_pos_order.xml | 22 + 30 files changed, 3034 insertions(+) create mode 100644 pos_order_mgmt/README.rst create mode 100644 pos_order_mgmt/__init__.py create mode 100644 pos_order_mgmt/__manifest__.py create mode 100644 pos_order_mgmt/i18n/es.po create mode 100644 pos_order_mgmt/i18n/fr.po create mode 100644 pos_order_mgmt/i18n/it.po create mode 100644 pos_order_mgmt/i18n/pos_order_mgmt.pot create mode 100644 pos_order_mgmt/i18n/pt.po create mode 100644 pos_order_mgmt/models/__init__.py create mode 100644 pos_order_mgmt/models/pos_config.py create mode 100644 pos_order_mgmt/models/pos_order.py create mode 100644 pos_order_mgmt/readme/CONFIGURE.rst create mode 100644 pos_order_mgmt/readme/CONTRIBUTORS.rst create mode 100644 pos_order_mgmt/readme/DESCRIPTION.rst create mode 100644 pos_order_mgmt/readme/ROADMAP.rst create mode 100644 pos_order_mgmt/readme/USAGE.rst create mode 100644 pos_order_mgmt/static/description/icon.png create mode 100644 pos_order_mgmt/static/description/index.html create mode 100644 pos_order_mgmt/static/description/order-mgmt-config.png create mode 100644 pos_order_mgmt/static/description/order-mgmt-icon.png create mode 100644 pos_order_mgmt/static/description/order-mgmt-list.png create mode 100644 pos_order_mgmt/static/src/css/pos.css create mode 100644 pos_order_mgmt/static/src/js/models.js create mode 100644 pos_order_mgmt/static/src/js/widgets.js create mode 100644 pos_order_mgmt/static/src/xml/pos.xml create mode 100644 pos_order_mgmt/tests/__init__.py create mode 100644 pos_order_mgmt/tests/test_module.py create mode 100644 pos_order_mgmt/views/assets.xml create mode 100644 pos_order_mgmt/views/view_pos_config.xml create mode 100644 pos_order_mgmt/views/view_pos_order.xml diff --git a/pos_order_mgmt/README.rst b/pos_order_mgmt/README.rst new file mode 100644 index 00000000..8525e844 --- /dev/null +++ b/pos_order_mgmt/README.rst @@ -0,0 +1,134 @@ +============================== +POS Frontend Orders Management +============================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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%2Fpos-lightgray.png?logo=github + :target: https://github.com/OCA/pos/tree/12.0/pos_order_mgmt + :alt: OCA/pos +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/pos-12-0/pos-12-0-pos_order_mgmt + :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/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the functionality of the PoS frontend allowing to load +already done PoS Orders in order to be able to operate over them, being able to +reprint past tickets or return them. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module, you need to go to *Point of Sale > Configuration > +Point of Sale* and enable *Order Management* + +.. image:: https://raw.githubusercontent.com/OCA/pos/12.0/pos_order_mgmt/static/description/order-mgmt-config.png + +#. Change *Maximum orders to load* to your desired amount (10 by default). + Please note that the more you load, the more it will take to load + them in the session opening. You can also set it to 0 and you'll just be + able to load them from the order list screen. + +#. Enable *Reprint orders* on if you want to be able to reprint past orders + in that PoS. + +#. Enable *Return orders* on if you want to be able to return past orders + in that PoS. + +#. Enable *Duplicate orders* on if you want to be able to return past orders + in that PoS. + +Usage +===== + +Once the PoS is loaded, you'll find a shopping trolley icon (🛒) in the top +bar that grants access to the order list screen. + +.. image:: https://raw.githubusercontent.com/OCA/pos/12.0/pos_order_mgmt/static/description/order-mgmt-icon.png + +There you can find the number of past orders loaded according to your +configuration (see Configuration) as well as the orders you checked out in +the current session: + +.. image:: https://raw.githubusercontent.com/OCA/pos/12.0/pos_order_mgmt/static/description/order-mgmt-list.png + +#. You can see their totals as well as their custumers if registered. +#. You can reprint their tickets clicking on the printer icon (⎙). +#. You can return them pressing on the arrow icon (↶). +#. You have a search input as well that lets you find past tickets by its + reference number. + +NOTE: You'll need your PoS to be online to be able to search or return a past +ticket. + +Known issues / Roadmap +====================== + +* This module contains a *basic return* feature that makes possible returning + the same order over and over. If you need a full return feature, you can + install ``pos_order_return`` (only back office implementation), or + ``pos_order_return_traceability``, which also covers front office support. + +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 +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* David Vidal +* Sylvain LE GAL (https://twitter.com/legalsylvain) +* Carlos Martínez +* Pierrick Brun +* Iván Todorovich +* David Alonso + +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/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_mgmt/__init__.py b/pos_order_mgmt/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/pos_order_mgmt/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/pos_order_mgmt/__manifest__.py b/pos_order_mgmt/__manifest__.py new file mode 100644 index 00000000..edcb3a92 --- /dev/null +++ b/pos_order_mgmt/__manifest__.py @@ -0,0 +1,29 @@ +# Copyright 2018 GRAP - Sylvain LE GAL +# Copyright 2018 Tecnativa S.L. - David Vidal +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'POS Frontend Orders Management', + 'summary': 'Manage old POS Orders from the frontend', + 'version': '12.0.1.1.0', + 'category': 'Point of Sale', + 'author': 'GRAP, ' + 'Tecnativa, ' + 'Odoo Community Association (OCA)' + 'Lima Bersaudara', + 'website': 'https://github.com/OCA/pos', + 'license': 'AGPL-3', + 'depends': [ + 'point_of_sale', + ], + 'data': [ + 'views/assets.xml', + 'views/view_pos_config.xml', + 'views/view_pos_order.xml', + ], + 'qweb': [ + 'static/src/xml/pos.xml' + ], + 'application': False, + 'installable': True, +} diff --git a/pos_order_mgmt/i18n/es.po b/pos_order_mgmt/i18n/es.po new file mode 100644 index 00000000..856f31e2 --- /dev/null +++ b/pos_order_mgmt/i18n/es.po @@ -0,0 +1,313 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_order_mgmt +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-10-18 11:15+0000\n" +"PO-Revision-Date: 2019-12-27 19:13+0000\n" +"Last-Translator: Carles Antoli \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_copy_done_order +#, fuzzy +#| msgid "Allow to load done orders in this POS" +msgid "Allows to duplicate already done orders in the frontend" +msgstr "Permitir cargar pedidos en este PdV" + +#. module: pos_order_mgmt +#: model_terms:ir.ui.view,arch_db:pos_order_mgmt.view_pos_config_form +#, fuzzy +#| msgid "Allow to load done orders in this POS" +msgid "Allows to manage already done orders in the frontend." +msgstr "Permitir cargar pedidos en este PdV" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_order_mgmt +#, fuzzy +#| msgid "Allow to load done orders in this POS" +msgid "Allows to manage orders in the frontend" +msgstr "Permitir cargar pedidos en este PdV" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_reprint_done_order +#, fuzzy +#| msgid "Allow to load done orders in this POS" +msgid "Allows to reprint already done orders in the frontend" +msgstr "Permitir cargar pedidos en este PdV" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_return_done_order +#, fuzzy +#| msgid "Allow to load done orders in this POS" +msgid "Allows to return already done orders in the frontend" +msgstr "Permitir cargar pedidos en este PdV" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:36 +#, fuzzy, python-format +#| msgid "Amount Total" +msgid "Amount" +msgstr "Importe Total" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:17 +#, python-format +msgid "Back" +msgstr "Volver" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:368 +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:423 +#, python-format +msgid "Can not execute this action because the POS is currently offline" +msgstr "" +"No se puede ejecutar esta acción porque el PdV está sin línea en este momento" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:367 +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:422 +#, python-format +msgid "Connection error" +msgstr "Error de conexión" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:61 +#, python-format +msgid "Create a new order based on this one" +msgstr "Crea un nuevo pedido basado en este" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:64 +#, python-format +msgid "Create a refund order of this order" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:34 +#, python-format +msgid "Customer" +msgstr "Cliente" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:89 +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:98 +#, python-format +msgid "DUPLICATE" +msgstr "DUPLICAR" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:35 +#, python-format +msgid "Date" +msgstr "Fecha" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_copy_done_order +#, fuzzy +#| msgid "Load Done Orders" +msgid "Duplicate Orders" +msgstr "Cargar Ventas Realizadas" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_load_done_order_max_qty +#, fuzzy +#| msgid "Maximum number orders to load" +msgid "Maximum Orders to load" +msgstr "Ventas máximas a cargar" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_load_done_order_max_qty +#, fuzzy +#| msgid "" +#| "Maximum number of orders to load on the PoS at its init. Set it to 0 to " +#| "load none (it's still posible to load them by ticket code)." +msgid "" +"Maximum number of orders to load on the PoS at its init. Set it to 0 to load " +"none (it's still possible to load them by ticket code)." +msgstr "" +"Número máximo de ventas a cargar en el PdV cuando este se inicia. " +"Establézcalo a 0 para no cargar ninguna (es posible cargarlas por referencia " +"del ticket)." + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_order_mgmt +msgid "Order Management" +msgstr "Gestión de pedidos" + +#. module: pos_order_mgmt +#: model:ir.model,name:pos_order_mgmt.model_pos_config +msgid "Point of Sale Configuration" +msgstr "Configuración del Punto de Venta" + +#. module: pos_order_mgmt +#: model:ir.model,name:pos_order_mgmt.model_pos_order +msgid "Point of Sale Orders" +msgstr "Pedidos del Punto de Venta" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:58 +#, python-format +msgid "Print a duplicate for this order" +msgstr "Imprima un duplicado para este pedido" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:83 +#, python-format +msgid "Rectifies:" +msgstr "Rectifica:" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:33 +#, python-format +msgid "Ref." +msgstr "Ref." + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__returned_order_reference +msgid "Reference of the returned Order" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:245 +#, python-format +msgid "Refund " +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__refund_order_ids +#, fuzzy +#| msgid "Returned order:" +msgid "Refund Orders" +msgstr "Devolución de venta:" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__refund_order_qty +#, fuzzy +#| msgid "Max. Done Orders Quantity To Load" +msgid "Refund Orders Quantity" +msgstr "Nº Máximo de Ventas Realizadas a Cargar" + +#. module: pos_order_mgmt +#: model_terms:ir.ui.view,arch_db:pos_order_mgmt.view_pos_order_form +msgid "Refunds" +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_reprint_done_order +#, fuzzy +#| msgid "Load Done Orders" +msgid "Reprint Orders" +msgstr "Cargar Ventas Realizadas" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_return_done_order +#, fuzzy +#| msgid "Returned order:" +msgid "Return Orders" +msgstr "Devolución de venta:" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__returned_order_id +#, fuzzy +#| msgid "Returned order:" +msgid "Returned Order" +msgstr "Devolución de venta:" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:74 +#, python-format +msgid "Returned order:" +msgstr "Devolución de venta:" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:21 +#, python-format +msgid "Search Order" +msgstr "Buscar Venta" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:385 +#, python-format +msgid "" +"Unable to load some order lines because the products are not available in " +"the POS cache.\n" +"\n" +"Please check that lines :\n" +"\n" +" * " +msgstr "" +"No fue posible cargar algunas líneas porque los pedidos no están disponibles " +"en la caché del PdV.\n" +"\n" +"Por favor, compruebe estas líneas :\n" +"\n" +" * " + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:384 +#, python-format +msgid "Unknown Products" +msgstr "Productos desconocidos" + +#, fuzzy +#~| msgid "Allow to load done orders in this POS" +#~ msgid "Allow to duplicate done orders in this POS" +#~ msgstr "Permitir cargar pedidos en este PdV" + +#, fuzzy +#~| msgid "Allow to load done orders in this POS" +#~ msgid "Allow to reprint done orders in this POS" +#~ msgstr "Permitir cargar pedidos en este PdV" + +#, fuzzy +#~| msgid "Allow to load done orders in this POS" +#~ msgid "Allow to return done orders in this POS" +#~ msgstr "Permitir cargar pedidos en este PdV" + +#~ msgid "Load Done Order Max Qty." +#~ msgstr "Nº Máximo de Ventas a Cargar." + +#~ msgid "Max. Done Orders Quantity To Load" +#~ msgstr "Nº Máximo de Ventas Realizadas a Cargar" + +#, fuzzy +#~| msgid "Returned order:" +#~ msgid "Return Done Orders" +#~ msgstr "Devolución de venta:" + +#~ msgid "" +#~ "Allows to load already done orders in the frontend to operate over them, " +#~ "allowing reprint the tickets, return items, etc." +#~ msgstr "" +#~ "Permite cargar pedidos ya realizados desde el PdV para operar sobre " +#~ "ellos: reimprimir tickes, devoluciónes, etc." + +#~ msgid "pos.config" +#~ msgstr "'pos.config'" diff --git a/pos_order_mgmt/i18n/fr.po b/pos_order_mgmt/i18n/fr.po new file mode 100644 index 00000000..504a0a1a --- /dev/null +++ b/pos_order_mgmt/i18n/fr.po @@ -0,0 +1,272 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_order_mgmt +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-07-15 20:54+0000\n" +"PO-Revision-Date: 2020-03-19 11:13+0000\n" +"Last-Translator: Simon Mas \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_copy_done_order +msgid "Allows to duplicate already done orders in the frontend" +msgstr "Autoriser à dupliquer des commandes réalisées dans l'interface tactile" + +#. module: pos_order_mgmt +#: model_terms:ir.ui.view,arch_db:pos_order_mgmt.view_pos_config_form +msgid "Allows to manage already done orders in the frontend." +msgstr "" +"Autoriser à rembourser des commandes réalisées dans l'interface tactile." + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_order_mgmt +msgid "Allows to manage orders in the frontend" +msgstr "Autoriser à gérer des commandes réalisées dans l'interface tactile" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_reprint_done_order +msgid "Allows to reprint already done orders in the frontend" +msgstr "" +"Autoriser à réimprimer des commandes réalisées dans l'interface tactile" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_return_done_order +msgid "Allows to return already done orders in the frontend" +msgstr "" +"Autoriser à rembourser des commandes réalisées dans l'interface tactile" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:36 +#, python-format +msgid "Amount" +msgstr "Total" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:17 +#, python-format +msgid "Back" +msgstr "Retour" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:368 +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:423 +#, python-format +msgid "Can not execute this action because the POS is currently offline" +msgstr "" +"Vous ne pouvez pas exécuter cette action, car le Point de Vente est " +"actuellement hors ligne" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:367 +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:422 +#, python-format +msgid "Connection error" +msgstr "Erreur de connexion" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:61 +#, python-format +msgid "Create a new order based on this one" +msgstr "Créer une nouvelle commande basée sur celle-ci" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:64 +#, python-format +msgid "Create a refund order of this order" +msgstr "Rembourser cette commande" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:34 +#, python-format +msgid "Customer" +msgstr "Client" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:89 +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:98 +#, python-format +msgid "DUPLICATE" +msgstr "DUPLICATA" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:35 +#, python-format +msgid "Date" +msgstr "Date" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_copy_done_order +msgid "Duplicate Orders" +msgstr "Copier une commande réalisée" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_load_done_order_max_qty +msgid "Maximum Orders to load" +msgstr "Nombre maximum de commande à charger" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_load_done_order_max_qty +msgid "" +"Maximum number of orders to load on the PoS at its init. Set it to 0 to load " +"none (it's still possible to load them by ticket code)." +msgstr "" +"Nombre maximum de commandes à charger dans le point de vente à son " +"initialisation. Indiquer \"0\" pour n'en charger aucune (Il est toujours " +"possible de les charger par une référence de commande)." + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_order_mgmt +msgid "Order Management" +msgstr "Gestion des commandes" + +#. module: pos_order_mgmt +#: model:ir.model,name:pos_order_mgmt.model_pos_config +msgid "Point of Sale Configuration" +msgstr "Paramétrage du point de vente" + +#. module: pos_order_mgmt +#: model:ir.model,name:pos_order_mgmt.model_pos_order +msgid "Point of Sale Orders" +msgstr "Commandes du point de vente" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:58 +#, python-format +msgid "Print a duplicate for this order" +msgstr "Imprimer un duplicata de cette commande" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:83 +#, python-format +msgid "Rectifies:" +msgstr "Rectifie : " + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:33 +#, python-format +msgid "Ref." +msgstr "Réf." + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__returned_order_reference +msgid "Reference of the returned Order" +msgstr "Réference de la vente retournée" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:245 +#, python-format +msgid "Refund " +msgstr "Rembourse " + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__refund_order_ids +msgid "Refund Orders" +msgstr "Commandes remboursées" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__refund_order_qty +msgid "Refund Orders Quantity" +msgstr "Nombre de remboursements" + +#. module: pos_order_mgmt +#: model_terms:ir.ui.view,arch_db:pos_order_mgmt.view_pos_order_form +msgid "Refunds" +msgstr "Remboursements" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_reprint_done_order +msgid "Reprint Orders" +msgstr "Réimprimer les tickets de commandes réalisées" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_return_done_order +msgid "Return Orders" +msgstr "Commande retournée" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__returned_order_id +msgid "Returned Order" +msgstr "Commande retournée" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:74 +#, python-format +msgid "Returned order:" +msgstr "Commande retournée:" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:21 +#, python-format +msgid "Search Order" +msgstr "Recherche une commande" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:385 +#, python-format +msgid "" +"Unable to load some order lines because the products are not available in " +"the POS cache.\n" +"\n" +"Please check that lines :\n" +"\n" +" * " +msgstr "" +"Impossible de charger certaines lignes de ticket car les produits ne sont " +"pas disponible dans le point de vente\n" +"Veuillez vérifier les lignes suivantes : \n" +"\n" +" * " + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:384 +#, python-format +msgid "Unknown Products" +msgstr "Produit inconnu" + +#~ msgid "Allow to duplicate done orders in this POS" +#~ msgstr "" +#~ "Autoriser à dupliquer des commandes réalisées dans l'interface tactile" + +#~ msgid "Allow to reprint done orders in this POS" +#~ msgstr "" +#~ "Autoriser à réimprimer des commandes réalisées dans l'interface tactile" + +#~ msgid "Allow to return done orders in this POS" +#~ msgstr "" +#~ "Autoriser à rembourser des commandes réalisées dans l'interface tactile" + +#~ msgid "Load Done Order Max Qty." +#~ msgstr "Quantité maximale de commandes à charger" + +#~ msgid "Max. Done Orders Quantity To Load" +#~ msgstr "Quantité maximale de commandes à charger" + +#~ msgid "Return Done Orders" +#~ msgstr "Retourner une commande réalisée" diff --git a/pos_order_mgmt/i18n/it.po b/pos_order_mgmt/i18n/it.po new file mode 100644 index 00000000..e972e0d4 --- /dev/null +++ b/pos_order_mgmt/i18n/it.po @@ -0,0 +1,246 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_order_mgmt +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-11-22 13:35+0000\n" +"Last-Translator: Lorenzo Battistini \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.8\n" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_copy_done_order +msgid "Allows to duplicate already done orders in the frontend" +msgstr "Permette di duplicare ordini già fatti nel frontend" + +#. module: pos_order_mgmt +#: model_terms:ir.ui.view,arch_db:pos_order_mgmt.view_pos_config_form +msgid "Allows to manage already done orders in the frontend." +msgstr "Permette di gestire ordini già fatti nel frontend." + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_order_mgmt +msgid "Allows to manage orders in the frontend" +msgstr "Permette di gestire ordini nel frontend" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_reprint_done_order +msgid "Allows to reprint already done orders in the frontend" +msgstr "Permette di ristampare ordini già fatti nel frontend" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_return_done_order +msgid "Allows to return already done orders in the frontend" +msgstr "Permette di fare il reso di ordini già fatti nel frontend" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:36 +#, python-format +msgid "Amount" +msgstr "Importo" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:17 +#, python-format +msgid "Back" +msgstr "Indietro" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:368 +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:423 +#, python-format +msgid "Can not execute this action because the POS is currently offline" +msgstr "Impossibile eseguire questa azione perchè il POS è attualmente offline" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:367 +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:422 +#, python-format +msgid "Connection error" +msgstr "Errore di connessione" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:61 +#, python-format +msgid "Create a new order based on this one" +msgstr "Creare un nuovo ordine basato su questo" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:64 +#, python-format +msgid "Create a refund order of this order" +msgstr "Creare un reso di quest'ordine" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:34 +#, python-format +msgid "Customer" +msgstr "Cliente" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:89 +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:98 +#, python-format +msgid "DUPLICATE" +msgstr "DUPLICATO" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:35 +#, python-format +msgid "Date" +msgstr "Data" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_copy_done_order +msgid "Duplicate Orders" +msgstr "Ordini duplicati" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_load_done_order_max_qty +msgid "Maximum Orders to load" +msgstr "Numero massimo di ordini da caricare" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_load_done_order_max_qty +msgid "" +"Maximum number of orders to load on the PoS at its init. Set it to 0 to load " +"none (it's still possible to load them by ticket code)." +msgstr "" +"Massimo numero di ordini da caricare nel PoS al suo avvio. Impostarlo a 0 " +"per non caricarne nessuno (è sempre possibile caricarli tramite codice " +"scontrino)." + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_order_mgmt +msgid "Order Management" +msgstr "Gestione ordine" + +#. module: pos_order_mgmt +#: model:ir.model,name:pos_order_mgmt.model_pos_config +msgid "Point of Sale Configuration" +msgstr "Configurazione punto vendita" + +#. module: pos_order_mgmt +#: model:ir.model,name:pos_order_mgmt.model_pos_order +msgid "Point of Sale Orders" +msgstr "Ordini punto vendita" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:58 +#, python-format +msgid "Print a duplicate for this order" +msgstr "Stampare un duplicato di quest'ordine" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:83 +#, python-format +msgid "Rectifies:" +msgstr "Rettifica:" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:33 +#, python-format +msgid "Ref." +msgstr "Rif." + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__returned_order_reference +msgid "Reference of the returned Order" +msgstr "Riferimento del reso" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:245 +#, python-format +msgid "Refund " +msgstr "Reso " + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__refund_order_ids +msgid "Refund Orders" +msgstr "Ordini di reso" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__refund_order_qty +msgid "Refund Orders Quantity" +msgstr "Quantità ordini di reso" + +#. module: pos_order_mgmt +#: model_terms:ir.ui.view,arch_db:pos_order_mgmt.view_pos_order_form +msgid "Refunds" +msgstr "Resi" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_reprint_done_order +msgid "Reprint Orders" +msgstr "Ordini ristampa" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_return_done_order +msgid "Return Orders" +msgstr "Ordini di reso" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__returned_order_id +msgid "Returned Order" +msgstr "Reso" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:74 +#, python-format +msgid "Returned order:" +msgstr "Reso:" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:21 +#, python-format +msgid "Search Order" +msgstr "Ricerca ordine" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:385 +#, python-format +msgid "" +"Unable to load some order lines because the products are not available in " +"the POS cache.\n" +"\n" +"Please check that lines :\n" +"\n" +" * " +msgstr "" +"Impossibile caricare alcune righe d'ordine perchè i prodotti non sono " +"disponibili nella cache POS.\n" +"\n" +"Per favore controllare quelle righe :\n" +"\n" +" * " + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:384 +#, python-format +msgid "Unknown Products" +msgstr "Prodotti sconosciuti" diff --git a/pos_order_mgmt/i18n/pos_order_mgmt.pot b/pos_order_mgmt/i18n/pos_order_mgmt.pot new file mode 100644 index 00000000..93b60e83 --- /dev/null +++ b/pos_order_mgmt/i18n/pos_order_mgmt.pot @@ -0,0 +1,231 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_order_mgmt +# +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: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_copy_done_order +msgid "Allows to duplicate already done orders in the frontend" +msgstr "" + +#. module: pos_order_mgmt +#: model_terms:ir.ui.view,arch_db:pos_order_mgmt.view_pos_config_form +msgid "Allows to manage already done orders in the frontend." +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_order_mgmt +msgid "Allows to manage orders in the frontend" +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_reprint_done_order +msgid "Allows to reprint already done orders in the frontend" +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_return_done_order +msgid "Allows to return already done orders in the frontend" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:36 +#, python-format +msgid "Amount" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:17 +#, python-format +msgid "Back" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:368 +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:423 +#, python-format +msgid "Can not execute this action because the POS is currently offline" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:367 +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:422 +#, python-format +msgid "Connection error" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:61 +#, python-format +msgid "Create a new order based on this one" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:64 +#, python-format +msgid "Create a refund order of this order" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:34 +#, python-format +msgid "Customer" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:89 +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:98 +#, python-format +msgid "DUPLICATE" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:35 +#, python-format +msgid "Date" +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_copy_done_order +msgid "Duplicate Orders" +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_load_done_order_max_qty +msgid "Maximum Orders to load" +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_load_done_order_max_qty +msgid "Maximum number of orders to load on the PoS at its init. Set it to 0 to load none (it's still possible to load them by ticket code)." +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_order_mgmt +msgid "Order Management" +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model,name:pos_order_mgmt.model_pos_config +msgid "Point of Sale Configuration" +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model,name:pos_order_mgmt.model_pos_order +msgid "Point of Sale Orders" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:58 +#, python-format +msgid "Print a duplicate for this order" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:83 +#, python-format +msgid "Rectifies:" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:33 +#, python-format +msgid "Ref." +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__returned_order_reference +msgid "Reference of the returned Order" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:245 +#, python-format +msgid "Refund " +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__refund_order_ids +msgid "Refund Orders" +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__refund_order_qty +msgid "Refund Orders Quantity" +msgstr "" + +#. module: pos_order_mgmt +#: model_terms:ir.ui.view,arch_db:pos_order_mgmt.view_pos_order_form +msgid "Refunds" +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_reprint_done_order +msgid "Reprint Orders" +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_return_done_order +msgid "Return Orders" +msgstr "" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__returned_order_id +msgid "Returned Order" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:74 +#, python-format +msgid "Returned order:" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:21 +#, python-format +msgid "Search Order" +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:385 +#, python-format +msgid "Unable to load some order lines because the products are not available in the POS cache.\n" +"\n" +"Please check that lines :\n" +"\n" +" * " +msgstr "" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:384 +#, python-format +msgid "Unknown Products" +msgstr "" + diff --git a/pos_order_mgmt/i18n/pt.po b/pos_order_mgmt/i18n/pt.po new file mode 100644 index 00000000..ce588c64 --- /dev/null +++ b/pos_order_mgmt/i18n/pt.po @@ -0,0 +1,246 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_order_mgmt +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-11-24 13:35+0000\n" +"Last-Translator: Pedro Castro Silva \n" +"Language-Team: none\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.8\n" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_copy_done_order +msgid "Allows to duplicate already done orders in the frontend" +msgstr "Permite duplicar no frontend pedidos previamente efetuados" + +#. module: pos_order_mgmt +#: model_terms:ir.ui.view,arch_db:pos_order_mgmt.view_pos_config_form +msgid "Allows to manage already done orders in the frontend." +msgstr "Permite a gestão no frontend de pedidos previamente efetuados." + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_order_mgmt +msgid "Allows to manage orders in the frontend" +msgstr "Permite gerir pedidos no frontend" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_reprint_done_order +msgid "Allows to reprint already done orders in the frontend" +msgstr "Permite a reimpressão no frontend de pedidos previamente efetuados" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_return_done_order +msgid "Allows to return already done orders in the frontend" +msgstr "Permite a devolução no frontend de pedidos previamente efetuados" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:36 +#, python-format +msgid "Amount" +msgstr "Montante" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:17 +#, python-format +msgid "Back" +msgstr "Voltar" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:368 +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:423 +#, python-format +msgid "Can not execute this action because the POS is currently offline" +msgstr "Não é possível executar esta ação porque o POS está offline" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:367 +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:422 +#, python-format +msgid "Connection error" +msgstr "Erro de conexão" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:61 +#, python-format +msgid "Create a new order based on this one" +msgstr "Criar um novo pedido baseado neste" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:64 +#, python-format +msgid "Create a refund order of this order" +msgstr "Criar um pedido de reembolso deste pedido" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:34 +#, python-format +msgid "Customer" +msgstr "Cliente" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:89 +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:98 +#, python-format +msgid "DUPLICATE" +msgstr "DUPLICADO" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:35 +#, python-format +msgid "Date" +msgstr "Data" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_copy_done_order +msgid "Duplicate Orders" +msgstr "Duplicar Pedidos" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_load_done_order_max_qty +msgid "Maximum Orders to load" +msgstr "Máximo de Pedidos a carregar" + +#. module: pos_order_mgmt +#: model:ir.model.fields,help:pos_order_mgmt.field_pos_config__iface_load_done_order_max_qty +msgid "" +"Maximum number of orders to load on the PoS at its init. Set it to 0 to load " +"none (it's still possible to load them by ticket code)." +msgstr "" +"Nº máximo de pedidos a carregar no POS na sua inicialização. Atribua o valor " +"0 para não carregar nenhum (será ainda assim possível carregá-los por código " +"de ticket)." + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_order_mgmt +msgid "Order Management" +msgstr "Gestão de Pedidos" + +#. module: pos_order_mgmt +#: model:ir.model,name:pos_order_mgmt.model_pos_config +msgid "Point of Sale Configuration" +msgstr "Configuração do Ponto de Venda" + +#. module: pos_order_mgmt +#: model:ir.model,name:pos_order_mgmt.model_pos_order +msgid "Point of Sale Orders" +msgstr "Pedidos do Ponto de Venda" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:58 +#, python-format +msgid "Print a duplicate for this order" +msgstr "Imprimir um duplicado para este pedido" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:83 +#, python-format +msgid "Rectifies:" +msgstr "Retifica:" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:33 +#, python-format +msgid "Ref." +msgstr "Refª" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__returned_order_reference +msgid "Reference of the returned Order" +msgstr "Referência do pedido devolvido" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:245 +#, python-format +msgid "Refund " +msgstr "Reembolso " + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__refund_order_ids +msgid "Refund Orders" +msgstr "Reembolsar Pedidos" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__refund_order_qty +msgid "Refund Orders Quantity" +msgstr "Quantidade de Pedidos de Reembolso" + +#. module: pos_order_mgmt +#: model_terms:ir.ui.view,arch_db:pos_order_mgmt.view_pos_order_form +msgid "Refunds" +msgstr "Reembolsos" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_reprint_done_order +msgid "Reprint Orders" +msgstr "Reimprimir Pedidos" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_config__iface_return_done_order +msgid "Return Orders" +msgstr "Devolver Pedidos" + +#. module: pos_order_mgmt +#: model:ir.model.fields,field_description:pos_order_mgmt.field_pos_order__returned_order_id +msgid "Returned Order" +msgstr "Pedido Devolvido" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:74 +#, python-format +msgid "Returned order:" +msgstr "Pedido devolvido:" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/xml/pos.xml:21 +#, python-format +msgid "Search Order" +msgstr "Pesquisar Pedido" + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:385 +#, python-format +msgid "" +"Unable to load some order lines because the products are not available in " +"the POS cache.\n" +"\n" +"Please check that lines :\n" +"\n" +" * " +msgstr "" +"Não foi possível carregar algumas linhas de pedidos porque os produtos não " +"estão disponíveis na cache do POS.\n" +"\n" +"Por favor, verifique que as linhas :\n" +"\n" +" * " + +#. module: pos_order_mgmt +#. openerp-web +#: code:addons/pos_order_mgmt/static/src/js/widgets.js:384 +#, python-format +msgid "Unknown Products" +msgstr "Produtos Desconhecidos" diff --git a/pos_order_mgmt/models/__init__.py b/pos_order_mgmt/models/__init__.py new file mode 100644 index 00000000..234b311e --- /dev/null +++ b/pos_order_mgmt/models/__init__.py @@ -0,0 +1,2 @@ +from . import pos_config +from . import pos_order diff --git a/pos_order_mgmt/models/pos_config.py b/pos_order_mgmt/models/pos_config.py new file mode 100644 index 00000000..8f53d4be --- /dev/null +++ b/pos_order_mgmt/models/pos_config.py @@ -0,0 +1,45 @@ +# Copyright 2018 GRAP - Sylvain LE GAL +# Copyright 2018 Tecnativa S.L. - David Vidal +# Copyright 2019 Coop IT Easy SCRLfs +# Pierrick Brun +# Copyright 2019 Druidoo - Iván Todorovich +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class PosConfig(models.Model): + _inherit = 'pos.config' + + iface_order_mgmt = fields.Boolean( + string='Order Management', + help='Allows to manage orders in the frontend', + default=True, + ) + + iface_reprint_done_order = fields.Boolean( + string='Reprint Orders', + default=True, + help='Allows to reprint already done orders in the frontend', + ) + + iface_return_done_order = fields.Boolean( + string='Return Orders', + default=True, + help='Allows to return already done orders in the frontend', + ) + + iface_copy_done_order = fields.Boolean( + string='Duplicate Orders', + default=True, + help='Allows to duplicate already done orders in the frontend', + ) + + iface_load_done_order_max_qty = fields.Integer( + string='Maximum Orders to load', + default=10, + required=True, + help='Maximum number of orders to load on the PoS at its init. ' + 'Set it to 0 to load none (it\'s still possible to load them by ' + 'ticket code).', + ) diff --git a/pos_order_mgmt/models/pos_order.py b/pos_order_mgmt/models/pos_order.py new file mode 100644 index 00000000..7f6730b1 --- /dev/null +++ b/pos_order_mgmt/models/pos_order.py @@ -0,0 +1,154 @@ +# Copyright 2018 GRAP - Sylvain LE GAL +# Copyright 2018 Tecnativa S.L. - David Vidal +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, models, fields + + +class PosOrder(models.Model): + _inherit = 'pos.order' + + returned_order_id = fields.Many2one( + comodel_name='pos.order', + string='Returned Order', + readonly=True, + ) + + returned_order_reference = fields.Char( + related='returned_order_id.pos_reference', + string='Reference of the returned Order') + + refund_order_ids = fields.One2many( + comodel_name='pos.order', + inverse_name='returned_order_id', + string='Refund Orders', + readonly=True, + ) + + refund_order_qty = fields.Integer( + compute='_compute_refund_order_qty', + string='Refund Orders Quantity', + ) + + @api.depends('refund_order_ids') + def _compute_refund_order_qty(self): + for order in self: + order.refund_order_qty = len(order.refund_order_ids) + + def action_view_refund_orders(self): + self.ensure_one() + + action = self.env.ref('point_of_sale.action_pos_pos_form').read()[0] + + if self.refund_order_qty == 1: + action['views'] = [ + (self.env.ref('point_of_sale.view_pos_pos_form').id, 'form')] + action['res_id'] = self.refund_order_ids.ids[0] + else: + action['domain'] = [('id', 'in', self.refund_order_ids.ids)] + return action + + def refund(self): + return super(PosOrder, self.with_context(refund=True)).refund() + + @api.returns('self', lambda value: value.id) + def copy(self, default=None): + self.ensure_one() + order = super().copy(default=default) + if self.env.context.get('refund', False): + order.returned_order_id = self.id + return order + + @api.model + def _prepare_filter_for_pos(self, pos_session_id): + return [ + ('state', 'in', ['paid', 'done', 'invoiced']), + ] + + @api.model + def _prepare_filter_query_for_pos(self, pos_session_id, query): + return [ + '|', '|', + ('name', 'ilike', query), + ('pos_reference', 'ilike', query), + ('partner_id.display_name', 'ilike', query), + ] + + @api.model + def _prepare_fields_for_pos_list(self): + return [ + 'name', 'pos_reference', 'partner_id', 'date_order', + 'amount_total', + ] + + @api.model + def search_done_orders_for_pos(self, query, pos_session_id): + session_obj = self.env['pos.session'] + config = session_obj.browse(pos_session_id).config_id + condition = self._prepare_filter_for_pos(pos_session_id) + if not query: + # Search only this POS orders + condition += [('config_id', '=', config.id)] + else: + # Search globally by criteria + condition += self._prepare_filter_query_for_pos( + pos_session_id, query) + field_names = self._prepare_fields_for_pos_list() + return self.search_read( + condition, field_names, limit=config.iface_load_done_order_max_qty) + + @api.model + def _prepare_done_order_for_pos(self): + self.ensure_one() + order_lines = [] + payment_lines = [] + for order_line in self.lines: + order_line = self._prepare_done_order_line_for_pos(order_line) + order_lines.append(order_line) + for payment_line in self.payment_ids: + payment_line = self._prepare_done_order_payment_for_pos( + payment_line) + payment_lines.append(payment_line) + res = { + 'id': self.id, + 'date_order': self.date_order, + 'pos_reference': self.pos_reference, + 'name': self.name, + 'partner_id': self.partner_id.id, + 'fiscal_position': self.fiscal_position_id.id, + 'line_ids': order_lines, + 'statement_ids': payment_lines, + 'to_invoice': bool(self.to_invoice), + 'returned_order_id': self.returned_order_id.id, + 'returned_order_reference': self.returned_order_reference, + } + return res + + def _prepare_done_order_line_for_pos(self, order_line): + self.ensure_one() + return { + 'product_id': order_line.product_id.id, + 'qty': order_line.qty, + 'price_unit': order_line.price_unit, + 'discount': order_line.discount, + 'pack_lot_names': order_line.pack_lot_ids.mapped('lot_name'), + } + + def _prepare_done_order_payment_for_pos(self, payment_line): + self.ensure_one() + return { + 'journal_id': payment_line.pos_order_id.sale_journal, + 'amount': payment_line.amount, + } + + def load_done_order_for_pos(self): + self.ensure_one() + return self._prepare_done_order_for_pos() + + @api.model + def _order_fields(self, ui_order): + res = super()._order_fields(ui_order) + res.update({ + 'returned_order_id': ui_order.get('returned_order_id', False), + }) + return res diff --git a/pos_order_mgmt/readme/CONFIGURE.rst b/pos_order_mgmt/readme/CONFIGURE.rst new file mode 100644 index 00000000..4bd22f33 --- /dev/null +++ b/pos_order_mgmt/readme/CONFIGURE.rst @@ -0,0 +1,18 @@ +To configure this module, you need to go to *Point of Sale > Configuration > +Point of Sale* and enable *Order Management* + +.. image:: ../static/description/order-mgmt-config.png + +#. Change *Maximum orders to load* to your desired amount (10 by default). + Please note that the more you load, the more it will take to load + them in the session opening. You can also set it to 0 and you'll just be + able to load them from the order list screen. + +#. Enable *Reprint orders* on if you want to be able to reprint past orders + in that PoS. + +#. Enable *Return orders* on if you want to be able to return past orders + in that PoS. + +#. Enable *Duplicate orders* on if you want to be able to return past orders + in that PoS. diff --git a/pos_order_mgmt/readme/CONTRIBUTORS.rst b/pos_order_mgmt/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..2f54f29c --- /dev/null +++ b/pos_order_mgmt/readme/CONTRIBUTORS.rst @@ -0,0 +1,6 @@ +* David Vidal +* Sylvain LE GAL (https://twitter.com/legalsylvain) +* Carlos Martínez +* Pierrick Brun +* Iván Todorovich +* David Alonso diff --git a/pos_order_mgmt/readme/DESCRIPTION.rst b/pos_order_mgmt/readme/DESCRIPTION.rst new file mode 100644 index 00000000..0b3deafb --- /dev/null +++ b/pos_order_mgmt/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +This module extends the functionality of the PoS frontend allowing to load +already done PoS Orders in order to be able to operate over them, being able to +reprint past tickets or return them. diff --git a/pos_order_mgmt/readme/ROADMAP.rst b/pos_order_mgmt/readme/ROADMAP.rst new file mode 100644 index 00000000..8c2c2300 --- /dev/null +++ b/pos_order_mgmt/readme/ROADMAP.rst @@ -0,0 +1,4 @@ +* This module contains a *basic return* feature that makes possible returning + the same order over and over. If you need a full return feature, you can + install ``pos_order_return`` (only back office implementation), or + ``pos_order_return_traceability``, which also covers front office support. diff --git a/pos_order_mgmt/readme/USAGE.rst b/pos_order_mgmt/readme/USAGE.rst new file mode 100644 index 00000000..5a7fd0a8 --- /dev/null +++ b/pos_order_mgmt/readme/USAGE.rst @@ -0,0 +1,19 @@ +Once the PoS is loaded, you'll find a shopping trolley icon (🛒) in the top +bar that grants access to the order list screen. + +.. image:: ../static/description/order-mgmt-icon.png + +There you can find the number of past orders loaded according to your +configuration (see Configuration) as well as the orders you checked out in +the current session: + +.. image:: ../static/description/order-mgmt-list.png + +#. You can see their totals as well as their custumers if registered. +#. You can reprint their tickets clicking on the printer icon (⎙). +#. You can return them pressing on the arrow icon (↶). +#. You have a search input as well that lets you find past tickets by its + reference number. + +NOTE: You'll need your PoS to be online to be able to search or return a past +ticket. diff --git a/pos_order_mgmt/static/description/icon.png b/pos_order_mgmt/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cafb0ac02d2e816d4311a5a6ca9fad4670ab76e0 GIT binary patch literal 15006 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 literal 0 HcmV?d00001 diff --git a/pos_order_mgmt/static/description/index.html b/pos_order_mgmt/static/description/index.html new file mode 100644 index 00000000..05c97211 --- /dev/null +++ b/pos_order_mgmt/static/description/index.html @@ -0,0 +1,477 @@ + + + + + + +POS Frontend Orders Management + + + +
+

POS Frontend Orders Management

+ + +

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

+

This module extends the functionality of the PoS frontend allowing to load +already done PoS Orders in order to be able to operate over them, being able to +reprint past tickets or return them.

+

Table of contents

+ +
+

Configuration

+

To configure this module, you need to go to Point of Sale > Configuration > +Point of Sale and enable Order Management

+https://raw.githubusercontent.com/OCA/pos/12.0/pos_order_mgmt/static/description/order-mgmt-config.png +
    +
  1. Change Maximum orders to load to your desired amount (10 by default). +Please note that the more you load, the more it will take to load +them in the session opening. You can also set it to 0 and you’ll just be +able to load them from the order list screen.
  2. +
  3. Enable Reprint orders on if you want to be able to reprint past orders +in that PoS.
  4. +
  5. Enable Return orders on if you want to be able to return past orders +in that PoS.
  6. +
  7. Enable Duplicate orders on if you want to be able to return past orders +in that PoS.
  8. +
+
+
+

Usage

+

Once the PoS is loaded, you’ll find a shopping trolley icon (🛒) in the top +bar that grants access to the order list screen.

+https://raw.githubusercontent.com/OCA/pos/12.0/pos_order_mgmt/static/description/order-mgmt-icon.png +

There you can find the number of past orders loaded according to your +configuration (see Configuration) as well as the orders you checked out in +the current session:

+https://raw.githubusercontent.com/OCA/pos/12.0/pos_order_mgmt/static/description/order-mgmt-list.png +
    +
  1. You can see their totals as well as their custumers if registered.
  2. +
  3. You can reprint their tickets clicking on the printer icon (⎙).
  4. +
  5. You can return them pressing on the arrow icon (↶).
  6. +
  7. You have a search input as well that lets you find past tickets by its +reference number.
  8. +
+

NOTE: You’ll need your PoS to be online to be able to search or return a past +ticket.

+
+
+

Known issues / Roadmap

+
    +
  • This module contains a basic return feature that makes possible returning +the same order over and over. If you need a full return feature, you can +install pos_order_return (only back office implementation), or +pos_order_return_traceability, which also covers front office support.
  • +
+
+
+

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
  • +
  • Tecnativa
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

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_mgmt/static/description/order-mgmt-config.png b/pos_order_mgmt/static/description/order-mgmt-config.png new file mode 100644 index 0000000000000000000000000000000000000000..5d27647a7cea95e4549ba0784a2af6d1e19ee93e GIT binary patch literal 13968 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

mUU++7v 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 WL)1_QGG9x~0O`;266N9s0sjT|wL~2N literal 0 HcmV?d00001 diff --git a/pos_order_mgmt/static/description/order-mgmt-icon.png b/pos_order_mgmt/static/description/order-mgmt-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e4723efb72da394d39817a6e1d396bbf534a8aca GIT binary patch literal 26304 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 QVMd1-=oz0b)UglyAOFc*i2wiq literal 0 HcmV?d00001 diff --git a/pos_order_mgmt/static/description/order-mgmt-list.png b/pos_order_mgmt/static/description/order-mgmt-list.png new file mode 100644 index 0000000000000000000000000000000000000000..4e2325869bea5b1e9347c0b3271ff0aedd175d85 GIT binary patch literal 39015 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 0) { + // If it is not change + order.add_paymentline(cashregister); + order.selected_paymentline.set_amount( + line.amount); + } + } + }); + }); + } + return order; + }, + + _prepare_orderlines_from_order_data: function ( + order, order_data, action) { + var orderLines = order_data.line_ids || order_data.lines || []; + + var self = this; + _.each(orderLines, function (orderLine) { + var line = orderLine; + // In case of local data + if (line.length === 3) { + line = line[2]; + } + var product = self.pos.db.get_product_by_id(line.product_id); + // Check if product are available in pos + if (_.isUndefined(product)) { + self.unknown_products.push(String(line.product_id)); + } else { + // Create a new order line + order.add_product(product, + self._prepare_product_options_from_orderline_data( + order, line, action)); + // Restore lot information. + if (['return'].indexOf(action) !== -1) { + var orderline = order.get_selected_orderline() + if (orderline.pack_lot_lines) { + _.each(orderline.return_pack_lot_names, function(lot_name) { + orderline.pack_lot_lines.add(new models.Packlotline( + {'lot_name': lot_name}, {'order_line': orderline} + )); + }) + orderline.trigger('change', orderline); + } + } + } + }); + }, + + _prepare_product_options_from_orderline_data: function ( + order, line, action) { + + var qty = line.qty; + if (['return'].indexOf(action) !== -1) { + // Invert line quantities + qty *= -1; + } + return { + price: line.price_unit, + quantity: qty, + discount: line.discount, + merge: false, + extras: { + return_pack_lot_names: line.pack_lot_names, + }, + } + + }, + + load_order_data: function (order_id) { + var self = this; + return this._rpc({ + model: 'pos.order', + method: 'load_done_order_for_pos', + args: [order_id], + }).catch(function (error) { + if (parseInt(error.code, 10) === 200) { + // Business Logic Error, not a connection problem + self.gui.show_popup( + 'error-traceback', { + 'title': error.data.message, + 'body': error.data.debug, + }); + } else { + self.gui.show_popup('error', { + 'title': _t('Connection error'), + 'body': _t( + 'Can not execute this action because the POS' + + ' is currently offline'), + }); + } + }); + }, + + load_order_from_data: function (order_data, action) { + var self = this; + this.unknown_products = []; + var order = self._prepare_order_from_order_data( + order_data, action); + // Forbid POS Order loading if some products are unknown + if (self.unknown_products.length > 0) { + self.gui.show_popup('error-traceback', { + 'title': _t('Unknown Products'), + 'body': _t('Unable to load some order lines because the ' + + 'products are not available in the POS cache.\n\n' + + 'Please check that lines :\n\n * ') + + self.unknown_products.join("; \n *"), + }); + return false; + } + return order; + }, + + // Search Part + search_done_orders: function (query) { + var self = this; + return this._rpc({ + model: 'pos.order', + method: 'search_done_orders_for_pos', + args: [query || '', this.pos.pos_session.id], + }).then(function (result) { + self.orders = result; + // Get the date in local time + _.each(self.orders, function (order) { + if (order.date_order) { + order.date_order = moment.utc(order.date_order) + .local().format('YYYY-MM-DD HH:mm:ss'); + } + }); + console.log('hello there :)') + }).catch(function (error, event) { + if (parseInt(error.code, 10) === 200) { + // Business Logic Error, not a connection problem + self.gui.show_popup( + 'error-traceback', { + 'title': error.data.message, + 'body': error.data.debug, + } + ); + } else { + self.gui.show_popup('error', { + 'title': _t('Connection error'), + 'body': _t( + 'Can not execute this action because the POS' + + ' is currently offline'), + }); + } + event.preventDefault(); + }); + }, + + perform_search: function () { + var self = this; + return this.search_done_orders(self.search_query) + .then(function () { + self.render_list(); + }); + }, + + clear_search: function () { + var self = this; + self.$('.searchbox input')[0].value = ''; + self.$('.searchbox input').focus(); + self.search_query = false; + self.perform_search(); + }, + }); + + gui.define_screen({ + name: 'orderlist', + widget: OrderListScreenWidget, + }); + + var ListOrderButtonWidget = PosBaseWidget.extend({ + template: 'ListOrderButtonWidget', + init: function (parent, options) { + var opts = options || {}; + this._super(parent, opts); + this.action = opts.action; + this.label = opts.label; + }, + + button_click: function () { + this.gui.show_screen('orderlist'); + }, + + renderElement: function () { + var self = this; + this._super(); + this.$el.click(function () { + self.button_click(); + }); + }, + }); + + var widgets = chrome.Chrome.prototype.widgets; + widgets.push({ + 'name': 'list_orders', + 'widget': ListOrderButtonWidget, + 'prepend': '.pos-rightheader', + 'args': { + 'label': 'All Orders', + }, + }); + + return { + ListOrderButtonWidget: ListOrderButtonWidget, + OrderListScreenWidget: OrderListScreenWidget, + }; + +}); diff --git a/pos_order_mgmt/static/src/xml/pos.xml b/pos_order_mgmt/static/src/xml/pos.xml new file mode 100644 index 00000000..769ae352 --- /dev/null +++ b/pos_order_mgmt/static/src/xml/pos.xml @@ -0,0 +1,104 @@ + + + + + +

+ +
+ + + + +
+
+
+ + + Back + + + + + + +
+
+
+
+
+
+ + + + + + + + + +
Ref.CustomerDateAmount +
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+ Returned order: +
+
+
+ + + + +
+ Rectifies: + +
+ + +
+
DUPLICATE
+
+
+
+
+ + + + +
DUPLICATE
+
+
+
+
+ + diff --git a/pos_order_mgmt/tests/__init__.py b/pos_order_mgmt/tests/__init__.py new file mode 100644 index 00000000..d9b96c4f --- /dev/null +++ b/pos_order_mgmt/tests/__init__.py @@ -0,0 +1 @@ +from . import test_module diff --git a/pos_order_mgmt/tests/test_module.py b/pos_order_mgmt/tests/test_module.py new file mode 100644 index 00000000..1478a90a --- /dev/null +++ b/pos_order_mgmt/tests/test_module.py @@ -0,0 +1,80 @@ +# Copyright (C) 2019 - 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 fields +from odoo.tests.common import TransactionCase + + +class TestModule(TransactionCase): + + def setUp(self): + super(TestModule, self).setUp() + + # Get Registry + self.PosOrder = self.env['pos.order'] + self.AccountPayment = self.env['account.payment'] + + # Get Object + self.pos_product = self.env.ref('point_of_sale.whiteboard_pen') + self.pricelist = self.env.ref('product.list0') + self.partner = self.env.ref('base.res_partner_12') + + # Create a new pos config and open it + self.pos_config = self.env.ref('point_of_sale.pos_config_main').copy() + self.pos_config.open_session_cb() + + # Test Section + def test_load_order(self): + order = self._create_order() + orders_data = self.PosOrder.search_done_orders_for_pos( + [], self.pos_config.current_session_id.id) + self.assertEqual(len(orders_data), 1) + self.assertEqual( + orders_data[0]['id'], order.id) + + detail_data = order.load_done_order_for_pos() + self.assertEqual( + len(detail_data.get('line_ids', [])), 1, + "Loading order detail failed") + + def _create_order(self): + # Create order + order_data = { + 'id': u'0006-001-0010', + 'to_invoice': True, + 'data': { + 'pricelist_id': self.pricelist.id, + 'user_id': 1, + 'name': 'Order 0006-001-0010', + 'partner_id': self.partner.id, + 'amount_paid': 0.9, + 'pos_session_id': self.pos_config.current_session_id.id, + 'lines': [[0, 0, { + 'product_id': self.pos_product.id, + 'price_unit': 0.9, + 'qty': 1, + 'price_subtotal': 0.9, + 'price_subtotal_incl': 0.9, + }]], + 'statement_ids': [[0, 0, { + 'journal_id': self.pos_config.journal_ids[0].id, + 'amount': 0.9, + 'name': fields.Datetime.now(), + 'account_id': + self.env.user.partner_id.property_account_receivable_id.id, + 'statement_id': + self.pos_config.current_session_id.statement_ids[0].id, + }]], + 'creation_date': u'2018-09-27 15:51:03', + 'amount_tax': 0, + 'fiscal_position_id': False, + 'uid': u'00001-001-0001', + 'amount_return': 0, + 'sequence_number': 1, + 'amount_total': 0.9, + }} + + result = self.PosOrder.create_from_ui([order_data]) + order = self.PosOrder.browse(result[0]) + return order diff --git a/pos_order_mgmt/views/assets.xml b/pos_order_mgmt/views/assets.xml new file mode 100644 index 00000000..126e81c3 --- /dev/null +++ b/pos_order_mgmt/views/assets.xml @@ -0,0 +1,13 @@ + + + +