From c51da2a96580e49a5d8768ab44b27af43581ddbc Mon Sep 17 00:00:00 2001 From: Victor Broman Date: Fri, 6 Feb 2026 18:49:42 +0100 Subject: [PATCH] Fixes journentry bug --- erp.db-shm | Bin 32768 -> 32768 bytes erp.db-wal | Bin 387312 -> 453232 bytes internal/handlers/ledger_test.go | 56 +++++++++++++++++++++++++++++++ internal/models/ledger.go | 22 ++++++++---- 4 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 internal/handlers/ledger_test.go diff --git a/erp.db-shm b/erp.db-shm index 2059ecec4a1991d5e1b9e8068fa0afb1b1135b2b..d8562349234e1235baeba137a8826e7879d8a8f9 100644 GIT binary patch delta 285 zcmZo@U}|V!s+V}A%K!q55G;@fql*2czqMq3sjp9_e2fEZ*wN&L->Oa~n{|8vsgWRGV^W=Lnq28tYJ z+WgH=il04!A%!7>AqOaOnQ8N@1QurYM21v`Oom*b$VVnY5r#m9V1_7$7=|Qajfrh>|Z~-w#0PZ#o2W~Zm3yo zCsjSrC@=t-`yUBFg_#%_Ha6BXZgyeX&BF>QX8 az`_h<{b1r0VF+XhW{6^l+3d(9C{fI4p}@7N!>F7M3lnA6`f>FfgzHF+-01>u1-Nn6B$ewSQ2iz&m-nM+R#f zzXY=&2eUe3R(@$wUSdvsPG(+eF&j{|$aKEvEUD91Z(`)-NLX*Z@i+G!7BO?bhM+yfkkjcrx$ehB(0utn4 zVq)^Mo1VXd)sW*flaGx=59=RjD6n9L0te6vq)<>O4)SsddG_WDFJC+ZFV90Jz6@S5 z{z85WzJELq`6lzv-~Qn!^GO~hV>WgMQB6rkV`BpY1OM{8)FSm_1=qsT%#zAfFga)X z9VI63?S8JTf{aXjr=|x!XU$~czs_JXecyA|&(J_sMG4feAAib9g=~8V@-+)TJ2X)F z*?~U(&KIc;^qit7a|*CwCm2g?=N5T z@`?c?CJz`fJS+GMdGe4WCX9!}f&~~cy7G+ECnzz=$$Uc&A2TasBP#<7b0(k)V{yjm z>pwBddUIh>K{#@;XyS{XzR;c33_ZpzfHA(Vi75*d_meYaWTu~S~_JO$x*%jtiCMH&fW;9AAOwep}dUMU@|3 zwEE*CkRTWTWQ=6OKaYPh(D~*3KAc>Tq{7O=#mNa`GIFpoaZ!?h&PTFdbYJ;T8k&IE zFcT0ce35f@?P{55jTXD9=n07543V=3TLO{;CYBG6n7lx#CkK>{GB_+*fyq}Nn84=+ zG08K|neO+3H5r&*VSN(VkWf?|h_Zxd3I;@bp_m3e&i+Q33oQB)MAq)x$7 zOq*C(nVL~Q1?rPiQJA8nz{hnrf6XoFNdXD+@Yi8Yf&88PbwK~d@h5WfKvE$aYYGQ9 Nq`+cJp?1<#1OOEy`5^!R delta 19 bcmexxMf$@<@rD-07N!>F7M3lnA6@_eUK9x9 diff --git a/internal/handlers/ledger_test.go b/internal/handlers/ledger_test.go new file mode 100644 index 0000000..32b241e --- /dev/null +++ b/internal/handlers/ledger_test.go @@ -0,0 +1,56 @@ +package handlers_test + +import ( + "net/http/httptest" + + "os" + "testing" + "time" + + "erp_system/internal/database" + "erp_system/internal/handlers" + + "github.com/gorilla/sessions" +) + +func TestJournalEntries_List(t *testing.T) { + // Setup temporary DB + dbFile := "test_ledger.db" + db, err := database.Initialize(dbFile) + if err != nil { + t.Fatalf("Failed to initialize DB: %v", err) + } + defer func() { + db.Close() + os.Remove(dbFile) + }() + + // Setup Handler + store := sessions.NewCookieStore([]byte("secret")) + h := &handlers.Handler{ + DB: db, + Store: store, + } + + // Insert a dummy entry so the loop runs + db.Exec("INSERT INTO journal_entries (description) VALUES ('Test')") + + // Create a timeout channel to detect freeze + done := make(chan bool) + go func() { + req := httptest.NewRequest("GET", "/ledger/journal", nil) + w := httptest.NewRecorder() + + // Execute Handler + h.JournalEntries(w, req) + + done <- true + }() + + select { + case <-done: + t.Log("Handler completed successfully") + case <-time.After(2 * time.Second): + t.Fatal("Handler timed out - DEADLOCK DETECTED") + } +} diff --git a/internal/models/ledger.go b/internal/models/ledger.go index 518d88a..fe57b32 100644 --- a/internal/models/ledger.go +++ b/internal/models/ledger.go @@ -73,7 +73,20 @@ func GLAccountGetByID(db *sql.DB, id int) (*GLAccount, error) { } func JournalEntryGetAll(db *sql.DB) ([]JournalEntry, error) { - rows, err := db.Query("SELECT id, entry_date, description, reference, created_at FROM journal_entries ORDER BY created_at DESC") + rows, err := db.Query(` + SELECT + je.id, + je.entry_date, + je.description, + je.reference, + je.created_at, + COALESCE(SUM(jl.debit), 0), + COALESCE(SUM(jl.credit), 0) + FROM journal_entries je + LEFT JOIN journal_lines jl ON je.id = jl.journal_entry_id + GROUP BY je.id + ORDER BY je.created_at DESC + `) if err != nil { return nil, err } @@ -82,14 +95,9 @@ func JournalEntryGetAll(db *sql.DB) ([]JournalEntry, error) { var entries []JournalEntry for rows.Next() { var je JournalEntry - if err := rows.Scan(&je.ID, &je.EntryDate, &je.Description, &je.Reference, &je.CreatedAt); err != nil { + if err := rows.Scan(&je.ID, &je.EntryDate, &je.Description, &je.Reference, &je.CreatedAt, &je.TotalDebit, &je.TotalCredit); err != nil { return nil, err } - - // Get totals - db.QueryRow("SELECT COALESCE(SUM(debit), 0), COALESCE(SUM(credit), 0) FROM journal_lines WHERE journal_entry_id = ?", je.ID). - Scan(&je.TotalDebit, &je.TotalCredit) - entries = append(entries, je) } return entries, nil