From ad832fc71ba7a0dfcc45ee6f2d6f851c8c453481 Mon Sep 17 00:00:00 2001 From: TMA Date: Mon, 21 Apr 2025 17:45:40 +0200 Subject: [PATCH] #14: stored function for "credit" transfer transactions --- brmbar3/brmbar/Shop.py | 19 ++++--- brmbar3/schema/0014-shop-transfer-credit.sql | 58 ++++++++++++++++++++ 2 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 brmbar3/schema/0014-shop-transfer-credit.sql diff --git a/brmbar3/brmbar/Shop.py b/brmbar3/brmbar/Shop.py index 85251de..df29c18 100644 --- a/brmbar3/brmbar/Shop.py +++ b/brmbar3/brmbar/Shop.py @@ -87,12 +87,11 @@ class Shop: return cost def add_credit(self, credit, user): - trn = self.db.execute_and_fetch( + self.db.execute_and_fetch( "SELECT public.add_credit(%s, %s, %s, %s)", [self.cash.id, credit, user.id, user.name] - )[0] + ) self.db.commit() - return trn # unused #transaction = self._transaction(responsible = user, description = "BrmBar credit replenishment for " + user.name) #self.cash.debit(transaction, credit, user.name) @@ -100,20 +99,24 @@ class Shop: #self.db.commit() def withdraw_credit(self, credit, user): - trn = self.db.execute_and_fetch( + self.db.execute_and_fetch( "SELECT public.withdraw_credit(%s, %s, %s, %s)", [self.cash.id, credit, user.id, user.name] - )[0] + ) self.db.commit() - return trn # unused #transaction = self._transaction(responsible = user, description = "BrmBar credit withdrawal for " + user.name) #self.cash.credit(transaction, credit, user.name) #user.debit(transaction, credit, "Credit withdrawal") #self.db.commit() def transfer_credit(self, userfrom, userto, amount): - self.add_credit(amount, userto) - self.withdraw_credit(amount, userfrom) + self.db.execute_and_fetch( + "SELECT public.transfer_credit(%s, %s, %s, %s)", + [self.cash.id, credit, user.id, user.name] + ) + self.db.commit() + #self.add_credit(amount, userto) + #self.withdraw_credit(amount, userfrom) def buy_for_cash(self, item, amount = 1): # Buy: Currency conversion from item currency to shop currency diff --git a/brmbar3/schema/0014-shop-transfer-credit.sql b/brmbar3/schema/0014-shop-transfer-credit.sql new file mode 100644 index 0000000..48dc644 --- /dev/null +++ b/brmbar3/schema/0014-shop-transfer-credit.sql @@ -0,0 +1,58 @@ +-- +-- 0014-shop-transfer-credit.sql +-- +-- #14 - stored function for "credit" transfer transactions +-- +-- ISC License +-- +-- Copyright 2023-2025 Brmlab, z.s. +-- TMA +-- +-- Permission to use, copy, modify, and/or distribute this software +-- for any purpose with or without fee is hereby granted, provided +-- that the above copyright notice and this permission notice appear +-- in all copies. +-- +-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +-- WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +-- WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +-- AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +-- CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +-- OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +-- NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +-- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-- + +-- To require fully-qualified names +SELECT pg_catalog.set_config('search_path', '', false); + +DO $upgrade_block$ +BEGIN + +IF brmbar_privileged.has_exact_schema_version(12) THEN + +CREATE OR REPLACE FUNCTION public.transfer_credit( + i_cash_account_id public.accounts.id%TYPE, + i_credit NUMERIC, + i_userfrom_id public.accounts.id%TYPE, + i_userfrom_name TEXT, + i_userto_id public.accounts.id%TYPE, + i_userto_name TEXT +) RETURNS VOID +LANGUAGE plpgsql +AS $$ +BEGIN + PERFORM public.add_credit(i_cash_account_id, i_credit, i_userto_id, i_userto_name); + PERFORM public.withdraw_credit(i_cash_account_id, i_credit, i_userfrom_id, i_userfrom_name); +END; +$$; + + + +PERFORM brmbar_privileged.upgrade_schema_version_to(13); +END IF; + +END; +$upgrade_block$; + +-- vim: set ft=plsql :