Implement RingCentral call management methods (sip, history, voicemail, presence, queues)
Extend PhoneProvider interface with call management methods; update stubs
Explicitly stringify Long IDs in SmsController responses
**************** Long-as-string approach was not taking effect. Directly call .toString() on all Long IDs in the controller flat-map responses to guarantee no J...
Adăugați @JsonIgnore la VoipMessage.conversație pentru a preveni sarcina leneș pe serializarea
Use string conversationId throughout SMS tool to handle 64-bit IDs
Backend now serializes Long as string; update all conversationId types from number to string to match. Also enable send button when an attachment is present wit...
Serialize Long IDs as strings to prevent JS precision loss
CockroachDB unique_rowid() generates 64-bit integers larger than Number.MAX_SAFE_INTEGER (2^53-1). JS JSON.parse silently rounds them, causing conversation ID m...
Remove duplicate Back button from RingCentralConfig
Parent PhoneProviderSetup already renders an IconButton with ArrowLeft in the config view header, making the Back button inside RingCentralConfig a duplicate.
Return flat map from send endpoint to prevent LazyInitializationException
VoipMessage.conversation is FetchType.LAZY; after @Transactional commits, Jackson serializing the entity would throw LazyInitializationException causing a 500, ...
Fall back to org mainPhoneNumber when member has no VOIP config
Members without an individual MemberVoipConfig (or no fromPhoneNumber set) now use the org's mainPhoneNumber from VoipProviderConfig as the outbound number, ins...
Remove getJwtKey() from WebhookController after OAuth migration
Signature validation used jwtKey as HMAC secret which no longer exists on VoipProviderConfig. Skip validation for now consistent with ****************
Add OAuth callback forwarding with no-redirect RestTemplate
- Add noRedirectRestTemplate bean (HttpClient.Redirect.NEVER) so the 302 from VOIPService's OAuth callback is passed through to the browser instead of being...
Replace JWT config with OAuth connect UI for RingCentral
- RingCentralConfig: OAuth connect/disconnect button with status indicator, main phone number field, test connection (only when connected) - voipApi: add getO...
Refactor RingCentral to OAuth 2.0 Authorization Code flow
- New OAuthController: /oauth/start (returns authUrl), /oauth/callback (exchanges code, saves tokens), /oauth/status, DELETE /oauth/token - OTKValidationFilte...
Create KamoTokens schema and org_oauth_token table
- CREATE SCHEMA IF NOT EXISTS kamotokens - CREATE TABLE kamotokens.org_oauth_token with unique (org_id, provider) - DROP COLUMN jwt_key from voip_provider_confi...
Adaugă entitate OrgOauthToken pentru stocarea jetoanelor OAuth 2.0
- Adăugaţi OrgOauthToken entităţi în schema KamoTokens (kamotokens.org oauth token) - Adăugaţi OrgOuthTokenRepository cu findByOrgIdAndProvider / stergeByOrgIdA...
Equal-height feature cards and Kazoo-aware provider descriptions
- Set height: 100% on FeatureCard motion wrapper so cards in the same row match the tallest card - Update KamoPBX description to highlight Kazoo as a carrier-gr...
Adaugă șablon HTML și script de generare a păpușilor KamoCRM promoțional
Use plain img tags for local SVG provider logos
next/image does not reliably serve local SVGs without unoptimized flag. Plain img tags load /public assets directly with no issues.
Add SmsChatTab with search, emoji, attach, timestamps, quick replies
Remove Client ID and Secret fields from RingCentral UI
These are platform-level credentials set once in the K8s secret. Customers only need to provide their JWT Key and main phone number.
Read RingCentral client-id/secret from platform config, not per-org DB
Client ID and Secret identify the Kamo app on RingCentral's platform — they are shared across all orgs. Inject them from Spring Boot properties (backed by the K...
Elimină clientulId/clientSecret din VoipProviderConfig
Acestea sunt acreditări la nivel de platformă împărtășite în toate orgile. Numai jwtKey și mainPhoneNumber sunt per-org.
Use correct session key casing for orgID and memberID
KSessionService stores keys as orgID and memberID (capital D). Both controllers were calling .get("orgId") and .get("memberId") which always returns null, causi...
Always show softphone and SMS buttons in NavTop
Removed isVoip gate so the buttons are always visible regardless of feature flag state.
Add Dockerfile for VOIPService
Matches the shared-library + service two-stage build pattern used by EmailService and other Java services.
Use feature type name as key before numeric id in org feature preprocessing
Java returns features with `type: "VOIP"` and a numeric `id`. The preprocessing chain had `obj.id` before `obj.type`, causing all features to get numeric string...
Add SMS tool button to NavTop, gate softphone + SMS on organization.isVoip
Adăugaţi voip.> la subiecţii NATS flux şi se ocupe de stat ilegal Excepţie în VoipStompRelayController
Râul NATS a acoperit doar chat-ul.> Astfel, subscrie la voip.> aruncat Excepție de stat ilegal ([SUB-90007] Nu există fluxuri de potrivire). Adăugat voip.> la s...
Add security-service.*** to K8s ConfigMap
KamoJwtService requires this property for Bearer token validation in DavAuthFilter, but the K8s ConfigMap overrides application.yml and was missing it — causing...
Redesign phone provider setup to match email provider format with logos, help tips, and correct nav tabs
- Rewrite PhoneProviderSetup to match EmailProviderSetup pattern: list/config view split, AnimatePresence transitions, back button with provider name in header,...
Show Phone System(s) settings unconditionally so orgs can configure VOIP before enabling it
- Remove isVoip gate from phone section on /settings page — Provider Setup card has no condition so it always appears; Agents and Dial Plans still gated by isVo...
Guard against non-array API responses in useContacts hook
setBooks, fetchContacts, and searchContacts now safely handle error objects and Spring paginated wrappers instead of crashing with 'e.map is not a function'.
Numele de câmp corect în findEvenimenteNecesită interogare Sync de la 'integrare' la 'contactIntegration'
Add Personal Calendars & Contacts section to member membership-permissions tab
Add PersonalProviderSection component for member CalDav/CardDav integrations
Ca ceea ce vezi de transport maritim?
Fiecare dintre aceste actualizări aterizează automat în spațiul de lucru. Începe gratuit și urmăriți-l crească săptămână după săptămână.