Przy okazji tworzenia procedury "Czyszczenia rynku" z przeterminowanych akcji, potrzeba zmusiła mnie do rozszerzenia procedury pCreateBuyTransaction o obsługę zleceń "kPKC" oraz "kCU". Wcześniejsza wersja robiła tylko inserta do tabeli MarketSquare bez uwzględnienia różnic pomiędzy typami zleceń.
Poniżej wstawię calą procedurę gdyż zmian jest dość dużo.
Naj wązniejsza zmiana to rozróżnienie zlecenia o statusie kPKC i kCU. Pokażdej cenie mamy cenę równą 0 (zero), cenę pobieramy z tabeli Stock i na tej podstawie wyliczamy ile pieniędzy potrzebujemy zabrać z portfela, a przy okazji czyszczenia rynku pieniądze będą zwracane (jeżeli zlecenie się przeterminuje) na podstawie wyliczonej wartości zlecenia przy składaniu transakcji ( pCreateBuyTransaction). Przy realizacji zlecenia na rynku istnieje rekord w którym mamy zarezerwowaną pewną kwotę (to jakby zaliczka), wtedy będzie ponownie sprawdzona cena na rynku i z równania wyjdzie nam różnica którą użytkownik musi zapłacić lub zostanie mu zwrócona albo się wstrzeli w cenę i nie będzie musiał dopłacać.
KOD:
BEGIN
--pomocnicze
declare
@wallet_id int
declare @stock_id
int
declare
@stockN_id int
declare
@walletMoneyLimit money
declare
@userLogin varchar(50)
--wyszukanie portfela oraz akcji
select
@wallet_id = wal_id from
UserTable where usr_id =@user_id
select
@walletMoneyLimit = wal_MoneyLimit from Wallet where
wal_id = @wallet_id
select
@stockN_id = stockN_id from
StockName where stockN_name = @stock_name
select @stock_id
= stock_id from
Stock where stockN_id =
@stockN_id
if
(@priceStatusId = 1)
begin
-- sprawdzenie portfela
declare @result money
declare @PriceTransaction money
set @result =
@numberBuyStock * @stockPrice
--transakcja na rynek
if(@result <=
@walletMoneyLimit)
begin
INSERT INTO [dbo].[MarketSquare]
([stock_id],[wal_id],[mark_numberOfShares]
,[mark_aktywny],[mark_sharePriceBuy]
,[bs_id],[mark_sharePriceSell]
,[mark_dataStart],[mark_dataEnd]
,[mark_TransactionPrice],[priceStatus_id])
VALUES (@stock_id,@wallet_id,@numberBuyStock,1,@stockPrice,2,0,GETDATE(),@dataEnd,@result,@priceStatusId)
--get
money from wallet and set to transaction
set @PriceTransaction =
@walletMoneyLimit - @result
update Wallet set
wal_MoneyLimit
= @PriceTransaction
where
wal_id
= @wallet_id
end
else
begin
select @userLogin =
usr_login
from UserTable
where
usr_id =
@user_id
exec pAddInfoToLog 2,@userLogin,
'zamałe srodki na zakup
akcji, zmniejsz liczbe akcji, kCU'
end
end
if(@priceStatusId = 3)
begin
declare @stockPriceFromStockTable money
declare @priceInThisTime money
--priceStatus = kPKC stockPrice = 0, get price of stock
from Stock Table
select @stockPriceFromStockTable = stock_priceBuy
from
Stock
where stock_id =
@stock_id
set @priceInThisTime =
@stockPriceFromStockTable * @numberBuyStock
if(@result <= @walletMoneyLimit)
begin
INSERT INTO [dbo].[MarketSquare]
([stock_id],[wal_id],[mark_numberOfShares]
,[mark_aktywny],[mark_sharePriceBuy]
,[bs_id],[mark_sharePriceSell]
,[mark_dataStart],[mark_dataEnd]
,[mark_TransactionPrice],[priceStatus_id])
VALUES
(@stock_id,@wallet_id,@numberBuyStock,1,0e,2,0,GETDATE(),@dataEnd,@priceInThisTime,@priceStatusId)
--get
money from wallet and set to transaction
set @PriceTransaction =
@walletMoneyLimit - @result
update Wallet set
wal_MoneyLimit
= @PriceTransaction
where
wal_id
= @wallet_id
end
else
begin
select @userLogin =
usr_login
from UserTable
where
usr_id =
@user_id
exec pAddInfoToLog 2,@userLogin
,'zamałe srodki na zakup
akcji, zmniejsz liczbe akcji, kPKC'
end
end
end