Использовать значения из предыдущей строки для агрегирования значений, если строка отсутствует - PullRequest
0 голосов
/ 10 января 2019

У меня есть целая куча строк, содержащих налоговые платежи.

Каждая строка содержит PaymentDueDate.

Если строка отсутствует в промежутке между PaymentDueDate с, я должен использовать те же значения из предыдущей строки, чтобы агрегировать для всех итогов.

В приведенном ниже примере между Row="2" и Row="3" отсутствуют данные за месяцы 2015/09, 2015/10, 2015/11, 2015/12, 2016/01, 2016/02.

Итак, я должен использовать значения Row="2", чтобы использовать их для учета пропущенных строк.

<PaymentChangeMaintenance>
  <PaymentChangeMaintenanceTransaction Row="1">
         <BuydownSubsidyAmount>0.00</BuydownSubsidyAmount>
         <AnnualInterestRate>4.75000</AnnualInterestRate>
         <PIAmount>689.79</PIAmount>
         <PaymentDueDate>2015-07-01</PaymentDueDate>
         <CityTaxAmount>23.22</CityTaxAmount>
         <CountyTaxAmount>32.25</CountyTaxAmount>
  </PaymentChangeMaintenanceTransaction>
  <PaymentChangeMaintenanceTransaction Row="2">
         <BuydownSubsidyAmount>0.00</BuydownSubsidyAmount>
         <AnnualInterestRate>4.75000</AnnualInterestRate>
         <PIAmount>689.79</PIAmount>
         <PaymentDueDate>2015-08-01</PaymentDueDate>
         <CityTaxAmount>125.25</CityTaxAmount>
         <CountyTaxAmount>666.22</CountyTaxAmount>
  </PaymentChangeMaintenanceTransaction>
  <PaymentChangeMaintenanceTransaction Row="3">
         <BuydownSubsidyAmount>0.00</BuydownSubsidyAmount>
         <AnnualInterestRate>4.75000</AnnualInterestRate>
         <PIAmount>689.79</PIAmount>
         <PaymentDueDate>2016-03-01</PaymentDueDate>
         <CityTaxAmount>125.25</CityTaxAmount>
         <CountyTaxAmount>666.22</CountyTaxAmount>
  </PaymentChangeMaintenanceTransaction>
</PaymentChangeMaintenance>

Вот код, который кто-то написал, но он не выглядит чисто. Я хотел бы использовать для каждого: /

private void aggregateEscrowPaymountAmounts(List<PaymentChangeMaintenanceFieldsV214Type> fieldsType,
             PaymentChangeMaintenance paymentChangeMaintenance, final int numberOfTrialPayments) {
     AtomicInteger cnt = new AtomicInteger(1);
     Iterator<PaymentChangeMaintenanceFieldsV214Type> fieldsTypeIterator = fieldsType.iterator();
     PaymentChangeMaintenanceFieldsV214Type fieldType = fieldsTypeIterator.next();
     PaymentChangeMaintenanceFieldsV214Type nextFieldType = null;
     if (fieldsTypeIterator.hasNext()) {
                nextFieldType = fieldsTypeIterator.next();
     }
     LocalDate monthDate = fieldType.getNextPaymentDueDate();

     while (cnt.getAndIncrement() <= numberOfTrialPayments) {
                PaymentChangeMaintenance tempPaymentChangeMaintenance = createPaymentChangeMaintenanceEscrow(fieldType);
                paymentChangeMaintenance.aggregate(tempPaymentChangeMaintenance);
                monthDate = monthDate.plusMonths(1);
                if (nextFieldType != null) {
                       LocalDate nextFieldTypeDate = nextFieldType.getNextPaymentDueDate();

                       if (nextFieldTypeDate.getMonthValue() == monthDate.getMonthValue()) {
                               fieldType = nextFieldType;
                               if (fieldsTypeIterator.hasNext()) {
                                      nextFieldType = fieldsTypeIterator.next();
                               } else {
                                      nextFieldType = null;
                               }
                       }
                }
     }
}

1 Ответ

0 голосов
/ 10 января 2019

Для этого конкретного случая вы можете использовать следующий подход: определить шаг - для вас это месяц. Затем инициализируйте значение по умолчанию для случая отсутствия значения на следующем шаге. Затем используйте некоторый метод, который примет следующее значение и значение по умолчанию и зависит от наличия шага, вернет один из них Вот псевдокод:

List<Item> items;
Item nextItem = items.get(0);
Value step = month;
for (int i = 1; i < items.size(); i++) {
  nextItem = getNextItem(items.get(i), nextItem, step);
  ****
}


Item getNextItem(Item nextItem, Item defaultItem, Value step) {
    if (!nextItem.getStepValue().equals(calcNext(step))) {
        return defaultItem;
    } else {
        return nextItem;
    }
}

StepValue calcNext(Value step) {
    /*some calculations. In your case month increment*/
}
...