mirror of
https://github.com/bringout/oca-ocb-sale.git
synced 2026-04-26 02:52:03 +02:00
19.0 vanilla
This commit is contained in:
parent
79f83631d5
commit
73afc09215
6267 changed files with 1534193 additions and 1130106 deletions
|
|
@ -10,40 +10,22 @@ pip install odoo-bringout-oca-ocb-point_of_sale
|
|||
|
||||
## Dependencies
|
||||
|
||||
This addon depends on:
|
||||
- resource
|
||||
- stock_account
|
||||
- barcodes
|
||||
- web_editor
|
||||
- html_editor
|
||||
- digest
|
||||
|
||||
## Manifest Information
|
||||
|
||||
- **Name**: Point of Sale
|
||||
- **Version**: 1.0.1
|
||||
- **Category**: Sales/Point of Sale
|
||||
- **License**: LGPL-3
|
||||
- **Installable**: True
|
||||
- phone_validation
|
||||
- partner_autocomplete
|
||||
- iot_base
|
||||
- google_address_autocomplete
|
||||
|
||||
## Source
|
||||
|
||||
Based on [OCA/OCB](https://github.com/OCA/OCB) branch 16.0, addon `point_of_sale`.
|
||||
- Repository: https://github.com/OCA/OCB
|
||||
- Branch: 19.0
|
||||
- Path: addons/point_of_sale
|
||||
|
||||
## License
|
||||
|
||||
This package maintains the original LGPL-3 license from the upstream Odoo project.
|
||||
|
||||
## Documentation
|
||||
|
||||
- Overview: doc/OVERVIEW.md
|
||||
- Architecture: doc/ARCHITECTURE.md
|
||||
- Models: doc/MODELS.md
|
||||
- Controllers: doc/CONTROLLERS.md
|
||||
- Wizards: doc/WIZARDS.md
|
||||
- Reports: doc/REPORTS.md
|
||||
- Security: doc/SECURITY.md
|
||||
- Install: doc/INSTALL.md
|
||||
- Usage: doc/USAGE.md
|
||||
- Configuration: doc/CONFIGURATION.md
|
||||
- Dependencies: doc/DEPENDENCIES.md
|
||||
- Troubleshooting: doc/TROUBLESHOOTING.md
|
||||
- FAQ: doc/FAQ.md
|
||||
This package preserves the original LGPL-3 license.
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ Work with the hardware you already have
|
|||
Odoo's POS is a web application that can run on any device that can display
|
||||
websites with little to no setup required.
|
||||
|
||||
### Touchscreen or Keyboard ?
|
||||
### Touchscreen or Keyboard?
|
||||
|
||||
The Point of Sale works perfectly on any kind of touch enabled device, whether
|
||||
it's multi-touch tablets like an iPad or keyboardless resistive touchscreen
|
||||
|
|
|
|||
|
|
@ -6,9 +6,7 @@ from . import controllers
|
|||
from . import report
|
||||
from . import wizard
|
||||
|
||||
from odoo import api, SUPERUSER_ID
|
||||
|
||||
def uninstall_hook(cr, registry):
|
||||
env = api.Environment(cr, SUPERUSER_ID, {})
|
||||
def uninstall_hook(env):
|
||||
#The search domain is based on how the sequence is defined in the _get_sequence_values method in /addons/point_of_sale/models/stock_warehouse.py
|
||||
env['ir.sequence'].search([('name', 'ilike', '%Picking POS%'), ('prefix', 'ilike', '%/POS/%')]).unlink()
|
||||
|
|
|
|||
|
|
@ -3,28 +3,34 @@
|
|||
|
||||
{
|
||||
'name': 'Point of Sale',
|
||||
'version': '1.0.1',
|
||||
'version': '1.0.2',
|
||||
'category': 'Sales/Point of Sale',
|
||||
'sequence': 40,
|
||||
'summary': 'User-friendly PoS interface for shops and restaurants',
|
||||
'depends': ['stock_account', 'barcodes', 'web_editor', 'digest'],
|
||||
'summary': 'Handle checkouts and payments for shops and restaurants.',
|
||||
'depends': ['resource', 'stock_account', 'barcodes', 'html_editor', 'digest', 'phone_validation', 'partner_autocomplete', 'iot_base', 'google_address_autocomplete'],
|
||||
'uninstall_hook': 'uninstall_hook',
|
||||
'data': [
|
||||
'security/point_of_sale_security.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'data/default_barcode_patterns.xml',
|
||||
'data/digest_data.xml',
|
||||
'data/pos_note_data.xml',
|
||||
'data/point_of_sale_tour.xml',
|
||||
'data/mail_template_data.xml',
|
||||
'data/ir_config_parameter_data.xml',
|
||||
'wizard/pos_details.xml',
|
||||
'wizard/pos_payment.xml',
|
||||
'wizard/pos_close_session_wizard.xml',
|
||||
'wizard/pos_session_check_product_wizard.xml',
|
||||
'views/pos_assets_common.xml',
|
||||
'wizard/pos_daily_sales_reports.xml',
|
||||
'wizard/pos_confirmation_wizard.xml',
|
||||
'wizard/pos_make_invoice.xml',
|
||||
'views/pos_assets_index.xml',
|
||||
'views/pos_assets_qunit.xml',
|
||||
'views/point_of_sale_report.xml',
|
||||
'views/point_of_sale_view.xml',
|
||||
'views/pos_note_view.xml',
|
||||
'views/pos_order_view.xml',
|
||||
'views/pos_category_view.xml',
|
||||
'views/product_combo_views.xml',
|
||||
'views/product_view.xml',
|
||||
'views/account_journal_view.xml',
|
||||
'views/pos_payment_method_views.xml',
|
||||
|
|
@ -35,138 +41,209 @@
|
|||
'views/point_of_sale_sequence.xml',
|
||||
'data/point_of_sale_data.xml',
|
||||
'views/pos_order_report_view.xml',
|
||||
'views/account_statement_view.xml',
|
||||
'views/digest_views.xml',
|
||||
'views/res_partner_view.xml',
|
||||
'views/report_userlabel.xml',
|
||||
'views/report_saledetails.xml',
|
||||
'views/pos_preset_view.xml',
|
||||
'views/point_of_sale_dashboard.xml',
|
||||
'views/report_invoice.xml',
|
||||
'views/res_config_settings_views.xml',
|
||||
'views/pos_printer_view.xml',
|
||||
'views/pos_ticket_view.xml',
|
||||
'views/res_config_settings_views.xml',
|
||||
'views/customer_display_index.xml',
|
||||
'views/account_move_views.xml',
|
||||
'views/pos_session_sales_details.xml',
|
||||
'views/product_tag_views.xml',
|
||||
'views/stock_reference_views.xml',
|
||||
],
|
||||
'demo': [
|
||||
'data/point_of_sale_demo.xml',
|
||||
'data/demo_data.xml',
|
||||
],
|
||||
'installable': True,
|
||||
'application': True,
|
||||
'website': 'https://www.odoo.com/app/point-of-sale-shop',
|
||||
'assets': {
|
||||
|
||||
## In general, you DON'T NEED to declare new assets here, just put the files in the proper directory.
|
||||
## NOTABLE EXCEPTION: List the new .css files in the `point_of_sale.assets` bundle taking into consideration
|
||||
## the order of the .css files.
|
||||
##
|
||||
## 1. When defining new component, put the .js files in `point_of_sale/static/src/js/`
|
||||
## and the corresponding .xml files in `point_of_sale/static/src/xml/`
|
||||
## * POS is setup to automatically include the .xml and `.js` files in `point_of_sale.assets`.
|
||||
## 2. When adding new tour tests, put the .js files in `point_of_sale/static/tests/tours/`.
|
||||
## 3. When adding new qunit tests, put the .js files in `point_of_sale/static/tests/unit/`.
|
||||
##
|
||||
## If your use case doesn't fit anything above, you might need to properly understand each "asset bundle"
|
||||
## defined here and check how they are used in the following "index templates":
|
||||
## 1. point_of_sale.index
|
||||
## -> This is the POS UI, accessible by opening a session.
|
||||
## 2. point_of_sale.qunit_suite
|
||||
## -> This is the unit test, accessible by clicking the "Run Point of Sale JS Tests" button
|
||||
## in the "debug" button from the backend interface.
|
||||
|
||||
#####################################
|
||||
## Augmentation of existing assets ##
|
||||
#####################################
|
||||
# In general, you DON'T NEED to declare new assets here, just put the
|
||||
# files in the proper directory. In rare cases, the order of scss files
|
||||
# matter and in that case you'll need to add it to the bundle in the
|
||||
# correct spot.
|
||||
#
|
||||
# Files in /static/src/backend will be loaded in the backend
|
||||
# Files in /static/src/app will be loaded in the PoS UI
|
||||
# Files in /static/tests/tours will be loaded in the backend in test mode
|
||||
# Files in /static/tests/unit will be loaded in the unit tests
|
||||
|
||||
# web assets
|
||||
'web.assets_backend': [
|
||||
'point_of_sale/static/src/scss/pos_dashboard.scss',
|
||||
'point_of_sale/static/src/backend/tours/point_of_sale.js',
|
||||
'point_of_sale/static/src/backend/debug_manager.js',
|
||||
'point_of_sale/static/src/backend/pos_kanban_view/*',
|
||||
'point_of_sale/static/src/backend/pos_payment_provider_cards/*',
|
||||
'point_of_sale/static/src/app/hooks/hooks.js',
|
||||
'point_of_sale/static/src/backend/many2many_placeholder_list_view/*',
|
||||
'point_of_sale/static/src/backend/test_epos/*',
|
||||
'point_of_sale/static/src/app/utils/init_lna.js',
|
||||
],
|
||||
"web.assets_web_dark": [
|
||||
'point_of_sale/static/src/scss/pos_dashboard.dark.scss',
|
||||
],
|
||||
'web.assets_tests': [
|
||||
'point_of_sale/static/tests/tours/**/*',
|
||||
'barcodes/static/tests/legacy/helpers.js',
|
||||
'point_of_sale/static/tests/pos/tours/**/*',
|
||||
'point_of_sale/static/tests/generic_helpers/**/*',
|
||||
'point_of_sale/static/tests/customer_display/**/*',
|
||||
'point_of_sale/static/src/utils.js',
|
||||
],
|
||||
'web.assets_unit_tests_setup': [
|
||||
('include', 'point_of_sale.assets_prod'),
|
||||
('remove', 'point_of_sale/static/src/app/main.js'),
|
||||
|
||||
####################################################
|
||||
## Exclusive POS Assets 1: For running the POS UI ##
|
||||
####################################################
|
||||
# Remove CSS files since we're not testing the UI with hoot in PoS
|
||||
# CSS files make html_editor tests fail
|
||||
('remove', 'point_of_sale/static/src/**/*.css'),
|
||||
|
||||
'point_of_sale.pos_assets_backend_style': [
|
||||
"web/static/src/core/ui/**/*.scss",
|
||||
# Adding error handler back since they are removed in the prod bundle
|
||||
'web/static/src/core/errors/error_handlers.js',
|
||||
'web/static/src/core/dialog/dialog.scss',
|
||||
],
|
||||
# TODO: We need to control this asset bundle.
|
||||
# We can reduce the size of loaded assets in POS UI by selectively
|
||||
# loading the `web` assets. We should only include what POS needs.
|
||||
'point_of_sale.pos_assets_backend': [
|
||||
('include', 'web.assets_backend'),
|
||||
('remove', 'web/static/src/core/errors/error_handlers.js'),
|
||||
('remove', 'web/static/src/legacy/legacy_rpc_error_handler.js'),
|
||||
],
|
||||
# This bundle includes the main pos assets.
|
||||
'point_of_sale.assets': [
|
||||
'point_of_sale/static/src/scss/pos_variables_extra.scss',
|
||||
('include', 'web._assets_helpers'),
|
||||
('include', 'web._assets_backend_helpers'),
|
||||
('include', 'web._assets_primary_variables'),
|
||||
'web/static/lib/bootstrap/scss/_functions.scss',
|
||||
'web/static/lib/bootstrap/scss/_variables.scss',
|
||||
'web/static/fonts/fonts.scss',
|
||||
'web/static/src/libs/fontawesome/css/font-awesome.css',
|
||||
'web/static/lib/daterangepicker/daterangepicker.css',
|
||||
'point_of_sale/static/src/scss/pos.scss',
|
||||
'point_of_sale/static/src/css/pos_receipts.css',
|
||||
'point_of_sale/static/src/css/popups/product_info_popup.css',
|
||||
'point_of_sale/static/src/css/popups/common.css',
|
||||
'point_of_sale/static/src/css/popups/cash_opening_popup.css',
|
||||
'point_of_sale/static/src/css/popups/closing_pos_popup.css',
|
||||
'point_of_sale/static/src/css/popups/money_details_popup.css',
|
||||
'web/static/src/legacy/scss/fontawesome_overridden.scss',
|
||||
|
||||
# Here includes the lib and POS UI assets.
|
||||
'point_of_sale/static/lib/**/*.js',
|
||||
'web_editor/static/lib/html2canvas.js',
|
||||
'point_of_sale/static/src/js/**/*.js',
|
||||
'web/static/lib/zxing-library/zxing-library.js',
|
||||
'point_of_sale/static/src/xml/**/*.xml',
|
||||
],
|
||||
# This bundle contains the code responsible for starting the POS UI.
|
||||
# It is practically the entry point.
|
||||
'point_of_sale.assets_backend_prod_only': [
|
||||
'point_of_sale/static/src/entry/chrome_adapter.js',
|
||||
'point_of_sale/static/src/entry/main.js',
|
||||
'web/static/src/start.js',
|
||||
'web/static/src/legacy/legacy_setup.js',
|
||||
],
|
||||
|
||||
#########################################################
|
||||
## Exclusive POS Assets 2: For running the QUnit tests ##
|
||||
#########################################################
|
||||
|
||||
# This bundle includes the helper assets for the unit testing.
|
||||
'point_of_sale.tests_assets': [
|
||||
'web/static/lib/qunit/qunit-2.9.1.css',
|
||||
'web/static/lib/qunit/qunit-2.9.1.js',
|
||||
'web/static/tests/legacy/helpers/**/*',
|
||||
('remove', 'web/static/tests/legacy/helpers/test_utils_tests.js'),
|
||||
|
||||
'web/static/tests/legacy/legacy_setup.js',
|
||||
|
||||
'web/static/tests/helpers/**/*.js',
|
||||
'web/static/tests/qunit.js',
|
||||
'web/static/tests/main.js',
|
||||
'web/static/tests/setup.js',
|
||||
|
||||
# These 2 lines below are taken from web.assets_frontend
|
||||
# They're required for the web.frontend_legacy to work properly
|
||||
# It is expected to add other lines coming from the web.assets_frontend
|
||||
# if we need to add more and more legacy stuff that would require other scss or js.
|
||||
('include', 'web._assets_helpers'),
|
||||
'web/static/src/scss/pre_variables.scss',
|
||||
'web/static/lib/bootstrap/scss/_variables.scss',
|
||||
|
||||
('include', 'web.frontend_legacy'),
|
||||
],
|
||||
# This bundle includes the unit tests.
|
||||
'point_of_sale.qunit_suite_tests': [
|
||||
'web.assets_unit_tests': [
|
||||
'point_of_sale/static/tests/unit/**/*',
|
||||
],
|
||||
|
||||
# PoS assets
|
||||
'point_of_sale.base_app': [
|
||||
("include", "web._assets_helpers"),
|
||||
("include", "web._assets_backend_helpers"),
|
||||
"web/static/src/scss/pre_variables.scss",
|
||||
"web/static/lib/bootstrap/scss/_variables.scss",
|
||||
'web/static/lib/bootstrap/scss/_variables-dark.scss',
|
||||
'web/static/lib/bootstrap/scss/_maps.scss',
|
||||
("include", "web._assets_bootstrap_backend"),
|
||||
('include', 'web._assets_core'),
|
||||
("remove", "web/static/src/core/browser/router.js"),
|
||||
("remove", "web/static/src/core/debug/**/*"),
|
||||
"web/static/src/libs/fontawesome/css/font-awesome.css",
|
||||
"web/static/src/views/fields/formatters.js",
|
||||
"web/static/lib/odoo_ui_icons/*",
|
||||
"point_of_sale/static/src/utils.js",
|
||||
'bus/static/src/services/bus_service.js',
|
||||
'bus/static/src/services/worker_service.js',
|
||||
'bus/static/src/bus_parameters_service.js',
|
||||
'bus/static/src/legacy_multi_tab_service.js',
|
||||
'bus/static/src/multi_tab_service.js',
|
||||
'bus/static/src/multi_tab_shared_worker_service.js',
|
||||
'bus/static/src/multi_tab_fallback_service.js',
|
||||
'bus/static/src/workers/*',
|
||||
'iot_base/static/src/network_utils/*',
|
||||
'iot_base/static/src/device_controller.js',
|
||||
],
|
||||
|
||||
# Main PoS assets, they are loaded in the PoS UI
|
||||
'point_of_sale._assets_pos': [
|
||||
'web/static/src/scss/functions.scss',
|
||||
|
||||
# JS boot
|
||||
'web/static/src/module_loader.js',
|
||||
# libs (should be loaded before framework)
|
||||
'point_of_sale/static/lib/**/*',
|
||||
'web/static/lib/luxon/luxon.js',
|
||||
'web/static/lib/owl/owl.js',
|
||||
'web/static/lib/owl/odoo_module.js',
|
||||
'web/static/lib/zxing-library/zxing-library.js',
|
||||
|
||||
|
||||
('include', 'point_of_sale.base_app'),
|
||||
|
||||
'web/static/src/core/colorlist/colorlist.scss',
|
||||
'web/static/src/webclient/webclient_layout.scss',
|
||||
|
||||
'web/static/src/webclient/icons.scss',
|
||||
|
||||
# scss variables and utilities
|
||||
'point_of_sale/static/src/scss/pos_variables_extra.scss',
|
||||
'web/static/src/scss/bootstrap_overridden.scss',
|
||||
'web/static/src/scss/fontawesome_overridden.scss',
|
||||
'web/static/fonts/fonts.scss',
|
||||
"web/static/src/scss/ui.scss",
|
||||
|
||||
('remove', 'web/static/src/core/errors/error_handlers.js'), # error handling in PoS is different from the webclient
|
||||
('remove', '/web/static/src/core/dialog/dialog.scss'),
|
||||
'web/static/src/core/currency.js',
|
||||
# barcode scanner
|
||||
'barcodes/static/src/barcode_service.js',
|
||||
'barcodes/static/src/js/barcode_parser.js',
|
||||
'barcodes_gs1_nomenclature/static/src/js/barcode_parser.js',
|
||||
'barcodes_gs1_nomenclature/static/src/js/barcode_service.js',
|
||||
# report download utils
|
||||
'web/static/src/webclient/actions/reports/utils.js',
|
||||
# PoS files
|
||||
'point_of_sale/static/src/**/*',
|
||||
('remove', 'point_of_sale/static/src/backend/**/*'),
|
||||
('remove', 'point_of_sale/static/src/customer_display/**/*'),
|
||||
'point_of_sale/static/src/customer_display/utils.js',
|
||||
# main.js boots the pos app, it is only included in the prod bundle as tests mount the app themselves
|
||||
('remove', 'point_of_sale/static/src/app/main.js'),
|
||||
("include", "point_of_sale.base_tests"),
|
||||
# account
|
||||
'account/static/src/helpers/*.js',
|
||||
'account/static/src/services/account_move_service.js',
|
||||
|
||||
'mail/static/src/core/common/sound_effects_service.js',
|
||||
"web/static/src/core/browser/router.js",
|
||||
"web/static/src/core/debug/**/*",
|
||||
'web/static/src/model/**/*',
|
||||
'web/static/src/views/**/*',
|
||||
'web/static/src/search/**/*',
|
||||
'web/static/src/webclient/actions/**/*',
|
||||
('remove', 'web/static/src/webclient/actions/reports/layout_assets/**/*'),
|
||||
('remove', 'web/static/src/webclient/actions/**/*css'),
|
||||
'partner_autocomplete/static/src/**/*',
|
||||
'google_address_autocomplete/static/src/**/*',
|
||||
],
|
||||
'point_of_sale.base_tests': [
|
||||
"web/static/lib/hoot-dom/**/*",
|
||||
"web_tour/static/src/js/**/*",
|
||||
'web_tour/static/src/tour_utils.js',
|
||||
"barcodes/static/tests/legacy/helpers.js",
|
||||
"web/static/tests/legacy/helpers/utils.js",
|
||||
"web/static/tests/legacy/helpers/cleanup.js",
|
||||
'iot_base/static/src/network_utils/*',
|
||||
'iot_base/static/src/device_controller.js',
|
||||
],
|
||||
# Bundle that starts the pos, loaded on /pos/ui
|
||||
'point_of_sale.assets_prod': [
|
||||
('include', 'point_of_sale._assets_pos'),
|
||||
'point_of_sale/static/src/app/main.js',
|
||||
],
|
||||
'point_of_sale.assets_prod_dark': [
|
||||
('include', 'point_of_sale.assets_prod'),
|
||||
],
|
||||
'point_of_sale.customer_display_assets': [
|
||||
('include', 'point_of_sale.base_app'),
|
||||
"point_of_sale/static/src/app/components/odoo_logo/*",
|
||||
"point_of_sale/static/src/app/components/orderline/*",
|
||||
"point_of_sale/static/src/app/components/centered_icon/*",
|
||||
"point_of_sale/static/src/app/utils/use_timed_press.js",
|
||||
"point_of_sale/static/src/utils.js",
|
||||
"point_of_sale/static/src/customer_display/**/*",
|
||||
],
|
||||
'point_of_sale.customer_display_assets_test': [
|
||||
('include', 'point_of_sale.base_tests'),
|
||||
"point_of_sale/static/tests/pos/tours/utils/common.js",
|
||||
"point_of_sale/static/tests/generic_helpers/order_widget_util.js",
|
||||
"point_of_sale/static/tests/generic_helpers/utils.js",
|
||||
"point_of_sale/static/tests/customer_display/customer_display_utils.js",
|
||||
"point_of_sale/static/tests/customer_display/customer_display_tour.js",
|
||||
],
|
||||
'point_of_sale.assets_debug': [
|
||||
('include', 'point_of_sale.base_tests'),
|
||||
'barcodes/static/tests/legacy/helpers.js',
|
||||
'point_of_sale/static/tests/generic_helpers/**/*',
|
||||
'point_of_sale/static/tests/pos/tours/**/*',
|
||||
],
|
||||
},
|
||||
'author': 'Odoo S.A.',
|
||||
'license': 'LGPL-3',
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
from . import main
|
||||
from . import customer_display
|
||||
|
|
|
|||
|
|
@ -0,0 +1,21 @@
|
|||
from odoo import http
|
||||
from odoo.http import request
|
||||
|
||||
|
||||
class PosCustomerDisplay(http.Controller):
|
||||
@http.route("/pos_customer_display/<id_>/<device_uuid>", auth="public", type="http", website=True)
|
||||
def pos_customer_display(self, id_, device_uuid, **kw):
|
||||
pos_config_sudo = request.env["pos.config"].sudo().browse(int(id_))
|
||||
return request.render(
|
||||
"point_of_sale.customer_display_index",
|
||||
{
|
||||
"session_info": {
|
||||
"user_context": {
|
||||
"lang": request.env.user.lang or pos_config_sudo.company_id.partner_id.lang
|
||||
},
|
||||
**request.env["ir.http"].get_frontend_session_info(),
|
||||
**pos_config_sudo._get_customer_display_data(),
|
||||
'device_uuid': device_uuid,
|
||||
},
|
||||
},
|
||||
)
|
||||
|
|
@ -1,24 +1,48 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
import logging
|
||||
import json
|
||||
|
||||
from odoo import http, _
|
||||
from odoo.fields import Domain
|
||||
from odoo.http import request
|
||||
from odoo.osv.expression import AND
|
||||
from odoo.tools import format_amount
|
||||
from odoo.tools import format_amount, file_open
|
||||
from odoo.addons.account.controllers.portal import PortalAccount
|
||||
from datetime import timedelta, datetime
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class PosController(PortalAccount):
|
||||
|
||||
@http.route('/pos/service-worker.js', type='http', auth='user')
|
||||
def pos_web_service_worker(self):
|
||||
response = request.make_response(
|
||||
self._get_pos_service_worker(),
|
||||
[
|
||||
('Content-Type', 'text/javascript'),
|
||||
('Service-Worker-Allowed', '/pos'),
|
||||
],
|
||||
)
|
||||
return response
|
||||
|
||||
def _get_pos_service_worker(self):
|
||||
with file_open('point_of_sale/static/src/app/service_worker.js') as f:
|
||||
body = f.read()
|
||||
return body
|
||||
|
||||
# Support old routes for backward compatibility
|
||||
@http.route(['/pos/web', '/pos/ui'], type='http', auth='user')
|
||||
def pos_web(self, config_id=False, **k):
|
||||
def old_pos_web(self, config_id=False, from_backend=False, **k):
|
||||
return self.pos_web(config_id, from_backend, **k)
|
||||
|
||||
@http.route(["/pos/ui/<config_id>", "/pos/ui/<config_id>/<path:subpath>"], auth="user", type='http')
|
||||
def pos_web(self, config_id=False, from_backend=False, subpath=None, **k):
|
||||
"""Open a pos session for the given config.
|
||||
|
||||
The right pos session will be selected to open, if non is open yet a new session will be created.
|
||||
|
||||
/pos/ui and /pos/web both can be used to acces the POS. On the SaaS,
|
||||
/pos/ui and /pos/web both can be used to access the POS. On the SaaS,
|
||||
/pos/ui uses HTTPS while /pos/web uses HTTP.
|
||||
|
||||
:param debug: The debug mode to load the session in.
|
||||
|
|
@ -27,7 +51,8 @@ class PosController(PortalAccount):
|
|||
:type config_id: str.
|
||||
:returns: object -- The rendered pos session.
|
||||
"""
|
||||
is_internal_user = request.env.user.has_group('base.group_user')
|
||||
is_internal_user = request.env.user._is_internal()
|
||||
pos_config = False
|
||||
if not is_internal_user:
|
||||
return request.not_found()
|
||||
domain = [
|
||||
|
|
@ -35,8 +60,8 @@ class PosController(PortalAccount):
|
|||
('user_id', '=', request.session.uid),
|
||||
('rescue', '=', False)
|
||||
]
|
||||
if config_id:
|
||||
domain = AND([domain,[('config_id', '=', int(config_id))]])
|
||||
if config_id and request.env['pos.config'].sudo().browse(int(config_id)).exists():
|
||||
domain = Domain.AND([domain, [('config_id', '=', int(config_id))]])
|
||||
pos_config = request.env['pos.config'].sudo().browse(int(config_id))
|
||||
pos_session = request.env['pos.session'].sudo().search(domain, limit=1)
|
||||
|
||||
|
|
@ -50,37 +75,46 @@ class PosController(PortalAccount):
|
|||
('config_id', '=', int(config_id)),
|
||||
]
|
||||
pos_session = request.env['pos.session'].sudo().search(domain, limit=1)
|
||||
if not pos_session or config_id and not pos_config.active:
|
||||
return request.redirect('/web#action=point_of_sale.action_client_pos_menu')
|
||||
# The POS only work in one company, so we enforce the one of the session in the context
|
||||
|
||||
if not pos_config or not pos_config.active or pos_config.has_active_session and not pos_session:
|
||||
return request.redirect('/odoo/action-point_of_sale.action_client_pos_menu')
|
||||
|
||||
if not pos_config.has_active_session:
|
||||
# Acquire an row-level lock on the pos_config record to prevent race conditions
|
||||
# This prevents multiple concurrent processes from creating duplicate POS sessions
|
||||
request.env.cr.execute(
|
||||
"SELECT id FROM pos_config WHERE id = %s FOR UPDATE NOWAIT",
|
||||
(pos_config.id,)
|
||||
)
|
||||
pos_config.open_ui()
|
||||
pos_session = request.env['pos.session'].sudo().search(domain, limit=1)
|
||||
|
||||
# The POS only works in one company, so we enforce the one of the session in the context
|
||||
company = pos_session.company_id
|
||||
session_info = request.env['ir.http'].session_info()
|
||||
session_info['user_context']['allowed_company_ids'] = company.ids
|
||||
session_info['user_companies'] = {'current_company': company.id, 'allowed_companies': {company.id: session_info['user_companies']['allowed_companies'][company.id]}}
|
||||
session_info['nomenclature_id'] = pos_session.company_id.nomenclature_id.id
|
||||
session_info['fallback_nomenclature_id'] = pos_session.config_id.fallback_nomenclature_id.id
|
||||
use_lna = bool(pos_session.env["ir.config_parameter"].get_param("point_of_sale.use_lna"))
|
||||
context = {
|
||||
'from_backend': 1 if from_backend else 0,
|
||||
'use_pos_fake_tours': True if k.get('tours', False) else False,
|
||||
'session_info': session_info,
|
||||
'login_number': pos_session.login(),
|
||||
'pos_session_id': pos_session.id,
|
||||
'pos_config_id': pos_session.config_id.id,
|
||||
'access_token': pos_session.config_id.access_token,
|
||||
'last_data_change': pos_session.config_id.last_data_change.strftime("%Y-%m-%d %H:%M:%S"),
|
||||
'urls_to_cache': json.dumps(pos_config._get_url_to_cache(request.session.debug)),
|
||||
'use_lna': use_lna,
|
||||
}
|
||||
response = request.render('point_of_sale.index', context)
|
||||
response.headers['Cache-Control'] = 'no-store'
|
||||
return response
|
||||
|
||||
@http.route('/pos/ui/tests', type='http', auth="user")
|
||||
def test_suite(self, mod=None, **kwargs):
|
||||
domain = [
|
||||
('state', '=', 'opened'),
|
||||
('user_id', '=', request.session.uid),
|
||||
('rescue', '=', False)
|
||||
]
|
||||
pos_session = request.env['pos.session'].sudo().search(domain, limit=1)
|
||||
session_info = request.env['ir.http'].session_info()
|
||||
session_info['user_context']['allowed_company_ids'] = pos_session.company_id.ids
|
||||
context = {
|
||||
'session_info': session_info,
|
||||
'pos_session_id': pos_session.id,
|
||||
}
|
||||
return request.render('point_of_sale.qunit_suite', qcontext=context)
|
||||
@http.route(['/pos/ping'], type='jsonrpc', auth='user')
|
||||
def pos_ping(self):
|
||||
return {'response': 'pong'}
|
||||
|
||||
@http.route('/pos/sale_details_report', type='http', auth='user')
|
||||
def print_sale_details(self, date_start=False, date_stop=False, **kw):
|
||||
|
|
@ -89,6 +123,46 @@ class PosController(PortalAccount):
|
|||
pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf))]
|
||||
return request.make_response(pdf, headers=pdfhttpheaders)
|
||||
|
||||
@http.route(['/pos/ticket'], type='http', auth="public", website=True, sitemap=False)
|
||||
def invoice_request_screen(self, **kwargs):
|
||||
errors = {}
|
||||
form_values = {}
|
||||
if request.httprequest.method == 'POST':
|
||||
for field in ['pos_reference', 'date_order', 'ticket_code']:
|
||||
if not kwargs.get(field):
|
||||
errors[field] = " "
|
||||
else:
|
||||
form_values[field] = kwargs.get(field)
|
||||
|
||||
if errors:
|
||||
errors['generic'] = _("Please fill all the required fields.")
|
||||
elif len(form_values['pos_reference']) < 12:
|
||||
errors['pos_reference'] = _("The Ticket Number should be at least 12 characters long.")
|
||||
else:
|
||||
date_order = datetime(*[int(i) for i in form_values['date_order'].split('-')])
|
||||
order = request.env['pos.order'].sudo().search([
|
||||
('pos_reference', '=like', '%' + form_values['pos_reference'].strip().replace('%', r'\%').replace('_', r'\_')),
|
||||
('date_order', '>=', date_order - timedelta(days=1)),
|
||||
('date_order', '<', date_order + timedelta(days=2)),
|
||||
('ticket_code', '=', form_values['ticket_code']),
|
||||
], limit=1)
|
||||
if order:
|
||||
return request.redirect('/pos/ticket/validate?access_token=%s' % (order.access_token))
|
||||
else:
|
||||
errors['generic'] = _("No sale order found.")
|
||||
|
||||
elif request.httprequest.method == 'GET':
|
||||
if kwargs.get('order_uuid'):
|
||||
order = self.env['pos.order'].sudo().search([('uuid', '=', kwargs['order_uuid'])], limit=1)
|
||||
if order:
|
||||
return request.redirect('/pos/ticket/validate?access_token=%s' % (order.access_token))
|
||||
|
||||
return request.render("point_of_sale.ticket_request_with_code", {
|
||||
'errors': errors,
|
||||
'banner_error': " ".join(errors.values()),
|
||||
'form_values': form_values,
|
||||
})
|
||||
|
||||
@http.route(['/pos/ticket/validate'], type='http', auth="public", website=True, sitemap=False)
|
||||
def show_ticket_validation_screen(self, access_token='', **kwargs):
|
||||
def _parse_additional_values(fields, prefix, kwargs):
|
||||
|
|
@ -113,10 +187,17 @@ class PosController(PortalAccount):
|
|||
if not pos_order:
|
||||
return request.not_found()
|
||||
|
||||
# Set the proper context in case of unauthenticated user accessing
|
||||
# from the main company website
|
||||
pos_order = pos_order.with_company(pos_order.company_id).with_context(allowed_company_ids=pos_order.company_id.ids)
|
||||
|
||||
# If the order was already invoiced, return the invoice directly by forcing the access token so that the non-connected user can see it.
|
||||
if pos_order.account_move and pos_order.account_move.is_sale_document():
|
||||
return request.redirect('/my/invoices/%s?access_token=%s' % (pos_order.account_move.id, pos_order.account_move._portal_ensure_token()))
|
||||
|
||||
if not request.env['res.company']._with_locked_records(pos_order, allow_raising=False):
|
||||
return
|
||||
|
||||
# Get the optional extra fields that could be required for a localisation.
|
||||
pos_order_country = pos_order.company_id.account_fiscal_country_id
|
||||
additional_partner_fields = request.env['res.partner'].get_partner_localisation_fields_required_to_invoice(pos_order_country)
|
||||
|
|
@ -125,7 +206,8 @@ class PosController(PortalAccount):
|
|||
user_is_connected = not request.env.user._is_public()
|
||||
|
||||
# Validate the form by ensuring required fields are filled and the VAT is correct.
|
||||
form_values = {'error': {}, 'error_message': {}, 'extra_field_values': {}}
|
||||
form_values = {'extra_field_values': {}}
|
||||
partner = (user_is_connected and request.env.user.partner_id) or pos_order.partner_id
|
||||
if kwargs and request.httprequest.method == 'POST':
|
||||
form_values.update(kwargs)
|
||||
# Extract the additional fields values from the kwargs now as they can't be there when validating the 'regular' partner form.
|
||||
|
|
@ -135,34 +217,27 @@ class PosController(PortalAccount):
|
|||
invoice_values, prefixed_invoice_values = _parse_additional_values(additional_invoice_fields, 'invoice_', kwargs)
|
||||
form_values['extra_field_values'].update(prefixed_invoice_values)
|
||||
# Check the basic form fields if the user is not connected as we will need these information to create the new user.
|
||||
if not user_is_connected:
|
||||
error, error_message = self.details_form_validate(kwargs, partner_creation=True)
|
||||
else:
|
||||
# Check that the billing information of the user are filled.
|
||||
error, error_message = {}, []
|
||||
partner = request.env.user.partner_id
|
||||
for field in self.MANDATORY_BILLING_FIELDS:
|
||||
if not partner[field]:
|
||||
error[field] = 'error'
|
||||
error_message.append(_('The %s must be filled in your details.', request.env['ir.model.fields']._get('res.partner', field).field_description))
|
||||
# Check that the "optional" additional fields are filled.
|
||||
error, error_message = self.extra_details_form_validate(partner_values, additional_partner_fields, error, error_message)
|
||||
error, error_message = self.extra_details_form_validate(invoice_values, additional_invoice_fields, error, error_message)
|
||||
if not error:
|
||||
return self._get_invoice(partner_values, invoice_values, pos_order, additional_invoice_fields, kwargs)
|
||||
else:
|
||||
form_values.update({'error': error, 'error_message': error_message})
|
||||
partner, feedback_dict = self._create_or_update_address(partner, **(kwargs | partner_values))
|
||||
form_values.update(feedback_dict)
|
||||
missing_fields, error_messages = self._validate_extra_form_details(
|
||||
partner_values | invoice_values,
|
||||
additional_partner_fields + additional_invoice_fields
|
||||
)
|
||||
form_values.update({
|
||||
'invalid_field': form_values.get('invalid_fields', []) + list(missing_fields),
|
||||
'messages': form_values.get('messages', []) + error_messages
|
||||
})
|
||||
if not form_values.get('invalid_fields'):
|
||||
return self._get_invoice(partner, invoice_values, pos_order, additional_invoice_fields, kwargs)
|
||||
|
||||
elif user_is_connected:
|
||||
return self._get_invoice({}, {}, pos_order, additional_invoice_fields, kwargs)
|
||||
return self._get_invoice(partner, {}, pos_order, additional_invoice_fields, kwargs)
|
||||
|
||||
# Most of the time, the country of the customer will be the same as the order. We can prefill it by default with the country of the company.
|
||||
if 'country_id' not in form_values:
|
||||
form_values['country_id'] = pos_order_country.id
|
||||
if 'country' not in form_values:
|
||||
form_values['country'] = pos_order_country
|
||||
|
||||
partner = request.env['res.partner']
|
||||
# Prefill the customer extra values if there is any and an user is connected
|
||||
partner = (user_is_connected and request.env.user.partner_id) or pos_order.partner_id
|
||||
if partner:
|
||||
if additional_partner_fields:
|
||||
form_values['extra_field_values'] = {'partner_' + field.name: partner[field.name] for field in additional_partner_fields if field.name not in form_values['extra_field_values']}
|
||||
|
|
@ -175,38 +250,31 @@ class PosController(PortalAccount):
|
|||
form_values['partner_address'] = partner._display_address()
|
||||
|
||||
return request.render("point_of_sale.ticket_validation_screen", {
|
||||
**self._prepare_address_form_values(partner, **kwargs),
|
||||
'partner': partner,
|
||||
'address_url': f'/my/account?redirect=/pos/ticket/validate?access_token={access_token}',
|
||||
'user_is_connected': user_is_connected,
|
||||
'format_amount': format_amount,
|
||||
'env': request.env,
|
||||
'countries': request.env['res.country'].sudo().search([]),
|
||||
'states': request.env['res.country.state'].sudo().search([]),
|
||||
'partner_can_edit_vat': True,
|
||||
'pos_order': pos_order,
|
||||
'invoice_required_fields': additional_invoice_fields,
|
||||
'partner_required_fields': additional_partner_fields,
|
||||
'access_token': access_token,
|
||||
'invoice_sending_methods': {'email': _("by Email")},
|
||||
**form_values,
|
||||
})
|
||||
|
||||
def _get_invoice(self, partner_values, invoice_values, pos_order, additional_invoice_fields, kwargs):
|
||||
# If the user is not connected, then we will simply create a new partner with the form values.
|
||||
# Matching with existing partner was tried, but we then can't update the values, and it would force the user to use the ones from the first invoicing.
|
||||
if request.env.user._is_public() and not pos_order.partner_id.id:
|
||||
partner_values.update({key: kwargs[key] for key in self.MANDATORY_BILLING_FIELDS})
|
||||
partner_values.update({key: kwargs[key] for key in self.OPTIONAL_BILLING_FIELDS if key in kwargs})
|
||||
for field in {'country_id', 'state_id'} & set(partner_values.keys()):
|
||||
try:
|
||||
partner_values[field] = int(partner_values[field])
|
||||
except Exception:
|
||||
partner_values[field] = False
|
||||
partner_values.update({'zip': partner_values.pop('zipcode', '')})
|
||||
partner = request.env['res.partner'].sudo().create(partner_values) # In this case, partner_values contains the whole partner info form.
|
||||
# If the user is connected, then we can update if needed its fields with the additional localized fields if any, then proceed.
|
||||
else:
|
||||
partner = pos_order.partner_id or (not request.env.user._is_public() and request.env.user.partner_id)
|
||||
partner.write(partner_values) # In this case, partner_values only contains the additional fields that can be updated.
|
||||
def _validate_extra_form_details(self, addtional_form_values, additional_required_fields):
|
||||
""" Ensure that all additional required fields have a value in the data. """
|
||||
missing_fields = set()
|
||||
error_messages = []
|
||||
for field in additional_required_fields:
|
||||
if field.name not in addtional_form_values or not addtional_form_values[field.name]:
|
||||
missing_fields.add(field.name)
|
||||
error_messages.append(_("The field %s must be filled.", field.field_description.lower()))
|
||||
return missing_fields, error_messages
|
||||
|
||||
def _get_invoice(self, partner, invoice_values, pos_order, additional_invoice_fields, kwargs):
|
||||
|
||||
pos_order.partner_id = partner
|
||||
# Get the required fields for the invoice and add them to the context as default values.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<function model="pos.config" name="load_onboarding_furniture_scenario" />
|
||||
<function model="pos.config" name="load_onboarding_clothes_scenario" />
|
||||
<function model="pos.config" name="load_onboarding_bakery_scenario" />
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<function model="pos.config" name="_set_default_pos_load_limit" />
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="email_template_pos_receipt" model="mail.template">
|
||||
<field name="name">Point of Sale: Receipt</field>
|
||||
<field name="description">Sent to customers with the receipt in attachment</field>
|
||||
<field name="model_id" ref="point_of_sale.model_pos_order"/>
|
||||
<field name="subject">Your {{ object.config_id.name }} receipt</field>
|
||||
<field name="email_from">{{ (object.company_id.email_formatted or object.user_id.email_formatted)}}</field>
|
||||
<field name="email_to" eval="False"/>
|
||||
<field name="partner_to" eval="False"/>
|
||||
<field name="use_default_to" eval="False"/>
|
||||
<field name="lang">{{ object.partner_id.lang or user.lang }}</field>
|
||||
<field name="auto_delete" eval="False"/>
|
||||
<field name="body_html" type="html">
|
||||
<div style="margin: 0; padding: 0; font-size: 14px;">
|
||||
<t t-set="client_name" t-value="object.partner_id.name"/>
|
||||
<t t-set="store_name" t-value="object.config_id.name"/>
|
||||
<t t-set="tz" t-value="object.env.user.tz"/>
|
||||
<t t-set="lg" t-value="object.partner_id.lang or user.lang"/>
|
||||
<div>
|
||||
<t t-if="client_name">Hello <t t-out="client_name">Client name</t>,</t>
|
||||
<t t-else="">Hello,</t>
|
||||
</div>
|
||||
<br/>
|
||||
<div>Thank you for purchasing from <t t-out="store_name">Store name</t>!</div>
|
||||
<div>Attached, you will find your receipt for the purchase of <span><t
|
||||
t-out="format_datetime(dt=object.date_order, tz=tz, dt_format="EEEE d MMMM",
|
||||
lang_code=lg) or ''">date</t> <t t-out="format_time(time=object.date_order, tz=tz, time_format='short',
|
||||
lang_code=lg)">time</t>.</span>
|
||||
</div>
|
||||
<br/>
|
||||
<div>With kind regards,</div>
|
||||
<br/>
|
||||
<t t-out="store_name">Store name</t>
|
||||
</div>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,194 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
|
||||
<record id="base.default_user_group" model="res.groups">
|
||||
<field name="implied_ids" eval="[(4, ref('point_of_sale.group_pos_manager'))]"/>
|
||||
</record>
|
||||
|
||||
<!-- Closed Session 2 -->
|
||||
|
||||
<record id="pos_closed_session_1" model="pos.session" forcecreate="False" context="{'onboarding_creation': True}">
|
||||
<field name="name">ClosedSession/0001</field>
|
||||
<field name="config_id" ref="pos_config_main" />
|
||||
<field name="user_id" ref="base.user_admin" />
|
||||
<field name="name">Furniture Shop/Demo/01</field>
|
||||
<field name="start_at" eval="(DateTime.today() + relativedelta(days=-1)).strftime('%Y-%m-%d %H:%M:%S')" />
|
||||
<field name="stop_at"
|
||||
eval="(DateTime.today() + relativedelta(days=-1, hours=1)).strftime('%Y-%m-%d %H:%M:%S')" />
|
||||
</record>
|
||||
|
||||
<record id="pos_closed_order_1_1" model="pos.order" forcecreate="False">
|
||||
<field name="session_id" ref="pos_closed_session_1" />
|
||||
<field name="company_id" ref="base.main_company" />
|
||||
<field name="state">paid</field>
|
||||
<field name="amount_total">4.81</field>
|
||||
<field name="amount_tax">0.0</field>
|
||||
<field name="amount_paid">4.81</field>
|
||||
<field name="amount_return">0.0</field>
|
||||
<field name="ticket_code">sv34t</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_closed_orderline_1_1_1" model="pos.order.line" forcecreate="False">
|
||||
<field name="product_id" ref="wall_shelf" />
|
||||
<field name="price_subtotal">1.98</field>
|
||||
<field name="price_subtotal_incl">1.98</field>
|
||||
<field name="price_unit">1.98</field>
|
||||
<field name="order_id" ref="pos_closed_order_1_1" />
|
||||
<field name="full_product_name">Wall Shelf</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_closed_orderline_1_1_2" model="pos.order.line" forcecreate="False">
|
||||
<field name="product_id" ref="small_shelf" />
|
||||
<field name="price_subtotal">2.83</field>
|
||||
<field name="price_subtotal_incl">2.83</field>
|
||||
<field name="price_unit">2.83</field>
|
||||
<field name="order_id" ref="pos_closed_order_1_1" />
|
||||
<field name="full_product_name">Small Shelf</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_payment_1" model="pos.payment" forcecreate="False">
|
||||
<field name="payment_method_id" ref="point_of_sale.cash_payment_method_furniture" />
|
||||
<field name="pos_order_id" ref="pos_closed_order_1_1" />
|
||||
<field name="amount">4.81</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_closed_order_1_2" model="pos.order" forcecreate="False">
|
||||
<field name="session_id" ref="pos_closed_session_1" />
|
||||
<field name="company_id" ref="base.main_company" />
|
||||
<field name="state">paid</field>
|
||||
<field name="amount_total">6.78</field>
|
||||
<field name="amount_tax">0.0</field>
|
||||
<field name="amount_paid">6.78</field>
|
||||
<field name="amount_return">0.0</field>
|
||||
<field name="ticket_code">lm34t</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_closed_orderline_1_2_1" model="pos.order.line" forcecreate="False">
|
||||
<field name="product_id" ref="magnetic_board" />
|
||||
<field name="price_subtotal">1.98</field>
|
||||
<field name="price_subtotal_incl">1.98</field>
|
||||
<field name="price_unit">1.98</field>
|
||||
<field name="order_id" ref="pos_closed_order_1_2" />
|
||||
<field name="full_product_name">Magnetic Board</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_closed_orderline_1_2_2" model="pos.order.line" forcecreate="False">
|
||||
<field name="product_id" ref="letter_tray" />
|
||||
<field name="price_subtotal">4.80</field>
|
||||
<field name="price_subtotal_incl">4.80</field>
|
||||
<field name="price_unit">4.80</field>
|
||||
<field name="order_id" ref="pos_closed_order_1_2" />
|
||||
<field name="full_product_name">Letter Tray</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_payment_2" model="pos.payment" forcecreate="False">
|
||||
<field name="payment_method_id" ref="point_of_sale.cash_payment_method_furniture" />
|
||||
<field name="pos_order_id" ref="pos_closed_order_1_2" />
|
||||
<field name="amount">6.78</field>
|
||||
</record>
|
||||
|
||||
<function model="pos.session" name="post_closing_cash_details" eval="[[ref('pos_closed_session_1')], 2225.31]" />
|
||||
|
||||
<function model="pos.session" name="update_closing_control_state_session"
|
||||
eval="[[ref('pos_closed_session_1')], '']" />
|
||||
|
||||
<function model="pos.session" name="action_pos_session_closing_control"
|
||||
eval="[[ref('pos_closed_session_1')]]" />
|
||||
|
||||
<!-- Closed Session 2 -->
|
||||
|
||||
<record id="pos_closed_session_2" model="pos.session" forcecreate="False" context="{'onboarding_creation': True}">
|
||||
<field name="name">ClosedSession/0002</field>
|
||||
<field name="config_id" ref="pos_config_main" />
|
||||
<field name="user_id" ref="base.user_admin" />
|
||||
<field name="name">Furniture Shop/Demo/02</field>
|
||||
<field name="start_at" eval="(DateTime.today() + relativedelta(hours=-3)).strftime('%Y-%m-%d %H:%M:%S')" />
|
||||
<field name="stop_at" eval="(DateTime.today() + relativedelta(hours=-2)).strftime('%Y-%m-%d %H:%M:%S')" />
|
||||
</record>
|
||||
|
||||
<record id="pos_closed_order_2_1" model="pos.order" forcecreate="False">
|
||||
<field name="session_id" ref="pos_closed_session_2" />
|
||||
<field name="company_id" ref="base.main_company" />
|
||||
<field name="state">paid</field>
|
||||
<field name="amount_total">9.90</field>
|
||||
<field name="amount_tax">0.0</field>
|
||||
<field name="amount_paid">9.90</field>
|
||||
<field name="amount_return">0.0</field>
|
||||
<field name="ticket_code">cv36m</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_closed_orderline_2_1_1" model="pos.order.line" forcecreate="False">
|
||||
<field name="name">Closed Orderline 2.1.1</field>
|
||||
<field name="product_id" ref="letter_tray" />
|
||||
<field name="price_subtotal">4.80</field>
|
||||
<field name="price_subtotal_incl">4.80</field>
|
||||
<field name="price_unit">4.80</field>
|
||||
<field name="order_id" ref="pos_closed_order_2_1" />
|
||||
<field name="full_product_name">Letter Tray</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_closed_orderline_2_1_2" model="pos.order.line" forcecreate="False">
|
||||
<field name="name">Closed Orderline 2.1.2</field>
|
||||
<field name="product_id" ref="product.desk_organizer" />
|
||||
<field name="price_subtotal">5.10</field>
|
||||
<field name="price_subtotal_incl">5.10</field>
|
||||
<field name="price_unit">5.10</field>
|
||||
<field name="order_id" ref="pos_closed_order_2_1" />
|
||||
<field name="full_product_name">Desk Organizer</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_payment_3" model="pos.payment" forcecreate="False">
|
||||
<field name="payment_method_id" ref="point_of_sale.cash_payment_method_furniture" />
|
||||
<field name="pos_order_id" ref="pos_closed_order_2_1" />
|
||||
<field name="amount">9.90</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_closed_order_2_2" model="pos.order" forcecreate="False">
|
||||
<field name="session_id" ref="pos_closed_session_2" />
|
||||
<field name="company_id" ref="base.main_company" />
|
||||
<field name="state">paid</field>
|
||||
<field name="amount_total">8.36</field>
|
||||
<field name="amount_tax">0.0</field>
|
||||
<field name="amount_paid">8.36</field>
|
||||
<field name="amount_return">0.0</field>
|
||||
<field name="ticket_code">cv44t</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_closed_orderline_2_2_1" model="pos.order.line" forcecreate="False">
|
||||
<field name="name">Closed Orderline 2.2.1</field>
|
||||
<field name="product_id" ref="magnetic_board" />
|
||||
<field name="price_subtotal">1.98</field>
|
||||
<field name="price_subtotal_incl">1.98</field>
|
||||
<field name="price_unit">1.98</field>
|
||||
<field name="order_id" ref="pos_closed_order_2_2" />
|
||||
<field name="full_product_name">Magnetic Board</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_closed_orderline_2_2_2" model="pos.order.line" forcecreate="False">
|
||||
<field name="name">Closed Orderline 2.1.2</field>
|
||||
<field name="product_id" ref="product.monitor_stand" />
|
||||
<field name="price_subtotal">6.38</field>
|
||||
<field name="price_subtotal_incl">6.38</field>
|
||||
<field name="qty">2</field>
|
||||
<field name="price_unit">3.19</field>
|
||||
<field name="order_id" ref="pos_closed_order_2_2" />
|
||||
<field name="full_product_name">Monitor Stand</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_payment_4" model="pos.payment" forcecreate="False">
|
||||
<field name="payment_method_id" ref="point_of_sale.cash_payment_method_furniture" />
|
||||
<field name="pos_order_id" ref="pos_closed_order_2_2" />
|
||||
<field name="amount">8.36</field>
|
||||
</record>
|
||||
|
||||
<function model="pos.session" name="post_closing_cash_details"
|
||||
eval="[[ref('pos_closed_session_2')], 2243.57]" />
|
||||
|
||||
<function model="pos.session" name="update_closing_control_state_session"
|
||||
eval="[[ref('pos_closed_session_2')], '']" />
|
||||
|
||||
<function model="pos.session" name="action_pos_session_closing_control"
|
||||
eval="[[ref('pos_closed_session_2')]]" />
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -12,132 +12,100 @@
|
|||
<field name="params" eval="{'menu_id': ref('menu_point_root')}"/>
|
||||
</record>
|
||||
|
||||
<record id="product_category_pos" model="product.category">
|
||||
<field name="parent_id" ref="product.product_category_1"/>
|
||||
<field name="name">PoS</field>
|
||||
<record id="action_client_product_menu" model="ir.actions.client">
|
||||
<field name="name">Load Product Menu</field>
|
||||
<field name="tag">reload</field>
|
||||
<field name="params" eval="{'menu_id': ref('point_of_sale.menu_pos_products')}"/>
|
||||
</record>
|
||||
|
||||
<record id="product_category_food" model="product.category">
|
||||
<field name="name">Food</field>
|
||||
</record>
|
||||
|
||||
<record id="product_product_tip" model="product.product">
|
||||
<field name="name">Tips</field>
|
||||
<field name="categ_id" ref="point_of_sale.product_category_pos"/>
|
||||
<field name="categ_id" eval="ref('product.product_category_services', raise_if_not_found=False)"/>
|
||||
<field name="default_code">TIPS</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="available_in_pos">False</field>
|
||||
<field name="taxes_id" eval="[(5,)]"/>
|
||||
</record>
|
||||
|
||||
<record model="pos.config" id="pos_config_main" forcecreate="0">
|
||||
<field name="name">Shop</field>
|
||||
</record>
|
||||
|
||||
<record id="product_product_consumable" model="product.product">
|
||||
<field name="name">Discount</field>
|
||||
<field name="available_in_pos">False</field>
|
||||
<field name="standard_price">0.00</field>
|
||||
<field name="list_price">0.00</field>
|
||||
<field name="weight">0.00</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="categ_id" ref="point_of_sale.product_category_pos"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit"/>
|
||||
<field name="default_code">DISC</field>
|
||||
<field name="purchase_ok">False</field>
|
||||
</record>
|
||||
|
||||
<record id="uom.product_uom_categ_unit" model="uom.category">
|
||||
<record id="uom.product_uom_unit" model="uom.uom">
|
||||
<field name="is_pos_groupable">True</field>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="0_01" forcecreate="0">
|
||||
<field name="name">0.01</field>
|
||||
<field name="value">0.01</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
<record id="uom.product_uom_pack_6" model="uom.uom" forcecreate="0">
|
||||
<field name="is_pos_groupable">True</field>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="0_02" forcecreate="0">
|
||||
<field name="name">0.02</field>
|
||||
<field name="value">0.02</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
<record id="uom.product_uom_dozen" model="uom.uom" forcecreate="0">
|
||||
<field name="is_pos_groupable">True</field>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="0_05" forcecreate="0">
|
||||
<field name="name">0.05</field>
|
||||
<field name="value">0.05</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="0_10" forcecreate="0">
|
||||
<field name="name">0.10</field>
|
||||
<field name="value">0.10</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="0_20" forcecreate="0">
|
||||
<field name="name">0.20</field>
|
||||
<field name="value">0.20</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="0_25" forcecreate="0">
|
||||
<field name="name">0.25</field>
|
||||
<field name="value">0.25</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="0_50" forcecreate="0">
|
||||
<field name="name">0.50</field>
|
||||
<field name="value">0.50</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="1_00" forcecreate="0">
|
||||
<field name="name">1.00</field>
|
||||
<field name="value">1.00</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="2_00" forcecreate="0">
|
||||
<field name="name">2.00</field>
|
||||
<field name="value">2.00</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="5_00" forcecreate="0">
|
||||
<field name="name">5.00</field>
|
||||
<field name="value">5.00</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="10_00" forcecreate="0">
|
||||
<field name="name">10.00</field>
|
||||
<field name="value">10.00</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="20_00" forcecreate="0">
|
||||
<field name="name">20.00</field>
|
||||
<field name="value">20.00</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="50_00" forcecreate="0">
|
||||
<field name="name">50.00</field>
|
||||
<field name="value">50.00</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="100_00" forcecreate="0">
|
||||
<field name="name">100.00</field>
|
||||
<field name="value">100.00</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
</record>
|
||||
|
||||
<record model="pos.bill" id="200_00" forcecreate="0">
|
||||
<field name="name">200.00</field>
|
||||
<field name="value">200.00</field>
|
||||
<field name="pos_config_ids" eval="[(6, False, [ref('point_of_sale.pos_config_main')])]"/>
|
||||
</record>
|
||||
|
||||
<function model="pos.config" name="post_install_pos_localisation" />
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
|
|||
|
|
@ -1,375 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<!-- Partners with Barcodes -->
|
||||
<record id='base.res_partner_1' model='res.partner'> <field name='barcode'>0420100000005</field> </record>
|
||||
<record id='base.res_partner_2' model='res.partner'> <field name='barcode'>0420200000004</field> </record>
|
||||
<record id='base.res_partner_3' model='res.partner'> <field name='barcode'>0420300000003</field> </record>
|
||||
<record id='base.res_partner_4' model='res.partner'> <field name='barcode'>0420400000002</field> </record>
|
||||
<record id='base.res_partner_4' model='res.partner'> <field name='barcode'>0420700000009</field> </record>
|
||||
<record id='base.res_partner_10' model='res.partner'> <field name='barcode'>0421000000003</field> </record>
|
||||
<record id='base.res_partner_12' model='res.partner'> <field name='barcode'>0420800000008</field> </record>
|
||||
<record id='base.res_partner_18' model='res.partner'> <field name='barcode'>0421800000005</field> </record>
|
||||
|
||||
<record id="base.user_root" model="res.users">
|
||||
<field name="barcode">0410100000006</field>
|
||||
<field name="groups_id" eval="[(4,ref('group_pos_manager'))]"/>
|
||||
</record>
|
||||
|
||||
<record id="base.user_demo" model="res.users">
|
||||
<field name="groups_id" eval="[(4, ref('group_pos_user'))]"/>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- Resource: pos.category -->
|
||||
<record id="pos_category_miscellaneous" model="pos.category">
|
||||
<field name="name">Miscellaneous</field>
|
||||
</record>
|
||||
<record id="pos_category_desks" model="pos.category">
|
||||
<field name="name">Desks</field>
|
||||
</record>
|
||||
<record id="pos_category_chairs" model="pos.category">
|
||||
<field name="name">Chairs</field>
|
||||
</record>
|
||||
|
||||
<record model="pos.config" id="pos_config_main">
|
||||
<field name="iface_start_categ_id" ref="pos_category_chairs"/>
|
||||
<field name="start_category">True</field>
|
||||
</record>
|
||||
|
||||
<!-- Resource: product.product -->
|
||||
<record id="stock.product_cable_management_box" model="product.product">
|
||||
<field name="pos_categ_id" ref="point_of_sale.pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="wall_shelf" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">1.98</field>
|
||||
<field name="name">Wall Shelf Unit</field>
|
||||
<field name="default_code">FURN_0009</field>
|
||||
<field name="type">product</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="barcode">2100002000003</field>
|
||||
<field name="taxes_id" eval='[(5,)]'/>
|
||||
<field name="categ_id" ref="product.product_category_5"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/wall_shelf_unit.png"/>
|
||||
</record>
|
||||
<record id="small_shelf" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">2.83</field>
|
||||
<field name="name">Small Shelf</field>
|
||||
<field name="default_code">FURN_0008</field>
|
||||
<field name="type">product</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="taxes_id" eval='[(5,)]'/>
|
||||
<field name="categ_id" ref="product.product_category_5"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/small_shelf.png"/>
|
||||
</record>
|
||||
|
||||
<record id="letter_tray" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">4.80</field>
|
||||
<field name="name">Letter Tray</field>
|
||||
<field name="default_code">FURN_0004</field>
|
||||
<field name="type">product</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="categ_id" ref="product.product_category_5"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/letter_tray.png"/>
|
||||
</record>
|
||||
<record id="desk_organizer" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">5.10</field>
|
||||
<field name="name">Desk Organizer</field>
|
||||
<field name="default_code">FURN_0001</field>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="barcode">2300001000008</field>
|
||||
<field name="type">product</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="categ_id" ref="product.product_category_5"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/desk_organizer.png"/>
|
||||
<field name="taxes_id" eval='[(5,)]'/> <!-- no taxes -->
|
||||
</record>
|
||||
|
||||
<function model="ir.model.data" name="_update_xmlids">
|
||||
<value model="base" eval="[{
|
||||
'xml_id': 'point_of_sale.desk_organizer_product_template',
|
||||
'record': obj().env.ref('point_of_sale.desk_organizer').product_tmpl_id,
|
||||
'noupdate': True,
|
||||
}]"/>
|
||||
</function>
|
||||
|
||||
<record id="size_attribute" model="product.attribute">
|
||||
<field name="name">Size</field>
|
||||
<field name="sequence">30</field>
|
||||
<field name="display_type">radio</field>
|
||||
<field name="create_variant">no_variant</field>
|
||||
</record>
|
||||
<record id="size_attribute_s" model="product.attribute.value">
|
||||
<field name="name">S</field>
|
||||
<field name="sequence">1</field>
|
||||
<field name="attribute_id" ref="size_attribute"/>
|
||||
</record>
|
||||
<record id="size_attribute_m" model="product.attribute.value">
|
||||
<field name="name">M</field>
|
||||
<field name="sequence">2</field>
|
||||
<field name="attribute_id" ref="size_attribute"/>
|
||||
</record>
|
||||
<record id="size_attribute_l" model="product.attribute.value">
|
||||
<field name="name">L</field>
|
||||
<field name="sequence">3</field>
|
||||
<field name="attribute_id" ref="size_attribute"/>
|
||||
</record>
|
||||
<record id="desk_organizer_size" model="product.template.attribute.line">
|
||||
<field name="product_tmpl_id" ref="point_of_sale.desk_organizer_product_template"/>
|
||||
<field name="attribute_id" ref="size_attribute"/>
|
||||
<field name="value_ids" eval="[(6, 0, [ref('size_attribute_s'), ref('size_attribute_m'), ref('size_attribute_l')])]"/>
|
||||
</record>
|
||||
|
||||
<record id="fabric_attribute" model="product.attribute">
|
||||
<field name="name">Fabric</field>
|
||||
<field name="sequence">40</field>
|
||||
<field name="display_type">select</field>
|
||||
<field name="create_variant">no_variant</field>
|
||||
</record>
|
||||
<record id="fabric_attribute_plastic" model="product.attribute.value">
|
||||
<field name="name">Plastic</field>
|
||||
<field name="sequence">1</field>
|
||||
<field name="attribute_id" ref="fabric_attribute"/>
|
||||
</record>
|
||||
<record id="fabric_attribute_leather" model="product.attribute.value">
|
||||
<field name="name">Leather</field>
|
||||
<field name="sequence">2</field>
|
||||
<field name="attribute_id" ref="fabric_attribute"/>
|
||||
</record>
|
||||
<record id="fabric_attribute_custom" model="product.attribute.value">
|
||||
<field name="name">Custom</field>
|
||||
<field name="sequence">3</field>
|
||||
<field name="attribute_id" ref="fabric_attribute"/>
|
||||
<field name="is_custom">True</field>
|
||||
</record>
|
||||
<record id="desk_organizer_fabric" model="product.template.attribute.line">
|
||||
<field name="product_tmpl_id" ref="point_of_sale.desk_organizer_product_template"/>
|
||||
<field name="attribute_id" ref="fabric_attribute"/>
|
||||
<field name="value_ids" eval="[(6, 0, [ref('fabric_attribute_plastic'), ref('fabric_attribute_leather'), ref('fabric_attribute_custom')])]"/>
|
||||
</record>
|
||||
|
||||
<record id="magnetic_board" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">1.98</field>
|
||||
<field name="name">Magnetic Board</field>
|
||||
<field name="default_code">FURN_0005</field>
|
||||
<field name="type">product</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="barcode">2301000000006</field>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="categ_id" ref="product.product_category_5"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/magnetic_board.png"/>
|
||||
</record>
|
||||
<record id="monitor_stand" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">3.19</field>
|
||||
<field name="name">Monitor Stand</field>
|
||||
<field name="default_code">FURN_0006</field>
|
||||
<field name="type">product</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="categ_id" ref="product.product_category_5"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/monitor_stand.png"/>
|
||||
</record>
|
||||
<record id="desk_pad" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">1.98</field>
|
||||
<field name="name">Desk Pad</field>
|
||||
<field name="default_code">FURN_0002</field>
|
||||
<field name="type">product</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="categ_id" ref="product.product_category_5"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/desk_pad.png"/>
|
||||
</record>
|
||||
|
||||
<record id="whiteboard" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">1.70</field>
|
||||
<field name="name">Whiteboard</field>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="type">product</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="categ_id" ref="product.product_category_5"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/whiteboard.png"/>
|
||||
</record>
|
||||
|
||||
<record id="led_lamp" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">0.90</field>
|
||||
<field name="name">LED Lamp</field>
|
||||
<field name="default_code">FURN_0003</field>
|
||||
<field name="type">product</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="categ_id" ref="product.product_category_5"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/led_lamp.png"/>
|
||||
</record>
|
||||
|
||||
<record id="newspaper_rack" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">1.28</field>
|
||||
<field name="name">Newspaper Rack</field>
|
||||
<field name="default_code">FURN_0007</field>
|
||||
<field name="type">product</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="barcode">2100001000004</field>
|
||||
<field name="categ_id" ref="product.product_category_5"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/newspaper_stand.png"/>
|
||||
</record>
|
||||
|
||||
<record id="whiteboard_pen" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">1.20</field>
|
||||
<field name="name">Whiteboard Pen</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="default_code">CONS_0001</field>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="categ_id" ref="product.product_category_consumable"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/whiteboard_pen.png"/>
|
||||
</record>
|
||||
|
||||
<record id="product.product_product_1" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.product_product_2" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.product_delivery_01" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_chairs"/>
|
||||
</record>
|
||||
<record id="product.product_delivery_02" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.product_order_01" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.product_product_3" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_desks"/>
|
||||
</record>
|
||||
<record id="product.product_product_4_product_template" model="product.template">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_desks"/>
|
||||
</record>
|
||||
<record id="product.product_product_5" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_desks"/>
|
||||
</record>
|
||||
<record id="product.product_product_6" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.product_product_7" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.product_product_8" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_desks"/>
|
||||
</record>
|
||||
<record id="product.product_product_9" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.product_product_10" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.product_product_11" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_chairs"/>
|
||||
</record>
|
||||
<record id="product.product_product_11b" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_chairs"/>
|
||||
</record>
|
||||
<record id="product.product_product_12" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_chairs"/>
|
||||
</record>
|
||||
<record id="product.product_product_13" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_desks"/>
|
||||
</record>
|
||||
<record id="product.product_product_16" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.product_product_20" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.product_product_22" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.product_product_24" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.product_product_25" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.product_product_27" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.consu_delivery_03" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_desks"/>
|
||||
</record>
|
||||
<record id="product.consu_delivery_02" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
<record id="product.consu_delivery_01" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -1,88 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="pos_category_furniture" model="pos.category">
|
||||
<field name="name">Office furniture</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_category_miscellaneous" model="pos.category">
|
||||
<field name="name">Miscellaneous</field>
|
||||
</record>
|
||||
|
||||
<record id="wall_shelf" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">1.98</field>
|
||||
<field name="name">Wall Shelf Unit</field>
|
||||
<field name="default_code">FURN_0009</field>
|
||||
<field name="type">product</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="barcode">2100002000003</field>
|
||||
<field name="taxes_id" eval='[(5,)]'/>
|
||||
<field name="categ_id" ref="product.product_category_1"/>
|
||||
<field name="pos_categ_id" ref="pos_category_furniture"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/wall_shelf_unit.png"/>
|
||||
</record>
|
||||
|
||||
<record id="small_shelf" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">2.83</field>
|
||||
<field name="name">Small Shelf</field>
|
||||
<field name="default_code">FURN_0008</field>
|
||||
<field name="type">product</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="taxes_id" eval='[(5,)]'/>
|
||||
<field name="categ_id" ref="product.product_category_1"/>
|
||||
<field name="pos_categ_id" ref="pos_category_furniture"/>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/small_shelf.png"/>
|
||||
</record>
|
||||
|
||||
<record id="monitor_stand" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">3.19</field>
|
||||
<field name="name">Monitor Stand</field>
|
||||
<field name="default_code">FURN_0006</field>
|
||||
<field name="type">product</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="categ_id" ref="product.product_category_1"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/monitor_stand.png"/>
|
||||
</record>
|
||||
|
||||
<record id="desk_organizer" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">5.10</field>
|
||||
<field name="name">Desk Organizer</field>
|
||||
<field name="default_code">FURN_0001</field>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="barcode">2300001000008</field>
|
||||
<field name="type">product</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="categ_id" ref="product.product_category_1"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/desk_organizer.png"/>
|
||||
</record>
|
||||
|
||||
<record id="whiteboard_pen" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">1.20</field>
|
||||
<field name="name">Whiteboard Pen</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="default_code">CONS_0001</field>
|
||||
<field name="to_weight">True</field>
|
||||
<field name="categ_id" ref="product.product_category_1"/>
|
||||
<field name="pos_categ_id" ref="pos_category_miscellaneous"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="uom_po_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/whiteboard_pen.png"/>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="point_of_sale_tour" model="web_tour.tour">
|
||||
<field name="name">point_of_sale_tour</field>
|
||||
<field name="sequence">45</field>
|
||||
<field name="rainbow_man_message"></field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="pos_note_wait" model="pos.note">
|
||||
<field name="name">Wait</field>
|
||||
<field name="sequence">1</field>
|
||||
</record>
|
||||
<record id="pos_note_serve" model="pos.note">
|
||||
<field name="name">To Serve</field>
|
||||
<field name="sequence">2</field>
|
||||
</record>
|
||||
<record id="pos_note_emergency" model="pos.note">
|
||||
<field name="name">Emergency</field>
|
||||
<field name="sequence">3</field>
|
||||
</record>
|
||||
<record id="pos_note_no_dressing" model="pos.note">
|
||||
<field name="name">No Dressing</field>
|
||||
<field name="sequence">4</field>
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<!-- Bakery scenario pos categories -->
|
||||
<record id="pos_category_breads" model="pos.category">
|
||||
<field name="name">Breads</field>
|
||||
<field name="image_128" type="base64" file="point_of_sale/static/img/breads-icon.png" />
|
||||
<field name="sequence">7</field>
|
||||
</record>
|
||||
<record id="pos_category_pastries" model="pos.category">
|
||||
<field name="name">Pastries</field>
|
||||
<field name="image_128" type="base64" file="point_of_sale/static/img/pastries-icon.png" />
|
||||
<field name="sequence">8</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,202 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<!-- Bakery products -->
|
||||
<record model="product.product" id="product_wholemeal_loaf">
|
||||
<field name="name">Wholemeal loaf</field>
|
||||
<field name="list_price">2.99</field>
|
||||
<field name="standard_price">2.69</field>
|
||||
<field name="description_sale">High fibre loaf. Baked with fine wholemeal flour to give a soft texture.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_wholemeal_loaf.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_breads')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_flour">
|
||||
<field name="name">Flour</field>
|
||||
<field name="list_price">2.99</field>
|
||||
<field name="standard_price">2.69</field>
|
||||
<field name="description_sale">Flour sold by the kilogram.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">1.00</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_flour.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="to_weight" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_breads')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_tiger_white_loaf">
|
||||
<field name="name">Tiger white loaf</field>
|
||||
<field name="list_price">2.75</field>
|
||||
<field name="standard_price">2.48</field>
|
||||
<field name="description_sale">Tiger bloomer. Baked for a soft inside, with its distinctive savoury crackled crust.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_tiger_white_loaf.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_breads')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_butter_croissant">
|
||||
<field name="name">Butter Croissant</field>
|
||||
<field name="list_price">1.20</field>
|
||||
<field name="standard_price">1.08</field>
|
||||
<field name="description_sale">Flaky all butter pastry, layered for a light and golden croissant.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_butter_croissant.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_pastries')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_apple_pie">
|
||||
<field name="name">Apple Pie</field>
|
||||
<field name="list_price">12.00</field>
|
||||
<field name="standard_price">10.8</field>
|
||||
<field name="description_sale">Shortcrust pastry with a Bramley apple filling.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_apple_pie.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_pastries')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_cherry_pie">
|
||||
<field name="name">Cherry Pie</field>
|
||||
<field name="list_price">14.00</field>
|
||||
<field name="standard_price">12.6</field>
|
||||
<field name="description_sale">Shortcrust pastry with a Morello cherry filling.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_cherry_pie.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_pastries')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_sourdough_loaf">
|
||||
<field name="name">Sourdough Loaf</field>
|
||||
<field name="list_price">3.50</field>
|
||||
<field name="standard_price">3.15</field>
|
||||
<field name="description_sale">Artisan sourdough bread with a crisp crust and soft interior.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_sourdough_loaf.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_breads')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_multigrain_bread">
|
||||
<field name="name">Multigrain Bread</field>
|
||||
<field name="list_price">3.25</field>
|
||||
<field name="standard_price">2.93</field>
|
||||
<field name="description_sale">Hearty multigrain loaf with seeds and grains for extra nutrition.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_multigrain_bread.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_breads')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_rye_bread">
|
||||
<field name="name">Rye Bread</field>
|
||||
<field name="list_price">4.00</field>
|
||||
<field name="standard_price">3.60</field>
|
||||
<field name="description_sale">Dense and dark, made with rye flour, perfect for sandwiches.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_rye_bread.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_breads')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_cinnamon_roll">
|
||||
<field name="name">Cinnamon Roll</field>
|
||||
<field name="list_price">1.75</field>
|
||||
<field name="standard_price">1.57</field>
|
||||
<field name="description_sale">Soft dough with a buttery cinnamon filling, topped with cream cheese icing.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_cinnamon_roll.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_pastries')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_pain_au_chocolat">
|
||||
<field name="name">Pain au Chocolat</field>
|
||||
<field name="list_price">1.50</field>
|
||||
<field name="standard_price">1.35</field>
|
||||
<field name="description_sale">Rich buttery pastry with a dark chocolate center.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_pain_au_chocolat.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_pastries')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_blueberry_muffin">
|
||||
<field name="name">Blueberry Muffin</field>
|
||||
<field name="list_price">1.80</field>
|
||||
<field name="standard_price">1.62</field>
|
||||
<field name="description_sale">Moist and fluffy muffins bursting with blueberries.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_blueberry_muffin.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_pastries')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_bagel">
|
||||
<field name="name">Bagel</field>
|
||||
<field name="list_price">1.25</field>
|
||||
<field name="standard_price">1.13</field>
|
||||
<field name="description_sale">Chewy and dense bagel, perfect for sandwiches or with cream cheese.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_pain_au_chocolat.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_breads')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_cheese_croissant">
|
||||
<field name="name">Cheese Croissant</field>
|
||||
<field name="list_price">1.65</field>
|
||||
<field name="standard_price">1.49</field>
|
||||
<field name="description_sale">Flaky croissant filled with creamy cheese, a savory twist on a classic.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_cheese_croissant.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_pastries')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_pecan_pie">
|
||||
<field name="name">Pecan Pie</field>
|
||||
<field name="list_price">15.00</field>
|
||||
<field name="standard_price">13.50</field>
|
||||
<field name="description_sale">Sweet pie filled with pecans, with a rich, buttery filling and flaky saltt.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_pecan_pie.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" eval="ref('point_of_sale.product_category_food', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_pastries')])]" />
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<!-- Product Category -->
|
||||
<record id="product_category_clothes" model="product.category">
|
||||
<field name="name">Clothes</field>
|
||||
</record>
|
||||
|
||||
<!-- Clothes scenario pos categories -->
|
||||
<record id="pos_category_upper" model="pos.category">
|
||||
<field name="name">Upper body</field>
|
||||
<field name="image_128" type="base64" file="point_of_sale/static/img/clothes-icon.png" />
|
||||
<field name="sequence">4</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_category_lower" model="pos.category">
|
||||
<field name="name">Lower body</field>
|
||||
<field name="image_128" type="base64" file="point_of_sale/static/img/lower-body-icon.png" />
|
||||
<field name="sequence">5</field>
|
||||
</record>
|
||||
|
||||
<record id="pos_category_others" model="pos.category">
|
||||
<field name="name">Others</field>
|
||||
<field name="image_128" type="base64" file="point_of_sale/static/img/others-icon.png" />
|
||||
<field name="sequence">6</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,541 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<record id="base.group_user" model="res.groups">
|
||||
<field name="implied_ids" eval="[(4, ref('product.group_product_variant'))]"/>
|
||||
</record>
|
||||
|
||||
<!-- Clothes products -->
|
||||
<record model="product.product" id="casual_t_shirt">
|
||||
<field name="name">Casual T-shirt</field>
|
||||
<field name="list_price">20.00</field>
|
||||
<field name="standard_price">18.0</field>
|
||||
<field name="description_sale">Casual t-shirt 100% cotton. Various colors and sizes available.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_casual_t_shirt.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_upper')])]" />
|
||||
</record>
|
||||
|
||||
<function model="ir.model.data" name="_update_xmlids">
|
||||
<value model="base" eval="[{
|
||||
'xml_id': 'point_of_sale.casual_t_shirt_product_template',
|
||||
'record': obj().env.ref('point_of_sale.casual_t_shirt').product_tmpl_id,
|
||||
'noupdate': True,
|
||||
}]" />
|
||||
</function>
|
||||
|
||||
<record model="product.template.attribute.line" id="product_attribute_line_color">
|
||||
<field name="product_tmpl_id" ref="point_of_sale.casual_t_shirt_product_template"/>
|
||||
<field name="attribute_id" ref="product.pa_color"/>
|
||||
<field
|
||||
name="value_ids"
|
||||
eval="[Command.set([
|
||||
ref('product.pav_color_black'),
|
||||
ref('product.pav_color_white'),
|
||||
ref('product.pav_color_purple'),
|
||||
ref('product.pav_color_green'),
|
||||
])]" />
|
||||
</record>
|
||||
|
||||
<record model="product.template.attribute.line" id="product_attribute_line_size">
|
||||
<field name="product_tmpl_id" ref="point_of_sale.casual_t_shirt_product_template"/>
|
||||
<field name="attribute_id" ref="product.pa_size"/>
|
||||
<field
|
||||
name="value_ids"
|
||||
eval="[Command.set([
|
||||
ref('product.pav_size_s'),
|
||||
ref('product.pav_size_m'),
|
||||
ref('product.pav_size_l'),
|
||||
ref('product.pav_size_xl'),
|
||||
ref('product.pav_size_2xl'),
|
||||
ref('product.pav_size_3xl'),
|
||||
ref('product.pav_size_4xl'),
|
||||
ref('product.pav_size_5xl'),
|
||||
])]" />
|
||||
</record>
|
||||
<function model="ir.model.data" name="_update_xmlids">
|
||||
<value
|
||||
model="base"
|
||||
eval="[{
|
||||
'xml_id': 'point_of_sale.casual_t_shirt_black',
|
||||
'record': obj().env.ref('point_of_sale.product_attribute_line_color').product_template_value_ids[0],
|
||||
'noupdate': True,
|
||||
},
|
||||
{
|
||||
'xml_id': 'point_of_sale.casual_t_shirt_s',
|
||||
'record': obj().env.ref('point_of_sale.product_attribute_line_size').product_template_value_ids[0],
|
||||
'noupdate': True,
|
||||
},
|
||||
]"/>
|
||||
</function>
|
||||
<function model="ir.model.data" name="_update_xmlids">
|
||||
<value model="base"
|
||||
eval="[
|
||||
{
|
||||
'xml_id': 'point_of_sale.product_casual_t_shirt',
|
||||
'record': obj().env.ref('point_of_sale.casual_t_shirt_product_template')._get_variant_for_combination(obj().env.ref('point_of_sale.casual_t_shirt_s') + obj().env.ref('point_of_sale.casual_t_shirt_black')),
|
||||
'noupdate': True,
|
||||
},
|
||||
]"/>
|
||||
</function>
|
||||
|
||||
<record model="product.product" id="t_shirt_slim">
|
||||
<field name="name">T shirt slim</field>
|
||||
<field name="list_price">15.00</field>
|
||||
<field name="standard_price">12.0</field>
|
||||
<field name="description_sale">Casual slim t-shirt 100% cotton. Various sizes available</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_t_shirt_slim.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_upper')])]" />
|
||||
</record>
|
||||
|
||||
<function model="ir.model.data" name="_update_xmlids">
|
||||
<value model="base" eval="[{
|
||||
'xml_id': 'point_of_sale.t_shirt_slim_template',
|
||||
'record': obj().env.ref('point_of_sale.t_shirt_slim').product_tmpl_id,
|
||||
'noupdate': True,
|
||||
}]" />
|
||||
</function>
|
||||
|
||||
<record model="product.template.attribute.line" id="product_attribute_line_size_slim_shirt">
|
||||
<field name="product_tmpl_id" ref="point_of_sale.t_shirt_slim_template"/>
|
||||
<field name="attribute_id" ref="product.pa_size"/>
|
||||
<field
|
||||
name="value_ids"
|
||||
eval="[Command.set([
|
||||
ref('product.pav_size_s'),
|
||||
ref('product.pav_size_m'),
|
||||
ref('product.pav_size_l'),
|
||||
ref('product.pav_size_xl'),
|
||||
ref('product.pav_size_2xl'),
|
||||
ref('product.pav_size_3xl'),
|
||||
ref('product.pav_size_4xl'),
|
||||
ref('product.pav_size_5xl'),
|
||||
])]" />
|
||||
</record>
|
||||
|
||||
<function model="ir.model.data" name="_update_xmlids">
|
||||
<value
|
||||
model="base"
|
||||
eval="[{
|
||||
'xml_id': 'point_of_sale.t_shirt_slim_s',
|
||||
'record': obj().env.ref('point_of_sale.product_attribute_line_size_slim_shirt').product_template_value_ids[0],
|
||||
'noupdate': True,
|
||||
},
|
||||
]"/>
|
||||
</function>
|
||||
<function model="ir.model.data" name="_update_xmlids">
|
||||
<value model="base"
|
||||
eval="[
|
||||
{
|
||||
'xml_id': 'point_of_sale.product_t_shirt_slim',
|
||||
'record': obj().env.ref('point_of_sale.t_shirt_slim_template')._get_variant_for_combination(obj().env.ref('point_of_sale.t_shirt_slim_s')),
|
||||
'noupdate': True,
|
||||
},
|
||||
]"/>
|
||||
</function>
|
||||
|
||||
<record model="product.product" id="t_shirt_black_embroidered">
|
||||
<field name="name">Black embroidered t-shirt</field>
|
||||
<field name="list_price">25.00</field>
|
||||
<field name="standard_price">22.5</field>
|
||||
<field name="description_sale">Casual slim t-shirt 100% cotton with white embroidery. Various sizes available</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_t_shirt_black_embroidered.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_upper')])]" />
|
||||
</record>
|
||||
|
||||
<function model="ir.model.data" name="_update_xmlids">
|
||||
<value model="base" eval="[{
|
||||
'xml_id': 'point_of_sale.t_shirt_black_embroidered_template',
|
||||
'record': obj().env.ref('point_of_sale.t_shirt_black_embroidered').product_tmpl_id,
|
||||
'noupdate': True,
|
||||
}]" />
|
||||
</function>
|
||||
|
||||
<record model="product.template.attribute.line" id="product_attribute_line_size_black_shirt">
|
||||
<field name="product_tmpl_id" ref="point_of_sale.t_shirt_black_embroidered_template"/>
|
||||
<field name="attribute_id" ref="product.pa_size"/>
|
||||
<field
|
||||
name="value_ids"
|
||||
eval="[Command.set([
|
||||
ref('product.pav_size_s'),
|
||||
ref('product.pav_size_m'),
|
||||
ref('product.pav_size_l'),
|
||||
ref('product.pav_size_xl'),
|
||||
ref('product.pav_size_2xl'),
|
||||
ref('product.pav_size_3xl'),
|
||||
ref('product.pav_size_4xl'),
|
||||
ref('product.pav_size_5xl'),
|
||||
])]" />
|
||||
</record>
|
||||
<function model="ir.model.data" name="_update_xmlids">
|
||||
<value
|
||||
model="base"
|
||||
eval="[{
|
||||
'xml_id': 'point_of_sale.t_shirt_black_embroidered_s',
|
||||
'record': obj().env.ref('point_of_sale.product_attribute_line_size_black_shirt').product_template_value_ids[0],
|
||||
'noupdate': True,
|
||||
},
|
||||
]"/>
|
||||
</function>
|
||||
<function model="ir.model.data" name="_update_xmlids">
|
||||
<value model="base"
|
||||
eval="[
|
||||
{
|
||||
'xml_id': 'point_of_sale.product_t_shirt_black_embroidered',
|
||||
'record': obj().env.ref('point_of_sale.t_shirt_black_embroidered_template')._get_variant_for_combination(obj().env.ref('point_of_sale.t_shirt_black_embroidered_s')),
|
||||
'noupdate': True,
|
||||
},
|
||||
]"/>
|
||||
</function>
|
||||
|
||||
<record model="product.template" id="product_template_blue_denim_jeans">
|
||||
<field name="name">Blue Denim Jeans</field>
|
||||
<field name="list_price">80.00</field>
|
||||
<field name="standard_price">72.0</field>
|
||||
<field name="description_sale">5-pocket jeans in cotton denim with a slight stretch for good comfort.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_blue_denim_jeans.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_lower')])]" />
|
||||
<field name="attribute_line_ids" eval="[
|
||||
Command.create({
|
||||
'attribute_id': ref('product.pa_size'),
|
||||
'value_ids': [
|
||||
Command.set([
|
||||
ref('product.pav_size_s'),
|
||||
ref('product.pav_size_m'),
|
||||
ref('product.pav_size_l'),
|
||||
ref('product.pav_size_xl'),
|
||||
ref('product.pav_size_2xl'),
|
||||
ref('product.pav_size_3xl'),
|
||||
ref('product.pav_size_4xl'),
|
||||
ref('product.pav_size_5xl'),
|
||||
])
|
||||
]
|
||||
})
|
||||
]"/>
|
||||
</record>
|
||||
|
||||
<function model="ir.model.data" name="_update_xmlids">
|
||||
<value model="base"
|
||||
eval="[
|
||||
{
|
||||
'xml_id': 'point_of_sale.product_blue_denim_jeans',
|
||||
'record': obj().env.ref('point_of_sale.product_template_blue_denim_jeans').product_variant_ids[0],
|
||||
'noupdate': True,
|
||||
},
|
||||
]"/>
|
||||
</function>
|
||||
|
||||
<record model="product.template" id="product_template_blue_denim_jeans_slim">
|
||||
<field name="name">Light Blue Jeans Slim</field>
|
||||
<field name="list_price">70.00</field>
|
||||
<field name="standard_price">62.0</field>
|
||||
<field name="description_sale">5-pocket jeans in cotton denim..</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_blue_denim_jeans_slim.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_lower')])]" />
|
||||
<field name="attribute_line_ids" eval="[
|
||||
Command.create({
|
||||
'attribute_id': ref('product.pa_size'),
|
||||
'value_ids': [
|
||||
Command.set([
|
||||
ref('product.pav_size_s'),
|
||||
ref('product.pav_size_m'),
|
||||
ref('product.pav_size_l'),
|
||||
ref('product.pav_size_xl'),
|
||||
ref('product.pav_size_2xl'),
|
||||
ref('product.pav_size_3xl'),
|
||||
ref('product.pav_size_4xl'),
|
||||
ref('product.pav_size_5xl'),
|
||||
])
|
||||
]
|
||||
})
|
||||
]"/>
|
||||
</record>
|
||||
|
||||
<function model="ir.model.data" name="_update_xmlids">
|
||||
<value model="base"
|
||||
eval="[
|
||||
{
|
||||
'xml_id': 'point_of_sale.product_blue_denim_jeans_slim',
|
||||
'record': obj().env.ref('point_of_sale.product_template_blue_denim_jeans_slim').product_variant_ids[0],
|
||||
'noupdate': True,
|
||||
},
|
||||
]"/>
|
||||
</function>
|
||||
|
||||
<record model="product.product" id="product_green_hood">
|
||||
<field name="name">Green Hood</field>
|
||||
<field name="list_price">15.00</field>
|
||||
<field name="standard_price">10.0</field>
|
||||
<field name="description_sale">Versatile cotton hoodie with an adjustable drawstring hood and front zipper closure.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_hood.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_others')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_classic_brown_jacket">
|
||||
<field name="name">Classic Brown Jacket</field>
|
||||
<field name="list_price">50.00</field>
|
||||
<field name="standard_price">45.0</field>
|
||||
<field name="description_sale">Lightweight bomber jacket in linen with a ribbed stand-up collar and zip down the front.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_classic_brown_jacket.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_upper')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_crocheted_poncho_unisize">
|
||||
<field name="name">Crocheted Poncho Unisize</field>
|
||||
<field name="list_price">25.00</field>
|
||||
<field name="standard_price">22.5</field>
|
||||
<field name="description_sale">Poncho in a soft, crochet-look knit with a round, gently draped neckline.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_crocheted_poncho_unisize.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_upper')])]" />
|
||||
</record>
|
||||
<record model="product.product" id="product_odoo_sneakers">
|
||||
<field name="name">Odoo Sneakers</field>
|
||||
<field name="list_price">60.40</field>
|
||||
<field name="standard_price">54.36</field>
|
||||
<field name="description_sale">Trainers in cotton canvas with a padded top edge, tongue and lacing at the front.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_odoo_sneakers.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_others')])]" />
|
||||
</record>
|
||||
|
||||
<function model="ir.model.data" name="_update_xmlids">
|
||||
<value model="base" eval="[{
|
||||
'xml_id': 'point_of_sale.product_odoo_sneakers_template',
|
||||
'record': obj().env.ref('point_of_sale.product_odoo_sneakers').product_tmpl_id,
|
||||
'noupdate': True,
|
||||
}]" />
|
||||
</function>
|
||||
|
||||
<record model="product.template.attribute.line" id="product_attribute_line_size_number">
|
||||
<field name="product_tmpl_id" ref="point_of_sale.product_odoo_sneakers_template"/>
|
||||
<field name="attribute_id" ref="product.pa_shoe_size"/>
|
||||
<field
|
||||
name="value_ids"
|
||||
eval="[Command.set([
|
||||
ref('product.pav_shoe_size_39'),
|
||||
ref('product.pav_shoe_size_40'),
|
||||
ref('product.pav_shoe_size_41'),
|
||||
ref('product.pav_shoe_size_42'),
|
||||
ref('product.pav_shoe_size_43'),
|
||||
])]" />
|
||||
</record>
|
||||
|
||||
<record id="jeans_combo" model="product.combo">
|
||||
<field name="name">Jeans Combo</field>
|
||||
<field
|
||||
name="combo_item_ids"
|
||||
eval="[
|
||||
Command.clear(),
|
||||
Command.create({
|
||||
'product_id': ref('point_of_sale.product_blue_denim_jeans_slim'),
|
||||
'extra_price': 0,
|
||||
}),
|
||||
Command.create({
|
||||
'product_id': ref('point_of_sale.product_blue_denim_jeans'),
|
||||
'extra_price': 0,
|
||||
}),
|
||||
]"
|
||||
/>
|
||||
</record>
|
||||
|
||||
<record id="tshirt_combo" model="product.combo">
|
||||
<field name="name">T-shirt Combo</field>
|
||||
<field
|
||||
name="combo_item_ids"
|
||||
eval="[
|
||||
Command.clear(),
|
||||
Command.create({
|
||||
'product_id': ref('point_of_sale.product_casual_t_shirt'),
|
||||
'extra_price': 0,
|
||||
}),
|
||||
Command.create({
|
||||
'product_id': ref('point_of_sale.product_t_shirt_slim'),
|
||||
'extra_price': 0,
|
||||
}),
|
||||
Command.create({
|
||||
'product_id': ref('point_of_sale.product_t_shirt_black_embroidered'),
|
||||
'extra_price': 0,
|
||||
}),
|
||||
]"
|
||||
/>
|
||||
</record>
|
||||
|
||||
<record model="product.product" id="product_t_shirt_pants">
|
||||
<field name="name">T-shirt & Pants Combo</field>
|
||||
<field name="description_sale">Combo</field>
|
||||
<field name="type">combo</field>
|
||||
<field name="purchase_ok">False</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="list_price">80</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/product_t_shirt_pants.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_others')])]" />
|
||||
<field name="combo_ids" eval="[(6, 0, [ref('jeans_combo'), ref('tshirt_combo')])]"/>
|
||||
<field name="taxes_id" eval="[(5,)]"/>
|
||||
<field name="supplier_taxes_id" eval="[(5,)]"/>
|
||||
</record>
|
||||
|
||||
<record model="product.product" id="casual_denim_short">
|
||||
<field name="name">Casual Denim Short</field>
|
||||
<field name="list_price">35.00</field>
|
||||
<field name="standard_price">31.5</field>
|
||||
<field name="description_sale">Casual denim shorts, comfortable and stylish for everyday wear.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/casual_denim_short.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_lower')])]" />
|
||||
</record>
|
||||
|
||||
<record model="product.product" id="classic_leather_belt">
|
||||
<field name="name">Classic Leather Belt</field>
|
||||
<field name="list_price">25.00</field>
|
||||
<field name="standard_price">22.50</field>
|
||||
<field name="description_sale">Classic leather belt, a must-have accessory for any wardrobe.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/classic_leather_belt.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_others')])]" />
|
||||
</record>
|
||||
|
||||
<record model="product.product" id="cozy_sweater">
|
||||
<field name="name">Cozy Sweater</field>
|
||||
<field name="list_price">50.00</field>
|
||||
<field name="standard_price">45.0</field>
|
||||
<field name="description_sale">Cozy sweater, perfect for colder weather. Available in various colors.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/cozy_sweater.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_upper')])]" />
|
||||
</record>
|
||||
|
||||
<record model="product.product" id="leather_jacket">
|
||||
<field name="name">Leather Jacket</field>
|
||||
<field name="list_price">120.00</field>
|
||||
<field name="standard_price">108.0</field>
|
||||
<field name="description_sale">Stylish leather jacket, durable and fashionable for all occasions.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/leather_jacket.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_upper')])]" />
|
||||
</record>
|
||||
|
||||
<record model="product.product" id="summer_hat">
|
||||
<field name="name">Summer Hat</field>
|
||||
<field name="list_price">20.00</field>
|
||||
<field name="standard_price">18.0</field>
|
||||
<field name="description_sale">Summer hat, ideal for beach days and sunny weather.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/summer_hat.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_others')])]" />
|
||||
</record>
|
||||
|
||||
<record model="product.product" id="jean_jacket">
|
||||
<field name="name">Jean Jacket</field>
|
||||
<field name="list_price">65.00</field>
|
||||
<field name="standard_price">58.5</field>
|
||||
<field name="description_sale">Vintage jean jacket, a timeless piece for any casual outfit.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/jean_jacket.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_upper')])]" />
|
||||
</record>
|
||||
|
||||
<record model="product.product" id="sport_shoes">
|
||||
<field name="name">Sport Shoes</field>
|
||||
<field name="list_price">80.00</field>
|
||||
<field name="standard_price">72.0</field>
|
||||
<field name="description_sale">Athletic sport shoes, designed for comfort and performance.</field>
|
||||
<field name="type">consu</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="uom_id" ref="uom.product_uom_unit"/>
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/sport_shoes.png"/>
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="categ_id" ref="product_category_clothes"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_others')])]" />
|
||||
</record>
|
||||
|
||||
<function model="ir.model.data" name="_update_xmlids">
|
||||
<value model="base" eval="[{
|
||||
'xml_id': 'point_of_sale.sport_shoes_template',
|
||||
'record': obj().env.ref('point_of_sale.sport_shoes').product_tmpl_id,
|
||||
'noupdate': True,
|
||||
}]" />
|
||||
</function>
|
||||
|
||||
<record model="product.template.attribute.line" id="product_attribute_line_sport_shoes">
|
||||
<field name="product_tmpl_id" ref="point_of_sale.sport_shoes_template"/>
|
||||
<field name="attribute_id" ref="product.pa_shoe_size"/>
|
||||
<field
|
||||
name="value_ids"
|
||||
eval="[Command.set([
|
||||
ref('product.pav_shoe_size_39'),
|
||||
ref('product.pav_shoe_size_40'),
|
||||
ref('product.pav_shoe_size_41'),
|
||||
ref('product.pav_shoe_size_42'),
|
||||
ref('product.pav_shoe_size_43'),
|
||||
])]" />
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<!-- Furniture scenario pos categories -->
|
||||
<record id="pos_category_miscellaneous" model="pos.category">
|
||||
<field name="name">Misc</field>
|
||||
<field name="image_128" type="base64" file="point_of_sale/static/img/misc_category.png" />
|
||||
<field name="sequence">1</field>
|
||||
</record>
|
||||
<record id="pos_category_desks" model="pos.category">
|
||||
<field name="name">Desks</field>
|
||||
<field name="image_128" type="base64" file="point_of_sale/static/img/desk_category.png" />
|
||||
<field name="sequence">2</field>
|
||||
</record>
|
||||
<record id="pos_category_chairs" model="pos.category">
|
||||
<field name="name">Chairs</field>
|
||||
<field name="image_128" type="base64" file="point_of_sale/static/img/chair_category.png" />
|
||||
<field name="sequence">3</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,240 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<!-- Products -->
|
||||
|
||||
<!-- Old -->
|
||||
|
||||
<record id="wall_shelf" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">1.98</field>
|
||||
<field name="name">Wall Shelf Unit</field>
|
||||
<field name="default_code">FURN_0009</field>
|
||||
<field name="is_storable" eval="True"/>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="barcode">2100002000003</field>
|
||||
<field name="taxes_id" eval="[(5,)]" />
|
||||
<field name="categ_id" eval="ref('product.product_category_goods', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/wall_shelf_unit.png" />
|
||||
</record>
|
||||
<record id="small_shelf" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">2.83</field>
|
||||
<field name="name">Small Shelf</field>
|
||||
<field name="default_code">FURN_0008</field>
|
||||
<field name="is_storable" eval="True"/>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="taxes_id" eval="[(5,)]" />
|
||||
<field name="categ_id" eval="ref('product.product_category_goods', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/small_shelf.png" />
|
||||
</record>
|
||||
|
||||
<record id="letter_tray" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">4.80</field>
|
||||
<field name="name">Letter Tray</field>
|
||||
<field name="default_code">FURN_0004</field>
|
||||
<field name="is_storable" eval="True"/>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="categ_id" eval="ref('product.product_category_goods', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/letter_tray.png" />
|
||||
</record>
|
||||
|
||||
<record id="magnetic_board" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">1.98</field>
|
||||
<field name="name">Magnetic Board</field>
|
||||
<field name="default_code">FURN_0005</field>
|
||||
<field name="is_storable" eval="True"/>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="barcode">2301000000006</field>
|
||||
<field name="categ_id" eval="ref('product.product_category_goods', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/magnetic_board.png" />
|
||||
</record>
|
||||
|
||||
<record id="whiteboard" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">1.70</field>
|
||||
<field name="name">Whiteboard</field>
|
||||
<field name="is_storable" eval="True"/>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="categ_id" eval="ref('product.product_category_goods', raise_if_not_found=False)"/>
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/whiteboard.png" />
|
||||
</record>
|
||||
|
||||
<record id="led_lamp" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">0.90</field>
|
||||
<field name="name">LED Lamp</field>
|
||||
<field name="default_code">FURN_0003</field>
|
||||
<field name="is_storable" eval="True"/>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="categ_id" eval="ref('product.product_category_goods', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/led_lamp.png" />
|
||||
</record>
|
||||
|
||||
<record id="newspaper_rack" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">1.28</field>
|
||||
<field name="name">Newspaper Rack</field>
|
||||
<field name="default_code">FURN_0007</field>
|
||||
<field name="is_storable" eval="True"/>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="barcode">2100001000004</field>
|
||||
<field name="categ_id" eval="ref('product.product_category_goods', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/newspaper_stand.png" />
|
||||
</record>
|
||||
|
||||
<record id="whiteboard_pen" model="product.product">
|
||||
<field name="available_in_pos">True</field>
|
||||
<field name="list_price">1.20</field>
|
||||
<field name="name">Whiteboard Pen</field>
|
||||
<field name="weight">0.01</field>
|
||||
<field name="default_code">CONS_0001</field>
|
||||
<field name="categ_id" eval="ref('product.product_category_goods', raise_if_not_found=False)"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
<field name="image_1920" type="base64" file="point_of_sale/static/img/whiteboard_pen.png" />
|
||||
</record>
|
||||
|
||||
<record id="product.product_product_1" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_2" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.product_delivery_01" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_chairs')])]" />
|
||||
</record>
|
||||
<record id="product.product_delivery_02" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.product_order_01" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_3" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_desks')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_4_product_template" model="product.template">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_desks')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_5" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_desks')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_6" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_7" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_8" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_desks')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_9" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_10" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_11" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_chairs')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_11b" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_chairs')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_12" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_chairs')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_13" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_desks')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_16" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_20" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_22" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_24" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_25" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.product_product_27" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.consu_delivery_03" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_desks')])]" />
|
||||
</record>
|
||||
<record id="product.consu_delivery_02" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.consu_delivery_01" model="product.product">
|
||||
<field name="available_in_pos" eval="True" />
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]" />
|
||||
</record>
|
||||
<record id="product.desk_organizer" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]"/>
|
||||
</record>
|
||||
<record id="product.desk_pad" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]"/>
|
||||
</record>
|
||||
<record id="product.monitor_stand" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field name="pos_categ_ids" eval="[(6, 0, [ref('pos_category_miscellaneous')])]"/>
|
||||
</record>
|
||||
<record id="product.office_combo" model="product.product">
|
||||
<field name="available_in_pos" eval="True"/>
|
||||
<field
|
||||
name="pos_categ_ids"
|
||||
eval="[(6, 0, [ref('pos_category_miscellaneous'), ref('pos_category_desks')])]"
|
||||
/>
|
||||
<field name="taxes_id" eval="[(5,)]"/>
|
||||
<field name="supplier_taxes_id" eval="[(5,)]"/>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
11385
odoo-bringout-oca-ocb-point_of_sale/point_of_sale/i18n/es_419.po
Normal file
11385
odoo-bringout-oca-ocb-point_of_sale/point_of_sale/i18n/es_419.po
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -1,218 +0,0 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * point_of_sale
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo 9.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-08-18 14:06+0000\n"
|
||||
"PO-Revision-Date: 2016-05-31 19:03+0000\n"
|
||||
"Last-Translator: Martin Trigaux\n"
|
||||
"Language-Team: Spanish (Bolivia) (http://www.transifex.com/odoo/odoo-9/"
|
||||
"language/es_BO/)\n"
|
||||
"Language: es_BO\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"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_report_pos_order__average_price
|
||||
msgid "Average Price"
|
||||
msgstr "Precio promedio"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
#: code:addons/point_of_sale/static/src/xml/pos.xml:0
|
||||
#, python-format
|
||||
msgid "Change"
|
||||
msgstr "Cambiar"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_closing_balance_confirm_wizard__create_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_category__create_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_config__create_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_details_wizard__create_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_make_payment__create_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_order__create_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_order_line__create_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_pack_operation_lot__create_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_payment__create_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_payment_method__create_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_session__create_date
|
||||
msgid "Created on"
|
||||
msgstr "Creado en"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_config__currency_id
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_order__currency_id
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_order_line__currency_id
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_payment__currency_id
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_session__currency_id
|
||||
msgid "Currency"
|
||||
msgstr "Divisa"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields.selection,name:point_of_sale.selection__pos_session__state__opened
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_session_search
|
||||
msgid "In Progress"
|
||||
msgstr "En proceso"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_closing_balance_confirm_wizard__write_uid
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_category__write_uid
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_config__write_uid
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_details_wizard__write_uid
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_make_payment__write_uid
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_order__write_uid
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_order_line__write_uid
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_pack_operation_lot__write_uid
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_payment__write_uid
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_payment_method__write_uid
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_session__write_uid
|
||||
msgid "Last Updated by"
|
||||
msgstr "Última actualización de"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_closing_balance_confirm_wizard__write_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_category__write_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_config__write_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_details_wizard__write_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_make_payment__write_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_order__write_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_order_line__write_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_pack_operation_lot__write_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_payment__write_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_payment_method__write_date
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_session__write_date
|
||||
msgid "Last Updated on"
|
||||
msgstr "Última actualización en"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_report_pos_order__date
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_order_filter
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_report_pos_order_search
|
||||
msgid "Order Date"
|
||||
msgstr "Fecha orden"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.actions.act_window,name:point_of_sale.action_pos_config_kanban
|
||||
#: model:ir.actions.act_window,name:point_of_sale.action_pos_config_pos
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_config__name
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_order__config_id
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_session__config_id
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_report_pos_order__config_id
|
||||
#: model:ir.ui.menu,name:point_of_sale.menu_point_root
|
||||
#: model:ir.ui.menu,name:point_of_sale.menu_pos_config_pos
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.digest_digest_view_form
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.product_template_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.res_config_settings_view_form
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_account_journal_pos_user_form
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_session_search
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_report_pos_order_search
|
||||
msgid "Point of Sale"
|
||||
msgstr "Punto de Venta"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model,name:point_of_sale.model_pos_category
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_product_product__pos_categ_id
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_product_template__pos_categ_id
|
||||
msgid "Point of Sale Category"
|
||||
msgstr "Categoría del PdV"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_config_search
|
||||
msgid "Point of Sale Config"
|
||||
msgstr "Configuración del PdV"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model,name:point_of_sale.model_pos_config
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_make_payment__config_id
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.pos_config_view_form
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_config_tree
|
||||
msgid "Point of Sale Configuration"
|
||||
msgstr "Configuración del PdV"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model,name:point_of_sale.model_pos_order
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_order_search
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_pos_form
|
||||
msgid "Point of Sale Orders"
|
||||
msgstr "Órdenes PdV"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model,name:point_of_sale.model_pos_session
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_session_form
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_session_search
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_session_tree
|
||||
msgid "Point of Sale Session"
|
||||
msgstr "Sesión PdV"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields.selection,name:point_of_sale.selection__pos_order__state__done
|
||||
#: model:ir.model.fields.selection,name:point_of_sale.selection__report_pos_order__state__done
|
||||
#: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_order_filter
|
||||
msgid "Posted"
|
||||
msgstr "Asentado"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_report_pos_order__product_qty
|
||||
msgid "Product Quantity"
|
||||
msgstr "Cantidad del producto"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
#: code:addons/point_of_sale/static/src/xml/pos.xml:0
|
||||
#, python-format
|
||||
msgid "Tax ID"
|
||||
msgstr "NIT"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,help:point_of_sale.field_pos_order__config_id
|
||||
#: model:ir.model.fields,help:point_of_sale.field_pos_session__config_id
|
||||
msgid "The physical point of sale you will use."
|
||||
msgstr "El PdV físico que utilizará."
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,field_description:point_of_sale.field_pos_order_line__price_unit
|
||||
msgid "Unit Price"
|
||||
msgstr "Precio unidad"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
#: code:addons/point_of_sale/static/src/xml/pos.xml:0
|
||||
#, python-format
|
||||
msgid "VAT:"
|
||||
msgstr "CIF/NIT:"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/wizard/pos_open_statement.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You have to define which payment method must be available in the point of "
|
||||
"sale by reusing existing bank and cash through \"Accounting / "
|
||||
"Configuration / Journals / Journals\". Select a journal and check the field "
|
||||
"\"PoS Payment Method\" from the \"Point of Sale\" tab. You can also create "
|
||||
"new payment methods directly from menu \"PoS Backend / Configuration / "
|
||||
"Payment Methods\"."
|
||||
msgstr ""
|
||||
"Puede definir qué método de pago estará disponible en el PdV reusando los "
|
||||
"bancos y cajas existentes a través de \"Contabilidad / Configuración / "
|
||||
"Diarios / Diarios\". Seleccione un diario y marque la casilla \"Método de "
|
||||
"pago de PdV\" desde la pestaña PdV. Puede crear también métodos de pago "
|
||||
"directamente desde el menú \"Backend PdV / Configuración / Métodos de pago\"."
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/models/pos_session.py:0
|
||||
#, python-format
|
||||
msgid "You should assign a Point of Sale to your session."
|
||||
msgstr "Debe asignar un PdV a su sesión."
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
#: code:addons/point_of_sale/static/src/xml/pos.xml:0
|
||||
#, python-format
|
||||
msgid "ZIP"
|
||||
msgstr "Casilla"
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
10579
odoo-bringout-oca-ocb-point_of_sale/point_of_sale/i18n/ku.po
Normal file
10579
odoo-bringout-oca-ocb-point_of_sale/point_of_sale/i18n/ku.po
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
10586
odoo-bringout-oca-ocb-point_of_sale/point_of_sale/i18n/my.po
Normal file
10586
odoo-bringout-oca-ocb-point_of_sale/point_of_sale/i18n/my.po
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
12738
odoo-bringout-oca-ocb-point_of_sale/point_of_sale/i18n/uz.po
Normal file
12738
odoo-bringout-oca-ocb-point_of_sale/point_of_sale/i18n/uz.po
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1,26 +1,53 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import account_bank_statement
|
||||
from . import pos_load_mixin
|
||||
from . import account_account
|
||||
from . import account_cash_rounding
|
||||
from . import account_payment
|
||||
from . import account_journal
|
||||
from . import account_tax
|
||||
from . import account_tax_group
|
||||
from . import account_move
|
||||
from . import pos_bus_mixin
|
||||
from . import barcode_rule
|
||||
from . import chart_template
|
||||
from . import binary
|
||||
from . import digest
|
||||
from . import pos_category
|
||||
from . import pos_config
|
||||
from . import pos_order
|
||||
from . import pos_session
|
||||
from . import product
|
||||
from . import product_pricelist
|
||||
from . import product_attribute
|
||||
from . import product_category
|
||||
from . import product_product
|
||||
from . import product_template
|
||||
from . import uom
|
||||
from . import product_combo
|
||||
from . import product_combo_item
|
||||
from . import res_partner
|
||||
from . import res_company
|
||||
from . import res_config_settings
|
||||
from . import ir_http
|
||||
from . import ir_module_module
|
||||
from . import stock_picking
|
||||
from . import stock_rule
|
||||
from . import stock_reference
|
||||
from . import stock_warehouse
|
||||
from . import pos_payment
|
||||
from . import pos_payment_method
|
||||
from . import pos_bill
|
||||
from . import report_sale_details
|
||||
from . import pos_printer
|
||||
from . import pos_note
|
||||
from . import res_users
|
||||
from . import decimal_precision
|
||||
from . import res_country
|
||||
from . import res_country_state
|
||||
from . import res_lang
|
||||
from . import account_fiscal_position
|
||||
from . import res_currency
|
||||
from . import pos_preset
|
||||
from . import product_tag
|
||||
from . import resource_calendar_attendance
|
||||
from . import product_uom
|
||||
from . import ir_sequence
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue