Merge pull request #5048 from expsa/kgch_dev_odex25_ensan

Kgch dev odex25 ensan
This commit is contained in:
kchyounes19 2025-10-23 15:53:32 +01:00 committed by GitHub
commit 0d244e3cfc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 282 additions and 5 deletions

View File

@ -7,8 +7,8 @@
'website': 'http://exp-sa.com',
'license': 'GPL-3',
'author': 'Expert Ltd',
'depends': ['base','survey', 'takaful_core', 'website', 'account', 'report_xlsx', 'sale', 'product', 'stock', 'hr',
'purchase','web_google_maps','odex25_account_payment_fix','otp_sms_auth_custom'],
'depends': ['base', 'survey', 'takaful_core', 'website', 'account', 'report_xlsx', 'sale', 'product', 'stock', 'hr',
'purchase', 'web_google_maps', 'odex25_account_payment_fix', 'otp_sms_auth_custom'],
'data': [
'security/security_view.xml',
'security/ir.model.access.csv',
@ -65,9 +65,11 @@
'wizards/visit_location_otp_wizard_view.xml',
'views/benefit_vehicle_model.xml',
'wizards/visit_location_refused_wizard_view.xml',
'wizards/family_bank_report_wizard.xml',
'views/visit_survey.xml',
'views/actions_and_menus.xml',
],
'reports/family_bank_report.xml',
],
'external_dependencies': {
'python': ['num2words'],
},

View File

@ -15944,6 +15944,7 @@ msgstr "بإنتظار مساعد المدير العام"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__start_date
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__start_date
#: model:ir.model.fields,field_description:odex_benefit.field_family_bank_report_wizard__start_date
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__new_start
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__start
msgid "Start Date"
@ -15953,6 +15954,7 @@ msgstr "تاريخ البداية"
#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__end_date
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__end_date
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__end
#: model:ir.model.fields,field_description:odex_benefit.field_family_bank_report_wizard__end_date
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__new_end
msgid "End Date"
msgstr "تاريخ النهاية"
@ -16556,3 +16558,50 @@ msgstr ""
"بعض الأسر المحددة ليست في حالة معتمدة أو تم إيقافها:\n"
"%s"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__acc_holder_id_number
msgid "Account Holder ID Number"
msgstr "رقم هوية صاحب الحساب"
#. module: odex_benefit
#: code:addons/odex_benefit/models/benefit.py:0
#, python-format
msgid "Account Holder ID Number must contain exactly 10 digits."
msgstr "يجب أن يحتوي رقم هوية صاحب الحساب على 10 أرقام بالضبط."
#. module: odex_benefit
#: model:ir.model,name:odex_benefit.model_report_odex_benefit_family_bank_report_xlsx
msgid "Family Bank Report XLSX"
msgstr "تقرير البنك للأسر XLSX"
#. module: odex_benefit
#: code:addons/odex_benefit/reports/family_bank_report.py:0
#: model:ir.actions.act_window,name:odex_benefit.action_family_bank_report_wizard
#: model:ir.model,name:odex_benefit.model_family_bank_report_wizard
#: model:ir.ui.menu,name:odex_benefit.menu_family_bank_report_root
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_family_bank_report_wizard_form
#, python-format
msgid "Family Bank Report"
msgstr "تقرير البنك للأسر"
#. module: odex_benefit
#: model:ir.actions.report,name:odex_benefit.action_family_bank_report_xlsx
msgid "Family Bank Report (Excel)"
msgstr "تقرير البنك للأسر (إكسل)"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_family_bank_report_wizard__move_ids
msgid "Monthly Expenses"
msgstr "المصروفات الشهرية"
#. module: odex_benefit
#: code:addons/odex_benefit/wizards/family_bank_report_wizard.py:0
#, python-format
msgid "Please select at least one Monthly Expense."
msgstr "يرجى اختيار مصروف شهري واحد على الأقل."
#. module: odex_benefit
#: code:addons/odex_benefit/wizards/family_bank_report_wizard.py:0
#, python-format
msgid "No debit lines with family information found."
msgstr "لم يتم العثور على قيود تحتوي على معلومات الأسر."

View File

@ -70,6 +70,7 @@ class GrantBenefitProfile(models.Model):
family_bank = fields.Many2one('res.partner.bank')
acc_number = fields.Char('Account Number',copy=False)
acc_holder_name = fields.Char('Account Holder Name')
acc_holder_id_number = fields.Char(string="Account Holder ID Number")
bank_id = fields.Many2one("res.bank",string='Bank')
account_relation = fields.Many2one('relation.settings',string="Account Owner Relation")
orphan_status = fields.Selection(
@ -1033,6 +1034,14 @@ class GrantBenefitProfile(models.Model):
'message': _('Non-Saudi mothers and fathers cannot register')}
return res
@api.constrains('acc_holder_id_number')
def _check_acc_holder_id_number(self):
for record in self:
id_number = record.acc_holder_id_number
if id_number:
if not re.match(r'^\d{10}$', id_number):
raise ValidationError(_("Account Holder ID Number must contain exactly 10 digits."))
@api.constrains('father_id_number', 'mother_id_number', 'replacement_mother_id_number')
def _onchange_id_numbers(self):
id_numbers = {

View File

@ -1 +1,2 @@
from . import benefit_report
from . import benefit_report
from . import family_bank_report

View File

@ -0,0 +1,94 @@
# -*- coding: utf-8 -*-
from odoo import api, fields, models, tools, _
from odoo.exceptions import ValidationError, UserError
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
class FamilyBankReportXlsx(models.AbstractModel):
_name = 'report.odex_benefit.family_bank_report_xlsx'
_description = 'Family Bank Report XLSX'
_inherit = 'report.report_xlsx.abstract'
@api.model
def generate_xlsx_report(self, workbook, data, objs):
sheet = workbook.add_worksheet(_('Family Bank Report'))
if self.env.user.lang != 'en_US':
sheet.right_to_left()
header_format = workbook.add_format({
'bold': True,
'align': 'center',
'valign': 'vcenter',
'bg_color': '#4472C4',
'font_color': 'white',
'border': 1,
'text_wrap': True
})
subheader_format = workbook.add_format({
'bold': True,
'align': 'center',
'valign': 'vcenter',
'bg_color': '#D3D3D3',
'border': 1,
'font_size': 9
})
normal = workbook.add_format({
'align': 'center',
'valign': 'vcenter',
'border': 1
})
bold = workbook.add_format({
'bold': True,
'align': 'center',
'valign': 'vcenter',
'border': 1
})
sheet.set_row(0, 30)
sheet.set_row(1, 25)
sheet.set_row(2, 25)
sheet.merge_range('A1:A2', 'Bank Name' + '\nاسم البنك', header_format)
sheet.merge_range('B1:B2', 'Account Number(24N)' + '\nرقم الحساب', header_format)
sheet.merge_range('C1:C2', 'Beneficiary Name' + '\nاسم المستفيد', header_format)
sheet.merge_range('D1:D2', 'Amount(15)' + '\nقيمة الحوالة', header_format)
sheet.merge_range('E1:E2', 'Civilian_Id(20)' + '\nرقم الهوية', header_format)
sheet.merge_range('F1:F2', 'Currency (3N)' + '\nالعملة', header_format)
sheet.merge_range('G1:G2', 'Beneficiaries Remarks (30)' + '\nملاحظات المستفيد', header_format)
sheet.merge_range('H1:H2', 'Payment Purpose' + '\nغرض الدفع', header_format)
sheet.merge_range('I1:I2', 'Beneficiary Email' + '\nالبريد الإلكتروني للمستفيد', header_format)
row = 3
total_amount = 0
for line in data['lines']:
sheet.write(row, 0, line['bank_name'], normal)
sheet.write(row, 1, line['account_number'], normal)
sheet.write(row, 2, line['beneficiary_name'], normal)
sheet.write_number(row, 3, line['transfer_amount'], normal)
sheet.write(row, 4, line['beneficiary_id'], normal)
sheet.write(row, 5, line['currency'], normal)
sheet.write(row, 6, line['family_code'], normal)
sheet.write(row, 7, line['purpose'], normal)
sheet.write(row, 8, line.get('beneficiary_email', ''), normal)
total_amount += line['transfer_amount']
row += 1
sheet.merge_range(row + 1, 0, row + 1, 2, "Total" + " / " + "الإجمالي", bold)
sheet.write_number(row + 1, 3, total_amount, bold)
sheet.write(row + 1, 4, "", bold)
sheet.write(row + 1, 5, "SAR", bold)
sheet.set_column('A:A', 25)
sheet.set_column('B:B', 25)
sheet.set_column('C:C', 30)
sheet.set_column('D:D', 15)
sheet.set_column('E:E', 20)
sheet.set_column('F:F', 12)
sheet.set_column('G:G', 25)
sheet.set_column('H:H', 20)
sheet.set_column('I:I', 30)

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="action_family_bank_report_xlsx" model="ir.actions.report">
<field name="model">family.bank.report.wizard</field>
<field name="name">Family Bank Report (Excel)</field>
<field name="report_type">xlsx</field>
<field name="report_name">odex_benefit.family_bank_report_xlsx</field>
<field name="report_file">odex_benefit.family_bank_report_xlsx</field>
</record>
</data>
</odoo>

View File

@ -166,4 +166,5 @@ access_survey_user_input_group_benefit_info,survey.user_input.group_benefit_info
access_survey_user_input_line_group_benefit_info,survey.user_input.line.group_benefit_info,survey.model_survey_user_input_line,odex_benefit.group_benefit_info,1,0,0,0
access_grant_benefit_account_move_line,access_grant_benefit_account_move_line,model_account_move_line,odex_benefit.group_benefit_info,1,0,0,0
access_grant_benefit_account_move,access_grant_benefit_account_move,model_account_move,odex_benefit.group_benefit_info,1,0,0,0
access_benefit_expense_line,access_benefit_expense_line,model_benefit_expense_line,base.group_user,1,1,1,1
access_benefit_expense_line,access_benefit_expense_line,model_benefit_expense_line,base.group_user,1,1,1,1
access_family_bank_report_wizard,access_family_bank_report_wizard,model_family_bank_report_wizard,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
166 access_survey_user_input_line_group_benefit_info survey.user_input.line.group_benefit_info survey.model_survey_user_input_line odex_benefit.group_benefit_info 1 0 0 0
167 access_grant_benefit_account_move_line access_grant_benefit_account_move_line model_account_move_line odex_benefit.group_benefit_info 1 0 0 0
168 access_grant_benefit_account_move access_grant_benefit_account_move model_account_move odex_benefit.group_benefit_info 1 0 0 0
169 access_benefit_expense_line access_benefit_expense_line model_benefit_expense_line base.group_user 1 1 1 1
170 access_family_bank_report_wizard access_family_bank_report_wizard model_family_bank_report_wizard base.group_user 1 1 1 1

View File

@ -1039,6 +1039,11 @@
parent="education_main_menu" action="education_exam_type_action" sequence="9"/>
<menuitem id="menu_confirm_benefit_expense" name="Benefit Expense Flow" parent="account.menu_finance_payables"
action="action_confirm_benefit_expense" sequence="11"/>
<menuitem id="menu_family_bank_report_root"
name="Family Bank Report"
parent="account.menu_finance_payables"
action="action_family_bank_report_wizard"
sequence="12"/>
<menuitem id="menu_payment_orders" name="Payment Orders"
parent="account.menu_finance_payables"
action="action_payment_orders" sequence="10" />

View File

@ -1371,6 +1371,8 @@
groups="!odex_benefit.group_benefit_manager"/>
<field name="acc_holder_name"
attrs="{'invisible':[('is_family_member','=',True)],'readonly':[('state','not in',['complete_info','waiting_approve','first_approve'])]}"/>
<field name="acc_holder_id_number"
attrs="{'invisible':[('is_family_member','=',True)],'readonly':[('state','not in',['complete_info','waiting_approve','first_approve'])]}"/>
<field name="family_member_id"
attrs="{'invisible':[('is_family_member','=',False)],'readonly':[('state','not in',['complete_info','waiting_approve','first_approve'])]}"
options="{'no_create': True, 'no_create_edit': True}"

View File

@ -9,3 +9,4 @@ from . import service_refuse_reason_wizard
from . import reason_for_return_wizard
from . import visit_location_otp_wizard
from . import visit_location_refused_wizard
from . import family_bank_report_wizard

View File

@ -0,0 +1,59 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
from odoo.exceptions import UserError
from odoo.tools import date_utils
class FamilyBankReportWizard(models.TransientModel):
_name = 'family.bank.report.wizard'
_description = 'Family Bank Report'
start_date = fields.Date(
string="Start Date",
default=lambda self: date_utils.start_of(fields.Date.today(), 'month'),
required=True
)
end_date = fields.Date(
string="End Date",
default=lambda self: date_utils.end_of(fields.Date.today(), 'month'),
required=True
)
move_ids = fields.Many2many(comodel_name='account.move',
string="Monthly Expenses", required=True,
domain="[('state', '=', 'posted'),('date','>=', start_date),('date','<=', end_date),('family_confirm_id', '!=', False)]"
)
def action_print_bank_report(self):
if not self.move_ids:
raise UserError(_("Please select at least one Monthly Expense."))
lines_data = []
for move in self.move_ids:
for line in move.line_ids.filtered(lambda l: l.debit > 0 and l.benefit_family_id):
family = line.benefit_family_id
beneficiary_name = ''
beneficiary_id = ''
if family.is_family_member:
beneficiary_name = family.family_member_id.name
beneficiary_id = family.family_member_id.member_id_number
else:
beneficiary_name = family.acc_holder_name
beneficiary_id = family.acc_holder_id_number
lines_data.append({
'bank_name': family.bank_id.name or '',
'account_number': 'SA' + family.acc_number or '',
'beneficiary_name': beneficiary_name,
'transfer_amount': line.debit or 0.0,
'beneficiary_id': beneficiary_id,
'currency': 'SAR',
'family_code': family.code or '',
'purpose': 'Others',
})
if not lines_data:
raise UserError(_("No debit lines with family information found."))
datas = {
'start_date': self.start_date,
'end_date': self.end_date,
'lines': lines_data,
}
return self.env.ref('odex_benefit.action_family_bank_report_xlsx').report_action(self, data=datas)

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_family_bank_report_wizard_form" model="ir.ui.view">
<field name="name">family.bank.report.wizard.form</field>
<field name="model">family.bank.report.wizard</field>
<field name="arch" type="xml">
<form string="Family Bank Report">
<sheet>
<group>
<group>
<field name="start_date"/>
</group>
<group>
<field name="end_date"/>
</group>
</group>
<notebook>
<page string="Family Monthly Expense">
<field name="move_ids" options="{'no_create': True}"/>
</page>
</notebook>
</sheet>
<footer>
<button string="Print Excel Report" type="object" name="action_print_bank_report"
class="btn-primary" icon="fa-print"/>
<button string="Cancel" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="action_family_bank_report_wizard" model="ir.actions.act_window">
<field name="name">Family Bank Report</field>
<field name="res_model">family.bank.report.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="view_family_bank_report_wizard_form"/>
<field name="target">new</field>
</record>
</data>
</odoo>