Membership extension

membership_extension
REPOSITORY
REPOSITORYOCA/vertical-association
GIT
GIThttps://github.com/OCA/vertical-association.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/vertical-association/tree/18.0/membership_extension
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYMembership
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Onestein
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Onestein
COMMITTERS
COMMITTERSJairo Llopis, Weblate, OCA-git-bot, oca-ci, Bhavesh Heliconia
WEBSITE
WEBSITEhttps://github.com/OCA/vertical-association
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:14
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - membership
    - account
    - base_setup
    - base
    - web
    - onboarding
    - product
    - mail
    - bus
    - web_tour
    - html_editor
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module extends Odoo's membership management with the following
features:

- Membership category
- Membership lines editable
- Do not calculate membership state from invoice status
- Start date of last membership period
- Partner's with member lines can't be deleted.
- When a partner has an associated member there is the option to make
  member start date independent from the associated member one so
  joining dates can be tracked for those members.
- Adds a category for Membership management security group so a user
  with only that permission can access to the membership menu.

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
membership_category_tree_view Membership Categories membership.membership_category list New
membership_product_search_form_view Add membership category field product.template field Inherits membership.membership_product_search_form_view
membership_products_form Add membership category field product.template field Inherits membership.membership_products_form
membership_products_tree Membership extension product.template field Inherits membership.membership_products_tree
view_partner_form Membership extension res.partner field Inherits membership.view_partner_form
view_res_partner_member_filter Membership extension filters res.partner xpath Inherits membership.view_res_partner_member_filter
Models touched (7)

New fields (0)

No new fields.

Public methods (3)
  • action_post(self)
    Handle validated refunds for cancelling membership lines
  • button_cancel(self)
    Cancel membership for customer invoices and restore previous membership state for customer refunds. Harmless on supplier ones.
  • button_draft(self)

New fields (1)
  • membership_lines One2many → membership.membership_line
    comodel_name='membership.membership_line' inverse_name='account_invoice_line'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)

New fields (2)
  • company_id Many2one → res.company
    args: 'res.company'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (6)
  • category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' related='membership_id.membership_category_id'
  • date_from Date
    readonly=False
  • date_to Date
    readonly=False
  • member_price Float
    compute='_compute_member_price' readonly=False store=True
  • partner Many2one
    ondelete='restrict'
  • state Selection
    compute='_compute_state' readonly=False
Public methods (1)
  • unlink(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • membership_category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_category_id' readonly=False store=True string='Membership category'
Public methods (0)

No public methods.

New fields (9)
  • associate_member Many2one
    index=True
  • is_adhered_member Boolean
    compute='_compute_is_adhered_member' help='A member who is associated to another one, but whose membership are independent.' readonly=False store=True
  • membership_cancel Date
    compute='_compute_membership_date' help='Date on which membership has been cancelled.' readonly=True recursive=True store=True string='Cancel Membership Date'
  • membership_category_ids Many2many → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_state' readonly=True recursive=True store=True string='Membership Categories'
  • membership_last_start Date
    compute='_compute_membership_date' help='Date when the partner became a member for the last time.' readonly=True recursive=True store=True string='Membership Last Start Date'
  • membership_start Date
    compute='_compute_membership_date' help='Earliest historical date this partner ever became a member.' readonly=True recursive=True store=True string='Membership Start Date'
  • membership_start_adhered Date
    default=fields.Date.today() help='Date from which partner is adhered.' string='Membership Adhered Start Date'
  • membership_state Selection
    compute='_compute_membership_state' index=True recursive=True selection=STATE store=True
  • membership_stop Date
    compute='_compute_membership_date' help="Date when the latest partner's membership ends." readonly=True recursive=True store=True string='Membership End Date'
Public methods (2)
  • check_membership_all(self)
    @api.model
    Force a recalculation on partners with member lines
  • check_membership_expiry(self)
    @api.model
    Force a recalculation on expired members
REPOSITORY
REPOSITORYOCA/vertical-association
GIT
GIThttps://github.com/OCA/vertical-association.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/vertical-association/tree/17.0/membership_extension
VERSION
VERSION 1.0.3
CATEGORY
CATEGORYMembership
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Onestein
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Onestein
COMMITTERS
COMMITTERSPedro M. Baeza, Weblate, OCA-git-bot, Hans Henrik Gabelgaard, oca-ci, Roger
WEBSITE
WEBSITEhttps://github.com/OCA/vertical-association
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:07
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - membership
    - account
    - base_setup
    - base
    - web
    - onboarding
    - product
    - mail
    - bus
    - web_tour
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module extends Odoo's membership management with the following
features:

- Membership category
- Membership lines editable
- Do not calculate membership state from invoice status
- Start date of last membership period
- Partner's with member lines can't be deleted.
- When a partner has an associated member there is the option to make
  member start date independent from the associated member one so
  joining dates can be tracked for those members.
- Adds a category for Membership management security group so a user
  with only that permission can access to the membership menu.

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
membership_category_tree_view Membership Categories membership.membership_category tree New
membership_product_search_form_view Add membership category field product.template field Inherits membership.membership_product_search_form_view
membership_products_form Add membership category field product.template field Inherits membership.membership_products_form
membership_products_tree Membership extension product.template field Inherits membership.membership_products_tree
view_partner_form Membership extension res.partner field Inherits membership.view_partner_form
view_res_partner_member_filter Membership extension filters res.partner xpath Inherits membership.view_res_partner_member_filter
Models touched (7)

New fields (0)

No new fields.

Public methods (3)
  • action_post(self)
    Handle validated refunds for cancelling membership lines
  • button_cancel(self)
    Cancel membership for customer invoices and restore previous membership state for customer refunds. Harmless on supplier ones.
  • button_draft(self)

New fields (1)
  • membership_lines One2many → membership.membership_line
    comodel_name='membership.membership_line' inverse_name='account_invoice_line'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)

New fields (2)
  • company_id Many2one → res.company
    args: 'res.company'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (6)
  • category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' related='membership_id.membership_category_id'
  • date_from Date
    readonly=False
  • date_to Date
    readonly=False
  • member_price Float
    compute='_compute_member_price' readonly=False store=True
  • partner Many2one
    ondelete='restrict'
  • state Selection
    compute='_compute_state' inverse='_inverse_state' readonly=False store=True
Public methods (1)
  • unlink(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • membership_category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_category_id' readonly=False store=True string='Membership category'
Public methods (0)

No public methods.

New fields (9)
  • associate_member Many2one
    index=True
  • is_adhered_member Boolean
    compute='_compute_is_adhered_member' help='A member who is associated to another one, but whose membership are independent.' readonly=False store=True
  • membership_cancel Date
    compute='_compute_membership_date' help='Date on which membership has been cancelled.' readonly=True recursive=True store=True string='Cancel Membership Date'
  • membership_category_ids Many2many → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_state' readonly=True recursive=True store=True string='Membership Categories'
  • membership_last_start Date
    compute='_compute_membership_date' help='Start date of last membership period.' readonly=True recursive=True store=True string='Membership Last Start Date'
  • membership_start Date
    compute='_compute_membership_date' help='Date from which membership becomes active.' readonly=True recursive=True store=True string='Membership Start Date'
  • membership_start_adhered Date
    default=fields.Date.today() help='Date from which partner is adhered.' string='Membership Adhered Start Date'
  • membership_state Selection
    compute='_compute_membership_state' index=True recursive=True selection=STATE store=True
  • membership_stop Date
    compute='_compute_membership_date' help='Date until which membership remains active.' readonly=True recursive=True store=True string='Membership End Date'
Public methods (2)
  • check_membership_all(self)
    @api.model
    Force a recalculation on partners with member lines
  • check_membership_expiry(self)
    @api.model
    Force a recalculation on expired members
REPOSITORY
REPOSITORYOCA/vertical-association
GIT
GIThttps://github.com/OCA/vertical-association.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/vertical-association/tree/16.0/membership_extension
VERSION
VERSION 3.1.0
CATEGORY
CATEGORYMembership
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Onestein
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Onestein
COMMITTERS
COMMITTERSPedro M. Baeza, Jairo Llopis, Víctor Martínez, Weblate, OCA-git-bot, Hans Henrik Gabelgaard, Pierrick Brun, Carmen Bianca BAKKER, oca-ci, anjeel.haria, Simon Hick
WEBSITE
WEBSITEhttps://github.com/OCA/vertical-association
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:50
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - membership
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - 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 (6)
XML IDNameModelTypeStatus
membership_category_tree_view Membership Categories membership.membership_category tree New
membership_product_search_form_view Add membership category field product.template field Inherits membership.membership_product_search_form_view
membership_products_form Add membership category field product.template field Inherits membership.membership_products_form
membership_products_tree Membership extension product.template field Inherits membership.membership_products_tree
view_partner_form Membership extension res.partner field Inherits membership.view_partner_form
view_res_partner_member_filter Membership extension filters res.partner xpath Inherits membership.view_res_partner_member_filter
Models touched (7)

New fields (0)

No new fields.

Public methods (3)
  • action_post(self)
    Handle validated refunds for cancelling membership lines
  • button_cancel(self)
    Cancel membership for customer invoices and restore previous membership state for customer refunds. Harmless on supplier ones.
  • button_draft(self)

New fields (1)
  • membership_lines One2many → membership.membership_line
    comodel_name='membership.membership_line' inverse_name='account_invoice_line'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)

New fields (2)
  • company_id Many2one → res.company
    args: 'res.company'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (6)
  • category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' related='membership_id.membership_category_id'
  • date_from Date
    readonly=False
  • date_to Date
    readonly=False
  • member_price Float
    compute='_compute_member_price' readonly=False store=True
  • partner Many2one
    ondelete='restrict'
  • state Selection
    compute='_compute_state' readonly=False
Public methods (1)
  • unlink(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • membership_category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_category_id' readonly=False store=True string='Membership category'
Public methods (0)

No public methods.

New fields (9)
  • associate_member Many2one
    index=True
  • is_adhered_member Boolean
    compute='_compute_is_adhered_member' help='A member who is associated to another one, but whose membership are independent.' readonly=False store=True
  • membership_cancel Date
    compute='_compute_membership_date' help='Date on which membership has been cancelled.' readonly=True recursive=True store=True string='Cancel Membership Date'
  • membership_category_ids Many2many → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_state' readonly=True recursive=True store=True string='Membership Categories'
  • membership_last_start Date
    compute='_compute_membership_date' help='Date when the partner became a member for the last time.' readonly=True recursive=True store=True string='Membership Last Start Date'
  • membership_start Date
    compute='_compute_membership_date' help='Earliest historical date this partner ever became a member.' readonly=True recursive=True store=True string='Membership Start Date'
  • membership_start_adhered Date
    default=fields.Date.today() help='Date from which partner is adhered.' string='Membership Adhered Start Date'
  • membership_state Selection
    compute='_compute_membership_state' index=True recursive=True selection=STATE store=True
  • membership_stop Date
    compute='_compute_membership_date' help="Date when the latest partner's membership ends." readonly=True recursive=True store=True string='Membership End Date'
Public methods (2)
  • check_membership_all(self)
    @api.model
    Force a recalculation on partners with member lines
  • check_membership_expiry(self)
    @api.model
    Force a recalculation on expired members
REPOSITORY
REPOSITORYOCA/vertical-association
GIT
GIThttps://github.com/OCA/vertical-association.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/vertical-association/tree/15.0/membership_extension
VERSION
VERSION 1.1.2
CATEGORY
CATEGORYMembership
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Onestein
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Onestein
COMMITTERS
COMMITTERSPedro M. Baeza, Weblate, OCA-git-bot, Hans Henrik Gabelgaard, oca-ci, anjeel.haria, Fabrizio Arzeni
WEBSITE
WEBSITEhttps://github.com/OCA/vertical-association
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:36
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - membership
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - 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 (6)
XML IDNameModelTypeStatus
membership_category_tree_view Membership Categories membership.membership_category tree New
membership_product_search_form_view Add membership category field product.template field Inherits membership.membership_product_search_form_view
membership_products_form Add membership category field product.template field Inherits membership.membership_products_form
membership_products_tree Membership extension product.template field Inherits membership.membership_products_tree
view_partner_form Membership extension res.partner field Inherits membership.view_partner_form
view_res_partner_member_filter Membership extension filters res.partner xpath Inherits membership.view_res_partner_member_filter
Models touched (7)

New fields (0)

No new fields.

Public methods (3)
  • action_post(self)
    Handle validated refunds for cancelling membership lines
  • button_cancel(self)
    Cancel membership for customer invoices and restore previous membership state for customer refunds. Harmless on supplier ones.
  • button_draft(self)

New fields (1)
  • membership_lines One2many → membership.membership_line
    comodel_name='membership.membership_line' inverse_name='account_invoice_line'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)

New fields (2)
  • company_id Many2one → res.company
    args: 'res.company'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (6)
  • category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' related='membership_id.membership_category_id'
  • date_from Date
    readonly=False
  • date_to Date
    readonly=False
  • member_price Float
    compute='_compute_member_price' readonly=False store=True
  • partner Many2one
    ondelete='restrict'
  • state Selection
    compute='_compute_state' inverse='_inverse_state' readonly=False store=True
Public methods (1)
  • unlink(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • membership_category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_category_id' readonly=False store=True string='Membership category'
Public methods (0)

No public methods.

New fields (10)
  • associate_member Many2one
    index=True
  • is_adhered_member Boolean
    compute='_compute_is_adhered_member' help='A member who is associated to another one, but whose membership are independent.' readonly=False store=True string='Adhered member'
  • membership_cancel Date
    compute='_compute_membership_date' help='Date on which membership has been cancelled.' readonly=True recursive=True store=True string='Cancel Membership Date'
  • membership_categories Char
    compute='_compute_membership_state' index=True readonly=True store=True
  • membership_category_ids Many2many → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_state' readonly=True recursive=True store=True string='Membership categories'
  • membership_last_start Date
    compute='_compute_membership_date' help='Start date of last membership period.' readonly=True recursive=True store=True string='Membership Last Start Date'
  • membership_start Date
    compute='_compute_membership_date' help='Date from which membership becomes active.' readonly=True recursive=True store=True string='Membership Start Date'
  • membership_start_adhered Date
    default=fields.Date.today() help='Date from which partner is adhered.' string='Membership Adhered Start Date'
  • membership_state Selection
    compute='_compute_membership_state' index=True recursive=True selection=STATE store=True
  • membership_stop Date
    compute='_compute_membership_date' help='Date until which membership remains active.' readonly=True recursive=True store=True string='Membership End Date'
Public methods (2)
  • check_membership_all(self)
    @api.model
    Force a recalculation on partners with member lines
  • check_membership_expiry(self)
    @api.model
    Force a recalculation on expired members
REPOSITORY
REPOSITORYOCA/vertical-association
GIT
GIThttps://github.com/OCA/vertical-association.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/vertical-association/tree/14.0/membership_extension
VERSION
VERSION 1.2.0
CATEGORY
CATEGORYMembership
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Onestein
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Onestein
COMMITTERS
COMMITTERSSergio Zanchetta, sbejaoui, OCA Transbot, oca-travis, Weblate, OCA-git-bot, oca-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/vertical-association
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:03
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - membership
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - 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 (6)
XML IDNameModelTypeStatus
membership_category_tree_view Membership Categories membership.membership_category tree New
membership_product_search_form_view Add membership category field product.template field Inherits membership.membership_product_search_form_view
membership_products_form Add membership category field product.template field Inherits membership.membership_products_form
membership_products_tree Membership extension product.template field Inherits membership.membership_products_tree
view_partner_form Membership extension res.partner field Inherits membership.view_partner_form
view_res_partner_member_filter Membership extension filters res.partner xpath Inherits membership.view_res_partner_member_filter
Models touched (7)

New fields (0)

No new fields.

Public methods (3)
  • button_cancel(self)
    Cancel membership for customer invoices and restore previous membership state for customer refunds. Harmless on supplier ones.
  • button_draft(self)
  • post(self)
    Handle validated refunds for cancelling membership lines

New fields (1)
  • membership_lines One2many → membership.membership_line
    comodel_name='membership.membership_line' inverse_name='account_invoice_line'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)

New fields (2)
  • company_id Many2one → res.company
    args: 'res.company'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (6)
  • category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' related='membership_id.membership_category_id'
  • date_from Date
    readonly=False
  • date_to Date
    readonly=False
  • member_price Float
    compute='_compute_member_price' readonly=False store=True
  • partner Many2one
    ondelete='restrict'
  • state Selection
    compute='_compute_state' inverse='_inverse_state' readonly=False store=True
Public methods (1)
  • unlink(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • membership_category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_category_id' readonly=False store=True string='Membership category'
Public methods (0)

No public methods.

New fields (10)
  • associate_member Many2one
    index=True
  • is_adhered_member Boolean
    compute='_compute_is_adhered_member' help='A member who is associated to another one, but whose membership are independent.' readonly=False store=True string='Adhered member'
  • membership_cancel Date
    compute='_compute_membership_date' help='Date on which membership has been cancelled.' readonly=True store=True string='Cancel Membership Date'
  • membership_categories Char
    compute='_compute_membership_state' index=True readonly=True store=True string='Membership Categories'
  • membership_category_ids Many2many → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_state' readonly=True store=True string='Membership categories'
  • membership_last_start Date
    compute='_compute_membership_date' help='Start date of last membership period.' readonly=True store=True string='Membership Last Start Date'
  • membership_start Date
    compute='_compute_membership_date' help='Date from which membership becomes active.' readonly=True store=True string='Membership Start Date'
  • membership_start_adhered Date
    default=fields.Date.today() help='Date from which partner is adhered.' string='Membership Adhered Start Date'
  • membership_state Selection
    compute='_compute_membership_state' index=True selection=STATE store=True
  • membership_stop Date
    compute='_compute_membership_date' help='Date until which membership remains active.' readonly=True store=True string='Membership End Date'
Public methods (2)
  • check_membership_all(self)
    @api.model
    Force a recalculation on partners with member lines
  • check_membership_expiry(self)
    @api.model
    Force a recalculation on expired members
REPOSITORY
REPOSITORYOCA/vertical-association
GIT
GIThttps://github.com/OCA/vertical-association.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/vertical-association/tree/13.0/membership_extension
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYMembership
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Onestein
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Onestein
COMMITTERS
COMMITTERSAndrea, OCA Transbot, oca-travis, Weblate, OCA-git-bot
WEBSITE
WEBSITEhttps://github.com/oca/vertical-association
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:15
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - membership
    - account
    - base_setup
    - base
    - web
    - product
    - mail
    - bus
    - web_tour
    - uom
    - 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 (6)
XML IDNameModelTypeStatus
membership_category_tree_view Membership Categories membership.membership_category tree New
membership_product_search_form_view Add membership category field product.template field Inherits membership.membership_product_search_form_view
membership_products_form Add membership category field product.template field Inherits membership.membership_products_form
membership_products_tree Membership extension product.template field Inherits membership.membership_products_tree
view_partner_form Membership extension res.partner field Inherits membership.view_partner_form
view_res_partner_member_filter Membership extension filters res.partner xpath Inherits membership.view_res_partner_member_filter
Models touched (7)

New fields (0)

No new fields.

Public methods (3)
  • button_cancel(self)
    Cancel membership for customer invoices and restore previous membership state for customer refunds. Harmless on supplier ones.
  • button_draft(self)
  • post(self)
    Handle validated refunds for cancelling membership lines

New fields (1)
  • membership_lines One2many → membership.membership_line
    comodel_name='membership.membership_line' inverse_name='account_invoice_line'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)

New fields (2)
  • company_id Many2one → res.company
    args: 'res.company'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (6)
  • category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' related='membership_id.membership_category_id'
  • date_from Date
    readonly=False
  • date_to Date
    readonly=False
  • member_price Float
    compute='_compute_member_price' readonly=False store=True
  • partner Many2one
    ondelete='restrict'
  • state Selection
    compute='_compute_state' inverse='_inverse_state' readonly=False store=True
Public methods (1)
  • unlink(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • membership_category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_category_id' readonly=False store=True string='Membership category'
Public methods (0)

No public methods.

New fields (10)
  • associate_member Many2one
    index=True
  • is_adhered_member Boolean
    compute='_compute_is_adhered_member' help='A member who is associated to another one, but whose membership are independent.' readonly=False store=True string='Adhered member'
  • membership_cancel Date
    compute='_compute_membership_date' help='Date on which membership has been cancelled.' readonly=True store=True string='Cancel Membership Date'
  • membership_categories Char
    compute='_compute_membership_state' index=True readonly=True store=True string='Membership Categories'
  • membership_category_ids Many2many → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_state' readonly=True store=True string='Membership categories'
  • membership_last_start Date
    compute='_compute_membership_date' help='Start date of last membership period.' readonly=True store=True string='Membership Last Start Date'
  • membership_start Date
    compute='_compute_membership_date' help='Date from which membership becomes active.' readonly=True store=True string='Membership Start Date'
  • membership_start_adhered Date
    default=fields.Date.today() help='Date from which partner is adhered.' string='Membership Adhered Start Date'
  • membership_state Selection
    compute='_compute_membership_state' index=True selection=STATE store=True
  • membership_stop Date
    compute='_compute_membership_date' help='Date until which membership remains active.' readonly=True store=True string='Membership End Date'
Public methods (2)
  • check_membership_all(self)
    @api.model
    Force a recalculation on partners with member lines
  • check_membership_expiry(self)
    @api.model
    Force a recalculation on expired members
REPOSITORY
REPOSITORYOCA/vertical-association
GIT
GIThttps://github.com/OCA/vertical-association.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/vertical-association/tree/12.0/membership_extension
VERSION
VERSION 1.0.3
CATEGORY
CATEGORYMembership
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Onestein
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Onestein
COMMITTERS
COMMITTERSPedro M. Baeza, Andrea, OCA Transbot, oca-travis, Weblate, OCA-git-bot, David, amcor
WEBSITE
WEBSITEhttps://github.com/oca/vertical-association
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:20
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - membership
    - base
    - product
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - account
    - analytic
    - portal
    - http_routing
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
membership_category_tree_view Membership Categories membership.membership_category tree New
membership_product_search_form_view Add membership category field product.template field Inherits membership.membership_product_search_form_view
membership_products_form Add membership category field product.template field Inherits membership.membership_products_form
membership_products_tree Membership extension product.template field Inherits membership.membership_products_tree
view_partner_form Membership extension res.partner field Inherits membership.view_partner_form
view_res_partner_member_filter Membership extension filters res.partner xpath Inherits membership.view_res_partner_member_filter
Models touched (7)

New fields (0)

No new fields.

Public methods (4)
  • action_cancel(self)
    @api.multi
    Cancel membership for customer invoices and restore previous membership state for customer refunds. Harmless on supplier ones.
  • action_invoice_draft(self)
    @api.multi
  • action_invoice_paid(self)
    @api.multi
  • invoice_validate(self)
    @api.multi
    Handle validated refunds for cancelling membership lines

New fields (1)
  • membership_lines One2many → membership.membership_line
    comodel_name='membership.membership_line' inverse_name='account_invoice_line'
Public methods (2)
  • create(self, vals)
    @api.model
  • unlink(self)
    @api.multi

New fields (2)
  • company_id Many2one → res.company
    args: 'res.company'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (5)
  • category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' readonly=True related='membership_id.membership_category_id' string='Category'
  • date_from Date
    readonly=False
  • date_to Date
    readonly=False
  • partner Many2one
    ondelete='restrict'
  • state Selection
    compute=False inverse=False
Public methods (1)
  • unlink(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • membership_category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' string='Membership category'
Public methods (0)

No public methods.

New fields (10)
  • associate_member Many2one
    index=True
  • is_adhered_member Boolean
    help='A member who is associated to another one, but whose membership are independent.' string='Adhered member'
  • membership_cancel Date
    compute='_compute_membership_date' help='Date on which membership has been cancelled.' readonly=True store=True string='Cancel Membership Date'
  • membership_categories Char
    compute='_compute_membership_state' index=True readonly=True store=True string='Membership Categories'
  • membership_category_ids Many2many → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_state' readonly=True store=True string='Membership categories'
  • membership_last_start Date
    compute='_compute_membership_date' help='Start date of last membership period.' readonly=True store=True string='Membership Last Start Date'
  • membership_start Date
    compute='_compute_membership_date' help='Date from which membership becomes active.' readonly=True store=True string='Membership Start Date'
  • membership_start_adhered Date
    default=fields.Date.today() help='Date from which partner is adhered.' string='Membership Adhered Start Date'
  • membership_state Selection
    compute='_compute_membership_state' index=True selection=STATE store=True
  • membership_stop Date
    compute='_compute_membership_date' help='Date until which membership remains active.' readonly=True store=True string='Membership End Date'
Public methods (3)
  • check_membership_all(self)
    @api.model
    Force a recalculation on partners with member lines
  • check_membership_expiry(self)
    @api.model
    Force a recalculation on expired members
  • onchange_associate_member(self)
    @api.onchange('associate_member')
    Prevents is_adhered_member to stay set when no associated member
REPOSITORY
REPOSITORYOCA/vertical-association
GIT
GIThttps://github.com/OCA/vertical-association.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/vertical-association/tree/11.0/membership_extension
VERSION
VERSION 1.1.1
CATEGORY
CATEGORYMembership
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, Andrea, OCA Transbot, oca-travis, Weblate, OCA-git-bot, David
WEBSITE
WEBSITEhttps://github.com/oca/vertical-association
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:23:59
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - membership
    - base
    - product
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - account
    - analytic
    - web_planner
    - portal
    - http_routing
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
membership_category_tree_view Membership Categories membership.membership_category tree New
membership_product_search_form_view Add membership category field product.template field Inherits membership.membership_product_search_form_view
membership_products_form Add membership category field product.template field Inherits membership.membership_products_form
membership_products_tree Membership extension product.template field Inherits membership.membership_products_tree
view_partner_form Membership extension res.partner field Inherits membership.view_partner_form
view_res_partner_member_filter Membership extension filters res.partner xpath Inherits membership.view_res_partner_member_filter
Models touched (7)

New fields (0)

No new fields.

Public methods (4)
  • action_cancel(self)
    @api.multi
    Cancel membership for customer invoices and restore previous membership state for customer refunds. Harmless on supplier ones.
  • action_invoice_draft(self)
    @api.multi
  • action_invoice_paid(self)
    @api.multi
  • invoice_validate(self)
    @api.multi
    Handle validated refunds for cancelling membership lines

New fields (1)
  • membership_lines One2many → membership.membership_line
    comodel_name='membership.membership_line' inverse_name='account_invoice_line'
Public methods (2)
  • create(self, vals)
    @api.model
  • unlink(self)
    @api.multi

New fields (1)
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (5)
  • category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' readonly=True related='membership_id.membership_category_id' string='Category'
  • date_from Date
    readonly=False
  • date_to Date
    readonly=False
  • partner Many2one
    ondelete='restrict'
  • state Selection
    compute=False inverse=False
Public methods (1)
  • unlink(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • membership_category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' string='Membership category'
Public methods (0)

No public methods.

New fields (10)
  • associate_member Many2one
    index=True
  • is_adhered_member Boolean
    help='A member who is associated to another one, but whose membership are independent.' string='Adhered member'
  • membership_cancel Date
    compute='_compute_membership_date' help='Date on which membership has been cancelled.' readonly=True store=True string='Cancel Membership Date'
  • membership_categories Char
    compute='_compute_membership_state' index=True readonly=True store=True string='Membership categories'
  • membership_category_ids Many2many → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_state' readonly=True store=True string='Membership categories'
  • membership_last_start Date
    compute='_compute_membership_date' help='Start date of last membership period.' readonly=True store=True string='Membership Last Start Date'
  • membership_start Date
    compute='_compute_membership_date' help='Date from which membership becomes active.' readonly=True store=True string='Membership Start Date'
  • membership_start_adhered Date
    default=fields.Date.today() help='Date from which partner is adhered.' string='Membership Start Date'
  • membership_state Selection
    compute='_compute_membership_state' index=True selection=STATE store=True
  • membership_stop Date
    compute='_compute_membership_date' help='Date until which membership remains active.' readonly=True store=True string='Membership End Date'
Public methods (3)
  • check_membership_all(self)
    @api.model
    Force a recalculation on partners with member lines
  • check_membership_expiry(self)
    @api.model
    Force a recalculation on expired members
  • onchange_associate_member(self)
    @api.onchange('associate_member')
    Prevents is_adhered_member to stay set when no associated member
REPOSITORY
REPOSITORYOCA/vertical-association
GIT
GIThttps://github.com/OCA/vertical-association.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/vertical-association/tree/10.0/membership_extension
VERSION
VERSION 1.2.2
CATEGORY
CATEGORYMembership
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, GitHub, Denis Roussel, OCA Transbot, oca-travis, Weblate, Rafael Blasco, OCA-git-bot, David Vidal, Lucas Huber
WEBSITE
WEBSITEhttps://github.com/oca/vertical-association
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:19:58
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - membership
    - base
    - product
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - web_tour
    - report
    - account
    - analytic
    - web_planner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
membership_category_tree_view Membership Categories membership.membership_category tree New
membership_product_search_form_view Add membership category field product.template field Inherits membership.membership_product_search_form_view
membership_products_form Add membership category field product.template field Inherits membership.membership_products_form
membership_products_tree Membership extension product.template field Inherits membership.membership_products_tree
view_partner_form Membership extension res.partner field Inherits membership.view_partner_form
view_res_partner_member_filter Membership extension filters res.partner xpath Inherits membership.view_res_partner_member_filter
Models touched (7)

New fields (0)

No new fields.

Public methods (4)
  • action_cancel(self)
    @api.multi
    Cancel membership for customer invoices and restore previous membership state for customer refunds. Harmless on supplier ones.
  • action_invoice_draft(self)
    @api.multi
  • action_invoice_paid(self)
    @api.multi
  • invoice_validate(self)
    @api.multi
    Handle validated refunds for cancelling membership lines

New fields (1)
  • membership_lines One2many → membership.membership_line
    comodel_name='membership.membership_line' inverse_name='account_invoice_line'
Public methods (2)
  • create(self, vals)
    @api.model
  • unlink(self)
    @api.multi

New fields (1)
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (5)
  • category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' readonly=True related='membership_id.membership_category_id' string='Category'
  • date_from Date
    readonly=False
  • date_to Date
    readonly=False
  • partner Many2one
    ondelete='restrict'
  • state Selection
    compute=False inverse=False
Public methods (1)
  • unlink(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • membership_category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' string='Membership category'
Public methods (0)

No public methods.

New fields (10)
  • associate_member Many2one
    index=True
  • is_adhered_member Boolean
    help='A member who is associated to another one, but whose membership are independent.' string='Adhered member'
  • membership_cancel Date
    compute='_compute_membership_date' help='Date on which membership has been cancelled.' readonly=True store=True string='Cancel Membership Date'
  • membership_categories Char
    compute='_compute_membership_state' index=True readonly=True store=True string='Membership categories'
  • membership_category_ids Many2many → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_state' readonly=True store=True string='Membership categories'
  • membership_last_start Date
    compute='_compute_membership_date' help='Start date of last membership period.' readonly=True store=True string='Membership Last Start Date'
  • membership_start Date
    compute='_compute_membership_date' help='Date from which membership becomes active.' readonly=True store=True string='Membership Start Date'
  • membership_start_adhered Date
    default=fields.Date.today() help='Date from which partner is adhered.' string='Membership Start Date'
  • membership_state Selection
    compute='_compute_membership_state' index=True selection=STATE store=True
  • membership_stop Date
    compute='_compute_membership_date' help='Date until which membership remains active.' readonly=True store=True string='Membership End Date'
Public methods (3)
  • check_membership_all(self)
    @api.model
    Force a recalculation on partners with member lines
  • check_membership_expiry(self)
    @api.model
    Force a recalculation on expired members
  • onchange_associate_member(self)
    @api.onchange('associate_member')
    Prevents is_adhered_member to stay set when no associated member
REPOSITORY
REPOSITORYOCA/vertical-association
GIT
GIThttps://github.com/OCA/vertical-association.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/vertical-association/tree/8.0/membership_extension
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYAssociation
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, GitHub, OCA Transbot, oca-travis, Weblate
WEBSITE
WEBSITEhttps://odoo-community.org/
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:11:24
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - membership
    - base
    - product
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - report
    - account
    - analytic
    - board
    - edi
    - email_template
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
membership_category_tree_view Membership Categories membership.membership_category tree New
membership_product_search_form_view Add membership category field product.template field Inherits membership.membership_product_search_form_view
membership_products_form Add membership category field product.template xpath Inherits membership.membership_products_form
membership_products_tree Membership extension product.template field Inherits membership.membership_products_tree
product_template_form_view Add membership category field product.template field Inherits membership.product_template_form_view
view_partner_form Membership extension res.partner field Inherits membership.view_partner_form
view_res_partner_member_filter Membership extension filters res.partner filter Inherits membership.view_res_partner_member_filter
Models touched (7)

New fields (0)

No new fields.

Public methods (4)
  • action_cancel(self)
    @api.multi
    Cancel membership for customer invoices and restore previous membership state for customer refunds. Harmless on supplier ones. We detect dynamically if the module account_refund_original is installed for accurate source invoice.
  • action_cancel_draft(self)
    @api.multi
  • confirm_paid(self)
    @api.multi
  • invoice_validate(self)
    @api.multi

New fields (1)
  • membership_lines One2many → membership.membership_line
    comodel_name='membership.membership_line' inverse_name='account_invoice_line'
Public methods (2)
  • create(self, vals)
    @api.model
  • unlink(self)
    @api.multi

New fields (1)
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (4)
  • category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' readonly=True related='membership_id.membership_category_id' string='Category'
  • date_from Date
    readonly=False
  • date_to Date
    readonly=False
  • state Selection
    compute='_compute_state' inverse='_inverse_state' readonly=False selection=STATE
Public methods (1)
  • unlink(self)
    @api.multi

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • membership_category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' string='Membership category'
Public methods (0)

No public methods.

New fields (8)
  • associate_member Many2one
    index=True
  • membership_cancel Date
    compute='_compute_membership_date' help='Date on which membership has been cancelled.' readonly=True store=True string='Cancel Membership Date'
  • membership_categories Char
    compute='_compute_membership_state' index=True readonly=True store=True string='Membership categories'
  • membership_category_ids Many2many → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_state' readonly=True store=True string='Membership categories'
  • membership_last_start Date
    compute='_compute_membership_date' help='Start date of last membership period.' readonly=True store=True string='Membership Last Start Date'
  • membership_start Date
    compute='_compute_membership_date' help='Date from which membership becomes active.' readonly=True store=True string='Membership Start Date'
  • membership_state Selection
    compute='_compute_membership_state' index=True selection=STATE store=True
  • membership_stop Date
    compute='_compute_membership_date' help='Date until which membership remains active.' readonly=True store=True string='Membership End Date'
Public methods (2)
  • check_membership_all(self)
    @api.model
    Force a recalculation on partners with member lines
  • check_membership_expiry(self)
    @api.model
    Force a recalculation on expired members