You've already forked AstralRinth
forked from didirus/AstralRinth
Changes to handling of refunds in Anrok (#4556)
* Use negations, track transaction version/accounting time, use original charge accounting time in refunds * query cache * chore: query cache, clippy, fmt * Fix tax drift calculation * Fix migration * Increase update_tax_transactions rate
This commit is contained in:
committed by
GitHub
parent
b23d3e674f
commit
5db5bf4c4c
@@ -267,6 +267,24 @@ pub async fn refund_charge(
|
||||
.tax_identifier
|
||||
.tax_processor_id;
|
||||
|
||||
let Some((
|
||||
(
|
||||
original_tax_platform_id,
|
||||
original_tax_transaction_version,
|
||||
),
|
||||
original_tax_platform_accounting_time,
|
||||
)) = charge
|
||||
.tax_platform_id
|
||||
.clone()
|
||||
.zip(charge.tax_transaction_version)
|
||||
.zip(charge.tax_platform_accounting_time)
|
||||
else {
|
||||
return Err(ApiError::InvalidInput(
|
||||
"Charge is missing full tax information. Please wait for the original charge to be synchronized with the tax processor."
|
||||
.to_owned(),
|
||||
));
|
||||
};
|
||||
|
||||
let refund = stripe::Refund::create(
|
||||
&stripe_client,
|
||||
CreateRefund {
|
||||
@@ -281,13 +299,16 @@ pub async fn refund_charge(
|
||||
)
|
||||
.await?;
|
||||
|
||||
let anrok_txn_result = anrok_client.create_or_update_txn(
|
||||
let anrok_txn_result = anrok_client.negate_or_create_partial_negation(
|
||||
original_tax_platform_id,
|
||||
original_tax_transaction_version,
|
||||
charge.amount + charge.tax_amount,
|
||||
&anrok::Transaction {
|
||||
id: anrok::transaction_id_stripe_pyr(&refund.id),
|
||||
fields: anrok::TransactionFields {
|
||||
customer_address: anrok::Address::from_stripe_address(&billing_address),
|
||||
currency_code: charge.currency_code.clone(),
|
||||
accounting_time: Utc::now(),
|
||||
accounting_time: original_tax_platform_accounting_time,
|
||||
accounting_time_zone: anrok::AccountingTimeZone::Utc,
|
||||
line_items: vec![anrok::LineItem::new_including_tax_amount(tax_id, -refund_amount)],
|
||||
customer_id: Some(format!("stripe:cust:{}", user.stripe_customer_id.unwrap_or_else(|| "unknown".to_owned()))),
|
||||
@@ -347,6 +368,8 @@ pub async fn refund_charge(
|
||||
currency_code: charge.currency_code,
|
||||
tax_last_updated: Some(Utc::now()),
|
||||
tax_drift_loss: Some(0),
|
||||
tax_transaction_version: None,
|
||||
tax_platform_accounting_time: None,
|
||||
}
|
||||
.upsert(&mut transaction)
|
||||
.await?;
|
||||
@@ -1641,6 +1664,8 @@ pub async fn stripe_webhook(
|
||||
net: None,
|
||||
tax_last_updated: Some(Utc::now()),
|
||||
tax_drift_loss: Some(0),
|
||||
tax_transaction_version: None,
|
||||
tax_platform_accounting_time: None,
|
||||
};
|
||||
|
||||
if charge_status != ChargeStatus::Failed {
|
||||
@@ -2004,6 +2029,8 @@ pub async fn stripe_webhook(
|
||||
tax_platform_id: None,
|
||||
tax_last_updated: Some(Utc::now()),
|
||||
tax_drift_loss: Some(0),
|
||||
tax_transaction_version: None,
|
||||
tax_platform_accounting_time: None,
|
||||
}
|
||||
.upsert(&mut transaction)
|
||||
.await?;
|
||||
|
||||
Reference in New Issue
Block a user