Skip to content
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

Merged
merged 3 commits into from
Oct 31, 2024
Merged

fix adjustments #25

merged 3 commits into from
Oct 31, 2024

Conversation

karle0wne
Copy link
Collaborator

No description provided.

.orElse(String.format(DISPUTE_MASK, dispute.getId()));
}

public boolean isCashFlowAdjustmentByDisputeExist(InvoicePayment invoicePayment, Dispute dispute) {
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 метода здесь - найти корректировки которые теоретически _уже _ породил диспутс апи, идемпотености кейс

Comment on lines 73 to 106
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());
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

логика по результату обсуждения:

  1. обновили корретировкой сумму (если не совпадает)
  2. перевели корретировкой в успех

оценка потенциальных конфликтов \ коллизий:

  1. сторонний источник изменял корректировкой сумму (тг бот (через админскую ручку)\КЦ\др) - не влияет тк по словам коллег для сверок и как знание используется последняя корректировка
  2. сторонний источник изменял корректировкой статус (тг бот (через админскую ручку)\КЦ\др) - не влияет тк 1. обрабатыываем только финальынй статус 2.фейково фейлим через доп.корректировку в случае успеха платежа и накатываем сверху корректирвку на успех платежа - в итоге в любом случае успех будет

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

убрал кетчер исключения тк мы перезапускаем шедулер так и так

Copy link
Collaborator Author

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) скипнули шаг с фейлом и накатили успех и так по кругу если будут исключения

@@ -10,7 +10,7 @@ public interface CallbackNotifier {

void sendDisputePoolingExpired(Dispute dispute);

void sendDisputeReadyForCreateAdjustment(List<Dispute> disputes);
void sendDisputesReadyForCreateAdjustment(List<Dispute> disputes);
Copy link
Collaborator Author

@karle0wne karle0wne Oct 31, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

d1183c8

  • в AccessService проверяется платеж, если не финальный статус, то возвращается 400 наружу (то есть не даем создать диспут в нефинальном статусе платежа) . все таки когда даем создать диспут, не учитывая статус платежа мы создаем пространство для коллизий: 1) платеж%пендинг диспут%создали , затем платеж%успех диспут%идет_в_провайдера - диспут успех на успех платежа? 2) платеж%пендинг диспут%создали , затем платеж%успех диспут%успех(сразу) - то есть это спор с тем что платеж в пендинге был? 3) более выраженный кейс когда создается диспут при платеже в captured для изменения суммы , иначе нам как то разелять , что отдельно есть запрос captured для изменения суммы и отдельно запрос когда платеж был pending а стал captured (диспут для которого надо в успех финалить) . будет проще - пендинг - нехуй лезть, убьет
  • преименовал sendDisputeReady
  • переименовал CreateAdjustments* в Adjustments
  • сложил основные сервисы в пакет .core.*
  • убрал проверку в пакете .core.* if (!status.isSetCaptured() && !status.isSetCancelled() && !status.isSetFailed()) { (тк переносим на AccessService
  • при такой логике тест testSkipDisputeWhenPaymentNonFinalStatus не актуален

@karle0wne karle0wne merged commit e930555 into master Oct 31, 2024
2 of 3 checks passed
@karle0wne karle0wne deleted the ft/fix-adj branch October 31, 2024 12:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants