Merge pull request !1212 from dev_ljm_20241129
This commit is contained in:
ljm
2025-01-08 15:55:04 +00:00
committed by Gitee
2 changed files with 361 additions and 112 deletions
@@ -355,74 +355,244 @@ class PropertyLeaseContract(models.Model):
record.do_generate_details_core(start_date, end_date)
def do_generate_details_core(self, start_date, end_date):
"""
计算核心算法
:return:
"""
all_period_rent = 0
first_years_begin = self.first_years_begin if self.first_years_begin else 0
increments_every_few_years = self.increments_every_few_years
monthly_amount = self.total_area * self.unit_price
monthly_amount = float_round(monthly_amount, precision_digits=0, rounding_method='HALF-UP') # 月租金
# 月租金
unit_price = self.unit_price # 单价
rent_free_period_month = 0
# 如果有免租期 月 时间进行到 start_date
free_start = start_date
if self.rent_free_period_month:
rent_free_period_month += self.rent_free_period_month
free_start = start_date # 免租期开始
if rent_free_period_month:
free_start = start_date + relativedelta(months=rent_free_period_month)
free_start = start_date + relativedelta(months=self.rent_free_period_month)
if free_start > end_date:
free_start = end_date
self.sudo().write({'breakdown_ids': [(0, 0, {
"unit_price": unit_price,
"monthly_amount": monthly_amount,
"breakdown_id": self.id,
"start_data": start_date,
"end_data": free_start - relativedelta(days=1),
"month_number": rent_free_period_month,
"month_number": self.rent_free_period_month,
"period_rent": 0,
})]})
# 如果没有递增 那么计算全部
if not increments_every_few_years:
# 如果免租期有天那么默认增加一个月
if self.rent_free_period_days:
# 计算这个月的天数
current_days = calendar.monthrange(free_start.year, free_start.month)[1]
current_no_free = (current_days - self.rent_free_period_days) / current_days
# 计算 免租期天的比值
self.sudo().write({'breakdown_ids': [(0, 0, {
"unit_price": unit_price,
"monthly_amount": monthly_amount,
"breakdown_id": self.id,
"start_data": free_start,
"end_data": free_start + relativedelta(months=1) - relativedelta(days=1),
"month_number": 1,
"period_rent": monthly_amount * 1 * current_no_free if monthly_amount * 1 * current_no_free > 0 else 0,
})]})
new_free_day_amount = monthly_amount * 1 * current_no_free if monthly_amount * 1 * current_no_free > 0 else 0
all_period_rent += new_free_day_amount
# 免租期后退一个月
free_start = free_start + relativedelta(months=1)
# 计算 免租期天的比值
delta = relativedelta(end_date, free_start)
free_day_start = free_start
add_year_index = 0 # 第几年
year_month_index = 0 # 第几个月
monthly_amount_start_dict = {}
monthly_amount_end_dict = {}
monthly_amount_dict = {}
monthly_amount_unit_price = {}
monthly_amount_period_rent = {}
# 说明存在免增期 单独计算
if start_date < end_date:
one_years_list = self.divide_time_range_fixed(start_date, end_date, 12)
for one_year in one_years_list:
add_year_index += 1
# 是否存在免增期
first_years_begin = self.first_years_begin if self.first_years_begin else 0
# 存在递增期 并且进入递增金额计算
if self.increments_every_few_years > 0 and add_year_index >= first_years_begin:
if add_year_index % self.increments_every_few_years == 0:
# 单价和金额计算
if self.increment_method == "increment_price" and self.increment_value:
unit_price = unit_price + self.increment_value
monthly_amount = self.total_area * unit_price
monthly_amount = float_round(monthly_amount, precision_digits=0, rounding_method='HALF-UP') # 月租金
if self.increment_method == "percentage" and self.increment_value:
monthly_amount = monthly_amount * (1 + (self.increment_value / 100))
monthly_amount = float_round(monthly_amount, precision_digits=0, rounding_method='HALF-UP') # 月租金
unit_price = monthly_amount / self.total_area
if self.increment_method == "increment_amount" and self.increment_value:
monthly_amount = monthly_amount + self.increment_value
monthly_amount = float_round(monthly_amount, precision_digits=0, rounding_method='HALF-UP') # 月租金
unit_price = monthly_amount / self.total_area
# 开始时间, 结束时间
one_year_start = one_year[0]
one_year_end = one_year[1]
one_month_list = self.divide_time_range_fixed(one_year_start, one_year_end, 1)
for one_month in one_month_list:
period_rent = monthly_amount
# 所有月统计
year_month_index += 1
# 如果开始时间 是 免租期月的结束时间,那么进入免租期日
if one_month[0] == free_start:
# 如果免租期有天那么默认增加一个月
if self.rent_free_period_days:
# 免租日的截至日期
free_day_start = one_month[1]
# 计算这个月的天数
total_days = (one_month[1] - one_month[0]).days
current_no_free = (total_days - self.rent_free_period_days) / total_days
period_rent = monthly_amount * 1 * current_no_free if monthly_amount * 1 * current_no_free > 0 else 0
# 计算 免租期天的比值
self.sudo().write({'breakdown_ids': [(0, 0, {
"unit_price": unit_price,
"monthly_amount": monthly_amount,
"breakdown_id": self.id,
"start_data": one_month[0],
"end_data": one_month[1] - relativedelta(days=1),
"month_number": 1,
"period_rent": period_rent,
})]})
all_period_rent += period_rent
# 已经跳出 免租期了 开始计费
if one_month[0] >= free_day_start:
current_days = calendar.monthrange(one_month[0].year, one_month[0].month)[1]
total_days = (one_month[1] - one_month[0]).days
# 说明不足月
if current_days > total_days:
current_no_free = total_days / current_days
period_rent = monthly_amount * 1 * current_no_free if monthly_amount * 1 * current_no_free > 0 else 0
all_period_rent += period_rent
monthly_amount_dict[str(int(monthly_amount))] = monthly_amount
if str(int(monthly_amount)) in monthly_amount_start_dict:
old_start = monthly_amount_start_dict.get(str(int(monthly_amount)))
monthly_amount_start_dict[str(int(monthly_amount))] = min(old_start, one_month[0])
else:
monthly_amount_start_dict[str(int(monthly_amount))] = one_month[0]
if str(int(monthly_amount)) in monthly_amount_end_dict:
old_start = monthly_amount_end_dict.get(str(int(monthly_amount)))
monthly_amount_end_dict[str(int(monthly_amount))] = max(old_start, one_month[1])
else:
monthly_amount_end_dict[str(int(monthly_amount))] = one_month[1]
if str(int(monthly_amount)) in monthly_amount_unit_price:
monthly_amount_unit_price[str(int(monthly_amount))] = unit_price
else:
monthly_amount_unit_price[str(int(monthly_amount))] = unit_price
if str(int(monthly_amount)) in monthly_amount_period_rent:
old_period_rent = monthly_amount_period_rent.get(str(int(monthly_amount)))
monthly_amount_period_rent[str(int(monthly_amount))] = old_period_rent + period_rent
else:
monthly_amount_period_rent[str(int(monthly_amount))] = period_rent
# 开始统计月份阶段金额
for k, v in monthly_amount_dict.items():
unit_price = monthly_amount_unit_price.get(k)
monthly_amount = monthly_amount_dict.get(k)
period_rent = monthly_amount_period_rent.get(k)
start_time = monthly_amount_start_dict.get(k)
end_time = monthly_amount_end_dict.get(k)
delta = relativedelta(end_time, start_time)
months = delta.years * 12 + delta.months
if delta.days:
months += 1
if end_time != end_date:
end_time = end_time - relativedelta(days=1)
self.sudo().write({'breakdown_ids': [(0, 0, {
"unit_price": unit_price,
"monthly_amount": monthly_amount,
"breakdown_id": self.id,
"start_data": free_start,
"end_data": end_date - relativedelta(days=1),
"start_data": start_time,
"end_data": end_time,
"month_number": months,
"period_rent": monthly_amount * months,
"period_rent": period_rent,
})]})
all_period_rent += monthly_amount * months
def do_generate_details_core_1(self, start_date, end_date):
"""
计算核心算法
:return:
"""
all_period_rent = 0 # 总金额
monthly_amount = self.total_area * self.unit_price
monthly_amount = float_round(monthly_amount, precision_digits=0, rounding_method='HALF-UP') # 月租金
# 月租金
unit_price = self.unit_price # 单价
# 如果有免租期 月 时间进行到 start_date
free_start = start_date
if self.rent_free_period_month:
free_start = start_date + relativedelta(months=self.rent_free_period_month)
if free_start > end_date:
free_start = end_date
self.sudo().write({'breakdown_ids': [(0, 0, {
"unit_price": unit_price,
"monthly_amount": monthly_amount,
"breakdown_id": self.id,
"start_data": start_date,
"end_data": free_start - relativedelta(days=1),
"month_number": self.rent_free_period_month,
"period_rent": 0,
})]})
# 如果没有递增 那么计算全部
if not self.increments_every_few_years:
# 如果免租期有天那么默认增加一个月
# 如果有免增期 日
free_start_day = free_start
if self.rent_free_period_days:
free_start_day = free_start + relativedelta(months=self.rent_free_period_days)
if free_start_day < end_date:
# 计算这个月的天数
current_days = calendar.monthrange(free_start.year, free_start.month)[1]
current_no_free = (current_days - self.rent_free_period_days) / current_days
period_rent = monthly_amount * 1 * current_no_free if monthly_amount * 1 * current_no_free > 0 else 0
# 计算 免租期天的比值
self.sudo().write({'breakdown_ids': [(0, 0, {
"unit_price": unit_price,
"monthly_amount": monthly_amount,
"breakdown_id": self.id,
"start_data": free_start,
"end_data": free_start_day - relativedelta(days=1),
"month_number": 1,
"period_rent": period_rent,
})]})
all_period_rent += period_rent
# 计算 剩余日期的金额
if free_start_day < end_date:
delta = relativedelta(end_date, free_start_day)
months = delta.years * 12 + delta.months
free_start_day_end = free_start_day + relativedelta(months=months)
self.sudo().write({'breakdown_ids': [(0, 0, {
"unit_price": unit_price,
"monthly_amount": monthly_amount,
"breakdown_id": self.id,
"start_data": free_start_day,
"end_data": free_start_day_end - relativedelta(days=1),
"month_number": months,
"period_rent": monthly_amount * months,
})]})
all_period_rent += monthly_amount * months
# 说明最后还有几天
if delta.days > 0:
current_days = calendar.monthrange(free_start_day_end.year, free_start_day_end.month)[1]
current_no_free = delta.days / current_days
period_rent = monthly_amount * 1 * current_no_free if monthly_amount * 1 * current_no_free > 0 else 0
# 计算 免租期天的比值
self.sudo().write({'breakdown_ids': [(0, 0, {
"unit_price": unit_price,
"monthly_amount": monthly_amount,
"breakdown_id": self.id,
"start_data": free_start_day_end,
"end_data": end_date,
"month_number": 1,
"period_rent": period_rent,
})]})
# 如果有递增
else:
first_years_begin_end = start_date
# 免递增年份计算
if first_years_begin > 1:
if self.first_years_begin > 1:
# 免递增结束时间
first_years_begin_end = start_date + relativedelta(months=(first_years_begin -1) * 12)
first_years_begin_end = start_date + relativedelta(months=(self.first_years_begin -1) * 12)
# 免租期结束时间 free_start
# 计算免租期和免增期的差值, 如果免租期超过免增期那么不存在免增期
if first_years_begin_end > free_start:
@@ -88,6 +88,62 @@
</tree>
</field>
</page>
<page string="租金明细">
<!-- <button name="action_generate_details" class="oe_link btn btn-primary" type="object"-->
<!-- string="生成明细"/>-->
<field name="breakdown_ids" string=" ">
<tree editable="bottom">
<field name="breakdown_id" column_invisible="1"/>
<!-- <field name="charges"/>-->
<field name="unit_price"/>
<field name="monthly_amount"/>
<field name="start_data"/>
<field name="end_data"/>
<field name="month_number"/>
<field name="period_rent"/>
</tree>
</field>
</page>
<page string="其他费用">
<field name="other_ids" string=" ">
<tree editable="bottom">
<field name="other_id" column_invisible="1"/>
<field name="charges"/>
<field name="coping"/>
<field name="coping_time"/>
</tree>
</field>
</page>
<page string="水费" invisible="not is_water">
<field name="water_fee_ids" string=" ">
<tree editable="bottom">
<field name="contract_id" column_invisible="1"/>
<field name="charges"/>
<field name="fees_id"/>
<field name="proportional"/>
</tree>
</field>
</page>
<page string="电费" invisible="not is_electricity">
<field name="electricity_fee_ids" string=" ">
<tree editable="bottom">
<field name="contract_id" column_invisible="1"/>
<field name="charges"/>
<field name="fees_id"/>
<field name="proportional"/>
</tree>
</field>
</page>
<page string="管理费" invisible="not is_mange">
<field name="mange_fee_ids" string=" ">
<tree editable="bottom">
<field name="contract_id" column_invisible="1"/>
<field name="charges"/>
<field name="fees_id"/>
<field name="proportional"/>
</tree>
</field>
</page>
<page string="附件">
<group col="2">
<group>
@@ -205,10 +261,7 @@
<field name="tax" readonly="1"/>
<field name="not_tax_amount" readonly="1"/>
<field name="first_year_rent"/>
<label for="total_contract_receivables" class="fw-bold fw-bolder fs-3"/>
<div class="fw-bold fw-bolder fs-3">
<field name="total_contract_receivables"/>
</div>
<field name="total_contract_receivables" style="font-size: 1.2rem; font-weight: bold;"/>
</group>
</group>
<group col="3">
@@ -225,61 +278,6 @@
<group>
<field name="miscellaneous"/>
</group>
<notebook>
<page string="租金明细">
<field name="breakdown_ids" string=" ">
<tree editable="bottom">
<field name="breakdown_id" column_invisible="1"/>
<field name="unit_price"/>
<field name="monthly_amount"/>
<field name="start_data"/>
<field name="end_data"/>
<field name="month_number"/>
<field name="period_rent"/>
</tree>
</field>
</page>
<page string="水费" invisible="not is_water">
<field name="water_fee_ids" string=" ">
<tree editable="bottom">
<field name="contract_id" column_invisible="1"/>
<field name="charges"/>
<field name="fees_id"/>
<field name="proportional"/>
</tree>
</field>
</page>
<page string="电费" invisible="not is_electricity">
<field name="electricity_fee_ids" string=" ">
<tree editable="bottom">
<field name="contract_id" column_invisible="1"/>
<field name="charges"/>
<field name="fees_id"/>
<field name="proportional"/>
</tree>
</field>
</page>
<page string="管理费" invisible="not is_mange">
<field name="mange_fee_ids" string=" ">
<tree editable="bottom">
<field name="contract_id" column_invisible="1"/>
<field name="charges"/>
<field name="fees_id"/>
<field name="proportional"/>
</tree>
</field>
</page>
<page string="其他费用">
<field name="other_ids" string=" ">
<tree editable="bottom">
<field name="other_id" column_invisible="1"/>
<field name="charges"/>
<field name="coping"/>
<field name="coping_time"/>
</tree>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
@@ -296,7 +294,7 @@
<field name="total_contract_receivables"/>
<field name="actual_receivable"/>
<field name="now_receivable"/>
<field name="percentage_damages"/>
<field name="percentage_liquidated_damages"/>
<field name="total_receivable"/>
<field name="term_start_time"/>
<field name="term_end_time"/>
@@ -374,6 +372,62 @@
</tree>
</field>
</page>
<page string="租金明细">
<!-- <button name="action_generate_details" class="oe_link btn btn-primary" type="object"-->
<!-- string="生成明细"/>-->
<field name="breakdown_ids" string=" ">
<tree editable="bottom">
<field name="breakdown_id" column_invisible="1"/>
<!-- <field name="charges"/>-->
<field name="unit_price"/>
<field name="monthly_amount"/>
<field name="start_data"/>
<field name="end_data"/>
<field name="month_number"/>
<field name="period_rent"/>
</tree>
</field>
</page>
<page string="其他费用">
<field name="other_ids" string=" ">
<tree editable="bottom">
<field name="other_id" column_invisible="1"/>
<field name="charges"/>
<field name="coping"/>
<field name="coping_time"/>
</tree>
</field>
</page>
<page string="水费" invisible="not is_water">
<field name="water_fee_ids" string=" ">
<tree editable="bottom">
<field name="contract_id" column_invisible="1"/>
<field name="charges"/>
<field name="fees_id"/>
<field name="proportional"/>
</tree>
</field>
</page>
<page string="电费" invisible="not is_electricity">
<field name="electricity_fee_ids" string=" ">
<tree editable="bottom">
<field name="contract_id" column_invisible="1"/>
<field name="charges"/>
<field name="fees_id"/>
<field name="proportional"/>
</tree>
</field>
</page>
<page string="管理费" invisible="not is_mange">
<field name="mange_fee_ids" string=" ">
<tree editable="bottom">
<field name="contract_id" column_invisible="1"/>
<field name="charges"/>
<field name="fees_id"/>
<field name="proportional"/>
</tree>
</field>
</page>
<page string="附件">
<group col="2">
<group>
@@ -493,7 +547,6 @@
</div>
<field name="tax" readonly="1"/>
<field name="not_tax_amount" readonly="1"/>
<field name="percentage_damages"/>
<field name="first_year_rent"/>
<field name="actual_receivable"/>
<field name="now_receivable"/>
@@ -515,6 +568,16 @@
<field name="miscellaneous"/>
</group>
<notebook>
<page string="物业列表">
<field name="lease_ids" string=" ">
<tree editable="bottom">
<field name="lease_id" column_invisible="1"/>
<field name="address_id"/>
<field name="property_area"/>
<field name="evaluate_unit_price"/>
</tree>
</field>
</page>
<page string="租金明细">
<field name="breakdown_ids" string=" ">
<tree editable="bottom">
@@ -528,6 +591,16 @@
</tree>
</field>
</page>
<page string="其他费用">
<field name="other_ids" string=" ">
<tree editable="bottom">
<field name="other_id" column_invisible="1"/>
<field name="charges"/>
<field name="coping"/>
<field name="coping_time"/>
</tree>
</field>
</page>
<page string="水费" invisible="not is_water">
<field name="water_fee_ids" string=" ">
<tree editable="bottom">
@@ -558,15 +631,21 @@
</tree>
</field>
</page>
<page string="其他费用">
<field name="other_ids" string=" ">
<tree editable="bottom">
<field name="other_id" column_invisible="1"/>
<field name="charges"/>
<field name="coping"/>
<field name="coping_time"/>
</tree>
</field>
<page string="附件">
<group col="2">
<group>
<field name="license_id" widget="preview_many2one"/>
<field name="card_id" widget="preview_many2one"/>
<field name="legal_entity_id" widget="preview_many2one"/>
<field name="confirmation_transaction_id" widget="preview_many2one"/>
<field name="handover_time" widget="preview_many2one"/>
</group>
<group>
<field name="power_attorney_id" widget="preview_many2one"/>
<field name="handle_cards_id" widget="preview_many2one"/>
<field name="confirmation_transaction_id" widget="preview_many2one"/>
</group>
</group>
</page>
</notebook>
</sheet>