உள்ளடக்கத்திற்குச் செல்லவும்
KAMOUniverse

மாற்று பதிவேடு

என்ன புதிது.

அது கப்பல்கள் போல், தளத்தில் ஒவ்வொரு மேம்பாடு.

  1. · kamo-shared-library

    Add LeadCallback entity, status enum, and repository

    Backs the lead-view callback feature: a lead-owned callback record (PENDING/CONTACTED/CANCELED) keyed off leadUid, with a soft reference to the mirrored EmailService calendar event.

  2. · kamo-internal

    Create a session for group chats opened by memberIds

    ChatTool ignored props.memberIds: a group open arrived with an empty userId and no sessionGuid, so the 1:1 createSession bailed early and the window never got a session. Now when memberIds is present ChatTool resolves the session via POST /sessions/chat/find-or-create { memberIds } (the same endpoint ChatBox's initialMemberIds path uses; the backend adds the caller itself). The member list is keyed as a stable sorted string so the effect doesn't re-fire on array identity, and the resolved guid flows through the existing writeback so the group window is GUID-anchored for dedup.

  3. · APIService

    Public passthrough for email OAuth provider callback

    Forward GET **************** to EmailService sessionlessly (strips auth, no redirect following), mirroring the RingCentral OAuth callback. This is the fixed public redirect URI registered with Microsoft/Google/Zoho.

  4. · EmailService

    Fixed public redirect + gateway-forwarded callback

    Platform email OAuth (Microsoft 365 / Google / Zoho) had no valid public redirect URI: the redirect was derived from the request host, which in prod is the cluster-internal service address, and the only callback handler was POST-only. Add a single fixed, publicly-reachable redirect URI used for both the authorization request and the token exchange, and a public GET callback that the provider redirects the browser to (org is carried in state, so no session is required). Returns a self-closing HTML page.

  5. · kamo-internal

    Gate lead contact-info by assignment + new privacy rights

    Mirror the three new CRM rights. On the lead detail page, mask/lock the Primary Contact, Mailing Address and Property Address fields for leads not assigned to the current member unless they hold the view/edit contact rights (and, for unassigned leads, VIEW_UNASSIGNED_LEADS); the state field is always visible. Switch the Assignment-pane reassign gate to ASSIGN_LEADS. On the /leads grid, gate the Unassigned filter option by VIEW_UNASSIGNED_LEADS, drop the now-empty email/street filters and the email column value, and show property-vs-mailing state via a flip.

  6. · SecurityService

    Enforce lead contact-info privacy rights

    getAllLeads now returns the lean LeadListDTO and hides unassigned leads from members without VIEW_UNASSIGNED_LEADS. getLeadById masks contact info (state preserved) for leads not assigned to the caller unless they hold VIEW_LEAD_CONTACT_INFO_OTHERS, and 403s unassigned leads for those lacking VIEW_UNASSIGNED_LEADS. updateLead gates manual reassignment (ASSIGN_LEADS) and contact-info edits **************** counting mortgage property fields only when actually changed. God bypass.

  7. · kamo-shared-library

    Lead contact-info privacy rights + lean list DTO

    Add three CRM rights (161-163): "Assigned To Others: View/Edit Lead Contact Info" and "View Unassigned Leads". Add LeadListDTO — a lean projection for the /leads grid carrying no contact info except the state field. Add **************** to strip phone/ e-mail/mailing+property address (state preserved) for gated readers.

  8. · kamo-register

    Send membership type from the /member and /team paths

    /team signups create a TEAM_MEMBER (created PROSPECT, pending admin activation); /member signups create a MEMBER. RegisterFlow takes a memberType prop supplied by each path wrapper and includes it in the register request body; the backend creates the matching membership type.

  9. · SecurityService

    /team creates a TEAM_MEMBER (PROSPECT), /member creates a MEMBER

    Public registration now honors the memberType the register site sends (from the /member vs /team path): /team creates a TEAM_MEMBER — as PROSPECT, so an admin must activate them before they can sign in (per the login gate) — and /member creates a base MEMBER. Applied to both the new-user and existing-user-reuse paths via createRegistrationMembership(). The securityProvider mirror is unchanged (always a base MEMBER, and skipped when the org is its own security provider). Previously every register signup created a base MEMBER, so a /team applicant landed as a MEMBER and then couldn't be added as a team member via the UI (409 already-a-member).

  10. · SecurityService

    Expose team-member work phone extension in team-members-contractors

    The /leads Agent filter needs the work-phone extension to label options as "Name (ext 8080)". The extension already exists on TeamMember (getPhoneWorkExtension) but was not serialized — only the bare number was.

  11. · kamo-internal

    Request-support popup shows parent-org shared topics

    Point the ticket-creation topic dropdown at the new /api/support/topics/available endpoint (own-org + parent-shared topics) so child-org users can contact their parent org's support via the parent's configured topic.

  12. · MediaService

    Surface parent-org shared topics in request-support popup

    Child-org users could not see their parent org's shared support topics (assignToOwnOrg=false) when requesting support, because the popup only fetched own-org topics. Add GET /api/support/topics/available (own + parent-shared, no MANAGE_SUPPORT gate) and fix getParentOrgTopics to use the corrected AssignToOwnOrgFalse query. Filing against a parent-shared topic already routes the ticket to the parent org via createTicket.

  13. · SecurityService

    New child orgs inherit their parent's securityProvider

    When creating a child org from kamo-internal, set the new org's securityProvider to the parent org's securityProvider (the org it's created under) instead of letting it default to self. Pairs with the data backfill that points every existing org's securityProvider at the top-level KamoCRM org, so membership mirroring engages for all orgs and their future children.

  14. · kamo-login

    Show account-linked notice on ?linked=1

    When register links an existing account to a new org, it redirects here with ?linked=1. Show "You already have a Kamo account — we've added this organization to it. Sign in with your existing password." and prefill the email. Mirrors the existing ?email_verified handling.

  15. · kamo-register

    Handle account-linked response for existing users

    When the entered email already belongs to an ACTIVE account, the backend links this org to it and returns ACCOUNT_LINKED. Route those users straight to sign-in (?linked=1) instead of the email-verification flow — they sign in with their existing password. New users and placeholder-claim signups keep the verify-email path.

  16. · kamo-internal

    Wire up member/team-member create + Prospect-gate UI

    - Add the missing POST proxy routes /api/security/members/create and /create-team-member (these 405'd before, so creation never reached the backend). Status + JSON body pass through so the form's 409 "already a member" reuse handling works. - MemberCreateForm: fix the Membership Status field where the floating label overlapped the "Select a status" placeholder (shrink label + notched OutlinedInput), and add a note that only "Active" team members can sign in.

  17. · SecurityService

    Reuse existing users, mirror to securityProvider, gate team-member sign-in

    Reuse (no duplicate accounts for the same person): - MemberCreateController now reuses an existing user by personal email case-INSENSITIVELY (was case-sensitive, missing legacy mixed-case emails). - SecurityController.register reuses an existing account instead of always creating a new user: already a member of the org -> 409 ALREADY_MEMBER ("please sign in"); existing ACTIVE account -> link the org, keep their password, return ACCOUNT_LINKED; unactivated placeholder (never verified AND never logged in) -> claim it with the typed password. A public form can never overwrite an active account's global password. securityProvider mirror: - Both internal member/team-member creation and public register now call **************** so every new membership also lands under the org's securityProvider org (as a base Member). Team-member activation gate: - login blocks a TeamMember whose membership status != ACTIVE with "Your account exists but is not active at this time." Regular members and active team members pass. Org-resolution hardening (X-Forwarded-Host siblings): - getExternalProviders and PortalController.resolveOrg use the alias-fallback resolver and drop the getServerName() fail-open (fail closed instead of leaking the platform org).

  18. · kamo-shared-library

    SecurityProvider membership mirror + reuse/patch groundwork

    - **************** userId): mirror a user into the org's securityProvider org as a base Member (deduped; no-op when the org secures itself or the user is already there). Backs the rule that every new membership also lands under the platform/security-provider org. - **************** case-insensitive, multiplicity-safe email lookup for cross-org account reuse (email is not globally unique, so a single-Optional finder would throw). - **************** stop resetting securityProvider to self on every org edit (only backfill when null), so a child org keeps its link to the platform provider the mirror depends on.

  19. · kamo-internal

    Wire Tasks tab to real backend + delete action + live count

    Adds the Next proxy routes for /leads/{id}/tasks[/{taskId}] (the tab's getTasks/ addTask/updateTask/completeTask calls were 404ing), a deleteTask action in the task grid, and derives the 'Open Tasks' stat from the live task list so it stays current as TASK_CHANGED events refetch tasks.

  20. · SecurityService

    Lead tasks REST API + real-time TASK_CHANGED

    Implements the backend the /leads/view Tasks tab was already calling but that never existed: GET/POST/PUT/DELETE **************** (LeadTaskController + LeadTaskService), org-guarded like the lock endpoints. Each create/update/delete emits TASK_CHANGED so open lead views refresh live.

  21. · kamo-shared-library

    LeadTask entity for lead follow-up tasks

    Backs the /leads/view Tasks tab (previously a frontend-only stub with no persistence). LeadTask (table LEAD_TASK) mirrors the frontend TaskItem shape **************** + LeadTaskDTO and repository. Task mutations broadcast TASK_CHANGED on the existing lead real-time channel.

  22. · kamo-internal

    Real-time datagrid + live lead view with per-pane edit locks

    /leads grid is now fully live over websocket (NATS→STOMP): rows add/remove/update against the active filter automatically and changed cells blink once for other members' edits; the dead refresh button is removed. /leads/view/[id] applies live lead/history/task/stats updates and gains per-pane exclusive edit locks with a 'currently editing' roster, live countdowns, and auto-save on idle/disconnect. Adds useLeadsRealtime hook, leadLocksApi + Next proxy routes, and a reusable MemberContactCard (name + work extension, click-to-call softphone / open-chat). Lead updates merge null-preservingly so partial payloads never blank cells.

  23. · MediaService

    Org-guard the /topic/leads/rt/{orgId} realtime subscription

    Cross-tenant SUBSCRIBE guard for the new lead real-time topic, mirroring the existing /topic/social/feed guard: a member may only subscribe to their own org's lead stream. The existing **************** already relays security.leads.rt.* to /topic/leads/rt/*, so no relay change is needed.

  24. · SecurityService

    Per-pane edit-lock REST API + auto-save sweeper

    Adds /api/security/leads/{id}/locks **************** backed by LeadLockService: exclusive per-pane reservation, draft-buffering heartbeats that reset a 5-min idle TTL, and a scheduled sweeper that auto-saves the buffered draft and releases on idle-expiry or presence-grace timeout. Idle-expiry is emitted as absolute epoch millis. Config under lead.lock.* (configmap).

  25. · kamo-shared-library

    Real-time NATS publishing + per-pane edit-lock entity

    Publish org-scoped lead events on security.leads.rt.{orgId} (created/updated/ deleted with changed-field keys, history-appended) so the /leads grid and /leads/view page can update live. **************** now returns the changed registry keys used to drive the UI blink. Adds the LeadPaneLock entity (table LEAD_PANE_LOCK, unique (LEAD_UID,PANE)) and repository backing the exclusive per-pane edit locks; the publisher emits the idle-expiry as absolute epoch millis (timezone-safe number) for the countdown.

  26. · kamo-internal

    Integrate primary tabs into the header on remaining Style A pages

    Follow-up to the Style A→B sweep, covering pages that don't route through SettingsView: - /kb: KbNavBar becomes a gradient hero header with the Articles/Resources/ Reviews tabs integrated and the New Article action right-aligned; layout gets the shared radial background. - **************** the mini back-arrow header + General/ Domains MUI tabs become a gradient hero header with integrated tabs. - /leads/view/[id]: the primary record tabs move into the HeaderBar gradient header; the inline status/sub-status editor is appended to the header's right-aligned actions (styled for the gradient), replacing the separate tabs card.

  27. · kamo-internal

    Relocate bottom count bars into the header across social, imports tabs

    Applies the vendors-tab treatment to the sibling CRM settings surfaces so the standalone "x • y" summary bar at the bottom no longer eats page real estate: - Social Connections & Automated Imports: header actions bottom-align and the count line stacks directly above the Refresh + Add/Create buttons. - Manual Imports sub-tabs (Past Imports, Import Templates): the count moves to the left of the lone Refresh icon (space-between), dropping the bottom bar.

  28. · kamo-internal

    Move vendor/product count above the header actions, bottom-align Refresh + Add Vendor

    Recaptures the page real estate the standalone bottom summary bar used to occupy — the "x vendors • x products" line now stacks above the action buttons in the header, and the buttons bottom-align with the title block.

  29. · kamo-internal

    Integrate primary tabs into the page header (Style B) across Style A pages

    Every gradient-hero page that rendered its primary tabs in a separate card below the header now renders them inside the gradient header itself, matching /account and /support. - SettingsView: tab bar moved into the gradient header (converts all ~23 /settings/* pages at once); help column, headerAction, backHref, and the tab icon/glow/alignRight extras preserved; hideTitle still keeps its tabs. - /leads/reports: reports tabs moved into the header. - /commerce (PipelineView): per-market tabs (with vertical icons) moved into the header; single-market/onboarding states unchanged.

  30. · kamo-internal

    Back arrow in header returns to /leads

    Add an optional backHref/backTooltip to SettingsView that renders a white back arrow left of the title, and wire the CRM settings page to send the member back to /leads. Tooltip reuses the existing localized leads.view.header.backToBrowser ('Back to leads') string.

உங்கள் உலகம் காத்திருக்கிறது.

நிமிடங்களில் இலவசமாகத் தொடங்கவும். நீங்கள் தயாராக இருக்கும் போது பொருட்களை சேர்க்கவும் - எந்த மாற்றமும் இல்லை, புதிய உள்நுழைவுகள் இல்லை.

எப்பொழுதும் இலவசம் — கடன் அட்டை தேவையில்லை