Widen commit_log_translations.title to TEXT to match DB column
The column was VARCHAR(512) in both the annotation and the DB, causing translation inserts to fail for long translated titles. The DB column is now STRING (appl...
Paginated Recording lookup by (instance, extension, isVm)
Used by the softphone tabs as the canonical source of truth for call recordings and voicemails when the upstream provider can't list them — e.g. FreePBX 17 has ...
Drop stale BillingGroup-era comment + unused SubscriptionMember query
Strips the leftover doc block in AppliedModelEnforcementService that referred to the long-gone BillingGroup concept, and removes **************** after consolid...
Top-level org bypass + Free baseline fallback for orgs without subs
The org-level entitlement check **************** walks subscriptions targeting an org. With the new target_org model, orgs that don't yet have a targeting Accou...
Split account-level admins from per-sub members; subs gain target_org
Adds SubscriptionMember (per-subscription licensee + sub-manager flags) so an Account on the KamoCRM org can hold multiple subscriptions, each targeting a diffe...
AccountGroup -> AccountTier (customer segmentation, not billing)
The retail customer-segmentation entity (with discountPercentage, used by PriceList for tier-based pricing) collided in name with the now-removed billing-group ...
Make Account the group; replace User-set with Member-set + AccountMember
The Account is now itself the "group" — there's no separate billing-group concept. Members (org-scoped) belong to the Account directly via the new AccountMember...
Migrate from BillingGroup to Account as billing principal
Account is now the single Stripe customer principal. A Member needing to pay (e.g. for a subscription) auto-creates an Account; that Account then holds one or m...
Map external customer address blocks into AccountAddress on pull
Add AdapterAddressMapper helper that converts a JSON address node from any provider into an EmbAddress and attaches it to an Account as a typed AccountAddress (...
Orient live records to Account address profile, snapshot historical addresses
Orient live commerce records to reference the Account profile's primary shipping/billing addresses, with snapshots taken only when records become historical (pl...
Switch Account.java to embeddables; add AccountAddress entity for shipping/billing lists
- Add AccountAddressType enum (SHIPPING, BILLING) - Add AccountAddress entity (account FK, type, label, EmbAddress, timestamps) - Add AccountAddressRepository -...
Provider lookup keys on Recording, voicemail archive, MinIO range streaming
- Recording: add providerInstanceId + providerExternalId for joining provider call-history / voicemail rows back to imaging assets - PhoneVoicemail: add isArchi...
Add lead-history audit log — entity, registry, service, DTO, LeadService hooks
- LeadHistory entity (UUID PK, plain Long FKs — no FK constraints to allow lead deletion/conversion) - LeadHistoryEventType enum with human-readable labels - Le...
Resolve duplicate column mapping by overriding embedded address columns to MAILING_*
Update RetailService and provider adapters for Account.notes removal and CurrencyType conversion
Add CurrencyType enum, update CountryType with primary currency, add currency to Account/Organization, add lead-account assignment to LeadService
Add international support — Lead country/subdivision/timezone, Org language, CountryType isProvince
- CountryType: add PROVINCE_NAMES set, isProvince(), getSubdivisionLabel() - Organization: add language (LanguageType) field - Lead: add country (CountryType), ...
Recording + RecordingExt entities, RecordingImagingService writes them
- New Recording entity (UUID id, IMG_ID, IS_MASTER, IS_VM, EXTENSION, MEMBER_ID, LENGTH, DATE_RECORDED, DATE_CREATED [DB-defaulted via @CreationTimestamp]). ...
Use @CreationTimestamp(source=DB) on ****************
The DB is the single source of truth for timestamps in this codebase. The canonical Hibernate pattern is @CreationTimestamp(source = SourceType.DB), which makes...
Let DB fill **************** via @Generated(INSERT)
INSERTs were failing with: null value in column "date_created" violates not-null constraint @ColumnDefault only declares the DB-side default for new rows; Hi...
Add MemberCallFeatures entity and repository for call forward and auto-answer preferences
UnprocessedRecording staging entity, ImgDat track tracks, recording imaging service
- Fix ImageAssocType ID collision: VM_RECORDING=8, CALL_RECORDING=9 (were both duplicating MY_DOCS at 4). - Add **************** so a master recording can car...
Add includeCompany to LeadMarket and companyName to Lead
- LeadMarket entity gets include_company (Boolean, nullable) - Lead entity gets company_name (String, max 50, nullable) - LeadMarketDTO, CreateLeadMarketRequest...
Serialize ExtensionDto.assignedMemberId as a string
overflows JS's safe-integer range (e.g. 1168485658174423046 round-trips as 1168485658174423000 once a JSON number hits the browser). The frontend already typed ...
Coerce isDisplayOnIntake=true when isRequired=true in CustomFormService
Add findByAssignedMemberId query methods to PhoneExtensionRepository
Add isConnected field to VoipProviderInstance
Nullable Boolean: null = never tested, true = last test passed, false = failed. Requires KamoInitializerService schema migration to add IS_CONNECTED column.
Unread-based count + lookup-by-session helper
Adds **************** so the navtop SupportButton badge can count support tickets that actually need attention (have unread visitor messages) instead of just PR...
Support tickets need member-agnostic unread counts
Visitor messages on support tickets are stored under the same systemMember that the agent authenticates as, so the existing CHAT-session unread queries — which ...
Snapshot visitor geo on ticket entity
Adds VISITOR_IP_ADDRESS, VISITOR_COUNTRY_CODE, VISITOR_COUNTRY_NAME, VISITOR_CITY, VISITOR_SUBDIVISION columns. Captured at ticket creation so the list/detail e...
Add findBySessionGuidIn for bulk loading
Used by the support-ticket list endpoint to fetch all visitors for a page in one query instead of N separate findBySessionGuid calls.
Correct JsonIdentityInfo property from 'uniqueId' to 'id'
Member entity declared @JsonIdentityInfo(property = "uniqueId") but the actual primary key field is named 'id'. Jackson threw "cannot find property with name 'u...
Include SUPPORT_TICKET sessions in unread membership query
findChatMembershipsByMemberId now returns memberships for both CHAT and SUPPORT_TICKET session types, so the existing per-member unread-count infrastructure (ge...
Add resetHasAttachmentsForFolder query to ConversationRepository
Allows sync to reset stale has_attachments flags before re-indexing so corrected MIME detection can rebuild the field from actual attachment data.
Multi-instance phone/SMS provider schema foundation
- Rename VoipProviderConfig → VoipProviderInstance; drop UNIQUE(org_id), add instance_name, config_json, last_sync_at, last_sync_error. - Rename BulkTextProvide...
Drop teamMemberPayFeesSetting
Employee self-pay fee policy is gone — the BillingGroup refactor handles billing per-group, not via the security model. Removes the teamMemberPayFeesSetting col...
Add per-alias creator-type visibility flags
Add visibleToMembers / visibleToTeamMembers boolean columns to ChildOrgSecurityModelAlias so admins can restrict which parent aliases appear to Members vs Team ...
Apply connect/write/read timeouts to MinioClient via OkHttpClient
Without timeouts, a downed site-replication peer (k2m1) caused makeBucket and putObject calls to block indefinitely, surfacing as an infinite "Saving..." on the...
Add entities, cipher, and alias/DNS log scaffolding
Adds per-org GoDaddy creds (AES-GCM encrypted), an allowRootSubdomains flag and child-org alias collection on the security model, a DNS provisioning audit log, ...
Drop RegistrationPhoneCode entity + repository
Self-service registration no longer uses SMS-code verification for the phone field — the register form collects the phone number as plain text and stores it as-...
Add System User flag + access-grant entity
Introduces the platform-wide System User model: a User.isSystemUser flag (unique partial index enforces a singleton), plus a SystemUserAccess table that records...
Add RegistrationPhoneCode entity + repository
New table `registration_phone_codes` stores one-shot SMS verification codes issued during self-service registration, before a User entity exists. Kept separate ...
Add AgeReqType.allowsUnder13() helper
Used by the Add Member / Add Team Member flow to skip email collection for orgs whose age requirement permits users under 13 (ALL_AGES, KIDS_ONLY, ALL_COPPA_GRA...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.