diff options
author | Christian Grothoff <christian@grothoff.org> | 2020-01-16 22:40:12 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2020-01-16 22:40:12 +0100 |
commit | 0305cf5f9eb904e7a3ab3e8d39f4974a92a9a0b3 (patch) | |
tree | 8a5d839bb3cfb5e96b430ff6d1eeeed653cc4a6b /src/exchangedb | |
parent | 0a415262daa93c96a9305df11a6573b49976a8cc (diff) | |
download | exchange-0305cf5f9eb904e7a3ab3e8d39f4974a92a9a0b3.tar.gz exchange-0305cf5f9eb904e7a3ab3e8d39f4974a92a9a0b3.tar.bz2 exchange-0305cf5f9eb904e7a3ab3e8d39f4974a92a9a0b3.zip |
move function to libtalerexchangedb, as planned
Diffstat (limited to 'src/exchangedb')
-rw-r--r-- | src/exchangedb/Makefile.am | 3 | ||||
-rw-r--r-- | src/exchangedb/exchangedb_fees.c | 2 | ||||
-rw-r--r-- | src/exchangedb/exchangedb_transactions.c | 142 |
3 files changed, 145 insertions, 2 deletions
diff --git a/src/exchangedb/Makefile.am b/src/exchangedb/Makefile.am index 1a866584..c0d6bc66 100644 --- a/src/exchangedb/Makefile.am +++ b/src/exchangedb/Makefile.am @@ -46,8 +46,9 @@ libtalerexchangedb_la_SOURCES = \ exchangedb_auditorkeys.c \ exchangedb_denomkeys.c \ exchangedb_fees.c \ + exchangedb_plugin.c \ exchangedb_signkeys.c \ - exchangedb_plugin.c + exchangedb_transactions.c libtalerexchangedb_la_LIBADD = \ $(top_builddir)/src/util/libtalerutil.la \ diff --git a/src/exchangedb/exchangedb_fees.c b/src/exchangedb/exchangedb_fees.c index 386c5de9..c025604f 100644 --- a/src/exchangedb/exchangedb_fees.c +++ b/src/exchangedb/exchangedb_fees.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2017 GNUnet e.V. + Copyright (C) 2017 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software diff --git a/src/exchangedb/exchangedb_transactions.c b/src/exchangedb/exchangedb_transactions.c new file mode 100644 index 00000000..2891f0ad --- /dev/null +++ b/src/exchangedb/exchangedb_transactions.c @@ -0,0 +1,142 @@ +/* + This file is part of TALER + Copyright (C) 2017-2020 Taler Systems SA + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> +*/ +/** + * @file exchangedb/exchangedb_transactions.c + * @brief Logic to compute transaction totals of a transaction list for a coin + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_exchangedb_lib.h" + + +/** + * Calculate the total value of all transactions performed. + * Stores @a off plus the cost of all transactions in @a tl + * in @a ret. + * + * @param tl transaction list to process + * @param off offset to use as the starting value + * @param[out] ret where the resulting total is to be stored + * @return #GNUNET_OK on success, #GNUNET_SYSERR on errors + */ +int +TALER_EXCHANGEDB_calculate_transaction_list_totals (struct + TALER_EXCHANGEDB_TransactionList + *tl, + const struct + TALER_Amount *off, + struct TALER_Amount *ret) +{ + struct TALER_Amount spent = *off; + struct TALER_Amount refunded; + + GNUNET_assert (GNUNET_OK == + TALER_amount_get_zero (spent.currency, + &refunded)); + for (struct TALER_EXCHANGEDB_TransactionList *pos = tl; NULL != pos; pos = + pos->next) + { + switch (pos->type) + { + case TALER_EXCHANGEDB_TT_DEPOSIT: + /* spent += pos->amount_with_fee */ + if (GNUNET_OK != + TALER_amount_add (&spent, + &spent, + &pos->details.deposit->amount_with_fee)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_REFRESH_MELT: + /* spent += pos->amount_with_fee */ + if (GNUNET_OK != + TALER_amount_add (&spent, + &spent, + &pos->details.melt->session.amount_with_fee)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_REFUND: + /* refunded += pos->refund_amount - pos->refund_fee */ + if (GNUNET_OK != + TALER_amount_add (&refunded, + &refunded, + &pos->details.refund->refund_amount)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + if (GNUNET_OK != + TALER_amount_subtract (&refunded, + &refunded, + &pos->details.refund->refund_fee)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_OLD_COIN_PAYBACK: + /* refunded += pos->value */ + if (GNUNET_OK != + TALER_amount_add (&refunded, + &refunded, + &pos->details.old_coin_payback->value)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_PAYBACK: + /* spent += pos->value */ + if (GNUNET_OK != + TALER_amount_add (&spent, + &spent, + &pos->details.payback->value)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_PAYBACK_REFRESH: + /* spent += pos->value */ + if (GNUNET_OK != + TALER_amount_add (&spent, + &spent, + &pos->details.payback_refresh->value)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + } + } + /* spent = spent - refunded */ + if (GNUNET_SYSERR == + TALER_amount_subtract (&spent, + &spent, + &refunded)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + + *ret = spent; + return GNUNET_OK; +} |