Ir para o conteúdo
KAMOUniverse

Changelog

O que há de novo.

Cada melhoria para a plataforma, como ele envia.

  1. · kamo-shared-library

    API SIGNATURE api-key escopo + EsignGenericEnvelope.origin

    Aditivo, sem bump de versão: - ApiKeyScope.API SIGNATURE — porta a API de assinatura eletrônica programática (Business) - EsignGenericEnvelope.origin (EsignUsageOrigin, nullable) — registos envelope foi criado através de API vs MANUAL, por isso completou corretamente o medidor de assinaturas (API conta para a sobrecarga de $0,20; MANUAL nunca conta). Coluna adicionada ao prod via idempotent ALTER antes.

  2. · kamo-internal

    Ação Enviar-para-assinatura + status do envelope no editor de documentos

    Adicionar um botão 'Enviar para assinatura' ao cabeçalho do editor de modelos que abre um diálogo para enviar o documento para os destinatários e rastrear o status de assinatura, chamando o novo motor ESigService /api/esig/envelopes. - Rotas de proxy (OTK via generateOTK, espelha o proxy de modelos): POST/GET /api/esig/envelopes, GET [uid], POST [uid]/void, * ******************************* - SendForSignnatureDialog: Enviar guia (linhas do destinatário, mensagem, expiração) + Página de estado (lista de envelopes por tempo, fichas de estado, void/resend) - Botão desativado enquanto o modelo tem alterações não salvas - I18n via next-intl

  3. · ESigService

    Envelope genérico criar/enviar motor (sender side)

    Adicionar as unidades OTK-authed /api/esig/envelopes API kamo-internal para enviar Documentos para assinatura, reutilizando as mesmas entidades de lib partilhado do público assinatura API lê — o aditivo, org-agnóstico substituição para o empréstimo- KamoLOS/EsignClient acoplado criar caminho. - POST create-and-send a partir de um modelo: compila EsignGenericEnvelope (AD HOC), um sinalEnvelopeRecipiente por signatário com um novo token de acesso hashed, e e- mails cada o link de assinatura /s/{env}/{recipient}?t={token} (melhor esforço) - GET list (envelope painel) + GET {uid} detalhe com status de destinatário - POST {uid}/void e {uid}/receptores/{rid}/resend (rota o símbolo) - Convidar + delegar emails compartilhar EsignEmailClient.sendInvite; singer-route links corrigidos para /s/{env}/{recipient}

  4. · ESigService

    Motor de API de assinatura pública para sign.sign.pink

    Implementar a API de assinatura /api/esig/public/* que o aplicativo kamo-signer chama, transformando o assinante ao vivo da pré-visualização em uma infraestrutura funcional. - validate (recipiente token -> sessão singer), sessão, consentimento, stepup/start+verify (email OTP), enviar, decodificador, delegado, documento - Redis-backed singer sessions (X-Signer-Session), distinta da equipe OTK - Bytes de documentos através do verdadeiro gasoduto Img/MiniO (template imgld -> conversão-PDF ImgDat -> MinIO), não o nunca-fiado /api/imaging/blobs stub - PDFBox achatamento: sobreposição de valores de campo + imagens de assinatura no design coordenadas, anexar páginas de certificados de auditoria E-SIGN/UETA; PDF assinado armazenado em MinIO sob o envelope assinadoBlobId com gravado SHA-256 - Anexar apenas linhas de auditoria EsignSignnature + EsignField Persistência do valor - Emite... A medição da origem da API segue em #3/#4 - Branding resolvido da Organização + OrgDomain para a primeira pintura - OTKAuthFilter bypass /api/esig/público (token-authed, não staff OTK) Apenas aditivo; existente /api/esig/templates/* intocado.

  5. · kamo-internal

    Alternar o produto da plataforma na aba Organizações

    Superfície a designação plataforma-produto onde pertence — Plataforma → Organizações. Adiciona um interruptor fechado por org (desactivado para o org de topo), uma janela de confirmação explicando o efeito de direito, um produto 'Plataforma' chip, um aviso sem catálogo, atualização otimista, e snackbar erro. Todas as cadeias de caracteres via next-intl.

  6. · BillingService

    Gerenciar Organization.isPlatformProduto da Plataforma → Orgs

    PlatformAccountResumo expõe isPlatformProduct + hasSubscription Mercado; novo Põe-te a andar. (plataforma-admin fechado) fixa a bandeira e invalida os direitos dos membros da org (o seu produto root, e assim características, mudança). Org de nível superior é a raiz implícita e não pode ser alternado.

  7. · kamo-shared-library

    Explicit Organization.isPlatformProduto como sinal de raiz de direito

    Substitua a heurística derivada de «donos de um mercado SUBSCRIPTION» por uma heurística explícita, Marca de propriedade do administrador. Um produto de plataforma (por exemplo sign.pink) é um rótulo branco produto que a plataforma opera e é a sua própria raiz de direito; uma org do cliente — mesmo um que gere o seu próprio mercado SUBSCRIPTION para revender aos seus clientes — é Não, e permanece com direito à plataforma. TítuloRootResolver agora lê o bandeira (mais a raiz de topo implícita) e não depende mais do mercado Propriedade. Adiciona coluna is platform product (BOOL DEFAULT FALSE) — requer KamoInitializer para criá-lo antes dos serviços que selecionam a implantação da Organização.

  8. · SecurityService

    Direitos dos membros do âmbito de aplicação à raiz do produto, não KamoCRM

    DireitoO serviço resolve agora a raiz do direito de cada membro através DireitoRootResolver (novo ancestral-ou-se-próprio do mercado) em vez de a caminhar para a org de topo. O piso de nível livre e a bandeira de acesso ao produto deriva dessa raiz, e isKamoCrmAssinatura torna-se assinaturaGrantsRootAccess (plan-org vs root, nunca a conta de faturamento). Ganhos de direitos dos membros produtoRootOrgId assim consumidores porta acesso contra o produto certo. BillingSetupService fornece o mercado + Plano livre do produto da nova org root mantendo a conta de faturamento no topo do KamoCRM org — ou seja, o Pais possui faturamento, a criança pode possuir o produto / mercado. O comportamento mantém-se inalterado até que uma org possua efectivamente o seu próprio mercado (KamoCRM é o apenas proprietário de mercado hoje, então cada membro ainda resolve a ele).

  9. · kamo-shared-library

    Resolver os direitos por org de raiz de produto, não plataforma de nível superior

    Introduzir o direitoRootResolver: o ancestral-ou-se-próprio do mercado mais próximo de uma org (sua raiz de produto), que volta para a plataforma de nível superior. Isto desacopla * que produto você tem direito * (mercado/proprietário do plano) de * quem paga * (conta de cobrança) e a partir de uma única org de topo, por isso um produto de marca branca Org like sign.pink que possui o seu próprio mercado torna-se a sua própria raiz de direito. Agora, a linha de base livre das orgs raiz do produto (não encontrarFirstByIsTopLevelTrue), e resolve planos pelo Org de produto/mercado em vez da org de facturação-conta. Para trás compatível: KamoCRM é atualmente o único proprietário de mercado, então cada A organização existente resolve-a exactamente como antes — o comportamento só diverge uma vez A sub-árvore possui o seu próprio mercado. Aditivo; sem bump de versão.

  10. · kamo-shared-library

    Adicionar o destinatário do envelope, o valor do campo, as entidades de estado do destinatário

    Verificar no modelo de sinais de entrada em progresso: EsignEnveleRecipiente (+repo), EsignFieldValue (+repo), EsignRecipientStatus, e uma atualização ESignSignerType. Aditivo; sem bump de versão.

  11. · kamo-shared-library

    Adicionar EsignUsageRecord para medição por assinatura

    Nova entidade de uso somente do anexo (mirrors AiUsageRecord) emitida na assinatura conclusão. Apenas assinaturas de origem API contam para um plano incluído mensalmente Cota + excesso (sign.pink Business: 40/mo incluído, em seguida, $0,20 cada); MANUAL As assinaturas de um utilizador são registadas mas nunca facturadas. billing period (AAAA-MM) suporta agregação mensal; reported to stripe makes Stripe use submission idempotente. Apenas aditivo; sem bump de versão.

  12. · ConversionService

    Preservar relação de aspecto, nunca esticar logotipos não-quadrados

    Frames Favicon PNG/ICO foram produzidos com keepAspectRatio(false), alongamento qualquer logótipo não quadrado num quadrado distorcido. Centrar o logótipo numa tela quadrada transparente em vez disso, preservando a relação de aspecto, assim os favicons olhar correto para qualquer formato de logotipo carregado sem precisar de uma imagem de origem quadrada.

  13. · KlusterServices

    Sign.pink + www.sign.pink em STATIC DOMAINS

    sign.pink é um novo domínio apex (consumer e-assinature brand / white-label Kamo locatário org). Pré-seed apex + www para que exista um certificado de criptografia de Let's antes primeiro tráfego HTTPS; *.sign.pink subdomínios obter por-FQDN certs dinamicamente quando atingido pela primeira vez, mesmo mecanismo de *. priceturbo.com.

  14. · kamo-signer-monorepo

    Novo aplicativo monorepo + mobile-primeiro e-assinatura assinatura

    Turborepo + espaços de trabalho pnpm monorepo caixas reutilizáveis e-sign extraído do kamo-internal mais um novo aplicativo kamo-signer ultrapolido - a segunda experiência de assinatura (o lado designer / autor permanece em kamo- interna). Pacotes: - @kamo/esign-core types + DesignData wire contract, zod schema, runtime validação de campo, sinalStore (zustand) - @kamo/esign-ui entradas de campo interativas + campo/anotação somente leitura renderizadores (forjados do kamo-internal FieldControl) - @kamo/doc-render empacotado renderizador de páginas pdf.js (trabalhador hospedado, sem CDN), Sobreposições responsivas e corretas de rotação - @kamo/theme per-tenant branding bootstrap (getThemePath, ThemeLogo, DynamicMetaLoader) - @kamo/api-client browser fetch + servidor Redis/forwarding helpers - @kamo/config tsconfig / tailwind preset / eslint Aplicativo (apps/kamo-signer): - token- scoped singer auth (SIGNSESH httpOnly session, BFF route handlers) - bem-vindos -> consentimento (ESIGN/UETA) -> eIDAS AES step-up OTP -> assinatura guiada -> final -> conclusão, todas as fases animadas (framer-motion, redução de movimento consciente), móvel-primeiro igual ao desktop, WCAG-minded - pacote de captura de assinatura: draw / type (script fonts) / upload / adote- tudo - multidocumento, descodificador, delegado/reatribuído, i18n completo (próximo-intl, 22 locais) - modo de antevisão executável (sem necessidade de infra- estrutura) + /.forgejo + /k8s (HostRegexp sinal.*, turbo-prune Dockerfile)

  15. · kamo-internal

    Reescrever empresa de largura total com visualização ao vivo

    LoanProductForm foi uma única coluna estreita (máx. Largura: 880) com codificação Inglês por todo o lado. Agora usa o mesmo padrão empresarial que a página de oferta: Disposição: - Cabeçalho gradiente de largura total com migalhas, seta para trás, tipo emblema - grelha de duas colunas (6fr/6fr) em lg+, coluna única abaixo - Forma à esquerda, ao vivo "Antevisão do produto" à direita Lado do formulário: - Selector de tipo como grupo de botões com descrições (instalação vs LOC), não enterrado em um dropdown — esta é a escolha estrutural que reformula o resto da forma, por isso merece destaque - Blocos de seção com ícones (Básicos · Preços · Limites e Termos · Conformidade) - Taxas introduzidas em %, convertidas em bps no fio (não mais "3600 = 36%") - Todos os rótulos de campo via next-intl t() - Dica de ferramentas de contagem do dia explicando ACT 365 vs ACT 360 Lado da visualização: - Cartão de herói: chip tipo, chip de código de produto, nome, título, descrição - Grade de estatísticas de 4 eixos: taxa, origem, taxa de atraso, taxa NSF - Limites e termos de grade (conhecido: intervalo + frequência para instalação, **************** para LOC) - Cartão de oferta de amostra (instalação): pagamento mensal, juros totais, custo total, origem da amostra no ponto médio da gama principal - Chips de conformidade: estados permitidos (cap 24 + chip de transbordamento), autopay Obrigação de + desconto, vinculação do modelo de nota promissória - Nota de rodapé explicando como este produto flui para a página de oferta LoanProductForm agora envolve as páginas novas e de edição. Capazes de páginas passe o mercadoTítulo para que o migalha de pão resolva de forma limpa.

  16. · kamo-internal

    Layout de duas colunas com painel de visualização ao vivo

    A página nova-oferta era uma coluna estreita alta em telas largas — metade desperdiçada O viewport. Agora usa CSS Grid com o formulário à esquerda (5fr) e um painel "Offer Preview" ao vivo à direita (7fr) que atualiza como o operador Tipos. Coluna única em ecrãs pequenos (< lg). Lado do formulário: - Blocos de seção com ícones (Produto · Emprestador · Quantidade · Termos personalizados) - Os campos emprestados empilham verticalmente (member id + state) num estado mais compacto apresentação agora que o espaço horizontal está reservado para a antevisão Lado de visualização (somente quando um produto é escolhido): - Cartão de herói com fundo gradiente, chip gentil, nome do produto, e um título legível pelo homem ("$5.000 · parcela de 12 meses · 14,99% APR" / " linha de crédito de 25 mil dólares · taxa de 9,99%") - Grade estatística 4-tiles: principal, taxa, pagamento mensal, prazo (instalação) ou principal, taxa, período de saque, período de reembolso (LOC) - Discriminação de taxas (originação/tarde/FNS/anual) com chip "custom" quando um O cancelamento é aplicado - Painel de resumo de custos: desembolsado líquido, juros totais, custo total - Programa de amortização espreitar: primeira 3 + última 3 linhas com um "{N} mais pagamentos..." linha de diferenças para termos > 6 meses - Nota de lembrete TILA explicando a infra-estrutura calcula o verdadeiro APR + builds o calendário real + torna divulgações no envio Toda a matemática é amortização do lado cliente em linha reta (P × r × (1+r)^n / ((1+r)^n - 1)) — uma antevisão fiel, e não a APR final divulgada. Infraestrutura Ainda possui a verdade.

  17. · kamo-internal

    Página da nova oferta polaca — estado vazio, crachá LOC, termos personalizados

    Três lacunas UX que a página da oferta teve após o refator anterior: 1. Estado vazio. Quando um mercado ainda não tem Produtos de Empréstimo, o dropdown utilizado para render silenciosamente vazio e o operador não tinha idéia do que fazer. Agora. substituído por um estado vazio do herói (ícone, título, primer sobre o Parcelas versus LOC, e um CTA "produto de empréstimo criado" encaminhado para os produtos / novo fluxo). 2. LOC vs Parcelas não é visível na frente — ambos aparecem de forma idêntica no A entrega do produto. Adicionado um chip colorido (LOC = azul + ícone de repetição, Parcelas = verde + ícone da carteira) renderizados ambos no valor selecionado e dentro de cada opção dropdown, mais descrição do produto na opção. 3. O bloco "Termos bloqueados" foi confusamente nomeado — implicou imutável sem qualquer forma de anular. Adicionado um painel "Termos personalizados" dobrável que expõe sobreposições por oferta para taxa de juro, APR divulgado, e taxa de origem (preço de relacionamento, exercícios de dificuldade, promoção preços). Quando definido, o cartão de termos bloqueados golpeia visualmente através do valor do produto e mostra a sobreposição (por exemplo, 14,99% → 11,99%) O operador vê exactamente o que será emitido. Suporte à infra- estrutura empurrado em KamoLOS 0e80393; tipos estendidos em losApi.ts assim o fluxo de campos de sobreposição através do createOfferDraft.

  18. · kamolos

    Por oferta substitui por taxa, APR e taxa de origem

    LoanOfferCreateO pedido ganha três campos opcionais — interestRateBpsOverride, aprBpsOverride, originationFeeAmountOverride. createDraft aplica- os quando ajuste e de outra forma cai de volta para o instantâneo do produto. Casos de uso: relacionamento preços (taxa de propina para os mutuários repetidos), exercícios de dificuldade (deslocado originação), ofertas promocionais únicas. Para produtos de instalação, apenas o interesseRateBpsOverride está no caminho normal — APR é calculada a partir de taxa + taxas + cronograma. aprBpsOverride está exposto para Caso raro, um RPA explicitamente divulgado deve diferir do cálculo. Auditoria: escreve OFFER DRAFTED para cada rascunho (uniforme com OFFER SENT/ACCEPTED). Registra valores de substituição explícitos vs padrões de produto para que a trilha possa reconstruir O que foi herdado vs. conjunto por oferta.

  19. · kamo-internal

    Expor os LOADORES PESSOAIS em catadores de comércio e engajamento

    Adiciona PESSOAL LOANS às listas COMMERCE TYPES e tipo de envolvimento para que o novo mercado de empréstimos pessoais KamoLOS pode ser criado a partir dos mercados / novos e mercados/edit páginas, superficie-o em QuickActionsBar (com /commerce/personal-empréstimos/novo route), e inclui-o no filtro do tipo de engajamento pipeline e config.

  20. · kamo-internal

    T6+T7 frontend polish + org reports + auto-pay UI

    Polimento frontal (T6): - Novo lib/format.ts: helpers Intl locale-aware — formatMoeda / formatoData / formatoDataTime / formatoPercentBps. Substitui o código rígido padrões toLocaleString() + slice( 0,10) espalhados pela base de códigos. - EmprestadorAutoPayCard: registro completo / pausa / currículo / cancelamento / edição UI para a máquina de estado auto-pagar. Superfícies volume-modo dropdown (INSTALAMENTO SCHEDULED / MIN PAGAMENTO / ESTATAMENTO BALANÇO / FIXED AMOUNT) + selector dia-de-mês + método de pagamento. Infra- estrutura foi já ligado; esta é a última peça para o auto-serviço do mutuário. - fila de charge-off: IRS 1099-C código da razão dropdown (8 oficial letras A–H por IRC §6050P) substitui o campo da razão de texto livre; ************************* O campo de notas fica. Moeda renderizada via formatoMoeda. Relatórios Org (T7): - Novo... Painel de 5 bucket (Atual / 1-29 / 30-59 / 60-89 / 90+) com % do total + cor codificada Fronteiras superiores. Ligação de perfuração à fila de carregamento. Adições losApi: - envelhecimentoReport(orgId) + AgingReport type - auditeSearch(filters) para o parâmetro regulador multifiltro - LoanChargeOffReasonCode union type - confirmarCargaOff assinatura aceita razãoCódigo

  21. · kamolos

    Tier 6+7+9+10 — frontend polish, org reports, OpenAPI, JaCoCo

    T6 (frontend polish): - New /lib/format.ts: locale-aware formatCurrency / formatDate / formatDateTime / formatPercentBps via Intl APIs (replaces hardcoded toLocaleString + slice(0,10) patterns). - BorrowerAutoPayCard: enroll / pause / resume / cancel / edit auto-pay with amount-mode dropdown (INSTALLMENT_SCHEDULED / MIN_PAYMENT / FULL_STATEMENT_BALANCE / FIXED_AMOUNT) + day-of-month + payment-method selector. - Charge-off queue: IRS 1099-C reason code dropdown (8 official letters A–H per IRC §6050P) replaces the free-text reason field; default G. Currency formatting via formatCurrency. T7 (org reports): - New LoanReportsController.aging: counts loans into Current / 1-29 / 30-59 / 60-89 / 90+ buckets via paged DELINQUENT scan + countByOrganizationAndStatus for ACTIVE. - **************** 5-bucket dashboard with %-of-total + color-coded bands + drill-through to charge-off queue. T9-T10 (DX + docs): - **************** /v3/api-docs + /swagger-ui.html auto-generated. OpenApiConfig sets title + description + version. - DevSeedLoader @Profile("dev"): boots two sample LoanProducts (12-mo installment + perpetual LOC). Idempotent (skips on existing productCode). - JaCoCo Maven plugin: prepare-agent + report on test phase. Coverage HTML at target/site/jacoco/index.html for CI consumption. losApi additions: - agingReport(orgId) + AgingReport type - auditSearch(filters) for the multi-filter regulator endpoint - confirmChargeOff signature accepts reasonCode 36 tests passing.

  22. · kamolos

    Lote de conformidade de nível 5

    - OfacSanctionsService: jogo fuzzy de Jaro-Winkler @ ≥0,92 após a correspondência exata Passo. Atingiu a pontuação da semelhança da superfície. Configurável via los.ofac.fuzzy-limiar. - AdverseActionNoticeService: ECOA §1002.9 compliance PDF generator name o PCPB como regulador federal. Muda razões-para-descodificador + padrão Língua de não discriminação ECOA. Armazenado para MediaService. - Está bem. Consulta de auditoria multifiltro para regulador intimações + varreduras de retenção. Chamado. - LoanChargeOffService.confirmar aceita parâmetro ranceCode (IRS 1099- C box-6 carta), persistiu para Empréstimo.cargaOffReasonCode e rosqueado em A renderização de PDF 1099-C do YearEndTaxJob. G padrão. - LoanProductValidationService avisa quando interessaRateBps > MLA 3600bps cap por isso, a conformidade pode marcar para a triagem MLA em tempo de oferta. - YearEndTaxJob: removido o produto1099Int ramo — foi inerte (não Existe um fluxo de pagamentos crédito-crédito-juros). Espeto esquerdo com reativação orientação uma vez que tal fluxo cai. Todos os 30 testes unitários passam.

  23. · kamo-shared-library

    EmpréstimoChargeOffReasonCode (IRS 1099-C box 6) + pesquisa de auditoria

    - New LoanChargeOffReasonCode enum (A BANKRUPTCY..H OTHER) por IRC §6050P - Empréstimo.cargaOffReasonCode coluna - Está bem. (empréstimo / tipo / actorTipo / actorMembro / de / para) — paged

  24. · 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.

  25. · kamo-shared-library

    ****************************

    Usado por... Plano PAUSADO em vez de criar uma linha duplicada que orfãos a pausada.

  26. · 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).

  27. · kamo-internal

    Página de detalhes do empréstimo do lado Org + ajustes/promessa API

    - losApi: manualAjustar, renunciarFee, prometerPagar - Página completa de operações de org. * 4-up cartões de saldo (corrente, principal, juros, próxima obrigação) * Formulário de ajuste manual (CREDIT/DEBIT, razão exigida) — chamadas /api/los/ajustes/manual * Formulário de promessa de pagamento - chamadas **************************** * Declarações + tabelas de pagamentos * Incorporações <LoanAuditTimeline> para o registro completo de eventos - Isso resolve o link quebrado que MarketActiveLoansTab + PipelineActiveLoansTab estavam apontando para.

  28. · 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)

  29. · kamolos

    P2 lote — observação, testes, imposto de fim de ano, identidades reais das riscas

    Observabilidade: - micrômetro-registro-prometheus no classpath - /actuator/prometheus exposto através da configuração de gestão (tanto local + k8s configmap) - Serviço de empréstimos: **************************** los charge off total, los desembolso total, los empréstimo status count{status} gauge, ****************Histograma - Contadores conectados ao LoanPaymentPostingService + LoanChargeOffService Matemática + testes: - 21 testes unitários cobrindo AmortizaçãoEngine (pagamento de nível, APR Newton- Rafhson, progressão mensal da data de vencimento, principal + interesse invariante, proteção contra má entrada), InterestAccrualEngine (ACT 365 / ACT 360 DPR, um dia / trinta dias de exercício, LOC ADB), PaymentAllocator (fees→interesses) → ordem principal, parciais, sobrepagamento, nulos) - Fixes 100x de taxa de juros. — o divisor foi 36500/36000 em vez de 3.650.000/3.600.000 (anualRate fração precisa tanto /10000 bps→fração E /365 dias), assim acumulado O interesse era muito alto. O teste acrescentou que o teria apanhado. Identificadores Real Stripe (sem mais espaços): - StripeConnectController.onboard agora persiste LoanOrgStripeConnect on criação bem sucedida da conta Stripe; .status retorna estado de integração - New StripeIdResolver: connectedAccountIdForOrg () + preguiça getOrCreateBorrowerCustomerId() (Client.create com chave de idempotência sob a conta conectada, persiste para Loan.stripeCustomer Id) - AutoDebitRunJob.fireAchDebit + .fireDesembolso agora resolve real IDs através do StripeIdResolver em vez de "acct placeholder *" Cadência de lembrete: - LembreteSchedulingJob: varredura noturna emite PAGAMENTO DUE 3 DAYS, PAGAMENTO DAY DAY DAY DAY DAY 1/5/15, OFFER EXPIring (24h) Antes de expirar, DECLARAÇÃO DISPONÍVEL (em geração). Dedup-keyed via Então, as reprises são idempotentes. Imposto de fim de ano: - YearEndTaxJob (cron 06:00 Jan 5): produz 1099-C para recargas ≥$600 + 1099-INT para juros de crédito do mutuário > $10. Forma renderizada em PDFBox, armazenado no MediaService, registrado como LoanDisclosure com formulário/ano metadados para que as reprises sejam idempotentes. - Empréstimo.tax1099 Auto-set CEligible em carga-off confirmar quando o valor ≥ $ 600

  30. · kamo-shared-library

    EmpréstimoOrgStripeConnect + Imposto de empréstimo/campos de exercício + índices quentes

    - Novo LoanOrgStripeConnect entity (one-per-org, holds listeConnectedAccountId + Conectar recursos de onboarding) + repositório - Empréstimo: listeCustomerId (criado sob a conta conectada da org), ÚltimoAccrualData, imposto1099Inteligível, imposto1099CEligível - Índices compostos quentes: * empréstimos: (org id, status), (emprestador member id, status), (próximo pagamento due at), (status, delinquência tier) * empréstimos pagamentos: (empréstimo id, iniciado at), (empréstimo id, status), (estipe pagamento intenção id), (declaração id) * loan statements: (empréstimo id, indicação number DESC), (due date, status) * loan offers: (org id, status), (emprestador member id, status), (status, expira at)

Seu universo está esperando.

Comece gratuitamente em minutos.Adicione produtos sempre que estiver pronto — sem migração, sem novos logins.

Gratuito para sempre — não é necessário cartão de crédito