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

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

Что нового.

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

  1. · kamo-internal

    Фронтенд P1 — очередь снятия платы + график аудита

    - losApi: chargeOffQueue / confirmChargeOff / auditByLoan ********************** D120 обзор страницы очереди; пользователь просматривает каждый кредит, добавляет причину, нажимает Подтверждать → POST/api/los/charge-off Подтверждаю. Поверхность сервера LoanChargeOffService. - Новый компонент <LoanAuditTimeline>: **************************** и отображает полный поток LoanAuditEvent (тип актера, вид, количество, метка времени). Предназначен для подключения к странице детализации кредита на стороне организации.

  2. · kamolos

    P1 Batch — webhooks advance state, crons, вертикаль коммерции

    Движение денег (основной P1): - LoanPaymentPoytingService: MarkSucceededAndPost / MarkFailed / MarkReturnedAndReverse / MarkDisbursement Преемник / MarkDrawDisbursed Распределение заказа заблокировано: сборы → проценты → основной. Автопродвижение статуса DELINQUENT → ACTIVE → PAID OFF на основе полученного баланса. StripeWebhookService больше не является только для входа в систему: payment intent.succeeded payment failed / charge.refunded (ACH return) / dispute.created+closed / payout.paid+ провалил все авансовые записи через PostingService. NachaReturnCode + RetryScheduler: NACHA-совместимая маршрутизация R-кода R01/R09 с перерывом до 2х/5 дней, R07/R10/R29 отменяет мандат, Исчерпанные ретрисы перевернуть LoanPaymentMethod → REQUIRES REVERIFY. Торгово-вертикальная материализация: ******************* теперь создает Вовлеченность (PERSONAL LOANS, COMMITTED), Commitment (ACTIVE, with pricing+terms JSON) snapshots), Order (AUTHORIZED, subtotal=principal) и threads их идентификаторы Вернуться в Loan.commitmentUid / engagementUid / originingOrderUid той же сделки. Кронные задания (реальная логика, а не заглушки): - CoolingOffAdvanceJob: завязывается оплата PENDING DISBURSEMENT OUT Каждое нарушение ссуда, охлаждение которой истекло. - InterestAccrualJob: ежедневное начисление простых процентов на основной баланс Активный + Делинквентный кредит. - StatementGenerationJob: installment per-due-date statement, LOC per-cycle заявление с аппроксимацией АБР + годовой взнос + автоплатеж расписание. AutoDebitRunJob: увольняет автоматические дебеты + выплаты + NACHA перезаписывается через StripeConnectService с помощью ключей идемпотентности. - Согласительная работа: ночная пересчет сборов/основных/балансовых от Реестр; коррекция дрейфа зарегистрирована + проверена. ReminderDispatchJob: удаляет уведомления SCHEDULED за пределы запланированного и доставляет через NotificationDispatchService. Уведомления: ********************** Настоящий HTTP POST для EmailService (/api/email/transactional/send) и VOIPService (/api/voip/sms/send), /api/voip/voice/send), templateKey = "loan.{kind lowercase}". Проверка: - LoanProductValidationService: форсирует APR ≤ State cap (на вид), Запрещенные проверки, min/max-принципиальное здравомыслие. Застрял в LoanProductService.создать + обновить. Зарядка: LoanChargeOffService.queue() перечисляет кредиты D120; .confirm() переворачивает статус CHARGE OFF RECORDED – это аудиторское мероприятие. - LoanChargeOffController показывает **************************** Аудиторский просмотр: - LoanAuditEventController показывает ****************************

  3. · kamo-internal

    Закаливание P0 — формы, разрешение сеанса, способы оплаты

    Формы (org-side): ********************** /{productUid}} Редактировать страницы - Новая форма займаПродукт: основы / ценообразование / лимиты / условия / соответствие секции, поля, учитывающие вид (установка vs LOC), вексель-нота шаблон UID, разрешённые государственные коды ********************** продукт отбор (только активные продукты с этого рынка), участник-заемщик, основной, факультативный термин, государство заемщика, «сохранить проект» против «отправить» - /settings/features/lending: orgside Stripe Connect onboarding page (перенаправлено с «The Stripe») Упрочнение на стороне заемщика: - Новый крюк UseCurrentSession() разрешает членId/orgId /api/user-info (канонический *** путь) — заменяет поддельный KMEMBER/KORG Cookie читается в Моих Кредитах, Детали Предложения, Детали Кредита, Настройки Кредитования, PipelineLoanOffersTab, PipelineActiveLoansTab Новая карта BorrowerPaymentMethodsCard: заемщик может связать банк ACH pay method id + mandate) или карта, см. связанные методы, установленный по умолчанию, отозвать; встроен в /loans / [loanId] - losApi: + startStripeConnectOnboarding Настройки nav (2 из 3 мест по правилу памяти): SettingsStatusWindow добавляет «Заемные продукты» в разделе Коммерция + вход в маршрут ********************** - (sidebar.tsx не имеет POS-записей - подтверждено отсутствие операции)

  4. · kamolos

    Упрочнение P0 - конечная точка Stripe Connect + PDF сплющивание

    - Исправить импорт EsignClient: EsignGenericEnvelopeRepository / EsignSignatureRepository .esign.repos, а не .esign root Новый StripeConnectController POST **************************** создает org Custom-account + возвращает встроенный URL (делегаты на Существующий сервис StripeConnect MediaServiceClient.fetchBlob: тянет байты хранимого блоба сплюснутые/переоформленные рабочие процессы Новый PdfFlattenService: приложение E-SIGN Соответствующая закону подпись Страница сертификации к раскрытию источника PDF для каждого захваченного подпись (типовое имя выделено курсивом; подпись/IP/UA/SHA-256 + конверт UID записывается на странице. Хранит новый сплюснутый пузырь через MediaService и возвращает blob id + SHA-256. - EsignClient.submitSignature теперь сплющивается после маркировки население **************************** + подписанный документ Ша256. Сплющенный журнал отказов, но не откатывает саму подпись.

  5. · kamo-internal

    /api/los/* прокси-маршрут → KamoLOS через k8s DNS

    Зеркало /api/billing/[...path] Прокси-сервер BillingService: - *** сессия, разрешенная через Redis; X-Org-Id + X-Member-Id пересылается - /api/los/webhooks/* skip session auth (Stripe signature-verified at KamoLOS; Заголовок с полосовой подписью проходит через - Сохраненный заголовок God-mode - 502 упаковка на выходе из строя

  6. · kamo-internal

    Добавить PERSONAL LOANS тип торговли

    Обсуждение TypeLabels: extend Engagement Типовой союз + словарь - MarketCardGrid: цвет PERSONAL LOANS (#14b8a6) + значок Landmark + счетчик - Страница детализации рынка: новые вкладки (Заемные продукты / Предложения / Активные кредиты / State Rules) gated on commerceType === "PERSONAL LOANS" - losApi.ts: полная поверхность DTO + тонкая обертка /api/los/* для продуктов, предложений, кредитов, платежей, розыгрышей, выписок, платежей методы, автоплатежи, государственные правила, представление подписи ESign - New MarketLoanProductsTab / MarketLoanOffersTab / MarketActiveLoansTab / Компоненты MarketLoanStateRulesTab - PipelineView: ВЕРТИКАЛЬНЫЕ ICONS вход для персональных кредитов - PipelineVerticalSection: PERSONAL LOANS in hasSubTabs + render block Маршруты Предложения (намерения) + Активные займы (обязательства) Новый PipelineLoanOffersTab / PipelineActiveLoansTab - Заемщик (член) /поверхность займа: индекс, /займы/предложения/[предложение] Ид с потоком приема-и-подписи (типовая подпись → представление ESign) Акцепт-оферта), /loans/[loanId] с балансом, ведомостями, оплатой Оригинальное название: Pay Now, draws-for-LOC - settings/page.tsx: commerce nav добавляет запись «Заемные продукты»

  7. · kamolos

    Первоначальное получение личного займа + обслуживание

    Новая весенняя загрузка 3.1.5 / микросервис Java 21 по образцу BillingService. Владеет доменом сквозного личного займа: LoanProduct / LoanOffer / Loan CRUD с уровнем REST + DTO - LoanLifecycleService материализует кредит + участие в торговле / обязательство Принятие предложения (one txn) - LoanPayment + LoanDraw + LoanStatement + LoanPaymentMethod + Повторяющийся кредит Платежные услуги + контроллеры - Математика: AmortizationEngine (Reg Z Appendix J) (ACT 365 / ACT 360 + ADB), PaymentAllocator (сборы→проценты→основной) - StripeConnectService (подключение к таможенному счету, выплата ACH, ACH дебет + StripeWebhookService (идемпотентный через) LoanStripeWebhookEvent) + конечная точка webhook - TilaRendererService представляет коробку Reg Z Schumer (установка) Открытое раскрытие информации (LOC) через PDFBox в MinIO - StateRuleSelfHealService boot-loads loan state rules.json (50-state) Реестр + ограничение MLA + охлаждение) — согласование шаблона с правами - EsignClient + EsignSignController дополнит недостающий Путь подачи подписи (написывает EsignGenericEnvelope +) EsignSignature in shared-lib - NotificationDispatchService с дедуктивным планированием Cron jobs: OfferExpiration, StatementGeneration, DelinquencySweep - манифесты k8s (configmap/развертывание/сервис), Dockerfile, Рабочий процесс Forgejo CI (двойной кластер K1M1+K2M1) Соглашения BillingService

  8. · kamo-shared-library

    Добавить PERSONAL LOANS commerce type + entity package

    CommerceType.PERSONAL LOANS + параллельный EngagementType + словарь - Записи BuiltinVendorКатегории для поставщиков личных кредитов - 15 субъектов JPA (LoanProduct, LoanStateRule, LoanOffer) LoanOfferDecision, LoanDraw, LoanPayment, LoanPaymentMethod, LoanRecurringPaymentPlan, LoanStatement, LoanFee, LoanDisclosure, LoanAuditEvent, LoanStripeWebhookEvent, LoanNotification + 15 репо 22 personal loans enums (статус, уровень, вид, источник, канал и т.д.) - esign EsignGenericEnvelope + EsignSignature + repos для неипотеки создание конверта и захват подписи лицом к члену - KamoLOS → Комментарии KamoMLOS обновлены по всей Организации / CommerceMarketService / Коммерческая служба Управление схемой остается за KamoInitializerService; KamoLOS использует ddl-auto: нет.

  9. · kamo-internal

    Фото-альбом загрузки используют тот же WS конвейер, что и вкладка Загрузки

    Извлекает конвейер загрузки doc-manager (хеширование → проверка dedup → регистрация-или-загрузка → преобразование на основе WebSocket) в крючок повторно используемого ImagingUploads. Крючок владеет машиной состояния для каждого файла, XHR-прогрессом и подпиской WebSocket, которую использует вкладка «Загрузки». Фотоальбомный диалог переписан, чтобы поглотить крючок: Очередь файлов автоматически и обрабатывается по одному за раз. Каждый файл в полете показывает свою текущую пометку этапа (Hashing → Checking → Uploading → Converting → Complete) с помощью LinearProgress, значка проверки / ошибки / спиннера и кнопки Retry после отказа. Диалог теперь отображает фактическое сообщение об ошибке сервера (например, «Не удалось загрузить в MinIO») вместо того, чтобы проглотить его, и сохранение блокируется, пока загрузки все еще находятся в полете. Успешно загруженные файлы автоматически присоединяются к альбому в качестве элементов.

  10. · kamolos

    Скрыть активные = ложные программы от заемщиков в режиме реального времени

    useProgramCatalog теперь отфильтровывает программы с помощью isActive=false Вернуть их колдуну. Флаг вычисляется на стороне сервера как (base.isActive и override.isActive), поэтому, когда кредитор переключает программу на вкладке настроек ипотечных программ соответствующая карта останавливается появление в выборе персоны/программы — ограничено существующими 60-ми годами; Потолок времени.

  11. · SecurityService

    Программа Backfill для существующих ипотечных рынков

    DataLoader уже звонит **************************** после заполнения AppMortgage-engagement. Сметает все существующие MORTGAGE CommerceMarket и обеспечивает предоставление своих программных предложений. Охватчики Рынки, которые были созданы до того, как появился крючок на стороне рынка Особенно те, которые пользователь добавил через Markets & Fields до этого. развернуть. Idempotent: a full-bootstrapped system logs "all markets already обеспеченный" и пропуски.

  12. · kamo-shared-library

    Предложения ипотечной программы Bootstrap на рынке создают + загрузочный бэкфилл

    Когда пользователь создает CommerceMarket с помощью commerceType=MORTGAGE Markets & Fields settings tab — рынок нуждается в программе Предложения под ней для поверхностей нисходящей торговли, чтобы указать на намерения. Ранее только Случилось лениво на первом AppMortgage-создании, поэтому вновь добавилась ипотека Рынки опустели, и администраторы на стороне Камолоса не увидели никакого эффекта от добавления одного. - ****************, когда type=MORTGAGE ******************************************************************************* завернутый в попытке / ловите, чтобы провал программы не блокировал создание рынка (Камолос считывает программы из реестра Программы, а не Предложения). ********************** зачистка Каждый существующий рынок MORTGAGE обеспечивает предоставление своих предложений. Используется службой безопасности DataLoader на загрузке для покрытия рынков, созданных ранее Этот крюк приземлился. Idempotent — стационарные ботинки — это no-op.

  13. · kamo-internal

    Дублировать связующие, чтобы пользователи могли виляться, не затрагивая оригинал

    Добавляет «Дубликативное» действие, доступное из контекстного меню списка связующего и из новой кнопки в заголовке редактора. Дубликат начинается с метаданных связующего источника + элементов + модификаторов, принадлежащих текущему пользователю без акций, и автоматически выбирается, чтобы пользователь немедленно приземлился на новую ветку. Провода вверх: ********************** Прокси-маршрут - duplicateBinder() в binderApi.ts и useBinderStore - «Дублированный» пункт меню в BinderListPanel (работает на любом видимом связующем - принадлежащем, совместно используемом или шаблоне) - Кнопка двойного значка + спиннер в заголовке BinderEditor

  14. · DocsService

    Добавить POST ****************

    Глубоко копирует связующее, которое запрашивающий может видеть (принадлежащее, совместно используемое или шаблон) в свежее связующее, принадлежащее запрашивающему. Копии каждого элемента (DOC, SEPARATOR, GENERATED) с порядком, типом, configJson и модификатором per-instance переопределяют неповрежденные; копии модификаторов в масштабе всего связующего; оставляют только основные документы Img (оба связующего ссылаются на те же документы). Копия начинается без акций и является шаблонной = ложной.

  15. · kamo-internal

    Ипотечные программы Toggle + MORTGAGE engagement deep-link

    - MortgageProgramsPanel теперь отправляет реальный коммутатор на каждой карте программы Оптимистическое обновление + откат от неудачи. Toggling - программа звонит ************************************************************ эффективное активное состояние вычисленного сервера на стороне базы + override. - **************** Активен) обертывает новую конечную точку. - /commerce/engagements/[id] page: APPLICATION linkType now routes to /applications/{linkId} (страница детализации URLA), не отсутствующая **************************** MORTGAGE AWтомобильная переадресация /applications/{linkId} на загрузке, чтобы пользователи попадали в URLA напрямую Вместо общей точки зрения.

  16. · SecurityService

    PUT /programs /{code}/active + обесценивание устаревших конечных точек POS

    - MortgageProgramController получает PUT **************** с телом {"isActive": bool}, закрытым на LOS TAKE APPLICATION. делегаты на *******************, который поддерживает строку OrgProgramOverride. ********************** getMortgageAppById, createMortgageApp UpdateMortgageApp, updateMortgageAppStatus все помечены @Deprecated javadoc указывает абонентам на URLA-fidelity/api/security/mortgage-apps конечные точки. Унаследованные пути POS остаются функциональными для обратной совместимости.

  17. · kamo-shared-library

    Per-org позволяет / отключает + обесценивает устаревший путь ипотечного кредитования только для торговли

    ********************** Скачать OrgProgramOverride c recordState.isActive=desired; listForOrg now AND's the base program's Активный флаг с оверрайдом, поэтому оверрайд с инвалидностью несет двойной флаг. Это означает, что «эта организация явно отключила эту программу». - OrgProgramOverrideRepository добавляет findAllByOrganizationId и **************** для восходящего списка + Пути ForOrg. ********************** / findMortgageAppById/ **************************** / UpdateMortgageApp/ ОбновлениеMortgageAppStatus @Deprecated. Они работают только в торговле Намерения помечены LOAN APPLICATION и не создают и не читают URLA AppMortgage Записи — хранятся для обратной совместимости с ******************* Но новый код должен использовать AppMortgageService + /api/security/mortgage-apps.

  18. · kamolos

    Скруббируемая тема дня и ночи с помощью SkyToggle

    - Непрерывное t ∈ [0,1] положение сцены приводит к ~25 пользовательским свойствам CSS на:root с помощью линейной интерполяции RGB между теплыми бумагами aurora night anchors in lib/scene/palettes.ts - По умолчанию в местное время суток при первом посещении; ручное переопределение липкий в печенье, с кнопкой тактовой иконки, чтобы повторно включить авто SSR ScenePainter выпекает решенную палитру перед первой краской нет FOUC при повторных посещениях; режим первого посещения облегчает от дня до местных часов t более ~ 1,4 SkyToggle: большой палец, чей солнечный лунный глиф вращается в реальном времени с t и морфами между солнечными лучами и полумесяцем - PageGlow + StarField ambient layers: amber sun-glow top-left at день, прохладное лунное сияние в верхнем правом углу ночью, ~80 засеянных звезд исчезают Прошлые сумерки и мерцание с помощью кода с ограниченным движением - тема MUI переключается на границе сумерек t≥0,5; цвет кузова CssBaseline читается из CSS, поэтому интерполяция остается непрерывной - Бросает темный класс + цветовая схема; фиксирует два длинноствольное - поверхностное основание (отсутствующий префикс цвета) градиентные резервные копии В JourneyCrest и CeremonyClient

  19. · kamolos

    Вовлечение/намерение/обязательство UID

    AppMortgageDTO теперь имеет идентификаторы жизненного цикла торговли, которые SecurityService Backend заполняет каждое ипотечное приложение. Камоло пока не использует их активно, но вводя их через средства будущего Кредиты заемщика («ваша заявка была совершена») Ссылка на торговый уровень напрямую без прохождения через модель URLA.

  20. · kamo-internal

    Показать контекст торговли + Настройки программ вкладка

    Герой приложений теперь читает «Коммерция > Ипотека на жилье · URLA 2021» Таким образом, сотрудники рассматривают ипотеку как одну вертикаль торгового модуля, а не как одну из двух составляющих. автономный трубопровод. - Новая вкладка ипотечных программ в настройках торговли - каталог только для чтения Кредитные программы (CONV / FHA / VA / ...) с активной версией состояния и правил. Настройки nav обновляются во всех трех локациях (subTopics, маршруты, labelFor). - AppMortgageDTO/SummaryDTO + новое зеркало типа ProgramDTO/LoanProgramCode Общие изменения (engagementUid / intentUid / commitmentUid). - mortgageAppsApi.listPrograms() попадает в существующую конечную точку /программ.

  21. · SecurityService

    Обеспечение соблюдения прав LOS +/commerce/engagements endpoint

    MortgageAppController: каждая конечная точка теперь входит в RoleRightType. читать требуется LOS VIEW PIPELINE; создание нового приложения требует LOS TAKE APPLICATION; редактирование принимает любую роль записи LOS (take / process /) андеррайтинг/закрытие/приостановка; удаление требует LOS SUSPEND OR WITHDRAW. Учетная запись службы KamoLOS уже имеет полный набор прав LOS, поэтому Путешествие заемщика не затронуто; пользователи персонала закрыты в соответствии с их ролью. - Коммерческий Контролер: новый GET **************** (список с фильтрами типа/статуса/даты) и GET.../engagements/{uid} (подробности), Скриншоты из ACCESS COMMERCE. Это вертикально-агностический аналог конечная точка ипотечного приложения — тот же формат провода, если вы читаете Ипотека, розничный заказ или бронирование аренды.

  22. · kamo-shared-library

    Проводите ипотеку URLA в обязательство / намерение / обязательство

    Ипотека - это одна вертикаль торговой системы - наряду с розничной торговлей, арендой. Услуги, подписка и закупки. Это приводит к ипотеке URLA-fidelity стек в доменно-агностический жизненный цикл торговли так кросс-вертикальные поверхности (Трубопроводные панели, аналитика, клиентский портал) смотреть ипотеку, как и любой другой Помолвка. - Заявка: новый engagement id / intent id / commitment id FKs (отменяется) Наследственные ряды). - ******************* бутстрапы МОРТГАГЕ CommerceMarket + одно предложение на LoanProgramCode при создании первого приложения; Прикрепляет Engagement+Intent к каждому AppMortgage; зеркало LoanFile. статус Intent.status и участие. Статус; материализует обязательство Оплачено условиями займа snapshot. Импотентный сквозняк. - AppMortgageService: createBlank/createFromLead прикрепляется к участию; SetSelectedProgramCode обновляет предложение Intent. LoanPipelineService.transition зеркала после каждого перехода Неисправности зеркал не блокируют прогрессию URLA (log + Continue). - AppMortgageDTO / AppMortgageSummaryDTO Uid / intentUid Обещание для фронтенда.

  23. · kamo-internal

    Добавить вкладку Организатор с связующими, разделителями, сгенерированными документами

    Добавляет организатора к менеджеру дока: - Новая вкладка «Организатор» (позиция 4) со списком связующего + раздельный вид редактора; существующие вкладки смещаются вправо - действие «Добавить к Организатору» в каждой строке doc открывает сборщик связующего (существующие связующие или создают новые) - редактор Binder: drag-to-reorder items (HTML5 DnD), add Page Separator (color + label via ModernColorPicker), add Generated Doc (Cover Page, Table of Contents, Photo Album, Word Count) Фотоальбом поддерживает загрузку новых фотографий (также добавляется к диспетчеру доков) и существующий просмотр - Панель модификаторов шириной биндера с повторным использованием формы модификатора знака (номер страницы, этикетка, водяной знак) - Модификатор по месту действия переопределяется посредством диалога по месту - Режим предварительного просмотра отображает объединенный PDF в iframe - Скачать кнопку invokes /api/docs/binders/{id}/render В магазине New Zustand используются BinderStore, клиентское приложение REST/utils/binderApi.ts и прокси-маршруты Next.js под /api/docs/binders/*, отражающие существующий шаблон прокси-изображения.

  24. · DocsService

    Добавить Organizer backend — CRUD, render, сгенерированные документы

    Новая поверхность REST под /api/docs/binders для функции Организатора: BinderController: CRUD, элемент add/update/remove/reorder, share, render - BinderService: проверки доступа по оргам, видимость владельца / доли / шаблона, управление положением объекта BinderRenderer: двухпроходное слияние (отложенный ToC/WordCount), применяется для каждой стороны и модификаторы в масштабе связующего через общие PdfBuildUtils - Сгенерированный Doc реестр с рендерами для Cover Page, Table of Contents, Word Count, Photo Album (использует MinIO для байтов изображений) повторное использование **************** для документов с измененными знаками и ******************* для контроля доступа.

  25. · kamo-shared-library

    Добавить Binder/BinderItem/BinderShare сущностей и репозиториев

    Добавляет слой стойкости для новой функции организатора док-менеджера: - Binder (Long id, член-владелец, org-scoped, isTemplate, binder-wide modifierJson) BinderShare (UUID, член-реципиент, роль ЧИТАТЬ/ПИСАТЬ) - Репозитории Spring Data JPA с запросами в формате org-scoped и союзом «видимый для члена» (принадлежит + общий + шаблон) Схему автоматически подбирает KamoInitializerService через ddl-auto Hibernate.

  26. · kamolos

    Просматривайте тестовый баннер, подбирайте видпорт, добавляйте согласие cookie

    - TestModeBanner публикует свою высоту до -kamolos-banner-h и globals.css вычитает его из min-h-экрана, поэтому вид на дом не дольше переполняет видопорт пикселями баннера. - Баннер получает скользящее янтарное мерцание + медленный пульс тени, поэтому он читается как активное предупреждение, отражая панель предварительного просмотра маркетинга. Новый CookieConsentBanner (Принять все / Управление с помощью аналитики) Toggle, перезагрузка из маркетинговой версии для использования темноты aurora surface + per-tenant --org-primary/ --org-gradient.

  27. · kamolos

    Surface SAFE Act NMLS ID для кредитора + назначенный LO

    Добавляет LoContactCard с аватаром, импульсом присутствия, проверенной связью NMLS и действия вызова/электронной почты/сообщения в левом верхнем углу героя и нанесение поверхностей; Лицензированный кредитор заемщика (имя + NMLS ID) всегда один. Удалить - требуется SAFE Act §1503 и Reg Z §1026.36(g). кредитор NMLS в нижнем колонтитуле рекламируется как «Лицензионная · NMLS #» таблетка доверия, и UseAssignedLO теперь возвращает поддельную демо-версию LO до назначения кредитного файла LO земли. LoGuideChip возвращается только к голосу, поскольку LO имеет свою собственную поверхность.

  28. · kamolos

    Demo lender auto-loads when no real tenant resolves

    The reason "still not branded" — no real tenant org existed for the hostname being tested, so the SSR fetch returned null and every lender-facing surface fell through to the bundled Kamo defaults. The branding system was working; it just had nothing to brand WITH. Now ships a complete demo lender that auto-loads as the fallback when the real fetch returns nothing AND stubs are allowed **************** the default). Production with stubs disabled still falls through to bare Kamo defaults so we don't ever ship a real borrower to "Apex Mortgage". - lib/org/demoOrg.ts: "Apex Mortgage" — burgundy (#8B1538) primary and gold (#D4A24C) secondary, deliberately far from aurora so the branded effect is unmistakable. Full populate: tagline ("Three generations of getting you home."), NMLS #123456, support phone + email, year established 1989, both EHO + EHL marks, linear-135 gradient direction. New assetBasePath: '/demo-lender' on the org type tells ThemeLogo to load /demo-lender/logo-full.svg before trying MinIO or the global fallback. - **************** + logo.svg: real Apex Mortgage wordmark and mountain-peak mark in the burgundy → gold gradient. Not just a wordmark, an actual lockup. - lib/org/fetchOrganization.ts: returns DEMO_ORG when upstream is unreachable or no org is registered AND stubs allow it. Real-host / real-tenant resolution wins when present. - components/theme/ThemeLogo.tsx: consults useOrg().assetBasePath and puts that prefix at the front of the candidate chain. Demo lender's logo lands; real tenants' MinIO assets still resolve first when populated. - app/layout.tsx: <link rel="preload"> tracks the same priority order, so the SSR preload targets the demo lender's logo when demo mode is active. - **************** when org.id === 'demo-apex', the banner calls out "Showing the demo lender (no tenant org configured for this host)" so testers know which brand they're seeing is canned. Build 32/32, 140 tests pass. Reload the borrower app and you should now see the Apex Mortgage logo + name in the header, the burgundy and gold throughout the CTAs and ribbons, "Welcome to Apex Mortgage." on the landing hero, NMLS #123456 + EHO + EHL in the footer, "Call Apex Mortgage (800) 555-2739" in the help sheet.

  29. · kamolos

    Make the lender the primary brand, not an accent

    Reframes the borrower-facing app from "Kamo product with lender accents" to "lender's product, Kamo as the engine." Every surface now leads with the lender's identity. - LenderLockup **************** — canonical lender brand mark used everywhere. Scales sm → md → lg → xl → hero. Pairs the logo (or wordmark fallback in the lender's primary colour) with the lender's name; optional tagline below. Used by every surface that needs to feel "I'm at MY lender's site." - BorrowerHeader — header bar grows to h-14/h-16, logo + lender name always visible (size="md" forceWordmark), drop-shadow tinted in the lender's primary. The previous tiny 24px corner mark is gone. A new click-to-call phone button sits next to Help with the lender's primary border + glow; on mobile it collapses to an icon button. The accent ribbon is 4px (was 2px) and still pans the lender gradient. - Landing page hero — centred, dominated by the lender lockup at hero scale inside a glass card with strong --org-primary glow. Above the fold reads "Welcome to {LenderName}." (the gradient-clipped lender name is the headline), with the lender's tagline as the subtitle. A coloured pill says "{Lender} · Loan onboarding" instead of the generic "Kamoville". The CTA button is bigger and carries a strong --org-primary outer glow. - LenderFooter — full attribution row: lender name + NMLS Consumer Access link + phone + email + website + EHO/EHL mark. Copyright line reads "© 2023–2026 {LenderName}. All rights reserved." with a tiny "Onboarding by Kamo" credit. Visible across hero surfaces. - HeroBrandIntro — splash dwells 3.4s (was 2.4s), shows on first visit AND every 30-min idle return (was once-per-session). Logo card grows to size="hero" inside a stronger glass card with a heavier --org-primary outer glow. "Welcome to {LenderName}." is the headline; the lender's tagline is the subtitle. - generateMetadata — Next.js title template is now `%s · {LenderName}` with the default being just the lender name. Every child page reads lender-first in the browser tab and OG cards. siteName, title, and description all flow from the org record. Build 32/32, 140 tests pass. If your tenant config has populated tagline / nmlsId / phoneSupport / emailSupport / yearEst / colorPri / colorSec / logo asset, the site now looks unambiguously like your lender's product. With nothing populated it gracefully degrades to "Kamo" defaults.

  30. · InitializerService

    Миграция для бренда, ориентированного на заемщиков + колонки раскрытия информации

    Добавляет семь нулевых столбцов камо-общей библиотеке (перенаправлено с «TAGLINE / NMLS ID / PHONE SUPPORT / EMAIL SUPPORT») / EQUAL HOUSING DISCLOSURE/ON PRIMARY TEXT/GRADIENT DIRECTION) Приложение заемщика kamo-los может подобрать брендинг кредитора без схемы Ошибки в существующих оргах. @Order(35) — выполняется после LogoFullExtMigrationRunner (30) и до LeadCompanyColumnRunner (40). Идемпотент через ADD COLUMN, если он не существует Безопасно для повторного запуска. В соответствии с политикой проекта этот файл не выполняется здесь - KamoInitializerService Запускается пользователем.

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

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

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