Changelog
Was ist neu?
Jede Verbesserung an der Plattform, wie sie geliefert wird.
· kamo-shared-library
API SIGNATURE api-key Scope + EsignGenericEnvelope.origin
Additive, keine Versionsstoß: - ApiKeyScope.API_SIGNATURE - Gates die programmatische E-Signatur-API (Business) - EsignGenericEnvelope.origin (EsignUsageOrigin, nullable) - notiert ob Umschlag wurde über API vs MANUAL erstellt, so abgeschlossen Signaturen Meter korrekt (API zählt zu den $0.20 Überalterung; MANUAL tut es nie). Kolumne zu prod hinzugefügt über idempotent ALTER vorher.
· kamo-internal
Send-for-signature-Aktion + Umschlagstatus im Dokumenteditor
Fügen Sie einen 'Senden für Signatur'-Button in den Template-Editor-Header hinzu, der eine Dialog um das Dokument an Empfänger zu senden und Track-Signatur-Status, Anruf der neue ESigService /api/esig/envelopes Motor. - Proxy-Routen (OTK via generateOTK, Spiegelung der Vorlagen Proxy): POST/GET /api/esig/envelopes, GET [uid], POST [uid]/void, POST **************** - SendForSignatureDialog: Registerkarte senden (Empfängerreihen, Nachricht, Ablauf) + Status-Registerkarte (Prolat-Umschlagliste, Status-Chips, leer/resenden) - Button deaktiviert, während die Vorlage unaved Änderungen hat - i18n via next-intl ********************
· ESigService
Generische Umschlag erstellen/senden Motor (sender Seite)
Fügen Sie die OTK-authed /api/esig/envelopes API kamo-interne Laufwerke zu senden Dokumente für die Unterzeichnung, Wiederverwendung der gleichen Shared-lib-Einheiten der Öffentlichkeit Signieren API liest - der Zusatz, org-agnostische Ersatz für das Darlehen- gekoppelt KamoLOS/EsignClient erstellen Pfad. - POST erstellen-und-senden aus einer Vorlage: baut EsignGenericEnvelope (AD_HOC), ein EsignEnvelopeEmpfänger pro Unterzeichner mit einem frischen hashed Zugangsmarke, und E-Mails jeder die /s/{env?/{Recipient'?t={token' Signing Link (best-effort) - GET-Liste (envelope Dashboard) + GET {uid] Detail mit Empfängerstatus - POST {uid]/leere und {uid]/Rezept/{rid]/resend (rotiert das Token) - Einladung + delegieren E-Mails teilen EsignEmailClient.sendInvite; Signer-Route Links korrigiert zu /s/{env?/{Rezept'
· ESigService
Public Signing API Engine für sign.sign.pink
Implementieren Sie die /api/esig/public/* Signier-API, die die Kamo-Signeur-App ruft, Drehen Sie den Live-Signator von Preview-Stub in ein funktionierende Backend. - Validierung (Rezept-Token -" Signer-Sitzung), Sitzung, Zustimmung, stepup/start+verify (E-Mail OTP), Absenden, Decoder, Delegieren, Dokument - Redis-Backed Signer Sessions (X-Signer-Session), unterschieden von den Mitarbeitern OTK - Dokument-Bontes über die echte Img/MinIO-Pipeline (Vorlage imgId - konvertiert-PDF ImgDat -- MinIO), nicht der nie verdrahtete /api/imaging/blobs stub - PDFBox platt: Overlay-Feldwerte + Signature-Bilder im Design Koordinaten, Anhängen E-SIGN/UETA Audit Zertifikat Seiten; signierte PDF gespeichert in MinIO unter dem Umschlag signiertBlobId mit aufgezeichnetem SHA-256 - Anhängende EsignSignature Audit-Reihen + EsignFieldValue Persistenz - Emits **************** - Branding von Organisation + OrgDomain für First-Paint-Themen gelöst - OTKAuthFilter Bypasses /api/esig/public (Token-authed, nicht staff OTK) Nur Additive; vorhanden /api/esig/templates/* unberührt.
· kamo-internal
Plattform-Produkt-schalten in Organisationen-Registerkarte
Oberfläche der Plattform-Produkt-Bezeichnung, wo es hingehört . Plattform Organisationen. Fügt einen gated Switch per org hinzu (entsperrt für die Top-Level-Og), ein Bestätigungsdialog, der den Anspruchseffekt erklärt, ein 'Plattformprodukt' Chip, eine No-Katalog-Warnung, optimistisches Update und Fehler-Snacks. Alle Saiten via Next-intl.
· BillingService
Organisation verwalten.isPlatformProdukt von der Plattform
PlatformAccountSummary stellt aus der Plattform-Product + hat SubscriptionMarket; neu PUT ************ (Plattform-Admin gated) setzt die Flagge und ungültig die Ansprüche der org-Mitglieder (ihr Produkt) root, und damit Features, ändern). Top-Level org ist die implizite Wurzel und kann nicht ge- umge- ge-.
· kamo-shared-library
Explizit Organisation.isPlatformProduct als Anspruch-Wurzel-Signal
Ersetzen Sie die abgeleitete 'Eigentümer eines SUBSCRIPTION-Markt' Heuristik durch eine explizite, admin-Set Eigentumsflagge. Ein Plattformprodukt (z.B. sign.pink) ist ein White-Label Produkt der Plattform arbeitet und ist seine eigene Anspruch Wurzel; ein Kunde org auch eine, die ihren eigenen SUBSCRIPTION Markt laufen, um an seine Kunden weiterzuverkaufen ist nicht, und bleibt Anspruch auf die Plattform. EntitlementRootResolver liest jetzt die flag (plus die implizite Top-Level-Root) und nicht mehr vom Markt abhängt Eigentum. Hinzufügen ist_platform_Produkt-Spalte (BOOL DEFAULT FALSE) KamoInitiializer zu erstellen, bevor Dienste, die Organisation bereitstellen wählen.
· SecurityService
Scope-Mitgliedsansprüche auf Produktwurzel, nicht KamoCRM
EntitlementService löst nun die Ansprüche jedes Mitglieds Root über EntitlementRootResolver (vernündlichste markteigene Vorfahren-oder-selbst) statt zu Fuß auf die Top-Level-Org. Der Free-Tier-Boden und die Produkt-Zugangsflagge Ableiten von dieser Wurzel, und istKamoCrmAbonnement wird AbonnementGrantsRootAccess (plan-org vs root, nie das Rechnungskonto). MitgliederEintritte Gewinne ProduktRootOrgId so Verbraucher Gate-Zugang gegen das richtige Produkt. BillingSetupService bezieht den Markt + Free Plan vom neuen org-Produkt Wurzel unter Beibehaltung des Rechnungskontos auf der obersten Ebene KamoCRM org - d.h. Eltern besitzt Abrechnung, das Kind kann das Produkt/der Markt besitzen. Das Verhalten ist unverändert, bis eine Org tatsächlich ihren eigenen Markt besitzt (KamoCRM ist die nur Marktinhaber heute, so dass jedes Mitglied noch beschließt, es).
· kamo-shared-library
Ansprüche durch Produkt-root org lösen, nicht Plattform-Top-Level
EntitlementRootResolver einzuführen: der nächste marktbesitzende Vorfahren-oder-selbst einer Org (ihre Produktwurzel), die auf die Plattform zurückfällt. Dies entkoppelt *Welchen Produkt, auf das Sie Anspruch haben* (Markt-/Plan-Besitzer) von *wergt* (Rechnungskonto) und von der einzigen Top-Level-Og, also ein White-Label-Produkt org wie sign.pink, das seinen eigenen Markt besitzt, wird seine eigene Anspruch Wurzel. **************** bezieht jetzt die Freie Grundlinie von der org's Produkt root (nicht findenFirstByIsTopLevelTrue), und löst Pläne von der product/market org anstelle des Rechnungskontos org. Rückwärtskompatibel: KamoCRM ist derzeit der einzige Marktbesitzer, also jeder vorhandene Org beschließt genau wie zuvor - Verhalten weicht nur, wenn ein Sub-Baum besitzt einen eigenen Markt. Additiv; keine Versionsbeule.
· kamo-shared-library
Umhüllen-Empfänger hinzufügen, Feldwert, Empfängerstatus-Einheiten
Checken Sie das in-progress esign Modell ein: EsignEnvelopeRecipient (+repo), EsignFieldValue (+repo), EsignRecipientStatus und ein ESignSignerType Update. Additive; keine Versionsbeule.
· kamo-shared-library
EsignUsageRecord für die Verbrauchsmessung pro Signatur hinzufügen
Neue Append-Only-Use-Einheit (Spiegel AiUsageRecord) bei der Unterschrift emittiert Fertigstellung. Nur API-Ursprung-Signaturen zählen zu einem Plan monatlich enthalten Quote + Überalterung (sign.pink Business: 40/mo enthalten, dann $0,20 pro Stück); MANUAL Einzel-Benutzer-Signaturen werden aufgezeichnet, aber nie in Rechnung gestellt. billing_period (YYYY-MM) unterstützt monatliche Aggregation; berichtet_to_stripe macht Stripe-Nutzung einbringen idempotent. Nur Additive; keine Versionsbeule.
· ConversionService
Seitenverhältnis erhalten, niemals nicht-Quadrat-Logos strecken
Favicon PNG/ICO Rahmen wurden mit keepAspectRatio(false) produziert, Dehnung jedes nicht-quadratisch-Logo in ein verzerrtes Quadrat. Mitte-passen das Logo auf einem transparente quadratische Leinwand statt, Erhaltung Seitenverhältnis, so favicons aussehen korrekt für jede hochgeladene Logo-Form, ohne dass ein quadratisches Quellbild erforderlich ist.
· KlusterServices
Vorsingenzeichen.pink + www.sign.pink in STATIC_DOMAINS
sign.pink ist eine neue Apex-Domain (Verbraucher-E-Signatur Marke / White-Label Kamo Mieter Org). Pre-seed apex + www also existiert ein Let's Encrypt cert vor erster HTTPS-Verkehr; *.sign.pink subdomains erhalten pro-FQDN-Certs dynamisch wenn zum ersten Treffer, der gleiche Mechanismus wie *.priceturbo.com.
· kamo-signer-monorepo
Neue monorepo + mobile-first e-signature Signing App
Turborepo + pnpm Arbeitsplätze Monorepo Gehäuse wiederverwendbare E-Zeichen-Pakete Aus Kamo-internen plus eine neue, ultra-polierte Kamo-Signör-App extrahiert die Second-Party SIGNING Erfahrung (die Designer / Autoring Seite bleibt in Kamo-intern). Pakete: - @kamo/esign-core-Typen + DesignData wire contract, zod schema, Laufzeit Feld Validierung, signStore ()zustand - @kamo/esign-ui interaktive Feldeingänge + Nur-Lesefeld/Anmerkung Renderer (gegabelt von kamo-internal FieldControl) - @kamo/doc-render gebündelter pdf.js Seite Renderer (selbstgehostete Arbeiter, kein CDN), reaktionsschnelle, rotationskorrekte Overlays - @kamo/Thema pro-Zähler Branding Bootstrap (getThePath, ThemeLogo, DynamicMetaLoader) - @kamo/api-client Browser holen + Server Redis/Forwarding Helfer - @kamo/config share tsconfig / tailwind preset / eslint App (Apps/Kamo-Signörspieler): - Token-scoped signer auth (SIGNSESH httpNur Sitzung, BFF Routehandler) - welcome -- Zustimmung (ESIGN/UETA) -" eIDAS AES Step-up OTP -" geführte Unterzeichnung -" Abschluss, alle Phasen animiert (Framer-Motion, Reduzierung bewusst), mobil-first gleich Desktop, WCAG-gesinnt - Signatur Capture Suite: zeichnen / type (Script Fonts) / upload / adopt-all - Multi-Dokument, Decoder, Delegierter/Zukunft, voll i18n (next-intl, 22 Locales) - Runnable Vorschaumodus (kein Backend erforderlich) + /.forgejo + /k8s (HostRegexp sign.*, turbo-prune Dockerfile)
· kamo-internal
Vollständige Unternehmen neu schreiben mit Live-Vorschau
LoanProductForm war eine einzelne schmale Spalte (maxWidth: 880) mit hartcodierten Englisch überall. verwendet jetzt das gleiche Unternehmensmuster wie die Angebotsseite: Layout: - Vollbreite gradienten Kopf mit Semmelbrötchen, Rückpfeil, Artabzeichen - Zweispalten-Grid (6fr/6fr) auf lg+, Einzelsäule unten - Formular links, live "Product Preview" rechts Formseite: - Art Selektor als ToggleButtonGroup mit Beschreibungen (Installment vs LOC), nicht in einem Dropdown begraben - das ist die strukturelle Wahl, die neu gestaltet der Rest der Form, so verdient es Prominenz - Abschnittsblöcke mit Icons (Basics · Pricing · Limits & Terms · Compliance) - Preise in % eingegeben, umgerechnet in bps auf dem Draht (nicht mehr "3600 = 36%") - Alle Feldbeschriftungen über next-intl t() - Day-Count-Tooltip erklärt ACT_365 vs ACT_360 Vorschau Seite: - Hero-Karte: Art Chip, Produktcode-Chip, Name, Überschrift, Beschreibung - 4-Kachel-Statistiken Netz: Rate, Entstehung, späte Gebühr, NSF Gebühr - Limits & Terms Grid (kind-aware: Reichweite + Frequenz für die Rate, ************ für LOC) - Musterangebotskarte (Einstellung): monatliche Zahlung, Gesamtzinsen, Gesamtkosten, Probenentnahme in der Mitte des Hauptbereichs - Compliance-Chips: erlaubte Zustände (Cap 24 + Overflow-Chip), autopay erforderlich + Rabatt, Vorschriftscheinschein-Vorlage bindend - Hinweis erklärt, wie dieses Produkt fließt auf die Angebotsseite LoanProductForm wickelt nun sowohl die neuen als auch die Bearbeitungsseiten ein. Page Wrapper passieren MarktTitel, so dass die Semmelbrösel sauber auflöst.
· kamo-internal
Zweispalten-Layout mit Live-Vorschau-Panne
Die Neu-Angebot-Seite war eine hohe schmale Spalte auf breiten Bildschirmen - verschwendete Hälfte der Aussichtshafen. Verwendung von CSS Grid mit dem Formular links (5fr) und einem Live "Offer Preview"-Sehe rechts (7fr), das sich als Betreiber aktualisiert Typen. Einzelspalte auf kleinen Bildschirmen (< lg). Formularseite: - Abschnitt Blöcke mit Symbolen (Produkt · Leihnehmer · Betrag · Maßgabe) - Leihfeld-Stack vertikal (Mitglied id + Zustand) in einem kompakteren Präsentation jetzt, dass horizontaler Raum für die Vorschau reserviert ist Vorschau Seite (nur wenn ein Produkt ausgewählt wird): - Hero-Karte mit Gradienten Hintergrund, Art-Chip, Produktname und ein menschenlesbare Schlagzeile ("$5.000 · 12-Monats-Zentrale · 14.99% APR" / "$25.000 Kreditlinie · 9,99% Rate") - 4-tile Statistik-Geraster: Prinzip, Rate, monatliche Zahlung, Laufzeit (Einstellung) oder Haupt, Rate, Auszugsfrist, Rückzahlungsfrist (LOC) - Gebührenaufschlüsselung (Aspende/Späh/NSF/Jahresjahr) mit "Custom"-Chip Override wird angewendet - Kostenübersicht: Nettoauszahlung, Gesamtverzinsung, Gesamtkosten - Amortisation Zeitplan Blick: erste 3 + letzte 3 Zeilen mit einem "{N] mehr Zahlungserricht"... Lückenreihe für Laufzeiten von 6 Monaten - TILA Erinnerungsnotiz erklärt das Backend berechnet die wahre APR + baut der reale Zeitplan + macht Offenlegungen auf Senden Alle Mathematik ist kundenseitige straight-line Abschreibung (P . r - (1+r)-n / ((1+r)'n - 1)) Eine getreue Vorschau, nicht die endgültige offenbarte APR. Backend besitzt immer noch Wahrheit.
· kamo-internal
Polnische Neuanimationsseite - leerer Staat, LOC-Plakette, Brauchbedingungen
Drei UX-Lücken, die die Angebotsseite nach dem vorherigen Refaktor hatte: 1. Leerer Zustand. Wenn ein Markt noch keine Loan-Produkte hat, der Dropdown verwendet stillschweigend leer zu machen und der Bediener hatte keine Ahnung, was zu tun ist. Jetzt ersetzt durch einen Helden leeren Zustand (Ikone, Überschrift, Grundierung auf Installation vs LOC und ein "Create Loan Product" CTA zu den Produkten/Neustrom weitergeleitet). 2. LOC vs Installation ist nicht sichtbar im Vorfeld - beide erscheinen identisch in der Produkt Dropdown. Ein farbiger Chip hinzugefügt (LOC = blau + Wiederholungssymbol, Installation = grün + Wallet-Symbol) sowohl im gewählten Wert und innerhalb jeder Dropdown-Option, zuzüglich Produktbeschreibung in der Option. 3. Der "Locked terms"-Block wurde verwirrend genannt - es impliziert unveränderlich ohne jede Möglichkeit zu überschreiben. Ein schlüsselbares "Custom-Berufs"-Panel hinzugefügt die pro Angebot überschreibt für Zinssatz, offengelegt APR, und Entstehungsgebühr (Beziehungspreise, Härtearbeit, Promotion Preisgestaltung). Wenn gesetzt, die gesperrte-Terms-Karte optisch durch die Produktwert und zeigt die Override (z. 1499% - 11,99%) so die Betreiber sieht genau, was ausgegeben wird. Backend-Unterstützung in KamoLOS 0e80393 geschoben; Typen in losApi.ts so erweitert die Override-Felder fließen durch createOfferDraft.
· kamolos
Per-offer overrides für Rate, APR und Ursprungsgebühr
LoanOfferCreateRequest gewinnt drei optionale Felder - interestRateBpsOverride, aprBpsOverride, originationFeeAmountOverride. createDraft wendet sie an gesetzt und sonst fällt zurück auf die Produkt-Schnappschuss. Anwendungsfälle: Beziehung Preisgestaltung (Preis-Kickback für Wiederholungstäter), Härte-Peouts (verzitcht Ursprung), einmalige Werbeangebote. Für Ratenprodukte ist nur interestRateBpsOverride im normalen Pfad APR wird von der Rate + Gebühren + Zeitplan berechnet. aprBpsOverride ist für die ausgesetzt seltener Fall, in dem eine explizit offengelegte APR von der Berechnung abweichen muss. Audit: schreibt OFFER_DRAFTED für jeden Entwurf (Uniform mit OFFER_SENT/ACCEPTED). Protokolle explizite Override-Werte vs Produkt-Standards, so dass die Spur rekonstruieren kann was geerbt wurde vs. Satz pro Angebot.
· kamo-internal
Entlare PERSONAL_LOANS in Commerce-Typ & Engagement Picker
Fügt PERSONAL_LOANS zu den COMMERCE_TYPES und EngagementType Listen hinzu, so dass neuer KamoLOS-Markt für Privatkredite kann von den Märkten/neu und Märkte/Bebauungsseiten, Oberflächen in QuickActionsBar (mit /commerce/persönliche Darlehen/neue route) und enthält es in der Pipeline-Engagement-Typ-Filter und Konfiguration.
· kamo-internal
T6+T7 Frontend polieren + org berichtet + auto-pay UI
Frontendpolitur (T6): - Neue lib/format.ts: locale-aware Intl Helfer - formatCurrency / formatDate / formatDateTime / formatPercentBps. Ersetzt festcodiert zuLocaleString() + slice(0,10) Muster, die über die Codebasis verstreut sind. - BorrowerAutoPayCard: full enroll / pause / resume / cancel / edit UI für die Auto-Pay-Zustandsmaschine. Oberflächen-Ach-Modus Dropdown (INSTALLMENT_SCHEDULED / MIN_PAYMENT / FULL_STATEMENT_BALANCE / FIXED_AMOUNT) + Tag-of-Monat + Payment-Methode Selektion. Backend war bereits verkabelt; dies ist das letzte Stück für Kreditnehmer Selbstbedienung. - Charge-off Warteschlange: IRS 1099-C Grund Code Dropdown (8 offiziell Buchstaben A-H pro IRC -6050P) ersetzt das Feld frei-text-Grundsatz; Standard ************ Notes Feld bleibt. Währung gerendert über formatCurrency. Berichte von Org (T7): - Neues ************ 5-Boten Armaturenbrett (Aktuell / 1-29 / 30-59 / 60-89 / 90+) mit %-total + farbcodiert Obergrenzen. Drill-through Link zu Charge-off-Warteschlange. losApi Ergänzungen: - alternReport(orgId) + AgingReport-Typ - auditSearch(Filter) für den Multi-Filter-Regulator Endpunkt - LoanChargeOffReasonCode Union Typ - bestätigenChargeOff-Signatur akzeptiert reasonCode
· kamolos
Tier 6+7+9+10 - Frontendpolitur, org reports, OpenAPI, JaCoCo
T6 (Frontendpolitur): - Neu /lib/format.ts: locale-aware formatCurrency / formatDate / formatDateTime / formatPercentBps über Intl APIs (ersetzt sich hartcodiert zuLocaleString + slice(0,10) Muster). - BorrowerAutoPayCard: melde / pausieren / abbrechen / abbrechen / auto-pay bearbeiten mit Menge-Modus Dropdown (INSTALLMENT_SCHEDULED / MIN_PAYMENT / FULL_STATEMENT_BALANCE / FIXED_AMOUNT) + Tag-of-Monat + Zahlungsmethode Auswähler. - Charge-off Warteschlange: IRS 1099-C Grund Code Dropdown (8 offizielle Briefe A-H pro IRC -6050P) ersetzt das Free-Text-Prinnsal-Feld; Standard G. Währungsformatierung über formatCurrency. T7 (org reports): - New LoanReportsController.aging: zählt Darlehen in aktuelle / 1-29 / 30-59 / 60-89 / 90+ Eimer via Paged DELINQUENT scan + countByOrganizationAndStatus für ACTIVE. - ************ 5-Beine-Dashboard mit %-total + farbkodierte Bänder + durchbohrt zur Ablade-Warteschlange. T9-T10 (DX + docs): - **************** /v3/api-docs + /swagger-ui.html auto-generiert. OpenApiConfig setzt Titel + Beschreibung + Version. - DevSeedLoader @Profile("dev"): bootet zwei Beispieldarlehen (12-mo Raten + ewiges LOC). Idempotent (Skips auf bestehendes ProduktCode). - JaCoCo Maven Plugin: Vorbereitung-Agent + Bericht auf Testphase. Coverage HTML bei target/site/jacoco/index.html für CI Verbrauch. losApi Ergänzungen: - Alterungsbericht(orgId) + AgingReport-Typ - auditSearch(Filter) für den Multifilter-Regler Endpunkt - bestätigenChargeOff-Signatur akzeptiert reasonCode 36 Prüfungen bestanden.
· kamolos
Tier 5 Compliance Charge
- OfacSanctionsService: Jaro-Winkler Fuzzy Match @ 0,92 nach exact-match pass. Hits Oberfläche Ähnlichkeit Partitur. Konfigurierbar über los.ofac.fuzzy-threshold. - AdverseActionNoticeService: ECOA -1002.9-konforme PDF-Generator-Nensierung die GFPB als Bundesregulator. Renders Gründe-für-decoder + Standard ECOA Nichtdiskriminierungssprache. Gespeichert an MediaService. - ************ Multifilter-Prüfstelle für Regler Vorladungen + Retention Sweeps. Getreue. - LoanChargeOffService.confirm akzeptiert reasoncode Parameter (IRS 1099-C box-6 Brief), beharrte auf Loan.chargeOffReasonCode und eingefädelt in YearEndTaxJob's 1099-C PDF-Reiniger. Standard G. - LoanProductValidationService warnt, wenn interestRateBps - MLA 3600bps Cap so Compliance kann für Angebotszeit MLA Screening Flagge. - YearEndTaxJob: entfernt die produzieren1099Int Zweig war inert (nein Kreditnehmer-Kredit-Zins-Zahlungsfluss besteht). Stub links mit Reaktivierung Führung, sobald ein solcher Fluss landet. Alle 30 Einheiten Tests bestehen.
· kamo-shared-library
LoanChargeOffReasonCode (IRS 1099-C Box 6) + Audit-Suche
- Neues LoanChargeOffReasonCode enum (A_BANKRUPTCY..H_OTHER) pro IRC 6050P - Loan.chargeOffReasonCode Spalte - ************ Multifilter @Query für Regler-Vorladungen (loanId / kind / actorType / actorMitgliedId / von / zu)
· kamolos
Tier 3 Sicherheit + Tier 8 Bug Cleanup
T3 - Sicherheit: - Neuer RateLimitFilter (Bucket4j): 1000/min pro IP für Webhooks, 10/min pro Sitzung für Angebot akzeptieren/decoder/rescind, 60/min allgemein. Eingetragen vor ProxyHmacFilter so Missbrauch trifft den Eimer vor Kryptographische Überprüfung Kosten. - SecurityConfig fügt HSTS + FrameOptions(DENY) + contentTypeOptions hinzu via Spring Security HeaderWriter. - StripeConfig fällt schnell auf prod-Profil mit Non-Live-Taste. T8 - Bug-Bereinigung: - ************ sucht Loan.productIdSnapshot LoanProduct.feeNsfFlat statt hart codierter $25. $25 bleibt die Fallback, wenn Produkt oder Gebühr fehlt. - **************** gewinnt ein AdjustmentTarget-Feld (PRINCIPAL / INTEREST / FEES). manuelle Rücksendungen pro Ziel anstatt immer Haupt zu berühren. Audit-Metadaten jetzt aufgezeichnet welcher Zähler berührt wurde. - ************ findet die neueste ACTIVE *oder * PAUSED-Plan und reaktiviert es, anstatt eine neue Zeile zu erstellen dass Waisenkinder innehielten. - ************ getippte FetchResult-Platte mit status (OK / NOT_FOUND / UNREACHABLE / UNCONFIGURED). fetchBlob(uid) erhalten als legacy bytes-or-null Adapter.
· kamo-shared-library
********************
Wird von **************** zum Reaktivieren eines vorhandenen PAUSED planen, anstatt eine doppelte Zeile zu erstellen, die die angehaltene verwaist.
· kamo-internal
/api/los Proxy HMAC-signiert Identitätskopfer
Wenn LOS_PROXY_HMAC_SECRET env var gesetzt ist, berechnet der Proxy jetzt ************ Geheimnis) und sendet X-Proxy-Signature + X-Proxy-Timestamp neben dem X-Org-Id / X-Member-Id Header. KamoLOSs neuer ProxyHmacFilter bestätigt dies (60er Schieflage, konstant-Zeit-Verglichenheit) so dass ein Kunde kommto-intern umgeht kann nicht mehr Identitätskopf-Führer fälschen. Unset secret = local-dev pass-through (Filter deaktiviert am Backend Seite auch).
· kamo-internal
Org-seitige Leih-Detailseite + Anpassungen/Versprechen API
- losApi: manuell anpassen, unvergessene, versprecheToPay - ************ vollständige org-operations Seite * 4-up Balancekarten (aktuell, Kapital, Zinsen, nächster Zeit) * Manuelle Einstellungsform (CREDIT/DEBIT, erforderlicher Grund) - Anrufe /api/los/passual * Promise-to-pay-Formular - Anrufe **************** * Statements + Zahlungstabellen * Embeds <LoanAuditTimeline" für das vollständige Ereignisprotokoll - Dies löst die defekte Verbindung, die MarketActiveLoansTab + PipelineActiveLoansTab zeigten.
· kamolos
Endgültige Charge - Compliance, Pakete, Anpassungen, Grafana, Tests
Compliance: - MlaCheckService - Military Lending Act DoD MDC Single-Records-Abfrage. Renditen NotCovered, wenn unkonfiguriert so dev nicht hart-fail; Produktion MUSS los.mla.endpoint + api-key konfigurieren ODER führen Sie manuelle MLA im KYC-Schritt der org aus (PII-Zugang erforderlich). - OfacSanctionsService - Treasury SDN Liste in-Speicher einge zwischengedeckt, aufgefrischt Nachts von sdn.cv. Unicode NFD Normalisierung + diakritisch Strippen. In LoanOfferService.send verdrahtet: SDN-Hit blockiert den Senden und schreibt ein STATE_RULE_VIOLATION_DETECTED Audit-Reihe. - LoanLifecycleService Kühl-off liest jetzt LoanStateRule.coolingOffDays für den Zustand des Kreditnehmers (ersetzt die LocalDateTime.now() Platzhalter). - Stripe account.updated webhook synchronisiert jetzt Gebühren/Auszahlungen/Detail-Flags + default_currency + requirements_disabled_reason auf LoanOrgStripeConnect so cron Jobs + die org Einstellungen UI sehen Live-Fähigkeit Zustand. Enthüllungspaket: - Neue DisclosurePacketBuilder bündelt TILA-Box + GLBA Datenschutzhinweis + ECOA Nichtdiskriminierungsmitteilung + ACH Mandatsermächtigung in einem PDF via PDFBox PDFMergerUtility + Stores in MediaService. Jede Komponente ist aufgenommen als LoanDisclosure Reihe auf das Angebot eingegeben. LoanOfferService.send baut das Paket automatisch, bevor der ESign-Umschlag erstellt wird. Bedienung: - ************ - Gebühren/Hauptkredit-or-Debit mit erforderlichem Grund; emittiert LoanPayment(INTERNAL_ADJUSTMENT oder REVERSAL_ADJUSTMENT) + MANUAL_ADJUSTMENT Audit - LoanAdjustmentService.waiveFee - Flips LoanFee.waivedAt + Credits feesPaidToDate + emittiert FEE_WAIVED Audit - ************ - nicht-finanzielle Verpflichtungsreihe verwendet in D60+ Workflow-Tracking, emittiert PROMISE_TO_PAY_LOGGED Audit - LoanAdjustmentController setzt /api/los/adjustments/{manuell, Gebühren/{uid'/waive, versprechen-to-pay. Beobachtbarkeit: - ************ - das beschickbare Armaturenbrett mit Statusanzeigen, Zahlungsergebnisse, R-Code-Rückgaben nach Code, Webhook p50/p90/p99, Auszahlungen/Stunde, Aufladungen/Tag, JVM-Haufen, HTTP-Rate Prüfungen (30 insgesamt, alle grün): - 7 AmortisationEngine - 9 InterestAccrualEngine (einschließlich des zuvor behobenen 100-fach-Fehlers) - 5 PaymentAllocator - 4 NachaReturnCode (Retry-Klassen + Mandat-revoking Codes + beschreiben) - 5 OfacSanctionsService (sauberer Spiel / Hit / Diakritik / alias / deaktiviert über Reflexion-injected Cache, kein Netzwerk oder Test-Container erforderlich)
· kamolos
P2-Charge - Beobachtbarkeit, Tests, Jahresendsteuer, echte Streifen-IDs
Beobachten: - Mikrometer-Registry-Prometheus auf dem Klassenpfad - /actuator/prometheus über Management config ausgesetzt (beide lokale + k8s configmap) - LoanMetrics Service: **************** ************ los_charge_off_total, los_disbursement_total, los_loan_status_count{status-Messgerät, **************** - Zähler in LoanPaymentPostingService + LoanChargeOffService verdrahtet Mathe + Prüfungen: - 21 Einheiten Tests für AmortisationEngine (Level-Zahlung, APR Newton- Raphson, monatliche Fälligkeitsprogression, Kapital+Zinsen invariant, bad-input Wachen), InterestAccrualEngine (ACT_365 / ACT_360 DPR, Ein-Tag / 30-Tage-Zusatz, LOC ADB), PaymentAllocator (fees-Interesse .Hauptauftrag, Teil, Überzahlung, Nullen) - **Fixes 100x Zins-Bug** in ************ Divisor war 36500/36000 statt 3.650.000/3,600,000 (jährliche Rate Fraktion braucht beide /10000 bps-Fraktion UND /365 Tage), so aufgelaufen Die Zinsen waren zu hoch. Test fügte hinzu, dass es erwischt haben würde. Echte Streifenidentifikationen (keine Platzhalter mehr): - StripeConnectController.onboard besteht jetzt fortt LoanOrgStripeConnect auf erfolgreiche Erstellung von Stripe-Konto; .status kehrt Onboarding-Staat - Neuer StripeIdResolver: connectedAccountIdForOrg() + faul getOrCreateBorrowerCustomerId() (idempotency-keyed Customer.create unter dem verbundenen Konto, bleibt auf Loan.stripeCustomerId) - AutoDebitRunJob.fireAchDebit + .fireDisbursement jetzt real lösen IDs durch StripeIdResolver anstelle von "acct_placeholder_*" Erinnerungsaufnahme: - ReminderSchedulingJob: nächsliche Sweep emittiert ZAHLUNG_DUE_3_DAYS, ZAHLUNG_DUE_TODAY, ZAHLUNG DES RATES_LATE_1/5/15, ANGEBOTSTEXPIRING (24h vor Ablauf), STATEMENT_AVAILABLE (bei Generation). Dedup-keyed via ************ so Wiederholungen sind idempotent. Jahresendsteuer: - YearEndTaxJob (cron 06:00 Jan 5): produziert 1099-C für Abschreibungen + 1099-INT für Kreditnehmer-Kreditzinsen $10. PDFBox-gerenderte Form, gespeichert bei MediaService, als LoanDisclosure mit Form/Jahr erfasst Metadaten, also Wiederholungen sind idempotent. - Loan.tax1099CEligible Auto-Set auf Abbuchung bestätigen, wenn Betrag €600
· kamo-shared-library
LoanOrgStripeConnect + Kreditsteuer/Akcrual-Felder + heiße Indizes
- Neues Unternehmen LoanOrgStripeConnect (one-per-org, hält stripeConnectedAccountId + Connect onboarding-Funktionen) + Repository - Darlehen: stripeCustomerId (faul erstellt unter dem angeschlossenen Konto der org), lastAccrualDate, tax1099Int Ausligible, tax1099CEligible - Hot Composite Indizes: * Darlehen: (org_id,status), (borrower_member_id,status), (next_payment_due_at), (Status,delinquency_tier) * loan_payments: (loan_id,initiated_at), (loan_id,status), (stripe_payment_intent_id), (statement_id) * loan_statements: (loan_id,statement_number DESC), (due_date,status) * loan_offers: (org_id,status), (borrower_member_id,status), (status,expires_at)

Euer Universum wartet.
Fügen Sie Produkte hinzu, wann immer Sie möchten – keine Migration, keine neuen Anmeldungen.
Für immer kostenlos – keine Kreditkarte erforderlich