Начальное наполнение
4
__init__.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||||
|
|
||||||
|
from . import models
|
46
__manifest__.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
'name': 'Restaurant',
|
||||||
|
'version': '1.0',
|
||||||
|
'category': 'Sales/Point of Sale',
|
||||||
|
'sequence': 6,
|
||||||
|
'summary': 'Restaurant extensions for the Point of Sale ',
|
||||||
|
'description': """
|
||||||
|
|
||||||
|
This module adds several features to the Point of Sale that are specific to restaurant management:
|
||||||
|
- Bill Printing: Allows you to print a receipt before the order is paid
|
||||||
|
- Bill Splitting: Allows you to split an order into different orders
|
||||||
|
- Kitchen Order Printing: allows you to print orders updates to kitchen or bar printers
|
||||||
|
|
||||||
|
""",
|
||||||
|
'depends': ['point_of_sale'],
|
||||||
|
'website': 'https://www.odoo.com/app/point-of-sale-restaurant',
|
||||||
|
'data': [
|
||||||
|
'security/ir.model.access.csv',
|
||||||
|
'views/pos_order_views.xml',
|
||||||
|
'views/pos_restaurant_views.xml',
|
||||||
|
'views/res_config_settings_views.xml',
|
||||||
|
'data/pos_restaurant_data.xml',
|
||||||
|
],
|
||||||
|
'demo': [
|
||||||
|
'data/pos_restaurant_demo.xml',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
'application': True,
|
||||||
|
'assets': {
|
||||||
|
'point_of_sale._assets_pos': [
|
||||||
|
'pos_restaurant/static/src/**/*',
|
||||||
|
('after', 'point_of_sale/static/src/scss/pos.scss', 'pos_restaurant/static/src/scss/restaurant.scss'),
|
||||||
|
],
|
||||||
|
'web.assets_backend': [
|
||||||
|
'point_of_sale/static/src/scss/pos_dashboard.scss',
|
||||||
|
],
|
||||||
|
'web.assets_tests': [
|
||||||
|
'pos_restaurant/static/tests/tours/**/*',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'license': 'LGPL-3',
|
||||||
|
}
|
19
data/pos_restaurant_data.xml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data noupdate="1">
|
||||||
|
<record id="pos_config_main_restaurant" model="pos.config">
|
||||||
|
<field name="name">Restaurant</field>
|
||||||
|
<field name="module_pos_restaurant">True</field>
|
||||||
|
<field name="iface_splitbill">True</field>
|
||||||
|
<field name="iface_printbill">False</field>
|
||||||
|
<field name="iface_orderline_notes">True</field>
|
||||||
|
<field name="iface_tipproduct">False</field>
|
||||||
|
<field name="start_category">False</field>
|
||||||
|
<field name="limit_categories">False</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<function model="pos.config" name="_setup_main_restaurant_defaults">
|
||||||
|
<value eval="[ref('pos_config_main_restaurant')]"/>
|
||||||
|
</function>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
930
data/pos_restaurant_demo.xml
Normal file
@ -0,0 +1,930 @@
|
|||||||
|
<odoo>
|
||||||
|
<data noupdate="1">
|
||||||
|
<record id="drinks" model="pos.category">
|
||||||
|
<field name="name">Drinks</field>
|
||||||
|
<field name="image_128" type="base64" file="pos_restaurant/static/img/drink_category.png" />
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product_category_pos_food" model="product.category">
|
||||||
|
<field name="parent_id" ref="point_of_sale.product_category_pos"/>
|
||||||
|
<field name="name">Food</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="food" model="pos.category">
|
||||||
|
<field name="name">Food</field>
|
||||||
|
<field name="image_128" type="base64" file="pos_restaurant/static/img/food_category.png" />
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Food -->
|
||||||
|
<record id="pos_food_margherita" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">7.0</field>
|
||||||
|
<field name="name">Margherita</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-pizza-ma.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_funghi" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">7.0</field>
|
||||||
|
<field name="name">Funghi</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-pizza-fu.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_vege" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">7.0</field>
|
||||||
|
<field name="name">Vegetarian</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-pizza-ve.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_bolo" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">4.5</field>
|
||||||
|
<field name="name">Pasta Bolognese</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-pasta.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_4formaggi" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">5.5</field>
|
||||||
|
<field name="name">Pasta 4 formaggi </field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-pasta-4f.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_bacon" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">7.5</field>
|
||||||
|
<field name="name">Bacon Burger</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-burger.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_cheeseburger" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">7.0</field>
|
||||||
|
<field name="name">Cheese Burger</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-cheeseburger.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_chicken" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">3.0</field>
|
||||||
|
<field name="name">Chicken Curry Sandwich</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-sandwich.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_tuna" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">3.0</field>
|
||||||
|
<field name="name">Spicy Tuna Sandwich</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-tuna.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_mozza" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">3.9</field>
|
||||||
|
<field name="name">Mozzarella Sandwich</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-mozza.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_club" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">3.4</field>
|
||||||
|
<field name="name">Club Sandwich</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-club.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_maki" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">12.0</field>
|
||||||
|
<field name="name">Lunch Maki 18pc</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-maki.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_salmon" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">13.80</field>
|
||||||
|
<field name="name">Lunch Salmon 20pc</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-salmon.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_temaki" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">14.0</field>
|
||||||
|
<field name="name">Lunch Temaki mix 3pc</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-temaki.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_chirashi" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">9.25</field>
|
||||||
|
<field name="name">Salmon and Avocado</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-salmon-avocado.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Drinks -->
|
||||||
|
<record id="coke" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">2.20</field>
|
||||||
|
<field name="name">Coca-Cola</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="categ_id" ref="point_of_sale.product_category_pos"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-coke.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="water" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">2.20</field>
|
||||||
|
<field name="name">Water</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="categ_id" ref="point_of_sale.product_category_pos"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-water.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="minute_maid" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">2.20</field>
|
||||||
|
<field name="name">Minute Maid</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="categ_id" ref="point_of_sale.product_category_pos"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-minute_maid.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="espresso" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">4.70</field>
|
||||||
|
<field name="name">Espresso</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-espresso.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="green_tea" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">4.70</field>
|
||||||
|
<field name="name">Green Tea</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-green_tea.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="milkshake_banana" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">3.60</field>
|
||||||
|
<field name="name">Milkshake Banana</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-milkshake_banana.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="ice_tea" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">2.20</field>
|
||||||
|
<field name="name">Ice Tea</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-ice_tea.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="schweppes" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">2.20</field>
|
||||||
|
<field name="name">Schweppes</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-schweppes.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="fanta" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">2.20</field>
|
||||||
|
<field name="name">Fanta</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-fanta.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Combo -->
|
||||||
|
<record id="cheeseburger_combo_line" model="pos.combo.line">
|
||||||
|
<field name="product_id" ref="pos_food_cheeseburger"/>
|
||||||
|
<field name="combo_price">0</field>
|
||||||
|
</record>
|
||||||
|
<record id="bacon_burger_combo_line" model="pos.combo.line">
|
||||||
|
<field name="product_id" ref="pos_food_bacon"/>
|
||||||
|
<field name="combo_price">0</field>
|
||||||
|
</record>
|
||||||
|
<record id="burger_combo" model="pos.combo">
|
||||||
|
<field name="name">Burgers Choice</field>
|
||||||
|
<field name="combo_line_ids" eval="[(6, 0, [ref('cheeseburger_combo_line'), ref('bacon_burger_combo_line')])]"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="coke_combo_line" model="pos.combo.line">
|
||||||
|
<field name="product_id" ref="coke"/>
|
||||||
|
<field name="combo_price">0</field>
|
||||||
|
</record>
|
||||||
|
<record id="water_combo_line" model="pos.combo.line">
|
||||||
|
<field name="product_id" ref="water"/>
|
||||||
|
<field name="combo_price">0</field>
|
||||||
|
</record>
|
||||||
|
<record id="maid_combo_line" model="pos.combo.line">
|
||||||
|
<field name="product_id" ref="minute_maid"/>
|
||||||
|
<field name="combo_price">0</field>
|
||||||
|
</record>
|
||||||
|
<record id="milkshake_combo_line" model="pos.combo.line">
|
||||||
|
<field name="product_id" ref="milkshake_banana"/>
|
||||||
|
<field name="combo_price">2</field>
|
||||||
|
</record>
|
||||||
|
<record id="drink_combo" model="pos.combo">
|
||||||
|
<field name="name">Drinks choice</field>
|
||||||
|
<field name="combo_line_ids" eval="[(6, 0, [ref('coke_combo_line'), ref('water_combo_line'), ref('maid_combo_line'), ref('milkshake_combo_line')])]"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="burger_drink_combo" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">10</field>
|
||||||
|
<field name="name">Burger Menu Combo</field>
|
||||||
|
<field name="type">combo</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="pos_restaurant/static/img/combo-hamb.jpg"/>
|
||||||
|
<field name="combo_ids" eval="[(6, 0, [ref('drink_combo'), ref('burger_combo')])]"/>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="taxes_id" eval="[(5,)]"/> <!-- no taxes -->
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<function model="restaurant.floor" name="unlink">
|
||||||
|
<value model="restaurant.floor" eval="obj().search([
|
||||||
|
('pos_config_ids', 'in', ref('pos_config_main_restaurant')),
|
||||||
|
]).id"/>
|
||||||
|
</function>
|
||||||
|
|
||||||
|
<!-- Pos Config -->
|
||||||
|
<record model="pos.config" id="pos_config_main_restaurant">
|
||||||
|
<field name="iface_printbill">True</field>
|
||||||
|
<field name="limit_categories">True</field>
|
||||||
|
<field name="iface_available_categ_ids"
|
||||||
|
eval="[(6, 0, [ref('drinks'), ref('food')])]" />
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Closed Sessions -->
|
||||||
|
<!-- forcecreate is set to false in order to not create record when updating the db -->
|
||||||
|
|
||||||
|
<function model="ir.model.data" name="_update_xmlids">
|
||||||
|
<value model="base" eval="[{
|
||||||
|
'xml_id': 'pos_restaurant.payment_method',
|
||||||
|
'record': obj().env.ref('pos_restaurant.pos_config_main_restaurant')._get_payment_method('bank'),
|
||||||
|
'noupdate': True,
|
||||||
|
}]" />
|
||||||
|
</function>
|
||||||
|
|
||||||
|
<!-- Closed Session 3 -->
|
||||||
|
|
||||||
|
<record id="pos_closed_session_3" model="pos.session" forcecreate="False">
|
||||||
|
<field name="config_id" ref="pos_config_main_restaurant" />
|
||||||
|
<field name="user_id" ref="base.user_admin" />
|
||||||
|
<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_3_1" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_closed_session_3" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">ClosedDemo/0005</field>
|
||||||
|
<field name="state">paid</field>
|
||||||
|
<field name="amount_total">14.0</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">14.0</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00000-003-1001</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_orderline_3_1_1" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Closed Orderline 3.1.1</field>
|
||||||
|
<field name="product_id" ref="pos_food_margherita" />
|
||||||
|
<field name="price_subtotal">7.0</field>
|
||||||
|
<field name="price_subtotal_incl">7.0</field>
|
||||||
|
<field name="price_unit">7.0</field>
|
||||||
|
<field name="order_id" ref="pos_closed_order_3_1" />
|
||||||
|
<field name="full_product_name">Margherita</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_orderline_3_1_2" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Closed Orderline 3.1.2</field>
|
||||||
|
<field name="product_id" ref="pos_food_funghi" />
|
||||||
|
<field name="price_subtotal">7.0</field>
|
||||||
|
<field name="price_subtotal_incl">7.0</field>
|
||||||
|
<field name="price_unit">7.0</field>
|
||||||
|
<field name="order_id" ref="pos_closed_order_3_1" />
|
||||||
|
<field name="full_product_name">Funghi</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_payment_1" model="pos.payment" forcecreate="False">
|
||||||
|
<field name="payment_method_id" ref="pos_restaurant.payment_method" />
|
||||||
|
<field name="pos_order_id" ref="pos_closed_order_3_1" />
|
||||||
|
<field name="amount">14.0</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_order_3_2" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_closed_session_3" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">ClosedDemo/0006</field>
|
||||||
|
<field name="state">paid</field>
|
||||||
|
<field name="amount_total">7.0</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">7.0</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00000-003-1002</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_orderline_3_2_1" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Closed Orderline 3.2.1</field>
|
||||||
|
<field name="product_id" ref="pos_food_vege" />
|
||||||
|
<field name="price_subtotal">7.0</field>
|
||||||
|
<field name="price_subtotal_incl">7.0</field>
|
||||||
|
<field name="price_unit">7.0</field>
|
||||||
|
<field name="order_id" ref="pos_closed_order_3_2" />
|
||||||
|
<field name="full_product_name">Vegetarian</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_payment_2" model="pos.payment" forcecreate="False">
|
||||||
|
<field name="payment_method_id" ref="pos_restaurant.payment_method" />
|
||||||
|
<field name="pos_order_id" ref="pos_closed_order_3_2" />
|
||||||
|
<field name="amount">7.0</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<function model="pos.session" name="action_pos_session_closing_control"
|
||||||
|
eval="[[ref('pos_closed_session_3')]]" />
|
||||||
|
|
||||||
|
<!-- Closed Session 4 -->
|
||||||
|
|
||||||
|
<record id="pos_closed_session_4" model="pos.session" forcecreate="False">
|
||||||
|
<field name="config_id" ref="pos_config_main_restaurant" />
|
||||||
|
<field name="user_id" ref="base.user_admin" />
|
||||||
|
<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_4_1" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_closed_session_4" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">ClosedDemo/0007</field>
|
||||||
|
<field name="state">paid</field>
|
||||||
|
<field name="amount_total">6.7</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">6.7</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00000-004-1001</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_orderline_4_1_1" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Closed Orderline 4.1.1</field>
|
||||||
|
<field name="product_id" ref="water" />
|
||||||
|
<field name="price_subtotal">2.20</field>
|
||||||
|
<field name="price_subtotal_incl">2.20</field>
|
||||||
|
<field name="price_unit">2.20</field>
|
||||||
|
<field name="order_id" ref="pos_closed_order_4_1" />
|
||||||
|
<field name="full_product_name">Water</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_orderline_4_1_2" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Closed Orderline 4.1.2</field>
|
||||||
|
<field name="product_id" ref="pos_food_bolo" />
|
||||||
|
<field name="price_subtotal">4.5</field>
|
||||||
|
<field name="price_subtotal_incl">4.5</field>
|
||||||
|
<field name="price_unit">4.5</field>
|
||||||
|
<field name="order_id" ref="pos_closed_order_4_1" />
|
||||||
|
<field name="full_product_name">Pasta Bolognese</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_payment_3" model="pos.payment" forcecreate="False">
|
||||||
|
<field name="payment_method_id" ref="pos_restaurant.payment_method" />
|
||||||
|
<field name="pos_order_id" ref="pos_closed_order_4_1" />
|
||||||
|
<field name="amount">6.7</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_order_4_2" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_closed_session_4" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">ClosedDemo/0008</field>
|
||||||
|
<field name="state">paid</field>
|
||||||
|
<field name="amount_total">28.0</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">28.0</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00000-004-1002</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_orderline_4_2_1" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Closed Orderline 4.2.1</field>
|
||||||
|
<field name="product_id" ref="pos_food_cheeseburger" />
|
||||||
|
<field name="price_subtotal">28.0</field>
|
||||||
|
<field name="price_subtotal_incl">28.0</field>
|
||||||
|
<field name="price_unit">7.0</field>
|
||||||
|
<field name="qty">4</field>
|
||||||
|
<field name="order_id" ref="pos_closed_order_4_2" />
|
||||||
|
<field name="full_product_name">Cheese Burger</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_payment_4" model="pos.payment" forcecreate="False">
|
||||||
|
<field name="payment_method_id" ref="pos_restaurant.payment_method" />
|
||||||
|
<field name="pos_order_id" ref="pos_closed_order_4_2" />
|
||||||
|
<field name="amount">28.0</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<function model="pos.session" name="action_pos_session_closing_control"
|
||||||
|
eval="[[ref('pos_closed_session_4')]]" />
|
||||||
|
|
||||||
|
<!-- Floors: Main Floor -->
|
||||||
|
<record id="floor_main" model="restaurant.floor">
|
||||||
|
<field name="name">Main Floor</field>
|
||||||
|
<field name="background_color">rgb(249,250,251)</field>
|
||||||
|
<field name="pos_config_ids" eval="[(6, 0, [ref('pos_restaurant.pos_config_main_restaurant')])]" />
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_01" model="restaurant.table">
|
||||||
|
<field name="name">1</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">50</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_02" model="restaurant.table">
|
||||||
|
<field name="name">2</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">212</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_03" model="restaurant.table">
|
||||||
|
<field name="name">3</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">374</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_04" model="restaurant.table">
|
||||||
|
<field name="name">4</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">536</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_05" model="restaurant.table">
|
||||||
|
<field name="name">5</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">698</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_06" model="restaurant.table">
|
||||||
|
<field name="name">6</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">860</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_07" model="restaurant.table">
|
||||||
|
<field name="name">7</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,109,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">50</field>
|
||||||
|
<field name="position_v">280</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_08" model="restaurant.table">
|
||||||
|
<field name="name">8</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,109,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">212</field>
|
||||||
|
<field name="position_v">280</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_09" model="restaurant.table">
|
||||||
|
<field name="name">9</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">6</field>
|
||||||
|
<field name="color">rgb(235,109,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">698</field>
|
||||||
|
<field name="position_v">280</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_10" model="restaurant.table">
|
||||||
|
<field name="name">10</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">6</field>
|
||||||
|
<field name="color">rgb(235,109,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">860</field>
|
||||||
|
<field name="position_v">280</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_11" model="restaurant.table">
|
||||||
|
<field name="name">11</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">6</field>
|
||||||
|
<field name="color">rgb(78,210,190)</field>
|
||||||
|
<field name="shape">round</field>
|
||||||
|
<field name="width">210</field>
|
||||||
|
<field name="height">210</field>
|
||||||
|
<field name="position_h">400</field>
|
||||||
|
<field name="position_v">230</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Restaurant Floor: Patio -->
|
||||||
|
|
||||||
|
<record id="floor_patio" model="restaurant.floor">
|
||||||
|
<field name="name">Patio</field>
|
||||||
|
<field name="background_color">rgb(130, 233, 171)</field>
|
||||||
|
<field name="pos_config_ids" eval="[(6, 0, [ref('pos_restaurant.pos_config_main_restaurant')])]" />
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Patio: Left table row -->
|
||||||
|
|
||||||
|
<record id="table_21" model="restaurant.table">
|
||||||
|
<field name="name">1</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">100</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_22" model="restaurant.table">
|
||||||
|
<field name="name">2</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">100</field>
|
||||||
|
<field name="position_v">166</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_23" model="restaurant.table">
|
||||||
|
<field name="name">3</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">100</field>
|
||||||
|
<field name="position_v">283</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_24" model="restaurant.table">
|
||||||
|
<field name="name">4</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">100</field>
|
||||||
|
<field name="position_v">400</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Patio: Right table row -->
|
||||||
|
|
||||||
|
<record id="table_25" model="restaurant.table">
|
||||||
|
<field name="name">5</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">800</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_26" model="restaurant.table">
|
||||||
|
<field name="name">6</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">800</field>
|
||||||
|
<field name="position_v">166</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_27" model="restaurant.table">
|
||||||
|
<field name="name">7</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">800</field>
|
||||||
|
<field name="position_v">283</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_28" model="restaurant.table">
|
||||||
|
<field name="name">8</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">800</field>
|
||||||
|
<field name="position_v">400</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Patio: Center table block -->
|
||||||
|
|
||||||
|
<record id="table_29" model="restaurant.table">
|
||||||
|
<field name="name">9</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,191,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">120</field>
|
||||||
|
<field name="position_h">330</field>
|
||||||
|
<field name="position_v">100</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_29" model="restaurant.table">
|
||||||
|
<field name="name">9</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,191,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">120</field>
|
||||||
|
<field name="position_h">330</field>
|
||||||
|
<field name="position_v">100</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_30" model="restaurant.table">
|
||||||
|
<field name="name">10</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,191,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">120</field>
|
||||||
|
<field name="position_h">560</field>
|
||||||
|
<field name="position_v">100</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_31" model="restaurant.table">
|
||||||
|
<field name="name">11</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,191,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">120</field>
|
||||||
|
<field name="position_h">330</field>
|
||||||
|
<field name="position_v">315</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_32" model="restaurant.table">
|
||||||
|
<field name="name">12</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,191,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">120</field>
|
||||||
|
<field name="position_h">560</field>
|
||||||
|
<field name="position_v">315</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<function model="pos.config" name="add_cash_payment_method" />
|
||||||
|
|
||||||
|
<!-- Open Session -->
|
||||||
|
|
||||||
|
<record id="pos_open_session_2" model="pos.session" forcecreate="False">
|
||||||
|
<field name="config_id" ref="pos_config_main_restaurant" />
|
||||||
|
<field name="user_id" ref="base.user_admin" />
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_open_order_2" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_open_session_2" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">Restaurant/00001</field>
|
||||||
|
<field name="state">draft</field>
|
||||||
|
<field name="amount_total">22.90</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">0.0</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00002-001-0000</field>
|
||||||
|
<field name="partner_id" ref="base.res_partner_1" />
|
||||||
|
<field name="table_id" ref="table_01" />
|
||||||
|
<field name="customer_count">8</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_orderline_2" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Orderline 2</field>
|
||||||
|
<field name="product_id" ref="coke" />
|
||||||
|
<field name="price_subtotal">4.40</field>
|
||||||
|
<field name="price_subtotal_incl">4.40</field>
|
||||||
|
<field name="price_unit">2.20</field>
|
||||||
|
<field name="qty">2</field>
|
||||||
|
<field name="order_id" ref="pos_open_order_2" />
|
||||||
|
<field name="full_product_name">Coca-Cola</field>
|
||||||
|
<field name="uuid">00000000-0000-4000-000000000000</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_orderline_3" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Orderline 3</field>
|
||||||
|
<field name="product_id" ref="pos_food_chirashi" />
|
||||||
|
<field name="price_subtotal">18.5</field>
|
||||||
|
<field name="price_subtotal_incl">18.5</field>
|
||||||
|
<field name="price_unit">9.25</field>
|
||||||
|
<field name="qty">2</field>
|
||||||
|
<field name="order_id" ref="pos_open_order_2" />
|
||||||
|
<field name="full_product_name">Salmon and Avocado</field>
|
||||||
|
<field name="uuid">00000000-0000-4000-000000000001</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_open_order_3" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_open_session_2" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">Restaurant/00002</field>
|
||||||
|
<field name="state">draft</field>
|
||||||
|
<field name="amount_total">21.8</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">0.0</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00002-002-0000</field>
|
||||||
|
<field name="partner_id" ref="base.res_partner_2" />
|
||||||
|
<field name="table_id" ref="table_02" />
|
||||||
|
<field name="customer_count">3</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_orderline_4" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Orderline 4</field>
|
||||||
|
<field name="product_id" ref="pos_food_temaki" />
|
||||||
|
<field name="price_subtotal">14.0</field>
|
||||||
|
<field name="price_subtotal_incl">14.0</field>
|
||||||
|
<field name="price_unit">14.0</field>
|
||||||
|
<field name="qty">1</field>
|
||||||
|
<field name="order_id" ref="pos_open_order_3" />
|
||||||
|
<field name="full_product_name">Lunch Temaki mix 3pc</field>
|
||||||
|
<field name="uuid">00000000-0000-4000-000000000002</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_orderline_5" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Orderline 5</field>
|
||||||
|
<field name="product_id" ref="pos_food_mozza" />
|
||||||
|
<field name="price_subtotal">7.8</field>
|
||||||
|
<field name="price_subtotal_incl">7.8</field>
|
||||||
|
<field name="price_unit">3.9</field>
|
||||||
|
<field name="qty">2</field>
|
||||||
|
<field name="order_id" ref="pos_open_order_3" />
|
||||||
|
<field name="full_product_name">Mozzarella Sandwich</field>
|
||||||
|
<field name="uuid">00000000-0000-4000-000000000003</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_open_order_4" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_open_session_2" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">Restaurant/00003</field>
|
||||||
|
<field name="state">draft</field>
|
||||||
|
<field name="amount_total">10.5</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">0.0</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00002-003-0000</field>
|
||||||
|
<field name="partner_id" ref="base.res_partner_4" />
|
||||||
|
<field name="table_id" ref="table_04" />
|
||||||
|
<field name="customer_count">5</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_orderline_6" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Orderline 6</field>
|
||||||
|
<field name="product_id" ref="pos_food_chicken" />
|
||||||
|
<field name="price_subtotal">3.0</field>
|
||||||
|
<field name="price_subtotal_incl">3.0</field>
|
||||||
|
<field name="price_unit">3.0</field>
|
||||||
|
<field name="qty">1</field>
|
||||||
|
<field name="order_id" ref="pos_open_order_4" />
|
||||||
|
<field name="full_product_name">Chicken Curry Sandwich</field>
|
||||||
|
<field name="uuid">00000000-0000-4000-000000000004</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_orderline_7" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Orderline 7</field>
|
||||||
|
<field name="product_id" ref="pos_food_bacon" />
|
||||||
|
<field name="price_subtotal">7.5</field>
|
||||||
|
<field name="price_subtotal_incl">7.5</field>
|
||||||
|
<field name="price_unit">7.5</field>
|
||||||
|
<field name="qty">1</field>
|
||||||
|
<field name="order_id" ref="pos_open_order_4" />
|
||||||
|
<field name="full_product_name">Bacon Burger</field>
|
||||||
|
<field name="uuid">00000000-0000-4000-000000000005</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_open_order_5" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_open_session_2" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">Restaurant/00004</field>
|
||||||
|
<field name="state">draft</field>
|
||||||
|
<field name="amount_total">5.5</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">0.0</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00002-004-0000</field>
|
||||||
|
<field name="partner_id" ref="base.res_partner_10" />
|
||||||
|
<field name="table_id" ref="table_06" />
|
||||||
|
<field name="customer_count">1</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_orderline_8" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Orderline 8</field>
|
||||||
|
<field name="product_id" ref="pos_food_4formaggi" />
|
||||||
|
<field name="price_subtotal">5.5</field>
|
||||||
|
<field name="price_subtotal_incl">5.5</field>
|
||||||
|
<field name="price_unit">5.5</field>
|
||||||
|
<field name="qty">1</field>
|
||||||
|
<field name="order_id" ref="pos_open_order_5" />
|
||||||
|
<field name="full_product_name">Pizza 4 Formaggi</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<function model="pos.session" name="_set_last_order_preparation_change"
|
||||||
|
eval="[[ref('pos_open_order_2'), ref('pos_open_order_3'), ref('pos_open_order_4')]]"/>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
235
data/pos_restaurant_onboarding.xml
Normal file
@ -0,0 +1,235 @@
|
|||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="drinks" model="pos.category">
|
||||||
|
<field name="name">Drinks</field>
|
||||||
|
<field name="image_128" type="base64" file="pos_restaurant/static/img/drink_category.png" />
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="product_category_pos_food" model="product.category">
|
||||||
|
<field name="parent_id" ref="point_of_sale.product_category_pos"/>
|
||||||
|
<field name="name">Food</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="food" model="pos.category">
|
||||||
|
<field name="name">Food</field>
|
||||||
|
<field name="image_128" type="base64" file="pos_restaurant/static/img/food_category.png" />
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Food -->
|
||||||
|
<record id="pos_food_margherita" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">7.0</field>
|
||||||
|
<field name="name">Margherita</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-pizza-ma.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_funghi" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">7.0</field>
|
||||||
|
<field name="name">Funghi</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-pizza-fu.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_vege" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">7.0</field>
|
||||||
|
<field name="name">Vegetarian</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-pizza-ve.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_bolo" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">4.5</field>
|
||||||
|
<field name="name">Pasta Bolognese</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-pasta.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_4formaggi" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">5.5</field>
|
||||||
|
<field name="name">Pasta 4 formaggi </field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-pasta-4f.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_bacon" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">7.5</field>
|
||||||
|
<field name="name">Bacon Burger</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-burger.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_cheeseburger" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">7.0</field>
|
||||||
|
<field name="name">Cheese Burger</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-cheeseburger.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_chicken" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">3.0</field>
|
||||||
|
<field name="name">Chicken Curry Sandwich</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-sandwich.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_tuna" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">3.0</field>
|
||||||
|
<field name="name">Spicy Tuna Sandwich</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-tuna.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_mozza" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">3.9</field>
|
||||||
|
<field name="name">Mozzarella Sandwich</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-mozza.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_club" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">3.4</field>
|
||||||
|
<field name="name">Club Sandwich</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-club.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_maki" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">12.0</field>
|
||||||
|
<field name="name">Lunch Maki 18pc</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-maki.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_salmon" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">13.80</field>
|
||||||
|
<field name="name">Lunch Salmon 20pc</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-salmon.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_temaki" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">14.0</field>
|
||||||
|
<field name="name">Lunch Temaki mix 3pc</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-temaki.jpg"/>
|
||||||
|
</record>
|
||||||
|
<record id="pos_food_chirashi" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">9.25</field>
|
||||||
|
<field name="name">Salmon and Avocado</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('food')])]"/>
|
||||||
|
<field name="categ_id" ref="pos_restaurant.product_category_pos_food"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-salmon-avocado.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Drinks -->
|
||||||
|
<record id="coke" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">2.20</field>
|
||||||
|
<field name="name">Coca-Cola</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="categ_id" ref="point_of_sale.product_category_pos"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-coke.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="water" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">2.20</field>
|
||||||
|
<field name="name">Water</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="categ_id" ref="point_of_sale.product_category_pos"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-water.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="minute_maid" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">2.20</field>
|
||||||
|
<field name="name">Minute Maid</field>
|
||||||
|
<field name="weight">0.01</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="categ_id" ref="point_of_sale.product_category_pos"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-minute_maid.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="espresso" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">4.70</field>
|
||||||
|
<field name="name">Espresso</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-espresso.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="green_tea" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">4.70</field>
|
||||||
|
<field name="name">Green Tea</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-green_tea.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="milkshake_banana" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">3.60</field>
|
||||||
|
<field name="name">Milkshake Banana</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-milkshake_banana.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="ice_tea" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">2.20</field>
|
||||||
|
<field name="name">Ice Tea</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-ice_tea.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="schweppes" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">2.20</field>
|
||||||
|
<field name="name">Schweppes</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-schweppes.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="fanta" model="product.product">
|
||||||
|
<field name="available_in_pos">True</field>
|
||||||
|
<field name="list_price">2.20</field>
|
||||||
|
<field name="name">Fanta</field>
|
||||||
|
<field name="pos_categ_ids" eval="[(6, 0, [ref('drinks')])]"/>
|
||||||
|
<field name="image_1920" type="base64" file="pos_restaurant/static/img/th-fanta.jpg"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<function model="pos.config" name="add_cash_payment_method" />
|
||||||
|
</odoo>
|
486
data/pos_restaurant_onboarding_main_config.xml
Normal file
@ -0,0 +1,486 @@
|
|||||||
|
<odoo>
|
||||||
|
<!-- Pos Config -->
|
||||||
|
<record model="pos.config" id="pos_config_main_restaurant">
|
||||||
|
<field name="name">Restaurant</field>
|
||||||
|
<field name="iface_printbill">True</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Closed Sessions -->
|
||||||
|
<!-- forcecreate is set to false in order to not create record when updating the db -->
|
||||||
|
|
||||||
|
<function model="ir.model.data" name="_update_xmlids">
|
||||||
|
<value model="base" eval="[{
|
||||||
|
'xml_id': 'pos_restaurant.payment_method',
|
||||||
|
'record': obj().env.ref('pos_restaurant.pos_config_main_restaurant')._get_payment_method('bank'),
|
||||||
|
'noupdate': True,
|
||||||
|
}]" />
|
||||||
|
</function>
|
||||||
|
|
||||||
|
<!-- Closed Session 3 -->
|
||||||
|
|
||||||
|
<record id="pos_closed_session_3" model="pos.session" forcecreate="False" context="{'onboarding_creation': True}">
|
||||||
|
<field name="config_id" ref="pos_config_main_restaurant" />
|
||||||
|
<field name="user_id" ref="base.user_admin" />
|
||||||
|
<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_3_1" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_closed_session_3" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">ClosedDemo/0005</field>
|
||||||
|
<field name="state">paid</field>
|
||||||
|
<field name="amount_total">14.0</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">14.0</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00000-003-1001</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_orderline_3_1_1" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Closed Orderline 3.1.1</field>
|
||||||
|
<field name="product_id" ref="pos_food_margherita" />
|
||||||
|
<field name="price_subtotal">7.0</field>
|
||||||
|
<field name="price_subtotal_incl">7.0</field>
|
||||||
|
<field name="price_unit">7.0</field>
|
||||||
|
<field name="order_id" ref="pos_closed_order_3_1" />
|
||||||
|
<field name="full_product_name">Margherita</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_orderline_3_1_2" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Closed Orderline 3.1.2</field>
|
||||||
|
<field name="product_id" ref="pos_food_funghi" />
|
||||||
|
<field name="price_subtotal">7.0</field>
|
||||||
|
<field name="price_subtotal_incl">7.0</field>
|
||||||
|
<field name="price_unit">7.0</field>
|
||||||
|
<field name="order_id" ref="pos_closed_order_3_1" />
|
||||||
|
<field name="full_product_name">Funghi</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_payment_1" model="pos.payment" forcecreate="False">
|
||||||
|
<field name="payment_method_id" ref="pos_restaurant.payment_method" />
|
||||||
|
<field name="pos_order_id" ref="pos_closed_order_3_1" />
|
||||||
|
<field name="amount">14.0</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_order_3_2" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_closed_session_3" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">ClosedDemo/0006</field>
|
||||||
|
<field name="state">paid</field>
|
||||||
|
<field name="amount_total">7.0</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">7.0</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00000-003-1002</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_orderline_3_2_1" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Closed Orderline 3.2.1</field>
|
||||||
|
<field name="product_id" ref="pos_food_vege" />
|
||||||
|
<field name="price_subtotal">7.0</field>
|
||||||
|
<field name="price_subtotal_incl">7.0</field>
|
||||||
|
<field name="price_unit">7.0</field>
|
||||||
|
<field name="order_id" ref="pos_closed_order_3_2" />
|
||||||
|
<field name="full_product_name">Vegetarian</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_payment_2" model="pos.payment" forcecreate="False">
|
||||||
|
<field name="payment_method_id" ref="pos_restaurant.payment_method" />
|
||||||
|
<field name="pos_order_id" ref="pos_closed_order_3_2" />
|
||||||
|
<field name="amount">7.0</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<function model="pos.session" name="action_pos_session_closing_control"
|
||||||
|
eval="[[ref('pos_closed_session_3')]]" />
|
||||||
|
|
||||||
|
<!-- Closed Session 4 -->
|
||||||
|
|
||||||
|
<record id="pos_closed_session_4" model="pos.session" forcecreate="False" context="{'onboarding_creation': True}">
|
||||||
|
<field name="config_id" ref="pos_config_main_restaurant" />
|
||||||
|
<field name="user_id" ref="base.user_admin" />
|
||||||
|
<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_4_1" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_closed_session_4" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">ClosedDemo/0007</field>
|
||||||
|
<field name="state">paid</field>
|
||||||
|
<field name="amount_total">6.7</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">6.7</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00000-004-1001</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_orderline_4_1_1" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Closed Orderline 4.1.1</field>
|
||||||
|
<field name="product_id" ref="water" />
|
||||||
|
<field name="price_subtotal">2.20</field>
|
||||||
|
<field name="price_subtotal_incl">2.20</field>
|
||||||
|
<field name="price_unit">2.20</field>
|
||||||
|
<field name="order_id" ref="pos_closed_order_4_1" />
|
||||||
|
<field name="full_product_name">Water</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_orderline_4_1_2" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Closed Orderline 4.1.2</field>
|
||||||
|
<field name="product_id" ref="pos_food_bolo" />
|
||||||
|
<field name="price_subtotal">4.5</field>
|
||||||
|
<field name="price_subtotal_incl">4.5</field>
|
||||||
|
<field name="price_unit">4.5</field>
|
||||||
|
<field name="order_id" ref="pos_closed_order_4_1" />
|
||||||
|
<field name="full_product_name">Pasta Bolognese</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_payment_3" model="pos.payment" forcecreate="False">
|
||||||
|
<field name="payment_method_id" ref="pos_restaurant.payment_method" />
|
||||||
|
<field name="pos_order_id" ref="pos_closed_order_4_1" />
|
||||||
|
<field name="amount">6.7</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_order_4_2" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_closed_session_4" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">ClosedDemo/0008</field>
|
||||||
|
<field name="state">paid</field>
|
||||||
|
<field name="amount_total">28.0</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">28.0</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00000-004-1002</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_closed_orderline_4_2_1" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Closed Orderline 4.2.1</field>
|
||||||
|
<field name="product_id" ref="pos_food_cheeseburger" />
|
||||||
|
<field name="price_subtotal">28.0</field>
|
||||||
|
<field name="price_subtotal_incl">28.0</field>
|
||||||
|
<field name="price_unit">7.0</field>
|
||||||
|
<field name="qty">4</field>
|
||||||
|
<field name="order_id" ref="pos_closed_order_4_2" />
|
||||||
|
<field name="full_product_name">Cheese Burger</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_payment_4" model="pos.payment" forcecreate="False">
|
||||||
|
<field name="payment_method_id" ref="pos_restaurant.payment_method" />
|
||||||
|
<field name="pos_order_id" ref="pos_closed_order_4_2" />
|
||||||
|
<field name="amount">28.0</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<function model="pos.session" name="action_pos_session_closing_control"
|
||||||
|
eval="[[ref('pos_closed_session_4')]]" />
|
||||||
|
|
||||||
|
<!-- Floors: Main Floor -->
|
||||||
|
<record id="floor_main" model="restaurant.floor">
|
||||||
|
<field name="name">Main Floor</field>
|
||||||
|
<field name="background_color">rgb(249,250,251)</field>
|
||||||
|
<field name="pos_config_ids" eval="[(6, 0, [ref('pos_restaurant.pos_config_main_restaurant')])]" />
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_01" model="restaurant.table">
|
||||||
|
<field name="name">1</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">50</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_02" model="restaurant.table">
|
||||||
|
<field name="name">2</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">212</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_03" model="restaurant.table">
|
||||||
|
<field name="name">3</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">374</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_04" model="restaurant.table">
|
||||||
|
<field name="name">4</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">536</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_05" model="restaurant.table">
|
||||||
|
<field name="name">5</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">698</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_06" model="restaurant.table">
|
||||||
|
<field name="name">6</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">860</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_07" model="restaurant.table">
|
||||||
|
<field name="name">7</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,109,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">50</field>
|
||||||
|
<field name="position_v">280</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_08" model="restaurant.table">
|
||||||
|
<field name="name">8</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,109,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">212</field>
|
||||||
|
<field name="position_v">280</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_09" model="restaurant.table">
|
||||||
|
<field name="name">9</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,109,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">698</field>
|
||||||
|
<field name="position_v">280</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_10" model="restaurant.table">
|
||||||
|
<field name="name">10</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,109,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">100</field>
|
||||||
|
<field name="height">100</field>
|
||||||
|
<field name="position_h">860</field>
|
||||||
|
<field name="position_v">280</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_11" model="restaurant.table">
|
||||||
|
<field name="name">11</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_main" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(78,210,190)</field>
|
||||||
|
<field name="shape">round</field>
|
||||||
|
<field name="width">210</field>
|
||||||
|
<field name="height">210</field>
|
||||||
|
<field name="position_h">400</field>
|
||||||
|
<field name="position_v">230</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Restaurant Floor: Patio -->
|
||||||
|
|
||||||
|
<record id="floor_patio" model="restaurant.floor">
|
||||||
|
<field name="name">Patio</field>
|
||||||
|
<field name="background_color">rgb(130, 233, 171)</field>
|
||||||
|
<field name="pos_config_ids" eval="[(6, 0, [ref('pos_restaurant.pos_config_main_restaurant')])]" />
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Patio: Left table row -->
|
||||||
|
|
||||||
|
<record id="table_21" model="restaurant.table">
|
||||||
|
<field name="name">1</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">100</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_22" model="restaurant.table">
|
||||||
|
<field name="name">2</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">100</field>
|
||||||
|
<field name="position_v">166</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_23" model="restaurant.table">
|
||||||
|
<field name="name">3</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">100</field>
|
||||||
|
<field name="position_v">283</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_24" model="restaurant.table">
|
||||||
|
<field name="name">4</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">100</field>
|
||||||
|
<field name="position_v">400</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Patio: Right table row -->
|
||||||
|
|
||||||
|
<record id="table_25" model="restaurant.table">
|
||||||
|
<field name="name">5</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">800</field>
|
||||||
|
<field name="position_v">50</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_26" model="restaurant.table">
|
||||||
|
<field name="name">6</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">800</field>
|
||||||
|
<field name="position_v">166</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_27" model="restaurant.table">
|
||||||
|
<field name="name">7</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">800</field>
|
||||||
|
<field name="position_v">283</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_28" model="restaurant.table">
|
||||||
|
<field name="name">8</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">2</field>
|
||||||
|
<field name="color">rgb(53,211,116)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">85</field>
|
||||||
|
<field name="position_h">800</field>
|
||||||
|
<field name="position_v">400</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- Patio: Center table block -->
|
||||||
|
|
||||||
|
<record id="table_29" model="restaurant.table">
|
||||||
|
<field name="name">9</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,191,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">120</field>
|
||||||
|
<field name="position_h">330</field>
|
||||||
|
<field name="position_v">100</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_29" model="restaurant.table">
|
||||||
|
<field name="name">9</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,191,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">120</field>
|
||||||
|
<field name="position_h">330</field>
|
||||||
|
<field name="position_v">100</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_30" model="restaurant.table">
|
||||||
|
<field name="name">10</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,191,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">120</field>
|
||||||
|
<field name="position_h">560</field>
|
||||||
|
<field name="position_v">100</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_31" model="restaurant.table">
|
||||||
|
<field name="name">11</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,191,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">120</field>
|
||||||
|
<field name="position_h">330</field>
|
||||||
|
<field name="position_v">315</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="table_32" model="restaurant.table">
|
||||||
|
<field name="name">12</field>
|
||||||
|
<field name="floor_id" ref="pos_restaurant.floor_patio" />
|
||||||
|
<field name="seats">4</field>
|
||||||
|
<field name="color">rgb(235,191,109)</field>
|
||||||
|
<field name="shape">square</field>
|
||||||
|
<field name="width">130</field>
|
||||||
|
<field name="height">120</field>
|
||||||
|
<field name="position_h">560</field>
|
||||||
|
<field name="position_v">315</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
154
data/pos_restaurant_onboarding_open_session.xml
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<!-- Open Session -->
|
||||||
|
|
||||||
|
<function model="ir.model.data" name="_update_xmlids">
|
||||||
|
<value model="base" eval="[{
|
||||||
|
'xml_id': 'pos_restaurant.pos_open_session_2',
|
||||||
|
'record': obj().env.ref('pos_restaurant.pos_config_main_restaurant').current_session_id,
|
||||||
|
'noupdate': True,
|
||||||
|
}]" />
|
||||||
|
</function>
|
||||||
|
|
||||||
|
<record id="pos_open_order_2" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_open_session_2" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">Restaurant/00001</field>
|
||||||
|
<field name="state">draft</field>
|
||||||
|
<field name="amount_total">22.90</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">0.0</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00002-001-0000</field>
|
||||||
|
<field name="table_id" ref="table_01" />
|
||||||
|
<field name="customer_count">8</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_orderline_2" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Orderline 2</field>
|
||||||
|
<field name="product_id" ref="coke" />
|
||||||
|
<field name="price_subtotal">4.40</field>
|
||||||
|
<field name="price_subtotal_incl">4.40</field>
|
||||||
|
<field name="price_unit">2.20</field>
|
||||||
|
<field name="qty">2</field>
|
||||||
|
<field name="order_id" ref="pos_open_order_2" />
|
||||||
|
<field name="full_product_name">Coca-Cola</field>
|
||||||
|
<field name="uuid">00000000-0000-4000-000000000000</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_orderline_3" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Orderline 3</field>
|
||||||
|
<field name="product_id" ref="pos_food_chirashi" />
|
||||||
|
<field name="price_subtotal">18.5</field>
|
||||||
|
<field name="price_subtotal_incl">18.5</field>
|
||||||
|
<field name="price_unit">9.25</field>
|
||||||
|
<field name="qty">2</field>
|
||||||
|
<field name="order_id" ref="pos_open_order_2" />
|
||||||
|
<field name="full_product_name">Salmon and Avocado</field>
|
||||||
|
<field name="uuid">00000000-0000-4000-000000000001</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_open_order_3" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_open_session_2" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">Restaurant/00002</field>
|
||||||
|
<field name="state">draft</field>
|
||||||
|
<field name="amount_total">21.8</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">0.0</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00002-002-0000</field>
|
||||||
|
<field name="table_id" ref="table_02" />
|
||||||
|
<field name="customer_count">3</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_orderline_4" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Orderline 4</field>
|
||||||
|
<field name="product_id" ref="pos_food_temaki" />
|
||||||
|
<field name="price_subtotal">14.0</field>
|
||||||
|
<field name="price_subtotal_incl">14.0</field>
|
||||||
|
<field name="price_unit">14.0</field>
|
||||||
|
<field name="qty">1</field>
|
||||||
|
<field name="order_id" ref="pos_open_order_3" />
|
||||||
|
<field name="full_product_name">Lunch Temaki mix 3pc</field>
|
||||||
|
<field name="uuid">00000000-0000-4000-000000000002</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_orderline_5" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Orderline 5</field>
|
||||||
|
<field name="product_id" ref="pos_food_mozza" />
|
||||||
|
<field name="price_subtotal">7.8</field>
|
||||||
|
<field name="price_subtotal_incl">7.8</field>
|
||||||
|
<field name="price_unit">3.9</field>
|
||||||
|
<field name="qty">2</field>
|
||||||
|
<field name="order_id" ref="pos_open_order_3" />
|
||||||
|
<field name="full_product_name">Mozzarella Sandwich</field>
|
||||||
|
<field name="uuid">00000000-0000-4000-000000000003</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_open_order_4" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_open_session_2" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">Restaurant/00003</field>
|
||||||
|
<field name="state">draft</field>
|
||||||
|
<field name="amount_total">10.5</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">0.0</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00002-003-0000</field>
|
||||||
|
<field name="table_id" ref="table_04" />
|
||||||
|
<field name="customer_count">5</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_orderline_6" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Orderline 6</field>
|
||||||
|
<field name="product_id" ref="pos_food_chicken" />
|
||||||
|
<field name="price_subtotal">3.0</field>
|
||||||
|
<field name="price_subtotal_incl">3.0</field>
|
||||||
|
<field name="price_unit">3.0</field>
|
||||||
|
<field name="qty">1</field>
|
||||||
|
<field name="order_id" ref="pos_open_order_4" />
|
||||||
|
<field name="full_product_name">Chicken Curry Sandwich</field>
|
||||||
|
<field name="uuid">00000000-0000-4000-000000000004</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_orderline_7" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Orderline 7</field>
|
||||||
|
<field name="product_id" ref="pos_food_bacon" />
|
||||||
|
<field name="price_subtotal">7.5</field>
|
||||||
|
<field name="price_subtotal_incl">7.5</field>
|
||||||
|
<field name="price_unit">7.5</field>
|
||||||
|
<field name="qty">1</field>
|
||||||
|
<field name="order_id" ref="pos_open_order_4" />
|
||||||
|
<field name="full_product_name">Bacon Burger</field>
|
||||||
|
<field name="uuid">00000000-0000-4000-000000000005</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_open_order_5" model="pos.order" forcecreate="False">
|
||||||
|
<field name="session_id" ref="pos_open_session_2" />
|
||||||
|
<field name="company_id" ref="base.main_company" />
|
||||||
|
<field name="name">Restaurant/00004</field>
|
||||||
|
<field name="state">draft</field>
|
||||||
|
<field name="amount_total">5.5</field>
|
||||||
|
<field name="amount_tax">0.0</field>
|
||||||
|
<field name="amount_paid">0.0</field>
|
||||||
|
<field name="amount_return">0.0</field>
|
||||||
|
<field name="pos_reference">Order 00002-004-0000</field>
|
||||||
|
<field name="table_id" ref="table_06" />
|
||||||
|
<field name="customer_count">1</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="pos_orderline_8" model="pos.order.line" forcecreate="False">
|
||||||
|
<field name="name">Orderline 8</field>
|
||||||
|
<field name="product_id" ref="pos_food_4formaggi" />
|
||||||
|
<field name="price_subtotal">5.5</field>
|
||||||
|
<field name="price_subtotal_incl">5.5</field>
|
||||||
|
<field name="price_unit">5.5</field>
|
||||||
|
<field name="qty">1</field>
|
||||||
|
<field name="order_id" ref="pos_open_order_5" />
|
||||||
|
<field name="full_product_name">Pizza 4 Formaggi</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<function model="pos.session" name="_set_last_order_preparation_change"
|
||||||
|
eval="[[ref('pos_open_order_2'), ref('pos_open_order_3'), ref('pos_open_order_4')]]"/>
|
||||||
|
</odoo>
|
1236
i18n/af.po
Normal file
1344
i18n/ar.po
Normal file
1237
i18n/az.po
Normal file
1330
i18n/bg.po
Normal file
1237
i18n/bs.po
Normal file
1345
i18n/ca.po
Normal file
1328
i18n/cs.po
Normal file
1347
i18n/da.po
Normal file
1360
i18n/de.po
Normal file
1241
i18n/el.po
Normal file
1235
i18n/en_GB.po
Normal file
1361
i18n/es.po
Normal file
1363
i18n/es_419.po
Normal file
1234
i18n/es_BO.po
Normal file
1234
i18n/es_CL.po
Normal file
1238
i18n/es_CO.po
Normal file
1234
i18n/es_CR.po
Normal file
1235
i18n/es_DO.po
Normal file
1239
i18n/es_EC.po
Normal file
1235
i18n/es_PE.po
Normal file
1234
i18n/es_PY.po
Normal file
1234
i18n/es_VE.po
Normal file
1337
i18n/et.po
Normal file
1234
i18n/eu.po
Normal file
1324
i18n/fa.po
Normal file
1362
i18n/fi.po
Normal file
1361
i18n/fr.po
Normal file
1234
i18n/fr_CA.po
Normal file
1234
i18n/gl.po
Normal file
1236
i18n/gu.po
Normal file
1326
i18n/he.po
Normal file
1245
i18n/hr.po
Normal file
1327
i18n/hu.po
Normal file
1351
i18n/id.po
Normal file
1232
i18n/is.po
Normal file
1357
i18n/it.po
Normal file
1337
i18n/ja.po
Normal file
1234
i18n/ka.po
Normal file
1234
i18n/kab.po
Normal file
1237
i18n/km.po
Normal file
1335
i18n/ko.po
Normal file
1232
i18n/lb.po
Normal file
1328
i18n/lt.po
Normal file
1348
i18n/lv.po
Normal file
1239
i18n/mk.po
Normal file
1245
i18n/mn.po
Normal file
1239
i18n/nb.po
Normal file
1361
i18n/nl.po
Normal file
1330
i18n/pl.po
Normal file
1329
i18n/pos_restaurant.pot
Normal file
1341
i18n/pt.po
Normal file
1357
i18n/pt_BR.po
Normal file
1242
i18n/ro.po
Normal file
1360
i18n/ru.po
Normal file
1314
i18n/sk.po
Normal file
1318
i18n/sl.po
Normal file
1235
i18n/sq.po
Normal file
1354
i18n/sr.po
Normal file
1238
i18n/sr@latin.po
Normal file
1324
i18n/sv.po
Normal file
1340
i18n/th.po
Normal file
1363
i18n/tr.po
Normal file
1351
i18n/uk.po
Normal file
1350
i18n/vi.po
Normal file
1339
i18n/zh_CN.po
Normal file
1336
i18n/zh_TW.po
Normal file
9
models/__init__.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||||
|
|
||||||
|
from . import pos_config
|
||||||
|
from . import pos_order
|
||||||
|
from . import pos_payment
|
||||||
|
from . import pos_restaurant
|
||||||
|
from . import pos_session
|
||||||
|
from . import res_config_settings
|
163
models/pos_config.py
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||||
|
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
import json
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
|
||||||
|
class PosConfig(models.Model):
|
||||||
|
_inherit = 'pos.config'
|
||||||
|
|
||||||
|
iface_splitbill = fields.Boolean(string='Bill Splitting', help='Enables Bill Splitting in the Point of Sale.')
|
||||||
|
iface_printbill = fields.Boolean(string='Bill Printing', help='Allows to print the Bill before payment.')
|
||||||
|
iface_orderline_notes = fields.Boolean(string='Internal Notes', help='Allow custom Internal notes on Orderlines.')
|
||||||
|
floor_ids = fields.Many2many('restaurant.floor', string='Restaurant Floors', help='The restaurant floors served by this point of sale.')
|
||||||
|
set_tip_after_payment = fields.Boolean('Set Tip After Payment', help="Adjust the amount authorized by payment terminals to add a tip after the customers left or at the end of the day.")
|
||||||
|
module_pos_restaurant = fields.Boolean(default=True)
|
||||||
|
module_pos_restaurant_appointment = fields.Boolean("Table Booking")
|
||||||
|
|
||||||
|
def get_tables_order_count_and_printing_changes(self):
|
||||||
|
self.ensure_one()
|
||||||
|
floors = self.env['restaurant.floor'].search([('pos_config_ids', '=', self.id)])
|
||||||
|
tables = self.env['restaurant.table'].search([('floor_id', 'in', floors.ids)])
|
||||||
|
domain = [('state', '=', 'draft'), ('table_id', 'in', tables.ids)]
|
||||||
|
|
||||||
|
order_stats = self.env['pos.order']._read_group(domain, ['table_id'], ['__count'])
|
||||||
|
linked_orderlines = self.env['pos.order.line'].search([('order_id.state', '=', 'draft'), ('order_id.table_id', 'in', tables.ids)])
|
||||||
|
orders_map = {table.id: count for table, count in order_stats}
|
||||||
|
changes_map = defaultdict(lambda: 0)
|
||||||
|
skip_changes_map = defaultdict(lambda: 0)
|
||||||
|
|
||||||
|
for line in linked_orderlines:
|
||||||
|
# For the moment, as this feature is not compatible with pos_self_order,
|
||||||
|
# we ignore last_order_preparation_change when it is set to false.
|
||||||
|
# In future, pos_self_order will send the various changes to the order.
|
||||||
|
if not line.order_id.last_order_preparation_change:
|
||||||
|
line.order_id.last_order_preparation_change = '{}'
|
||||||
|
|
||||||
|
last_order_preparation_change = json.loads(line.order_id.last_order_preparation_change)
|
||||||
|
prep_change = {}
|
||||||
|
for line_uuid in last_order_preparation_change:
|
||||||
|
prep_change[last_order_preparation_change[line_uuid]['line_uuid']] = last_order_preparation_change[line_uuid]
|
||||||
|
quantity_changed = 0
|
||||||
|
if line.uuid in prep_change:
|
||||||
|
quantity_changed = line.qty - prep_change[line.uuid]['quantity']
|
||||||
|
else:
|
||||||
|
quantity_changed = line.qty
|
||||||
|
|
||||||
|
if line.skip_change:
|
||||||
|
skip_changes_map[line.order_id.table_id.id] += quantity_changed
|
||||||
|
else:
|
||||||
|
changes_map[line.order_id.table_id.id] += quantity_changed
|
||||||
|
|
||||||
|
result = []
|
||||||
|
for table in tables:
|
||||||
|
result.append({'id': table.id, 'orders': orders_map.get(table.id, 0), 'changes': changes_map.get(table.id, 0), 'skip_changes': skip_changes_map.get(table.id, 0)})
|
||||||
|
return result
|
||||||
|
|
||||||
|
def _get_forbidden_change_fields(self):
|
||||||
|
forbidden_keys = super(PosConfig, self)._get_forbidden_change_fields()
|
||||||
|
forbidden_keys.append('floor_ids')
|
||||||
|
return forbidden_keys
|
||||||
|
|
||||||
|
def _set_tips_after_payment_if_country_custom(self):
|
||||||
|
self.ensure_one()
|
||||||
|
company = self.company_id or self.env.company or self.env['res.company']._get_main_company()
|
||||||
|
if company and company.country_id and company.country_id.code == 'US':
|
||||||
|
self.update({
|
||||||
|
'iface_tipproduct': True,
|
||||||
|
'set_tip_after_payment': True,
|
||||||
|
})
|
||||||
|
|
||||||
|
@api.model_create_multi
|
||||||
|
def create(self, vals_list):
|
||||||
|
for vals in vals_list:
|
||||||
|
is_restaurant = 'module_pos_restaurant' not in vals or vals['module_pos_restaurant']
|
||||||
|
if is_restaurant and 'iface_splitbill' not in vals:
|
||||||
|
vals['iface_splitbill'] = True
|
||||||
|
if not is_restaurant or not vals.get('iface_tipproduct', False):
|
||||||
|
vals['set_tip_after_payment'] = False
|
||||||
|
vals["iface_orderline_notes"] = is_restaurant
|
||||||
|
pos_configs = super().create(vals_list)
|
||||||
|
for config in pos_configs:
|
||||||
|
if config.module_pos_restaurant:
|
||||||
|
self._setup_default_floor(config)
|
||||||
|
return pos_configs
|
||||||
|
|
||||||
|
def write(self, vals):
|
||||||
|
if ('module_pos_restaurant' in vals and vals['module_pos_restaurant'] is False):
|
||||||
|
vals['floor_ids'] = [(5, 0, 0)]
|
||||||
|
|
||||||
|
if ('module_pos_restaurant' in vals and not vals['module_pos_restaurant']) or ('iface_tipproduct' in vals and not vals['iface_tipproduct']):
|
||||||
|
vals['set_tip_after_payment'] = False
|
||||||
|
|
||||||
|
if ('module_pos_restaurant' in vals and vals['module_pos_restaurant']):
|
||||||
|
self._setup_default_floor(self)
|
||||||
|
|
||||||
|
return super().write(vals)
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def post_install_pos_localisation(self, companies=False):
|
||||||
|
self = self.sudo()
|
||||||
|
if not companies:
|
||||||
|
companies = self.env['res.company'].search([])
|
||||||
|
super(PosConfig, self).post_install_pos_localisation(companies)
|
||||||
|
for company in companies.filtered('chart_template'):
|
||||||
|
pos_configs = self.search([
|
||||||
|
*self.env['account.journal']._check_company_domain(company),
|
||||||
|
('module_pos_restaurant', '=', True),
|
||||||
|
])
|
||||||
|
if not pos_configs:
|
||||||
|
pos_configs = self.env['pos.config'].with_company(company).create({
|
||||||
|
'name': _('Bar'),
|
||||||
|
'company_id': company.id,
|
||||||
|
'module_pos_restaurant': True,
|
||||||
|
'iface_splitbill': True,
|
||||||
|
'iface_printbill': True,
|
||||||
|
'iface_orderline_notes': True,
|
||||||
|
|
||||||
|
})
|
||||||
|
pos_configs.setup_defaults(company)
|
||||||
|
|
||||||
|
def setup_defaults(self, company):
|
||||||
|
main_restaurant = self.env.ref('pos_restaurant.pos_config_main_restaurant', raise_if_not_found=False)
|
||||||
|
main_restaurant_is_present = main_restaurant and self.filtered(lambda cfg: cfg.id == main_restaurant.id)
|
||||||
|
if main_restaurant_is_present:
|
||||||
|
non_main_restaurant_configs = self - main_restaurant
|
||||||
|
non_main_restaurant_configs.assign_payment_journals(company)
|
||||||
|
main_restaurant._setup_main_restaurant_defaults()
|
||||||
|
self.generate_pos_journal(company)
|
||||||
|
self.setup_invoice_journal(company)
|
||||||
|
else:
|
||||||
|
super().setup_defaults(company)
|
||||||
|
|
||||||
|
def _setup_main_restaurant_defaults(self):
|
||||||
|
self.ensure_one()
|
||||||
|
self._set_tips_after_payment_if_country_custom()
|
||||||
|
self._link_same_non_cash_payment_methods_if_exists('point_of_sale.pos_config_main')
|
||||||
|
self._ensure_cash_payment_method('MRCSH', _('Cash Restaurant'))
|
||||||
|
self._archive_shop()
|
||||||
|
|
||||||
|
def _archive_shop(self):
|
||||||
|
shop = self.env.ref('point_of_sale.pos_config_main', raise_if_not_found=False)
|
||||||
|
if shop:
|
||||||
|
session_count = self.env['pos.session'].search_count([('config_id', '=', shop.id)])
|
||||||
|
if session_count == 0:
|
||||||
|
shop.update({'active': False})
|
||||||
|
|
||||||
|
def _setup_default_floor(self, pos_config):
|
||||||
|
if not pos_config.floor_ids:
|
||||||
|
main_floor = self.env['restaurant.floor'].create({
|
||||||
|
'name': pos_config.company_id.name,
|
||||||
|
'pos_config_ids': [(4, pos_config.id)],
|
||||||
|
})
|
||||||
|
self.env['restaurant.table'].create({
|
||||||
|
'name': '1',
|
||||||
|
'floor_id': main_floor.id,
|
||||||
|
'seats': 1,
|
||||||
|
'position_h': 100,
|
||||||
|
'position_v': 100,
|
||||||
|
'width': 100,
|
||||||
|
'height': 100,
|
||||||
|
})
|
95
models/pos_order.py
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class PosOrderLine(models.Model):
|
||||||
|
_inherit = 'pos.order.line'
|
||||||
|
|
||||||
|
note = fields.Char('Internal Note added by the waiter.')
|
||||||
|
|
||||||
|
|
||||||
|
class PosOrder(models.Model):
|
||||||
|
_inherit = 'pos.order'
|
||||||
|
|
||||||
|
table_id = fields.Many2one('restaurant.table', string='Table', help='The table where this order was served', index='btree_not_null', readonly=True)
|
||||||
|
customer_count = fields.Integer(string='Guests', help='The amount of customers that have been served by this order.', readonly=True)
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def remove_from_ui(self, server_ids):
|
||||||
|
tables = self.env['pos.order'].search([('id', 'in', server_ids)]).table_id
|
||||||
|
order_ids = super().remove_from_ui(server_ids)
|
||||||
|
self.send_table_count_notification(tables)
|
||||||
|
return order_ids
|
||||||
|
|
||||||
|
def _process_saved_order(self, draft):
|
||||||
|
order_id = super()._process_saved_order(draft)
|
||||||
|
self.send_table_count_notification(self.table_id)
|
||||||
|
return order_id
|
||||||
|
|
||||||
|
def send_table_count_notification(self, table_ids):
|
||||||
|
messages = []
|
||||||
|
for config in self.env['pos.config'].search([('floor_ids', 'in', table_ids.floor_id.ids)]):
|
||||||
|
config_cur_session = config.current_session_id
|
||||||
|
if config_cur_session:
|
||||||
|
order_count = config.get_tables_order_count_and_printing_changes()
|
||||||
|
messages.append((config_cur_session._get_bus_channel_name(), 'TABLE_ORDER_COUNT', order_count))
|
||||||
|
self.env['bus.bus']._sendmany(messages)
|
||||||
|
|
||||||
|
def set_tip(self, tip_line_vals):
|
||||||
|
"""Set tip to `self` based on values in `tip_line_vals`."""
|
||||||
|
|
||||||
|
self.ensure_one()
|
||||||
|
PosOrderLine = self.env['pos.order.line']
|
||||||
|
process_line = partial(PosOrderLine._order_line_fields, session_id=self.session_id.id)
|
||||||
|
|
||||||
|
# 1. add/modify tip orderline
|
||||||
|
processed_tip_line_vals = process_line([0, 0, tip_line_vals])[2]
|
||||||
|
processed_tip_line_vals.update({ "order_id": self.id })
|
||||||
|
tip_line = self.lines.filtered(lambda line: line.product_id == self.session_id.config_id.tip_product_id)
|
||||||
|
if not tip_line:
|
||||||
|
tip_line = PosOrderLine.create(processed_tip_line_vals)
|
||||||
|
else:
|
||||||
|
tip_line.write(processed_tip_line_vals)
|
||||||
|
|
||||||
|
# 2. modify payment
|
||||||
|
payment_line = self.payment_ids.filtered(lambda line: not line.is_change)[0]
|
||||||
|
# TODO it would be better to throw error if there are multiple payment lines
|
||||||
|
# then ask the user to select which payment to update, no?
|
||||||
|
payment_line._update_payment_line_for_tip(tip_line.price_subtotal_incl)
|
||||||
|
|
||||||
|
# 3. flag order as tipped and update order fields
|
||||||
|
self.write({
|
||||||
|
"is_tipped": True,
|
||||||
|
"tip_amount": tip_line.price_subtotal_incl,
|
||||||
|
"amount_total": self.amount_total + tip_line.price_subtotal_incl,
|
||||||
|
"amount_paid": self.amount_paid + tip_line.price_subtotal_incl,
|
||||||
|
})
|
||||||
|
|
||||||
|
def set_no_tip(self):
|
||||||
|
"""Override this method to introduce action when setting no tip."""
|
||||||
|
self.ensure_one()
|
||||||
|
self.write({
|
||||||
|
"is_tipped": True,
|
||||||
|
"tip_amount": 0,
|
||||||
|
})
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _order_fields(self, ui_order):
|
||||||
|
order_fields = super(PosOrder, self)._order_fields(ui_order)
|
||||||
|
order_fields['table_id'] = ui_order.get('table_id', False)
|
||||||
|
order_fields['customer_count'] = ui_order.get('customer_count', 0)
|
||||||
|
return order_fields
|
||||||
|
|
||||||
|
def _export_for_ui(self, order):
|
||||||
|
result = super(PosOrder, self)._export_for_ui(order)
|
||||||
|
result['table_id'] = order.table_id.id
|
||||||
|
result['customer_count'] = order.customer_count
|
||||||
|
return result
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def export_for_ui_table_draft(self, table_ids):
|
||||||
|
orders = self.env['pos.order'].search([('state', '=', 'draft'), ('table_id', 'in', table_ids)])
|
||||||
|
return orders.export_for_ui()
|
15
models/pos_payment.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||||
|
|
||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class PosConfig(models.Model):
|
||||||
|
_inherit = 'pos.payment'
|
||||||
|
|
||||||
|
def _update_payment_line_for_tip(self, tip_amount):
|
||||||
|
"""Inherit this method to perform reauthorization or capture on electronic payment."""
|
||||||
|
self.ensure_one()
|
||||||
|
self.write({
|
||||||
|
"amount": self.amount + tip_amount,
|
||||||
|
})
|
101
models/pos_restaurant.py
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||||
|
|
||||||
|
from odoo import api, fields, models, _, Command
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
|
|
||||||
|
class RestaurantFloor(models.Model):
|
||||||
|
|
||||||
|
_name = 'restaurant.floor'
|
||||||
|
_description = 'Restaurant Floor'
|
||||||
|
_order = "sequence, name"
|
||||||
|
|
||||||
|
name = fields.Char('Floor Name', required=True)
|
||||||
|
pos_config_ids = fields.Many2many('pos.config', string='Point of Sales', domain="[('module_pos_restaurant', '=', True)]")
|
||||||
|
background_image = fields.Binary('Background Image')
|
||||||
|
background_color = fields.Char('Background Color', help='The background color of the floor in a html-compatible format', default='rgb(210, 210, 210)')
|
||||||
|
table_ids = fields.One2many('restaurant.table', 'floor_id', string='Tables')
|
||||||
|
sequence = fields.Integer('Sequence', default=1)
|
||||||
|
active = fields.Boolean(default=True)
|
||||||
|
|
||||||
|
@api.ondelete(at_uninstall=False)
|
||||||
|
def _unlink_except_active_pos_session(self):
|
||||||
|
confs = self.mapped('pos_config_ids').filtered(lambda c: c.module_pos_restaurant)
|
||||||
|
opened_session = self.env['pos.session'].search([('config_id', 'in', confs.ids), ('state', '!=', 'closed')])
|
||||||
|
if opened_session and confs:
|
||||||
|
error_msg = _("You cannot remove a floor that is used in a PoS session, close the session(s) first: \n")
|
||||||
|
for floor in self:
|
||||||
|
for session in opened_session:
|
||||||
|
if floor in session.config_id.floor_ids:
|
||||||
|
error_msg += _("Floor: %s - PoS Config: %s \n", floor.name, session.config_id.name)
|
||||||
|
raise UserError(error_msg)
|
||||||
|
|
||||||
|
def write(self, vals):
|
||||||
|
for floor in self:
|
||||||
|
for config in floor.pos_config_ids:
|
||||||
|
if config.has_active_session and (vals.get('pos_config_ids') or vals.get('active')):
|
||||||
|
raise UserError(
|
||||||
|
'Please close and validate the following open PoS Session before modifying this floor.\n'
|
||||||
|
'Open session: %s' % (' '.join(config.mapped('name')),))
|
||||||
|
return super(RestaurantFloor, self).write(vals)
|
||||||
|
|
||||||
|
def rename_floor(self, new_name):
|
||||||
|
for floor in self:
|
||||||
|
floor.name = new_name
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def create_from_ui(self, name, background_color, config_id):
|
||||||
|
floor_fields = {
|
||||||
|
"name": name,
|
||||||
|
"background_color": background_color,
|
||||||
|
}
|
||||||
|
pos_floor = self.create(floor_fields)
|
||||||
|
pos_floor.pos_config_ids = [Command.link(config_id)]
|
||||||
|
return {
|
||||||
|
'id': pos_floor.id,
|
||||||
|
'name': pos_floor.name,
|
||||||
|
'background_color': pos_floor.background_color,
|
||||||
|
'table_ids': [],
|
||||||
|
'sequence': pos_floor.sequence,
|
||||||
|
'tables': [],
|
||||||
|
}
|
||||||
|
|
||||||
|
def deactivate_floor(self, session_id):
|
||||||
|
draft_orders = self.env['pos.order'].search([('session_id', '=', session_id), ('state', '=', 'draft'), ('table_id.floor_id', '=', self.id)])
|
||||||
|
if draft_orders:
|
||||||
|
raise UserError(_("You cannot delete a floor when orders are still in draft for this floor."))
|
||||||
|
for table in self.table_ids:
|
||||||
|
table.active = False
|
||||||
|
self.active = False
|
||||||
|
|
||||||
|
class RestaurantTable(models.Model):
|
||||||
|
|
||||||
|
_name = 'restaurant.table'
|
||||||
|
_description = 'Restaurant Table'
|
||||||
|
|
||||||
|
name = fields.Char('Table Name', required=True, help='An internal identification of a table')
|
||||||
|
floor_id = fields.Many2one('restaurant.floor', string='Floor')
|
||||||
|
shape = fields.Selection([('square', 'Square'), ('round', 'Round')], string='Shape', required=True, default='square')
|
||||||
|
position_h = fields.Float('Horizontal Position', default=10,
|
||||||
|
help="The table's horizontal position from the left side to the table's center, in pixels")
|
||||||
|
position_v = fields.Float('Vertical Position', default=10,
|
||||||
|
help="The table's vertical position from the top to the table's center, in pixels")
|
||||||
|
width = fields.Float('Width', default=50, help="The table's width in pixels")
|
||||||
|
height = fields.Float('Height', default=50, help="The table's height in pixels")
|
||||||
|
seats = fields.Integer('Seats', default=1, help="The default number of customer served at this table.")
|
||||||
|
color = fields.Char('Color', help="The table's color, expressed as a valid 'background' CSS property value", default="#35D374")
|
||||||
|
active = fields.Boolean('Active', default=True, help='If false, the table is deactivated and will not be available in the point of sale')
|
||||||
|
|
||||||
|
def are_orders_still_in_draft(self):
|
||||||
|
draft_orders_count = self.env['pos.order'].search_count([('table_id', 'in', self.ids), ('state', '=', 'draft')])
|
||||||
|
return draft_orders_count > 0
|
||||||
|
|
||||||
|
@api.ondelete(at_uninstall=False)
|
||||||
|
def _unlink_except_active_pos_session(self):
|
||||||
|
confs = self.mapped('floor_id.pos_config_ids').filtered(lambda c: c.module_pos_restaurant)
|
||||||
|
opened_session = self.env['pos.session'].search([('config_id', 'in', confs.ids), ('state', '!=', 'closed')])
|
||||||
|
if opened_session:
|
||||||
|
error_msg = _("You cannot remove a table that is used in a PoS session, close the session(s) first.")
|
||||||
|
if confs:
|
||||||
|
raise UserError(error_msg)
|
103
models/pos_session.py
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||||
|
|
||||||
|
from odoo import models, Command, api
|
||||||
|
from odoo.tools import convert
|
||||||
|
from itertools import groupby
|
||||||
|
from odoo.osv.expression import AND
|
||||||
|
import json
|
||||||
|
|
||||||
|
class PosSession(models.Model):
|
||||||
|
_inherit = 'pos.session'
|
||||||
|
|
||||||
|
def _pos_ui_models_to_load(self):
|
||||||
|
result = super()._pos_ui_models_to_load()
|
||||||
|
if self.config_id.module_pos_restaurant:
|
||||||
|
result.append('restaurant.floor')
|
||||||
|
return result
|
||||||
|
|
||||||
|
def _loader_params_restaurant_floor(self):
|
||||||
|
return {
|
||||||
|
'search_params': {
|
||||||
|
'domain': [('pos_config_ids', '=', self.config_id.id)],
|
||||||
|
'fields': ['name', 'background_color', 'table_ids', 'sequence'],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
def _loader_params_restaurant_table(self):
|
||||||
|
return {
|
||||||
|
'search_params': {
|
||||||
|
'domain': [('active', '=', True)],
|
||||||
|
'fields': [
|
||||||
|
'name', 'width', 'height', 'position_h', 'position_v',
|
||||||
|
'shape', 'floor_id', 'color', 'seats', 'active'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
def _get_pos_ui_restaurant_floor(self, params):
|
||||||
|
floors = self.env['restaurant.floor'].search_read(**params['search_params'])
|
||||||
|
floor_ids = [floor['id'] for floor in floors]
|
||||||
|
|
||||||
|
table_params = self._loader_params_restaurant_table()
|
||||||
|
table_params['search_params']['domain'] = AND([table_params['search_params']['domain'], [('floor_id', 'in', floor_ids)]])
|
||||||
|
tables = self.env['restaurant.table'].search(table_params['search_params']['domain'], order='floor_id')
|
||||||
|
tables_by_floor_id = {}
|
||||||
|
for floor_id, table_group in groupby(tables, key=lambda table: table.floor_id):
|
||||||
|
floor_tables = self.env['restaurant.table'].concat(*table_group)
|
||||||
|
tables_by_floor_id[floor_id.id] = floor_tables.read(table_params['search_params']['fields'])
|
||||||
|
|
||||||
|
for floor in floors:
|
||||||
|
floor['tables'] = tables_by_floor_id.get(floor['id'], [])
|
||||||
|
|
||||||
|
return floors
|
||||||
|
|
||||||
|
def get_pos_ui_restaurant_floor(self):
|
||||||
|
return self._get_pos_ui_restaurant_floor(self._loader_params_restaurant_floor())
|
||||||
|
|
||||||
|
def get_onboarding_data(self):
|
||||||
|
results = super().get_onboarding_data()
|
||||||
|
if self.config_id.module_pos_restaurant:
|
||||||
|
results.update({
|
||||||
|
'restaurant.floor': self._load_model('restaurant.floor'),
|
||||||
|
})
|
||||||
|
return results
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _load_onboarding_data(self):
|
||||||
|
super()._load_onboarding_data()
|
||||||
|
convert.convert_file(self.env, 'pos_restaurant', 'data/pos_restaurant_onboarding.xml', None, mode='init', kind='data')
|
||||||
|
restaurant_config = self.env.ref('pos_restaurant.pos_config_main_restaurant', raise_if_not_found=False)
|
||||||
|
if restaurant_config:
|
||||||
|
convert.convert_file(self.env, 'pos_restaurant', 'data/pos_restaurant_onboarding_main_config.xml', None, mode='init', kind='data')
|
||||||
|
if len(restaurant_config.session_ids.filtered(lambda s: s.state == 'opened')) == 0:
|
||||||
|
self.env['pos.session'].create({
|
||||||
|
'config_id': restaurant_config.id,
|
||||||
|
'user_id': self.env.ref('base.user_admin').id,
|
||||||
|
})
|
||||||
|
convert.convert_file(self.env, 'pos_restaurant', 'data/pos_restaurant_onboarding_open_session.xml', None, mode='init', kind='data')
|
||||||
|
|
||||||
|
def _after_load_onboarding_data(self):
|
||||||
|
super()._after_load_onboarding_data()
|
||||||
|
configs = self.config_id.filtered('module_pos_restaurant')
|
||||||
|
if configs:
|
||||||
|
configs.with_context(bypass_categories_forbidden_change=True).write({
|
||||||
|
'limit_categories': True,
|
||||||
|
'iface_available_categ_ids': [Command.link(self.env.ref('pos_restaurant.food').id), Command.link(self.env.ref('pos_restaurant.drinks').id)]
|
||||||
|
})
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _set_last_order_preparation_change(self, order_ids):
|
||||||
|
for order_id in order_ids:
|
||||||
|
order = self.env['pos.order'].browse(order_id)
|
||||||
|
last_order_preparation_change = {}
|
||||||
|
for orderline in order['lines']:
|
||||||
|
last_order_preparation_change[orderline.uuid + " - "] = {
|
||||||
|
"line_uuid": orderline.uuid,
|
||||||
|
"name": orderline.full_product_name,
|
||||||
|
"note": "",
|
||||||
|
"product_id": orderline.product_id.id,
|
||||||
|
"quantity": orderline.qty,
|
||||||
|
"attribute_value_ids": orderline.attribute_value_ids.ids,
|
||||||
|
}
|
||||||
|
order.write({'last_order_preparation_change': json.dumps(last_order_preparation_change)})
|
38
models/res_config_settings.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import fields, models, api
|
||||||
|
|
||||||
|
|
||||||
|
class ResConfigSettings(models.TransientModel):
|
||||||
|
_inherit = 'res.config.settings'
|
||||||
|
|
||||||
|
pos_floor_ids = fields.Many2many(related='pos_config_id.floor_ids', readonly=False)
|
||||||
|
pos_iface_orderline_notes = fields.Boolean(compute='_compute_pos_module_pos_restaurant', store=True, readonly=False)
|
||||||
|
pos_iface_printbill = fields.Boolean(compute='_compute_pos_module_pos_restaurant', store=True, readonly=False)
|
||||||
|
pos_iface_splitbill = fields.Boolean(compute='_compute_pos_module_pos_restaurant', store=True, readonly=False)
|
||||||
|
pos_set_tip_after_payment = fields.Boolean(compute='_compute_pos_set_tip_after_payment', store=True, readonly=False)
|
||||||
|
pos_module_pos_restaurant_appointment = fields.Boolean(related="pos_config_id.module_pos_restaurant_appointment", readonly=False)
|
||||||
|
|
||||||
|
@api.depends('pos_module_pos_restaurant', 'pos_config_id')
|
||||||
|
def _compute_pos_module_pos_restaurant(self):
|
||||||
|
for res_config in self:
|
||||||
|
if not res_config.pos_module_pos_restaurant:
|
||||||
|
res_config.update({
|
||||||
|
'pos_iface_orderline_notes': False,
|
||||||
|
'pos_iface_printbill': False,
|
||||||
|
'pos_iface_splitbill': False,
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
res_config.update({
|
||||||
|
'pos_iface_orderline_notes': res_config.pos_config_id.iface_orderline_notes,
|
||||||
|
'pos_iface_printbill': res_config.pos_config_id.iface_printbill,
|
||||||
|
'pos_iface_splitbill': res_config.pos_config_id.iface_splitbill,
|
||||||
|
})
|
||||||
|
|
||||||
|
@api.depends('pos_iface_tipproduct', 'pos_config_id')
|
||||||
|
def _compute_pos_set_tip_after_payment(self):
|
||||||
|
for res_config in self:
|
||||||
|
if res_config.pos_iface_tipproduct:
|
||||||
|
res_config.pos_set_tip_after_payment = res_config.pos_config_id.set_tip_after_payment
|
||||||
|
else:
|
||||||
|
res_config.pos_set_tip_after_payment = False
|
5
security/ir.model.access.csv
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
|
access_restaurant_floor,restaurant.floor.user,model_restaurant_floor,point_of_sale.group_pos_user,1,0,0,0
|
||||||
|
access_restaurant_floor_manager,restaurant.floor.manager,model_restaurant_floor,point_of_sale.group_pos_manager,1,1,1,1
|
||||||
|
access_restaurant_table,restaurant.table.user,model_restaurant_table,point_of_sale.group_pos_user,1,0,0,0
|
||||||
|
access_restaurant_table_manager,restaurant.table.manager,model_restaurant_table,point_of_sale.group_pos_manager,1,1,1,1
|
|
BIN
static/description/icon.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
1
static/description/icon.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="50" height="50" viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg"><circle cx="25" cy="25.001" r="17" fill="#985184"/><path d="m42.586 15.587-8.172-8.172c-1.26-1.26-.367-3.414 1.414-3.414H42a4 4 0 0 1 4 4v6.171c0 1.782-2.154 2.675-3.414 1.415ZM7.414 34.415l8.172 8.172c1.26 1.26.367 3.414-1.414 3.414H8a4 4 0 0 1-4-4v-6.172c0-1.781 2.154-2.674 3.414-1.414Zm27 8.172 8.172-8.172c1.26-1.26 3.414-.367 3.414 1.414v6.172a4 4 0 0 1-4 4h-6.172c-1.781 0-2.674-2.154-1.414-3.414ZM15.586 7.415l-8.172 8.172C6.154 16.847 4 15.954 4 14.172v-6.17a4 4 0 0 1 4-4h6.172c1.781 0 2.674 2.154 1.414 3.414Z" fill="#FBB945"/></svg>
|
After Width: | Height: | Size: 628 B |
BIN
static/img/combo-hamb.jpg
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
static/img/drink_category.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
static/img/food_category.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
static/img/th-burger.jpg
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
static/img/th-cheeseburger.jpg
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
static/img/th-club.jpg
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
static/img/th-coke.jpg
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
static/img/th-espresso.jpg
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
static/img/th-fanta.jpg
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
static/img/th-green_tea.jpg
Normal file
After Width: | Height: | Size: 51 KiB |
BIN
static/img/th-ice_tea.jpg
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
static/img/th-maki.jpg
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
static/img/th-milkshake_banana.jpg
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
static/img/th-minute_maid.jpg
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
static/img/th-mozza.jpg
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
static/img/th-pasta-4f.jpg
Normal file
After Width: | Height: | Size: 51 KiB |
BIN
static/img/th-pasta.jpg
Normal file
After Width: | Height: | Size: 60 KiB |