refund response
This commit is contained in:
parent
ff3f965661
commit
2e56a22f6b
@ -41,12 +41,13 @@ import {
|
|||||||
import { NotificationType } from "../types/notifications";
|
import { NotificationType } from "../types/notifications";
|
||||||
import { parseRefundUri } from "../util/taleruri";
|
import { parseRefundUri } from "../util/taleruri";
|
||||||
import { createRefreshGroup, getTotalRefreshCost } from "./refresh";
|
import { createRefreshGroup, getTotalRefreshCost } from "./refresh";
|
||||||
import { Amounts } from "../util/amounts";
|
import { Amounts, AmountJson } from "../util/amounts";
|
||||||
import {
|
import {
|
||||||
MerchantCoinRefundStatus,
|
MerchantCoinRefundStatus,
|
||||||
MerchantCoinRefundSuccessStatus,
|
MerchantCoinRefundSuccessStatus,
|
||||||
MerchantCoinRefundFailureStatus,
|
MerchantCoinRefundFailureStatus,
|
||||||
codecForMerchantOrderStatusPaid,
|
codecForMerchantOrderStatusPaid,
|
||||||
|
AmountString,
|
||||||
} from "../types/talerTypes";
|
} from "../types/talerTypes";
|
||||||
import { guardOperationException } from "./errors";
|
import { guardOperationException } from "./errors";
|
||||||
import { getTimestampNow } from "../util/time";
|
import { getTimestampNow } from "../util/time";
|
||||||
@ -302,6 +303,30 @@ async function acceptRefunds(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Summary of the refund status of a purchase.
|
||||||
|
*/
|
||||||
|
export interface RefundSummary {
|
||||||
|
pendingAtExchange: boolean;
|
||||||
|
amountEffectivePaid: AmountJson;
|
||||||
|
amountRefundGranted: AmountJson;
|
||||||
|
amountRefundGone: AmountJson;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ApplyRefundResponse {
|
||||||
|
contractTermsHash: string;
|
||||||
|
|
||||||
|
proposalId: string;
|
||||||
|
|
||||||
|
amountEffectivePaid: AmountString;
|
||||||
|
|
||||||
|
amountRefundGranted: AmountString;
|
||||||
|
|
||||||
|
amountRefundGone: AmountString;
|
||||||
|
|
||||||
|
pendingAtExchange: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accept a refund, return the contract hash for the contract
|
* Accept a refund, return the contract hash for the contract
|
||||||
* that was involved in the refund.
|
* that was involved in the refund.
|
||||||
@ -309,7 +334,7 @@ async function acceptRefunds(
|
|||||||
export async function applyRefund(
|
export async function applyRefund(
|
||||||
ws: InternalWalletState,
|
ws: InternalWalletState,
|
||||||
talerRefundUri: string,
|
talerRefundUri: string,
|
||||||
): Promise<{ contractTermsHash: string; proposalId: string }> {
|
): Promise<ApplyRefundResponse> {
|
||||||
const parseResult = parseRefundUri(talerRefundUri);
|
const parseResult = parseRefundUri(talerRefundUri);
|
||||||
|
|
||||||
logger.trace("applying refund", parseResult);
|
logger.trace("applying refund", parseResult);
|
||||||
@ -318,7 +343,7 @@ export async function applyRefund(
|
|||||||
throw Error("invalid refund URI");
|
throw Error("invalid refund URI");
|
||||||
}
|
}
|
||||||
|
|
||||||
const purchase = await ws.db.getIndexed(Stores.purchases.orderIdIndex, [
|
let purchase = await ws.db.getIndexed(Stores.purchases.orderIdIndex, [
|
||||||
parseResult.merchantBaseUrl,
|
parseResult.merchantBaseUrl,
|
||||||
parseResult.orderId,
|
parseResult.orderId,
|
||||||
]);
|
]);
|
||||||
@ -355,9 +380,50 @@ export async function applyRefund(
|
|||||||
await processPurchaseQueryRefund(ws, proposalId);
|
await processPurchaseQueryRefund(ws, proposalId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
purchase = await ws.db.get(Stores.purchases, proposalId);
|
||||||
|
|
||||||
|
if (!purchase) {
|
||||||
|
throw Error("purchase no longer exists");
|
||||||
|
}
|
||||||
|
|
||||||
|
const p = purchase;
|
||||||
|
|
||||||
|
let amountRefundGranted = Amounts.getZero(
|
||||||
|
purchase.contractData.amount.currency,
|
||||||
|
);
|
||||||
|
let amountRefundGone = Amounts.getZero(purchase.contractData.amount.currency);
|
||||||
|
|
||||||
|
let pendingAtExchange = false;
|
||||||
|
|
||||||
|
Object.keys(purchase.refunds).forEach((rk) => {
|
||||||
|
const refund = p.refunds[rk];
|
||||||
|
if (refund.type === RefundState.Pending) {
|
||||||
|
pendingAtExchange = true;
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
refund.type === RefundState.Applied ||
|
||||||
|
refund.type === RefundState.Pending
|
||||||
|
) {
|
||||||
|
amountRefundGranted = Amounts.add(
|
||||||
|
amountRefundGranted,
|
||||||
|
Amounts.sub(
|
||||||
|
refund.refundAmount,
|
||||||
|
refund.refundFee,
|
||||||
|
refund.totalRefreshCostBound,
|
||||||
|
).amount,
|
||||||
|
).amount;
|
||||||
|
} else {
|
||||||
|
amountRefundGone = Amounts.add(amountRefundGone, refund.refundAmount).amount;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
contractTermsHash: purchase.contractData.contractTermsHash,
|
contractTermsHash: purchase.contractData.contractTermsHash,
|
||||||
proposalId: purchase.proposalId,
|
proposalId: purchase.proposalId,
|
||||||
|
amountEffectivePaid: Amounts.stringify(purchase.payCostInfo.totalCost),
|
||||||
|
amountRefundGone: Amounts.stringify(amountRefundGone),
|
||||||
|
amountRefundGranted: Amounts.stringify(amountRefundGranted),
|
||||||
|
pendingAtExchange,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user