合同开始日期:2023-01-01,结束日期:2026-01-01,免租起始期:2023-01-01,免租终止日期:023-01-31,计费面积:100平方米,月租单价20/平方米,计算方式:每3月计算产生一条记录,收款方式为按3个月收一次,提前收款期为1个月,基本租期1年,超过基本租期后按1年一个递增周期,递增周期内月租单价按上一周期内月租单价递增一次,年递增率为6%;按java7来实现:按计算方式产生合同期内含收款日期、租期起始日期、租期终止日期、租期单价、租期(月数)租金的计划列表,生成一个完整示例并配上说明
时间: 2024-01-31 22:03:38 浏览: 22
好的,我理解了你的问题。这是一个租赁合同,合同开始日期为2023年1月1日,结束日期为2026年1月1日,计费面积为100平方米,月租单价为20元/平方米。免租起始期为2023年1月1日,免租终止日期为2023年1月31日。
根据计算方式,每3个月计算一次租金,收款方式为按3个月收一次,提前收款期为1个月。基本租期为1年,超过基本租期后按1年一个递增周期,递增周期内月租单价按上一周期内月租单价递增一次,年递增率为6%。
我们可以按照以下步骤来生成合同期内含收款日期、租期起始日期、租期终止日期、租期单价、租期(月数)租金的计划列表:
1. 首先确定合同期内的所有月份,包括基本租期和递增周期。在这个示例中,我们需要计算2023年1月到2026年1月的所有月份。
2. 对于每个月份,确定该月份是否需要产生一条租金记录。如果该月份在免租期内,则不需要产生租金记录;如果该月份在合同结束日期之后,则也不需要产生租金记录。
3. 对于需要产生租金记录的月份,计算该月份的租金。如果该月份在基本租期内,则按照初始的月租单价计算租金;如果该月份在递增周期内,则按照递增后的月租单价计算租金。
4. 对于每个需要产生租金记录的月份,生成一条租金计划记录,包括收款日期、租期起始日期、租期终止日期、租期单价、租期(月数)和租金金额等信息。
下面是一个完整的示例,以2023年1月至2026年1月为例:
```java
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
public class LeaseContract {
private static final BigDecimal INITIAL_MONTHLY_RENT = BigDecimal.valueOf(20); // 初始月租单价
private static final BigDecimal ANNUAL_INCREMENT_RATE = BigDecimal.valueOf(0.06); // 年递增率
private static final int PAYMENT_INTERVAL = 3; // 收款间隔(月数)
private static final int ADVANCE_PAYMENT_INTERVAL = 1; // 提前收款期(月数)
private static final int BASIC_LEASE_TERM = 12; // 基本租期(月数)
private static final int INCREMENTAL_LEASE_TERM = 12; // 递增租期(月数)
private static final BigDecimal FREE_RENT_AREA = BigDecimal.valueOf(31.0); // 免租面积(平方米)
private static final LocalDate LEASE_START_DATE = LocalDate.of(2023, 1, 1); // 租期起始日期
private static final LocalDate LEASE_END_DATE = LocalDate.of(2026, 1, 1); // 租期终止日期
private static final LocalDate FREE_RENT_START_DATE = LocalDate.of(2023, 1, 1); // 免租期起始日期
private static final LocalDate FREE_RENT_END_DATE = LocalDate.of(2023, 1, 31); // 免租期终止日期
private static final BigDecimal AREA = BigDecimal.valueOf(100); // 计费面积(平方米)
public static void main(String[] args) {
List<LeasePlan> leasePlans = new ArrayList<>(); // 存储租金计划列表的容器
LocalDate currentDate = LEASE_START_DATE;
BigDecimal currentMonthlyRent = INITIAL_MONTHLY_RENT; // 当前月租单价
while (currentDate.isBefore(LEASE_END_DATE)) {
int remainingMonths = (int) ChronoUnit.MONTHS.between(currentDate, LEASE_END_DATE);
int currentLeaseTerm = remainingMonths >= INCREMENTAL_LEASE_TERM ? INCREMENTAL_LEASE_TERM : BASIC_LEASE_TERM;
if (currentDate.isBefore(FREE_RENT_END_DATE)) { // 在免租期内
currentDate = FREE_RENT_END_DATE; // 跳过免租期
} else if (remainingMonths < BASIC_LEASE_TERM) { // 剩余租期不足基本租期
currentLeaseTerm = remainingMonths; // 调整租期为剩余租期
}
BigDecimal currentRentAmount = currentMonthlyRent.multiply(AREA); // 当前月租金金额
LeasePlan leasePlan = new LeasePlan();
leasePlan.setPaymentDate(currentDate.plusMonths(ADVANCE_PAYMENT_INTERVAL)); // 收款日期
leasePlan.setLeaseStartDate(currentDate); // 租期起始日期
leasePlan.setLeaseEndDate(currentDate.plusMonths(currentLeaseTerm).minusDays(1)); // 租期终止日期
leasePlan.setMonthlyRent(currentMonthlyRent); // 租期单价
leasePlan.setLeaseTerm(currentLeaseTerm); // 租期(月数)
leasePlan.setRentAmount(currentRentAmount); // 租金金额
leasePlans.add(leasePlan); // 添加租金计划记录
currentDate = currentDate.plusMonths(PAYMENT_INTERVAL); // 更新当前日期
if (ChronoUnit.YEARS.between(LEASE_START_DATE, currentDate) % INCREMENTAL_LEASE_TERM == 0) { // 进入一个递增周期
currentMonthlyRent = currentMonthlyRent.add(currentMonthlyRent.multiply(ANNUAL_INCREMENT_RATE)); // 更新月租单价
}
}
// 输出租金计划列表
for (LeasePlan leasePlan : leasePlans) {
System.out.println(leasePlan);
}
}
}
class LeasePlan {
private LocalDate paymentDate; // 收款日期
private LocalDate leaseStartDate; // 租期起始日期
private LocalDate leaseEndDate; // 租期终止日期
private BigDecimal monthlyRent; // 租期单价
private int leaseTerm; // 租期(月数)
private BigDecimal rentAmount; // 租金金额
// 省略构造方法和getter/setter方法
@Override
public String toString() {
return "LeasePlan{" +
"paymentDate=" + paymentDate +
", leaseStartDate=" + leaseStartDate +
", leaseEndDate=" + leaseEndDate +
", monthlyRent=" + monthlyRent +
", leaseTerm=" + leaseTerm +
", rentAmount=" + rentAmount +
'}';
}
}
```
在上面的示例中,我们定义了一个 `LeaseContract` 类来生成租金计划列表,以及一个 `LeasePlan` 类来存储每个月份的租金计划记录。在 `LeaseContract` 类中,我们使用一个 `while` 循环来遍历合同期内的所有月份,并根据当前月份的情况来计算该月份的租金。在每个需要产生租金记录的月份,我们都生成一条 `LeasePlan` 记录,并将其添加到租金计划列表中。最后,我们输出租金计划列表,以便查看每个月份的租金计划记录。