Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Mobile web app for a small polybag factory: every kilogram that moves between supplier → warehouse (GBJ) → blowing → cutting → warehouse → customer is logged with a typed quantity, a photo where it matters, and a timestamp — then reviewed after the fact by a supervisor.
Backend: Cloudflare Workers + Durable Object (SQLite), free plan. The business logic is the same
apps-script/*.gs code, bundled by tools/build-cf.py and run inside the Worker (cloudflare/).
Google Sheets is no longer the database (v9 → Cloudflare migration keeps every row; the old Apps Script
deployment still works as a fallback by pointing tools/api-url.txt back at it).
▶ App (Cloudflare Pages PWA) — static frontend (
docs/app, deployed withwrangler pages deploy; the old github.io/app copy only redirects here), calls the Worker as a JSON API (POST {fn,args,idKlien}). Installable, no Google sign-in; name + PIN only. ~50 ms per call.▶ Offline demo — the real backend logic running in the browser on sample data. Nothing you do there is saved (refresh = reset).
Demo sign-in (name · PIN): Admin 1234 · Direktur 2468 · Manager 1357 · Yansen 2211 · Deny 3322 · Bastari 4433 · Staff Gudang 1111 (demo only — the live app has no default STAF account since v11.1)
There are no per-job records and no approvals on the production floor — the system must never slow production down.
| Step | Who | What is entered | Stock effect |
|---|---|---|---|
| Shift report (one per 12-hour shift: 1 = 08–20, 2 = 20–08) | Manager Produksi | Blowing section: its own operators, pellets taken from the warehouse (per SKU, kg), roll made per grade (KW / Super / Super Plus), BS per grade. Cutting section: its own operators, roll taken from the pile per grade (typed, not derived — the pile may come from earlier shifts), polybag made per grade, BS per grade. Either machine can be marked "not running". | blowing: pellets −, roll +, BS + · cutting: roll −, polybag +, BS + |
| Month-end warehouse count | Manager | physical kg per item in the warehouse | adjustment |
| Production count (v10.1, blind) | Manager | polybag produced this month, BS produced, pellets still in the production area, uncut roll, plastic inside the machines — the app only adds it up; the expected figure is never shown to the person counting | — |
| Reconciliation (v10.1) | Admin only | opening stock + purchases − ending stock of raw material (per the ledger, incl. warehouse-count differences) + material already in production at month start vs the manager's production count; difference = shrinkage / unrecorded; also compared with shift-report totals (roll made − roll used = uncut roll) | — |
| Close the month | Manager (reopen: Admin) | one tap — snapshot of COGS, gross profit, shrinkage; transactions dated in that month become read-only | — |
pellets into blowing − polybag made − BS − Δroll stock,
plus negative stock-count differences. Reports show it per month next to the COGS.SCR-BS-KW, SCR-BS-SUP, SCR-BS-SPL), counted at both machines, sold or sent to the
crusher (chassen) and received back as recycled pellets (RM-BP-DU). BS is valued at 0; its value comes back through
the crushing fee.METODE_HPP=RATA): pellets from purchase prices (PO / invoice), roll =
(pellets taken + BIAYA_PROSES_PER_KG × kg) ÷ kg roll, polybag = roll consumed ÷ kg polybag, recycled pellets =
(BS value + fee) ÷ kg. FIFO batches are gone.COGS = opening stock value + purchases − supplier returns + crushing fees + process cost − closing stock value,
gross profit = sales at SO prices − COGS. Stock value per category (raw material, roll, polybag, BS) is shown for
the opening and closing of the month. Closing the month stores the snapshot in Tutup_Bulan.PO, SO, PRODUKSI, GUDANG, MANAJEMEN — empty = all)
· ADMIN (everything + users + reopen months + reconciliation). Default accounts: Admin, Direktur, Manager (all modules),
Yansen (PO & invoices + all warehouse work: receipts, shipments, returns, damage, recycling), Deny (sales
orders), Bastari (shift reports & production count) — change the PINs. There is no default STAF account since
v11.1; Admin → Pengguna can still create STAF accounts (warehouse only, no prices). Module access is enforced on the server (wajibModul_) and mirrored in the UI.| # | Movement | Photo | Delivery note | Stock effect |
|---|---|---|---|---|
| PO | Purchase order (manager: item, kg, price, spec, ETA, TOP) | — | — | — |
| ⓪ | Goods receipt against a PO (supplier → GBJ), QC note | required | required + OCR | GBJ + |
| 🧾 | Supplier invoice → compare with Σ(received × PO price) → validate, correct price (recomputes average cost) | required | — | prices only |
| ↩ | Return to supplier — only from a recorded receipt | required | — | GBJ − |
| ⚠ | Damaged goods — reported by staff, approved by manager | optional | — | GBJ − after approval |
| ♻ | BS recycling: BS sent to a crushing vendor → recycled pellets back, with shrinkage & service fee | optional | optional | BS −, pellets + |
| SO | Sales order (customer, ship date, TOP, items, prices) | — | — | reserves stock |
| ④ | Goods out, sold (GBJ → customer), picked from an SO | required | required | GBJ − |
| ↩ | Return from customer | required | — | GBJ + |
?unduh=1 auto-downloads), payment terms counted from the document date or the actual first
shipment/receipt (TOP_Dari DOKUMEN|KIRIM, recomputed on every shipment/receipt), TOP prefilled 0, Yansen = PO+SO+GUDANG.INV/YYYY/MM/NNN or typed), and from a purchase order Yansen (module PO) creates a PO document; both are snapshots
stored in Dokumen and served by the Worker at GET /dok/<token> as a printable page ("Simpan PDF" = browser print).
The link is sent with WhatsApp via wa.me/<number>?text=… (message + link prefilled; the sender taps send) — numbers
are picked from a contact list (Master_Kontak_WA) or typed and saved. Company header, bank account and footer notes
live in Settings (Admin → Dokumen; editable by the PO account / Admin), and can be overridden per document. Cancelling a
document kills its link; a new PO document for the same PO number replaces the old one.KG_PER_BAL, default 25,
changed in Admin → Dokumen); stock is always stored in kg, documents show both. Polybag SKUs carry a size note
(cm × cm) shown under the SKU list and on documents.tambahFoto, once per entry, logged). Exception: BS recycling requires a photo of the crusher's delivery note both
when BS leaves and when recycled pellets come back.MAKS_EDIT_HARI or the month is closed. Every change is logged.apps-script/ business logic + UI (also still pasteable into Apps Script)
Config.gs schema, enums, default master data (SKUs per grade), settings
Server.gs receipts, shipments, review, stock, reports, users, SKU, opname, JSON API (doPost)
Pembelian.gs schema migration (v9→v10), purchase orders, invoices, average-cost engine, damage, reorder prediction
Penjualan.gs sales orders (TOP), monthly CSV export
DaurUlang.gs BS recycling (chassen)
Produksi.gs v10.1: shift reports (blowing + cutting per shift), production report, blind production count, reconciliation
TutupBulan.gs v10: monthly close — COGS, gross profit, shrinkage, lock / reopen
Media.gs photo upload + delivery-note OCR
Index.html / Styles.html / Script.html PWA frontend + i18n
cloudflare/ Worker + Durable Object runtime (src/), deploy.sh, README.md, DEPLOY.md
docs/app/ the real app (built by tools/build-app.py); docs/index.html = offline demo (tools/build-demo.py)
tests/ Node test suites — the real .gs files against an in-memory sheet AND against the Cloudflare engine
tools/ build-cf.py (Worker bundle), build-app.py, build-demo.py, seed.js, api-url.txt
See cloudflare/DEPLOY.md. Short version: on the owner's Mac,
cd "Claude Co Work/ipc-cloudflare" && bash deploy.sh (downloads a portable Node, wrangler deploy, sets the admin
key), or double-click deploy-v10.command in Finder. The schema migration runs itself on the first request after deploy (v10.1: v10 per-machine shift rows are merged into one row per shift, the old sheets are kept as *_lama). v10: archives Pekerjaan* /
Master_Standar_Susut as *_lama, adds the Kualitas column and the per-grade roll / polybag / BS SKUs, deactivates
the old RM-BS-* raw-material SKUs, switches METODE_HPP to RATA, adds the Manager Produksi / Sales Manager accounts.
cd tests && npm test # ~960 checks: sheet harness + Cloudflare engine (incl. live-data migration v9→v10→v10.1)
python3 tools/build-cf.py # bundle apps-script/*.gs → cloudflare/src/backend.js
python3 tools/build-app.py # rebuild docs/app/ (PWA); API URL from tools/api-url.txt — deploy: double-click deploy-app.command on the Mac (wrangler pages deploy docs/app --project-name h-plast)
python3 tools/build-demo.py # rebuild docs/index.html
cd cloudflare && npx wrangler dev --port 8787 --local # local Worker for the Playwright e2e
v12 — customer invoices from SOs and PO documents with shareable print links + WhatsApp send, contact list, bale/kg
entry, SKU size notes, document settings. v11.2 — photos optional at entry time ("+ Foto" later from history), crusher delivery-note photos mandatory for
recycling, every cancellation requires a reason. v11.1.1 — admin hapusTransaksiSebelum to purge test data. v11.1 — app moves to h-plast.pages.dev (Cloudflare Pages); Staff Gudang removed, Yansen does the warehouse work.
v11 — access revamp: per-account module access (Yansen PO · Deny SO · Bastari production), review/approval process
removed (entries final on save, 24-hour self-edit window for staff). v10.1 — two 12-hour shifts, one report per shift
with separate blowing / cutting operators, roll used typed by the cutting operator, blind monthly production count +
admin-only reconciliation. v10 — shift reports replace jobs, average
costing replaces FIFO, monthly close with COGS / gross profit / shrinkage, SO & PO with TOP. Backend on Cloudflare (free plan). Not yet: offline mode, barcode
scanning, receivables / payment tracking beyond the due date.
MAKS_EDIT_HARI or inside a closed month can be changed. Every change is logged.