Перейти к содержимому
KAMOUniverse

Журнал изменений

Что нового.

Каждое усовершенствование платформы, как только она появится.

  1. · kamo-shared-library

    API SIGNATURE api-key scope + EsignGenericEnvelope.origin

    Аддитивный, без перебора версий: - ApiKeyScope.API SIGNATURE - закрывает программный API электронной подписи (бизнес) - EsignGenericEnvelope.origin (EsignUsageOrigin, nullable) - записывает, является ли конверт был создан с помощью API против MANUAL, поэтому заполненные подписи счетчика правильно (API рассчитывает на перерасход $0,20; MANUAL никогда этого не делает). Колонна добавлена в Prod Идемпотентный альтер заранее.

  2. · kamo-internal

    Отправка для подписи + статус конверта в редакторе документов

    Добавить кнопку «Отправить для подписи» в заголовок редактора шаблона, который открывает диалог для отправки документа получателям и отслеживания статуса подписи, вызова Новый двигатель ESigService /api/esig/envelopes. - Прокси-маршруты (OTK через generateOTK, зеркальные шаблоны прокси): POST/GET/api/esig/envelopes, GET [uid], POST [uid]/void, POST **************** - SendForSignatureDialog: Отправить вкладку (ряды получателей, сообщение, истечение срока действия) + Закладка состояния (пер-шаблонный список конвертов, чипы состояния, void/resend) - Кнопка отключена, пока шаблон не сохранил изменения - i18n через next-intl ****************

  3. · ESigService

    Генерическая оболочка для создания/отправки двигателя (справочная сторона)

    Добавить OTK-authed /api/esig/envelopes API-камо-внутренние диски для отправки документы для подписи, повторное использование одних и тех же общедоступных организаций подписание API считывает — добавка, орг-агностическая замена для кредита KamoLOS/EsignClient создает путь. - POST create-and-send из шаблона: строит EsignGenericEnvelope (AD HOC), один EsignEnvelopeRecipient на подписчика со свежим хешированным токеном доступа, и e-mails each the /s/{env}/{recipient}?t={token} signing link (best-effort) - GET list (конвертная панель) + детали GET {uid} со статусами получателей - POST {uid}/void и {uid}/recipients/{rid}/resend (вращает токен) - Пригласить + делегировать электронные письма EsignEmailClient.sendInvite; подписывающий маршрут ссылки, исправленные на /s/{env}/{получатель}

  4. · ESigService

    Публичная подпись API-движок для sign.sign.pink

    Внедрить /api/esig/public/*, подписывая API вызовы приложения kamo-signer, Превращение живого подписчика из предварительного просмотра в рабочий бэкэнд. - подтверждение (токен-получатель -> сессия подписавшего), сессия, согласие, stepup/start+verify (email OTP), отправка, декодер, делегирование, документ - Сессии подписантов при поддержке Redis (X-Signer-Session), отличные от штатных ОТК байты документов по реальному трубопроводу Img/MinIO (шаблон imgId ->) Преобразованный PDF ImgDat -> MinIO, не подключенный к сети /api/imaging/blobs stub - PDFBox flatten: значения поля наложения + изображения подписи в дизайне координаты, добавление страниц сертификата аудита E-SIGN/UETA; подписанный PDF В Минио под конвертом подписан BlobId с записанным SHA-256 - Аудиторские ряды EsignSignature + EsignField Сохранение ценности - Эмиты **************** Измерение API-происхождения следует в #3/#4 - Брендинг, разрешенный от Organization + OrgDomain для тематики первой краски - OTKAuthFilter обходит /api/esig/public (токен-аут, а не персонал OTK) Только добавки; существующие /api/esig/templates/* нетронутые.

  5. · kamo-internal

    Переключение продуктов платформы на вкладке «Организации»

    Поверхность платформо-производственного обозначения, где оно находится — Платформа Организации. Добавляет закрытый коммутатор для одной организации (отключен для организации верхнего уровня), Диалог подтверждения, объясняющий эффект права, «продукт платформы» чип, предупреждение без каталога, оптимистичное обновление и перекус ошибок. Все струны через Next-Intl.

  6. · BillingService

    Управление организацией.isPlatformПродукт с платформы → Органы

    PlatformAccountSummary разоблачает платформуПродукт + подписка Рынок; новый *************************** (Platform-admin gated) устанавливает флаг и аннулирует права членов организации (их продукт) Корень, а значит и особенности, меняются. Орг верхнего уровня является неявным корнем и не может быть перемешанным.

  7. · kamo-shared-library

    Explicit Organization.isPlatformProduct в качестве основного сигнала

    Заменить полученную эвристику «владеет рынком подписки» на явную, Флаг владельца admin-set. Продукт платформы (например, sign.pink) представляет собой белый ярлык. продукт, на котором работает платформа, и является ее собственным корнем прав; клиентская организация — даже один, работающий на собственном рынке SUBSCRIPTION для перепродажи своим клиентам, — это Нет, и остается право на платформу. В настоящее время RootResolver читает флаг (плюс неявный корень верхнего уровня) и больше не зависит от рынка собственность. Добавлена колонка is platform product (BOOL DEFAULT FALSE) KamoInitializer создает его до развертывания служб, которые выбирают Организацию.

  8. · SecurityService

    Сфера членские права на корень продукта, а не KamoCRM

    EntitlementService теперь устраняет корень прав каждого члена EntitlementRootResolver (ближайший рыночный предок) Прогулка до верхнего уровня. Пол свободного уровня и флаг доступа к продукту происходит от этого корня, и isKamoCrmSubscription становится подпиской (план-орг против корня, никогда расчетный счет). Получение членских прав Продукт RootOrgId, чтобы потребители открывали доступ к правильному продукту. BillingSetupService - источник рынка + Бесплатный план от нового продукта организации корень при сохранении учетной записи на верхнем уровне KamoCRM - т.е. Родитель владеет биллингом, ребенок может владеть продуктом / рынком. Поведение не меняется до тех пор, пока организация фактически не будет владеть собственным рынком (KamoCRM - это корпоративный рынок). Сегодня это только владелец рынка, поэтому каждый участник все еще решается на это.

  9. · kamo-shared-library

    Решить права с помощью организации на основе продукта, а не платформы верхнего уровня

    EntitlementRootResolver: ближайший рыночный предок орг (корень продукта), возвращающийся на верхний уровень платформы. Это Отделить * какой продукт вы имеете право * (владелец рынка / плана) от * кто платит * (биллинговый счет) и из одной организации верхнего уровня, поэтому продукт с белой маркировкой Например, sign.pink, который владеет собственным рынком, становится собственным корнем прав. ******************* теперь источник Свободной базовой линии от организации корень продукта (не найти FirstByIsTopLevelTrue) и решает планы товарной/рыночной организации, а не платежной организации. KamoCRM в настоящее время является единственным владельцем рынка, поэтому каждый существующая организация решается на это точно так же, как и раньше - поведение только расходится один раз Субдерево имеет собственный рынок. Аддитивный; нет бугорка версии.

  10. · kamo-shared-library

    Добавить получателя конверта, стоимость поля, субъекты статуса получателя

    Проверить модель входного сигнала: EsignEnvelopeRecipient (+repo), EsignFieldValue (+repo), EsignRecipientStatus и обновление ESignSignerType. Аддитивный; нет бугорка версии.

  11. · kamo-shared-library

    Добавить EsignUsageRecord для учета использования каждой подписи

    Новый объект использования только в приложении (зеркала AiUsageRecord), выпущенный при подписании завершение. Только подписи API-происхождения учитываются в ежемесячном включенном плане. квота + перерасход (подпись.pink Бизнес: 40/мо включено, затем $0,20 каждый); Однопользовательские подписи записываются, но никогда не выставляются. Billing period (YYYY-MM) поддерживает ежемесячную агрегацию; report to stripe делает представление об использовании Stripe Идемпотент. Только аддитивный; нет бугорка версии.

  12. · ConversionService

    Сохраняйте соотношение сторон, никогда не растягивайте неквадратные логотипы

    Кадры Favicon PNG/ICO были изготовлены с использованием KeepAspectRatio (ложное), растяжение любой неквадратный логотип в искаженном квадрате. Расположение логотипа на a прозрачное квадратное полотно вместо этого, сохраняя соотношение сторон, поэтому фавиконы выглядят Правильная для любой загруженной формы логотипа без необходимости квадратного исходного изображения.

  13. · KlusterServices

    Pre-seed sign.pink + www.sign.pink in STATIC DOMAINS

    sign.pink - новый домен apex (бренд электронной подписи потребителя / white-label) Арендатор Камо. Pre-seed apex + www, так что сертификат Let's Encrypt существует раньше первый HTTPS-трафик; *.sign.pink поддомены динамически получают сертификаты per-FQDN при первом попадании, тот же механизм, что и *.priceturbo.com.

  14. · kamo-signer-monorepo

    Новое приложение для подписания электронной подписи monorepo + mobile-first

    Turborepo + pnpm рабочие пространства монорепо корпус многоразовые пакеты электронных знаков извлечено из камо-внутреннего плюс новое, ультраполированное приложение камо-сигнатора — опыт второй стороны (дизайнер / автор остается в Камо-внутренний. Пакеты: - @kamo/esign-core types + контракт на проволоку DesignData, схема zod, время выполнения Полевая валидация, SignStore (zustand) - @kamo/esign-ui Interactive field inputs + read-only field/annotation рендереры (выкованные из камо-внутреннего FieldControl) - @kamo/doc-render bundled pdf.js page renderer (самостоятельный рабочий, без CDN), Адаптивные, поворотно-правильные наложения - @kamo/theme per-tenant branding bootstrap (getThemePath, ThemeLogo, DynamicMetaLoader - @kamo/api-client browser fetch + server Redis/forwarding helpers - @kamo/config shared tsconfig/ tailwind preset/eslint Приложение (Apps/kamo-igner): - Token-scoped signer auth (SIGNSESH httpOnly session, BFF route handlers) - welcome -> consent (ESIGN/UETA) -> eIDAS AES stepup OTP -> управляемое подписание -> финиш -> завершение, анимация всех фаз (framer-motion, редуцирование) осознанный), мобильный, равный настольному, WCAG-ориентированный - пакет захвата подписи: draw / type (скриптовые шрифты) / upload / adopt all - мультидокумент, декодер, делегат/переназначение, полный i18n (следующий-intl, 22 локала) - режим предварительного просмотра (не требуется backend) + /.forgejo + /k8s (HostRegexp) знак.*, турбированный Dockerfile

  15. · kamo-internal

    Full-width Enterprise переписывает с живым предварительным просмотром

    LoanProductForm представлял собой единую узкую колонку (maxWidth: 880) с жесткой кодировкой. Английский везде. Теперь используется тот же шаблон предприятия, что и на странице предложения: Укладка: - Полноширокий градиентный заголовок с хлебными крошками, задней стрелкой, добрый значок - Сетка с двумя колоннами (6fr/6fr) на lg+, одноколонка ниже - Форма слева, живая "Продукт Preview" справа Сторона формы: - Kind selector as ToggleButtonGroup with descriptions (Installment vs LOC), не похоронен в выпадающем списке — это структурный выбор, который меняет В остальном форма, поэтому она заслуживает внимания. - Блоки разделов с иконками (Основы · Цены · Пределы и условия · Соблюдение) - Ставки введены в %, преобразованы в bps на проводе (не более «3600 = 36%») - Все полевые метки через next-intl t() Справочник по дневному счету, объясняющий ACT 365 против ACT 360 Сторона предварительного просмотра: - Карта героя: вид чипа, код продукта чип, имя, заголовок, описание - 4-разрядная сетка статистики: тариф, происхождение, поздняя плата, плата NSF - Ограничения и сроки сетки (внимание: диапазон + частота для рассрочки, **************************** - карта предложения образца (установка): ежемесячный платеж, общий процент, общая стоимость, происхождение образца в середине основного диапазона - Чипы соответствия: разрешенные состояния (колпачка 24 + переливной чип), автоплатежи Требуется + скидка, обязательный шаблон векселя - Записка, объясняющая, как этот продукт попадает на страницу предложения LoanProductForm теперь включает как новые, так и редактируемые страницы. Обертки страниц Передайте MarketTitle, чтобы хлебная крошка решалась чисто.

  16. · kamo-internal

    Двухколонный макет с панелью предварительного просмотра в реальном времени

    Страница нового предложения представляла собой высокую узкую колонку на широких экранах — впустую потраченную половину. Смотровая площадка. Теперь используется CSS Grid с формой слева (5fr) и с панель «Offer Preview» справа (7fr), которая обновляется как оператор Типы. Одноколонка на маленьких экранах (<lg). Сторона формы: - Блоки разделов с значками (Продукт · Заемщик · Сумма · Пользовательские условия) Поля заемщика стекаются вертикально (member id + state) в более компактном виде. теперь, когда горизонтальное пространство зарезервировано для предварительного просмотра Сторона предварительного просмотра (только при выборе продукта): - Карта героя с градиентным фоном, добрый чип, название продукта и Человеческий заголовок («$5,000 · 12-месячный взнос · 14.99% APR») Кредитная линия $25 000 · ставка 9,99% - 4-разрядная сетка статистики: основная, ставка, ежемесячный платеж, срок (установка) или основной, ставка, период розыгрыша, период погашения (LOC) - Разбивка сборов (происхождение/конец/NSF/год) с использованием "обычного" чипа при применяется override - Сводная панель по расходам: чистая выплата, общий процент, общая стоимость - График амортизации: первые 3 + последние 3 ряда с "{N} больше Платежи..." пробел строка на сроки > 6 месяцев - Напоминание TILA, объясняющее, что бэкэнд вычисляет истинные APR + сборки Реальное расписание + отображает раскрытия на отправке Вся математика - это прямолинейная амортизация на стороне клиента (P × r × (1+r)^n / (1+r)^n - 1) - верный предварительный просмотр, а не окончательный раскрытый APR. обратный До сих пор владеет истиной.

  17. · kamo-internal

    Польская страница нового предложения — пустое состояние, значок LOC, пользовательские условия

    Три UX-разрыва на странице предложения после предыдущего рефактора: 1. Пустое состояние. Когда на рынке еще нет кредитных продуктов, используется выпадающий Чтобы бесшумно рендерить пусто и оператор понятия не имел, что делать. Теперь замененный героем пустым состоянием (иконка, заголовок, праймер на Установке) vs LOC и CTA «Создать кредитный продукт», направленный на продукты / новый поток. 2. LOC vs Installment не виден спереди - оба отображаются одинаково выпадение продукта. Добавлен цветной чип (LOC = синий + повторный значок), Установка = зеленый + значок кошелька) отображается как в выбранном значении и внутри каждой выпадающей опции, плюс описание продукта в опции. 3. Блок «Закрытые термины» был назван сбивчиво — он подразумевал неизменяемый Без всякой возможности обойти. Добавлена складная панель «Таможенные термины» которые обнажают надбавки за предложение по процентной ставке, раскрытые APR, и Начальная плата (ценообразование отношений, тренировки с трудностями, рекламные акции) цены). При установке карта заблокированных сроков визуально проходит через стоимость продукта и показывает превышение (например, 14,99% → 11,99%) Оператор видит, что именно будет выдано. Поддержка бэкэнда в KamoLOS 0e80393; типы расширены в losApi.ts Оверрайд поля текут через createOfferDraft.

  18. · kamolos

    Превышение ставки, APR и платы за происхождение

    LoanOfferCreateRequest получает три дополнительных поля — interestRateBpsOverride, aprBpsOverride, originationFeeAmountOverride. Разработчики применяют их, когда устанавливается и в противном случае возвращается к снимку продукта. Примеры использования: Отношения цены (откат ставки для повторных заемщиков), трудные тренировки (отказ) Происхождение), разовые рекламные предложения. Для продуктов в рассрочку только interestRateBpsOverride находится на нормальном пути — APR рассчитывается по ставке + сборы + график. aprBpsOverride подвергается воздействию В редких случаях явно раскрытый APR должен отличаться от вычисления. Аудит: пишет OFFER DRAFTED для каждого проекта (в форме с OFFER SENT/ACCEPTED). Логи явно перекрывают значения против дефолтов продукта, поэтому след может реконструировать То, что было унаследовано против предложения.

  19. · kamo-internal

    Экспозиция PERSONAL LOANS в трейдинге и трейдинге

    Добавляет PERSONAL LOANS в списки COMMERCE TYPES и EngagementType Новый рынок личных займов KamoLOS может быть создан на новых рынках. Markets/edit pages, surfaces it in QuickActionsBar (с/commerce/personal-loans/new) маршрута), и включает его в фильтр и конфигурацию типа взаимодействия трубопровода.

  20. · kamo-internal

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

    Frontend polish (T6): - New lib/format.ts: locale-aware Intl helpers — formatCurrency / formatDate / formatDateTime / formatPercentBps. Replaces hardcoded toLocaleString() + slice(0,10) patterns scattered across the codebase. - BorrowerAutoPayCard: full enroll / pause / resume / cancel / edit UI for the auto-pay state machine. Surfaces amount-mode dropdown (INSTALLMENT_SCHEDULED / MIN_PAYMENT / FULL_STATEMENT_BALANCE / FIXED_AMOUNT) + day-of-month + payment-method selector. Backend was already wired; this is the last piece for borrower self-service. - Charge-off queue: IRS 1099-C reason code dropdown (8 official letters A–H per IRC §6050P) replaces the free-text reason field; default **************** Notes field stays. Currency rendered via formatCurrency. Org reports (T7): - New **************** 5-bucket dashboard (Current / 1-29 / 30-59 / 60-89 / 90+) with %-of-total + color-coded top borders. Drill-through link to charge-off queue. losApi additions: - agingReport(orgId) + AgingReport type - auditSearch(filters) for the multi-filter regulator endpoint - LoanChargeOffReasonCode union type - confirmChargeOff signature accepts reasonCode

  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

    Группа 5 соответствия

    - OfacSanctionsService: Нечеткий матч Яро-Винклера @ ≥0,92 после точного матча Проходите. Показатель поверхностного сходства. Настраиваемый через los.ofac.fuzzy-threshold. AdverseActionNoticeService: ECOA §1002.9 совместимый генератор PDF CFPB является федеральным регулятором. Обсуждение Reason-for-Decoder + Standard Язык недискриминации. Хранится в MediaService. ********************** Многофильтровый аудиторский запрос для регулятора Повестка + удержание. Страница. - LoanChargeOffService.confirm принимает параметр ReasonCode (IRS 1099-) C box-6 letter), настоял на Loan.chargeOffReasonCode и вставил Формат PDF YearEndTaxJob 1099-C. По умолчанию G. - LoanProductValidationService предупреждает, когда процентные ставки > MLA 3600bps cap Таким образом, соответствие может пометить для проверки MLA на время предложения. - YearEndTaxJob: убран продукт 1099Int филиал - был инертным (нет) Поток платежей по кредитам-заемщикам существует. Остаток с реактивацией Как только такой поток приземляется. Все 30 тестов проходят.

  23. · kamo-shared-library

    LoanChargeOffReasonCode (IRS 1099-C box 6) + поиск по аудиту

    - New LoanChargeOffReasonCode enum (A BANKRUPTCY..H OTHER) per IRC §6050P - Loan.chargeOffReasonCode - **************** мультифильтр @Query for regulator subpoenas (loanId / kind / actorType / actorMemberId / from / to) — стр

  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

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

    Используется **************** для реактивации существующего Вместо того, чтобы создавать дубликат строки, который сирот остановил один.

  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

    Страница с подробным описанием кредита на стороне организации + корректировки / API обещания

    - losApi: manualAdjust, waiveFee, promiseToPay **************** Полная страница * 4-up карты баланса (текущий, основной, проценты, следующий взнос) * Ручная форма корректировки (CREDIT/DEBIT, требуемая причина) - звонки /api/los/adjustment/manual *Форма с обещанием оплаты - звонки **************** * Заявления + таблицы платежей * Embeds <LoanAuditTimeline> для полного журнала событий Это устраняет неработающую ссылку, которую MarketActiveLoansTab + ТрубопроводActiveLoansTab указывал на это.

  28. · kamolos

    Финальная партия — соответствие, пакеты, корректировки, Grafana, тесты

    Соблюдение: - MlaCheckService - Закон о военном кредитовании охватывает поиск заемщиков Однозаписный запрос DoD MDC. Returns NotCovered if unconfigured so dev не терпит неудачу; производство должно настраивать los.mla.endpoint + api-key ИЛИ запустите ручной MLA на этапе KYC (требуется доступ PII). - OfacSanctionsService - Казначейский список SDN, кэшированный в памяти, обновленный ночное от sdn.csv. Unicode NFD нормализация + диакритическая стриптиз. Проводимый в LoanOfferService.send: SDN hit блокирует отправку и пишет STATE RULE VIOLATION DETECTED аудиторская строка. - Отключение LoanLifecycleService теперь читает LoanStateRule.coolingOffDays для государства заемщика (заменяет заполнитель LocalDateTime.now). - Stripe account.updated webhook теперь синхронизирует сборы/выплаты/флаги деталей + default currency + requirements disable reason on LoanOrgStripeConnect Так что cron jobs + настройки организации UI см. в режиме реального времени. Пакет раскрытия информации: - Новые пакеты DisclosurePacketBuilder TILA box + GLBA privacy notice + Уведомление о недискриминации ECOA + авторизация мандата ACH в один PDF через PDFBox PDFMergerUtility + магазины в MediaService. Каждый компонент является Записано как строка раскрытия информации о кредите, привязанная к предложению. LoanOfferService.send Он автоматически формирует пакет перед созданием конверта ESign. Обслуживание операций: **************** — сборы/основной кредит/дебет с необходимой причиной; эмитирует кредит (INTERNAL ADJUSTMENT или REVERSAL ADJUSTMENT) + MANUAL ADJUSTMENT audit - LoanAdjustmentService.waiveFee - переворачивает LoanFee.waived В + кредитов PaydToDate + проводит аудит FEE WAIVED **************** — нефинансовые обязательства Используется в отслеживании рабочих процессов D60+, выдает аудит PROMISE TO PAY LOGGED - LoanAdjustmentController представляет /api/los/adjustments/ {uid}/waive, promise-to-pay} Наблюдение: **************** — импортная приборная панель индикаторы состояния, ставки оплаты, возврат R-кода по коду, webhook p50/p90/p99, выплаты/час, скидки/день, куча JVM, скорость HTTP Тесты (всего 30, все зеленые): 7 Амортизационный двигатель 9 InterestAccrualEngine (включая ранее исправленную ошибку 100x) 5 Распределитель платежей - 4 NachaReturnCode (классы повторов + коды отзыва мандатов + описание) - 5 OfacSanctionsService (чистый матч / хит / диакритика / псевдоним / отключены) с помощью кэша с впрыском отражения, без сети или тестового контейнера

  29. · kamolos

    P2 пакет — наблюдаемость, тесты, налог на конец года, реальные идентификаторы Stripe

    Наблюдение: - микрометр-реестр-прометей на траектории - /actuator/prometheus экспонируется через конфигурацию управления (как локальный + k8s configmap) - Услуга LoanMetrics: **************** **************************** los charge off total, los disbursement total, los loan status count{status} gauge, ****************Гистограмма - Счетчики, подключенные к LoanPaymentPostingService + LoanChargeOffService Математика + тесты: - 21 единичный тест, охватывающий AmortizationEngine (уровень оплаты, APR Newton- Рафсон, ежемесячная прогрессия, инвариант принципала + процента, Охранники с плохим входом), InterestAccrualEngine (ACT 365 / ACT 360 DPR, однодневное/тридцатидневное начисление, LOC ADB), PaymentAllocator (сборы → проценты) →основной порядок, части, переплата, нули ** Исправляет 100-кратный процентный баг** в ******************* - делитель был 36500/36000 вместо 3 650 000/3 600 000 (годовая ставка) Фракция нуждается в обоих /10000 bps→фракция И /365 дней), поэтому начисляется Интерес был 100 × слишком высок. Тест добавил, что его бы поймали. Идентификаторы Real Stripe (больше нет заполнителей): - StripeConnectController.onboard продолжает работать с LoanOrgStripeConnect Успешное создание учетной записи Stripe; .status возвращается в бортовое состояние - Новый StripeIdResolver: подключенныйAccountIdForOrg() + ленивый getOrCreateBorrowerCustomerId() (idempotency-keyed Customer.create) Под подключенным счетом сохраняется Loan.stripeCustomer Ид AutoDebitRunJob.fireAchDebit + .fireDisbursment теперь разрешают реальные Идентификаторы через StripeIdResolver вместо «acct placeholder *» Напоминание каденции: - ReminderSchedulingJob: ночная подметка выдает PAYMENT DUE 3 DAYS, PAYMENT DUE TODAY, PAYMENT LATE DAY 1/5/15, OFFER EXPIRING (24h) до истечения срока действия, STATEMENT AVAILABLE (поколение). тупой через **************** Так что повторы идемпотентны. Годовой налог: YearEndTaxJob (крон 06:00 5 января): производит 1099-C для скидок ≥ $600 + 1099-INT для процентов по кредиту заемщика > $10. Форма PDFBox, хранится в MediaService, записывается как LoanDisclosure с формой / годом метаданные, поэтому повторы являются идемпотентными. Loan.tax1099 Приемлемый автонабор при списании подтверждается при сумме ≥ $600

  30. · kamo-shared-library

    LoanOrgStripeConnect + Кредитные налоговые/приобретенные поля + горячие индексы

    - New LoanOrgStripeConnect entity (one-per-org, удерживает StripeConnectedAccountId) + Возможность подключения на борту) + репозиторий - Кредит: StripeCustomerId (ленивый, созданный под подключенным счетом организации), LastAccrualDate, tax1099IntEligible, tax1099CEligible - Горячие составные индексы: * кредиты: (org id,status), (borrower member id,status), (next payment due at) (статус,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) (статус,expires at)

Ваша вселенная ждет.

Начните бесплатно через несколько минут. Добавляйте продукты, когда будете готовы — без миграции, без новых логинов.

Бесплатно навсегда — не требуется кредитная карта