commit
12276bd330
|
|
@ -191,7 +191,7 @@ msgstr "العمر"
|
|||
#. module: dev_membership
|
||||
#: model_terms:ir.ui.view,arch_db:dev_membership.view_search_res_partner
|
||||
msgid "Archived"
|
||||
msgstr ""
|
||||
msgstr "مؤرشف"
|
||||
|
||||
#. module: dev_membership
|
||||
#: model:ir.model.fields,field_description:dev_membership.field_dev_membership__message_attachment_count
|
||||
|
|
@ -420,7 +420,7 @@ msgstr "إرسال تذكير ثاني قبل انتهاء العضوية بعد
|
|||
#. module: dev_membership
|
||||
#: model_terms:ir.ui.view,arch_db:dev_membership.view_search_res_partner
|
||||
msgid "Expired Membership"
|
||||
msgstr ""
|
||||
msgstr "العضوية المنتهية"
|
||||
|
||||
#. module: dev_membership
|
||||
#: model:ir.model.fields,field_description:dev_membership.field_dev_membership__message_follower_ids
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ class DevMembership(models.Model):
|
|||
membership_id = fields.Many2one('dev.membership', string='Renew Membership')
|
||||
invoice_id = fields.Many2one('account.move', string='Invoice')
|
||||
user_id = fields.Many2one('res.users', string='Resposible', default=lambda self:self.env.user)
|
||||
cancel_reason_id = fields.Many2one('cancellation.reason',string='Cancel Membership Reason')
|
||||
cancel_reasone = fields.Char(string='Cancel Membership Reason')
|
||||
|
||||
@api.onchange('product_id')
|
||||
def _onchange_membership_type(self):
|
||||
|
|
|
|||
|
|
@ -18,10 +18,9 @@ class PartnerExtended(models.Model):
|
|||
is_member = fields.Boolean(string='Is Member')
|
||||
membership_count = fields.Integer(string="Membership Count", compute="_get_membership_count")
|
||||
active_membership_id = fields.Many2one('dev.membership', string='Membership', compute='check_active_membership')
|
||||
state = fields.Selection(related='active_membership_id.state',store=True)
|
||||
|
||||
nationality_id = fields.Many2one('res.country', string="Nationality")
|
||||
is_membership_expire = fields.Boolean('Expire Membership', compute='check_active_membership')
|
||||
is_membership_expire = fields.Boolean('Expire Membership',store=True, compute='check_active_membership')
|
||||
memebership_status = fields.Char('Membership Status', compute='check_memebership_status')
|
||||
birth_date = fields.Date(string='Birth Date')
|
||||
join_date = fields.Date(string='Join Date')
|
||||
|
|
|
|||
|
|
@ -107,6 +107,11 @@
|
|||
<label for="description"/>
|
||||
</h3>
|
||||
<field name="description" attrs="{'readonly': ([('state', '!=', 'draft')])}"/>
|
||||
<group attrs="{'invisible': ([('state', '!=', 'cancel')])}">
|
||||
<group string="Membership Cancellation Reasones">
|
||||
<field name="cancel_reasone"/>
|
||||
</group>
|
||||
</group>
|
||||
</div>
|
||||
</sheet>
|
||||
<div class="oe_chatter">
|
||||
|
|
@ -231,6 +236,8 @@
|
|||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">dev.membership</field>
|
||||
<field name="view_mode">kanban,tree,activity,form</field>
|
||||
<field name="domain">[('state', '!=', 'cancel')]</field>
|
||||
|
||||
</record>
|
||||
|
||||
<!-- Active Membership-->
|
||||
|
|
|
|||
|
|
@ -21,6 +21,8 @@
|
|||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
|
||||
<record model="ir.ui.view" id="dev_res_partner_member_kanban_view">
|
||||
<field name="name">dev.res.partner.member.kanban</field>
|
||||
<field name="model">res.partner</field>
|
||||
|
|
@ -91,9 +93,6 @@
|
|||
<field name="parent_id"/>
|
||||
</li>
|
||||
|
||||
<li t-if="record.category_id.raw_value">
|
||||
<field widget="many_2many_tags" name="category_id"/>
|
||||
</li>
|
||||
<li t-if="!record.parent_id.raw_value and record.function.raw_value">
|
||||
<field name="function"/>
|
||||
</li>
|
||||
|
|
@ -123,114 +122,116 @@
|
|||
<div class="o_row">
|
||||
<span class="oe_kanban_partner_links"/>
|
||||
</div>
|
||||
</div>
|
||||
<!-- -->
|
||||
<div class="o_kanban_record_bottom">
|
||||
<div class="oe_kanban_bottom_left text-muted">
|
||||
<span>
|
||||
<t t-esc="record.join_date.value"/>
|
||||
</span>
|
||||
<field name="category_id" widget="many2many_tags" options="{'color_field': 'color'}"/>
|
||||
|
||||
<!-- -->
|
||||
<div class="o_kanban_record_bottom">
|
||||
<div class="oe_kanban_bottom_left text-muted">
|
||||
<span>
|
||||
<t t-esc="record.join_date.value"/>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<field name="activity_ids" widget="kanban_activity"/>
|
||||
<br/>
|
||||
<!-- -->
|
||||
</div>
|
||||
<field name="activity_ids" widget="kanban_activity"/>
|
||||
<br/>
|
||||
<!-- -->
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</div>
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!--form-->
|
||||
<record id="view_res_partner_memeber_form" model="ir.ui.view">
|
||||
<field name="name">view.res.partner.member.form</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="base.view_partner_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='vat']" position="before">
|
||||
<field name="nationality_id"/>
|
||||
<field name="birth_date"/>
|
||||
<field name="state" invisible="1"/>
|
||||
<field name="age"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='function']" position="after">
|
||||
<field name="employer"/>
|
||||
</xpath>
|
||||
<xpath expr="//page" position="after">
|
||||
<page name="memebership" string='Memebership'>
|
||||
<group>
|
||||
<group name="memeber">
|
||||
<field name="is_member"/>
|
||||
<field name="product_id"/>
|
||||
<!--form-->
|
||||
<record id="view_res_partner_memeber_form" model="ir.ui.view">
|
||||
<field name="name">view.res.partner.member.form</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="base.view_partner_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='vat']" position="before">
|
||||
<field name="nationality_id"/>
|
||||
<field name="birth_date"/>
|
||||
<field name="age"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='function']" position="after">
|
||||
<field name="employer"/>
|
||||
</xpath>
|
||||
<xpath expr="//page" position="after">
|
||||
<page name="memebership" string='Memebership'>
|
||||
<group>
|
||||
<group name="memeber">
|
||||
<field name="is_member"/>
|
||||
<field name="product_id"/>
|
||||
|
||||
</group>
|
||||
<group name="other">
|
||||
<field name="join_date"/>
|
||||
<field name="memebership_end_date"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='mobile']" position="attributes">
|
||||
<attribute name="required">True</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='email']" position="attributes">
|
||||
<attribute name="required">True</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//div[@name='button_box']" position="inside">
|
||||
<button name="view_membership" type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa-vcard-o" attrs="{'invisible' : [('membership_count', '=', 0)]}">
|
||||
<div class="o_stat_info">
|
||||
<field name="membership_count" class="o_stat_value"/>
|
||||
<span class="o_stat_text">Membership</span>
|
||||
</div>
|
||||
</button>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
<!-- search -->
|
||||
<record id="view_search_res_partner" model="ir.ui.view">
|
||||
<field name="name">res.partner.search</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Res Partner Search">
|
||||
<field name="name"/>
|
||||
<field name="phone"/>
|
||||
<field name="category_id"/>
|
||||
<field name="identification_number"/>
|
||||
<filter string="Archived" name="archived" domain="[('active', '=', False)]"/>
|
||||
<filter string="Expired Membership" name="membership_end_date"
|
||||
domain="[('is_membership_expire', '=', True)]"/>
|
||||
<group string="Group By">
|
||||
<filter string="Membership Type" name="product_id" context="{'group_by': 'product_id'}"/>
|
||||
<filter string="Branch" name="branch_id" context="{'group_by': 'branch_id'}"/>
|
||||
</group>
|
||||
<group name="other">
|
||||
<field name="join_date"/>
|
||||
<field name="memebership_end_date"/>
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='mobile']" position="attributes">
|
||||
<attribute name="required">True</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='email']" position="attributes">
|
||||
<attribute name="required">True</attribute>
|
||||
</xpath>
|
||||
<xpath expr="//div[@name='button_box']" position="inside">
|
||||
<button name="view_membership" type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa-vcard-o" attrs="{'invisible' : [('membership_count', '=', 0)]}">
|
||||
<div class="o_stat_info">
|
||||
<field name="membership_count" class="o_stat_value"/>
|
||||
<span class="o_stat_text">Membership</span>
|
||||
</div>
|
||||
</button>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
<!-- search -->
|
||||
<record id="view_search_res_partner" model="ir.ui.view">
|
||||
<field name="name">res.partner.search</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Res Partner Search">
|
||||
<field name="name"/>
|
||||
<field name="phone"/>
|
||||
<field name="category_id"/>
|
||||
<field name="identification_number"/>
|
||||
<filter string="Archived" name="archived" domain="[('active', '=', False)]"/>
|
||||
<filter string="Expired Membership" name="membership_end_date"
|
||||
domain="['|',('state', '=', 'expire'),('memebership_end_date', '<=',context_today().strftime('%Y-%m-%d'))]"/>
|
||||
<group string="Group By">
|
||||
<filter string="Membership Type" name="product_id" context="{'group_by': 'product_id'}"/>
|
||||
<filter string="Branch" name="branch_id" context="{'group_by': 'branch_id'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
<!--end -->
|
||||
<!--Action-->
|
||||
<record id="action_members" model="ir.actions.act_window">
|
||||
<field name="name">Member</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">res.partner</field>
|
||||
<field name="domain">[('is_member', '=', True)]</field>
|
||||
<field name="context">{'default_is_member' : 1}</field>
|
||||
<field name="view_mode">kanban,tree,activity,form</field>
|
||||
<field name="search_view_id" ref="dev_membership.view_search_res_partner"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
<!--end -->
|
||||
<!--Action-->
|
||||
<record id="action_members" model="ir.actions.act_window">
|
||||
<field name="name">Member</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">res.partner</field>
|
||||
<field name="domain">[('is_member', '=', True)]</field>
|
||||
<field name="context">{'default_is_member' : 1}</field>
|
||||
<field name="view_mode">kanban,tree,activity,form</field>
|
||||
<field name="search_view_id" ref="dev_membership.view_search_res_partner"/>
|
||||
|
||||
<field name="view_ids" eval="[(5,0,0),
|
||||
<field name="view_ids" eval="[(5,0,0),
|
||||
(0,0,{'sequence' : 3, 'view_mode': 'kanban' , 'view_id' : ref('dev_membership.dev_res_partner_member_kanban_view')}),
|
||||
(0,0,{'sequence' : 3, 'view_mode': 'tree' , 'view_id' : ref('dev_membership.view_res_partner_member_tree')})]"/>
|
||||
</record>
|
||||
</record>
|
||||
|
||||
<!--Menus-->
|
||||
<menuitem name="Members"
|
||||
id="menu_members"
|
||||
parent="menu_membership_main"
|
||||
action="action_members"
|
||||
sequence="2"/>
|
||||
</odoo>
|
||||
<!--Menus-->
|
||||
<menuitem name="Members"
|
||||
id="menu_members"
|
||||
parent="menu_membership_main"
|
||||
action="action_members"
|
||||
sequence="2"/>
|
||||
</odoo>
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ class MembershipRefues(models.TransientModel):
|
|||
self.env.user.name, record.reason_id.name)
|
||||
|
||||
if record.request_id:
|
||||
record.request_id.cancel_reason_id.name = record.reason_id.name
|
||||
record.request_id.cancel_reasone = record.reason_id.name
|
||||
record.request_id.state = 'cancel'
|
||||
record.request_id.message_post(body=body, subject=subject)
|
||||
record.request_id.make_activity_group()
|
||||
|
|
|
|||
|
|
@ -51,8 +51,20 @@ class RenewMembership(models.TransientModel):
|
|||
'interval':self.product_id.interval or False,
|
||||
'membership_fees':self.product_id.list_price or 0.0,
|
||||
})
|
||||
|
||||
|
||||
|
||||
@api.constrains('membership_fees')
|
||||
def _check_subscription_fee(self):
|
||||
for record in self:
|
||||
if record.membership_fees < record.product_id.list_price:
|
||||
raise ValidationError(_('Membership fees cannot be less than the default value in Setting of membrship type.'))
|
||||
|
||||
|
||||
@api.constrains('duration')
|
||||
def _check_duration(self):
|
||||
for record in self:
|
||||
if record.duration < record.product_id.duration:
|
||||
raise ValidationError(_('Duration cannot be less than the default value in Setting of membrship type.'))
|
||||
|
||||
def action_renew_membership(self):
|
||||
mem_pool = self.env['dev.membership'].sudo()
|
||||
new_membership = mem_pool.create({
|
||||
|
|
|
|||
Loading…
Reference in New Issue