Create new type of payroll bank type
This commit is contained in:
parent
f393f1614c
commit
06697fdcb0
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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']
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue