Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
124 changes: 124 additions & 0 deletions coop_membership_extension_limit/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
===============================
Coop Membership Extension Limit
===============================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:dc9f57a5b3d3b6faa076c41dbc95a03c754104f917ebeff13564fcca6084de00
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-AwesomeFoodCoops%2Fodoo--production-lightgray.png?logo=github
:target: https://github.com/AwesomeFoodCoops/odoo-production/tree/18.0/coop_membership_extension_limit
:alt: AwesomeFoodCoops/odoo-production

|badge1| |badge2| |badge3|

This module extends the cooperative membership functionality by limiting
the number of extensions a member can receive.

Features
--------

1. **Extension Limit**: Set a maximum number of extensions a member can
receive when they are in cooperative states: alert, suspended, or
delay.

2. **Configurable Settings**:

- Enable/disable the extension limit feature
- Set the maximum number of extensions (default: 6)
- Choose which extension types are counted towards the limit

3. **Automatic Warning**: When a member reaches one extension before the
limit, an automatic email notification is sent to warn them.

4. **Access Control**: The extension limit check is bypassed for shift
managers.

Technical Details
-----------------

- Inherits from ``shift.extension`` model
- Adds ``is_new`` boolean field to track new extensions
- Extends ``res.company`` with extension limit settings
- Integrates with ``res.config.settings`` for configuration
- Depends on ``coop_membership`` and ``coop_badge_reader`` modules

**Table of contents**

.. contents::
:local:

Usage
=====

This module limits the number of extensions a member can receive when
they are in certain cooperative states (suspended, alerted, or delayed).

Configuration
-------------

1. Go to **Settings > General Settings** and scroll to the Membership
section
2. Enable "Member Extension Limit" to activate the feature
3. Set the maximum number of extensions allowed (default: 6)
4. Select the extension types to which the limit applies

How It Works
------------

- When a member in alert, suspended, or delay state receives an
extension, the system counts the consecutive extensions
- Once the limit is reached, no more extensions can be granted until
make-up sessions are completed
- When a member reaches one extension before the limit, a warning email
is automatically sent

Email Notifications
-------------------

The module includes an email template that notifies members when they
are approaching their extension limit.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/AwesomeFoodCoops/odoo-production/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/AwesomeFoodCoops/odoo-production/issues/new?body=module:%20coop_membership_extension_limit%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* La Louve
* Trobz

Contributors
------------

- La Louve
- `Trobz <https://www.trobz.com>`__

- Phan Hong Phuc <phucph@trobz.com>

Maintainers
-----------

This module is part of the `AwesomeFoodCoops/odoo-production <https://github.com/AwesomeFoodCoops/odoo-production/tree/18.0/coop_membership_extension_limit>`_ project on GitHub.

You are welcome to contribute.
2 changes: 2 additions & 0 deletions coop_membership_extension_limit/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import models
from .hook import pre_init_hook
21 changes: 21 additions & 0 deletions coop_membership_extension_limit/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).


{
"name": "Coop Membership Extension Limit",
"version": "18.0.1.0.0",
"category": "Custom",
"summary": "Limit the number of extension for each member",
"author": "La Louve, Trobz",
"website": "https://github.com/AwesomeFoodCoops/odoo-production",
"license": "AGPL-3",
"depends": ["coop_membership", "coop_badge_reader"],
"data": [
"views/res_config_view.xml",
"views/view_shift_extension.xml",
"data/email_template_data.xml",
],
"demo": [],
"installable": True,
"pre_init_hook": "pre_init_hook",
}
37 changes: 37 additions & 0 deletions coop_membership_extension_limit/data/email_template_data.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?xml version="1.0" ?>
<odoo noupdate="1">
<record id="email_extension_limited" model="mail.template">
<field name="name">Limit the number of Extension</field>
<field name="model_id" ref="base.model_res_partner" />
<field name="email_from">{{ (user.company_id.email or '') }}</field>
<field name="email_to">{{ object.email }}</field>
<field name="lang">{{ object.lang }}</field>
<field name="reply_to">{{ (user.company_id.email or '') }}</field>
<field name="subject">
[Warning] You will soon reach the maximal number of extensions! Limit is {{ user.company_id.member_extension_limit_count }}
</field>
<field name="body_html" type="html">
<div>
<p>Hello <t t-out="object.name and object.name.split(',')[-1]" />,</p>
<p>
You have received <t
t-out="user.company_id.member_extension_limit_count - 1"
/>
consecutive extensions that extend the period during which you can complete your make-up sessions.
</p>
<p>
The limit is set to <t
t-out="user.company_id.member_extension_limit_count"
/>.
After the <t
t-out="user.company_id.member_extension_limit_count"
/>th extension,
you will no longer be able to make purchases in the store until all your make-up sessions have been completed.
</p>
<p>Regards,</p>
<br />
<br />
</div>
</field>
</record>
</odoo>
9 changes: 9 additions & 0 deletions coop_membership_extension_limit/hook.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo.tools.sql import column_exists, create_column


def pre_init_hook(env):
"""Do not compute the sale_order_template_id field on existing SOs."""
if not column_exists(env.cr, "shift_extension", "is_new"):
create_column(env.cr, "shift_extension", "is_new", "BOOLEAN")
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * coop_membership_extension_limit
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-03-31 09:00+0000\n"
"PO-Revision-Date: 2026-03-31 09:00+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"

#. module: coop_membership_extension_limit
#: model:mail.template,subject:coop_membership_extension_limit.email_extension_limited
msgid ""
"\n"
" [Warning] You will soon reach the maximal number of extensions! Limit is {{ user.company_id.member_extension_limit_count }}\n"
" "
msgstr ""

#. module: coop_membership_extension_limit
#: model:mail.template,body_html:coop_membership_extension_limit.email_extension_limited
msgid ""
"<div>\n"
" <p>Hello <t t-out=\"object.name and object.name.split(',')[-1]\"/>,</p>\n"
" <p>\n"
" You have received <t t-out=\"user.company_id.member_extension_limit_count - 1\"/>\n"
" consecutive extensions that extend the period during which you can complete your make-up sessions.\n"
" </p>\n"
" <p>\n"
" The limit is set to <t t-out=\"user.company_id.member_extension_limit_count\"/>.\n"
" After the <t t-out=\"user.company_id.member_extension_limit_count\"/>th extension,\n"
" you will no longer be able to make purchases in the store until all your make-up sessions have been completed.\n"
" </p>\n"
" <p>Regards,</p>\n"
" <br/>\n"
" <br/>\n"
" </div>\n"
" "
msgstr ""

#. module: coop_membership_extension_limit
#: model:ir.model,name:coop_membership_extension_limit.model_res_company
msgid "Companies"
msgstr ""

#. module: coop_membership_extension_limit
#: model:ir.model,name:coop_membership_extension_limit.model_res_config_settings
msgid "Config Settings"
msgstr ""

#. module: coop_membership_extension_limit
#: model:ir.model,name:coop_membership_extension_limit.model_res_partner
msgid "Contact"
msgstr ""

#. module: coop_membership_extension_limit
#: model_terms:ir.ui.view,arch_db:coop_membership_extension_limit.res_config_settings_view_form_inherit
msgid "Extension Limit Count"
msgstr ""

#. module: coop_membership_extension_limit
#: model_terms:ir.ui.view,arch_db:coop_membership_extension_limit.res_config_settings_view_form_inherit
msgid "Extension Limit Types"
msgstr ""

#. module: coop_membership_extension_limit
#: model:ir.model.fields,field_description:coop_membership_extension_limit.field_res_company__member_extension_limit_type_ids
#: model:ir.model.fields,field_description:coop_membership_extension_limit.field_res_config_settings__member_extension_limit_type_ids
msgid "Extension Types"
msgstr ""

#. module: coop_membership_extension_limit
#: model:ir.model.fields,field_description:coop_membership_extension_limit.field_shift_extension__is_new
msgid "Is New"
msgstr ""

#. module: coop_membership_extension_limit
#: model:mail.template,name:coop_membership_extension_limit.email_extension_limited
msgid "Limit the number of Extension"
msgstr ""

#. module: coop_membership_extension_limit
#: model_terms:ir.ui.view,arch_db:coop_membership_extension_limit.res_config_settings_view_form_inherit
msgid ""
"Limit the number of extension for each member when suspended, alerted or "
"delayed."
msgstr ""

#. module: coop_membership_extension_limit
#: model:ir.model.fields,field_description:coop_membership_extension_limit.field_res_company__member_extension_limit
#: model:ir.model.fields,field_description:coop_membership_extension_limit.field_res_config_settings__member_extension_limit
msgid "Member Extension Limit"
msgstr ""

#. module: coop_membership_extension_limit
#: model:ir.model.fields,field_description:coop_membership_extension_limit.field_res_company__member_extension_limit_count
#: model:ir.model.fields,field_description:coop_membership_extension_limit.field_res_config_settings__member_extension_limit_count
msgid "Member Extension Limit Count"
msgstr ""

#. module: coop_membership_extension_limit
#: model:ir.model,name:coop_membership_extension_limit.model_shift_extension
msgid "Shift Extension"
msgstr ""

#. module: coop_membership_extension_limit
#. odoo-python
#: code:addons/coop_membership_extension_limit/models/shift_extension.py:0
msgid ""
"This member has received %s consecutive extensions, which is the maximum. "
"They cannot benefit from any additional ones until their make-up sessions "
"have been completed."
msgstr ""
Loading
Loading