From eeed8e93966acdc43b5741b4a556567c77dd9d8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Mon, 16 Mar 2026 16:12:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=AC=E6=9C=88=E5=BA=94=E6=94=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/ks_dashboard_ninja_items.py | 2 +- .../wizard/soong_workflow_comment_wizard.py | 5 +- .../views/inherit_hr_job_views.xml | 2 +- yuthon_report/__manifest__.py | 1 + yuthon_report/models/__init__.py | 1 + .../models/current_month_received_report.py | 6 ++- .../current_receivable_property_fee_report.py | 6 ++- .../models/deposit_cum_arrears_report.py | 6 ++- .../models/deposit_month_receivable_report.py | 6 ++- .../models/deposit_month_received_report.py | 6 ++- .../models/deposit_month_refund_report.py | 6 ++- .../models/deposit_pre_received_report.py | 6 ++- yuthon_report/models/deposit_total_report.py | 6 ++- .../models/month_receivable_report.py | 54 +++++++++++++++++++ .../models/monthly_precollection_report.py | 6 ++- .../parking_fee_current_month_receivable.py | 6 ++- .../parking_fee_current_month_report.py | 6 ++- .../models/parking_fee_yearly_report.py | 6 ++- .../models/penalty_arrears_report.py | 6 ++- .../models/penalty_month_received_report.py | 6 ++- .../models/penalty_year_cum_report.py | 6 ++- yuthon_report/models/pre_advance_report.py | 6 ++- yuthon_report/models/pre_arrears_report.py | 6 ++- yuthon_report/models/receivable_report.py | 6 ++- .../models/receivables_message_report.py | 6 ++- .../models/yuthon_contract_report.py | 6 ++- yuthon_report/views/menu.xml | 2 +- .../views/month_receivable_report.xml | 27 ++++++++++ 28 files changed, 189 insertions(+), 25 deletions(-) create mode 100644 yuthon_report/models/month_receivable_report.py create mode 100644 yuthon_report/views/month_receivable_report.xml diff --git a/ks_dashboard_ninja/models/ks_dashboard_ninja_items.py b/ks_dashboard_ninja/models/ks_dashboard_ninja_items.py index 32d9d7321..0dd2cc03a 100644 --- a/ks_dashboard_ninja/models/ks_dashboard_ninja_items.py +++ b/ks_dashboard_ninja/models/ks_dashboard_ninja_items.py @@ -100,7 +100,7 @@ def ks_read(self, records): sql = comodel._order_to_sql(None, wquery) order_by_clause = comodel.env.cr.mogrify(sql).decode() order_by = order_by_clause and (' ORDER BY %s ' % order_by_clause) or '' - # order_by = '' # 临时修复:跳过排序 + order_by = '' # 临时修复:跳过排序 from_c, where_c, where_params = wquery.get_sql() query = """ SELECT {rel}.{id1}, {rel}.{id2} FROM {rel}, {from_c} WHERE {where_c} AND {rel}.{id1} IN %s AND {rel}.{id2} = {tbl}.id diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard.py b/soong_workflow/wizard/soong_workflow_comment_wizard.py index bdf4cacbd..a67f45169 100644 --- a/soong_workflow/wizard/soong_workflow_comment_wizard.py +++ b/soong_workflow/wizard/soong_workflow_comment_wizard.py @@ -414,9 +414,10 @@ class SoongWorkflowCommentWizard(models.TransientModel): today = datetime.now(pytz.utc).astimezone(tz).strftime('%Y-%m-%d') user_name = self.env.user.name code = self.code or '' - new_line = f"{today}\n{code}\n{user_name}" + note_name = self.comment_note_id.name or '' + new_line = f"{today} {code} {user_name} {note_name}" old_info = self.comment_note_id.use_info or '' - updated_info = (old_info + '\n\n' + new_line) if old_info else new_line + updated_info = (old_info + '\n' + new_line) if old_info else new_line self.comment_note_id.sudo().write({'use_info': updated_info}) cx = self.env.context.copy() or {} record_id = self.env[self.res_model].search([('id', '=', self.res_id)]) diff --git a/yuthon_hr_employee/views/inherit_hr_job_views.xml b/yuthon_hr_employee/views/inherit_hr_job_views.xml index 845d9b0d1..312856978 100644 --- a/yuthon_hr_employee/views/inherit_hr_job_views.xml +++ b/yuthon_hr_employee/views/inherit_hr_job_views.xml @@ -82,7 +82,7 @@ 1 - + diff --git a/yuthon_report/__manifest__.py b/yuthon_report/__manifest__.py index 3d27d1117..0add3096f 100644 --- a/yuthon_report/__manifest__.py +++ b/yuthon_report/__manifest__.py @@ -10,6 +10,7 @@ 'data': [ 'views/pre_arrears_report.xml', 'views/pre_advance_report.xml', + 'views/month_receivable_report.xml', 'views/penalty_arrears_report.xml', 'views/penalty_month_received_report.xml', 'views/penalty_year_cum_report.xml', diff --git a/yuthon_report/models/__init__.py b/yuthon_report/models/__init__.py index 682eed789..a5840c504 100644 --- a/yuthon_report/models/__init__.py +++ b/yuthon_report/models/__init__.py @@ -16,6 +16,7 @@ from . import att_report from . import staff_position_report from . import pre_arrears_report from . import pre_advance_report +from . import month_receivable_report from . import penalty_arrears_report from . import penalty_month_received_report from . import penalty_year_cum_report diff --git a/yuthon_report/models/current_month_received_report.py b/yuthon_report/models/current_month_received_report.py index 9e9935723..34eef1b36 100644 --- a/yuthon_report/models/current_month_received_report.py +++ b/yuthon_report/models/current_month_received_report.py @@ -74,7 +74,11 @@ class CurrentMonthReceivedReport(models.Model): 'id': rec.contract_id.id, 'display_name': rec.contract_id.contract_code, } if rec.contract_id else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/current_receivable_property_fee_report.py b/yuthon_report/models/current_receivable_property_fee_report.py index adebda322..d15d72d5d 100644 --- a/yuthon_report/models/current_receivable_property_fee_report.py +++ b/yuthon_report/models/current_receivable_property_fee_report.py @@ -106,7 +106,11 @@ class CurrentReceivablePropertyFeeReport(models.Model): "金额(含税)": round(amt, 2), "税率": f"{tax_rate:.1f}%" if tax_rate else "0.0%", "金额(不含税)": round(amt_nt, 2), - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "产权证": rec.title_deed or "", "合同编号": { 'model': 'property.lease.contract', diff --git a/yuthon_report/models/deposit_cum_arrears_report.py b/yuthon_report/models/deposit_cum_arrears_report.py index f8f4d11ff..21e74c272 100644 --- a/yuthon_report/models/deposit_cum_arrears_report.py +++ b/yuthon_report/models/deposit_cum_arrears_report.py @@ -63,7 +63,11 @@ class DepositCumArrearsReport(models.Model): 'id': rec.contract_id.id, 'display_name': rec.contract_id.contract_code, } if rec.contract_id else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/deposit_month_receivable_report.py b/yuthon_report/models/deposit_month_receivable_report.py index 01db26f35..bbc6973d1 100644 --- a/yuthon_report/models/deposit_month_receivable_report.py +++ b/yuthon_report/models/deposit_month_receivable_report.py @@ -63,7 +63,11 @@ class DepositMonthReceivableReport(models.Model): 'id': rec.contract_id.id, 'display_name': rec.contract_id.contract_code, } if rec.contract_id else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/deposit_month_received_report.py b/yuthon_report/models/deposit_month_received_report.py index 5c023e3ed..c48f6d9c2 100644 --- a/yuthon_report/models/deposit_month_received_report.py +++ b/yuthon_report/models/deposit_month_received_report.py @@ -70,7 +70,11 @@ class DepositMonthReceivedReport(models.Model): 'id': rec.contract_id.id, 'display_name': rec.contract_id.contract_code, } if rec.contract_id else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/deposit_month_refund_report.py b/yuthon_report/models/deposit_month_refund_report.py index 6263ffe89..569f7fc68 100644 --- a/yuthon_report/models/deposit_month_refund_report.py +++ b/yuthon_report/models/deposit_month_refund_report.py @@ -71,7 +71,11 @@ class DepositMonthRefundReport(models.Model): 'id': rec.contract_id.id, 'display_name': rec.contract_id.contract_code, } if rec.contract_id else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/deposit_pre_received_report.py b/yuthon_report/models/deposit_pre_received_report.py index ed0807eb1..9a1070f28 100644 --- a/yuthon_report/models/deposit_pre_received_report.py +++ b/yuthon_report/models/deposit_pre_received_report.py @@ -63,7 +63,11 @@ class DepositPreReceivedReport(models.Model): 'id': rec.contract_id.id, 'display_name': rec.contract_id.contract_code, } if rec.contract_id else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/deposit_total_report.py b/yuthon_report/models/deposit_total_report.py index a89fa3a9a..8b210a8a7 100644 --- a/yuthon_report/models/deposit_total_report.py +++ b/yuthon_report/models/deposit_total_report.py @@ -70,7 +70,11 @@ class DepositTotalReport(models.Model): 'id': rec.contract_id.id, 'display_name': rec.contract_id.contract_code, } if rec.contract_id else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/month_receivable_report.py b/yuthon_report/models/month_receivable_report.py new file mode 100644 index 000000000..cdbd524a6 --- /dev/null +++ b/yuthon_report/models/month_receivable_report.py @@ -0,0 +1,54 @@ +import datetime +import calendar + +from odoo import api, models + + +class MonthReceivableReport(models.Model): + _inherit = 'property.accounts.receivable' + + @api.model + def get_month_receivable_report(self, params): + """本月应收:取 due_date <= 查询月底 且 submitted > 0 的记录""" + domain = [('is_invalid', '=', False), ('submitted', '>', 0)] + + # 单月日期选择器传 date_start + if params.get('date_start'): + query_date = datetime.datetime.fromisoformat(params['date_start']).date() + last_day = calendar.monthrange(query_date.year, query_date.month)[1] + month_end = query_date.replace(day=last_day) + domain.append(('due_date', '<=', month_end)) + + if params.get('keyword'): + keyword = params['keyword'] + domain += ['|', '|', + ('lessee_id.name', 'ilike', keyword), + ('property_name', 'ilike', keyword), + ('contract_id.contract_code', 'ilike', keyword)] + + receivables = self.search(domain, order='contract_id asc, due_date asc') + + rows = [] + total_amount = 0.0 + for idx, rec in enumerate(receivables, start=1): + amount = round(rec.submitted or 0.0, 2) + total_amount += amount + rows.append({ + '序号': idx, + '合同编号': { + 'model': 'property.lease.contract', + 'id': rec.contract_id.id, + 'display_name': rec.contract_id.contract_code, + } if rec.contract_id else '', + '物业名称': { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or '', + '承租方名称': rec.lessee_id.name if rec.lessee_id else '', + '金额': amount, + '管理员': rec.admin_id.name if rec.admin_id else '', + }) + + stats = [{'name': '合计', 'amount': round(total_amount, 2)}] + return {'rows': rows, 'stats': stats} diff --git a/yuthon_report/models/monthly_precollection_report.py b/yuthon_report/models/monthly_precollection_report.py index f52ee97de..1f78e0334 100644 --- a/yuthon_report/models/monthly_precollection_report.py +++ b/yuthon_report/models/monthly_precollection_report.py @@ -57,7 +57,11 @@ class MonthlyPrecollectionReport(models.Model): 'id': rec.contract_id.id, 'display_name': rec.contract_id.contract_code, } if rec.contract_id else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/parking_fee_current_month_receivable.py b/yuthon_report/models/parking_fee_current_month_receivable.py index a469a773f..2dd1b2768 100644 --- a/yuthon_report/models/parking_fee_current_month_receivable.py +++ b/yuthon_report/models/parking_fee_current_month_receivable.py @@ -81,7 +81,11 @@ class ParkingFeeCurrentMonthReceivable(models.Model): 'id': rec.contract_id.id, 'display_name': rec.contract_id.contract_code, } if rec.contract_id else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/parking_fee_current_month_report.py b/yuthon_report/models/parking_fee_current_month_report.py index 74d43b4a2..1751bbbe2 100644 --- a/yuthon_report/models/parking_fee_current_month_report.py +++ b/yuthon_report/models/parking_fee_current_month_report.py @@ -87,7 +87,11 @@ class ParkingFeeCurrentMonthReport(models.Model): 'id': rec.contract_id.id, 'display_name': rec.contract_id.contract_code, } if rec.contract_id else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/parking_fee_yearly_report.py b/yuthon_report/models/parking_fee_yearly_report.py index 46fd3fee6..72bb1eb48 100644 --- a/yuthon_report/models/parking_fee_yearly_report.py +++ b/yuthon_report/models/parking_fee_yearly_report.py @@ -92,7 +92,11 @@ class ParkingFeeYearlyReport(models.Model): 'id': rec.contract_id.id, 'display_name': rec.contract_id.contract_code, } if rec.contract_id else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/penalty_arrears_report.py b/yuthon_report/models/penalty_arrears_report.py index 7eb78e2ee..069f0e981 100644 --- a/yuthon_report/models/penalty_arrears_report.py +++ b/yuthon_report/models/penalty_arrears_report.py @@ -88,7 +88,11 @@ class PenaltyArrearsReport(models.Model): 'id': rec.contract_id.id, 'display_name': rec.contract_id.contract_code, } if rec.contract_id else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/penalty_month_received_report.py b/yuthon_report/models/penalty_month_received_report.py index fc824f2b9..5a98ed562 100644 --- a/yuthon_report/models/penalty_month_received_report.py +++ b/yuthon_report/models/penalty_month_received_report.py @@ -93,7 +93,11 @@ class PenaltyMonthReceivedReport(models.Model): 'id': rec.contract_id.id, 'display_name': rec.contract_id.contract_code, } if rec.contract_id else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/penalty_year_cum_report.py b/yuthon_report/models/penalty_year_cum_report.py index 4e2b49a8d..a61c8d411 100644 --- a/yuthon_report/models/penalty_year_cum_report.py +++ b/yuthon_report/models/penalty_year_cum_report.py @@ -86,7 +86,11 @@ class PenaltyYearCumReport(models.Model): 'id': contract.id, 'display_name': contract.contract_code, } if contract else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/pre_advance_report.py b/yuthon_report/models/pre_advance_report.py index 291ec7ee2..c908fe6ea 100644 --- a/yuthon_report/models/pre_advance_report.py +++ b/yuthon_report/models/pre_advance_report.py @@ -70,7 +70,11 @@ class PreAdvanceReport(models.Model): 'id': contract.id, 'display_name': contract.contract_code, } if contract else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/pre_arrears_report.py b/yuthon_report/models/pre_arrears_report.py index f91a6cd0f..b5a962f8f 100644 --- a/yuthon_report/models/pre_arrears_report.py +++ b/yuthon_report/models/pre_arrears_report.py @@ -65,7 +65,11 @@ class PreArrearsReport(models.Model): 'id': contract.id, 'display_name': contract.contract_code, } if contract else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方名称": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/models/receivable_report.py b/yuthon_report/models/receivable_report.py index b163a0b13..c5dc6dd01 100644 --- a/yuthon_report/models/receivable_report.py +++ b/yuthon_report/models/receivable_report.py @@ -119,7 +119,11 @@ class YuthonProperty(models.Model): 'id': info_rec.lessee_id.id, 'display_name': info_rec.lessee_id.name, } if info_rec.lessee_id else "", - "物业名称": info_rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': info_rec.contract_id.lease_ids[0].address_id.id, + 'display_name': info_rec.property_name, + } if info_rec.contract_id and info_rec.contract_id.lease_ids and info_rec.contract_id.lease_ids[0].address_id else info_rec.property_name or "", "产权证号": info_rec.title_deed or "", "发票类型": info_rec.lessee_id.invoicing_ids[0].invoicing_type_id.name if info_rec.lessee_id and info_rec.lessee_id.invoicing_ids else "", "税率": self._get_tax_rate_display(info_rec), diff --git a/yuthon_report/models/receivables_message_report.py b/yuthon_report/models/receivables_message_report.py index a944a3d2d..bd7fc51f2 100644 --- a/yuthon_report/models/receivables_message_report.py +++ b/yuthon_report/models/receivables_message_report.py @@ -32,7 +32,11 @@ class PropertyAccountsReceivable(models.Model): { "收款日期": rec.payout_date.strftime("%Y-%m-%d") if rec.payout_date else "", "合同编号": rec.contract_id.contract_code or "" if rec.contract_id else "", - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.contract_id.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.contract_id and rec.contract_id.lease_ids and rec.contract_id.lease_ids[0].address_id else rec.property_name or "", "承租方": rec.lessee_id.name or "" if rec.lessee_id else "", "收款类型": rec.management_type_id.name or "" if rec.management_type_id else "", "金额": rec.original_amount or 0.0, diff --git a/yuthon_report/models/yuthon_contract_report.py b/yuthon_report/models/yuthon_contract_report.py index 5379f284d..4bcff01e7 100644 --- a/yuthon_report/models/yuthon_contract_report.py +++ b/yuthon_report/models/yuthon_contract_report.py @@ -61,7 +61,11 @@ class YuthonContractReport(models.Model): actual_tenure = "未设置实际租期" report_data.append({ - "物业名称": rec.property_name or "", + "物业名称": { + 'model': 'yuthon.property', + 'id': rec.lease_ids[0].address_id.id, + 'display_name': rec.property_name, + } if rec.lease_ids and rec.lease_ids[0].address_id else rec.property_name or "", "承租方": { 'model': 'property.tenant.information', 'id': rec.lessee_id.id, diff --git a/yuthon_report/views/menu.xml b/yuthon_report/views/menu.xml index cc66d94e9..b4d3c14af 100644 --- a/yuthon_report/views/menu.xml +++ b/yuthon_report/views/menu.xml @@ -42,7 +42,7 @@ sequence="4" name="本月应收" parent="yuthon_property_income_menu" - action="action_report_placeholder"/> + action="action_month_receivable_report"/> + + + + 本月应收 + receivable_report_client + + { + "sideBar": true, + "report_config": { + "model": "property.accounts.receivable", + "method": "get_month_receivable_report", + "dateMode": "single", + "columns": [ + {"headerName": "序号", "field": "序号", "width": 45, "flex": 0, "pinned": "left"}, + {"headerName": "合同编号", "field": "合同编号", "flex": 1.2}, + {"headerName": "物业名称", "field": "物业名称", "flex": 2.5}, + {"headerName": "承租方名称", "field": "承租方名称", "flex": 1.6}, + {"headerName": "金额", "field": "金额", "flex": 1, "type": "number"}, + {"headerName": "管理员", "field": "管理员", "flex": 1} + ] + } + } + + + +