diff --git a/yuthon_hr_attendance/controllers/applet_attendance.py b/yuthon_hr_attendance/controllers/applet_attendance.py index c94f1b275..e757470e9 100644 --- a/yuthon_hr_attendance/controllers/applet_attendance.py +++ b/yuthon_hr_attendance/controllers/applet_attendance.py @@ -215,8 +215,8 @@ class AppletAttendance(Controller): "data": { "current_month": { // 当月考勤数据 "holiday_data": { // 假期数据 - "holiday_list": ["2025年1月1日", "2025年1月2日"], // 法定节假日,调休休息日列表(日期字符串) - "shift_days_list": ["2025年2月10日", "2025年2月11日"] // 调休补班日列表(日期字符串) + "holiday_list": ["2025-01-01", "2025-01-02"], // 法定节假日,调休休息日列表(日期字符串) + "shift_days_list": ["2025-02-10", "2025-02-11"] // 调休补班日列表(日期字符串) }, "banner_rote": { // 异常统计 "is_no_card": 2, // 缺卡次数 @@ -352,8 +352,8 @@ class AppletAttendance(Controller): check_out_color = 'red' if check_out_status in ['迟到', '早退', '缺卡'] else 'green' # 添加到记录列表 records.append({ - 'date': att.current_data.strftime('%Y-%m-%d'), - 'class': [f"{att.shift_name}", f"{standard_check_in_str}-{standard_check_out_str}"], + 'date': att.current_data.strftime('%Y/%m/%d'), + 'class': [f"{att.shift_name}",f"{standard_check_in_str}-{standard_check_out_str}"], 'user_id': user_id, 'check_in': check_in_str, 'check_out': check_out_str, @@ -407,7 +407,7 @@ class AppletAttendance(Controller): day = start_date_obj + timedelta(days=i) # 只添加年份和月份匹配的日期 if day.year == target_year and day.month == target_month: - formatted_date = f"{day.month}月{day.day}日" + formatted_date = f"{day.year}/{day.month}/{day.day}" holidays_list.append(formatted_date) # 处理调班补班 @@ -419,7 +419,7 @@ class AppletAttendance(Controller): day = int(day_str) # 只添加月份匹配的日期 if month == target_month: - formatted_date = f"{month}月{day}日" + formatted_date = f"{target_year}/{month}/{day}" shift_days_list.append(formatted_date) return { @@ -427,8 +427,7 @@ class AppletAttendance(Controller): "shift_days_list": shift_days_list, } - # 水电表接口 - + # 水电表接口 @route('/yuthon/meter/reading', methods=['POST'], type='http', auth='none', cors='*', csrf=False) def yuthon_meter_reading(self, **kw): """ diff --git a/yuthon_property/models/property_meter_archives.py b/yuthon_property/models/property_meter_archives.py index 022883c07..0739e77ea 100644 --- a/yuthon_property/models/property_meter_archives.py +++ b/yuthon_property/models/property_meter_archives.py @@ -24,7 +24,7 @@ class PropertyMeterArchives(models.Model): last_meter = fields.Date(string='上次抄表日期') current_meter = fields.Float(string='本次用量', tracking=True) ratio = fields.Float(string='倍率') - archives_state = fields.Selection([('stop', '停用'), ('use', '使用'), ('rent', '出租')], string='状态') + archives_state = fields.Selection([('stop', '停用'), ('use', '正常'), ('rent', '出租')], string='状态', compute='_compute_archives_state', store=True, default='use') dosage = fields.Float(string='用量') is_push = fields.Boolean(string='已推送') start_time = fields.Date(string="安装日期") @@ -33,6 +33,36 @@ class PropertyMeterArchives(models.Model): standards_id = fields.Many2one('yuthon.electricity.setting', string='标准') yuthon_property_id = fields.Many2one('yuthon.property', string='关联物业信息') + @api.depends('lessee_id') + def _compute_archives_state(self): + for record in self: + if record.lessee_id: + record.archives_state = 'rent' + else: + record.archives_state = 'use' + + @api.model + def create(self, vals): + record = super().create(vals) + if record.lessee_id: + record.archives_state = 'rent' + else: + record.archives_state = 'use' + return record + + def button_archives_state(self): + archives_ids = self.env["property.meter.archives"].browse(self._context.get('active_ids', self._context.get('active_id'))) + for record in archives_ids: + record.archives_state = 'stop' + + def update_meter(self): + meter_ids = self.env["property.meter.archives"].browse(self._context.get('active_ids', self._context.get('active_id'))) + for record in meter_ids: + if record.lessee_id: + record.archives_state = 'rent' + else: + record.archives_state = 'use' + @api.onchange('current_meter') def _onchange_current_meter(self): current_date = fields.Date.today() diff --git a/yuthon_property/models/property_meter_water.py b/yuthon_property/models/property_meter_water.py index ba7f715f3..c21cd7b52 100644 --- a/yuthon_property/models/property_meter_water.py +++ b/yuthon_property/models/property_meter_water.py @@ -28,10 +28,41 @@ class PropertyMeterWater(models.Model): start_time = fields.Date(string="安装日期") end_time = fields.Date(string="拆除日期") last_reading_time = fields.Date(string="最后读数时间") - water_state = fields.Selection([('stop', '停用'), ('use', '使用'), ('rent', '出租')], string='状态') + water_state = fields.Selection([('stop', '停用'), ('use', '使用'), ('rent', '出租')], string='状态', compute='_compute_water_state', store=True) standards_id = fields.Many2one('yuthon.electricity.setting', string='标准') yuthon_property_id = fields.Many2one('yuthon.property', string='关联物业信息') + @api.depends('lessee_id') + def _compute_water_state(self): + for record in self: + if record.lessee_id: + record.water_state = 'rent' + else: + record.water_state = 'use' + + @api.model + def create(self, vals): + record = super().create(vals) + if record.lessee_id: + record.water_state = 'rent' + else: + record.water_state = 'use' + return record + + def button_water_state(self): + archives_ids = self.env["property.meter.water"].browse( + self._context.get('active_ids', self._context.get('active_id'))) + for record in archives_ids: + record.water_state = 'stop' + + def update_meter(self): + meter_ids = self.env["property.meter.water"].browse(self._context.get('active_ids', self._context.get('active_id'))) + for record in meter_ids: + if record.lessee_id: + record.water_state = 'rent' + else: + record.water_state = 'use' + @api.onchange('current_meter') def _onchange_current_meter(self): current_date = fields.Date.today() diff --git a/yuthon_property/models/yuthon_property.py b/yuthon_property/models/yuthon_property.py index fa386209b..3f22fbc27 100644 --- a/yuthon_property/models/yuthon_property.py +++ b/yuthon_property/models/yuthon_property.py @@ -93,59 +93,6 @@ class YuthonProperty(models.Model): annual_increase_amount = fields.Float(string='递增金额', igits=(6, 2)) rent_unit = fields.Float(string='租金单价', igits=(6, 2)) - @api.onchange('energy_meter_ids') - def _onchange_energy_meter_ids(self): - for record in self: - today = fields.Date.today() - electricity_list = [] - if record.energy_meter_ids and record.is_electricity_meter: - water_fee_id = self.env['property.lease.contract.line'].search([('address_id', '=', record.id)]) - contract_id = water_fee_id.lease_id - if water_fee_id: - active_meters = record.energy_meter_ids.filtered( - lambda meter: not meter.demolition_date or meter.demolition_date >= today - ) - - for water_fee in active_meters: - electricity_list.append({'fees_id': water_fee.standard_id.id, - 'contract_id': contract_id.id, - 'proportional': water_fee.rate, - } - ) - - self.env['property.electric.fee.line'].search([('address_id', '=', record.id)]).unlink() - if electricity_list: - self.env['property.electric.fee.line'].create(electricity_list) - # else: - # self.env['property.electric.fee.line'].search([('address_id', '=', record.id)]).unlink() - - - @api.onchange('water_meter_ids') - def _onchange_water_meter_ids(self): - for record in self: - today = fields.Date.today() - water_list = [] - if record.water_meter_ids and record.is_meter: - water_fee_id = self.env['property.lease.contract.line'].search([('address_id', '=', record.id.origin)], limit=1) - contract_id = water_fee_id.lease_id - if water_fee_id: - contract_id.is_water = True - active_meters = record.water_meter_ids.filtered( - lambda meter: not meter.demolition_date or meter.demolition_date >= today - ) - - for water_fee in active_meters: - water_list.append({'fees_id': water_fee.standard_id.id, - 'contract_id': contract_id.id, - 'proportional': water_fee.rate, - } - ) - self.env['property.water.fee.line'].search([('address_id', '=', record.id)]).unlink() - if water_list: - self.env['property.water.fee.line'].create(water_list) - # else: - # self.env['property.water.fee.line'].search([('address_id', '=', record.id)]).unlink() - @api.onchange('reference_ids') def _onchange_reference_ids(self): for record in self: diff --git a/yuthon_property/views/menuitem.xml b/yuthon_property/views/menuitem.xml index fe5dc5e3d..a5d20bb56 100644 --- a/yuthon_property/views/menuitem.xml +++ b/yuthon_property/views/menuitem.xml @@ -100,26 +100,26 @@ sequence="99" name="配置" parent="yuthon_property_meter_menu"/> - - - + + diff --git a/yuthon_property/views/property_meter_archives_views.xml b/yuthon_property/views/property_meter_archives_views.xml index 2cda2b4fa..057739140 100644 --- a/yuthon_property/views/property_meter_archives_views.xml +++ b/yuthon_property/views/property_meter_archives_views.xml @@ -4,9 +4,11 @@ property.meter.archives.tree property.meter.archives - +
@@ -24,8 +26,8 @@ + -
@@ -35,15 +37,16 @@ property.meter.archives - - - - - - + + + + + + - + + @@ -80,4 +83,11 @@ code action = model.action_property_meter_wizard() + + 更新状态 + + + code + action = model.update_meter() + \ No newline at end of file diff --git a/yuthon_property/views/property_meter_water_views.xml b/yuthon_property/views/property_meter_water_views.xml index 5ac3c66a0..3c30e536b 100644 --- a/yuthon_property/views/property_meter_water_views.xml +++ b/yuthon_property/views/property_meter_water_views.xml @@ -5,9 +5,11 @@ property.meter.water + decoration-danger="water_state == 'stop'"> + decoration-success="is_push">
@@ -25,6 +27,7 @@ + @@ -36,15 +39,15 @@ property.meter.water - - - - - - + + + + + + - - + + @@ -80,4 +83,11 @@ code + + 更新状态 + + + code + action = model.update_meter() + \ No newline at end of file diff --git a/yuthon_property_approval/models/inherit_yuthon_property.py b/yuthon_property_approval/models/inherit_yuthon_property.py index 5c5aa5533..bb2c5887e 100644 --- a/yuthon_property_approval/models/inherit_yuthon_property.py +++ b/yuthon_property_approval/models/inherit_yuthon_property.py @@ -24,6 +24,18 @@ class YuthonProperty(models.Model): else: continue + def update_lessee_id(self): + property_ids = self.env["yuthon.property"].browse( + self._context.get('active_ids', self._context.get('active_id'))) + for rec in property_ids: + if rec.property_contract_ids: + rec.lessee_id = rec.property_contract_ids[-1].lessee_id + + @api.onchange('property_contract_ids') + def _onchange_property_contract_ids(self): + if self.property_contract_ids: + self.lessee_id = self.property_contract_ids[-1].lessee_id + # 银行流水 class PropertyBankStatements(models.Model): _inherit = 'property.bank.statements' diff --git a/yuthon_property_approval/models/property_lease_contract.py b/yuthon_property_approval/models/property_lease_contract.py index 478c38016..b8279f4a5 100644 --- a/yuthon_property_approval/models/property_lease_contract.py +++ b/yuthon_property_approval/models/property_lease_contract.py @@ -150,8 +150,8 @@ class PropertyLeaseContract(models.Model): use_address = fields.Char(string="财务专用地址") not_tax_amount = fields.Float(string="不含税价") tax = fields.Float(string="税金") - is_water = fields.Boolean(string="是否有水费") - is_electricity = fields.Boolean(string="是否有电费") + is_water = fields.Boolean(string="是否有水费", compute='_compute_lease_ids') + is_electricity = fields.Boolean(string="是否有电费", compute='_compute_lease_ids') is_mange = fields.Boolean(string="是否有管理费") miscellaneous = fields.Text(string="其他约定") number = fields.Integer(string="次数", default=0) @@ -170,8 +170,8 @@ class PropertyLeaseContract(models.Model): lease_ids = fields.One2many('property.lease.contract.line', 'lease_id',string="物业信息明细行") subset_ids = fields.One2many('property.subset.contract', 'subset_id',string="子集明细") breakdown_ids = fields.One2many('property.rent.breakdown.line', 'breakdown_id', string="物业租金明细行") - water_fee_ids = fields.One2many('property.water.fee.line', 'contract_id', string="物业水费明细行") - electricity_fee_ids = fields.One2many('property.electric.fee.line', 'contract_id', string="物业电费明细行") + water_fee_ids = fields.One2many('property.water.fee.line', 'contract_id', string="物业水费明细行", compute='_compute_lease_ids', store=True) + electricity_fee_ids = fields.One2many('property.electric.fee.line', 'contract_id', string="物业电费明细行", compute='_compute_lease_ids', store=True) mange_fee_ids = fields.One2many('property.manage.fee.line', 'contract_id', string="物业管理费明细行") other_ids = fields.One2many('property.other.fee.line', 'other_id', string="其他费用明细行") rent_list_ids = fields.One2many('property.rent.list', 'contract_id', string="租金明细行") @@ -206,8 +206,8 @@ class PropertyLeaseContract(models.Model): license_name = fields.Char(string="营业执照名称", compute='_compute_attachment_names', store=True) legal_entity_name = fields.Char(string="身份证名称", compute='_compute_attachment_names', store=True) - asset_valuation_name = fields.Char(string="资产评估结果明细表名称", compute='_compute_attachment_names',store=True) - lease_contract_name = fields.Char(string="租赁合同(住宅)名称", compute='_compute_attachment_names', store=True) + asset_valuation_name = fields.Char(string="资产评估结果明细表名称", compute='_compute_attachment_names') + lease_contract_name = fields.Char(string="租赁合同(住宅)名称", compute='_compute_attachment_names') confirmation_transaction_name = fields.Char(string="成交确认书名称", compute='_compute_attachment_names', store=True) responsibility_book_name = fields.Char(string="安全生产责任书(住宅)名称", compute='_compute_attachment_names', @@ -239,10 +239,49 @@ class PropertyLeaseContract(models.Model): rec.admin_id = rec.lease_ids[0].admin_line_id.id @api.depends('lease_ids') - def _compute_admin_id(self): + def _compute_lease_ids(self): for rec in self: if rec.lease_ids: rec.admin_id = rec.lease_ids[0].admin_line_id.id + rec.is_water = False + rec.is_electricity = False + + rec.water_fee_ids = [(5, 0, 0)] + rec.electricity_fee_ids = [(5, 0, 0)] + + water_fee_values = [] + electricity_fee_values = [] + + for lease in rec.lease_ids: + if lease.address_id: + if lease.address_id.is_meter: + rec.is_water = True + # 获取未拆除的水表(demolition_date 为空或大于今天) + active_water_meters = lease.address_id.water_meter_ids.filtered( + lambda m: not m.demolition_date or m.demolition_date > fields.Date.today() + ) + for meter in active_water_meters: + water_fee_values.append([0, 0, { + 'contract_id': rec.id, + 'property_meter_water_id': meter.property_meter_water_id.id, + }]) + + if lease.address_id.is_electricity_meter: + rec.is_electricity = True + active_electric_meters = lease.address_id.energy_meter_ids.filtered( + lambda m: not m.demolition_date or m.demolition_date > fields.Date.today() + ) + for meter in active_electric_meters: + electricity_fee_values.append([0, 0, { + 'contract_id': rec.id, + 'property_meter_archives_id': meter.property_meter_archives_id.id, + }]) + + if water_fee_values: + rec.water_fee_ids = water_fee_values + if electricity_fee_values: + rec.electricity_fee_ids = electricity_fee_values + @api.depends( 'license_id.name', @@ -1061,80 +1100,6 @@ class PropertyLeaseContract(models.Model): rec.electricity_fee_ids = electricity_list rec.mange_fee_ids = fee_list - - @api.model_create_multi - def create(self, vals_list): - # 初始化上下文变量,避免循环中重复创建 - yuthon_property_env = self.env['yuthon.property'] - for vals in vals_list: - lease_ids = vals.get('lease_ids', []) - lease_name = [] - electricity_list = [] - title_address = [] - fee_list = [] - # 处理每条租赁记录 - for lease_info in lease_ids: - if isinstance(lease_info, tuple) and lease_info[0] == 4: # 引用已有记录 - lease_id = lease_info[1] - lease_record = self.env['property.lease.contract.line'].browse(lease_id) # 替换为实际的租赁模型 - if lease_record.address_id and lease_record.address_id.title_address: - lease_name.append(lease_record.address_id.name) - title_address.append(lease_record.address_id.title_address.name) - # 更新vals中的字段 - vals['name'] = ','.join(lease_name) - vals['use_address'] = ','.join(lease_name) - vals['title_address'] = ','.join(title_address) - # 查找物业记录 - property_id = yuthon_property_env.search([('id', '=', lease_record.address_id.id)], limit=1) - if property_id: - # 处理电表信息 - if property_id.energy_meter_ids: - vals['is_electricity'] = True - for electricity_id in property_id.energy_meter_ids: - electricity_list.append([0, 0, { - 'fees_id': electricity_id.standard_id.id, - 'proportional': electricity_id.rate, - }]) - else: - vals['is_electricity'] = False - - # 处理管理费信息 - if property_id.is_message_fee: - vals['is_mange'] = True - standard_id = property_id.message_standard_id - fee_list.append([0, 0, { - 'fees_id': standard_id.id, - 'proportional': standard_id.amount, - }]) - else: - vals['is_mange'] = False - # 设置其他字段 - if lease_ids: - first_lease = self.env['property.lease.contract.line'].browse(lease_ids[0][1]) if isinstance(lease_ids[0], - tuple) else None - if first_lease: - vals['admin_id'] = first_lease.admin_line_id.id if first_lease.admin_line_id else False - vals['tenure_type'] = first_lease.address_id.tenure_type if first_lease.address_id else '' - vals[ - 'lessor_id'] = first_lease.address_id.company_id.id if first_lease.address_id and first_lease.address_id.company_id else False - vals[ - 'precinct_id'] = first_lease.address_id.precinct_id.id if first_lease.address_id and first_lease.address_id.precinct_id else False - - # 计算总面积 - total_area = 0 - for lease_info in lease_ids: - if isinstance(lease_info, tuple) and lease_info[0] == 4: - lease = self.env['your.lease.model'].browse(lease_info[1]) - total_area += lease.property_area if lease.property_area else 0 - vals['total_area'] = total_area - - # 设置费用明细 - vals['electricity_fee_ids'] = [(5, 0, 0)] + electricity_list - vals['mange_fee_ids'] = [(5, 0, 0)] + fee_list - - records = super().create(vals_list) - return records - def trigger_lease_ids(self): property_ids = self.env["property.lease.contract"].browse(self._context.get('active_ids', self._context.get('active_id'))) for record in property_ids: @@ -1591,20 +1556,24 @@ class PropertyWaterFeeLine(models.Model): _description = '物业水费明细行' contract_id = fields.Many2one('property.lease.contract', string="关联租赁合同审批") - address_id = fields.Many2one('yuthon.property', string="物业地址") - charges = fields.Char(string="收费项") - fees_id = fields.Many2one('yuthon.water.setting', string="收费标准") - proportional = fields.Float(string="赔率/比例") - + property_meter_water_id = fields.Many2one('property.meter.water', string="水表库") + rate = fields.Float(related='property_meter_water_id.gauge_magnification', string="倍率", store=True) + standard_id = fields.Many2one(related='property_meter_water_id.standards_id', string="标准", store=True) + installation_date = fields.Date(related='property_meter_water_id.start_time', string="安装日期") + demolition_date = fields.Date(related='property_meter_water_id.end_time', string="拆除日期") + location = fields.Char(related='property_meter_water_id.installation_location', string="位置") class PropertyElectricFeeLine(models.Model): _name = 'property.electric.fee.line' _description = '物业电费明细行' contract_id = fields.Many2one('property.lease.contract', string="关联租赁合同审批") - charges = fields.Char(string="收费项") - fees_id = fields.Many2one('yuthon.electricity.setting', string="收费标准") - proportional = fields.Float(string="倍率/比例") + property_meter_archives_id = fields.Many2one('property.meter.archives', string="电表库") + rate = fields.Float(related='property_meter_archives_id.gauge_magnification', string="倍率", store=True) + standard_id = fields.Many2one(related='property_meter_archives_id.standards_id', string="标准", store=True) + installation_date = fields.Date(related='property_meter_archives_id.start_time', string="安装日期") + demolition_date = fields.Date(related='property_meter_archives_id.end_time', string="拆除日期") + location = fields.Char(related='property_meter_archives_id.installation_location', string="位置") class PropertyManageFeeLine(models.Model): diff --git a/yuthon_property_approval/views/inherit_yuthon_property_views.xml b/yuthon_property_approval/views/inherit_yuthon_property_views.xml index 93c6cfff9..e39818fb6 100644 --- a/yuthon_property_approval/views/inherit_yuthon_property_views.xml +++ b/yuthon_property_approval/views/inherit_yuthon_property_views.xml @@ -21,6 +21,13 @@ + + 更新承租方 + + + code + action = model.update_lessee_id() + property.rent.list.search diff --git a/yuthon_property_approval/views/property_lease_contract.xml b/yuthon_property_approval/views/property_lease_contract.xml index fbd7d3687..55579ddbc 100644 --- a/yuthon_property_approval/views/property_lease_contract.xml +++ b/yuthon_property_approval/views/property_lease_contract.xml @@ -285,9 +285,12 @@ - - - + + + + + + @@ -295,9 +298,12 @@ - - - + + + + + + @@ -692,23 +698,29 @@
- + - + - - - + + + + + + - + - - - + + + + + + diff --git a/yuthon_property_approval/views/property_menu_all.xml b/yuthon_property_approval/views/property_menu_all.xml index e097a1967..ff3e26381 100644 --- a/yuthon_property_approval/views/property_menu_all.xml +++ b/yuthon_property_approval/views/property_menu_all.xml @@ -271,12 +271,12 @@