Skip to content

Getting Started — For New Engineers

This page gets you from "I just cloned the repo" to "I understand the shape of the system and can find things." Budget about 30 minutes.

1. The mental model in five sentences

  1. The product is a VB.NET WinForms desktop app that runs on Windows tills and back-office PCs.
  2. The app itself (smartsoft_inventory) is thin — mostly screens and per-transaction glue code.
  3. The real work — data access, stock math, printing, closing — lives in a shared set of DLLs, the SmartSoft FrameWork (framework_smartsoft).
  4. Everything reads and writes a single Microsoft SQL Server database whose tables use Indonesian-derived names (tbMaster_Barang = item master).
  5. Global module variables hold the session (who is logged in, which branch, today's business date, the connection string) and are read directly all over the code.
flowchart LR
    A["A user clicks<br/>a button on a form"] --> B["Form code<br/>(frmXxx.vb)"]
    B --> C["Transaction class<br/>(INVENTORY/Class/*.vb)"]
    C --> D["FrameWork BLL / Data Access<br/>(HAKDAC, cSTOK, tb* classes)"]
    D --> E[("SQL Server")]
    B -.reads.-> G["Globals<br/>(VariablePublic.vb)"]
    C -.reads.-> G
    style G fill:#fff3e0,stroke:#fb8c00
    style E fill:#e0f2f1,stroke:#00897b

2. Where things live

Two sibling folders make up the codebase:

pos-system/
├── smartsoft_inventory/      # the application (screens + thin logic)
│   └── INVENTORY/
│       ├── Form/             # all WinForms screens, grouped by area
│       ├── Class/            # per-transaction posting logic
│       ├── Module/           # globals, Sub Main, helpers
│       └── MenuUtama.vb      # the main menu shown after login
└── framework_smartsoft/      # the shared FrameWork DLLs (the heavy lifting)
    ├── FrameWork.SmartSoft.BLL/       # business logic (stock, promos, closing)
    ├── FrameWork.SmartSoft.General/   # data access, conversion, registry config
    ├── FrameWork.SmartSoft.GUI/       # base forms, controls, skinning
    ├── FrameWork.SmartSoft.Struk/     # receipt / label printing
    ├── FrameWork.SmartSoft.Closing/   # daily/monthly close, backup/restore
    ├── DataAccessControl/             # typed data-access classes (tb*, tv*)
    ├── SmartSoft.Parameter/           # company/parameter/config entities
    └── MyLib/                         # licensing, login, utilities

Reading order for the code

  1. INVENTORY/Module/VariablePublic.vb — the globals and Sub Main bootstrap. Read this first; everything else assumes it.
  2. INVENTORY/MenuUtama.vb — the main menu; how screens are launched.
  3. One transaction end-to-end: INVENTORY/Class/PenerimaanBarang.vb (goods receipt) + its form under INVENTORY/Form/Transaksi/1 - Penerimaan/.
  4. framework_smartsoft/FrameWork.SmartSoft.BLL/BLL_STOCK.vb — the stock/costing brain.

3. Conventions you will see everywhere

You will see… It means…
frmXxx A WinForms form (screen).
tbMaster_Xxx A master-data table or its typed data-access class.
tbTr_Xxx, tbRekap_Xxx, tbHist_Xxx Transaction / recap / history tables.
tv_Xxx A SQL view.
HAKDAC The global data-access gateway (runs SQL → DataTable).
mem… (e.g. memUserID, memTanggal) A session global — current user, branch, business date.
c… (e.g. cPRSH, cSTOK) A cached FrameWork object (company, stock BLL).
Indonesian words Domain terms — see the Glossary.

4. Things that will surprise you

Read these before you judge the code

  • SQL is built by string concatenation, not parameters. This is the established pattern, not an accident — but it is also the system's biggest risk. See Data Access.
  • Errors are often swallowed with Try/Catch ex As Exception that returns Nothing. Match the surrounding style; don't "fix" it in passing.
  • CommandTimeout = 0 (no timeout) is used deliberately on long queries.
  • Session lives in globals, not passed as parameters. memUserID, memKodeCabang, memTanggal are read directly wherever needed.
  • Two superusers, EDP and DLY, bypass permission checks by design.

5. What you cannot do (and why)

  • You cannot build this outside Windows. It depends on Crystal Reports, COM interop (SQLDMO), and skinning DLLs. There is no dotnet CLI path. See Build & Deploy.
  • You cannot build without the FrameWork DLLs present. The app references them by relative paths pointing outside the repo. Missing DLLs → build fails.

6. Next steps