Jak obliczać balans konta ?

0

Potrzebuję porady odnośnie stworzenia systemu transakcyjnego. Jestem na etapie obliczania ile zostało na koncie środków do wykorzystania. Oto co do tej pory udało mi się stworzyć:

  1. tabela z transakcjami w której jest id_usera , kwota jaka jest transakcja i status transakcji. (1 oczekuje,2 kompletna, 3 odrzucona)
  2. w drugiej tabelce balans jest id_usera i obliczony balans
  3. do bazy wskakuje transakcja w kwocie 3 gdy system ja obliczy zakutalizuje balans w drugiej tabelce
  4. do bazy wskakuje transakcja w kwocie 6 system aktualizuje balans i mamy juz kwote 9
  5. do bazy wskakuje transakcja wyplaty w kwocie 2 system oznacza to jako status 1 (oczekuje)
  6. Gdy uzytkownik widzi aktualne saldo konta system pobiera:
    poebierz saldo z tabeli saldo i odejmij sume wszystkich transakcji ze statusem 1 dla danego usera
  7. teraz wpada do transakcji kwota 6 system aktualizuję saldo jako 15
  8. przy wysweitalniu salda usera mamy 15 - 2 zablokowane = 13 dostępne
  9. i teraz system zaktualizował zablokowana transakcje w kwocie 2 i ustawił status na 2 kompletna

Tabela zdarzeń

ID ID USERS AMOUNT SALDO WPLATA/WYPLATA STATUS
1 2 3 ?? 1 -wplata 2
2 2 6 ?? 1 -wplata 2
3 2 2 ?? 2 -wplata 2
4 2 6 ?? 1 -wplata 2

Główne pytania są dwa

  1. Czy system z oddzielną tabelą do salda jest dobrym pomysłem ? bo inaczej musialbym przy pobeiraniu salda zliczać sume zatwierdzonych transakcji odjąć sumę transakcji oczekujących

  2. Jak obliczać i wyświetlać saldo na bieżąco dla historii transakcji żeby było tak:
    ID | ID USERS | AMOUNT | SALDO | WPLATA/WYPLATA | STATUS
    ---------------- | ---------------- | ---------------- | ---------------- | ---------------- | ----------------
    1 | 2 | 3 | 3 | 1 -wplata | 2
    2 | 2 | 6 | 9 | 1 -wplata | 2
    3 | 2 | 2 | ?? | 2 -wplata | 2
    4 | 2 | 6 | ?? | 1 -wplata | 2

I nie wiem właśnie jak obliczyć te salda dla zablokowanych transakcji jeżeli transakcja id = 3 oczekiwała a transakcja nr 4 wpadla przed numerem 3. Czyli transakcja nr 4 powinna wtedy mieć w polu balans 3+6+6 = 15 ale przy wyświetlaniu user i tak miałby pomniejszone o kwotę 2. A po rozliczeniu tej transakcji o id = 3 w balans powinno być 7 a nie 13 jakby wynikało z kolejności transakcji. Czy ma ktoś jakiś pomysł?

2
  1. Albo liczysz sumy albo nie - teraz jesteś w półkroku.
    Jeśli liczysz sumy to aktualizujesz saldo tylko dla transakcji ze statusem 2.
    Jeśli nie liczysz sum to nie liczysz salda i sumujesz po transakcjach ze statusem 2.

  2. Przy takim stanowym rozwiązaniu możesz mieć problem z uszeregowaniem transakcji wg kolejności wykonania.
    Jedno z rozwiązań to dodatkowa tabela dla transakcji nie rozliczonych jeszcze (lub odrzuconych).
    Wtedy do docelowej tabeli wrzucasz transakcje tylko w momencie rozliczenia i wtedy nadajesz kolejny numer.
    Wtedy też możesz aktualizować saldo.

I generalnie to zły pomysł ubieranie tego w jakikolwiek algorytm.
W systemach transakcyjnych dla mnie osobiście hasło "algorytm" trąci błędem projektowym, zwłaszcza podczas wyciągania salda (które powinno być proste jak budowa cepa).

0

A gdyby zrobić tak, że wrzucam tak jak pisałem wyżej transakcje nierozliczoną do tabeli transakcje. A potem gdy ją rozliczę i zmienie status na 2, zaktualizuej saldo o te 2 zlote mniej i zaktualizuje date dodania tej transakcji. To w historii wyświetlam dane po dacie transakcji. Wtedy taka transakcja wpadnie jako rozliczona i w id transakcji nr 3 wyjdzie (- 2 PLN) saldo 13 a wyswietli sie zgodnie z data transakcji.

DATA/CZAS ID ID USERS AMOUNT SALDO WPLATA/WYPLATA STATUS
28 czerwca 12:30 1 2 3 3 1 -wplata 2
28 czerwca 12:34 2 2 6 9 1 -wplata 2
28 czerwca 12:45 3 2 2 13 2 -wplata 2
28 czerwca 12:40 4 2 6 15 1 -wplata 2

a user zobaczy dane

DATA/CZAS AMOUNT SALDO WPLATA/WYPLATA STATUS
28 czerwca 12:30 3 3 1 -wplata 2
28 czerwca 12:34 6 9 1 -wplata 2
28 czerwca 12:40 6 15 1 -wplata 2
28 czerwca 12:45 2 13 2 -wplata 2
0

O ile data będzie w formie timestamp (gwarancja unikalności) to takie rozwiązanie jest OK.
Pole data/czas może się nazywać np. "data zatwierdzenia" ("accept_dt") albo "data ostatniej zmiany" ("last_change_dt").

1 użytkowników online, w tym zalogowanych: 0, gości: 1