Değişiklik Günlüğü
Yeni ne var?
Gemideki her iyileştirme.
· kamo-shared-library
API SIGN api-key kapsamı + EsignGenericEndü.origin
Katkı, hiçbir sürüm bump: - ApiKeyScope.API SIGN form - programmatik e-signature API (Business) - EsignGenericEn Developmente.origin (EsignUsageOrigin, nullable) - bir an için kayıt zarf API vs MANUAL aracılığıyla yaratıldı, bu yüzden imzaları doğru bir şekilde tamamladı (API, $ 20'ye kadar sayılıyor; MANUAL asla yapmaz). Köşe, prod idempotent ALTER önceden.
· kamo-internal
Send-for-signature action + zarf durumu belge editörü
Bir ' İmzalama' düğmesine imza için bir 'Send' düğmesine ekleyin. Belgeyi alıcılara gönderme ve imza durumunu takip etme, arama Yeni ESigService /api/esig/en Geliştirme motoru. - Proxy rotaları (OTK’yı üretirken, şablon proxy aynaları): POST/GET /api/esig/en Geliştirmeler, GET [uid], POST [uid] / kaçının, POST **************** - SendForSignatureDialog: Mesaj Gönder (recipient rows, message, expiry) + Durum sekmesi (per-template listesi, durum cipsi, boşluk / kesinti) - Şablonun uyarlanmamış değişiklikler olduğunda düğme engelliler - i18n via next-intl ************************
· ESigService
Genric zarf / son motor (sender side)
OTK-authed /api /esig/en Developmentes API kamo-internal sürücüleri göndermek için İmza için belgeler, aynı paylaşılan varlıkları yeniden kullanarak halka açık İmza API okur - kredi için katkı maddesi veya kredi-agnostic yedek çift KamoLOS/EsignClient yol yaratır. - POST bir şablondan ortaya çıkıyor: EsignGenericEn Geliştirme (AD HOC), Bir EsignEn DevelopmenteRecipient per signer with a fresh hashed access token, and and and Her bir e-posta /s/{env}/{recipient}?t={token} imza bağlantı (en iyi niyetli) - GET listesi (en Developmente dashboard) + GET {uid} Alıcı statüsü ile detay - POST {uid} / Kaç ve {uid}/recipients/{rid}/resend (kahkahalar) - Invite + dele e-postaClient.sendInvite; signer-route Bağlantılar /s/{env}/{recipient}
· ESigService
Kayıt için API motoru imzalayın.sign.pink
/api/esig/public/* kamo-signer uygulama çağrılarını imzalamak, Canlı işaretleyiciyi önbelleğe dönüştürmek. - doğrulama (önemli token -> oturum), oturum, onay, stepup/start+verify (email OTP), gönderin, decoder, delege, belge - Redis-backed signer seansları (X-Signer-Session), personel OTK'dan ayrı - Gerçek Img/MinIO boru hattı aracılığıyla doküman (template imgId -> dönüştürülmüş-PDF ImgDat -> MinIO), asla Wid /api/imating/blobs stububub - PDFBox düzleştirilmiş: Overlay alan değerleri + tasarım görüntüleri tasarımda koordinatlar, append E-SIGN/UETA denetim sertifikası sayfaları; PDF depolamak MinIO'da, SHA-256 ile imzalanmış olan BlobId'ı imzaladı. - Append-sadece EsignSignature denetim satırları + EsignField Değer kalıcılık - Emits ************************ API-origin metreleme #3 / #4 - Branding, Organizasyon + OrgDomain'den ilk boyamalar için çözüldü - OTKAuthFilter ates /api/esig/public (token-authed, personel OTK) Sadece alıntı; mevcut /api/esig/templates/* touched.
· kamo-internal
Organizasyonlar sekmesindeki platform ürünü
Yüzey, ait olduğu platformun ürün tasarımı – Platform → Organizasyonlar. Bir kapı anahtarını org'a ekleyin ( üst düzey org için kullanılabilir), Entitlement etkisini açıklayan bir onay dialog, bir 'Platform ürünü' çip, no-catalog uyarı, iyimser güncelleme ve hata atıştırmalıkbar. Tüm dizeler Bir sonraki-intl aracılığıyla.
· BillingService
Organizasyonu Yönet.isPlatform Ürün Platformu'ndan → Orgs
PlatformAccountSummary yankıları Platform Ürün + hasSubscription Pazar; yeni PUT ******************** (platform-admin kapılı) Bayrakları ayarlar ve org'un üyelerini geçersiz kılar (as product their product) kök ve böylece özellikler, değişim). Üst düzey org kapalı kökdür ve olamaz Toggled.
· kamo-shared-library
Explicit Organizasyon.isPlatform Ürünü entitlement-root sinyal
Elde edilen "kendi bir SUBSCRIPTION pazarı" heuristic'i açık, admin-set sahipliği bayrağı. Bir platform ürünü (örneğin, işaret.pink) beyaz etiket Platform çalışır ve kendi entitlement köküdür; bir müşteri veyag – Hatta biri kendi SUBSCRIPTION pazarını müşterilerini yeniden satın almak için kullanıyor - is is is is istir Değil ve platforma hak kalır. EntitlementRootResolver şimdi okur Bayrak (artık üst düzey kök) ve artık piyasaya bağlı değil mülkiyet. Adds is platform product column (BOOL DEFAULT FALSE) - gerektirir KamoInitializer, Organizasyon dağıtmasını seçen hizmetlerden önce oluşturmak için.
· SecurityService
Kapsam üyesi ürün köküne hak ediyor, KamoCRM değil
EntitlementService şimdi her üyenin entitlement kökünü her üyenin entitlement kökü ile çözüyor EntitlementRootResolver (nearest market-owning Horse-or-self) yerine, üst düzey org'a yürümek. Ücretsiz katmanlı zemin ve ürün erişim bayrağı Bu kökden elde edin ve KamoCrmSubscription abonelikGrantsRoot Access haline gelir. (plan-org vs kök, asla fatura hesabı). ÜyeEntitlements kazanımlar kazanır ÜrünRootOrgId böylece tüketiciler doğru ürüne erişim sağlamaktadır. BillingSetupHizmetleri piyasa + Yeni veyag'in ürününden ücretsiz plan Üst düzey KamoCRM veyag'de fatura hesabı tutarken kök - i.e. Ebeveynlerin faturaları var, çocuk ürün/pazarı sahibi olabilir. Behaviour aslında kendi pazarına sahip olana kadar değişmemektedir (KamoCRM’dir). Bugün sadece pazar sahibi, bu yüzden her üye hala bunu çözüyor.
· kamo-shared-library
Resolve entitlements by product-root org, not platform üst düzey
EntitlementRootResolver: En yakın pazar kendini Bir org (ürün kökü), platform üst düzeye geri dönüyor. Bu Bu Bu Bu Decouples * * Hangi ödediğiniz ürün * (pazar/plan sahibi) * kimin ödediği * (billing account) ve tek üst düzey veyag'den, bu yüzden beyaz etiketli bir ürün Ya da işaret gibi. Kendi pazarının kendi entitlement kökü haline geldiğini. ************ Şimdi org's'in Free üssünü kaynaklar Ürün kökü (FirstByIsTopLevel True) ile ilgili planları çözemez ve çözemez Ürün / pazarlama veya faturalama hesabı veyag yerine. Backwards uyumlu: KamoCRM şu anda tek pazar sahibi, bu yüzden her şey Mevcut org tam olarak daha önce olduğu gibi çözüyor - davranış sadece bir kez bir kez değişir sub-tree kendi pazarına sahiptir. Katkı; hiçbir sürüm bump.
· kamo-shared-library
Zarf alıcı ekleyin, alan değeri, alıcı statüsü varlıklar
In-progress esign modelinde kontrol edin: EsignEn GeliştirmeeRecipient (+repo) EsignFieldValue (+repo), EsignRecipientStatus ve bir ESignSignerType update. Katkı; hiçbir sürüm bump.
· kamo-shared-library
Add EsignUsageRecord for per-signature usemetering
Yeni append-sadece kullanım varlığı (mirrors AiUsageRecord) imzalandığında Tamam. Sadece API-origin imzaları bir planın aylık olarak dahil edilene kadar sayılıyor kota + overage (sign.pink Business: 40/mo dahil edildi, sonra her biri 20 $); MANUAL Tek kullanıcı imzaları kaydedilir ancak asla fatura edilmez. billing period (YY-MM) Aylık aggregasyonu destekler; bildirilen to stripe Stripe kullanım gönderimi yapar idempotent. Sadece alıntı; hiçbir sürüm bump.
· ConversionService
Yön oranı, asla non-square logolarını uzatmayın
Favicon PNG/ICO çerçeveleri KeepAspectRatio (false), germe ile üretildi. Herhangi bir non-square logosu bozuk bir meydana. Merkez, logoyu bir Bunun yerine şeffaf kare tuval, yönü korumak, bu yüzden favicons görünüyor Bir meydan kaynağı imajını gerektirmeden herhangi bir yüklenmiş logo şekli için doğru.
· KlusterServices
Pre-seed sign.pink + www.sign.pink in STATIC DOMAINS
işareti.pink yeni bir apex domain (consumer e-signature brand / beyaz-label Kamo onant org). Pre-seed apex + www so a Let's Encrypt cert daha önce var İlk HTTPS trafiği; *.sign.pink subdomains per-FQDN lves dinamik olarak İlk vurduğunda, aynı mekanizma *.priceturbo.com.
· kamo-signer-monorepo
Yeni monorepo + mobil-ilk e-signature imza uygulaması
Turborepo + pnpm workspaces monorepo konut reusable e-sign paketleri kamo-internal artı yeni, ultra-polished kamo-signer uygulamasından alındı - İkinci taraf SING deneyimi (tasarım / yazarlık tarafında kalır kamo-internal). Paketler: @kamo/esign-core türleri + DesignData tel sözleşmesi, zod şema, runtime Alan geçerliliği, işaret mağazası (zustand) - @kamo/esign-ui interaktif alan girişleri + sadece alan/annotasyon Yazılımcılar (Sio-internal FieldControl) - @kamo/doc-render paketlendi pdf.js page turner (kendi barındırılan işçi, CDN), Yanıt, rotasyon-korrect overlays - @kamo/theme per-tenant markalı çizmeler (getThemePath, ThemeLogo, DinamikMetaLoader) - @kamo/api-client tarayıcı + sunucu Redis / ileri yardımseverler - @kamo / paylaşılan ts configure / kuyruk preset / eslint App (apps/kamo-signer): - token-scoped signer auth (SIGNSESH http Sadece oturum, BFF rota eller) - karşılama -> onay (ESIGN/UETA) -> EIDAS AES adım-up OTP -> imza attı -> bitirmek -> tamam, tüm aşamalar animasyon (framer-motion, azalt-motion farkında), mobil-ilk masaüstüne eşit, WCAG-ggy - imza yakalama paketi: çiz / tip (script fonts) / yükleme / bütün bunları kabul et - multi-document, decoder, dele/reassign, full i18n ( next-intl, 22 yerel) - runnable önizleme modu (sonsuz gerekli) + /.forgejo + /k8s (HostRegexp işareti.*, turbo-prune Dockerfile)
· kamo-internal
Full- geniş işletme canlı önizleme ile yeniden yaz
KrediÜrünFormu tek bir dar sütundu (maxWidth: 880) sert kodlanmış Her yerde İngilizce. Şimdi aynı işletme modelini teklif sayfası olarak kullanır: Layout: - ekmekleri ile tam boy derece yüksek, sırt ok, tür kötüge - İki-column ızgara (6fr/6fr) aşağıda lg+, tek-column - Soldaki form, sağ tarafta "Ürün Preview" yaşıyor Form side: - ToggleButton Group'u açıklamalarla (Installment vs LOC) olarak seçin. Bir damlada gömülmedi - bu reshapes'ın yapısal seçimi Formun geri kalanı, bu yüzden kehaneti hak ediyor - ikonlarla Bölüm blokları (Temeller · Fiyatlandırma · Limitler ve Şartlar · Uyum) - Fiyatlar % olarak girdi, tel üzerinde bps'ye dönüştürüldü (daha fazla "3600 =% 36") - Bir sonraki-intl t() aracılığıyla tüm alan etiketleri - Day-count aracıtip ACT 365 vs ACT 360 Preview side: Kahraman kartı: tür çip, ürün kodu çipi, isim, başlık, açıklama - 4-tile stats grid: oran, kaynaklanma, geç ücret, NSF ücreti - Limits & terim ızgara (sp-aware: installment için aralığı + frekansı, **************** for LOC) Örnek teklif kartı (yükleme): aylık ödeme, toplam ilgi, Toplam maliyet, ana aralığın orta noktasında örnek kökeni - Uyumluluk cipsi: izin verilen devletler (kap 24 + Overflow çip), otopay Gerekli + indirim, kehanet şablonu bağlayıcı bağlayıcı - Footer not, bu ürünün teklif sayfasına nasıl akacağını açıkladı KrediÜrünFormu şimdi hem yeni hem de düzenleme sayfalarını kaplar. Sayfa sarsıcı MarketTitle'i geçin, böylece ekmek rumb temiz bir şekilde çözülür.
· kamo-internal
Canlı önbellek pane ile Two-column düzeni
Yeni-offer sayfası geniş ekranlarda uzun bir dar sütundu - yarı boşa yarı Viewport. Şimdi CSS Grid'i sol (5fr) ve bir soldaki formla kullanır. "Offer Preview" pane in the right (7fr) that updates as the operator türleri. Küçük ekranlarda Single-column (< lg). Form side: - ikonlarla Bölüm blokları (Ürün · Borrower · $ · Özel Şartlar) - Borrower alanları dikey olarak (belki + eyalet) daha kompakt bir şekilde Sunum şimdi, yatay alan önbellek için ayrılmıştır Preview side (yalnızca bir ürün seçildiğinde): Kahraman kartı gradient arka plan, tür çip, ürün adı ve bir İnsan hazır bir başlık ("$5,000 · 12 aylık taksiment · 14.99% APR" / " $25,000 kredi hattı · 9.99% oranı") - 4-tile stats grid: ana, oran, aylık ödeme, terim (yükleme) veya ana, hız, dönem çiz, geri ödeme süresi (LOC) - Ücret arızası (origination/late/NSF/annual) bir "kutom" çipiyle Override uygulanır - Maliyet Özet paneli: net dağınık, toplam ilgi, toplam maliyet - Amortization schedule peek: ilk 3 + son 3 satırlar bir "{N} daha fazla Ödemeler ... terimler için boşluk satırları > 6 ay - TILA hatırlatma notu geri hesaplamaları doğru APR + inşaları açıklayın Gerçek program + göndermekle ilgili açıklamalar Tüm matematik, müşteri odaklı düz-line amortizasyon (P × r × (1+r) ^n / ((1+r) ^n - 1)) - sadık bir önizleme, son açık APR değil. Backend Hala gerçek sahibi.
· kamo-internal
Polonya yeni-offer sayfası - boş eyalet, LOC badge, özel terimler
Teklif sayfasının önceki yeniden faktörden sonra üç UX boşlukları vardı: 1. Boş devlet. Bir pazarın henüz kredi ürünleri olmadığı zaman, düşüş kullanılmış Sessiz bir şekilde boş ve operatör ne yapacağını bilmiyordu. Şimdi Şimdi Şimdi Bir kahraman boş durumu ile değiştirildi (yani başlık, yükleme üzerine astar LOC vs ve "Create Loan Product" CTA ürünleri / yeni akışa yol açtı. 2. LOC vs Installment görünür değil - her ikisi de aynı şekilde görünüyor Ürün düştü. Renkli bir çip eklendi (LOC = mavi + tekrar simgesi, Yükleme = yeşil + cüzdan ikonu her ikisini de seçilmiş değerde verdi Ve her damladown seçeneği içinde, artı ürün açıklaması seçeneği. 3. "Locked terms" bloğu kafa karıştırıcı olarak adlandırıldı - değiştirilemez bir şekilde ima etti Override için herhangi bir yol olmadan. Kollapsible "Müşterileri" paneli eklendi Bu, faiz oranı için per-offer aşırılıkları ortaya çıkarır, APR'yi açıklayın ve Originasyon ücreti (rerelasyon fiyatlandırması, zorluk antrenmanları, promosyonlar, fiyatlandırma). Ne zaman ayarlandığında, kilitli süreli kart görsel grevleri yoluyla grevler Ürün değeri ve override'yi gösterir (e.g. 14.99% → 11.99%) böylece operatör tam olarak ne yayınlanacağını görür. Backend desteği KamoLOS 0e80393'te itti; losApi.ts'te genişletilmiş tipler Override alanları, formasyon yoluyla akır.
· kamolos
Per-offer Overrides for rate, APR, and Origination ücretleri
KrediOfferCreateRequest, üç opsiyonel alan kazanır - ilgiRateBpsOverride, AprBpsOverride, kökeniFeeAvenOverride. FormDraft onları ne zaman uygular seti ve aksi takdirde ürün snapshot'ına geri düşer. Vakaları kullanın: ilişki Fiyatlama ( Tekrarlayıcılar için geri dönüş), zorluk egzersizleri (waived Origination), bir-off promosyon teklifleri. Yükleme ürünleri için, sadece ilgiRateBpsOverride normal yoldadır - APR, + ücret + programından hesaplanır. AprBpsOverride, Nadiren APR'yi açık bir şekilde açıklayan bir durum, hesaplamadan farklı olmalıdır. Denetim: her taslak için OFFER DRAFTED yazıyor (SENT / ACED ile birlikte). Logs açık override değerleri vs ürün varsayılanları, böylece iz yeniden inşa edebilir Ne miras alındı vs. per-offer.
· kamo-internal
Expose PERSONAL LOANS ticaret türü ve bağlılık seçicileri
COMMERCE TYPES ve KatılımType listelerine PERSONAL LOANS ekleyin, böylece Yeni KamoLOS kişisel-loans pazarı piyasalardan/yeniden oluşturulabilir ve Pazar /edit sayfaları, QuickActionsBar (With / Marketing / Personal-loans /news /news / Yol), ve bunu boru hattı bağlantılı filtre ve yapılandırın.
· kamo-internal
T6+T7 frontend par + veyag raporları + oto-pay UI
Front parend (T6): Yeni kütüphane/format.ts: locale-aware Intl yardımcıları - formatCurrency / / FormatDate / formatDateTime / formatPercentBps. Değiştirilir Sertcoded LocaleString() + dilim (0,10) kodbase'de dağınık desenler. - BorrowerAutoPayCard: full enroll / durak / özgeçmiş / iptal / düzenleme UI Auto-pay state makinesi için. Yüzeyler miktarı-modedowndown (INSTALLMENT SCHEDULED / MIN FORMMENT / FULL STATEMENT BALANCE / FIXED AMOUNT) + günlük - aylık + ödeme-method seçici. Backend geri döndü Zaten telli; bu, borç veren kendi hizmet için son parçadır. - Şarj kuyruğu: IRS 1099-C sebep kodu düştü (8 resmi resmi resmi IRC §6050P başına A-H mektupları ücretsiz metin nedeni alanını değiştirir; varsayılan **************************** Notlar alanı kalır. FormCurrency aracılığıyla verilen para. Org raporları (T7): - New **************************** 5-bucket dashboard (Current / 1-29 / 30-59 / 60-89 / 90+)%-of-toplam + renk kodlanmış Üst sınırları. Drill-through link to şarj-off kuyruk. losApi eks: - yaşlanmaReport (orgId) + AgingReport type - Multi-filter düzenleyici endpoint için denetimAra (filterler) - KrediChargeOffReasonCode sendika türü - doğrulananChargeOff imzasını kabul eder
· kamolos
6.Bölüm 6+7+9+10 - frontend par, org reports, OpenAPI, JaCoCoCoCo
T6 (önekli par): - Yeni /lib/format.ts: yerel-aware formatCurrency / formatDate / FormatDateTime / formatPercentBps via Intl APIs (replaces hardcoded LacaleString + dilim (0,10) desenleri. - BorrowerAutoPayCard: enroll / durak / özgeçmiş / iptal / otomatik ödeme $-modedown (INSTALLMENT SCHEDULED / MIN FORMMENT / FULL STATEMENT BALANCE / FIXED AMOUNT) + günlük + ödeme-method selector. - Şarj kuyruğu: IRS 1099-C neden kodu düştü (8 resmi mektup IRC §6050P başına A-H, ücretsiz metin nedeni alanını değiştirir; varsayılan G. FormatCurrency aracılığıyla para formatı. T7 (org): - Yeni KrediReportsController.aging: Mevcut / 1-29 / 30-59 / 60-89 / 90+ kovas via paged DELINQUENT scan + countByOrganization VeStatus ACTIVE için. - ******************** 5bucket dashboard with%-of-total + renkli kodlanmış bantlar + şarj kuyrukları ile. T9-T10 (DX + docs): - ******************** /v3/api-docs + /swagger-ui.html Otomatik üretilen. OpenApiConfig başlık + açıklama + sürüm. - DevSeedLoader @Profile ("dev"): iki örnek kredi ürünlerini (12-mok-mokratlar Yükleme + sürekli LOC). Idempotent (Mevcut ürün kodu üzerinde) - JaCo Maven plugin: test aşamasına hazır-agent + rapor. Coverage HTML CI tüketimi için hedef / site /jaco/index.html. losApi eks: - yaşlanmaReport (orgId) + AgingReport type - Multi-filter düzenleyici endpoint için denetimAra (filterler) - doğrulananChargeOff imzasını kabul eder 36 Testler geçiyor.
· kamolos
Tier 5 uyumluluk toplu
- OfacSanctionsService: Jaro-Winkler fuzzy maç @ ≥0.92 tam maç sonrası geçiş. Hits yüzey benzerlik puanı. los.ofac.fuzzy-threshold aracılığıyla kullanılabilir. AdverseAction NoticeService: ECOA §1002.9 uygun PDF jeneratör adı CFPB federal düzenleyici olarak. Duvar nedenleri -for-decoder + standart ECOA non-discrminasyon dili. MediaService'a mağaza açtı. - ******************** Düzenleyici denetim sorgusu düzenleyici için Subpoenas + Oturma süpürücüler. Paged. KrediChargeOffService.confirm nedenKom parametresini kabul eder (IRS 1099-99- C C C C box-6 mektubu, Krediye devam etti.chargeOffReasonCode ve konuya girdi YılBitTaxJob'in 1099-C PDF dosyası. Varsayılan G. - KrediÜrünValidationService, ilgiRateBps > MLA 3600bps cap Bu nedenle uyumluluk teklif süresi MLA taraması için bayrak verebilir. YılBitTaxJob: 1099 Int şubesi kaldırıldı - inert (hayır) Borçlu-kredi faiz ödeme akışı mevcuttur). Stub tepki ile ayrıldı Bir kez böyle bir akış topraklarına rehberlik edin. Tüm 30 birim testleri geçer.
· kamo-shared-library
KrediChargeOffReasonCode (IRS 1099-C kutusu 6) + denetim arama
- Yeni KrediChargeOffReasonCode enum (A BANKRUPTCY.H OTHER) per IRC §6050P Kredi.chargeOffReasonCode sütun - ************ multi-filter @Query for düzenleyici subpoenas (loanId / tür / aktörType / aktörMemberId / from / to) - sayfad
· kamolos
Tier 3 güvenlik + Tier 8 bug temizleyici toplu
T3 – Güvenlik: - New RateLimitFilter (Bucket4j): Webho için IP başına 1000/min Başvuru için oturumda 10/min per session for offer accept/decoder/rescind, 60/min general. ProxyHmacFilter'den önce kayıt altına alındı, böylece istismar kovayı daha önce vurur Kriptografik doğrulama maliyeti. GüvenlikKonfig, HSTS + frameworkOptions (DENY) + contentTypeOptions ekliyor Spring Security HeaderYazr aracılığıyla. - StripeConfig, hayatta olmayan anahtarla prod profilinde hızlı başarısız olur. T8 – Bug temizlendi: - ******************** Kredi görünüyor.productIdSnapshot → Kredi ürünü.feeNsfFlat yerine sert kodlanmış 25 $. 25 $ kalır Ürün veya ücret eksik olduğunda geri dönün. - ******************** Bir UyumTarget alanı kazanır (PRINCIPAL / INTEREST / FEES). manuelAdjust hedef başına gönderir Her zaman başlığa dokunmak yerine. Denetim metadata şimdi kayıt Hangi karşı dokundu. - ******************** En son ACTIVE bulur *or* PAUSED planı ve yeni bir satır oluşturmak yerine tepki verir Bu yetimler durakladılar. - ******************** typed FetchResult rekoru ile Durum (OK / NOT FOUND / UNREACHABLE / UNCONFIGURED) Blob(uid) mirasın astes-or-null adaptörü olarak korunmuştur.
· kamo-shared-library
****************
******************** mevcut bir mevcut yeniden tepki vermek için kullanılır PAUSED planı, tekrarlanan bir satır oluşturmak yerine, bir tane durakladı.
· kamo-internal
/api /los proxy HMAC-signs kimlik başlıkları
LOS PROXY HMAC SECRET mevcut olduğunda, proxy şimdi hesaplar ************ sır) ve gönderir X-Proxy-Signature + X-Proxy-Timestamp X-Org-Id / X-Member-Id Titles. KamoLOS'un yeni ProxyHmacFilter bunu doğrular (±60s skew, sürekli zaman karşılaştırması) bu yüzden kamo-internalternal Artık kimlik başlıkları yok. Unset secret = yerel-dev pass-through (filter Toilet on the backend taraf da).
· kamo-internal
Org-side kredi detay sayfası + ayarlamalar/promise API
- losApi: manuelAdjust, waiveFee, sözToPay - ************ full org-operatifs page * 4-up bakiye kartları (şimdi, ana, ilgi, sonraki) * Kılavuz ayarlama formu (CREDIT/DEBIT, gerekli sebep) - çağrılar /api/los/adjustments/manual * Promise-to-pay form - **************** * Tablolar + ödeme masaları * Embeds <Loan ISStTimeline> tam etkinlik logu için - Bu, MarketActiveLoansTab + BoruActiveLoansTab işaret edildi.
· kamolos
Final batch — compliance, packets, adjustments, Grafana, tests
Compliance: - MlaCheckService — Military Lending Act covered-borrower lookup against DoD MDC single-record query. Returns NotCovered if unconfigured so dev doesn't hard-fail; production MUST configure los.mla.endpoint + api-key OR run manual MLA at the org's KYC step (PII access required). - OfacSanctionsService — Treasury SDN list cached in-memory, refreshed nightly from sdn.csv. Unicode NFD normalization + diacritic stripping. Wired into LoanOfferService.send: SDN hit blocks the send and writes a STATE_RULE_VIOLATION_DETECTED audit row. - LoanLifecycleService cooling-off now reads LoanStateRule.coolingOffDays for the borrower's state (replaces the LocalDateTime.now() placeholder). - Stripe account.updated webhook now syncs charges/payouts/details flags + default_currency + requirements_disabled_reason onto LoanOrgStripeConnect so cron jobs + the org settings UI see live capability state. Disclosure packet: - New DisclosurePacketBuilder bundles TILA box + GLBA privacy notice + ECOA non-discrimination notice + ACH mandate authorization into one PDF via PDFBox PDFMergerUtility + stores in MediaService. Each component is recorded as a LoanDisclosure row keyed to the offer. LoanOfferService.send builds the packet automatically before the ESign envelope is created. Servicing operations: - **************** — fees/principal credit-or-debit with required reason; emits LoanPayment(INTERNAL_ADJUSTMENT or REVERSAL_ADJUSTMENT) + MANUAL_ADJUSTMENT audit - LoanAdjustmentService.waiveFee — flips LoanFee.waivedAt + credits feesPaidToDate + emits FEE_WAIVED audit - **************** — non-financial commitment row used in D60+ workflow tracking, emits PROMISE_TO_PAY_LOGGED audit - LoanAdjustmentController exposes /api/los/adjustments/{manual, fees/{uid}/waive, promise-to-pay} Observability: - **************** — importable dashboard with status gauges, payment outcome rates, R-code returns by code, webhook p50/p90/p99, disbursements/hour, charge-offs/day, JVM heap, HTTP rate Tests (30 total, all green): - 7 AmortizationEngine - 9 InterestAccrualEngine (including the previously-fixed 100x bug) - 5 PaymentAllocator - 4 NachaReturnCode (retry classes + mandate-revoking codes + describe) - 5 OfacSanctionsService (clean match / hit / diacritics / alias / disabled via reflection-injected cache, no network or test container needed)
· kamolos
P2 toplu - gözlemlenebilirlik, testler, yıl sonu vergi, gerçek Stripe IDs
Observability: - mikrometer-registry-prometheus on the classpath - /actuator /prometheus, yönetim yapısıyla açığa çıktı (hem yerel + k8s configuremap) KrediMetrics hizmeti: **************** **************** los charge off total, los disbursement total, los loan status count{status} **************** histogram KrediPaymentPostingService + CreditChargeOffService Matematik + testleri: - AmortizationMüthişini kapsayan 21 birim testleri (orta ödeme, APR Newton- Raphson, aylık yıllık ilerleme, ana+ ilgi çekici, Kötü çoğunluk muhafızları), İlgi AcrualMühendis (ACT 365 / ACT 360 DPR, Bir gün / otuz günlük accrual, LOC ADB), ÖdemeAllocator (fees→ ilgi →principal sipariş, kısmilar, geri ödeme, nulls) **Fixes 100x ilgi-line bug** in ************************ - divizör 3,650,000/3 yerine 36500/36000 idi (annualRate Yarının her iki /10000 bps+traction AND /365 gün ihtiyacı vardır, bu yüzden accrued ilgi 100× çok yüksekti. Test onu yakalayacağını ekledi. Gerçek Stripe tanımlayıcılar (daha fazla yer sahibi değil): - StripeConnectController.onboard artık krediOrgStripeConnect on Başarılı Stripe Hesap yaratımı; .status eyalete döner - New StripeIdResolver: bağlantılıAccountIdForOrg() + tembel GetOrCreateBorrowerMüşteri Id() (idempotency-keyed Müşteri). Bağlantı hesabı altında, Krediye devam ediyor.stripeMüşteri Id) - AutoDebitRunJob.fireAchDebit + .fireDisbursement şimdi gerçek bir gerçek çözümü çözüyor StripeIdResolver aracılığıyla "acct placeholder " Hatırlanma: - Hatırlatıcı İş: gece süpürülen süpürücüler FORMMENT DUE 3 DAYS, FORMMENT DUE TODAY, FORMMENT LATE DAY 1/5/15, OFFER EXPIRING (24h Geçmeden önce, STATEMENT AVAILABLE (on nesil). Dedup-keyed via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via via ************ Bu kadar reruns idempotent. Yıl sonu vergisi: - YılBitTaxJob (cron 06:00 Jan 5): 1099-C şarj-offs ≥600 $ + 1099-INT ödünç faiz için > 10. PDFBox-rendered form, MediaService'a depolanır, form / yıl ile krediDisclosure olarak kaydedilir metadata bu kadar reruns idempotent. Kredi.tax1099 CEable auto-set on charge-off, miktarı ≥ $600 $
· kamo-shared-library
KrediOrgStripeConnect + Kredi vergisi/accrual fields + sıcak indeksler
Yeni KrediOrgStripeConnect varlık (bir-per-org, striptizeConnectedAccountId + Connect onboarding yetenekleri) + repository Kredi: striptizciId (lazy-created under the org's connection account) Son AcrualDate, vergi1099IntEable, vergi1099CEable Sıcak kompozit indeksler: * krediler: (org id,status), (borrower member id,status), (bir sonraki due at) (status,delinquency tier) * kredi ödemeleri: (loan id,initiated at), (loan id,status) (stripe search intent id), (statement id) * kredi statements: (loan id,statement count DESC), (due date,status) * kredi offers: (org id,status), (borrower member id,status), (status,expires at)

Evreniniz sizi bekliyor.
Birkaç dakika içinde ücretsiz olarak başlatın. Hazır olduğunuzda ürünleri ekleyin - göç yok, yeni girişler yok.
Sonsuza kadar ücretsiz — kredi kartı gerekmiyor