Как это сделать ... Давайте выделим пару методов, чтобы лучше видеть логику.
private void a() {
entry2.setDebit(adjustment.total);
entry2.setCredit(0d);
}
private void b() {
entry2.setCredit(adjustment.total);
entry2.setDebit(0d);
}
if (adjustment.adjustmentAccount.isIncrease) {
if (adjustment.increaseVATLine) {
if (adjustment.vatItem.isSalesType) {
a();
} else {
b();
}
} else {
if (adjustment.vatItem.isSalesType) {
b();
} else {
a();
}
}
} else {
if (adjustment.increaseVATLine) {
if (adjustment.vatItem.isSalesType) {
b();
} else {
a();
}
} else {
if (adjustment.vatItem.isSalesType) {
a();
} else {
b();
}
}
Итак, теперь, глядя на это, этот первый блок
if (adjustment.increaseVATLine) {
if (adjustment.vatItem.isSalesType) {
a();
} else {
b();
}
} else {
if (adjustment.vatItem.isSalesType) {
b();
} else {
a();
}
}
равносильно выполнению a()
, если adjustment.increaseVATLine
имеет то же значение, что и adjustment.vatItem.isSalesType
, b()
в противном случае. Таким образом, мы можем уменьшить его:
if (adjustment.adjustmentAccount.isIncrease) {
if (adjustment.increaseVATLine == adjustment.vatItem.isSalesType) {
a();
} else {
b();
}
} else {
if (adjustment.increaseVATLine) {
if (adjustment.vatItem.isSalesType) {
b();
} else {
a();
}
} else {
if (adjustment.vatItem.isSalesType) {
a();
} else {
b();
}
}
}
А оставшийся блок такой же, просто поменять местами a()
и b()
:
if (adjustment.adjustmentAccount.isIncrease) {
if (adjustment.increaseVATLine == adjustment.vatItem.isSalesType) {
a();
} else {
b();
}
} else {
if (adjustment.increaseVATLine == adjustment.vatItem.isSalesType) {
b();
} else {
a();
}
}
Итак, мы начинаем видеть логику. Если это увеличение, а увеличениеVATLine соответствует isSalesType, то мы дебетуем, в противном случае кредитуем, но если это уменьшение, то мы кредитуем только в том случае, если они не совпадают. Какой хороший способ выразить это? Ну, например, назовите a () и b () умнее - теперь, когда мы можем видеть, что они делают
if (adjustment.adjustmentAccount.isIncrease) {
if (adjustment.increaseVATLine == adjustment.vatItem.isSalesType) {
debitEntry();
} else {
creditEntry();
}
} else {
if (adjustment.increaseVATLine == adjustment.vatItem.isSalesType) {
creditEntry();
} else {
debitEntry();
}
}
А теперь все еще немного яснее. Дебетовать счет, если это счет увеличения и строка НДС с повышением, а также тип продаж, или когда это уменьшение, либо это строка с уменьшением НДС, ИЛИ это тип продажи, но не оба. Эта таблица истинности помогает? Первый столбец adjustmentAmount.isIncrease
; второй adjustment.increaseVATLine
; третий adjustment.vatItem.isSalesType
. Четвертый столбец - D для дебета, C для кредита; в скобках указано количество значений ИСТИНА среди флагов.
TTT -> D (3)
TFF -> D (1)
TTF -> C (2)
TFT -> C (2)
FTT -> C (2)
FFF -> C (0)
FTF -> D (1)
FFT -> D (1)
Теперь вы можете понять, почему работает решение @Xavier Ho; нечетные суммы - все дебеты, четные - все кредиты.
Это всего лишь один исследовательский путь; Я надеюсь, что это полезно.