-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix adjustments #25
fix adjustments #25
Conversation
src/main/java/dev/vality/disputes/schedule/service/AdjustmentExtractor.java
Show resolved
Hide resolved
.orElse(String.format(DISPUTE_MASK, dispute.getId())); | ||
} | ||
|
||
public boolean isCashFlowAdjustmentByDisputeExist(InvoicePayment invoicePayment, Dispute dispute) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
2 метода здесь - найти корректировки которые теоретически _уже _ породил диспутс апи, идемпотености кейс
if (!adjustmentExtractor.isCashFlowAdjustmentByDisputeExist(invoicePayment, dispute) | ||
&& !Objects.equals(dispute.getAmount(), dispute.getChangedAmount())) { | ||
var params = invoicePaymentCashFlowAdjustmentParamsConverter.convert(dispute); | ||
var paymentAdjustment = createAdjustment(dispute, params); | ||
if (paymentAdjustment == null) { | ||
log.error("Trying to set failed Dispute status with INVOICE_NOT_FOUND error reason {}", dispute.getId()); | ||
disputeDao.update(dispute.getId(), DisputeStatus.failed, ErrorReason.INVOICE_NOT_FOUND); | ||
log.debug("Dispute status has been set to failed {}", dispute.getId()); | ||
var errorReason = ErrorReason.INVOICE_NOT_FOUND; | ||
updateFailed(dispute, errorReason); | ||
return; | ||
} | ||
} catch (InvoicingPaymentStatusPendingException e) { | ||
// в теории 0%, что сюда попадает выполнение кода, но если попадет, то: | ||
// платеж с не финальным статусом будет заблочен для создания корректировок на стороне хелгейта | ||
// и тогда диспут будет пулиться, пока платеж не зафиналится, | ||
// и тк никакой записи в коде выше нет, то пуллинг не проблема | ||
// а запрос в checkDisputeStatus по идемпотентности просто вернет тот же success | ||
log.error("Error when hg.createPaymentAdjustment() got payments status pending {}", dispute.getId(), e); | ||
return; | ||
} else { | ||
log.info("Creating CashFlowAdjustment was skipped {}", dispute); | ||
} | ||
if (!adjustmentExtractor.isCapturedAdjustmentByDisputeExist(invoicePayment, dispute)) { | ||
if (status.isSetCaptured()) { | ||
var params = invoicePaymentFailedAdjustmentParamsConverter.convert(dispute); | ||
var paymentAdjustment = createAdjustment(dispute, params); | ||
if (paymentAdjustment == null) { | ||
updateFailed(dispute, ErrorReason.INVOICE_NOT_FOUND); | ||
return; | ||
} | ||
} | ||
var params = invoicePaymentCapturedAdjustmentParamsConverter.convert(dispute); | ||
var paymentAdjustment = createAdjustment(dispute, params); | ||
if (paymentAdjustment == null) { | ||
updateFailed(dispute, ErrorReason.INVOICE_NOT_FOUND); | ||
return; | ||
} | ||
} else { | ||
log.info("Creating CapturedAdjustment was skipped {}", dispute); | ||
} | ||
log.info("Trying to set succeeded Dispute status {}", dispute); | ||
disputeDao.update(dispute.getId(), DisputeStatus.succeeded); | ||
log.debug("Dispute status has been set to succeeded {}", dispute.getId()); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
логика по результату обсуждения:
- обновили корретировкой сумму (если не совпадает)
- перевели корретировкой в успех
оценка потенциальных конфликтов \ коллизий:
- сторонний источник изменял корректировкой сумму (тг бот (через админскую ручку)\КЦ\др) - не влияет тк по словам коллег для сверок и как знание используется последняя корректировка
- сторонний источник изменял корректировкой статус (тг бот (через админскую ручку)\КЦ\др) - не влияет тк 1. обрабатыываем только финальынй статус 2.фейково фейлим через доп.корректировку в случае успеха платежа и накатываем сверху корректирвку на успех платежа - в итоге в любом случае успех будет
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
убрал кетчер исключения тк мы перезапускаем шедулер так и так
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
еще тут момент , даже если исполнятся 2 запроса корректировки до финализации и сервис выкинет исключение, затем пойдет заново проводить 2 корректировки (на сумму и фейл) , на результат это не повлияет
по крайней мере дубли на сумме ничего страшного, тк последняя сумма считается знанием
а с фейлом будет так если по порядку - 1) накатили фейл на платеж 2) исключение 3) накатили сумму 4) платеж в успехе? нет 5) скипнули шаг с фейлом и накатили успех и так по кругу если будут исключения
.../dev/vality/disputes/schedule/converter/InvoicePaymentCashFlowAdjustmentParamsConverter.java
Show resolved
Hide resolved
...va/dev/vality/disputes/schedule/converter/InvoicePaymentFailedAdjustmentParamsConverter.java
Outdated
Show resolved
Hide resolved
@@ -10,7 +10,7 @@ public interface CallbackNotifier { | |||
|
|||
void sendDisputePoolingExpired(Dispute dispute); | |||
|
|||
void sendDisputeReadyForCreateAdjustment(List<Dispute> disputes); | |||
void sendDisputesReadyForCreateAdjustment(List<Dispute> disputes); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- в AccessService проверяется платеж, если не финальный статус, то возвращается 400 наружу (то есть не даем создать диспут в нефинальном статусе платежа) . все таки когда даем создать диспут, не учитывая статус платежа мы создаем пространство для коллизий: 1) платеж%пендинг диспут%создали , затем платеж%успех диспут%идет_в_провайдера - диспут успех на успех платежа? 2) платеж%пендинг диспут%создали , затем платеж%успех диспут%успех(сразу) - то есть это спор с тем что платеж в пендинге был? 3) более выраженный кейс когда создается диспут при платеже в captured для изменения суммы , иначе нам как то разелять , что отдельно есть запрос captured для изменения суммы и отдельно запрос когда платеж был pending а стал captured (диспут для которого надо в успех финалить) . будет проще - пендинг - нехуй лезть, убьет
- преименовал sendDisputeReady
- переименовал CreateAdjustments* в Adjustments
- сложил основные сервисы в пакет .core.*
- убрал проверку в пакете .core.*
if (!status.isSetCaptured() && !status.isSetCancelled() && !status.isSetFailed()) {
(тк переносим на AccessService - при такой логике тест testSkipDisputeWhenPaymentNonFinalStatus не актуален
No description provided.