From 7b481af86f907efe6659a3250d882acd6812666c Mon Sep 17 00:00:00 2001 From: maltayyar2 Date: Tue, 13 Jan 2026 17:05:17 +0300 Subject: [PATCH] [FIX] odex_benefit: automatic update Auto-generated commit based on local changes. --- .../reports/family_bank_report.py | 153 ++++++++++-------- .../wizards/family_bank_report_wizard.py | 101 ++++++++---- 2 files changed, 157 insertions(+), 97 deletions(-) diff --git a/odex25_benefit/odex_benefit/reports/family_bank_report.py b/odex25_benefit/odex_benefit/reports/family_bank_report.py index 7f560a243..10b695009 100644 --- a/odex25_benefit/odex_benefit/reports/family_bank_report.py +++ b/odex25_benefit/odex_benefit/reports/family_bank_report.py @@ -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 diff --git a/odex25_benefit/odex_benefit/wizards/family_bank_report_wizard.py b/odex25_benefit/odex_benefit/wizards/family_bank_report_wizard.py index e3f826ac3..fd7309640 100644 --- a/odex25_benefit/odex_benefit/wizards/family_bank_report_wizard.py +++ b/odex25_benefit/odex_benefit/wizards/family_bank_report_wizard.py @@ -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