بنقرة واحدة
awcms-mini-subscription-billing
Kerjakan bagian mana pun dari modul subscription_billing AWCMS-Mini (Issue
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Kerjakan bagian mana pun dari modul subscription_billing AWCMS-Mini (Issue
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Kelola/konsumsi sistem Module Management AWCMS-Mini (registry, validasi komposisi registry base, tenant lifecycle enable/disable, settings, permission sync/status, navigation, job registry, health/readiness). Gunakan saat menambah field descriptor baru (permissions/navigation/settings/jobs/health) di modul lain, saat menambah modul domain baru langsung di `src/modules/` dan perlu memverifikasi registry base tetap valid (`bun run modules:compose:check`), saat menyelidiki kenapa suatu modul terlihat degraded/orphaned, atau saat mengubah perilaku enable/disable/settings/health module_management sendiri. Sesuai src/modules/module-management/README.md, epic
Pilih dan jalankan profil deployment AWCMS-Mini (development/staging/production/offline-LAN). Gunakan saat menyiapkan deployment baru, memutuskan LAN-first vs registry-based, atau deploy ke Coolify. Sesuai doc 18 dan deployment-profiles.md/deploy-coolify.md.
Kelola sistem log/audit/metrics AWCMS-Mini yang sudah aktif — correlation ID lintas hop, retensi/purge audit log, extension point untuk consumer eksternal (alerting/export/SIEM), dan metrics port (counter/histogram/gauge berkardinalitas rendah untuk request/pool/job/provider). Gunakan saat menambah endpoint baru (correlation ID otomatis), menjadwalkan purge audit log, memasang consumer log/audit di aplikasi turunan, atau menambah/mengonsumsi metrik operasional. Berbeda dari awcms-mini-audit-log (APA yang wajib diaudit) — skill ini tentang BAGAIMANA sistem log/audit/metrics itu sendiri dikelola, sesuai Issue
Kerjakan bagian mana pun dari modul tenant_provisioning AWCMS-Mini (Issue
Triase dan perbaiki temuan CodeQL code scanning AWCMS-Mini (github.com/ahliweb/awcms-mini/security/code-scanning). Gunakan saat diminta "analisis code scanning"/"perbaiki CodeQL", saat sebuah PR gagal check CodeQL, atau saat menemukan alert baru. Mendokumentasikan satu TRUE-positive terkonfirmasi (password sungguhan → digest cepat yang dipersist = oracle cracking offline, plus dua "fix" yang membungkam alert tanpa memperbaiki apa pun) dan lima false-positive nyata (name-heuristic password, incompatible-types typeof/null, URL substring-sanitization di test mock, dua kasus dismiss resmi tanpa reformulasi kode, dan Bun.SQL tagged-template null-cast) plus pola "unused-local-variable di test kadang menandai coverage gap" — supaya tidak diinvestigasi ulang dari nol.
Daftarkan tabel bervolume tinggi ke registry lifecycle AWCMS-Mini (retensi/partisi/arsip/legal hold/purge), atau kerjakan bagian mana pun modul data_lifecycle sendiri. Gunakan saat menambah tabel baru yang tumbuh besar (log, telemetry, outbox, queue, provider attempt) dan butuh kebijakan retensi/purge aman, saat membuat/melepas legal hold, atau saat mengubah engine dry-run/archive/purge/archive-port. Sesuai Issue
| name | awcms-mini-subscription-billing |
| description | Kerjakan bagian mana pun dari modul subscription_billing AWCMS-Mini (Issue |
subscription_billing (src/modules/subscription-billing, Issue #876, epic
#868 SaaS control plane Wave 1, ADR-0022) adalah modul control-plane
KELIMA — Official Optional Business Foundation, opt-in per tenant,
default-disabled, tenant-scoped. Ia mencatat STATE komersial SaaS
sebuah subscription tenant: subscription terikat versi published offer
immutable (#870), billing period, invoice draft/issued (immutable) + line,
credit note, referensi alokasi pembayaran, dunning, dan upgrade/downgrade/
cancel terjadwal. PROVIDES billing_document_state (read-only, di-consume
payment_gateway #877); CONSUMES service_catalog_read (#870),
usage_aggregate (#875), dan lifecycle_transition (#873, write).
recordPaymentAllocation).defaultTenantState: "disabled") — gate
tests/unit/module-governance-default-disabled.test.ts.tests/unit/module-boundary.test.ts): tak ada
modul lain menulis awcms_mini_subscription_billing_*; tak ada modul lain
import app/domain modul ini; konsumsi lintas-modul HANYA di composition-root
(src/pages/api/v1/subscription-billing/_support.ts + scripts/*) lewat
port (service_catalog_read, usage_aggregate, lifecycle_transition).FOR UPDATE + UPDATE
ber-predikat state/version → 409 deterministik; generasi invoice IDEMPOTEN
per (subscription, period) via partial-unique + ON CONFLICT DO NOTHING +
subscription row-lock + replayConcurrentIdempotentWinner; job pakai lease
per-(tenant, job_kind) (billing-lease.ts) + bounded batch.domain/money.ts): minor-unit bigint, TIDAK PERNAH
float; semua aritmetika lewat BigInt; guard <= Number.MAX_SAFE_INTEGER di
CHECK + parser; single-currency per invoice (tolak mixed-currency);
rounding policy eksplisit (half_up/half_even/floor/ceil).application/request-parsing.ts): absent=
keep default, present-wrong-type=400 (validator menolak, bukan koersi);
event versioned emit dgn KONSTANTA ter-import langsung same-commit.sql/091_* schema (10 tabel), sql/092_* permissions.domain/: money.ts (exact minor-unit), subscription-state.ts,
invoice-state.ts, period.ts, request-validation.ts, job-kinds.ts.application/: billing-directory.ts (SQL), subscription-engine.ts,
invoice-engine.ts (generate/issue/void/credit/payment), dunning-engine.ts
(minta transisi #873 fail-closed), subscription-change-engine.ts,
billing-jobs.ts (renewal + dunning, lease), billing-lease.ts,
billing-document-port-adapter.ts (PROVIDES billing_document_state).src/pages/api/v1/subscription-billing/tenants/{tenantId}/...
(writes = platform-operator; reads = platform-operator ATAU self-tenant).scripts/subscription-billing-run-{renewal,dunning}.ts.application/control-plane-signals.ts —
collectSubscriptionBillingSignals(tx, now): invoice status='issued' yang
due_at sudah lewat, DIKELOMPOKKAN menurut tahap dunning TERAKHIR-nya.
LEFT JOIN LATERAL ... ORDER BY attempt_no DESC LIMIT 1, JANGAN join
biasa. Join biasa menggandakan satu invoice sebanyak jumlah retry-nya →
metrik overdue justru NAIK saat dunning bekerja lebih keras. Ini kebalikan
dari yang dimaksud, dan terlihat masuk akal di dashboard.none (overdue tapi belum pernah di-dunning) bermakna berbeda dari
tahap lanjut: menumpuk di none = invoice tidak MASUK dunning; menumpuk di
satu tahap lanjut = tidak KELUAR dari tahap itu.issued yang bisa overdue (draft belum ditagihkan, paid lunas,
void dicabut), dan due_at IS NULL tidak pernah overdue.103).Dunning MEMINTA transisi lifecycle lewat port lifecycle_transition (#873),
TIDAK PERNAH menulis awcms_mini_tenant_lifecycle_*. Fail-closed: error /
hasil non-ok dari port = outcome refused/not_available, JANGAN asumsikan
transisi ter-apply (catch { proceed } DILARANG).
Validasi selesai: bun run db:migrate (92 migrasi), typecheck, lint, semua
*:check, bun test, bun run build.