Sale Coupon

sale_coupon
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/sale_coupon
VERSION
VERSION 1.0
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Goffin Simon, Jeremy Kersten, GitHub, Yannick Tivisse, Pierre Masereel, Romain Derie, Jorge Pinna Puissant, Adrian Torres, Xavier-Do, Victor Feyens, Andrea Grazioso (agr-odoo), Joseph Caburnay, svs-odoo, Achraf (abz), nie, Tiffany Chang (tic), Ivàn Todorovich, William Braeckman, Kevin Baptiste, Pratima Gupta, pedrambiria, momegahed, prro-odoo, Florian Damhaut, MerlinGuillaume, anhe-odoo, Walid HANNICHE (waha), Nicolas Bayet, Thomas Lefebvre (thle), David, Mylyna Hy, Valentin Vallaeys (vava), Đặng Văn Lộc, Valeriya(vchu), odoostan
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:28
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - coupon
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - sale
    - sales_team
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Integrate coupon mechanism in sales orders.

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
res_config_settings_view_form res.config.settings.view.form.inherit.sale.coupon res.config.settings xpath Inherits sale.res_config_settings_view_form
sale_coupon_apply_code_view_form sale.coupon.apply.code.form sale.coupon.apply.code form New
sale_coupon_program_view_coupon_program_form coupon.program.form coupon.program xpath Inherits coupon.coupon_program_view_coupon_program_form
sale_coupon_program_view_promo_program_form coupon.program.form coupon.program xpath Inherits coupon.coupon_program_view_promo_program_form
sale_coupon_view_coupon_program_kanban coupon.program.kanban coupon.program xpath Inherits coupon.view_coupon_program_kanban
sale_coupon_view_form coupon.coupon.form coupon.coupon xpath Inherits coupon.coupon_view_form
sale_coupon_view_tree coupon.coupon.tree coupon.coupon xpath Inherits coupon.coupon_view_tree
sale_order_view_form sale.order.form.inherit.coupon sale.order xpath Inherits sale.view_order_form
Models touched (5)

New fields (2)
  • order_id Many2one → sale.order
    help='The sales order from which coupon is generated' readonly=True args: 'sale.order', 'Order Reference'
  • sales_order_id Many2one → sale.order
    help='The sales order on which the coupon is applied' readonly=True args: 'sale.order', 'Used in'
Public methods (0)

No public methods.

New fields (1)
  • order_count Integer
    compute='_compute_order_count'
Public methods (1)
  • action_view_sales_orders(self)

New fields (1)
  • coupon_code Char
    required=True string='Code'
Public methods (2)
  • apply_coupon(self, order, coupon_code)
  • process_coupon(self)
    Apply the entered coupon code if valid, raise an UserError otherwise.

New fields (6)
  • applied_coupon_ids One2many → coupon.coupon
    copy=False string='Applied Coupons' args: 'coupon.coupon', 'sales_order_id'
  • code_promo_program_id Many2one → coupon.program
    copy=False domain="[('promo_code_usage', '=', 'code_needed'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Applied Promo Program' args: 'coupon.program'
  • generated_coupon_ids One2many → coupon.coupon
    copy=False string='Offered Coupons' args: 'coupon.coupon', 'order_id'
  • no_code_promo_program_ids Many2many → coupon.program
    copy=False domain="[('promo_code_usage', '=', 'no_code_needed'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Applied Immediate Promo Programs' args: 'coupon.program'
  • promo_code Char
    help='Applied program code' readonly=False related='code_promo_program_id.promo_code'
  • reward_amount Float
    compute='_compute_reward_total'
Public methods (5)
  • action_confirm(self)
  • action_draft(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • recompute_coupon_lines(self)
  • update_prices(self)
    Recompute coupons/promotions after pricelist prices reset.

New fields (1)
  • is_reward_line Boolean
    args: 'Is a program reward line'
Public methods (2)
  • modified(self, fnames, *args, **kwargs)
  • unlink(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/sale_coupon
VERSION
VERSION 1.0
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Martinelli, Jeremy Kersten, Damien Bouvy, Barad Mahendra, Yannick Tivisse, Pierre Masereel, Romain Derie, Jorge Pinna Puissant, Alexandre Kühn, Arnold Moyaux, Xavier-Do, jvm-odoo, Victor Feyens, Andrea Grazioso (agr-odoo), Loan (lse), fw-bot, Achraf (abz), Lucas Lefèvre, Swapnesh Shah, nie, Ivàn Todorovich, William Braeckman, Kevin Baptiste, roen-odoo, pedrambiria, momegahed, prro-odoo, Florian Damhaut, MerlinGuillaume, anhe-odoo, Walid HANNICHE (waha), Thomas Lefebvre (thle), David, Valentin Vallaeys (vava), Valeriya(vchu)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - coupon
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - sale
    - sales_team
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Integrate coupon mechanism in sales orders.

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
res_config_settings_view_form res.config.settings.view.form.inherit.sale.coupon res.config.settings xpath Inherits sale.res_config_settings_view_form
sale_coupon_apply_code_view_form sale.coupon.apply.code.form sale.coupon.apply.code form New
sale_coupon_program_view_coupon_program_form coupon.program.form coupon.program xpath Inherits coupon.coupon_program_view_coupon_program_form
sale_coupon_program_view_promo_program_form coupon.program.form coupon.program xpath Inherits coupon.coupon_program_view_promo_program_form
sale_coupon_view_coupon_program_kanban coupon.program.kanban coupon.program xpath Inherits coupon.view_coupon_program_kanban
sale_coupon_view_form coupon.coupon.form coupon.coupon xpath Inherits coupon.coupon_view_form
sale_coupon_view_tree coupon.coupon.tree coupon.coupon xpath Inherits coupon.coupon_view_tree
sale_order_view_form sale.order.form.inherit.coupon sale.order xpath Inherits sale.view_order_form
Models touched (5)

New fields (2)
  • order_id Many2one → sale.order
    help='The sales order from which coupon is generated' readonly=True args: 'sale.order', 'Order Reference'
  • sales_order_id Many2one → sale.order
    help='The sales order on which the coupon is applied' readonly=True args: 'sale.order', 'Used in'
Public methods (0)

No public methods.

New fields (1)
  • order_count Integer
    compute='_compute_order_count'
Public methods (1)
  • action_view_sales_orders(self)

New fields (1)
  • coupon_code Char
    required=True string='Code'
Public methods (2)
  • apply_coupon(self, order, coupon_code)
  • process_coupon(self)
    Apply the entered coupon code if valid, raise an UserError otherwise.

New fields (6)
  • applied_coupon_ids One2many → coupon.coupon
    copy=False string='Applied Coupons' args: 'coupon.coupon', 'sales_order_id'
  • code_promo_program_id Many2one → coupon.program
    copy=False domain="[('promo_code_usage', '=', 'code_needed'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Applied Promo Program' args: 'coupon.program'
  • generated_coupon_ids One2many → coupon.coupon
    copy=False string='Offered Coupons' args: 'coupon.coupon', 'order_id'
  • no_code_promo_program_ids Many2many → coupon.program
    copy=False domain="[('promo_code_usage', '=', 'no_code_needed'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Applied Immediate Promo Programs' args: 'coupon.program'
  • promo_code Char
    help='Applied program code' readonly=False related='code_promo_program_id.promo_code'
  • reward_amount Float
    compute='_compute_reward_total'
Public methods (5)
  • action_confirm(self)
  • action_draft(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • recompute_coupon_lines(self)
  • update_prices(self)
    Recompute coupons/promotions after pricelist prices reset.

New fields (1)
  • is_reward_line Boolean
    args: 'Is a program reward line'
Public methods (2)
  • modified(self, fnames, *args, **kwargs)
  • unlink(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/sale_coupon
VERSION
VERSION 1.0
CATEGORY
CATEGORYSales/Sales
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Jeremy Kersten, Damien Bouvy, Olivier Colson, Yannick Tivisse, qsm-odoo, Odoo Online, Romain Derie, Jorge Pinna Puissant, Adrian Torres, Julien Castiaux, Xavier-Do, jvm-odoo, Victor Feyens, Andrea Grazioso (agr-odoo), Loan (lse), Achraf (abz), Baptiste Vergote, Swapnesh Shah, nie, William Braeckman, Guillaume (guva), pedrambiria, momegahed, prro-odoo, Florian Damhaut, Nicolás Mac Rouillon, anhe-odoo, Walid HANNICHE (waha), jcoux
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale_management
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - payment
    - account
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Integrate coupon mechanism in sales orders.

Code Analysis

Views touched (16)
XML IDNameModelTypeStatus
report_coupon report_coupon ir.ui.view qweb New
report_coupon_i18n report_coupon_i18n ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form.inherit.sale.coupon res.config.settings xpath Inherits sale.res_config_settings_view_form
sale_coupon_apply_code_view_form sale.coupon.apply.code.form sale.coupon.apply.code form New
sale_coupon_generate_view_form sale.coupon.generate.form sale.coupon.generate form New
sale_coupon_program_view_form sale.coupon.program.form sale.coupon.program xpath Inherits sale_coupon_program_view_form_common
sale_coupon_program_view_form_common sale.coupon.program.common.form sale.coupon.program form New
sale_coupon_program_view_promo_program_form sale.coupon.promotion.program.form sale.coupon.program xpath Inherits sale_coupon_program_view_form_common
sale_coupon_program_view_promo_program_search sale.coupon.promotion.program.search sale.coupon.program search New
sale_coupon_program_view_promo_program_tree sale.coupon.promotion.program.tree sale.coupon.program tree New
sale_coupon_program_view_search sale.coupon.program.search sale.coupon.program search New
sale_coupon_program_view_tree sale.coupon.program.tree sale.coupon.program tree New
sale_coupon_view_form sale.coupon.form sale.coupon form New
sale_coupon_view_tree sale.coupon.tree sale.coupon tree New
sale_order_view_form sale.order.form.inherit.coupon sale.order xpath Inherits sale.view_order_form
view_sale_coupon_program_kanban sale.coupon.program.kanban sale.coupon.program kanban New
Models touched (9)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (8)
  • code Char
    default=_generate_code readonly=True required=True
  • discount_line_product_id Many2one → product.product
    help='Product used in the sales order to apply the discount.' readonly=False related='program_id.discount_line_product_id' args: 'product.product'
  • expiration_date Date
    compute='_compute_expiration_date' args: 'Expiration Date'
  • order_id Many2one → sale.order
    help='The sales order from which coupon is generated' readonly=True args: 'sale.order', 'Order Reference'
  • partner_id Many2one → res.partner
    args: 'res.partner', 'For Customer'
  • program_id Many2one → sale.coupon.program
    ondelete='cascade' required=True args: 'sale.coupon.program', 'Program'
  • sales_order_id Many2one → sale.order
    help='The sales order on which the coupon is applied' readonly=True args: 'sale.order', 'Applied on order'
  • state Selection
    default='new' required=True args: [('reserved', 'Reserved'), ('new', 'Valid'), ('used', 'Consumed'), ('expired', 'Expired')]
Public methods (2)
  • action_coupon_sent(self)
    Open a window to compose an email, with the edi invoice template message loaded by default
  • cron_expire_coupon(self)

New fields (1)
  • coupon_code Char
    required=True string='Code'
Public methods (2)
  • apply_coupon(self, order, coupon_code)
  • process_coupon(self)
    Apply the entered coupon code if valid, raise an UserError otherwise.

New fields (3)
  • generation_type Selection
    default='nbr_coupon' args: [('nbr_coupon', 'Number of Coupons'), ('nbr_customer', 'Number of Selected Customers')]
  • nbr_coupons Integer
    default=1 help='Number of coupons' string='Number of Coupons'
  • partners_domain Char
    default='[]' string='Customer'
Public methods (1)
  • generate_coupon(self)
    Generates the number of coupons entered in wizard field nbr_coupons

New fields (16)
  • active Boolean
    default=True help='A program is available for the customers when active' args: 'Active'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • coupon_count Integer
    compute='_compute_coupon_count'
  • coupon_ids One2many → sale.coupon
    copy=False string='Generated Coupons' args: 'sale.coupon', 'program_id'
  • currency_id Many2one
    readonly=True related='company_id.currency_id' string='Currency'
  • maximum_use_number Integer
    help='Maximum number of sales orders in which reward can be provided'
  • name Char
    required=True translate=True
  • order_count Integer
    compute='_compute_order_count'
  • program_type Selection
    help='A promotional program can be either a limited promotional offer without code (applied automatically)\n or with a code (displayed on a magazine for example) that may generate a discount on the current\n order or create a coupon for a next order.\n\n A coupon program generates coupons with a code that can be used to generate a discount on the current\n order or create a coupon for a next order.' args: [('promotion_program', 'Promotional Program'), ('coupon_program', 'Coupon Program')]
  • promo_applicability Selection
    default='on_current_order' string='Applicability' args: [('on_current_order', 'Apply On Current Order'), ('on_next_order', 'Apply On Next Order')]
  • promo_code Char
    copy=False help="A promotion code is a code that is associated with a marketing discount. For example, a retailer might tell frequent customers to enter the promotion code 'THX001' to receive a 10%% discount on their whole order." args: 'Promotion Code'
  • promo_code_usage Selection
    help=<expr> args: [('no_code_needed', 'Automatically Applied'), ('code_needed', 'Use a code')]
  • reward_id Many2one → sale.coupon.reward
    copy=False ondelete='restrict' required=True string='Reward' args: 'sale.coupon.reward'
  • rule_id Many2one → sale.coupon.rule
    ondelete='restrict' required=True string='Coupon Rule' args: 'sale.coupon.rule'
  • sequence Integer
    copy=False help=<expr>
  • validity_duration Integer
    default=1 help='Validity duration for a coupon after its generation'
Public methods (5)
  • action_view_sales_orders(self)
  • create(self, vals)
    @api.model
  • toggle_active(self)
  • unlink(self)
  • write(self, vals)

New fields (12)
  • discount_apply_on Selection
    default='on_order' help=<expr> args: [('on_order', 'On Order'), ('cheapest_product', 'On Cheapest Product'), ('specific_products', 'On Specific Products')]
  • discount_fixed_amount Float
    help='The discount in fixed amount' string='Fixed Amount'
  • discount_line_product_id Many2one → product.product
    copy=False help='Product used in the sales order to apply the discount. Each coupon program has its own reward product for reporting purpose' string='Reward Line Product' args: 'product.product'
  • discount_max_amount Float
    default=0 help='Maximum amount of discount that can be provided'
  • discount_percentage Float
    default=10 help='The discount in percentage, between 1 to 100' string='Discount'
  • discount_specific_product_ids Many2many → product.product
    help='Products that will be discounted if the discount is applied on specific products' string='Products' args: 'product.product'
  • discount_type Selection
    default='percentage' help=<expr> args: [('percentage', 'Percentage'), ('fixed_amount', 'Fixed Amount')]
  • reward_description Char
    args: 'Reward Description'
  • reward_product_id Many2one → product.product
    help='Reward Product' string='Free Product' args: 'product.product'
  • reward_product_quantity Integer
    default=1 help='Reward product quantity' string='Quantity'
  • reward_product_uom_id Many2one
    readonly=True related='reward_product_id.product_tmpl_id.uom_id' string='Unit of Measure'
  • reward_type Selection
    default='discount' help=<expr> string='Reward Type' args: [('discount', 'Discount'), ('product', 'Free Product')]
Public methods (1)
  • name_get(self)
    Returns a complete description of the reward

New fields (7)
  • rule_date_from Datetime
    help='Coupon program start date' string='Start Date'
  • rule_date_to Datetime
    help='Coupon program end date' string='End Date'
  • rule_min_quantity Integer
    default=1 help='Minimum required product quantity to get the reward' string='Minimum Quantity'
  • rule_minimum_amount Float
    default=0.0 help='Minimum required amount to get the reward'
  • rule_minimum_amount_tax_inclusion Selection
    default='tax_excluded' args: [('tax_included', 'Tax Included'), ('tax_excluded', 'Tax Excluded')]
  • rule_partners_domain Char
    help='Coupon program will work for selected customers only' string='Based on Customers'
  • rule_products_domain Char
    default=[['sale_ok', '=', True]] help='On Purchase of selected product, reward will be given' string='Based on Products'
Public methods (0)

No public methods.

New fields (6)
  • applied_coupon_ids One2many → sale.coupon
    copy=False string='Applied Coupons' args: 'sale.coupon', 'sales_order_id'
  • code_promo_program_id Many2one → sale.coupon.program
    copy=False domain="[('promo_code_usage', '=', 'code_needed'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Applied Promo Program' args: 'sale.coupon.program'
  • generated_coupon_ids One2many → sale.coupon
    copy=False string='Offered Coupons' args: 'sale.coupon', 'order_id'
  • no_code_promo_program_ids Many2many → sale.coupon.program
    copy=False domain="[('promo_code_usage', '=', 'no_code_needed'), '|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Applied Immediate Promo Programs' args: 'sale.coupon.program'
  • promo_code Char
    help='Applied program code' readonly=False related='code_promo_program_id.promo_code'
  • reward_amount Float
    compute='_compute_reward_total'
Public methods (5)
  • action_cancel(self)
  • action_confirm(self)
  • action_draft(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • recompute_coupon_lines(self)

New fields (1)
  • is_reward_line Boolean
    args: 'Is a program reward line'
Public methods (2)
  • modified(self, fnames, *args, **kwargs)
  • unlink(self)