Merge pull request #6195 from expsa/14.0-fix-odex_benefit-auto-20260113_170517
[FIX] odex_benefit: fix issues and bugs
This commit is contained in:
commit
7471027d5e
|
|
@ -3,6 +3,9 @@
|
|||
from odoo import api, fields, models, tools, _
|
||||
from odoo.exceptions import ValidationError, UserError
|
||||
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
|
||||
import logging
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class FamilyBankReportXlsx(models.AbstractModel):
|
||||
|
|
@ -12,75 +15,97 @@ class FamilyBankReportXlsx(models.AbstractModel):
|
|||
|
||||
@api.model
|
||||
def generate_xlsx_report(self, workbook, data, objs):
|
||||
sheet = workbook.add_worksheet(_('Family Bank Report'))
|
||||
try:
|
||||
lines = data.get('lines', [])
|
||||
_logger.info("=== FAMILY BANK REPORT START ===")
|
||||
_logger.info("Total lines to process: %s", len(lines))
|
||||
|
||||
sheet = workbook.add_worksheet(_('Family Bank Report'))
|
||||
|
||||
header_format = workbook.add_format({
|
||||
'bold': True,
|
||||
'align': 'center',
|
||||
'valign': 'vcenter',
|
||||
'bg_color': '#4472C4',
|
||||
'font_color': 'white',
|
||||
'border': 1,
|
||||
'text_wrap': True
|
||||
})
|
||||
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
|
||||
})
|
||||
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
|
||||
})
|
||||
normal = workbook.add_format({
|
||||
'align': 'center',
|
||||
'valign': 'vcenter',
|
||||
'border': 1
|
||||
})
|
||||
|
||||
bold = workbook.add_format({
|
||||
'bold': True,
|
||||
'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.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)
|
||||
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
|
||||
row = 3
|
||||
total_amount = 0
|
||||
for idx, line in enumerate(lines):
|
||||
try:
|
||||
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
|
||||
except Exception as line_error:
|
||||
_logger.error("ERROR processing line %s: %s", idx, line_error)
|
||||
_logger.error("Line data: %s", line)
|
||||
raise
|
||||
|
||||
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)
|
||||
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)
|
||||
|
||||
_logger.info("=== FAMILY BANK REPORT SUCCESS: %s rows, total amount: %s ===", len(lines), total_amount)
|
||||
|
||||
except Exception as e:
|
||||
_logger.error("=== FAMILY BANK REPORT FAILED ===")
|
||||
_logger.error("Error type: %s", type(e).__name__)
|
||||
_logger.error("Error message: %s", str(e))
|
||||
_logger.error("Data keys: %s", data.keys() if data else 'No data')
|
||||
_logger.error("Lines count: %s", len(data.get('lines', [])) if data else 0)
|
||||
import traceback
|
||||
_logger.error("Full traceback:\n%s", traceback.format_exc())
|
||||
raise
|
||||
|
|
|
|||
|
|
@ -3,6 +3,9 @@
|
|||
from odoo import models, fields, api, _
|
||||
from odoo.exceptions import UserError
|
||||
from odoo.tools import date_utils
|
||||
import logging
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class FamilyBankReportWizard(models.TransientModel):
|
||||
|
|
@ -32,40 +35,72 @@ class FamilyBankReportWizard(models.TransientModel):
|
|||
record.total_amount = sum(record.payment_order_ids.mapped('total_amount'))
|
||||
|
||||
def action_print_bank_report(self):
|
||||
if not self.payment_order_ids:
|
||||
raise UserError(_("Please select at least one Payment Order."))
|
||||
try:
|
||||
_logger.info("=== WIZARD: action_print_bank_report START ===")
|
||||
_logger.info("Payment orders selected: %s", len(self.payment_order_ids))
|
||||
_logger.info("Payment order IDs: %s", self.payment_order_ids.ids)
|
||||
|
||||
if not self.payment_order_ids:
|
||||
raise UserError(_("Please select at least one Payment Order."))
|
||||
|
||||
moves = self.payment_order_ids.mapped('move_id')
|
||||
if not moves:
|
||||
raise UserError(_("Selected Payment Orders do not reference any posted moves."))
|
||||
moves = self.payment_order_ids.mapped('move_id')
|
||||
_logger.info("Moves found: %s", len(moves))
|
||||
|
||||
if not moves:
|
||||
raise UserError(_("Selected Payment Orders do not reference any posted moves."))
|
||||
|
||||
grouped = {}
|
||||
for move in moves:
|
||||
for line in move.line_ids.filtered(lambda l: l.debit > 0 and l.benefit_family_id):
|
||||
family = line.benefit_family_id
|
||||
key = family.id
|
||||
if key not in grouped:
|
||||
beneficiary_name = family.acc_holder_name or ''
|
||||
beneficiary_id = family.acc_holder_id_number or ''
|
||||
grouped[key] = {
|
||||
'bank_name': (family.bank_id.bic or ''),
|
||||
'account_number': 'SA' + (family.acc_number or ''),
|
||||
'beneficiary_name': beneficiary_name,
|
||||
'beneficiary_id': beneficiary_id,
|
||||
'transfer_amount': 0.0,
|
||||
'currency': 'SAR',
|
||||
'family_code': family.code or '',
|
||||
'purpose': 'Others',
|
||||
}
|
||||
grouped[key]['transfer_amount'] += float(line.debit or 0.0)
|
||||
grouped = {}
|
||||
total_lines_processed = 0
|
||||
for move in moves:
|
||||
for line in move.line_ids.filtered(lambda l: l.debit > 0 and l.benefit_family_id):
|
||||
total_lines_processed += 1
|
||||
family = line.benefit_family_id
|
||||
key = family.id
|
||||
if key not in grouped:
|
||||
beneficiary_name = family.acc_holder_name or ''
|
||||
beneficiary_id = family.acc_holder_id_number or ''
|
||||
grouped[key] = {
|
||||
'bank_name': (family.bank_id.bic or ''),
|
||||
'account_number': 'SA' + (family.acc_number or ''),
|
||||
'beneficiary_name': beneficiary_name,
|
||||
'beneficiary_id': beneficiary_id,
|
||||
'transfer_amount': 0.0,
|
||||
'currency': 'SAR',
|
||||
'family_code': family.code or '',
|
||||
'purpose': 'Others',
|
||||
}
|
||||
grouped[key]['transfer_amount'] += float(line.debit or 0.0)
|
||||
|
||||
lines_data = list(grouped.values())
|
||||
if not lines_data:
|
||||
raise UserError(_("No debit lines with family information found."))
|
||||
lines_data = list(grouped.values())
|
||||
_logger.info("Total move lines processed: %s", total_lines_processed)
|
||||
_logger.info("Unique families (lines_data): %s", len(lines_data))
|
||||
|
||||
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)
|
||||
datas = {
|
||||
'start_date': self.start_date,
|
||||
'end_date': self.end_date,
|
||||
'lines': lines_data,
|
||||
}
|
||||
|
||||
# Log data size for debugging
|
||||
import json
|
||||
try:
|
||||
data_json = json.dumps(datas, default=str)
|
||||
_logger.info("Data size (bytes): %s", len(data_json))
|
||||
except Exception as json_err:
|
||||
_logger.warning("Could not serialize data for size check: %s", json_err)
|
||||
|
||||
_logger.info("=== WIZARD: Calling report_action ===")
|
||||
result = self.env.ref('odex_benefit.action_family_bank_report_xlsx').report_action(self, data=datas)
|
||||
_logger.info("=== WIZARD: report_action returned successfully ===")
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
_logger.error("=== WIZARD: action_print_bank_report FAILED ===")
|
||||
_logger.error("Error type: %s", type(e).__name__)
|
||||
_logger.error("Error message: %s", str(e))
|
||||
import traceback
|
||||
_logger.error("Full traceback:\n%s", traceback.format_exc())
|
||||
raise
|
||||
|
|
|
|||
Loading…
Reference in New Issue