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
odoo/odoo:
- web
- bus
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 IDNameModelTypeStatus
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)HandlerAuthTypeMethodsFlags
/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)
  • active Boolean
    default=True args: 'Active'
  • available_today Boolean
    compute='_compute_available_today' search='_search_available_today' args: 'Is Displayed Today'
  • cron_id Many2one → ir.cron
    ondelete='cascade' readonly=True required=True args: 'ir.cron'
  • fri Boolean
    default=True
  • location_ids Many2many → lunch.location
    string='Location' args: 'lunch.location'
  • message Html
    required=True translate=True args: 'Message'
  • mode Selection
    default='alert' string='Display' args: [('alert', 'Alert in app'), ('chat', 'Chat notification')]
  • mon Boolean
    default=True
  • name Char
    required=True translate=True args: 'Alert Name'
  • notification_moment Selection
    default='am' required=True args: [('am', 'AM'), ('pm', 'PM')]
  • notification_time Float
    default=10.0 string='Notification Time'
  • recipients Selection
    default='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')]
  • sat Boolean
    default=True
  • sun Boolean
    default=True
  • thu Boolean
    default=True
  • tue Boolean
    default=True
  • tz Selection
    default=<expr> required=True string='Timezone' args: _tz_get
  • until Date
    args: 'Show Until'
  • wed Boolean
    default=True
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (5)
  • amount Float
    required=True args: 'Amount'
  • currency_id Many2one → res.currency
    default=<expr> required=True args: 'res.currency'
  • date Date
    default=fields.Date.context_today required=True args: 'Date'
  • description Text
    args: 'Description'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
Public methods (1)
  • get_wallet_balance(self, user, include_config=True)
    @api.model

New fields (6)
  • amount Float
    args: 'Amount'
  • currency_id Many2one → res.currency
    string='Currency' args: 'res.currency'
  • date Date
    args: 'Date'
  • description Text
    args: 'Description'
  • id Id
    string='ID'
  • user_id Many2one → res.users
    string='User' args: 'res.users'
Public methods (1)
  • init(self)

New fields (3)
  • address Text
    args: 'Address'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company'
  • name Char
    required=True args: 'Location Name'
Public methods (0)

No public methods.

New fields (36)
  • active Boolean
    default=True args: 'Active'
  • available_on_date Boolean
    compute='_compute_available_on_date'
  • available_today Boolean
    related='supplier_id.available_today'
  • available_toppings_1 Boolean
    compute='_compute_available_toppings' help='Are extras available for this product'
  • available_toppings_2 Boolean
    compute='_compute_available_toppings' help='Are extras available for this product'
  • available_toppings_3 Boolean
    compute='_compute_available_toppings' help='Are extras available for this product'
  • category_id Many2one
    related='product_id.category_id' store=True string='Product Category'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company'
  • currency_id Many2one
    related='company_id.currency_id' store=True
  • date Date
    default=fields.Date.context_today readonly=False required=True args: 'Order Date'
  • display_add_button Boolean
    compute='_compute_display_add_button'
  • display_reorder_button Boolean
    compute='_compute_display_reorder_button'
  • display_toppings Text
    compute='_compute_display_toppings' store=True args: 'Extras'
  • image_128 Image
    compute='_compute_product_images'
  • image_1920 Image
    compute='_compute_product_images'
  • lunch_location_id Many2one → lunch.location
    default=<expr> args: 'lunch.location'
  • name Char
    readonly=True related='product_id.name' string='Product Name'
  • note Text
    args: 'Notes'
  • notified Boolean
    default=False
  • order_deadline_passed Boolean
    compute='_compute_order_deadline_passed'
  • price Monetary
    compute='_compute_total_price' readonly=True store=True args: 'Total Price'
  • product_description Html
    related='product_id.description' args: 'Description'
  • product_id Many2one → lunch.product
    required=True string='Product' args: 'lunch.product'
  • quantity Float
    default=1 required=True args: 'Quantity'
  • state Selection
    default='new' index=True readonly=True args: [('new', 'To Order'), ('ordered', 'Ordered'), ('sent', 'Sent'), ('confirmed', 'Received'), ('cancelled', 'Cancelled')], 'Status'
  • supplier_id Many2one
    index=True related='product_id.supplier_id' store=True string='Vendor'
  • topping_ids_1 Many2many → lunch.topping
    domain=[('topping_category', '=', 1)] string='Extras 1' args: 'lunch.topping', 'lunch_order_topping', 'order_id', 'topping_id'
  • topping_ids_2 Many2many → lunch.topping
    domain=[('topping_category', '=', 2)] string='Extras 2' args: 'lunch.topping', 'lunch_order_topping', 'order_id', 'topping_id'
  • topping_ids_3 Many2many → lunch.topping
    domain=[('topping_category', '=', 3)] string='Extras 3' args: 'lunch.topping', 'lunch_order_topping', 'order_id', 'topping_id'
  • topping_label_1 Char
    related='product_id.supplier_id.topping_label_1'
  • topping_label_2 Char
    related='product_id.supplier_id.topping_label_2'
  • topping_label_3 Char
    related='product_id.supplier_id.topping_label_3'
  • topping_quantity_1 Selection
    related='product_id.supplier_id.topping_quantity_1'
  • topping_quantity_2 Selection
    related='product_id.supplier_id.topping_quantity_2'
  • topping_quantity_3 Selection
    related='product_id.supplier_id.topping_quantity_3'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
Public methods (11)
  • 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)
  • active Boolean
    default=True
  • category_id Many2one → lunch.product.category
    check_company=True required=True args: 'lunch.product.category', 'Product Category'
  • company_id Many2one → res.company
    readonly=False related='supplier_id.company_id' store=True args: 'res.company'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' args: 'res.currency'
  • description Html
    translate=True args: 'Description'
  • favorite_user_ids Many2many → res.users
    check_company=True args: 'res.users', 'lunch_product_favorite_user_rel', 'product_id', 'user_id'
  • is_available_at Many2one → lunch.location
    compute='_compute_is_available_at' search='_search_is_available_at' args: 'lunch.location', 'Product Availability'
  • is_favorite Boolean
    compute='_compute_is_favorite' inverse='_inverse_is_favorite'
  • is_new Boolean
    compute='_compute_is_new'
  • last_order_date Date
    compute='_compute_last_order_date'
  • name Char
    required=True translate=True args: 'Product Name'
  • new_until Date
    args: 'New Until'
  • price Float
    digits='Account' required=True args: 'Price'
  • product_image Image
    compute='_compute_product_image'
  • supplier_id Many2one → lunch.supplier
    check_company=True required=True args: 'lunch.supplier', 'Vendor'
Public methods (1)
  • write(self, vals)

New fields (6)
  • active Boolean
    default=True string='Active'
  • company_id Many2one → res.company
    args: 'res.company'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' args: 'res.currency'
  • image_1920 Image
    default=_default_image
  • name Char
    required=True translate=True args: 'Product Category'
  • product_count Integer
    compute='_compute_product_count' help='The number of products related to this category'
Public methods (2)
  • action_archive(self)
  • action_unarchive(self)

New fields (42)
  • active Boolean
    default=True
  • automatic_email_time Float
    default=12.0 required=True args: 'Order Time'
  • available_location_ids Many2many → lunch.location
    string='Location' args: 'lunch.location'
  • available_today Boolean
    compute='_compute_available_today' search='_search_available_today' args: 'This is True when if the supplier is available today'
  • city Char
    readonly=False related='partner_id.city'
  • company_id Many2one → res.company
    readonly=False related='partner_id.company_id' store=True args: 'res.company'
  • country_id Many2one → res.country
    readonly=False related='partner_id.country_id' args: 'res.country'
  • cron_id Many2one → ir.cron
    ondelete='cascade' readonly=True required=True args: 'ir.cron'
  • delivery Selection
    default='no_delivery' args: [('delivery', 'Delivery'), ('no_delivery', 'No Delivery')]
  • email Char
    readonly=False related='partner_id.email'
  • email_formatted Char
    readonly=True related='partner_id.email_formatted'
  • fri Boolean
    default=True
  • moment Selection
    default='am' required=True args: [('am', 'AM'), ('pm', 'PM')]
  • mon Boolean
    default=True
  • name Char
    readonly=False related='partner_id.name' args: 'Name'
  • order_deadline_passed Boolean
    compute='_compute_order_deadline_passed'
  • partner_id Many2one → res.partner
    required=True string='Vendor' args: 'res.partner'
  • phone Char
    readonly=False related='partner_id.phone'
  • recurrency_end_date Date
    help='This field is used in order to ' args: 'Until'
  • responsible_id Many2one → res.users
    default=<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'
  • sat Boolean
  • send_by Selection
    default='phone' args: [('phone', 'Phone'), ('mail', 'Email')], 'Send Order By'
  • show_confirm_button Boolean
    compute='_compute_buttons'
  • show_order_button Boolean
    compute='_compute_buttons'
  • state_id Many2one → res.country.state
    readonly=False related='partner_id.state_id' args: 'res.country.state'
  • street Char
    readonly=False related='partner_id.street'
  • street2 Char
    readonly=False related='partner_id.street2'
  • sun Boolean
  • thu Boolean
    default=True
  • topping_ids_1 One2many → lunch.topping
    domain=[('topping_category', '=', 1)] args: 'lunch.topping', 'supplier_id'
  • topping_ids_2 One2many → lunch.topping
    domain=[('topping_category', '=', 2)] args: 'lunch.topping', 'supplier_id'
  • topping_ids_3 One2many → lunch.topping
    domain=[('topping_category', '=', 3)] args: 'lunch.topping', 'supplier_id'
  • topping_label_1 Char
    default='Extras' required=True args: 'Extra 1 Label'
  • topping_label_2 Char
    default='Beverages' required=True args: 'Extra 2 Label'
  • topping_label_3 Char
    default='Extra Label 3' required=True args: 'Extra 3 Label'
  • topping_quantity_1 Selection
    default='0_more' required=True args: [('0_more', 'None or More'), ('1_more', 'One or More'), ('1', 'Only One')], 'Extra 1 Quantity'
  • topping_quantity_2 Selection
    default='0_more' required=True args: [('0_more', 'None or More'), ('1_more', 'One or More'), ('1', 'Only One')], 'Extra 2 Quantity'
  • topping_quantity_3 Selection
    default='0_more' required=True args: [('0_more', 'None or More'), ('1_more', 'One or More'), ('1', 'Only One')], 'Extra 3 Quantity'
  • tue Boolean
    default=True
  • tz Selection
    default=<expr> required=True string='Timezone' args: _tz_get
  • wed Boolean
    default=True
  • zip_code Char
    readonly=False related='partner_id.zip'
Public methods (5)
  • 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_id Many2one → res.company
    default=<expr> args: 'res.company'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' args: 'res.currency'
  • name Char
    required=True args: 'Name'
  • price Monetary
    required=True args: 'Price'
  • supplier_id Many2one → lunch.supplier
    index='btree_not_null' ondelete='cascade' args: 'lunch.supplier'
  • topping_category Integer
    default=1 required=True args: 'Topping Category'
Public methods (0)

No public methods.

New fields (2)
  • lunch_minimum_threshold Float
  • lunch_notify_message Html
    default='Your lunch has been delivered.\nEnjoy your meal!' translate=True
Public methods (0)

No public methods.

New fields (3)
  • company_lunch_minimum_threshold Float
    readonly=False related='company_id.lunch_minimum_threshold' string='Maximum Allowed Overdraft'
  • company_lunch_notify_message Html
    readonly=False related='company_id.lunch_notify_message' string='Lunch notification message'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' args: 'res.currency'
Public methods (0)

No public methods.

New fields (2)
  • favorite_lunch_product_ids Many2many → lunch.product
    copy=False groups='lunch.group_lunch_user' args: 'lunch.product', 'lunch_product_favorite_user_rel', 'user_id', 'product_id'
  • last_lunch_location_id Many2one → lunch.location
    copy=False groups='lunch.group_lunch_user' args: 'lunch.location'
Public methods (0)

No public methods.

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…

Loading…