원클릭으로
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.