add logic to return information about purse refunds in coin histories

This commit is contained in:
Christian Grothoff 2022-10-15 10:43:26 +02:00
parent 5f333f817c
commit eebc030f6c
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
4 changed files with 142 additions and 1 deletions

View File

@ -131,6 +131,26 @@ TALER_EXCHANGEDB_calculate_transaction_list_totals (
} }
deposit_fee = pos->details.purse_deposit->deposit_fee; deposit_fee = pos->details.purse_deposit->deposit_fee;
break; break;
case TALER_EXCHANGEDB_TT_PURSE_REFUND:
/* refunded += pos->refund_amount - pos->refund_fee */
if (0 >
TALER_amount_add (&refunded,
&refunded,
&pos->details.purse_refund->refund_amount))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
if (0 >
TALER_amount_add (&spent,
&spent,
&pos->details.purse_refund->refund_fee))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
have_refund = true;
break;
case TALER_EXCHANGEDB_TT_RESERVE_OPEN: case TALER_EXCHANGEDB_TT_RESERVE_OPEN:
/* spent += pos->amount_with_fee */ /* spent += pos->amount_with_fee */
if (0 > if (0 >

View File

@ -343,6 +343,63 @@ add_coin_refund (void *cls,
} }
/**
* Function to be called with the results of a SELECT statement
* that has returned @a num_results results.
*
* @param cls closure of type `struct CoinHistoryContext`
* @param result the postgres result
* @param num_results the number of results in @a result
*/
static void
add_coin_purse_refund (void *cls,
PGresult *result,
unsigned int num_results)
{
struct CoinHistoryContext *chc = cls;
struct PostgresClosure *pg = chc->pg;
for (unsigned int i = 0; i<num_results; i++)
{
struct TALER_EXCHANGEDB_PurseRefundListEntry *prefund;
struct TALER_EXCHANGEDB_TransactionList *tl;
uint64_t serial_id;
prefund = GNUNET_new (struct TALER_EXCHANGEDB_PurseRefundListEntry);
{
struct GNUNET_PQ_ResultSpec rs[] = {
GNUNET_PQ_result_spec_auto_from_type ("purse_pub",
&prefund->purse_pub),
TALER_PQ_RESULT_SPEC_AMOUNT ("amount_with_fee",
&prefund->refund_amount),
TALER_PQ_RESULT_SPEC_AMOUNT ("fee_refund",
&prefund->refund_fee),
GNUNET_PQ_result_spec_uint64 ("purse_refunds_serial_id",
&serial_id),
GNUNET_PQ_result_spec_end
};
if (GNUNET_OK !=
GNUNET_PQ_extract_result (result,
rs,
i))
{
GNUNET_break (0);
GNUNET_free (prefund);
chc->failed = true;
return;
}
}
tl = GNUNET_new (struct TALER_EXCHANGEDB_TransactionList);
tl->next = chc->head;
tl->type = TALER_EXCHANGEDB_TT_PURSE_REFUND;
tl->details.purse_refund = prefund;
tl->serial_id = serial_id;
chc->head = tl;
}
}
/** /**
* Function to be called with the results of a SELECT statement * Function to be called with the results of a SELECT statement
* that has returned @a num_results results. * that has returned @a num_results results.
@ -629,6 +686,9 @@ TEH_PG_get_coin_transactions (
/** #TALER_EXCHANGEDB_TT_PURSE_DEPOSIT */ /** #TALER_EXCHANGEDB_TT_PURSE_DEPOSIT */
{ "get_purse_deposit_by_coin_pub", { "get_purse_deposit_by_coin_pub",
&add_coin_purse_deposit }, &add_coin_purse_deposit },
/** #TALER_EXCHANGEDB_TT_PURSE_REFUND */
{ "get_purse_refund_by_coin_pub",
&add_coin_purse_refund },
/** #TALER_EXCHANGEDB_TT_REFUND */ /** #TALER_EXCHANGEDB_TT_REFUND */
{ "get_refunds_by_coin", { "get_refunds_by_coin",
&add_coin_refund }, &add_coin_refund },
@ -748,6 +808,23 @@ TEH_PG_get_coin_transactions (
" JOIN denominations denom" " JOIN denominations denom"
" USING (denominations_serial)" " USING (denominations_serial)"
" WHERE ref.coin_pub=$1;"); " WHERE ref.coin_pub=$1;");
PREPARE (pg,
"get_purse_refund_by_coin",
"SELECT"
" pr.purse_pub"
",pd.amount_with_fee_val"
",pd.amount_with_fee_frac"
",denom.fee_refund_val "
",denom.fee_refund_frac "
",pr.purse_refunds_serial_id"
" FROM purse_deposits pd"
" JOIN purse_refunds pr"
" USING (purse_pub)"
" JOIN known_coins kc"
" ON (pd.coin_pub = kc.coin_pub)"
" JOIN denominations denom"
" USING (denominations_serial)"
" WHERE pd.coin_pub=$1;");
PREPARE (pg, PREPARE (pg,
"recoup_by_old_coin", "recoup_by_old_coin",
"SELECT" "SELECT"

View File

@ -152,6 +152,14 @@ TEH_COMMON_free_coin_transaction_list (
GNUNET_free (deposit); GNUNET_free (deposit);
break; break;
} }
case TALER_EXCHANGEDB_TT_PURSE_REFUND:
{
struct TALER_EXCHANGEDB_PurseRefundListEntry *prefund;
prefund = tl->details.purse_refund;
GNUNET_free (prefund);
break;
}
case TALER_EXCHANGEDB_TT_RESERVE_OPEN: case TALER_EXCHANGEDB_TT_RESERVE_OPEN:
{ {
struct TALER_EXCHANGEDB_ReserveOpenListEntry *role; struct TALER_EXCHANGEDB_ReserveOpenListEntry *role;

View File

@ -1788,6 +1788,31 @@ struct TALER_EXCHANGEDB_PurseDepositListEntry
}; };
/**
* @brief Specification for a purse refund operation in a coin's transaction list.
*/
struct TALER_EXCHANGEDB_PurseRefundListEntry
{
/**
* Public key of the purse.
*/
struct TALER_PurseContractPublicKeyP purse_pub;
/**
* Fraction of the original deposit's value to be refunded, including
* refund fee (if any). The coin is identified by @e coin_pub.
*/
struct TALER_Amount refund_amount;
/**
* Refund fee to be covered by the customer.
*/
struct TALER_Amount refund_fee;
};
/** /**
* Information about a /reserves/$RID/open operation in a coin transaction history. * Information about a /reserves/$RID/open operation in a coin transaction history.
*/ */
@ -1974,10 +1999,15 @@ enum TALER_EXCHANGEDB_TransactionType
*/ */
TALER_EXCHANGEDB_TT_PURSE_DEPOSIT = 6, TALER_EXCHANGEDB_TT_PURSE_DEPOSIT = 6,
/**
* Purse deposit operation.
*/
TALER_EXCHANGEDB_TT_PURSE_REFUND = 7,
/** /**
* Reserve open deposit operation. * Reserve open deposit operation.
*/ */
TALER_EXCHANGEDB_TT_RESERVE_OPEN = 7 TALER_EXCHANGEDB_TT_RESERVE_OPEN = 8
}; };
@ -2053,6 +2083,12 @@ struct TALER_EXCHANGEDB_TransactionList
*/ */
struct TALER_EXCHANGEDB_PurseDepositListEntry *purse_deposit; struct TALER_EXCHANGEDB_PurseDepositListEntry *purse_deposit;
/**
* Coin was refunded upon purse expiration
* (#TALER_EXCHANGEDB_TT_PURSE_REFUND)
*/
struct TALER_EXCHANGEDB_PurseRefundListEntry *purse_refund;
/** /**
* Coin was used to pay to open a reserve. * Coin was used to pay to open a reserve.
* (#TALER_EXCHANGEDB_TT_RESERVE_OPEN) * (#TALER_EXCHANGEDB_TT_RESERVE_OPEN)