TIP: You can type at any time to perform a new search.
Lunch
lunch · odoo/odoo
- Repository
- odoo/odoo · module folder
- Module version
- 1.0
- Category
- Human Resources/Lunch
- Folder size
- 5.81 MB
- License
- LGPL-3
- Application
- Yes
- Auto-installable
- No
- Website
- None
- Last tracking update
- 2026-08-15 22:44:21
- Authors
- Odoo S.A.
- Maintainers
- Odoo S.A.
- Committers
- Xavier Morel, Raphael Collet, Thibault Delavallée, Odoo Translation Bot, Aaron Bohy, Yannick Tivisse, Alexandre Kühn, Julien Castiaux, Julien Mougenot, Prakash Prajapati, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, William Braeckman, luvi, Louis Wicket (wil), alsh-odoo, Victor Piryns (pivi), Dylan Kiss (dyki), omra-odoo, Mélanie, mano-odoo, Shaan Thakkar (THSH), Pierre Pulinckx (PIPU), Pierre Pulinckx, Bastien PIERRE, Vincent Sevestre, Krzysztof Magusiak (krma), pajo, Elliot ELCO, saurabh, chpa-odoo
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- None
- Description
The base module to manage lunch. ================================ Many companies order sandwiches, pizzas and other, from usual vendors, for their employees to offer them more facilities. However lunches management within the company requires proper administration especially when the number of employees or vendors is important. The “Lunch Order” module has been developed to make this management easier but also to offer employees more tools and usability. In addition to a full meal and vendor management, this module offers the possibility to display warning and provides quick order selection based on employee’s preferences. If you want to save your employees' time and avoid them to always have coins in their pockets, this module is essential.
Code Analysis ⓘ
Views touched (40)
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
lunch_alert_view_form |
lunch.alert.form | lunch.alert | form | New |
lunch_alert_view_kanban |
lunch.alert.kanban | lunch.alert | kanban | New |
lunch_alert_view_search |
lunch.alert.search | lunch.alert | search | New |
lunch_alert_view_tree |
lunch.alert.list | lunch.alert | list | New |
lunch_cashmove_report_view_form |
lunch.cashmove.report.form | lunch.cashmove.report | form | New |
lunch_cashmove_report_view_search |
lunch.cashmove.report.search | lunch.cashmove.report | search | New |
lunch_cashmove_report_view_search_2 |
lunch.cashmove.report.search | lunch.cashmove.report | search | New |
lunch_cashmove_report_view_tree |
lunch.cashmove.report.list | lunch.cashmove.report | list | New |
lunch_cashmove_report_view_tree_2 |
lunch.cashmove.report.list | lunch.cashmove.report | list | New |
lunch_cashmove_view_form |
lunch.cashmove.form | lunch.cashmove | form | New |
lunch_cashmove_view_search |
lunch.cashmove.search | lunch.cashmove | search | New |
lunch_cashmove_view_tree |
lunch.cashmove.list | lunch.cashmove | list | New |
lunch_location_form_view |
lunch.location.view.form | lunch.location | form | New |
lunch_location_kanban_view |
lunch.location.view.kanban | lunch.location | kanban | New |
lunch_location_tree_view |
lunch.location.view.form | lunch.location | list | New |
lunch_location_view_search |
lunch.location.view.search | lunch.location | search | New |
lunch_order_view_form |
lunch.order.view.form | lunch.order | form | New |
lunch_order_view_graph |
lunch.order.graph | lunch.order | graph | New |
lunch_order_view_kanban |
lunch.order.kanban | lunch.order | kanban | New |
lunch_order_view_pivot |
lunch.order.pivot | lunch.order | pivot | New |
lunch_order_view_search |
lunch.order.search | lunch.order | search | New |
lunch_order_view_tree |
lunch.order.list | lunch.order | list | New |
lunch_payment_dialog |
Lunch Payment Dialog | ir.ui.view | qweb | New |
lunch_product_category_view_form |
Product category Form | lunch.product.category | form | New |
lunch_product_category_view_kanban |
Product category Kanban | lunch.product.category | kanban | New |
lunch_product_category_view_search |
lunch.product.category.search | lunch.product.category | search | New |
lunch_product_category_view_tree |
Product category List | lunch.product.category | list | New |
lunch_product_view_form |
lunch.product.form | lunch.product | form | New |
lunch_product_view_search |
lunch.product.search | lunch.product | search | New |
lunch_product_view_tree |
lunch.product.list | lunch.product | list | New |
lunch_product_view_tree_order |
lunch.product.list.order | lunch.product | list | Inherits lunch_product_view_tree |
lunch_supplier_view_form |
lunch.supplier.view.form | lunch.supplier | form | New |
lunch_supplier_view_kanban |
lunch.supplier.view.kanban | lunch.supplier | kanban | New |
lunch_supplier_view_search |
lunch.supplier.view.search | lunch.supplier | search | New |
lunch_supplier_view_tree |
lunch.supplier.view.list | lunch.supplier | list | New |
res_config_settings_view_form |
res.config.settings.view.form.inherit.lunch | res.config.settings | form | Inherits base.res_config_settings_view_form |
view_lunch_cashmove_kanban |
lunch.cashmove.kanban | lunch.cashmove | kanban | New |
view_lunch_cashmove_report_kanban |
lunch.cashmove.report.kanban | lunch.cashmove.report | kanban | New |
view_lunch_product_kanban |
lunch.product.kanban | lunch.product | kanban | New |
view_lunch_product_kanban_order |
lunch.product.kanban | lunch.product | kanban | New |
HTTP endpoints (6)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/lunch/user_location_get |
LunchController.get_user_location |
user | jsonrpc | ALL | |
/lunch/infos |
LunchController.infos |
user | jsonrpc | ALL | |
/lunch/pay |
LunchController.pay |
user | jsonrpc | ALL | |
/lunch/payment_message |
LunchController.payment_message |
user | jsonrpc | ALL | |
/lunch/user_location_set |
LunchController.set_user_location |
user | jsonrpc | ALL | sudo |
/lunch/trash |
LunchController.trash |
user | jsonrpc | ALL |
Models touched (12)
New fields (19)
-
activeBooleandefault=True args: 'Active' -
available_todayBooleancompute='_compute_available_today'search='_search_available_today' args: 'Is Displayed Today' -
cron_idMany2one → ir.cronondelete='cascade'readonly=Truerequired=True args: 'ir.cron' -
friBooleandefault=True -
location_idsMany2many → lunch.locationstring='Location' args: 'lunch.location' -
messageHtmlrequired=Truetranslate=True args: 'Message' -
modeSelectiondefault='alert'string='Display' args: [('alert', 'Alert in app'), ('chat', 'Chat notification')] -
monBooleandefault=True -
nameCharrequired=Truetranslate=True args: 'Alert Name' -
notification_momentSelectiondefault='am'required=True args: [('am', 'AM'), ('pm', 'PM')] -
notification_timeFloatdefault=10.0string='Notification Time' -
recipientsSelectiondefault='everyone'string='Recipients' args: [('everyone', 'Everyone'), ('last_week', 'Employee who ordered last week'), ('last_month', 'Employee who ordered last month'), ('last_year', 'Employee who ordered last year')] -
satBooleandefault=True -
sunBooleandefault=True -
thuBooleandefault=True -
tueBooleandefault=True -
tzSelectiondefault=<expr>required=Truestring='Timezone' args: _tz_get -
untilDateargs: 'Show Until' -
wedBooleandefault=True
-
create(self, vals_list)@api.model_create_multi -
unlink(self) -
write(self, vals)
New fields (5)
-
amountFloatrequired=True args: 'Amount' -
currency_idMany2one → res.currencydefault=<expr>required=True args: 'res.currency' -
dateDatedefault=fields.Date.context_todayrequired=True args: 'Date' -
descriptionTextargs: 'Description' -
user_idMany2one → res.usersdefault=<expr> args: 'res.users', 'User'
-
get_wallet_balance(self, user, include_config=True)@api.model
New fields (6)
-
amountFloatargs: 'Amount' -
currency_idMany2one → res.currencystring='Currency' args: 'res.currency' -
dateDateargs: 'Date' -
descriptionTextargs: 'Description' -
idIdstring='ID' -
user_idMany2one → res.usersstring='User' args: 'res.users'
-
init(self)
New fields (3)
-
addressTextargs: 'Address' -
company_idMany2one → res.companydefault=<expr> args: 'res.company' -
nameCharrequired=True args: 'Location Name'
No public methods.
New fields (36)
-
activeBooleandefault=True args: 'Active' -
available_on_dateBooleancompute='_compute_available_on_date' -
available_todayBooleanrelated='supplier_id.available_today' -
available_toppings_1Booleancompute='_compute_available_toppings'help='Are extras available for this product' -
available_toppings_2Booleancompute='_compute_available_toppings'help='Are extras available for this product' -
available_toppings_3Booleancompute='_compute_available_toppings'help='Are extras available for this product' -
category_idMany2onerelated='product_id.category_id'store=Truestring='Product Category' -
company_idMany2one → res.companydefault=<expr> args: 'res.company' -
currency_idMany2onerelated='company_id.currency_id'store=True -
dateDatedefault=fields.Date.context_todayreadonly=Falserequired=True args: 'Order Date' -
display_add_buttonBooleancompute='_compute_display_add_button' -
display_reorder_buttonBooleancompute='_compute_display_reorder_button' -
display_toppingsTextcompute='_compute_display_toppings'store=True args: 'Extras' -
image_128Imagecompute='_compute_product_images' -
image_1920Imagecompute='_compute_product_images' -
lunch_location_idMany2one → lunch.locationdefault=<expr> args: 'lunch.location' -
nameCharreadonly=Truerelated='product_id.name'string='Product Name' -
noteTextargs: 'Notes' -
notifiedBooleandefault=False -
order_deadline_passedBooleancompute='_compute_order_deadline_passed' -
priceMonetarycompute='_compute_total_price'readonly=Truestore=True args: 'Total Price' -
product_descriptionHtmlrelated='product_id.description' args: 'Description' -
product_idMany2one → lunch.productrequired=Truestring='Product' args: 'lunch.product' -
quantityFloatdefault=1required=True args: 'Quantity' -
stateSelectiondefault='new'index=Truereadonly=True args: [('new', 'To Order'), ('ordered', 'Ordered'), ('sent', 'Sent'), ('confirmed', 'Received'), ('cancelled', 'Cancelled')], 'Status' -
supplier_idMany2oneindex=Truerelated='product_id.supplier_id'store=Truestring='Vendor' -
topping_ids_1Many2many → lunch.toppingdomain=[('topping_category', '=', 1)]string='Extras 1' args: 'lunch.topping', 'lunch_order_topping', 'order_id', 'topping_id' -
topping_ids_2Many2many → lunch.toppingdomain=[('topping_category', '=', 2)]string='Extras 2' args: 'lunch.topping', 'lunch_order_topping', 'order_id', 'topping_id' -
topping_ids_3Many2many → lunch.toppingdomain=[('topping_category', '=', 3)]string='Extras 3' args: 'lunch.topping', 'lunch_order_topping', 'order_id', 'topping_id' -
topping_label_1Charrelated='product_id.supplier_id.topping_label_1' -
topping_label_2Charrelated='product_id.supplier_id.topping_label_2' -
topping_label_3Charrelated='product_id.supplier_id.topping_label_3' -
topping_quantity_1Selectionrelated='product_id.supplier_id.topping_quantity_1' -
topping_quantity_2Selectionrelated='product_id.supplier_id.topping_quantity_2' -
topping_quantity_3Selectionrelated='product_id.supplier_id.topping_quantity_3' -
user_idMany2one → res.usersdefault=<expr> args: 'res.users', 'User'
-
action_cancel(self) -
action_confirm(self) -
action_notify(self) -
action_order(self) -
action_reorder(self) -
action_reset(self) -
action_send(self) -
add_to_cart(self)This method currently does nothing, we currently need it in order to be able to reuse this model in place of a wizard -
create(self, vals_list)@api.model_create_multi -
update_quantity(self, increment) -
write(self, vals)
New fields (15)
-
activeBooleandefault=True -
category_idMany2one → lunch.product.categorycheck_company=Truerequired=True args: 'lunch.product.category', 'Product Category' -
company_idMany2one → res.companyreadonly=Falserelated='supplier_id.company_id'store=True args: 'res.company' -
currency_idMany2one → res.currencyrelated='company_id.currency_id' args: 'res.currency' -
descriptionHtmltranslate=True args: 'Description' -
favorite_user_idsMany2many → res.userscheck_company=True args: 'res.users', 'lunch_product_favorite_user_rel', 'product_id', 'user_id' -
is_available_atMany2one → lunch.locationcompute='_compute_is_available_at'search='_search_is_available_at' args: 'lunch.location', 'Product Availability' -
is_favoriteBooleancompute='_compute_is_favorite'inverse='_inverse_is_favorite' -
is_newBooleancompute='_compute_is_new' -
last_order_dateDatecompute='_compute_last_order_date' -
nameCharrequired=Truetranslate=True args: 'Product Name' -
new_untilDateargs: 'New Until' -
priceFloatdigits='Account'required=True args: 'Price' -
product_imageImagecompute='_compute_product_image' -
supplier_idMany2one → lunch.suppliercheck_company=Truerequired=True args: 'lunch.supplier', 'Vendor'
-
write(self, vals)
New fields (6)
-
activeBooleandefault=Truestring='Active' -
company_idMany2one → res.companyargs: 'res.company' -
currency_idMany2one → res.currencyrelated='company_id.currency_id' args: 'res.currency' -
image_1920Imagedefault=_default_image -
nameCharrequired=Truetranslate=True args: 'Product Category' -
product_countIntegercompute='_compute_product_count'help='The number of products related to this category'
-
action_archive(self) -
action_unarchive(self)
New fields (42)
-
activeBooleandefault=True -
automatic_email_timeFloatdefault=12.0required=True args: 'Order Time' -
available_location_idsMany2many → lunch.locationstring='Location' args: 'lunch.location' -
available_todayBooleancompute='_compute_available_today'search='_search_available_today' args: 'This is True when if the supplier is available today' -
cityCharreadonly=Falserelated='partner_id.city' -
company_idMany2one → res.companyreadonly=Falserelated='partner_id.company_id'store=True args: 'res.company' -
country_idMany2one → res.countryreadonly=Falserelated='partner_id.country_id' args: 'res.country' -
cron_idMany2one → ir.cronondelete='cascade'readonly=Truerequired=True args: 'ir.cron' -
deliverySelectiondefault='no_delivery' args: [('delivery', 'Delivery'), ('no_delivery', 'No Delivery')] -
emailCharreadonly=Falserelated='partner_id.email' -
email_formattedCharreadonly=Truerelated='partner_id.email_formatted' -
friBooleandefault=True -
momentSelectiondefault='am'required=True args: [('am', 'AM'), ('pm', 'PM')] -
monBooleandefault=True -
nameCharreadonly=Falserelated='partner_id.name' args: 'Name' -
order_deadline_passedBooleancompute='_compute_order_deadline_passed' -
partner_idMany2one → res.partnerrequired=Truestring='Vendor' args: 'res.partner' -
phoneCharreadonly=Falserelated='partner_id.phone' -
recurrency_end_dateDatehelp='This field is used in order to ' args: 'Until' -
responsible_idMany2one → res.usersdefault=<expr>domain=<expr>help="The responsible is the person that will order lunch for everyone. It will be used as the 'from' when sending the automatic email."string='Responsible' args: 'res.users' -
satBoolean -
send_bySelectiondefault='phone' args: [('phone', 'Phone'), ('mail', 'Email')], 'Send Order By' -
show_confirm_buttonBooleancompute='_compute_buttons' -
show_order_buttonBooleancompute='_compute_buttons' -
state_idMany2one → res.country.statereadonly=Falserelated='partner_id.state_id' args: 'res.country.state' -
streetCharreadonly=Falserelated='partner_id.street' -
street2Charreadonly=Falserelated='partner_id.street2' -
sunBoolean -
thuBooleandefault=True -
topping_ids_1One2many → lunch.toppingdomain=[('topping_category', '=', 1)] args: 'lunch.topping', 'supplier_id' -
topping_ids_2One2many → lunch.toppingdomain=[('topping_category', '=', 2)] args: 'lunch.topping', 'supplier_id' -
topping_ids_3One2many → lunch.toppingdomain=[('topping_category', '=', 3)] args: 'lunch.topping', 'supplier_id' -
topping_label_1Chardefault='Extras'required=True args: 'Extra 1 Label' -
topping_label_2Chardefault='Beverages'required=True args: 'Extra 2 Label' -
topping_label_3Chardefault='Extra Label 3'required=True args: 'Extra 3 Label' -
topping_quantity_1Selectiondefault='0_more'required=True args: [('0_more', 'None or More'), ('1_more', 'One or More'), ('1', 'Only One')], 'Extra 1 Quantity' -
topping_quantity_2Selectiondefault='0_more'required=True args: [('0_more', 'None or More'), ('1_more', 'One or More'), ('1', 'Only One')], 'Extra 2 Quantity' -
topping_quantity_3Selectiondefault='0_more'required=True args: [('0_more', 'None or More'), ('1_more', 'One or More'), ('1', 'Only One')], 'Extra 3 Quantity' -
tueBooleandefault=True -
tzSelectiondefault=<expr>required=Truestring='Timezone' args: _tz_get -
wedBooleandefault=True -
zip_codeCharreadonly=Falserelated='partner_id.zip'
-
action_confirm_orders(self) -
action_send_orders(self) -
create(self, vals_list)@api.model_create_multi -
unlink(self) -
write(self, vals)
New fields (6)
-
company_idMany2one → res.companydefault=<expr> args: 'res.company' -
currency_idMany2one → res.currencyrelated='company_id.currency_id' args: 'res.currency' -
nameCharrequired=True args: 'Name' -
priceMonetaryrequired=True args: 'Price' -
supplier_idMany2one → lunch.supplierindex='btree_not_null'ondelete='cascade' args: 'lunch.supplier' -
topping_categoryIntegerdefault=1required=True args: 'Topping Category'
No public methods.
New fields (2)
-
lunch_minimum_thresholdFloat -
lunch_notify_messageHtmldefault='Your lunch has been delivered.\nEnjoy your meal!'translate=True
No public methods.
New fields (3)
-
company_lunch_minimum_thresholdFloatreadonly=Falserelated='company_id.lunch_minimum_threshold'string='Maximum Allowed Overdraft' -
company_lunch_notify_messageHtmlreadonly=Falserelated='company_id.lunch_notify_message'string='Lunch notification message' -
currency_idMany2one → res.currencyrelated='company_id.currency_id' args: 'res.currency'
No public methods.
New fields (2)
-
favorite_lunch_product_idsMany2many → lunch.productcopy=Falsegroups='lunch.group_lunch_user' args: 'lunch.product', 'lunch_product_favorite_user_rel', 'user_id', 'product_id' -
last_lunch_location_idMany2one → lunch.locationcopy=Falsegroups='lunch.group_lunch_user' args: 'lunch.location'
No public methods.
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…