Benefit customization

This commit is contained in:
eman 2024-10-31 15:19:53 +03:00
parent ea37855ba8
commit 788597decf
8 changed files with 1120 additions and 638 deletions

File diff suppressed because it is too large Load Diff

View File

@ -643,15 +643,6 @@ class GrantBenefitProfile(models.Model):
rooms = rec.env['benefit.housing.rooms'].sudo().search([('housing_id', '=', rec.id)])
rec.rooms_number = len(rooms)
# @api.onchange('block', 'city_id', 'housing_number', 'house_number')
# def _compute_get_name(self):
# for rec in self:
# if rec.block and rec.city_id and rec.housing_number and rec.house_number:
# rec.housing_name = str(rec.housing_number + "-" + rec.house_number + "-" + rec.block + "-" + str(
# rec.city_id.code) + "-" + rec.street)
# else:
# rec.housing_name = ""
@api.onchange('room_ids')
def onchange_room_ids(self):
res = {}
@ -661,7 +652,6 @@ class GrantBenefitProfile(models.Model):
res['domain'] = {'items': [('room_id', 'in', items_ids)]}
return res
@api.onchange("father_country_id", 'mother_country_id')
def onchange_father_mother_country_id(self):
res = {}
@ -676,9 +666,9 @@ class GrantBenefitProfile(models.Model):
@api.onchange('father_id_number', 'mother_id_number', 'replacement_mother_id_number')
def _onchange_id_numbers(self):
id_numbers = {
'Father ID Number': self.father_id_number,
'Mother ID Number': self.mother_id_number,
'Replacement Mother ID Number': self.replacement_mother_id_number,
'رقم هوية الأب': self.father_id_number,
'رقم هوية الأم': self.mother_id_number,
'رقم هوية الأم البديلة': self.replacement_mother_id_number,
}
# Check each ID number for 10-digit format and uniqueness within the parent model
@ -686,17 +676,15 @@ class GrantBenefitProfile(models.Model):
for label, id_number in id_numbers.items():
if id_number:
if not re.match(r'^\d{10}$', id_number):
raise ValidationError(f"{label} must contain exactly 10 digits.")
raise ValidationError(_("%s must contain exactly 10 digits.")%label)
if id_number in unique_ids:
raise ValidationError(f"{label} must be unique within the same record.")
raise ValidationError(_("%s must be unique within the same record.") % label)
unique_ids.add(id_number)
# Check for uniqueness against `member_id_number` in child records and across database records
for member in self.member_ids:
if member.member_id_number and member.member_id_number in unique_ids:
raise ValidationError(
f"The ID number '{member.member_id_number}' in the Family Members list must be unique across the record.")
raise ValidationError(_("The ID number %s in the Family Members list must be unique across the record.")%member.member_id_number)
# Check for duplicate IDs across records in the database
for id_number in unique_ids:
duplicate_record_family = self.env['grant.benefit'].search([
@ -705,16 +693,9 @@ class GrantBenefitProfile(models.Model):
], limit=1)
duplicate_record_member = self.env['family.member'].search([('member_id_number', '=', id_number)], limit=1)
if duplicate_record_family :
raise ValidationError(
f"The ID number '{id_number}' already exists in Family"
f"with code '{duplicate_record_family.code}'. Please enter a unique ID number."
)
raise ValidationError(_("The ID number {} already exists in family with code {}. Please enter a unique ID number.").format(id_number, duplicate_record_family.code))
if duplicate_record_member :
raise ValidationError(
f"The ID number '{id_number}' already exists in family "
f"with code '{duplicate_record_member.benefit_id.code}'. Please enter a unique ID number."
)
raise ValidationError(_("The ID number {} already exists in family with code {}. Please enter a unique ID number.").format(id_number, duplicate_record_member.code))
@api.onchange("family_bank")
def onchange_family_bank(self):
@ -1264,40 +1245,11 @@ class GrantBenefitProfile(models.Model):
qr_image = base64.b64encode(temp.getvalue())
self.qr_code = qr_image
# @api.onchange('name')
# def generate_qr_code(self):
# qr = qrcode.QRCode(
# version=1,
# error_correction=qrcode.constants.ERROR_CORRECT_L,
# box_size=15,
# border=4,
# )
# name = self.name
# qr.add_data(name)
# qr.make(fit=True)
# img = qr.make_image()
# temp = BytesIO()
# img.save(temp, format="PNG")
# qr_image = base64.b64encode(temp.getvalue())
# self.qr_code = qr_image
@api.onchange('bank_id')
def _compute_prefix_iban(self):
if self.bank_id:
self.iban = self.bank_id.iban
# @api.depends('age', 'gender')
# def get_orphan_category(self):
# for rec in self:
# if rec.age and rec.gender:
# age = int(rec.age)
# category = self.env['benefit.category'].sudo().search([],limit=1)
# record = category.filtered(
# lambda r: r.age_from <= age and age <= r.age_to and r.gender == rec.gender
# )
# rec.benefit_category_id = record.id if record else False
# rec.benefit_category_id = False
@api.onchange('weight', 'height')
def _compute_obesity_rate(self):
for rec in self:
@ -1356,6 +1308,7 @@ class GrantBenefitProfile(models.Model):
rec.total_income += calculate_income(rec.replacement_mother_income, rec.replacement_mother_status,
rec.salary_ids)
def get_mother_name(self):
for rec in self:
name = ''

View File

@ -685,7 +685,7 @@ class ServiceAttachmentsSettings(models.Model):
name = fields.Char(string='name')
service_attach = fields.Many2many('ir.attachment','rel_service_attachments', 'service_id', 'attach_id',string="Attachment")
service_type = fields.Selection([('rent', 'Rent'),('home_restoration', 'Home Restoration'),('alternative_housing', 'Alternative Housing')],string='Service Type',related="service_id.service_type")
service_type = fields.Selection([('rent', 'Rent'),('home_restoration', 'Home Restoration'),('alternative_housing', 'Alternative Housing'),('home_maintenance','Home Maintenance')],string='Service Type',related="service_id.service_type")
service_id = fields.Many2one('services.settings',string='Service')
service_request_id = fields.Many2one('service.request',string='Service Request')
notes = fields.Text(string='Notes')

View File

@ -13,7 +13,7 @@ class ServiceRequest(models.Model):
# raise_amount_for_orphan = fields.Float(string='Raise Amount For Orphan')
# rent_lines = fields.One2many('rent.lines','services_settings_id')
benefit_type = fields.Selection(string='Benefit Type',selection=[('family', 'Family'),('member', 'Member')])
date = fields.Datetime(string='Date')
date = fields.Datetime(string='Date',default=fields.Datetime.now)
family_id = fields.Many2one('grant.benefit',string='Family',domain="['|','|',('state','=','second_approve'),('state','=','temporarily_suspended'),('state','=','suspended_first_approve')]")
family_category = fields.Many2one('benefit.category',string='Family Category',related='family_id.benefit_category_id')
benefit_member_count = fields.Integer(string="Benefit Member count", related='family_id.benefit_member_count')
@ -43,9 +43,10 @@ class ServiceRequest(models.Model):
'attachment_id', string='Rent Attachment')
added_amount_if_mother_dead = fields.Float(string="Added Amount (If mother dead)",compute="_get_added_amount_if_mother_dead")
attachment_lines = fields.One2many('service.attachments.settings','service_request_id',related='service_cat.attachment_lines',readonly=False)
account_id = fields.Many2one('account.account',string='Expenses Account',domain="[('user_type_id.id','=',15)]")
account_id = fields.Many2one('account.account',string='Expenses Account',related='service_cat.account_id')
service_producer_id = fields.Many2one('res.partner',string='Service Producer')
is_service_producer = fields.Boolean(string='Is Service Producer?',related='service_cat.is_service_producer')
maintenance_items_id = fields.Many2one('home.maintenance.lines', string="Maintenance Items")
state = fields.Selection([
('draft', 'Draft'),
('send_request', 'Send Request'),
@ -117,7 +118,7 @@ class ServiceRequest(models.Model):
@api.onchange('service_cat','family_id')
def onchange_service_cat(self):
for rec in self:
if rec.service_cat.service_type == 'rent' and rec.family_id.property_type == 'ownership' or rec.family_id.property_type == 'ownership_shared':
if rec.service_cat.service_type == 'rent' and (rec.family_id.property_type == 'ownership' or rec.family_id.property_type == 'ownership_shared') and rec.benefit_type == 'family':
raise UserError(_("You cannot benefit from this service"))
@api.onchange('rent_payment_date')
@ -128,13 +129,23 @@ class ServiceRequest(models.Model):
month_before_rent_payment_date = rec.rent_payment_date - timedelta(days=30)
if today_date > month_before_rent_payment_date:
raise UserError(_("You Should request At least a month ago rent payment date"))
@api.onchange('requested_service_amount','benefit_type')
@api.onchange('requested_service_amount','benefit_type','date')
def onchange_requested_service_amount(self):
for rec in self:
today = fields.Date.today()
date_before_year = today - timedelta(days=365)
if rec.requested_service_amount and rec.benefit_type == 'member':
max_requested_amount = rec.service_cat.max_amount_for_student
if rec.requested_service_amount > max_requested_amount:
raise UserError(_("You Cannot request More than %s") % max_requested_amount)
if rec.requested_service_amount and rec.benefit_type == 'family' and rec.service_cat.service_type == 'home_maintenance':
max_requested_amount = rec.service_cat.max_maintenance_amount
if rec.requested_service_amount > max_requested_amount:
raise UserError(_("You Cannot request More than %s") % max_requested_amount)
if rec.benefit_type == 'family' and rec.service_cat.service_type == 'home_maintenance':
if self.search([('date','>',date_before_year),('family_id','=',rec.family_id.id)]):
raise UserError(_("You Cannot request this service twice in same year"))
@api.onchange('member_id')
def onchange_member_id(self):
@ -146,15 +157,29 @@ class ServiceRequest(models.Model):
@api.onchange('family_category', 'sub_service_category')
def _onchange_service_cat_domain(self):
# Build the dynamic domain
domain = [
'|',
('rent_lines.benefit_category_id', 'in', [self.family_category.id]),
('home_restoration_lines.benefit_category_id', 'in', [self.family_category.id]),
('is_main_service', '=', False),
('service_type', '!=', False),
('parent_service', '=', self.sub_service_category.id)
]
# Apply the domain dynamically
domain = []
if self.benefit_type == 'family':
domain = [
'|','|',
('rent_lines.benefit_category_id', 'in', [self.family_category.id]),
('home_restoration_lines.benefit_category_id', 'in', [self.family_category.id]),
('benefit_category_ids', 'in', [self.family_category.id]),
('is_main_service', '=', False),
('service_type', '!=', False),
('parent_service', '=', self.sub_service_category.id)
]
if self.benefit_type == 'member':
domain = [
'|', '|',
('rent_lines.benefit_category_id', 'in', [self.family_category.id]),
('home_restoration_lines.benefit_category_id', 'in', [self.family_category.id]),
('benefit_category_ids', 'in', [self.family_category.id]),
('is_main_service', '=', False),
('service_type', '!=', False),
('parent_service', '=', self.sub_service_category.id),
('is_this_service_for_student','=',True)
]
# Apply the domain
return {'domain': {'service_cat': domain}}
def action_set_to_draft(self):

View File

@ -9,7 +9,8 @@ class ServicesSettings(models.Model):
parent_service = fields.Many2one('services.settings',string='Parent Service')
is_main_service = fields.Boolean(string='Is Main Service?')
is_service_producer = fields.Boolean(string='Is Service Producer?')
service_type = fields.Selection([('rent', 'Rent'),('home_restoration', 'Home Restoration'),('alternative_housing', 'Alternative Housing')],string='Service Type')
is_this_service_for_student = fields.Boolean(string='Is Service For Student?')
service_type = fields.Selection([('rent', 'Rent'),('home_restoration', 'Home Restoration'),('alternative_housing', 'Alternative Housing'),('home_maintenance','Home Maintenance')],string='Service Type')
max_amount_for_student = fields.Float(string='Max Amount for Student')
raise_amount_for_orphan = fields.Float(string='Raise Amount For Orphan')
rent_lines = fields.One2many('rent.lines','services_settings_id')
@ -18,6 +19,10 @@ class ServicesSettings(models.Model):
home_restoration_lines = fields.One2many('home.restoration.lines','services_settings_id')
rent_amount_for_alternative_housing = fields.Float(string='Rent Amount For Alternative Housing')
rent_period = fields.Integer('Rent Period')
home_maintenance_lines = fields.One2many('home.maintenance.lines','services_settings_id')
benefit_category_ids = fields.Many2many('benefit.category', string='Allowed Categories')
max_maintenance_amount = fields.Float(string='Max Maintenance Amount')
account_id = fields.Many2one('account.account',string='Expenses Account',domain="[('user_type_id.id','=',15)]")
class RentLines(models.Model):
_name = 'rent.lines'
@ -34,4 +39,11 @@ class HomeRestorationLines(models.Model):
benefit_category_id = fields.Many2one('benefit.category', string='Benefit Category')
services_settings_id = fields.Many2one('services.settings', string='Services Settings')
max_amount = fields.Float(string='Max Amount')
max_amount = fields.Float(string='Max Amount')
class HomeMaintenanceLines(models.Model):
_name = 'home.maintenance.lines'
_rec_name = 'maintenance_name'
services_settings_id = fields.Many2one('services.settings', string='Services Settings')
maintenance_name = fields.Char(string='Maintenance Name')

View File

@ -125,4 +125,5 @@ access_exception_reason,access_exception_reason,model_exception_reason,base.grou
access_service_request,access_service_request,model_service_request,base.group_user,1,1,1,1
access_marital_status,access_marital_status,model_marital_status,base.group_user,1,1,1,1
access_service_attachments_settings,access_service_attachments_settings,model_service_attachments_settings,base.group_user,1,1,1,1
access_home_restoration_lines,access_home_restoration_lines,model_home_restoration_lines,base.group_user,1,1,1,1
access_home_restoration_lines,access_home_restoration_lines,model_home_restoration_lines,base.group_user,1,1,1,1
access_home_maintenance_lines,access_home_maintenance_lines,model_home_maintenance_lines,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
125 access_service_request access_service_request model_service_request base.group_user 1 1 1 1
126 access_marital_status access_marital_status model_marital_status base.group_user 1 1 1 1
127 access_service_attachments_settings access_service_attachments_settings model_service_attachments_settings base.group_user 1 1 1 1
128 access_home_restoration_lines access_home_restoration_lines model_home_restoration_lines base.group_user 1 1 1 1
129 access_home_maintenance_lines access_home_maintenance_lines model_home_maintenance_lines base.group_user 1 1 1 1

View File

@ -38,7 +38,7 @@
<field name="branch_custom_id" force_save="1"/>
<field name="member_id" attrs="{'invisible':[('benefit_type','!=','member')],'readonly':[('state','not in',['draft','send_request'])],'required':[('benefit_type','=','member')]}"/>
<field name="requested_service_amount" attrs="{'readonly':[('state','not in',['draft','send_request'])]}" required="1"/>
<field name="account_id" attrs="{'readonly':[('state','not in',['draft','send_request'])]}"/>
<field name="account_id"/>
<field name="is_service_producer" invisible="1"/>
<field name="service_producer_id" attrs="{'readonly':[('state','not in',['draft','send_request'])],'invisible':[('is_service_producer','=',False)]}"/>
</group>
@ -47,7 +47,7 @@
<field name="main_service_category" attrs="{'readonly':[('state','not in',['draft','send_request'])]}" required="1"/>
<field name="sub_service_category" attrs="{'readonly':[('state','not in',['draft','send_request'])]}" required="1"/>
<field name="service_cat" attrs="{'readonly':[('state','not in',['draft','send_request'])]}" required="1"/>
<field name="date" attrs="{'readonly':[('state','not in',['draft','send_request'])]}"/>
<field name="date" attrs="{'readonly':[('state','not in',['draft','send_request'])]}" required="1"/>
<field name="description" attrs="{'readonly':[('state','not in',['draft','send_request'])]}"/>
<field name="service_attach" attrs="{'readonly':[('state','not in',['draft','send_request'])]}" widget="many2many_attachment_preview"/>
<field name="service_type" invisible="1"/>
@ -61,7 +61,7 @@
<group>
<separator string="Rent Contract Information" colspan="2"/>
<br/>
<field name="rent_payment_date" required="1"/>
<field name="rent_payment_date" attrs="{'required':[('service_type','=','rent')]}"/>
<field name="rent_contract_number" attrs="{'invisible':[('benefit_type','!=','family')]}"/>
<field name="rent_start_date" attrs="{'invisible':[('benefit_type','!=','family')]}"/>
<field name="rent_end_date" attrs="{'invisible':[('benefit_type','!=','family')]}"/>
@ -83,6 +83,11 @@
</sheet>
</form>
</page>
<page string="Maintenance Service" attrs="{'invisible':[('service_type', '!=', 'home_maintenance')]}">
<group>
<field name="maintenance_items_id"/>
</group>
</page>
<page string="Services Attachments Settings">
<field name="attachment_lines" widget="one2many_list">
<tree editable="bottom" delete="0">

View File

@ -15,6 +15,8 @@
</group>
<group>
<field name="service_type"/>
<field name="is_this_service_for_student"/>
<field name="account_id"/>
</group>
</group>
<notebook>
@ -59,6 +61,19 @@
<field name="rent_period"/>
</group>
</page>
<page string="Home Maintenance Service Settings" attrs="{'invisible':[('service_type','!=','home_maintenance')]}">
<field name="home_maintenance_lines" widget="one2many_list">
<tree editable="bottom">
<field name="maintenance_name"/>
</tree>
</field>
<!-- <group>-->
<group>
<field name="benefit_category_ids" widget="many2many_tags"/>
<field name="max_maintenance_amount"/>
</group>
<!-- </group>-->
</page>
</notebook>
</sheet>
</form>