Direkt zum Inhalt
KAMOUniverse

Changelog

Was ist neu?

Jede Verbesserung an der Plattform, wie sie geliefert wird.

  1. · kamo-shared-library

    Count DISTINCT-Veranstaltungen über die Besitzer eines Roll-ups

    Eine Telefonnummer kann eine Kontaktstelle für mehr als einen Besitzer auf einmal sein, und zwei führt auf einem Konto teilen ein ist die ORDINARY Fall . sie sind in der Regel die dieselbe Person, die zweimal nachfragen. Der Matcher schreibt absichtlich eine Zeile pro Besitzer, weil jede dieser Zeitlinien ihre eigenen braucht. Summen über ein Rollup, schlicht zählt Bericht ein Anruf als zwei, und eine Schiene Lesung 11 über einer Liste zeigt 6 ist schlechter als gar keine Schiene. COUNT(DISTINCT sourceId) über eine Liste von Besitzern einer Art zählt genau, was die aufgereiT-Zeitleiste zeigt, und es verwandelt die 26 Zählabfragen eines Kontos in zwei.

  2. · kamo-internal

    Gate das Linienfenster pro Mitglied und zeigen Sie, in welchem Modus Sie sich befinden

    Die Rollout-Steuerung. Default off, Opt-in pro Mitglied aus Telefon-Einstellungen, verschachtelt unter dem VOIP-Schalter, weil es nichts für ein Mitglied ohne Zeile bedeutet. Ein Haken besitzt das Tor, so dass seine beiden Verbraucher nicht widersprechen können. die das Fenster und den Streifen im Inneren des Softphones, das es bietet öffnet. A Mitglied, das das eine, aber nicht das andere sieht, ist schlechter dran als einer, der weder das eine noch das andere sieht. Es versagt geschlossen: eine unerreichbare Konfiguration lesen verbirgt die Funktion, anstatt bieten ein Fenster, das nicht funktioniert, und das in-seitige Softphone ist so oder so unberührt. Der Streifen beantwortet eine Frage, auf die ein Mitglied sonst keine Antwort sehen kann: ist dieser Anruf sicher vor einer Auffrischung? Mit dem Fenster offen lebt der Ruf dort und die Panel ist eine Fernbedienung, so bietet es an, das Fenster vorwärts zu bringen. kann am Ende hinter dem Browser und nichts anderes kann es erhöhen. Mit dem Fenster geschlossen der Anruf lebt in der Registerkarte und eine Auffrischung beendet es, so sagt es. Inbound verwendet nun die eine Geste, die es produzieren kann: die Desktop-Benachrichtigung Klicken Sie, der vorher überhaupt keinen Handler hatte.

  3. · VOIPService

    Lesen und schreiben Sie das Line-Window-Tor

    GET-Flächen lineWindowEnabled; PUT akzeptiert es als zunichte Boolean, so dass absent bedeutet "nicht erwähnt" und bewahrt den gespeicherten Wert. Jeder Bestand Caller dieses Endpunktes lässt das Feld aus, und diese als falsch zu behandeln würde schalten Sie die Funktion aus für jedes Mitglied, dessen Telefon-Einstellungen wurden für eine Unzusammenhängende Vernunft. Auch normalisiert eine Null-Lesung vor dem Speichern: eine Zeile vor der Spalte existiert kann immer noch null durch Hibernate tragen, und die Spalte ist NICHT NULL.

  4. · kamo-shared-library

    Karte LINE_WINDOW_ENABLED auf MemberVoipConfig

    Das pro-Mitglieder-Gate für das spezielle Softphone-Line-Fenster. Version Pin bleibt bei 1.6.0 - Hinzufügen eines Feldes braucht keine Beule, und ein Split-Pin würde CI für brechen jeder Verbraucher auf einmal. Die Spalte existiert bereits in der Datenbank; die DDL landete im KamoInitializer Erstens, absichtlich, weil ein Dienst, der eine fehlende Spalte abbildet, bei der Bohnen ausfällt Schöpfung statt entwürdigend.

  5. · InitializerService

    DDL für das Line-Fenster-Gate pro Mitglied

    Fügt ************ fehl, um falsch. Eine Spalte statt einer Feature-Flagge, weil es hier kein Flag-System gibt und MemberCapabilities ist ein geschlossener, ausfallender Satz ohne freien Slot. Control lebt neben den anderen Telefon-Einstellungen des Mitglieds, das ist auch, wo ein Verwalter würde danach suchen. Sein eigener Läufer statt einer Linie in MultiInstancePhoneMigration, weil die Bestellen ist der Punkt: KamoInitializer hat keine CI, so dass dies von Hand und landen VOR einem VOIPService bauen, dass die Spalte Karten, oder Hibernate scheitert bei Die Schaffung von Bohnen und der Dienst wird nicht beginnen. Der ALTER wurde bereits angewendet aus genau diesem Grund in die Live-Datenbank; dieser Läufer macht sie wiederholbar und idempotent für jede andere Umgebung.

  6. · kamo-internal

    Ein KI-Sub-Tab im Interaction Center

    KI-Sitzungen live in AIService und sind keine MediaSessions, so dass dieser Eimer bekommt sein eigener Lader vor dem /api/media/sessions/chat holen die anderen vier share, passt dann jede Sitzung in die gleiche Row-Form statt einer Sekunde Renderer - die Liste, ihre Suche, ihre Avatare und ihr ungelesener Chip sind eine Oberfläche, und eine zweite würde von der ersten innerhalb einer Freigabe driften. Ungelesen kommt durch die ai: namespace die Hexhead-Abzeichen lesen (getUnread, nicht conversationKeyForWindow - eine Chat-Listenzeile ist kein Werkzeugfenster), also eine Zeile und sein minimiertes Fenster kann nie über die Zahl streiten. Drei Lücken jenseits des Plans eigenen Auftrag, gefangen, bevor sie leise ausgeliefert: bucketOf() nie geroutet sessionType 'AI' irgendwo, so dass jede KI-Reihe gelöst, um 'Teammitglieder' und die KI-Tab wäre dauerhaft leer geworden; eigener Titel nie gelesen row.title, so dass jede KI-Gespräch gezeigt hätte, wie "Leeres Chat"; und 'ai' fehlte bei ALL_BUCKETS, also das pro Mitglied Sub-Tab Präferenz würde stillschweigend weigern, es nach einem Schalter wiederherzustellen. Der Schriftsatz eigenes ungelesenes Beispiel wird auch nicht als geschrieben verwendet - Ersetzen der bestehenden ungelesene Berechnung mit ihm Großhandel hätte jede SOZIAL Reihe Null Plakette (nie in der Live-Karte, im Gegensatz zu CHAT/SUPPORT) und blinkte jede Zeile auf Null vor dem Live-Schnappschuss lädt; der KI-Zweig wird in den vorhandenen gefaltet Bearbeiten statt, Erhaltung von beidem.

  7. · kamo-internal

    Das dedizierte Linienfenster

    Der Ruf lebt jetzt in einem Fenster, eine Aktualisierung des Arbeitsplatzes kann nicht berühren. SoftphoneProvider wird Besitzer oder Anhänger. Nur der Besitzer REGISTERs und öffnet der STOMP-Sockel; ein Follower gibt gespiegelten Zustand wieder, sendet Befehle über die Brücke, und bleibt stumm - kein Klingelton, kein Ringback, kein Ereignis klingt, weil es hält keine Sitzung und seine Antwort-Taste würde nichts tun. Wo Web Locks ist nicht verfügbar der Tab einfach besitzt die Zeile und es gibt kein Fenster, das ist heute Verhalten: nie in zwei Registrierungen abgleiten. /phone gerendert durch eine dritte AuthedChrome Zweig tragen SoundProvider und SoftphoneProvider und nichts anderes. Ohne ToolWindowRestore ist tragend Die Wache ist Modul-Anwendungsbereich, so dass ein frisches Dokument würde das ganze Mitglied wiedergeben Dock innerhalb des Popup - und so ist ohne SessionManager, die navigiert, um /Logout auf Ablauf und würde die gemeinsame Redis-Sitzung aus unter löschen Registerkarte workspace. Aus dem gleichen Grund verwendenUserInfo und apiClient jetzt weigern selbst von dieser Route aus; eine verlorene Sitzung wird gerendert, nicht umgeleitet. Das Fenster öffnet sich synchron von einem Klick in NavTop (transient Aktivierung tut nicht überleben eine Wartezeit), wird so ein zweiter Klick konzentriert sich eher als Duplizieren, und berichtet ein blockiert Popup statt der Stille scheitern . in-Seite Softphone funktioniert so oder so. Innen: ein Starttor, das kauft klebrige Aktivierung, bevor etwas es braucht, Reload-Schleier, ein schließen bestätigen, und eine Bildschirm-Wach-Sperre.

  8. · kamo-internal

    Eine Kommunikations-Registerkarte, die Roll- bisse des Kontos führt

    Das Niveau, das die meisten Leute meinen, wenn sie sagen "die Anrufe dieses Kunden". Mehrere Leads Häufig hängen Sie ein Konto, gerade weil sie die gleiche Person sind zweimal erfragen, und jeder ihrer Anrufe wurde zu je nachdem, welche Führung hielt die Nummer zu der Zeit - also die Zeitleiste eines Leads zu lesen, beantwortet eine engere Frage als derjenige, der einen Kunden anschaut, tatsächlich fragt. Damit ergibt sich die bestehende Timeline der Plattform, nicht eine zweite. Der Rückgrat ist Die Geschichte des Leads zeichnet eine Rechnung, die eine andere Basis gegeben wird. Ein Streicher, einer Die Registerkarte sagt, was sie NICHT zeigt. Die Server-Gates jeder aufgerollte Vorlauf auf der gleiche Rechte die federführende Seite gilt und Kappen, wie viele es rollt, und beide sind aufgetaucht: "N führten nicht gezeigt, weil Sie keine Erlaubnis haben" ist ein unterschiedlicher Satz von "dieser Account hat mehr Leads, als wir auf einmal aufrollen", und ein Banner für beide würde das erste hinter dem zweiten verbergen. Notizen und Chats sind eher abwesend als leer. Beide sind bleiern - eine Note lebt auf dem Medienstream einer Führungsrolle, Chat auf der Social Link - so hat ein Konto nichts zu dort, und eine dauerhaft leere Registerkarte liest sich als gebrochen und nicht unanwendbar.

  9. · KlusterServices

    Bounce einen bloßen Besuch auf dem Kamo-Login, und beenden Sie die Sitzung auf der Registerkarte schließen

    Das Schließen der KamoDesktop Registerkarte ließ eine Live-Session auf der Maschine sitzen. Guacamole behält seinen auther Token in localStorage (GUAC_AUTH), der das Schließen der Registerkarte überlebt, Schließen des Fensters und Neustart des Browsers, und das Token bleibt gültig für 60 Minuten nach seiner letzten Verwendung. Also die nächste Person, die das Tor darauf öffnet Computer geerbt die vorherige Person Desktop. Verwirrte Ende an Ende. Zwei Änderungen, absichtlich beide Server-Seite zuerst. Die Kante leitet nun eine nackte Dokumentenanfrage an login.kamocrm.com weiter. KamoDesktop hat genau einen legitimen Einstiegspunkt - einen signierten, einwegigen Link, der für jemand, der bereits zu Kamo authentifiziert ist - also eine Person, die den Hostnamen tippt, oder Wiederherstellung eines Lesezeichens, oder lassen Sie den Browser Autocomplete es, hat nichts zu tun sehen, dass Guacamole Passwort-Box. Servieren eins bietet ein beglaubigungssfüllendes Ziel für das "sage"-Konto und lässt einen Browser mit einem Live-Token stillschweigend wieder ein Sitzung. Absichtlich zu Path(-/-) gestaffelt: eine kalte SPA-Last zieht -41 Assets und API Aufrufe, die keine ?data= tragen, also bricht etwas breiteres die Anwendung komplett. Das #/Client/... Fragment erreicht nie den Server, also ist ein markierter Deep Link ein bloßes "/" hier und wird auch geprellt, was korrekt ist. Und das Token wird nun widerrufen, wenn die Registerkarte weggeht, anstatt nur vergessen: DELETE /api/session mit dem Guacamole-Token-Header (verifiziert live 204, und der Token funktioniert sofort nicht mehr). Übersprungen für einen bfcache Einfrieren, so drücken Zurück unterschreibt niemanden. kamo-reconnect.js ist weg. Es bestand zu Papier über fallengelassene Sitzungen, nahm es die Desktop-Down zweimal, und die Ursachen war es kompensieren für . Entfaltet Neustart das Gateway und das OOM sind an der Quelle festgelegt. Was es ersetzt, ist ein Viertel der Größe und seine schlimmste Misserfolg ist, dass Sie unterzeichnet sind, das ist das Ergebnis, das es zu produzieren versucht.

  10. · kamo-internal

    Linienbesitz, die Brücke und die No-y-No-Non-Übergangsregel

    Drei reine Module ohne Verbraucher noch, so dass diese Schiffe inert. lineOwnership wählt genau einen SIP-Registrar pro Browser über Web Locks. Das ist hier Pflicht und nicht defensiv: verifiziert live, jeder FreePBX AOR ist max_contacts=1 mit remove_existing=yes, also vertreibt ein zweiter REGISTER den ersten und das verordnete Dokument zeigt immer wieder "Registered", während nichts erhalten. Web Locks braucht kein Leben-Protokoll - das Schloss gehört zum Agenten, so ein abgestürzte oder aufgabengetötete Fenster gibt es ab und der nächste Kellner wird befördert. Wo die API fehlt, berichten wir "ununterstützt" und der Anrufer hält die heutige Verhalten, anstatt zwei Registrierungen zu riskieren. lineBridge ist eine versionierte BroadcastChannel-Umschlag. Nicht window.opener: das geht abgestanden genau dann, wenn der Opener nachlädt, was das Ereignis dieses Ganzes ist Funktion existiert, um zu überleben. Version skew degradiert zu einer abgestandenen Fernbedienung, nie einen Wurf in einem Live-Call UI. Der gespiegelte Zustand ist eine erlaubte Liste Daten bleiben, wo sie geladen werden. lineHandover ist eine Regel: ein Live-Anruf wird nie gerissen.

  11. · kamo-internal

    Der Tab-Titel zählt alles Warten, nicht nur Chat

    Der Tab-Streifen hat Platz für eine Zahl, und 'Chat und nur Support' gestoppt was ein Mitglied wartet auf einmal SMS, KI, verpasste Anrufe und unreviewed Berichte Jeder bekam einen Indikator.

  12. · kamo-internal

    Badge die KI-Option mit nicht rezensierten Antworten

  13. · kamo-internal

    Eine Summe auf dem Handy-Symbol, die Aufschlüsselung im Menü

    Dieses Symbol trug keine Abzeichen überhaupt, so ein verpasster Anruf, während das Softphone war geschlossen erreichte das Mitglied nirgends. Das Öffnen des Telefons klärt die verpasste Zählung.

  14. · kamo-internal

    Eine Summe auf dem Symbol, die Aufschlüsselung im Menü

    anpendingCount war die ganze Plakette, so unreviewed Bug Reports und Webinars gebucht im Namen von jemandem hatte keine Möglichkeit, jemanden zu erreichen. Öffnen der Webinar-Reihenstempel sie gesehen, so dass die Zählung kann tatsächlich gehen.

  15. · kamo-internal

    Das Chat-Abzeichen zählt Chats

    Es war still Chat plus Unterstützung, so dass ein Ticket leuchtete die Chat-Glocke und nichts zeichnete die beiden. Unterstützung hat seine eigene Ikone jetzt; soziale verbindet Chat, weil ein soziales Gespräch lebt in der Chats-Liste und hat keine eigene Ikone.

  16. · kamo-internal

    Lassen Sie eine Dropdown-Reihe tragen ihre eigene Zählung

    Das Symbol zeigt die Summe und die Zeilen zeigen die Aufschlüsselung - den Punkt der Aufteilung die Indikatoren zu sehen, WAS Sache will Sie ohne etwas zu öffnen.

  17. · kamo-internal

    Thump bei der Ankunft, mit dem Glühen nach außen

    Seine eigene Schicht im Inneren .hex-Skala: das Element bereits animiert verwandeln für die Hing mit Hauf wachsen, und zwei Animationen auf einem Element nicht komponieren - die zweite ersetzt die erste, so dass ein Schlag Mitte-Hover würde die Hover-Skala fallen. Keyed anstatt Klasse-geschalten, oder zwei Nachrichten in schneller Folge pocht einmal. Gated the scale-pulse auf einer ".thumped"-Klasse, die erst nach einem echten Schlag vorhanden ist: Schlüsseländerung macht ".hex-thump" zu einem frischen DOM-Kenntor sowohl auf einem echten Schlag UND auf den ersten mount, und CSS kann nicht sagen, diese beiden abgesehen von der Taste allein, so dass der kurze Wörtliche Verdrahtung hätte den Puls auf jedem Kopf eine restaurierte Sitzung gespielt laicht - die "Screenful of pulsierenden Sechseck" sollteThump existiert, um zu verhindern.

  18. · SecurityService

    Eine Zeitleiste auf Kontoebene

    Die Ebene, die die meisten Leute meinen, wenn sie sagen "die Anrufe dieses Kunden". Der Rückgrat ist bereits auf einen Eigentümer eingegeben, so dass der Konto-Endpunkt ist die gleiche zusammengeführt, Komponente macht es mit nichts als eine andere Basis. CommsSubjectResolver entscheidet, welche Eigentümer eine Zeitleiste lesen kann, und es ist die ein Ort, an dem die Antwort breiter sein darf als das gefragte Thema. Nur ACCOUNT expandiert. Eine Lee erbt nicht den Verkehr eines Geschwister-Lead: Zwei können unterschiedlichen Personen zugeordnet werden. Ein Patient erbt gar nichts, was auch immer die Kontografik sagt - ein Diagramm, das die Nachrichten eines CRM-Leaders zeigt, würde eine Offenlegung sein, und dieser Test existiert, um es so zu halten. Das Rollup ist bei 25 Besitzern gedeckelt und die Antwort sagt, wenn die Kappe Bit. A Rollup, das still fallen Besitzer ist eine Timeline fehlende Nachrichten für keine sichtbare Grund, der schlimmer ist als einer, der zugibt, dass es teilweise ist. Cross-org und fehlende Konten erhalten die gleichen 404, so dass die Antwort nicht verwendet werden kann um zu prüfen, welche Konten existieren, und der Fehlschuss wird auch geprüft. resolveOrgId statt ein neues Synonym: die Endpunkt-Ratsche erkennt an, dass Name, und es liest eine Methode Körper, ohne Anrufe zu folgen, so ein Helfer es kann Lektien nicht als unbewachten Endpunkt sehen.

  19. · kamo-shared-library

    Lassen Sie ein Konto rollen seine Lead-Kommunikation

    Mehrere Leads hängen gewöhnlich von einem Konto, gerade weil sie die dieselbe Person, die zweimal nachfragt, und jeder ihrer Anrufe wurde zu dem abgestimmt, was auch immer Lead hielt die Nummer zu der Zeit. So "die Kommunikation dieses Kunden" ist die Vereinigung der eigenen Reihen des Kontos und jeder seiner Leads' - Lesen Sie eine Die Zeitleiste des Leads beantwortet eine engere Frage als die, die gestellt wird. findUidsByAccount Projekte uids eher als Unternehmen absichtlich: Lead sitzt in eine JOINED-Erbschaftshierarchie, und die Auswahl von Einheiten hier würde die ziehen ganze holen Plan in eine Liste von IDs zu produzieren. PhiResourceType.ACCOUNT so die Konto Timeline Audit-Zeilen nennen, was war eigentlich lesen. Angehängt, nie eingefügt - das enum ist ordinal-persisted.

  20. · kamo-internal

    Ein Kontext für die Zählungen der vier Indikatoren

    Komponiert, was existiert und besitzt die drei, die kein Zuhause hatten: unreviewed bug Berichte, unreviewed Webinars, und das Telefon verpasste Anrufe und Voicemails. Die 60er-Jahre-Gürkete ist nicht Gürtel-und-Bremsen - mehrere von ihnen kommen über Kern NATS ohne Wiederholung, so dass ein Frame zu einem Schlafen Tab veröffentlicht wird nicht kommen.

  21. · kamo-internal

    Die Drop-Bacon berichtet, welchen Weg ICE tatsächlich gewählt hat

    Die Beacon versendete iceCandidateType als permanent-null Feld. Das ist schlimmer als es weglassen: es macht die Telemetrie aussehen informativer, als es ist, und Dies ist die eine Messung, die das gesamte Line-Window-Projekt umleiten kann. Das Web-Softphone baut seine Peer-Verbindung mit einem Hardkodcode öffentlichen STUN Die bescheinigende Nutzlast hat sie nie getragen. Also ein Mitglied hinter einem symmetrischen NAT, einem VPN oder Träger CGNAT kann nicht zu etablieren Medien mit nichts zurück zu fallen, und was sie berichten, ist "der Anruf fallen gelassen". Nach der Tatsache, dass ist ununterscheidbar von "I hit refresh", und die beiden haben völlig unterschiedlich repariert - eine davon zwei Zeilen TURN config anstelle eines neuen Browserkontextes. "Relay" / "srflx" / nichts ist der Beweis, der sie trennt. Der SIP.js Pfad Wiederverwendung des Kandidaten Paar seine bestehende Diagnose-Dump bereits berechnet, so dass es Kosten keine zusätzlichen getStats; die RingCentral Pfad Proben raw.rtcPeerConnection auf Antwort. Eine Null-Lesung ist RECORDED anstatt übersprungen. "ICE wählte kein Paar" ist der Relais-lose Ausfall und die wertvollste Lektüre zur Verfügung callDurationSeconds trennt es von "der Anruf endete, bevor wir gesampelt haben". Auch Aufzeichnungen in den Plan, was tatsächlich ausgeliefert, einschließlich der Task 6 Wache, dass unterscheidet sich von dem Plan, wie geschrieben.

  22. · kamo-internal

    Ein Tag Picker, geteilt durch den Kalender und die Einstellungen Registerkarte

    Die beiden Oberflächen hatten jeweils ihre eigene Antwort auf "Welche Tage?" gewachsen. Die Einstellungen tab setzen Workweek Days, Weekend Days und Every Day hinter einem Dropdown; die Kalender-Editor hatte ein multi-selektles Band und keine Gruppen überhaupt. Welches auch immer Mitglied erfuhr zuerst, der andere konnte nicht tun, was er tat. Sie teilen VerfügbarkeitDayPicker jetzt - die Gruppen-Buttons UND die sieben Chips, auf beiden Seiten, einmal definiert. Das ist die einzige Anordnung, die sie hält die dasselbe auch das nächste Mal wird entweder berührt. Gruppen wählen, anstatt zu sparen. Pressing "Workweek Days" dreht sich auf fünf Chips und nichts Downstream interpretiert einen Wächter: Das Mitglied kann sofort abwählen der Mittwoch, für den sie weg sind, und was das Backend erreicht, ist, was es hat immer genommen, ein Fenster pro Tag. Ein Gruppen-Button liest sich wie auf nur, wenn augenzwinkernd seine Tage werden gewählt, so dass die Steuerung sagen kann "Dies ist die Arbeitswoche" statt Jemanden zu zählen beleuchtete Chips. Die Registerkarte Einstellungen gewinnt etwas, was es nie hatte - eine beliebige mehrtägige Pick. "Montag, Mittwoch und Freitag" war dort vorher nicht ausdrucksfähig; es war ein Tag oder eine Gruppe. daysToSave dauert daher einen Tag LIST und nicht eine Tag-oder-Gruppe, das ist, was lässt beide Flächen einen Selektionstyp teilen. Beide Leitplanken halten noch und sind noch angeheftet: eine Bearbeitung dehnt sich nie in mehrere Zeilen aus, und ein mehrtägiger Pick bricht nie zu einem zusammen. Das "Was bedeutet das?" des Panels "Was bedeutet das?" beginnt nun für alle zusammenzubrechen. Eröffnung es für ein Mitglied mit nichts erklärt wurde als Freundlichkeit gemeint und war die falsche eins es drückte die Liste und die Taste, die das Ganze startet die ganze Sache nach unten Spalte, so das erste, was ein neuer Moderator erfüllt war eine Wand der Prosa statt die Kontrolle, um die es geht. Erhebt auch die Auszeit auf dem Ganzbaum-Scan des Soundkatalogs. Es liest und haut bei der App jede Quelldatei zusammen, landet bei 6-13s, wann immer die Maschine ist beschäftigt, und versagte die Suite gegen vitest 5s Standard - mit einer Nachricht die kein Ereignis benannte, weil es nie seine Behauptung erreichte. Der Scan ist wert Halten; die Standard-Auszeit ist einfach nicht so dimensioniert.

  23. · kamo-internal

    Badge ein minimiertes Fenster mit seinem Server ungelesene Anzahl

    Die eine Komponente, die sowohl die Fensterliste und die ungelesenen Karten sieht Motor weiß nichts über Gespräche und der ungelesene Kontext weiß nichts über Fenster, so dass keiner konnte dies allein beantworten. Dispatches nur auf Änderung: die Schlagtasten aus einer Erhöhung, so eine wiederholte Zählung würde wie eine Ankunft aussehen und die Köpfe würden auf dem Refresh-Zeitpunkt pulsieren.

  24. · kamo-internal

    Stellen Sie eine absolute ungelesene Anzahl vom Server ein

    Ersetzen hexhead:incoming, die nichts jemals gesendet. Seine +1 hätte gezählt eine neu gelieferte Momentaufnahme als eine neue Nachricht, und seine Lawn-wenn-fehlen Zweig würde einen Kopf, dessen Fenster nicht existiert . anklickbar, und inert.

  25. · kamo-internal

    Nachrichten und Anrufe, auf der bestehenden Timeline-Komponente

    CommunicationsTimeline und EmailEntry nehmen eine optionale EndpointBase und halten Sie den Lead-Pfad als Standard, so dass jede bestehende Call-Site äh-für- kümmert sich nicht, was die Timeline ist ÜBER . der Besitzer Keying ist vollständig serverseitig, genau wie MediaStream einen FeedEndpoint und den DocManager übernimmt nimmt einen (assocType, assocObjectId). Die Botschaften eines Patienten werden von der Der Kontakt-Punkt-Streifen über der Timeline ist der Teil, der sonst fehlen. Eine Timeline ist eine Ansicht; eingehende Anrufe und Nachrichten nur immer LAND auf einen Besitzer kann der Matcher auflösen, so dass ein Patient ohne registrierte Nummer hat eine leere Timeline aus einem Grund nichts anderes auf dem Bildschirm würde erklären. Sein leerer Zustand sagt genau das, anstatt nichts zu implizieren je passiert. 3149 testet grün, typcheck sauber.

  26. · SecurityService

    Anrufe, SMS und E-Mails eines Patienten auf der Plattform selbst

    Keine zweite Zeitleiste. LeadCommunicationsService nimmt jetzt ein CommsSubjekt und die Vorsprungsüberlastung delegiert es, so /leads behält sein genaues Verhalten driften. Ein Patient ist nur ein anderer Besitzer. Notizen und Chat erscheinen nur für eine Leine, und das ist eine Tatsache, anstatt eine Wache: Notizen kommen aus dem Medienstrom und Chat eines Leads SocialRemoteUserLead, von denen keiner für einen Patienten existiert. Beide Quellen bereits leer zurück, wenn ihr Link fehlt, so dass ein Patient abgestimmt wird Verkehr und nichts vortäuschen anders. Die Registrierung von Kontaktstellen ist die Hälfte, die es funktioniert. Zeigen eines Timeline bei einem neuen Besitzer ändert, was READ ist; eingehenden Verkehr nur immer LANDS auf einen Besitzer der Matcher lösen kann, so dass ein Patient, dessen Nummer nicht ist eine Kontaktstelle erhält Anrufe, die niemanden beschließen. Anmeldung ist Punkt-in-Zeit wie die Bleiwirbelsäule - eine Nummer ändern schließt den alten Punkt und öffnet eine neue, so dass ein Anruf von vor zwei Jahren noch erklärt, was es abgestimmt und es gilt die gleiche siebenstellige Etage, weil ein vierstelliger Boden Eine Erweiterung würde sonst jedem Patienten entsprechen, der diese Ziffern teilt. Lesen Sie etwas davon braucht eine Pflege-Beziehung mit dem Patienten, genau wie das Diagramm, und jeder angezeigte Eintrag schreibt seine eigene Revisionszeile. Eine Voicemail von Ein Patient ist so identifizierbar wie eine Problemliste. Der E-Mail-Börsenendpunkt überprüft die Reihe gegen den Patienten im Weg. Die Care-Relationship-Prüfung wird vom Patienten in der URL erfüllt, so dass ohne diese zweite Überprüfung ein Arzt mit einer Beziehung zu einem Patienten konnte jede Nachricht in der Praxis lesen, indem sie ihre ID - die Führung endpoint macht die gleiche erneute Überprüfung aus dem gleichen Grund. Seine 404 ist eine Antwort für "nicht dieser Patient", "keine E-Mail" und "noch nicht locatable", so dass die die Antwort kann nicht verwendet werden, um nach Nachrichten-IDs zu suchen. Auch hier: der TEFCA-Austausch-Controller - ein Patient -164.528 Buchhaltung, alles an einen Partner geschickt (die Abfrage jemand läuft die Stunde ein Verstoß wird gemeldet), Teil 2 Enthüllungen als ihre eigene Frage, und die Cross-Organisation Match Review Warteschlange. 1278 Tests grün.

  27. · kamo-internal

    Stoppen Sie Anrufe zu Sitzung Ablauf, Abriss und abgestandene Geräte

    Vier Leitplanken, die sich zwei Dateien teilen, so dass sie sich eine Übergabe teilen. Ein Live-Call zählt nun als Session-Aktivität. ClientActivityTracker gleichgesetzt Präsenz bei Eingabeereignissen, so dass sich ein Mitglied, das einen langen Anruf hört, als untätig vorgehältig vorliest: die Redis TTL verfallen, die Ablaufwarnung in einem Tab geöffnet sie nicht suchen bei, und /logout riss den Baum ab, der die SIP-Sitzung hält. Durch die bestehende markNow() so Logout-Deaktivable noch gewinnt - sessionMonitor eigenen Etagen (120s Aktivitätsfenster, 60er-Rede-Minimum) regieren die Trittdauer, so dass dies nicht weglaufen. Ein Dokument, das mit einem Anruf stirbt, sagt jetzt so. pagehide feuert ein Best-Anstrengung BYE - das andere Ende zuvor saß auf einem toten Bein, bis der Registrar die Zeit Kontakt aus, bis zu zehn Minuten ablaufen:600 - und eine Haltefeuer-Bacon-Tray Mitglied, org, Anbieter und hadLiveSession. Nichts irgendwo zählte, wie oft teardown tatsächlich kostet einen Anruf, so gab es keine Nummer, um eine größere Lösung wiegen gegen. Die Beacon erlaubt-Listen seine Felder: keine entfernten Zahlen in einem Pod Log, und IDs bleiben Strings, weil sie int64 sind. Ein zweiter Tab klingelt nicht mehr mit einem toten Antwort-Button. Das VOIP STOMP Thema ist eine Sendung, so dass jede offene Dokument-Set hatIncomingCall, während nur die eine die Der Anbieter schickte die INVITE, um zu antworten. Gated auf die Sitzung statt der SDK, weil mit zwei Tabs geöffnet beide halten eine Registrierung. Eine Geräteänderung erreicht den Anruf von jedem Fenster. saveAVSettings sendet a gleich-Fenster CustomEvent; nur useAVSettings auch auf das Cross-Dokument gehört Speicher-Ereignis, so dass jeder Call-Pfad-Verbraucher verpasst eine Änderung an anderer Stelle gemacht still, denn AnwendungSinkId schluckt jeden Versagen. Eine abonnierteAVEinstellungen umfasst nun beide Hälften.

  28. · InitializerService

    Verbreitern Sie die Komms Wirbelsäule zu einem Eigentümer, in der Reihenfolge, die es sicher hält

    LEAD_CONTACT_POINTS und LEAD_COMMUNICATIONS erhalten den Dokumentenmanager (assoc_type, assoc_object_id) Paar so ein Konto, ein Patient oder ein Commerce Aufzeichnung kann eigene Kommunikationen ohne Ausleihen einer Leerstelle. Vier Schritte, und die Reihenfolge ist der springende Punkt. Backfill first: jede vorhandene Zeile ist ein Lead, also assoc_type = 'LEAD' und assoc_object_id = lead_uid::text. Ausführen nach dem Constrint Swap würde den neuen einzigartigen Index über Nullen zu bauen, nichts zwingen. Dann tauschen Sie die einzigartige Beschränkung auf das Besitzerpaar. (org_id, lead_uid, Kanal, source_id) ist, was macht die Einnahme idempotent - ein RingCentral-Aufruf wird zweimal gesehen, einmal durch den Webhook und einmal durch die Versöhnung Sweep und mit lead_uid null für einen Patienten, behandelt Postgres jeden von denen NULLs wie deutlich, so dass die zweite Sichtung einfügt ein Duplikat. Die neue Zwang wird hinzugefügt VOR die alte wird fallen gelassen, so ein Versagen zwischen sie verlassen den Tisch, der nicht von einem, sondern von einem geschützt ist. Nur dann entspannen lead_uid's NOT NULL. Hibernate's ddl-auto: Update fügt hinzu Säulen, aber nie entspannt eine Einschränkung, so dass dies nicht auf die Mapping - und tun Sie es, bevor der Swap öffnet sich genau das doppelte Fenster oben. Dann überprüfen Sie, indem Sie pg_constraint und information_schema zurück lesen. Die klinische Primärschlüssel waren korrekt in Java und falsch in der emittierten DDL, und nur das Lesen von pg_constraint zeigte es. Eine Zeile links ohne Besitzer-Typ würde nie auf einer Zeitleiste erscheinen, so dass Fall protokolliert einen Fehler anstatt Erfolg vermelden. Durchweg Idempotent, und ein fehlender Tisch wird eher übersprungen als versagen der Boot - eine Ausnahme hier würde jeden späteren Läufer mitnehmen. 176 Tests grün.

  29. · kamo-shared-library

    Schlüsseln Sie die Kommunikation Wirbelsäule auf einen Eigentümer, nicht eine Leitung

    Die Wirbelsäule wurde bleiförmig gebaut - LEAD_CONTACT_POINTS.LEAD_UID, LEAD_COMMUNICATIONS.LEAD_UID und der Verein, den es tatsächlich braucht, ist breiter. Ein Konto besitzt mehrere Leads, in der Regel teilen den gleichen Punkt Kontakt, weil sie die gleiche Person sind, die zweimal nachfragen. Ein Handelsrekord hängt vom Konto und nicht von einer Leite. Und ein Patientendiagramm hat Anrufe und E-Mails darüber und überhaupt kein Blei. Die Schlüssel zu den Leitungen bedeutete jeweils von denen, die sich entweder einen Blei geliehen haben oder eine parallele Zeitachse wuchsen. Beide Tabellen tragen nun die des Dokumentenmanagers (assoc_type, assoc_object_id) Paar, mit LEAD, ACCOUNT, PATIENT und COMMERCE_RECORD als Eigentümer. LEAD_UID ist KEPT und immer noch für bleierne Zeilen gefüllt, so dass jede bestehende /bles Abfrage, Index und Ruf-Website ist unberührt - das Lead-keyed Repository Methoden und die Lead Timeline Überlastung bleiben beide, und der neue Besitzer-keyed Die sitzen neben ihnen. Drei Dinge, die das richtig machen musste, und eines hätte ich fast falsch gemacht. Die einzigartige Einschränkung bewegt sich zum Besitzerpaar. (ORG_ID, LEAD_UID, CHANNEL, SOURCE_ID) ist das, was die Einnahme idempotent macht - ein RingCentral-Aufruf ist zu sehen zweimal, einmal am Webhook und einmal durch den Versöhnungss-Sweep. Mit LEAD_UID null für einen Patienten, Postgres behandelt jeden dieser NULLs als unterschiedlich und die zweite Sichtung fügt ein Duplikat. Die Kontakt-Punkt-Tabelle ist wichtiger als die Zeitleiste. Auf eine Zeitachse hinweisen bei einem neuen Besitzer ändert, was READ ist; eingehenden Verkehr immer nur LANDS auf einem Besitzer, der Kontaktstellen hat, denn das ist, was der Linker passt gegen. Ein Patient, dessen Nummer keine Kontaktstelle ist, erhält Anrufe, der Entschlossenheit zu niemandem. Die, die ich fast versendet: der Linker entduped Streicher von cp.getLeadUid(). Für eine nicht-Lead-Kontaktstelle, die null ist, so seenLeads.add(null) würde lassen genau EINEN Nicht-Lead-Besitzer durch pro eingehende Nachricht - ein Anruf an eine Nummer Zwei Patienten teilen würde eine von ihnen erreichen, still. Es ent-dupes jetzt auf der Besitzer. assoc_type ist ein STRING, niemals ein Ordinal. Hibernate friert einen CHECK ein (col ZWISCHEN 0 UND N) über eine ordinale enum-Spalte bei CREATE TABLE und niemals besichtigt es, so dass das Anhängen eines Wertes später jede Einlage mit ihm abstünde. still, weil die ausbleibende Aussage in einer @Transactional-Methode sitzt dessen Rollback die Beweise beseitigt. Sieben von ihnen wurden voll gefunden und Bereits brechen Dinge auf dieser Plattform im August. Eine gespeicherte Null liest sich als LEAD, weil jede Zeile vor der Spalte geschrieben existiert ist ein Lead und Rückkehr Null für diejenigen würde die Timeline ausblenden Diese Änderung existiert, um zu erweitern. Ein UNKNOWN-Wert liest sich eher als null als LEAD - den Verkehr von jemand anderem an eine Vorlauf-Zeitachse anhängen, ist die eine falsche Antwort schlimmer als keine. Auch in dieser Verpflichtung: die TEFCA-Austauschschicht (Partner, die Offenlegung Ledger, Cross-Organisierung Patienten-Matching). Seine Zweckcodes sind jetzt die gleiche HL7 v3 ActReason Strings PhiPurposeOfUse verwendet bereits - ein Test gefangen ich erfinde "T" für die Behandlung, wo die Plattform sagt "TREAT", und ein Austauschreihe und eine Prüfungsreihe beschreiben die gleiche Offenlegung aus zwei Blickwinkeln, so ein Bericht Beitritt ihnen auf diesen Strings bei. 1932 Tests grün.

  30. · kamo-internal

    SMS und KI zählen, und eine Aufteilung pro-Ferne

    Ein MediaService-Schnappschuss umfasst drei Oberflächen, die auf zwei verschiedene nv gehören Indikatoren, so dass die Summen von dem deklarierten sessionType des Servers getrennt sind anstatt von denen aus Fenstern offen sind. Ein Eintrag ohne sessionType zählt als Chat - das sendet ein älterer Build, und es hält die Abzeichen zu tun, was es tat, anstatt fallen eine Graf Mitte-Einsatz.

Euer Universum wartet.

Fügen Sie Produkte hinzu, wann immer Sie möchten – keine Migration, keine neuen Anmeldungen.

Für immer kostenlos – keine Kreditkarte erforderlich