Merge pull request #4710 from expsa/samir-aladawi-change-partner-account-type-logic

Samir aladawi change partner account type logic
This commit is contained in:
SamirLADOUI-sa 2025-09-18 11:29:04 +01:00 committed by GitHub
commit 0d43289b52
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 141 additions and 14 deletions

View File

@ -52,7 +52,7 @@ class CreatePortalAccount(http.Controller):
'name': f'{first_name} {second_name}',
'email': email,
'phone': formatted_phone,
'account_type': account_type,
# 'account_type': account_type,
}
partner = Partner.create(partner_vals)
@ -65,6 +65,9 @@ class CreatePortalAccount(http.Controller):
'active': True,
})
# Set partner account_type
partner.set_partner_account_type(account_type)
# Update user fields similar to create_user and original flow
user.sudo().write({
'password': password,

View File

@ -492,7 +492,8 @@ class GrantBenefitProfile(models.Model):
exception_start_date = fields.Datetime(string='Exception Start Date')
exception_end_date = fields.Datetime(string='Exception End Date')
sponsor_id = fields.Many2one('res.partner', string='Sponsor',domain="[('account_type','=','sponsor')]")
# sponsor_id = fields.Many2one('res.partner', string='Sponsor',domain="[('account_type','=','sponsor')]")
sponsor_id = fields.Many2one('res.partner', string='Sponsor',domain="[('is_sponsor_portal', '=', True)]")
family_monthly_income = fields.Float(string="Family Monthly Income", compute='_get_family_monthly_values')
family_monthly_meals = fields.Float(string="Family Monthly Meals", compute='_get_family_monthly_values')
@ -2068,7 +2069,8 @@ class GrantBenefitProfile(models.Model):
'name': self.name,
'email': self.email,
'phone': self.phone,
'account_type':'family',
# 'account_type':'family',
'is_family': True,
'code':self.code,
'bank_ids': [(0,0,bank_val)]
})
@ -2103,7 +2105,8 @@ class GrantBenefitProfile(models.Model):
'name': self.name,
'email': self.email,
'phone': self.phone,
'account_type': 'family',
# 'account_type': 'family',
'is_family': True,
'code': self.code,
})
if bank_val['acc_number'] and bank_val['acc_holder_name'] and bank_val['bank_id']:

View File

@ -228,7 +228,8 @@ class FamilyMemberProfile(models.Model):
selection=[('temporarily_suspend', 'Temporarily Suspended'), ('suspend', 'Suspend')], string="Suspend Type")
suspend_method = fields.Selection(selection=[('manual', 'Manual'), ('auto', 'Auto')], string="Suspend Method",default='auto')
is_member_workflow = fields.Boolean('Is Member Workflow?')
sponsor_id = fields.Many2one('res.partner', string='Sponsor Partner',domain="[('account_type','=','sponsor')]")
# sponsor_id = fields.Many2one('res.partner', string='Sponsor Partner',domain="[('account_type','=','sponsor')]")
sponsor_id = fields.Many2one('res.partner', string='Sponsor Partner',domain="[('is_sponsor_portal', '=', True)]")
sponsor_related_id = fields.Many2one('takaful.sponsor', string='Sponsor')
sponsorship_id = fields.Many2one('takaful.sponsorship', string='Sponsorship')
required_attach = fields.Selection(selection=[('true', 'True'), ('false', 'False')], compute='get_required_attach',store=True,string='Member Required Attach')
@ -436,6 +437,7 @@ class FamilyMemberProfile(models.Model):
# 'email': self.email,
# 'phone': self.phone,
# 'account_type': 'benefit',
# 'is_benefit': True,
# 'code': self.benefit_id.code,
# })

View File

@ -244,7 +244,8 @@ class TakafulSponsor(models.Model):
values.update({'lang': 'ar_001'})
values.update({'tz': 'Asia/Riyadh'})
values.update({'account_type':'sponsor'})
# values.update({'account_type':'sponsor'})
values.update({'is_sponsor_portal': True})
if not values.get('serial_code'):
values['serial_code'] = self.env['ir.sequence'].next_by_code('takaful.sponsor.sequence') or 'S/0000'

View File

@ -14,9 +14,13 @@ class AuthSignInHome(Home):
if not kw.get('otp_mobile_phone'):
data['msg'] = 'No mobile phone number provided for OTP!'
else:
# Get the target boolean field name for the account_type
target_field = request.env['res.partner'].sudo().get_partner_target_account_type(kw.get('account_type'))
user = request.env['res.users'].sudo().search([
('login', '=', kw.get('otp_mobile_phone')),
('partner_id.account_type', '=', kw.get('account_type'))
# ('partner_id.account_type', '=', kw.get('account_type'))
('partner_id.%s' % target_field, '=', True)
], limit=1)
if user:
data['status'] = True

View File

@ -14,6 +14,7 @@
'depends': ['mail', 'base', 'account'],
'data': [
# 'security/ir.model.access.csv',
'data/server_action.xml',
'views/res_city_view.xml',
'views/config_view.xml',
'views/bank_transfer_payment_view.xml',

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="action_migrate_partner_account_type" model="ir.actions.server">
<field name="name">Migrate Account Type to Booleans</field>
<field name="model_id" ref="base.model_ir_actions_server"/>
<field name="state">code</field>
<field name="code">
env['res.partner'].migrate_account_type_to_booleans()
</field>
</record>
</data>
</odoo>

View File

@ -28,8 +28,9 @@ msgstr ""
#. module: takaful_core
#: model:ir.model.fields,field_description:takaful_core.field_res_partner__account_type
#: model:ir.model.fields,field_description:takaful_core.field_res_users__account_type
#: model_terms:ir.ui.view,arch_db:takaful_core.res_partner_data
msgid "Account Type"
msgstr ""
msgstr "نوع الحساب"
#. module: takaful_core
#: model:ir.model.fields,field_description:takaful_core.field_res_partner__activation_mode
@ -988,4 +989,34 @@ msgstr ""
#. module: takaful_core
#: model:ir.model.fields,field_description:takaful_core.field_res_country_city__state_id
msgid "State"
msgstr "المحافظة"
msgstr "المحافظة"
#. module: takaful_core
#: model:ir.model.fields,field_description:takaful_core.field_res_partner__is_family
#: model:ir.model.fields,field_description:takaful_core.field_res_users__is_family
msgid "Is Family"
msgstr "عائلة؟"
#. module: takaful_core
#: model:ir.model.fields,field_description:takaful_core.field_res_partner__is_sponsor_portal
#: model:ir.model.fields,field_description:takaful_core.field_res_users__is_sponsor
msgid "Is Sponsor"
msgstr "كافل؟"
#. module: takaful_core
#: model:ir.model.fields,field_description:takaful_core.field_res_partner__is_benefit
#: model:ir.model.fields,field_description:takaful_core.field_res_users__is_benefit
msgid "Is Benefit"
msgstr "مستفيد؟"
#. module: takaful_core
#: model:ir.model.fields,field_description:takaful_core.field_res_partner__is_vendor
#: model:ir.model.fields,field_description:takaful_core.field_res_users__is_vendor
msgid "Is Vendor"
msgstr "مورد؟"
#. module: takaful_core
#: model:ir.model.fields,field_description:takaful_core.field_res_partner__is_donor
#: model:ir.model.fields,field_description:takaful_core.field_res_users__is_donor
msgid "Is Donor"
msgstr "متبرع؟"

View File

@ -9,7 +9,9 @@ from dateutil.relativedelta import relativedelta as rd
from odoo.exceptions import UserError, ValidationError, Warning
import re
import logging
_logger = logging.getLogger(__name__)
SAUDI_MOBILE_PATTERN = "(^(05|5)(5|0|3|6|4|9|1|8|7)([0-9]{7})$)"
@ -51,6 +53,11 @@ class Partner(models.Model):
('vendor', 'Vendor'),
('donor', 'Donor')],
required=False, )
is_family = fields.Boolean()
is_sponsor_portal = fields.Boolean(string='Is Sponsor')
is_benefit = fields.Boolean()
is_vendor = fields.Boolean()
is_donor = fields.Boolean()
code = fields.Char(string="Code", copy=False)
company_type = fields.Selection(selection_add=[('charity', _('Charity'))])
@ -105,6 +112,45 @@ class Partner(models.Model):
('user_id_uniq', 'unique (user_id)', 'The User Already Exist!'),
]
def get_partner_target_account_type(self, acc_type):
# Special mappings for account_type -> boolean field names
special_map = {
'sponsor': 'is_sponsor_portal',
}
# Determine the target boolean field name
target_field = special_map.get(acc_type, f'is_{acc_type}')
return target_field
def set_partner_account_type(self, acc_type):
self.ensure_one()
# Determine the target boolean field name
target_field = self.get_partner_target_account_type(acc_type)
# Validate that acc_type is one of the selection values and field exists
valid_types = {key for key, _ in self._fields['account_type'].selection}
if target_field in self._fields and (acc_type in valid_types or target_field == 'is_sponsor_portal'):
update_vals = {target_field: True}
self.write(update_vals)
def migrate_account_type_to_booleans(self):
"""
Server action method to migrate the old `account_type` selection
to the new `is_<type>` boolean fields for the given recordset.
"""
records = self.search([])
_logger.info(f"-> Starting account type migration for {len(records)} partner(s).")
for partner in records:
acc_type = partner.account_type
if not acc_type:
continue
partner.set_partner_account_type(acc_type)
_logger.info("-> Partner account type migration finished.")
return True
# @api.depends('father_family_name')
# def get_partner_name(self):
# for rec in self:

View File

@ -10,12 +10,27 @@
<xpath expr="//div/h1" position="after">
<!-- Add your fields or attributes here -->
<group>
<field name="account_type" groups="odex_benefit.group_benefit_info"/>
<!-- <field name="account_type" groups="odex_benefit.group_benefit_info"/> -->
<field name="code" groups="odex_benefit.group_benefit_info"/>
<field name="activation_mode" invisible="1"/>
<field name="user_type" invisible="1"/>
</group>
</xpath>
<xpath expr="//notebook" position="inside">
<page string="Account Type">
<group>
<group>
<field name="is_family" />
<field name="is_sponsor_portal" />
<field name="is_benefit" />
</group>
<group>
<field name="is_vendor" />
<field name="is_donor" />
</group>
</group>
</page>
</xpath>
</field>
</record>
<record id="view_res_city_tree" model="ir.ui.view">

View File

@ -7,11 +7,17 @@ class MyHome(CustomerPortal):
@http.route('/my', type='http', auth="user", website=True)
def home(self, **kw):
partner = http.request.env['res.partner'].sudo().search([('id', '=', request.env.user.partner_id.id)], limit=1)
# if partner.account_type == 'volunteer':
# return request.redirect("/profile")
# elif partner.account_type == 'benefit':
# return request.redirect("/benefit_profile")
# elif partner.account_type == 'sponsor':
# return request.redirect("/sponsor_profile")
if partner.account_type == 'volunteer':
return request.redirect("/profile")
elif partner.account_type == 'benefit':
elif partner.is_benefit:
return request.redirect("/benefit_profile")
elif partner.account_type == 'sponsor':
elif partner.is_sponsor_portal:
return request.redirect("/sponsor_profile")
else:
# return super(AccountPortal, self).index(*args, **kw)

View File

@ -54,7 +54,7 @@
</ul>
</li>
<!-- <li class="dropdown" t-if="request.env.user.partner_id.account_type=='benefit'"> -->
<li class="dropdown">
<li class="dropdown" t-if="request.env.user.partner_id.is_benefit">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true">المستفيدين</a>
<ul class="dropdown-menu">
<li>
@ -71,7 +71,7 @@
</ul>
</li>
<!-- <li class="dropdown" t-if="request.env.user.partner_id.account_type=='sponsor'"> -->
<li class="dropdown">
<li class="dropdown" t-if="request.env.user.partner_id.is_sponsor_portal">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true">الكافل</a>
<ul class="dropdown-menu">
<li>