Changelog
Ada kabar baru.
Setiap perbaikan pada platform, sebagai kapal.
· kamo-shared-library
API _ SIGNATURE api- key scope + EsignGenericEnvelope.earth
Addititif, tidak ada benjolan versi: ApiKeyScopea.PI _ SIGNATURE - aktifkan aplikasi e- signature API (Business) - EsignGenericEnvelope.earth (EsignUAngeOrigin, nulable) - rekam apakah amplop dibuat melalui API vs MANUAL, jadi selesai signature meter dengan benar (API menghitung ke arah overage $0.20; MANUAL tidak pernah). Kolom ditambahkan ke prod melalui idempotent ALTER sebelumnya.
· kamo-internal
Status send- for- signature + amplop dalam penyunting dokumen
Tambahkan tombol 'Kirim untuk tanda tangan' ke kepala penyunting template yang membuka dialog untuk mengirim dokumen ke penerima dan melacak status penandatanganan, memanggil mesin ESigService / api / esig / amplop baru. - Rute proxy (OTK melalui generateOTK, cermin proksi templat): POST / GET / api / esig / amplop, GET [uid], POST [uid] / void, POST * * * * * * * * * * * * * * * * - SendForSignatureDialog: Kirim tab (baris penerima, pesan, habis habis) + Tab status (daftar amplop per- template, chip status, void / resend) - Tombol dinonaktifkan ketika template memiliki perubahan yang belum disimpan - i18n via nextt-intl * * * * * * * * * * * * * * *
· ESigService
Amplop generik buat / kirim mesin (sisi pengirim)
Tambahkan aplikasi internal API kamo- yang ditulis / api / esig / amplop untuk dikirim dokumen untuk tanda tangan, menggunakan kembali shared-lib yang sama entitas publik penandatanganan API berbunyi - Additif, orgagnostic pengganti untuk loan- yang dikamoLOS / EsignClient digabungkan membuat path. - POST create- and-send from a template: build EsignGenericEnvelope (AD _ HOC), satu EsignEnvelopeRecipient per signner dengan tanda akses segar, dan email setiap link / s / {env} / {penerima}? t = {token} penandatanganan link (escape-esquest) - Dapatkan daftar (dasbor amplop) + GET {uid} detail dengan status penerima - POST {uid} / void dan {uid} / penerima / {rid} / kirim kembali (memutar token) - Undang + delegate email share EsignEmailClient.sendUndang; penanda- rute link dikoreksi ke / s / {env} / {penerima}
· ESigService
Mesin API penandatanganan publik untuk sign.sign.pink
Implement the / api / esig / public / * signing API the kamo- signer app calls, mengubah sinyal hidup dari preview- stub menjadi backend bekerja. - validate (penerima token - > sesi penandatangan), sesi, persetujuan, stepup / start + verify (email OTP), kirim, decoder, delegate, dokumen - Sesi penandatangan cadangan (X-Signer-session), berbeda dari staf OTK - Dokumen bytes melalui baris pipa Img / MinIO yang asli (template imgId - > konverted- PDF ImgDat - > MinIO), bukan stub kabel / api / imaging / blobs - PDFBox meratakan: nilai ruas overlay + gambar tanda tangan pada desain koordinat, tambahkan halaman sertifikat E-SIGN / UETA; ditandatangani PDF disimpan di MinIO di bawah amplop signedBlobId dengan rekaman SHA- 256 - Append- hanya EsignSignature audit baris + EsignField Nilai kegigihan - Emits * * * * * * * * * * * * * * * * * * Pengukur asal API- berikut dalam # 3 / # 4 - Branding diselesaikan dari Organisasi + Organik Domain untuk tema pertama-cat - OTKAutFilter bypass / api / esig / public (token- ditulis, bukan staf OTK) Addititif saja; existing / api / esig / templates / * tersentuh.
· kamo-internal
Peron produk menjungkitkan dalam tab Organisasi
Permukaan platform-produk panggilan di mana itu milik-Platform Organisasi. Tambahkan Switch bergated per org (dinonaktifkan untuk Top-level org), dialog konfirmasi menjelaskan efek hak, sebuah 'Produk Platform' chip, peringatan no- katalog, update optimis, dan kesalahan snackbar. Semua string melalui next-intl.
· BillingService
Kelola Organisasi. Adalah PlatformProduct dari Platform ÁOrgs
PlatformAccountSummary expose isPlatformProduct + Hassubscription Pasar; baru PUT * * * * * * * * * * * * * (Platform-admin) set flag dan invalidates anggota org 'hak (produk mereka akar, dan sehingga fitur, perubahan). Tingkat-atas org adalah akar implisit dan tidak dapat menjadi toggled.
· kamo-shared-library
Explisit Organzation.IsPlatformProduct sebagai sinyal hak-root
Ganti turunan 'memiliki sebuah pasar SUBSCRIPSI' heuristik dengan eksplisit, admin- set tanda kepemilikan. Produk platform (misalnya sign.pink) adalah label putih produk platform beroperasi dan adalah akar hak sendiri; pelanggan org - bahkan satu berjalan sendiri pasar SUBSCRIPSI untuk menjual kembali kepada pelanggannya - adalah bukan, dan tetap berhak untuk platform. Entitlement RootResolver sekarang membaca flag (plus implisit top-level root) dan tidak lagi tergantung pada pasar kepemilikan. Tambahkan kolom _ platform _ product (BOOL DEFAULT FALSE) - membutuhkan KamoInitializer untuk membuatnya sebelum layanan yang memilih Organisasi menyebarkan.
· SecurityService
Anggota Scope berhak untuk akar produk, bukan KamoCRM
Layanan Entitlement sekarang menyelesaikan akar hak setiap anggota melalui Entitlement RootResolver (pasar terdekat - memiliki leluhur - atau -self) daripada berjalan ke tingkat atas org. Lantai Freetier dan tanda akses produksi berasal dari akar itu, dan is KamoCrumSubscription menjadi subscription GrantsRootAccess (plan-org vs root, tidak pernah account penagihan). Keuntungan Keanggotaan ProductRootOrganiId sehingga konsumen akses terhadap produk yang tepat. Sumber BillingSetupService pasar + Free plan dari produk org baru root ketika menjaga Akun penagihan pada tingkat atas KamoCRM org - yaitu orang tua memiliki tagihan, anak dapat memiliki produk / pasar. Perilaku tidak berubah sampai org benar-benar memiliki pasar sendiri (KamoCRM adalah hanya pemilik pasar saat ini, jadi setiap anggota masih menyelesaikan untuk itu).
· kamo-shared-library
Resolve berhak oleh product-root org, bukan platform Top-level
Memperkenalkan Entitlement RootResver: pasar terdekat - memiliki leluhur-atau-diri dari org (akar produknya), jatuh kembali ke platform top-level. Ini departies * produk apa yang Anda berhak untuk * (pasar / rencana pemilik) dari * yang membayar * (billing account) dan dari tunggal top-level org, sehingga produk white- label org seperti sign.pink yang memiliki pasar sendiri menjadi akar hak sendiri. * * * * * * * * * * * * sekarang sumber bebas baseline dari org akar produk (bukan findFirstByIsTovelTrue), dan menyelesaikan rencana oleh produk / pasar org daripada billing-account org. Backwards kompatibel: KamoCRM saat ini hanya pemilik pasar, jadi setiap org yang ada menyelesaikan ini persis seperti sebelumnya - perilaku hanya menyimpang sekali Pohon sub- memiliki pasar sendiri. Addititif; tidak ada benjolan versi.
· kamo-shared-library
Tambahkan penerima amplop, nilai ruas, entitas status penerima
Periksa pada model in- progress esign: EsignEnvelopeRecipient (+ repo), Esigning FieldValue (+ repo), EsignRecipientStatus, dan pemutakhiran EjigsignerType. Addititif; tidak ada benjolan versi.
· kamo-shared-library
Tambah EsignUadgeRecord untuk penguraian penggunaan per-signature
Tambahan baru - hanya penggunaan entitas (mirror AiUgageRecord) dipancarkan di tanda-tangan Selesai. Hanya APl-earths tanda-tangan terhadap sebuah rencana yang dimasukan bulanan quota + overage (sign.pink Business: 40 / mo termasuk, maka $0.20 masing-masing); MANUAL signature tunggal-pengguna direkam tetapi tidak pernah ditagih. billing _ period (YYYYY-MM) mendukung kumpulan bulanan; laporan _ ke _ stripe membuat penyerahan penggunaan Stripe Idempoten. Addititif saja; tidak ada benjolan versi.
· ConversionService
Pertahankan rasio aspek, jangan pernah peregangan bukan-persegi logo
Frame PNG / ICO dibuat dengan keep AspectRasio (salah), peregangan logo non-square menjadi persegi terdistorsi. Center- cocok dengan logo pada Kanvas persegi transparan sebaliknya, menjaga rasio aspek, sehingga terlihat favicon benar untuk bentuk logo yang diunggah tanpa memerlukan citra sumber kuadrat.
· KlusterServices
Pre- benih sign.pink + www.sign.pink dalam STATIC _ DOMAINS
sign.pink adalah domain apex baru (consumer e- signature brand / white- label Kamo penyewa org). Pre-seed apex + www so a Let 's Encrypt cert ada sebelum lalu lintas HTTPS pertama; * .sign.pink subdomains mendapatkan per- FQDN certs dinamis ketika memukul pertama, sama mekanisme sebagai * .priceturbo.com.
· kamo-signer-monorepo
Monorepo baru + mobile -first e- signature aplikasi penandatanganan
Turborepo + pnpm area kerja monorepo perumahan dapat digunakan kembali e- sign paket diekstrak dari kamo- internal ditambah aplikasi baru, ultra- dipoles kamo- - - pengalaman SIGNING partai kedua (desainer / penulis sisi tetap di kamo- internal). Paket: - @ kamo / esign- tipe inti + DesignData wire kontrak, skema zod, waktu-jalan validasi field, signStore (zustand) - @ kamo / esigns -ui bagian interaktif masukan + read-only field / noltation renderers (forked dari kamo- internal FieldControl) - @ kamo / doc-render bundled pdf.js page renderer (self-hosted workers, no CDN), responsif, rantasi - overlay benar - @ kamo / tema per- penyewa branding bootstrap (getTheme Path, Theme Logo, DynamicMetaLoader) - @ kapo / api-client browser fetch + server Redis / forwarding assisters - @ kamo / config shared tsconfig / tailwind preset / eslint App (apps / kamo-signer): - token- scoped signer auth (SIGNSESH httpOnly session, BFF route handlers) - welcome - > persetujuan (ESIGN / UETA) - > eIDAS AES step-up OTP - > dipandu penandatanganan - > selesai - > pelengkapan, semua fase animasi (framer-motion, reduced- motion sadar), mobile-pertama sama dengan desktop, WCAG-minded - signature capture suite: draw / type (script font) / upload / adopt-all - multi- dokumen, decoder, delegasi / reassign, i18n penuh (next-intl, 22 locales) - mode pratinjau dapat berjalan (tidak ada backend diperlukan) + / .forgejo + / k8s (HostRegexp tanda tangan
· kamo-internal
Full- lebar perusahaan menulis ulang dengan pratinjau hidup
LoanProductForm adalah kolom sempit tunggal (maxLebar: 880) dengan hardcode Inggris di mana-mana. Sekarang menggunakan pola perusahaan yang sama seperti halaman penawaran: Tata letak: - Full-width gradien header dengan remah roti, panah belakang, baik lencana - Dua-kolom grid (6fr / 6fr) pada lg +, kolom tunggal di bawah - Formulir di kiri, hidup "Pratilik Produk" di sebelah kanan Bagian formulir: - Pilihan yang baik sebagai ToggleButtonGroup dengan deskripsi (Instalasi vs LOC), tidak dimakamkan di dropdown - ini adalah pilihan struktural yang reformasi yang lain, jadi layak dibanggakan - Bagian blok dengan ikon (Basics - Rats dimasukkan sebagai%, dikonversi ke bps di kawat (tidak ada lagi "3600 = 36%") - Semua label field via next-intl t () - Hari - menghitung tooltip menjelaskan ACT _ 365 vs ACT _ 360 Sisi pratilik: - Kartu Hero: nice chip, chip kode produk, nama, judul, deskripsi - 4-tile statistik grid: rate, initiation, late fee, NSF fee - Batas & aturan grid (kind- sadar: jangkauan + frekuensi untuk angsuran, * * * * * * * * * * * * * * * untuk LOC) - Kartu penawaran contoh (angsuran): pembayaran bulanan, bunga total, total biaya, sampel berasal di tengah titik dari jangkauan utama - Keripik compliance: menyatakan diperbolehkan (cap 24 + overflow chip), autopay dibutuhkan + diskon, promissory- catatan pengikatan template - Catatan kaki menjelaskan bagaimana produk ini mengalir ke halaman penawaran LoanProductForm sekarang membungkus baik halaman baru dan edit. pembungkus halaman lulus pasar judul sehingga breadcrumb menyelesaikan bersih.
· kamo-internal
Tata letak dua kolom dengan panel pratinjau hidup
Halaman tawaran baru adalah kolom sempit tinggi di layar lebar - terbuang setengah viewport. Sekarang menggunakan CSS Grid dengan bentuk di sebelah kiri (5fr) dan panel "Offer Pratilik" hidup di sebelah kanan (7fr) yang memutakhirkan sebagai operator jenis. Kolom tunggal pada layar kecil (< lg). Bagian formulir: - Bagian blok dengan ikon (Pemborong Produk) - Bidang Peminjam stack vertikal (ID anggota + state) dalam lebih kompak presentasi sekarang bahwa ruang horisontal disediakan untuk preview Sisi pratilik (hanya ketika suatu produk dipilih): - Kartu pahlawan dengan latar belakang gradien, jenis chip, nama produk, dan judul yang dapat dibaca manusia ("$5.000 - bulan angsuran "$25.000 baris kredit") - Grid statistik 4-tile: principal, rate, pembayaran bulanan, istilah (angsuran) atau principal, rate, draw periode, pembayaran (LOC) - Fee rincian (asal / akhir / NSF / tahunan) dengan "custom" chip ketika penimpa diterapkan - Panel ringkasan biaya: net disbursed, total bunga, total biaya - Jadwal Amortisasi mengintip: 3 + 3 baris terakhir dengan "{N} lagi pembayaran... "baris kesenjangan untuk istilah > 6 bulan - Catatan pengingat TILA menjelaskan backend menghitung APR + builds sebenarnya jadwal nyata + render pengungkapan saat pengiriman All math is client- side straight- line amortization (P × r × (1 + r) ^ n / (1 + r) ^ n - 1)) - pratilik yang setia, bukan APR yang diungkapkan terakhir. Backend masih memiliki kebenaran.
· kamo-internal
Halaman tawaran baru Polandia - negara kosong, lencana LOC, istilah gubahan
Tiga jeda UX yang ditawarkan setelah refactor sebelumnya: Keadaan kosong. Ketika pasar tidak memiliki Loan Products belum, dropdown digunakan untuk diam-diam membuat kosong dan operator tidak tahu apa yang harus dilakukan. Sekarang diganti dengan sebuah keadaan kosong pahlawan (ikon, judul utama, primer pada Pemasangan vs LOC, dan "Create Loan Product" CTA diarahkan ke produk / aliran baru). 2. produk dropdown. Menambahkan sebuah chip berwarna (LOC = ikon biru + pengulangan, Pemasangan = ikon dompet = hijau +) memberikan keduanya dalam nilai yang dipilih dan di dalam setiap opsi dropdown, ditambah deskripsi produk dalam opsi. 3. "Istilah Terkunci" blok membingungkan bernama - itu tersirat tidak berubah tanpa cara apapun untuk menimpa. Menambahkan panel "Istilah Gubahan" yang mengekspos peroffries overrides untuk suku bunga, diungkapkan APR, dan Biaya awal (harga hubungan, susah payah, promosi Harga). Ketika diset, kartu locked-terms secara visual menyerang melalui nilai produk dan menunjukkan override (misalnya 14.99% 1.99%) sehingga Operator melihat persis apa yang akan dikeluarkan. Dukungan backend ditekan di KamoLOS 0e80393; tipe yang diperluas dalam losApol.ts sehingga bidang override mengalir melalui creatteOfferDraft.
· kamolos
Per- menawarkan overrides untuk tingkat, APR, dan biaya awal
LoanOfferCreateRequest memperoleh tiga bidang opsional - menarik RateBpsOverride, aprBpsOverride, asli FeeAmountOverride. CreateDraft berlaku mereka ketika set dan sebaliknya jatuh kembali ke snapshot produk. Gunakan kasus: hubungan Harga (rate kickback untuk peminjam ulang), kerja yang susah (tak tertahankan Asli), satu - off penawaran promosi. Untuk produk-produk yang diangsuran, hanya RateBpsOverride yang menarik adalah jalur normal - APR dihitung dari tarif + biaya + jadwal. aprBPSOverride terkena untuk kasus langka sebuah APR secara eksplisit diungkapkan harus berbeda dari komputasi. Audit: menulis OFFER _ DRAFTED untuk setiap draft (seragam dengan OFFER _ SEN / ACEPTED). Logs nilai override eksplisit vs baku produk sehingga jejak dapat merekonstruksi apa yang diwariskan vs. set per- menawarkan.
· kamo-internal
Expose PERSONAL _ LOANS in commerce- type & engagement pickers
Tambahkan PERSONAL _ LOANS ke daftar Commerce _ TYPES dan Engagement Type sehingga baru KAMOLOS personal- pinjaman pasar dapat dibuat dari pasar / baru dan Pasar / menyunting halaman-halaman, muncul di QuickActionsBar (dengan / perdagangan / personal- pinjaman / baru route), dan termasuk dalam penyatuan baris pipa-tipe filter dan konfigurasi.
· kamo-internal
T6 + T7 frontend polish + org laporan + auto-pay UI
Frontend polish (T6): - New lib / format.ts: lokal -aware pembantu Intl - format Mata uang / format Tanggal / format Tanggal / format PercentBps. Mengganti kode toLocaleString () + slice (0,10) pola tersebar di codebase. - BorrowerAutoPayCard: daftar / jeda / resume / cancel / edit UI penuh untuk otomatis-bayar mesin negara. Permukaan besar-mode dropdown (PENERJEMAH = SUGENG PRAYITNO) FIXED _ AMOUNT) + day -of -month + payment-method selector. Ujung belakang adalah sudah kabel; ini adalah bagian terakhir untuk peminjam layanan diri. - Antrian charge- off: IRS 1099-C alasan kode dropdown (8 resmi huruf A-H per IRC adalah 6050P) menggantikan daerah alasan bebas teks; default * * * * * * * * * * * * * * * * * * Catatan lapangan tetap. Mata uang yang diberikan melalui format. Org melaporkan (T7): - Baru... 5-ember dashboard (Saat ini / 1 / 29 / 30-59 / 60-89 / 90 +) dengan% -of -total + color-code perbatasan atas. Drill--through link ke charge- off antrian. tambahan losApi: - agingReport (orgId) + AagingReport type - Audit Search (filter) untuk multi- filter regulator endpoint - Tipe union LoanChargeOffReasonCode - Konfirmasikan tanda tangan ChargeOff menerima ReasCode
· kamolos
Tier 6 + 7 + 9 + 10 - frontend polish, org laporan, OpenAPI, JaCoco
T6 (frontend polish): - Baru / lib / format. ts: lokal -aware format / format Tanggal / format DateTime / format PercentBps via Intl APIs (menggantikan hardcode toLocaleString + slice (0,10) patterns). - BorrowerAutoPayCard: mendaftar / jeda / resume / batalkan / edit auto- pay dengan penurunan mode-besar (INSTALLMENT _ SCHEDULED / MIN _ PAYMENT / FULL _ STATEMENT _ BALANCE / FIXED _ AMOUNT) + day -of-month + payment -method pemilih. - Antrian -off: IRS 1099-C alasan kode dropdown (8 huruf resmi A-H per IRC 6050P) menggantikan daerah alasan bebas teks; default G. Pemformatan mata uang melalui format. T7 (org laporan): - New LoanReportsController.ages: menghitung pinjaman ke saat ini / 1-29 / 30-59 / 60- 89 / 90 + ember melalui paged DELINQUENT scan + countByOrganization Dan Status untuk ACTIVE. - * * * * * * * * * * * * * * 5- bucket dashboard dengan% -of-total + warna-kode band + bor-melalui ke charge- off antrian. T9- T10 (DX + docs): - * * * * * * * * * * * * * * / v3 / api- docs + / swagger-ui.html auto-dihasilkan. OpenApiConfig menyetel judul + deskripsi + versi. - DevSeedLoader @ Profile ("dev"): boots dua contoh LoanProducts (12- mo cicilan + perpetual LOC). Idempopent (melewatkan kode produksi yang ada). - Plugin JaCoo Maven: Persiapan-agen + laporan pada tahap tes. Melingkupi HTML di target / situs / jacoco / index.html untuk konsumsi CI. tambahan losApi: - agingReport (orgId) + AagingReport type - Audit Search (filter) untuk multi- filter regulator endpoint - Konfirmasikan tanda tangan ChargeOff menerima ReasCode 36 tes lewat.
· kamolos
Tier 5 compliance batch
- OfacSanctionssService: Jaro-Winkler cocok dengan fuzzy @ Alvar0.92 setelah tepat-cocok lewat. Nilai kesamaan permukaan rusak. Dapat dikonfigurasi melalui los.ofac.fuzzy- ambang batas. - AdverseActionNoticeService: penamaan generator PDF 1002.9 compliant CFPB sebagai regulator federal. Penyewa alasan - untuk -decoder + standar Bahasa ECOA non-diskriminasi. Disimpan untuk MediaService. - * * * * * * * * * * * * * * multi- filter audit query untuk regulator Panggilan pengadilan dan penahanan. Berpajang. - LoanChargeoffService.confirm menerima parameter ReasCode (IRS 1099- C box-6 huruf), bertahan pada Loan.chargeOffReasonCode dan dimasukkan ke dalam YearEndTaxJob 's 1099- C PDF render. Dasar G. - LoanProductValidationService memperingatkan ketika menarik RateBps > MLA 3600bps cap sehingga kepatuhan dapat bendera untuk offer- waktu penayangan MLA. - YearEndTaxJob: menghapus produksi 1099Int branch - inert (tidak ada Ada aliran pembayaran pinjaman-bunga. Stub kiri dengan reaktivasi panduan sekali seperti tanah aliran. Semua 30 unit tes lulus.
· kamo-shared-library
LoanChargeOffReasonCode (IRS 1099- C box 6) + audit search
- New LoanChargeOffReasonCode enum (A _ BANKRUPTCY.. H _ LAIN) per IRC 6050P - Kolom Loan.chargeOffReasonCode - * * * * * * * * * * * * * multi- filter @ Query untuk penelepon regulator (loanId / kind / actorType / actorMberId / from / to) - paged
· kamolos
Tier 3 security + Tier 8 bug cleanup batch
T3 — Security: - New RateLimitFilter (Bucket4j): 1000/min per IP for webhooks, 10/min per session for offer accept/decoder/rescind, 60/min general. Registered ahead of ProxyHmacFilter so abuse hits the bucket before cryptographic verification cost. - SecurityConfig adds HSTS + frameOptions(DENY) + contentTypeOptions via Spring Security HeaderWriter. - StripeConfig fails fast on prod profile with non-live key. T8 — Bug cleanup: - **************** looks up Loan.productIdSnapshot → LoanProduct.feeNsfFlat instead of hard-coded $25. $25 remains the fallback when product or fee is missing. - **************** gains an AdjustmentTarget field (PRINCIPAL / INTEREST / FEES). manualAdjust dispatches per target rather than always touching principal. Audit metadata now records which counter was touched. - **************** finds the most recent ACTIVE *or* PAUSED plan and reactivates it instead of creating a new row that orphans paused ones. - **************** typed FetchResult record with status (OK / NOT_FOUND / UNREACHABLE / UNCONFIGURED). fetchBlob(uid) preserved as legacy bytes-or-null adapter.
· kamo-shared-library
*
Digunakan oleh * * * * * * * * * * * * * * untuk mengaktifkan kembali ada yang ada PASSED plan daripada membuat baris duplikat bahwa anak yatim yang pause.
· kamo-internal
/api/los proxy HMAC-signs identity headers
When LOS_PROXY_HMAC_SECRET env var is set, the proxy now computes **************** secret) and sends X-Proxy-Signature + X-Proxy-Timestamp alongside the X-Org-Id / X-Member-Id headers. KamoLOS's new ProxyHmacFilter validates this (±60s skew, constant-time compare) so a client bypassing kamo-internal can no longer spoof identity headers. Unset secret = local-dev pass-through (filter disabled on the backend side too).
· kamo-internal
Halaman detail sisi organik + penyesuaian / janji API
- Losapi: Manual Adjust, waiveFee, promiseToPay - * * * * * * * * * * * * * * sepenuhnya halaman operasi * 4-up balance cards (current, principal, interest, next due) * Bentuk penyesuaian manual (CREDIT / DEBIT, alasan yang diperlukan) - panggilan / api / los / penyesuaian / manual * Berjanji - untuk membayar formulir - panggilan * * * * * * * * * * * * * * * * * * Statemen + tabel pembayaran * Embed < LoanAudititTimeline > untuk log acara penuh - Ini menyelesaikan link yang rusak yang MarketActiveLoansTab + PipelineActiveLoansTab menunjuk ke.
· kamolos
Campuran akhir - kepatuhan, paket, penyesuaian, Grafana, tes
Pujian: - MlaCheckService - Undang-Undang Penegakan Militer ditutupi - peminjam lookup terhadap DoD MDC single-record query. ReturntNotCovered jika tidak dikonfigurasi jadi dev tidak hard- gagal; produksi HARUS mengkonfigurasi los.mla.endpoint + api-key OR menjalankan manual MLA di org 's KYC langkah (PII akses diperlukan). - OfacSanctionssService - Daftar SDN Keuangan cached In- memori, segar nightly from sdn.csv Unicode NFD normalisasi + diacritic stripping. Wired ke LoanOfferService.send: SDN menekan blok pengiriman dan menulis Luruskan baris audit. - LoanLifepycleService cooling - off sekarang membaca LoanStateRule.CoolingOffDays Untuk negara peminjam (menggantikan Waktu LocalDate.now () placeholder). - Stripe account.updated webhook now syncs charges / payouts / details flags + default _ receds + commentions _ disabled _ reason ke LoanOrgans StripeConnection sehingga cron pekerjaan + konfigurasi org UI melihat keadaan kemampuan hidup. Paket penutupan: - Baru DisclosurePacketBuilder bundles TILA kotak + pesan privasi GLBA + ECOA bukan-diskriminasi pemberitahuan + ACH otorisasi mandat menjadi satu PDF via PDFBox PDFMergerUtility + toko di MediaService. Setiap komponen adalah tercatat sebagai sebuah baris LoanDisclosure keyed untuk tawaran tersebut. LoanOfferService.send Bangun paket secara otomatis sebelum amplop Esign dibuat. Operasi servis: - * * * * * * * * * * * * * - biaya / kepala sekolah kredit -or -debit dengan alasan yang diperlukan; memancarkan LoanPacial (INTERAL _ ADJUSTMENT atau REVERSAL _ ADJUSTMENT) + MANUAL _ ADJUSTMENT audit - LoanAdjustment Service.waiveFee - membalik LoanFee.wareed Pada + kredit feesPaidToDate + emits FEE _ WAIVED audit - * * * * * * * * * * * * * * - bukan baris komitmen keuangan digunakan dalam D60 + pelacakan alur kerja, memancarkan PROMISE _ TO _ PAY _ LOGGED audit - LoanAdjustMentController mengekspos / api / los / penyesuaian / {manual, biaya / {uid} / waive, promis- to-pay} Observasi: - * * * * * * * * * * * * * * - dashboard importable dengan pengukur status, tingkat hasil pembayaran, R-code kembali dengan kode, webhook p50 / p90 / p99, disbursements / jam, charge-offs / day, JVM heap, HTTP rate Tes (30 total, semua hijau): - 7 AmortizationEngine - 9 InterestAccrualEngine (termasuk previously -fixed 100x bug) - 5 Payment Allocator - 4 NachareturnCode (coba lagi kelas + mandat - pembatalan kode + deskripsi) - 5 OfacSanctionssService (cocokkan / hit / diacritics / alias / disabled via refleksinya - injected cache, tidak ada jaringan atau wadah tes yang dibutuhkan)
· kamolos
P2 batch - observability, test, year-end pajak, real Stripe ID
Observasi: - mikrometer- registray- Prometheus pada classpath - / actuator / Prometheus terkena melalui konfigurasi manajemen (kedua konfigurasi lokal + k8) - LoanMetrics service: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * los _ charge _ off _ total, los _ disbursement _ total, los _ lend _ status _ count {status} gauge, * * * * * * * * * * * * * * - Counters kabel ke layanan pos LoanPayment + LoanChargeOffService Uji Matematika +: - 21 unit tes meliputi AmortizationEngine (pembayaran tingkat, APR Newton- Raphson, tanggal dua bulanan, invarian utama + bunga, bad- masukan penjaga), InterestAccrualEngine (ACT _ 365 / ACT _ 360 DPR, satu / hari / tiga puluh hari accrual, LOC ADB), Payment Allococator (biaya £bunga Perintah utama, partials, overpaid, nulls) - * * Fixes 100x interest-rate bug * * * * * * * * * * * * * * * * - Divisor adalah 36500 / 36000 bukan 3.650.000 / 3.600.000 (annualRate fraksi membutuhkan baik / 10.000 bps gps AND / 365 hari), sehingga diperoleh bunga adalah 100 × terlalu tinggi. Tes ditambahkan yang akan menangkapnya. Identifier Stripe Real (tidak ada lagi placeholder): - StripeController.onboard StripeControllerboard sekarang bertahan LoanOrolm StripeConnect on sukses pembuatan Akun Stripe; .status mengembalikan keadaan onboarding - New StripeIdResolver: conneccated AccountIdForOrg () + malas getOrCreateBorrowerPelanggan () (idempotency- keyed Pelanggan. Create di bawah akun yang terhubung, berlanjut ke Loan.stripeCustomer Id) AchDebit + .FireDisbursement sekarang mengatasi nyata ID melalui StripeIdResolver daripada "acct _ placeholder _ *" Petunjuk Pengingat: - SchedulingJob Pengingat: Sapu malam emits PAYMENT _ DUE _ 3 _ DAYS, PAYMENT _ DUE _ DAY, PAYMENT _ LATE _ DAY _ 1 / 5 / 15, OFFER _ EXPIRING (24h Sebelum kadaluarsa, STATEMENT _ AVAILABLE (pada generasi). Dedup- keyed via * * * * * * * * * * * * * * sehingga tayangan ulang idompoten. Pajak Year- end: - YearEndTaxJob (cron 06: 00 Jan 5): menghasilkan 1099- C untuk charge-offs $600 + 1099- INT untuk bunga kredit > $10. Formulir PDFBox- disimpan ke MediaService, direkam sebagai LoanDisclosure dengan formulir / tahun metadata sehingga tayangan ulang adalah idempoten. - Loan.tax1099 Isi otomatis yang dapat diisi pada charge-off konfirmasi ketika jumlah £600
· kamo-shared-library
LoanOrganisme StripeConnect + Pinjaman bidang pajak / akcrual + indeks panas
- New LoanOrgans StripeConnection Entity (one-per-org, holding stripeConnectedAccountId + Sambung kemampuan onboarding) + repositori - Pinjaman: stripeCustement Id (lazy- dibuat di bawah akun org yang terhubung), Terakhir AccrualDate, taksi 1099INTRUBLE, taksi 1099CLIGHT - Indeks komposit panas: * pinjaman: (org _ id, status), (peminjam _ anggota _ id, status), (next _ paid _ due _ at), (status, bule _ tier) * pinjaman _ pembayaran: (pinjaman _ id, dimulai _ at), (pinjaman _ id, status), (stripe _ pembayaran _ intent _ id), (pernyataan _ id) * pinjaman _ pernyataan: (pinjaman _ id, pernyataan _ nomor DESC), (due _ date, status) * pinjaman _ menawarkan: (org _ id, status), (peminjam _ anggota _ id, status), (status, kadaluarsa _ at)

Alam semestamu menunggu.
Mulai gratis dalam beberapa menit. Tambahkan produk kapanpun Anda siap — tidak ada migrasi, tidak ada login baru.
Gratis selamanya — tidak diperlukan kartu kredit