[IMP] odex_benefit: Add Bank report for families
This commit is contained in:
parent
00eb1beba1
commit
9e20d95734
|
|
@ -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'],
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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 = {
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
from . import benefit_report
|
||||
from . import benefit_report
|
||||
from . import family_bank_report
|
||||
|
|
@ -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)
|
||||
|
|
@ -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>
|
||||
|
|
@ -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
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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}"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -0,0 +1,120 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import UserError
|
||||
from odoo.tools import date_utils
|
||||
|
||||
|
||||
class GrantRefusedReasonWizard(models.TransientModel):
|
||||
_name = 'entity.black.list.wizard'
|
||||
|
||||
_description = "Entity Black List Wizard"
|
||||
|
||||
def _default_entity(self):
|
||||
return self._context.get('active_id')
|
||||
|
||||
def _default_state(self):
|
||||
return self._context.get('state')
|
||||
|
||||
entity_id = fields.Many2one("grant.benefit", string="Entity", default=_default_entity)
|
||||
state = fields.Selection([
|
||||
('draft', 'Draft'),
|
||||
('first_refusal', 'First Refusal'),
|
||||
('approve', 'Approved'),
|
||||
('record_end_date', 'Record end date'),
|
||||
('refused', 'Refused'),
|
||||
('black_list', 'Black List'),
|
||||
], string="State", default=_default_state)
|
||||
black_list_reason = fields.Text(string='Black List Reason', required=True)
|
||||
black_list_message = fields.Text(string='Black List Message')
|
||||
|
||||
# @api.multi
|
||||
def create_action(self):
|
||||
"""Throw pop up to write the black list reason for grant"""
|
||||
partner_ids = []
|
||||
for rec in self:
|
||||
if rec.entity_id:
|
||||
result = rec.entity_id.sudo().write({
|
||||
"state": rec.state,
|
||||
"black_list_reason": rec.black_list_reason,
|
||||
"black_list_message": rec.black_list_message,
|
||||
})
|
||||
# grant_ids = self.env['grant.task'].search([('entity_id', '=', rec.entity_id.id)]).unlink()
|
||||
subject = _('Entity')
|
||||
state_label = dict(rec.fields_get(allfields=['state'])['state']['selection'])[rec.state]
|
||||
body = ' '.join(
|
||||
(_(u'The Entity '), rec.entity_id.name, _(u' State changed to '), state_label, u'.')).encode(
|
||||
'utf-8')
|
||||
partner_ids += [(6, 0, rec.entity_id.message_follower_ids.ids)]
|
||||
message_vals = {
|
||||
'subject': subject,
|
||||
'body': body,
|
||||
'partner_ids': partner_ids,
|
||||
}
|
||||
rec.entity_id.message_post(body=body, subject=subject,
|
||||
message_type='email')
|
||||
user = self.env['res.users'].search([('partner_id', '=', rec.entity_id.partner_id.id)], limit=1)
|
||||
|
||||
user.sudo().write({
|
||||
'groups_id': [(3, self.env.ref('base.group_erp_manager', False).id),
|
||||
],
|
||||
|
||||
})
|
||||
rec.entity_id.send_black_list_email()
|
||||
|
||||
return {'type': 'ir.actions.act_window_close'}
|
||||
|
||||
|
||||
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)
|
||||
|
|
@ -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>
|
||||
Loading…
Reference in New Issue