diff --git a/l10n_es_pos_by_device/__init__.py b/l10n_es_pos_by_device/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/l10n_es_pos_by_device/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/l10n_es_pos_by_device/__manifest__.py b/l10n_es_pos_by_device/__manifest__.py new file mode 100644 index 00000000000..64bd7a1598c --- /dev/null +++ b/l10n_es_pos_by_device/__manifest__.py @@ -0,0 +1,24 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Punto de venta adaptado a la legislación española por " "dispositivo", + "category": "Sales/Point Of Sale", + "author": "Landoo Sistemas de Información S.L, " "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/l10n-spain", + "license": "AGPL-3", + "version": "14.0.1.0.0", + "depends": ["l10n_es_pos"], + "data": [ + "security/ir.model.access.csv", + "security/device_security.xml", + "views/pos_templates.xml", + "views/pos_views.xml", + "views/res_config_views.xml", + ], + "qweb": [ + "static/src/xml/pos.xml", + "static/src/xml/Screens/Chrome/Chrome.xml", + "static/src/xml/Screens/Chrome/DeviceName.xml", + ], + "installable": True, +} diff --git a/l10n_es_pos_by_device/i18n/es.po b/l10n_es_pos_by_device/i18n/es.po new file mode 100644 index 00000000000..0ce3e3a9983 --- /dev/null +++ b/l10n_es_pos_by_device/i18n/es.po @@ -0,0 +1,259 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_es_pos_by_device +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-02-24 11:31+0000\n" +"PO-Revision-Date: 2023-02-24 12:34+0100\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"X-Generator: Poedit 3.2.2\n" + +#. module: l10n_es_pos_by_device +#. openerp-web +#: code:addons/l10n_es_pos_by_device/static/src/xml/pos.xml:0 +#, python-format +msgid "" +"!(env.pos.config.iface_l10n_es_simplified_invoice or env.pos.config." +"pos_sequence_by_device) or receipt.is_to_invoice" +msgstr "" + +#. module: l10n_es_pos_by_device +#. openerp-web +#: code:addons/l10n_es_pos_by_device/static/src/xml/pos.xml:0 +#, python-format +msgid "" +"\"(env.pos.config.iface_l10n_es_simplified_invoice or env.pos.config." +"pos_sequence_by_device) and !receipt.to_invoice\"" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.view_res_config_settings_pos_seq_device +msgid "" +"" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_config__pos_device_ids +msgid "Available POS devices" +msgstr "Dispositivos TPV disponibles" + +#. module: l10n_es_pos_by_device +#. openerp-web +#: code:addons/l10n_es_pos_by_device/static/src/js/PaymentScreen.js:0 +#: code:addons/l10n_es_pos_by_device/static/src/js/Screens/Chrome/Chrome.js:0 +#, python-format +msgid "Cannot establish device. Clossing POS." +msgstr "No es posible establecer dispositivo. Cerrando TPV." + +#. module: l10n_es_pos_by_device +#: model:ir.model,name:l10n_es_pos_by_device.model_res_company +msgid "Companies" +msgstr "Compañías" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__company_id +msgid "Company" +msgstr "Compañía" + +#. module: l10n_es_pos_by_device +#: model:ir.model,name:l10n_es_pos_by_device.model_res_config_settings +msgid "Config Settings" +msgstr "Opciones de configuración" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__create_uid +msgid "Created by" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__create_date +msgid "Created on" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.pos_device_view_tree +msgid "Device locked" +msgstr "Dispositivo bloqueado" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_config__display_name +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__display_name +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_order__display_name +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_session__display_name +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_company__display_name +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_config_settings__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_config__id +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__id +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_order__id +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_session__id +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_company__id +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_config_settings__id +msgid "ID" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,help:l10n_es_pos_by_device.field_pos_config__pos_device_ids +msgid "If left empty, all devices will be selectable" +msgstr "Si se deja vacío, se pueden seleccionar todos los dispositivos" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_config____last_update +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device____last_update +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_order____last_update +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_session____last_update +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_company____last_update +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_config_settings____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__write_date +msgid "Last Updated on" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__locked +msgid "Locked" +msgstr "Bloqueado" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__name +msgid "Name" +msgstr "Nombre" + +#. module: l10n_es_pos_by_device +#. openerp-web +#: code:addons/l10n_es_pos_by_device/static/src/js/Screens/Chrome/DeviceName.js:0 +#, python-format +msgid "No device" +msgstr "Sin dispositivo" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_order__pos_device_id +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.view_pos_order_filter_simplified_invoice_by_device +msgid "POS Physical Device" +msgstr "Dispositivo físico TPV" + +#. module: l10n_es_pos_by_device +#: model:ir.actions.act_window,name:l10n_es_pos_by_device.pos_devices_act_window +#: model:ir.ui.menu,name:l10n_es_pos_by_device.pos_device_menu +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.pos_config_view_form_by_device +msgid "POS Physical devices" +msgstr "Dispositivos físicos TPV" + +#. module: l10n_es_pos_by_device +#: model:ir.model,name:l10n_es_pos_by_device.model_pos_config +msgid "Point of Sale Configuration" +msgstr "Configuración del TPV" + +#. module: l10n_es_pos_by_device +#: model:ir.model,name:l10n_es_pos_by_device.model_pos_order +msgid "Point of Sale Orders" +msgstr "Pedidos del TPV" + +#. module: l10n_es_pos_by_device +#: model:ir.model,name:l10n_es_pos_by_device.model_pos_session +msgid "Point of Sale Session" +msgstr "Sesión TPV" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_config__pos_sequence_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_order__pos_sequence_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_company__pos_sequence_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_config_settings__pos_sequence_by_device +msgid "Pos Sequence By Device" +msgstr "Secuencia TPV por dispositivo" + +#. module: l10n_es_pos_by_device +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.view_res_config_settings_pos_seq_device +msgid "Secuencing by physical device" +msgstr "Secuencia TPV por dispositivo" + +#. module: l10n_es_pos_by_device +#. openerp-web +#: code:addons/l10n_es_pos_by_device/static/src/js/Screens/Chrome/Chrome.js:0 +#, python-format +msgid "Select Physical Device" +msgstr "Selecciona dispositivo físico" + +#. module: l10n_es_pos_by_device +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.pos_config_view_form_by_device +msgid "Select available physical devices for this POS configuration" +msgstr "" +"Selecciona los dispositivos físicos disponibles para esta configuración TPV" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: l10n_es_pos_by_device +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.view_res_config_settings_pos_seq_device +msgid "Sequencing" +msgstr "Secuenciación" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__device_simplified_invoice_number +msgid "Sim.Inv number" +msgstr "Número de factura simplificada" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__device_simplified_invoice_padding +msgid "Simplified Invoice padding" +msgstr "Relleno de Factura Simplificada" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__device_simplified_invoice_prefix +msgid "Simplified Invoice prefix" +msgstr "Prefijo de Factura Simplificada" + +#. module: l10n_es_pos_by_device +#: code:addons/l10n_es_pos_by_device/models/pos_config.py:0 +#, python-format +msgid "There are no physical devices available. Cannot start session." +msgstr "" +"No hay dispositivos físicos disponibles. No es posible iniciar sesión." + +#. module: l10n_es_pos_by_device +#. openerp-web +#: code:addons/l10n_es_pos_by_device/static/src/js/PaymentScreen.js:0 +#: code:addons/l10n_es_pos_by_device/static/src/js/Screens/Chrome/Chrome.js:0 +#, python-format +msgid "There was a connection error when trying to establish the device." +msgstr "" +"Ha habido un error de conexión al intentar establecer el dispositivo." + +#. module: l10n_es_pos_by_device +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.pos_device_view_tree +msgid "Unlock device" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.view_res_config_settings_pos_seq_device +msgid "Use a different subsequence for each physical device on POS." +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model,name:l10n_es_pos_by_device.model_pos_device +msgid "pos.device" +msgstr "" diff --git a/l10n_es_pos_by_device/i18n/l10n_es_pos_by_device.pot b/l10n_es_pos_by_device/i18n/l10n_es_pos_by_device.pot new file mode 100644 index 00000000000..9fc1eae6cf6 --- /dev/null +++ b/l10n_es_pos_by_device/i18n/l10n_es_pos_by_device.pot @@ -0,0 +1,254 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_es_pos_by_device +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-02-24 11:31+0000\n" +"PO-Revision-Date: 2023-02-24 11:31+0000\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: l10n_es_pos_by_device +#. openerp-web +#: code:addons/l10n_es_pos_by_device/static/src/xml/pos.xml:0 +#, python-format +msgid "" +"!(env.pos.config.iface_l10n_es_simplified_invoice or " +"env.pos.config.pos_sequence_by_device) or receipt.is_to_invoice" +msgstr "" + +#. module: l10n_es_pos_by_device +#. openerp-web +#: code:addons/l10n_es_pos_by_device/static/src/xml/pos.xml:0 +#, python-format +msgid "" +"\"(env.pos.config.iface_l10n_es_simplified_invoice or " +"env.pos.config.pos_sequence_by_device) and !receipt.to_invoice\"" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.view_res_config_settings_pos_seq_device +msgid "" +"" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_config__pos_device_ids +msgid "Available POS devices" +msgstr "" + +#. module: l10n_es_pos_by_device +#. openerp-web +#: code:addons/l10n_es_pos_by_device/static/src/js/PaymentScreen.js:0 +#: code:addons/l10n_es_pos_by_device/static/src/js/Screens/Chrome/Chrome.js:0 +#, python-format +msgid "Cannot establish device. Clossing POS." +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model,name:l10n_es_pos_by_device.model_res_company +msgid "Companies" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__company_id +msgid "Company" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model,name:l10n_es_pos_by_device.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__create_uid +msgid "Created by" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__create_date +msgid "Created on" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.pos_device_view_tree +msgid "Device locked" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_config__display_name +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__display_name +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_order__display_name +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_session__display_name +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_company__display_name +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_config_settings__display_name +msgid "Display Name" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_config__id +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__id +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_order__id +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_session__id +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_company__id +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_config_settings__id +msgid "ID" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,help:l10n_es_pos_by_device.field_pos_config__pos_device_ids +msgid "If left empty, all devices will be selectable" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_config____last_update +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device____last_update +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_order____last_update +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_session____last_update +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_company____last_update +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_config_settings____last_update +msgid "Last Modified on" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__write_date +msgid "Last Updated on" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__locked +msgid "Locked" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__name +msgid "Name" +msgstr "" + +#. module: l10n_es_pos_by_device +#. openerp-web +#: code:addons/l10n_es_pos_by_device/static/src/js/Screens/Chrome/DeviceName.js:0 +#, python-format +msgid "No device" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_order__pos_device_id +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.view_pos_order_filter_simplified_invoice_by_device +msgid "POS Physical Device" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.actions.act_window,name:l10n_es_pos_by_device.pos_devices_act_window +#: model:ir.ui.menu,name:l10n_es_pos_by_device.pos_device_menu +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.pos_config_view_form_by_device +msgid "POS Physical devices" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model,name:l10n_es_pos_by_device.model_pos_config +msgid "Point of Sale Configuration" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model,name:l10n_es_pos_by_device.model_pos_order +msgid "Point of Sale Orders" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model,name:l10n_es_pos_by_device.model_pos_session +msgid "Point of Sale Session" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_config__pos_sequence_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_order__pos_sequence_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_company__pos_sequence_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_res_config_settings__pos_sequence_by_device +msgid "Pos Sequence By Device" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.view_res_config_settings_pos_seq_device +msgid "Secuencing by physical device" +msgstr "" + +#. module: l10n_es_pos_by_device +#. openerp-web +#: code:addons/l10n_es_pos_by_device/static/src/js/Screens/Chrome/Chrome.js:0 +#, python-format +msgid "Select Physical Device" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.pos_config_view_form_by_device +msgid "Select available physical devices for this POS configuration" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__sequence +msgid "Sequence" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.view_res_config_settings_pos_seq_device +msgid "Sequencing" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__device_simplified_invoice_number +msgid "Sim.Inv number" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__device_simplified_invoice_padding +msgid "Simplified Invoice padding" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model.fields,field_description:l10n_es_pos_by_device.field_pos_device__device_simplified_invoice_prefix +msgid "Simplified Invoice prefix" +msgstr "" + +#. module: l10n_es_pos_by_device +#: code:addons/l10n_es_pos_by_device/models/pos_config.py:0 +#, python-format +msgid "There are no physical devices available. Cannot start session." +msgstr "" + +#. module: l10n_es_pos_by_device +#. openerp-web +#: code:addons/l10n_es_pos_by_device/static/src/js/PaymentScreen.js:0 +#: code:addons/l10n_es_pos_by_device/static/src/js/Screens/Chrome/Chrome.js:0 +#, python-format +msgid "There was a connection error when trying to establish the device." +msgstr "" + +#. module: l10n_es_pos_by_device +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.pos_device_view_tree +msgid "Unlock device" +msgstr "" + +#. module: l10n_es_pos_by_device +#: model_terms:ir.ui.view,arch_db:l10n_es_pos_by_device.view_res_config_settings_pos_seq_device +msgid "Use a different subsequence for each physical device on POS." +msgstr "" + +#. module: l10n_es_pos_by_device +#: model:ir.model,name:l10n_es_pos_by_device.model_pos_device +msgid "pos.device" +msgstr "" diff --git a/l10n_es_pos_by_device/models/__init__.py b/l10n_es_pos_by_device/models/__init__.py new file mode 100644 index 00000000000..f981914413b --- /dev/null +++ b/l10n_es_pos_by_device/models/__init__.py @@ -0,0 +1,5 @@ +from . import pos_config +from . import pos_device +from . import pos_order +from . import res_company +from . import res_config_settings diff --git a/l10n_es_pos_by_device/models/pos_config.py b/l10n_es_pos_by_device/models/pos_config.py new file mode 100644 index 00000000000..0598b5afe50 --- /dev/null +++ b/l10n_es_pos_by_device/models/pos_config.py @@ -0,0 +1,58 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, fields, models +from odoo.exceptions import ValidationError + + +class PosConfig(models.Model): + _inherit = "pos.config" + + pos_sequence_by_device = fields.Boolean(related="company_id.pos_sequence_by_device") + pos_device_ids = fields.Many2many( + "pos.device", + string="Available POS devices", + help="If left empty, all devices will be selectable", + ) + + def _check_available_devices(self): + self.ensure_one() + if len(self.pos_device_ids) > 0: + return + devices = self.env["pos.device"].search( + [ + ("company_id", "=", self.company_id.id), + ("locked", "=", False), + ] + ) + if len(devices) == 0: + raise ValidationError( + _("There are no physical devices available. Cannot start session.") + ) + + def open_ui(self): + for config in self: + if config.pos_sequence_by_device: + config._check_available_devices() + return super(PosConfig, self).open_ui() + + def open_session_cb(self, check_coa=True): + for config in self: + if config.pos_sequence_by_device: + config._check_available_devices() + return super(PosConfig, self).open_session_cb(check_coa) + + def _open_session(self, session_id): + for config in self: + if config.pos_sequence_by_device: + config._check_available_devices() + return super(PosConfig, self)._open_session(session_id) + + +class PosSession(models.Model): + _inherit = "pos.session" + + def open_frontend_cb(self): + for session in self: + if session.config_id.pos_sequence_by_device: + session.config_id._check_available_devices() + return super(PosSession, self).open_frontend_cb() diff --git a/l10n_es_pos_by_device/models/pos_device.py b/l10n_es_pos_by_device/models/pos_device.py new file mode 100644 index 00000000000..3c7dbfe396d --- /dev/null +++ b/l10n_es_pos_by_device/models/pos_device.py @@ -0,0 +1,53 @@ +# Copyright 2023 Landoo Sistemas de Informacion SL +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class PosDevice(models.Model): + _name = "pos.device" + + name = fields.Char(required=True) + sequence = fields.Many2one("ir.sequence", required=True) + locked = fields.Boolean(readonly=True) + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + required=True, + readonly=True, + default=lambda self: self.env.company, + ) + device_simplified_invoice_prefix = fields.Char( + "Simplified Invoice prefix", + readonly=True, + compute="_compute_simplified_invoice_sequence", + ) + device_simplified_invoice_padding = fields.Integer( + "Simplified Invoice padding", + readonly=True, + compute="_compute_simplified_invoice_sequence", + ) + device_simplified_invoice_number = fields.Integer( + "Sim.Inv number", + readonly=True, + compute="_compute_simplified_invoice_sequence", + ) + + def lock_device(self): + return self.write({"locked": True}) + + def unlock_device(self): + return self.write({"locked": False}) + + @api.depends( + "sequence.number_next_actual", + "sequence.prefix", + "sequence.padding", + ) + def _compute_simplified_invoice_sequence(self): + for dev in self: + seq = dev.sequence + dev.device_simplified_invoice_number = ( + seq._get_current_sequence().number_next_actual + ) + dev.device_simplified_invoice_prefix = seq._get_prefix_suffix()[0] + dev.device_simplified_invoice_padding = seq.padding diff --git a/l10n_es_pos_by_device/models/pos_order.py b/l10n_es_pos_by_device/models/pos_order.py new file mode 100644 index 00000000000..a0486711dd3 --- /dev/null +++ b/l10n_es_pos_by_device/models/pos_order.py @@ -0,0 +1,54 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class PosOrder(models.Model): + _inherit = "pos.order" + + pos_sequence_by_device = fields.Boolean( + related="session_id.config_id.pos_sequence_by_device" + ) + pos_device_id = fields.Many2one( + "pos.device", string="POS Physical Device", readonly=True + ) + + @api.model + def _order_fields(self, ui_order): + res = super(PosOrder, self)._order_fields(ui_order) + if ui_order.get("pos_device", False): + res.update({"pos_device_id": ui_order["pos_device"]}) + return res + + @api.model + def _update_sequence_number(self, pos): + if not pos.pos_sequence_by_device: + return super(PosOrder, self)._update_sequence_number() + return + + @api.model + def _process_order(self, pos_order, draft, existing_order): + order_data = pos_order.get("data", {}) + pos_order_obj = self.env["pos.order"] + pos = self.env["pos.session"].browse(order_data.get("pos_session_id")).config_id + if pos_order_obj._simplified_limit_check( + order_data.get("amount_total", 0), pos.l10n_es_simplified_invoice_limit + ): + if pos.pos_sequence_by_device and order_data.get("device", False): + device_seq = self.env["ir.sequence"].browse( + order_data["device"]["sequence"][0] + ) + device_seq.next_by_id() + pos_order["data"].update({"pos_device": order_data["device"]["id"]}) + return super(PosOrder, self)._process_order(pos_order, draft, existing_order) + + def write(self, vals): + for order in self.filtered(lambda o: o.config_id.pos_sequence_by_device): + if ( + vals.get("state") + and vals["state"] == "paid" + and order.name == "/" + and order.l10n_es_unique_id + ): + order.name = order.l10n_es_unique_id + return super(PosOrder, self).write(vals) diff --git a/l10n_es_pos_by_device/models/res_company.py b/l10n_es_pos_by_device/models/res_company.py new file mode 100644 index 00000000000..e9ba3c2e0b0 --- /dev/null +++ b/l10n_es_pos_by_device/models/res_company.py @@ -0,0 +1,9 @@ +# Copyright 2023 Landoo Sistemas de Informacion SL +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + pos_sequence_by_device = fields.Boolean() diff --git a/l10n_es_pos_by_device/models/res_config_settings.py b/l10n_es_pos_by_device/models/res_config_settings.py new file mode 100644 index 00000000000..45e2b0ae86b --- /dev/null +++ b/l10n_es_pos_by_device/models/res_config_settings.py @@ -0,0 +1,11 @@ +# Copyright 2023 Landoo Sistemas de Informacion SL +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + pos_sequence_by_device = fields.Boolean( + related="company_id.pos_sequence_by_device", readonly=False + ) diff --git a/l10n_es_pos_by_device/security/device_security.xml b/l10n_es_pos_by_device/security/device_security.xml new file mode 100644 index 00000000000..ef279293441 --- /dev/null +++ b/l10n_es_pos_by_device/security/device_security.xml @@ -0,0 +1,13 @@ + + + + + + POS Device multi-company + + + [('company_id', 'in', company_ids)] + + + diff --git a/l10n_es_pos_by_device/security/ir.model.access.csv b/l10n_es_pos_by_device/security/ir.model.access.csv new file mode 100644 index 00000000000..3111842a946 --- /dev/null +++ b/l10n_es_pos_by_device/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_pos_device_read,access_pos_device_read,model_pos_device,point_of_sale.group_pos_user,1,0,0,0 +access_pos_device_manage,access_pos_device_manage,model_pos_device,point_of_sale.group_pos_manager,1,1,1,1 diff --git a/l10n_es_pos_by_device/static/src/js/PaymentScreen.js b/l10n_es_pos_by_device/static/src/js/PaymentScreen.js new file mode 100644 index 00000000000..6b7bb2ced59 --- /dev/null +++ b/l10n_es_pos_by_device/static/src/js/PaymentScreen.js @@ -0,0 +1,30 @@ +odoo.define("l10n_es_pos_by_device.PaymentScreen", function (require) { + "use strict"; + + const PaymentScreen = require("l10n_es_pos.PaymentScreen"); + const Registries = require("point_of_sale.Registries"); + + const L10nEsPosByDevicePaymentScreen = (PaymentScreen) => + class extends PaymentScreen { + async _finalizeValidation() { + if ( + this.env.pos.config.pos_sequence_by_device && + !this.env.pos.get_device() + ) { + await this.showPopup("ErrorPopup", { + title: this.env._t("Cannot establish device. Clossing POS."), + body: this.env._t( + "There was a connection error when trying to establish the device." + ), + }); + this.trigger("close-pos"); + } else { + super._finalizeValidation(); + } + } + }; + + Registries.Component.extend(PaymentScreen, L10nEsPosByDevicePaymentScreen); + + return PaymentScreen; +}); diff --git a/l10n_es_pos_by_device/static/src/js/Screens/Chrome/Chrome.js b/l10n_es_pos_by_device/static/src/js/Screens/Chrome/Chrome.js new file mode 100644 index 00000000000..24529604273 --- /dev/null +++ b/l10n_es_pos_by_device/static/src/js/Screens/Chrome/Chrome.js @@ -0,0 +1,58 @@ +odoo.define("l10n_es_pos.chrome", function (require) { + "use strict"; + + const Chrome = require("point_of_sale.Chrome"); + const Registries = require("point_of_sale.Registries"); + + const L10nEsPosChrome = (Chrome) => + class extends Chrome { + async start() { + await super.start(); + if (this.env.pos.config.pos_sequence_by_device) { + const list = this.env.pos.pos_devices.map((pos_device) => { + return { + id: pos_device.id, + item: pos_device, + label: pos_device.name, + isSelected: false, + }; + }); + const {confirmed, payload: device} = await this.showPopup( + "SelectionPopup", + { + title: this.env._t("Select Physical Device"), + list: list, + } + ); + + if (!confirmed) { + this.trigger("close-pos"); + } + + var ret = await this.env.pos.set_device(device); + + if (!ret) { + await this.showPopup("ErrorPopup", { + title: this.env._t( + "Cannot establish device. Clossing POS." + ), + body: this.env._t( + "There was a connection error when trying to establish the device." + ), + }); + this.trigger("close-pos"); + } + } + } + async _closePos() { + if (this.env.pos.config.pos_sequence_by_device) { + this.env.pos.unset_device(); + } + await super._closePos(); + } + }; + + Registries.Component.extend(Chrome, L10nEsPosChrome); + + return Chrome; +}); diff --git a/l10n_es_pos_by_device/static/src/js/Screens/Chrome/DeviceName.js b/l10n_es_pos_by_device/static/src/js/Screens/Chrome/DeviceName.js new file mode 100644 index 00000000000..e274df65ec1 --- /dev/null +++ b/l10n_es_pos_by_device/static/src/js/Screens/Chrome/DeviceName.js @@ -0,0 +1,21 @@ +odoo.define("l10n_es_pos.DeviceName", function (require) { + "use strict"; + + const PosComponent = require("point_of_sale.PosComponent"); + const Registries = require("point_of_sale.Registries"); + + class DeviceName extends PosComponent { + get devicename() { + const device = this.env.pos.get_device(); + if (device) { + return device.name; + } + return this.env._t("No device"); + } + } + DeviceName.template = "DeviceName"; + + Registries.Component.add(DeviceName); + + return DeviceName; +}); diff --git a/l10n_es_pos_by_device/static/src/js/models.js b/l10n_es_pos_by_device/static/src/js/models.js new file mode 100644 index 00000000000..2b195ef9b5e --- /dev/null +++ b/l10n_es_pos_by_device/static/src/js/models.js @@ -0,0 +1,122 @@ +odoo.define("l10n_es_pos_by_device.models", function (require) { + "use strict"; + + var models = require("point_of_sale.models"); + + var pos_super = models.PosModel.prototype; + models.PosModel = models.PosModel.extend({ + _is_simplified_config() { + return ( + this.config.pos_sequence_by_device || + pos_super._is_simplified_config.apply(this, arguments) + ); + }, + _set_simplified_invoice_number(config) { + if (!this.config.pos_sequence_by_device) { + pos_super._set_simplified_invoice_number.apply(this, arguments); + } else { + this.get_device().device_simplified_invoice_number = + config.device_simplified_invoice_number; + } + }, + _get_simplified_invoice_number() { + if (!this.config.pos_sequence_by_device) { + return pos_super._get_simplified_invoice_number.apply(this, arguments); + } + return ( + this.get_device().device_simplified_invoice_prefix + + this.get_padding_simple_inv( + this.get_device().device_simplified_invoice_number, + this.get_device().device_simplified_invoice_padding + ) + ); + }, + get_simple_inv_next_number: function () { + var ret = pos_super.get_simple_inv_next_number.apply(this, arguments); + if (this.env.pos.config.pos_sequence_by_device) { + return this.rpc({ + method: "search_read", + domain: [["id", "=", this.env.pos.get_device().id]], + fields: ["device_simplified_invoice_number"], + model: "pos.device", + }); + } + return ret; + }, + _update_sequence_number: function () { + if (!this.env.pos.config.pos_sequence_by_device) { + pos_super._update_sequence_number.apply(this, arguments); + } else if (this.get_device()) { + // If trying to send lost order when starting POS, + // device can still not be chosen. + ++this.get_device().device_simplified_invoice_number; + } + }, + get_device: function () { + return this.get("pos_device"); + }, + set_device: async function (device) { + var ret = await this.rpc({ + method: "lock_device", + model: "pos.device", + args: [[device.id]], + }); + if (ret) { + this.set("pos_device", device); + device.locked = true; + } + return ret; + }, + unset_device: async function () { + const device = this.get("pos_device", false); + if (device) { + await this.rpc({ + method: "unlock_device", + model: "pos.device", + args: [[device.id]], + }); + this.set("pos_device", false); + device.locked = false; + } + }, + }); + + var order_super = models.Order.prototype; + models.Order = models.Order.extend({ + export_as_JSON: function () { + var res = order_super.export_as_JSON.apply(this, arguments); + res.device = this.pos.get_device(); + return res; + }, + }); + + models.load_models([ + { + model: "pos.device", + fields: [ + "name", + "sequence", + "locked", + "company_id", + "device_simplified_invoice_prefix", + "device_simplified_invoice_padding", + "device_simplified_invoice_number", + ], + domain: function (self) { + return self.config.pos_device_ids.length > 0 + ? [ + ["company_id", "=", self.config.company_id[0]], + ["id", "in", self.config.pos_device_ids], + ["locked", "=", false], + ] + : [ + ["company_id", "=", self.config.company_id[0]], + ["locked", "=", false], + ]; + }, + loaded: function (self, pos_devices) { + self.pos_devices = pos_devices; + }, + }, + ]); +}); diff --git a/l10n_es_pos_by_device/static/src/xml/Screens/Chrome/Chrome.xml b/l10n_es_pos_by_device/static/src/xml/Screens/Chrome/Chrome.xml new file mode 100644 index 00000000000..e7ae18cd532 --- /dev/null +++ b/l10n_es_pos_by_device/static/src/xml/Screens/Chrome/Chrome.xml @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/l10n_es_pos_by_device/static/src/xml/Screens/Chrome/DeviceName.xml b/l10n_es_pos_by_device/static/src/xml/Screens/Chrome/DeviceName.xml new file mode 100644 index 00000000000..275a0df9465 --- /dev/null +++ b/l10n_es_pos_by_device/static/src/xml/Screens/Chrome/DeviceName.xml @@ -0,0 +1,10 @@ + + + +
+ + + +
+
+
diff --git a/l10n_es_pos_by_device/static/src/xml/pos.xml b/l10n_es_pos_by_device/static/src/xml/pos.xml new file mode 100644 index 00000000000..24b0ebc701e --- /dev/null +++ b/l10n_es_pos_by_device/static/src/xml/pos.xml @@ -0,0 +1,20 @@ + + + + + "(env.pos.config.iface_l10n_es_simplified_invoice or env.pos.config.pos_sequence_by_device) and !receipt.to_invoice" + + + !(env.pos.config.iface_l10n_es_simplified_invoice or env.pos.config.pos_sequence_by_device) or receipt.is_to_invoice + + + diff --git a/l10n_es_pos_by_device/views/pos_templates.xml b/l10n_es_pos_by_device/views/pos_templates.xml new file mode 100644 index 00000000000..6079ccb1594 --- /dev/null +++ b/l10n_es_pos_by_device/views/pos_templates.xml @@ -0,0 +1,23 @@ + + +