include refund fees in effective refund amount calculation
This commit is contained in:
parent
3eb88574bc
commit
79d0c2f928
@ -456,6 +456,7 @@ async function recordConfirmPay(
|
|||||||
refundsDone: {},
|
refundsDone: {},
|
||||||
refundsFailed: {},
|
refundsFailed: {},
|
||||||
refundsPending: {},
|
refundsPending: {},
|
||||||
|
refundsRefreshCost: {},
|
||||||
};
|
};
|
||||||
|
|
||||||
await ws.db.runWithWriteTransaction(
|
await ws.db.runWithWriteTransaction(
|
||||||
|
@ -144,6 +144,8 @@ async function acceptRefundResponse(
|
|||||||
const unfinishedRefunds: MerchantRefundDetails[] = [];
|
const unfinishedRefunds: MerchantRefundDetails[] = [];
|
||||||
const failedRefunds: MerchantRefundDetails[] = [];
|
const failedRefunds: MerchantRefundDetails[] = [];
|
||||||
|
|
||||||
|
const refundsRefreshCost: { [refundKey: string]: AmountJson } = {};
|
||||||
|
|
||||||
for (const rd of refunds) {
|
for (const rd of refunds) {
|
||||||
if (rd.exchange_http_status === 200) {
|
if (rd.exchange_http_status === 200) {
|
||||||
// FIXME: also verify signature if necessary.
|
// FIXME: also verify signature if necessary.
|
||||||
@ -158,6 +160,33 @@ async function acceptRefundResponse(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const rd of [...finishedRefunds, ...unfinishedRefunds]) {
|
||||||
|
const key = getRefundKey(rd);
|
||||||
|
const coin = await ws.db.get(Stores.coins, rd.coin_pub);
|
||||||
|
if (!coin) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const denom = await ws.db.getIndexed(
|
||||||
|
Stores.denominations.denomPubHashIndex,
|
||||||
|
coin.denomPubHash,
|
||||||
|
);
|
||||||
|
if (!denom) {
|
||||||
|
throw Error("inconsistent database");
|
||||||
|
}
|
||||||
|
const amountLeft = Amounts.sub(
|
||||||
|
Amounts.add(coin.currentAmount, Amounts.parseOrThrow(rd.refund_amount))
|
||||||
|
.amount,
|
||||||
|
Amounts.parseOrThrow(rd.refund_fee),
|
||||||
|
).amount;
|
||||||
|
const allDenoms = await ws.db
|
||||||
|
.iterIndex(
|
||||||
|
Stores.denominations.exchangeBaseUrlIndex,
|
||||||
|
coin.exchangeBaseUrl,
|
||||||
|
)
|
||||||
|
.toArray();
|
||||||
|
refundsRefreshCost[key] = getTotalRefreshCost(allDenoms, denom, amountLeft);
|
||||||
|
}
|
||||||
|
|
||||||
const now = getTimestampNow();
|
const now = getTimestampNow();
|
||||||
|
|
||||||
await ws.db.runWithWriteTransaction(
|
await ws.db.runWithWriteTransaction(
|
||||||
@ -282,6 +311,8 @@ async function acceptRefundResponse(
|
|||||||
console.log("refund query not done");
|
console.log("refund query not done");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p.refundsRefreshCost = {...p.refundsRefreshCost, ...refundsRefreshCost };
|
||||||
|
|
||||||
await tx.put(Stores.purchases, p);
|
await tx.put(Stores.purchases, p);
|
||||||
|
|
||||||
const coinsPubsToBeRefreshed = Object.values(refreshCoinsMap);
|
const coinsPubsToBeRefreshed = Object.values(refreshCoinsMap);
|
||||||
|
@ -63,6 +63,8 @@ function getRefundStats(
|
|||||||
.amount;
|
.amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Subtract fees from effective refund amount
|
||||||
|
|
||||||
for (const rk of Object.keys(pr.refundsDone)) {
|
for (const rk of Object.keys(pr.refundsDone)) {
|
||||||
const perm = pr.refundsDone[rk].perm;
|
const perm = pr.refundsDone[rk].perm;
|
||||||
if (pr.refundsDone[rk].refundGroupId !== refundGroupId) {
|
if (pr.refundsDone[rk].refundGroupId !== refundGroupId) {
|
||||||
@ -72,6 +74,12 @@ function getRefundStats(
|
|||||||
amountEffective,
|
amountEffective,
|
||||||
Amounts.parseOrThrow(perm.refund_fee),
|
Amounts.parseOrThrow(perm.refund_fee),
|
||||||
).amount;
|
).amount;
|
||||||
|
if (pr.refundsRefreshCost[rk]) {
|
||||||
|
amountEffective = Amounts.sub(
|
||||||
|
amountEffective,
|
||||||
|
pr.refundsRefreshCost[rk],
|
||||||
|
).amount;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const rk of Object.keys(pr.refundsFailed)) {
|
for (const rk of Object.keys(pr.refundsFailed)) {
|
||||||
|
@ -1269,6 +1269,11 @@ export interface PurchaseRecord {
|
|||||||
*/
|
*/
|
||||||
refundsFailed: { [refundKey: string]: RefundInfo };
|
refundsFailed: { [refundKey: string]: RefundInfo };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refresh cost for each refund permission.
|
||||||
|
*/
|
||||||
|
refundsRefreshCost: { [refundKey: string]: AmountJson };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When was the last refund made?
|
* When was the last refund made?
|
||||||
* Set to 0 if no refund was made on the purchase.
|
* Set to 0 if no refund was made on the purchase.
|
||||||
|
Loading…
Reference in New Issue
Block a user