Merge pull request !867 from dev_ljm_20241129
This commit is contained in:
ljm
2024-12-20 10:53:38 +00:00
committed by Gitee
2 changed files with 182 additions and 104 deletions
@@ -44,9 +44,9 @@ class PropertyLeaseContract(models.Model):
address_for_delivery = fields.Char(string="送达地址")
lease_term = fields.Float(string="租期")
lease_term_year = fields.Integer(string="租期")
lease_term_year_uom = fields.Selection([('year', '年')], default="year", readonly=True, string="免租期单位")
# lease_term_year_uom = fields.Selection([('year', '年')], default="year", readonly=True, string="免租期单位")
lease_term_month = fields.Integer(string="租期")
lease_term_month_uom = fields.Selection([('month', '月')], default="month", readonly=True, string="免租期单位")
# lease_term_month_uom = fields.Selection([('month', '月')], default="month", readonly=True, string="免租期单位")
term_start_time = fields.Date(string="租期开始时间", default=fields.Datetime.now)
term_end_time = fields.Date(string="租期结束时间")
cycle_dict =fields.Selection([('monthly','月度'), ('quarter','季度'), ('half','半年'),('year','年度')],string='付款方式')
@@ -61,12 +61,15 @@ class PropertyLeaseContract(models.Model):
increment_price = fields.Float(string="递增单价")
increment_amount = fields.Float(string="递增金额")
rent_free_period = fields.Integer(string="免租期")
rent_free_period_uom = fields.Selection([('year', '年'), ('month', '月')], default="year", string="免租期单位")
rent_free_period_year = fields.Integer(string="免租期")
rent_free_period_month = fields.Integer(string="免租期")
# rent_free_period_uom = fields.Selection([('year', '年'), ('month', '月')], default="year", string="免租期单位")
breach_time = fields.Date(string="违约计算时点")
percentage_liquidated_damages = fields.Char(string="违约金比例")
date_of_payment = fields.Date(string="每月支付日期")
unit_price = fields.Float(string="单价")
deposit = fields.Float(string="押金/履约保证金")
deposit = fields.Float(string="押金")
performance_bonds = fields.Float(string="履约保证金")
first_year_rent = fields.Float(string="首年租金")
total_contract_receivables = fields.Float(string="合同应收")
tax_rate = fields.Float(string="税率")
@@ -95,6 +98,31 @@ class PropertyLeaseContract(models.Model):
contract_time = fields.Date(string="合同签订日期")
handover_time = fields.Date(string="交接日期")
@api.onchange("term_start_time", "term_end_time",
"increments_every_few_years", "unit_price",
"first_years_begin", "increment_method",
"increment_price", "increment_percentage", "increment_amount",
"rent_free_period_year", "rent_free_period_month", "total_area")
def onchange_first_year_rent(self):
for record in self:
# 计算首年
if not record.term_start_time:
raise UserError(_("请填写租期开始时间!"))
if not record.term_end_time:
raise UserError(_("请填写租期结束时间!"))
start_date = record.term_start_time
end_date = record.term_end_time + relativedelta(days=1)
if start_date + relativedelta(months=12) < end_date:
end_date = start_date + relativedelta(months=12)
all_period_rent = record.my_compute_all_period_rent(start_date, end_date)
record.first_year_rent = all_period_rent
all_start_date = record.term_start_time
all_end_date = record.term_end_time + relativedelta(days=1)
record.total_contract_receivables = record.my_compute_all_period_rent(all_start_date, all_end_date)
@api.onchange("term_end_time", "term_start_time")
def onchange_term_end_time(self):
for record in self:
@@ -111,7 +139,7 @@ class PropertyLeaseContract(models.Model):
year = record.lease_term_year if record.lease_term_year else 0
month = record.lease_term_month if record.lease_term_month else 0
months = year * 12 + month
record.term_end_time = record.term_start_time + relativedelta(months=months)
record.term_end_time = record.term_start_time + relativedelta(months=months) - relativedelta(days=1)
@staticmethod
def divide_time_range_fixed(start_time, end_time, months):
@@ -136,6 +164,78 @@ class PropertyLeaseContract(models.Model):
# start_time = end_of_range
# return time_ranges
def my_compute_all_period_rent(self, start_date, end_date):
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 # 月租金
unit_price = self.unit_price # 单价
rent_free_period_month = 0
# 先计算免租期
if self.rent_free_period_year:
rent_free_period_month += self.rent_free_period_year * 12
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)
all_period_rent = 0
if not increments_every_few_years:
# 计算剩余日期
delta = relativedelta(end_date, free_start)
months = delta.years * 12 + delta.months
all_period_rent += monthly_amount * months
else:
# 不递增年份的计算
increments_start = free_start # 平稳和递增开始
all_months = 0 # 第几月份
# 有免递增年份的计算
if first_years_begin:
first_index = 0 # 第几递增周期年
divided_year_segments = self.divide_time_range_fixed(start_date, end_date, 12)
for segment_year in divided_year_segments:
first_index += 1
increments_start = segment_year[1]
if first_years_begin and first_index > first_years_begin:
# 进入 递增时间 跳出平稳计费极端
break
delta = relativedelta(segment_year[1], segment_year[0])
months = delta.years * 12 + delta.months
for month in range(months):
all_months += 1
# 判断是否是免租期
if all_months > rent_free_period_month:
all_period_rent += monthly_amount
# 开始递增
divided_increments_segments = self.divide_time_range_fixed(increments_start, end_date, increments_every_few_years * 12)
index = 0 # 第几递增周期年
for increments_year in divided_increments_segments:
index += 1
"""
increment_percentage = fields.Float(string="递增百分比")
increment_price = fields.Float(string="递增单价")
increment_amount = fields.Float(string="递增金额")
"""
increments_month = 0
if self.increment_method == "increment_price" and self.increment_price:
unit_price = unit_price + self.increment_price
monthly_amount = self.total_area * unit_price
if self.increment_method == "percentage" and self.increment_percentage:
monthly_amount = monthly_amount * self.increment_percentage
if self.increment_method == "increment_amount" and self.increment_amount:
monthly_amount = monthly_amount + self.increment_amount
delta = relativedelta(increments_year[1], increments_year[0])
months = delta.years * 12 + delta.months
# 判断第几月份进入 付费租期
for month in range(months):
all_months += 1
# 判断是否是免租期
if all_months > rent_free_period_month:
increments_month += 1
if increments_month:
all_period_rent += monthly_amount * increments_month
return all_period_rent
def action_generate_rental_charges(self):
"""
生成租金费用明细
@@ -149,64 +249,9 @@ class PropertyLeaseContract(models.Model):
self.sudo().env["property.rent.list"].search([("contract_id", "=", record.id)]).unlink()
start_date = record.term_start_time
end_date = record.term_end_time
first_years_begin = record.first_years_begin if record.first_years_begin else 0
increments_every_few_years = record.increments_every_few_years
monthly_amount = record.total_area * record.unit_price # 月租金
unit_price = record.unit_price # 单价
rent_free_period_month = 0
# 先计算免租期
if record.rent_free_period and not record.rent_free_period_uom:
raise UserError("请先填写免租期的单位!")
end_date = record.term_end_time + relativedelta(days=1)
all_period_rent = record.my_compute_all_period_rent(start_date, end_date)
if record.rent_free_period and record.rent_free_period_uom:
if record.rent_free_period_uom == "year":
rent_free_period_month = record.rent_free_period * 12
if record.rent_free_period_uom == "month":
rent_free_period_month = record.rent_free_period
free_start = start_date # 免租期开始
if rent_free_period_month:
free_start = start_date + relativedelta(months=rent_free_period_month)
first_index = 0 # 第几递增周期年
increments_start = free_start # 平稳和递增开始
all_period_rent = 0
if not increments_every_few_years:
delta = relativedelta(end_date, free_start)
months = delta.years * 12 + delta.months
all_period_rent += monthly_amount * months
else:
# 不递增年份的计算
if first_years_begin:
divided_year_segments = self.divide_time_range_fixed(free_start, end_date, 12)
for segment_year in divided_year_segments:
first_index += 1
if first_years_begin and first_index > first_years_begin:
increments_start = segment_year[0]
break
delta = relativedelta(increments_start, free_start)
months = delta.years * 12 + delta.months
all_period_rent = all_period_rent + (monthly_amount * months)
# 开始递增
divided_increments_segments = self.divide_time_range_fixed(increments_start, end_date, increments_every_few_years * 12)
index = 0 # 第几递增周期年
for increments_year in divided_increments_segments:
index += 1
"""
increment_percentage = fields.Float(string="递增百分比")
increment_price = fields.Float(string="递增单价")
increment_amount = fields.Float(string="递增金额")
"""
delta = relativedelta(increments_year[1], increments_year[0])
months = delta.years * 12 + delta.months
if record.increment_method == "increment_price" and record.increment_price:
unit_price = unit_price + record.increment_price
monthly_amount = record.total_area * unit_price
if record.increment_method == "percentage" and record.increment_percentage:
monthly_amount = monthly_amount * record.increment_percentage
if record.increment_method == "increment_amount" and record.increment_amount:
monthly_amount = monthly_amount + record.increment_amount
all_period_rent += monthly_amount * months
self.sudo().env["property.rent.list"].create({
"contract_id": record.id,
"contract_code": record.code,
@@ -254,7 +299,7 @@ class PropertyLeaseContract(models.Model):
self.sudo().env["property.rent.breakdown.line"].search([("breakdown_id", "=", record.id)]).unlink()
start_date = record.term_start_time
end_date = record.term_end_time
end_date = record.term_end_time + relativedelta(days=1)
first_years_begin = record.first_years_begin if record.first_years_begin else 0
increments_every_few_years = record.increments_every_few_years
@@ -262,14 +307,10 @@ class PropertyLeaseContract(models.Model):
unit_price = record.unit_price # 单价
rent_free_period_month = 0
# 先计算免租期
if record.rent_free_period and not record.rent_free_period_uom:
raise UserError("请先填写免租期的单位!")
if record.rent_free_period and record.rent_free_period_uom:
if record.rent_free_period_uom == "year":
rent_free_period_month = record.rent_free_period * 12
if record.rent_free_period_uom == "month":
rent_free_period_month = record.rent_free_period
if record.rent_free_period_year:
rent_free_period_month += record.rent_free_period_year * 12
if record.rent_free_period_month:
rent_free_period_month += record.rent_free_period_month
free_start = start_date # 免租期开始
if rent_free_period_month:
free_start = start_date + relativedelta(months=rent_free_period_month)
@@ -278,7 +319,7 @@ class PropertyLeaseContract(models.Model):
"monthly_amount": monthly_amount,
"breakdown_id": record.id,
"start_data": start_date,
"end_data": free_start,
"end_data": free_start - relativedelta(days=1),
"month_number": rent_free_period_month,
"period_rent": 0,
})
@@ -294,36 +335,50 @@ class PropertyLeaseContract(models.Model):
"monthly_amount": monthly_amount,
"breakdown_id": record.id,
"start_data": increments_start,
"end_data": end_date,
"end_data": end_date - relativedelta(days=1),
"month_number": months,
"period_rent": monthly_amount * months,
})
# 如果有递增
else:
first_index = 0 # 第几递增周期年
all_months = 0 # 第几月份
# 有免递增年份的计算
if first_years_begin:
divided_year_segments = self.divide_time_range_fixed(free_start, end_date, 12)
first_index = 0 # 第几递增周期年
first_period_rent = 0 # 总收费
first_months = 0
divided_year_segments = self.divide_time_range_fixed(start_date, end_date, 12)
for segment_year in divided_year_segments:
first_index += 1
increments_start = segment_year[1]
if first_years_begin and first_index > first_years_begin:
increments_start = segment_year[0]
# 进入 递增时间 跳出平稳计费极端
break
delta = relativedelta(increments_start, free_start)
months = delta.years * 12 + delta.months
self.sudo().env["property.rent.breakdown.line"].create({
"unit_price": unit_price,
"monthly_amount": monthly_amount,
"breakdown_id": record.id,
"start_data": free_start,
"end_data": increments_start,
"month_number": months,
"period_rent": monthly_amount * months,
})
delta = relativedelta(segment_year[1], segment_year[0])
months = delta.years * 12 + delta.months
# 判断第几月份进入 付费租期
for month in range(months):
all_months += 1
# 判断是否是免租期
if all_months > rent_free_period_month:
first_period_rent += monthly_amount
first_months += 1
if first_period_rent:
self.sudo().env["property.rent.breakdown.line"].create({
"unit_price": unit_price,
"monthly_amount": monthly_amount,
"breakdown_id": record.id,
"start_data": increments_start - relativedelta(months=first_months),
"end_data": increments_start - relativedelta(days=1),
"month_number": first_months,
"period_rent": first_period_rent,
})
# 开始递增
divided_increments_segments = self.divide_time_range_fixed(increments_start, end_date, increments_every_few_years*12)
index = 0 # 第几递增周期年
for increments_year in divided_increments_segments:
index += 1
"""
@@ -331,29 +386,47 @@ class PropertyLeaseContract(models.Model):
increment_price = fields.Float(string="递增单价")
increment_amount = fields.Float(string="递增金额")
"""
delta = relativedelta(increments_year[1], increments_year[0])
months = delta.years * 12 + delta.months
increments_month = 0
# delta = relativedelta(increments_year[1], increments_year[0])
# months = delta.years * 12 + delta.months
if record.increment_method == "increment_price" and record.increment_price:
unit_price = unit_price + record.increment_price
monthly_amount = record.total_area * unit_price
if record.increment_method == "percentage" and record.increment_percentage:
monthly_amount = monthly_amount * record.increment_percentage
unit_price = monthly_amount / record.total_area
if record.increment_method == "increment_amount" and record.increment_amount:
monthly_amount = monthly_amount + record.increment_amount
self.sudo().env["property.rent.breakdown.line"].create({
"unit_price": unit_price,
"monthly_amount": monthly_amount,
"breakdown_id": record.id,
"start_data": increments_year[0],
"end_data": increments_year[1],
"month_number": months,
"period_rent": monthly_amount * months,
})
unit_price = monthly_amount / record.total_area
delta = relativedelta(increments_year[1], increments_year[0])
months = delta.years * 12 + delta.months
# 判断第几月份进入 付费租期
for month in range(months):
# 判断第几月份进入 付费租期
all_months += 1
# 判断是否是免租期
if all_months > rent_free_period_month:
increments_month += 1
if increments_month:
self.sudo().env["property.rent.breakdown.line"].create({
"unit_price": unit_price,
"monthly_amount": monthly_amount,
"breakdown_id": record.id,
"start_data": increments_year[1] - relativedelta(months=increments_month),
"end_data": increments_year[1] - relativedelta(days=1),
"month_number": increments_month,
"period_rent": monthly_amount * increments_month,
})
@api.onchange("first_year_rent")
def _onchange_first_year_rent(self):
for rec in self:
rec.deposit = rec.first_year_rent * 2
rec.performance_bonds = rec.first_year_rent * 2
@api.onchange("total_area", "unit_price")
def _onchange_deposit(self):
for record in self:
record.deposit = record.total_area * record.unit_price * 2 # 月租金
class PropertyLeaseContractLine(models.Model):
_name = 'property.lease.contract.line'
@@ -56,9 +56,11 @@
<label for="lease_term_year"/>
<div class="d-inline-flex w-100">
<field name="lease_term_year"/>
<field name="lease_term_year_uom" />
年
<!-- <field name="lease_term_year_uom" />-->
<field name="lease_term_month"/>
<field name="lease_term_month_uom" />
月
<!-- <field name="lease_term_month_uom" />-->
</div>
<field name="term_start_time"/>
<field name="term_end_time" />
@@ -73,10 +75,12 @@
</group>
<group>
<label for="rent_free_period"/>
<label for="rent_free_period_year"/>
<div class="d-inline-flex w-100">
<field name="rent_free_period"/>
<field name="rent_free_period_uom" required="rent_free_period"/>
<field name="rent_free_period_year"/>
年
<field name="rent_free_period_month"/>
月
</div>
<field name="first_years_begin"/>
<field name="increments_every_few_years"/>
@@ -94,6 +98,7 @@
<group>
<field name="unit_price"/>
<field name="tax"/>
<field name="performance_bonds"/>
</group>
<group>
<field name="deposit"/>