Repository
OCA/vertical-association · module folder · Try on Runboat
Module version
1.1.0
Category
Membership
Folder size
2.07 MB
License
LGPL-3
Application
No
Auto-installable
No
Website
https://github.com/OCA/vertical-association
Last tracking update
2026-08-11 17:30:53
Authors
Odoo, Odoo Community Association (OCA)
Maintainers
Odoo, Odoo Community Association (OCA)
Committers
Carlos Lopez, Víctor Martínez, Weblate, OCA-git-bot, oca-ci
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
membership_delegated_partner, membership_variable_period, website_event_membership_restriction, website_membership
Description
This module allows you to manage all operations for managing memberships.

- 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.

It supports different kind of members:
* Free member
* Associated member (e.g.: a group subscribes to a membership for all subsidiaries)
* Paid members
* Special member prices

It is integrated with sales and accounting to allow you to automatically
invoice and send propositions for membership renewal.

This module is a backport from Odoo SA and as such, it is not included in the OCA CLA.
That means we do not have a copy of the copyright on it like all other OCA modules.

Code Analysis

Views touched (13)
XML IDNameModelTypeStatus
membership_category_tree_view Membership Categories membership.membership_category list New
membership_members_tree Members res.partner list New
membership_product_search_form_view membership.product.search product.template search New
membership_products_form Membership Products product.template form New
membership_products_kanban product.template.kanban product.template kanban New
membership_products_tree Membership products product.template list New
report_membership_view_tree report.membership.view.list report.membership list New
view_membership_invoice_view membership.invoice.view.form membership.invoice form New
view_partner_form res.partner.form.inherit res.partner form Inherits base.view_partner_form
view_report_membership_graph1 report.membership.graph1 report.membership graph New
view_report_membership_pivot report.membership.pivot report.membership pivot New
view_report_membership_search report.membership.search report.membership search New
view_res_partner_member_filter res.partner.select res.partner search New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (9)

New fields (0)

No new fields.

Public methods (4)
  • action_post(self)
  • button_cancel(self)
  • button_draft(self)
  • write(self, vals)

New fields (1)
  • membership_line_ids One2many → membership.membership_line
    string='Membership lines' args: 'membership.membership_line', 'account_invoice_line_id'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)
  • write(self, vals)

New fields (2)
  • member_price Float
    min_display_digits='Product Price' required=True
  • product_id Many2one → product.product
    required=True string='Membership' args: 'product.product'
Public methods (1)
  • membership_invoice(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 (12)
  • account_invoice_id Many2one → account.move
    readonly=True related='account_invoice_line_id.move_id' string='Invoice' args: 'account.move'
  • account_invoice_line_id Many2one → account.move.line
    ondelete='cascade' readonly=True string='Account Invoice line' args: 'account.move.line'
  • category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' related='membership_id.membership_category_id'
  • company_id Many2one → res.company
    readonly=True related='account_invoice_line_id.move_id.company_id' store=True string='Company' args: 'res.company'
  • date Date
    help='Date on which member has joined the membership' string='Join Date'
  • date_cancel Date
    string='Cancel date'
  • date_from Date
    readonly=False string='From'
  • date_to Date
    readonly=False string='To'
  • member_price Float
    compute='_compute_member_price' help='Amount for the membership' min_display_digits='Product Price' readonly=False required=True store=True string='Membership Fee'
  • membership_id Many2one → product.product
    required=True string='Membership' args: 'product.product'
  • partner_id Many2one → res.partner
    index=True ondelete='restrict' string='Partner' args: 'res.partner'
  • state Selection
    compute='_compute_state' help='It indicates the membership status.\n-Non Member: A member who has not applied for any membership.\n-Cancelled Member: A member who has cancelled his membership.\n-Old Member: A member whose membership date has expired.\n-Waiting Member: A member who has applied for the membership and whose invoice is going to be created.\n-Invoiced Member: A member whose invoice has been created.\n-Paid Member: A member who has paid the membership amount.' readonly=False selection=[('none', 'Non Member'), ('canceled', 'Cancelled Member'), ('old', 'Old Member'), ('waiting', 'Waiting Member'), ('invoiced', 'Invoiced Member'), ('free', 'Free Member'), ('paid', 'Paid Member')] store=True string='Membership Status'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (4)
  • membership Boolean
    help='Check if the product is eligible for membership.'
  • membership_category_id Many2one → membership.membership_category
    comodel_name='membership.membership_category' compute='_compute_membership_category_id' readonly=False store=True string='Membership category'
  • membership_date_from Date
    help='Date from which membership becomes active.' string='Membership Start Date'
  • membership_date_to Date
    help='Date until which membership remains active.' string='Membership End Date'
Public methods (0)

No public methods.

New fields (14)
  • associate_member_id Many2one → res.partner
    readonly=True string='Associate Member' args: 'res.partner'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_to Date
    readonly=True string='End Date'
  • membership_id Many2one → product.product
    readonly=True string='Membership Product' args: 'product.product'
  • membership_state Selection
    readonly=True selection=<expr> string='Current Membership State'
  • num_invoiced Integer
    readonly=True string='# Invoiced'
  • num_paid Integer
    readonly=True string='# Paid'
  • num_waiting Integer
    readonly=True string='# Waiting'
  • partner_id Many2one → res.partner
    readonly=True string='Member' args: 'res.partner'
  • quantity Integer
    readonly=True
  • start_date Date
    readonly=True
  • tot_earned Float
    digits=0 readonly=True string='Earned Amount'
  • tot_pending Float
    digits=0 readonly=True string='Pending Amount'
  • user_id Many2one → res.users
    readonly=True string='Salesperson' args: 'res.users'
Public methods (1)
  • init(self)
    Create the view

New fields (12)
  • associate_member_id Many2one → res.partner
    help='A member with whom you want to associate your membership.It will consider the membership state of the associated member.' index=True args: 'res.partner'
  • free_member Boolean
    help='Select if you want to give free membership.'
  • 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
  • member_line_ids One2many → membership.membership_line
    string='Membership' args: 'membership.membership_line', 'partner_id'
  • membership_amount Float
    digits=(16, 2) help='The price negotiated by the partner'
  • 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=<expr> help='Date from which partner is adhered.' string='Membership Adhered Start Date'
  • membership_state Selection
    compute='_compute_membership_state' help='It indicates the membership state.\n-Non Member: A partner who has not applied for any membership.\n-Cancelled Member: A member who has cancelled his membership.\n-Old Member: A member whose membership date has expired.\n-Waiting Member: A member who has applied for the membership and whose invoice is going to be created.\n-Invoiced Member: A member whose invoice has been created.\n-Paying member: A member who has paid the membership fee.' index=True recursive=True selection=<expr> store=True string='Current Membership Status'
  • 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_expiry(self)
    @api.model
    Force a recalculation on expired members
  • create_membership_invoice(self, product, amount)
    Create Customer Invoice of Membership for partners.