Create new type of payroll bank type

This commit is contained in:
Mazen Abdo 2025-10-30 01:08:05 +03:00
parent f393f1614c
commit 06697fdcb0
5 changed files with 63 additions and 99 deletions

View File

@ -1,9 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Al-Bilad Bank PDF Report Template -->
<template id="albilad_bank_pdf">
<t t-call="web.html_container">
<!-- <t t-call="web.external_layout">-->
<div class="page" dir="rtl">
<style>
.albilad-table {
@ -47,14 +45,11 @@
}
</style>
<!-- Title based on report type with date range -->
<div class="albilad-title">
<t t-esc="report_title"/> <t t-esc="date_from"/> - <t t-esc="date_to"/>
</div>
<!-- Check if grouped by bank (no_details = True) -->
<t t-if="no_details">
<!-- With details - grouped by bank -->
<t t-foreach="payslip_data" t-as="bank_data">
<div class="albilad-bank-header">
<t t-esc="bank_data.get('bank_name', '')"/>
@ -62,7 +57,6 @@
<table class="albilad-table">
<thead>
<!-- Arabic headers -->
<tr class="albilad-header">
<th>المبلغ الاجمالي</th>
<th>رقم الايبان</th>
@ -96,7 +90,6 @@
</t>
</t>
<!-- Without details - all data in one table -->
<t t-if="not no_details">
<table class="albilad-table">
<thead>
@ -133,11 +126,9 @@
</table>
</t>
</div>
<!-- </t>-->
</t>
</template>
<!-- Main Report Definition -->
<record id="report_payroll_bank_albilad_pdf" model="ir.actions.report">
<field name="name">Al-Bilad Bank Payroll Report (PDF)</field>
<field name="model">payroll.bank.wiz</field>

View File

@ -75,7 +75,7 @@ class PayrollBankAlbiladReportXlsx(models.AbstractModel):
row += 3
sheet.write(row - 1, 1, bank.name, format3)
# English headers row
sheet.write(row, 2, 'Total Amount', format2)
sheet.write(row, 3, 'Beneficiary Account IBAN', format2)
sheet.write(row, 4, 'Beneficiary Name', format2)
@ -88,7 +88,7 @@ class PayrollBankAlbiladReportXlsx(models.AbstractModel):
sheet.write(row, 11, 'Beneficiary National/IqamaID', format2)
row += 1
# Arabic headers row
sheet.write(row, 2, 'المبلغ الاجمالي', format2)
sheet.write(row, 3, 'رقم الايبان', format2)
sheet.write(row, 4, 'اسم المستفيد', format2)
@ -139,16 +139,16 @@ class PayrollBankAlbiladReportXlsx(models.AbstractModel):
row += 1
# Write AlBilad format data
sheet.write(row, 2, data_list[4], format1) # Total Amount
sheet.write(row, 3, data_list[2], format1) # Beneficiary Account IBAN
sheet.write(row, 4, data_list[1], format1) # Beneficiary Name
sheet.write(row, 5, data_list[3], format1) # Beneficiary Bank CODE
sheet.write(row, 6, '', format1) # Payment Description (empty)
sheet.write(row, 7, data_list[6], format1) # Basic Salary
sheet.write(row, 8, data_list[7], format1) # Housing Allowance
sheet.write(row, 9, data_list[8], format1) # Other Earnings
sheet.write(row, 10, data_list[9], format1) # Deductions
sheet.write(row, 11, data_list[5], format1) # Beneficiary National/IqamaID
sheet.write(row, 2, data_list[4], format1)
sheet.write(row, 3, data_list[2], format1)
sheet.write(row, 4, data_list[1], format1)
sheet.write(row, 5, data_list[3], format1)
sheet.write(row, 6, '', format1)
sheet.write(row, 7, data_list[6], format1)
sheet.write(row, 8, data_list[7], format1)
sheet.write(row, 9, data_list[8], format1)
sheet.write(row, 10, data_list[9], format1)
sheet.write(row, 11, data_list[5], format1)
elif report_type == 'allowance':
row = self._write_allowance_data(sheet, row, date_from, date_to, entry_type, employees, salary, salary_ids, bank, branch, company_id, format1)
@ -226,20 +226,18 @@ class PayrollBankAlbiladReportXlsx(models.AbstractModel):
]
row += 1
# Write AlBilad format data
sheet.write(row, 2, data_list[4], format1) # Total Amount
sheet.write(row, 3, data_list[2], format1) # Beneficiary Account IBAN
sheet.write(row, 4, data_list[1], format1) # Beneficiary Name
sheet.write(row, 5, data_list[3], format1) # Beneficiary Bank CODE
sheet.write(row, 6, '', format1) # Payment Description (empty)
sheet.write(row, 7, data_list[6], format1) # Basic Salary
sheet.write(row, 8, data_list[7], format1) # Housing Allowance
sheet.write(row, 9, data_list[8], format1) # Other Earnings
sheet.write(row, 10, data_list[9], format1) # Deductions
sheet.write(row, 11, data_list[5], format1) # Beneficiary National/IqamaID
sheet.write(row, 2, data_list[4], format1)
sheet.write(row, 3, data_list[2], format1)
sheet.write(row, 4, data_list[1], format1)
sheet.write(row, 5, data_list[3], format1)
sheet.write(row, 6, '', format1)
sheet.write(row, 7, data_list[6], format1)
sheet.write(row, 8, data_list[7], format1)
sheet.write(row, 9, data_list[8], format1)
sheet.write(row, 10, data_list[9], format1)
sheet.write(row, 11, data_list[5], format1)
def _get_payslips(self, date_from, date_to, entry_type, employees, salary, salary_ids, bank):
"""Helper method to get payslips based on criteria"""
domain_base = [
('date_from', '>=', date_from),
('date_to', '<=', date_to),
@ -289,12 +287,10 @@ class PayrollBankAlbiladReportXlsx(models.AbstractModel):
return self.sudo().env['hr.payslip'].search(domain)
def _write_allowance_data(self, sheet, row, date_from, date_to, entry_type, employees, salary, salary_ids, bank, branch, company_id, format1):
"""Write allowance data"""
payslip_ids = self._get_payslips(date_from, date_to, entry_type, employees, salary, salary_ids, bank)
if payslip_ids:
for payslip in payslip_ids:
# For allowances, show total allowances in the basic salary column
data_list = [
payslip.employee_id.emp_no,
payslip.employee_id.name or ' ',
@ -306,26 +302,24 @@ class PayrollBankAlbiladReportXlsx(models.AbstractModel):
]
row += 1
sheet.write(row, 2, data_list[4], format1) # Total Amount
sheet.write(row, 3, data_list[2], format1) # Beneficiary Account IBAN
sheet.write(row, 4, data_list[1], format1) # Beneficiary Name
sheet.write(row, 5, data_list[3], format1) # Beneficiary Bank CODE
sheet.write(row, 6, '', format1) # Payment Description (empty)
sheet.write(row, 7, data_list[6], format1) # Total Allowances
sheet.write(row, 8, data_list[7], format1) # Housing (0)
sheet.write(row, 9, data_list[8], format1) # Other (0)
sheet.write(row, 10, data_list[9], format1) # Deductions
sheet.write(row, 11, data_list[5], format1) # Beneficiary National/IqamaID
sheet.write(row, 2, data_list[4], format1)
sheet.write(row, 3, data_list[2], format1)
sheet.write(row, 4, data_list[1], format1)
sheet.write(row, 5, data_list[3], format1)
sheet.write(row, 6, '', format1)
sheet.write(row, 7, data_list[6], format1)
sheet.write(row, 8, data_list[7], format1)
sheet.write(row, 9, data_list[8], format1)
sheet.write(row, 10, data_list[9], format1)
sheet.write(row, 11, data_list[5], format1)
return row
def _write_overtime_data(self, sheet, row, date_from, date_to, entry_type, employees, salary, salary_ids, bank, branch, company_id, format1):
"""Write overtime data"""
payslip_ids = self._get_payslips(date_from, date_to, entry_type, employees, salary, salary_ids, bank)
if payslip_ids:
for payslip in payslip_ids:
# For overtime, show in "Other Earnings" column
data_list = [
payslip.employee_id.emp_no,
payslip.employee_id.name or ' ',
@ -337,16 +331,16 @@ class PayrollBankAlbiladReportXlsx(models.AbstractModel):
]
row += 1
sheet.write(row, 2, data_list[4], format1) # Total Amount
sheet.write(row, 3, data_list[2], format1) # Beneficiary Account IBAN
sheet.write(row, 4, data_list[1], format1) # Beneficiary Name
sheet.write(row, 5, data_list[3], format1) # Beneficiary Bank CODE
sheet.write(row, 6, '', format1) # Payment Description (empty)
sheet.write(row, 7, data_list[6], format1) # Basic (0)
sheet.write(row, 8, data_list[7], format1) # Housing (0)
sheet.write(row, 9, data_list[8], format1) # Overtime in Other Earnings
sheet.write(row, 10, data_list[9], format1) # Deductions
sheet.write(row, 11, data_list[5], format1) # Beneficiary National/IqamaID
sheet.write(row, 2, data_list[4], format1)
sheet.write(row, 3, data_list[2], format1)
sheet.write(row, 4, data_list[1], format1)
sheet.write(row, 5, data_list[3], format1)
sheet.write(row, 6, '', format1)
sheet.write(row, 7, data_list[6], format1)
sheet.write(row, 8, data_list[7], format1)
sheet.write(row, 9, data_list[8], format1)
sheet.write(row, 10, data_list[9], format1)
sheet.write(row, 11, data_list[5], format1)
return row
@ -368,26 +362,24 @@ class PayrollBankAlbiladReportXlsx(models.AbstractModel):
]
row += 1
sheet.write(row, 2, data_list[4], format1) # Total Amount
sheet.write(row, 3, data_list[2], format1) # Beneficiary Account IBAN
sheet.write(row, 4, data_list[1], format1) # Beneficiary Name
sheet.write(row, 5, data_list[3], format1) # Beneficiary Bank CODE
sheet.write(row, 6, '', format1) # Payment Description (empty)
sheet.write(row, 7, data_list[6], format1) # Basic (0)
sheet.write(row, 8, data_list[7], format1) # Housing (0)
sheet.write(row, 9, data_list[8], format1) # Mission allowance in Other Earnings
sheet.write(row, 10, data_list[9], format1) # Deductions
sheet.write(row, 11, data_list[5], format1) # Beneficiary National/IqamaID
sheet.write(row, 2, data_list[4], format1)
sheet.write(row, 3, data_list[2], format1)
sheet.write(row, 4, data_list[1], format1)
sheet.write(row, 5, data_list[3], format1)
sheet.write(row, 6, '', format1)
sheet.write(row, 7, data_list[6], format1)
sheet.write(row, 8, data_list[7], format1)
sheet.write(row, 9, data_list[8], format1)
sheet.write(row, 10, data_list[9], format1)
sheet.write(row, 11, data_list[5], format1)
return row
def _write_training_data(self, sheet, row, date_from, date_to, entry_type, employees, salary, salary_ids, bank, branch, company_id, format1):
"""Write training data"""
payslip_ids = self._get_payslips(date_from, date_to, entry_type, employees, salary, salary_ids, bank)
if payslip_ids:
for payslip in payslip_ids:
# For training, show in "Other Earnings" column
data_list = [
payslip.employee_id.emp_no,
payslip.employee_id.name or ' ',
@ -399,28 +391,26 @@ class PayrollBankAlbiladReportXlsx(models.AbstractModel):
]
row += 1
sheet.write(row, 2, data_list[4], format1) # Total Amount
sheet.write(row, 3, data_list[2], format1) # Beneficiary Account IBAN
sheet.write(row, 4, data_list[1], format1) # Beneficiary Name
sheet.write(row, 5, data_list[3], format1) # Beneficiary Bank CODE
sheet.write(row, 6, '', format1) # Payment Description (empty)
sheet.write(row, 7, data_list[6], format1) # Basic (0)
sheet.write(row, 8, data_list[7], format1) # Housing (0)
sheet.write(row, 9, data_list[8], format1) # Training allowance in Other Earnings
sheet.write(row, 10, data_list[9], format1) # Deductions
sheet.write(row, 11, data_list[5], format1) # Beneficiary National/IqamaID
sheet.write(row, 2, data_list[4], format1)
sheet.write(row, 3, data_list[2], format1)
sheet.write(row, 4, data_list[1], format1)
sheet.write(row, 5, data_list[3], format1)
sheet.write(row, 6, '', format1)
sheet.write(row, 7, data_list[6], format1)
sheet.write(row, 8, data_list[7], format1)
sheet.write(row, 9, data_list[8], format1)
sheet.write(row, 10, data_list[9], format1)
sheet.write(row, 11, data_list[5], format1)
return row
class HrPayslipExtended(models.Model):
"""Extend hr.payslip to support confirmed state filtering"""
_inherit = 'hr.payslip'
@api.model
def search(self, args, offset=0, limit=None, order=None, count=False):
"""Override search to use confirmed state when context flag is set"""
# Check if we should use confirmed state for XLSX reports
if self.env.context.get('use_payslip_run_confirmed_state'):
modified_args = []
for item in args:
@ -439,24 +429,19 @@ class HrPayslipExtended(models.Model):
class PayrollXlsxExtended(models.AbstractModel):
"""Inherit parent XLSX report to use confirmed state for all bank types"""
_inherit = 'report.exp_payroll_custom.report_payroll_bank_xlsx'
@api.model
def generate_xlsx_report(self, workbook, data, payslips):
"""Override to use confirmed state in XLSX reports only"""
# Call parent with context flag to use confirmed state
return super(PayrollXlsxExtended, self.with_context(use_payslip_run_confirmed_state=True)).generate_xlsx_report(workbook, data, payslips)
class PayrollBankAlbiladReportPdf(models.AbstractModel):
"""Al-Bilad Bank Payroll Report PDF"""
_name = "report.exp_payroll_albilad.albilad_bank_pdf"
_description = 'Al-Bilad Bank Payroll Report PDF'
@api.model
def _get_report_values(self, docids, data=None):
"""Prepare data for PDF report"""
if not data:
return {}
@ -490,7 +475,6 @@ class PayrollBankAlbiladReportPdf(models.AbstractModel):
payslip_data = []
# Process payslips based on no_details flag
if no_details:
# Group by bank
for bank in banks:
@ -519,7 +503,6 @@ class PayrollBankAlbiladReportPdf(models.AbstractModel):
payslip_data = all_payslips
# Convert dates to strings for display
date_from_str = str(date_from) if date_from else ''
date_to_str = str(date_to) if date_to else ''
@ -550,7 +533,6 @@ class PayrollBankAlbiladReportPdf(models.AbstractModel):
except:
national_id = ''
# Get common fields safely
iban = ' '
bank_code = ' '
if payslip.employee_id.bank_account_id:
@ -559,7 +541,6 @@ class PayrollBankAlbiladReportPdf(models.AbstractModel):
bank_code = payslip.employee_id.bank_account_id.bank_id.bic or ' '
if report_type == 'salary':
# For salary, calculate basic, housing, and other
salary_rules = self.env['hr.salary.rule'].search([]).sorted(key=lambda v: v.sequence).ids
payslip_line_obj = self.env['hr.payslip.line']

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Al-Bilad Bank XLSX Report -->
<record id="report_payroll_bank_albilad_xlsx" model="ir.actions.report">
<field name="name">Al-Bilad Bank Payroll Report</field>
<field name="model">payroll.bank.wiz</field>

View File

@ -13,7 +13,6 @@ class BankPayslipReportAlbilad(models.TransientModel):
)
def print_report(self):
"""Override print_report to use Al-Bilad report when albilad bank is selected"""
if self.bank_type == 'albilad':
# Validate that banks are selected
if not self.bank_ids:
@ -47,13 +46,10 @@ class BankPayslipReportAlbilad(models.TransientModel):
return self.env.ref('exp_payroll_albilad.report_payroll_bank_albilad_xlsx').report_action(self, data=datas)
else:
# Call parent method for other bank types
return super(BankPayslipReportAlbilad, self).print_report()
def print_pdf_report(self):
"""Print Al-Bilad PDF report when albilad bank is selected"""
if self.bank_type == 'albilad':
# Validate that banks are selected
if not self.bank_ids:
raise UserError(_('Please select at least one bank to generate the report.'))
@ -89,7 +85,6 @@ class BankPayslipReportAlbilad(models.TransientModel):
if hasattr(super(BankPayslipReportAlbilad, self), 'print_pdf_report'):
return super(BankPayslipReportAlbilad, self).print_pdf_report()
else:
# If parent doesn't have print_pdf_report, return a message
return {
'type': 'ir.actions.client',
'tag': 'display_notification',

View File

@ -1,12 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Extend the bank payroll report wizard view for Al-Bilad Bank -->
<record id="bank_payroll_report_form_albilad" model="ir.ui.view">
<field name="name">payroll.bank.wiz.form.albilad</field>
<field name="model">payroll.bank.wiz</field>
<field name="inherit_id" ref="exp_payroll_custom.bank_payroll_report_form"/>
<field name="arch" type="xml">
<!-- Make bank_ids field always visible and required when albilad bank type is selected -->
<field name="bank_ids" position="attributes">
<attribute name="attrs">{'required':[('bank_type','=','albilad')]}</attribute>
</field>