diff --git a/soong_workflow/views/soong_workflow_record.xml b/soong_workflow/views/soong_workflow_record.xml index dc126bab6..9e343ad66 100644 --- a/soong_workflow/views/soong_workflow_record.xml +++ b/soong_workflow/views/soong_workflow_record.xml @@ -62,7 +62,7 @@ + create="false" default_order="write_date2 desc, id desc" expand="1">
diff --git a/yuthon_hr_attendance/views/hr_attendance_views.xml b/yuthon_hr_attendance/views/hr_attendance_views.xml index 0a837b15e..63fb80d03 100644 --- a/yuthon_hr_attendance/views/hr_attendance_views.xml +++ b/yuthon_hr_attendance/views/hr_attendance_views.xml @@ -5,7 +5,7 @@ hr.attendance
@@ -51,7 +51,7 @@ hr.attendance diff --git a/yuthon_hr_employee/models/yuthon_hr_employee.py b/yuthon_hr_employee/models/yuthon_hr_employee.py index 64a2ceb26..7f1d5e722 100644 --- a/yuthon_hr_employee/models/yuthon_hr_employee.py +++ b/yuthon_hr_employee/models/yuthon_hr_employee.py @@ -216,6 +216,26 @@ class YuthonHrEmployee(models.Model): security_amount = fields.Float(string="安全委员会金额", compute='_compute_subsidy_amount', store=True) quality_inspector_amount = fields.Float(string="质检员金额", compute='_compute_subsidy_amount', store=True) + # 请假记录 + done_leave = fields.Float(string='年假') + done_working_overtime = fields.Float(string='加班时') + compensatory_leave = fields.Integer(string="调休") + leave_of_absence = fields.Float(string="事假") + statutory_leave = fields.Integer(string="加班时(法定)") + cop_leave = fields.Float(string='补休') + duty_off_leave = fields.Integer(string='值班调休') + marriage_leave = fields.Integer(string='婚假') + maternity_leave = fields.Integer(string='产假') + paternity_leave = fields.Integer(string='陪产假') + family_planning_leave = fields.Integer(string='计生假') + bereavement_leave = fields.Float(string='丧假') + home_visit_leave = fields.Integer(string='探亲假') + parents_meeting_leave = fields.Integer(string='家长会假') + general_sick_leave = fields.Float(string='病假(普通)') + hospital_sick_leave = fields.Float(string='病假(住院期)') + recovery_sick_leave = fields.Float(string='病假(出院恢复期)') + exam_leave = fields.Integer(string='考试假') + def get_my_employee_action(self): current_user = self.env.user my_employee = self.search([('user_id', '=', current_user.id)], limit=1) diff --git a/yuthon_issue/models/issue_library.py b/yuthon_issue/models/issue_library.py index 7e9a5a005..ebdd85f93 100644 --- a/yuthon_issue/models/issue_library.py +++ b/yuthon_issue/models/issue_library.py @@ -12,7 +12,7 @@ class IssueLibrary(models.Model): name = fields.Char(string='议题名称') name_text = fields.Text(string='议题名称', compute='_compute_name', readonly=False) depart_opinions = fields.Text(string='部门意见') - topic_content = fields.Text(string='议题内容') + topic_content = fields.Text(string='议题详细描述') will_based = fields.Text(string='上会依据') code = fields.Char(string='编号', required=True, copy=False, default=lambda self: self.env['ir.sequence'].next_by_code('issue_library_code')) diff --git a/yuthon_issue/views/issue_library_views.xml b/yuthon_issue/views/issue_library_views.xml index 94eb5b46f..88222ea3d 100644 --- a/yuthon_issue/views/issue_library_views.xml +++ b/yuthon_issue/views/issue_library_views.xml @@ -66,11 +66,11 @@ - + + - @@ -235,11 +235,14 @@ - - + + + + + + - @@ -383,12 +386,14 @@ - + - + + + + - @@ -520,11 +525,14 @@ - - - - - + + + + + + + + diff --git a/yuthon_property_approval/wizard/property_reconciliation_wizard.py b/yuthon_property_approval/wizard/property_reconciliation_wizard.py index 7f5c5cd96..c2667a6df 100644 --- a/yuthon_property_approval/wizard/property_reconciliation_wizard.py +++ b/yuthon_property_approval/wizard/property_reconciliation_wizard.py @@ -307,134 +307,145 @@ class PropertyReconciliationWizard(models.Model): ('bank', '=', rec.bank_id.name), ('tenant_id.name', '!=', False) ]) - if bank_lines: - if rec.actual_total > rec.receivable_total: - rec.bank_id.registered = rec.actual_total - rec.receivable_total - rec.bank_id.bank_state = 'registered' - else: - rec.bank_id.registered = 0 - rec.bank_id.bank_state = 'reconciled' - rec.reconciliation_time = fields.Datetime.now() - timedelta(hours=8), - first_line = bank_lines[0] - for line in rec.reconciliation_line_ids: - # 跳过金额为0的行 - if (line.amount == 0 and line.collection_type != 'penalty') or \ - (line.contract_id and line.contract_id.is_split): - continue - if line.amount != line.rent: - if not line.remake: - raise UserError(_( - "错误:物业 '%s' 的对账明细行金额与租金不符,备注信息为必填项,请填写备注后再试。" - ) % line.property_id.name) - line_date = fields.Date.from_string(line.due_date) - rec_date = fields.Date.from_string(rec.actual_date) - if (line_date.year, line_date.month) != (rec_date.year, rec_date.month): - if not line.remake: - raise UserError(_( - "错误:物业 '%s' 的对账明细行月份与对账月份不符,备注信息为必填项,请填写备注后再试。" - ) % line.property_id.name) - first_day = line.due_date.replace(day=1) - last_day = (first_day + relativedelta(months=1)) - relativedelta(days=1) - domain = [ - ('management_type_id.name', '!=', '违约金'), + if not bank_lines: + information = self.env['property.tenant.information'].search( + [('name', '=', rec.name_account)], + limit=1) + if information: + bank_lines = self.env['property.bank.line'].create({ + 'tenant_id': information.id, + 'bank': rec.name, + 'user': information.name, + 'name': rec.name, + }) + + if rec.actual_total > rec.receivable_total: + rec.bank_id.registered = rec.actual_total - rec.receivable_total + rec.bank_id.bank_state = 'registered' + else: + rec.bank_id.registered = 0 + rec.bank_id.bank_state = 'reconciled' + rec.reconciliation_time = fields.Datetime.now() - timedelta(hours=8), + first_line = bank_lines[0] + for line in rec.reconciliation_line_ids: + # 跳过金额为0的行 + if (line.amount == 0 and line.collection_type != 'penalty') or \ + (line.contract_id and line.contract_id.is_split): + continue + if line.amount != line.rent: + if not line.remake: + raise UserError(_( + "错误:物业 '%s' 的对账明细行金额与租金不符,备注信息为必填项,请填写备注后再试。" + ) % line.property_id.name) + line_date = fields.Date.from_string(line.due_date) + rec_date = fields.Date.from_string(rec.actual_date) + if (line_date.year, line_date.month) != (rec_date.year, rec_date.month): + if not line.remake: + raise UserError(_( + "错误:物业 '%s' 的对账明细行月份与对账月份不符,备注信息为必填项,请填写备注后再试。" + ) % line.property_id.name) + first_day = line.due_date.replace(day=1) + last_day = (first_day + relativedelta(months=1)) - relativedelta(days=1) + domain = [ + ('management_type_id.name', '!=', '违约金'), + ('lessee_id', '=', first_line.tenant_id.id), + ('is_reconciliation', '=', False), + ('is_suspend', '=', False), + ('due_date', '>=', first_day), + ('due_date', '<=', last_day), + ] + # 如果有物业信息 + if line.property_id: + domain.append(('property_id', '=', line.property_id.id)) + if line.contract_id: + domain.append(('contract_id', '=', line.contract_id.id)) + receivable_ids = self.env['property.accounts.receivable'].search(domain) + for receivable in receivable_ids: + if line.rent == line.amount: + is_reconciliation = True + else: + is_reconciliation = False + if line.collection_type != 'penalty': + receivable.write({ + 'is_reconciliation': is_reconciliation, + 'delivered1': line.amount, + 'payout_date': rec.actual_date if line.rent == line.amount else None, + 'remark': line.remake, + 'reconciliation_time': fields.Datetime.now(), + 'receivable_log': f'当前登录人{rec.env.user.name}于{fields.Datetime.now()}对户名为{rec.bank_id.name_account}进行对账操作,对账应收金额为{rec.receivable_total},实际金额为{rec.actual_total}' + }) + management_type_id = self.env['yuthon.management.type'].search([('name', '=', '违约金')]) + if line.collection_type == 'penalty': + # 用备注的的开始日期和结束日期 + date_pattern = r'(\d{4}-\d{2}-\d{2})[至-](\d{4}-\d{2}-\d{2})' + date_match = re.search(date_pattern, line.remake or '') + extract_start_date = date_match.group(1) if date_match else line.due_date + extract_end_date = date_match.group(2) if date_match else None + check_domain = [ + ('due_date', '=', extract_start_date), + ('property_id', '=', line.property_id.id), + ('contract_id', '=', line.contract_id.id), + ('management_type_id', '=', management_type_id.id), ('lessee_id', '=', first_line.tenant_id.id), - ('is_reconciliation', '=', False), - ('is_suspend', '=', False), - ('due_date', '>=', first_day), - ('due_date', '<=', last_day), ] - # 如果有物业信息 - if line.property_id: - domain.append(('property_id', '=', line.property_id.id)) - if line.contract_id: - domain.append(('contract_id', '=', line.contract_id.id)) - receivable_ids = self.env['property.accounts.receivable'].search(domain) - for receivable in receivable_ids: - if line.rent == line.amount: - is_reconciliation = True - else: - is_reconciliation = False - if line.collection_type != 'penalty': - receivable.write({ - 'is_reconciliation': is_reconciliation, - 'delivered1': line.amount, - 'payout_date': rec.actual_date if line.rent == line.amount else None, - 'remark': line.remake, - 'reconciliation_time': fields.Datetime.now(), - 'receivable_log': f'当前登录人{rec.env.user.name}于{fields.Datetime.now()}对户名为{rec.bank_id.name_account}进行对账操作,对账应收金额为{rec.receivable_total},实际金额为{rec.actual_total}' - }) - management_type_id = self.env['yuthon.management.type'].search([('name', '=', '违约金')]) - if line.collection_type == 'penalty': - # 用备注的的开始日期和结束日期 - date_pattern = r'(\d{4}-\d{2}-\d{2})[至-](\d{4}-\d{2}-\d{2})' - date_match = re.search(date_pattern, line.remake or '') - extract_start_date = date_match.group(1) if date_match else line.due_date - extract_end_date = date_match.group(2) if date_match else None - check_domain = [ - ('due_date', '=', extract_start_date), + # 检查是否已有相同记录 + existing_record = self.env['property.accounts.receivable'].search(check_domain) + is_reconciliation = line.amount == round(line.rent, 2) + + if not existing_record: + domain2 = [ + ('due_date', '=', line.due_date), ('property_id', '=', line.property_id.id), ('contract_id', '=', line.contract_id.id), - ('management_type_id', '=', management_type_id.id), - ('lessee_id', '=', first_line.tenant_id.id), + ('collection_type', '=', 'rent'), ] - # 检查是否已有相同记录 - existing_record = self.env['property.accounts.receivable'].search(check_domain) - is_reconciliation = line.amount == round(line.rent, 2) + reconciliation_id = self.env['property.reconciliation.line'].search(domain2, limit=1) + receivable_id = self.env['property.accounts.receivable'].create({ + 'is_reconciliation': is_reconciliation, + 'due_date': extract_start_date, + 'due_date_end': extract_end_date, + 'penalty': reconciliation_id.rent, + 'management_type_id': management_type_id.id, + 'lessee_id': first_line.tenant_id.id, + 'property_id': line.property_id.id, + 'contract_id': line.contract_id.id, + 'delivered1': line.amount, + 'payout_date': rec.actual_date if (line.rent == line.amount and line.rent != 0) else None, + 'original_amount': line.rent, + 'remark': line.remake, + 'reconciliation_time': fields.Datetime.now(), + }) + rec.bank_id.write({ + 'create_receivable_ids': [(4, receivable_id.id)] + }) + # if receivable_id: + # rec.bank_id.write({ + # 'create_receivable_ids': [(4, receivable_id.id)] + # }) + else: + existing_record.write({ + 'delivered1': existing_record.delivered1 + line.amount, + 'due_date_end': extract_end_date, + 'is_reconciliation': is_reconciliation, + 'payout_date': rec.actual_date if (line.rent == line.amount and line.rent != 0) else None, + 'remark': line.remake, + 'bank_id': rec.bank_id.id if line.amount != 0 else None, + 'is_write': True if line.amount != 0 else None, + 'reconciliation_time': fields.Datetime.now(), + }) + # rec.bank_id.write({ + # 'write_receivable_ids': [(4, existing_record.id)] + # }) - if not existing_record: - domain2 = [ - ('due_date', '=', line.due_date), - ('property_id', '=', line.property_id.id), - ('contract_id', '=', line.contract_id.id), - ('collection_type', '=', 'rent'), - ] - reconciliation_id = self.env['property.reconciliation.line'].search(domain2, limit=1) - receivable_id = self.env['property.accounts.receivable'].create({ - 'is_reconciliation': is_reconciliation, - 'due_date': extract_start_date, - 'due_date_end': extract_end_date, - 'penalty': reconciliation_id.rent, - 'management_type_id': management_type_id.id, - 'lessee_id': first_line.tenant_id.id, - 'property_id': line.property_id.id, - 'contract_id': line.contract_id.id, - 'delivered1': line.amount, - 'payout_date': rec.actual_date if (line.rent == line.amount and line.rent != 0) else None, - 'original_amount': line.rent, - 'remark': line.remake, - 'reconciliation_time': fields.Datetime.now(), - }) - rec.bank_id.write({ - 'create_receivable_ids': [(4, receivable_id.id)] - }) - # if receivable_id: - # rec.bank_id.write({ - # 'create_receivable_ids': [(4, receivable_id.id)] - # }) - else: - existing_record.write({ - 'delivered1': existing_record.delivered1 + line.amount, - 'due_date_end': extract_end_date, - 'is_reconciliation': is_reconciliation, - 'payout_date': rec.actual_date if (line.rent == line.amount and line.rent != 0) else None, - 'remark': line.remake, - 'bank_id': rec.bank_id.id if line.amount != 0 else None, - 'is_write': True if line.amount != 0 else None, - 'reconciliation_time': fields.Datetime.now(), - }) - # rec.bank_id.write({ - # 'write_receivable_ids': [(4, existing_record.id)] - # }) + # 计算已对账和未对账金额 + rec.amount_been_reconciled += line.amount - # 计算已对账和未对账金额 - rec.amount_been_reconciled += line.amount - - if rec.actual_total > rec.amount_been_reconciled: - amount_reconciled = rec.actual_total - rec.amount_been_reconciled - else: - amount_reconciled = 0.0 - rec.bank_id.yes_amount = rec.amount_been_reconciled - rec.bank_id.no_amount = amount_reconciled + if rec.actual_total > rec.amount_been_reconciled: + amount_reconciled = rec.actual_total - rec.amount_been_reconciled + else: + amount_reconciled = 0.0 + rec.bank_id.yes_amount = rec.amount_been_reconciled + rec.bank_id.no_amount = amount_reconciled diff --git a/yuthon_salary/wizard/salary_compute_wizard.py b/yuthon_salary/wizard/salary_compute_wizard.py index ed4fe2648..4a58cc3af 100644 --- a/yuthon_salary/wizard/salary_compute_wizard.py +++ b/yuthon_salary/wizard/salary_compute_wizard.py @@ -97,6 +97,53 @@ class SalaryComputeWizard(models.Model): 'state': 'draft', 'payslip_count': 0 }) + query_date = datetime(year, month, 1).date() + + vacation_report = self.env['yuthon.vacation.reports'].search([ + ('employee_id', '=', employee.id), + ('vacation_date', '=', query_date) + ], limit=1) + if vacation_report: + update_vals = { + # 年假 + 'done_leave': vacation_report.done_leave, + # 加班时 + 'done_working_overtime': vacation_report.done_working_overtime, + # 调休 + 'compensatory_leave': vacation_report.compensatory_leave, + # 事假 + 'leave_of_absence': vacation_report.leave_of_absence, + # 法定加班 + 'statutory_leave': vacation_report.statutory_leave, + # 补休 + 'cop_leave': vacation_report.cop_leave, + # 值班调休 + 'duty_off_leave': vacation_report.duty_off_leave, + # 婚假 + 'marriage_leave': vacation_report.marriage_leave, + # 产假 + 'maternity_leave': vacation_report.maternity_leave, + # 陪产假 + 'paternity_leave': vacation_report.paternity_leave, + # 计生假 + 'family_planning_leave': vacation_report.family_planning_leave, + # 丧假 + 'bereavement_leave': vacation_report.bereavement_leave, + # 探亲假 + 'home_visit_leave': vacation_report.home_visit_leave, + # 家长会假 + 'parents_meeting_leave': vacation_report.parents_meeting_leave, + # 普通病假 + 'general_sick_leave': vacation_report.general_sick_leave, + # 住院病假 + 'hospital_sick_leave': vacation_report.hospital_sick_leave, + # 出院恢复期病假 + 'recovery_sick_leave': vacation_report.recovery_sick_leave, + # 考试假 + 'exam_leave': vacation_report.exam_leave, + } + # 更新员工花名册记录 + employee.write(update_vals) employee.salary_date = start_date employee.salary_month = self.select_time employee.salary_year_jin_ids = [(6, 0, self.employee_ids.ids)]