Point of Sale

point_of_sale
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/point_of_sale
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYSales/Point of Sale
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, Josse Colpaert, David Monjoie, Xavier Morel, Joren Van Onder, qdp-odoo, Aaron Bohy, Sylvain LE GAL, Lucas Perais (lpe), Yannick Tivisse, Pierre Masereel, Laurent Smet, Christophe Monniez, Jorge Pinna Puissant, Alexandre Kühn, Arnold Moyaux, Julien Castiaux, Victor Feyens, Andrea Grazioso (agr-odoo), Adrien Dieudonné, William Henrotin, Sébastien Theys, Julien Mougenot, Anh Thao Pham (pta), Alvaro Fuentes, Achraf (abz), Brice bib Bartoletti, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, fja-odoo, Mathieu Duckerts-Antoine, Pierre Paridans, William Braeckman, Romain Estievenart, roen-odoo, william-andre, yhu-odoo, Agustín Castro Bugallo, Hubert Van De Walle, luvi, Renaud Thiry, rhe-odoo, Habib (ayh), Loan (LSE), David Monnom (moda), alsh-odoo, Pedram (PEBR), Louis Wicket (wil), tsm-odoo, Adrien Widart (awt), Victor Piryns (pivi), Julien (jula), Mahamadasif Ansari, clesgow, Pieter Claeys (clpi), Claire Bretton (clbr), Dylan Kiss (dyki), tong-odoo, Xavier Bol (xbo), Paweł Fertyk, Nguyễn Đại Dương, Zeel Patel, Sarah Bellefroid, Louis Travaux, Pedram (pebr), Arnaud Sibille, Adrien Guilliams (adgu), shag-odoo, Nicolas Viseur (vin), Walid (wasa), sesn-odoo, kdeb@odoo.com, Paul Stroobant, Ethan Vincent, lase@odoo.com, Quentin Wolfs, Maryam Kia, reka-odoo, Sven Fuehr, kmod-odoo, Julien Carion (juca), kcv-odoo, odoostan, mega, Tanguy Quéguineur, Louis Gobert, Agustin Castro Bugallo, Chrysanthe (chgo), asno-odoo, mano-odoo, Joseph (jcb), Max Whale, yaso, parp-odoo, aamo-odoo, Parth Solanki[PASO], Hussein Ebrahim(hyhe), Majed Alhanash (malh), Victorien (viso), Loukas Wets (lowe), manv-afk, Mathieu Coutant, Patricia Daloze (pda), Elisabeth Dickinson, Xavier Luyckx (xlu), guce, yagp-odoo, Sanchit Gupta, Claire (clbr), gteboul, Manushi Shah, Léo Gizard, Pierre Pulinckx (PIPU), Jitendra Prajapat, paan-odoo, David Monnom, Nesma Harraz, Ian, Smit Patel, Arthur Nanson, elhayyany, pkgu-odoo, Mohammad Abdulmoneim (abdu), djameltouati, Pierre Lamotte (pila), wt, Michaël Mattiello, Pierre Pulinckx, Bastien PIERRE, Corentin Heinix (cohe), Corentin Lombard, Jeffrey Luo, Carmine, Sherif Gabr, pish-odoo, Vincent Sevestre, plha-odoo, lse-odoo, Krzysztof Magusiak (krma), kkuj-odoo, Mahdi Alijani (malj), nape-odoo, Omar (OSAH), Ajit Singh, Akash Pandey, joseph, dvsh-odoo, Hazem Ibrahim, hatr-odoo, Shubham Agarwal [SHAG], Basioni (basm), utma-odoo, Sylvio Poliart (sypol), Harrison Hutton, Robin Engels (roen), Hadi El Yakhni, dhruv, zorbmax, Guillaume V, vlst-odoo, Maeva De Keyser (MDEK), rida, sagu-odoo, kdes-odoo, Radu Macocian (admac), Meet Jivani [MEJI], ksku-odoo, vpan-odoo, Tyler Landivar (tylan), Elier Ayala Bernal, nsirjacobs, bhna-odoo, MAGREMENT, aksi-odoo, Ze Chen (zeche), mohannedah, Lancelot Semal, sjai-odoo, Dhwani Patel, Laurent Smet (LAS), adip-odoo, Ali Hassan (alhy), Quentin Colla (qucol), shka-odoo, josv-odoo, path-odoo, Martin Doyen, kaju-odoo, Amr Elkhatieb, Uemus, YoussefM890, saurabh, Eve Lin (evlin), Thomas (thsc), Léopold Cantraine, zadh-odoo, abhk-odoo, rpka-odoo, a-k-s-h-a-y, Stephane Vanmeerhaeghe, Andreas Bichinger, Stephane Vanmeerhaeghe (stva), Keya Patel, Pierre (pco), Traina Ludo, Adnan Sabbir, Romain (roto), smjo-odoo, Julien (jdeh), Farah (ahmfa), ELCO, chpa-odoo, Shubham Agarwal, Stephane vm, amitmuchhala, Shubham Agarwal(shag), Oussema Heni, Mohamed Ben-Tahri, krpat-odoo, jipr-odoo, Mohamed (mobt), adgu-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/point-of-sale-shop
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:39
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - resource
    - base
    - web
    - stock_account
    - stock
    - product
    - mail
    - base_setup
    - bus
    - web_tour
    - html_editor
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - http_routing
    - auth_signup
    - account
    - onboarding
    - analytic
    - phone_validation
    - partner_autocomplete
    - iap_mail
    - iap
    - iot_base
    - google_address_autocomplete
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (70)
XML IDNameModelTypeStatus
digest_digest_view_form digest.digest.view.form.inherit.point_of_sale digest.digest xpath Inherits digest.digest_digest_view_form
point_of_sale.customer_display_index POS Customer Display ir.ui.view qweb New
point_of_sale.index POS Index ir.ui.view qweb New
point_of_sale.product_combo_view_form product.combo.form.inherit.point.of.sale product.combo field Inherits product.product_combo_view_form
point_of_sale.report_invoice_document point_of_sale.report_invoice_document ir.ui.view qweb Inherits account.report_invoice_document
point_of_sale.view_confirm_action_wizard pos.confirmation.wizard.form pos.confirmation.wizard form New
point_of_sale.view_pos_make_invoice Create Invoice(s) pos.make.invoice form New
pos_config_view_form pos.config.form.view pos.config form New
pos_daily_sales_html_container pos_daily_sales_html_container ir.ui.view qweb New
pos_daily_sales_report_layout Daily Sales Report layout ir.ui.view qweb New
pos_payment_method_view_form pos.payment.method.form pos.payment.method form New
pos_payment_method_view_search pos.payment.search.view pos.payment.method search New
pos_payment_method_view_tree pos.payment.method.list pos.payment.method list New
pos_rounding_form_view_inherited pos.cash.rounding.form.inherited account.cash.rounding xpath Inherits account.rounding_form_view
pos_session_sales_details pos_session_sales_details ir.ui.view qweb New
product_pos_category_form_view pos.category.form pos.category form New
product_pos_category_tree_view pos.category.list pos.category list New
product_product_tree_view product.product.product.list.inherit product.product field Inherits product.product_product_tree_view
product_tag_form_view_inherit_point_of_sale product.tag.form.inherit.point.of.sale product.tag xpath Inherits product.product_tag_form_view
product_template_form_view product.template.form.inherit product.template xpath Inherits product.product_template_form_view
product_template_only_form_view product.template.product.form.inherit product.template xpath Inherits product.product_template_only_form_view
product_template_search_view_pos product.template.search.pos.form product.template field Inherits product.product_template_search_view
product_template_tree_view product.template.product.list.inherit product.template field Inherits product.product_template_tree_view
product_template_tree_view_point_of_sale product.template.view.list.point_of_sale product.template list Inherits point_of_sale.product_template_tree_view
product_template_view_form_normalized_pos product.template.view.form.normalized product.template form New
product_uom_form_view_inherit product.uom.form.view.inherit uom.uom div Inherits uom.product_uom_form_view
report_pos_order_view_tree report.pos.order.view.list report.pos.order list New
report_saledetails report_saledetails ir.ui.view qweb New
report_userlabel report_userlabel ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.point_of_sale res.config.settings xpath Inherits base.res_config_settings_view_form
stock_reference_pos_view_form stock.reference.pos stock.reference xpath Inherits stock.stock_reference_form_view
ticket_request_with_code Invoice Request ir.ui.view qweb New
ticket_validation_screen ticket_validation_screen ir.ui.view qweb New
view_account_journal_pos_user_form account.move.pos.form.inherit account.move xpath Inherits account.view_move_form
view_form_pos_close_session_wizard pos.close.session.wizard.form pos.close.session.wizard form New
view_partner_property_form res.partner.pos.form.inherit res.partner div Inherits base.view_partner_form
view_pos_bill_form pos.bill.form pos.bill form New
view_pos_bill_tree pos.bill.list pos.bill list New
view_pos_category_kanban pos.category.kanban pos.category kanban New
view_pos_config_kanban pos.config.kanban.view pos.config kanban New
view_pos_config_search pos.config.search.view pos.config search New
view_pos_config_tree pos.config.list.view pos.config list New
view_pos_daily_sales_reports_wizard pos.daily.sales.reports.wizard.form pos.daily.sales.reports.wizard form New
view_pos_details_wizard pos.details.wizard.form pos.details.wizard form New
view_pos_note_tree Note Models pos.note list New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_kanban pos.order.kanban pos.order kanban New
view_pos_order_line pos.order.line.list pos.order.line list New
view_pos_order_line_form pos.order.line.form pos.order.line form New
view_pos_order_pivot pos.order.pivot pos.order pivot New
view_pos_order_search pos.order.search.view pos.order search New
view_pos_order_tree pos.order.list pos.order list New
view_pos_order_tree_all_sales_lines pos.order.line.all.sales.list pos.order.line list New
view_pos_order_tree_no_session_id pos.order.tree_no_session_id pos.order xpath Inherits point_of_sale.view_pos_order_tree
view_pos_payment pos.make.payment.form pos.make.payment form New
view_pos_payment_form pos.payment.form pos.payment form New
view_pos_payment_search pos.payment.search.view pos.payment search New
view_pos_payment_tree pos.payment.list pos.payment list New
view_pos_pos_form pos.order.form pos.order form New
view_pos_preset_form pos.preset.form pos.preset form New
view_pos_preset_tree pos.preset.list pos.preset list New
view_pos_printer Preparation Printers pos.printer list New
view_pos_printer_form Preparation Printer pos.printer form New
view_pos_session_form pos.session.form.view pos.session form New
view_pos_session_kanban pos.session.kanban pos.session kanban New
view_pos_session_search pos.session.search.view pos.session search New
view_pos_session_tree pos.session.list.view pos.session list New
view_report_pos_order_graph report.pos.order.graph report.pos.order graph New
view_report_pos_order_pivot report.pos.order.pivot report.pos.order pivot New
view_report_pos_order_search report.pos.order.search report.pos.order search New
Models touched (71)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_session_id Many2one → pos.session
    copy=False index='btree_not_null' string='Session' args: 'pos.session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_archive(self)

New fields (1)
  • pos_payment_method_ids One2many → pos.payment.method
    string='Point of Sale Payment Methods' args: 'pos.payment.method', 'journal_id'
Public methods (1)
  • action_archive(self)

New fields (6)
  • pos_order_count Integer
    compute='_compute_origin_pos_count' string='POS Order Count'
  • pos_order_ids One2many → pos.order
    args: 'pos.order', 'account_move'
  • pos_payment_ids One2many → pos.payment
    args: 'pos.payment', 'account_move_id'
  • pos_refunded_invoice_ids Many2many → account.move
    args: 'account.move', 'refunded_invoices', 'refund_account_move', 'original_account_move'
  • pos_session_ids One2many → pos.session
    args: 'pos.session', 'move_id', 'POS Sessions'
  • reversed_pos_order_id Many2one → pos.order
    help='The pos order that was reverted after closing the session to create an invoice for it.' index='btree_not_null' string='Reversed POS Order' args: 'pos.order'
Public methods (2)
  • action_view_source_pos_orders(self)
  • button_draft(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • force_outstanding_account_id Many2one → account.account
    check_company=True args: 'account.account', 'Forced Outstanding Account'
  • pos_payment_method_id Many2one → pos.payment.method
    args: 'pos.payment.method', 'POS Payment Method'
  • pos_session_id Many2one → pos.session
    index='btree_not_null' args: 'pos.session', 'POS Session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • type Selection
    ondelete={'weight': 'set default', 'price': 'set default', 'discount': 'set default', 'client': 'set default', 'cashier': 'set default'} selection_add=[('weight', 'Weighted Product'), ('price', 'Priced Product'), ('discount', 'Discounted Product'), ('client', 'Client'), ('cashier', 'Cashier')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • kpi_pos_total Boolean
    args: 'POS Sales'
  • kpi_pos_total_value Monetary
    compute='_compute_kpi_pos_total_value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • name Char
    args: 'Name'
  • pos_config_ids Many2many → pos.config
    string='Point of Sales' args: 'pos.config'
  • value Float
    digits=(16, 4) required=True args: 'Value'
Public methods (1)
  • name_create(self, name)
    @api.model

New fields (1)
  • access_token Char
    copy=False args: 'Security Token'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (10)
  • child_ids One2many → pos.category
    string='Children Categories' args: 'pos.category', 'parent_id'
  • color Integer
    default=get_default_color required=False args: 'Color'
  • has_image Boolean
    compute='_compute_has_image'
  • hour_after Float
    default=0.0 help='The product will be available after this hour for online order and self order.' string='Availability After'
  • hour_until Float
    default=24.0 help='The product will be available until this hour for online order and self order.' string='Availability Until'
  • image_128 Image
    max_height=128 max_width=128 related='image_512' store=True args: 'Image 128'
  • image_512 Image
    max_height=512 max_width=512 args: 'Image'
  • name Char
    required=True string='Category Name' translate=True
  • parent_id Many2one → pos.category
    index=True string='Parent Category' args: 'pos.category'
  • sequence Integer
    help='Gives the sequence order when displaying a list of product categories.'
Public methods (1)
  • get_default_color(self)

New fields (4)
  • account_id Many2one → account.account
    args: 'account.account', 'Destination account'
  • account_readonly Boolean
    args: 'Destination account is readonly'
  • amount_to_balance Float
    args: 'Amount to balance'
  • message Text
    args: 'Information message'
Public methods (1)
  • close_session(self)

New fields (95)
  • access_token Char
    default=<expr> args: 'Access Token'
  • active Boolean
    default=True
  • amount_authorized_diff Float
    help='This field depicts the maximum difference allowed between the ending balance and the theoretical cash when closing a session, for non-POS managers. If this maximum is reached, the user will have an error message at the closing of his session saying that he needs to contact his manager.' args: 'Amount Authorized Difference'
  • auto_validate_terminal_payment Boolean
    default=True help='Automatically validates orders paid with a payment terminal.'
  • available_preset_ids Many2many → pos.preset
    string='Available Presets' args: 'pos.preset'
  • available_pricelist_ids Many2many → product.pricelist
    help='Make several pricelists available in the Point of Sale. You can also apply a pricelist to specific customers from their contact form (in Sales tab). To be valid, this pricelist must be listed here as an available pricelist. Otherwise the default pricelist will apply.' string='Available Pricelists' args: 'product.pricelist'
  • basic_receipt Boolean
    help='Print basic ticket without prices. Can be used for gifts.' string='Basic Receipt'
  • cash_control Boolean
    compute='_compute_cash_control' help='Check the amount of the cashbox at opening and closing.' string='Advanced Cash Control'
  • cash_rounding Boolean
    string='Cash Rounding'
  • company_has_template Boolean
    compute='_compute_company_has_template' string='Company has chart of accounts'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    compute='_compute_currency' compute_sudo=True store=True string='Currency' args: 'res.currency'
  • current_session_id Many2one → pos.session
    compute='_compute_current_session' string='Current Session' args: 'pos.session'
  • current_session_state Char
    compute='_compute_current_session'
  • current_user_id Many2one → res.users
    compute='_compute_current_session_user' string='Current Session Responsible' args: 'res.users'
  • customer_display_bg_img Image
    max_height=1920 max_width=1920 string='Background Image'
  • customer_display_bg_img_name Char
    string='Background Image Name'
  • default_bill_ids Many2many → pos.bill
    string='Coins/Bills' args: 'pos.bill'
  • default_fiscal_position_id Many2one → account.fiscal.position
    string='Default Fiscal Position' args: 'account.fiscal.position'
  • default_preset_id Many2one → pos.preset
    string='Default Preset' args: 'pos.preset'
  • device_seq_id Many2one → ir.sequence
    copy=False readonly=True string='Device Sequence' args: 'ir.sequence'
  • epson_printer_ip Char
    help="Local IP address of an Epson receipt printer, or its serial number if the 'Automatic Certificate Update' option is enabled in the printer settings." string='Epson Printer IP'
  • fallback_nomenclature_id Many2one → barcode.nomenclature
    string='Fallback Nomenclature' args: 'barcode.nomenclature'
  • fast_payment_method_ids Many2many → pos.payment.method
    compute='_compute_fast_payment_method_ids' help='These payment methods will be available for fast payment' readonly=False relation='pos_payment_method_config_fast_validation_relation' store=True string='Fast Payment Methods' args: 'pos.payment.method'
  • fiscal_position_ids Many2many → account.fiscal.position
    help='This is useful for restaurants with onsite and take-away services that imply specific tax rates.' string='Fiscal Positions' args: 'account.fiscal.position'
  • group_pos_manager_id Many2one → res.groups
    default=_get_group_pos_manager help='This field is there to pass the id of the pos manager group to the point of sale client.' string='Point of Sale Manager Group' args: 'res.groups'
  • group_pos_user_id Many2one → res.groups
    default=_get_group_pos_user help='This field is there to pass the id of the pos user group to the point of sale client.' string='Point of Sale User Group' args: 'res.groups'
  • has_active_session Boolean
    compute='_compute_current_session'
  • iface_available_categ_ids Many2many → pos.category
    help='The point of sale will only display products which are within one of the selected category trees. If no category is specified, all available products will be shown' string='Available PoS Product Categories' args: 'pos.category'
  • iface_big_scrollbars Boolean
    help='For imprecise industrial touchscreens.' args: 'Large Scrollbars'
  • iface_cashdrawer Boolean
    help='Automatically open the cashdrawer.' string='Cashdrawer'
  • iface_electronic_scale Boolean
    help='Enables Electronic Scale integration.' string='Electronic Scale'
  • iface_group_by_categ Boolean
    help='Display products grouped by categories.' args: 'Group products by categories'
  • iface_print_auto Boolean
    default=False help='The receipt will automatically be printed at the end of each order.' string='Automatic Receipt Printing'
  • iface_print_skip_screen Boolean
    default=True help='The receipt screen will be skipped if the receipt can be printed automatically.' string='Skip Preview Screen'
  • iface_print_via_proxy Boolean
    help='Bypass browser printing and prints via the hardware proxy.' string='Print via Proxy'
  • iface_scan_via_proxy Boolean
    help='Enable barcode scanning with a remotely connected barcode scanner and card swiping with a Vantiv card reader.' string='Scan via Proxy'
  • iface_tax_included Selection
    default='total' required=True string='Tax Display' args: [('subtotal', 'Tax-Excluded Price'), ('total', 'Tax-Included Price')]
  • iface_tipproduct Boolean
    string='Product tips'
  • invoice_journal_id Many2one → account.journal
    check_company=True default=_default_invoice_journal domain=[('type', '=', 'sale')] help='Accounting journal used to create invoices.' string='Invoice Journal' args: 'account.journal'
  • is_closing_entry_by_product Boolean
    help='Display the breakdown of sales lines by product in the automatically generated closing entry.' string='Closing Entry by product'
  • is_header_or_footer Boolean
    args: 'Custom Header & Footer'
  • is_installed_account_accountant Boolean
    compute='_compute_is_installed_account_accountant' string='Is the Full Accounting Installed'
  • is_margins_costs_accessible_to_every_user Boolean
    default=False help='When disabled, only PoS manager can view the margin and cost of product among the Product info.' string='Margins & Costs'
  • is_order_printer Boolean
    args: 'Order Printer'
  • is_posbox Boolean
    args: 'PosBox'
  • journal_id Many2one → account.journal
    check_company=True default=_default_sale_journal domain=[('type', 'in', ('general', 'sale'))] help='Accounting journal used to post POS session journal entries and POS invoice payments.' ondelete='restrict' string='Point of Sale Journal' args: 'account.journal'
  • last_data_change Datetime
    compute='_compute_local_data_integrity' readonly=True store=True string='Last Write Date'
  • last_session_closing_cash Float
    compute='_compute_last_session'
  • last_session_closing_date Date
    compute='_compute_last_session'
  • limit_categories Boolean
    args: 'Restrict Categories'
  • manual_discount Boolean
    default=True string='Line Discounts'
  • module_pos_appointment Boolean
    args: 'Online Booking'
  • module_pos_avatax Boolean
    help='Use automatic taxes mapping with Avatax in PoS' args: 'AvaTax PoS Integration'
  • module_pos_discount Boolean
    args: 'Global Discounts'
  • module_pos_hr Boolean
    help='Show employee login screen'
  • module_pos_restaurant Boolean
    args: 'Is a Bar/Restaurant'
  • module_pos_sms Boolean
    help='Activate SMS feature for point_of_sale' string='SMS Enabled'
  • name Char
    help='An internal identification of the point of sale.' required=True string='Point of Sale'
  • note_ids Many2many → pos.note
    help='The predefined notes of this point of sale.' string='Note Models' args: 'pos.note'
  • number_of_rescue_session Integer
    compute='_compute_current_session' string='Number of Rescue Session'
  • only_round_cash_method Boolean
    string='Only apply rounding on cash'
  • order_backend_seq_id Many2one → ir.sequence
    copy=False readonly=True string='Order Backend Sequence' args: 'ir.sequence'
  • order_edit_tracking Boolean
    default=False help='Store edited orders in the backend' string='Track orders edits'
  • order_line_seq_id Many2one → ir.sequence
    copy=False readonly=True string='Order Line Sequence' args: 'ir.sequence'
  • order_seq_id Many2one → ir.sequence
    copy=False readonly=True string='Order Sequence' args: 'ir.sequence'
  • other_devices Boolean
    help='Connect devices to your PoS without an IoT Box.' string='Other Devices'
  • payment_method_ids Many2many → pos.payment.method
    copy=False default=<expr> string='Payment Methods' args: 'pos.payment.method'
  • picking_policy Selection
    default='direct' help='If you deliver all products at once, the delivery order will be scheduled based on the greatest product lead time. Otherwise, it will be based on the shortest.' required=True string='Shipping Policy' args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')]
  • picking_type_id Many2one → stock.picking.type
    default=_default_picking_type_id domain=<expr> ondelete='restrict' required=True string='Operation Type' args: 'stock.picking.type'
  • pos_session_duration Char
    compute='_compute_current_session_user'
  • pos_session_state Char
    compute='_compute_current_session_user'
  • pos_session_username Char
    compute='_compute_current_session_user'
  • pricelist_id Many2one → product.pricelist
    help='The pricelist used if no customer is selected or if the customer has no Sale Pricelist configured if any.' string='Default Pricelist' args: 'product.pricelist'
  • printer_ids Many2many → pos.printer
    string='Order Printers' args: 'pos.printer', 'pos_config_printer_rel', 'config_id', 'printer_id'
  • proxy_ip Char
    help='The hostname or ip address of the hardware proxy, Will be autodetected if left empty.' size=45 string='IP Address'
  • receipt_footer Text
    help='A short text that will be inserted as a footer in the printed receipt.' string='Receipt Footer'
  • receipt_header Text
    help='A short text that will be inserted as a header in the printed receipt.' string='Receipt Header'
  • restrict_price_control Boolean
    help='Only users with Manager access rights for PoS app can modify the product prices on orders.' string='Restrict Price Modifications to Managers'
  • rounding_method Many2one → account.cash.rounding
    string='Cash rounding' args: 'account.cash.rounding'
  • route_id Many2one → stock.route
    string='Spefic route for products delivered later.' args: 'stock.route'
  • session_ids One2many → pos.session
    string='Sessions' args: 'pos.session', 'config_id'
  • set_maximum_difference Boolean
    help='Set a maximum difference allowed between the expected and counted money during the closing of the session.' args: 'Set Maximum Difference'
  • ship_later Boolean
    string='Ship Later'
  • show_category_images Boolean
    default=True help='Show category images in the Point of Sale interface.' string='Show Category Images'
  • show_product_images Boolean
    default=True help='Show product images in the Point of Sale interface.' string='Show Product Images'
  • statistics_for_current_session Json
    compute='_compute_statistics_for_session' string='Session Statistics'
  • tax_regime_selection Boolean
    args: 'Tax Regime Selection value'
  • tip_product_id Many2one → product.product
    default=_get_default_tip_product help='This product is used as reference on customer receipts.' string='Tip Product' args: 'product.product'
  • trusted_config_ids Many2many → pos.config
    column1='is_trusting' column2='is_trusted' domain="[('company_id', '=', company_id)]" relation='pos_config_trust_relation' string='Trusted Point of Sale Configurations' args: 'pos.config'
  • use_fast_payment Boolean
    help='Enable fast payment methods to validate orders on the product screen.' args: 'Fast Payment Validation'
  • use_presets Boolean
    args: 'Use Presets'
  • use_pricelist Boolean
    args: 'Use a pricelist.'
  • uuid Char
    copy=False default=<expr> help='A globally unique identifier for this pos configuration, used to prevent conflicts in client-generated data.' readonly=True
  • warehouse_id Many2one → stock.warehouse
    compute='_compute_warehouse_id' ondelete='restrict' precompute=True readonly=False store=True args: 'stock.warehouse'
Public methods (25)
  • action_pos_config_modal_edit(self)
  • close_ui(self)
  • create(self, vals_list)
    @api.model_create_multi
  • execute(self)
  • get_limited_partners_loading(self, offset=0)
  • get_limited_product_count(self)
  • get_pos_kanban_view_state(self)
    @api.model
  • get_product_loading_info(self)
    Return total product.template count matching the PoS domain and the configured loading limit. Used by the frontend to warn the user before triggering a full sync when the product count exceeds the configured limit or crosses the dangerous threshold (20 000+).
  • get_record_by_ref(self, recordRefs)
  • get_statistics_for_session(self, session)
  • install_pos_restaurant(self)
    @api.model
  • load_demo_data(self)
  • load_onboarding_bakery_scenario(self, with_demo_data=True)
    @api.model
  • load_onboarding_clothes_scenario(self, with_demo_data=True)
    @api.model
  • load_onboarding_furniture_scenario(self, with_demo_data=True)
    @api.model
  • load_onboarding_retail_scenario(self, with_demo_data=False)
    @api.model
  • notify_synchronisation(self, session_id, device_identifier, records={})
  • open_existing_session_cb(self)
    close session button access session form to validate entries
  • open_opened_rescue_session_form(self)
  • open_ui(self)
    Open the pos interface with config_id as an extra argument. In vanilla PoS each user can only have one active session, therefore it was not needed to pass the config_id on opening a session. It is also possible to login to sessions created by other users. :returns: dict
  • read_config_open_orders(self, domain, record_ids=[])
  • register_new_device_identifier(self)
  • unlink(self)
  • update_customer_display(self, order, device_uuid)
  • write(self, vals)

New fields (1)
  • message Text
    default=_default_message readonly=True
Public methods (2)
  • action_confirm(self)
  • get_selected_orders(self)

New fields (1)
  • pos_session_id Many2one → pos.session
    required=True args: 'pos.session'
Public methods (1)
  • generate_report(self)

New fields (3)
  • end_date Datetime
    default=fields.Datetime.now required=True
  • pos_config_ids Many2many → pos.config
    default=<expr> args: 'pos.config', 'pos_detail_configs'
  • start_date Datetime
    default=_default_start_date required=True
Public methods (1)
  • generate_report(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • consolidated_billing Boolean
    default=True help='Create one invoice for all orders related to same customer and same invoicing address' string='Consolidated Billing'
  • count Integer
    compute='_compute_order_count' string='Order Count'
Public methods (1)
  • action_create_invoices(self)

New fields (5)
  • amount Float
    default=_default_amount digits=0 required=True
  • config_id Many2one → pos.config
    default=_default_config required=True string='Point of Sale Configuration' args: 'pos.config'
  • payment_date Datetime
    default=<expr> required=True string='Payment Date'
  • payment_method_id Many2one → pos.payment.method
    default=_default_payment_method required=True string='Payment Method' args: 'pos.payment.method'
  • payment_name Char
    string='Payment Reference'
Public methods (2)
  • check(self)
    Check the order: if the order is not paid: continue payment, if the order is paid print ticket.
  • launch_payment(self)

New fields (3)
  • color Integer
    string='Color'
  • name Char
    required=True
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (61)
  • account_move Many2one → account.move
    copy=False index='btree_not_null' readonly=True string='Invoice' args: 'account.move'
  • amount_difference Monetary
    readonly=True string='Difference'
  • amount_paid Monetary
    required=True string='Paid'
  • amount_return Monetary
    readonly=True required=True string='Returned'
  • amount_tax Monetary
    readonly=True required=True string='Taxes'
  • amount_total Monetary
    readonly=True required=True string='Total'
  • available_payment_method_ids Many2many → pos.payment.method
    readonly=True related='config_id.payment_method_ids' store=False string='Available Payment Methods' args: 'pos.payment.method'
  • company_id Many2one → res.company
    index=True readonly=True required=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    compute='_compute_order_config_id' readonly=False store=True string='Point of Sale' args: 'pos.config'
  • country_code Char
    related='company_id.account_fiscal_country_id.code'
  • currency_id Many2one → res.currency
    related='config_id.currency_id' string='Currency' args: 'res.currency'
  • currency_rate Float
    compute='_compute_currency_rate' compute_sudo=True digits=0 help='The rate of the currency to the currency of rate applicable at the date of the order' readonly=True store=True args: 'Currency Rate'
  • date_order Datetime
    default=fields.Datetime.now index=True readonly=True string='Date'
  • email Char
    compute='_compute_contact_details' readonly=False store=True string='Email'
  • failed_pickings Boolean
    compute='_compute_picking_count'
  • fiscal_position_id Many2one → account.fiscal.position
    comodel_name='account.fiscal.position' readonly=False string='Fiscal Position'
  • floating_order_name Char
    string='Order Name'
  • general_customer_note Text
    string='General Customer Note'
  • has_deleted_line Boolean
    string='Has Deleted Line'
  • has_refundable_lines Boolean
    compute='_compute_has_refundable_lines' args: 'Has Refundable Lines'
  • internal_note Text
    string='Internal Note'
  • invoice_status Selection
    compute='_compute_invoice_status' string='Invoice Status' args: [('invoiced', 'Fully Invoiced'), ('to_invoice', 'To Invoice')]
  • is_edited Boolean
    compute='_compute_is_edited' string='Edited'
  • is_invoiced Boolean
    compute='_compute_is_invoiced' args: 'Is Invoiced'
  • is_refund Boolean
    default=False readonly=True string='Is Refund'
  • is_tipped Boolean
    readonly=True args: 'Is this already tipped?'
  • is_total_cost_computed Boolean
    compute='_compute_is_total_cost_computed' help='Allows to know if all the total cost of the order lines have already been computed'
  • last_order_preparation_change Char
    help='Last printed state of the order' string='Last preparation change'
  • lines One2many → pos.order.line
    copy=True string='Order Lines' args: 'pos.order.line', 'order_id'
  • margin Monetary
    compute='_compute_margin' string='Margin'
  • margin_percent Float
    compute='_compute_margin' digits=(12, 4) string='Margin (%)'
  • mobile Char
    compute='_compute_contact_details' readonly=False store=True string='Mobile'
  • name Char
    copy=False default='/' readonly=True required=True string='Order Ref'
  • nb_print Integer
    copy=False default=0 readonly=True string='Number of Print'
  • order_edit_tracking Boolean
    readonly=True related='config_id.order_edit_tracking'
  • partner_id Many2one → res.partner
    change_default=True index='btree_not_null' string='Customer' args: 'res.partner'
  • payment_ids One2many → pos.payment
    string='Payments' args: 'pos.payment', 'pos_order_id'
  • picking_count Integer
    compute='_compute_picking_count'
  • picking_ids One2many → stock.picking
    args: 'stock.picking', 'pos_order_id'
  • picking_type_id Many2one → stock.picking.type
    readonly=False related='session_id.config_id.picking_type_id' string='Operation Type' args: 'stock.picking.type'
  • pos_reference Char
    copy=False index=True readonly=True string='Receipt Number'
  • preset_id Many2one → pos.preset
    string='Preset' args: 'pos.preset'
  • preset_time Datetime
    help='Hour of the day for the order' string='Hour'
  • pricelist_id Many2one → product.pricelist
    string='Pricelist' args: 'product.pricelist'
  • refund_orders_count Integer
    compute='_compute_refund_related_fields' help='Number of orders where items from this order were refunded' args: 'Number of Refund Orders'
  • refunded_order_id Many2one → pos.order
    compute='_compute_refund_related_fields' help='Order from which items were refunded in this order' args: 'pos.order'
  • reversed_move_ids One2many → account.move
    help='List of account moves created when this POS order was reversed and invoiced after session close.' string='Reversal Account Moves' args: 'account.move', 'reversed_pos_order_id'
  • sale_journal Many2one → account.journal
    ondelete='restrict' readonly=True related='session_id.config_id.journal_id' store=True string='Sales Journal' args: 'account.journal'
  • sequence_number Integer
    copy=False help='A session-unique sequence number for the order. Negative if generated from the client' string='Sequence Number'
  • session_id Many2one → pos.session
    domain="[('state', '=', 'opened')]" index=True string='Session' args: 'pos.session'
  • session_move_id Many2one → account.move
    copy=False readonly=True related='session_id.move_id' string='Session Journal Entry' args: 'account.move'
  • shipping_date Date
    args: 'Shipping Date'
  • source Selection
    default='pos' selection=[('pos', 'Point of Sale')] string='Origin'
  • state Selection
    copy=False default='draft' index=True readonly=True args: [('draft', 'New'), ('cancel', 'Cancelled'), ('paid', 'Paid'), ('done', 'Posted')], 'Status'
  • stock_reference_ids Many2many → stock.reference
    string='Reference' args: 'stock.reference', 'stock_reference_pos_order_rel', 'pos_order_id', 'reference_id'
  • ticket_code Char
    help='5 digits alphanumeric code to be used by portal user to request an invoice'
  • tip_amount Monetary
    readonly=True string='Tip Amount'
  • to_invoice Boolean
    copy=False args: 'To invoice'
  • tracking_number Char
    copy=False readonly=True string='Order Number'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> help='Employee who uses the cash register.' string='Employee'
  • uuid Char
    copy=False default=<expr> readonly=True string='Uuid'
Public methods (23)
  • action_create_invoices(self)
  • action_pos_order_cancel(self)
  • action_pos_order_invoice(self)
  • action_pos_order_paid(self)
  • action_send_mail(self)
  • action_send_receipt(self, email, ticket_image, basic_image)
  • action_stock_picking(self)
  • action_view_invoice(self)
  • action_view_refund_orders(self)
  • action_view_refunded_order(self)
  • add_payment(self, data)
    Create a new payment for the order
  • create(self, vals_list)
    @api.model_create_multi
  • get_preparation_change(self)
  • get_reference_last_part(self)
  • get_stock_reports_to_print(self)
  • read_pos_data(self, data, config)
  • read_pos_data_uuid(self, uuid)
    @api.model
  • read_pos_orders(self, domain=False)
    @api.model
  • refund(self)
  • remove_from_ui(self, server_ids)
    @api.model
    Remove orders from the frontend PoS application Remove orders from the server by id. :param server_ids: list of the id's of orders to remove from the server. :type server_ids: list. :returns: list -- list of db-ids for the removed orders.
  • search_paid_order_ids(self, config_id, domain, limit, offset)
    @api.model
    Search for 'paid' orders that satisfy the given domain, limit and offset.
  • sync_from_ui(self, orders)
    @api.model
    Create and update Orders from the frontend PoS application. Create new orders and update orders that are in draft status. If an order already exists with a status different from 'draft' it will be discarded, otherwise it will be saved to the database. If saved with 'draft' status the order can be overwritten later by this function. :param orders: dictionary with the orders to be created. :type orders: dict. :returns: list of db-ids for the created and updated orders. :rtype: list
  • write(self, vals)

New fields (35)
  • attribute_value_ids Many2many → product.template.attribute.value
    string='Selected Attributes' args: 'product.template.attribute.value'
  • combo_item_id Many2one → product.combo.item
    string='Combo Item' args: 'product.combo.item'
  • combo_line_ids One2many → pos.order.line
    string='Combo Lines' args: 'pos.order.line', 'combo_parent_id'
  • combo_parent_id Many2one → pos.order.line
    index='btree_not_null' string='Combo Parent' args: 'pos.order.line'
  • company_id Many2one → res.company
    related='order_id.company_id' store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='order_id.currency_id' args: 'res.currency'
  • custom_attribute_value_ids One2many → product.attribute.custom.value
    comodel_name='product.attribute.custom.value' inverse_name='pos_order_line_id' readonly=False store=True string='Custom Values'
  • customer_note Char
    args: 'Customer Note'
  • discount Float
    default=0.0 digits=0 string='Discount (%)'
  • extra_tax_data Json
  • full_product_name Char
    args: 'Full Product Name'
  • is_edited Boolean
    default=False args: 'Edited'
  • is_total_cost_computed Boolean
    help='Allows to know if the total cost has already been computed or not'
  • margin Monetary
    compute='_compute_margin' string='Margin'
  • margin_percent Float
    compute='_compute_margin' digits=(12, 4) string='Margin (%)'
  • name Char
    copy=False required=True string='Line No'
  • note Char
    args: 'Product Note'
  • notice Char
    string='Discount Notice'
  • order_id Many2one → pos.order
    index=True ondelete='cascade' required=True string='Order Ref' args: 'pos.order'
  • pack_lot_ids One2many → pos.pack.operation.lot
    string='Lot/serial Number' args: 'pos.pack.operation.lot', 'pos_order_line_id'
  • price_extra Float
    string='Price extra'
  • price_subtotal Monetary
    readonly=True required=True string='Tax Excl.'
  • price_subtotal_incl Monetary
    readonly=True required=True string='Tax Incl.'
  • price_type Selection
    default='original' string='Price Type' args: [('original', 'Original'), ('manual', 'Manual'), ('automatic', 'Automatic')]
  • price_unit Float
    digits=0 string='Unit Price'
  • product_id Many2one → product.product
    change_default=True domain=[('sale_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Product Unit' args: 'uom.uom'
  • qty Float
    default=1 digits='Product Unit' args: 'Quantity'
  • refund_orderline_ids One2many → pos.order.line
    help='Orderlines in this field are the lines that refunded this orderline.' args: 'pos.order.line', 'refunded_orderline_id', 'Refund Order Lines'
  • refunded_orderline_id Many2one → pos.order.line
    help='If this orderline is a refund, then the refunded orderline is specified in this field.' index='btree_not_null' args: 'pos.order.line', 'Refunded Order Line'
  • refunded_qty Float
    compute='_compute_refund_qty' help='Number of items refunded in this orderline.' args: 'Refunded Quantity'
  • tax_ids Many2many → account.tax
    readonly=True string='Taxes' args: 'account.tax'
  • tax_ids_after_fiscal_position Many2many → account.tax
    compute='_get_tax_ids_after_fiscal_position' string='Taxes to Apply' args: 'account.tax'
  • total_cost Float
    min_display_digits='Product Price' readonly=True string='Total cost'
  • uuid Char
    copy=False default=<expr> readonly=True string='Uuid'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
  • get_existing_lots(self, company_id, config_id, product_id)
    @api.model
    Return the lots that are still available in the given company. The lot is available if its quantity in the corresponding stock_quant and pos stock location is > 0.
  • unlink(self)
  • write(self, vals)

New fields (4)
  • lot_name Char
    args: 'Lot Name'
  • order_id Many2one → pos.order
    readonly=False related='pos_order_line_id.order_id' args: 'pos.order'
  • pos_order_line_id Many2one → pos.order.line
    index='btree_not_null' args: 'pos.order.line'
  • product_id Many2one → product.product
    readonly=False related='pos_order_line_id.product_id' args: 'product.product'
Public methods (0)

No public methods.

New fields (25)
  • account_move_id Many2one → account.move
    index='btree_not_null' args: 'account.move'
  • amount Monetary
    currency_field='currency_id' help='Total amount of the payment.' required=True string='Amount'
  • card_brand Char
    help='The brand of the payment card (e.g. Visa, AMEX, ...)' string='Brand of card'
  • card_no Char
    string='Card Number(Last 4 Digit)'
  • card_type Char
    help='The type of the payment card (e.g. CREDIT CARD OR DEBIT CARD)' string='Type of card used'
  • cardholder_name Char
    string='Card Owner name'
  • company_id Many2one → res.company
    related='pos_order_id.company_id' store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='pos_order_id.currency_id' string='Currency' args: 'res.currency'
  • currency_rate Float
    help='Conversion rate from company currency to order currency.' related='pos_order_id.currency_rate' string='Conversion Rate'
  • is_change Boolean
    default=False string='Is this payment change?'
  • name Char
    readonly=True string='Label'
  • partner_id Many2one → res.partner
    related='pos_order_id.partner_id' string='Customer' args: 'res.partner'
  • payment_date Datetime
    default=<expr> readonly=True required=True string='Date'
  • payment_method_authcode Char
    string='Payment APPR Code'
  • payment_method_id Many2one → pos.payment.method
    required=True string='Payment Method' args: 'pos.payment.method'
  • payment_method_issuer_bank Char
    string='Payment Issuer Bank'
  • payment_method_payment_mode Char
    string='Payment Mode'
  • payment_ref_no Char
    help='Payment reference number from payment provider terminal' string='Payment reference number'
  • payment_status Char
    string='Payment Status'
  • pos_order_id Many2one → pos.order
    index=True ondelete='cascade' required=True string='Order' args: 'pos.order'
  • session_id Many2one → pos.session
    index=True related='pos_order_id.session_id' store=True string='Session' args: 'pos.session'
  • ticket Char
    string='Payment Receipt Info'
  • transaction_id Char
    string='Payment Transaction ID'
  • user_id Many2one → res.users
    related='session_id.user_id' string='Employee' args: 'res.users'
  • uuid Char
    copy=False default=<expr> readonly=True string='Uuid'
Public methods (0)

No public methods.

New fields (20)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • config_ids Many2many → pos.config
    string='Point of Sale' args: 'pos.config'
  • default_pos_receivable_account_name Char
    related='company_id.account_default_pos_receivable_account_id.display_name' string='Default Receivable Account Name'
  • default_qr Char
    compute='_compute_qr'
  • hide_qr_code_method Boolean
    compute='_compute_hide_qr_code_method'
  • hide_use_payment_terminal Boolean
    compute='_compute_hide_use_payment_terminal'
  • image Image
    max_height=50 max_width=50 args: 'Image'
  • is_cash_count Boolean
    compute='_compute_is_cash_count' store=True string='Cash'
  • journal_id Many2one → account.journal
    check_company=True domain=['|', '&', ('type', '=', 'cash'), ('pos_payment_method_ids', '=', False), ('type', '=', 'bank')] help='Leave empty to use the receivable account of customer.\nDefines the journal where to book the accumulated payments (or individual payment if Identify Customer is true) after closing the session.\nFor cash journal, we directly write to the default account in the journal via statement lines.\nFor bank journal, we write to the outstanding account specified in this payment method.\nOnly cash and bank journals are allowed.' index='btree_not_null' ondelete='restrict' string='Journal' args: 'account.journal'
  • name Char
    help='Defines the name of the payment method that will be displayed in the Point of Sale when the payments are selected.' required=True string='Method' translate=True
  • open_session_ids Many2many → pos.session
    compute='_compute_open_session_ids' help='Open PoS sessions that are using this payment method.' string='Pos Sessions' args: 'pos.session'
  • outstanding_account_id Many2one → account.account
    help='Account used as outstanding account when creating accounting payment records for bank payments.' ondelete='restrict' string='Outstanding Account' args: 'account.account'
  • payment_method_type Selection
    default='none' required=True selection=<expr> string='Integration'
  • qr_code_method Selection
    copy=False help='Type of QR-code to be generated for this payment method.' selection=<expr> string='QR Code Format'
  • receivable_account_id Many2one → account.account
    domain=[('reconcile', '=', True), ('account_type', '=', 'asset_receivable')] help="Leave empty to use the default account from the company setting.\nOverrides the company's receivable account (for Point of Sale) used in the journal entries." ondelete='restrict' string='Intermediary Account' args: 'account.account'
  • sequence Integer
    copy=False
  • split_transactions Boolean
    default=False help='Forces to set a customer when using this payment method and splits the journal entries for each customer. It could slow down the closing process.' string='Identify Customer'
  • type Selection
    compute='_compute_type' selection=[('cash', 'Cash'), ('bank', 'Bank'), ('pay_later', 'Customer Account')]
  • use_payment_terminal Selection
    help='Record payments with a terminal on this journal.' selection=<expr> string='Use a Payment Terminal'
Public methods (5)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_provider_status(self, modules_list)
    @api.model
  • get_qr_code(self, amount, free_communication, structured_communication, currency, debtor_partner)
    Generates and returns a QR-code
  • write(self, vals)

New fields (16)
  • attendance_ids One2many
    readonly=False related='resource_calendar_id.attendance_ids' string='Attendances'
  • color Integer
    default=0 string='Color'
  • count_linked_config Integer
    compute='_compute_count_linked_config'
  • count_linked_orders Integer
    compute='_compute_count_linked_orders'
  • fiscal_position_id Many2one → account.fiscal.position
    string='Fiscal Position' args: 'account.fiscal.position'
  • has_image Boolean
    compute='_compute_has_image'
  • identification Selection
    default='none' required=True string='Identification' args: [('none', 'Not required'), ('address', 'Address'), ('name', 'Name')]
  • image_128 Image
    max_height=128 max_width=128 related='image_512' store=True string='Image 128'
  • image_512 Image
    max_height=512 max_width=512 string='Image'
  • interval_time Integer
    default=20 string='Interval time (in min)'
  • is_return Boolean
    default=False help='All quantity in the cart will be in negative. Ideal for return managment.' string='Return mode'
  • name Char
    required=True string='Label' translate=True
  • pricelist_id Many2one → product.pricelist
    string='Pricelist' args: 'product.pricelist'
  • resource_calendar_id Many2one → resource.calendar
    args: 'resource.calendar', 'Resource'
  • slots_per_interval Integer
    default=5 string='Capacity'
  • use_timing Boolean
    default=False string='Manage orders by time'
Public methods (3)
  • action_open_linked_config(self)
  • action_open_linked_orders(self)
  • get_available_slots(self)

New fields (7)
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • epson_printer_ip Char
    default='0.0.0.0' help="Local IP address of an Epson receipt printer, or its serial number if the 'Automatic Certificate Update' option is enabled in the printer settings." string='Epson Printer IP Address'
  • name Char
    default='Printer' help='An internal identification of the printer' required=True args: 'Printer Name'
  • pos_config_ids Many2many → pos.config
    args: 'pos.config', 'pos_config_printer_rel', 'printer_id', 'config_id'
  • printer_type Selection
    default='iot' selection=[('iot', 'Use a printer connected to the IoT Box'), ('epson_epos', 'Use an Epson printer')] string='Printer Type'
  • product_categories_ids Many2many → pos.category
    string='Printed Product Categories' args: 'pos.category', 'printer_category_rel', 'printer_id', 'category_id'
  • proxy_ip Char
    help="The IP Address or hostname of the Printer's hardware proxy" args: 'Proxy IP Address'
Public methods (1)
  • use_local_network_access(self)
    @api.model

New fields (30)
  • bank_payment_ids One2many → account.payment
    help='Account payments representing aggregated and bank split payments.' args: 'account.payment', 'pos_session_id', 'Bank Payments'
  • cash_control Boolean
    compute='_compute_cash_control' string='Has Cash Control'
  • cash_journal_id Many2one → account.journal
    compute='_compute_cash_journal' store=True string='Cash Journal' args: 'account.journal'
  • cash_real_transaction Monetary
    readonly=True string='Transaction'
  • cash_register_balance_end Monetary
    compute='_compute_cash_balance' help='Opening balance summed to all cash transactions.' readonly=True string='Theoretical Closing Balance'
  • cash_register_balance_end_real Monetary
    readonly=True string='Ending Balance'
  • cash_register_balance_start Monetary
    readonly=True string='Starting Balance'
  • cash_register_difference Monetary
    compute='_compute_cash_balance' help='Difference between the theoretical closing balance and the real closing balance.' readonly=True string='Before Closing Difference'
  • closing_notes Text
    string='Closing Notes'
  • company_id Many2one → res.company
    readonly=True related='config_id.company_id' string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    index=True required=True string='Point of Sale' args: 'pos.config'
  • currency_id Many2one → res.currency
    readonly=False related='config_id.currency_id' string='Currency' args: 'res.currency'
  • failed_pickings Boolean
    compute='_compute_picking_count'
  • is_in_company_currency Boolean
    compute='_compute_is_in_company_currency' args: 'Is Using Company Currency'
  • move_id Many2one → account.move
    index=True string='Journal Entry' args: 'account.move'
  • name Char
    default='/' readonly=True string='Session ID'
  • opening_notes Text
    string='Opening Notes'
  • order_count Integer
    compute='_compute_order_count'
  • order_ids One2many → pos.order
    string='Orders' args: 'pos.order', 'session_id'
  • payment_method_ids Many2many → pos.payment.method
    related='config_id.payment_method_ids' string='Payment Methods' args: 'pos.payment.method'
  • picking_count Integer
    compute='_compute_picking_count'
  • picking_ids One2many → stock.picking
    args: 'stock.picking', 'pos_session_id'
  • rescue Boolean
    copy=False help='Auto-generated session for orphan orders, ignored in constraints' readonly=True string='Recovery Session'
  • start_at Datetime
    readonly=True string='Opening Date'
  • state Selection
    copy=False default='opening_control' index=True readonly=True required=True string='Status' args: POS_SESSION_STATE
  • statement_line_ids One2many → account.bank.statement.line
    readonly=True string='Cash Lines' args: 'account.bank.statement.line', 'pos_session_id'
  • stop_at Datetime
    copy=False readonly=True string='Closing Date'
  • total_payments_amount Float
    compute='_compute_total_payments_amount' string='Total Payments Amount'
  • update_stock_at_closing Boolean
    args: 'Stock should be updated at closing'
  • user_id Many2one → res.users
    default=<expr> index=True ondelete='restrict' readonly=False required=True string='Opened By' args: 'res.users'
Public methods (31)
  • action_pos_session_close(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_pos_session_closing_control(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_pos_session_open(self)
  • action_pos_session_validate(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_show_payments_list(self)
  • action_stock_picking(self)
  • action_view_order(self)
  • close_session_from_ui(self, bank_payment_method_diff_pairs=None)
    Calling this method will try to close the session. param bank_payment_method_diff_pairs: list[(int, float)] Pairs of payment_method_id and diff_amount which will be used to post loss/profit when closing the session. If successful, it returns {'successful': True} Otherwise, it returns {'successful': False, 'message': str, 'redirect': bool}. 'redirect' is a boolean used to know whether we redirect the user to the back end or not. When necessary, error (i.e. UserError, AccessError) is raised which should redirect the user to the back end.
  • create(self, vals_list)
    @api.model_create_multi
  • delete_cash_in_out(self, absl_id, partner_id)
  • delete_opening_control_session(self)
  • filter_local_data(self, models_to_filter)
  • find_product_by_barcode(self, barcode, config_id)
  • get_cash_in_out_list(self)
  • get_closing_control_data(self)
  • get_pos_ui_product_pricelist_item_by_product(self, product_tmpl_ids, product_ids, config_id)
  • get_session_orders(self)
  • get_total_discount(self)
  • load_data(self, models_to_load)
  • load_data_params(self)
  • log_partner_message(self, partner_id, action, message_type)
  • open_frontend_cb(self)
    Open the pos interface with config_id as an extra argument. In vanilla PoS each user can only have one active session, therefore it was not needed to pass the config_id on opening a session. It is also possible to login to sessions created by other users. :returns: dict
  • post_close_register_message(self)
  • post_closing_cash_details(self, counted_cash)
    Calling this method will try store the cash details during the session closing. :param counted_cash: float, the total cash the user counted from its cash register If successful, it returns ``{'successful': True}``. Otherwise, it returns ``{'successful': False, 'message': str, 'redirect': bool}`` where ``'redirect'`` is a boolean used to know whether we redirect the user to the back end or not. When necessary, error (i.e. UserError, AccessError) is raised which should redirect the user to the back end.
  • set_opening_control(self, cashbox_value: int, notes: str)
    Public method to open the session. This calls the internal logic and, if successful, assigns the sequence name. DO NOT INHERIT THIS METHOD. Inherit _set_opening_control_data instead.
  • show_cash_register(self)
  • show_journal_items(self)
  • try_cash_in_out(self, _type, amount, reason, partner_id, extras)
  • unlink(self)
  • update_closing_control_state_session(self, notes)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_order_line_id Many2one → pos.order.line
    index='btree_not_null' ondelete='cascade' string='PoS Order Line' args: 'pos.order.line'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • qty_free Integer
    default=1 help='Number of free items included in the combo.' string='Free quantity'
  • qty_max Integer
    default=1 help='Maximum number of items to select in the combo.' string='Maximum quantity'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_archive(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • has_image Boolean
    compute='_compute_has_image'
  • pos_description Html
    string='Description' translate=True
Public methods (1)
  • write(self, vals)

New fields (7)
  • available_in_pos Boolean
    default=False help='Check if you want this product to appear in the Point of Sale.' string='Available in POS'
  • color Integer
    compute='_compute_color' readonly=False store=True args: 'Color Index'
  • pos_categ_ids Many2many → pos.category
    help='Category used in the Point of Sale.' string='Point of Sale Category' args: 'pos.category'
  • pos_optional_product_ids Many2many → product.template
    column1='src_id' column2='dest_id' comodel_name='product.template' help='Optional products are suggested when customers add items to their cart (e.g., adding a burger suggests cold drinks or fries).' relation='pos_product_optional_rel' string='POS Optional Products'
  • pos_sequence Integer
    copy=False default=_default_pos_sequence help='Determine the display order in the POS Terminal' string='POS Sequence'
  • public_description Html
    string='Product Description' translate=True
  • to_weight Boolean
    help='Check if the product should be weighted using the hardware scale integration.' string='To Weigh With Scale'
Public methods (5)
  • action_archive(self)
  • create_product_variant_from_pos(self, attribute_value_ids, config_id)
    Create a product variant from the POS interface.
  • get_product_info_pos(self, price, quantity, pos_config_id, product_variant_id=False)
  • load_product_from_pos(self, config_id, domain, offset=0, limit=0)
    @api.model
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_sale_details(self, date_start=False, date_stop=False, config_ids=False, session_ids=False, **kwargs)
    @api.model
    Serialise the orders of the requested time period, configs and sessions. :param date_start: The dateTime to start, default today 00:00:00. :type date_start: str. :param date_stop: The dateTime to stop, default date_start + 23:59:59. :type date_stop: str. :param config_ids: Pos Config id's to include. :type config_ids: list of numbers. :param session_ids: Pos Config id's to include. :type session_ids: list of numbers. :returns: dict -- Serialised sales.

New fields (25)
  • average_price Float
    aggregator='avg' readonly=True string='Average Price'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=True string='Point of Sale' args: 'pos.config'
  • date Datetime
    readonly=True string='Order Date'
  • delay_validation Integer
    readonly=True string='Delay Validation'
  • invoiced Boolean
    readonly=True
  • journal_id Many2one → account.journal
    readonly=True string='Journal' args: 'account.journal'
  • margin Float
    readonly=True string='Margin'
  • nbr_lines Integer
    readonly=True string='Sale Line Count'
  • order_id Many2one → pos.order
    readonly=True string='Order' args: 'pos.order'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • payment_method_id Many2one → pos.payment.method
    readonly=True string='Payment Method' args: 'pos.payment.method'
  • pos_categ_id Many2one → pos.category
    readonly=True string='Point of Sale Category' args: 'pos.category'
  • price_sub_total Float
    readonly=True string='Subtotal w/o discount'
  • price_subtotal_excl Float
    readonly=True string='Subtotal w/o Tax'
  • price_total Float
    readonly=True string='Total Price'
  • pricelist_id Many2one → product.pricelist
    readonly=True string='Pricelist' args: 'product.pricelist'
  • product_categ_id Many2one → product.category
    readonly=True string='Product Category' args: 'product.category'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Integer
    readonly=True string='Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True string='Product Template' args: 'product.template'
  • session_id Many2one → pos.session
    readonly=True string='Session' args: 'pos.session'
  • state Selection
    readonly=True string='Status' args: [('draft', 'New'), ('paid', 'Paid'), ('done', 'Posted'), ('cancel', 'Cancelled')]
  • total_discount Float
    readonly=True string='Total Discount'
  • user_id Many2one → res.users
    readonly=True string='User' args: 'res.users'
Public methods (1)
  • init(self)

New fields (4)
  • point_of_sale_ticket_portal_url_display_mode Selection
    default='qr_code_and_url' help='Choose how the URL to the portal will be print on the receipt.' required=True string='Print' args: [('qr_code', 'QR code'), ('url', 'URL'), ('qr_code_and_url', 'QR code + URL')]
  • point_of_sale_ticket_unique_code Boolean
    help='Add a 5-digit code on the receipt to allow the user to request the invoice for an order on the portal.' string='Generate a code on ticket'
  • point_of_sale_update_stock_quantities Selection
    default='real' help="At the session closing: A picking is created for the entire session when it's closed\n In real time: Each order sent to the server create its own picking" string='Update quantities in stock' args: [('closing', 'At the session closing'), ('real', 'In real time')]
  • point_of_sale_use_ticket_qr_code Boolean
    default=True help="Print information on the receipt to allow the customer to easily access the invoice anytime, from Odoo's portal." string='Self-service invoicing'
Public methods (1)
  • validate_lock_dates(self)
    @api.constrains('fiscalyear_lock_date', 'tax_lock_date', 'sale_lock_date', 'hard_lock_date')
    This constrains makes it impossible to change the relevant lock dates if some open POS session would violate them. Without that, these POS sessions could not be closed (since the closing entries violate the lock dates).

New fields (90)
  • account_default_pos_receivable_account_id Many2one
    check_company=True readonly=False related='company_id.account_default_pos_receivable_account_id' string='Default Account Receivable (PoS)'
  • barcode_nomenclature_id Many2one → barcode.nomenclature
    readonly=False related='company_id.nomenclature_id' args: 'barcode.nomenclature'
  • group_pos_preset Boolean
    help='Hide or show the Presets menu in the Point of Sale configuration.' implied_group='point_of_sale.group_pos_preset' string='Presets'
  • is_kiosk_mode Boolean
    default=False string='Is Kiosk Mode'
  • module_pos_adyen Boolean
    help='The transactions are processed by Adyen. Set your Adyen credentials on the related payment method.' string='Adyen Payment Terminal'
  • module_pos_mercado_pago Boolean
    help='The transactions are processed by Mercado Pago. Set your Mercado Pago credentials on the related payment method.' string='Mercado Pago Payment Terminal'
  • module_pos_pine_labs Boolean
    help='The transactions are processed by Pine Labs. Set your Pine Labs credentials on the related payment method.' string='Pine Labs Payment Terminal'
  • module_pos_pricer Boolean
    help='Display the price of your products through electronic price tags' string='Pricer electronic price tags'
  • module_pos_qfpay Boolean
    help='The transactions are processed by QFPay. Set your QFPay credentials on the related payment method.' string='QFPay Payment Terminal'
  • module_pos_razorpay Boolean
    help='The transactions are processed by Razorpay. Set your Razorpay credentials on the related payment method.' string='Razorpay Payment Terminal'
  • module_pos_stripe Boolean
    help='The transactions are processed by Stripe. Set your Stripe credentials on the related payment method.' string='Stripe Payment Terminal'
  • module_pos_viva_com Boolean
    help='The transactions are processed by Viva.com on terminal or tap on phone.' string='Viva.com Payment Terminal'
  • point_of_sale_ticket_portal_url_display_mode Selection
    readonly=False related='company_id.point_of_sale_ticket_portal_url_display_mode' required=True
  • point_of_sale_ticket_unique_code Boolean
    readonly=False related='company_id.point_of_sale_ticket_unique_code'
  • point_of_sale_use_ticket_qr_code Boolean
    readonly=False related='company_id.point_of_sale_use_ticket_qr_code'
  • pos_allowed_pricelist_ids Many2many → product.pricelist
    compute='_compute_pos_allowed_pricelist_ids' args: 'product.pricelist'
  • pos_amount_authorized_diff Float
    readonly=False related='pos_config_id.amount_authorized_diff'
  • pos_auto_validate_terminal_payment Boolean
    readonly=False related='pos_config_id.auto_validate_terminal_payment' string='Automatically validates orders paid with a payment terminal.'
  • pos_available_preset_ids Many2many → pos.preset
    readonly=False related='pos_config_id.available_preset_ids' args: 'pos.preset'
  • pos_available_pricelist_ids Many2many → product.pricelist
    compute='_compute_pos_pricelist_id' readonly=False store=True string='Available Pricelists' args: 'product.pricelist'
  • pos_basic_receipt Boolean
    readonly=False related='pos_config_id.basic_receipt'
  • pos_cash_control Boolean
    related='pos_config_id.cash_control'
  • pos_cash_rounding Boolean
    readonly=False related='pos_config_id.cash_rounding' string='Cash Rounding (PoS)'
  • pos_company_has_template Boolean
    related='pos_config_id.company_has_template'
  • pos_config_id Many2one → pos.config
    default=<expr> string='Point of Sale' args: 'pos.config'
  • pos_customer_display_bg_img Image
    readonly=False related='pos_config_id.customer_display_bg_img'
  • pos_customer_display_bg_img_name Char
    readonly=False related='pos_config_id.customer_display_bg_img_name'
  • pos_default_bill_ids Many2many
    readonly=False related='pos_config_id.default_bill_ids'
  • pos_default_fiscal_position_id Many2one → account.fiscal.position
    check_company=True compute='_compute_pos_fiscal_positions' readonly=False store=True string='Default Fiscal Position' args: 'account.fiscal.position'
  • pos_default_preset_id Many2one → pos.preset
    readonly=False related='pos_config_id.default_preset_id' args: 'pos.preset'
  • pos_epson_printer_ip Char
    readonly=False related='pos_config_id.epson_printer_ip'
  • pos_fallback_nomenclature_id Many2one
    domain="[('id', '!=', barcode_nomenclature_id)]" readonly=False related='pos_config_id.fallback_nomenclature_id'
  • pos_fast_payment_method_ids Many2many
    readonly=False related='pos_config_id.fast_payment_method_ids'
  • pos_fiscal_position_ids Many2many → account.fiscal.position
    check_company=True compute='_compute_pos_fiscal_positions' readonly=False store=True string='Fiscal Positions' args: 'account.fiscal.position'
  • pos_has_active_session Boolean
    related='pos_config_id.has_active_session'
  • pos_iface_available_categ_ids Many2many → pos.category
    compute='_compute_pos_iface_available_categ_ids' readonly=False store=True string='Available PoS Product Categories' args: 'pos.category'
  • pos_iface_big_scrollbars Boolean
    readonly=False related='pos_config_id.iface_big_scrollbars'
  • pos_iface_cashdrawer Boolean
    compute='_compute_pos_iface_cashdrawer' readonly=False store=True string='Cashdrawer'
  • pos_iface_electronic_scale Boolean
    compute='_compute_pos_iface_electronic_scale' readonly=False store=True string='Electronic Scale'
  • pos_iface_group_by_categ Boolean
    readonly=False related='pos_config_id.iface_group_by_categ'
  • pos_iface_print_auto Boolean
    readonly=False related='pos_config_id.iface_print_auto'
  • pos_iface_print_skip_screen Boolean
    readonly=False related='pos_config_id.iface_print_skip_screen'
  • pos_iface_print_via_proxy Boolean
    compute='_compute_pos_iface_print_via_proxy' readonly=False store=True string='Print via Proxy'
  • pos_iface_scan_via_proxy Boolean
    compute='_compute_pos_iface_scan_via_proxy' readonly=False store=True string='Scan via Proxy'
  • pos_iface_tax_included Selection
    readonly=False related='pos_config_id.iface_tax_included'
  • pos_iface_tipproduct Boolean
    readonly=False related='pos_config_id.iface_tipproduct'
  • pos_invoice_journal_id Many2one
    readonly=False related='pos_config_id.invoice_journal_id'
  • pos_is_closing_entry_by_product Boolean
    readonly=False related='pos_config_id.is_closing_entry_by_product'
  • pos_is_header_or_footer Boolean
    readonly=False related='pos_config_id.is_header_or_footer'
  • pos_is_margins_costs_accessible_to_every_user Boolean
    readonly=False related='pos_config_id.is_margins_costs_accessible_to_every_user'
  • pos_is_order_printer Boolean
    compute='_compute_pos_printer' readonly=False store=True
  • pos_is_posbox Boolean
    readonly=False related='pos_config_id.is_posbox'
  • pos_journal_id Many2one
    readonly=False related='pos_config_id.journal_id'
  • pos_limit_categories Boolean
    readonly=False related='pos_config_id.limit_categories'
  • pos_manual_discount Boolean
    readonly=False related='pos_config_id.manual_discount'
  • pos_module_pos_appointment Boolean
    readonly=False related='pos_config_id.module_pos_appointment'
  • pos_module_pos_avatax Boolean
    readonly=False related='pos_config_id.module_pos_avatax'
  • pos_module_pos_discount Boolean
    readonly=False related='pos_config_id.module_pos_discount'
  • pos_module_pos_hr Boolean
    readonly=False related='pos_config_id.module_pos_hr'
  • pos_module_pos_restaurant Boolean
    readonly=False related='pos_config_id.module_pos_restaurant'
  • pos_module_pos_sms Boolean
    readonly=False related='pos_config_id.module_pos_sms'
  • pos_note_ids Many2many
    readonly=False related='pos_config_id.note_ids'
  • pos_only_round_cash_method Boolean
    readonly=False related='pos_config_id.only_round_cash_method'
  • pos_order_edit_tracking Boolean
    readonly=False related='pos_config_id.order_edit_tracking'
  • pos_other_devices Boolean
    readonly=False related='pos_config_id.other_devices'
  • pos_payment_method_ids Many2many
    readonly=False related='pos_config_id.payment_method_ids'
  • pos_picking_policy Selection
    readonly=False related='pos_config_id.picking_policy'
  • pos_picking_type_id Many2one
    readonly=False related='pos_config_id.picking_type_id'
  • pos_pricelist_id Many2one → product.pricelist
    compute='_compute_pos_pricelist_id' readonly=False store=True string='Default Pricelist' args: 'product.pricelist'
  • pos_printer_ids Many2many
    readonly=False related='pos_config_id.printer_ids'
  • pos_proxy_ip Char
    readonly=False related='pos_config_id.proxy_ip' string='IP Address'
  • pos_receipt_footer Text
    compute='_compute_pos_receipt_header_footer' readonly=False store=True string='Receipt Footer'
  • pos_receipt_header Text
    compute='_compute_pos_receipt_header_footer' readonly=False store=True string='Receipt Header'
  • pos_restrict_price_control Boolean
    readonly=False related='pos_config_id.restrict_price_control'
  • pos_rounding_method Many2one
    readonly=False related='pos_config_id.rounding_method'
  • pos_route_id Many2one
    readonly=False related='pos_config_id.route_id'
  • pos_selectable_categ_ids Many2many → pos.category
    compute='_compute_pos_selectable_categ_ids' args: 'pos.category'
  • pos_set_maximum_difference Boolean
    readonly=False related='pos_config_id.set_maximum_difference'
  • pos_ship_later Boolean
    readonly=False related='pos_config_id.ship_later'
  • pos_show_category_images Boolean
    readonly=False related='pos_config_id.show_category_images'
  • pos_show_product_images Boolean
    readonly=False related='pos_config_id.show_product_images'
  • pos_tax_regime_selection Boolean
    readonly=False related='pos_config_id.tax_regime_selection'
  • pos_tip_product_id Many2one → product.product
    compute='_compute_pos_tip_product_id' readonly=False store=True string='Tip Product' args: 'product.product'
  • pos_trusted_config_ids Many2many
    domain="[('id', '!=', pos_config_id), ('module_pos_restaurant', '=', False)]" readonly=False related='pos_config_id.trusted_config_ids'
  • pos_use_fast_payment Boolean
    readonly=False related='pos_config_id.use_fast_payment'
  • pos_use_presets Boolean
    readonly=False related='pos_config_id.use_presets'
  • pos_use_pricelist Boolean
    readonly=False related='pos_config_id.use_pricelist'
  • pos_warehouse_id Many2one
    readonly=False related='pos_config_id.warehouse_id' string='Warehouse (PoS)'
  • sale_tax_id Many2one → account.tax
    check_company=True readonly=False related='company_id.account_sale_tax_id' string='Default Sale Tax' args: 'account.tax'
  • update_stock_quantities Selection
    readonly=False related='company_id.point_of_sale_update_stock_quantities'
Public methods (7)
  • action_pos_config_create_new(self)
  • action_pos_printer_dialog(self)
  • create(self, vals_list)
    @api.model_create_multi
  • open_payment_method_form(self)
  • pos_close_ui(self)
  • pos_open_ui(self)
  • set_values(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • fiscal_position_id Many2one → account.fiscal.position
    compute='_compute_fiscal_position_id' help='Fiscal positions are used to adapt taxes and accounts for particular customers or sales orders/invoices. The default value comes from the customer.' string='Automatic Fiscal Position' args: 'account.fiscal.position'
  • invoice_emails Char
    compute='_compute_invoice_emails' readonly=True
  • pos_contact_address Char
    compute='_compute_pos_contact_address' args: 'PoS Address'
  • pos_order_count Integer
    compute='_compute_pos_order' groups='point_of_sale.group_pos_user' help='The number of point of sales orders related to this customer'
  • pos_order_ids One2many → pos.order
    readonly=True args: 'pos.order', 'partner_id'
Public methods (3)
  • action_view_pos_order(self)
    This function returns an action that displays the pos orders from partner.
  • get_new_partner(self, config_id, domain, offset)
    @api.model
  • open_commercial_entity(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • pos_order_id Many2one → pos.order
    index=True args: 'pos.order'
  • pos_session_id Many2one → pos.session
    index=True args: 'pos.session'
Public methods (0)

No public methods.

New fields (1)
  • has_stock_reports_to_print Boolean
    compute='_compute_has_stock_reports_to_print'
Public methods (0)

No public methods.

New fields (1)
  • pos_order_ids Many2many → pos.order
    string='PoS Orders' args: 'pos.order', 'stock_reference_pos_order_rel', 'reference_id', 'pos_order_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_type_id Many2one → stock.picking.type
    copy=False string='Point of Sale Operation Type' args: 'stock.picking.type'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    help='Check if you want to group products of this unit in point of sale orders' string='Group Products in POS'
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/point_of_sale
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYSales/Point of Sale
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Josse Colpaert, Christophe Simonis, Xavier Morel, Joren Van Onder, qdp-odoo, Atul Patel, Aaron Bohy, Sylvain LE GAL, Damien Bouvy, Yannick Tivisse, Odoo Online, Pierre Masereel, Laurent Smet, Christophe Monniez, Jorge Pinna Puissant, Arnold Moyaux, Aurélien Warnon, Xavier-Do, Romeo Fragomeli, Victor Feyens, Andrea Grazioso (agr-odoo), Adrien Dieudonné, Enric Tobella, William Henrotin, Sébastien Theys, Joseph Caburnay, Julien Mougenot, Anh Thao Pham (pta), svs-odoo, Alvaro Fuentes, Carlos Lopez, Brice bib Bartoletti, lejeune quentin, Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, fja-odoo, Mathieu Duckerts-Antoine, Pierre Paridans, William Braeckman, roen-odoo, Stanislas Sobieski, Ahmad Khanalizadeh, william-andre, Julien Van Roy, Víctor Martínez, Agustín Castro Bugallo, Abdelouahab (abla), Ruben Gomes, Aurelien van Delft (avd), Hubert Van De Walle, luvi, Thomas Binsfeld, Renaud Thiry, rhe-odoo, Vincent Larcin, Habib (ayh), Loan (LSE), David Monnom (moda), Thomas Lefebvre (thle), alsh-odoo, François Honoré, Pedram (PEBR), Louis Wicket (wil), tsm-odoo, Walid, Adrien Widart (awt), nda, Maximilien (malb), Victor Piryns (pivi), Julien (jula), Mahamadasif Ansari, Thomas Becquevort (thbe), Gauthier Wala (gawa), Simon Genin (ges), clesgow, Claire Bretton (clbr), Yosua Nicolaus, Levi Siuzdak (sile), Naman Shah, Antoine Dupuis (andu), Antoine Boonen, Dylan Kiss (dyki), Antoine (ande), Michael (mcm), rolandojduartem, Chong Wang (cwg), Leloup Loïc (lole), prye-odoo, Martin Maes, Ahmed Khalaf, Yaroslav Soroko (yaso), tanghulu0608, Brieuc-brd, David Vidal, Daniel Duque, Paweł Fertyk, Nguyễn Đại Dương, AH-Yussef, Harsh Modi, Zeel Patel, Sarah Bellefroid, Louis Travaux, Theo VINCENT (thvi), Pedram (pebr), Cameron, Arnaud Sibille, Adrien Guilliams (adgu), ilru-odoo, Mattis Megevand (mmeg), omra-odoo, shag-odoo, Nicolas Viseur (vin), Walid (wasa), sesn-odoo, guva-odoo, kdeb@odoo.com, Paul Stroobant, maad-odoo, Youssef Bashandy, Mathieu (mcou), lase@odoo.com, bary, Maryam Kia, Louis (loti), axtr, reka-odoo, Sven Fuehr, Cyrus Robins, vava-odoo, Julien Carion (juca), kcv-odoo, odoostan, mega, Tanguy Quéguineur, Louis Gobert, Lina (liew), Agustin Castro Bugallo, Chrysanthe (chgo), sami odoo, Louis (wil), mano-odoo, Joseph (jcb), Max Whale, yaso, parp-odoo, aamo-odoo, Parth Solanki[PASO], Hussein Ebrahim(hyhe), Majed Alhanash (malh), Victorien (viso), Loukas Wets (lowe), manv-afk, Mathieu Coutant, kais-odoo, Sanchit Gupta, Stéphane Diez, Mohammad Abdulmoneim, Ryan Cen, Claire (clbr), gteboul, vlst, Léo Gizard, Pierre Pulinckx (PIPU), Jitendra Prajapat, paan-odoo, David Monnom, Nesma Harraz, “Ali, Maira Salazar (srma), Arthur Nanson, Ahmed Abdelaziz Hasaneen, elhayyany, djameltouati, Michaël Mattiello, Pierre Pulinckx (pipu), Pierre Pulinckx, Bastien PIERRE, Carmine, bona-odoo, Vincent Sevestre, plha-odoo, vifo, lse-odoo, Krzysztof Magusiak (krma), nape-odoo, Omar (OSAH), rupa-odoo, Ajit Singh, Akash Pandey, joseph, Hazem Ibrahim, Shubham Agarwal [SHAG], Basioni (basm), utma-odoo, Sylvio Poliart (sypol), Harrison Hutton, Robin Engels (roen), Hadi El Yakhni, dhruv, zorbmax, Guillaume V, Manu Vaillant (manv), vevi-odoo, vlst-odoo, Maeva De Keyser (MDEK), rida, sagu-odoo, kdes-odoo, Meet Jivani [MEJI], ksku-odoo, vpan-odoo, Tyler Landivar (tylan), aksi-odoo, temo-odoo, sjai-odoo, Dhwani Patel, Laurent Smet (LAS), Ali Hassan (alhy), shka-odoo, path-odoo, Yash Pathak, Martin Doyen, meji-odoo, kaju-odoo, Vraj Panchal, David (davg), Eve Lin (evlin), nesma-neha, Ali (alhy), Thomas (thsc), Léopold Cantraine, zadh-odoo, Stephen Anthony, Youssef (yoma), vlad, abhk-odoo, rpka-odoo, a-k-s-h-a-y, Stephane Vanmeerhaeghe, jand-odoo, taal-odoo, Audrey (auva), Andreas Bichinger, Stephane Vanmeerhaeghe (stva), Keya Patel, ncharlie, Pierre (pco), Julien Segers, Traina Ludo, enricodg, Adnan Sabbir
WEBSITE
WEBSITEhttps://www.odoo.com/app/point-of-sale-shop
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 13:43:08
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - onboarding
    - analytic
    - phone_validation
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (66)
XML IDNameModelTypeStatus
digest_digest_view_form digest.digest.view.form.inherit.sale.order digest.digest xpath Inherits digest.digest_digest_view_form
point_of_sale.customer_display_index POS Customer Display ir.ui.view qweb New
point_of_sale.index POS Index ir.ui.view qweb New
point_of_sale.product_combo_view_form product.combo.form.inherit.point.of.sale product.combo field Inherits product.product_combo_view_form
point_of_sale.report_invoice_document point_of_sale.report_invoice_document ir.ui.view qweb Inherits account.report_invoice_document
pos_config_view_form pos.config.form.view pos.config form New
pos_daily_sales_html_container pos_daily_sales_html_container ir.ui.view qweb New
pos_daily_sales_report_layout Daily Sales Report layout ir.ui.view qweb New
pos_payment_method_view_form pos.payment.method.form pos.payment.method form New
pos_payment_method_view_search pos.payment.search.view pos.payment.method search New
pos_payment_method_view_tree pos.payment.method.list pos.payment.method list New
pos_rounding_form_view_inherited pos.cash.rounding.form.inherited account.cash.rounding xpath Inherits account.rounding_form_view
pos_session_sales_details pos_session_sales_details ir.ui.view qweb New
product_pos_category_form_view pos.category.form pos.category form New
product_pos_category_tree_view pos.category.list pos.category list New
product_product_tree_view product.product.product.list.inherit product.product field Inherits product.product_product_tree_view
product_product_view_form_normalized_pos product.product.view.form.normalized.inherit product.product xpath Inherits product.product_product_view_form_normalized
product_template_form_view product.template.form.inherit product.template xpath Inherits product.product_template_form_view
product_template_only_form_view product.template.product.form.inherit product.template xpath Inherits product.product_template_only_form_view
product_template_search_view_pos product.template.search.pos.form product.template field Inherits product.product_template_search_view
product_template_tree_view product.template.product.list.inherit product.template field Inherits product.product_template_tree_view
product_uom_categ_form_view uom.category.form.inherit uom.category xpath Inherits uom.product_uom_categ_form_view
product_uom_categ_tree_view uom.category.list.inherit uom.category xpath Inherits uom.product_uom_categ_tree_view
report_pos_order_view_tree report.pos.order.view.list report.pos.order list New
report_saledetails report_saledetails ir.ui.view qweb New
report_userlabel report_userlabel ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.point_of_sale res.config.settings xpath Inherits base.res_config_settings_view_form
ticket_request_with_code Invoice Request ir.ui.view qweb New
ticket_validation_screen ticket_validation_screen ir.ui.view qweb New
view_account_journal_pos_user_form account.journal.pos.user.form.inherit account.journal xpath Inherits account.view_account_journal_form
view_account_journal_pos_user_form account.move.pos.form.inherit account.move xpath Inherits account.view_move_form
view_form_pos_close_session_wizard pos.close.session.wizard.form pos.close.session.wizard form New
view_partner_pos_kanban res.partner.pos.kanban.inherit res.partner xpath Inherits base.res_partner_kanban_view
view_partner_property_form res.partner.pos.form.inherit res.partner div Inherits base.view_partner_form
view_pos_bill_form pos.bill.form pos.bill form New
view_pos_bill_tree pos.bill.list pos.bill list New
view_pos_category_kanban pos.category.kanban pos.category kanban New
view_pos_config_kanban pos.config.kanban.view pos.config kanban New
view_pos_config_search pos.config.search.view pos.config search New
view_pos_config_tree pos.config.list.view pos.config list New
view_pos_daily_sales_reports_wizard pos.daily.sales.reports.wizard.form pos.daily.sales.reports.wizard form New
view_pos_details_wizard pos.details.wizard.form pos.details.wizard form New
view_pos_note_tree Note Models pos.note list New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_kanban pos.order.kanban pos.order kanban New
view_pos_order_line pos.order.line.list pos.order.line list New
view_pos_order_line_form pos.order.line.form pos.order.line form New
view_pos_order_pivot pos.order.pivot pos.order pivot New
view_pos_order_search pos.order.search.view pos.order search New
view_pos_order_tree pos.order.list pos.order list New
view_pos_order_tree_all_sales_lines pos.order.line.all.sales.list pos.order.line list New
view_pos_order_tree_no_session_id pos.order.tree_no_session_id pos.order xpath Inherits point_of_sale.view_pos_order_tree
view_pos_payment pos.make.payment.form pos.make.payment form New
view_pos_payment_form pos.payment.form pos.payment form New
view_pos_payment_search pos.payment.search.view pos.payment search New
view_pos_payment_tree pos.payment.list pos.payment list New
view_pos_pos_form pos.order.form pos.order form New
view_pos_printer Preparation Printers pos.printer list New
view_pos_printer_form Preparation Printer pos.printer form New
view_pos_session_form pos.session.form.view pos.session form New
view_pos_session_kanban pos.session.kanban pos.session kanban New
view_pos_session_search pos.session.search.view pos.session search New
view_pos_session_tree pos.session.list.view pos.session list New
view_report_pos_order_graph report.pos.order.graph report.pos.order graph New
view_report_pos_order_pivot report.pos.order.pivot report.pos.order pivot New
view_report_pos_order_search report.pos.order.search report.pos.order search New
Models touched (70)

New fields (1)
  • pos_session_id Many2one → pos.session
    copy=False string='Session' args: 'pos.session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_archive(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_payment_method_ids One2many → pos.payment.method
    string='Point of Sale Payment Methods' args: 'pos.payment.method', 'journal_id'
Public methods (1)
  • action_archive(self)

New fields (5)
  • pos_order_ids One2many → pos.order
    args: 'pos.order', 'account_move'
  • pos_payment_ids One2many → pos.payment
    args: 'pos.payment', 'account_move_id'
  • pos_refunded_invoice_ids Many2many → account.move
    args: 'account.move', 'refunded_invoices', 'refund_account_move', 'original_account_move'
  • pos_session_ids One2many → pos.session
    args: 'pos.session', 'move_id', 'POS Sessions'
  • reversed_pos_order_id Many2one → pos.order
    help='The pos order that was reverted after closing the session to create an invoice for it.' string='Reversed POS Order' args: 'pos.order'
Public methods (1)
  • button_draft(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • force_outstanding_account_id Many2one → account.account
    check_company=True args: 'account.account', 'Forced Outstanding Account'
  • pos_payment_method_id Many2one → pos.payment.method
    args: 'pos.payment.method', 'POS Payment Method'
  • pos_session_id Many2one → pos.session
    args: 'pos.session', 'POS Session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • type Selection
    ondelete={'weight': 'set default', 'price': 'set default', 'discount': 'set default', 'client': 'set default', 'cashier': 'set default'} selection_add=[('weight', 'Weighted Product'), ('price', 'Priced Product'), ('discount', 'Discounted Product'), ('client', 'Client'), ('cashier', 'Cashier')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • kpi_pos_total Boolean
    args: 'POS Sales'
  • kpi_pos_total_value Monetary
    compute='_compute_kpi_pos_total_value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_send_mail(self)

New fields (4)
  • for_all_config Boolean
    default=True help='If checked, this coin/bill will be available in all PoS.' args: 'For All PoS'
  • name Char
    args: 'Name'
  • pos_config_ids Many2many → pos.config
    string='Point of Sales' args: 'pos.config'
  • value Float
    digits=(16, 4) required=True args: 'Coin/Bill Value'
Public methods (1)
  • name_create(self, name)
    @api.model

New fields (1)
  • access_token Char
    copy=False args: 'Security Token'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (7)
  • child_ids One2many → pos.category
    string='Children Categories' args: 'pos.category', 'parent_id'
  • color Integer
    default=get_default_color required=False args: 'Color'
  • has_image Boolean
    compute='_compute_has_image'
  • image_128 Image
    max_height=128 max_width=128 args: 'Image'
  • name Char
    required=True string='Category Name' translate=True
  • parent_id Many2one → pos.category
    index=True string='Parent Category' args: 'pos.category'
  • sequence Integer
    help='Gives the sequence order when displaying a list of product categories.'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • get_default_color(self)
  • write(self, vals)

New fields (4)
  • account_id Many2one → account.account
    args: 'account.account', 'Destination account'
  • account_readonly Boolean
    args: 'Destination account is readonly'
  • amount_to_balance Float
    args: 'Amount to balance'
  • message Text
    args: 'Information message'
Public methods (1)
  • close_session(self)

New fields (84)
  • access_token Char
    default=<expr> args: 'Access Token'
  • active Boolean
    default=True
  • amount_authorized_diff Float
    help='This field depicts the maximum difference allowed between the ending balance and the theoretical cash when closing a session, for non-POS managers. If this maximum is reached, the user will have an error message at the closing of his session saying that he needs to contact his manager.' args: 'Amount Authorized Difference'
  • auto_validate_terminal_payment Boolean
    default=True help='Automatically validates orders paid with a payment terminal.'
  • available_pricelist_ids Many2many → product.pricelist
    help='Make several pricelists available in the Point of Sale. You can also apply a pricelist to specific customers from their contact form (in Sales tab). To be valid, this pricelist must be listed here as an available pricelist. Otherwise the default pricelist will apply.' string='Available Pricelists' args: 'product.pricelist'
  • basic_receipt Boolean
    help='Print basic ticket without prices. Can be used for gifts.' string='Basic Receipt'
  • cash_control Boolean
    compute='_compute_cash_control' help='Check the amount of the cashbox at opening and closing.' string='Advanced Cash Control'
  • cash_rounding Boolean
    string='Cash Rounding'
  • company_has_template Boolean
    compute='_compute_company_has_template' string='Company has chart of accounts'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    compute='_compute_currency' compute_sudo=True string='Currency' args: 'res.currency'
  • current_session_id Many2one → pos.session
    compute='_compute_current_session' string='Current Session' args: 'pos.session'
  • current_session_state Char
    compute='_compute_current_session'
  • current_user_id Many2one → res.users
    compute='_compute_current_session_user' string='Current Session Responsible' args: 'res.users'
  • customer_display_bg_img Image
    max_height=1920 max_width=1920 string='Background Image'
  • customer_display_bg_img_name Char
    string='Background Image Name'
  • customer_display_type Selection
    default='local' help='Show checkout to customers.' selection=<expr> string='Customer Facing Display'
  • default_bill_ids Many2many → pos.bill
    string='Coins/Bills' args: 'pos.bill'
  • default_fiscal_position_id Many2one → account.fiscal.position
    string='Default Fiscal Position' args: 'account.fiscal.position'
  • fiscal_position_ids Many2many → account.fiscal.position
    help='This is useful for restaurants with onsite and take-away services that imply specific tax rates.' string='Fiscal Positions' args: 'account.fiscal.position'
  • group_pos_manager_id Many2one → res.groups
    default=_get_group_pos_manager help='This field is there to pass the id of the pos manager group to the point of sale client.' string='Point of Sale Manager Group' args: 'res.groups'
  • group_pos_user_id Many2one → res.groups
    default=_get_group_pos_user help='This field is there to pass the id of the pos user group to the point of sale client.' string='Point of Sale User Group' args: 'res.groups'
  • has_active_session Boolean
    compute='_compute_current_session'
  • iface_available_categ_ids Many2many → pos.category
    help='The point of sale will only display products which are within one of the selected category trees. If no category is specified, all available products will be shown' string='Available PoS Product Categories' args: 'pos.category'
  • iface_big_scrollbars Boolean
    help='For imprecise industrial touchscreens.' args: 'Large Scrollbars'
  • iface_cashdrawer Boolean
    help='Automatically open the cashdrawer.' string='Cashdrawer'
  • iface_electronic_scale Boolean
    help='Enables Electronic Scale integration.' string='Electronic Scale'
  • iface_print_auto Boolean
    default=False help='The receipt will automatically be printed at the end of each order.' string='Automatic Receipt Printing'
  • iface_print_skip_screen Boolean
    default=True help='The receipt screen will be skipped if the receipt can be printed automatically.' string='Skip Preview Screen'
  • iface_print_via_proxy Boolean
    help='Bypass browser printing and prints via the hardware proxy.' string='Print via Proxy'
  • iface_scan_via_proxy Boolean
    help='Enable barcode scanning with a remotely connected barcode scanner and card swiping with a Vantiv card reader.' string='Scan via Proxy'
  • iface_tax_included Selection
    default='total' required=True string='Tax Display' args: [('subtotal', 'Tax-Excluded Price'), ('total', 'Tax-Included Price')]
  • iface_tipproduct Boolean
    string='Product tips'
  • invoice_journal_id Many2one → account.journal
    check_company=True default=_default_invoice_journal domain=[('type', '=', 'sale')] help='Accounting journal used to create invoices.' string='Invoice Journal' args: 'account.journal'
  • is_closing_entry_by_product Boolean
    help='Display the breakdown of sales lines by product in the automatically generated closing entry.' string='Closing Entry by product'
  • is_header_or_footer Boolean
    args: 'Custom Header & Footer'
  • is_installed_account_accountant Boolean
    compute='_compute_is_installed_account_accountant' string='Is the Full Accounting Installed'
  • is_margins_costs_accessible_to_every_user Boolean
    default=False help='When disabled, only PoS manager can view the margin and cost of product among the Product info.' string='Margins & Costs'
  • is_order_printer Boolean
    args: 'Order Printer'
  • is_posbox Boolean
    args: 'PosBox'
  • journal_id Many2one → account.journal
    check_company=True default=_default_sale_journal domain=[('type', 'in', ('general', 'sale'))] help='Accounting journal used to post POS session journal entries and POS invoice payments.' ondelete='restrict' string='Point of Sale Journal' args: 'account.journal'
  • last_session_closing_cash Float
    compute='_compute_last_session'
  • last_session_closing_date Date
    compute='_compute_last_session'
  • limit_categories Boolean
    args: 'Restrict Categories'
  • manual_discount Boolean
    default=True string='Line Discounts'
  • module_pos_avatax Boolean
    help='Use automatic taxes mapping with Avatax in PoS' args: 'AvaTax PoS Integration'
  • module_pos_discount Boolean
    args: 'Global Discounts'
  • module_pos_hr Boolean
    help='Show employee login screen'
  • module_pos_restaurant Boolean
    args: 'Is a Bar/Restaurant'
  • module_pos_sms Boolean
    help='Activate SMS feature for point_of_sale' string='SMS Enabled'
  • name Char
    help='An internal identification of the point of sale.' required=True string='Point of Sale'
  • note_ids Many2many → pos.note
    help='The predefined notes of this point of sale.' string='Note Models' args: 'pos.note'
  • number_of_rescue_session Integer
    compute='_compute_current_session' string='Number of Rescue Session'
  • only_round_cash_method Boolean
    string='Only apply rounding on cash'
  • order_edit_tracking Boolean
    default=False help='Store edited orders in the backend' string='Track orders edits'
  • orderlines_sequence_in_cart_by_category Boolean
    default=False help="When active, orderlines will be sorted based on product category and sequence in the product screen's order cart." string="Order cart by category's sequence"
  • other_devices Boolean
    help='Connect devices to your PoS without an IoT Box.' string='Other Devices'
  • payment_method_ids Many2many → pos.payment.method
    copy=False default=<expr> string='Payment Methods' args: 'pos.payment.method'
  • picking_policy Selection
    default='direct' help='If you deliver all products at once, the delivery order will be scheduled based on the greatest product lead time. Otherwise, it will be based on the shortest.' required=True string='Shipping Policy' args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')]
  • picking_type_id Many2one → stock.picking.type
    default=_default_picking_type_id domain=<expr> ondelete='restrict' required=True string='Operation Type' args: 'stock.picking.type'
  • pos_session_duration Char
    compute='_compute_current_session_user'
  • pos_session_state Char
    compute='_compute_current_session_user'
  • pos_session_username Char
    compute='_compute_current_session_user'
  • pricelist_id Many2one → product.pricelist
    help='The pricelist used if no customer is selected or if the customer has no Sale Pricelist configured if any.' string='Default Pricelist' args: 'product.pricelist'
  • printer_ids Many2many → pos.printer
    string='Order Printers' args: 'pos.printer', 'pos_config_printer_rel', 'config_id', 'printer_id'
  • proxy_ip Char
    help='The hostname or ip address of the hardware proxy, Will be autodetected if left empty.' size=45 string='IP Address'
  • receipt_footer Text
    help='A short text that will be inserted as a footer in the printed receipt.' string='Receipt Footer'
  • receipt_header Text
    help='A short text that will be inserted as a header in the printed receipt.' string='Receipt Header'
  • restrict_price_control Boolean
    help='Only users with Manager access rights for PoS app can modify the product prices on orders.' string='Restrict Price Modifications to Managers'
  • rounding_method Many2one → account.cash.rounding
    string='Cash rounding' args: 'account.cash.rounding'
  • route_id Many2one → stock.route
    string='Spefic route for products delivered later.' args: 'stock.route'
  • sequence_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders.' ondelete='restrict' readonly=True string='Order IDs Sequence' args: 'ir.sequence'
  • sequence_line_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders lines.' readonly=True string='Order Line IDs Sequence' args: 'ir.sequence'
  • session_ids One2many → pos.session
    string='Sessions' args: 'pos.session', 'config_id'
  • set_maximum_difference Boolean
    help='Set a maximum difference allowed between the expected and counted money during the closing of the session.' args: 'Set Maximum Difference'
  • ship_later Boolean
    string='Ship Later'
  • show_category_images Boolean
    default=True help='Show category images in the Point of Sale interface.' string='Show Category Images'
  • show_product_images Boolean
    default=True help='Show product images in the Point of Sale interface.' string='Show Product Images'
  • tax_regime_selection Boolean
    args: 'Tax Regime Selection value'
  • tip_product_id Many2one → product.product
    default=_get_default_tip_product help='This product is used as reference on customer receipts.' string='Tip Product' args: 'product.product'
  • trusted_config_ids Many2many → pos.config
    column1='is_trusting' column2='is_trusted' domain="[('company_id', '=', company_id)]" relation='pos_config_trust_relation' string='Trusted Point of Sale Configurations' args: 'pos.config'
  • use_pricelist Boolean
    args: 'Use a pricelist.'
  • uuid Char
    copy=False default=<expr> help='A globally unique identifier for this pos configuration, used to prevent conflicts in client-generated data.' readonly=True
  • warehouse_id Many2one → stock.warehouse
    compute='_compute_warehouse_id' ondelete='restrict' precompute=True readonly=False store=True args: 'stock.warehouse'
Public methods (21)
  • action_pos_config_modal_edit(self)
  • create(self, vals_list)
    @api.model_create_multi
  • execute(self)
  • get_categories(self, categories)
  • get_limited_partners_loading(self)
  • get_limited_product_count(self)
  • get_limited_products_loading(self, fields)
  • get_pos_kanban_view_state(self)
    @api.model
  • get_records(self, data)
  • install_pos_restaurant(self)
    @api.model
  • load_onboarding_bakery_scenario(self)
    @api.model
  • load_onboarding_clothes_scenario(self)
    @api.model
  • load_onboarding_furniture_scenario(self)
    @api.model
  • notify_synchronisation(self, session_id, login_number, records={})
  • open_existing_session_cb(self)
    close session button access session form to validate entries
  • open_opened_rescue_session_form(self)
  • open_ui(self)
    Open the pos interface with config_id as an extra argument. In vanilla PoS each user can only have one active session, therefore it was not needed to pass the config_id on opening a session. It is also possible to login to sessions created by other users. :returns: dict
  • read_config_open_orders(self, domain, record_ids=[])
  • unlink(self)
  • update_customer_display(self, order, access_token)
  • write(self, vals)

New fields (1)
  • pos_session_id Many2one → pos.session
    required=True args: 'pos.session'
Public methods (1)
  • generate_report(self)

New fields (3)
  • end_date Datetime
    default=fields.Datetime.now required=True
  • pos_config_ids Many2many → pos.config
    default=<expr> args: 'pos.config', 'pos_detail_configs'
  • start_date Datetime
    default=_default_start_date required=True
Public methods (1)
  • generate_report(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • amount Float
    default=_default_amount digits=0 required=True
  • config_id Many2one → pos.config
    default=_default_config required=True string='Point of Sale Configuration' args: 'pos.config'
  • payment_date Datetime
    default=<expr> required=True string='Payment Date'
  • payment_method_id Many2one → pos.payment.method
    default=_default_payment_method required=True string='Payment Method' args: 'pos.payment.method'
  • payment_name Char
    string='Payment Reference'
Public methods (2)
  • check(self)
    Check the order: if the order is not paid: continue payment, if the order is paid print ticket.
  • launch_payment(self)

New fields (2)
  • name Char
    required=True
  • sequence Integer
    default=1 args: 'Sequence'
Public methods (0)

No public methods.

New fields (54)
  • account_move Many2one → account.move
    copy=False index='btree_not_null' readonly=True string='Invoice' args: 'account.move'
  • amount_difference Monetary
    readonly=True string='Difference'
  • amount_paid Monetary
    required=True string='Paid'
  • amount_return Monetary
    readonly=True required=True string='Returned'
  • amount_tax Monetary
    readonly=True required=True string='Taxes'
  • amount_total Monetary
    readonly=True required=True string='Total'
  • available_payment_method_ids Many2many → pos.payment.method
    readonly=True related='config_id.payment_method_ids' store=False string='Available Payment Methods' args: 'pos.payment.method'
  • company_id Many2one → res.company
    index=True readonly=True required=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=False related='session_id.config_id' store=True string='Point of Sale' args: 'pos.config'
  • country_code Char
    related='company_id.account_fiscal_country_id.code'
  • currency_id Many2one → res.currency
    related='config_id.currency_id' string='Currency' args: 'res.currency'
  • currency_rate Float
    compute='_compute_currency_rate' compute_sudo=True digits=0 help='The rate of the currency to the currency of rate applicable at the date of the order' readonly=True store=True args: 'Currency Rate'
  • date_order Datetime
    default=fields.Datetime.now index=True readonly=True string='Date'
  • email Char
    compute='_compute_contact_details' readonly=False store=True string='Email'
  • failed_pickings Boolean
    compute='_compute_picking_count'
  • fiscal_position_id Many2one → account.fiscal.position
    comodel_name='account.fiscal.position' readonly=False string='Fiscal Position'
  • floating_order_name Char
    string='Order Name'
  • general_note Text
    string='General Note'
  • has_deleted_line Boolean
    string='Has Deleted Line'
  • has_refundable_lines Boolean
    compute='_compute_has_refundable_lines' args: 'Has Refundable Lines'
  • is_edited Boolean
    compute='_compute_is_edited' string='Edited'
  • is_invoiced Boolean
    compute='_compute_is_invoiced' args: 'Is Invoiced'
  • is_tipped Boolean
    readonly=True args: 'Is this already tipped?'
  • is_total_cost_computed Boolean
    compute='_compute_is_total_cost_computed' help='Allows to know if all the total cost of the order lines have already been computed'
  • last_order_preparation_change Char
    help='Last printed state of the order' string='Last preparation change'
  • lines One2many → pos.order.line
    copy=True string='Order Lines' args: 'pos.order.line', 'order_id'
  • margin Monetary
    compute='_compute_margin' string='Margin'
  • margin_percent Float
    compute='_compute_margin' digits=(12, 4) string='Margin (%)'
  • mobile Char
    compute='_compute_contact_details' readonly=False store=True string='Mobile'
  • name Char
    copy=False default='/' readonly=True required=True string='Order Ref'
  • nb_print Integer
    copy=False default=0 readonly=True string='Number of Print'
  • order_edit_tracking Boolean
    readonly=True related='config_id.order_edit_tracking'
  • partner_id Many2one → res.partner
    change_default=True index='btree_not_null' string='Customer' args: 'res.partner'
  • payment_ids One2many → pos.payment
    string='Payments' args: 'pos.payment', 'pos_order_id'
  • picking_count Integer
    compute='_compute_picking_count'
  • picking_ids One2many → stock.picking
    args: 'stock.picking', 'pos_order_id'
  • picking_type_id Many2one → stock.picking.type
    readonly=False related='session_id.config_id.picking_type_id' string='Operation Type' args: 'stock.picking.type'
  • pos_reference Char
    copy=False index=True readonly=True string='Receipt Number'
  • pricelist_id Many2one → product.pricelist
    string='Pricelist' args: 'product.pricelist'
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • refund_orders_count Integer
    compute='_compute_refund_related_fields' help='Number of orders where items from this order were refunded' args: 'Number of Refund Orders'
  • refunded_order_id Many2one → pos.order
    compute='_compute_refund_related_fields' help='Order from which items were refunded in this order' args: 'pos.order'
  • sale_journal Many2one → account.journal
    ondelete='restrict' readonly=True related='session_id.config_id.journal_id' store=True string='Sales Journal' args: 'account.journal'
  • sequence_number Integer
    default=1 help='A session-unique sequence number for the order' string='Sequence Number'
  • session_id Many2one → pos.session
    domain="[('state', '=', 'opened')]" index=True required=True string='Session' args: 'pos.session'
  • session_move_id Many2one → account.move
    copy=False readonly=True related='session_id.move_id' string='Session Journal Entry' args: 'account.move'
  • shipping_date Date
    args: 'Shipping Date'
  • state Selection
    copy=False default='draft' index=True readonly=True args: [('draft', 'New'), ('cancel', 'Cancelled'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced')], 'Status'
  • ticket_code Char
    help='5 digits alphanumeric code to be used by portal user to request an invoice'
  • tip_amount Monetary
    readonly=True string='Tip Amount'
  • to_invoice Boolean
    copy=False args: 'To invoice'
  • tracking_number Char
    compute='_compute_tracking_number' search='_search_tracking_number' string='Order Number'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> help='Employee who uses the cash register.' string='Employee'
  • uuid Char
    copy=False readonly=True string='Uuid'
Public methods (18)
  • action_pos_order_cancel(self)
  • action_pos_order_invoice(self)
  • action_pos_order_paid(self)
  • action_send_mail(self)
  • action_send_receipt(self, email, ticket_image, basic_image)
  • action_stock_picking(self)
  • action_view_invoice(self)
  • action_view_refund_orders(self)
  • action_view_refunded_order(self)
  • add_payment(self, data)
    Create a new payment for the order
  • create(self, vals_list)
    @api.model_create_multi
  • get_preparation_change(self)
  • read_pos_data(self, data, config_id)
  • refund(self)
  • remove_from_ui(self, server_ids)
    @api.model
    Remove orders from the frontend PoS application Remove orders from the server by id. :param server_ids: list of the id's of orders to remove from the server. :type server_ids: list. :returns: list -- list of db-ids for the removed orders.
  • search_paid_order_ids(self, config_id, domain, limit, offset)
    @api.model
    Search for 'paid' orders that satisfy the given domain, limit and offset.
  • sync_from_ui(self, orders)
    @api.model
    Create and update Orders from the frontend PoS application. Create new orders and update orders that are in draft status. If an order already exists with a status different from 'draft' it will be discarded, otherwise it will be saved to the database. If saved with 'draft' status the order can be overwritten later by this function. :param orders: dictionary with the orders to be created. :type orders: dict. :param draft: Indicate if the orders are meant to be finalized or temporarily saved. :type draft: bool. :Returns: list -- list of db-ids for the created and updated orders.
  • write(self, vals)

New fields (35)
  • attribute_value_ids Many2many → product.template.attribute.value
    string='Selected Attributes' args: 'product.template.attribute.value'
  • combo_item_id Many2one → product.combo.item
    string='Combo Item' args: 'product.combo.item'
  • combo_line_ids One2many → pos.order.line
    string='Combo Lines' args: 'pos.order.line', 'combo_parent_id'
  • combo_parent_id Many2one → pos.order.line
    string='Combo Parent' args: 'pos.order.line'
  • company_id Many2one → res.company
    related='order_id.company_id' store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='order_id.currency_id' args: 'res.currency'
  • custom_attribute_value_ids One2many → product.attribute.custom.value
    comodel_name='product.attribute.custom.value' inverse_name='pos_order_line_id' readonly=False store=True string='Custom Values'
  • customer_note Char
    args: 'Customer Note'
  • discount Float
    default=0.0 digits=0 string='Discount (%)'
  • full_product_name Char
    args: 'Full Product Name'
  • is_edited Boolean
    default=False args: 'Edited'
  • is_total_cost_computed Boolean
    help='Allows to know if the total cost has already been computed or not'
  • margin Monetary
    compute='_compute_margin' string='Margin'
  • margin_percent Float
    compute='_compute_margin' digits=(12, 4) string='Margin (%)'
  • name Char
    copy=False required=True string='Line No'
  • note Char
    args: 'Product Note'
  • notice Char
    string='Discount Notice'
  • order_id Many2one → pos.order
    index=True ondelete='cascade' required=True string='Order Ref' args: 'pos.order'
  • pack_lot_ids One2many → pos.pack.operation.lot
    string='Lot/serial Number' args: 'pos.pack.operation.lot', 'pos_order_line_id'
  • price_extra Float
    string='Price extra'
  • price_subtotal Monetary
    readonly=True required=True string='Tax Excl.'
  • price_subtotal_incl Monetary
    readonly=True required=True string='Tax Incl.'
  • price_type Selection
    default='original' string='Price Type' args: [('original', 'Original'), ('manual', 'Manual'), ('automatic', 'Automatic')]
  • price_unit Float
    digits=0 string='Unit Price'
  • product_id Many2one → product.product
    change_default=True domain=[('sale_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Product UoM' args: 'uom.uom'
  • qty Float
    default=1 digits='Product Unit of Measure' args: 'Quantity'
  • refund_orderline_ids One2many → pos.order.line
    help='Orderlines in this field are the lines that refunded this orderline.' args: 'pos.order.line', 'refunded_orderline_id', 'Refund Order Lines'
  • refunded_orderline_id Many2one → pos.order.line
    help='If this orderline is a refund, then the refunded orderline is specified in this field.' args: 'pos.order.line', 'Refunded Order Line'
  • refunded_qty Float
    compute='_compute_refund_qty' help='Number of items refunded in this orderline.' args: 'Refunded Quantity'
  • skip_change Boolean
    args: 'Skip line when sending ticket to kitchen printers.'
  • tax_ids Many2many → account.tax
    readonly=True string='Taxes' args: 'account.tax'
  • tax_ids_after_fiscal_position Many2many → account.tax
    compute='_get_tax_ids_after_fiscal_position' string='Taxes to Apply' args: 'account.tax'
  • total_cost Float
    min_display_digits='Product Price' readonly=True string='Total cost'
  • uuid Char
    copy=False readonly=True string='Uuid'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
  • get_existing_lots(self, company_id, product_id)
    @api.model
    Return the lots that are still available in the given company. The lot is available if its quantity in the corresponding stock_quant and pos stock location is > 0.
  • unlink(self)
  • write(self, values)

New fields (4)
  • lot_name Char
    args: 'Lot Name'
  • order_id Many2one → pos.order
    readonly=False related='pos_order_line_id.order_id' args: 'pos.order'
  • pos_order_line_id Many2one → pos.order.line
    args: 'pos.order.line'
  • product_id Many2one → product.product
    readonly=False related='pos_order_line_id.product_id' args: 'product.product'
Public methods (0)

No public methods.

New fields (25)
  • account_move_id Many2one → account.move
    index='btree_not_null' args: 'account.move'
  • amount Monetary
    currency_field='currency_id' help='Total amount of the payment.' required=True string='Amount'
  • card_brand Char
    help='The brand of the payment card (e.g. Visa, AMEX, ...)' string='Brand of card'
  • card_no Char
    string='Card Number(Last 4 Digit)'
  • card_type Char
    help='The type of the payment card (e.g. CREDIT CARD OR DEBIT CARD)' string='Type of card used'
  • cardholder_name Char
    string='Card Owner name'
  • company_id Many2one → res.company
    related='pos_order_id.company_id' store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='pos_order_id.currency_id' string='Currency' args: 'res.currency'
  • currency_rate Float
    help='Conversion rate from company currency to order currency.' related='pos_order_id.currency_rate' string='Conversion Rate'
  • is_change Boolean
    default=False string='Is this payment change?'
  • name Char
    readonly=True string='Label'
  • partner_id Many2one → res.partner
    related='pos_order_id.partner_id' string='Customer' args: 'res.partner'
  • payment_date Datetime
    default=<expr> readonly=True required=True string='Date'
  • payment_method_authcode Char
    string='Payment APPR Code'
  • payment_method_id Many2one → pos.payment.method
    required=True string='Payment Method' args: 'pos.payment.method'
  • payment_method_issuer_bank Char
    string='Payment Issuer Bank'
  • payment_method_payment_mode Char
    string='Payment Mode'
  • payment_ref_no Char
    help='Payment reference number from payment provider terminal' string='Payment reference number'
  • payment_status Char
    string='Payment Status'
  • pos_order_id Many2one → pos.order
    index=True ondelete='cascade' required=True string='Order' args: 'pos.order'
  • session_id Many2one → pos.session
    index=True related='pos_order_id.session_id' store=True string='Session' args: 'pos.session'
  • ticket Char
    string='Payment Receipt Info'
  • transaction_id Char
    string='Payment Transaction ID'
  • user_id Many2one → res.users
    related='session_id.user_id' string='Employee' args: 'res.users'
  • uuid Char
    copy=False readonly=True string='Uuid'
Public methods (0)

No public methods.

New fields (19)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • config_ids Many2many → pos.config
    string='Point of Sale' args: 'pos.config'
  • default_qr Char
    compute='_compute_qr'
  • hide_qr_code_method Boolean
    compute='_compute_hide_qr_code_method'
  • hide_use_payment_terminal Boolean
    compute='_compute_hide_use_payment_terminal'
  • image Image
    max_height=50 max_width=50 args: 'Image'
  • is_cash_count Boolean
    compute='_compute_is_cash_count' store=True string='Cash'
  • journal_id Many2one → account.journal
    domain=['|', '&', ('type', '=', 'cash'), ('pos_payment_method_ids', '=', False), ('type', '=', 'bank')] help='Leave empty to use the receivable account of customer.\nDefines the journal where to book the accumulated payments (or individual payment if Identify Customer is true) after closing the session.\nFor cash journal, we directly write to the default account in the journal via statement lines.\nFor bank journal, we write to the outstanding account specified in this payment method.\nOnly cash and bank journals are allowed.' ondelete='restrict' string='Journal' args: 'account.journal'
  • name Char
    help='Defines the name of the payment method that will be displayed in the Point of Sale when the payments are selected.' required=True string='Method' translate=True
  • open_session_ids Many2many → pos.session
    compute='_compute_open_session_ids' help='Open PoS sessions that are using this payment method.' string='Pos Sessions' args: 'pos.session'
  • outstanding_account_id Many2one → account.account
    help='Account used as outstanding account when creating accounting payment records for bank payments.' ondelete='restrict' string='Outstanding Account' args: 'account.account'
  • payment_method_type Selection
    default='none' required=True selection=<expr> string='Integration'
  • qr_code_method Selection
    copy=False help='Type of QR-code to be generated for this payment method.' selection=<expr> string='QR Code Format'
  • receivable_account_id Many2one → account.account
    domain=[('reconcile', '=', True), ('account_type', '=', 'asset_receivable')] help="Leave empty to use the default account from the company setting.\nOverrides the company's receivable account (for Point of Sale) used in the journal entries." ondelete='restrict' string='Intermediary Account' args: 'account.account'
  • sequence Integer
    copy=False
  • split_transactions Boolean
    default=False help='Forces to set a customer when using this payment method and splits the journal entries for each customer. It could slow down the closing process.' string='Identify Customer'
  • type Selection
    compute='_compute_type' selection=[('cash', 'Cash'), ('bank', 'Bank'), ('pay_later', 'Customer Account')]
  • use_payment_terminal Selection
    help='Record payments with a terminal on this journal.' selection=<expr> string='Use a Payment Terminal'
Public methods (4)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_qr_code(self, amount, free_communication, structured_communication, currency, debtor_partner)
    Generates and returns a QR-code
  • write(self, vals)

New fields (5)
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • name Char
    default='Printer' help='An internal identification of the printer' required=True args: 'Printer Name'
  • printer_type Selection
    default='iot' selection=[('iot', ' Use a printer connected to the IoT Box')] string='Printer Type'
  • product_categories_ids Many2many → pos.category
    string='Printed Product Categories' args: 'pos.category', 'printer_category_rel', 'printer_id', 'category_id'
  • proxy_ip Char
    help="The IP Address or hostname of the Printer's hardware proxy" args: 'Proxy IP Address'
Public methods (0)

No public methods.

New fields (32)
  • bank_payment_ids One2many → account.payment
    help='Account payments representing aggregated and bank split payments.' args: 'account.payment', 'pos_session_id', 'Bank Payments'
  • cash_control Boolean
    compute='_compute_cash_control' string='Has Cash Control'
  • cash_journal_id Many2one → account.journal
    compute='_compute_cash_journal' store=True string='Cash Journal' args: 'account.journal'
  • cash_real_transaction Monetary
    readonly=True string='Transaction'
  • cash_register_balance_end Monetary
    compute='_compute_cash_balance' help='Opening balance summed to all cash transactions.' readonly=True string='Theoretical Closing Balance'
  • cash_register_balance_end_real Monetary
    readonly=True string='Ending Balance'
  • cash_register_balance_start Monetary
    readonly=True string='Starting Balance'
  • cash_register_difference Monetary
    compute='_compute_cash_balance' help='Difference between the theoretical closing balance and the real closing balance.' readonly=True string='Before Closing Difference'
  • closing_notes Text
    string='Closing Notes'
  • company_id Many2one → res.company
    readonly=True related='config_id.company_id' string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    index=True required=True string='Point of Sale' args: 'pos.config'
  • currency_id Many2one → res.currency
    readonly=False related='config_id.currency_id' string='Currency' args: 'res.currency'
  • failed_pickings Boolean
    compute='_compute_picking_count'
  • is_in_company_currency Boolean
    compute='_compute_is_in_company_currency' args: 'Is Using Company Currency'
  • login_number Integer
    default=0 help='A sequence number that is incremented each time a user resumes the pos session' string='Login Sequence Number'
  • move_id Many2one → account.move
    index=True string='Journal Entry' args: 'account.move'
  • name Char
    default='/' readonly=True required=True string='Session ID'
  • opening_notes Text
    string='Opening Notes'
  • order_count Integer
    compute='_compute_order_count'
  • order_ids One2many → pos.order
    string='Orders' args: 'pos.order', 'session_id'
  • payment_method_ids Many2many → pos.payment.method
    related='config_id.payment_method_ids' string='Payment Methods' args: 'pos.payment.method'
  • picking_count Integer
    compute='_compute_picking_count'
  • picking_ids One2many → stock.picking
    args: 'stock.picking', 'pos_session_id'
  • rescue Boolean
    copy=False help='Auto-generated session for orphan orders, ignored in constraints' readonly=True string='Recovery Session'
  • sequence_number Integer
    default=1 help='A sequence number that is incremented with each order' string='Order Sequence Number'
  • start_at Datetime
    readonly=True string='Opening Date'
  • state Selection
    copy=False default='opening_control' index=True readonly=True required=True string='Status' args: POS_SESSION_STATE
  • statement_line_ids One2many → account.bank.statement.line
    readonly=True string='Cash Lines' args: 'account.bank.statement.line', 'pos_session_id'
  • stop_at Datetime
    copy=False readonly=True string='Closing Date'
  • total_payments_amount Float
    compute='_compute_total_payments_amount' string='Total Payments Amount'
  • update_stock_at_closing Boolean
    args: 'Stock should be updated at closing'
  • user_id Many2one → res.users
    default=<expr> index=True ondelete='restrict' readonly=False required=True string='Opened By' args: 'res.users'
Public methods (28)
  • action_pos_session_close(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_pos_session_closing_control(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_pos_session_open(self)
  • action_pos_session_validate(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_show_payments_list(self)
  • action_stock_picking(self)
  • action_view_order(self)
  • close_session_from_ui(self, bank_payment_method_diff_pairs=None)
    Calling this method will try to close the session. param bank_payment_method_diff_pairs: list[(int, float)] Pairs of payment_method_id and diff_amount which will be used to post loss/profit when closing the session. If successful, it returns {'successful': True} Otherwise, it returns {'successful': False, 'message': str, 'redirect': bool}. 'redirect' is a boolean used to know whether we redirect the user to the back end or not. When necessary, error (i.e. UserError, AccessError) is raised which should redirect the user to the back end.
  • create(self, vals_list)
    @api.model_create_multi
  • delete_opening_control_session(self)
  • find_product_by_barcode(self, barcode, config_id)
  • get_closing_control_data(self)
  • get_pos_ui_product_pricelist_item_by_product(self, product_tmpl_ids, product_ids, config_id)
  • get_session_orders(self)
  • get_total_discount(self)
  • load_data(self, models_to_load, only_data=False)
  • log_partner_message(self, partner_id, action, message_type)
  • login(self)
  • open_frontend_cb(self)
    Open the pos interface with config_id as an extra argument. In vanilla PoS each user can only have one active session, therefore it was not needed to pass the config_id on opening a session. It is also possible to login to sessions created by other users. :returns: dict
  • post_close_register_message(self)
  • post_closing_cash_details(self, counted_cash)
    Calling this method will try store the cash details during the session closing. :param counted_cash: float, the total cash the user counted from its cash register If successful, it returns {'successful': True} Otherwise, it returns {'successful': False, 'message': str, 'redirect': bool}. 'redirect' is a boolean used to know whether we redirect the user to the back end or not. When necessary, error (i.e. UserError, AccessError) is raised which should redirect the user to the back end.
  • set_opening_control(self, cashbox_value: int, notes: str)
    Public method to open the session. This calls the internal logic and, if successful, assigns the sequence name. DO NOT INHERIT THIS METHOD. Inherit _set_opening_control_data instead.
  • show_cash_register(self)
  • show_journal_items(self)
  • try_cash_in_out(self, _type, amount, reason, extras)
  • unlink(self)
  • update_closing_control_state_session(self, notes)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_order_id Many2one → pos.order
    args: 'pos.order', 'POS Order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_order_line_id Many2one → pos.order.line
    ondelete='cascade' string='PoS Order Line' args: 'pos.order.line'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_product_info_pos(self, price, quantity, pos_config_id)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (5)
  • available_in_pos Boolean
    default=False help='Check if you want this product to appear in the Point of Sale.' string='Available in POS'
  • color Integer
    compute='_compute_color' readonly=False store=True args: 'Color Index'
  • pos_categ_ids Many2many → pos.category
    help='Category used in the Point of Sale.' string='Point of Sale Category' args: 'pos.category'
  • public_description Html
    string='Product Description' translate=True
  • to_weight Boolean
    help='Check if the product should be weighted using the hardware scale integration.' string='To Weigh With Scale'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_sale_details(self, date_start=False, date_stop=False, config_ids=False, session_ids=False, **kwargs)
    @api.model
    Serialise the orders of the requested time period, configs and sessions. :param date_start: The dateTime to start, default today 00:00:00. :type date_start: str. :param date_stop: The dateTime to stop, default date_start + 23:59:59. :type date_stop: str. :param config_ids: Pos Config id's to include. :type config_ids: list of numbers. :param session_ids: Pos Config id's to include. :type session_ids: list of numbers. :returns: dict -- Serialised sales.

New fields (25)
  • average_price Float
    aggregator='avg' readonly=True string='Average Price'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=True string='Point of Sale' args: 'pos.config'
  • date Datetime
    readonly=True string='Order Date'
  • delay_validation Integer
    readonly=True string='Delay Validation'
  • invoiced Boolean
    readonly=True
  • journal_id Many2one → account.journal
    readonly=True string='Journal' args: 'account.journal'
  • margin Float
    readonly=True string='Margin'
  • nbr_lines Integer
    readonly=True string='Sale Line Count'
  • order_id Many2one → pos.order
    readonly=True string='Order' args: 'pos.order'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • payment_method_id Many2one → pos.payment.method
    readonly=True string='Payment Method' args: 'pos.payment.method'
  • pos_categ_id Many2one → pos.category
    readonly=True string='Point of Sale Category' args: 'pos.category'
  • price_sub_total Float
    readonly=True string='Subtotal w/o discount'
  • price_subtotal_excl Float
    readonly=True string='Subtotal w/o Tax'
  • price_total Float
    readonly=True string='Total Price'
  • pricelist_id Many2one → product.pricelist
    readonly=True string='Pricelist' args: 'product.pricelist'
  • product_categ_id Many2one → product.category
    readonly=True string='Product Category' args: 'product.category'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Integer
    readonly=True string='Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True string='Product Template' args: 'product.template'
  • session_id Many2one → pos.session
    readonly=True string='Session' args: 'pos.session'
  • state Selection
    readonly=True string='Status' args: [('draft', 'New'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced'), ('cancel', 'Cancelled')]
  • total_discount Float
    readonly=True string='Total Discount'
  • user_id Many2one → res.users
    readonly=True string='User' args: 'res.users'
Public methods (1)
  • init(self)

New fields (4)
  • point_of_sale_ticket_portal_url_display_mode Selection
    default='qr_code' help='Choose how the URL to the portal will be print on the receipt.' required=True string='Print' args: [('qr_code', 'QR code'), ('url', 'URL'), ('qr_code_and_url', 'QR code + URL')]
  • point_of_sale_ticket_unique_code Boolean
    help='Add a 5-digit code on the receipt to allow the user to request the invoice for an order on the portal.' string='Generate a code on ticket'
  • point_of_sale_update_stock_quantities Selection
    default='real' help="At the session closing: A picking is created for the entire session when it's closed\n In real time: Each order sent to the server create its own picking" string='Update quantities in stock' args: [('closing', 'At the session closing'), ('real', 'In real time')]
  • point_of_sale_use_ticket_qr_code Boolean
    help="Print information on the receipt to allow the customer to easily access the invoice anytime, from Odoo's portal." string='Self-service invoicing'
Public methods (1)
  • validate_lock_dates(self)
    @api.constrains('fiscalyear_lock_date', 'tax_lock_date', 'sale_lock_date', 'hard_lock_date')
    This constrains makes it impossible to change the relevant lock dates if some open POS session would violate them. Without that, these POS sessions could not be closed (since the closing entries violate the lock dates).

New fields (84)
  • account_default_pos_receivable_account_id Many2one
    check_company=True readonly=False related='company_id.account_default_pos_receivable_account_id' string='Default Account Receivable (PoS)'
  • barcode_nomenclature_id Many2one → barcode.nomenclature
    readonly=False related='company_id.nomenclature_id' args: 'barcode.nomenclature'
  • is_kiosk_mode Boolean
    default=False string='Is Kiosk Mode'
  • module_pos_adyen Boolean
    help='The transactions are processed by Adyen. Set your Adyen credentials on the related payment method.' string='Adyen Payment Terminal'
  • module_pos_mercado_pago Boolean
    help='The transactions are processed by Mercado Pago. Set your Mercado Pago credentials on the related payment method.' string='Mercado Pago Payment Terminal'
  • module_pos_paytm Boolean
    help='The transactions are processed by PayTM. Set your PayTM credentials on the related payment method.' string='PayTM Payment Terminal'
  • module_pos_preparation_display Boolean
    help='Show orders on the preparation display screen.' string='Preparation Display'
  • module_pos_pricer Boolean
    help='Display the price of your products through electronic price tags' string='Pricer electronic price tags'
  • module_pos_razorpay Boolean
    help='The transactions are processed by Razorpay. Set your Razorpay credentials on the related payment method.' string='Razorpay Payment Terminal'
  • module_pos_six Boolean
    help='The transactions are processed by Six. Set the IP address of the terminal on the related payment method.' string='Six Payment Terminal'
  • module_pos_stripe Boolean
    help='The transactions are processed by Stripe. Set your Stripe credentials on the related payment method.' string='Stripe Payment Terminal'
  • module_pos_viva_wallet Boolean
    help='The transactions are processed by Viva Wallet on terminal or tap on phone.' string='Viva Wallet Payment Terminal'
  • point_of_sale_ticket_portal_url_display_mode Selection
    readonly=False related='company_id.point_of_sale_ticket_portal_url_display_mode' required=True
  • point_of_sale_ticket_unique_code Boolean
    readonly=False related='company_id.point_of_sale_ticket_unique_code'
  • point_of_sale_use_ticket_qr_code Boolean
    readonly=False related='company_id.point_of_sale_use_ticket_qr_code'
  • pos_allowed_pricelist_ids Many2many → product.pricelist
    compute='_compute_pos_allowed_pricelist_ids' args: 'product.pricelist'
  • pos_amount_authorized_diff Float
    readonly=False related='pos_config_id.amount_authorized_diff'
  • pos_auto_validate_terminal_payment Boolean
    readonly=False related='pos_config_id.auto_validate_terminal_payment' string='Automatically validates orders paid with a payment terminal.'
  • pos_available_pricelist_ids Many2many → product.pricelist
    compute='_compute_pos_pricelist_id' readonly=False store=True string='Available Pricelists' args: 'product.pricelist'
  • pos_basic_receipt Boolean
    readonly=False related='pos_config_id.basic_receipt'
  • pos_cash_control Boolean
    related='pos_config_id.cash_control'
  • pos_cash_rounding Boolean
    readonly=False related='pos_config_id.cash_rounding' string='Cash Rounding (PoS)'
  • pos_company_has_template Boolean
    related='pos_config_id.company_has_template'
  • pos_config_id Many2one → pos.config
    default=<expr> string='Point of Sale' args: 'pos.config'
  • pos_customer_display_bg_img Image
    readonly=False related='pos_config_id.customer_display_bg_img'
  • pos_customer_display_bg_img_name Char
    readonly=False related='pos_config_id.customer_display_bg_img_name'
  • pos_customer_display_type Selection
    readonly=False related='pos_config_id.customer_display_type'
  • pos_default_bill_ids Many2many
    readonly=False related='pos_config_id.default_bill_ids'
  • pos_default_fiscal_position_id Many2one → account.fiscal.position
    check_company=True compute='_compute_pos_fiscal_positions' readonly=False store=True string='Default Fiscal Position' args: 'account.fiscal.position'
  • pos_fiscal_position_ids Many2many → account.fiscal.position
    check_company=True compute='_compute_pos_fiscal_positions' readonly=False store=True string='Fiscal Positions' args: 'account.fiscal.position'
  • pos_has_active_session Boolean
    related='pos_config_id.has_active_session'
  • pos_iface_available_categ_ids Many2many → pos.category
    compute='_compute_pos_iface_available_categ_ids' readonly=False store=True string='Available PoS Product Categories' args: 'pos.category'
  • pos_iface_big_scrollbars Boolean
    readonly=False related='pos_config_id.iface_big_scrollbars'
  • pos_iface_cashdrawer Boolean
    compute='_compute_pos_iface_cashdrawer' readonly=False store=True string='Cashdrawer'
  • pos_iface_electronic_scale Boolean
    compute='_compute_pos_iface_electronic_scale' readonly=False store=True string='Electronic Scale'
  • pos_iface_print_auto Boolean
    readonly=False related='pos_config_id.iface_print_auto'
  • pos_iface_print_skip_screen Boolean
    readonly=False related='pos_config_id.iface_print_skip_screen'
  • pos_iface_print_via_proxy Boolean
    compute='_compute_pos_iface_print_via_proxy' readonly=False store=True string='Print via Proxy'
  • pos_iface_scan_via_proxy Boolean
    compute='_compute_pos_iface_scan_via_proxy' readonly=False store=True string='Scan via Proxy'
  • pos_iface_tax_included Selection
    readonly=False related='pos_config_id.iface_tax_included'
  • pos_iface_tipproduct Boolean
    readonly=False related='pos_config_id.iface_tipproduct'
  • pos_invoice_journal_id Many2one
    readonly=False related='pos_config_id.invoice_journal_id'
  • pos_is_closing_entry_by_product Boolean
    readonly=False related='pos_config_id.is_closing_entry_by_product'
  • pos_is_header_or_footer Boolean
    readonly=False related='pos_config_id.is_header_or_footer'
  • pos_is_margins_costs_accessible_to_every_user Boolean
    readonly=False related='pos_config_id.is_margins_costs_accessible_to_every_user'
  • pos_is_order_printer Boolean
    compute='_compute_pos_printer' readonly=False store=True
  • pos_is_posbox Boolean
    readonly=False related='pos_config_id.is_posbox'
  • pos_journal_id Many2one
    readonly=False related='pos_config_id.journal_id'
  • pos_limit_categories Boolean
    readonly=False related='pos_config_id.limit_categories'
  • pos_manual_discount Boolean
    readonly=False related='pos_config_id.manual_discount'
  • pos_module_pos_avatax Boolean
    readonly=False related='pos_config_id.module_pos_avatax'
  • pos_module_pos_discount Boolean
    readonly=False related='pos_config_id.module_pos_discount'
  • pos_module_pos_hr Boolean
    readonly=False related='pos_config_id.module_pos_hr'
  • pos_module_pos_restaurant Boolean
    readonly=False related='pos_config_id.module_pos_restaurant'
  • pos_module_pos_sms Boolean
    readonly=False related='pos_config_id.module_pos_sms'
  • pos_note_ids Many2many
    readonly=False related='pos_config_id.note_ids'
  • pos_only_round_cash_method Boolean
    readonly=False related='pos_config_id.only_round_cash_method'
  • pos_order_edit_tracking Boolean
    readonly=False related='pos_config_id.order_edit_tracking'
  • pos_orderlines_sequence_in_cart_by_category Boolean
    readonly=False related='pos_config_id.orderlines_sequence_in_cart_by_category'
  • pos_other_devices Boolean
    readonly=False related='pos_config_id.other_devices'
  • pos_payment_method_ids Many2many
    readonly=False related='pos_config_id.payment_method_ids'
  • pos_picking_policy Selection
    readonly=False related='pos_config_id.picking_policy'
  • pos_picking_type_id Many2one
    readonly=False related='pos_config_id.picking_type_id'
  • pos_pricelist_id Many2one → product.pricelist
    compute='_compute_pos_pricelist_id' readonly=False store=True string='Default Pricelist' args: 'product.pricelist'
  • pos_printer_ids Many2many
    readonly=False related='pos_config_id.printer_ids'
  • pos_proxy_ip Char
    readonly=False related='pos_config_id.proxy_ip' string='IP Address'
  • pos_receipt_footer Text
    compute='_compute_pos_receipt_header_footer' readonly=False store=True string='Receipt Footer'
  • pos_receipt_header Text
    compute='_compute_pos_receipt_header_footer' readonly=False store=True string='Receipt Header'
  • pos_restrict_price_control Boolean
    readonly=False related='pos_config_id.restrict_price_control'
  • pos_rounding_method Many2one
    readonly=False related='pos_config_id.rounding_method'
  • pos_route_id Many2one
    readonly=False related='pos_config_id.route_id'
  • pos_selectable_categ_ids Many2many → pos.category
    compute='_compute_pos_selectable_categ_ids' args: 'pos.category'
  • pos_sequence_id Many2one
    related='pos_config_id.sequence_id'
  • pos_set_maximum_difference Boolean
    readonly=False related='pos_config_id.set_maximum_difference'
  • pos_ship_later Boolean
    readonly=False related='pos_config_id.ship_later'
  • pos_show_category_images Boolean
    readonly=False related='pos_config_id.show_category_images'
  • pos_show_product_images Boolean
    readonly=False related='pos_config_id.show_product_images'
  • pos_tax_regime_selection Boolean
    readonly=False related='pos_config_id.tax_regime_selection'
  • pos_tip_product_id Many2one → product.product
    compute='_compute_pos_tip_product_id' readonly=False store=True string='Tip Product' args: 'product.product'
  • pos_trusted_config_ids Many2many
    domain="[('id', '!=', pos_config_id), ('module_pos_restaurant', '=', False)]" readonly=False related='pos_config_id.trusted_config_ids'
  • pos_use_pricelist Boolean
    readonly=False related='pos_config_id.use_pricelist'
  • pos_warehouse_id Many2one
    readonly=False related='pos_config_id.warehouse_id' string='Warehouse (PoS)'
  • sale_tax_id Many2one → account.tax
    check_company=True readonly=False related='company_id.account_sale_tax_id' string='Default Sale Tax' args: 'account.tax'
  • update_stock_quantities Selection
    readonly=False related='company_id.point_of_sale_update_stock_quantities'
Public methods (4)
  • action_pos_config_create_new(self)
  • create(self, vals_list)
    @api.model_create_multi
  • pos_open_ui(self)
  • set_values(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • pos_order_count Integer
    compute='_compute_pos_order' groups='point_of_sale.group_pos_user' help='The number of point of sales orders related to this customer'
  • pos_order_ids One2many → pos.order
    readonly=True args: 'pos.order', 'partner_id'
Public methods (2)
  • action_view_pos_order(self)
    This function returns an action that displays the pos orders from partner.
  • open_commercial_entity(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • pos_order_id Many2one → pos.order
    index=True args: 'pos.order'
  • pos_session_id Many2one → pos.session
    index=True args: 'pos.session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_type_id Many2one → stock.picking.type
    copy=False string='Point of Sale Operation Type' args: 'stock.picking.type'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    help='Check if you want to group products of this category in point of sale orders' string='Group Products in POS'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    readonly=False related='category_id.is_pos_groupable'
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/point_of_sale
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYSales/Point of Sale
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Xavier ALT, Christophe Simonis, Xavier Morel, Nicolas Martinelli, qdp-odoo, Atul Patel, Géry Debongnie, Aaron Bohy, Pedro M. Baeza, Sylvain LE GAL, GitHub, Yannick Tivisse, qsm-odoo, Odoo Online, Pierre Masereel, Romain Derie, Laurent Smet, Adrien Dieudonne, Jorge Pinna Puissant, Arnold Moyaux, Xavier-Do, Luis Torres, Victor Feyens, Andrea Grazioso (agr-odoo), Adrien Dieudonné, Moisés López, Enric Tobella, William Henrotin, Joseph Caburnay, Julien Mougenot, Anh Thao Pham (pta), Samuel Degueldre, Alvaro Fuentes, std-odoo, Achraf (abz), Carlos Lopez, Brice bib Bartoletti, Ivan Yelizariev, lejeune quentin, Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Pierre Rousseau, Gorash, fja-odoo, Mathieu Duckerts-Antoine, Pierre Paridans, William Braeckman, Romain Estievenart, roen-odoo, Hubert Van de Walle (huvw), Miquel Raïch, pedrambiria, Ahmad Khanalizadeh, Jacky (trj), william-andre, Julien Van Roy, MerlinGuillaume, PNO, mafo-odoo, Agustín Castro Bugallo, Walid HANNICHE (waha), Abdelouahab (abla), Antoine Vandevenne (anv), Demesmaeker, Aurelien van Delft (avd), Valentin Chevalier, Thomas Binsfeld, Renaud Thiry, rhe-odoo, niyasraphy, Isaac López, Loan (LSE), David Monnom (moda), Thomas Lefebvre (thle), Archana Vaghasiya, alsh-odoo, Matheus Leal Viana (malv), Eleftherios Kritsotakis, Gaetan Vanden Bergh (gavb), François Honoré, Merel Geens (mege), Pedram (PEBR), Louis Wicket (wil), Walid, Mylyna Hy, Laurent Desausoi, Adrien Widart (awt), nda, Maximilien (malb), Victor Piryns (pivi), Julien (jula), Mahamadasif Ansari, Ali Alfie (alal), clesgow, Claire Bretton (clbr), Yosua Nicolaus, Naman Shah, Maruan Aguerdouh (magm), Antoine Boonen, Dylan Kiss (dyki), Jinane Maksoud, arsi, Sanket Brahmbhatt, Bruno Boi, Antoine (ande), Maitri Patel, FrancoisGe, Michael (mcm), Preksha Chouhan, Chong Wang (cwg), Karnav Sojitra, paso-odoo, Leloup Loïc (lole), prye-odoo, CarmenMiranda, Ahmed Khalaf, Xavier Bol (xbo), Brieuc-brd, Renilkumar Kajavadra, Daniel Duque, Paweł Fertyk, Nguyễn Đại Dương, AH-Yussef, Harsh Modi, Zeel Patel, Sarah Bellefroid, “moda”, Louis Travaux, Theo VINCENT (thvi), Pedram (pebr), Cameron, adda-odoo, Arnaud Sibille, Adrien Guilliams (adgu), ilru-odoo, Corentin Thaon (thco), Mattis Megevand (mmeg), Zachary Hanham, Andrzej(pian), sesn-odoo, guva-odoo, kdeb@odoo.com, Paul Stroobant, maad-odoo, stefanorigano (SRI), Dang Van Loc, Youssef Bashandy, lase@odoo.com, bary, ROEN, axtr, reka-odoo, Sven Fuehr, Cyrus Robins, Julien Carion (juca), odoostan, Tanguy Quéguineur, Louis Gobert, Chrysanthe (chgo), shsa-odoo, Louis (wil), Khalid, Pierre, mano-odoo, Joseph (jcb), Max Whale, yaso, parp-odoo, aamo-odoo, Parth Solanki[PASO], Jonathan, Hussein Ebrahim(hyhe), Majed Alhanash (malh), Victorien (viso), Loukas Wets (lowe), Joanna, manv-afk, Mathieu Coutant, Sanchit Gupta, gteboul, vlst, Léo Gizard, Jitendra Prajapat, paan-odoo, David Monnom, Nesma Harraz, Maira Salazar (srma), Arthur Nanson, elhayyany, Pierre Pulinckx (pipu), Bastien PIERRE, Carmine, uso-odoo, plha-odoo, vifo, Ajit Singh, Akash Pandey, joseph, Pulinckx Pierre (PIPU), Shubham Agarwal [SHAG], Basioni (basm), loje, utma-odoo, Sylvio Poliart (sypol), Harrison Hutton, Robin Engels (roen), Hadi El Yakhni, dhruv, zorbmax, Guillaume V, Manu Vaillant (manv), vevi-odoo, vlst-odoo, Maeva De Keyser (MDEK), Juan José Scarafia, rida, sagu-odoo, kdes-odoo, Radu Macocian (admac), Meet Jivani [MEJI], ksku-odoo, vpan-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/point-of-sale-shop
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:04
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - onboarding
    - analytic
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (63)
XML IDNameModelTypeStatus
account_product_template_form_view product.template.product.form.account.inherit product.template xpath Inherits account.product_template_form_view
digest_digest_view_form digest.digest.view.form.inherit.sale.order digest.digest xpath Inherits digest.digest_digest_view_form
point_of_sale.index POS Index ir.ui.view qweb New
point_of_sale.qunit_suite point_of_sale.qunit_suite ir.ui.view qweb New
point_of_sale.report_invoice_document point_of_sale.report_invoice_document ir.ui.view qweb Inherits account.report_invoice_document
point_of_sale.view_pos_combo_form pos.combo.form pos.combo form New
point_of_sale.view_pos_combo_tree pos.combo.tree pos.combo tree New
pos_config_view_form pos.config.form.view pos.config form New
pos_payment_method_view_form pos.payment.method.form pos.payment.method form New
pos_payment_method_view_search pos.payment.search.view pos.payment.method search New
pos_payment_method_view_tree pos.payment.method.tree pos.payment.method tree New
pos_rounding_form_view_inherited pos.cash.rounding.form.inherited account.cash.rounding xpath Inherits account.rounding_form_view
product_pos_category_form_view pos.category.form pos.category form New
product_pos_category_tree_view pos.category.tree pos.category tree New
product_product_tree_view product.product.product.tree.inherit product.product field Inherits product.product_product_tree_view
product_template_form_view product.template.form.inherit product.template xpath Inherits product.product_template_form_view
product_template_only_form_view product.template.only.form.inherit product.template xpath Inherits product.product_template_only_form_view
product_template_only_form_view product.template.product.form.inherit product.template xpath Inherits product.product_template_only_form_view
product_template_search_view_pos product.template.search.pos.form product.template field Inherits product.product_template_search_view
product_template_tree_view product.template.product.tree.inherit product.template field Inherits product.product_template_tree_view
product_uom_categ_form_view uom.category.form.inherit uom.category xpath Inherits uom.product_uom_categ_form_view
product_uom_categ_tree_view uom.category.tree.inherit uom.category xpath Inherits uom.product_uom_categ_tree_view
report_pos_order_view_tree report.pos.order.view.tree report.pos.order tree New
report_saledetails report_saledetails ir.ui.view qweb New
report_userlabel report_userlabel ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.point_of_sale res.config.settings xpath Inherits base.res_config_settings_view_form
ticket_request_with_code Invoice Request ir.ui.view qweb New
ticket_validation_screen ticket_validation_screen ir.ui.view qweb New
view_account_journal_pos_user_form account.journal.pos.user.form.inherit account.journal xpath Inherits account.view_account_journal_form
view_form_pos_close_session_wizard pos.close.session.wizard.form pos.close.session.wizard form New
view_partner_pos_kanban res.partner.pos.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
view_partner_property_form res.partner.pos.form.inherit res.partner div Inherits base.view_partner_form
view_pos_bill_form pos.bill.form pos.bill form New
view_pos_bill_tree pos.bill.tree pos.bill tree New
view_pos_category_kanban pos.category.kanban pos.category kanban New
view_pos_config_kanban pos.config.kanban.view pos.config kanban New
view_pos_config_search pos.config.search.view pos.config search New
view_pos_config_tree pos.config.tree.view pos.config tree New
view_pos_daily_sales_reports_wizard pos.daily.sales.reports.wizard.form pos.daily.sales.reports.wizard form New
view_pos_details_wizard pos.details.wizard.form pos.details.wizard form New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_kanban pos.order.kanban pos.order kanban New
view_pos_order_line pos.order.line.tree pos.order.line tree New
view_pos_order_line_form pos.order.line.form pos.order.line form New
view_pos_order_pivot pos.order.pivot pos.order pivot New
view_pos_order_search pos.order.search.view pos.order search New
view_pos_order_tree pos.order.tree pos.order tree New
view_pos_order_tree_all_sales_lines pos.order.line.all.sales.tree pos.order.line tree New
view_pos_order_tree_no_session_id pos.order.tree_no_session_id pos.order xpath Inherits point_of_sale.view_pos_order_tree
view_pos_payment pos.make.payment.form pos.make.payment form New
view_pos_payment_form pos.payment.form pos.payment form New
view_pos_payment_search pos.payment.search.view pos.payment search New
view_pos_payment_tree pos.payment.tree pos.payment tree New
view_pos_pos_form pos.order.form pos.order form New
view_pos_printer Preparation Printers pos.printer tree New
view_pos_printer_form Preparation Printer pos.printer form New
view_pos_session_form pos.session.form.view pos.session form New
view_pos_session_kanban pos.session.kanban pos.session kanban New
view_pos_session_search pos.session.search.view pos.session search New
view_pos_session_tree pos.session.tree.view pos.session tree New
view_report_pos_order_graph report.pos.order.graph report.pos.order graph New
view_report_pos_order_pivot report.pos.order.pivot report.pos.order pivot New
view_report_pos_order_search report.pos.order.search report.pos.order search New
Models touched (46)

New fields (1)
  • pos_session_id Many2one → pos.session
    copy=False string='Session' args: 'pos.session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_archive(self)

New fields (1)
  • pos_payment_method_ids One2many → pos.payment.method
    string='Point of Sale Payment Methods' args: 'pos.payment.method', 'journal_id'
Public methods (1)
  • action_archive(self)

New fields (3)
  • pos_order_ids One2many → pos.order
    args: 'pos.order', 'account_move'
  • pos_payment_ids One2many → pos.payment
    args: 'pos.payment', 'account_move_id'
  • pos_refunded_invoice_ids Many2many → account.move
    args: 'account.move', 'refunded_invoices', 'refund_account_move', 'original_account_move'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • force_outstanding_account_id Many2one → account.account
    check_company=True args: 'account.account', 'Forced Outstanding Account'
  • pos_payment_method_id Many2one → pos.payment.method
    args: 'pos.payment.method', 'POS Payment Method'
  • pos_session_id Many2one → pos.session
    args: 'pos.session', 'POS Session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (1)
  • type Selection
    ondelete={'weight': 'set default', 'price': 'set default', 'discount': 'set default', 'client': 'set default', 'cashier': 'set default'} selection_add=[('weight', 'Weighted Product'), ('price', 'Priced Product'), ('discount', 'Discounted Product'), ('client', 'Client'), ('cashier', 'Cashier')]
Public methods (0)

No public methods.

New fields (2)
  • kpi_pos_total Boolean
    args: 'POS Sales'
  • kpi_pos_total_value Monetary
    compute='_compute_kpi_pos_total_value'
Public methods (0)

No public methods.

New fields (3)
  • name Char
    args: 'Name'
  • pos_config_ids Many2many → pos.config
    string='Point of Sales' args: 'pos.config'
  • value Float
    digits=(16, 4) required=True args: 'Coin/Bill Value'
Public methods (1)
  • name_create(self, name)
    @api.model

New fields (6)
  • child_id One2many → pos.category
    string='Children Categories' args: 'pos.category', 'parent_id'
  • has_image Boolean
    compute='_compute_has_image'
  • image_128 Image
    max_height=128 max_width=128 args: 'Image'
  • name Char
    required=True string='Category Name' translate=True
  • parent_id Many2one → pos.category
    index=True string='Parent Category' args: 'pos.category'
  • sequence Integer
    help='Gives the sequence order when displaying a list of product categories.'
Public methods (0)

No public methods.

New fields (4)
  • account_id Many2one → account.account
    args: 'account.account', 'Destination account'
  • account_readonly Boolean
    args: 'Destination account is readonly'
  • amount_to_balance Float
    args: 'Amount to balance'
  • message Text
    args: 'Information message'
Public methods (1)
  • close_session(self)

New fields (5)
  • base_price Float
    compute='_compute_base_price' help='The value from which pro-rating of the component price is based. This is to ensure that whatever product the user chooses for a component, it will always be they same price.' string='Product Price'
  • combo_line_ids One2many → pos.combo.line
    copy=True string='Products in Combo' args: 'pos.combo.line', 'combo_id'
  • name Char
    required=True string='Name'
  • num_of_products Integer
    compute='_compute_num_of_products' args: 'No of Products'
  • sequence Integer
    copy=False
Public methods (0)

No public methods.

New fields (4)
  • combo_id Many2one → pos.combo
    args: 'pos.combo'
  • combo_price Float
    default=0.0 args: 'Price Extra'
  • lst_price Float
    related='product_id.lst_price' args: 'Original Price'
  • product_id Many2one → product.product
    required=True string='Product' args: 'product.product'
Public methods (0)

No public methods.

New fields (78)
  • active Boolean
    default=True
  • amount_authorized_diff Float
    help='This field depicts the maximum difference allowed between the ending balance and the theoretical cash when closing a session, for non-POS managers. If this maximum is reached, the user will have an error message at the closing of his session saying that he needs to contact his manager.' args: 'Amount Authorized Difference'
  • auto_validate_terminal_payment Boolean
    default=True help='Automatically validates orders paid with a payment terminal.'
  • available_pricelist_ids Many2many → product.pricelist
    help='Make several pricelists available in the Point of Sale. You can also apply a pricelist to specific customers from their contact form (in Sales tab). To be valid, this pricelist must be listed here as an available pricelist. Otherwise the default pricelist will apply.' string='Available Pricelists' args: 'product.pricelist'
  • cash_control Boolean
    compute='_compute_cash_control' help='Check the amount of the cashbox at opening and closing.' string='Advanced Cash Control'
  • cash_rounding Boolean
    string='Cash Rounding'
  • company_has_template Boolean
    compute='_compute_company_has_template' string='Company has chart of accounts'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    compute='_compute_currency' compute_sudo=True string='Currency' args: 'res.currency'
  • current_session_id Many2one → pos.session
    compute='_compute_current_session' string='Current Session' args: 'pos.session'
  • current_session_state Char
    compute='_compute_current_session'
  • current_user_id Many2one → res.users
    compute='_compute_current_session_user' string='Current Session Responsible' args: 'res.users'
  • default_bill_ids Many2many → pos.bill
    string='Coins/Bills' args: 'pos.bill'
  • default_fiscal_position_id Many2one → account.fiscal.position
    string='Default Fiscal Position' args: 'account.fiscal.position'
  • fiscal_position_ids Many2many → account.fiscal.position
    help='This is useful for restaurants with onsite and take-away services that imply specific tax rates.' string='Fiscal Positions' args: 'account.fiscal.position'
  • group_pos_manager_id Many2one → res.groups
    default=_get_group_pos_manager help='This field is there to pass the id of the pos manager group to the point of sale client.' string='Point of Sale Manager Group' args: 'res.groups'
  • group_pos_user_id Many2one → res.groups
    default=_get_group_pos_user help='This field is there to pass the id of the pos user group to the point of sale client.' string='Point of Sale User Group' args: 'res.groups'
  • has_active_session Boolean
    compute='_compute_current_session'
  • iface_available_categ_ids Many2many → pos.category
    help='The point of sale will only display products which are within one of the selected category trees. If no category is specified, all available products will be shown' string='Available PoS Product Categories' args: 'pos.category'
  • iface_big_scrollbars Boolean
    help='For imprecise industrial touchscreens.' args: 'Large Scrollbars'
  • iface_cashdrawer Boolean
    help='Automatically open the cashdrawer.' string='Cashdrawer'
  • iface_customer_facing_display Boolean
    compute='_compute_customer_facing_display'
  • iface_customer_facing_display_background_image_1920 Image
    compute='_compute_iface_customer_facing_display_background_image_1920' max_height=1920 max_width=1920 store=True string='Background Image'
  • iface_customer_facing_display_local Boolean
    help='Show checkout to customers.' string='Local Customer Facing Display'
  • iface_customer_facing_display_via_proxy Boolean
    help='Show checkout to customers with a remotely-connected screen.' string='Customer Facing Display'
  • iface_electronic_scale Boolean
    help='Enables Electronic Scale integration.' string='Electronic Scale'
  • iface_print_auto Boolean
    default=False help='The receipt will automatically be printed at the end of each order.' string='Automatic Receipt Printing'
  • iface_print_skip_screen Boolean
    default=True help='The receipt screen will be skipped if the receipt can be printed automatically.' string='Skip Preview Screen'
  • iface_print_via_proxy Boolean
    help='Bypass browser printing and prints via the hardware proxy.' string='Print via Proxy'
  • iface_scan_via_proxy Boolean
    help='Enable barcode scanning with a remotely connected barcode scanner and card swiping with a Vantiv card reader.' string='Scan via Proxy'
  • iface_start_categ_id Many2one → pos.category
    help='The point of sale will display this product category by default. If no category is specified, all available products will be shown.' string='Initial Category' args: 'pos.category'
  • iface_tax_included Selection
    default='total' required=True string='Tax Display' args: [('subtotal', 'Tax-Excluded Price'), ('total', 'Tax-Included Price')]
  • iface_tipproduct Boolean
    string='Product tips'
  • invoice_journal_id Many2one → account.journal
    check_company=True default=_default_invoice_journal domain=[('type', '=', 'sale')] help='Accounting journal used to create invoices.' string='Invoice Journal' args: 'account.journal'
  • is_header_or_footer Boolean
    args: 'Custom Header & Footer'
  • is_installed_account_accountant Boolean
    compute='_compute_is_installed_account_accountant' string='Is the Full Accounting Installed'
  • is_margins_costs_accessible_to_every_user Boolean
    default=False help='When disabled, only PoS manager can view the margin and cost of product among the Product info.' string='Margins & Costs'
  • is_order_printer Boolean
    args: 'Order Printer'
  • is_posbox Boolean
    args: 'PosBox'
  • journal_id Many2one → account.journal
    check_company=True default=_default_sale_journal domain=[('type', 'in', ('general', 'sale'))] help='Accounting journal used to post POS session journal entries and POS invoice payments.' ondelete='restrict' string='Point of Sale Journal' args: 'account.journal'
  • last_session_closing_cash Float
    compute='_compute_last_session'
  • last_session_closing_date Date
    compute='_compute_last_session'
  • limit_categories Boolean
    args: 'Restrict Categories'
  • manual_discount Boolean
    default=True string='Line Discounts'
  • module_pos_discount Boolean
    args: 'Global Discounts'
  • module_pos_hr Boolean
    help='Show employee login screen'
  • module_pos_mercury Boolean
    string='Integrated Card Payments'
  • module_pos_restaurant Boolean
    args: 'Is a Bar/Restaurant'
  • name Char
    help='An internal identification of the point of sale.' required=True string='Point of Sale'
  • number_of_rescue_session Integer
    compute='_compute_current_session' string='Number of Rescue Session'
  • only_round_cash_method Boolean
    string='Only apply rounding on cash'
  • other_devices Boolean
    help='Connect devices to your PoS without an IoT Box.' string='Other Devices'
  • payment_method_ids Many2many → pos.payment.method
    copy=False default=<expr> string='Payment Methods' args: 'pos.payment.method'
  • picking_policy Selection
    default='direct' help='If you deliver all products at once, the delivery order will be scheduled based on the greatest product lead time. Otherwise, it will be based on the shortest.' required=True string='Shipping Policy' args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')]
  • picking_type_id Many2one → stock.picking.type
    default=_default_picking_type_id domain="[('code', '=', 'outgoing'), ('warehouse_id.company_id', '=', company_id)]" ondelete='restrict' required=True string='Operation Type' args: 'stock.picking.type'
  • pos_session_duration Char
    compute='_compute_current_session_user'
  • pos_session_state Char
    compute='_compute_current_session_user'
  • pos_session_username Char
    compute='_compute_current_session_user'
  • pricelist_id Many2one → product.pricelist
    help='The pricelist used if no customer is selected or if the customer has no Sale Pricelist configured if any.' string='Default Pricelist' args: 'product.pricelist'
  • printer_ids Many2many → pos.printer
    string='Order Printers' args: 'pos.printer', 'pos_config_printer_rel', 'config_id', 'printer_id'
  • proxy_ip Char
    help='The hostname or ip address of the hardware proxy, Will be autodetected if left empty.' size=45 string='IP Address'
  • receipt_footer Text
    help='A short text that will be inserted as a footer in the printed receipt.' string='Receipt Footer'
  • receipt_header Text
    help='A short text that will be inserted as a header in the printed receipt.' string='Receipt Header'
  • restrict_price_control Boolean
    help='Only users with Manager access rights for PoS app can modify the product prices on orders.' string='Restrict Price Modifications to Managers'
  • rounding_method Many2one → account.cash.rounding
    string='Cash rounding' args: 'account.cash.rounding'
  • route_id Many2one → stock.route
    string='Spefic route for products delivered later.' args: 'stock.route'
  • sequence_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders.' ondelete='restrict' readonly=True string='Order IDs Sequence' args: 'ir.sequence'
  • sequence_line_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders lines.' readonly=True string='Order Line IDs Sequence' args: 'ir.sequence'
  • session_ids One2many → pos.session
    string='Sessions' args: 'pos.session', 'config_id'
  • set_maximum_difference Boolean
    help='Set a maximum difference allowed between the expected and counted money during the closing of the session.' args: 'Set Maximum Difference'
  • ship_later Boolean
    string='Ship Later'
  • start_category Boolean
    default=False args: 'Start Category'
  • tax_regime_selection Boolean
    args: 'Tax Regime Selection value'
  • tip_product_id Many2one → product.product
    default=_get_default_tip_product help='This product is used as reference on customer receipts.' string='Tip Product' args: 'product.product'
  • trusted_config_ids Many2many → pos.config
    column1='is_trusting' column2='is_trusted' domain="[('id', '!=', pos_config_id), ('module_pos_restaurant', '=', False), ('company_id', '=', company_id)]" relation='pos_config_trust_relation' string='Trusted Point of Sale Configurations' args: 'pos.config'
  • use_pricelist Boolean
    args: 'Use a pricelist.'
  • uuid Char
    copy=False default=<expr> help='A globally unique identifier for this pos configuration, used to prevent conflicts in client-generated data.' readonly=True
  • warehouse_id Many2one → stock.warehouse
    default=_default_warehouse_id ondelete='restrict' args: 'stock.warehouse'
Public methods (18)
  • action_pos_config_modal_edit(self)
  • add_cash_payment_method(self)
    @api.model
  • assign_payment_journals(self, company)
  • create(self, vals_list)
    @api.model_create_multi
  • execute(self)
  • generate_pos_journal(self, company)
  • get_limited_partners_loading(self)
  • get_limited_product_count(self)
  • get_limited_products_loading(self, fields)
  • open_existing_session_cb(self)
    close session button access session form to validate entries
  • open_opened_rescue_session_form(self)
  • open_ui(self)
    Open the pos interface with config_id as an extra argument. In vanilla PoS each user can only have one active session, therefore it was not needed to pass the config_id on opening a session. It is also possible to login to sessions created by other users. :returns: dict
  • post_install_pos_localisation(self, companies=False)
    @api.model
  • setup_defaults(self, company)
    Extend this method to customize the existing pos.config of the company during the installation of a localisation. :param self pos.config: pos.config records present in the company during the installation of localisation. :param company res.company: the single company where the pos.config defaults will be setup.
  • setup_invoice_journal(self, company)
  • toggle_images(self, for_products, for_categories)
  • unlink(self)
  • write(self, vals)

New fields (1)
  • pos_session_id Many2one → pos.session
    required=True args: 'pos.session'
Public methods (1)
  • generate_report(self)

New fields (3)
  • end_date Datetime
    default=fields.Datetime.now required=True
  • pos_config_ids Many2many → pos.config
    default=<expr> args: 'pos.config', 'pos_detail_configs'
  • start_date Datetime
    default=_default_start_date required=True
Public methods (1)
  • generate_report(self)

New fields (5)
  • amount Float
    default=_default_amount digits=0 required=True
  • config_id Many2one → pos.config
    default=_default_config required=True string='Point of Sale Configuration' args: 'pos.config'
  • payment_date Datetime
    default=<expr> required=True string='Payment Date'
  • payment_method_id Many2one → pos.payment.method
    default=_default_payment_method required=True string='Payment Method' args: 'pos.payment.method'
  • payment_name Char
    string='Payment Reference'
Public methods (2)
  • check(self)
    Check the order: if the order is not paid: continue payment, if the order is paid print ticket.
  • launch_payment(self)

New fields (47)
  • account_move Many2one → account.move
    copy=False index='btree_not_null' readonly=True string='Invoice' args: 'account.move'
  • amount_paid Float
    digits=0 required=True string='Paid'
  • amount_return Float
    digits=0 readonly=True required=True string='Returned'
  • amount_tax Float
    digits=0 readonly=True required=True string='Taxes'
  • amount_total Float
    digits=0 readonly=True required=True string='Total'
  • company_id Many2one → res.company
    index=True readonly=True required=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=False related='session_id.config_id' store=True string='Point of Sale' args: 'pos.config'
  • country_code Char
    related='company_id.account_fiscal_country_id.code'
  • currency_id Many2one → res.currency
    related='config_id.currency_id' string='Currency' args: 'res.currency'
  • currency_rate Float
    compute='_compute_currency_rate' compute_sudo=True digits=0 help='The rate of the currency to the currency of rate applicable at the date of the order' readonly=True store=True args: 'Currency Rate'
  • date_order Datetime
    default=fields.Datetime.now index=True readonly=True string='Date'
  • failed_pickings Boolean
    compute='_compute_picking_count'
  • fiscal_position_id Many2one → account.fiscal.position
    comodel_name='account.fiscal.position' readonly=False string='Fiscal Position'
  • has_refundable_lines Boolean
    compute='_compute_has_refundable_lines' args: 'Has Refundable Lines'
  • is_invoiced Boolean
    compute='_compute_is_invoiced' args: 'Is Invoiced'
  • is_refunded Boolean
    compute='_compute_refund_related_fields'
  • is_tipped Boolean
    readonly=True args: 'Is this already tipped?'
  • is_total_cost_computed Boolean
    compute='_compute_is_total_cost_computed' help='Allows to know if all the total cost of the order lines have already been computed'
  • last_order_preparation_change Char
    help='Last printed state of the order' string='Last preparation change'
  • lines One2many → pos.order.line
    copy=True string='Order Lines' args: 'pos.order.line', 'order_id'
  • margin Monetary
    compute='_compute_margin' string='Margin'
  • margin_percent Float
    compute='_compute_margin' digits=(12, 4) string='Margin (%)'
  • name Char
    copy=False default='/' readonly=True required=True string='Order Ref'
  • nb_print Integer
    copy=False default=0 readonly=True string='Number of Print'
  • note Text
    string='Internal Notes'
  • partner_id Many2one → res.partner
    change_default=True index='btree_not_null' string='Customer' args: 'res.partner'
  • payment_ids One2many → pos.payment
    readonly=True string='Payments' args: 'pos.payment', 'pos_order_id'
  • picking_count Integer
    compute='_compute_picking_count'
  • picking_ids One2many → stock.picking
    args: 'stock.picking', 'pos_order_id'
  • picking_type_id Many2one → stock.picking.type
    readonly=False related='session_id.config_id.picking_type_id' string='Operation Type' args: 'stock.picking.type'
  • pos_reference Char
    copy=False index=True readonly=True string='Receipt Number'
  • pricelist_id Many2one → product.pricelist
    string='Pricelist' args: 'product.pricelist'
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • refund_orders_count Integer
    compute='_compute_refund_related_fields' args: 'Number of Refund Orders'
  • refunded_order_ids Many2many → pos.order
    compute='_compute_refund_related_fields' args: 'pos.order'
  • refunded_orders_count Integer
    compute='_compute_refund_related_fields'
  • sale_journal Many2one → account.journal
    ondelete='restrict' readonly=True related='session_id.config_id.journal_id' store=True string='Sales Journal' args: 'account.journal'
  • sequence_number Integer
    default=1 help='A session-unique sequence number for the order' string='Sequence Number'
  • session_id Many2one → pos.session
    domain="[('state', '=', 'opened')]" index=True required=True string='Session' args: 'pos.session'
  • session_move_id Many2one → account.move
    copy=False readonly=True related='session_id.move_id' string='Session Journal Entry' args: 'account.move'
  • shipping_date Date
    args: 'Shipping Date'
  • state Selection
    copy=False default='draft' index=True readonly=True args: [('draft', 'New'), ('cancel', 'Cancelled'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced')], 'Status'
  • ticket_code Char
    help='5 digits alphanumeric code to be used by portal user to request an invoice'
  • tip_amount Float
    digits=0 readonly=True string='Tip Amount'
  • to_invoice Boolean
    copy=False args: 'To invoice'
  • tracking_number Char
    compute='_compute_tracking_number' search='_search_tracking_number' string='Order Number'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> help='Person who uses the cash register. It can be a reliever, a student or an interim employee.' string='Responsible'
Public methods (18)
  • action_pos_order_cancel(self)
  • action_pos_order_invoice(self)
  • action_pos_order_paid(self)
  • action_receipt_to_customer(self, name, client, ticket)
  • action_stock_picking(self)
  • action_view_invoice(self)
  • action_view_refund_orders(self)
  • action_view_refunded_orders(self)
  • add_payment(self, data)
    Create a new payment for the order
  • create(self, vals_list)
    @api.model_create_multi
  • create_from_ui(self, orders, draft=False)
    @api.model
    Create and update Orders from the frontend PoS application. Create new orders and update orders that are in draft status. If an order already exists with a status different from 'draft'it will be discarded, otherwise it will be saved to the database. If saved with 'draft' status the order can be overwritten later by this function. :param orders: dictionary with the orders to be created. :type orders: dict. :param draft: Indicate if the orders are meant to be finalized or temporarily saved. :type draft: bool. :Returns: list -- list of db-ids for the created and updated orders.
  • export_for_ui(self)
    Returns a list of dict with each item having similar signature as the return of `export_as_JSON` of models.Order. This is useful for back-and-forth communication between the pos frontend and backend.
  • export_for_ui_shared_order(self, config_id)
    @api.model
  • is_already_paid(self)
  • refund(self)
  • remove_from_ui(self, server_ids)
    @api.model
    Remove orders from the frontend PoS application Remove orders from the server by id. :param server_ids: list of the id's of orders to remove from the server. :type server_ids: list. :returns: list -- list of db-ids for the removed orders.
  • search_paid_order_ids(self, config_id, domain, limit, offset)
    @api.model
    Search for 'paid' orders that satisfy the given domain, limit and offset.
  • write(self, vals)

New fields (31)
  • attribute_value_ids Many2many → product.template.attribute.value
    string='Selected Attributes' args: 'product.template.attribute.value'
  • combo_line_ids One2many → pos.order.line
    string='Combo Lines' args: 'pos.order.line', 'combo_parent_id'
  • combo_parent_id Many2one → pos.order.line
    string='Combo Parent' args: 'pos.order.line'
  • company_id Many2one → res.company
    related='order_id.company_id' store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='order_id.currency_id' args: 'res.currency'
  • custom_attribute_value_ids One2many → product.attribute.custom.value
    comodel_name='product.attribute.custom.value' inverse_name='pos_order_line_id' readonly=False store=True string='Custom Values'
  • customer_note Char
    args: 'Customer Note'
  • discount Float
    default=0.0 digits=0 string='Discount (%)'
  • full_product_name Char
    args: 'Full Product Name'
  • is_total_cost_computed Boolean
    help='Allows to know if the total cost has already been computed or not'
  • margin Monetary
    compute='_compute_margin' string='Margin'
  • margin_percent Float
    compute='_compute_margin' digits=(12, 4) string='Margin (%)'
  • name Char
    copy=False required=True string='Line No'
  • notice Char
    string='Discount Notice'
  • order_id Many2one → pos.order
    index=True ondelete='cascade' required=True string='Order Ref' args: 'pos.order'
  • pack_lot_ids One2many → pos.pack.operation.lot
    string='Lot/serial Number' args: 'pos.pack.operation.lot', 'pos_order_line_id'
  • price_extra Float
    string='Price extra'
  • price_subtotal Float
    digits=0 readonly=True required=True string='Subtotal w/o Tax'
  • price_subtotal_incl Float
    digits=0 readonly=True required=True string='Subtotal'
  • price_unit Float
    digits=0 string='Unit Price'
  • product_id Many2one → product.product
    change_default=True domain=[('sale_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Product UoM' args: 'uom.uom'
  • qty Float
    default=1 digits='Product Unit of Measure' args: 'Quantity'
  • refund_orderline_ids One2many → pos.order.line
    help='Orderlines in this field are the lines that refunded this orderline.' args: 'pos.order.line', 'refunded_orderline_id', 'Refund Order Lines'
  • refunded_orderline_id Many2one → pos.order.line
    help='If this orderline is a refund, then the refunded orderline is specified in this field.' args: 'pos.order.line', 'Refunded Order Line'
  • refunded_qty Float
    compute='_compute_refund_qty' help='Number of items refunded in this orderline.' args: 'Refunded Quantity'
  • skip_change Boolean
    args: 'Skip line when sending ticket to kitchen printers.'
  • tax_ids Many2many → account.tax
    readonly=True string='Taxes' args: 'account.tax'
  • tax_ids_after_fiscal_position Many2many → account.tax
    compute='_get_tax_ids_after_fiscal_position' string='Taxes to Apply' args: 'account.tax'
  • total_cost Float
    digits='Product Price' readonly=True string='Total cost'
  • uuid Char
    copy=False readonly=True string='Uuid'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • export_for_ui(self)
  • write(self, values)

New fields (4)
  • lot_name Char
    args: 'Lot Name'
  • order_id Many2one → pos.order
    readonly=False related='pos_order_line_id.order_id' args: 'pos.order'
  • pos_order_line_id Many2one → pos.order.line
    args: 'pos.order.line'
  • product_id Many2one → product.product
    readonly=False related='pos_order_line_id.product_id' args: 'product.product'
Public methods (1)
  • export_for_ui(self)

New fields (17)
  • account_move_id Many2one → account.move
    index='btree_not_null' args: 'account.move'
  • amount Monetary
    currency_field='currency_id' help='Total amount of the payment.' readonly=True required=True string='Amount'
  • card_type Char
    args: 'Type of card used'
  • cardholder_name Char
    args: 'Cardholder Name'
  • company_id Many2one → res.company
    related='pos_order_id.company_id' store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='pos_order_id.currency_id' string='Currency' args: 'res.currency'
  • currency_rate Float
    help='Conversion rate from company currency to order currency.' related='pos_order_id.currency_rate' string='Conversion Rate'
  • is_change Boolean
    default=False string='Is this payment change?'
  • name Char
    readonly=True string='Label'
  • partner_id Many2one → res.partner
    related='pos_order_id.partner_id' string='Customer' args: 'res.partner'
  • payment_date Datetime
    default=<expr> readonly=True required=True string='Date'
  • payment_method_id Many2one → pos.payment.method
    required=True string='Payment Method' args: 'pos.payment.method'
  • payment_status Char
    args: 'Payment Status'
  • pos_order_id Many2one → pos.order
    index=True required=True string='Order' args: 'pos.order'
  • session_id Many2one → pos.session
    index=True related='pos_order_id.session_id' store=True string='Session' args: 'pos.session'
  • ticket Char
    args: 'Payment Receipt Info'
  • transaction_id Char
    args: 'Payment Transaction ID'
Public methods (1)
  • export_for_ui(self)

New fields (15)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • config_ids Many2many → pos.config
    string='Point of Sale' args: 'pos.config'
  • hide_use_payment_terminal Boolean
    compute='_compute_hide_use_payment_terminal'
  • image Image
    max_height=50 max_width=50 args: 'Image'
  • is_cash_count Boolean
    compute='_compute_is_cash_count' store=True string='Cash'
  • journal_id Many2one → account.journal
    domain=['|', '&', ('type', '=', 'cash'), ('pos_payment_method_ids', '=', False), ('type', '=', 'bank')] help='Leave empty to use the receivable account of customer.\nDefines the journal where to book the accumulated payments (or individual payment if Identify Customer is true) after closing the session.\nFor cash journal, we directly write to the default account in the journal via statement lines.\nFor bank journal, we write to the outstanding account specified in this payment method.\nOnly cash and bank journals are allowed.' ondelete='restrict' string='Journal' args: 'account.journal'
  • name Char
    help='Defines the name of the payment method that will be displayed in the Point of Sale when the payments are selected.' required=True string='Method' translate=True
  • open_session_ids Many2many → pos.session
    compute='_compute_open_session_ids' help='Open PoS sessions that are using this payment method.' string='Pos Sessions' args: 'pos.session'
  • outstanding_account_id Many2one → account.account
    help='Leave empty to use the default account from the company setting.\nAccount used as outstanding account when creating accounting payment records for bank payments.' ondelete='restrict' string='Outstanding Account' args: 'account.account'
  • receivable_account_id Many2one → account.account
    domain=[('reconcile', '=', True), ('account_type', '=', 'asset_receivable')] help="Leave empty to use the default account from the company setting.\nOverrides the company's receivable account (for Point of Sale) used in the journal entries." ondelete='restrict' string='Intermediary Account' args: 'account.account'
  • sequence Integer
    copy=False
  • split_transactions Boolean
    default=False help='Forces to set a customer when using this payment method and splits the journal entries for each customer. It could slow down the closing process.' string='Identify Customer'
  • type Selection
    compute='_compute_type' selection=[('cash', 'Cash'), ('bank', 'Bank'), ('pay_later', 'Customer Account')]
  • use_payment_terminal Selection
    help='Record payments with a terminal on this journal.' selection=<expr> string='Use a Payment Terminal'
Public methods (2)
  • copy(self, default=None)
  • write(self, vals)

New fields (4)
  • name Char
    default='Printer' help='An internal identification of the printer' required=True args: 'Printer Name'
  • printer_type Selection
    default='iot' selection=[('iot', ' Use a printer connected to the IoT Box')] string='Printer Type'
  • product_categories_ids Many2many → pos.category
    string='Printed Product Categories' args: 'pos.category', 'printer_category_rel', 'printer_id', 'category_id'
  • proxy_ip Char
    help="The IP Address or hostname of the Printer's hardware proxy" args: 'Proxy IP Address'
Public methods (0)

No public methods.

New fields (34)
  • access_token Char
    copy=False args: 'Security Token'
  • bank_payment_ids One2many → account.payment
    help='Account payments representing aggregated and bank split payments.' args: 'account.payment', 'pos_session_id', 'Bank Payments'
  • cash_control Boolean
    compute='_compute_cash_control' string='Has Cash Control'
  • cash_journal_id Many2one → account.journal
    compute='_compute_cash_journal' store=True string='Cash Journal' args: 'account.journal'
  • cash_real_transaction Monetary
    readonly=True string='Transaction'
  • cash_register_balance_end Monetary
    compute='_compute_cash_balance' help='Opening balance summed to all cash transactions.' readonly=True string='Theoretical Closing Balance'
  • cash_register_balance_end_real Monetary
    readonly=True string='Ending Balance'
  • cash_register_balance_start Monetary
    readonly=True string='Starting Balance'
  • cash_register_difference Monetary
    compute='_compute_cash_balance' help='Difference between the theoretical closing balance and the real closing balance.' readonly=True string='Before Closing Difference'
  • cash_register_total_entry_encoding Monetary
    compute='_compute_cash_balance' readonly=True string='Total Cash Transaction'
  • closing_notes Text
    string='Closing Notes'
  • company_id Many2one → res.company
    readonly=True related='config_id.company_id' string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    index=True required=True string='Point of Sale' args: 'pos.config'
  • currency_id Many2one → res.currency
    readonly=False related='config_id.currency_id' string='Currency' args: 'res.currency'
  • failed_pickings Boolean
    compute='_compute_picking_count'
  • is_in_company_currency Boolean
    compute='_compute_is_in_company_currency' args: 'Is Using Company Currency'
  • login_number Integer
    default=0 help='A sequence number that is incremented each time a user resumes the pos session' string='Login Sequence Number'
  • move_id Many2one → account.move
    index=True string='Journal Entry' args: 'account.move'
  • name Char
    default='/' readonly=True required=True string='Session ID'
  • opening_notes Text
    string='Opening Notes'
  • order_count Integer
    compute='_compute_order_count'
  • order_ids One2many → pos.order
    string='Orders' args: 'pos.order', 'session_id'
  • payment_method_ids Many2many → pos.payment.method
    related='config_id.payment_method_ids' string='Payment Methods' args: 'pos.payment.method'
  • picking_count Integer
    compute='_compute_picking_count'
  • picking_ids One2many → stock.picking
    args: 'stock.picking', 'pos_session_id'
  • rescue Boolean
    copy=False help='Auto-generated session for orphan orders, ignored in constraints' readonly=True string='Recovery Session'
  • sequence_number Integer
    default=1 help='A sequence number that is incremented with each order' string='Order Sequence Number'
  • start_at Datetime
    readonly=True string='Opening Date'
  • state Selection
    copy=False default='opening_control' index=True readonly=True required=True string='Status' args: POS_SESSION_STATE
  • statement_line_ids One2many → account.bank.statement.line
    readonly=True string='Cash Lines' args: 'account.bank.statement.line', 'pos_session_id'
  • stop_at Datetime
    copy=False readonly=True string='Closing Date'
  • total_payments_amount Float
    compute='_compute_total_payments_amount' string='Total Payments Amount'
  • update_stock_at_closing Boolean
    args: 'Stock should be updated at closing'
  • user_id Many2one → res.users
    default=<expr> index=True ondelete='restrict' readonly=False required=True string='Opened By' args: 'res.users'
Public methods (30)
  • action_pos_session_close(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_pos_session_closing_control(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_pos_session_open(self)
  • action_pos_session_validate(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_show_payments_list(self)
  • action_stock_picking(self)
  • action_view_order(self)
  • close_session_from_ui(self, bank_payment_method_diff_pairs=None)
    Calling this method will try to close the session. param bank_payment_method_diff_pairs: list[(int, float)] Pairs of payment_method_id and diff_amount which will be used to post loss/profit when closing the session. If successful, it returns {'successful': True} Otherwise, it returns {'successful': False, 'message': str, 'redirect': bool}. 'redirect' is a boolean used to know whether we redirect the user to the back end or not. When necessary, error (i.e. UserError, AccessError) is raised which should redirect the user to the back end.
  • create(self, vals_list)
    @api.model_create_multi
  • find_product_by_barcode(self, barcode)
  • get_closing_control_data(self)
  • get_onboarding_data(self)
  • get_pos_ui_account_fiscal_positions_by_ids(self, fp_ids)
  • get_pos_ui_product_pricelist_item_by_product(self, product_tmpl_ids, product_ids)
  • get_pos_ui_product_pricelists_by_ids(self, pricelist_ids)
  • get_pos_ui_product_product_by_params(self, custom_search_params)
    :param custom_search_params: a dictionary containing params of a search_read()
  • get_pos_ui_res_partner_by_params(self, custom_search_params)
    :param custom_search_params: a dictionary containing params of a search_read()
  • get_total_discount(self)
  • load_pos_data(self)
  • load_product_frontend(self)
  • log_partner_message(self, partner_id, action, message_type)
  • login(self)
  • open_frontend_cb(self)
    Open the pos interface with config_id as an extra argument. In vanilla PoS each user can only have one active session, therefore it was not needed to pass the config_id on opening a session. It is also possible to login to sessions created by other users. :returns: dict
  • post_closing_cash_details(self, counted_cash)
    Calling this method will try store the cash details during the session closing. :param counted_cash: float, the total cash the user counted from its cash register If successful, it returns {'successful': True} Otherwise, it returns {'successful': False, 'message': str, 'redirect': bool}. 'redirect' is a boolean used to know whether we redirect the user to the back end or not. When necessary, error (i.e. UserError, AccessError) is raised which should redirect the user to the back end.
  • set_cashbox_pos(self, cashbox_value: int, notes: str)
  • show_cash_register(self)
  • show_journal_items(self)
  • try_cash_in_out(self, _type, amount, reason, extras)
  • unlink(self)
  • update_closing_control_state_session(self, notes)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_order_id Many2one → pos.order
    args: 'pos.order', 'POS Order'
Public methods (0)

No public methods.

New fields (1)
  • pos_order_line_id Many2one → pos.order.line
    ondelete='cascade' string='PoS Order Line' args: 'pos.order.line'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_product_info_pos(self, price, quantity, pos_config_id)

New fields (6)
  • available_in_pos Boolean
    default=False help='Check if you want this product to appear in the Point of Sale.' string='Available in POS'
  • combo_ids Many2many → pos.combo
    string='Combinations' args: 'pos.combo'
  • detailed_type Selection
    ondelete={'combo': 'set consu'} selection_add=[('combo', 'Combo')]
  • pos_categ_ids Many2many → pos.category
    help='Category used in the Point of Sale.' string='Point of Sale Category' args: 'pos.category'
  • to_weight Boolean
    help='Check if the product should be weighted using the hardware scale integration.' string='To Weigh With Scale'
  • type Selection
    ondelete={'combo': 'set consu'} selection_add=[('combo', 'Combo')]
Public methods (1)
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_sale_details(self, date_start=False, date_stop=False, config_ids=False, session_ids=False)
    @api.model
    Serialise the orders of the requested time period, configs and sessions. :param date_start: The dateTime to start, default today 00:00:00. :type date_start: str. :param date_stop: The dateTime to stop, default date_start + 23:59:59. :type date_stop: str. :param config_ids: Pos Config id's to include. :type config_ids: list of numbers. :param session_ids: Pos Config id's to include. :type session_ids: list of numbers. :returns: dict -- Serialised sales.

New fields (22)
  • average_price Float
    group_operator='avg' readonly=True string='Average Price'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=True string='Point of Sale' args: 'pos.config'
  • date Datetime
    readonly=True string='Order Date'
  • delay_validation Integer
    readonly=True string='Delay Validation'
  • invoiced Boolean
    readonly=True
  • journal_id Many2one → account.journal
    readonly=True string='Journal' args: 'account.journal'
  • margin Float
    readonly=True string='Margin'
  • nbr_lines Integer
    readonly=True string='Sale Line Count'
  • order_id Many2one → pos.order
    readonly=True string='Order' args: 'pos.order'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • price_sub_total Float
    readonly=True string='Subtotal w/o discount'
  • price_total Float
    readonly=True string='Total Price'
  • pricelist_id Many2one → product.pricelist
    readonly=True string='Pricelist' args: 'product.pricelist'
  • product_categ_id Many2one → product.category
    readonly=True string='Product Category' args: 'product.category'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Integer
    readonly=True string='Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True string='Product Template' args: 'product.template'
  • session_id Many2one → pos.session
    readonly=True string='Session' args: 'pos.session'
  • state Selection
    readonly=True string='Status' args: [('draft', 'New'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced'), ('cancel', 'Cancelled')]
  • total_discount Float
    readonly=True string='Total Discount'
  • user_id Many2one → res.users
    readonly=True string='User' args: 'res.users'
Public methods (1)
  • init(self)

New fields (3)
  • point_of_sale_ticket_unique_code Boolean
    help='Add a 5-digit code on the receipt to allow the user to request the invoice for an order on the portal.' string='Generate a code on ticket'
  • point_of_sale_update_stock_quantities Selection
    default='closing' help="At the session closing: A picking is created for the entire session when it's closed\n In real time: Each order sent to the server create its own picking" string='Update quantities in stock' args: [('closing', 'At the session closing (faster)'), ('real', 'In real time (accurate but slower)')]
  • point_of_sale_use_ticket_qr_code Boolean
    help='Add a QR code on the ticket, which the user can scan to request the invoice linked to its order.' string='Use QR code on ticket'
Public methods (1)
  • validate_period_lock_date(self)
    @api.constrains('period_lock_date', 'fiscalyear_lock_date')
    This constrains makes it impossible to change the period lock date if some open POS session exists into it. Without that, these POS sessions would trigger an error message saying that the period has been locked when trying to close them.

New fields (73)
  • account_default_pos_receivable_account_id Many2one
    check_company=True readonly=False related='company_id.account_default_pos_receivable_account_id' string='Default Account Receivable (PoS)'
  • barcode_nomenclature_id Many2one → barcode.nomenclature
    readonly=False related='company_id.nomenclature_id' args: 'barcode.nomenclature'
  • is_kiosk_mode Boolean
    default=False string='Is Kiosk Mode'
  • module_pos_adyen Boolean
    help='The transactions are processed by Adyen. Set your Adyen credentials on the related payment method.' string='Adyen Payment Terminal'
  • module_pos_mercury Boolean
    help='The transactions are processed by Vantiv. Set your Vantiv credentials on the related payment method.' string='Vantiv Payment Terminal'
  • module_pos_paytm Boolean
    help='The transactions are processed by PayTM. Set your PayTM credentials on the related payment method.' string='PayTM Payment Terminal'
  • module_pos_preparation_display Boolean
    help='Show orders on the preparation display screen.' string='Preparation Display'
  • module_pos_six Boolean
    help='The transactions are processed by Six. Set the IP address of the terminal on the related payment method.' string='Six Payment Terminal'
  • module_pos_stripe Boolean
    help='The transactions are processed by Stripe. Set your Stripe credentials on the related payment method.' string='Stripe Payment Terminal'
  • point_of_sale_ticket_unique_code Boolean
    readonly=False related='company_id.point_of_sale_ticket_unique_code'
  • point_of_sale_use_ticket_qr_code Boolean
    readonly=False related='company_id.point_of_sale_use_ticket_qr_code'
  • pos_allowed_pricelist_ids Many2many → product.pricelist
    compute='_compute_pos_allowed_pricelist_ids' args: 'product.pricelist'
  • pos_amount_authorized_diff Float
    readonly=False related='pos_config_id.amount_authorized_diff'
  • pos_auto_validate_terminal_payment Boolean
    readonly=False related='pos_config_id.auto_validate_terminal_payment' string='Automatically validates orders paid with a payment terminal.'
  • pos_available_pricelist_ids Many2many → product.pricelist
    compute='_compute_pos_pricelist_id' readonly=False store=True string='Available Pricelists' args: 'product.pricelist'
  • pos_cash_control Boolean
    related='pos_config_id.cash_control'
  • pos_cash_rounding Boolean
    readonly=False related='pos_config_id.cash_rounding' string='Cash Rounding (PoS)'
  • pos_company_has_template Boolean
    related='pos_config_id.company_has_template'
  • pos_config_id Many2one → pos.config
    default=<expr> string='Point of Sale' args: 'pos.config'
  • pos_default_bill_ids Many2many
    readonly=False related='pos_config_id.default_bill_ids'
  • pos_default_fiscal_position_id Many2one → account.fiscal.position
    check_company=True compute='_compute_pos_fiscal_positions' readonly=False store=True string='Default Fiscal Position' args: 'account.fiscal.position'
  • pos_fiscal_position_ids Many2many → account.fiscal.position
    check_company=True compute='_compute_pos_fiscal_positions' readonly=False store=True string='Fiscal Positions' args: 'account.fiscal.position'
  • pos_has_active_session Boolean
    related='pos_config_id.has_active_session'
  • pos_iface_available_categ_ids Many2many → pos.category
    compute='_compute_pos_iface_available_categ_ids' readonly=False store=True string='Available PoS Product Categories' args: 'pos.category'
  • pos_iface_big_scrollbars Boolean
    readonly=False related='pos_config_id.iface_big_scrollbars'
  • pos_iface_cashdrawer Boolean
    compute='_compute_pos_iface_cashdrawer' readonly=False store=True string='Cashdrawer'
  • pos_iface_customer_facing_display_background_image_1920 Image
    readonly=False related='pos_config_id.iface_customer_facing_display_background_image_1920'
  • pos_iface_customer_facing_display_local Boolean
    readonly=False related='pos_config_id.iface_customer_facing_display_local'
  • pos_iface_customer_facing_display_via_proxy Boolean
    compute='_compute_pos_iface_customer_facing_display_via_proxy' readonly=False store=True string='Customer Facing Display'
  • pos_iface_electronic_scale Boolean
    compute='_compute_pos_iface_electronic_scale' readonly=False store=True string='Electronic Scale'
  • pos_iface_print_auto Boolean
    readonly=False related='pos_config_id.iface_print_auto'
  • pos_iface_print_skip_screen Boolean
    readonly=False related='pos_config_id.iface_print_skip_screen'
  • pos_iface_print_via_proxy Boolean
    compute='_compute_pos_iface_print_via_proxy' readonly=False store=True string='Print via Proxy'
  • pos_iface_scan_via_proxy Boolean
    compute='_compute_pos_iface_scan_via_proxy' readonly=False store=True string='Scan via Proxy'
  • pos_iface_start_categ_id Many2one → pos.category
    compute='_compute_pos_iface_start_categ_id' readonly=False store=True string='Initial Category' args: 'pos.category'
  • pos_iface_tax_included Selection
    readonly=False related='pos_config_id.iface_tax_included'
  • pos_iface_tipproduct Boolean
    readonly=False related='pos_config_id.iface_tipproduct'
  • pos_invoice_journal_id Many2one
    readonly=False related='pos_config_id.invoice_journal_id'
  • pos_is_header_or_footer Boolean
    readonly=False related='pos_config_id.is_header_or_footer'
  • pos_is_margins_costs_accessible_to_every_user Boolean
    readonly=False related='pos_config_id.is_margins_costs_accessible_to_every_user'
  • pos_is_order_printer Boolean
    compute='_compute_pos_printer' readonly=False store=True
  • pos_is_posbox Boolean
    readonly=False related='pos_config_id.is_posbox'
  • pos_journal_id Many2one
    readonly=False related='pos_config_id.journal_id'
  • pos_limit_categories Boolean
    readonly=False related='pos_config_id.limit_categories'
  • pos_manual_discount Boolean
    readonly=False related='pos_config_id.manual_discount'
  • pos_module_pos_discount Boolean
    readonly=False related='pos_config_id.module_pos_discount'
  • pos_module_pos_hr Boolean
    readonly=False related='pos_config_id.module_pos_hr'
  • pos_module_pos_restaurant Boolean
    readonly=False related='pos_config_id.module_pos_restaurant'
  • pos_only_round_cash_method Boolean
    readonly=False related='pos_config_id.only_round_cash_method'
  • pos_other_devices Boolean
    readonly=False related='pos_config_id.other_devices'
  • pos_payment_method_ids Many2many
    readonly=False related='pos_config_id.payment_method_ids'
  • pos_picking_policy Selection
    readonly=False related='pos_config_id.picking_policy'
  • pos_picking_type_id Many2one
    readonly=False related='pos_config_id.picking_type_id'
  • pos_pricelist_id Many2one → product.pricelist
    compute='_compute_pos_pricelist_id' readonly=False store=True string='Default Pricelist' args: 'product.pricelist'
  • pos_printer_ids Many2many
    readonly=False related='pos_config_id.printer_ids'
  • pos_proxy_ip Char
    compute='_compute_pos_proxy_ip' readonly=False store=True string='IP Address'
  • pos_receipt_footer Text
    compute='_compute_pos_receipt_header_footer' readonly=False store=True string='Receipt Footer'
  • pos_receipt_header Text
    compute='_compute_pos_receipt_header_footer' readonly=False store=True string='Receipt Header'
  • pos_restrict_price_control Boolean
    readonly=False related='pos_config_id.restrict_price_control'
  • pos_rounding_method Many2one
    readonly=False related='pos_config_id.rounding_method'
  • pos_route_id Many2one
    readonly=False related='pos_config_id.route_id'
  • pos_selectable_categ_ids Many2many → pos.category
    compute='_compute_pos_selectable_categ_ids' args: 'pos.category'
  • pos_sequence_id Many2one
    related='pos_config_id.sequence_id'
  • pos_set_maximum_difference Boolean
    readonly=False related='pos_config_id.set_maximum_difference'
  • pos_ship_later Boolean
    readonly=False related='pos_config_id.ship_later'
  • pos_start_category Boolean
    readonly=False related='pos_config_id.start_category'
  • pos_tax_regime_selection Boolean
    readonly=False related='pos_config_id.tax_regime_selection'
  • pos_tip_product_id Many2one → product.product
    compute='_compute_pos_tip_product_id' readonly=False store=True string='Tip Product' args: 'product.product'
  • pos_trusted_config_ids Many2many
    readonly=False related='pos_config_id.trusted_config_ids'
  • pos_use_pricelist Boolean
    readonly=False related='pos_config_id.use_pricelist'
  • pos_warehouse_id Many2one
    readonly=False related='pos_config_id.warehouse_id' string='Warehouse (PoS)'
  • sale_tax_id Many2one → account.tax
    check_company=True readonly=False related='company_id.account_sale_tax_id' string='Default Sale Tax' args: 'account.tax'
  • update_stock_quantities Selection
    readonly=False related='company_id.point_of_sale_update_stock_quantities'
Public methods (4)
  • action_pos_config_create_new(self)
  • create(self, vals_list)
    @api.model_create_multi
  • pos_open_ui(self)
  • set_values(self)

New fields (2)
  • pos_order_count Integer
    compute='_compute_pos_order' groups='point_of_sale.group_pos_user' help='The number of point of sales orders related to this customer'
  • pos_order_ids One2many → pos.order
    readonly=True args: 'pos.order', 'partner_id'
Public methods (2)
  • action_view_pos_order(self)
    This function returns an action that displays the pos orders from partner.
  • create_from_ui(self, partner)
    @api.model
    create or modify a partner from the point of sale ui. partner contains the partner's fields.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • pos_order_id Many2one → pos.order
    index=True args: 'pos.order'
  • pos_session_id Many2one → pos.session
    index=True args: 'pos.session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_type_id Many2one → stock.picking.type
    copy=False string='Point of Sale Operation Type' args: 'stock.picking.type'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    help='Check if you want to group products of this category in point of sale orders' string='Group Products in POS'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    readonly=False related='category_id.is_pos_groupable'
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/point_of_sale
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYSales/Point of Sale
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, Alexis de Lattre, Christophe Simonis, Xavier Morel, Joren Van Onder, Nicolas Martinelli, Géry Debongnie, Aaron Bohy, Pedro M. Baeza, Sylvain LE GAL, GitHub, Yannick Tivisse, qsm-odoo, Pierre Masereel, Romain Derie, Laurent Smet, Adrien Dieudonne, Christophe Monniez, Jorge Pinna Puissant, Julien Castiaux, Rémi Rahir, Xavier-Do, Romeo Fragomeli, Luis Torres, Victor Feyens, Andrea Grazioso (agr-odoo), Adrien Dieudonné, Moisés López, Loan (lse), William Henrotin, Joseph Caburnay, oco-odoo, Florent de Labarre, Julien Mougenot, Anh Thao Pham (pta), svs-odoo, Samuel Degueldre, Alvaro Fuentes, Achraf (abz), Nils Hamerlinck, Brice bib Bartoletti, Adrien Widart, Ivan Yelizariev, lejeune quentin, Touati Djamel (otd), Tiffany Chang (tic), Gorash, fja-odoo, Mathieu Duckerts-Antoine, Pierre Paridans, Aurélien (avd), Jérôme Vanhaudenard, William Braeckman, root, Romain Estievenart, Raf Geens, roen-odoo, Stanislas Sobieski, Hubert Van de Walle (huvw), Miquel Raïch, pedrambiria, Ahmad Khanalizadeh, Jerome (jev), Jacky (trj), Laurent Desausoi (lade), momegahed, Nicolas (vin), william-andre, Florian Damhaut, Merlin (megu), MerlinGuillaume, PNO, mafo-odoo, Audric Onockx (auon), aliya, william, Antoine Guenet, Patrick Hoste, anhe-odoo, Agustín Castro Bugallo, Walid HANNICHE (waha), Abdelouahab (abla), Thomas Beckers, Antoine Vandevenne (anv), Aurelien van Delft (avd), Federico (fega), luvi, Thomas Binsfeld, Roy Le, Renaud Thiry, rhe-odoo, Pierrot (prro), niyasraphy, Pierrick Brun, Loan (LSE), David Monnom (moda), Francois (fge), Thomas Lefebvre (thle), Archana Vaghasiya, alsh-odoo, Matheus Leal Viana (malv), Eleftherios Kritsotakis, Gaetan Vanden Bergh (gavb), François Honoré, Merel Geens (mege), Andro Gvivradze, Pedram (PEBR), Louis Wicket (wil), David, Walid, Mylyna Hy, Laurent Desausoi, Adrien Widart (awt), nda, Victor Piryns (pivi), Simon Genin (ges), clesgow, Michele, Claire Bretton (clbr), Maruan Aguerdouh (magm), Dylan Kiss (dyki), arsi, Sanket Brahmbhatt, Maitri Patel, FrancoisGe, Michael (mcm), Preksha Chouhan, Karnav Sojitra, paso-odoo, CarmenMiranda, Brieuc-brd, Benjamin Willig, Daniel Duque, Nguyễn Đại Dương, AH-Yussef, Sarah Bellefroid, “moda”, Louis Travaux, Dawn Hwang, Theo VINCENT (thvi), Luis Manuel [Vauxoo], Pedram (pebr), Cameron, adda-odoo, Arnaud Sibille, Adrien Guilliams (adgu), TheAlekLuna, ilru-odoo, Corentin Thaon (thco), sesn-odoo, guva-odoo, kdeb@odoo.com, stefanorigano (SRI), Aurelien MARIE (auma), Basit, axtr, Sven Fuehr, Mountain Tran, yosa-odoo, Martin Trigaux (mat), Louis Gobert, Khalid, Pierre, Harsh Bhatt (habh), Joseph (jcb), Max Whale, rmun-odoo, csnauwaert, yaso, parp-odoo, niai, aamo-odoo, Hoang Tien Dung, Parth Solanki[PASO], Jonathan, emtz10, Hussein Ebrahim(hyhe), Majed Alhanash (malh), Victorien (viso), Loukas Wets (lowe), Mathieu (mano), Joanna, manv-afk
WEBSITE
WEBSITEhttps://www.odoo.com/app/point-of-sale-shop
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:46
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes_gs1_nomenclature
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (58)
XML IDNameModelTypeStatus
digest_digest_view_form digest.digest.view.form.inherit.sale.order digest.digest xpath Inherits digest.digest_digest_view_form
point_of_sale.assets_common POS Assets Common ir.ui.view qweb New
point_of_sale.index POS Index ir.ui.view qweb New
point_of_sale.qunit_suite point_of_sale.qunit_suite ir.ui.view qweb New
point_of_sale.qunit_suite_assets point_of_sale.qunit_suite_assets ir.ui.view qweb New
point_of_sale.report_invoice_document point_of_sale.report_invoice_document ir.ui.view qweb Inherits account.report_invoice_document
pos_config_view_form pos.config.form.view pos.config form New
pos_payment_method_view_form pos.payment.method.form pos.payment.method form New
pos_payment_method_view_search pos.payment.search.view pos.payment.method search New
pos_payment_method_view_tree pos.payment.method.tree pos.payment.method tree New
pos_rounding_form_view_inherited pos.cash.rounding.form.inherited account.cash.rounding xpath Inherits account.rounding_form_view
product_pos_category_form_view pos.category.form pos.category form New
product_pos_category_tree_view pos.category.tree pos.category tree New
product_product_tree_view product.product.product.tree.inherit product.product field Inherits product.product_product_tree_view
product_template_form_view product.template.form.inherit product.template xpath Inherits product.product_template_form_view
product_template_only_form_view product.template.only.form.inherit product.template xpath Inherits product.product_template_only_form_view
product_template_search_view_pos product.template.search.pos.form product.template filter Inherits product.product_template_search_view
product_template_tree_view product.template.product.tree.inherit product.template field Inherits product.product_template_tree_view
product_uom_categ_form_view uom.category.form.inherit uom.category xpath Inherits uom.product_uom_categ_form_view
product_uom_categ_tree_view uom.category.tree.inherit uom.category xpath Inherits uom.product_uom_categ_tree_view
report_pos_order_view_tree report.pos.order.view.tree report.pos.order tree New
report_saledetails report_saledetails ir.ui.view qweb New
report_userlabel report_userlabel ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.point_of_sale res.config.settings xpath Inherits base.res_config_settings_view_form
ticket_validation_screen ticket_validation_screen ir.ui.view qweb New
view_account_journal_pos_user_form account.journal.pos.user.form.inherit account.journal xpath Inherits account.view_account_journal_form
view_form_pos_close_session_wizard pos.close.session.wizard.form pos.close.session.wizard form New
view_partner_pos_kanban res.partner.pos.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
view_partner_property_form res.partner.pos.form.inherit res.partner div Inherits base.view_partner_form
view_pos_bill_form pos.bill.form pos.bill form New
view_pos_bill_tree pos.bill.tree pos.bill tree New
view_pos_category_kanban pos.category.kanban pos.category kanban New
view_pos_config_kanban pos.config.kanban.view pos.config kanban New
view_pos_config_search pos.config.search.view pos.config search New
view_pos_config_tree pos.config.tree.view pos.config tree New
view_pos_details_wizard pos.details.wizard.form pos.details.wizard form New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_kanban pos.order.kanban pos.order kanban New
view_pos_order_line pos.order.line.tree pos.order.line tree New
view_pos_order_line_form pos.order.line.form pos.order.line form New
view_pos_order_pivot pos.order.pivot pos.order pivot New
view_pos_order_search pos.order.search.view pos.order search New
view_pos_order_tree pos.order.tree pos.order tree New
view_pos_order_tree_all_sales_lines pos.order.line.all.sales.tree pos.order.line tree New
view_pos_order_tree_no_session_id pos.order.tree_no_session_id pos.order xpath Inherits point_of_sale.view_pos_order_tree
view_pos_payment pos.make.payment.form pos.make.payment form New
view_pos_payment_form pos.payment.form pos.payment form New
view_pos_payment_search pos.payment.search.view pos.payment search New
view_pos_payment_tree pos.payment.tree pos.payment tree New
view_pos_pos_form pos.order.form pos.order form New
view_pos_session_check_product_wizard pos.session.check.product.wizard.form pos.session.check_product_wizard form New
view_pos_session_form pos.session.form.view pos.session form New
view_pos_session_kanban pos.session.kanban pos.session kanban New
view_pos_session_search pos.session.search.view pos.session search New
view_pos_session_tree pos.session.tree.view pos.session tree New
view_report_pos_order_graph report.pos.order.graph report.pos.order graph New
view_report_pos_order_pivot report.pos.order.pivot report.pos.order pivot New
view_report_pos_order_search report.pos.order.search report.pos.order search New
Models touched (41)

New fields (1)
  • pos_session_id Many2one → pos.session
    copy=False string='Session' args: 'pos.session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_payment_method_ids One2many → pos.payment.method
    string='Point of Sale Payment Methods' args: 'pos.payment.method', 'journal_id'
Public methods (1)
  • action_archive(self)

New fields (2)
  • pos_order_ids One2many → pos.order
    args: 'pos.order', 'account_move'
  • pos_payment_ids One2many → pos.payment
    args: 'pos.payment', 'account_move_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • force_outstanding_account_id Many2one → account.account
    check_company=True args: 'account.account', 'Forced Outstanding Account'
  • pos_payment_method_id Many2one → pos.payment.method
    args: 'pos.payment.method', 'POS Payment Method'
  • pos_session_id Many2one → pos.session
    args: 'pos.session', 'POS Session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (1)
  • type Selection
    ondelete={'weight': 'set default', 'price': 'set default', 'discount': 'set default', 'client': 'set default', 'cashier': 'set default'} selection_add=[('weight', 'Weighted Product'), ('price', 'Priced Product'), ('discount', 'Discounted Product'), ('client', 'Client'), ('cashier', 'Cashier')]
Public methods (0)

No public methods.

New fields (2)
  • kpi_pos_total Boolean
    args: 'POS Sales'
  • kpi_pos_total_value Monetary
    compute='_compute_kpi_pos_total_value'
Public methods (0)

No public methods.

New fields (3)
  • name Char
    args: 'Name'
  • pos_config_ids Many2many → pos.config
    string='Point of Sales' args: 'pos.config'
  • value Float
    digits=(16, 4) required=True args: 'Coin/Bill Value'
Public methods (1)
  • name_create(self, name)
    @api.model

New fields (6)
  • child_id One2many → pos.category
    string='Children Categories' args: 'pos.category', 'parent_id'
  • has_image Boolean
    compute='_compute_has_image'
  • image_128 Image
    max_height=128 max_width=128 args: 'Image'
  • name Char
    required=True string='Category Name' translate=True
  • parent_id Many2one → pos.category
    index=True string='Parent Category' args: 'pos.category'
  • sequence Integer
    help='Gives the sequence order when displaying a list of product categories.'
Public methods (1)
  • name_get(self)

New fields (4)
  • account_id Many2one → account.account
    args: 'account.account', 'Destination account'
  • account_readonly Boolean
    args: 'Destination account is readonly'
  • amount_to_balance Float
    args: 'Amount to balance'
  • message Text
    args: 'Information message'
Public methods (1)
  • close_session(self)

New fields (79)
  • active Boolean
    default=True
  • amount_authorized_diff Float
    help='This field depicts the maximum difference allowed between the ending balance and the theoretical cash when closing a session, for non-POS managers. If this maximum is reached, the user will have an error message at the closing of his session saying that he needs to contact his manager.' args: 'Amount Authorized Difference'
  • available_pricelist_ids Many2many → product.pricelist
    default=_default_pricelist help='Make several pricelists available in the Point of Sale. You can also apply a pricelist to specific customers from their contact form (in Sales tab). To be valid, this pricelist must be listed here as an available pricelist. Otherwise the default pricelist will apply.' string='Available Pricelists' args: 'product.pricelist'
  • cash_control Boolean
    compute='_compute_cash_control' help='Check the amount of the cashbox at opening and closing.' string='Advanced Cash Control'
  • cash_rounding Boolean
    string='Cash Rounding'
  • company_has_template Boolean
    compute='_compute_company_has_template' string='Company has chart of accounts'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    compute='_compute_currency' string='Currency' args: 'res.currency'
  • current_session_id Many2one → pos.session
    compute='_compute_current_session' string='Current Session' args: 'pos.session'
  • current_session_state Char
    compute='_compute_current_session'
  • current_user_id Many2one → res.users
    compute='_compute_current_session_user' string='Current Session Responsible' args: 'res.users'
  • default_bill_ids Many2many → pos.bill
    string='Coins/Bills' args: 'pos.bill'
  • default_fiscal_position_id Many2one → account.fiscal.position
    string='Default Fiscal Position' args: 'account.fiscal.position'
  • fiscal_position_ids Many2many → account.fiscal.position
    help='This is useful for restaurants with onsite and take-away services that imply specific tax rates.' string='Fiscal Positions' args: 'account.fiscal.position'
  • group_pos_manager_id Many2one → res.groups
    default=_get_group_pos_manager help='This field is there to pass the id of the pos manager group to the point of sale client.' string='Point of Sale Manager Group' args: 'res.groups'
  • group_pos_user_id Many2one → res.groups
    default=_get_group_pos_user help='This field is there to pass the id of the pos user group to the point of sale client.' string='Point of Sale User Group' args: 'res.groups'
  • has_active_session Boolean
    compute='_compute_current_session'
  • iface_available_categ_ids Many2many → pos.category
    help='The point of sale will only display products which are within one of the selected category trees. If no category is specified, all available products will be shown' string='Available PoS Product Categories' args: 'pos.category'
  • iface_big_scrollbars Boolean
    help='For imprecise industrial touchscreens.' args: 'Large Scrollbars'
  • iface_cashdrawer Boolean
    help='Automatically open the cashdrawer.' string='Cashdrawer'
  • iface_customer_facing_display Boolean
    compute='_compute_customer_facing_display'
  • iface_customer_facing_display_local Boolean
    help='Show checkout to customers.' string='Local Customer Facing Display'
  • iface_customer_facing_display_via_proxy Boolean
    help='Show checkout to customers with a remotely-connected screen.' string='Customer Facing Display'
  • iface_electronic_scale Boolean
    help='Enables Electronic Scale integration.' string='Electronic Scale'
  • iface_print_auto Boolean
    default=False help='The receipt will automatically be printed at the end of each order.' string='Automatic Receipt Printing'
  • iface_print_skip_screen Boolean
    default=True help='The receipt screen will be skipped if the receipt can be printed automatically.' string='Skip Preview Screen'
  • iface_print_via_proxy Boolean
    help='Bypass browser printing and prints via the hardware proxy.' string='Print via Proxy'
  • iface_scan_via_proxy Boolean
    help='Enable barcode scanning with a remotely connected barcode scanner and card swiping with a Vantiv card reader.' string='Scan via Proxy'
  • iface_start_categ_id Many2one → pos.category
    help='The point of sale will display this product category by default. If no category is specified, all available products will be shown.' string='Initial Category' args: 'pos.category'
  • iface_tax_included Selection
    default='total' required=True string='Tax Display' args: [('subtotal', 'Tax-Excluded Price'), ('total', 'Tax-Included Price')]
  • iface_tipproduct Boolean
    string='Product tips'
  • invoice_journal_id Many2one → account.journal
    default=_default_invoice_journal domain=[('type', '=', 'sale')] help='Accounting journal used to create invoices.' string='Invoice Journal' args: 'account.journal'
  • is_header_or_footer Boolean
    args: 'Custom Header & Footer'
  • is_installed_account_accountant Boolean
    compute='_compute_is_installed_account_accountant' string='Is the Full Accounting Installed'
  • is_margins_costs_accessible_to_every_user Boolean
    default=False help='When disabled, only PoS manager can view the margin and cost of product among the Product info.' string='Margins & Costs'
  • is_posbox Boolean
    args: 'PosBox'
  • journal_id Many2one → account.journal
    default=_default_sale_journal domain=[('type', 'in', ('general', 'sale'))] help='Accounting journal used to post POS session journal entries and POS invoice payments.' ondelete='restrict' string='Point of Sale Journal' args: 'account.journal'
  • last_session_closing_cash Float
    compute='_compute_last_session'
  • last_session_closing_date Date
    compute='_compute_last_session'
  • limit_categories Boolean
    args: 'Restrict Categories'
  • limited_partners_amount Integer
    default=10000
  • limited_partners_loading Boolean
    default=True help="By default, 10000 partners are loaded.\nWhen the session is open, we keep on loading all remaining partners in the background.\nIn the meantime, you can use the 'Load Customers' button to load partners from database." args: 'Limited Partners Loading'
  • limited_products_amount Integer
    default=20000
  • limited_products_loading Boolean
    default=True help="we load all starred products (favorite), all services, recent inventory movements of products, and the most recently updated products.\nWhen the session is open, we keep on loading all remaining products in the background.\nIn the meantime, you can click on the 'database icon' in the searchbar to load products from database." args: 'Limited Product Loading'
  • manual_discount Boolean
    default=True string='Line Discounts'
  • module_pos_discount Boolean
    args: 'Global Discounts'
  • module_pos_hr Boolean
    help='Show employee login screen'
  • module_pos_mercury Boolean
    string='Integrated Card Payments'
  • module_pos_restaurant Boolean
    args: 'Is a Bar/Restaurant'
  • name Char
    help='An internal identification of the point of sale.' required=True string='Point of Sale'
  • number_of_opened_session Integer
    compute='_compute_current_session' string='Number of Opened Session'
  • only_round_cash_method Boolean
    string='Only apply rounding on cash'
  • other_devices Boolean
    help='Connect devices to your PoS without an IoT Box.' string='Other Devices'
  • partner_load_background Boolean
    default=False
  • payment_method_ids Many2many → pos.payment.method
    default=<expr> string='Payment Methods' args: 'pos.payment.method'
  • picking_policy Selection
    default='direct' help='If you deliver all products at once, the delivery order will be scheduled based on the greatest product lead time. Otherwise, it will be based on the shortest.' required=True string='Shipping Policy' args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')]
  • picking_type_id Many2one → stock.picking.type
    default=_default_picking_type_id domain="[('code', '=', 'outgoing'), ('warehouse_id.company_id', '=', company_id)]" ondelete='restrict' required=True string='Operation Type' args: 'stock.picking.type'
  • pos_session_duration Char
    compute='_compute_current_session_user'
  • pos_session_state Char
    compute='_compute_current_session_user'
  • pos_session_username Char
    compute='_compute_current_session_user'
  • pricelist_id Many2one → product.pricelist
    default=_default_pricelist help='The pricelist used if no customer is selected or if the customer has no Sale Pricelist configured.' required=True string='Default Pricelist' args: 'product.pricelist'
  • product_load_background Boolean
    default=False
  • proxy_ip Char
    help='The hostname or ip address of the hardware proxy, Will be autodetected if left empty.' size=45 string='IP Address'
  • receipt_footer Text
    help='A short text that will be inserted as a footer in the printed receipt.' string='Receipt Footer'
  • receipt_header Text
    help='A short text that will be inserted as a header in the printed receipt.' string='Receipt Header'
  • restrict_price_control Boolean
    help='Only users with Manager access rights for PoS app can modify the product prices on orders.' string='Restrict Price Modifications to Managers'
  • rounding_method Many2one → account.cash.rounding
    string='Cash rounding' args: 'account.cash.rounding'
  • route_id Many2one → stock.route
    string='Spefic route for products delivered later.' args: 'stock.route'
  • sequence_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders.' ondelete='restrict' readonly=True string='Order IDs Sequence' args: 'ir.sequence'
  • sequence_line_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders lines.' readonly=True string='Order Line IDs Sequence' args: 'ir.sequence'
  • session_ids One2many → pos.session
    string='Sessions' args: 'pos.session', 'config_id'
  • set_maximum_difference Boolean
    help='Set a maximum difference allowed between the expected and counted money during the closing of the session.' args: 'Set Maximum Difference'
  • ship_later Boolean
    string='Ship Later'
  • start_category Boolean
    default=False args: 'Start Category'
  • tax_regime_selection Boolean
    args: 'Tax Regime Selection value'
  • tip_product_id Many2one → product.product
    help='This product is used as reference on customer receipts.' string='Tip Product' args: 'product.product'
  • use_pricelist Boolean
    args: 'Use a pricelist.'
  • uuid Char
    copy=False default=<expr> help='A globally unique identifier for this pos configuration, used to prevent conflicts in client-generated data.' readonly=True
  • warehouse_id Many2one → stock.warehouse
    default=_default_warehouse_id ondelete='restrict' args: 'stock.warehouse'
Public methods (16)
  • action_pos_config_modal_edit(self)
  • assign_payment_journals(self, company)
  • create(self, vals_list)
    @api.model_create_multi
  • execute(self)
  • generate_pos_journal(self, company)
  • get_limited_partners_loading(self)
  • get_limited_products_loading(self, fields)
  • name_get(self)
  • open_existing_session_cb(self)
    close session button access session form to validate entries
  • open_opened_session_list(self)
  • open_ui(self)
    Open the pos interface with config_id as an extra argument. In vanilla PoS each user can only have one active session, therefore it was not needed to pass the config_id on opening a session. It is also possible to login to sessions created by other users. :returns: dict
  • post_install_pos_localisation(self, companies=False)
    @api.model
  • setup_defaults(self, company)
    Extend this method to customize the existing pos.config of the company during the installation of a localisation. :param self pos.config: pos.config records present in the company during the installation of localisation. :param company res.company: the single company where the pos.config defaults will be setup.
  • setup_invoice_journal(self, company)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • end_date Datetime
    default=fields.Datetime.now required=True
  • pos_config_ids Many2many → pos.config
    default=<expr> args: 'pos.config', 'pos_detail_configs'
  • start_date Datetime
    default=_default_start_date required=True
Public methods (1)
  • generate_report(self)

New fields (5)
  • amount Float
    default=_default_amount digits=0 required=True
  • config_id Many2one → pos.config
    default=_default_config required=True string='Point of Sale Configuration' args: 'pos.config'
  • payment_date Datetime
    default=<expr> required=True string='Payment Date'
  • payment_method_id Many2one → pos.payment.method
    default=_default_payment_method required=True string='Payment Method' args: 'pos.payment.method'
  • payment_name Char
    string='Payment Reference'
Public methods (2)
  • check(self)
    Check the order: if the order is not paid: continue payment, if the order is paid print ticket.
  • launch_payment(self)

New fields (43)
  • account_move Many2one → account.move
    copy=False index='btree_not_null' readonly=True string='Invoice' args: 'account.move'
  • amount_paid Float
    digits=0 readonly=True required=True states={'draft': [('readonly', False)]} string='Paid'
  • amount_return Float
    digits=0 readonly=True required=True string='Returned'
  • amount_tax Float
    digits=0 readonly=True required=True string='Taxes'
  • amount_total Float
    digits=0 readonly=True required=True string='Total'
  • company_id Many2one → res.company
    index=True readonly=True required=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=False related='session_id.config_id' string='Point of Sale' args: 'pos.config'
  • currency_id Many2one → res.currency
    related='config_id.currency_id' string='Currency' args: 'res.currency'
  • currency_rate Float
    compute='_compute_currency_rate' compute_sudo=True digits=0 help='The rate of the currency to the currency of rate applicable at the date of the order' readonly=True store=True args: 'Currency Rate'
  • date_order Datetime
    default=fields.Datetime.now index=True readonly=True string='Date'
  • failed_pickings Boolean
    compute='_compute_picking_count'
  • fiscal_position_id Many2one → account.fiscal.position
    comodel_name='account.fiscal.position' readonly=True states={'draft': [('readonly', False)]} string='Fiscal Position'
  • has_refundable_lines Boolean
    compute='_compute_has_refundable_lines' args: 'Has Refundable Lines'
  • is_invoiced Boolean
    compute='_compute_is_invoiced' args: 'Is Invoiced'
  • is_refunded Boolean
    compute='_compute_refund_related_fields'
  • is_tipped Boolean
    readonly=True args: 'Is this already tipped?'
  • is_total_cost_computed Boolean
    compute='_compute_is_total_cost_computed' help='Allows to know if all the total cost of the order lines have already been computed'
  • lines One2many → pos.order.line
    copy=True readonly=True states={'draft': [('readonly', False)]} string='Order Lines' args: 'pos.order.line', 'order_id'
  • margin Monetary
    compute='_compute_margin' string='Margin'
  • margin_percent Float
    compute='_compute_margin' digits=(12, 4) string='Margin (%)'
  • name Char
    copy=False default='/' readonly=True required=True string='Order Ref'
  • nb_print Integer
    copy=False default=0 readonly=True string='Number of Print'
  • note Text
    string='Internal Notes'
  • partner_id Many2one → res.partner
    change_default=True index='btree_not_null' states={'draft': [('readonly', False)], 'paid': [('readonly', False)]} string='Customer' args: 'res.partner'
  • payment_ids One2many → pos.payment
    readonly=True string='Payments' args: 'pos.payment', 'pos_order_id'
  • picking_count Integer
    compute='_compute_picking_count'
  • picking_ids One2many → stock.picking
    args: 'stock.picking', 'pos_order_id'
  • picking_type_id Many2one → stock.picking.type
    readonly=False related='session_id.config_id.picking_type_id' string='Operation Type' args: 'stock.picking.type'
  • pos_reference Char
    copy=False index=True readonly=True string='Receipt Number'
  • pricelist_id Many2one → product.pricelist
    readonly=True required=True states={'draft': [('readonly', False)]} string='Pricelist' args: 'product.pricelist'
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • refund_orders_count Integer
    compute='_compute_refund_related_fields' args: 'Number of Refund Orders'
  • refunded_order_ids Many2many → pos.order
    compute='_compute_refund_related_fields' args: 'pos.order'
  • refunded_orders_count Integer
    compute='_compute_refund_related_fields'
  • sale_journal Many2one → account.journal
    ondelete='restrict' readonly=True related='session_id.config_id.journal_id' store=True string='Sales Journal' args: 'account.journal'
  • sequence_number Integer
    default=1 help='A session-unique sequence number for the order' string='Sequence Number'
  • session_id Many2one → pos.session
    domain="[('state', '=', 'opened')]" index=True readonly=True required=True states={'draft': [('readonly', False)]} string='Session' args: 'pos.session'
  • session_move_id Many2one → account.move
    copy=False readonly=True related='session_id.move_id' string='Session Journal Entry' args: 'account.move'
  • state Selection
    copy=False default='draft' index=True readonly=True args: [('draft', 'New'), ('cancel', 'Cancelled'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced')], 'Status'
  • tip_amount Float
    digits=0 readonly=True string='Tip Amount'
  • to_invoice Boolean
    copy=False args: 'To invoice'
  • to_ship Boolean
    args: 'To ship'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> help='Person who uses the cash register. It can be a reliever, a student or an interim employee.' states={'done': [('readonly', True)], 'invoiced': [('readonly', True)]} string='Responsible'
Public methods (16)
  • action_pos_order_cancel(self)
  • action_pos_order_invoice(self)
  • action_pos_order_paid(self)
  • action_receipt_to_customer(self, name, client, ticket)
  • action_stock_picking(self)
  • action_view_invoice(self)
  • action_view_refund_orders(self)
  • action_view_refunded_orders(self)
  • add_payment(self, data)
    Create a new payment for the order
  • create(self, vals_list)
    @api.model_create_multi
  • create_from_ui(self, orders, draft=False)
    @api.model
    Create and update Orders from the frontend PoS application. Create new orders and update orders that are in draft status. If an order already exists with a status diferent from 'draft'it will be discareded, otherwise it will be saved to the database. If saved with 'draft' status the order can be overwritten later by this function. :param orders: dictionary with the orders to be created. :type orders: dict. :param draft: Indicate if the orders are ment to be finalised or temporarily saved. :type draft: bool. :Returns: list -- list of db-ids for the created and updated orders.
  • export_for_ui(self)
    Returns a list of dict with each item having similar signature as the return of `export_as_JSON` of models.Order. This is useful for back-and-forth communication between the pos frontend and backend.
  • get_table_draft_orders(self, table_id)
    This function is here to be overriden
  • refund(self)
    Create a copy of order for refund order
  • search_paid_order_ids(self, config_id, domain, limit, offset)
    @api.model
    Search for 'paid' orders that satisfy the given domain, limit and offset.
  • write(self, vals)

New fields (25)
  • company_id Many2one → res.company
    related='order_id.company_id' store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='order_id.currency_id' args: 'res.currency'
  • customer_note Char
    args: 'Customer Note'
  • discount Float
    default=0.0 digits=0 string='Discount (%)'
  • full_product_name Char
    args: 'Full Product Name'
  • is_total_cost_computed Boolean
    help='Allows to know if the total cost has already been computed or not'
  • margin Monetary
    compute='_compute_margin' string='Margin'
  • margin_percent Float
    compute='_compute_margin' digits=(12, 4) string='Margin (%)'
  • name Char
    copy=False required=True string='Line No'
  • notice Char
    string='Discount Notice'
  • order_id Many2one → pos.order
    index=True ondelete='cascade' required=True string='Order Ref' args: 'pos.order'
  • pack_lot_ids One2many → pos.pack.operation.lot
    string='Lot/serial Number' args: 'pos.pack.operation.lot', 'pos_order_line_id'
  • price_extra Float
    string='Price extra'
  • price_subtotal Float
    digits=0 readonly=True required=True string='Subtotal w/o Tax'
  • price_subtotal_incl Float
    digits=0 readonly=True required=True string='Subtotal'
  • price_unit Float
    digits=0 string='Unit Price'
  • product_id Many2one → product.product
    change_default=True domain=[('sale_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Product UoM' args: 'uom.uom'
  • qty Float
    default=1 digits='Product Unit of Measure' args: 'Quantity'
  • refund_orderline_ids One2many → pos.order.line
    help='Orderlines in this field are the lines that refunded this orderline.' args: 'pos.order.line', 'refunded_orderline_id', 'Refund Order Lines'
  • refunded_orderline_id Many2one → pos.order.line
    help='If this orderline is a refund, then the refunded orderline is specified in this field.' args: 'pos.order.line', 'Refunded Order Line'
  • refunded_qty Float
    compute='_compute_refund_qty' help='Number of items refunded in this orderline.' args: 'Refunded Quantity'
  • tax_ids Many2many → account.tax
    readonly=True string='Taxes' args: 'account.tax'
  • tax_ids_after_fiscal_position Many2many → account.tax
    compute='_get_tax_ids_after_fiscal_position' string='Taxes to Apply' args: 'account.tax'
  • total_cost Float
    digits='Product Price' readonly=True string='Total cost'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • export_for_ui(self)
  • write(self, values)

New fields (4)
  • lot_name Char
    args: 'Lot Name'
  • order_id Many2one → pos.order
    readonly=False related='pos_order_line_id.order_id' args: 'pos.order'
  • pos_order_line_id Many2one → pos.order.line
    args: 'pos.order.line'
  • product_id Many2one → product.product
    readonly=False related='pos_order_line_id.product_id' args: 'product.product'
Public methods (1)
  • export_for_ui(self)

New fields (17)
  • account_move_id Many2one → account.move
    index='btree_not_null' args: 'account.move'
  • amount Monetary
    currency_field='currency_id' help='Total amount of the payment.' readonly=True required=True string='Amount'
  • card_type Char
    args: 'Type of card used'
  • cardholder_name Char
    args: 'Cardholder Name'
  • company_id Many2one → res.company
    related='pos_order_id.company_id' store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='pos_order_id.currency_id' string='Currency' args: 'res.currency'
  • currency_rate Float
    help='Conversion rate from company currency to order currency.' related='pos_order_id.currency_rate' string='Conversion Rate'
  • is_change Boolean
    default=False string='Is this payment change?'
  • name Char
    readonly=True string='Label'
  • partner_id Many2one → res.partner
    related='pos_order_id.partner_id' string='Customer' args: 'res.partner'
  • payment_date Datetime
    default=<expr> readonly=True required=True string='Date'
  • payment_method_id Many2one → pos.payment.method
    required=True string='Payment Method' args: 'pos.payment.method'
  • payment_status Char
    args: 'Payment Status'
  • pos_order_id Many2one → pos.order
    index=True required=True string='Order' args: 'pos.order'
  • session_id Many2one → pos.session
    index=True related='pos_order_id.session_id' store=True string='Session' args: 'pos.session'
  • ticket Char
    args: 'Payment Receipt Info'
  • transaction_id Char
    args: 'Payment Transaction ID'
Public methods (2)
  • export_for_ui(self)
  • name_get(self)

New fields (13)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • config_ids Many2many → pos.config
    string='Point of Sale Configurations' args: 'pos.config'
  • hide_use_payment_terminal Boolean
    compute='_compute_hide_use_payment_terminal'
  • is_cash_count Boolean
    compute='_compute_is_cash_count' store=True string='Cash'
  • journal_id Many2one → account.journal
    domain=[('type', 'in', ('cash', 'bank'))] help='Leave empty to use the receivable account of customer.\nDefines the journal where to book the accumulated payments (or individual payment if Identify Customer is true) after closing the session.\nFor cash journal, we directly write to the default account in the journal via statement lines.\nFor bank journal, we write to the outstanding account specified in this payment method.\nOnly cash and bank journals are allowed.' ondelete='restrict' string='Journal' args: 'account.journal'
  • name Char
    help='Defines the name of the payment method that will be displayed in the Point of Sale when the payments are selected.' required=True string='Method' translate=True
  • open_session_ids Many2many → pos.session
    compute='_compute_open_session_ids' help='Open PoS sessions that are using this payment method.' string='Pos Sessions' args: 'pos.session'
  • outstanding_account_id Many2one → account.account
    help='Leave empty to use the default account from the company setting.\nAccount used as outstanding account when creating accounting payment records for bank payments.' ondelete='restrict' string='Outstanding Account' args: 'account.account'
  • receivable_account_id Many2one → account.account
    domain=[('reconcile', '=', True), ('account_type', '=', 'asset_receivable')] help="Leave empty to use the default account from the company setting.\nOverrides the company's receivable account (for Point of Sale) used in the journal entries." ondelete='restrict' string='Intermediary Account' args: 'account.account'
  • split_transactions Boolean
    default=False help='Forces to set a customer when using this payment method and splits the journal entries for each customer. It could slow down the closing process.' string='Identify Customer'
  • type Selection
    compute='_compute_type' selection=[('cash', 'Cash'), ('bank', 'Bank'), ('pay_later', 'Customer Account')]
  • use_payment_terminal Selection
    help='Record payments with a terminal on this journal.' selection=<expr> string='Use a Payment Terminal'
Public methods (2)
  • copy(self, default=None)
  • write(self, vals)

New fields (32)
  • bank_payment_ids One2many → account.payment
    help='Account payments representing aggregated and bank split payments.' args: 'account.payment', 'pos_session_id', 'Bank Payments'
  • cash_control Boolean
    compute='_compute_cash_all' compute_sudo=True string='Has Cash Control'
  • cash_journal_id Many2one → account.journal
    compute='_compute_cash_all' store=True string='Cash Journal' args: 'account.journal'
  • cash_real_transaction Monetary
    readonly=True string='Transaction'
  • cash_register_balance_end Monetary
    compute='_compute_cash_balance' help='Opening balance summed to all cash transactions.' readonly=True string='Theoretical Closing Balance'
  • cash_register_balance_end_real Monetary
    readonly=True string='Ending Balance'
  • cash_register_balance_start Monetary
    readonly=True string='Starting Balance'
  • cash_register_difference Monetary
    compute='_compute_cash_balance' help='Difference between the theoretical closing balance and the real closing balance.' readonly=True string='Before Closing Difference'
  • cash_register_total_entry_encoding Monetary
    compute='_compute_cash_balance' readonly=True string='Total Cash Transaction'
  • company_id Many2one → res.company
    readonly=True related='config_id.company_id' string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    index=True required=True string='Point of Sale' args: 'pos.config'
  • currency_id Many2one → res.currency
    readonly=False related='config_id.currency_id' string='Currency' args: 'res.currency'
  • failed_pickings Boolean
    compute='_compute_picking_count'
  • is_in_company_currency Boolean
    compute='_compute_is_in_company_currency' args: 'Is Using Company Currency'
  • login_number Integer
    default=0 help='A sequence number that is incremented each time a user resumes the pos session' string='Login Sequence Number'
  • move_id Many2one → account.move
    index=True string='Journal Entry' args: 'account.move'
  • name Char
    default='/' readonly=True required=True string='Session ID'
  • opening_notes Text
    string='Opening Notes'
  • order_count Integer
    compute='_compute_order_count'
  • order_ids One2many → pos.order
    string='Orders' args: 'pos.order', 'session_id'
  • payment_method_ids Many2many → pos.payment.method
    related='config_id.payment_method_ids' string='Payment Methods' args: 'pos.payment.method'
  • picking_count Integer
    compute='_compute_picking_count'
  • picking_ids One2many → stock.picking
    args: 'stock.picking', 'pos_session_id'
  • rescue Boolean
    copy=False help='Auto-generated session for orphan orders, ignored in constraints' readonly=True string='Recovery Session'
  • sequence_number Integer
    default=1 help='A sequence number that is incremented with each order' string='Order Sequence Number'
  • start_at Datetime
    readonly=True string='Opening Date'
  • state Selection
    copy=False default='opening_control' index=True readonly=True required=True string='Status' args: POS_SESSION_STATE
  • statement_line_ids One2many → account.bank.statement.line
    readonly=True string='Cash Lines' args: 'account.bank.statement.line', 'pos_session_id'
  • stop_at Datetime
    copy=False readonly=True string='Closing Date'
  • total_payments_amount Float
    compute='_compute_total_payments_amount' string='Total Payments Amount'
  • update_stock_at_closing Boolean
    args: 'Stock should be updated at closing'
  • user_id Many2one → res.users
    default=<expr> index=True ondelete='restrict' readonly=True required=True states={'opening_control': [('readonly', False)]} string='Opened By' args: 'res.users'
Public methods (25)
  • action_pos_session_close(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_pos_session_closing_control(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_pos_session_open(self)
  • action_pos_session_validate(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_show_payments_list(self)
  • action_stock_picking(self)
  • action_view_order(self)
  • close_session_from_ui(self, bank_payment_method_diff_pairs=None)
    Calling this method will try to close the session. param bank_payment_method_diff_pairs: list[(int, float)] Pairs of payment_method_id and diff_amount which will be used to post loss/profit when closing the session. If successful, it returns {'successful': True} Otherwise, it returns {'successful': False, 'message': str, 'redirect': bool}. 'redirect' is a boolean used to know whether we redirect the user to the back end or not. When necessary, error (i.e. UserError, AccessError) is raised which should redirect the user to the back end.
  • create(self, vals_list)
    @api.model_create_multi
  • find_product_by_barcode(self, barcode)
  • get_closing_control_data(self)
  • get_onboarding_data(self)
  • get_pos_ui_product_pricelist_item_by_product(self, product_tmpl_ids, product_ids)
  • get_pos_ui_product_product_by_params(self, custom_search_params)
    :param custom_search_params: a dictionary containing params of a search_read()
  • get_pos_ui_res_partner_by_params(self, custom_search_params)
    :param custom_search_params: a dictionary containing params of a search_read()
  • load_pos_data(self)
  • login(self)
  • open_frontend_cb(self)
    Open the pos interface with config_id as an extra argument. In vanilla PoS each user can only have one active session, therefore it was not needed to pass the config_id on opening a session. It is also possible to login to sessions created by other users. :returns: dict
  • post_closing_cash_details(self, counted_cash)
    Calling this method will try store the cash details during the session closing. :param counted_cash: float, the total cash the user counted from its cash register If successful, it returns {'successful': True} Otherwise, it returns {'successful': False, 'message': str, 'redirect': bool}. 'redirect' is a boolean used to know whether we redirect the user to the back end or not. When necessary, error (i.e. UserError, AccessError) is raised which should redirect the user to the back end.
  • set_cashbox_pos(self, cashbox_value, notes)
  • show_cash_register(self)
  • show_journal_items(self)
  • try_cash_in_out(self, _type, amount, reason, extras)
  • unlink(self)
  • update_closing_control_state_session(self, notes)

New fields (0)

No new fields.

Public methods (2)
  • load_demo_products(self)
  • open_ui(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_order_id Many2one → pos.order
    args: 'pos.order', 'POS Order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_product_info_pos(self, price, quantity, pos_config_id)

New fields (3)
  • available_in_pos Boolean
    default=False help='Check if you want this product to appear in the Point of Sale.' string='Available in POS'
  • pos_categ_id Many2one → pos.category
    help='Category used in the Point of Sale.' string='Point of Sale Category' args: 'pos.category'
  • to_weight Boolean
    help='Check if the product should be weighted using the hardware scale integration.' string='To Weigh With Scale'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_sale_details(self, date_start=False, date_stop=False, config_ids=False, session_ids=False)
    @api.model
    Serialise the orders of the requested time period, configs and sessions. :param date_start: The dateTime to start, default today 00:00:00. :type date_start: str. :param date_stop: The dateTime to stop, default date_start + 23:59:59. :type date_stop: str. :param config_ids: Pos Config id's to include. :type config_ids: list of numbers. :param session_ids: Pos Config id's to include. :type session_ids: list of numbers. :returns: dict -- Serialised sales.

New fields (23)
  • average_price Float
    group_operator='avg' readonly=True string='Average Price'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=True string='Point of Sale' args: 'pos.config'
  • date Datetime
    readonly=True string='Order Date'
  • delay_validation Integer
    readonly=True string='Delay Validation'
  • invoiced Boolean
    readonly=True
  • journal_id Many2one → account.journal
    readonly=True string='Journal' args: 'account.journal'
  • margin Float
    readonly=True string='Margin'
  • nbr_lines Integer
    readonly=True string='Sale Line Count'
  • order_id Many2one → pos.order
    readonly=True string='Order' args: 'pos.order'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • pos_categ_id Many2one → pos.category
    readonly=True string='PoS Category' args: 'pos.category'
  • price_sub_total Float
    readonly=True string='Subtotal w/o discount'
  • price_total Float
    readonly=True string='Total Price'
  • pricelist_id Many2one → product.pricelist
    readonly=True string='Pricelist' args: 'product.pricelist'
  • product_categ_id Many2one → product.category
    readonly=True string='Product Category' args: 'product.category'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Integer
    readonly=True string='Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True string='Product Template' args: 'product.template'
  • session_id Many2one → pos.session
    readonly=True string='Session' args: 'pos.session'
  • state Selection
    readonly=True string='Status' args: [('draft', 'New'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced'), ('cancel', 'Cancelled')]
  • total_discount Float
    readonly=True string='Total Discount'
  • user_id Many2one → res.users
    readonly=True string='User' args: 'res.users'
Public methods (1)
  • init(self)

New fields (2)
  • point_of_sale_update_stock_quantities Selection
    default='closing' help="At the session closing: A picking is created for the entire session when it's closed\n In real time: Each order sent to the server create its own picking" string='Update quantities in stock' args: [('closing', 'At the session closing (faster)'), ('real', 'In real time (accurate but slower)')]
  • point_of_sale_use_ticket_qr_code Boolean
    help='Add a QR code on the ticket, which the user can scan to request the invoice linked to its order.' string='Use QR code on ticket'
Public methods (1)
  • validate_period_lock_date(self)
    @api.constrains('period_lock_date', 'fiscalyear_lock_date')
    This constrains makes it impossible to change the period lock date if some open POS session exists into it. Without that, these POS sessions would trigger an error message saying that the period has been locked when trying to close them.

New fields (71)
  • account_default_pos_receivable_account_id Many2one
    readonly=False related='company_id.account_default_pos_receivable_account_id' string='Default Account Receivable (PoS)'
  • barcode_nomenclature_id Many2one → barcode.nomenclature
    readonly=False related='company_id.nomenclature_id' args: 'barcode.nomenclature'
  • is_default_pricelist_displayed Boolean
    compute='_compute_pos_pricelist_id' compute_sudo=True
  • module_pos_adyen Boolean
    help='The transactions are processed by Adyen. Set your Adyen credentials on the related payment method.' string='Adyen Payment Terminal'
  • module_pos_mercury Boolean
    help='The transactions are processed by Vantiv. Set your Vantiv credentials on the related payment method.' string='Vantiv Payment Terminal'
  • module_pos_six Boolean
    help='The transactions are processed by Six. Set the IP address of the terminal on the related payment method.' string='Six Payment Terminal'
  • module_pos_stripe Boolean
    help='The transactions are processed by Stripe. Set your Stripe credentials on the related payment method.' string='Stripe Payment Terminal'
  • point_of_sale_use_ticket_qr_code Boolean
    readonly=False related='company_id.point_of_sale_use_ticket_qr_code'
  • pos_allowed_pricelist_ids Many2many → product.pricelist
    compute='_compute_pos_allowed_pricelist_ids' args: 'product.pricelist'
  • pos_amount_authorized_diff Float
    readonly=False related='pos_config_id.amount_authorized_diff'
  • pos_available_pricelist_ids Many2many → product.pricelist
    compute='_compute_pos_pricelist_id' readonly=False store=True string='Available Pricelists' args: 'product.pricelist'
  • pos_cash_control Boolean
    related='pos_config_id.cash_control'
  • pos_cash_rounding Boolean
    readonly=False related='pos_config_id.cash_rounding' string='Cash Rounding (PoS)'
  • pos_company_has_template Boolean
    related='pos_config_id.company_has_template'
  • pos_config_id Many2one → pos.config
    default=<expr> string='Point of Sale' args: 'pos.config'
  • pos_default_bill_ids Many2many
    readonly=False related='pos_config_id.default_bill_ids'
  • pos_default_fiscal_position_id Many2one → account.fiscal.position
    compute='_compute_pos_fiscal_positions' readonly=False store=True string='Default Fiscal Position' args: 'account.fiscal.position'
  • pos_fiscal_position_ids Many2many → account.fiscal.position
    compute='_compute_pos_fiscal_positions' readonly=False store=True string='Fiscal Positions' args: 'account.fiscal.position'
  • pos_has_active_session Boolean
    related='pos_config_id.has_active_session'
  • pos_iface_available_categ_ids Many2many → pos.category
    compute='_compute_pos_iface_available_categ_ids' readonly=False store=True string='Available PoS Product Categories' args: 'pos.category'
  • pos_iface_big_scrollbars Boolean
    readonly=False related='pos_config_id.iface_big_scrollbars'
  • pos_iface_cashdrawer Boolean
    compute='_compute_pos_iface_cashdrawer' readonly=False store=True string='Cashdrawer'
  • pos_iface_customer_facing_display_local Boolean
    readonly=False related='pos_config_id.iface_customer_facing_display_local'
  • pos_iface_customer_facing_display_via_proxy Boolean
    compute='_compute_pos_iface_customer_facing_display_via_proxy' readonly=False store=True string='Customer Facing Display'
  • pos_iface_electronic_scale Boolean
    compute='_compute_pos_iface_electronic_scale' readonly=False store=True string='Electronic Scale'
  • pos_iface_print_auto Boolean
    readonly=False related='pos_config_id.iface_print_auto'
  • pos_iface_print_skip_screen Boolean
    readonly=False related='pos_config_id.iface_print_skip_screen'
  • pos_iface_print_via_proxy Boolean
    compute='_compute_pos_iface_print_via_proxy' readonly=False store=True string='Print via Proxy'
  • pos_iface_scan_via_proxy Boolean
    compute='_compute_pos_iface_scan_via_proxy' readonly=False store=True string='Scan via Proxy'
  • pos_iface_start_categ_id Many2one → pos.category
    compute='_compute_pos_iface_start_categ_id' readonly=False store=True string='Initial Category' args: 'pos.category'
  • pos_iface_tax_included Selection
    readonly=False related='pos_config_id.iface_tax_included'
  • pos_iface_tipproduct Boolean
    readonly=False related='pos_config_id.iface_tipproduct'
  • pos_invoice_journal_id Many2one
    readonly=False related='pos_config_id.invoice_journal_id'
  • pos_is_header_or_footer Boolean
    readonly=False related='pos_config_id.is_header_or_footer'
  • pos_is_margins_costs_accessible_to_every_user Boolean
    readonly=False related='pos_config_id.is_margins_costs_accessible_to_every_user'
  • pos_is_posbox Boolean
    readonly=False related='pos_config_id.is_posbox'
  • pos_journal_id Many2one
    readonly=False related='pos_config_id.journal_id'
  • pos_limit_categories Boolean
    readonly=False related='pos_config_id.limit_categories'
  • pos_limited_partners_amount Integer
    readonly=False related='pos_config_id.limited_partners_amount'
  • pos_limited_partners_loading Boolean
    readonly=False related='pos_config_id.limited_partners_loading'
  • pos_limited_products_amount Integer
    readonly=False related='pos_config_id.limited_products_amount'
  • pos_limited_products_loading Boolean
    readonly=False related='pos_config_id.limited_products_loading'
  • pos_manual_discount Boolean
    readonly=False related='pos_config_id.manual_discount'
  • pos_module_pos_discount Boolean
    readonly=False related='pos_config_id.module_pos_discount'
  • pos_module_pos_hr Boolean
    readonly=False related='pos_config_id.module_pos_hr'
  • pos_module_pos_restaurant Boolean
    readonly=False related='pos_config_id.module_pos_restaurant'
  • pos_only_round_cash_method Boolean
    readonly=False related='pos_config_id.only_round_cash_method'
  • pos_other_devices Boolean
    readonly=False related='pos_config_id.other_devices'
  • pos_partner_load_background Boolean
    readonly=False related='pos_config_id.partner_load_background'
  • pos_payment_method_ids Many2many
    readonly=False related='pos_config_id.payment_method_ids'
  • pos_picking_policy Selection
    readonly=False related='pos_config_id.picking_policy'
  • pos_picking_type_id Many2one
    readonly=False related='pos_config_id.picking_type_id'
  • pos_pricelist_id Many2one → product.pricelist
    compute='_compute_pos_pricelist_id' readonly=False store=True string='Default Pricelist' args: 'product.pricelist'
  • pos_product_load_background Boolean
    readonly=False related='pos_config_id.product_load_background'
  • pos_proxy_ip Char
    compute='_compute_pos_proxy_ip' readonly=False store=True string='IP Address'
  • pos_receipt_footer Text
    compute='_compute_pos_receipt_header_footer' readonly=False store=True string='Receipt Footer'
  • pos_receipt_header Text
    compute='_compute_pos_receipt_header_footer' readonly=False store=True string='Receipt Header'
  • pos_restrict_price_control Boolean
    readonly=False related='pos_config_id.restrict_price_control'
  • pos_rounding_method Many2one
    readonly=False related='pos_config_id.rounding_method'
  • pos_route_id Many2one
    readonly=False related='pos_config_id.route_id'
  • pos_selectable_categ_ids Many2many → pos.category
    compute='_compute_pos_selectable_categ_ids' args: 'pos.category'
  • pos_sequence_id Many2one
    related='pos_config_id.sequence_id'
  • pos_set_maximum_difference Boolean
    readonly=False related='pos_config_id.set_maximum_difference'
  • pos_ship_later Boolean
    readonly=False related='pos_config_id.ship_later'
  • pos_start_category Boolean
    readonly=False related='pos_config_id.start_category'
  • pos_tax_regime_selection Boolean
    readonly=False related='pos_config_id.tax_regime_selection'
  • pos_tip_product_id Many2one → product.product
    compute='_compute_pos_tip_product_id' readonly=False store=True string='Tip Product' args: 'product.product'
  • pos_use_pricelist Boolean
    readonly=False related='pos_config_id.use_pricelist'
  • pos_warehouse_id Many2one
    readonly=False related='pos_config_id.warehouse_id' string='Warehouse (PoS)'
  • sale_tax_id Many2one → account.tax
    readonly=False related='company_id.account_sale_tax_id' string='Default Sale Tax' args: 'account.tax'
  • update_stock_quantities Selection
    readonly=False related='company_id.point_of_sale_update_stock_quantities'
Public methods (4)
  • action_pos_config_create_new(self)
  • create(self, vals_list)
    @api.model_create_multi
  • pos_open_ui(self)
  • set_values(self)

New fields (2)
  • pos_order_count Integer
    compute='_compute_pos_order' groups='point_of_sale.group_pos_user' help='The number of point of sales orders related to this customer'
  • pos_order_ids One2many → pos.order
    readonly=True args: 'pos.order', 'partner_id'
Public methods (2)
  • action_view_pos_order(self)
    This function returns an action that displays the pos orders from partner.
  • create_from_ui(self, partner)
    @api.model
    create or modify a partner from the point of sale ui. partner contains the partner's fields.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • pos_order_id Many2one → pos.order
    index=True args: 'pos.order'
  • pos_session_id Many2one → pos.session
    index=True args: 'pos.session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_type_id Many2one → stock.picking.type
    string='Point of Sale Operation Type' args: 'stock.picking.type'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    help='Check if you want to group products of this category in point of sale orders' string='Group Products in POS'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    readonly=False related='category_id.is_pos_groupable'
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/point_of_sale
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYSales/Point of Sale
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Josse Colpaert, Christophe Simonis, Xavier Morel, Joren Van Onder, Goffin Simon, Mohammed Shekha, Nicolas Martinelli, Nicolas Lempereur, Géry Debongnie, Aaron Bohy, Pedro M. Baeza, Jeremy Kersten, GitHub, Lucas Perais (lpe), Yannick Tivisse, qsm-odoo, Dharmraj Jhala, Pierre Masereel, Romain Derie, Laurent Smet, Adrien Dieudonne, Christophe Monniez, Jorge Pinna Puissant, Arnold Moyaux, wan, Antoine Prieels, Rémi Rahir, Xavier-Do, Romeo Fragomeli, Victor Feyens, Andrea Grazioso (agr-odoo), Hugo Adan, Moisés López, Loan (lse), William Henrotin, Joseph Caburnay, oco-odoo, Florent de Labarre, Julien Mougenot, Anh Thao Pham (pta), svs-odoo, Samuel Degueldre, Alvaro Fuentes, Achraf (abz), Brice bib Bartoletti, Adrien Widart, Ivan Yelizariev, jev, lejeune quentin, Nasreddin Boulif (bon), Touati Djamel (otd), nie, Tiffany Chang (tic), IEL, Ivàn Todorovich, fja-odoo, Mathieu Duckerts-Antoine, Pierre Paridans, Julien CHEVREAU (JCU), Aurélien (avd), Arnaud Joset, Jérôme Vanhaudenard, root, Romain Estievenart, Kevin Baptiste, Guillaume (guva), Raf Geens, roen-odoo, Stanislas Sobieski, Hubert Van de Walle (huvw), Robin Heinz, Miquel Raïch, pedrambiria, Ahmad Khanalizadeh, Jerome (jev), Jacky (trj), Laurent Desausoi (lade), Edoardo (pied), Sylvain Francis, momegahed, Jigar Vaghela, Nicolas (vin), william-andre, Víctor Martínez, Florian Damhaut, Merlin (megu), MerlinGuillaume, PNO, yhu-odoo, Audric Onockx (auon), anhe-odoo, Walid HANNICHE (waha), Thomas Beckers, Aurelien van Delft (avd), Michael Mattiello (mcm), Federico (fega), dht-odoo, rhe-odoo, Pierrot (prro), niyasraphy, hparfr, Habib (ayh), Loan (LSE), Francois (fge), Thomas Lefebvre (thle), Archana Vaghasiya, alsh-odoo, Matheus Leal Viana (malv), Eleftherios Kritsotakis, Gaetan Vanden Bergh (gavb), François Honoré, Merel Geens (mege), Andro Gvivradze, Pedram (PEBR), Louis Wicket (wil), tsm-odoo, Walid, Mylyna Hy, Laurent Desausoi, nda, Victor Piryns (pivi), Simon Genin (ges), arsi, Sanket Brahmbhatt, CarmenMiranda, Daniel Duque, AH-Yussef, Leonardo Pavan Rocha, Sarah Bellefroid, “moda”, Louis Travaux, Dawn Hwang, Javier Vega, Theo VINCENT (thvi), Corentin Thaon, Luis Manuel [Vauxoo], ayo-odoo, Pedram (pebr), Cameron, adda-odoo, Arnaud Sibille, Olivier Monnom (mool), Mahdi Cheikh Rouhou (macr), Adrien Guilliams (adgu), TheAlekLuna, ilru-odoo, Corentin Thaon (thco)
WEBSITE
WEBSITEhttps://www.odoo.com/app/point-of-sale-shop
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:26
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (61)
XML IDNameModelTypeStatus
account_cashbox_line_view_tree account.cashbox.line.tree account.cashbox.line tree New
digest_digest_view_form digest.digest.view.form.inherit.sale.order digest.digest xpath Inherits digest.digest_digest_view_form
point_of_sale.assets_common POS Assets Common ir.ui.view qweb New
point_of_sale.index POS Index ir.ui.view qweb New
point_of_sale.qunit_suite point_of_sale.qunit_suite ir.ui.view qweb New
point_of_sale.qunit_suite_assets point_of_sale.qunit_suite_assets ir.ui.view qweb New
point_of_sale.report_invoice_document point_of_sale.report_invoice_document ir.ui.view qweb Inherits account.report_invoice_document
pos_config_view_form pos.config.form.view pos.config form New
pos_payment_method_view_form pos.payment.method.form pos.payment.method form New
pos_payment_method_view_search pos.payment.search.view pos.payment.method search New
pos_payment_method_view_tree pos.payment.method.tree pos.payment.method tree New
pos_rounding_form_view_inherited pos.cash.rounding.form.inherited account.cash.rounding xpath Inherits account.rounding_form_view
product_pos_category_form_view pos.category.form pos.category form New
product_pos_category_tree_view pos.category.tree pos.category tree New
product_product_tree_view product.product.product.tree.inherit product.product field Inherits product.product_product_tree_view
product_template_form_view product.template.form.inherit product.template xpath Inherits product.product_template_form_view
product_template_only_form_view product.template.only.form.inherit product.template xpath Inherits product.product_template_only_form_view
product_template_search_view_pos product.template.search.pos.form product.template filter Inherits product.product_template_search_view
product_template_tree_view product.template.product.tree.inherit product.template field Inherits product.product_template_tree_view
product_uom_categ_form_view uom.category.form.inherit uom.category xpath Inherits uom.product_uom_categ_form_view
product_uom_categ_tree_view uom.category.tree.inherit uom.category xpath Inherits uom.product_uom_categ_tree_view
report_pos_order_view_tree report.pos.order.view.tree report.pos.order tree New
report_saledetails report_saledetails ir.ui.view qweb New
report_userlabel report_userlabel ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.point_of_sale res.config.settings xpath Inherits base.res_config_settings_view_form
stock.product_template_kanban_stock_view New
stock.view_stock_product_template_tree New
stock.view_stock_product_tree New
view_account_journal_pos_user_form account.journal.pos.user.form.inherit account.journal xpath Inherits account.view_account_journal_form
view_bank_statement_pos_session view.bank.statement.pos.session account.bank.statement xpath Inherits account.view_bank_statement_form
view_form_pos_close_session_wizard pos.close.session.wizard.form pos.close.session.wizard form New
view_partner_pos_kanban res.partner.pos.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
view_partner_property_form res.partner.pos.form.inherit res.partner div Inherits base.view_partner_form
view_pos_bill_form pos.bill.form pos.bill form New
view_pos_bill_tree pos.bill.tree pos.bill tree New
view_pos_category_kanban pos.category.kanban pos.category kanban New
view_pos_config_kanban pos.config.kanban.view pos.config kanban New
view_pos_config_search pos.config.search.view pos.config search New
view_pos_config_tree pos.config.tree.view pos.config tree New
view_pos_details_wizard pos.details.wizard.form pos.details.wizard form New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_kanban pos.order.kanban pos.order kanban New
view_pos_order_line pos.order.line.tree pos.order.line tree New
view_pos_order_line_form pos.order.line.form pos.order.line form New
view_pos_order_pivot pos.order.pivot pos.order pivot New
view_pos_order_search pos.order.search.view pos.order search New
view_pos_order_tree pos.order.tree pos.order tree New
view_pos_order_tree_all_sales_lines pos.order.line.all.sales.tree pos.order.line tree New
view_pos_order_tree_no_session_id pos.order.tree_no_session_id pos.order xpath Inherits point_of_sale.view_pos_order_tree
view_pos_payment pos.make.payment.form pos.make.payment form New
view_pos_payment_form pos.payment.form pos.payment form New
view_pos_payment_search pos.payment.search.view pos.payment search New
view_pos_payment_tree pos.payment.tree pos.payment tree New
view_pos_pos_form pos.order.form pos.order form New
view_pos_session_form pos.session.form.view pos.session form New
view_pos_session_kanban pos.session.kanban pos.session kanban New
view_pos_session_search pos.session.search.view pos.session search New
view_pos_session_tree pos.session.tree.view pos.session tree New
view_report_pos_order_graph report.pos.order.graph report.pos.order graph New
view_report_pos_order_pivot report.pos.order.pivot report.pos.order pivot New
view_report_pos_order_search report.pos.order.search report.pos.order search New
Models touched (39)

New fields (2)
  • account_id Many2one → account.account
    readonly=True related='journal_id.default_account_id' args: 'account.account'
  • pos_session_id Many2one → pos.session
    copy=False string='Session' args: 'pos.session'
Public methods (1)
  • button_validate_or_action(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_payment_method_ids One2many → pos.payment.method
    string='Point of Sale Payment Methods' args: 'pos.payment.method', 'journal_id'
Public methods (0)

No public methods.

New fields (2)
  • pos_order_ids One2many → pos.order
    args: 'pos.order', 'account_move'
  • pos_payment_ids One2many → pos.payment
    args: 'pos.payment', 'account_move_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (3)
  • force_outstanding_account_id Many2one → account.account
    check_company=True args: 'account.account', 'Forced Outstanding Account'
  • pos_payment_method_id Many2one → pos.payment.method
    args: 'pos.payment.method', 'POS Payment Method'
  • pos_session_id Many2one → pos.session
    args: 'pos.session', 'POS Session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • get_real_tax_amount(self)
  • write(self, vals)

New fields (1)
  • type Selection
    ondelete={'weight': 'set default', 'price': 'set default', 'discount': 'set default', 'client': 'set default', 'cashier': 'set default'} selection_add=[('weight', 'Weighted Product'), ('price', 'Priced Product'), ('discount', 'Discounted Product'), ('client', 'Client'), ('cashier', 'Cashier')]
Public methods (0)

No public methods.

New fields (2)
  • kpi_pos_total Boolean
    args: 'POS Sales'
  • kpi_pos_total_value Monetary
    compute='_compute_kpi_pos_total_value'
Public methods (0)

No public methods.

New fields (3)
  • name Char
    args: 'Name'
  • pos_config_ids Many2many → pos.config
    args: 'pos.config'
  • value Float
    digits=(16, 4) required=True args: 'Coin/Bill Value'
Public methods (1)
  • name_create(self, name)
    @api.model

New fields (5)
  • child_id One2many → pos.category
    string='Children Categories' args: 'pos.category', 'parent_id'
  • image_128 Image
    max_height=128 max_width=128 args: 'Image'
  • name Char
    required=True string='Category Name' translate=True
  • parent_id Many2one → pos.category
    index=True string='Parent Category' args: 'pos.category'
  • sequence Integer
    help='Gives the sequence order when displaying a list of product categories.'
Public methods (1)
  • name_get(self)

New fields (4)
  • account_id Many2one → account.account
    args: 'account.account', 'Destination account'
  • account_readonly Boolean
    args: 'Destination account is readonly'
  • amount_to_balance Float
    args: 'Amount to balance'
  • message Text
    args: 'Information message'
Public methods (1)
  • close_session(self)

New fields (87)
  • active Boolean
    default=True
  • allowed_pricelist_ids Many2many → product.pricelist
    compute='_compute_allowed_pricelist_ids' help='This is a technical field used for the domain of pricelist_id.' string='Allowed Pricelists' args: 'product.pricelist'
  • amount_authorized_diff Float
    help='This field depicts the maximum difference allowed between the ending balance and the theoretical cash when closing a session, for non-POS managers. If this maximum is reached, the user will have an error message at the closing of his session saying that he needs to contact his manager.' args: 'Amount Authorized Difference'
  • available_pricelist_ids Many2many → product.pricelist
    default=_default_pricelist help='Make several pricelists available in the Point of Sale. You can also apply a pricelist to specific customers from their contact form (in Sales tab). To be valid, this pricelist must be listed here as an available pricelist. Otherwise the default pricelist will apply.' string='Available Pricelists' args: 'product.pricelist'
  • barcode_nomenclature_id Many2one → barcode.nomenclature
    default=<expr> help='Defines what kind of barcodes are available and how they are assigned to products, customers and cashiers.' required=True string='Barcode Nomenclature' args: 'barcode.nomenclature'
  • cash_control Boolean
    compute='_compute_cash_control' help='Check the amount of the cashbox at opening and closing.' string='Advanced Cash Control'
  • cash_rounding Boolean
    string='Cash Rounding'
  • company_has_template Boolean
    compute='_compute_company_has_template' string='Company has chart of accounts'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    compute='_compute_currency' string='Currency' args: 'res.currency'
  • current_session_id Many2one → pos.session
    compute='_compute_current_session' string='Current Session' args: 'pos.session'
  • current_session_state Char
    compute='_compute_current_session'
  • current_user_id Many2one → res.users
    compute='_compute_current_session_user' string='Current Session Responsible' args: 'res.users'
  • default_bill_ids Many2many → pos.bill
    string='Coins/Bills' args: 'pos.bill'
  • default_fiscal_position_id Many2one → account.fiscal.position
    string='Default Fiscal Position' args: 'account.fiscal.position'
  • fiscal_position_ids Many2many → account.fiscal.position
    help='This is useful for restaurants with onsite and take-away services that imply specific tax rates.' string='Fiscal Positions' args: 'account.fiscal.position'
  • group_pos_manager_id Many2one → res.groups
    default=_get_group_pos_manager help='This field is there to pass the id of the pos manager group to the point of sale client.' string='Point of Sale Manager Group' args: 'res.groups'
  • group_pos_user_id Many2one → res.groups
    default=_get_group_pos_user help='This field is there to pass the id of the pos user group to the point of sale client.' string='Point of Sale User Group' args: 'res.groups'
  • has_active_session Boolean
    compute='_compute_current_session'
  • iface_available_categ_ids Many2many → pos.category
    help='The point of sale will only display products which are within one of the selected category trees. If no category is specified, all available products will be shown' string='Available PoS Product Categories' args: 'pos.category'
  • iface_big_scrollbars Boolean
    help='For imprecise industrial touchscreens.' args: 'Large Scrollbars'
  • iface_cashdrawer Boolean
    help='Automatically open the cashdrawer.' string='Cashdrawer'
  • iface_customer_facing_display Boolean
    compute='_compute_customer_facing_display'
  • iface_customer_facing_display_local Boolean
    help='Show customers checkout in a pop-up window. Recommend to be moved to a second screen visible to the client.' string='Local Customer Facing Display'
  • iface_customer_facing_display_via_proxy Boolean
    help='Show checkout to customers with a remotely-connected screen.' string='Customer Facing Display'
  • iface_display_categ_images Boolean
    help='The product categories will be displayed with pictures.' string='Display Category Pictures'
  • iface_electronic_scale Boolean
    help='Enables Electronic Scale integration.' string='Electronic Scale'
  • iface_orderline_customer_notes Boolean
    help='Allow to write notes for customer on Orderlines. This will be shown in the receipt.' string='Customer Notes'
  • iface_print_auto Boolean
    default=False help='The receipt will automatically be printed at the end of each order.' string='Automatic Receipt Printing'
  • iface_print_skip_screen Boolean
    default=True help='The receipt screen will be skipped if the receipt can be printed automatically.' string='Skip Preview Screen'
  • iface_print_via_proxy Boolean
    help='Bypass browser printing and prints via the hardware proxy.' string='Print via Proxy'
  • iface_scan_via_proxy Boolean
    help='Enable barcode scanning with a remotely connected barcode scanner and card swiping with a Vantiv card reader.' string='Scan via Proxy'
  • iface_start_categ_id Many2one → pos.category
    help='The point of sale will display this product category by default. If no category is specified, all available products will be shown.' string='Initial Category' args: 'pos.category'
  • iface_tax_included Selection
    default='subtotal' required=True string='Tax Display' args: [('subtotal', 'Tax-Excluded Price'), ('total', 'Tax-Included Price')]
  • iface_tipproduct Boolean
    string='Product tips'
  • invoice_journal_id Many2one → account.journal
    default=_default_invoice_journal domain=[('type', '=', 'sale')] help='Accounting journal used to create invoices.' string='Invoice Journal' args: 'account.journal'
  • is_header_or_footer Boolean
    args: 'Header & Footer'
  • is_installed_account_accountant Boolean
    compute='_compute_is_installed_account_accountant' string='Is the Full Accounting Installed'
  • is_posbox Boolean
    args: 'PosBox'
  • journal_id Many2one → account.journal
    default=_default_sale_journal domain=[('type', 'in', ('general', 'sale'))] help='Accounting journal used to post POS session journal entries and POS invoice payments.' ondelete='restrict' string='Point of Sale Journal' args: 'account.journal'
  • last_session_closing_cash Float
    compute='_compute_last_session'
  • last_session_closing_date Date
    compute='_compute_last_session'
  • limit_categories Boolean
    args: 'Restrict Product Categories'
  • limited_partners_amount Integer
    default=10000
  • limited_partners_loading Boolean
    help="By default, 10000 partners are loaded.\nWhen the session is open, we keep on loading all remaining partners in the background.\nIn the meantime, you can use the 'Load Customers' button to load partners from database." args: 'Limited Partners Loading'
  • limited_products_amount Integer
    default=20000
  • limited_products_loading Boolean
    help="we load all starred products (favorite), all services, recent inventory movements of products, and the most recently updated products.\nWhen the session is open, we keep on loading all remaining products in the background.\nIn the meantime, you can click on the 'database icon' in the searchbar to load products from database." args: 'Limited Product Loading'
  • manual_discount Boolean
    default=True string='Manual Discounts'
  • module_account Boolean
    default=True help='Enables invoice generation from the Point of Sale.' string='Invoicing'
  • module_pos_discount Boolean
    args: 'Global Discounts'
  • module_pos_hr Boolean
    help='Show employee login screen'
  • module_pos_loyalty Boolean
    args: 'Loyalty Program'
  • module_pos_mercury Boolean
    string='Integrated Card Payments'
  • module_pos_restaurant Boolean
    args: 'Is a Bar/Restaurant'
  • name Char
    help='An internal identification of the point of sale.' index=True required=True string='Point of Sale'
  • number_of_opened_session Integer
    compute='_compute_current_session' string='Number of Opened Session'
  • only_round_cash_method Boolean
    string='Only apply rounding on cash'
  • other_devices Boolean
    help='Connect devices to your PoS without an IoT Box.' string='Other Devices'
  • partner_load_background Boolean
  • payment_method_ids Many2many → pos.payment.method
    default=<expr> string='Payment Methods' args: 'pos.payment.method'
  • picking_policy Selection
    default='direct' help='If you deliver all products at once, the delivery order will be scheduled based on the greatest product lead time. Otherwise, it will be based on the shortest.' required=True string='Shipping Policy' args: [('direct', 'As soon as possible'), ('one', 'When all products are ready')]
  • picking_type_id Many2one → stock.picking.type
    default=_default_picking_type_id domain="[('code', '=', 'outgoing'), ('warehouse_id.company_id', '=', company_id)]" ondelete='restrict' required=True string='Operation Type' args: 'stock.picking.type'
  • pos_session_duration Char
    compute='_compute_current_session_user'
  • pos_session_state Char
    compute='_compute_current_session_user'
  • pos_session_username Char
    compute='_compute_current_session_user'
  • pricelist_id Many2one → product.pricelist
    default=_default_pricelist help='The pricelist used if no customer is selected or if the customer has no Sale Pricelist configured.' required=True string='Default Pricelist' args: 'product.pricelist'
  • product_configurator Boolean
    string='Product Configurator'
  • product_load_background Boolean
  • proxy_ip Char
    help='The hostname or ip address of the hardware proxy, Will be autodetected if left empty.' size=45 string='IP Address'
  • receipt_footer Text
    help='A short text that will be inserted as a footer in the printed receipt.' string='Receipt Footer'
  • receipt_header Text
    help='A short text that will be inserted as a header in the printed receipt.' string='Receipt Header'
  • restrict_price_control Boolean
    help='Only users with Manager access rights for PoS app can modify the product prices on orders.' string='Restrict Price Modifications to Managers'
  • rounding_method Many2one → account.cash.rounding
    string='Cash rounding' args: 'account.cash.rounding'
  • route_id Many2one → stock.location.route
    string='Spefic route for products delivered later.' args: 'stock.location.route'
  • selectable_categ_ids Many2many → pos.category
    compute='_compute_selectable_categories' args: 'pos.category'
  • sequence_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders.' ondelete='restrict' readonly=True string='Order IDs Sequence' args: 'ir.sequence'
  • sequence_line_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders lines.' readonly=True string='Order Line IDs Sequence' args: 'ir.sequence'
  • session_ids One2many → pos.session
    string='Sessions' args: 'pos.session', 'config_id'
  • set_maximum_difference Boolean
    help='Set a maximum difference allowed between the expected and counted money during the closing of the session.' args: 'Set Maximum Difference'
  • ship_later Boolean
    string='Ship Later'
  • start_category Boolean
    default=False args: 'Start Category'
  • tax_regime Boolean
    args: 'Tax Regime'
  • tax_regime_selection Boolean
    args: 'Tax Regime Selection value'
  • tip_product_id Many2one → product.product
    help='This product is used as reference on customer receipts.' string='Tip Product' args: 'product.product'
  • use_pricelist Boolean
    args: 'Use a pricelist.'
  • uuid Char
    copy=False default=<expr> help='A globally unique identifier for this pos configuration, used to prevent conflicts in client-generated data.' readonly=True
  • warehouse_id Many2one → stock.warehouse
    default=_default_warehouse_id ondelete='restrict' args: 'stock.warehouse'
Public methods (16)
  • assign_payment_journals(self, company)
  • create(self, values)
    @api.model
  • execute(self)
  • generate_pos_journal(self, company)
  • get_limited_partners_loading(self)
  • get_limited_products_loading(self, fields)
  • name_get(self)
  • open_existing_session_cb(self)
    close session button access session form to validate entries
  • open_opened_session_list(self)
  • open_session_cb(self, check_coa=True)
    new session button create one if none exist access cash control interface if enabled or start a session
  • open_ui(self)
    Open the pos interface with config_id as an extra argument. In vanilla PoS each user can only have one active session, therefore it was not needed to pass the config_id on opening a session. It is also possible to login to sessions created by other users. :returns: dict
  • post_install_pos_localisation(self, companies=False)
    @api.model
  • setup_defaults(self, company)
    Extend this method to customize the existing pos.config of the company during the installation of a localisation. :param self pos.config: pos.config records present in the company during the installation of localisation. :param company res.company: the single company where the pos.config defaults will be setup.
  • setup_invoice_journal(self, company)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • end_date Datetime
    default=fields.Datetime.now required=True
  • pos_config_ids Many2many → pos.config
    default=<expr> args: 'pos.config', 'pos_detail_configs'
  • start_date Datetime
    default=_default_start_date required=True
Public methods (1)
  • generate_report(self)

New fields (5)
  • amount Float
    default=_default_amount digits=0 required=True
  • config_id Many2one → pos.config
    default=_default_config required=True string='Point of Sale Configuration' args: 'pos.config'
  • payment_date Datetime
    default=<expr> required=True string='Payment Date'
  • payment_method_id Many2one → pos.payment.method
    default=_default_payment_method required=True string='Payment Method' args: 'pos.payment.method'
  • payment_name Char
    string='Payment Reference'
Public methods (2)
  • check(self)
    Check the order: if the order is not paid: continue payment, if the order is paid print ticket.
  • launch_payment(self)

New fields (0)

No new fields.

Public methods (1)
  • open_statement(self)

New fields (44)
  • account_move Many2one → account.move
    copy=False index=True readonly=True string='Invoice' args: 'account.move'
  • amount_paid Float
    digits=0 readonly=True required=True states={'draft': [('readonly', False)]} string='Paid'
  • amount_return Float
    digits=0 readonly=True required=True string='Returned'
  • amount_tax Float
    digits=0 readonly=True required=True string='Taxes'
  • amount_total Float
    digits=0 readonly=True required=True string='Total'
  • company_id Many2one → res.company
    index=True readonly=True required=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=False related='session_id.config_id' string='Point of Sale' args: 'pos.config'
  • currency_id Many2one → res.currency
    related='config_id.currency_id' string='Currency' args: 'res.currency'
  • currency_rate Float
    compute='_compute_currency_rate' compute_sudo=True digits=0 help='The rate of the currency to the currency of rate applicable at the date of the order' readonly=True store=True args: 'Currency Rate'
  • date_order Datetime
    default=fields.Datetime.now index=True readonly=True string='Date'
  • failed_pickings Boolean
    compute='_compute_picking_count'
  • fiscal_position_id Many2one → account.fiscal.position
    comodel_name='account.fiscal.position' readonly=True states={'draft': [('readonly', False)]} string='Fiscal Position'
  • has_refundable_lines Boolean
    compute='_compute_has_refundable_lines' args: 'Has Refundable Lines'
  • invoice_group Boolean
    readonly=False related='config_id.module_account'
  • is_invoiced Boolean
    compute='_compute_is_invoiced' args: 'Is Invoiced'
  • is_refunded Boolean
    compute='_compute_refund_related_fields'
  • is_tipped Boolean
    readonly=True args: 'Is this already tipped?'
  • is_total_cost_computed Boolean
    compute='_compute_is_total_cost_computed' help='Allows to know if all the total cost of the order lines have already been computed'
  • lines One2many → pos.order.line
    copy=True readonly=True states={'draft': [('readonly', False)]} string='Order Lines' args: 'pos.order.line', 'order_id'
  • margin Monetary
    compute='_compute_margin' string='Margin'
  • margin_percent Float
    compute='_compute_margin' digits=(12, 4) string='Margin (%)'
  • name Char
    copy=False default='/' readonly=True required=True string='Order Ref'
  • nb_print Integer
    copy=False default=0 readonly=True string='Number of Print'
  • note Text
    string='Internal Notes'
  • partner_id Many2one → res.partner
    change_default=True index=True states={'draft': [('readonly', False)], 'paid': [('readonly', False)]} string='Customer' args: 'res.partner'
  • payment_ids One2many → pos.payment
    readonly=True string='Payments' args: 'pos.payment', 'pos_order_id'
  • picking_count Integer
    compute='_compute_picking_count'
  • picking_ids One2many → stock.picking
    args: 'stock.picking', 'pos_order_id'
  • picking_type_id Many2one → stock.picking.type
    readonly=False related='session_id.config_id.picking_type_id' string='Operation Type' args: 'stock.picking.type'
  • pos_reference Char
    copy=False index=True readonly=True string='Receipt Number'
  • pricelist_id Many2one → product.pricelist
    readonly=True required=True states={'draft': [('readonly', False)]} string='Pricelist' args: 'product.pricelist'
  • procurement_group_id Many2one → procurement.group
    copy=False args: 'procurement.group', 'Procurement Group'
  • refund_orders_count Integer
    compute='_compute_refund_related_fields' args: 'Number of Refund Orders'
  • refunded_order_ids Many2many → pos.order
    compute='_compute_refund_related_fields' args: 'pos.order'
  • refunded_orders_count Integer
    compute='_compute_refund_related_fields'
  • sale_journal Many2one → account.journal
    ondelete='restrict' readonly=True related='session_id.config_id.journal_id' store=True string='Sales Journal' args: 'account.journal'
  • sequence_number Integer
    default=1 help='A session-unique sequence number for the order' string='Sequence Number'
  • session_id Many2one → pos.session
    domain="[('state', '=', 'opened')]" index=True readonly=True required=True states={'draft': [('readonly', False)]} string='Session' args: 'pos.session'
  • session_move_id Many2one → account.move
    copy=False readonly=True related='session_id.move_id' string='Session Journal Entry' args: 'account.move'
  • state Selection
    copy=False default='draft' index=True readonly=True args: [('draft', 'New'), ('cancel', 'Cancelled'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced')], 'Status'
  • tip_amount Float
    digits=0 readonly=True string='Tip Amount'
  • to_invoice Boolean
    copy=False args: 'To invoice'
  • to_ship Boolean
    args: 'To ship'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> help='Person who uses the cash register. It can be a reliever, a student or an interim employee.' states={'done': [('readonly', True)], 'invoiced': [('readonly', True)]} string='Responsible'
Public methods (16)
  • action_pos_order_cancel(self)
  • action_pos_order_invoice(self)
  • action_pos_order_paid(self)
  • action_receipt_to_customer(self, name, client, ticket)
  • action_stock_picking(self)
  • action_view_invoice(self)
  • action_view_refund_orders(self)
  • action_view_refunded_orders(self)
  • add_payment(self, data)
    Create a new payment for the order
  • create(self, values)
    @api.model
  • create_from_ui(self, orders, draft=False)
    @api.model
    Create and update Orders from the frontend PoS application. Create new orders and update orders that are in draft status. If an order already exists with a status diferent from 'draft'it will be discareded, otherwise it will be saved to the database. If saved with 'draft' status the order can be overwritten later by this function. :param orders: dictionary with the orders to be created. :type orders: dict. :param draft: Indicate if the orders are ment to be finalised or temporarily saved. :type draft: bool. :Returns: list -- list of db-ids for the created and updated orders.
  • export_for_ui(self)
    Returns a list of dict with each item having similar signature as the return of `export_as_JSON` of models.Order. This is useful for back-and-forth communication between the pos frontend and backend.
  • refund(self)
    Create a copy of order for refund order
  • remove_from_ui(self, server_ids)
    @api.model
    Remove orders from the frontend PoS application Remove orders from the server by id. :param server_ids: list of the id's of orders to remove from the server. :type server_ids: list. :returns: list -- list of db-ids for the removed orders.
  • search_paid_order_ids(self, config_id, domain, limit, offset)
    @api.model
    Search for 'paid' orders that satisfy the given domain, limit and offset.
  • write(self, vals)

New fields (24)
  • company_id Many2one → res.company
    related='order_id.company_id' store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='order_id.currency_id' args: 'res.currency'
  • customer_note Char
    help='This is a note destined to the customer' args: 'Customer Note'
  • discount Float
    default=0.0 digits=0 string='Discount (%)'
  • full_product_name Char
    args: 'Full Product Name'
  • is_total_cost_computed Boolean
    help='Allows to know if the total cost has already been computed or not'
  • margin Monetary
    compute='_compute_margin' string='Margin'
  • margin_percent Float
    compute='_compute_margin' digits=(12, 4) string='Margin (%)'
  • name Char
    copy=False required=True string='Line No'
  • notice Char
    string='Discount Notice'
  • order_id Many2one → pos.order
    index=True ondelete='cascade' required=True string='Order Ref' args: 'pos.order'
  • pack_lot_ids One2many → pos.pack.operation.lot
    string='Lot/serial Number' args: 'pos.pack.operation.lot', 'pos_order_line_id'
  • price_subtotal Float
    digits=0 readonly=True required=True string='Subtotal w/o Tax'
  • price_subtotal_incl Float
    digits=0 readonly=True required=True string='Subtotal'
  • price_unit Float
    digits=0 string='Unit Price'
  • product_id Many2one → product.product
    change_default=True domain=[('sale_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Product UoM' args: 'uom.uom'
  • qty Float
    default=1 digits='Product Unit of Measure' args: 'Quantity'
  • refund_orderline_ids One2many → pos.order.line
    help='Orderlines in this field are the lines that refunded this orderline.' args: 'pos.order.line', 'refunded_orderline_id', 'Refund Order Lines'
  • refunded_orderline_id Many2one → pos.order.line
    help='If this orderline is a refund, then the refunded orderline is specified in this field.' args: 'pos.order.line', 'Refunded Order Line'
  • refunded_qty Float
    compute='_compute_refund_qty' help='Number of items refunded in this orderline.' args: 'Refunded Quantity'
  • tax_ids Many2many → account.tax
    readonly=True string='Taxes' args: 'account.tax'
  • tax_ids_after_fiscal_position Many2many → account.tax
    compute='_get_tax_ids_after_fiscal_position' string='Taxes to Apply' args: 'account.tax'
  • total_cost Float
    digits='Product Price' readonly=True string='Total cost'
Public methods (3)
  • create(self, values)
    @api.model
  • export_for_ui(self)
  • write(self, values)

New fields (4)
  • lot_name Char
    args: 'Lot Name'
  • order_id Many2one → pos.order
    readonly=False related='pos_order_line_id.order_id' args: 'pos.order'
  • pos_order_line_id Many2one → pos.order.line
    args: 'pos.order.line'
  • product_id Many2one → product.product
    readonly=False related='pos_order_line_id.product_id' args: 'product.product'
Public methods (1)
  • export_for_ui(self)

New fields (17)
  • account_move_id Many2one → account.move
    args: 'account.move'
  • amount Monetary
    currency_field='currency_id' help='Total amount of the payment.' readonly=True required=True string='Amount'
  • card_type Char
    args: 'Type of card used'
  • cardholder_name Char
    args: 'Cardholder Name'
  • company_id Many2one → res.company
    related='pos_order_id.company_id' store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='pos_order_id.currency_id' string='Currency' args: 'res.currency'
  • currency_rate Float
    help='Conversion rate from company currency to order currency.' related='pos_order_id.currency_rate' string='Conversion Rate'
  • is_change Boolean
    default=False string='Is this payment change?'
  • name Char
    readonly=True string='Label'
  • partner_id Many2one → res.partner
    related='pos_order_id.partner_id' string='Customer' args: 'res.partner'
  • payment_date Datetime
    default=<expr> readonly=True required=True string='Date'
  • payment_method_id Many2one → pos.payment.method
    required=True string='Payment Method' args: 'pos.payment.method'
  • payment_status Char
    args: 'Payment Status'
  • pos_order_id Many2one → pos.order
    index=True required=True string='Order' args: 'pos.order'
  • session_id Many2one → pos.session
    index=True related='pos_order_id.session_id' store=True string='Session' args: 'pos.session'
  • ticket Char
    args: 'Payment Receipt Info'
  • transaction_id Char
    args: 'Payment Transaction ID'
Public methods (2)
  • export_for_ui(self)
  • name_get(self)

New fields (13)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • config_ids Many2many → pos.config
    string='Point of Sale Configurations' args: 'pos.config'
  • hide_use_payment_terminal Boolean
    compute='_compute_hide_use_payment_terminal' help='Technical field which is used to hide use_payment_terminal when no payment interfaces are installed.'
  • is_cash_count Boolean
    compute='_compute_is_cash_count' store=True string='Cash'
  • journal_id Many2one → account.journal
    check_company=True domain="[('type', 'in', ('cash', 'bank')), ('company_id', '=', company_id)]" help='Leave empty to use the receivable account of customer.\nDefines the journal where to book the accumulated payments (or individual payment if Identify Customer is true) after closing the session.\nFor cash journal, we directly write to the default account in the journal via statement lines.\nFor bank journal, we write to the outstanding account specified in this payment method.\nOnly cash and bank journals are allowed.' ondelete='restrict' string='Journal' args: 'account.journal'
  • name Char
    help='Defines the name of the payment method that will be displayed in the Point of Sale when the payments are selected.' required=True string='Method' translate=True
  • open_session_ids Many2many → pos.session
    compute='_compute_open_session_ids' help='Open PoS sessions that are using this payment method.' string='Pos Sessions' args: 'pos.session'
  • outstanding_account_id Many2one → account.account
    check_company=True help='Leave empty to use the default account from the company setting.\nAccount used as outstanding account when creating accounting payment records for bank payments.' ondelete='restrict' string='Outstanding Account' args: 'account.account'
  • receivable_account_id Many2one → account.account
    check_company=True domain="[('reconcile', '=', True), ('user_type_id.type', '=', 'receivable'), ('company_id', '=', company_id)]" help="Leave empty to use the default account from the company setting.\nOverrides the company's receivable account (for Point of Sale) used in the journal entries." ondelete='restrict' string='Intermediary Account' args: 'account.account'
  • split_transactions Boolean
    default=False help='Forces to set a customer when using this payment method and splits the journal entries for each customer. It could slow down the closing process.' string='Identify Customer'
  • type Selection
    compute='_compute_type' selection=[('cash', 'Cash'), ('bank', 'Bank'), ('pay_later', 'Customer Account')]
  • use_payment_terminal Selection
    help='Record payments with a terminal on this journal.' selection=<expr> string='Use a Payment Terminal'
Public methods (1)
  • write(self, vals)

New fields (35)
  • bank_payment_ids One2many → account.payment
    help='Account payments representing aggregated and bank split payments.' args: 'account.payment', 'pos_session_id', 'Bank Payments'
  • cash_control Boolean
    compute='_compute_cash_all' compute_sudo=True string='Has Cash Control'
  • cash_journal_id Many2one → account.journal
    compute='_compute_cash_all' store=True string='Cash Journal' args: 'account.journal'
  • cash_real_difference Monetary
    readonly=True string='Difference'
  • cash_real_expected Monetary
    readonly=True string='Expected'
  • cash_real_transaction Monetary
    readonly=True string='Transaction'
  • cash_register_balance_end Monetary
    compute='_compute_cash_balance' help='Sum of opening balance and transactions.' readonly=True string='Theoretical Closing Balance'
  • cash_register_balance_end_real Monetary
    help='Total of closing cash control lines.' readonly=True related='cash_register_id.balance_end_real' string='Ending Balance'
  • cash_register_balance_start Monetary
    help='Total of opening cash control lines.' readonly=True related='cash_register_id.balance_start' string='Starting Balance'
  • cash_register_difference Monetary
    compute='_compute_cash_balance' help='Difference between the theoretical closing balance and the real closing balance.' readonly=True string='Before Closing Difference'
  • cash_register_id Many2one → account.bank.statement
    compute='_compute_cash_all' store=True string='Cash Register' args: 'account.bank.statement'
  • cash_register_total_entry_encoding Monetary
    compute='_compute_cash_balance' help='Total of all paid sales orders' readonly=True string='Total Cash Transaction'
  • company_id Many2one → res.company
    readonly=True related='config_id.company_id' string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    help='The physical point of sale you will use.' index=True required=True string='Point of Sale' args: 'pos.config'
  • currency_id Many2one → res.currency
    readonly=False related='config_id.currency_id' string='Currency' args: 'res.currency'
  • failed_pickings Boolean
    compute='_compute_picking_count'
  • is_in_company_currency Boolean
    compute='_compute_is_in_company_currency' args: 'Is Using Company Currency'
  • login_number Integer
    default=0 help='A sequence number that is incremented each time a user resumes the pos session' string='Login Sequence Number'
  • move_id Many2one → account.move
    index=True string='Journal Entry' args: 'account.move'
  • name Char
    default='/' readonly=True required=True string='Session ID'
  • opening_notes Text
    string='Opening Notes'
  • order_count Integer
    compute='_compute_order_count'
  • order_ids One2many → pos.order
    string='Orders' args: 'pos.order', 'session_id'
  • payment_method_ids Many2many → pos.payment.method
    related='config_id.payment_method_ids' string='Payment Methods' args: 'pos.payment.method'
  • picking_count Integer
    compute='_compute_picking_count'
  • picking_ids One2many → stock.picking
    args: 'stock.picking', 'pos_session_id'
  • rescue Boolean
    copy=False help='Auto-generated session for orphan orders, ignored in constraints' readonly=True string='Recovery Session'
  • sequence_number Integer
    default=1 help='A sequence number that is incremented with each order' string='Order Sequence Number'
  • start_at Datetime
    readonly=True string='Opening Date'
  • state Selection
    copy=False default='opening_control' index=True readonly=True required=True string='Status' args: POS_SESSION_STATE
  • statement_ids One2many → account.bank.statement
    readonly=True string='Cash Statements' args: 'account.bank.statement', 'pos_session_id'
  • stop_at Datetime
    copy=False readonly=True string='Closing Date'
  • total_payments_amount Float
    compute='_compute_total_payments_amount' string='Total Payments Amount'
  • update_stock_at_closing Boolean
    args: 'Stock should be updated at closing'
  • user_id Many2one → res.users
    default=<expr> index=True ondelete='restrict' readonly=True required=True states={'opening_control': [('readonly', False)]} string='Opened By' args: 'res.users'
Public methods (19)
  • action_pos_session_close(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_pos_session_closing_control(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_pos_session_open(self)
  • action_pos_session_validate(self, balancing_account=False, amount_to_balance=0, bank_payment_method_diffs=None)
  • action_show_payments_list(self)
  • action_stock_picking(self)
  • action_view_order(self)
  • close_session_from_ui(self, bank_payment_method_diff_pairs=None)
    Calling this method will try to close the session. param bank_payment_method_diff_pairs: list[(int, float)] Pairs of payment_method_id and diff_amount which will be used to post loss/profit when closing the session. If successful, it returns {'successful': True} Otherwise, it returns {'successful': False, 'message': str, 'redirect': bool}. 'redirect' is a boolean used to know whether we redirect the user to the back end or not. When necessary, error (i.e. UserError, AccessError) is raised which should redirect the user to the back end.
  • create(self, values)
    @api.model
  • get_closing_control_data(self)
  • login(self)
  • open_frontend_cb(self)
    Open the pos interface with config_id as an extra argument. In vanilla PoS each user can only have one active session, therefore it was not needed to pass the config_id on opening a session. It is also possible to login to sessions created by other users. :returns: dict
  • post_closing_cash_details(self, counted_cash)
    Calling this method will try store the cash details during the session closing. :param counted_cash: float, the total cash the user counted from its cash register If successful, it returns {'successful': True} Otherwise, it returns {'successful': False, 'message': str, 'redirect': bool}. 'redirect' is a boolean used to know whether we redirect the user to the back end or not. When necessary, error (i.e. UserError, AccessError) is raised which should redirect the user to the back end.
  • set_cashbox_pos(self, cashbox_value, notes)
  • show_cash_register(self)
  • show_journal_items(self)
  • try_cash_in_out(self, _type, amount, reason, extras)
  • unlink(self)
  • update_closing_control_state_session(self, notes)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_order_id Many2one → pos.order
    args: 'pos.order', 'POS Order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_product_info_pos(self, price, quantity, pos_config_id)

New fields (3)
  • available_in_pos Boolean
    default=False help='Check if you want this product to appear in the Point of Sale.' string='Available in POS'
  • pos_categ_id Many2one → pos.category
    help='Category used in the Point of Sale.' string='Point of Sale Category' args: 'pos.category'
  • to_weight Boolean
    help='Check if the product should be weighted using the hardware scale integration.' string='To Weigh With Scale'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_sale_details(self, date_start=False, date_stop=False, config_ids=False, session_ids=False)
    @api.model
    Serialise the orders of the requested time period, configs and sessions. :param date_start: The dateTime to start, default today 00:00:00. :type date_start: str. :param date_stop: The dateTime to stop, default date_start + 23:59:59. :type date_stop: str. :param config_ids: Pos Config id's to include. :type config_ids: list of numbers. :param session_ids: Pos Config id's to include. :type session_ids: list of numbers. :returns: dict -- Serialised sales.

New fields (23)
  • average_price Float
    group_operator='avg' readonly=True string='Average Price'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=True string='Point of Sale' args: 'pos.config'
  • date Datetime
    readonly=True string='Order Date'
  • delay_validation Integer
    readonly=True string='Delay Validation'
  • invoiced Boolean
    readonly=True
  • journal_id Many2one → account.journal
    readonly=True string='Journal' args: 'account.journal'
  • margin Float
    readonly=True string='Margin'
  • nbr_lines Integer
    readonly=True string='Sale Line Count'
  • order_id Many2one → pos.order
    readonly=True string='Order' args: 'pos.order'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • pos_categ_id Many2one → pos.category
    readonly=True string='PoS Category' args: 'pos.category'
  • price_sub_total Float
    readonly=True string='Subtotal w/o discount'
  • price_total Float
    readonly=True string='Total Price'
  • pricelist_id Many2one → product.pricelist
    readonly=True string='Pricelist' args: 'product.pricelist'
  • product_categ_id Many2one → product.category
    readonly=True string='Product Category' args: 'product.category'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Integer
    readonly=True string='Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True string='Product Template' args: 'product.template'
  • session_id Many2one → pos.session
    readonly=True string='Session' args: 'pos.session'
  • state Selection
    readonly=True string='Status' args: [('draft', 'New'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced'), ('cancel', 'Cancelled')]
  • total_discount Float
    readonly=True string='Total Discount'
  • user_id Many2one → res.users
    readonly=True string='User' args: 'res.users'
Public methods (1)
  • init(self)

New fields (1)
  • point_of_sale_update_stock_quantities Selection
    default='closing' help="At the session closing: A picking is created for the entire session when it's closed\n In real time: Each order sent to the server create its own picking" string='Update quantities in stock' args: [('closing', 'At the session closing (recommended)'), ('real', 'In real time')]
Public methods (1)
  • validate_period_lock_date(self)
    @api.constrains('period_lock_date', 'fiscalyear_lock_date')
    This constrains makes it impossible to change the period lock date if some open POS session exists into it. Without that, these POS sessions would trigger an error message saying that the period has been locked when trying to close them.

New fields (8)
  • account_default_pos_receivable_account_id Many2one
    readonly=False related='company_id.account_default_pos_receivable_account_id' string='Default Account Receivable (PoS)'
  • module_pos_adyen Boolean
    help='The transactions are processed by Adyen. Set your Adyen credentials on the related payment method.' string='Adyen Payment Terminal'
  • module_pos_coupon Boolean
    help='Allow the use of coupon and promotion programs in PoS.' args: 'Coupon and Promotion Programs'
  • module_pos_gift_card Boolean
    help='Allow the use of gift card' args: 'Gift Cards'
  • module_pos_mercury Boolean
    help='The transactions are processed by Vantiv. Set your Vantiv credentials on the related payment method.' string='Vantiv Payment Terminal'
  • module_pos_six Boolean
    help='The transactions are processed by Six. Set the IP address of the terminal on the related payment method.' string='Six Payment Terminal'
  • sale_tax_id Many2one → account.tax
    readonly=False related='company_id.account_sale_tax_id' string='Default Sale Tax' args: 'account.tax'
  • update_stock_quantities Selection
    readonly=False related='company_id.point_of_sale_update_stock_quantities'
Public methods (1)
  • set_values(self)

New fields (2)
  • pos_order_count Integer
    compute='_compute_pos_order' groups='point_of_sale.group_pos_user' help='The number of point of sales orders related to this customer'
  • pos_order_ids One2many → pos.order
    readonly=True args: 'pos.order', 'partner_id'
Public methods (2)
  • action_view_pos_order(self)
    This function returns an action that displays the pos orders from partner.
  • create_from_ui(self, partner)
    @api.model
    create or modify a partner from the point of sale ui. partner contains the partner's fields.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • pos_order_id Many2one → pos.order
    index=True args: 'pos.order'
  • pos_session_id Many2one → pos.session
    index=True args: 'pos.session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_type_id Many2one → stock.picking.type
    string='Point of Sale Operation Type' args: 'stock.picking.type'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    help='Check if you want to group products of this category in point of sale orders' string='Group Products in POS'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    readonly=False related='category_id.is_pos_groupable'
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/point_of_sale
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYSales/Point of Sale
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Josse Colpaert, Denis Ledoux, Christophe Simonis, Xavier Morel, Joren Van Onder, Goffin Simon, Mohammed Shekha, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, Sylvain LE GAL, GitHub, Lucas Perais (lpe), Barad Mahendra, Yannick Tivisse, qsm-odoo, Nicolas Seinlet, Pierre Masereel, Laurent Smet, Adrien Dieudonne, Christophe Monniez, Jorge Pinna Puissant, jev-odoo, wan, mreficent, Antoine Prieels, Xavier-Do, Denis Roussel, Romeo Fragomeli, jerome hanke (jhk), Victor Feyens, Andrea Grazioso (agr-odoo), Moisés López, Loan (lse), Sébastien Theys, Joseph Caburnay, Nasreddin (bon), alt-odoo, oco-odoo, Florent de Labarre, fw-bot, Anh Thao Pham (pta), Alvaro Fuentes, Rémy Baranx (bar), Achraf (abz), Brice bib Bartoletti, Adrien Widart, Ivan Yelizariev, jev, lejeune quentin, Nasreddin Boulif (bon), Touati Djamel (otd), Swapnesh Shah, nie, IEL, Mathieu Duckerts-Antoine, Julien CHEVREAU (JCU), jbw, Aurélien (avd), Jérôme Vanhaudenard, root, Kevin Baptiste, Guillaume (guva), Raf Geens, roen-odoo, Stanislas Sobieski, Hubert Van de Walle (huvw), Robin Heinz, Miquel Raïch, pedrambiria, Ahmad Khanalizadeh, Jerome (jev), Jacky (trj), Edoardo (pied), Sylvain Francis, momegahed, Jigar Vaghela, Nicolas (vin), Florian Damhaut, Merlin (megu), MerlinGuillaume, yhu-odoo, Audric Onockx (auon), william, rhe-odoo, hparfr, Pierrick Brun, Loan (LSE), Thomas Lefebvre (thle), mehjabinfarsana, Archana Vaghasiya, alsh-odoo, Matheus Leal Viana (malv), Eleftherios Kritsotakis, Gaetan Vanden Bergh (gavb), François Honoré, Merel Geens (mege), Andro Gvivradze, Pedram (PEBR), Louis Wicket (wil), tsm-odoo, David, Walid, Mylyna Hy, Laurent Desausoi, Esam Hussein
WEBSITE
WEBSITEhttps://www.odoo.com/page/point-of-sale-shop
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:27
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - digest
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - resource
    - account
    - analytic
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (60)
XML IDNameModelTypeStatus
account_cashbox_line_view_tree account.cashbox.line.tree account.cashbox.line tree New
assets_tests Point Of Sale Assets Tests ir.ui.view qweb Inherits web.assets_tests
closing_balance_confirm Confirming balance closing closing.balance.confirm.wizard form New
customer_facing_display_html customer_facing_display_html ir.ui.view qweb New
digest_digest_view_form digest.digest.view.form.inherit.sale.order digest.digest xpath Inherits digest.digest_digest_view_form
point_of_sale.assets point_of_sale assets ir.ui.view qweb New
point_of_sale.assets_backend hr assets ir.ui.view qweb Inherits web.assets_backend
point_of_sale.assets_common POS Assets Common ir.ui.view qweb New
point_of_sale.index POS Index ir.ui.view qweb New
point_of_sale.pos_assets_backend POS UI Backend Assets ir.ui.view qweb Inherits web.assets_backend
point_of_sale.qunit_suite point_of_sale.qunit_suite ir.ui.view qweb New
point_of_sale.qunit_suite_assets point_of_sale.qunit_suite_assets ir.ui.view qweb New
point_of_sale.qunit_suite_tests point_of_sale.qunit_suite_tests ir.ui.view qweb New
pos_config_view_form pos.config.form.view pos.config form New
pos_payment_method_view_form pos.payment.method.form pos.payment.method form New
pos_payment_method_view_search pos.payment.search.view pos.payment.method search New
pos_payment_method_view_tree pos.payment.method.tree pos.payment.method tree New
pos_rounding_form_view_inherited pos.cash.rounding.form.inherited account.cash.rounding xpath Inherits account.rounding_form_view
product_pos_category_form_view pos.category.form pos.category form New
product_pos_category_tree_view pos.category.tree pos.category tree New
product_template_form_view product.template.form.inherit product.template xpath Inherits product.product_template_form_view
product_template_search_view_pos product.template.search.pos.form product.template filter Inherits product.product_template_search_view
product_uom_categ_form_view uom.category.form.inherit uom.category xpath Inherits uom.product_uom_categ_form_view
product_uom_categ_tree_view uom.category.tree.inherit uom.category xpath Inherits uom.product_uom_categ_tree_view
report_invoice report_invoice ir.ui.view qweb Inherits account.report_invoice
report_saledetails report_saledetails ir.ui.view qweb New
report_userlabel report_userlabel ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.point_of_sale res.config.settings xpath Inherits base.res_config_settings_view_form
view_account_bnk_stmt_cashbox account.bnk_stmt_cashbox.form account.bank.statement.cashbox xpath Inherits account.view_account_bnk_stmt_cashbox
view_account_bnk_stmt_cashbox_footer account.bnk_stmt_cashbox.form.close.modal account.bank.statement.cashbox xpath Inherits account.view_account_bnk_stmt_cashbox_footer
view_account_journal_pos_user_form account.journal.pos.user.form.inherit account.journal xpath Inherits account.view_account_journal_form
view_bank_statement_pos_session view.bank.statement.pos.session account.bank.statement xpath Inherits account.view_bank_statement_form
view_partner_pos_kanban res.partner.pos.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
view_partner_property_form res.partner.pos.form.inherit res.partner div Inherits base.view_partner_form
view_pos_category_kanban pos.category.kanban pos.category kanban New
view_pos_config_kanban pos.config.kanban.view pos.config kanban New
view_pos_config_search pos.config.search.view pos.config search New
view_pos_config_tree pos.config.tree.view pos.config tree New
view_pos_details_wizard pos.details.wizard.form pos.details.wizard form New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_kanban pos.order.kanban pos.order kanban New
view_pos_order_line pos.order.line.tree pos.order.line tree New
view_pos_order_line_form pos.order.line.form pos.order.line form New
view_pos_order_pivot pos.order.pivot pos.order pivot New
view_pos_order_search pos.order.search.view pos.order search New
view_pos_order_tree pos.order.tree pos.order tree New
view_pos_order_tree_all_sales_lines pos.order.line.all.sales.tree pos.order.line tree New
view_pos_order_tree_no_session_id pos.order.tree_no_session_id pos.order xpath Inherits point_of_sale.view_pos_order_tree
view_pos_payment pos.make.payment.form pos.make.payment form New
view_pos_payment_form pos.payment.form pos.payment form New
view_pos_payment_search pos.payment.search.view pos.payment search New
view_pos_payment_tree pos.payment.tree pos.payment tree New
view_pos_pos_form pos.order.form pos.order form New
view_pos_session_form pos.session.form.view pos.session form New
view_pos_session_kanban pos.session.kanban pos.session kanban New
view_pos_session_search pos.session.search.view pos.session search New
view_pos_session_tree pos.session.tree.view pos.session tree New
view_report_pos_order_graph report.pos.order.graph report.pos.order graph New
view_report_pos_order_pivot report.pos.order.pivot report.pos.order pivot New
view_report_pos_order_search report.pos.order.search report.pos.order search New
Models touched (36)

New fields (2)
  • account_id Many2one → account.account
    readonly=True related='journal_id.default_account_id' args: 'account.account'
  • pos_session_id Many2one → pos.session
    copy=False string='Session' args: 'pos.session'
Public methods (2)
  • button_validate_or_action(self)
  • unlink(self)

New fields (2)
  • is_a_template Boolean
    default=False
  • pos_config_ids One2many → pos.config
    args: 'pos.config', 'default_cashbox_id'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • set_default_cashbox(self)

New fields (1)
  • pos_statement_id Many2one → pos.order
    ondelete='cascade' string='POS statement' args: 'pos.order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_payment_method_ids One2many → pos.payment.method
    string='Point of Sale Payment Methods' args: 'pos.payment.method', 'cash_journal_id'
Public methods (0)

No public methods.

New fields (1)
  • pos_order_ids One2many → pos.order
    args: 'pos.order', 'account_move'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • get_real_tax_amount(self)
  • write(self, vals)

New fields (1)
  • type Selection
    ondelete={'weight': 'set default', 'price': 'set default', 'discount': 'set default', 'client': 'set default', 'cashier': 'set default'} selection_add=[('weight', 'Weighted Product'), ('price', 'Priced Product'), ('discount', 'Discounted Product'), ('client', 'Client'), ('cashier', 'Cashier')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • confirm_closing_balance(self)

New fields (2)
  • kpi_pos_total Boolean
    args: 'POS Sales'
  • kpi_pos_total_value Monetary
    compute='_compute_kpi_pos_total_value'
Public methods (0)

No public methods.

New fields (5)
  • child_id One2many → pos.category
    string='Children Categories' args: 'pos.category', 'parent_id'
  • image_128 Image
    max_height=128 max_width=128 args: 'Image'
  • name Char
    required=True string='Category Name' translate=True
  • parent_id Many2one → pos.category
    index=True string='Parent Category' args: 'pos.category'
  • sequence Integer
    help='Gives the sequence order when displaying a list of product categories.'
Public methods (2)
  • name_get(self)
  • unlink(self)

New fields (77)
  • active Boolean
    default=True
  • allowed_pricelist_ids Many2many → product.pricelist
    compute='_compute_allowed_pricelist_ids' help='This is a technical field used for the domain of pricelist_id.' string='Allowed Pricelists' args: 'product.pricelist'
  • amount_authorized_diff Float
    help='This field depicts the maximum difference allowed between the ending balance and the theoretical cash when closing a session, for non-POS managers. If this maximum is reached, the user will have an error message at the closing of his session saying that he needs to contact his manager.' args: 'Amount Authorized Difference'
  • available_pricelist_ids Many2many → product.pricelist
    default=_default_pricelist help='Make several pricelists available in the Point of Sale. You can also apply a pricelist to specific customers from their contact form (in Sales tab). To be valid, this pricelist must be listed here as an available pricelist. Otherwise the default pricelist will apply.' string='Available Pricelists' args: 'product.pricelist'
  • barcode_nomenclature_id Many2one → barcode.nomenclature
    default=<expr> help='Defines what kind of barcodes are available and how they are assigned to products, customers and cashiers.' required=True string='Barcode Nomenclature' args: 'barcode.nomenclature'
  • cash_control Boolean
    help='Check the amount of the cashbox at opening and closing.' string='Advanced Cash Control'
  • cash_rounding Boolean
    string='Cash Rounding'
  • company_has_template Boolean
    compute='_compute_company_has_template' string='Company has chart of accounts'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    compute='_compute_currency' string='Currency' args: 'res.currency'
  • current_session_id Many2one → pos.session
    compute='_compute_current_session' string='Current Session' args: 'pos.session'
  • current_session_state Char
    compute='_compute_current_session'
  • current_user_id Many2one → res.users
    compute='_compute_current_session_user' string='Current Session Responsible' args: 'res.users'
  • customer_facing_display_html Html
    compute=_compute_customer_html string='Customer facing display content' translate=True
  • default_cashbox_id Many2one → account.bank.statement.cashbox
    string='Default Balance' args: 'account.bank.statement.cashbox'
  • default_fiscal_position_id Many2one → account.fiscal.position
    string='Default Fiscal Position' args: 'account.fiscal.position'
  • fiscal_position_ids Many2many → account.fiscal.position
    help='This is useful for restaurants with onsite and take-away services that imply specific tax rates.' string='Fiscal Positions' args: 'account.fiscal.position'
  • group_pos_manager_id Many2one → res.groups
    default=_get_group_pos_manager help='This field is there to pass the id of the pos manager group to the point of sale client.' string='Point of Sale Manager Group' args: 'res.groups'
  • group_pos_user_id Many2one → res.groups
    default=_get_group_pos_user help='This field is there to pass the id of the pos user group to the point of sale client.' string='Point of Sale User Group' args: 'res.groups'
  • has_active_session Boolean
    compute='_compute_current_session'
  • iface_available_categ_ids Many2many → pos.category
    help='The point of sale will only display products which are within one of the selected category trees. If no category is specified, all available products will be shown' string='Available PoS Product Categories' args: 'pos.category'
  • iface_big_scrollbars Boolean
    help='For imprecise industrial touchscreens.' args: 'Large Scrollbars'
  • iface_cashdrawer Boolean
    help='Automatically open the cashdrawer.' string='Cashdrawer'
  • iface_customer_facing_display Boolean
    help='Show checkout to customers with a remotely-connected screen.' string='Customer Facing Display'
  • iface_display_categ_images Boolean
    help='The product categories will be displayed with pictures.' string='Display Category Pictures'
  • iface_electronic_scale Boolean
    help='Enables Electronic Scale integration.' string='Electronic Scale'
  • iface_print_auto Boolean
    default=False help='The receipt will automatically be printed at the end of each order.' string='Automatic Receipt Printing'
  • iface_print_skip_screen Boolean
    default=True help='The receipt screen will be skipped if the receipt can be printed automatically.' string='Skip Preview Screen'
  • iface_print_via_proxy Boolean
    help='Bypass browser printing and prints via the hardware proxy.' string='Print via Proxy'
  • iface_scan_via_proxy Boolean
    help='Enable barcode scanning with a remotely connected barcode scanner and card swiping with a Vantiv card reader.' string='Scan via Proxy'
  • iface_start_categ_id Many2one → pos.category
    help='The point of sale will display this product category by default. If no category is specified, all available products will be shown.' string='Initial Category' args: 'pos.category'
  • iface_tax_included Selection
    default='subtotal' required=True string='Tax Display' args: [('subtotal', 'Tax-Excluded Price'), ('total', 'Tax-Included Price')]
  • iface_tipproduct Boolean
    string='Product tips'
  • iface_vkeyboard Boolean
    help='Don’t turn this option on if you take orders on smartphones or tablets. \n Such devices already benefit from a native keyboard.' string='Virtual KeyBoard'
  • invoice_journal_id Many2one → account.journal
    default=_default_invoice_journal domain=[('type', '=', 'sale')] help='Accounting journal used to create invoices.' string='Invoice Journal' args: 'account.journal'
  • is_header_or_footer Boolean
    args: 'Header & Footer'
  • is_installed_account_accountant Boolean
    compute='_compute_is_installed_account_accountant' string='Is the Full Accounting Installed'
  • is_posbox Boolean
    args: 'PosBox'
  • journal_id Many2one → account.journal
    default=_default_sale_journal domain=[('type', '=', 'sale')] help='Accounting journal used to post sales entries.' ondelete='restrict' string='Sales Journal' args: 'account.journal'
  • last_session_closing_cash Float
    compute='_compute_last_session'
  • last_session_closing_cashbox Many2one → account.bank.statement.cashbox
    compute='_compute_last_session' args: 'account.bank.statement.cashbox'
  • last_session_closing_date Date
    compute='_compute_last_session'
  • limit_categories Boolean
    args: 'Restrict Product Categories'
  • manage_orders Boolean
    string='Manage Orders'
  • manual_discount Boolean
    default=True string='Manual Discounts'
  • module_account Boolean
    default=True help='Enables invoice generation from the Point of Sale.' string='Invoicing'
  • module_pos_discount Boolean
    args: 'Global Discounts'
  • module_pos_hr Boolean
    help='Show employee login screen'
  • module_pos_loyalty Boolean
    args: 'Loyalty Program'
  • module_pos_mercury Boolean
    string='Integrated Card Payments'
  • module_pos_restaurant Boolean
    args: 'Is a Bar/Restaurant'
  • name Char
    help='An internal identification of the point of sale.' index=True required=True string='Point of Sale'
  • only_round_cash_method Boolean
    string='Only apply rounding on cash'
  • other_devices Boolean
    help='Connect devices to your PoS without an IoT Box.' string='Other Devices'
  • payment_method_ids Many2many → pos.payment.method
    default=<expr> string='Payment Methods' args: 'pos.payment.method'
  • picking_type_id Many2one → stock.picking.type
    default=_default_picking_type_id domain="[('code', '=', 'outgoing'), ('warehouse_id.company_id', '=', company_id)]" ondelete='restrict' required=True string='Operation Type' args: 'stock.picking.type'
  • pos_session_duration Char
    compute='_compute_current_session_user'
  • pos_session_state Char
    compute='_compute_current_session_user'
  • pos_session_username Char
    compute='_compute_current_session_user'
  • pricelist_id Many2one → product.pricelist
    default=_default_pricelist help='The pricelist used if no customer is selected or if the customer has no Sale Pricelist configured.' required=True string='Default Pricelist' args: 'product.pricelist'
  • product_configurator Boolean
    string='Product Configurator'
  • proxy_ip Char
    help='The hostname or ip address of the hardware proxy, Will be autodetected if left empty.' size=45 string='IP Address'
  • receipt_footer Text
    help='A short text that will be inserted as a footer in the printed receipt.' string='Receipt Footer'
  • receipt_header Text
    help='A short text that will be inserted as a header in the printed receipt.' string='Receipt Header'
  • restrict_price_control Boolean
    help='Only users with Manager access rights for PoS app can modify the product prices on orders.' string='Restrict Price Modifications to Managers'
  • rounding_method Many2one → account.cash.rounding
    string='Cash rounding' args: 'account.cash.rounding'
  • selectable_categ_ids Many2many → pos.category
    compute='_compute_selectable_categories' args: 'pos.category'
  • sequence_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders.' ondelete='restrict' readonly=True string='Order IDs Sequence' args: 'ir.sequence'
  • sequence_line_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders lines.' readonly=True string='Order Line IDs Sequence' args: 'ir.sequence'
  • session_ids One2many → pos.session
    string='Sessions' args: 'pos.session', 'config_id'
  • show_allow_invoicing_alert Boolean
    compute='_compute_show_allow_invoicing_alert'
  • start_category Boolean
    default=False args: 'Start Category'
  • tax_regime Boolean
    args: 'Tax Regime'
  • tax_regime_selection Boolean
    args: 'Tax Regime Selection value'
  • tip_product_id Many2one → product.product
    help='This product is used as reference on customer receipts.' string='Tip Product' args: 'product.product'
  • use_pricelist Boolean
    args: 'Use a pricelist.'
  • uuid Char
    copy=False default=<expr> help='A globally unique identifier for this pos configuration, used to prevent conflicts in client-generated data.' readonly=True
Public methods (13)
  • assign_payment_journals(self, company)
  • create(self, values)
    @api.model
  • execute(self)
  • generate_pos_journal(self, company)
  • name_get(self)
  • open_existing_session_cb(self)
    close session button access session form to validate entries
  • open_session_cb(self, check_coa=True)
    new session button create one if none exist access cash control interface if enabled or start a session
  • open_ui(self)
    Open the pos interface with config_id as an extra argument. In vanilla PoS each user can only have one active session, therefore it was not needed to pass the config_id on opening a session. It is also possible to login to sessions created by other users. :returns: dict
  • post_install_pos_localisation(self, companies=False)
    @api.model
  • setup_defaults(self, company)
    Extend this method to customize the existing pos.config of the company during the installation of a localisation. :param self pos.config: pos.config records present in the company during the installation of localisation. :param company res.company: the single company where the pos.config defaults will be setup.
  • setup_invoice_journal(self, company)
  • unlink(self)
  • write(self, vals)

New fields (3)
  • end_date Datetime
    default=fields.Datetime.now required=True
  • pos_config_ids Many2many → pos.config
    default=<expr> args: 'pos.config', 'pos_detail_configs'
  • start_date Datetime
    default=_default_start_date required=True
Public methods (1)
  • generate_report(self)

New fields (5)
  • amount Float
    default=_default_amount digits=0 required=True
  • config_id Many2one → pos.config
    default=_default_config required=True string='Point of Sale Configuration' args: 'pos.config'
  • payment_date Datetime
    default=<expr> required=True string='Payment Date'
  • payment_method_id Many2one → pos.payment.method
    default=_default_payment_method required=True string='Payment Method' args: 'pos.payment.method'
  • payment_name Char
    string='Payment Reference'
Public methods (2)
  • check(self)
    Check the order: if the order is not paid: continue payment, if the order is paid print ticket.
  • launch_payment(self)

New fields (0)

No new fields.

Public methods (1)
  • open_statement(self)

New fields (34)
  • account_move Many2one → account.move
    copy=False index=True readonly=True string='Invoice' args: 'account.move'
  • amount_paid Float
    digits=0 readonly=True required=True states={'draft': [('readonly', False)]} string='Paid'
  • amount_return Float
    digits=0 readonly=True required=True string='Returned'
  • amount_tax Float
    digits=0 readonly=True required=True string='Taxes'
  • amount_total Float
    digits=0 readonly=True required=True string='Total'
  • company_id Many2one → res.company
    readonly=True required=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=False related='session_id.config_id' string='Point of Sale' args: 'pos.config'
  • currency_id Many2one → res.currency
    related='config_id.currency_id' string='Currency' args: 'res.currency'
  • currency_rate Float
    compute='_compute_currency_rate' compute_sudo=True digits=0 help='The rate of the currency to the currency of rate applicable at the date of the order' readonly=True store=True args: 'Currency Rate'
  • date_order Datetime
    default=fields.Datetime.now index=True readonly=True string='Date'
  • failed_pickings Boolean
    compute='_compute_picking_count'
  • fiscal_position_id Many2one → account.fiscal.position
    comodel_name='account.fiscal.position' readonly=True states={'draft': [('readonly', False)]} string='Fiscal Position'
  • invoice_group Boolean
    readonly=False related='config_id.module_account'
  • is_invoiced Boolean
    compute='_compute_is_invoiced' args: 'Is Invoiced'
  • is_tipped Boolean
    readonly=True args: 'Is this already tipped?'
  • lines One2many → pos.order.line
    copy=True readonly=True states={'draft': [('readonly', False)]} string='Order Lines' args: 'pos.order.line', 'order_id'
  • name Char
    copy=False default='/' readonly=True required=True string='Order Ref'
  • nb_print Integer
    copy=False default=0 readonly=True string='Number of Print'
  • note Text
    string='Internal Notes'
  • partner_id Many2one → res.partner
    change_default=True index=True states={'draft': [('readonly', False)], 'paid': [('readonly', False)]} string='Customer' args: 'res.partner'
  • payment_ids One2many → pos.payment
    readonly=True string='Payments' args: 'pos.payment', 'pos_order_id'
  • picking_count Integer
    compute='_compute_picking_count'
  • picking_ids One2many → stock.picking
    args: 'stock.picking', 'pos_order_id'
  • picking_type_id Many2one → stock.picking.type
    readonly=False related='session_id.config_id.picking_type_id' string='Operation Type' args: 'stock.picking.type'
  • pos_reference Char
    copy=False readonly=True string='Receipt Number'
  • pricelist_id Many2one → product.pricelist
    readonly=True required=True states={'draft': [('readonly', False)]} string='Pricelist' args: 'product.pricelist'
  • sale_journal Many2one → account.journal
    ondelete='restrict' readonly=True related='session_id.config_id.journal_id' store=True string='Sales Journal' args: 'account.journal'
  • sequence_number Integer
    default=1 help='A session-unique sequence number for the order' string='Sequence Number'
  • session_id Many2one → pos.session
    domain="[('state', '=', 'opened')]" index=True readonly=True required=True states={'draft': [('readonly', False)]} string='Session' args: 'pos.session'
  • session_move_id Many2one → account.move
    copy=False readonly=True related='session_id.move_id' string='Session Journal Entry' args: 'account.move'
  • state Selection
    copy=False default='draft' index=True readonly=True args: [('draft', 'New'), ('cancel', 'Cancelled'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced')], 'Status'
  • tip_amount Float
    digits=0 readonly=True string='Tip Amount'
  • to_invoice Boolean
    copy=False args: 'To invoice'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> help='Person who uses the cash register. It can be a reliever, a student or an interim employee.' states={'done': [('readonly', True)], 'invoiced': [('readonly', True)]} string='Responsible'
Public methods (15)
  • action_pos_order_cancel(self)
  • action_pos_order_invoice(self)
  • action_pos_order_paid(self)
  • action_receipt_to_customer(self, name, client, ticket)
  • action_stock_picking(self)
  • action_view_invoice(self)
  • add_payment(self, data)
    Create a new payment for the order
  • create(self, values)
    @api.model
  • create_from_ui(self, orders, draft=False)
    @api.model
    Create and update Orders from the frontend PoS application. Create new orders and update orders that are in draft status. If an order already exists with a status diferent from 'draft'it will be discareded, otherwise it will be saved to the database. If saved with 'draft' status the order can be overwritten later by this function. :param orders: dictionary with the orders to be created. :type orders: dict. :param draft: Indicate if the orders are ment to be finalised or temporarily saved. :type draft: bool. :Returns: list -- list of db-ids for the created and updated orders.
  • export_for_ui(self)
    Returns a list of dict with each item having similar signature as the return of `export_as_JSON` of models.Order. This is useful for back-and-forth communication between the pos frontend and backend.
  • refund(self)
    Create a copy of order for refund order
  • remove_from_ui(self, server_ids)
    @api.model
    Remove orders from the frontend PoS application Remove orders from the server by id. :param server_ids: list of the id's of orders to remove from the server. :type server_ids: list. :returns: list -- list of db-ids for the removed orders.
  • search_paid_order_ids(self, config_id, domain, limit, offset)
    @api.model
    Search for 'paid' orders that satisfy the given domain, limit and offset.
  • unlink(self)
  • write(self, vals)

New fields (16)
  • company_id Many2one → res.company
    related='order_id.company_id' store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='order_id.currency_id' args: 'res.currency'
  • discount Float
    default=0.0 digits=0 string='Discount (%)'
  • full_product_name Char
    args: 'Full Product Name'
  • name Char
    copy=False required=True string='Line No'
  • notice Char
    string='Discount Notice'
  • order_id Many2one → pos.order
    index=True ondelete='cascade' required=True string='Order Ref' args: 'pos.order'
  • pack_lot_ids One2many → pos.pack.operation.lot
    string='Lot/serial Number' args: 'pos.pack.operation.lot', 'pos_order_line_id'
  • price_subtotal Float
    digits=0 readonly=True required=True string='Subtotal w/o Tax'
  • price_subtotal_incl Float
    digits=0 readonly=True required=True string='Subtotal'
  • price_unit Float
    digits=0 string='Unit Price'
  • product_id Many2one → product.product
    change_default=True domain=[('sale_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Product UoM' args: 'uom.uom'
  • qty Float
    default=1 digits='Product Unit of Measure' args: 'Quantity'
  • tax_ids Many2many → account.tax
    readonly=True string='Taxes' args: 'account.tax'
  • tax_ids_after_fiscal_position Many2many → account.tax
    compute='_get_tax_ids_after_fiscal_position' string='Taxes to Apply' args: 'account.tax'
Public methods (3)
  • create(self, values)
    @api.model
  • export_for_ui(self)
  • write(self, values)

New fields (4)
  • lot_name Char
    args: 'Lot Name'
  • order_id Many2one → pos.order
    readonly=False related='pos_order_line_id.order_id' args: 'pos.order'
  • pos_order_line_id Many2one → pos.order.line
    args: 'pos.order.line'
  • product_id Many2one → product.product
    readonly=False related='pos_order_line_id.product_id' args: 'product.product'
Public methods (1)
  • export_for_ui(self)

New fields (16)
  • amount Monetary
    currency_field='currency_id' help='Total amount of the payment.' readonly=True required=True string='Amount'
  • card_type Char
    args: 'Type of card used'
  • cardholder_name Char
    args: 'Cardholder Name'
  • company_id Many2one → res.company
    related='pos_order_id.company_id' string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='pos_order_id.currency_id' string='Currency' args: 'res.currency'
  • currency_rate Float
    help='Conversion rate from company currency to order currency.' related='pos_order_id.currency_rate' string='Conversion Rate'
  • is_change Boolean
    default=False string='Is this payment change?'
  • name Char
    readonly=True string='Label'
  • partner_id Many2one → res.partner
    related='pos_order_id.partner_id' string='Customer' args: 'res.partner'
  • payment_date Datetime
    default=<expr> readonly=True required=True string='Date'
  • payment_method_id Many2one → pos.payment.method
    required=True string='Payment Method' args: 'pos.payment.method'
  • payment_status Char
    args: 'Payment Status'
  • pos_order_id Many2one → pos.order
    required=True string='Order' args: 'pos.order'
  • session_id Many2one → pos.session
    index=True related='pos_order_id.session_id' store=True string='Session' args: 'pos.session'
  • ticket Char
    args: 'Payment Receipt Info'
  • transaction_id Char
    args: 'Payment Transaction ID'
Public methods (2)
  • export_for_ui(self)
  • name_get(self)

New fields (11)
  • active Boolean
    default=True
  • cash_journal_id Many2one → account.journal
    domain=[('type', '=', 'cash')] help='The payment method is of type cash. A cash statement will be automatically generated.' ondelete='restrict' string='Cash Journal' args: 'account.journal'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • config_ids Many2many → pos.config
    string='Point of Sale Configurations' args: 'pos.config'
  • hide_use_payment_terminal Boolean
    compute='_compute_hide_use_payment_terminal' help='Technical field which is used to hide use_payment_terminal when no payment interfaces are installed.'
  • is_cash_count Boolean
    string='Cash'
  • name Char
    required=True string='Payment Method' translate=True
  • open_session_ids Many2many → pos.session
    compute='_compute_open_session_ids' help='Open PoS sessions that are using this payment method.' string='Pos Sessions' args: 'pos.session'
  • receivable_account_id Many2one → account.account
    default=<expr> domain=[('reconcile', '=', True), ('user_type_id.type', '=', 'receivable')] help='Account used as counterpart of the income account in the accounting entry representing the pos sales.' ondelete='restrict' required=True string='Intermediary Account' args: 'account.account'
  • split_transactions Boolean
    default=False help='If ticked, each payment will generate a separated journal item. Ticking that option will slow the closing of the PoS.' string='Split Transactions'
  • use_payment_terminal Selection
    help='Record payments with a terminal on this journal.' selection=<expr> string='Use a Payment Terminal'
Public methods (1)
  • write(self, vals)

New fields (33)
  • cash_control Boolean
    compute='_compute_cash_all' compute_sudo=True string='Has Cash Control'
  • cash_journal_id Many2one → account.journal
    compute='_compute_cash_all' store=True string='Cash Journal' args: 'account.journal'
  • cash_real_difference Monetary
    readonly=True string='Difference'
  • cash_real_expected Monetary
    readonly=True string='Expected'
  • cash_real_transaction Monetary
    readonly=True string='Transaction'
  • cash_register_balance_end Monetary
    compute='_compute_cash_balance' help='Sum of opening balance and transactions.' readonly=True string='Theoretical Closing Balance'
  • cash_register_balance_end_real Monetary
    help='Total of closing cash control lines.' readonly=True related='cash_register_id.balance_end_real' string='Ending Balance'
  • cash_register_balance_start Monetary
    help='Total of opening cash control lines.' readonly=True related='cash_register_id.balance_start' string='Starting Balance'
  • cash_register_difference Monetary
    compute='_compute_cash_balance' help='Difference between the theoretical closing balance and the real closing balance.' readonly=True string='Before Closing Difference'
  • cash_register_id Many2one → account.bank.statement
    compute='_compute_cash_all' store=True string='Cash Register' args: 'account.bank.statement'
  • cash_register_total_entry_encoding Monetary
    compute='_compute_cash_balance' help='Total of all paid sales orders' readonly=True string='Total Cash Transaction'
  • company_id Many2one → res.company
    readonly=True related='config_id.company_id' string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    help='The physical point of sale you will use.' index=True required=True string='Point of Sale' args: 'pos.config'
  • currency_id Many2one → res.currency
    readonly=False related='config_id.currency_id' string='Currency' args: 'res.currency'
  • failed_pickings Boolean
    compute='_compute_picking_count'
  • is_in_company_currency Boolean
    compute='_compute_is_in_company_currency' args: 'Is Using Company Currency'
  • login_number Integer
    default=0 help='A sequence number that is incremented each time a user resumes the pos session' string='Login Sequence Number'
  • move_id Many2one → account.move
    index=True string='Journal Entry' args: 'account.move'
  • name Char
    default='/' readonly=True required=True string='Session ID'
  • order_count Integer
    compute='_compute_order_count'
  • order_ids One2many → pos.order
    string='Orders' args: 'pos.order', 'session_id'
  • payment_method_ids Many2many → pos.payment.method
    related='config_id.payment_method_ids' string='Payment Methods' args: 'pos.payment.method'
  • picking_count Integer
    compute='_compute_picking_count'
  • picking_ids One2many → stock.picking
    args: 'stock.picking', 'pos_session_id'
  • rescue Boolean
    copy=False help='Auto-generated session for orphan orders, ignored in constraints' readonly=True string='Recovery Session'
  • sequence_number Integer
    default=1 help='A sequence number that is incremented with each order' string='Order Sequence Number'
  • start_at Datetime
    readonly=True string='Opening Date'
  • state Selection
    copy=False default='opening_control' index=True readonly=True required=True string='Status' args: POS_SESSION_STATE
  • statement_ids One2many → account.bank.statement
    readonly=True string='Cash Statements' args: 'account.bank.statement', 'pos_session_id'
  • stop_at Datetime
    copy=False readonly=True string='Closing Date'
  • total_payments_amount Float
    compute='_compute_total_payments_amount' string='Total Payments Amount'
  • update_stock_at_closing Boolean
    args: 'Stock should be updated at closing'
  • user_id Many2one → res.users
    default=<expr> index=True ondelete='restrict' readonly=True required=True states={'opening_control': [('readonly', False)]} string='Opened By' args: 'res.users'
Public methods (14)
  • action_pos_session_close(self)
  • action_pos_session_closing_control(self)
  • action_pos_session_open(self)
  • action_pos_session_validate(self)
  • action_show_payments_list(self)
  • action_stock_picking(self)
  • action_view_order(self)
  • create(self, values)
    @api.model
  • login(self)
  • open_cashbox_pos(self)
  • open_frontend_cb(self)
    Open the pos interface with config_id as an extra argument. In vanilla PoS each user can only have one active session, therefore it was not needed to pass the config_id on opening a session. It is also possible to login to sessions created by other users. :returns: dict
  • set_cashbox_pos(self, cashbox_value, notes)
  • show_journal_items(self)
  • unlink(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • unlink(self)

New fields (3)
  • available_in_pos Boolean
    default=False help='Check if you want this product to appear in the Point of Sale.' string='Available in POS'
  • pos_categ_id Many2one → pos.category
    help='Category used in the Point of Sale.' string='Point of Sale Category' args: 'pos.category'
  • to_weight Boolean
    help='Check if the product should be weighted using the hardware scale integration.' string='To Weigh With Scale'
Public methods (1)
  • unlink(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_sale_details(self, date_start=False, date_stop=False, config_ids=False, session_ids=False)
    @api.model
    Serialise the orders of the requested time period, configs and sessions. :param date_start: The dateTime to start, default today 00:00:00. :type date_start: str. :param date_stop: The dateTime to stop, default date_start + 23:59:59. :type date_stop: str. :param config_ids: Pos Config id's to include. :type config_ids: list of numbers. :param session_ids: Pos Config id's to include. :type session_ids: list of numbers. :returns: dict -- Serialised sales.

New fields (22)
  • average_price Float
    group_operator='avg' readonly=True string='Average Price'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=True string='Point of Sale' args: 'pos.config'
  • date Datetime
    readonly=True string='Order Date'
  • delay_validation Integer
    string='Delay Validation'
  • invoiced Boolean
    readonly=True
  • journal_id Many2one → account.journal
    string='Journal' args: 'account.journal'
  • nbr_lines Integer
    readonly=True string='Sale Line Count'
  • order_id Many2one → pos.order
    readonly=True string='Order' args: 'pos.order'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • pos_categ_id Many2one → pos.category
    readonly=True string='PoS Category' args: 'pos.category'
  • price_sub_total Float
    readonly=True string='Subtotal w/o discount'
  • price_total Float
    readonly=True string='Total Price'
  • pricelist_id Many2one → product.pricelist
    readonly=True string='Pricelist' args: 'product.pricelist'
  • product_categ_id Many2one → product.category
    readonly=True string='Product Category' args: 'product.category'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Integer
    readonly=True string='Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True string='Product Template' args: 'product.template'
  • session_id Many2one → pos.session
    readonly=True string='Session' args: 'pos.session'
  • state Selection
    string='Status' args: [('draft', 'New'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced'), ('cancel', 'Cancelled')]
  • total_discount Float
    readonly=True string='Total Discount'
  • user_id Many2one → res.users
    readonly=True string='User' args: 'res.users'
Public methods (1)
  • init(self)

New fields (1)
  • point_of_sale_update_stock_quantities Selection
    default='closing' help="At the session closing: A picking is created for the entire session when it's closed\n In real time: Each order sent to the server create its own picking" string='Update quantities in stock' args: [('closing', 'At the session closing (advised)'), ('real', 'In real time')]
Public methods (1)
  • validate_period_lock_date(self)
    @api.constrains('period_lock_date', 'fiscalyear_lock_date')
    This constrains makes it impossible to change the period lock date if some open POS session exists into it. Without that, these POS sessions would trigger an error message saying that the period has been locked when trying to close them.

New fields (5)
  • module_pos_adyen Boolean
    help='The transactions are processed by Adyen. Set your Adyen credentials on the related payment method.' string='Adyen Payment Terminal'
  • module_pos_mercury Boolean
    help='The transactions are processed by Vantiv. Set your Vantiv credentials on the related payment method.' string='Vantiv Payment Terminal'
  • module_pos_six Boolean
    help='The transactions are processed by Six. Set the IP address of the terminal on the related payment method.' string='Six Payment Terminal'
  • sale_tax_id Many2one → account.tax
    readonly=False related='company_id.account_sale_tax_id' string='Default Sale Tax' args: 'account.tax'
  • update_stock_quantities Selection
    readonly=False related='company_id.point_of_sale_update_stock_quantities'
Public methods (1)
  • set_values(self)

New fields (2)
  • pos_order_count Integer
    compute='_compute_pos_order' groups='point_of_sale.group_pos_user' help='The number of point of sales orders related to this customer'
  • pos_order_ids One2many → pos.order
    readonly=True args: 'pos.order', 'partner_id'
Public methods (2)
  • create_from_ui(self, partner)
    @api.model
    create or modify a partner from the point of sale ui. partner contains the partner's fields.
  • unlink(self)

New fields (2)
  • pos_order_id Many2one → pos.order
    index=True args: 'pos.order'
  • pos_session_id Many2one → pos.session
    index=True args: 'pos.session'
Public methods (0)

No public methods.

New fields (1)
  • pos_type_id Many2one → stock.picking.type
    string='Point of Sale Operation Type' args: 'stock.picking.type'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    help='Check if you want to group products of this category in point of sale orders' string='Group Products in POS'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    readonly=False related='category_id.is_pos_groupable'
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/point_of_sale
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYSales/Point Of Sale
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Thibault Delavallée, Josse Colpaert, Denis Ledoux, Christophe Simonis, Xavier Morel, Joren Van Onder, Goffin Simon, Mohammed Shekha, Cedric Snauwaert, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Sylvain LE GAL, GitHub, Damien Bouvy, Olivier Colson, David Arnold, Yannick Tivisse, qsm-odoo, Odoo Online, Nicolas Seinlet, Pierre Masereel, Laurent Smet, Christophe Monniez, Jorge Pinna Puissant, Gert Pellin, jev-odoo, Adrian Torres, wan, mreficent, Julien Castiaux, Antoine Prieels, Xavier-Do, David Tran, jvm-odoo, mgh-odoo, jerome hanke (jhk), Victor Feyens, Florimond Husquinet (fhu), Andrea Grazioso (agr-odoo), Loan (lse), Enric Tobella, Sébastien Theys, Joseph Caburnay, Nasreddin (bon), alt-odoo, oco-odoo, fw-bot, Anh Thao Pham (pta), svs-odoo, Samuel Degueldre, Alvaro Fuentes, Nils Hamerlinck, Brice bib Bartoletti, Adrien Widart, Ivan Yelizariev, jev, lejeune quentin, nie, IEL, fja-odoo, Mathieu Duckerts-Antoine, Pierre Paridans, jbw, shreya thakrar, Arnaud Joset, Jérôme Vanhaudenard, Kevin Baptiste, Pratima Gupta, Raf Geens, Arnaud Baes, roen-odoo, Dhruv Patel, Stanislas Sobieski, Hubert Van de Walle (huvw), Robin Heinz, Hardik Prajapati, Miquel Raïch, qmo-odoo, pedrambiria, Ahmad Khanalizadeh, asa-odoo, Jerome (jev), Geoffroy Larue, Jacky (trj), Laurent Desausoi (lade), rhe, pha-odoo, Deep Patel, Edoardo (pied), Sylvain Francis
WEBSITE
WEBSITEhttps://www.odoo.com/page/point-of-sale-shop
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - account
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (55)
XML IDNameModelTypeStatus
account_cashbox_line_view_tree account.cashbox.line.tree account.cashbox.line tree New
assets point_of_sale assets ir.ui.view qweb New
assets_backend hr assets ir.ui.view qweb Inherits web.assets_backend
assets_tests Point Of Sale Assets Tests ir.ui.view qweb Inherits web.assets_tests
closing_balance_confirm Confirming balance closing closing.balance.confirm.wizard form New
customer_facing_display_html customer_facing_display_html ir.ui.view qweb New
digest_digest_view_form digest.digest.view.form.inherit.sale.order digest.digest xpath Inherits digest.digest_digest_view_form
index POS Index ir.ui.view qweb New
pos_assets_backend POS UI Backend Assets ir.ui.view qweb Inherits web.assets_backend
pos_config_view_form pos.config.form.view pos.config form New
pos_payment_method_view_form pos.payment.method.form pos.payment.method form New
pos_payment_method_view_search pos.payment.search.view pos.payment.method search New
pos_payment_method_view_tree pos.payment.method.tree pos.payment.method tree New
product_pos_category_form_view pos.category.form pos.category form New
product_pos_category_tree_view pos.category.tree pos.category tree New
product_template_form_view product.template.form.inherit product.template xpath Inherits product.product_template_form_view
product_template_search_view_pos product.template.search.pos.form product.template filter Inherits product.product_template_search_view
product_uom_categ_form_view uom.category.form.inherit uom.category xpath Inherits uom.product_uom_categ_form_view
product_uom_categ_tree_view uom.category.tree.inherit uom.category xpath Inherits uom.product_uom_categ_tree_view
report_invoice report_invoice ir.ui.view qweb Inherits account.report_invoice
report_saledetails report_saledetails ir.ui.view qweb New
report_userlabel report_userlabel ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.point_of_sale res.config.settings xpath Inherits base.res_config_settings_view_form
view_account_bnk_stmt_cashbox account.bnk_stmt_cashbox.form account.bank.statement.cashbox xpath Inherits account.view_account_bnk_stmt_cashbox
view_account_bnk_stmt_cashbox_footer account.bnk_stmt_cashbox.form.close.modal account.bank.statement.cashbox xpath Inherits account.view_account_bnk_stmt_cashbox_footer
view_account_journal_pos_user_form account.journal.pos.user.form.inherit account.journal xpath Inherits account.view_account_journal_form
view_bank_statement_pos_session view.bank.statement.pos.session account.bank.statement xpath Inherits account.view_bank_statement_form
view_partner_pos_kanban res.partner.pos.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
view_partner_property_form res.partner.pos.form.inherit res.partner div Inherits base.view_partner_form
view_pos_category_kanban pos.category.kanban pos.category kanban New
view_pos_config_kanban pos.config.kanban.view pos.config kanban New
view_pos_config_search pos.config.search.view pos.config search New
view_pos_config_tree pos.config.tree.view pos.config tree New
view_pos_details_wizard pos.details.wizard.form pos.details.wizard form New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_kanban pos.order.kanban pos.order kanban New
view_pos_order_line pos.order.line.tree pos.order.line tree New
view_pos_order_line_form pos.order.line.form pos.order.line form New
view_pos_order_pivot pos.order.pivot pos.order pivot New
view_pos_order_search pos.order.search.view pos.order search New
view_pos_order_tree pos.order.tree pos.order tree New
view_pos_order_tree_all_sales_lines pos.order.line.all.sales.tree pos.order.line tree New
view_pos_order_tree_no_session_id pos.order.tree_no_session_id pos.order xpath Inherits point_of_sale.view_pos_order_tree
view_pos_payment pos.make.payment.form pos.make.payment form New
view_pos_payment_form pos.payment.form pos.payment form New
view_pos_payment_search pos.payment.search.view pos.payment search New
view_pos_payment_tree pos.payment.tree pos.payment tree New
view_pos_pos_form pos.order.form pos.order form New
view_pos_session_form pos.session.form.view pos.session form New
view_pos_session_kanban pos.session.kanban pos.session kanban New
view_pos_session_search pos.session.search.view pos.session search New
view_pos_session_tree pos.session.tree.view pos.session tree New
view_report_pos_order_graph report.pos.order.graph report.pos.order graph New
view_report_pos_order_pivot report.pos.order.pivot report.pos.order pivot New
view_report_pos_order_search report.pos.order.search report.pos.order search New
Models touched (35)

New fields (2)
  • account_id Many2one → account.account
    readonly=True related='journal_id.default_debit_account_id' args: 'account.account'
  • pos_session_id Many2one → pos.session
    copy=False string='Session' args: 'pos.session'
Public methods (2)
  • check_confirm_bank(self)
  • unlink(self)

New fields (2)
  • is_a_template Boolean
    default=False
  • pos_config_ids One2many → pos.config
    args: 'pos.config', 'default_cashbox_id'
Public methods (2)
  • default_get(self, fields)
    @api.model
  • set_default_cashbox(self)

New fields (1)
  • pos_statement_id Many2one → pos.order
    ondelete='cascade' string='POS statement' args: 'pos.order'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • generate_journals(self, acc_template_ref, company, journals_dict=None)
    @api.model

New fields (1)
  • pos_payment_method_ids One2many → pos.payment.method
    string='Point of Sale Payment Methods' args: 'pos.payment.method', 'cash_journal_id'
Public methods (0)

No public methods.

New fields (1)
  • pos_order_ids One2many → pos.order
    args: 'pos.order', 'account_move'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • get_real_tax_amount(self)
  • write(self, vals)

New fields (1)
  • type Selection
    selection_add=[('weight', 'Weighted Product'), ('price', 'Priced Product'), ('discount', 'Discounted Product'), ('client', 'Client'), ('cashier', 'Cashier')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • confirm_closing_balance(self)

New fields (2)
  • kpi_pos_total Boolean
    args: 'POS Sales'
  • kpi_pos_total_value Monetary
    compute='_compute_kpi_pos_total_value'
Public methods (1)
  • compute_kpis_actions(self, company, user)

New fields (5)
  • child_id One2many → pos.category
    string='Children Categories' args: 'pos.category', 'parent_id'
  • image_128 Image
    max_height=128 max_width=128 args: 'Image'
  • name Char
    required=True string='Category Name' translate=True
  • parent_id Many2one → pos.category
    index=True string='Parent Category' args: 'pos.category'
  • sequence Integer
    help='Gives the sequence order when displaying a list of product categories.'
Public methods (1)
  • name_get(self)

New fields (72)
  • active Boolean
    default=True
  • allowed_pricelist_ids Many2many → product.pricelist
    compute='_compute_allowed_pricelist_ids' help='This is a technical field used for the domain of pricelist_id.' string='Allowed Pricelists' args: 'product.pricelist'
  • amount_authorized_diff Float
    help='This field depicts the maximum difference allowed between the ending balance and the theoretical cash when closing a session, for non-POS managers. If this maximum is reached, the user will have an error message at the closing of his session saying that he needs to contact his manager.' args: 'Amount Authorized Difference'
  • available_pricelist_ids Many2many → product.pricelist
    default=_default_pricelist help='Make several pricelists available in the Point of Sale. You can also apply a pricelist to specific customers from their contact form (in Sales tab). To be valid, this pricelist must be listed here as an available pricelist. Otherwise the default pricelist will apply.' string='Available Pricelists' args: 'product.pricelist'
  • barcode_nomenclature_id Many2one → barcode.nomenclature
    default=<expr> help='Defines what kind of barcodes are available and how they are assigned to products, customers and cashiers.' required=True string='Barcode Nomenclature' args: 'barcode.nomenclature'
  • cash_control Boolean
    help='Check the amount of the cashbox at opening and closing.' string='Cash Control'
  • company_has_template Boolean
    compute='_compute_company_has_template' string='Company has chart of accounts'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    compute='_compute_currency' string='Currency' args: 'res.currency'
  • current_session_id Many2one → pos.session
    compute='_compute_current_session' string='Current Session' args: 'pos.session'
  • current_session_state Char
    compute='_compute_current_session'
  • current_user_id Many2one → res.users
    compute='_compute_current_session_user' string='Current Session Responsible' args: 'res.users'
  • customer_facing_display_html Html
    compute=_compute_customer_html string='Customer facing display content' translate=True
  • default_cashbox_id Many2one → account.bank.statement.cashbox
    string='Default Balance' args: 'account.bank.statement.cashbox'
  • default_fiscal_position_id Many2one → account.fiscal.position
    string='Default Fiscal Position' args: 'account.fiscal.position'
  • fiscal_position_ids Many2many → account.fiscal.position
    help='This is useful for restaurants with onsite and take-away services that imply specific tax rates.' string='Fiscal Positions' args: 'account.fiscal.position'
  • group_pos_manager_id Many2one → res.groups
    default=_get_group_pos_manager help='This field is there to pass the id of the pos manager group to the point of sale client.' string='Point of Sale Manager Group' args: 'res.groups'
  • group_pos_user_id Many2one → res.groups
    default=_get_group_pos_user help='This field is there to pass the id of the pos user group to the point of sale client.' string='Point of Sale User Group' args: 'res.groups'
  • iface_available_categ_ids Many2many → pos.category
    help='The point of sale will only display products which are within one of the selected category trees. If no category is specified, all available products will be shown' string='Available PoS Product Categories' args: 'pos.category'
  • iface_big_scrollbars Boolean
    help='For imprecise industrial touchscreens.' args: 'Large Scrollbars'
  • iface_cashdrawer Boolean
    help='Automatically open the cashdrawer.' string='Cashdrawer'
  • iface_customer_facing_display Boolean
    help='Show checkout to customers with a remotely-connected screen.' string='Customer Facing Display'
  • iface_display_categ_images Boolean
    help='The product categories will be displayed with pictures.' string='Display Category Pictures'
  • iface_electronic_scale Boolean
    help='Enables Electronic Scale integration.' string='Electronic Scale'
  • iface_precompute_cash Boolean
    help='The payment input will behave similarily to bank payment input, and will be prefilled with the exact due amount.' string='Prefill Cash Payment'
  • iface_print_auto Boolean
    default=False help='The receipt will automatically be printed at the end of each order.' string='Automatic Receipt Printing'
  • iface_print_skip_screen Boolean
    default=True help='The receipt screen will be skipped if the receipt can be printed automatically.' string='Skip Preview Screen'
  • iface_print_via_proxy Boolean
    help='Bypass browser printing and prints via the hardware proxy.' string='Print via Proxy'
  • iface_scan_via_proxy Boolean
    help='Enable barcode scanning with a remotely connected barcode scanner.' string='Scan via Proxy'
  • iface_start_categ_id Many2one → pos.category
    help='The point of sale will display this product category by default. If no category is specified, all available products will be shown.' string='Initial Category' args: 'pos.category'
  • iface_tax_included Selection
    default='subtotal' required=True string='Tax Display' args: [('subtotal', 'Tax-Excluded Price'), ('total', 'Tax-Included Price')]
  • iface_tipproduct Boolean
    string='Product tips'
  • iface_vkeyboard Boolean
    help='Don’t turn this option on if you take orders on smartphones or tablets. \n Such devices already benefit from a native keyboard.' string='Virtual KeyBoard'
  • invoice_journal_id Many2one → account.journal
    default=_default_invoice_journal domain=[('type', '=', 'sale')] help='Accounting journal used to create invoices.' string='Invoice Journal' args: 'account.journal'
  • is_header_or_footer Boolean
    args: 'Header & Footer'
  • is_installed_account_accountant Boolean
    compute='_compute_is_installed_account_accountant' string='Is the Full Accounting Installed'
  • is_posbox Boolean
    args: 'PosBox'
  • journal_id Many2one → account.journal
    default=_default_sale_journal domain=[('type', '=', 'sale')] help='Accounting journal used to post sales entries.' ondelete='restrict' string='Sales Journal' args: 'account.journal'
  • last_session_closing_cash Float
    compute='_compute_last_session'
  • last_session_closing_cashbox Many2one → account.bank.statement.cashbox
    compute='_compute_last_session' args: 'account.bank.statement.cashbox'
  • last_session_closing_date Date
    compute='_compute_last_session'
  • limit_categories Boolean
    args: 'Restrict Available Product Categories'
  • module_account Boolean
    help='Enables invoice generation from the Point of Sale.' string='Invoicing'
  • module_pos_discount Boolean
    args: 'Global Discounts'
  • module_pos_hr Boolean
    help='Show employee login screen'
  • module_pos_loyalty Boolean
    args: 'Loyalty Program'
  • module_pos_mercury Boolean
    string='Integrated Card Payments'
  • module_pos_reprint Boolean
    string='Reprint Receipt'
  • module_pos_restaurant Boolean
    args: 'Is a Bar/Restaurant'
  • name Char
    help='An internal identification of the point of sale.' index=True required=True string='Point of Sale'
  • other_devices Boolean
    help='Connect devices to your PoS without an IoT Box.' string='Other Devices'
  • payment_method_ids Many2many → pos.payment.method
    default=<expr> string='Payment Methods' args: 'pos.payment.method'
  • picking_type_id Many2one → stock.picking.type
    default=_default_picking_type_id domain="[('code', '=', 'outgoing'), ('warehouse_id.company_id', '=', company_id)]" ondelete='restrict' string='Operation Type' args: 'stock.picking.type'
  • pos_session_duration Char
    compute='_compute_current_session_user'
  • pos_session_state Char
    compute='_compute_current_session_user'
  • pos_session_username Char
    compute='_compute_current_session_user'
  • pricelist_id Many2one → product.pricelist
    default=_default_pricelist help='The pricelist used if no customer is selected or if the customer has no Sale Pricelist configured.' required=True string='Default Pricelist' args: 'product.pricelist'
  • proxy_ip Char
    help='The hostname or ip address of the hardware proxy, Will be autodetected if left empty.' size=45 string='IP Address'
  • receipt_footer Text
    help='A short text that will be inserted as a footer in the printed receipt.' string='Receipt Footer'
  • receipt_header Text
    help='A short text that will be inserted as a header in the printed receipt.' string='Receipt Header'
  • restrict_price_control Boolean
    help='Only users with Manager access rights for PoS app can modify the product prices on orders.' string='Restrict Price Modifications to Managers'
  • selectable_categ_ids Many2many → pos.category
    compute='_compute_selectable_categories' args: 'pos.category'
  • sequence_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders.' ondelete='restrict' readonly=True string='Order IDs Sequence' args: 'ir.sequence'
  • sequence_line_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders lines.' readonly=True string='Order Line IDs Sequence' args: 'ir.sequence'
  • session_ids One2many → pos.session
    string='Sessions' args: 'pos.session', 'config_id'
  • start_category Boolean
    default=False args: 'Set Start Category'
  • tax_regime Boolean
    args: 'Tax Regime'
  • tax_regime_selection Boolean
    args: 'Tax Regime Selection value'
  • tip_product_id Many2one → product.product
    help='This product is used as reference on customer receipts.' string='Tip Product' args: 'product.product'
  • use_existing_lots Boolean
    readonly=False related='picking_type_id.use_existing_lots'
  • use_pricelist Boolean
    args: 'Use a pricelist.'
  • uuid Char
    copy=False default=<expr> help='A globally unique identifier for this pos configuration, used to prevent conflicts in client-generated data.' readonly=True
Public methods (11)
  • assign_payment_journals(self, companies=False)
    @api.model
  • create(self, values)
    @api.model
  • execute(self)
  • generate_pos_journal(self, companies=False)
    @api.model
  • name_get(self)
  • open_existing_session_cb(self)
    close session button access session form to validate entries
  • open_session_cb(self)
    new session button create one if none exist access cash control interface if enabled or start a session
  • open_ui(self)
    Open the pos interface with config_id as an extra argument. In vanilla PoS each user can only have one active session, therefore it was not needed to pass the config_id on opening a session. It is also possible to login to sessions created by other users. :returns: dict
  • post_install_pos_localisation(self)
    @api.model
  • unlink(self)
  • write(self, vals)

New fields (3)
  • end_date Datetime
    default=fields.Datetime.now required=True
  • pos_config_ids Many2many → pos.config
    default=<expr> args: 'pos.config', 'pos_detail_configs'
  • start_date Datetime
    default=_default_start_date required=True
Public methods (1)
  • generate_report(self)

New fields (5)
  • amount Float
    default=_default_amount digits=0 required=True
  • config_id Many2one → pos.config
    default=_default_config required=True string='Point of Sale Configuration' args: 'pos.config'
  • payment_date Datetime
    default=<expr> required=True string='Payment Date'
  • payment_method_id Many2one → pos.payment.method
    default=_default_payment_method required=True string='Payment Method' args: 'pos.payment.method'
  • payment_name Char
    string='Payment Reference'
Public methods (2)
  • check(self)
    Check the order: if the order is not paid: continue payment, if the order is paid print ticket.
  • launch_payment(self)

New fields (0)

No new fields.

Public methods (1)
  • open_statement(self)

New fields (31)
  • account_move Many2one → account.move
    copy=False readonly=True string='Invoice' args: 'account.move'
  • amount_paid Float
    digits=0 readonly=True required=True states={'draft': [('readonly', False)]} string='Paid'
  • amount_return Float
    digits=0 readonly=True required=True string='Returned'
  • amount_tax Float
    digits=0 readonly=True required=True string='Taxes'
  • amount_total Float
    digits=0 readonly=True required=True string='Total'
  • company_id Many2one → res.company
    readonly=True required=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=False related='session_id.config_id' string='Point of Sale' args: 'pos.config'
  • currency_id Many2one → res.currency
    related='config_id.currency_id' string='Currency' args: 'res.currency'
  • currency_rate Float
    compute='_compute_currency_rate' compute_sudo=True digits=0 help='The rate of the currency to the currency of rate 1 applicable at the date of the order' readonly=True store=True args: 'Currency Rate'
  • date_order Datetime
    default=fields.Datetime.now index=True readonly=True string='Date'
  • fiscal_position_id Many2one → account.fiscal.position
    comodel_name='account.fiscal.position' readonly=True states={'draft': [('readonly', False)]} string='Fiscal Position'
  • invoice_group Boolean
    readonly=False related='config_id.module_account'
  • is_invoiced Boolean
    compute='_compute_is_invoiced' args: 'Is Invoiced'
  • lines One2many → pos.order.line
    copy=True readonly=True states={'draft': [('readonly', False)]} string='Order Lines' args: 'pos.order.line', 'order_id'
  • location_id Many2one → stock.location
    comodel_name='stock.location' readonly=True related='picking_id.location_id' store=True string='Location'
  • name Char
    copy=False default='/' readonly=True required=True string='Order Ref'
  • nb_print Integer
    copy=False default=0 readonly=True string='Number of Print'
  • note Text
    string='Internal Notes'
  • partner_id Many2one → res.partner
    change_default=True index=True states={'draft': [('readonly', False)], 'paid': [('readonly', False)]} string='Customer' args: 'res.partner'
  • payment_ids One2many → pos.payment
    readonly=True string='Payments' args: 'pos.payment', 'pos_order_id'
  • picking_id Many2one → stock.picking
    copy=False readonly=True string='Picking' args: 'stock.picking'
  • picking_type_id Many2one → stock.picking.type
    readonly=False related='session_id.config_id.picking_type_id' string='Operation Type' args: 'stock.picking.type'
  • pos_reference Char
    copy=False readonly=True string='Receipt Number'
  • pricelist_id Many2one → product.pricelist
    readonly=True required=True states={'draft': [('readonly', False)]} string='Pricelist' args: 'product.pricelist'
  • sale_journal Many2one → account.journal
    ondelete='restrict' readonly=True related='session_id.config_id.journal_id' store=True string='Sales Journal' args: 'account.journal'
  • sequence_number Integer
    default=1 help='A session-unique sequence number for the order' string='Sequence Number'
  • session_id Many2one → pos.session
    domain="[('state', '=', 'opened')]" index=True readonly=True required=True states={'draft': [('readonly', False)]} string='Session' args: 'pos.session'
  • session_move_id Many2one → account.move
    copy=False readonly=True related='session_id.move_id' string='Session Journal Entry' args: 'account.move'
  • state Selection
    copy=False default='draft' readonly=True args: [('draft', 'New'), ('cancel', 'Cancelled'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced')], 'Status'
  • to_invoice Boolean
    args: 'To invoice'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> help='Person who uses the cash register. It can be a reliever, a student or an interim employee.' states={'done': [('readonly', True)], 'invoiced': [('readonly', True)]} string='Responsible'
Public methods (14)
  • action_pos_order_cancel(self)
  • action_pos_order_invoice(self)
  • action_pos_order_paid(self)
  • action_receipt_to_customer(self, name, client, ticket, order_ids=False)
    @api.model
  • action_view_invoice(self)
  • add_payment(self, data)
    Create a new payment for the order
  • create(self, values)
    @api.model
  • create_from_ui(self, orders, draft=False)
    @api.model
    Create and update Orders from the frontend PoS application. Create new orders and update orders that are in draft status. If an order already exists with a status diferent from 'draft'it will be discareded, otherwise it will be saved to the database. If saved with 'draft' status the order can be overwritten later by this function. :param orders: dictionary with the orders to be created. :type orders: dict. :param draft: Indicate if the orders are ment to be finalised or temporarily saved. :type draft: bool. :Returns: list -- list of db-ids for the created and updated orders.
  • create_picking(self)
    Create a picking for each order and validate it.
  • refund(self)
    Create a copy of order for refund order
  • remove_from_ui(self, server_ids)
    @api.model
    Remove orders from the frontend PoS application Remove orders from the server by id. :param server_ids: list of the id's of orders to remove from the server. :type server_ids: list. :returns: list -- list of db-ids for the removed orders.
  • set_pack_operation_lot(self, picking=None)
    Set Serial/Lot number in pack operations to mark the pack operation done.
  • unlink(self)
  • write(self, vals)

New fields (15)
  • company_id Many2one → res.company
    related='order_id.company_id' store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='order_id.currency_id' args: 'res.currency'
  • discount Float
    default=0.0 digits=0 string='Discount (%)'
  • name Char
    copy=False required=True string='Line No'
  • notice Char
    string='Discount Notice'
  • order_id Many2one → pos.order
    index=True ondelete='cascade' required=True string='Order Ref' args: 'pos.order'
  • pack_lot_ids One2many → pos.pack.operation.lot
    string='Lot/serial Number' args: 'pos.pack.operation.lot', 'pos_order_line_id'
  • price_subtotal Float
    digits=0 readonly=True required=True string='Subtotal w/o Tax'
  • price_subtotal_incl Float
    digits=0 readonly=True required=True string='Subtotal'
  • price_unit Float
    digits=0 string='Unit Price'
  • product_id Many2one → product.product
    change_default=True domain=[('sale_ok', '=', True)] required=True string='Product' args: 'product.product'
  • product_uom_id Many2one → uom.uom
    related='product_id.uom_id' string='Product UoM' args: 'uom.uom'
  • qty Float
    default=1 digits='Product Unit of Measure' args: 'Quantity'
  • tax_ids Many2many → account.tax
    readonly=True string='Taxes' args: 'account.tax'
  • tax_ids_after_fiscal_position Many2many → account.tax
    compute='_get_tax_ids_after_fiscal_position' string='Taxes to Apply' args: 'account.tax'
Public methods (2)
  • create(self, values)
    @api.model
  • write(self, values)

New fields (4)
  • lot_name Char
    args: 'Lot Name'
  • order_id Many2one → pos.order
    readonly=False related='pos_order_line_id.order_id' args: 'pos.order'
  • pos_order_line_id Many2one → pos.order.line
    auto_join=True args: 'pos.order.line'
  • product_id Many2one → product.product
    readonly=False related='pos_order_line_id.product_id' args: 'product.product'
Public methods (0)

No public methods.

New fields (12)
  • amount Monetary
    currency_field='currency_id' help='Total amount of the payment.' readonly=True required=True string='Amount'
  • card_type Char
    args: 'Type of card used'
  • company_id Many2one → res.company
    related='pos_order_id.company_id' string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    related='pos_order_id.currency_id' string='Currency' args: 'res.currency'
  • currency_rate Float
    help='Conversion rate from company currency to order currency.' related='pos_order_id.currency_rate' string='Conversion Rate'
  • name Char
    readonly=True string='Label'
  • partner_id Many2one → res.partner
    related='pos_order_id.partner_id' string='Customer' args: 'res.partner'
  • payment_date Datetime
    default=<expr> readonly=True required=True string='Date'
  • payment_method_id Many2one → pos.payment.method
    required=True string='Payment Method' args: 'pos.payment.method'
  • pos_order_id Many2one → pos.order
    required=True string='Order' args: 'pos.order'
  • session_id Many2one → pos.session
    related='pos_order_id.session_id' store=True string='Session' args: 'pos.session'
  • transaction_id Char
    args: 'Payment Transaction ID'
Public methods (1)
  • name_get(self)
    @api.model

New fields (10)
  • cash_journal_id Many2one → account.journal
    domain=[('type', '=', 'cash')] help='The payment method is of type cash. A cash statement will be automatically generated.' ondelete='restrict' string='Cash Journal' args: 'account.journal'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • config_ids Many2many → pos.config
    string='Point of Sale Configurations' args: 'pos.config'
  • hide_use_payment_terminal Boolean
    compute='_compute_hide_use_payment_terminal' help='Technical field which is used to hide use_payment_terminal when no payment interfaces are installed.'
  • is_cash_count Boolean
    string='Cash'
  • name Char
    required=True string='Payment Method' translate=True
  • open_session_ids Many2many → pos.session
    compute='_compute_open_session_ids' help='Open PoS sessions that are using this payment method.' string='Pos Sessions' args: 'pos.session'
  • receivable_account_id Many2one → account.account
    default=<expr> domain=[('reconcile', '=', True), ('user_type_id.type', '=', 'receivable')] help='Account used as counterpart of the income account in the accounting entry representing the pos sales.' ondelete='restrict' required=True string='Intermediary Account' args: 'account.account'
  • split_transactions Boolean
    default=False help='If ticked, each payment will generate a separated journal item. Ticking that option will slow the closing of the PoS.' string='Split Transactions'
  • use_payment_terminal Selection
    help='Record payments with a terminal on this journal.' selection=<expr> string='Use a Payment Terminal'
Public methods (1)
  • write(self, vals)

New fields (27)
  • cash_control Boolean
    compute='_compute_cash_all' compute_sudo=True string='Has Cash Control'
  • cash_journal_id Many2one → account.journal
    compute='_compute_cash_all' store=True string='Cash Journal' args: 'account.journal'
  • cash_register_balance_end Monetary
    compute='_compute_cash_balance' help='Sum of opening balance and transactions.' readonly=True string='Theoretical Closing Balance'
  • cash_register_balance_end_real Monetary
    help='Total of closing cash control lines.' readonly=True related='cash_register_id.balance_end_real' string='Ending Balance'
  • cash_register_balance_start Monetary
    help='Total of opening cash control lines.' readonly=True related='cash_register_id.balance_start' string='Starting Balance'
  • cash_register_difference Monetary
    compute='_compute_cash_balance' help='Difference between the theoretical closing balance and the real closing balance.' readonly=True string='Difference'
  • cash_register_id Many2one → account.bank.statement
    compute='_compute_cash_all' store=True string='Cash Register' args: 'account.bank.statement'
  • cash_register_total_entry_encoding Monetary
    compute='_compute_cash_balance' help='Total of all paid sales orders' readonly=True string='Total Cash Transaction'
  • company_id Many2one → res.company
    readonly=True related='config_id.company_id' string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    help='The physical point of sale you will use.' index=True required=True string='Point of Sale' args: 'pos.config'
  • currency_id Many2one → res.currency
    readonly=False related='config_id.currency_id' string='Currency' args: 'res.currency'
  • is_in_company_currency Boolean
    compute='_compute_is_in_company_currency' args: 'Is Using Company Currency'
  • login_number Integer
    default=0 help='A sequence number that is incremented each time a user resumes the pos session' string='Login Sequence Number'
  • move_id Many2one → account.move
    string='Journal Entry' args: 'account.move'
  • name Char
    default='/' readonly=True required=True string='Session ID'
  • order_count Integer
    compute='_compute_order_count'
  • order_ids One2many → pos.order
    string='Orders' args: 'pos.order', 'session_id'
  • payment_method_ids Many2many → pos.payment.method
    related='config_id.payment_method_ids' string='Payment Methods' args: 'pos.payment.method'
  • picking_count Integer
    compute='_compute_picking_count'
  • rescue Boolean
    copy=False help='Auto-generated session for orphan orders, ignored in constraints' readonly=True string='Recovery Session'
  • sequence_number Integer
    default=1 help='A sequence number that is incremented with each order' string='Order Sequence Number'
  • start_at Datetime
    readonly=True string='Opening Date'
  • state Selection
    copy=False default='new_session' index=True readonly=True required=True string='Status' args: POS_SESSION_STATE
  • statement_ids One2many → account.bank.statement
    readonly=True string='Cash Statements' args: 'account.bank.statement', 'pos_session_id'
  • stop_at Datetime
    copy=False readonly=True string='Closing Date'
  • total_payments_amount Float
    compute='_compute_total_payments_amount' string='Total Payments Amount'
  • user_id Many2one → res.users
    default=<expr> index=True ondelete='restrict' readonly=True required=True states={'opening_control': [('readonly', False)]} string='Responsible' args: 'res.users'
Public methods (13)
  • action_pos_session_close(self)
  • action_pos_session_closing_control(self)
  • action_pos_session_open(self)
  • action_pos_session_validate(self)
  • action_show_payments_list(self)
  • action_stock_picking(self)
  • action_view_order(self)
  • create(self, values)
    @api.model
  • login(self)
  • open_cashbox_pos(self)
  • open_frontend_cb(self)
    Open the pos interface with config_id as an extra argument. In vanilla PoS each user can only have one active session, therefore it was not needed to pass the config_id on opening a session. It is also possible to login to sessions created by other users. :returns: dict
  • show_journal_items(self)
  • unlink(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • unlink(self)

New fields (3)
  • available_in_pos Boolean
    default=False help='Check if you want this product to appear in the Point of Sale.' string='Available in POS'
  • pos_categ_id Many2one → pos.category
    help='Category used in the Point of Sale.' string='Point of Sale Category' args: 'pos.category'
  • to_weight Boolean
    help='Check if the product should be weighted using the hardware scale integration.' string='To Weigh With Scale'
Public methods (1)
  • unlink(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_sale_details(self, date_start=False, date_stop=False, config_ids=False, session_ids=False)
    @api.model
    Serialise the orders of the requested time period, configs and sessions. :param date_start: The dateTime to start, default today 00:00:00. :type date_start: str. :param date_stop: The dateTime to stop, default date_start + 23:59:59. :type date_stop: str. :param config_ids: Pos Config id's to include. :type config_ids: list of numbers. :param session_ids: Pos Config id's to include. :type session_ids: list of numbers. :returns: dict -- Serialised sales.

New fields (23)
  • average_price Float
    group_operator='avg' readonly=True string='Average Price'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=True string='Point of Sale' args: 'pos.config'
  • date Datetime
    readonly=True string='Order Date'
  • delay_validation Integer
    string='Delay Validation'
  • invoiced Boolean
    readonly=True
  • journal_id Many2one → account.journal
    string='Journal' args: 'account.journal'
  • location_id Many2one → stock.location
    readonly=True string='Location' args: 'stock.location'
  • nbr_lines Integer
    readonly=True string='Sale Line Count'
  • order_id Many2one → pos.order
    readonly=True string='Order' args: 'pos.order'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • pos_categ_id Many2one → pos.category
    readonly=True string='PoS Category' args: 'pos.category'
  • price_sub_total Float
    readonly=True string='Subtotal w/o discount'
  • price_total Float
    readonly=True string='Total Price'
  • pricelist_id Many2one → product.pricelist
    readonly=True string='Pricelist' args: 'product.pricelist'
  • product_categ_id Many2one → product.category
    readonly=True string='Product Category' args: 'product.category'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Integer
    readonly=True string='Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True string='Product Template' args: 'product.template'
  • session_id Many2one → pos.session
    readonly=True string='Session' args: 'pos.session'
  • state Selection
    string='Status' args: [('draft', 'New'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced'), ('cancel', 'Cancelled')]
  • total_discount Float
    readonly=True string='Total Discount'
  • user_id Many2one → res.users
    readonly=True string='User' args: 'res.users'
Public methods (1)
  • init(self)

New fields (0)

No new fields.

Public methods (1)
  • validate_period_lock_date(self)
    @api.constrains('period_lock_date', 'fiscalyear_lock_date')
    This constrains makes it impossible to change the period lock date if some open POS session exists into it. Without that, these POS sessions would trigger an error message saying that the period has been locked when trying to close them.

New fields (3)
  • module_pos_adyen Boolean
    help='The transactions are processed by Adyen. Set your Adyen credentials on the related payment method.' string='Adyen Payment Terminal'
  • module_pos_mercury Boolean
    help='The transactions are processed by Vantiv. Set your Vantiv credentials on the related payment method.' string='Vantiv Payment Terminal'
  • sale_tax_id Many2one → account.tax
    readonly=False related='company_id.account_sale_tax_id' string='Default Sale Tax' args: 'account.tax'
Public methods (0)

No public methods.

New fields (3)
  • barcode Char
    copy=False help='Use a barcode to identify this contact from the Point of Sale.'
  • pos_order_count Integer
    compute='_compute_pos_order' groups='point_of_sale.group_pos_user' help='The number of point of sales orders related to this customer'
  • pos_order_ids One2many → pos.order
    readonly=True args: 'pos.order', 'partner_id'
Public methods (2)
  • create_from_ui(self, partner)
    @api.model
    create or modify a partner from the point of sale ui. partner contains the partner's fields.
  • unlink(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • pos_type_id Many2one → stock.picking.type
    string='Point of Sale Operation Type' args: 'stock.picking.type'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    help='Check if you want to group products of this category in point of sale orders' string='Group Products in POS'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    readonly=False related='category_id.is_pos_groupable'
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/point_of_sale
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYPoint Of Sale
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, Josse Colpaert, Denis Ledoux, Christophe Simonis, Joren Van Onder, Goffin Simon, Mohammed Shekha, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, qdp-odoo, Géry Debongnie, ged-odoo, Jeremy Kersten, Sylvain LE GAL, GitHub, Lucas Perais (lpe), Damien Bouvy, Yannick Tivisse, Alexandre Kühn, qsm-odoo, Nicolas Seinlet, Pierre Masereel, Adrien Dieudonne, RomainLibert, Christophe Monniez, Jorge Pinna Puissant, Gert Pellin - GPE, Nans Lefebvre, Gert Pellin, Alexandre Kühn, jev-odoo, Adrian Torres, mreficent, XavierDo, Antoine Prieels, Aurélien Warnon, Xavier-Do, jerome hanke (jhk), Victor Feyens, Andrea Grazioso (agr-odoo), William Henrotin, Joseph Caburnay, Khoi Nguyen, fw-bot, Anh Thao Pham (pta), Kinjal Mehta, Quentin Smetz (qsm), Carlos Lopez, lul-odoo, Nils Hamerlinck, Brice bib Bartoletti, Adrien Widart, Ivan Yelizariev, jev, lejeune quentin
WEBSITE
WEBSITEhttps://www.odoo.com/page/point-of-sale-shop
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:00
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - barcodes
    - account
    - analytic
    - portal
    - http_routing
    - digest
    - web_editor
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (51)
XML IDNameModelTypeStatus
FieldTextHtml FieldTextHtml ir.ui.view qweb New
account_cashbox_line_view_tree account.cashbox.line.tree account.cashbox.line tree New
assets point_of_sale assets ir.ui.view qweb New
assets_backend hr assets ir.ui.view qweb Inherits web.assets_backend
customer_facing_display_html customer_facing_display_html ir.ui.view qweb New
customer_facing_display_snippets customer_facing_display_snippets ir.ui.view qweb New
digest_digest_view_form digest.digest.view.form.inherit.sale.order digest.digest xpath Inherits digest.digest_digest_view_form
extra_head extra_head ir.ui.view qweb New
index POS Index ir.ui.view qweb New
pos_assets_backend POS UI Backend Assets ir.ui.view qweb Inherits web.assets_backend
pos_config_view_form pos.config.form.view pos.config form New
pos_editor_assets pos_editor_assets ir.ui.view qweb Inherits web_editor.assets_editor
pos_editor_fieldtexthtml_assets pos_editor_fieldtexthtml_assets ir.ui.view qweb Inherits web.assets_backend
product_pos_category_form_view pos.category.form pos.category form New
product_pos_category_tree_view pos.category.tree pos.category tree New
product_template_form_view product.template.form.inherit product.template xpath Inherits stock.view_template_property_form
product_template_search_view_pos product.template.search.pos.form product.template filter Inherits product.product_template_search_view
product_uom_categ_form_view uom.category.form.inherit uom.category xpath Inherits uom.product_uom_categ_form_view
report_invoice report_invoice ir.ui.view qweb Inherits account.report_invoice
report_saledetails report_saledetails ir.ui.view qweb New
report_statement report_statement ir.ui.view qweb New
report_userlabel report_userlabel ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.point_of_sale res.config.settings xpath Inherits base.res_config_settings_view_form
res_users_view_form res.users.form.view res.users notebook Inherits base.view_users_form
view_account_bank_journal_form_inherited_pos account.bank.journal.form.inherit.pos account.journal xpath Inherits account.view_account_bank_journal_form
view_account_journal_pos_user_form account.journal.pos.user.form.inherit account.journal xpath Inherits account.view_account_journal_form
view_account_journal_search_inherit_point_of_sale account.journal.filter account.journal xpath Inherits account.view_account_journal_search
view_partner_pos_kanban res.partner.pos.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
view_partner_property_form res.partner.pos.form.inherit res.partner button Inherits base.view_partner_form
view_pos_category_kanban pos.category.kanban pos.category kanban New
view_pos_config_kanban pos.config.kanban.view pos.config kanban New
view_pos_config_search pos.config.search.view pos.config search New
view_pos_config_tree pos.config.tree.view pos.config tree New
view_pos_details_wizard pos.details.wizard.form pos.details.wizard form New
view_pos_open_statement pos.open.statement.form pos.open.statement form New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_kanban pos.order.kanban pos.order kanban New
view_pos_order_line pos.order.line.tree pos.order.line tree New
view_pos_order_line_form pos.order.line.form pos.order.line form New
view_pos_order_search pos.order.search.view pos.order search New
view_pos_order_tree pos.order.tree pos.order tree New
view_pos_order_tree_all_sales_lines pos.order.line.all.sales.tree pos.order.line tree New
view_pos_payment pos.make.payment.form pos.make.payment form New
view_pos_pos_form pos.order.form pos.order form New
view_pos_session_form pos.session.form.view pos.session form New
view_pos_session_kanban pos.session.kanban pos.session kanban New
view_pos_session_search pos.session.search.view pos.session search New
view_pos_session_tree pos.session.tree.view pos.session tree New
view_report_pos_order_graph report.pos.order.graph report.pos.order graph New
view_report_pos_order_pivot report.pos.order.pivot report.pos.order pivot New
view_report_pos_order_search report.pos.order.search report.pos.order search New
Models touched (28)

New fields (2)
  • account_id Many2one → account.account
    readonly=True related='journal_id.default_debit_account_id' args: 'account.account'
  • pos_session_id Many2one → pos.session
    copy=False string='Session' args: 'pos.session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (1)
  • pos_statement_id Many2one → pos.order
    ondelete='cascade' string='POS statement' args: 'pos.order'
Public methods (0)

No public methods.

New fields (1)
  • default_pos_id Many2one → pos.config
    string='This cashbox line is used by default when opening or closing a balance for this point of sale' args: 'pos.config'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • amount_authorized_diff Float
    help='This field depicts the maximum difference allowed between the ending balance and the theoretical cash when closing a session, for non-POS managers. If this maximum is reached, the user will have an error message at the closing of his session saying that he needs to contact his manager.' args: 'Amount Authorized Difference'
  • journal_user Boolean
    help='Check this box if this journal define a payment method that can be used in a point of sale.' args: 'Use in Point of Sale'
Public methods (1)
  • onchange_type(self)
    @api.onchange('type')

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)
    @api.multi

New fields (1)
  • type Selection
    selection_add=[('weight', 'Weighted Product'), ('price', 'Priced Product'), ('discount', 'Discounted Product'), ('client', 'Client'), ('cashier', 'Cashier')]
Public methods (0)

No public methods.

New fields (2)
  • kpi_pos_total Boolean
    args: 'POS Sales'
  • kpi_pos_total_value Monetary
    compute='_compute_kpi_pos_total_value'
Public methods (1)
  • compute_kpis_actions(self, company, user)

New fields (7)
  • child_id One2many → pos.category
    string='Children Categories' args: 'pos.category', 'parent_id'
  • image Binary
    attachment=True help='This field holds the image used as image for the cateogry, limited to 1024x1024px.'
  • image_medium Binary
    attachment=True help='Medium-sized image of the category. It is automatically resized as a 128x128px image, with aspect ratio preserved. Use this field in form views or some kanban views.' string='Medium-sized image'
  • image_small Binary
    attachment=True help='Small-sized image of the category. It is automatically resized as a 64x64px image, with aspect ratio preserved. Use this field anywhere a small image is required.' string='Small-sized image'
  • name Char
    required=True translate=True
  • parent_id Many2one → pos.category
    index=True string='Parent Category' args: 'pos.category'
  • sequence Integer
    help='Gives the sequence order when displaying a list of product categories.'
Public methods (3)
  • create(self, vals)
    @api.model
  • name_get(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (66)
  • active Boolean
    default=True
  • available_pricelist_ids Many2many → product.pricelist
    default=_default_pricelist help='Make several pricelists available in the Point of Sale. You can also apply a pricelist to specific customers from their contact form (in Sales tab). To be valid, this pricelist must be listed here as an available pricelist. Otherwise the default pricelist will apply.' string='Available Pricelists' args: 'product.pricelist'
  • barcode_nomenclature_id Many2one → barcode.nomenclature
    help='Defines what kind of barcodes are available and how they are assigned to products, customers and cashiers.' string='Barcode Nomenclature' args: 'barcode.nomenclature'
  • barcode_scanner Boolean
    args: 'Barcode Scanner'
  • cash_control Boolean
    help='Check the amount of the cashbox at opening and closing.' string='Cash Control'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    compute='_compute_currency' string='Currency' args: 'res.currency'
  • current_session_id Many2one → pos.session
    compute='_compute_current_session' string='Current Session' args: 'pos.session'
  • current_session_state Char
    compute='_compute_current_session'
  • customer_facing_display_html Html
    default=_compute_default_customer_html string='Customer facing display content' translate=True
  • default_cashbox_lines_ids One2many → account.cashbox.line
    string='Default Balance' args: 'account.cashbox.line', 'default_pos_id'
  • default_fiscal_position_id Many2one → account.fiscal.position
    string='Default Fiscal Position' args: 'account.fiscal.position'
  • fiscal_position_ids Many2many → account.fiscal.position
    help='This is useful for restaurants with onsite and take-away services that imply specific tax rates.' string='Fiscal Positions' args: 'account.fiscal.position'
  • group_by Boolean
    default=True help='Check this if you want to group the Journal Items by Product while closing a Session.' string='Group Journal Items'
  • group_pos_manager_id Many2one → res.groups
    default=_get_group_pos_manager help='This field is there to pass the id of the pos manager group to the point of sale client.' string='Point of Sale Manager Group' args: 'res.groups'
  • group_pos_user_id Many2one → res.groups
    default=_get_group_pos_user help='This field is there to pass the id of the pos user group to the point of sale client.' string='Point of Sale User Group' args: 'res.groups'
  • iface_big_scrollbars Boolean
    help='For imprecise industrial touchscreens.' args: 'Large Scrollbars'
  • iface_cashdrawer Boolean
    help='Automatically open the cashdrawer.' string='Cashdrawer'
  • iface_customer_facing_display Boolean
    help='Show checkout to customers with a remotely-connected screen.' string='Customer Facing Display'
  • iface_display_categ_images Boolean
    help='The product categories will be displayed with pictures.' string='Display Category Pictures'
  • iface_electronic_scale Boolean
    help='Enables Electronic Scale integration.' string='Electronic Scale'
  • iface_payment_terminal Boolean
    help='Enables Payment Terminal integration.' string='Payment Terminal'
  • iface_precompute_cash Boolean
    help='The payment input will behave similarily to bank payment input, and will be prefilled with the exact due amount.' string='Prefill Cash Payment'
  • iface_print_auto Boolean
    default=False help='The receipt will automatically be printed at the end of each order.' string='Automatic Receipt Printing'
  • iface_print_skip_screen Boolean
    default=True help='The receipt screen will be skipped if the receipt can be printed automatically.' string='Skip Preview Screen'
  • iface_print_via_proxy Boolean
    help='Bypass browser printing and prints via the hardware proxy.' string='Print via Proxy'
  • iface_scan_via_proxy Boolean
    help='Enable barcode scanning with a remotely connected barcode scanner.' string='Scan via Proxy'
  • iface_start_categ_id Many2one → pos.category
    help='The point of sale will display this product category by default. If no category is specified, all available products will be shown.' string='Initial Category' args: 'pos.category'
  • iface_tax_included Selection
    default='subtotal' required=True string='Tax Display' args: [('subtotal', 'Tax-Excluded Price'), ('total', 'Tax-Included Price')]
  • iface_tipproduct Boolean
    string='Product tips'
  • iface_vkeyboard Boolean
    help='Don’t turn this option on if you take orders on smartphones or tablets. \n Such devices already benefit from a native keyboard.' string='Virtual KeyBoard'
  • invoice_journal_id Many2one → account.journal
    default=_default_invoice_journal domain=[('type', '=', 'sale')] help='Accounting journal used to create invoices.' string='Invoice Journal' args: 'account.journal'
  • is_header_or_footer Boolean
    args: 'Header & Footer'
  • is_installed_account_accountant Boolean
    compute='_compute_is_installed_account_accountant' string='Is the Full Accounting Installed'
  • is_posbox Boolean
    args: 'PosBox'
  • journal_id Many2one → account.journal
    default=_default_sale_journal domain=[('type', '=', 'sale')] help='Accounting journal used to post sales entries.' string='Sales Journal' args: 'account.journal'
  • journal_ids Many2many → account.journal
    domain="[('journal_user', '=', True ), ('type', 'in', ['bank', 'cash'])]" string='Available Payment Methods' args: 'account.journal', 'pos_config_journal_rel', 'pos_config_id', 'journal_id'
  • last_session_closing_cash Float
    compute='_compute_last_session'
  • last_session_closing_date Date
    compute='_compute_last_session'
  • module_account Boolean
    help='Enables invoice generation from the Point of Sale.' string='Invoicing'
  • module_pos_discount Boolean
    args: 'Global Discounts'
  • module_pos_loyalty Boolean
    args: 'Loyalty Program'
  • module_pos_mercury Boolean
    string='Integrated Card Payments'
  • module_pos_reprint Boolean
    string='Reprint Receipt'
  • module_pos_restaurant Boolean
    args: 'Is a Bar/Restaurant'
  • name Char
    help='An internal identification of the point of sale.' index=True required=True string='Point of Sale Name'
  • picking_type_id Many2one → stock.picking.type
    string='Operation Type' args: 'stock.picking.type'
  • pos_session_duration Char
    compute='_compute_current_session_user'
  • pos_session_state Char
    compute='_compute_current_session_user'
  • pos_session_username Char
    compute='_compute_current_session_user'
  • pricelist_id Many2one → product.pricelist
    default=_default_pricelist help='The pricelist used if no customer is selected or if the customer has no Sale Pricelist configured.' required=True string='Default Pricelist' args: 'product.pricelist'
  • proxy_ip Char
    help='The hostname or ip address of the hardware proxy, Will be autodetected if left empty.' size=45 string='IP Address'
  • receipt_footer Text
    help='A short text that will be inserted as a footer in the printed receipt.' string='Receipt Footer'
  • receipt_header Text
    help='A short text that will be inserted as a header in the printed receipt.' string='Receipt Header'
  • restrict_price_control Boolean
    help='Only users with Manager access rights for PoS app can modify the product prices on orders.' string='Restrict Price Modifications to Managers'
  • sequence_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders.' readonly=True string='Order IDs Sequence' args: 'ir.sequence'
  • sequence_line_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders lines.' readonly=True string='Order Line IDs Sequence' args: 'ir.sequence'
  • session_ids One2many → pos.session
    string='Sessions' args: 'pos.session', 'config_id'
  • start_category Boolean
    args: 'Set Start Category'
  • stock_location_id Many2one → stock.location
    default=_get_default_location domain=[('usage', '=', 'internal')] required=True string='Stock Location' args: 'stock.location'
  • tax_regime Boolean
    args: 'Tax Regime'
  • tax_regime_selection Boolean
    args: 'Tax Regime Selection value'
  • tip_product_id Many2one → product.product
    help='This product is used as reference on customer receipts.' string='Tip Product' args: 'product.product'
  • use_existing_lots Boolean
    readonly=False related='picking_type_id.use_existing_lots'
  • use_pricelist Boolean
    args: 'Use a pricelist.'
  • uuid Char
    default=<expr> help='A globally unique identifier for this pos configuration, used to prevent conflicts in client-generated data.' readonly=True
Public methods (8)
  • create(self, values)
    @api.model
  • execute(self)
  • name_get(self)
    @api.multi
  • open_existing_session_cb(self)
    @api.multi
    close session button access session form to validate entries
  • open_session_cb(self)
    @api.multi
    new session button create one if none exist access cash control interface if enabled or start a session
  • open_ui(self)
    @api.multi
    open the pos interface
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (3)
  • end_date Datetime
    default=fields.Datetime.now required=True
  • pos_config_ids Many2many → pos.config
    default=<expr> args: 'pos.config', 'pos_detail_configs'
  • start_date Datetime
    default=_default_start_date required=True
Public methods (1)
  • generate_report(self)
    @api.multi

New fields (5)
  • amount Float
    default=_default_amount digits=0 required=True
  • journal_id Many2one → account.journal
    default=_default_journal required=True string='Payment Mode' args: 'account.journal'
  • payment_date Date
    default=<expr> required=True string='Payment Date'
  • payment_name Char
    string='Payment Reference'
  • session_id Many2one → pos.session
    default=_default_session required=True args: 'pos.session'
Public methods (2)
  • check(self)
    @api.multi
    Check the order: if the order is not paid: continue payment, if the order is paid print ticket.
  • launch_payment(self)

New fields (0)

No new fields.

Public methods (1)
  • open_statement(self)
    @api.multi

New fields (27)
  • account_move Many2one → account.move
    copy=False readonly=True string='Journal Entry' args: 'account.move'
  • amount_paid Float
    digits=0 readonly=True required=True states={'draft': [('readonly', False)]} string='Paid'
  • amount_return Float
    digits=0 readonly=True required=True string='Returned'
  • amount_tax Float
    digits=0 readonly=True required=True string='Taxes'
  • amount_total Float
    digits=0 readonly=True required=True string='Total'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=False related='session_id.config_id' string='Point of Sale' args: 'pos.config'
  • date_order Datetime
    default=fields.Datetime.now index=True readonly=True string='Order Date'
  • fiscal_position_id Many2one → account.fiscal.position
    comodel_name='account.fiscal.position' default=<expr> readonly=True states={'draft': [('readonly', False)]} string='Fiscal Position'
  • invoice_group Boolean
    readonly=False related='config_id.module_account'
  • invoice_id Many2one → account.invoice
    copy=False string='Invoice' args: 'account.invoice'
  • lines One2many → pos.order.line
    copy=True readonly=True states={'draft': [('readonly', False)]} string='Order Lines' args: 'pos.order.line', 'order_id'
  • location_id Many2one → stock.location
    comodel_name='stock.location' readonly=True related='session_id.config_id.stock_location_id' store=True string='Location'
  • name Char
    copy=False default='/' readonly=True required=True string='Order Ref'
  • nb_print Integer
    copy=False default=0 readonly=True string='Number of Print'
  • note Text
    string='Internal Notes'
  • partner_id Many2one → res.partner
    change_default=True index=True states={'draft': [('readonly', False)], 'paid': [('readonly', False)]} string='Customer' args: 'res.partner'
  • picking_id Many2one → stock.picking
    copy=False readonly=True string='Picking' args: 'stock.picking'
  • picking_type_id Many2one → stock.picking.type
    readonly=False related='session_id.config_id.picking_type_id' string='Operation Type' args: 'stock.picking.type'
  • pos_reference Char
    copy=False readonly=True string='Receipt Ref'
  • pricelist_id Many2one → product.pricelist
    default=_default_pricelist readonly=True required=True states={'draft': [('readonly', False)]} string='Pricelist' args: 'product.pricelist'
  • sale_journal Many2one → account.journal
    readonly=True related='session_id.config_id.journal_id' store=True string='Sales Journal' args: 'account.journal'
  • sequence_number Integer
    default=1 help='A session-unique sequence number for the order' string='Sequence Number'
  • session_id Many2one → pos.session
    default=_default_session domain="[('state', '=', 'opened')]" index=True readonly=True required=True states={'draft': [('readonly', False)]} string='Session' args: 'pos.session'
  • state Selection
    copy=False default='draft' readonly=True args: [('draft', 'New'), ('cancel', 'Cancelled'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced')], 'Status'
  • statement_ids One2many → account.bank.statement.line
    readonly=True states={'draft': [('readonly', False)]} string='Payments' args: 'account.bank.statement.line', 'pos_statement_id'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> help='Person who uses the cash register. It can be a reliever, a student or an interim employee.' states={'done': [('readonly', True)], 'invoiced': [('readonly', True)]} string='Salesperson'
Public methods (14)
  • action_pos_order_cancel(self)
    @api.multi
  • action_pos_order_done(self)
    @api.multi
  • action_pos_order_invoice(self)
    @api.multi
  • action_pos_order_paid(self)
    @api.multi
  • action_view_invoice(self)
    @api.multi
  • add_payment(self, data)
    Create a new payment for the order
  • create(self, values)
    @api.model
  • create_from_ui(self, orders)
    @api.model
  • create_picking(self)
    Create a picking for each order and validate it.
  • refund(self)
    @api.multi
    Create a copy of order for refund order
  • set_pack_operation_lot(self, picking=None)
    Set Serial/Lot number in pack operations to mark the pack operation done.
  • test_paid(self)
    A Point of Sale is paid when the sum @return: True
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (13)
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • discount Float
    default=0.0 digits=0 string='Discount (%)'
  • name Char
    copy=False required=True string='Line No'
  • notice Char
    string='Discount Notice'
  • order_id Many2one → pos.order
    ondelete='cascade' string='Order Ref' args: 'pos.order'
  • pack_lot_ids One2many → pos.pack.operation.lot
    string='Lot/serial Number' args: 'pos.pack.operation.lot', 'pos_order_line_id'
  • price_subtotal Float
    digits=0 readonly=True required=True string='Subtotal w/o Tax'
  • price_subtotal_incl Float
    digits=0 readonly=True required=True string='Subtotal'
  • price_unit Float
    digits=0 string='Unit Price'
  • product_id Many2one → product.product
    change_default=True domain=[('sale_ok', '=', True)] required=True string='Product' args: 'product.product'
  • qty Float
    default=1 digits=dp.get_precision('Product Unit of Measure') args: 'Quantity'
  • tax_ids Many2many → account.tax
    readonly=True string='Taxes' args: 'account.tax'
  • tax_ids_after_fiscal_position Many2many → account.tax
    compute='_get_tax_ids_after_fiscal_position' string='Taxes to Apply' args: 'account.tax'
Public methods (1)
  • create(self, values)
    @api.model

New fields (4)
  • lot_name Char
    args: 'Lot Name'
  • order_id Many2one → pos.order
    readonly=False related='pos_order_line_id.order_id' args: 'pos.order'
  • pos_order_line_id Many2one → pos.order.line
    args: 'pos.order.line'
  • product_id Many2one → product.product
    readonly=False related='pos_order_line_id.product_id' args: 'product.product'
Public methods (0)

No public methods.

New fields (22)
  • cash_control Boolean
    compute='_compute_cash_all' string='Has Cash Control'
  • cash_journal_id Many2one → account.journal
    compute='_compute_cash_all' store=True string='Cash Journal' args: 'account.journal'
  • cash_register_balance_end Monetary
    digits=0 help='Sum of opening balance and transactions.' readonly=True related='cash_register_id.balance_end' string='Theoretical Closing Balance'
  • cash_register_balance_end_real Monetary
    help='Total of closing cash control lines.' readonly=True related='cash_register_id.balance_end_real' string='Ending Balance'
  • cash_register_balance_start Monetary
    help='Total of opening cash control lines.' readonly=True related='cash_register_id.balance_start' string='Starting Balance'
  • cash_register_difference Monetary
    help='Difference between the theoretical closing balance and the real closing balance.' readonly=True related='cash_register_id.difference' string='Difference'
  • cash_register_id Many2one → account.bank.statement
    compute='_compute_cash_all' store=True string='Cash Register' args: 'account.bank.statement'
  • cash_register_total_entry_encoding Monetary
    help='Total of all paid sales orders' readonly=True related='cash_register_id.total_entry_encoding' string='Total Cash Transaction'
  • config_id Many2one → pos.config
    help='The physical point of sale you will use.' index=True required=True string='Point of Sale' args: 'pos.config'
  • currency_id Many2one → res.currency
    readonly=False related='config_id.currency_id' string='Currency' args: 'res.currency'
  • journal_ids Many2many → account.journal
    readonly=True related='config_id.journal_ids' string='Available Payment Methods' args: 'account.journal'
  • login_number Integer
    default=0 help='A sequence number that is incremented each time a user resumes the pos session' string='Login Sequence Number'
  • name Char
    default='/' readonly=True required=True string='Session ID'
  • order_ids One2many → pos.order
    string='Orders' args: 'pos.order', 'session_id'
  • picking_count Integer
    compute='_compute_picking_count'
  • rescue Boolean
    copy=False help='Auto-generated session for orphan orders, ignored in constraints' readonly=True string='Recovery Session'
  • sequence_number Integer
    default=1 help='A sequence number that is incremented with each order' string='Order Sequence Number'
  • start_at Datetime
    readonly=True string='Opening Date'
  • state Selection
    copy=False default='opening_control' index=True readonly=True required=True string='Status' args: POS_SESSION_STATE
  • statement_ids One2many → account.bank.statement
    readonly=True string='Bank Statement' args: 'account.bank.statement', 'pos_session_id'
  • stop_at Datetime
    copy=False readonly=True string='Closing Date'
  • user_id Many2one → res.users
    default=<expr> index=True readonly=True required=True states={'opening_control': [('readonly', False)]} string='Responsible' args: 'res.users'
Public methods (10)
  • action_pos_session_close(self)
    @api.multi
  • action_pos_session_closing_control(self)
    @api.multi
  • action_pos_session_open(self)
    @api.multi
  • action_pos_session_validate(self)
    @api.multi
  • action_stock_picking(self)
    @api.multi
  • create(self, values)
    @api.model
  • login(self)
    @api.multi
  • open_cashbox(self)
    @api.multi
  • open_frontend_cb(self)
    @api.multi
  • unlink(self)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • unlink(self)
    @api.multi

New fields (3)
  • available_in_pos Boolean
    default=False help='Check if you want this product to appear in the Point of Sale.' string='Available in POS'
  • pos_categ_id Many2one → pos.category
    help='Category used in the Point of Sale.' string='Point of Sale Category' args: 'pos.category'
  • to_weight Boolean
    help='Check if the product should be weighted using the hardware scale integration.' string='To Weigh With Scale'
Public methods (1)
  • unlink(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_sale_details(self, date_start=False, date_stop=False, configs=False)
    @api.model
    Serialise the orders of the day information params: date_start, date_stop string representing the datetime of order

New fields (23)
  • average_price Float
    group_operator='avg' readonly=True string='Average Price'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=True string='Point of Sale' args: 'pos.config'
  • date Datetime
    readonly=True string='Order Date'
  • delay_validation Integer
    string='Delay Validation'
  • invoiced Boolean
    readonly=True
  • journal_id Many2one → account.journal
    string='Journal' args: 'account.journal'
  • location_id Many2one → stock.location
    readonly=True string='Location' args: 'stock.location'
  • nbr_lines Integer
    oldname='nbr' readonly=True string='Sale Line Count'
  • order_id Many2one → pos.order
    readonly=True string='Order' args: 'pos.order'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • pos_categ_id Many2one → pos.category
    readonly=True string='PoS Category' args: 'pos.category'
  • price_sub_total Float
    readonly=True string='Subtotal w/o discount'
  • price_total Float
    readonly=True string='Total Price'
  • pricelist_id Many2one → product.pricelist
    readonly=True string='Pricelist' args: 'product.pricelist'
  • product_categ_id Many2one → product.category
    readonly=True string='Product Category' args: 'product.category'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Integer
    readonly=True string='Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True string='Product Template' args: 'product.template'
  • session_id Many2one → pos.session
    readonly=True string='Session' args: 'pos.session'
  • state Selection
    string='Status' args: [('draft', 'New'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced'), ('cancel', 'Cancelled')]
  • total_discount Float
    readonly=True string='Total Discount'
  • user_id Many2one → res.users
    readonly=True string='Salesperson' args: 'res.users'
Public methods (1)
  • init(self)
    @api.model_cr

New fields (4)
  • module_pos_mercury Boolean
    help='The transactions are processed by Vantiv. Set your Vantiv credentials on the related payment journal.' string='Integrated Card Payments'
  • pos_pricelist_setting Selection
    config_parameter='point_of_sale.pos_pricelist_setting' string='POS Pricelists' args: [('percentage', 'Multiple prices per product (e.g. customer segments, currencies)'), ('formula', 'Price computed from formulas (discounts, margins, roundings)')]
  • pos_sales_price Boolean
    config_parameter='point_of_sale.pos_sales_price' args: 'Multiple Product Prices'
  • sale_tax_id Many2one → account.tax
    readonly=False related='company_id.account_sale_tax_id' string='Default Sale Tax' args: 'account.tax'
Public methods (1)
  • pos_pricelist_setting_sync(self, sale_pricelist_setting)

New fields (1)
  • pos_order_count Integer
    compute='_compute_pos_order' groups='point_of_sale.group_pos_user' help='The number of point of sales orders related to this customer'
Public methods (1)
  • create_from_ui(self, partner)
    @api.model
    create or modify a partner from the point of sale ui. partner contains the partner's fields.

New fields (1)
  • pos_security_pin Char
    help='A Security PIN used to protect sensible functionality in the Point of Sale' size=32 string='Security PIN'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    help='Check if you want to group products of this category in point of sale orders' string='Group Products in POS'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    readonly=False related='category_id.is_pos_groupable'
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/point_of_sale
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYPoint Of Sale
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, Olivier Dony, Thibault Delavallée, Josse Colpaert, Denis Ledoux, Christophe Simonis, Xavier Morel, Joren Van Onder, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, GitHub, Lucas Perais (lpe), Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, Pierre Masereel, Laurent Smet, Denis Vermylen (dve), DVE, Adrien Dieudonne, Christophe Monniez, len-odoo, Jorge Pinna Puissant, Gert Pellin, jev-odoo, Antoine Prieels, mgh-odoo, Luis Torres
WEBSITE
WEBSITEhttps://www.odoo.com/page/point-of-sale
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:42
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - barcodes
    - web_planner
    - account
    - analytic
    - portal
    - http_routing
    - web_editor
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (49)
XML IDNameModelTypeStatus
FieldTextHtml FieldTextHtml ir.ui.view qweb New
account_cashbox_line_view_tree account.cashbox.line.tree account.cashbox.line tree New
assets point_of_sale assets ir.ui.view qweb New
assets_backend hr assets ir.ui.view qweb Inherits web.assets_backend
customer_facing_display_html customer_facing_display_html ir.ui.view qweb New
customer_facing_display_snippets customer_facing_display_snippets ir.ui.view qweb New
extra_head extra_head ir.ui.view qweb New
index POS Index ir.ui.view qweb New
pos_config_view_form pos.config.form.view pos.config form New
pos_editor_assets pos_editor_assets ir.ui.view qweb Inherits web_editor.assets_editor
pos_editor_fieldtexthtml_assets pos_editor_fieldtexthtml_assets ir.ui.view qweb Inherits web.assets_backend
product_pos_category_form_view pos.category.form pos.category form New
product_pos_category_tree_view pos.category.tree pos.category tree New
product_template_form_view product.template.form.inherit product.template group Inherits stock.view_template_property_form
product_template_search_view_pos product.template.search.pos.form product.template filter Inherits product.product_template_search_view
product_uom_categ_form_view product.uom.categ.form.inherit product.uom.categ xpath Inherits product.product_uom_categ_form_view
report_invoice report_invoice ir.ui.view qweb Inherits account.report_invoice
report_saledetails report_saledetails ir.ui.view qweb New
report_statement report_statement ir.ui.view qweb New
report_userlabel report_userlabel ir.ui.view qweb New
res_users_form_view res.users.form.view res.users notebook Inherits base.view_users_form
view_account_bank_journal_form_inherited_pos account.bank.journal.form.inherit.pos account.journal xpath Inherits account.view_account_bank_journal_form
view_account_journal_pos_user_form account.journal.pos.user.form.inherit account.journal xpath Inherits account.view_account_journal_form
view_account_journal_search_inherit_point_of_sale account.journal.filter account.journal field Inherits account.view_account_journal_search
view_partner_pos_kanban res.partner.pos.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
view_partner_property_form res.partner.pos.form.inherit res.partner div Inherits base.view_partner_form
view_pos_category_kanban pos.category.kanban pos.category kanban New
view_pos_config_kanban pos.config.kanban.view pos.config kanban New
view_pos_config_search pos.config.search.view pos.config search New
view_pos_config_tree pos.config.tree.view pos.config tree New
view_pos_details_wizard pos.details.wizard.form pos.details.wizard form New
view_pos_discount pos.discount.form pos.discount form New
view_pos_open_statement pos.open.statement.form pos.open.statement form New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_kanban pos.order.kanban pos.order kanban New
view_pos_order_line pos.order.line.tree pos.order.line tree New
view_pos_order_line_form pos.order.line.form pos.order.line form New
view_pos_order_search pos.order.search.view pos.order search New
view_pos_order_tree pos.order.tree pos.order tree New
view_pos_order_tree_all_sales_lines pos.order.line.all.sales.tree pos.order.line tree New
view_pos_payment pos.make.payment.form pos.make.payment form New
view_pos_pos_form pos.order.form pos.order form New
view_pos_session_form pos.session.form.view pos.session form New
view_pos_session_kanban pos.session.kanban pos.session kanban New
view_pos_session_search pos.session.search.view pos.session search New
view_pos_session_tree pos.session.tree.view pos.session tree New
view_report_pos_order_graph report.pos.order.graph report.pos.order graph New
view_report_pos_order_pivot report.pos.order.pivot report.pos.order pivot New
view_report_pos_order_search report.pos.order.search report.pos.order search New
Models touched (26)

New fields (2)
  • account_id Many2one → account.account
    readonly=True related='journal_id.default_debit_account_id' args: 'account.account'
  • pos_session_id Many2one → pos.session
    copy=False string='Session' args: 'pos.session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (1)
  • pos_statement_id Many2one → pos.order
    ondelete='cascade' string='POS statement' args: 'pos.order'
Public methods (0)

No public methods.

New fields (1)
  • default_pos_id Many2one → pos.config
    string='This cashbox line is used by default when opening or closing a balance for this point of sale' args: 'pos.config'
Public methods (1)
  • name_get(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • amount_authorized_diff Float
    help='This field depicts the maximum difference allowed between the ending balance and the theoretical cash when closing a session, for non-POS managers. If this maximum is reached, the user will have an error message at the closing of his session saying that he needs to contact his manager.' args: 'Amount Authorized Difference'
  • journal_user Boolean
    help='Check this box if this journal define a payment method that can be used in a point of sale.' args: 'Use in Point of Sale'
Public methods (2)
  • onchange_type(self)
    @api.onchange('type')
  • search(self, args, offset=0, limit=None, order=None, count=False)
    @api.model

New fields (1)
  • type Selection
    selection_add=[('weight', 'Weighted Product'), ('price', 'Priced Product'), ('discount', 'Discounted Product'), ('client', 'Client'), ('cashier', 'Cashier')]
Public methods (0)

No public methods.

New fields (7)
  • child_id One2many → pos.category
    string='Children Categories' args: 'pos.category', 'parent_id'
  • image Binary
    attachment=True help='This field holds the image used as image for the cateogry, limited to 1024x1024px.'
  • image_medium Binary
    attachment=True help='Medium-sized image of the category. It is automatically resized as a 128x128px image, with aspect ratio preserved. Use this field in form views or some kanban views.' string='Medium-sized image'
  • image_small Binary
    attachment=True help='Small-sized image of the category. It is automatically resized as a 64x64px image, with aspect ratio preserved. Use this field anywhere a small image is required.' string='Small-sized image'
  • name Char
    required=True translate=True
  • parent_id Many2one → pos.category
    index=True string='Parent Category' args: 'pos.category'
  • sequence Integer
    help='Gives the sequence order when displaying a list of product categories.'
Public methods (3)
  • create(self, vals)
    @api.model
  • name_get(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (67)
  • active Boolean
    default=True
  • available_pricelist_ids Many2many → product.pricelist
    default=_default_pricelist help='Make several pricelists available in the Point of Sale. You can also apply a pricelist to specific customers from their contact form (in Sales tab). To be valid, this pricelist must be listed here as an available pricelist. Otherwise the default pricelist will apply.' string='Available Pricelists' args: 'product.pricelist'
  • barcode_nomenclature_id Many2one → barcode.nomenclature
    help='Defines what kind of barcodes are available and how they are assigned to products, customers and cashiers.' string='Barcode Nomenclature' args: 'barcode.nomenclature'
  • barcode_scanner Boolean
    args: 'Barcode Scanner'
  • cash_control Boolean
    help='Check the amount of the cashbox at opening and closing.' string='Cash Control'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    compute='_compute_currency' string='Currency' args: 'res.currency'
  • current_session_id Many2one → pos.session
    compute='_compute_current_session' string='Current Session' args: 'pos.session'
  • current_session_state Char
    compute='_compute_current_session'
  • customer_facing_display_html Html
    default=_compute_default_customer_html string='Customer facing display content' translate=True
  • default_cashbox_lines_ids One2many → account.cashbox.line
    string='Default Balance' args: 'account.cashbox.line', 'default_pos_id'
  • default_fiscal_position_id Many2one → account.fiscal.position
    string='Default Fiscal Position' args: 'account.fiscal.position'
  • fiscal_position_ids Many2many → account.fiscal.position
    help='This is useful for restaurants with onsite and take-away services that imply specific tax rates.' string='Fiscal Positions' args: 'account.fiscal.position'
  • group_by Boolean
    default=True help='Check this if you want to group the Journal Items by Product while closing a Session.' string='Group Journal Items'
  • group_pos_manager_id Many2one → res.groups
    default=_get_group_pos_manager help='This field is there to pass the id of the pos manager group to the point of sale client.' string='Point of Sale Manager Group' args: 'res.groups'
  • group_pos_user_id Many2one → res.groups
    default=_get_group_pos_user help='This field is there to pass the id of the pos user group to the point of sale client.' string='Point of Sale User Group' args: 'res.groups'
  • group_pricelist_item Boolean
    implied_group='product.group_pricelist_item' args: 'Show pricelists to customers'
  • group_sale_pricelist Boolean
    help='Allows to manage different prices based on rules per category of customers.\n Example: 10% for retailers, promotion of 5 EUR on this product, etc.' implied_group='product.group_sale_pricelist' args: 'Use pricelists to adapt your price per customers'
  • iface_big_scrollbars Boolean
    help='For imprecise industrial touchscreens.' args: 'Large Scrollbars'
  • iface_cashdrawer Boolean
    help='Automatically open the cashdrawer.' string='Cashdrawer'
  • iface_customer_facing_display Boolean
    help='Show checkout to customers with a remotely-connected screen.' string='Customer Facing Display'
  • iface_display_categ_images Boolean
    help='The product categories will be displayed with pictures.' string='Display Category Pictures'
  • iface_electronic_scale Boolean
    help='Enables Electronic Scale integration.' string='Electronic Scale'
  • iface_invoicing Boolean
    help='Enables invoice generation from the Point of Sale.' string='Invoicing'
  • iface_payment_terminal Boolean
    help='Enables Payment Terminal integration.' string='Payment Terminal'
  • iface_precompute_cash Boolean
    help='The payment input will behave similarily to bank payment input, and will be prefilled with the exact due amount.' string='Prefill Cash Payment'
  • iface_print_auto Boolean
    default=False help='The receipt will automatically be printed at the end of each order.' string='Automatic Receipt Printing'
  • iface_print_skip_screen Boolean
    default=True help='The receipt screen will be skipped if the receipt can be printed automatically.' string='Skip Preview Screen'
  • iface_print_via_proxy Boolean
    help='Bypass browser printing and prints via the hardware proxy.' string='Print via Proxy'
  • iface_scan_via_proxy Boolean
    help='Enable barcode scanning with a remotely connected barcode scanner.' string='Scan via Proxy'
  • iface_start_categ_id Many2one → pos.category
    help='The point of sale will display this product category by default. If no category is specified, all available products will be shown.' string='Initial Category' args: 'pos.category'
  • iface_tax_included Selection
    default='subtotal' required=True args: [('subtotal', 'Tax-Excluded Prices'), ('total', 'Tax-Included Prices')], 'Tax Display'
  • iface_tipproduct Boolean
    string='Product tips'
  • iface_vkeyboard Boolean
    help='Don’t turn this option on if you take orders on smartphones or tablets. \n Such devices already benefit from a native keyboard.' string='Virtual KeyBoard'
  • invoice_journal_id Many2one → account.journal
    default=_default_invoice_journal domain=[('type', '=', 'sale')] help='Accounting journal used to create invoices.' string='Invoice Journal' args: 'account.journal'
  • is_header_or_footer Boolean
    args: 'Header & Footer'
  • is_installed_account_accountant Boolean
    compute='_compute_is_installed_account_accountant'
  • is_posbox Boolean
    args: 'PosBox'
  • journal_id Many2one → account.journal
    default=_default_sale_journal domain=[('type', '=', 'sale')] help='Accounting journal used to post sales entries.' string='Sales Journal' args: 'account.journal'
  • journal_ids Many2many → account.journal
    domain="[('journal_user', '=', True ), ('type', 'in', ['bank', 'cash'])]" string='Available Payment Methods' args: 'account.journal', 'pos_config_journal_rel', 'pos_config_id', 'journal_id'
  • last_session_closing_cash Float
    compute='_compute_last_session'
  • last_session_closing_date Date
    compute='_compute_last_session'
  • module_pos_discount Boolean
    args: 'Global Discounts'
  • module_pos_loyalty Boolean
    args: 'Loyalty Program'
  • module_pos_mercury Boolean
    string='Integrated Card Payments'
  • module_pos_reprint Boolean
    string='Reprint Receipt'
  • module_pos_restaurant Boolean
    args: 'Is a Bar/Restaurant'
  • name Char
    help='An internal identification of the point of sale.' index=True required=True string='Point of Sale Name'
  • picking_type_id Many2one → stock.picking.type
    string='Operation Type' args: 'stock.picking.type'
  • pos_session_state Char
    compute='_compute_current_session_user'
  • pos_session_username Char
    compute='_compute_current_session_user'
  • pricelist_id Many2one → product.pricelist
    default=_default_pricelist help='The pricelist used if no customer is selected or if the customer has no Sale Pricelist configured.' required=True string='Default Pricelist' args: 'product.pricelist'
  • proxy_ip Char
    help='The hostname or ip address of the hardware proxy, Will be autodetected if left empty.' size=45 string='IP Address'
  • receipt_footer Text
    help='A short text that will be inserted as a footer in the printed receipt.' string='Receipt Footer'
  • receipt_header Text
    help='A short text that will be inserted as a header in the printed receipt.' string='Receipt Header'
  • restrict_price_control Boolean
    help='Only users with Manager access rights for PoS app can modify the product prices on orders.' string='Restrict Price Modifications to Managers'
  • sequence_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders.' readonly=True string='Order IDs Sequence' args: 'ir.sequence'
  • sequence_line_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders lines.' readonly=True string='Order Line IDs Sequence' args: 'ir.sequence'
  • session_ids One2many → pos.session
    string='Sessions' args: 'pos.session', 'config_id'
  • start_category Boolean
    args: 'Set Start Category'
  • stock_location_id Many2one → stock.location
    default=_get_default_location domain=[('usage', '=', 'internal')] required=True string='Stock Location' args: 'stock.location'
  • tax_regime Boolean
    args: 'Tax Regime'
  • tax_regime_selection Boolean
    args: 'Tax Regime Selection value'
  • tip_product_id Many2one → product.product
    help='This product is used as reference on customer receipts.' string='Tip Product' args: 'product.product'
  • use_existing_lots Boolean
    related='picking_type_id.use_existing_lots'
  • use_pricelist Boolean
    args: 'Use a pricelist.'
  • uuid Char
    default=<expr> help='A globally unique identifier for this pos configuration, used to prevent conflicts in client-generated data.' readonly=True
Public methods (8)
  • create(self, values)
    @api.model
  • execute(self)
  • name_get(self)
    @api.multi
  • open_existing_session_cb(self)
    @api.multi
    close session button access session form to validate entries
  • open_session_cb(self)
    @api.multi
    new session button create one if none exist access cash control interface if enabled or start a session
  • open_ui(self)
    @api.multi
    open the pos interface
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (3)
  • end_date Datetime
    default=fields.Datetime.now required=True
  • pos_config_ids Many2many → pos.config
    default=<expr> args: 'pos.config', 'pos_detail_configs'
  • start_date Datetime
    default=_default_start_date required=True
Public methods (1)
  • generate_report(self)
    @api.multi

New fields (1)
  • discount Float
    default=5 digits=(16, 2) required=True string='Discount (%)'
Public methods (1)
  • apply_discount(self)
    @api.multi

New fields (5)
  • amount Float
    default=_default_amount digits=0 required=True
  • journal_id Many2one → account.journal
    default=_default_journal required=True string='Payment Mode' args: 'account.journal'
  • payment_date Date
    default=<expr> required=True string='Payment Date'
  • payment_name Char
    string='Payment Reference'
  • session_id Many2one → pos.session
    default=_default_session required=True args: 'pos.session'
Public methods (2)
  • check(self)
    @api.multi
    Check the order: if the order is not paid: continue payment, if the order is paid print ticket.
  • launch_payment(self)

New fields (0)

No new fields.

Public methods (1)
  • open_statement(self)
    @api.multi

New fields (26)
  • account_move Many2one → account.move
    copy=False readonly=True string='Journal Entry' args: 'account.move'
  • amount_paid Float
    compute='_compute_amount_all' digits=0 readonly=True states={'draft': [('readonly', False)]} string='Paid'
  • amount_return Float
    compute='_compute_amount_all' digits=0 string='Returned'
  • amount_tax Float
    compute='_compute_amount_all' digits=0 string='Taxes'
  • amount_total Float
    compute='_compute_amount_all' digits=0 string='Total'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    related='session_id.config_id' string='Point of Sale' args: 'pos.config'
  • date_order Datetime
    default=fields.Datetime.now index=True readonly=True string='Order Date'
  • fiscal_position_id Many2one → account.fiscal.position
    comodel_name='account.fiscal.position' default=<expr> readonly=True states={'draft': [('readonly', False)]} string='Fiscal Position'
  • invoice_id Many2one → account.invoice
    copy=False string='Invoice' args: 'account.invoice'
  • lines One2many → pos.order.line
    copy=True readonly=True states={'draft': [('readonly', False)]} string='Order Lines' args: 'pos.order.line', 'order_id'
  • location_id Many2one → stock.location
    comodel_name='stock.location' readonly=True related='session_id.config_id.stock_location_id' store=True string='Location'
  • name Char
    copy=False default='/' readonly=True required=True string='Order Ref'
  • nb_print Integer
    copy=False default=0 readonly=True string='Number of Print'
  • note Text
    string='Internal Notes'
  • partner_id Many2one → res.partner
    change_default=True index=True states={'draft': [('readonly', False)], 'paid': [('readonly', False)]} string='Customer' args: 'res.partner'
  • picking_id Many2one → stock.picking
    copy=False readonly=True string='Picking' args: 'stock.picking'
  • picking_type_id Many2one → stock.picking.type
    related='session_id.config_id.picking_type_id' string='Operation Type' args: 'stock.picking.type'
  • pos_reference Char
    copy=False readonly=True string='Receipt Ref'
  • pricelist_id Many2one → product.pricelist
    default=_default_pricelist readonly=True required=True states={'draft': [('readonly', False)]} string='Pricelist' args: 'product.pricelist'
  • sale_journal Many2one → account.journal
    readonly=True related='session_id.config_id.journal_id' store=True string='Sales Journal' args: 'account.journal'
  • sequence_number Integer
    default=1 help='A session-unique sequence number for the order' string='Sequence Number'
  • session_id Many2one → pos.session
    default=_default_session domain="[('state', '=', 'opened')]" index=True readonly=True required=True states={'draft': [('readonly', False)]} string='Session' args: 'pos.session'
  • state Selection
    copy=False default='draft' readonly=True args: [('draft', 'New'), ('cancel', 'Cancelled'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced')], 'Status'
  • statement_ids One2many → account.bank.statement.line
    readonly=True states={'draft': [('readonly', False)]} string='Payments' args: 'account.bank.statement.line', 'pos_statement_id'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> help='Person who uses the cash register. It can be a reliever, a student or an interim employee.' states={'done': [('readonly', True)], 'invoiced': [('readonly', True)]} string='Salesman'
Public methods (14)
  • action_pos_order_cancel(self)
    @api.multi
  • action_pos_order_done(self)
    @api.multi
  • action_pos_order_invoice(self)
    @api.multi
  • action_pos_order_paid(self)
    @api.multi
  • action_view_invoice(self)
    @api.multi
  • add_payment(self, data)
    Create a new payment for the order
  • create(self, values)
    @api.model
  • create_from_ui(self, orders)
    @api.model
  • create_picking(self)
    Create a picking for each order and validate it.
  • refund(self)
    @api.multi
    Create a copy of order for refund order
  • set_pack_operation_lot(self, picking=None)
    Set Serial/Lot number in pack operations to mark the pack operation done.
  • test_paid(self)
    A Point of Sale is paid when the sum @return: True
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (14)
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • create_date Datetime
    readonly=True string='Creation Date'
  • discount Float
    default=0.0 digits=0 string='Discount (%)'
  • name Char
    copy=False required=True string='Line No'
  • notice Char
    string='Discount Notice'
  • order_id Many2one → pos.order
    ondelete='cascade' string='Order Ref' args: 'pos.order'
  • pack_lot_ids One2many → pos.pack.operation.lot
    string='Lot/serial Number' args: 'pos.pack.operation.lot', 'pos_order_line_id'
  • price_subtotal Float
    compute='_compute_amount_line_all' digits=0 string='Subtotal w/o Tax'
  • price_subtotal_incl Float
    compute='_compute_amount_line_all' digits=0 string='Subtotal'
  • price_unit Float
    digits=0 string='Unit Price'
  • product_id Many2one → product.product
    change_default=True domain=[('sale_ok', '=', True)] required=True string='Product' args: 'product.product'
  • qty Float
    default=1 digits=dp.get_precision('Product Unit of Measure') args: 'Quantity'
  • tax_ids Many2many → account.tax
    readonly=True string='Taxes' args: 'account.tax'
  • tax_ids_after_fiscal_position Many2many → account.tax
    compute='_get_tax_ids_after_fiscal_position' string='Taxes' args: 'account.tax'
Public methods (1)
  • create(self, values)
    @api.model

New fields (4)
  • lot_name Char
    args: 'Lot Name'
  • order_id Many2one → pos.order
    related='pos_order_line_id.order_id' args: 'pos.order'
  • pos_order_line_id Many2one → pos.order.line
    args: 'pos.order.line'
  • product_id Many2one → product.product
    related='pos_order_line_id.product_id' args: 'product.product'
Public methods (0)

No public methods.

New fields (22)
  • cash_control Boolean
    compute='_compute_cash_all' string='Has Cash Control'
  • cash_journal_id Many2one → account.journal
    compute='_compute_cash_all' store=True string='Cash Journal' args: 'account.journal'
  • cash_register_balance_end Monetary
    digits=0 help='Sum of opening balance and transactions.' readonly=True related='cash_register_id.balance_end' string='Theoretical Closing Balance'
  • cash_register_balance_end_real Monetary
    help='Total of closing cash control lines.' readonly=True related='cash_register_id.balance_end_real' string='Ending Balance'
  • cash_register_balance_start Monetary
    help='Total of opening cash control lines.' readonly=True related='cash_register_id.balance_start' string='Starting Balance'
  • cash_register_difference Monetary
    help='Difference between the theoretical closing balance and the real closing balance.' readonly=True related='cash_register_id.difference' string='Difference'
  • cash_register_id Many2one → account.bank.statement
    compute='_compute_cash_all' store=True string='Cash Register' args: 'account.bank.statement'
  • cash_register_total_entry_encoding Monetary
    help='Total of all paid sales orders' readonly=True related='cash_register_id.total_entry_encoding' string='Total Cash Transaction'
  • config_id Many2one → pos.config
    help='The physical point of sale you will use.' index=True required=True string='Point of Sale' args: 'pos.config'
  • currency_id Many2one → res.currency
    related='config_id.currency_id' string='Currency' args: 'res.currency'
  • journal_ids Many2many → account.journal
    readonly=True related='config_id.journal_ids' string='Available Payment Methods' args: 'account.journal'
  • login_number Integer
    default=0 help='A sequence number that is incremented each time a user resumes the pos session' string='Login Sequence Number'
  • name Char
    default='/' readonly=True required=True string='Session ID'
  • order_ids One2many → pos.order
    string='Orders' args: 'pos.order', 'session_id'
  • picking_count Integer
    compute='_compute_picking_count'
  • rescue Boolean
    copy=False help='Auto-generated session for orphan orders, ignored in constraints' readonly=True string='Recovery Session'
  • sequence_number Integer
    default=1 help='A sequence number that is incremented with each order' string='Order Sequence Number'
  • start_at Datetime
    readonly=True string='Opening Date'
  • state Selection
    copy=False default='opening_control' index=True readonly=True required=True string='Status' args: POS_SESSION_STATE
  • statement_ids One2many → account.bank.statement
    readonly=True string='Bank Statement' args: 'account.bank.statement', 'pos_session_id'
  • stop_at Datetime
    copy=False readonly=True string='Closing Date'
  • user_id Many2one → res.users
    default=<expr> index=True readonly=True required=True states={'opening_control': [('readonly', False)]} string='Responsible' args: 'res.users'
Public methods (10)
  • action_pos_session_close(self)
    @api.multi
  • action_pos_session_closing_control(self)
    @api.multi
  • action_pos_session_open(self)
    @api.multi
  • action_pos_session_validate(self)
    @api.multi
  • action_stock_picking(self)
    @api.multi
  • create(self, values)
    @api.model
  • login(self)
    @api.multi
  • open_cashbox(self)
    @api.multi
  • open_frontend_cb(self)
    @api.multi
  • unlink(self)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • unlink(self)
    @api.multi

New fields (3)
  • available_in_pos Boolean
    default=True help='Check if you want this product to appear in the Point of Sale' string='Available in Point of Sale'
  • pos_categ_id Many2one → pos.category
    help='Those categories are used to group similar products for point of sale.' string='Point of Sale Category' args: 'pos.category'
  • to_weight Boolean
    help='Check if the product should be weighted using the hardware scale integration' string='To Weigh With Scale'
Public methods (1)
  • unlink(self)
    @api.multi

New fields (1)
  • is_pos_groupable Boolean
    related='category_id.is_pos_groupable'
Public methods (0)

No public methods.

New fields (1)
  • is_pos_groupable Boolean
    help='Check if you want to group products of this category in point of sale orders' string='Group Products in POS'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • get_report_values(self, docids, data=None)
    @api.model

New fields (0)

No new fields.

Public methods (2)
  • get_report_values(self, docids, data=None)
    @api.multi
  • get_sale_details(self, date_start=False, date_stop=False, configs=False)
    @api.model
    Serialise the orders of the day information params: date_start, date_stop string representing the datetime of order

New fields (24)
  • average_price Float
    group_operator='avg' readonly=True string='Average Price'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=True string='Point of Sale' args: 'pos.config'
  • date Datetime
    readonly=True string='Date Order'
  • delay_validation Integer
    string='Delay Validation'
  • invoiced Boolean
    readonly=True
  • journal_id Many2one → account.journal
    string='Journal' args: 'account.journal'
  • location_id Many2one → stock.location
    readonly=True string='Location' args: 'stock.location'
  • nbr_lines Integer
    oldname='nbr' readonly=True string='# of Lines'
  • order_id Many2one → pos.order
    readonly=True string='Order' args: 'pos.order'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • pos_categ_id Many2one → pos.category
    readonly=True string='PoS Category' args: 'pos.category'
  • price_sub_total Float
    readonly=True string='Subtotal w/o discount'
  • price_total Float
    readonly=True string='Total Price'
  • pricelist_id Many2one → product.pricelist
    readonly=True string='Pricelist' args: 'product.pricelist'
  • product_categ_id Many2one → product.category
    readonly=True string='Product Category' args: 'product.category'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Integer
    readonly=True string='Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True string='Product Template' args: 'product.template'
  • session_id Many2one → pos.session
    readonly=True string='Session' args: 'pos.session'
  • state Selection
    string='Status' args: [('draft', 'New'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced'), ('cancel', 'Cancelled')]
  • stock_location_id Many2one → stock.location
    readonly=True string='Warehouse' args: 'stock.location'
  • total_discount Float
    readonly=True string='Total Discount'
  • user_id Many2one → res.users
    readonly=True string='Salesperson' args: 'res.users'
Public methods (1)
  • init(self)
    @api.model_cr

New fields (2)
  • barcode Char
    oldname='ean13' string='Barcode'
  • pos_order_count Integer
    compute='_compute_pos_order' groups='point_of_sale.group_pos_user' help='The number of point of sales orders related to this customer'
Public methods (1)
  • create_from_ui(self, partner)
    @api.model
    create or modify a partner from the point of sale ui. partner contains the partner's fields.

New fields (1)
  • pos_security_pin Char
    help='A Security PIN used to protect sensible functionality in the Point of Sale' size=32 string='Security PIN'
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/point_of_sale
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYPoint Of Sale
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, Olivier Dony, Thibault Delavallée, Denis Ledoux, Fabien Meghazi, Christophe Simonis, David Monjoie, Joren Van Onder, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Julien Legros, qdp-odoo, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Lucas Perais (lpe), Damien Bouvy, Yannick Tivisse, qsm-odoo, Pierre Masereel, De Paoli Quentin, Tanguy Charlier, len-odoo, Jorge Pinna Puissant, Gert Pellin - GPE, Nans Lefebvre, Denis Vermylen, Gert Pellin, Lucas Perais, KolushovAlexandr
WEBSITE
WEBSITEhttps://www.odoo.com/page/point-of-sale
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:50:47
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - stock_account
    - stock
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - web_tour
    - report
    - procurement
    - barcodes
    - web_planner
    - account
    - analytic
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Quick and Easy sale process
===========================

This module allows you to manage your shop sales very easily with a fully web based touchscreen interface.
It is compatible with all PC tablets and the iPad, offering multiple payment methods.

Product selection can be done in several ways:

* Using a barcode reader
* Browsing through categories of products or via a text search.

Main Features
-------------
* Fast encoding of the sale
* Choose one payment method (the quick way) or split the payment between several payment methods
* Computation of the amount of money to return
* Create and confirm the picking list automatically
* Allows the user to create an invoice automatically
* Refund previous sales
    

Code Analysis

Views touched (36)
XML IDNameModelTypeStatus
assets point_of_sale assets ir.ui.view qweb New
assets_backend hr assets ir.ui.view qweb Inherits web.assets_backend
index POS Index ir.ui.view qweb New
product_pos_category_form_view pos.category.form pos.category form New
product_pos_category_tree_view pos.category.tree pos.category tree New
product_template_form_view product.template.form.inherit product.template group Inherits stock.view_template_property_form
product_template_search_view_pos product.template.search.pos.form product.template filter Inherits product.product_template_search_view
report_saledetails report_saledetails ir.ui.view qweb New
report_statement report_statement ir.ui.view qweb New
report_userlabel report_userlabel ir.ui.view qweb New
res_users_form_view res.users.form.view res.users notebook Inherits base.view_users_form
view_account_journal_pos_user_form account.journal.pos.user.form.inherit account.journal xpath Inherits account.view_account_journal_form
view_partner_pos_kanban res.partner.pos.kanban.inherit res.partner field Inherits base.res_partner_kanban_view
view_partner_property_form res.partner.pos.form.inherit res.partner div Inherits base.view_partner_form
view_pos_config_form pos.config.form.view pos.config form New
view_pos_config_kanban pos.config.kanban.view pos.config kanban New
view_pos_config_search pos.config.search.view pos.config search New
view_pos_config_tree pos.config.tree.view pos.config tree New
view_pos_details_wizard pos.details.wizard.form pos.details.wizard form New
view_pos_discount pos.discount.form pos.discount form New
view_pos_open_statement pos.open.statement.form pos.open.statement form New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_line pos.order.line.tree pos.order.line tree New
view_pos_order_line_form pos.order.line.form pos.order.line form New
view_pos_order_search pos.order.search.view pos.order search New
view_pos_order_tree pos.order.tree pos.order tree New
view_pos_order_tree_all_sales_lines pos.order.line.all.sales.tree pos.order.line tree New
view_pos_payment pos.make.payment.form pos.make.payment form New
view_pos_pos_form pos.order.form pos.order form New
view_pos_session_form pos.session.form.view pos.session form New
view_pos_session_search pos.session.search.view pos.session search New
view_pos_session_tree pos.session.tree.view pos.session tree New
view_report_pos_order_graph report.pos.order.graph report.pos.order graph New
view_report_pos_order_pivot report.pos.order.pivot report.pos.order pivot New
view_report_pos_order_search report.pos.order.search report.pos.order search New
view_sale_config_settings_form_pos pos.config.settings.form pos.config.settings form New
Models touched (23)

New fields (2)
  • account_id Many2one → account.account
    readonly=True related='journal_id.default_debit_account_id' args: 'account.account'
  • pos_session_id Many2one → pos.session
    copy=False string='Session' args: 'pos.session'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • default_get(self, fields)
    @api.model

New fields (1)
  • pos_statement_id Many2one → pos.order
    ondelete='cascade' string='POS statement' args: 'pos.order'
Public methods (0)

No public methods.

New fields (1)
  • default_pos_id Many2one → pos.config
    string='This cashbox line is used by default when opening or closing a balance for this point of sale' args: 'pos.config'
Public methods (0)

No public methods.

New fields (2)
  • amount_authorized_diff Float
    help='This field depicts the maximum difference allowed between the ending balance and the theoretical cash when closing a session, for non-POS managers. If this maximum is reached, the user will have an error message at the closing of his session saying that he needs to contact his manager.' args: 'Amount Authorized Difference'
  • journal_user Boolean
    help='Check this box if this journal define a payment method that can be used in a point of sale.' args: 'Active in Point of Sale'
Public methods (1)
  • search(self, args, offset=0, limit=None, order=None, count=False)
    @api.model

New fields (1)
  • type Selection
    selection_add=[('weight', _('Weighted Product')), ('price', _('Priced Product')), ('discount', _('Discounted Product')), ('client', _('Client')), ('cashier', _('Cashier'))]
Public methods (0)

No public methods.

New fields (7)
  • child_id One2many → pos.category
    string='Children Categories' args: 'pos.category', 'parent_id'
  • image Binary
    attachment=True help='This field holds the image used as image for the cateogry, limited to 1024x1024px.'
  • image_medium Binary
    attachment=True help='Medium-sized image of the category. It is automatically resized as a 128x128px image, with aspect ratio preserved. Use this field in form views or some kanban views.' string='Medium-sized image'
  • image_small Binary
    attachment=True help='Small-sized image of the category. It is automatically resized as a 64x64px image, with aspect ratio preserved. Use this field anywhere a small image is required.' string='Small-sized image'
  • name Char
    required=True translate=True
  • parent_id Many2one → pos.category
    index=True string='Parent Category' args: 'pos.category'
  • sequence Integer
    help='Gives the sequence order when displaying a list of product categories.'
Public methods (3)
  • create(self, vals)
    @api.model
  • name_get(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (44)
  • active Boolean
    default=True
  • barcode_nomenclature_id Many2one → barcode.nomenclature
    default=_get_default_nomenclature help='Defines what kind of barcodes are available and how they are assigned to products, customers and cashiers' required=True string='Barcodes' args: 'barcode.nomenclature'
  • cash_control Boolean
    help='Check the amount of the cashbox at opening and closing.' string='Cash Control'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    compute='_compute_currency' string='Currency' args: 'res.currency'
  • current_session_id Many2one → pos.session
    compute='_compute_current_session' string='Current Session' args: 'pos.session'
  • current_session_state Char
    compute='_compute_current_session'
  • default_cashbox_lines_ids One2many → account.cashbox.line
    string='Default Balance' args: 'account.cashbox.line', 'default_pos_id'
  • default_fiscal_position_id Many2one → account.fiscal.position
    string='Default Fiscal Position' args: 'account.fiscal.position'
  • fiscal_position_ids Many2many → account.fiscal.position
    string='Fiscal Positions' args: 'account.fiscal.position'
  • group_by Boolean
    default=True help='Check this if you want to group the Journal Items by Product while closing a Session' string='Group Journal Items'
  • group_pos_manager_id Many2one → res.groups
    default=_get_group_pos_manager help='This field is there to pass the id of the pos manager group to the point of sale client' string='Point of Sale Manager Group' args: 'res.groups'
  • group_pos_user_id Many2one → res.groups
    default=_get_group_pos_user help='This field is there to pass the id of the pos user group to the point of sale client' string='Point of Sale User Group' args: 'res.groups'
  • iface_big_scrollbars Boolean
    help='For imprecise industrial touchscreens' args: 'Large Scrollbars'
  • iface_cashdrawer Boolean
    help='Automatically open the cashdrawer' string='Cashdrawer'
  • iface_display_categ_images Boolean
    help='The product categories will be displayed with pictures.' string='Display Category Pictures'
  • iface_electronic_scale Boolean
    help='Enables Electronic Scale integration' string='Electronic Scale'
  • iface_invoicing Boolean
    default=True help='Enables invoice generation from the Point of Sale' string='Invoicing'
  • iface_payment_terminal Boolean
    help='Enables Payment Terminal integration' string='Payment Terminal'
  • iface_precompute_cash Boolean
    help='The payment input will behave similarily to bank payment input, and will be prefilled with the exact due amount' string='Prefill Cash Payment'
  • iface_print_auto Boolean
    default=False help='The receipt will automatically be printed at the end of each order' string='Automatic Receipt Printing'
  • iface_print_skip_screen Boolean
    default=True help='The receipt screen will be skipped if the receipt can be printed automatically.' string='Skip Receipt Screen'
  • iface_print_via_proxy Boolean
    help='Bypass browser printing and prints via the hardware proxy' string='Print via Proxy'
  • iface_scan_via_proxy Boolean
    help='Enable barcode scanning with a remotely connected barcode scanner' string='Scan via Proxy'
  • iface_start_categ_id Many2one → pos.category
    help='The point of sale will display this product category by default. If no category is specified, all available products will be shown' string='Start Category' args: 'pos.category'
  • iface_tax_included Boolean
    help='The displayed prices will always include all taxes, even if the taxes have been setup differently' string='Include Taxes in Prices'
  • iface_vkeyboard Boolean
    help='Enables an integrated Virtual Keyboard' string='Virtual KeyBoard'
  • invoice_journal_id Many2one → account.journal
    default=_default_invoice_journal domain=[('type', '=', 'sale')] help='Accounting journal used to create invoices.' string='Invoice Journal' args: 'account.journal'
  • journal_id Many2one → account.journal
    default=_default_sale_journal domain=[('type', '=', 'sale')] help='Accounting journal used to post sales entries.' string='Sale Journal' args: 'account.journal'
  • journal_ids Many2many → account.journal
    domain="[('journal_user', '=', True ), ('type', 'in', ['bank', 'cash'])]" string='Available Payment Methods' args: 'account.journal', 'pos_config_journal_rel', 'pos_config_id', 'journal_id'
  • last_session_closing_cash Float
    compute='_compute_last_session'
  • last_session_closing_date Date
    compute='_compute_last_session'
  • name Char
    help='An internal identification of the point of sale' index=True required=True string='Point of Sale Name'
  • picking_type_id Many2one → stock.picking.type
    string='Picking Type' args: 'stock.picking.type'
  • pos_session_username Char
    compute='_compute_current_session_user'
  • pricelist_id Many2one → product.pricelist
    default=_default_pricelist required=True string='Pricelist' args: 'product.pricelist'
  • proxy_ip Char
    help='The hostname or ip address of the hardware proxy, Will be autodetected if left empty' size=45 string='IP Address'
  • receipt_footer Text
    help='A short text that will be inserted as a footer in the printed receipt' string='Receipt Footer'
  • receipt_header Text
    help='A short text that will be inserted as a header in the printed receipt' string='Receipt Header'
  • sequence_id Many2one → ir.sequence
    copy=False help='This sequence is automatically created by Odoo but you can change it to customize the reference numbers of your orders.' readonly=True string='Order IDs Sequence' args: 'ir.sequence'
  • session_ids One2many → pos.session
    string='Sessions' args: 'pos.session', 'config_id'
  • stock_location_id Many2one → stock.location
    default=_get_default_location domain=[('usage', '=', 'internal')] required=True string='Stock Location' args: 'stock.location'
  • tip_product_id Many2one → product.product
    help='The product used to encode the customer tip. Leave empty if you do not accept tips.' string='Tip Product' args: 'product.product'
  • uuid Char
    default=<expr> help='A globally unique identifier for this pos configuration, used to prevent conflicts in client-generated data' readonly=True
Public methods (7)
  • create(self, values)
    @api.model
  • name_get(self)
    @api.multi
  • open_existing_session_cb(self)
    @api.multi
  • open_existing_session_cb_close(self)
    @api.multi
  • open_session_cb(self)
    @api.multi
  • open_ui(self)
    @api.multi
  • unlink(self)
    @api.multi

New fields (6)
  • module_pos_data_drinks Boolean
    string='Import common drinks data'
  • module_pos_discount Selection
    help='Allows the cashier to quickly give a percentage sale discount for all the sales order to a customer' string='Discount' args: [(0, 'Allow discounts on order lines only'), (1, 'Allow global discounts')]
  • module_pos_loyalty Boolean
    help='Allows you to define a loyalty program in the point of sale, where the customers earn loyalty points and get rewards' string='Loyalty Program'
  • module_pos_mercury Selection
    help='The transactions are processed by MercuryPay' string='Credit Cards' args: [(0, 'No credit card'), (1, 'Allows customers to pay with credit cards.')]
  • module_pos_reprint Selection
    string='Reprints' args: [(0, 'No reprint'), (1, 'Allow cashier to reprint receipts')]
  • module_pos_restaurant Selection
    help='This module adds several restaurant features to the Point of Sale: \n\n- Bill Printing: Allows you to print a receipt before the order is paid \n\n- Bill Splitting: Allows you to split an order into different orders \n\n- Kitchen Order Printing: allows you to print orders updates to kitchen or bar printers' string='Restaurant' args: [(0, 'Point of sale for shops'), (1, 'Restaurant: activate table management')]
Public methods (0)

No public methods.

New fields (3)
  • end_date Datetime
    default=fields.Datetime.now required=True
  • pos_config_ids Many2many → pos.config
    default=<expr> args: 'pos.config', 'pos_detail_configs'
  • start_date Datetime
    default=_default_start_date required=True
Public methods (1)
  • generate_report(self)
    @api.multi

New fields (1)
  • discount Float
    default=5 digits=(16, 2) required=True string='Discount (%)'
Public methods (1)
  • apply_discount(self)
    @api.multi

New fields (4)
  • amount Float
    default=_default_amount digits=(16, 2) required=True
  • journal_id Many2one → account.journal
    default=_default_journal required=True string='Payment Mode' args: 'account.journal'
  • payment_date Date
    default=<expr> required=True string='Payment Date'
  • payment_name Char
    string='Payment Reference'
Public methods (2)
  • check(self)
    @api.multi
    Check the order: if the order is not paid: continue payment, if the order is paid print ticket.
  • launch_payment(self)

New fields (0)

No new fields.

Public methods (1)
  • open_statement(self)
    @api.multi

New fields (26)
  • account_move Many2one → account.move
    copy=False readonly=True string='Journal Entry' args: 'account.move'
  • amount_paid Float
    compute='_compute_amount_all' digits=0 readonly=True states={'draft': [('readonly', False)]} string='Paid'
  • amount_return Float
    compute='_compute_amount_all' digits=0 string='Returned'
  • amount_tax Float
    compute='_compute_amount_all' digits=0 string='Taxes'
  • amount_total Float
    compute='_compute_amount_all' digits=0 string='Total'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    related='session_id.config_id' string='Point of Sale' args: 'pos.config'
  • date_order Datetime
    default=fields.Datetime.now index=True readonly=True string='Order Date'
  • fiscal_position_id Many2one → account.fiscal.position
    comodel_name='account.fiscal.position' default=<expr> readonly=True states={'draft': [('readonly', False)]} string='Fiscal Position'
  • invoice_id Many2one → account.invoice
    copy=False string='Invoice' args: 'account.invoice'
  • lines One2many → pos.order.line
    copy=True readonly=True states={'draft': [('readonly', False)]} string='Order Lines' args: 'pos.order.line', 'order_id'
  • location_id Many2one → stock.location
    comodel_name='stock.location' readonly=True related='session_id.config_id.stock_location_id' store=True string='Location'
  • name Char
    copy=False default='/' readonly=True required=True string='Order Ref'
  • nb_print Integer
    copy=False default=0 readonly=True string='Number of Print'
  • note Text
    string='Internal Notes'
  • partner_id Many2one → res.partner
    change_default=True index=True states={'draft': [('readonly', False)], 'paid': [('readonly', False)]} string='Customer' args: 'res.partner'
  • picking_id Many2one → stock.picking
    copy=False readonly=True string='Picking' args: 'stock.picking'
  • picking_type_id Many2one → stock.picking.type
    related='session_id.config_id.picking_type_id' string='Picking Type' args: 'stock.picking.type'
  • pos_reference Char
    copy=False readonly=True string='Receipt Ref'
  • pricelist_id Many2one → product.pricelist
    default=_default_pricelist readonly=True required=True states={'draft': [('readonly', False)]} string='Pricelist' args: 'product.pricelist'
  • sale_journal Many2one → account.journal
    readonly=True related='session_id.config_id.journal_id' store=True string='Sale Journal' args: 'account.journal'
  • sequence_number Integer
    default=1 help='A session-unique sequence number for the order' string='Sequence Number'
  • session_id Many2one → pos.session
    default=_default_session domain="[('state', '=', 'opened')]" index=True readonly=True required=True states={'draft': [('readonly', False)]} string='Session' args: 'pos.session'
  • state Selection
    copy=False default='draft' readonly=True args: [('draft', 'New'), ('cancel', 'Cancelled'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced')], 'Status'
  • statement_ids One2many → account.bank.statement.line
    readonly=True states={'draft': [('readonly', False)]} string='Payments' args: 'account.bank.statement.line', 'pos_statement_id'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> help='Person who uses the cash register. It can be a reliever, a student or an interim employee.' states={'done': [('readonly', True)], 'invoiced': [('readonly', True)]} string='Salesman'
Public methods (14)
  • action_pos_order_cancel(self)
    @api.multi
  • action_pos_order_done(self)
    @api.multi
  • action_pos_order_invoice(self)
    @api.multi
  • action_pos_order_paid(self)
    @api.multi
  • action_view_invoice(self)
    @api.multi
  • add_payment(self, data)
    Create a new payment for the order
  • create(self, values)
    @api.model
  • create_from_ui(self, orders)
    @api.model
  • create_picking(self)
    Create a picking for each order and validate it.
  • refund(self)
    @api.multi
    Create a copy of order for refund order
  • set_pack_operation_lot(self, picking=None)
    Set Serial/Lot number in pack operations to mark the pack operation done.
  • test_paid(self)
    A Point of Sale is paid when the sum @return: True
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (14)
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • create_date Datetime
    readonly=True string='Creation Date'
  • discount Float
    default=0.0 digits=0 string='Discount (%)'
  • name Char
    copy=False required=True string='Line No'
  • notice Char
    string='Discount Notice'
  • order_id Many2one → pos.order
    ondelete='cascade' string='Order Ref' args: 'pos.order'
  • pack_lot_ids One2many → pos.pack.operation.lot
    string='Lot/serial Number' args: 'pos.pack.operation.lot', 'pos_order_line_id'
  • price_subtotal Float
    compute='_compute_amount_line_all' digits=0 string='Subtotal w/o Tax'
  • price_subtotal_incl Float
    compute='_compute_amount_line_all' digits=0 string='Subtotal'
  • price_unit Float
    digits=0 string='Unit Price'
  • product_id Many2one → product.product
    change_default=True domain=[('sale_ok', '=', True)] required=True string='Product' args: 'product.product'
  • qty Float
    default=1 digits=dp.get_precision('Product Unit of Measure') args: 'Quantity'
  • tax_ids Many2many → account.tax
    readonly=True string='Taxes' args: 'account.tax'
  • tax_ids_after_fiscal_position Many2many → account.tax
    compute='_get_tax_ids_after_fiscal_position' string='Taxes' args: 'account.tax'
Public methods (1)
  • create(self, values)
    @api.model

New fields (4)
  • lot_name Char
    args: 'Lot Name'
  • order_id Many2one → pos.order
    related='pos_order_line_id.order_id' args: 'pos.order'
  • pos_order_line_id Many2one → pos.order.line
    args: 'pos.order.line'
  • product_id Many2one → product.product
    related='pos_order_line_id.product_id' args: 'product.product'
Public methods (0)

No public methods.

New fields (21)
  • cash_control Boolean
    compute='_compute_cash_all' string='Has Cash Control'
  • cash_journal_id Many2one → account.journal
    compute='_compute_cash_all' store=True string='Cash Journal' args: 'account.journal'
  • cash_register_balance_end Monetary
    digits=0 help='Sum of opening balance and transactions.' readonly=True related='cash_register_id.balance_end' string='Theoretical Closing Balance'
  • cash_register_balance_end_real Monetary
    help='Total of closing cash control lines.' readonly=True related='cash_register_id.balance_end_real' string='Ending Balance'
  • cash_register_balance_start Monetary
    help='Total of opening cash control lines.' readonly=True related='cash_register_id.balance_start' string='Starting Balance'
  • cash_register_difference Monetary
    help='Difference between the theoretical closing balance and the real closing balance.' readonly=True related='cash_register_id.difference' string='Difference'
  • cash_register_id Many2one → account.bank.statement
    compute='_compute_cash_all' store=True string='Cash Register' args: 'account.bank.statement'
  • cash_register_total_entry_encoding Monetary
    help='Total of all paid sale orders' readonly=True related='cash_register_id.total_entry_encoding' string='Total Cash Transaction'
  • config_id Many2one → pos.config
    help='The physical point of sale you will use.' index=True required=True string='Point of Sale' args: 'pos.config'
  • currency_id Many2one → res.currency
    related='config_id.currency_id' string='Currency' args: 'res.currency'
  • journal_ids Many2many → account.journal
    readonly=True related='config_id.journal_ids' string='Available Payment Methods' args: 'account.journal'
  • login_number Integer
    default=0 help='A sequence number that is incremented each time a user resumes the pos session' string='Login Sequence Number'
  • name Char
    default='/' readonly=True required=True string='Session ID'
  • order_ids One2many → pos.order
    string='Orders' args: 'pos.order', 'session_id'
  • picking_count Integer
    compute='_compute_picking_count'
  • sequence_number Integer
    default=1 help='A sequence number that is incremented with each order' string='Order Sequence Number'
  • start_at Datetime
    readonly=True string='Opening Date'
  • state Selection
    copy=False default='opening_control' index=True readonly=True required=True string='Status' args: POS_SESSION_STATE
  • statement_ids One2many → account.bank.statement
    readonly=True string='Bank Statement' args: 'account.bank.statement', 'pos_session_id'
  • stop_at Datetime
    copy=False readonly=True string='Closing Date'
  • user_id Many2one → res.users
    default=<expr> index=True readonly=True required=True states={'opening_control': [('readonly', False)]} string='Responsible' args: 'res.users'
Public methods (9)
  • action_pos_session_close(self)
    @api.multi
  • action_pos_session_closing_control(self)
    @api.multi
  • action_pos_session_open(self)
    @api.multi
  • action_stock_picking(self)
    @api.multi
  • create(self, values)
    @api.model
  • login(self)
    @api.multi
  • open_cashbox(self)
    @api.multi
  • open_frontend_cb(self)
    @api.multi
  • unlink(self)
    @api.multi

New fields (3)
  • available_in_pos Boolean
    default=True help='Check if you want this product to appear in the Point of Sale' string='Available in the Point of Sale'
  • pos_categ_id Many2one → pos.category
    help='Those categories are used to group similar products for point of sale.' string='Point of Sale Category' args: 'pos.category'
  • to_weight Boolean
    help='Check if the product should be weighted using the hardware scale integration' string='To Weigh With Scale'
Public methods (1)
  • unlink(self)
    @api.multi

New fields (0)

No new fields.

Public methods (1)
  • render_html(self, docids, data=None)
    @api.model

New fields (0)

No new fields.

Public methods (2)
  • get_sale_details(self, date_start=False, date_stop=False, configs=False)
    @api.model
    Serialise the orders of the day information params: date_start, date_stop string representing the datetime of order
  • render_html(self, docids, data=None)
    @api.multi

New fields (24)
  • average_price Float
    group_operator='avg' readonly=True string='Average Price'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • config_id Many2one → pos.config
    readonly=True string='Point of Sale' args: 'pos.config'
  • date Datetime
    readonly=True string='Date Order'
  • delay_validation Integer
    string='Delay Validation'
  • invoiced Boolean
    readonly=True
  • journal_id Many2one → account.journal
    string='Journal' args: 'account.journal'
  • location_id Many2one → stock.location
    readonly=True string='Location' args: 'stock.location'
  • nbr_lines Integer
    oldname='nbr' readonly=True string='# of Lines'
  • order_id Many2one → pos.order
    readonly=True string='Order' args: 'pos.order'
  • partner_id Many2one → res.partner
    readonly=True string='Partner' args: 'res.partner'
  • pos_categ_id Many2one → pos.category
    readonly=True string='Public Category' args: 'pos.category'
  • price_sub_total Float
    readonly=True string='Subtotal w/o discount'
  • price_total Float
    readonly=True string='Total Price'
  • pricelist_id Many2one → product.pricelist
    readonly=True string='Pricelist' args: 'product.pricelist'
  • product_categ_id Many2one → product.category
    readonly=True string='Product Category' args: 'product.category'
  • product_id Many2one → product.product
    readonly=True string='Product' args: 'product.product'
  • product_qty Integer
    readonly=True string='Product Quantity'
  • product_tmpl_id Many2one → product.template
    readonly=True string='Product Template' args: 'product.template'
  • session_id Many2one → pos.session
    readonly=True string='Session' args: 'pos.session'
  • state Selection
    string='Status' args: [('draft', 'New'), ('paid', 'Paid'), ('done', 'Posted'), ('invoiced', 'Invoiced'), ('cancel', 'Cancelled')]
  • stock_location_id Many2one → stock.location
    readonly=True string='Warehouse' args: 'stock.location'
  • total_discount Float
    readonly=True string='Total Discount'
  • user_id Many2one → res.users
    readonly=True string='Salesperson' args: 'res.users'
Public methods (1)
  • init(self)
    @api.model_cr

New fields (2)
  • barcode Char
    help='BarCode' oldname='ean13' string='Barcode'
  • pos_order_count Integer
    compute='_compute_pos_order' groups='point_of_sale.group_pos_user' help='The number of point of sale orders related to this customer'
Public methods (1)
  • create_from_ui(self, partner)
    @api.model
    create or modify a partner from the point of sale ui. partner contains the partner's fields.

New fields (1)
  • pos_security_pin Char
    help='A Security PIN used to protect sensible functionality in the Point of Sale' size=32 string='Security PIN'
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/point_of_sale
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYPoint Of Sale
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, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Josse Colpaert, Denis Ledoux, Fabien Meghazi, Christophe Simonis, David Monjoie, Joren Van Onder, Frederic van der Essen, Goffin Simon, Cedric Snauwaert, Frédéric van der Essen, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Julien Legros, Richard Mathot, qdp-odoo, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Martin, GitHub, Lucas Perais (lpe), Damien Bouvy, pvy, Arthur Maniet, Yannick Tivisse, qsm-odoo, Cédric Snauwaert, Martin Geubelle, Pierre Masereel, odoo-tac, Laurent Smet
WEBSITE
WEBSITEhttps://www.odoo.com/page/point-of-sale
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:48:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_stock
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - account
    - product
    - decimal_precision
    - report
    - analytic
    - web_tip
    - web_planner
    - procurement
    - stock_account
    - stock
    - barcodes
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Quick and Easy sale process
===========================

This module allows you to manage your shop sales very easily with a fully web based touchscreen interface.
It is compatible with all PC tablets and the iPad, offering multiple payment methods.

Product selection can be done in several ways:

* Using a barcode reader
* Browsing through categories of products or via a text search.

Main Features
-------------
* Fast encoding of the sale
* Choose one payment method (the quick way) or split the payment between several payment methods
* Computation of the amount of money to return
* Create and confirm the picking list automatically
* Allows the user to create an invoice automatically
* Refund previous sales
    

Code Analysis

Views touched (55)
XML IDNameModelTypeStatus
assets point_of_sale assets ir.ui.view qweb New
assets_backend hr assets ir.ui.view qweb Inherits web.assets_backend
index POS Index ir.ui.view qweb New
product_pos_category_form_view pos.category.form pos.category form New
product_pos_category_tree_view pos.category.tree pos.category tree New
product_template_form_view product.template.form.inherit product.template group Inherits product.product_template_form_view
product_template_tree_view product.template.tree.inherit product.template field Inherits product.product_template_tree_view
report_detailsofsales report_detailsofsales ir.ui.view qweb New
report_payment report_payment ir.ui.view qweb New
report_receipt report_receipt ir.ui.view qweb New
report_saleslines report_saleslines ir.ui.view qweb New
report_sessionsummary report_sessionsummary ir.ui.view qweb New
report_statement report_statement ir.ui.view qweb New
report_userlabel report_userlabel ir.ui.view qweb New
report_usersproduct report_usersproduct ir.ui.view qweb New
res_users_form_preference_view res.users.form.view res.users xpath Inherits base.view_users_form_simple_modif
res_users_form_view res.users.form.view res.users notebook Inherits base.view_users_form
view_account_journal_pos_user_form POS Journal account.journal xpath Inherits account.view_account_journal_form
view_partner_property_form res.partner.pos.form.inherit res.partner xpath Inherits base.view_partner_form
view_pos_config_form pos.config.form.view pos.config form New
view_pos_config_kanban pos.config.kanban.view pos.config kanban New
view_pos_config_search pos.config.search.view pos.config search New
view_pos_config_tree pos.config.tree.view pos.config tree New
view_pos_confirm Post Sale Journal Entries pos.confirm form New
view_pos_details POS Details pos.details form New
view_pos_discount Apply Discount pos.discount form New
view_pos_open_statement Open Statements pos.open.statement form New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_line Sale lines pos.order.line tree New
view_pos_order_line_form Sale line pos.order.line form New
view_pos_order_search pos.order.search.view pos.order search New
view_pos_order_tree Orders pos.order tree New
view_pos_order_tree_all_sales_lines POS Sales Lines pos.order.line tree New
view_pos_payment Pay Order pos.make.payment form New
view_pos_pos_form pos.order pos.order form New
view_pos_session_form pos.session.form.view pos.session form New
view_pos_session_search pos.session.search.view pos.session search New
view_pos_session_tree pos.session.tree.view pos.session tree New
view_pos_trans_user_form report.trans.pos.user.form report.transaction.pos form New
view_report_pos_order_graph report.pos.order.graph report.pos.order graph New
view_report_pos_order_pivot report.pos.order.pivot report.pos.order pivot New
view_report_pos_order_search report.pos.order.search report.pos.order search New
view_report_sales_by_user_pos_calendar report.sales.by.user.pos.calendar report.sales.by.user.pos calendar New
view_report_sales_by_user_pos_form report.sales.by.user.pos.form report.sales.by.user.pos form New
view_report_sales_by_user_pos_graph report.sales.by.user.pos.graph report.sales.by.user.pos graph New
view_report_sales_by_user_pos_month_calendar report.sales.by.user.pos.month.calendar report.sales.by.user.pos.month calendar New
view_report_sales_by_user_pos_month_form report.sales.by.user.pos.month.form report.sales.by.user.pos.month form New
view_report_sales_by_user_pos_month_graph report.sales.by.user.pos.month.graph report.sales.by.user.pos.month graph New
view_report_sales_by_user_pos_month_tree report.sales.by.user.pos.month.tree report.sales.by.user.pos.month tree New
view_report_sales_by_user_pos_tree report.sales.by.user.pos.tree report.sales.by.user.pos tree New
view_report_transaction_pos_calendar report.transaction.pos.calendar report.transaction.pos calendar New
view_report_transaction_pos_graph report.transaction.pos.graph report.transaction.pos graph New
view_sale_config_settings_form_pos pos.config.settings.form pos.config.settings form New
view_trans_pos_user_tree Sales by user report.transaction.pos tree New
Models touched (8)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

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

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

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/8.0/point_of_sale
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYPoint Of Sale
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Atul Patel (OpenERP), Randhir Mayatra (OpenERP), Stephane Wirtel, Odoo Translation Bot, Turkesh Patel (Open ERP), Christophe Matthieu, Harry (OpenERP), Martin Trigaux, Ajay Chauhan (OpenERP), Foram Katharotiya (OpenERP), Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Tejas Tank, Thibault Delavallée, Vo Minh Thu, Josse Colpaert, Launchpad Translations on behalf of openerp, Quentin (OpenERP), Denis Ledoux, Alexis de Lattre, Fabien Meghazi, niv-openerp, ggh-openerp, Christophe Simonis, Frédéric Van der Essen, David Monjoie, Xavier Morel, Joren Van Onder, Frederic van der Essen, Goffin Simon, Anael Closson, Cedric Snauwaert, Simon Lejeune, Frédéric van der Essen, Nicolas Martinelli, Vidhin Mehta (OpenERP), Kersten Jeremy, Amit Bhavsar (Open ERP), Paramjit Singh Sahota, Nicolas Lempereur, Vidhin Mehta, Julien Legros, Richard Mathot, qdp-odoo, Niels Huylebroeck, Géry Debongnie, Darshan Kalola (OpenERP Trainee), jke-openerp, Aaron Bohy, Chandni Machchhar (OpenERP Trainee), Bharat R. Devnani (OpenERP), ged-odoo, ddm@openerp.com, Jeremy Kersten, Sylvain LE GAL, Kunal Chavda (Open ERP), Martin, ima-openerp, Gery Debongnie, Grover Menacho, Randhir Mayatra rma-openerp, Amit Vora (OpenERP Trainee), Mario Arias Badila, sgo@tinyerp.com, GitHub, Dimitri del Marmol, Lucas Perais (lpe)
WEBSITE
WEBSITEhttps://www.odoo.com/page/point-of-sale
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:45:38
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_stock
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web_kanban
    - web
    - web_kanban_sparkline
    - account_voucher
    - account
    - product
    - decimal_precision
    - report
    - analytic
    - board
    - edi
    - email_template
    - procurement
    - stock_account
    - stock
    - web_kanban_gauge
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Quick and Easy sale process
===========================

This module allows you to manage your shop sales very easily with a fully web based touchscreen interface.
It is compatible with all PC tablets and the iPad, offering multiple payment methods. 

Product selection can be done in several ways: 

* Using a barcode reader
* Browsing through categories of products or via a text search.

Main Features
-------------
* Fast encoding of the sale
* Choose one payment method (the quick way) or split the payment between several payment methods
* Computation of the amount of money to return
* Create and confirm the picking list automatically
* Allows the user to create an invoice automatically
* Refund previous sales
    

Code Analysis

Views touched (55)
XML IDNameModelTypeStatus
assets_backend point_of_sale assets ir.ui.view qweb Inherits web.assets_backend
index POS Index ir.ui.view qweb New
pos_ean13_generator pos.ean_wizard pos.ean_wizard form New
pos_session_opening_form_view pos.session.opening.form.view pos.session.opening form New
product_normal_form_view_inherit_ean product.form.inherit.ean product.product field Inherits product.product_normal_form_view
product_pos_category_form_view pos.category.form pos.category form New
product_pos_category_tree_view pos.category.tree pos.category tree New
product_template_form_view product.template.form.inherit product.template group Inherits product.product_template_form_view
product_template_form_view_inherit_ean product.template.only.form.inherit.ean product.template field Inherits product.product_template_only_form_view
report_detailsofsales report_detailsofsales ir.ui.view qweb New
report_payment report_payment ir.ui.view qweb New
report_receipt report_receipt ir.ui.view qweb New
report_saleslines report_saleslines ir.ui.view qweb New
report_sessionsummary report_sessionsummary ir.ui.view qweb New
report_statement report_statement ir.ui.view qweb New
report_usersproduct report_usersproduct ir.ui.view qweb New
res_users_form_preference_view res.users.form.view res.users xpath Inherits base.view_users_form_simple_modif
res_users_form_view res.users.form.view res.users notebook Inherits base.view_users_form
view_account_journal_pos_user_form POS Journal account.journal xpath Inherits account.view_account_journal_form
view_cash_statement_pos_tree account.bank.statement.tree account.bank.statement field Inherits account.view_cash_statement_tree
view_partner_property_form res.partner.product.property.form.inherit res.partner notebook Inherits base.view_partner_form
view_pos_config_form pos.config.form.view pos.config form New
view_pos_config_search pos.config.search.view pos.config search New
view_pos_config_tree pos.config.tree.view pos.config tree New
view_pos_confirm Post Sale Journal Entries pos.confirm form New
view_pos_confirm_cash_statement_filter account.bank.statement.inherit2 account.bank.statement search New
view_pos_details POS Details pos.details form New
view_pos_discount Apply Discount pos.discount form New
view_pos_open_cash_statement_filter account.bank.statement.inherit account.bank.statement search New
view_pos_open_statement Open Statements pos.open.statement form New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_line Sale lines pos.order.line tree New
view_pos_order_line_form Sale line pos.order.line form New
view_pos_order_tree Orders pos.order tree New
view_pos_order_tree_all_sales_lines POS Sales Lines pos.order.line tree New
view_pos_payment Pay Order pos.make.payment form New
view_pos_pos_form pos.order pos.order form New
view_pos_session_form pos.session.form.view pos.session form New
view_pos_session_search pos.session.search.view pos.session search New
view_pos_session_tree pos.session.tree.view pos.session tree New
view_pos_trans_user_form report.trans.pos.user.form report.transaction.pos form New
view_report_pos_order_graph report.pos.order.graph report.pos.order graph New
view_report_pos_order_search report.pos.order.search report.pos.order search New
view_report_sales_by_user_pos_calendar report.sales.by.user.pos.calendar report.sales.by.user.pos calendar New
view_report_sales_by_user_pos_form report.sales.by.user.pos.form report.sales.by.user.pos form New
view_report_sales_by_user_pos_graph report.sales.by.user.pos.graph report.sales.by.user.pos graph New
view_report_sales_by_user_pos_month_calendar report.sales.by.user.pos.month.calendar report.sales.by.user.pos.month calendar New
view_report_sales_by_user_pos_month_form report.sales.by.user.pos.month.form report.sales.by.user.pos.month form New
view_report_sales_by_user_pos_month_graph report.sales.by.user.pos.month.graph report.sales.by.user.pos.month graph New
view_report_sales_by_user_pos_month_tree report.sales.by.user.pos.month.tree report.sales.by.user.pos.month tree New
view_report_sales_by_user_pos_tree report.sales.by.user.pos.tree report.sales.by.user.pos tree New
view_report_transaction_pos_calendar report.transaction.pos.calendar report.transaction.pos calendar New
view_report_transaction_pos_graph report.transaction.pos.graph report.transaction.pos graph New
view_trans_pos_user_tree Sales by user report.transaction.pos tree New
Models touched (7)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

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

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

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/point_of_sale
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYPoint Of Sale
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, Rucha (Open ERP), Atul Patel (OpenERP), Jalpesh Patel (OpenERP), Randhir Mayatra (OpenERP), Stephane Wirtel, Odoo Translation Bot, Turkesh Patel (Open ERP), Numerigraphe - Lionel Sausin, Christophe Matthieu, Benoit Guillot, Harry (OpenERP), Antonin Bourguignon, ajay javiya (OpenERP), Martin Trigaux, Ajay Chauhan (OpenERP), Foram Katharotiya (OpenERP), Bhumika (OpenERP), Purnendu Singh (OpenERP), Saurang Suthar (OpenERP), Fabien Pinckaers, Antony Lesuisse, Bharat Devnani (OpenERP), Meera Trambadia (OpenERP), Saurang Suthar, Olivier Dony, Rajesh Prajapati (OpenERP), Twinkle (OpenERP), Divyesh Makwana (Open ERP), Tejas Tank, Thibault Delavallée, Vo Minh Thu, Hardik, Josse Colpaert, Arnaud Pineux, pso (OpenERP), Sbh (Openerp), Amit Patel (OpenERP), Launchpad Translations on behalf of openerp, vta vta@openerp.com, Quentin (OpenERP), Nimesh (Open ERP), Denis Ledoux, Mayur Maheshwari (OpenERP), Jigar Amin - OpenERP, Sanjay Gohel (Open ERP), Alexis de Lattre, Fabien Meghazi, niv-openerp, ggh-openerp, Xavier ALT, Christophe Simonis, Frédéric Van der Essen, Ujjvala Collins (OpenERP), David Monjoie, Ravi Gohil (OpenERP), Xavier Morel, Joren Van Onder, Frederic van der Essen, Jiten (OpenERP), Denis Ledoux dle@openerp.com, Dharti Ratani (OpenERP), Goffin Simon, Anael Closson, Khushboo Bhatt (Open ERP), Mohammed Shekha, dle@openerp.com, Bhumi Thakkar (Open ERP), Roberto López López (OpenERP), Cedric Snauwaert, Ravish Murari (OpenERP), Amit Patel, Simon Lejeune, Frédéric van der Essen, Gilles Major, Ravi Gohil, Chris Biersbach, Vishmita, Vijaykumar Baladaniya, Hardik Ansodariya, Phil Frost
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:43:08
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_stock
    - sale
    - account_voucher
    - account
    - base_setup
    - base
    - web_kanban
    - web
    - product
    - process
    - decimal_precision
    - mail
    - analytic
    - board
    - edi
    - email_template
    - stock
    - procurement
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Quick and Easy sale process
===========================

This module allows you to manage your shop sales very easily with a fully web based touchscreen interface.
It is compatible with all PC tablets and the iPad, offering multiple payment methods. 

Product selection can be done in several ways: 

* Using a barcode reader
* Browsing through categories of products or via a text search.

Main Features
-------------
* Fast encoding of the sale
* Choose one payment method (the quick way) or split the payment between several payment methods
* Computation of the amount of money to return
* Create and confirm the picking list automatically
* Allows the user to create an invoice automatically
* Refund previous sales
    

Code Analysis

Views touched (62)
XML IDNameModelTypeStatus
pos_category_form_view pos.category.form pos.category form New
pos_category_tree_view pos.category.tree pos.category tree New
pos_ean13_generator pos.ean_wizard pos.ean_wizard form New
pos_payment_report_user_form pos.payment.report.user.form pos.payment.report.user form New
pos_return_form pos.return pos.return form New
pos_return_form_in pos.return.memory pos.return.memory form New
pos_return_tree_in pos.return.memory pos.return.memory tree New
pos_session_opening_form_view pos.session.opening.form.view pos.session.opening form New
product_normal_form_view product.normal.form.inherit product.product group Inherits stock.view_normal_procurement_locations_form
res_users_form_preference_view res.users.form.view res.users xpath Inherits base.view_users_form_simple_modif
res_users_form_view res.users.form.view res.users notebook Inherits base.view_users_form
view_account_journal_pos_user_form POS Journal account.journal xpath Inherits account.view_account_journal_form
view_box_entries Box Entries pos.box.entries form New
view_cash_statement_pos_tree account.bank.statement.tree account.bank.statement field Inherits account.view_cash_statement_tree
view_partner_property_form res.partner.product.property.form.inherit res.partner notebook Inherits base.view_partner_form
view_pos_box_out Box Out pos.box.out form New
view_pos_config_form pos.config.form.view pos.config form New
view_pos_config_search pos.config.search.view pos.config search New
view_pos_config_tree pos.config.tree.view pos.config tree New
view_pos_confirm Post Sale Journal Entries pos.confirm form New
view_pos_confirm_cash_statement_filter account.bank.statement.inherit2 account.bank.statement search New
view_pos_details POS Details pos.details form New
view_pos_discount Apply Discount pos.discount form New
view_pos_open_cash_statement_filter account.bank.statement.inherit account.bank.statement search New
view_pos_open_statement Open Statements pos.open.statement form New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_line Sale lines pos.order.line tree New
view_pos_order_line_form Sale line pos.order.line form New
view_pos_order_tree Orders pos.order tree New
view_pos_order_tree_all_sales_lines POS Sales Lines pos.order.line tree New
view_pos_payment Pay Order pos.make.payment form New
view_pos_payment_report Payment Report pos.payment.report form New
view_pos_payment_report Payment Report pos.payment.report form New
view_pos_pos_form pos.order pos.order form New
view_pos_receipt Receipt pos.receipt form New
view_pos_sale_user Sale By User pos.sale.user form New
view_pos_session_form pos.session.form.view pos.session form New
view_pos_session_search pos.session.search.view pos.session search New
view_pos_session_tree pos.session.tree.view pos.session tree New
view_pos_trans_user_form report.trans.pos.user.form report.transaction.pos form New
view_report_pos_order_search report.pos.order.search report.pos.order search New
view_report_pos_order_tree report.pos.order.tree report.pos.order tree New
view_report_sales_by_margin_pos_calendar report.sales.by.margin.pos.calendar report.sales.by.margin.pos calendar New
view_report_sales_by_margin_pos_form report.sales.by.margin.pos.form report.sales.by.margin.pos form New
view_report_sales_by_margin_pos_graph report.sales.by.margin.pos.graph report.sales.by.margin.pos graph New
view_report_sales_by_margin_pos_month_calendar report.sales.by.margin.pos.month.calendar report.sales.by.margin.pos.month calendar New
view_report_sales_by_margin_pos_month_form report.sales.by.margin.pos.month.form report.sales.by.margin.pos.month form New
view_report_sales_by_margin_pos_month_graph report.sales.by.margin.pos.month.graph report.sales.by.margin.pos.month graph New
view_report_sales_by_margin_pos_month_tree report.sales.by.margin.pos.month.tree report.sales.by.margin.pos.month tree New
view_report_sales_by_margin_pos_tree report.sales.by.margin.pos.tree report.sales.by.margin.pos tree New
view_report_sales_by_user_pos_calendar report.sales.by.user.pos.calendar report.sales.by.user.pos calendar New
view_report_sales_by_user_pos_form report.sales.by.user.pos.form report.sales.by.user.pos form New
view_report_sales_by_user_pos_graph report.sales.by.user.pos.graph report.sales.by.user.pos graph New
view_report_sales_by_user_pos_month_calendar report.sales.by.user.pos.month.calendar report.sales.by.user.pos.month calendar New
view_report_sales_by_user_pos_month_form report.sales.by.user.pos.month.form report.sales.by.user.pos.month form New
view_report_sales_by_user_pos_month_graph report.sales.by.user.pos.month.graph report.sales.by.user.pos.month graph New
view_report_sales_by_user_pos_month_tree report.sales.by.user.pos.month.tree report.sales.by.user.pos.month tree New
view_report_sales_by_user_pos_tree report.sales.by.user.pos.tree report.sales.by.user.pos tree New
view_report_transaction_pos_calendar report.transaction.pos.calendar report.transaction.pos calendar New
view_report_transaction_pos_graph report.transaction.pos.graph report.transaction.pos graph New
view_trans_pos_user_tree Sales by user report.transaction.pos tree New
Models touched (0)

No models found for this module.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/6.1/point_of_sale
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYPoint Of Sale
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Jagdish Panchal (Open ERP), Rucha (Open ERP), Stephane Wirtel, Numerigraphe - Lionel Sausin, Harry (OpenERP), Fabien Pinckaers, Antony Lesuisse, Bharat Devnani (OpenERP), Meera Trambadia (OpenERP), Olivier Dony, Thibault Delavallée, Vo Minh Thu, pso (OpenERP), Launchpad Translations on behalf of openerp, Quentin (OpenERP), vro, olt@tinyerp.com, niv-openerp, Xavier ALT, Christophe Simonis, Ujjvala Collins (OpenERP), Xavier Morel, Khushboo Bhatt (Open ERP), Hardik Ansodariya, Amit (OpenERP), Minh Tran, Thibault Francois, Stefan Rijnhart, vishmita, Carlos Vásquez, Husen Daudi, Els Van Vossel, Israel Fermin Montilla, Rifakat Haradwala (Open ERP), Hardik Ansodariy (OpenERP), rch-openerp, Bharat (OpenERP), ARA (OpenERP), aag (OpenERP), ron@tinyerp.com, mtr, fp, qdp-launchpad@tinyerp.com, AMP (OpenERP), ksa (OpenERP), ado, Mustufa Rangwala, Naresh (OpenERP)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:41:35
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale
    - stock
    - product
    - base
    - process
    - decimal_precision
    - account
    - base_setup
    - analytic
    - board
    - edi
    - email_template
    - mail
    - base_tools
    - procurement
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module provides a quick and easy sale process.
===================================================

Main features :
---------------
    * Fast encoding of the sale.
    * Allow to choose one payment mode (the quick way) or to split the payment between several payment mode.
    * Computation of the amount of money to return.
    * Create and confirm picking list automatically.
    * Allow the user to create invoice automatically.
    * Allow to refund former sales.
    

Code Analysis

Views touched (54)
XML IDNameModelTypeStatus
pos_category_form_view pos.category.form pos.category form New
pos_category_tree_view pos.category.tree pos.category tree New
pos_payment_report_user_form pos.payment.report.user.form pos.payment.report.user form New
pos_return_form pos.return pos.return form New
pos_return_form_in pos.return.memory pos.return.memory form New
pos_return_tree_in pos.return.memory pos.return.memory tree New
product_normal_form_pos_view product.normal.pos.form.inherit product.product group Inherits product.product_normal_form_view
product_normal_form_view product.normal.form.inherit product.product field Inherits product.product_normal_form_view
view_account_journal_pos_user_form POS Journal account.journal xpath Inherits account.view_account_journal_form
view_box_entries Box Entries pos.box.entries form New
view_cash_statement_pos_tree account.bank.statement.tree account.bank.statement field Inherits account.view_cash_statement_tree
view_pos_box_out Box Out pos.box.out form New
view_pos_close_statement Close Statements pos.close.statement form New
view_pos_confirm Post Sale Journal Entries pos.confirm form New
view_pos_confirm_cash_statement_filter account.bank.statement.inherit2 account.bank.statement search New
view_pos_details POS Details pos.details form New
view_pos_discount Apply Discount pos.discount form New
view_pos_open_cash_statement_filter account.bank.statement.inherit account.bank.statement search New
view_pos_open_statement Open Statements pos.open.statement form New
view_pos_order_filter pos.order.list.select pos.order search New
view_pos_order_line Sale lines pos.order.line tree New
view_pos_order_line_form Sale line pos.order.line form New
view_pos_order_tree Sales pos.order tree New
view_pos_order_tree_all_sales_lines POS Sales Lines pos.order.line tree New
view_pos_payment Add payment : pos.make.payment form New
view_pos_payment_report Pyament Report pos.payment.report form New
view_pos_payment_report Payment Report pos.payment.report form New
view_pos_pos_form pos.order pos.order form New
view_pos_receipt Receipt pos.receipt form New
view_pos_sale_user Sale By User pos.sale.user form New
view_pos_trans_user_form report.trans.pos.user.form report.transaction.pos form New
view_report_cash_register_search report.cash.register.search report.cash.register search New
view_report_cash_register_tree report.cash.register.tree report.cash.register tree New
view_report_pos_order_search report.pos.order.search report.pos.order search New
view_report_pos_order_tree report.pos.order.tree report.pos.order tree New
view_report_sales_by_margin_pos_calendar report.sales.by.margin.pos.calendar report.sales.by.margin.pos calendar New
view_report_sales_by_margin_pos_form report.sales.by.margin.pos.form report.sales.by.margin.pos form New
view_report_sales_by_margin_pos_graph report.sales.by.margin.pos.graph report.sales.by.margin.pos graph New
view_report_sales_by_margin_pos_month_calendar report.sales.by.margin.pos.month.calendar report.sales.by.margin.pos.month calendar New
view_report_sales_by_margin_pos_month_form report.sales.by.margin.pos.month.form report.sales.by.margin.pos.month form New
view_report_sales_by_margin_pos_month_graph report.sales.by.margin.pos.month.graph report.sales.by.margin.pos.month graph New
view_report_sales_by_margin_pos_month_tree report.sales.by.margin.pos.month.tree report.sales.by.margin.pos.month tree New
view_report_sales_by_margin_pos_tree report.sales.by.margin.pos.tree report.sales.by.margin.pos tree New
view_report_sales_by_user_pos_calendar report.sales.by.user.pos.calendar report.sales.by.user.pos calendar New
view_report_sales_by_user_pos_form report.sales.by.user.pos.form report.sales.by.user.pos form New
view_report_sales_by_user_pos_graph report.sales.by.user.pos.graph report.sales.by.user.pos graph New
view_report_sales_by_user_pos_month_calendar report.sales.by.user.pos.month.calendar report.sales.by.user.pos.month calendar New
view_report_sales_by_user_pos_month_form report.sales.by.user.pos.month.form report.sales.by.user.pos.month form New
view_report_sales_by_user_pos_month_graph report.sales.by.user.pos.month.graph report.sales.by.user.pos.month graph New
view_report_sales_by_user_pos_month_tree report.sales.by.user.pos.month.tree report.sales.by.user.pos.month tree New
view_report_sales_by_user_pos_tree report.sales.by.user.pos.tree report.sales.by.user.pos tree New
view_report_transaction_pos_calendar report.transaction.pos.calendar report.transaction.pos calendar New
view_report_transaction_pos_graph report.transaction.pos.graph report.transaction.pos graph New
view_trans_pos_user_tree Sales by user report.transaction.pos tree New
Models touched (0)

No models found for this module.