7

Mam zamiar napisać prosty system kredytowy, który może "dodać", "odliczyć" kredyty w systemie. Obecnie myślę o dwóch podejściach.System kredytowy: oparty na historii lub w oparciu o saldo?

  1. prosta: Przechowywać użytkownika kredyt jako balance pola w bazie danych, a wszystkie działania («add», «odliczenia») są rejestrowane, ale nie stosuje się do obliczania najnowszy bilans.

  2. Oparte na historii: Nie przechowuj salda w bazie danych. Saldo jest obliczane na podstawie historii transakcji, np. („Add”, „odliczenia”)

Zarówno sprawa będzie prace myślę, ale szukam, aby zobaczyć ewentualne zastrzeżenie przy projektowaniu takiego systemu, szczególnie jestem sprzyjanie System History based.

Czy są jakieś implementacje referencyjne lub moduł open source, z którego korzystam?

Aktualizacja: Czy istnieje jakiś moduł oparty na Ruby/Rail, taki jak AuthLogic, dzięki czemu mogę podłączyć się do mojego istniejącego kodu bez konieczności ponownego odkrywania koła (np. Transakcja, wycofywanie zmian, bezpieczeństwo itp.)?

+2

Szczerze chciałbym wdrożyć zarówno i po prostu dodać hak do historii zaktualizować równowagę. To złagodzi potrzebę sprawdzania historii w celu ustalenia równowagi za każdym razem. Wydaje się to szczególnie przydatne w przypadku "odliczania" przedmiotów, w których chcesz się upewnić, że istnieje odliczenie do odliczenia. – engineersmnky

+0

Jeśli korzystasz z MS SQL Server, możesz użyć _indeksowanego widoku_, aby system DBMS automatycznie utrzymywał poprawne saldo (na podstawie historii). –

Odpowiedz

12

Absolutnie użyj obu.

  • Metoda bilansowa zapewnia szybki dostęp do bieżącej kwoty.

  • Oparty na historii sposób zapewnia kontrolę. Tabela historii powinna przechowywać transakcję (zgodnie z opisem), znacznik czasu, saldo przed transakcją, a najlepiej sposób śledzenia źródła/przeznaczenia funduszy.

Zobacz Ruby Toolbox for bookkeeping i Plutus double-entry bookkeeping gem.

Ponadto, jeśli Twój system kredytowy może wpływać na użytkowników, zalecam również korzystanie z rejestrowania i najlepiej przeczytać o bezpiecznej weryfikacji logów i sprawdzonym łańcuchu znaczników czasu.

+1

Absolutnie. Bez księgi masz ** zero ** zaufania do wartości w systemie. Za pomocą księgi można sprawdzić poprawność sald. – tadman

+2

Pracowałem nad systemem, który obsługuje salda/księgowość dla małej firmy świadczącej usługi finansowe i mogę zagwarantować, że ta odpowiedź jest w 100% prawidłowa. – Bryce

6

Dodawanie i odjęcie punktów sugeruje, że może trzeba także mieć świadomość, gdzie kredyty te pochodzą i gdzie poszedł. Za każdym razem, gdy pojawi się taka sytuacja, czy jest to w walucie lub innej ilości liczbowej, którą należy śledzić i rozliczać, należy rozważyć użycie wzoru z podwójnym wpisem księgowym.

Ten wzór pracował przez wieki i daje wszystkich funkcjonalności musisz być w stanie zobaczyć, co się salda są i skąd mają być w ten sposób:

  • dziennik audytu wszystkich transakcji (w tym źródła i odpływy „fundusze”)
  • Running salda wszystkich rachunków w czasie (jeśli zdecydujesz się go nagrać)
  • Łatwe sprawdzanie poprawności zapisów
  • zdolność do „write-once” - żadne aktualizacje oznaczają brak sabotażu

Jeśli nie znasz szczegółów, zacznij tutaj: Double Entry Bookkeeping lub poproś o zdanie każdego, kto odbył kurs wstępny z zakresu księgowości.

Poprosiłeś o rozwiązanie open source dla Ruby on Rails, które możesz podłączyć do swojej aplikacji. Możesz użyć Plutus. Oto fragment z opisu tego projektu na Github:

Wtyczka Plutus zapewnia kompletny system księgowy wejście podwójne do użycia w każdej aplikacji Ruby on Rails. Wtyczka jest zgodna z ogólnymi praktykami księgowania podwójnego wpisu. ... Plutus składa się z tabel, które prowadzą swoje rachunki, zapisy i obciążenia oraz kredyty. Każdy wpis może mieć wiele obciążeń i kredytów. Tabela wpisów, w której zapisywane są transakcje biznesowe , jest w zasadzie dziennikiem księgowym.

+0

Plus jeden do podwójnego księgowania wpisu. Rozwiązany problem. –

1

tak, użyj obu.

  • Na początku, że będziesz kiedyś trzeba odwrócić transakcji/ transactions.When robi to utwórz nowy odwrócony transakcję zapisywać na przelewie.
  • Czasami trzeba ujednolicić kilka transakcji pod jednym dachem. Proponuję utworzyć trzecią tabelę o nazwie "tokeny", która będzie menedżerem płatności, a ujednolicisz te zgrupowane transakcje pod tym tokenem.

    token.transactions = (select * from transakcji T gdzie t.token = "123"), na przykład