Lunch

lunch
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/lunch
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources/Lunch
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Xavier Morel, Aaron Bohy, Yannick Tivisse, Alexandre Kühn, Julien Castiaux, Julien Mougenot, Prakash Prajapati, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, William Braeckman, luvi, alsh-odoo, Louis Wicket (wil), 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
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:46
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 xpath 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 xpath 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
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.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/lunch
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources/Lunch
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Christophe Simonis, Aaron Bohy, Odoo Online, Jorge Pinna Puissant, Julien Mougenot, Tiffany Chang (tic), Gorash, William Braeckman, Florian Damhaut, alsh-odoo, Louis Wicket (wil), Victor Piryns (pivi), Mahamadasif Ansari, Dylan Kiss (dyki), Xavier Bol (xbo), omra-odoo, Mélanie, bary, Maryam Kia, reka-odoo, Julien Carion (juca), Tanguy Quéguineur, sami odoo, Louis (wil), mano-odoo, Shaan Thakkar (THSH), Pierre Pulinckx (PIPU), Pierre Pulinckx (pipu), Bastien PIERRE, Vincent Sevestre, pajo, romc-odoo, Feeedeee
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:26:00
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 xpath 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 xpath 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
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, values)

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 Integer
    args: '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 (12)
  • 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
  • init(self)
  • update_quantity(self, increment)
  • write(self, values)

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 (2)
  • toggle_active(self)
  • 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 (1)
  • toggle_active(self)
    Archiving related lunch product

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 (6)
  • action_confirm_orders(self)
  • action_send_orders(self)
  • create(self, vals_list)
    @api.model_create_multi
  • toggle_active(self)
    Archiving related lunch product
  • unlink(self)
  • write(self, values)

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
    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
    args: 'lunch.product', 'lunch_product_favorite_user_rel', 'user_id', 'product_id'
  • last_lunch_location_id Many2one → lunch.location
    args: 'lunch.location'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/lunch
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources/Lunch
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Géry Debongnie, Aaron Bohy, Damien Bouvy, Yannick Tivisse, Odoo Online, Jorge Pinna Puissant, Xavier-Do, Victor Feyens, Samuel Degueldre, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Pierre Paridans, William Braeckman, Kevin Baptiste, Florian Damhaut, Abdelouahab (abla), Hubert Van De Walle, Dossogne Bertrand, Renaud Thiry, niyasraphy, Louis Wicket (wil), althaf shaik, Mahamadasif Ansari, Dylan Kiss (dyki), Bruno Boi, Michael (mcm), Chong Wang (cwg), Brieuc-brd, rajh-odoo, stefanorigano (SRI), ravb-odoo, dasz, Mélanie, bary, reka-odoo, Julien Carion (juca), Tanguy Quéguineur, Chrysanthe (chgo), Louis (wil), Elisabeth Dickinson, Pierre Pulinckx (pipu), Bastien PIERRE
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:11
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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.tree lunch.alert tree 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.tree lunch.cashmove.report tree New
lunch_cashmove_report_view_tree_2 lunch.cashmove.report.tree lunch.cashmove.report tree 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.tree lunch.cashmove tree 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 tree 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.tree lunch.order tree 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 Tree lunch.product.category tree 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.tree lunch.product tree New
lunch_product_view_tree_order lunch.product.tree.order lunch.product xpath 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.tree lunch.supplier tree New
res_config_settings_view_form res.config.settings.view.form.inherit.lunch res.config.settings xpath 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
Models touched (18)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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, values)

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 Integer
    args: 'ID'
  • user_id Many2one → res.users
    string='User' args: 'res.users'
Public methods (1)
  • init(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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 (0)

No new fields.

Public methods (0)

No public methods.

New fields (34)
  • active Boolean
    default=True args: 'Active'
  • 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_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
    related='supplier_id.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> readonly=False args: 'res.users', 'User'
Public methods (12)
  • 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
  • init(self)
  • update_quantity(self, increment)
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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 (2)
  • toggle_active(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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 (1)
  • toggle_active(self)
    Archiving related lunch product

New fields (0)

No new fields.

Public methods (0)

No public methods.

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 (6)
  • action_confirm_orders(self)
  • action_send_orders(self)
  • create(self, vals_list)
    @api.model_create_multi
  • toggle_active(self)
    Archiving related lunch product
  • unlink(self)
  • write(self, values)

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
    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
    args: 'lunch.product', 'lunch_product_favorite_user_rel', 'user_id', 'product_id'
  • last_lunch_location_id Many2one → lunch.location
    args: 'lunch.location'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/lunch
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources/Lunch
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Thibault Francois, Géry Debongnie, Aaron Bohy, Yannick Tivisse, Jorge Pinna Puissant, Julien Castiaux, Xavier-Do, Romeo Fragomeli, Victor Feyens, alt-odoo, Samuel Degueldre, Tiffany Chang (tic), Gorash, Pierre Paridans, William Braeckman, Kevin Baptiste, Florian Damhaut, Audric Onockx (auon), Abdelouahab (abla), Dossogne Bertrand, niyasraphy, Louis Wicket (wil), althaf shaik, stefanorigano (SRI), Mélanie, Aktiv Software, Tanguy Quéguineur, Martin Trigaux (mat), Vincent Sevestre
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:55
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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.tree lunch.alert tree 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.tree lunch.cashmove.report tree New
lunch_cashmove_report_view_tree_2 lunch.cashmove.report.tree lunch.cashmove.report tree 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.tree lunch.cashmove tree 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 tree 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.tree lunch.order tree 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 Tree lunch.product.category tree 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.tree lunch.product tree New
lunch_product_view_tree_order lunch.product.tree.order lunch.product xpath 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.tree lunch.supplier tree New
res_config_settings_view_form res.config.settings.view.form.inherit.lunch res.config.settings xpath 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
Models touched (18)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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, values)

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 (2)
  • get_wallet_balance(self, user, include_config=True)
    @api.model
  • name_get(self)

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 Integer
    args: 'ID'
  • user_id Many2one → res.users
    string='User' args: 'res.users'
Public methods (2)
  • init(self)
  • name_get(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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 (0)

No new fields.

Public methods (0)

No public methods.

New fields (34)
  • active Boolean
    default=True args: 'Active'
  • 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=True required=True states={'new': [('readonly', False)]} args: 'Order Date'
  • 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' store=True string='Product Name'
  • note Text
    args: 'Notes'
  • notified Boolean
    default=False
  • order_deadline_passed Boolean
    related='supplier_id.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> readonly=True states={'new': [('readonly', False)]} args: 'res.users', 'User'
Public methods (12)
  • 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
  • init(self)
  • update_quantity(self, increment)
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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 (2)
  • toggle_active(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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 (1)
  • toggle_active(self)
    Archiving related lunch product

New fields (0)

No new fields.

Public methods (0)

No public methods.

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 (7)
  • action_confirm_orders(self)
  • action_send_orders(self)
  • create(self, vals_list)
    @api.model_create_multi
  • name_get(self)
  • toggle_active(self)
    Archiving related lunch product
  • unlink(self)
  • write(self, values)

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
    ondelete='cascade' args: 'lunch.supplier'
  • topping_category Integer
    default=1 required=True args: 'Topping Category'
Public methods (1)
  • name_get(self)

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
    args: 'lunch.product', 'lunch_product_favorite_user_rel', 'user_id', 'product_id'
  • last_lunch_location_id Many2one → lunch.location
    args: 'lunch.location'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/lunch
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources/Lunch
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Christophe Simonis, Xavier Morel, Thibault Francois, Yannick Tivisse, wan, Julien Castiaux, Xavier-Do, Victor Feyens, alt-odoo, Julien Mougenot, Achraf (abz), IEL, Mathieu Duckerts-Antoine, Kevin Baptiste, Florian Damhaut, Audric Onockx (auon), Nicolas Bayet, Michael Mattiello (mcm), dht-odoo, Francois (fge), Louis Wicket (wil), althaf shaik, Leonardo Pavan Rocha, Aktiv Software, Tanguy Quéguineur
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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.tree lunch.alert tree 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.tree lunch.cashmove.report tree New
lunch_cashmove_report_view_tree_2 lunch.cashmove.report.tree lunch.cashmove.report tree 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.tree lunch.cashmove tree 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 tree 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.tree lunch.order tree 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 Tree lunch.product.category tree 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.tree lunch.product tree New
lunch_product_view_tree_order lunch.product.tree.order lunch.product xpath 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.tree lunch.supplier tree New
res_config_settings_view_form res.config.settings.view.form.inherit.lunch res.config.settings xpath 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
Models touched (18)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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, values)

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 (2)
  • get_wallet_balance(self, user, include_config=True)
    @api.model
  • name_get(self)

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 Integer
    args: 'ID'
  • user_id Many2one → res.users
    string='User' args: 'res.users'
Public methods (2)
  • init(self)
  • name_get(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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 (0)

No new fields.

Public methods (0)

No public methods.

New fields (31)
  • active Boolean
    default=True args: 'Active'
  • 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=True required=True states={'new': [('readonly', False)]} args: 'Order Date'
  • 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' store=True string='Product Name'
  • note Text
    args: 'Notes'
  • 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'), ('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> readonly=True states={'new': [('readonly', False)]} args: 'res.users', 'User'
Public methods (10)
  • action_cancel(self)
  • action_confirm(self)
  • action_order(self)
  • action_reorder(self)
  • action_reset(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, values)
    @api.model
  • init(self)
  • update_quantity(self, increment)
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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 (2)
  • toggle_active(self)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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 (1)
  • toggle_active(self)
    Archiving related lunch product

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (39)
  • 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'
  • 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'
  • 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)
  • create(self, vals_list)
    @api.model_create_multi
  • name_get(self)
  • toggle_active(self)
    Archiving related lunch product
  • unlink(self)
  • write(self, values)

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
    ondelete='cascade' args: 'lunch.supplier'
  • topping_category Integer
    default=1 help='This field is a technical field' required=True args: 'Topping Category'
Public methods (1)
  • name_get(self)

New fields (1)
  • lunch_minimum_threshold Float
Public methods (0)

No public methods.

New fields (2)
  • company_lunch_minimum_threshold Float
    readonly=False related='company_id.lunch_minimum_threshold' string='Maximum Allowed Overdraft'
  • 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
    args: 'lunch.product', 'lunch_product_favorite_user_rel', 'user_id', 'product_id'
  • last_lunch_location_id Many2one → lunch.location
    args: 'lunch.location'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/lunch
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources/Lunch
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Aaron Bohy, Lucas Perais (lpe), Barad Mahendra, Yannick Tivisse, Xavier-Do, Victor Feyens, Sébastien Theys, alt-odoo, Julien Mougenot, fw-bot, Achraf (abz), Lucas Lefèvre, IEL, Mathieu Duckerts-Antoine, Kevin Baptiste, Audric Onockx (auon), Louis Wicket (wil)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:31
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (44)
XML IDNameModelTypeStatus
assets_backend lunch assets ir.ui.view qweb Inherits web.assets_backend
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.tree lunch.alert tree 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.tree lunch.cashmove.report tree New
lunch_cashmove_report_view_tree_2 lunch.cashmove.report.tree lunch.cashmove.report tree 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.tree lunch.cashmove tree 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 tree 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.tree lunch.order tree 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 Tree lunch.product.category tree New
lunch_product_report_view_search lunch.product.report.search lunch.product.report search New
lunch_product_report_view_tree lunch.product.tree lunch.product.report tree 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.tree lunch.product tree New
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.tree lunch.supplier tree New
qunit_mobile_suite lunch mobile tests ir.ui.view qweb Inherits web.qunit_mobile_suite_tests
qunit_suite lunch tests ir.ui.view qweb Inherits web.qunit_suite_tests
res_config_settings_view_form res.config.settings.view.form.inherit.lunch res.config.settings xpath 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.report kanban New
Models touched (19)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (18)
  • active Boolean
    default=True args: 'Active'
  • available_today Boolean
    compute='_compute_available_today' search='_search_available_today' args: 'Is Displayed Today'
  • 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')]
  • 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')]
  • recurrency_friday Boolean
    default=True args: 'Friday'
  • recurrency_monday Boolean
    default=True args: 'Monday'
  • recurrency_saturday Boolean
    default=True args: 'Saturday'
  • recurrency_sunday Boolean
    default=True args: 'Sunday'
  • recurrency_thursday Boolean
    default=True args: 'Thursday'
  • recurrency_tuesday Boolean
    default=True args: 'Tuesday'
  • recurrency_wednesday Boolean
    default=True args: 'Wednesday'
  • tz Selection
    default=<expr> required=True string='Timezone' args: _tz_get
  • until Date
    args: 'Show Until'
Public methods (0)

No public methods.

New fields (5)
  • amount Float
    required=True args: 'Amount'
  • currency_id Many2one → res.currency
    default=<expr> 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 (2)
  • get_wallet_balance(self, user, include_config=True)
    @api.model
  • name_get(self)

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 Integer
    args: 'ID'
  • user_id Many2one → res.users
    string='User' args: 'res.users'
Public methods (2)
  • init(self)
  • name_get(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

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 (0)

No new fields.

Public methods (0)

No public methods.

New fields (29)
  • active Boolean
    default=True args: 'Active'
  • 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=True required=True states={'new': [('readonly', False)]} args: 'Order Date'
  • 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'
  • name Char
    readonly=True related='product_id.name' string='Product Name'
  • note Text
    args: 'Notes'
  • price Float
    compute='_compute_total_price' digits='Account' readonly=True store=True args: 'Total Price'
  • product_description Text
    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'), ('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.category_id.topping_label_1'
  • topping_label_2 Char
    related='product_id.category_id.topping_label_2'
  • topping_label_3 Char
    related='product_id.category_id.topping_label_3'
  • topping_quantity_1 Selection
    related='product_id.category_id.topping_quantity_1'
  • topping_quantity_2 Selection
    related='product_id.category_id.topping_quantity_2'
  • topping_quantity_3 Selection
    related='product_id.category_id.topping_quantity_3'
  • user_id Many2one → res.users
    default=<expr> readonly=True states={'new': [('readonly', False)]} args: 'res.users', 'User'
Public methods (8)
  • action_cancel(self)
  • action_confirm(self)
  • action_order(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, values)
    @api.model
  • init(self)
  • update_quantity(self, increment)
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (10)
  • 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 Text
    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'
  • name Char
    required=True translate=True args: 'Product Name'
  • new_until Date
    args: 'New Until'
  • price Float
    digits='Account' required=True args: 'Price'
  • supplier_id Many2one → lunch.supplier
    check_company=True required=True args: 'lunch.supplier', 'Vendor'
Public methods (1)
  • toggle_active(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (15)
  • 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'
  • topping_ids_1 One2many → lunch.topping
    domain=[('topping_category', '=', 1)] args: 'lunch.topping', 'category_id'
  • topping_ids_2 One2many → lunch.topping
    domain=[('topping_category', '=', 2)] args: 'lunch.topping', 'category_id'
  • topping_ids_3 One2many → lunch.topping
    domain=[('topping_category', '=', 3)] args: 'lunch.topping', 'category_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'
Public methods (3)
  • create(self, vals)
    @api.model
  • toggle_active(self)
    Archiving related lunch product
  • write(self, vals)

New fields (16)
  • active Boolean
    args: 'Active'
  • category_id Many2one → lunch.product.category
    args: 'lunch.product.category', 'Product Category'
  • company_id Many2one → res.company
    args: 'res.company'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' args: 'res.currency'
  • description Text
    related='product_id.description' args: 'Description'
  • id Integer
    args: 'ID'
  • image_128 Image
    compute='_compute_image_128'
  • is_available_at Many2one → lunch.location
    compute='_compute_is_available_at' search='_search_is_available_at' args: 'lunch.location', 'Product Availability'
  • is_favorite Boolean
    args: 'Favorite'
  • is_new Boolean
    args: 'New'
  • last_order_date Date
    args: 'Last Order Date'
  • name Char
    related='product_id.name' args: 'Product Name'
  • price Float
    args: 'Price'
  • product_id Many2one → lunch.product
    args: 'lunch.product', 'Product'
  • supplier_id Many2one → lunch.supplier
    args: 'lunch.supplier', 'Vendor'
  • user_id Many2one → res.users
    args: 'res.users'
Public methods (3)
  • compute_concurrency_field(self)
    Image caching is based on the `__last_update` field (=self.CONCURRENCY_CHECK_FIELD) But the image is never cached by the browser because the value fallbacks to `now` when access logging is disabled. This override sets a "real" value based on the product or category last update.
  • init(self)
  • write(self, values)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (29)
  • 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'
  • 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'
  • moment Selection
    default='am' required=True args: [('am', 'AM'), ('pm', 'PM')]
  • name Char
    readonly=False related='partner_id.name' args: 'Name'
  • 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'
  • recurrency_friday Boolean
    default=True args: 'Friday'
  • recurrency_monday Boolean
    default=True args: 'Monday'
  • recurrency_saturday Boolean
    args: 'Saturday'
  • recurrency_sunday Boolean
    args: 'Sunday'
  • recurrency_thursday Boolean
    default=True args: 'Thursday'
  • recurrency_tuesday Boolean
    default=True args: 'Tuesday'
  • recurrency_wednesday Boolean
    default=True args: 'Wednesday'
  • 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'
  • send_by Selection
    default='phone' args: [('phone', 'Phone'), ('mail', 'Email')], 'Send Order By'
  • 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'
  • tz Selection
    default=<expr> required=True string='Timezone' args: _tz_get
  • zip_code Char
    readonly=False related='partner_id.zip'
Public methods (2)
  • name_get(self)
  • toggle_active(self)
    Archiving related lunch product

New fields (6)
  • category_id Many2one → lunch.product.category
    ondelete='cascade' args: 'lunch.product.category'
  • 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 Float
    digits='Account' required=True args: 'Price'
  • topping_category Integer
    default=1 help='This field is a technical field' required=True args: 'Topping Category'
Public methods (1)
  • name_get(self)

New fields (1)
  • lunch_minimum_threshold Float
Public methods (0)

No public methods.

New fields (2)
  • company_lunch_minimum_threshold Float
    readonly=False related='company_id.lunch_minimum_threshold' string='Maximum Allowed Overdraft'
  • 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
    args: 'lunch.product', 'lunch_product_favorite_user_rel', 'user_id', 'product_id'
  • last_lunch_location_id Many2one → lunch.location
    args: 'lunch.location'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/lunch
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources/Lunch
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Joren Van Onder, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Aaron Bohy, GitHub, Lucas Perais (lpe), Yannick Tivisse, Odoo Online, Nicolas Seinlet, RomainLibert, Jorge Pinna Puissant, Toufik Ben Jaa, Adrian Torres, Xavier-Do, Florimond Husquinet (fhu), Sébastien Theys, Julien Mougenot, Lucas Lefèvre, Prakash Prajapati, IEL, Mathieu Duckerts-Antoine, Pierre Paridans, Yenthe666, Kevin Baptiste
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:44
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (39)
XML IDNameModelTypeStatus
assets_backend lunch assets ir.ui.view qweb Inherits web.assets_backend
lunch_alert_view_form lunch.alert.form lunch.alert form New
lunch_alert_view_search lunch.alert.search lunch.alert search New
lunch_alert_view_tree lunch.alert.tree lunch.alert tree 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.tree lunch.cashmove.report tree New
lunch_cashmove_report_view_tree_2 lunch.cashmove.report.tree lunch.cashmove.report tree 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.tree lunch.cashmove tree New
lunch_location_form_view lunch.location.view.form lunch.location form New
lunch_location_tree_view lunch.location.view.form lunch.location tree New
lunch_location_view_search lunch.location.view.search lunch.location search 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.tree lunch.order tree 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_tree Product category Tree lunch.product.category tree New
lunch_product_report_view_search lunch.product.report.search lunch.product.report search 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.tree lunch.product tree New
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.tree lunch.supplier tree New
qunit_mobile_suite lunch mobile tests ir.ui.view qweb Inherits web.qunit_mobile_suite
qunit_suite lunch tests ir.ui.view qweb Inherits web.qunit_suite
res_config_settings_view_form res.config.settings.view.form.inherit.lunch res.config.settings xpath 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_order_temp view.lunch.order.temp lunch.order.temp form New
view_lunch_product_kanban lunch.product.kanban lunch.product kanban New
view_lunch_product_kanban_order lunch.product.kanban lunch.product.report kanban New
Models touched (14)

New fields (18)
  • active Boolean
    default=True args: 'Active'
  • available_today Boolean
    compute='_compute_available_today' search='_search_available_today' args: 'Is Displayed Today'
  • location_ids Many2many → lunch.location
    string='Location' args: 'lunch.location'
  • message Html
    required=True args: 'Message'
  • mode Selection
    default='alert' string='Display' args: [('alert', 'Alert in app'), ('chat', 'Chat notification')]
  • name Char
    required=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')]
  • recurrency_friday Boolean
    default=True args: 'Friday'
  • recurrency_monday Boolean
    default=True args: 'Monday'
  • recurrency_saturday Boolean
    default=True args: 'Saturday'
  • recurrency_sunday Boolean
    default=True args: 'Sunday'
  • recurrency_thursday Boolean
    default=True args: 'Thursday'
  • recurrency_tuesday Boolean
    default=True args: 'Tuesday'
  • recurrency_wednesday Boolean
    default=True args: 'Wednesday'
  • tz Selection
    default=<expr> required=True string='Timezone' args: _tz_get
  • until Date
    args: 'Show Until'
Public methods (0)

No public methods.

New fields (5)
  • amount Float
    required=True args: 'Amount'
  • currency_id Many2one → res.currency
    default=<expr> 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 (2)
  • get_wallet_balance(self, user, include_config=True)
    @api.model
  • name_get(self)

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 Integer
    args: 'ID'
  • user_id Many2one → res.users
    string='User' args: 'res.users'
Public methods (2)
  • init(self)
  • name_get(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 (17)
  • active Boolean
    default=True args: 'Active'
  • category_id Many2one → lunch.product.category
    readonly=True related='product_id.category_id' store=True string='Product Category' args: 'lunch.product.category'
  • company_id Many2one → res.company
    default=<expr> args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' store=True args: 'res.currency'
  • date Date
    default=fields.Date.context_today readonly=True required=True states={'new': [('readonly', False)]} args: 'Order Date'
  • display_toppings Text
    compute='_compute_display_toppings' store=True args: 'Extras'
  • name Char
    readonly=True related='product_id.name' string='Product Name'
  • note Text
    args: 'Notes'
  • price Float
    compute='_compute_total_price' digits='Account' readonly=True store=True args: 'Total Price'
  • 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'), ('confirmed', 'Received'), ('cancelled', 'Cancelled')], 'Status'
  • supplier_id Many2one → lunch.supplier
    index=True readonly=True related='product_id.supplier_id' store=True string='Vendor' args: 'lunch.supplier'
  • 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'
  • user_id Many2one → res.users
    default=<expr> readonly=True states={'new': [('readonly', False)]} args: 'res.users', 'User'
Public methods (5)
  • action_cancel(self)
  • action_confirm(self)
  • action_order(self)
  • init(self)
  • update_quantity(self, increment)

New fields (24)
  • 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'
  • currency_id Many2one → res.currency
    default=<expr> args: 'res.currency'
  • edit Boolean
    default=<expr> args: 'Edit Mode'
  • image_128 Image
    related='product_id.image_128'
  • image_1920 Image
    related='product_id.image_1920'
  • note Text
    default=<expr> args: 'Special Instructions'
  • price_total Float
    compute='_compute_price_total' args: 'Total Price'
  • product_category Many2one → lunch.product.category
    related='product_id.category_id' args: 'lunch.product.category'
  • product_description Text
    related='product_id.description' args: 'Description'
  • product_id Many2one → lunch.product
    string='Product' args: 'lunch.product'
  • product_name Char
    related='product_id.name' args: 'Product Name'
  • quantity Float
    default=1 args: 'Quantity'
  • topping_ids_1 Many2many → lunch.topping
    default=<expr> domain="[('category_id', '=', product_category), ('topping_category', '=', 1)]" string='Extra Garniture' args: 'lunch.topping', 'lunch_order_temp_topping', 'order_id', 'topping_id'
  • topping_ids_2 Many2many → lunch.topping
    default=<expr> domain="[('category_id', '=', product_category), ('topping_category', '=', 2)]" string='Extra Garniture 2' args: 'lunch.topping', 'lunch_order_temp_topping', 'order_id', 'topping_id'
  • topping_ids_3 Many2many → lunch.topping
    default=<expr> domain="[('category_id', '=', product_category), ('topping_category', '=', 3)]" string='Extra Garniture 3' args: 'lunch.topping', 'lunch_order_temp_topping', 'order_id', 'topping_id'
  • topping_label_1 Char
    related='product_id.category_id.topping_label_1'
  • topping_label_2 Char
    related='product_id.category_id.topping_label_2'
  • topping_label_3 Char
    related='product_id.category_id.topping_label_3'
  • topping_quantity_1 Selection
    related='product_id.category_id.topping_quantity_1'
  • topping_quantity_2 Selection
    related='product_id.category_id.topping_quantity_2'
  • topping_quantity_3 Selection
    related='product_id.category_id.topping_quantity_3'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users'
Public methods (1)
  • add_to_cart(self)

New fields (10)
  • active Boolean
    default=True
  • category_id Many2one → lunch.product.category
    required=True args: 'lunch.product.category', 'Product Category'
  • company_id Many2one → res.company
    related='supplier_id.company_id' store=True args: 'res.company'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' args: 'res.currency'
  • description Text
    args: 'Description'
  • favorite_user_ids Many2many → res.users
    args: 'res.users', 'lunch_product_favorite_user_rel', 'product_id', 'user_id'
  • name Char
    required=True args: 'Product Name'
  • new_until Date
    args: 'New Until'
  • price Float
    digits='Account' required=True args: 'Price'
  • supplier_id Many2one → lunch.supplier
    required=True args: 'lunch.supplier', 'Vendor'
Public methods (0)

No public methods.

New fields (13)
  • 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: 'Product Category'
  • product_count Integer
    compute='_compute_product_count' help='The number of products related to this category'
  • topping_ids_1 One2many → lunch.topping
    domain=[('topping_category', '=', 1)] ondelete='cascade' args: 'lunch.topping', 'category_id'
  • topping_ids_2 One2many → lunch.topping
    domain=[('topping_category', '=', 2)] ondelete='cascade' args: 'lunch.topping', 'category_id'
  • topping_ids_3 One2many → lunch.topping
    domain=[('topping_category', '=', 3)] ondelete='cascade' args: 'lunch.topping', 'category_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'
Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, vals)

New fields (16)
  • active Boolean
    args: 'Active'
  • category_id Many2one → lunch.product.category
    args: 'lunch.product.category', 'Product Category'
  • company_id Many2one → res.company
    args: 'res.company'
  • currency_id Many2one → res.currency
    related='company_id.currency_id' args: 'res.currency'
  • description Text
    args: 'Description'
  • id Integer
    args: 'ID'
  • image_128 Image
    compute='_compute_image_128'
  • is_available_at Many2one → lunch.location
    compute='_compute_is_available_at' search='_search_is_available_at' args: 'lunch.location', 'Product Availability'
  • is_favorite Boolean
    args: 'Favorite'
  • is_new Boolean
    args: 'New'
  • last_order_date Date
    args: 'Last Order Date'
  • name Char
    args: 'Product Name'
  • price Float
    args: 'Price'
  • product_id Many2one → lunch.product
    args: 'lunch.product', 'Product'
  • supplier_id Many2one → lunch.supplier
    args: 'lunch.supplier', 'Vendor'
  • user_id Many2one → res.users
    args: 'res.users'
Public methods (3)
  • compute_concurrency_field(self)
    Image caching is based on the `__last_update` field (=self.CONCURRENCY_CHECK_FIELD) But the image is never cached by the browser because the value fallbacks to `now` when access logging is disabled. This override sets a "real" value based on the product or category last update.
  • init(self)
  • write(self, values)

New fields (29)
  • 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' args: 'res.company'
  • country_id Many2one → res.country
    readonly=False related='partner_id.country_id' args: 'res.country'
  • 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'
  • moment Selection
    default='am' required=True args: [('am', 'AM'), ('pm', 'PM')]
  • name Char
    readonly=False related='partner_id.name' args: 'Name'
  • 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'
  • recurrency_friday Boolean
    default=True args: 'Friday'
  • recurrency_monday Boolean
    default=True args: 'Monday'
  • recurrency_saturday Boolean
    args: 'Saturday'
  • recurrency_sunday Boolean
    args: 'Sunday'
  • recurrency_thursday Boolean
    default=True args: 'Thursday'
  • recurrency_tuesday Boolean
    default=True args: 'Tuesday'
  • recurrency_wednesday Boolean
    default=True args: 'Wednesday'
  • 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'
  • send_by Selection
    default='phone' args: [('phone', 'Phone'), ('mail', 'Email')], 'Send Order By'
  • 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'
  • tz Selection
    default=<expr> required=True string='Timezone' args: _tz_get
  • zip_code Char
    readonly=False related='partner_id.zip'
Public methods (1)
  • name_get(self)

New fields (6)
  • category_id Many2one → lunch.product.category
    args: 'lunch.product.category'
  • 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 Float
    digits='Account' required=True args: 'Price'
  • topping_category Integer
    default=1 help='This field is a technical field' required=True args: 'Topping Category'
Public methods (1)
  • name_get(self)

New fields (1)
  • lunch_minimum_threshold Float
Public methods (0)

No public methods.

New fields (2)
  • company_lunch_minimum_threshold Float
    readonly=False related='company_id.lunch_minimum_threshold' string='Maximum Allowed Overdraft'
  • 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
    args: 'lunch.product', 'lunch_product_favorite_user_rel', 'user_id', 'product_id'
  • last_lunch_location_id Many2one → lunch.location
    args: 'lunch.location'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/lunch
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Lempereur, Richard Mathot, Géry Debongnie, GitHub, Lucas Perais (lpe), Yannick Tivisse, Alexandre Kühn, qsm-odoo, Nicolas Seinlet, Adrien Dieudonne, Adrian Torres, Xavier-Do, jvm-odoo, Parth Choksi
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:02
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - decimal_precision
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (24)
XML IDNameModelTypeStatus
assets_backend lunch assets ir.ui.view qweb Inherits web.assets_backend
lunch_alert_view_form lunch.alert.form lunch.alert form New
lunch_alert_view_search lunch.alert.search lunch.alert search New
lunch_alert_view_tree lunch.alert.tree lunch.alert tree 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_search_2 lunch.cashmove.search lunch.cashmove search New
lunch_cashmove_view_tree lunch.cashmove.tree lunch.cashmove tree New
lunch_cashmove_view_tree_2 lunch.cashmove.tree lunch.cashmove tree New
lunch_order_line_view_kanban lunch.order.line.kanban lunch.order.line kanban New
lunch_order_line_view_search lunch.order.line.search lunch.order.line search New
lunch_order_line_view_tree lunch.order.line.tree lunch.order.line tree New
lunch_order_view_form lunch.order.form lunch.order form New
lunch_order_view_tree lunch.order.tree lunch.order tree New
lunch_product_category_view_form Product category Form lunch.product.category form 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.tree lunch.product tree New
qunit_suite lunch tests ir.ui.view qweb Inherits web.qunit_suite
report_lunch_order report_lunch_order ir.ui.view qweb New
view_lunch_alert_kanban lunch.alert.kanban lunch.alert kanban New
view_lunch_cashmove_kanban lunch.cashmove.kanban lunch.cashmove kanban New
view_lunch_order_line_lucky view.lunch.order.line.lucky lunch.order.line.lucky form New
view_lunch_product_kanban lunch.product.kanban lunch.product kanban New
Models touched (7)

New fields (15)
  • active Boolean
    default=True
  • alert_type Selection
    default='specific' index=True required=True string='Recurrence' args: [('specific', 'Specific Day'), ('week', 'Every Week'), ('days', 'Every Day')]
  • display Boolean
    compute='_compute_display_get'
  • end_hour Float
    default=23 oldname='active_to' required=True args: 'And'
  • friday Boolean
    args: 'Friday'
  • message Text
    required=True args: 'Message'
  • monday Boolean
    args: 'Monday'
  • partner_id Many2one → res.partner
    help='If specified, the selected vendor can be ordered only on selected days' string='Vendor' args: 'res.partner'
  • saturday Boolean
    args: 'Saturday'
  • specific_day Date
    default=fields.Date.context_today args: 'Day'
  • start_hour Float
    default=7 oldname='active_from' required=True args: 'Between'
  • sunday Boolean
    args: 'Sunday'
  • thursday Boolean
    args: 'Thursday'
  • tuesday Boolean
    args: 'Tuesday'
  • wednesday Boolean
    args: 'Wednesday'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (6)
  • amount Float
    help='Can be positive (payment) or negative (order or payment if user wants to get his money back)' required=True args: 'Amount'
  • date Date
    default=fields.Date.context_today required=True args: 'Date'
  • description Text
    help='Can be an order or a payment' args: 'Description'
  • order_id Many2one → lunch.order.line
    ondelete='cascade' args: 'lunch.order.line', 'Order'
  • state Selection
    default='payment' args: [('order', 'Order'), ('payment', 'Payment')], 'Is an order or a payment'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (12)
  • alerts Text
    compute='_compute_alerts_get' string='Alerts'
  • balance_visible Boolean
    compute='_compute_cash_move_balance' multi='cash_move_balance'
  • cash_move_balance Monetary
    compute='_compute_cash_move_balance' multi='cash_move_balance'
  • company_id Many2one → res.company
    readonly=False related='user_id.company_id' store=True args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' store=True args: 'res.currency'
  • date Date
    default=fields.Date.context_today readonly=True required=True states={'new': [('readonly', False)]} args: 'Date'
  • order_line_ids One2many → lunch.order.line
    copy=True readonly=True states={'new': [('readonly', False)], False: [('readonly', False)]} args: 'lunch.order.line', 'order_id', 'Products'
  • previous_order_ids Many2many → lunch.order.line
    compute='_compute_previous_order' args: 'lunch.order.line'
  • previous_order_widget Text
    compute='_compute_previous_order'
  • state Selection
    compute='_compute_order_state' copy=False index=True readonly=True store=True args: [('new', 'New'), ('confirmed', 'Received'), ('cancelled', 'Cancelled')], 'Status'
  • total Float
    compute='_compute_total' store=True string='Total'
  • user_id Many2one → res.users
    default=<expr> readonly=True states={'new': [('readonly', False)]} args: 'res.users', 'User'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (12)
  • cashmove One2many → lunch.cashmove
    args: 'lunch.cashmove', 'order_id', 'Cash Move'
  • category_id Many2one → lunch.product.category
    readonly=True related='product_id.category_id' store=True string='Product Category' args: 'lunch.product.category'
  • currency_id Many2one → res.currency
    readonly=False related='order_id.currency_id' args: 'res.currency'
  • date Date
    readonly=True related='order_id.date' store=True string='Date'
  • name Char
    readonly=True related='product_id.name' string='Product Name'
  • note Text
    args: 'Note'
  • order_id Many2one → lunch.order
    ondelete='cascade' required=True args: 'lunch.order', 'Order'
  • price Float
    digits=dp.get_precision('Account') readonly=True related='product_id.price' store=True
  • product_id Many2one → lunch.product
    domain=[('available', '=', True)] required=True args: 'lunch.product', 'Product'
  • state Selection
    default='new' index=True readonly=True args: [('new', 'New'), ('confirmed', 'Received'), ('ordered', 'Ordered'), ('cancelled', 'Cancelled')], 'Status'
  • supplier Many2one → res.partner
    readonly=True related='product_id.supplier' store=True string='Vendor' args: 'res.partner'
  • user_id Many2one → res.users
    readonly=True related='order_id.user_id' store=True string='User' args: 'res.users'
Public methods (5)
  • cancel(self)
    @api.one
    cancel one or more order.line, update order status and unlink existing cashmoves
  • confirm(self)
    @api.one
    confirm one or more order line, update order status and create new cashmove
  • create(self, vals)
    @api.model
    Override as an onchange would not apply if using the history buttons
  • order(self)
    The order_line is ordered to the vendor but isn't received yet
  • write(self, vals)
    @api.multi
    Override as an onchange would not apply if using the history buttons

New fields (4)
  • is_max_budget Boolean
    help='Enable this option to set a maximal budget for your lucky order.' store=True args: "I'm not feeling rich"
  • max_budget Float
    store=True args: 'Max Budget'
  • product_id Many2one → lunch.product
    store=True args: 'lunch.product', 'Product'
  • supplier_ids Many2many → res.partner
    comodel_name='res.partner' domain=<expr> string='Vendor'
Public methods (1)
  • random_pick(self)
    @api.multi
    To pick a random product from the selected suppliers, and create an order with this one

New fields (7)
  • active Boolean
    default=True
  • available Boolean
    compute='_get_available_product' search='_search_available_products'
  • category_id Many2one → lunch.product.category
    required=True args: 'lunch.product.category', 'Product Category'
  • description Text
    args: 'Description'
  • name Char
    required=True args: 'Product'
  • price Float
    digits=dp.get_precision('Account') args: 'Price'
  • supplier Many2one → res.partner
    args: 'res.partner', 'Vendor'
Public methods (0)

No public methods.

New fields (1)
  • name Char
    required=True args: 'Product Category'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/11.0/lunch
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Jérome Maes, Richard Mathot, Aaron Bohy, GitHub, Olivier Colson, Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, Laurent Smet, Adrien Dieudonne
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:44
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - web
    - decimal_precision
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (24)
XML IDNameModelTypeStatus
assets_backend lunch assets ir.ui.view qweb Inherits web.assets_backend
lunch_alert_view_form lunch.alert.form lunch.alert form New
lunch_alert_view_search lunch.alert.search lunch.alert search New
lunch_alert_view_tree lunch.alert.tree lunch.alert tree 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_search_2 lunch.cashmove.search lunch.cashmove search New
lunch_cashmove_view_tree lunch.cashmove.tree lunch.cashmove tree New
lunch_cashmove_view_tree_2 lunch.cashmove.tree lunch.cashmove tree New
lunch_order_line_view_kanban lunch.order.line.kanban lunch.order.line kanban New
lunch_order_line_view_search lunch.order.line.search lunch.order.line search New
lunch_order_line_view_tree lunch.order.line.tree lunch.order.line tree New
lunch_order_view_form lunch.order.form lunch.order form New
lunch_order_view_tree lunch.order.tree lunch.order tree New
lunch_product_category_view_form Product category Form lunch.product.category form 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.tree lunch.product tree New
qunit_suite lunch tests ir.ui.view qweb Inherits web.qunit_suite
report_lunch_order report_lunch_order ir.ui.view qweb New
view_lunch_alert_kanban lunch.alert.kanban lunch.alert kanban New
view_lunch_cashmove_kanban lunch.cashmove.kanban lunch.cashmove kanban New
view_lunch_order_line_lucky view.lunch.order.line.lucky lunch.order.line.lucky form New
view_lunch_product_kanban lunch.product.kanban lunch.product kanban New
Models touched (7)

New fields (14)
  • active Boolean
    default=True
  • alert_type Selection
    default='specific' index=True required=True string='Recurrence' args: [('specific', 'Specific Day'), ('week', 'Every Week'), ('days', 'Every Day')]
  • display Boolean
    compute='_compute_display_get'
  • end_hour Float
    default=23 oldname='active_to' required=True args: 'And'
  • friday Boolean
    args: 'Friday'
  • message Text
    required=True args: 'Message'
  • monday Boolean
    args: 'Monday'
  • saturday Boolean
    args: 'Saturday'
  • specific_day Date
    default=fields.Date.context_today args: 'Day'
  • start_hour Float
    default=7 oldname='active_from' required=True args: 'Between'
  • sunday Boolean
    args: 'Sunday'
  • thursday Boolean
    args: 'Thursday'
  • tuesday Boolean
    args: 'Tuesday'
  • wednesday Boolean
    args: 'Wednesday'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (6)
  • amount Float
    help='Can be positive (payment) or negative (order or payment if user wants to get his money back)' required=True args: 'Amount'
  • date Date
    default=fields.Date.context_today required=True args: 'Date'
  • description Text
    help='Can be an order or a payment' args: 'Description'
  • order_id Many2one → lunch.order.line
    ondelete='cascade' args: 'lunch.order.line', 'Order'
  • state Selection
    default='payment' args: [('order', 'Order'), ('payment', 'Payment')], 'Is an order or a payment'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (12)
  • alerts Text
    compute='_compute_alerts_get' string='Alerts'
  • balance_visible Boolean
    compute='_compute_cash_move_balance' multi='cash_move_balance'
  • cash_move_balance Monetary
    compute='_compute_cash_move_balance' multi='cash_move_balance'
  • company_id Many2one → res.company
    related='user_id.company_id' store=True args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' store=True args: 'res.currency'
  • date Date
    default=fields.Date.context_today readonly=True required=True states={'new': [('readonly', False)]} args: 'Date'
  • order_line_ids One2many → lunch.order.line
    copy=True readonly=True states={'new': [('readonly', False)], False: [('readonly', False)]} args: 'lunch.order.line', 'order_id', 'Products'
  • previous_order_ids Many2many → lunch.order.line
    compute='_compute_previous_order' args: 'lunch.order.line'
  • previous_order_widget Text
    compute='_compute_previous_order'
  • state Selection
    compute='_compute_order_state' copy=False index=True readonly=True store=True args: [('new', 'New'), ('confirmed', 'Received'), ('cancelled', 'Cancelled')], 'Status'
  • total Float
    compute='_compute_total' store=True string='Total'
  • user_id Many2one → res.users
    default=<expr> readonly=True states={'new': [('readonly', False)]} args: 'res.users', 'User'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (12)
  • cashmove One2many → lunch.cashmove
    args: 'lunch.cashmove', 'order_id', 'Cash Move'
  • category_id Many2one → lunch.product.category
    readonly=True related='product_id.category_id' store=True string='Product Category' args: 'lunch.product.category'
  • currency_id Many2one → res.currency
    related='order_id.currency_id' args: 'res.currency'
  • date Date
    readonly=True related='order_id.date' store=True string='Date'
  • name Char
    readonly=True related='product_id.name' string='Product Name'
  • note Text
    args: 'Note'
  • order_id Many2one → lunch.order
    ondelete='cascade' required=True args: 'lunch.order', 'Order'
  • price Float
    digits=dp.get_precision('Account') readonly=True related='product_id.price' store=True
  • product_id Many2one → lunch.product
    required=True args: 'lunch.product', 'Product'
  • state Selection
    default='new' index=True readonly=True args: [('new', 'New'), ('confirmed', 'Received'), ('ordered', 'Ordered'), ('cancelled', 'Cancelled')], 'Status'
  • supplier Many2one → res.partner
    readonly=True related='product_id.supplier' store=True string='Vendor' args: 'res.partner'
  • user_id Many2one → res.users
    readonly=True related='order_id.user_id' store=True string='User' args: 'res.users'
Public methods (3)
  • cancel(self)
    @api.one
    cancel one or more order.line, update order status and unlink existing cashmoves
  • confirm(self)
    @api.one
    confirm one or more order line, update order status and create new cashmove
  • order(self)
    @api.one
    The order_line is ordered to the vendor but isn't received yet

New fields (4)
  • is_max_budget Boolean
    help='Enable this option to set a maximal budget for your lucky order.' store=True args: "I'm not feeling rich"
  • max_budget Float
    store=True args: 'Max Budget'
  • product_id Many2one → lunch.product
    store=True args: 'lunch.product', 'Product'
  • supplier_ids Many2many → res.partner
    comodel_name='res.partner' domain=<expr> string='Vendor'
Public methods (1)
  • random_pick(self)
    @api.multi
    To pick a random product from the selected suppliers, and create an order with this one

New fields (6)
  • active Boolean
    default=True
  • category_id Many2one → lunch.product.category
    required=True args: 'lunch.product.category', 'Category'
  • description Text
    args: 'Description'
  • name Char
    required=True args: 'Product'
  • price Float
    digits=dp.get_precision('Account') args: 'Price'
  • supplier Many2one → res.partner
    args: 'res.partner', 'Vendor'
Public methods (0)

No public methods.

New fields (1)
  • name Char
    required=True args: 'Category'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/10.0/lunch
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Nicolas Lempereur, Julien Legros, qdp-odoo, Jeremy Kersten, Olivier Colson, Yannick Tivisse, Pierre Masereel
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:50:49
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - web
    - decimal_precision
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (19)
XML IDNameModelTypeStatus
assets_backend lunch assets ir.ui.view qweb Inherits web.assets_backend
lunch_alert_view_form lunch.alert.form lunch.alert form New
lunch_alert_view_search lunch.alert.search lunch.alert search New
lunch_alert_view_tree lunch.alert.tree lunch.alert tree 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_search_2 lunch.cashmove.search lunch.cashmove search New
lunch_cashmove_view_tree lunch.cashmove.tree lunch.cashmove tree New
lunch_cashmove_view_tree_2 lunch.cashmove.tree lunch.cashmove tree New
lunch_order_line_view_search lunch.order.line.search lunch.order.line search New
lunch_order_line_view_tree lunch.order.line.tree lunch.order.line tree New
lunch_order_view_form lunch.order.form lunch.order form New
lunch_order_view_tree lunch.order.tree lunch.order tree New
lunch_product_category_view_form Product category Form lunch.product.category form 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.tree lunch.product tree New
report_lunch_order report_lunch_order ir.ui.view qweb New
view_lunch_order_line_lucky view.lunch.order.line.lucky lunch.order.line.lucky form New
Models touched (7)

New fields (14)
  • active Boolean
    default=True
  • alert_type Selection
    default='specific' index=True required=True string='Recurrence' args: [('specific', 'Specific Day'), ('week', 'Every Week'), ('days', 'Every Day')]
  • display Boolean
    compute='_compute_display_get'
  • end_hour Float
    default=23 oldname='active_to' required=True args: 'And'
  • friday Boolean
    args: 'Friday'
  • message Text
    required=True args: 'Message'
  • monday Boolean
    args: 'Monday'
  • saturday Boolean
    args: 'Saturday'
  • specific_day Date
    default=fields.Date.context_today args: 'Day'
  • start_hour Float
    default=7 oldname='active_from' required=True args: 'Between'
  • sunday Boolean
    args: 'Sunday'
  • thursday Boolean
    args: 'Thursday'
  • tuesday Boolean
    args: 'Tuesday'
  • wednesday Boolean
    args: 'Wednesday'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (6)
  • amount Float
    help='Can be positive (payment) or negative (order or payment if user wants to get his money back)' required=True args: 'Amount'
  • date Date
    default=fields.Date.context_today required=True args: 'Date'
  • description Text
    help='Can be an order or a payment' args: 'Description'
  • order_id Many2one → lunch.order.line
    ondelete='cascade' args: 'lunch.order.line', 'Order'
  • state Selection
    default='payment' args: [('order', 'Order'), ('payment', 'Payment')], 'Is an order or a payment'
  • user_id Many2one → res.users
    default=<expr> args: 'res.users', 'User'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (11)
  • alerts Text
    compute='_compute_alerts_get' string='Alerts'
  • balance_visible Boolean
    compute='_compute_cash_move_balance' multi='cash_move_balance'
  • cash_move_balance Monetary
    compute='_compute_cash_move_balance' multi='cash_move_balance'
  • company_id Many2one → res.company
    related='user_id.company_id' store=True args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' store=True args: 'res.currency'
  • date Date
    default=fields.Date.context_today readonly=True required=True states={'new': [('readonly', False)]} args: 'Date'
  • order_line_ids One2many → lunch.order.line
    copy=True readonly=True states={'new': [('readonly', False)], False: [('readonly', False)]} args: 'lunch.order.line', 'order_id', 'Products'
  • previous_order_ids Many2many → lunch.order.line
    compute='_compute_previous_order_ids' default=<expr> args: 'lunch.order.line'
  • state Selection
    compute='_compute_order_state' copy=False index=True readonly=True store=True args: [('new', 'New'), ('confirmed', 'Received'), ('cancelled', 'Cancelled')], 'Status'
  • total Float
    compute='_compute_total' store=True string='Total'
  • user_id Many2one → res.users
    default=<expr> readonly=True states={'new': [('readonly', False)]} args: 'res.users', 'User'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (12)
  • cashmove One2many → lunch.cashmove
    args: 'lunch.cashmove', 'order_id', 'Cash Move'
  • category_id Many2one → lunch.product.category
    readonly=True related='product_id.category_id' store=True string='Product Category' args: 'lunch.product.category'
  • currency_id Many2one → res.currency
    related='order_id.currency_id' args: 'res.currency'
  • date Date
    readonly=True related='order_id.date' store=True string='Date'
  • name Char
    readonly=True related='product_id.name' string='Product Name'
  • note Text
    args: 'Note'
  • order_id Many2one → lunch.order
    ondelete='cascade' required=True args: 'lunch.order', 'Order'
  • price Float
    digits=dp.get_precision('Account') readonly=True related='product_id.price' store=True
  • product_id Many2one → lunch.product
    required=True args: 'lunch.product', 'Product'
  • state Selection
    default='new' index=True readonly=True args: [('new', 'New'), ('confirmed', 'Received'), ('ordered', 'Ordered'), ('cancelled', 'Cancelled')], 'Status'
  • supplier Many2one → res.partner
    readonly=True related='product_id.supplier' store=True string='Vendor' args: 'res.partner'
  • user_id Many2one → res.users
    readonly=True related='order_id.user_id' store=True string='User' args: 'res.users'
Public methods (3)
  • cancel(self)
    @api.one
    cancel one or more order.line, update order status and unlink existing cashmoves
  • confirm(self)
    @api.one
    confirm one or more order line, update order status and create new cashmove
  • order(self)
    @api.one
    The order_line is ordered to the vendor but isn't received yet

New fields (4)
  • is_max_budget Boolean
    help='Enable this option to set a maximal budget for your lucky order.' store=True args: "I'm not feeling rich"
  • max_budget Float
    store=True args: 'Max Budget'
  • product_id Many2one → lunch.product
    store=True args: 'lunch.product', 'Product'
  • supplier_ids Many2many → res.partner
    comodel_name='res.partner' domain=<expr> string='Vendor'
Public methods (1)
  • random_pick(self)
    @api.multi
    To pick a random product from the selected suppliers, and create an order with this one

New fields (6)
  • active Boolean
    default=True
  • category_id Many2one → lunch.product.category
    required=True args: 'lunch.product.category', 'Category'
  • description Text
    args: 'Description'
  • name Char
    required=True args: 'Product'
  • price Float
    digits=dp.get_precision('Account') args: 'Price'
  • supplier Many2one → res.partner
    args: 'res.partner', 'Vendor'
Public methods (0)

No public methods.

New fields (1)
  • name Char
    required=True args: 'Category'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/9.0/lunch
VERSION
VERSION 1.0
CATEGORY
CATEGORYHuman Resources
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Christophe Simonis, David Monjoie, Nicolas Martinelli, Jérome Maes, Richard Mathot, Géry Debongnie, Olivier Colson, Yannick Tivisse, qsm-odoo, Valerie Pirenne
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:48:31
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - web
    - decimal_precision
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
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 (20)
XML IDNameModelTypeStatus
assets_backend lunch assets ir.ui.view qweb Inherits web.assets_backend
lunch_alert_view_form lunch.alert.form lunch.alert form New
lunch_alert_view_search lunch.alert.search lunch.alert search New
lunch_alert_view_tree lunch.alert.tree lunch.alert tree 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_search_2 lunch.cashmove.search lunch.cashmove search New
lunch_cashmove_view_tree lunch.cashmove.tree lunch.cashmove tree New
lunch_cashmove_view_tree_2 lunch.cashmove.tree lunch.cashmove tree New
lunch_order_line_view_search lunch.order.line.search lunch.order.line search New
lunch_order_line_view_tree lunch.order.line.tree lunch.order.line tree New
lunch_order_view_form lunch.order.form lunch.order form New
lunch_order_view_search lunch.order.search lunch.order search New
lunch_order_view_tree lunch.order.tree lunch.order tree New
lunch_product_category_view_form Product category Form lunch.product.category form 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.tree lunch.product tree New
report_lunch_order report_lunch_order ir.ui.view qweb New
view_lunch_order_line_lucky view.lunch.order.line.lucky lunch.order.line.lucky form New
Models touched (7)

New fields (13)
  • alert_type Selection
    default='specific' index=True required=True string='Recurrence' args: [('specific', 'Specific Day'), ('week', 'Every Week'), ('days', 'Every Day')]
  • display Boolean
    compute='_compute_display_get'
  • end_hour Float
    default=23 oldname='active_to' required=True args: 'And'
  • friday Boolean
    args: 'Friday'
  • message Text
    required=True args: 'Message'
  • monday Boolean
    args: 'Monday'
  • saturday Boolean
    args: 'Saturday'
  • specific_day Date
    default=fields.Date.context_today args: 'Day'
  • start_hour Float
    default=7 oldname='active_from' required=True args: 'Between'
  • sunday Boolean
    args: 'Sunday'
  • thursday Boolean
    args: 'Thursday'
  • tuesday Boolean
    args: 'Tuesday'
  • wednesday Boolean
    args: 'Wednesday'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (6)
  • amount Float
    help='Can be positive (payment) or negative (order or payment if user wants to get his money back)' required=True args: 'Amount'
  • date Date
    default=fields.Date.context_today required=True args: 'Date'
  • description Text
    help='Can be an order or a payment' args: 'Description'
  • order_id Many2one → lunch.order.line
    ondelete='cascade' args: 'lunch.order.line', 'Order'
  • state Selection
    default='payment' args: [('order', 'Order'), ('payment', 'Payment')], 'Is an order or a payment'
  • user_id Many2one → res.users
    default=<expr> required=True args: 'res.users', 'User'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (11)
  • alerts Text
    compute='_compute_alerts_get' string='Alerts'
  • balance_visible Boolean
    compute='_compute_cash_move_balance' multi='cash_move_balance'
  • cash_move_balance Monetary
    compute='_compute_cash_move_balance' multi='cash_move_balance'
  • company_id Many2one → res.company
    related='user_id.company_id' store=True args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' store=True args: 'res.currency'
  • date Date
    default=fields.Date.context_today readonly=True required=True states={'new': [('readonly', False)]} args: 'Date'
  • order_line_ids One2many → lunch.order.line
    copy=True ondelete='cascade' readonly=True states={'new': [('readonly', False)], False: [('readonly', False)]} args: 'lunch.order.line', 'order_id', 'Products'
  • previous_order_ids Many2many → lunch.order.line
    compute='_compute_previous_order_ids' default=<expr> args: 'lunch.order.line'
  • state Selection
    compute='_compute_order_state' copy=False default='new' index=True readonly=True store=True args: [('new', 'New'), ('confirmed', 'Received'), ('cancelled', 'Cancelled')], 'Status'
  • total Float
    compute='_compute_total' store=True string='Total'
  • user_id Many2one → res.users
    default=<expr> readonly=True required=True states={'new': [('readonly', False)]} args: 'res.users', 'User'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (12)
  • cashmove One2many → lunch.cashmove
    args: 'lunch.cashmove', 'order_id', 'Cash Move'
  • category_id Many2one → lunch.product.category
    readonly=True related='product_id.category_id' store=True string='Product Category' args: 'lunch.product.category'
  • currency_id Many2one → res.currency
    related='order_id.currency_id' args: 'res.currency'
  • date Date
    readonly=True related='order_id.date' store=True string='Date'
  • name Char
    readonly=True related='product_id.name'
  • note Text
    args: 'Note'
  • order_id Many2one → lunch.order
    ondelete='cascade' required=True args: 'lunch.order', 'Order'
  • price Float
    digits=dp.get_precision('Account') readonly=True related='product_id.price' store=True
  • product_id Many2one → lunch.product
    required=True args: 'lunch.product', 'Product'
  • state Selection
    default='new' index=True readonly=True args: [('new', 'New'), ('confirmed', 'Received'), ('ordered', 'Ordered'), ('cancelled', 'Cancelled')], 'Status'
  • supplier Many2one → res.partner
    readonly=True related='product_id.supplier' store=True string='Vendor' args: 'res.partner'
  • user_id Many2one → res.users
    readonly=True related='order_id.user_id' store=True string='User' args: 'res.users'
Public methods (3)
  • cancel(self)
    @api.one
    cancel one or more order.line, update order status and unlink existing cashmoves
  • confirm(self)
    @api.one
    confirm one or more order line, update order status and create new cashmove
  • order(self)
    @api.one
    The order_line is ordered to the vendor but isn't received yet

New fields (4)
  • is_max_budget Boolean
    help='Enable this option to set a maximal budget for your lucky order.' store=True args: "I'm not feeling rich"
  • max_budget Float
    store=True args: 'Max Budget'
  • product_id Many2one → lunch.product
    store=True args: 'lunch.product', 'Product'
  • supplier_ids Many2many → res.partner
    comodel_name='res.partner' domain=<expr> string='Vendor'
Public methods (1)
  • random_pick(self)
    @api.multi
    To pick a random product from the selected suppliers, and create an order with this one

New fields (5)
  • category_id Many2one → lunch.product.category
    required=True args: 'lunch.product.category', 'Category'
  • description Text
    args: 'Description'
  • name Char
    required=True args: 'Product'
  • price Float
    digits=dp.get_precision('Account') args: 'Price'
  • supplier Many2one → res.partner
    args: 'res.partner', 'Vendor'
Public methods (0)

No public methods.

New fields (1)
  • name Char
    required=True args: 'Category'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/8.0/lunch
VERSION
VERSION 0.2
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Tejas Tank, Thibault Delavallée, Vo Minh Thu, Launchpad Translations on behalf of openerp, Quentin (OpenERP), Fabien Meghazi, Christophe Simonis, Xavier Morel, Simon Lejeune, Richard Mathot, Géry Debongnie, Aaron Bohy, bth-openerp, Richard Mathot (OpenERP), ged-odoo, openerp-sle, Rakesh Sindhav (OpenERP)
WEBSITE
WEBSITEhttps://www.odoo.com/page/employees
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:45:40
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - report
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
The base module to manage lunch.
================================

Many companies order sandwiches, pizzas and other, from usual suppliers, for their employees to offer them more facilities. 

However lunches management within the company requires proper administration especially when the number of employees or suppliers 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 supplier 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 (21)
XML IDNameModelTypeStatus
alert_form_view alert form lunch.alert form New
alert_search_view Search lunch.alert search New
alert_tree_view alert tree lunch.alert tree New
assets_backend lunch assets ir.ui.view qweb Inherits web.assets_backend
cancel_order_lines_view cancel order lines lunch.cancel form New
casmove_form_view cashmove form lunch.cashmove form New
casmove_tree cashmove tree lunch.cashmove tree New
casmove_tree_view cashmove tree lunch.cashmove tree New
lunch_order_line_search_view Search lunch.order.line search New
order_order_lines_view Order meal lunch.order.order form New
orders_form_view Lunch Order lunch.order form New
orders_order_lines_tree_view Order lines Tree lunch.order.line tree New
orders_tree_view Orders Tree View lunch.order tree New
product_category_form_view Product category Form lunch.product.category form New
products_form_view Products Form lunch.product form New
products_tree_view Products Tree lunch.product tree New
report_lunchorder report_lunchorder ir.ui.view qweb New
validate_order_lines_view validate order lines lunch.validation form New
view_lunch_cashmove_filter lunch cashmove lunch.cashmove search New
view_lunch_employee_payment_filter lunch employee payment lunch.cashmove search New
view_search_my_order lunch orders lunch.order search New
Models touched (4)

New fields (0)

No new fields.

Public methods (1)
  • cancel(self, cr, uid, ids, context=None)

New fields (0)

No new fields.

Public methods (1)
  • order(self, cr, uid, ids, context=None)

New fields (0)

No new fields.

Public methods (1)
  • confirm(self, cr, uid, ids, context=None)

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/7.0/lunch
VERSION
VERSION 0.2
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Jagdish Panchal (Open ERP), Twinkle Christian (OpenERP), Cecile Tonglet, Atul Patel (OpenERP), Randhir Mayatra (OpenERP), Odoo Translation Bot, Turkesh Patel (Open ERP), Numerigraphe - Lionel Sausin, DBR (OpenERP), Antonin Bourguignon, pankita shah (Open ERP), ajay javiya (OpenERP), Martin Trigaux, Ajay Chauhan (OpenERP), Purnendu Singh (OpenERP), Saurang Suthar (OpenERP), Fabien Pinckaers, Antony Lesuisse, Bharat Devnani (OpenERP), Meera Trambadia (OpenERP), Olivier Dony, Twinkle (OpenERP), Divyesh Makwana (Open ERP), Thibault Delavallée, Vo Minh Thu, Hardik, Arnaud Pineux, Amit Patel (OpenERP), Launchpad Translations on behalf of openerp, vta vta@openerp.com, Quentin (OpenERP), Nimesh (Open ERP), Mayur Maheshwari (OpenERP), Jigar Amin - OpenERP, Sanjay Gohel (Open ERP), Christophe Simonis, Xavier Morel, Khushboo Bhatt (Open ERP), Cedric Snauwaert, Jigar Amin, csn-openerp
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:43:11
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
The base module to manage lunch.
================================

Many companies order sandwiches, pizzas and other, from usual suppliers, for their employees to offer them more facilities. 

However lunches management within the company requires proper administration especially when the number of employees or suppliers 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 supplier 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 (19)
XML IDNameModelTypeStatus
alert_form_view alert form lunch.alert form New
alert_search_view Search lunch.alert search New
alert_tree_view alert tree lunch.alert tree New
cancel_order_lines_view cancel order lines lunch.cancel form New
casmove_form_view cashmove form lunch.cashmove form New
casmove_tree cashmove tree lunch.cashmove tree New
casmove_tree_view cashmove tree lunch.cashmove tree New
lunch_order_line_search_view Search lunch.order.line search New
order_order_lines_view Order meal lunch.order.order form New
orders_form_view Lunch Order lunch.order form New
orders_order_lines_tree_view Order lines Tree lunch.order.line tree New
orders_tree_view Orders Tree View lunch.order tree New
product_category_form_view Product category Form lunch.product.category form New
products_form_view Products Form lunch.product form New
products_tree_view Products Tree lunch.product tree New
validate_order_lines_view validate order lines lunch.validation form New
view_lunch_cashmove_filter lunch cashmove lunch.cashmove search New
view_lunch_employee_payment_filter lunch employee payment lunch.cashmove search New
view_search_my_order lunch orders lunch.order search New
Models touched (3)

New fields (0)

No new fields.

Public methods (1)
  • cancel(self, cr, uid, ids, context=None)

New fields (0)

No new fields.

Public methods (1)
  • order(self, cr, uid, ids, context=None)

New fields (0)

No new fields.

Public methods (1)
  • confirm(self, cr, uid, ids, context=None)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/6.1/lunch
VERSION
VERSION 0.1
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Rucha (Open ERP), Stephane Wirtel, Numerigraphe - Lionel Sausin, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Launchpad Translations on behalf of openerp, Quentin (OpenERP), Mayur Maheshwari (OpenERP), vro, niv-openerp, Christophe Simonis, Xavier Morel, Khushboo Bhatt (Open ERP), Minh Tran, Thibault Francois, Carlos Vásquez, ksa (Open ERP), Israel Fermin Montilla, mayur maheshwari (Open ERP), Hardik Ansodariy (OpenERP), aag (OpenERP)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:41:35
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_tools
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
    The base module to manage lunch

    keep track for the Lunch Order ,Cash Moves ,CashBox ,Product.
    Apply Different Category for the product.
    

Code Analysis

Views touched (21)
XML IDNameModelTypeStatus
view_lunch_cashbox_clean lunch.cashbox.clean.form lunch.cashbox.clean form New
view_lunch_cashbox_form Cashboxes lunch.cashbox form New
view_lunch_cashbox_tree Cashboxes lunch.cashbox tree New
view_lunch_cashmove_filter lunch.cashmove.list.select lunch.cashmove search New
view_lunch_cashmove_form CashMove lunch.cashmove form New
view_lunch_cashmove_tree CashMove lunch.cashmove tree New
view_lunch_category_form Category of product lunch.category form New
view_lunch_category_tree Category lunch.category tree New
view_lunch_order_cancel lunch.order.cancel.form lunch.order.cancel form New
view_lunch_order_confirm lunch.order.confirm.form lunch.order.confirm form New
view_lunch_order_filter lunch.order.list.select lunch.order search New
view_lunch_order_form Order lunch.order form New
view_lunch_order_tree Order lunch.order tree New
view_lunch_product_form Products lunch.product form New
view_lunch_product_search Products lunch.product search New
view_lunch_product_tree Products lunch.product tree New
view_report_lunch_amount_form Lunch amount report.lunch.amount form New
view_report_lunch_amount_search Lunch amount report.lunch.amount search New
view_report_lunch_amount_tree Lunch amount report.lunch.amount tree New
view_report_lunch_order_search report.lunch.order.search report.lunch.order search New
view_report_lunch_order_tree report.lunch.order.tree report.lunch.order tree New
Models touched (0)

No models found for this module.