Aller au contenu
KAMOUniverse

Changelog

Ce qui est nouveau.

Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.

  1. · kamo-internal

    Confirmer avant qu'un rafraîchissement ne prenne un appel en direct

    La session SIP vit dans le document et rien sur le serveur ne tient une poignée à elle, donc un rechargement termine l'appel pur et non BYE, laissant le long-fin sur silence jusqu'à ce que l'officier de l'état civil temporise le contact. Une confirmation native d'un navigateur est toute la défense d'une page a, et F5 est la façon la plus courante d'un appel est perdue. Aussi des extraits estCallActive comme la définition d'un appel en direct, donc la proximité le veto, le rythme cardiaque de l'activité et la balise d'abandon ne peuvent pas s'en éloquer. Une sonnerie le décompte des appels entrants, de même que le déficit de négociation de la SDP comme l'appel a déjà lieu.

  2. · kamo-internal

    Reconstruire l'éditeur de disponibilité autour du jour qu'il décrit

    L'éditeur était une pile de lignes de forme qui n'a jamais montré ce qu'il faisait. Il Maintenant s'ouvre avec la chose elle-même: un rail de 24 heures avec le bloc peint dessus, dans le même vert, il sera sur la grille derrière. Cela coûte le tiers le plus élevé de le dialogue et le gagne, parce que la question que cette surface provoque n'est pas "Quels contrôles sont ceux-ci" mais "Qu'est-ce que je crée?" - et une photo d'une journée répond d'une certaine manière qu'un autre paragraphe ne le fait pas. Le rail anime sa position et la largeur au fur et à mesure que les heures changent, et un bloc courant après minuit sort comme Deux segments, c'est vraiment et dit, plutôt que de ressembler à une erreur. Les jours sont devenus un ruban. Une semaine, c'est sept choses et une personne pointe sur eux, donc ce sont sept jetons au lieu d'un menu décrochant six derrière un clic créer, plusieurs à la fois, parce que "lundi, mercredi et vendredi matin" est Une pensée et trois fenêtres. Le bouton dit alors combien de blocs il va faire, donc la multiplication n'est jamais une surprise. L'édition le maintient à un: a bloc ne doit pas devenir cinq derrière un bouton qui dit Save change. Jours déjà on laisse tomber un bloc identique, réutilisant les jours testésNeedingWindow. Les heures ont fait dire les mots que les gens disent haut et fort - Matin, après-midi, toute la journée Parce que "Je suis des matins libres" est la vraie pensée et la traduire en deux Les cueilleurs de temps étaient les frictions qui valaient la peine d'être enlevées. La portée effective et le déménagement de notes Plus d'options, qui s'ouvrent déjà élargies lorsque la fenêtre est édité les utilise, donc rien ne se cache auparavant derrière une divulgation. Copy pose une question et l'action primaire garde le verbe de la barre latérale, donc le Le long de la fonctionnalité se lit comme un vocabulaire plutôt que trois. L'entrée est à trois rythmes - collecteur, rail, commandes. Six régions échelonnées ont été le premier instinct et lue comme un défilé, attirant l'attention sur l'animation plutôt qu'à la journée décrite. Tout cela s'effondre à néant sous préfère les mouvements réduits. La barre latérale est de 364px, 30 % plus large. Le panneau de disponibilité met la vraie lecture ci-dessous la liste de calendrier et à l'ancienne largeur le bouton qui commence le tout assis sous le pli; la grille à côté est fluide, de sorte que la colonne peut simplement prendre l'espace. La palette du dialogue est en disponibilitéThème avec le reste de la couche couleurs: le bloc sur le rail doit être le même vert que le bloc sur le rail une grille, et une palette séparée ici, scinderait que la première fois soit se déplaçait.

  3. · kamo-internal

    Une adresse pour une conversation sur l'une des cinq surfaces

    chat/support/social partage le chat: espace de noms parce qu'ils ne le sont pas lus instantané; SMS et IA ont le leur, parce qu'un UUID Voip Conversation et un média GUID de session sont des ids non liés qui ne doivent pas entrer en collision sur une carte.

  4. · kamo-internal

    Voies de notification des comptes et lectures de la ligne de repérage

    Les routes PUT répondent à 204 et ne doivent pas appeler .json() dessus - qui tourne un marque-read avec succès dans un 500.

  5. · kamo-login

    Le cueilleur de l'espace de travail affiche le logo de chaque org.

    Deux lettres se présentant pour un logo étaient un contournement pour la réponse qui n'en portait pas une. C'est est maintenant, le serveur résolu côté serveur à partir du dossier le thème de l'orge a été fourni dans, donc un les membres qui choisissent entre cinq espaces de travail les reconnaît plutôt que les initiales de décodage. Le monogramme reste comme la solution de repli, et c'est un vrai plutôt qu'une formalité : rien enregistre si uneorge a jamais téléchargé un logo, donc l'URL est l'endroit où le fichier WWD serait et un 404 est une réponse ordinaire. Les défaillances sont mémorisées par org id - sans que le navigateur se revaille la même image manquante sur chaque re-remise et l'avatar s'enclece entre un cadre cassé et deux lettres. Un logo se trouve sur le blanc de sorte qu'il lit de la même chose sur la ligne sélectionnée que sur les autres; un monogramme garde la puce teintée qu'elle a toujours eue.

  6. · SecurityService

    La réponse de connexion porte le logo de chaque espace de travail

    Le sélecteur a tiré deux lettres par ligne parce que la réponse contenait un nom et un alias et non. image. Une liste d'espaces de travail est lue par marque bien avant d'être lue par le nom. Résolu ici plutôt que dans le navigateur. L'URL doit nommer le dossier le thème était et cette règle vit déjà dans OrgDomains.themeImageBase et la reconstruction en kamo-login serait un deuxième exemplaire à dériver, et chaque ligne ne demanderait jamais un fichier rien jamais écrit. simpleLogoUl miroirs de résolutionPrimaryDomain pour la même raison: DNS-vérifié d'abord, alors simplement actif, puis simplement actif, puis 'alias'.kamocrm.com pour un og qui n'a pas de domaine du tout. Les domaines roulent sur la requête de connexion existante sous la forme de deux agrégats plutôt que d'une recherche par org - c'est le chemin d'accès, et un membre d'une douzaine d'espaces de travail paierait autrement un interroger chacun. Deuxièmement, parce que choisir entre eux est la préférence ci-dessus. Rien n'indique si un logo a jamais été téléchargé, donc l'URL dit où le fichier WOUL serait. Un produit 404 est un résultat ordinaire et la ligne retombe à son monogramme. Vérifié contre la production: kamocrm.com, b11capital.com, breakbeat.store et la démo les locataires de sous-domaine renvoient tous l'image à l'URL ces règles construites - les sous-domaines à partir de leur propre dossier sur l'apex parent, non effondré dans celui de la plate-forme.

  7. · kamo-internal

    Mettre en place RingCentral avec un JWT, et assigner aux membres leur propre numéro

    Trois écrans, un changement. L'onglet d'aperçu du serveur téléphonique remplace "Connectez-vous à RingCentral" par le titre d'identifiants, le flux JWT a réellement besoin - client id, secret, URL de la plate-forme et un utilisateur de service JWT - construit comme les équipes à côté. URL de la plate-forme est éditable parce que le JWT d'une application de bac à sable est refusé par la production et vice versa, et le fait de pointer du mauvais hôte produit un avarie invalide qui se lit exactement comme un mauvais justificatif. Secrets aller-retour en tant que "-", donc éditer le nom du serveur de téléphone Cela ne signifie pas les recoller. L'onglet de la plate-forme Advanced perd sa carte RingCentral. Il n'y a pas de Kamo à l'échelle L'enregistrement RingCentral plus loin, et un opérateur remplissant un in serait entrer des références que rien ne lit. Même raisonnement que ADP-WFN. L'onglet de paramétrage du membre avait un vrai bogue: le menu déroulant du fournisseur listé uniquement serveurs de téléphone qui avaient déjà une extension synchronisée gratuite, donc un serveur RingCentral créé quelques minutes plus tôt était invisible - une liste de fournisseurs vides, rien à Affecter, et aucun moyen de dire pourquoi. Chaque serveur téléphonique actif est listé maintenant, et un sans rien chargé dit ainsi et propose de synchroniser en place. L'affectation gagne également le nombre lui-même. Les extensions portent leur propre DID, de sorte que "101 - Ada Lovelace (1 702 555 0134)" plutôt qu'une nue le numéro d'extension, et l'appelant sortant du membre devient leur propre ligne au lieu du numéro principal de l'organisme. Et le bouton de connexion RingCentral devient un Champ JWT: le serveur prouve le certificat avant de le stocker et de lire en retour quelle extension il décide, donc un JWT créé sur l'extension d'un collègue est a signalé plutôt que d'enregistrer silencieusement le softphone comme ce collègue. La carte Teams conserve son consentement saut, et l'invite du softphone s'arrête de nommer RingCentral chez les utilisateurs d'équipes. La page de la carte membre en anglais en caractères durs est cliqueté pendant sa réécriture.

  8. · VOIPService

    Authenticate RingCentral avec un JWT, par serveur téléphonique

    RingCentral était le dernier fournisseur dont les références provenaient d'un Kamo à l'échelle de Kamo. inscription plus deux sauts de consentement du navigateur - un pour l'orge, un par membre. Les deux ont disparu. Une organisation enregistre sa propre application dans son propre RingCentral une console de développement avec le flux d'authentification JWT activé, et le client id, secret, URL de la plate-forme et un utilisateur de services JWT en direct sur l'Instance VoipProvider qui utilise Ils le font déjà, exactement comme FreePBX et Teams. Un client les identifiants ne peuvent plus autoriser un appel contre le compte d'un autre client, et il n'y a pas de consentement à l'obtention, pas de jeton à stocker pour le compte d'un navigateur, et pas d'état de "reconnexion" à tomber. Rétroviseurs ÉquipesInstanceConfigFactory, moins b) Un JWT est dénué de sens contre le compte de n'importe qui d'autre, donc a le repli pourrait seulement laisser une instance semi-configurée emprunter l'identifiant de l'application d'une autre organisation et échouer plus tard en tant qu'opacité 401. nécessite() nomme le champ manquant à la place. RingCentralJwtTokenService frappe les jetons d'accès à partir d'un JWT et les met en cache par un condensé du certificat, donc la rotation d'un JWT est auto-expulsée et une rassisure Un jeton ne peut jamais être servi pour un titre d'accréditation qui a été remplacé. A 4xx signifie l'identifiant est mort et demande un nouveau; tout le reste d'autre reste réaérable. une panne n'est jamais confondue avec un JWT révoqué. RingCentralProvider est maintenant à l'origine de l'extension. Construit auprès de l'utilisateur de services identitaires qu'il parvient à un membre au /account/-/extension/-id/..., donc leur appel l'historique, la messagerie vocale, la présence et le travail d'appel pour le moment d'un administrateur leur attribue une extension, auparavant un membre sans connexion OAuth obtenu Rien du tout. Construit à partir du JWT du membre, il s'adresse. Uniquement client-info/sip-prestation nécessite ce dernier point, et en le demandant avec le compte jeton n'est pas une erreur: il remettrait à l'identité SIP de l'UTILISATEUR du SERVICE et enregistrer le softphone du membre comme compte. Il refuse à la place, dans le façonner le softphone déjà manche. ListeExtensions reads indique maintenant l'inventaire des numéros du compte et contient chacune d'elles. DirectNumber de l'extension, de sorte qu'un membre peut se voir attribuer sa propre ligne plutôt que que tout le monde partage le numéro principal du serveur téléphonique. Compagnie et Entreprise principale les nombres sont délibérément exclus - traiter ceux comme étant personnels donneraient la moitié l'org un nombre "direct" identique. Le provisionneur de crochets est chassé des instances plutôt qu'un tableau symbolique: org peut faire fonctionner plus d'un serveur de téléphone RingCentral, et chacun a besoin de son propre abonnez-vous à son URL de sa propre plate-forme.

  9. · InitializerService

    Ajouter les colonnes JWT RingCentral et numéros directs

    Ordre 0, parce que les entités de la bibliothèque partagée cartographient les deux colonnes à partir du moment cette construction commence: chaque coureur qui charge un PhoneExtension ou un MemberVoipOAuthToken through JPA les émet dans son SELECT, un coureur commandé plus tard, un décès antérieur sur la colonne ... n'existe pas. Et prend d'abord la course. Rien ici ne lit une entité, donc il n'y a rien pour qu'il attende derrière. Les deux déclarations sont AJOUTER COLONNE PAS S'ILS EXISTES et les deux colonnes sont annulables, donc la rediffusion est une ligne non-op et aucune ligne n'est réécrite. Les lignes OAuth restantes sont délibérément laissé en place: le statut est lu à partir de jwt-assertion maintenant, donc une ramure rassis les rapports "non connectés" plutôt que de prétendre qu'un membre est créé alors qu'il ne le fait pas. Les colonnes ont également été appliquées directement à Yugabyte avant le VOIPService. déployer - pousser ces navires de prise de garantie rien à lui seuls.

  10. · kamo-shared-library

    Donnez à un membre un RingCentral JWT et une extension son propre numéro

    Deux colonnes, toutes les deux annulables, donc rien n'est remblayé et aucune modification de ligne existante signification. est titulaire d'un membre RingCentral JWT. RingCentral ne prévoit qu'une identité SIP pour l'extension qui est propriétaire du jeton présenté, donc un téléphone portable a encore besoin d'un justificatif par personne; le JWT est le chose à longue durée de vie qui le frappe, à l'endroit où le jeton de rafraîchissement rotatif utilisé pour Assieds-toi. Les équipes continuent d'utiliser le jeton de rafraîchissement, donc le tableau contient maintenant, quelle qu'elle soit les questions de mandat de l'utilisateur de compétences de longue date. phone-extension.direct-number détient le DID entrant de l'extension. Sans elle l'identifiant de l'appelant sortant d'un membre ne pouvait jamais être que le numéro principal du serveur téléphonique. donc "assigner à ce membre son propre numéro" n'avait nulle part où être enregistré. Prorogations qui n'ont pas de ligne directe, et les fournisseurs qui modélisent le routage entrant séparément à partir d'extensions, laissez-le nulle et retombez exactement comme avant. est marqué à la retraite plutôt qu'enlevé ids il y a persiste et l'enum est appendice uniquement. Rien ne lit plus : a Les identifiants du serveur de téléphone RingCentral sont émis dans le cadre du client compte, donc ils vivent sur l'instance qui les utilise.

  11. · VOIPService

    Ténombres d'appels manqués et de messagerie vocale pour l'indicateur de téléphone mobile

    Signalée sous la forme de lignes séparées plutôt que d'un total: l'icône indique la somme et son déroulante montre la répartition, donc une valeur de fil pré-sommée rendrait le déroulante impossible. Les messages vocaux sont comptés par instance, en faisant correspondre l'ensemble des listes d'onglets de messagerie vocale, Ainsi, l'insigne et la liste qu'il ouvre ne peuvent pas être en désaccord.

  12. · AIService

    Nombre de réponses non examinées et d'une lecture de marque

    Cintée par le guid de session, qui est ce qu'une fenêtre d'outil transporte. Non vérifié en tant que divulgation: il retourne compte et jamais un mot d'une transcription, et l'enregistrement d'un Un rafraîchissement de badge enfouirait les vraies révélations.

  13. · VOIPService

    Un instantané non lu, un lus-marque et un cadre en direct

    Son propre sujet NATS plutôt que le message existant: le gestionnaire du navigateur pour /topic/voip/message/ joue le son d'arrivée et ouvre une fenêtre d'outil pour chaque cadre qu'il obtient, donc un rafraîchissement de badge livré là-bas serait sonnerie et pop a fenêtre à chaque fois qu'un comptage coché.

  14. · kamo-internal

    Disponibilité réservée aux présentateurs, et moyen de la comprendre

    Trois choses, tout à propos de la même couche. QUI Sait-IL. La mise à disposition a été montrée à tout le monde. Les heures de déclaration sont C'est seulement significatif pour quelqu'un qu'un type de webinaire répertorie en tant que présentateur. personne n'en est un par défaut, et les heures déclarées par quelqu'un d'autre ne pourraient jamais être Cue par une âme. La bascule, le panneau de barre latérale et les gestes de grille sont maintenant à moins que GET/api/webinar/présentation ne soit non-vide, et le crochet commence dans un état de chargement de sorte que la commande n'apparaît jamais sur la première peinture et puis disparaît. Il échoue: une erreur cache la couche plutôt que d'offrir un éditeur dont les heures d'ouverture ne peuvent appartenir à aucune session. Ce que cela signifie. Un nouveau panneau de barre latérale répertorie chaque fenêtre avec l'édition et la suppression, et Porte l'explication. Cette copie est l'élément du panneau: la disponibilité est la surface rare où le contrôle est facile et le CONCEPT ne l'est pas, et quelqu'un ajouté en tant que présentateur la semaine dernière n'a aucune idée si le marquage d'une heure les engage à une réunion, bloque leur calendrier, ou annule quelque chose. Il est écrit pour un une personne qui n'a jamais vu ce système - que le marquage des heures n'est pas programmée, qu'une réservation devient une vraie réunion dont on parle, que les réunions le bloquent automatiquement, et que les heures de suppression n'annulent jamais rien déjà réservé. Il nomme également les sessions pour lesquelles ils peuvent être réservés, parce qu'un Un membre peut ne pas savoir à quoi ils ont été ajoutés. MANIPULATION DIRECTE. Faites glisser vers le bas la grille vide pour marquer les heures; faites glisser le haut d'un bloc ou bord inférieur pour le changer. Partagé par jour et par semaine, le nombre de vues à travers un crochet ainsi ils ne peuvent pas dériver. Horaires entières, parce que les rangées de la grille ARE ème heures - c'est le Contrat qu'il se conserve avec la colonne vertébrale maintenant - donc un create ouvre l'éditeur pré-rempli plutôt que d'épargner silencieusement, et la moitié du passé reste le travail de l'éditeur. Une redimensionnement s'engage directement à travers: le membre vient de tenir compte des heures avec leur et peut voir le résultat. L'arithmétique de rangée est séparée et testée, car deux de ses trois cas sont off by un qui se lisent comme des bogues de grille et le troisième est un piège de données: une fin à ou avant son début, c'est la façon dont cette plate-forme stocke une fenêtre OVERNIGHT, donc a Le geste ne doit jamais en produire un. Une traînée au fond de la grille se termine à 23:59, et traîner un bord au-delà de l'autre s'effondre plutôt que de s'inverser. Renomme également l'onglet paramètres en Webinaires programmés, dans l'onglet, les paramètres menu et la carte de pavé. Sa valeur est devenue des combinaisons-heurels-heureux et vieillissent les liens sont réécrits plutôt que pseudo-adhésés, de sorte que l'URL un membre qui va partager est le courant - sans que cela atterrisserait sur des sujets avec la barre d'adresses toujours en train de prétendre le contraire, qui est le mode de défaillance documenté pour changer un l'onglet clé ici. Les points d'entrée du menu à la propre clé de titre de l'onglet de sorte que les deux ne peuvent pas s'éloignent dans 22 localités.

  15. · BillingService

    Faites un événement Rayé rejoué un no-op

    Ajout de BillingWebhookEventClaimService sur sa propre haricot, avec REQUIRES-NEW sur chaque méthode, et la câble en processEvent avant le commutateur d'expédition. Une perte de réclamation revient sans expédier, donc Stripe est relivrée d'un argent l'événement ne fait rien de quoi au lieu d'écrire deux fois. La réclamation passe par un haricot injecté, jamais cette réclamation(e) : a auto-invocation contourne le proxy de printemps et vides silencieusement REQUIES-NEW, donc un manipulateur roulerait la réclamation et ferait ressembler à chaque réessai première livraison. CommissionService a déjà expédié ce bogue une fois. La clé de compte retombe à la sentine de PLATFORM non nuanle, parce qu'une NULL composante d'un conflit clé unique avec rien dans Postgres et serait désactiver silencieusement le dédupe pour exactement les événements que ce point d'extrémité reçoit aujourd'hui. En outre, timbre l'horloge à culbute avec - la nue maintenant() lire la zone par défaut du pod tandis que chaque autre horodatage dans le fichier est construit à l'UTC. Érouillé de deux commits: l'engagement de ne faisant que le haricot qui n'a pas réussi à faire défaut à BillingWebhookClaimShapeTest de l'isolement, puisque le câblage de champ a atterri dans le second. Rien n'a été poussé.

  16. · MediaService

    GET/api/webinaire/présentation

    Le webinaire porte le CALLER pour lequel il est présentateur. Le calendrier demande cela avant il offre une couche de disponibilité en tout: heures déclarées par un membre sans type les listes ne peuvent jamais être réservées par qui que ce soit, donc pour presque tout le monde la réponse honnête est une liste vide et l'ensemble du contrôle est retenu. Toujours à propos de l'appelant, sans paramètre memberId, contrairement à la disponibilité les critères d'évaluation à côté - le fait qu'un collègue présente quelque chose est un fait concernant la liste et vit déjà sur le type. Aucun droit n'est requis: il divulgue Seules les sessions de l'organisation nomment la personne qui demande. Rétréci à PublicWebinarTypeDTO plutôt que WebinarTypeDTO, qui porte le le reste de la liste des présentateurs, y compris les adresses électroniques de ses collègues. Titre et la longueur est ce qu'un "vous pouvez être réservé pour héberger ces besoins" d'explication.

  17. · kamo-shared-library

    Trouver les types qu'un membre présente, et entrez-garde les questions

    Le calendrier doit répondre à une question avant d'offrir une disponibilité. couche: déclare-t-elle que des heures ont un sens pour cette personne? Personne n'est présentateur par par défaut, et heures déclarées par un membre aucune liste de type ne peut jamais être réservée. Les deux états records sont vérifiés. Un type de webinaire à démoillé conserve son présentateur rangées, donc tester uniquement la ligne de présence garderait la couche en vie pour quelqu'un dont la seule session a été retirée il y a des mois. WebinarQueryParseTest est l'autre moitié. Une chaîne JPQL n'est pas vérifiée par le Le compilateur et Spring Data valide une requête annotée lorsqu'il CONDURE DE L'ÉTÉ REPOSITORY BEAN, donc un chemin la cartographie n'a pas de compilations, de navires, et puis Metsyer MediaService à partir du tout - un déploiement de bouillonnement plutôt qu'un une requête qui ne rend rien. Le harnais est le seul ClinicalQueryParseTest les utilisations déjà, pointées sur le paquet webinaire; les métadonnées sont intégrées sur chaque une entité de la bibliothèque parce qu'un présentateur pointe sur un membre de l'équipe, qui pointe dans une organisation, et aucune base de données n'est touchée. Vérifié en fait attrape un mauvaise voie avant de s'appuyer sur lui: casser un échoue dans la construction avec l'attribut et l'entité nommée.

  18. · MediaService

    Parlez à un membre d'un webinaire réservé en son nom

    Non fermé sur un webinaire à droite, contrairement aux guichets: le cas est présent car il s'agit d'un membre où le membre n'a pas pris de mesures, ce qui exige le droit de demander un webinaire garderait le silence exactement les gens qui ont besoin de le dire. Mise à jour également de l'appel de constructeur de SupportControllerClaimTest, qui s'est brisé lorsque SupportContoller a gagné la dépendance WebinarAttendeeRepository.

  19. · kamo-internal

    La nouvelle organisation s'ouvre dans son propre onglet

    Création d'un cet onglet signé, donc un membre qui a créé une organisation sur quelqu'un Le compte d'un tel choix a été déplacé de celui dans lequel ils travaillaient - et ont dû le reconnecter. La clé à usage unique est passée dans un nouvel onglet maintenant et celui-ci revient à /network, où le nouveau l'organisation est listée. Même séquence Enter déjà utilisée: l'onglet est revendiqué de manière synchrone à l'intérieur du clic, avant tout en attente, ou Safari le traite comme un pop-up l'utilisateur Jamais demandé; et sa sessionStorage est d'abord effacé, parce qu'une fenêtre de même origine. clone ce tablet, qui maintient la session pour l'orge restante. Retourne à dépenser la clé ici quand les pop-ups sont purement et simplement bloqués - mieux que l'échouer le membre avec un qui expire en secondes - et ferme l'onglet revendiqué sur tout chemin qui a Rien à montrer dedans.

  20. · MediaService

    Compter les rapports de bogues non examinés pour les administrateurs de plates-formes

    zéro pour un appelant non râpé plutôt qu'un 403: la nav pollue ceci sur chaque page charge pour chaque membre, et une erreur qu'ils doivent systématiquement avaler est la réalité les erreurs sont ignorées.

  21. · MediaService

    Router les instantanés non lus sur leur propre thème STOMP

    Tout sur voip. le son d'arrivée et ouvre une fenêtre d'outil pour chaque cadre. Un badge rafraîchissant là-bas nait et ferait sauter une fenêtre à chaque fois qu'un compte coché.

  22. · MediaService

    Actualiser les badges non lus lorsqu'un message de visiteur atterrit

    persistAbound annonce son propre message (publishRealtimeEvent-false, donc a la réponse du visiteur ne rend pas le propriétaire), et ce faisant également sauté le chemin de sauvegarde ordinaire est diffusé. Le compte était juste sur un chargement de la page puis jamais déplacé.

  23. · kamo-internal

    Écrire, signer et modifier une note de visite

    Le compositeur change de forme une fois qu'une note est signée, et c'est l'ensemble conception. Avant la signature, il s'agit d'une zone de texte qui économise automatiquement. Après signature le domaine de texte est GONE et les seuls moyens sont un additif ou un modification - parce qu'une note signée est un dossier légal, et une case d'édition en une seule invite exactement la chose qui rend un graphique indéfendable: un enregistrement qui ne peut pas montrer ce qu'il disait n'est pas corrigé, il est modifié. L'attestation est indiquée intégralement avant Sign, et non derrière une infobulle. A La signature sur le texte que le signataire ne lit jamais ne vaut rien. Le projet est écrasé vers le serveur en premier, parce que la signature d'une note dont les quatre dernières secondes n'est jamais arrivé atteste que le texte du procès-verbal n'a pas. Les trois types d'amendements sont choisis explicitement avec leurs conséquences. écrit à côté de chacun d'eux. Un addendum laisse la note en qualité d'amendement; un amendement le corrige et conserve l'original lisible; un amendement du patient de 164,526 euros enregistre un désaccord qui entre dans le dossier, que le clinicien ou non sont d'accord. Il s'agit d'instruments juridiques différents et l'UI le dit à la moment du choix plutôt que dans une page d'aide. Autosave écrit une nouvelle VERSION plutôt que la annulation, y compris pour les projets, et la liste des versions montre les versions remplacées - c'est ce qui permet une correction doit être présentée sous la forme d'une correction. Il économise également sur un monte: a Un clinicien qui navigue au milieu de la phrase a perdu cette peine autrement, Et ils ne le taperont pas à nouveau de la même manière. Le jury de visites rend le "carte ouvert" et "l'écran fermé" comme étant différent. États-Unis, parce qu'il s'agit de faits différents, généralement à des jours d'intervalle. Partout d'autre cas une visite terminée et une visite dont la documentation n'a jamais été complète identique, c'est précisément la raison pour laquelle les pratiques portent des semaines de non-fermeture les rencontres sans s'en apercevoir. La fermeture refuse alors qu'une note n'est pas signée, et le texte de refus du serveur est indiqué tel qu'il est: il désigne la raison, et un « ne pouvait pas fermer » générique enverrait le clinicien à la mauvaise place. Les caillots rendent dans la zone MEMBRE via l'utilisationFormatters, pas la le navigateur. Un clinicien qui couvre une pratique dans un autre État constate que l'horloge de la pratique partout ailleurs dans cette application, et un gain de temps qui n'est pas d'accord avec la signature de la note comme un bug plutôt qu'un fuseau horaire. L'onglet de visite ne s'ouvre que lorsqu'elle est ouverte: elle charge l'ensemble d'un patient l'historique de la documentation, et payer pour cela sur chaque graphique ouvert rend le les cas fréquents ralentissent pour les besoins peu fréquents.

  24. · SecurityService

    La visite et sa documentation - la boucle une pratique sur

    Commencer une visite est ce qui accorde le graphique au clinicien, et c'est le la conception plutôt qu'un effet secondaire. Un clinicien sur le point de voir un patient n'a pas avec eux jusqu'à ce que la visite commence, et nécessitant un L'administrateur d'accorder un administrateur rendrait le système inutilisable. Donc la mise en place d'un patient écrit une relation de soins à durée limitée, et le dossier de CareRelationship Pourquoi quelqu'un pourrait ouvrir un tableau est la visite elle-même - une bien meilleure réponse au cours de l'audit que "un administrateur qui l'a accordé" sans date. Qui que ce soit se trouve également dans les locaux: un assistant médical prenant des éléments de santé est en train de faire le travail clinique et a exactement autant d'affaires dans le dossier, pour exactement aussi longtemps. Et il EXPOSE, parce que le but d'une relation est qu'il Fins - un clinicien qui a vu quelqu'un une fois en 2019 n'est pas encore dans leur Graphique. Le départ est idempotent. Deux personnes qui cliquent sur "retour de début" sont ordinaires, et deux rencontres pour une visite divisent la note de la charge. La fin d'une visite et la clôture d'un tableau sont des actes distincts, généralement des jours d'intervalle: le patient sortant est clinique, le tableau étant complet est administratif, et une pratique avec une semaine de rencontres ouvertes a une problème de flux de travail que rien d'autre ne fait surface. REFUTS DE Clair n'est pas signé - un graphique fermé avec une note non signée est une visite qui regarde documenté et non, et il ne peut pas non plus être facturé, parce que la note est ce qui justifie la réclamation. Le laisser fermer se cache les deux derrière un vert tiques. Les notes ne sont jamais éditées. Chaque changement écrit une nouvelle version et la précédente on reste rendu rendu possible, y compris pour les projets non signés: "qu'est-ce que cela a dit avant que le scribe ambiant ne le réécrite" est une question que les gens posent, et le le coût de la réponse est une ligne. Signing écrit une nouvelle version plutôt que estamper le courant, parce que le tableau de version "PreUpdate" est lancé. Trois refus encodent qui peuvent faire quoi. Seul l'auteur signe - signature La note de quelqu'un d'autre leur attribue son jugement clinique sous votre les références. Seuls les contresignes du superviseur nommés. Et un auteur ne peut pas contresigner leur propre note: il ne s'agit pas d'une surveillance, et d'incident la facturation de la surveillance est ce qui rend la réclamation valide, de sorte qu'un auto-cosign est une fausse déclaration sur qui a supervisé les soins. Les types d'amendement ne sont pas interchangeables et l'API refuse d'en ne pas être incorrecte. Une ADDENDUM ajoute et note la note; un AMPETEMENT correct et a besoin d'un raison, avec l'original conservé et pointé; a un désaccord de 164,526 dollars. Un enregistrement qui ne peut pas montrer ce qu'il appliquait disent qu'il n'est pas corrigé, qu'il est modifié. 1269 tests verts.

  25. · kamo-shared-library

    Ajouter la table Stripe webhook dedupe, mise à l'accord par compte et événement

  26. · SecurityService

    Le critère d'évaluation FHIR R4, avec les mêmes règles d'accès que le graphique

    Un point d'entrée sur l'interopérabilité est celui où un système est le plus susceptible d'acquérir un trempe tranquille: c'est machine-à-machine, personne ne la regarde, et "le l'intégration en a besoin" est une phrase convaincante. Celui-ci n'obtient pas un rosée. Chaque lecture passe par ClinicalAccessService exactement comme le écran graphique - une relation de soins avec le patient spécifique, pas seulement une relation de soins session - et écrit les mêmes lignes d'audit par dossier. Trois refus sont délibérés. Le patient est REQUIS sur chaque recherche, mais le patient lui-même. Une recherche sans c'est une question à travers l'ensemble du dossier clinique de la pratique, qui est un exportations: une autorisation différente, une forme d'audit différente et une autre conversation avec un agent de contrôle de la conformité. L'accès en gros appartient à l'exportation où il peut être traité comme ce qu'il est. Un livre nié et un compte rendu manquant répondent au même score 404, et un dossier refusé SEARCH répond à un ensemble de recherche vide plutôt qu'à une erreur - sinon le résultat count est un oracle un appelant peut marcher sur l'espace d'identification avec, apprentissage lequel une pratique des patients a. Les ressources du compartiment décident de l'accès au propriétaire du procès-verbal, jamais le compte rendu lui-même. Décider sur la ressource seule permettrait à quiconque Suppose qu'une observation irait lue un. «Toutes les casquettes de tous les types de tous les types avec les listes critiques pour la sécurité en premier» allergies, problèmes, médicaments, vaccinations - donc un patient avec quarante Mille observations ne peuvent pas sortir leurs allergies de la réponse. Que l'ordre est la différence entre un enregistrement tronqué qui est toujours sûr prescrivent contre et un contre-le-y qui ne l'est pas. La déclaration de capacité est le seul manipulateur délibérément public, autorisé NOM dans EhrEndpointGuardTest plutôt que par un modèle, avec deux tests autour de l'exemption: on affirme que le manipulateur ne touche aucune donnée patient, l'affirmant l'liste de permis nomme un gestionnaire qui existe toujours - un l'exemption pour un manipulateur renommé est un trou qui attend d'être hérité par Quoi qu'il en soit, il tire son nom. Les erreurs sont OperationOutcomes plutôt que nue JSON, parce qu'un client FHIR analyse le corps en tant que ressource quel que soit le code d'état: le faire "erreur": "..." produit une défaillance d'analyse au-dessus de ce qui a mal tourné, et la vraie raison n'atteint jamais un humain. le but de l'utilisation par défaut de TRAITEMENT ici et seulement ici. Les écrans du graphique l'exiger, mais un client FHIR est une machine qui ne sera pas mise à jour pour envoyer un paramètre spécifique à Kamo, et le traitement est le défaut prudent 164,528 dollars l'exclut de la comptabilité, donc une requête de paiement mal étiquetée sous-déclaration plutôt que sur la déclaration à un patient sur les informations Cela ne s'est jamais produit. 1243 tests verts.

  27. · kamo-internal

    Convertir n'importe quel logo en vecteur, et dire ce que le balayage a trouvé par étape

    Trois choses, toutes rapportées par le magicien lui-même. LE LOGO COMPACT NON DEMANDS LONGUER UN SVG. Le créneau ne peut stocker qu'un vecteur -- le backend l'écrit à une clé fixe logo.svg -- mais la première découpe a transformé cette règle de stockage en le problème du membre et a caché un Le logo de l'entreprise d'eux parce qu'il s'est avéré qu'il s'agissait d'une PNG. La plupart des sites n'ont pas de SVG nulle part, de sorte que le rail compact était vide sur exactement les sites le scanner a fonctionné le mieux. app/lib/logoVectorize.ts achemine chaque fichier sur le chemin le moins cher qui fonctionne, comme le fait le comportement et le marquage déjà: un SVG se lance directement; .eps/.ai/.pdf convertir côté serveur sans dialogue, puisqu'ils sont déjà contenir des chemins et demander à un humain à leur sujet serait un théâtre; une trame Inaugure ImageToSVGConverter de Kamo, car le traçage n'a besoin que d'un choix. l'individu peut faire. Les versions téléchargeantes et les suggestions de scannage prennent la même route. LE BANNER MAINTENANT PARVOIR EST À UNE ÉTAPE. Il a l'habitude de réciter l'ensemble du scanner partout, donc l'étape Backgrounds a dit "avoir 6 logos et marque couleurs" -- ni l'un ni l'autre n'est offert là-bas -- alors que la seule chose elle est à peu près né et sa grille vide a été lue comme un bug. Chaque étape maintenant rapporte sa propre découverte, y compris rien: "pourrait ne pas trouver d'images grandes Assez pour un fond plein écran. Ajoutez les vôtres ci-dessous. " Il désigne le tester les images en panne, parce qu'une "rien n'a trouvé" sur un site le Un membre sait que c'est plein de photographies comme nous n'avons pas regardé. WHITE-LABEL LOGOS S'ÉDÉRIENT SANS NOM LOGARE, comme dans cette rubrique une description propre toujours revendiquée. "Là où chaque logo apparaît" s'en va aussi: contrôle dans celui-ci est une basculement Company-vs-White-label, donc sans marque a une réponse valide, et trois déroulations qui ne peuvent pas être significatives changement implique une décision que le membre n'a pas à prendre. Disparition de la Le nom du logiciel permet également de récupérer ces valeurs à la SOCIÉTÉ -- les traces d'escalier les contrôles dans cet état, donc un LOGizarrifute ne pourrait jamais être défait. Enlève également la génération de fond d'IA dépréciée: la colonne de l'étape, ses gestionnaires et blob-URL, générerBackgrounds, l'aiPrompt et l'itinéraire /api/gener-domaine-domaine.

  28. · kamo-shared-library

    Rend le graphique sous le nom de US Core FHIR R4

    Le constructeur JSON est roulé à la main plutôt qu'un Jackson ObjectMapper, et C'est une cicatrice plutôt qu'une préférence. Cette plate-forme est un navire mondial. Sériticaire long--String sur certains cartographes et pas sur d'autres; ajouter un à Le mappeur de SecurityService a produit 401s sur l'ensemble de la plate-forme, et les identifiants Le fait de laisser les citations ont complètement brisé un regex à narration à narration ailleurs. Un FHIR la charge utile a exactement une forme correcte, et elle ne doit pas changer parce que Une personne a enregistré un module pour une raison sans rapport, trois services. Les nuls sont omis, et non émis. FHIR n'a pas d'élément présent et nénudé: "Date de naissance": nul est invalide contre la spécification, et une clause stricte le récepteur rejette l'ensemble de la ressource sur elle. Les caractères de contrôle sont échappés plutôt que de tomber, parce que le texte clinique libre arrive à partir de scanners et faxes et suppression silencieusement d'une octet de la note d'un clinicien est pire que le transmettre maladroitement. Les statuts portent leur système. Un récepteur correspond à la paire (système, code), et "actif" seul pourrait être l'état clinique d'une maladie, une allergie ou une couverture - trois ensembles de valeurs différents. Un code n'est pas partiellement utile: le récepteur le laisse tomber ou devine. Trois rendus encodent des faits faciles à perdre et impossibles à perdre récupérer de l'autre côté: - "Aucune allergie connue" est une déclaration POSITIVE avec son propre concept SNOMED (716186003). L'envoi d'une liste d'allergies vides dit à la place "personne demandé", qui est un fait clinique complètement différent, et le récepteur doit alors prescrivent comme si la question était ouverte. - MedicationRequest.intention distingue une proposition d'une ordonnance, et rapportBoolean dit que cette pratique ne l'a pas écrite, sans laquelle un récepteur nous attribue chaque médicament sur la liste, y compris les patient nous en a simplement parlé. - Statut de la vaccinationResente à une dose non-faite est ce qui distingue un patient qui décodrtige d'un patient que personne ne demande. Seule la seconde est un l'écart de soins, de leur côté autant que le nôtre. La race et l'appartenance ethnique se répètent comme des extensions de base américaines plutôt qu'une seule valeur, parce qu'une personne peut être plus d'une race et une seule corde Un modèle efface exactement les patients multiraciales de l'obligation de déclaration existe à compter. Un sexe administratif hors de portée est "autre" plutôt que comme lui-même: un code invalide échoue à la validation au niveau du récepteur et prend la ressource ENTRE L'AIDE, de sorte qu'une valeur inattendue coûterait le coût L'ensemble du dossier du patient au lieu d'un seul champ. Un patient fusionné toujours rend, avec link.type - remplacé - répond à un détenteur légitime d'un Un ancien identifiant que l'enregistrement n'a jamais existé transforme une fusion en perte de données de leur côté. valeur(x) émet exactement un élément. L'émission de deux rend la ressource invalide Et un récepteur strict rejette tout cela, donc "envoyer les deux et laissez-les choisir" coûte entièrement l'observation. Les erreurs sont les COMmensants, et leurs diagnostics ne portent pas sur PHI: a le résultat est fréquemment enregistré par le destinataire, et le nom d'un patient dans un un message d'erreur est une divulgation à quiconque lit ses journaux. 1890 test vert.

  29. · kamo-internal

    Jours de travail, jours de week-end et tous les jours dans le champ de la journée

    Déclarer les mêmes heures cinq fois plus était la seule façon de dire "Je suis présent sur jours de semaine. Le champ de la journée offre désormais les trois groupes au-delà des jours individuels. Une fenêtre stocke exactement UN jour et il n'y a pas de critère d'évaluation en vrac, donc un groupe est un Composer la commodité dans l'éditeur: il sauve une fenêtre par jour, et ce qui atterrit dans le tableau, on trouve des lignes ordinaires par jour. C'est délibéré plutôt qu'un nouveau le concept backend - "weekdays, mais pas Wednesday" reste expressable, mais pas le mercredi du mois prochain, Et chaque lecteur existant d'une fenêtre n'est pas touché. Trois choses que l'expansion doit bien faire, donc la décision vit dans app/lib/disilabilityDays.ts où il est testé plutôt que sous la forme: - Une édition ne doit jamais s'étendre. C'est une ligne derrière un bouton étiqueté Update, et le transformer en une semaine serait l'erreur coûteuse. Groupes sont Retiré du menu pendant l'édition, et daysToSave refuse d'en élargir un Quoi qu'il en soit. - Un groupe ne doit pas s'effondrer tranquillement à un jour, ce qui est la même erreur en l'autre direction - il déclarerait une fraction de la disponibilité demandée car et ressemblez à ça que ça a marché. - Les jours déjà portant une fenêtre identique sont abandonnés, donc chaque jour sur un la semaine de travail existante ajoute le week-end plutôt qu'un deuxième exemplaire des cinq déjà là-bas. Seule une correspondance exacte est sautée; les fenêtres se chevauchant à d'autres les temps sont légitimes et laissés seuls. Les sentinelles sont préfixées de sorte qu'elles ne peuvent jamais être confondues avec un nom de jour et A publié en tant que l'un d'un le filtre de l'agent de la grille de plomb s'est fait connaître plus d'informations sur le point de l'état d'avancement du fil de l' les épingles d'essai. Sauver plusieurs fenêtres signifie une défaillance partielle est maintenant possible, de sorte que les jours sont nommés et la liste est rechargée dans les deux sens: ceux qui ont fait des économies sont réels, et une forme qui les montre encore comme non sauvegardées inviterait une seconde tenter de les faire doubler.

  30. · kamo-internal

    La surface commerciale d'un marché des soins de santé est son cycle de recettes

    Les autres verticales affichent des ordres et des accords parce que c'est là où ils L'argent l'est. L'argent d'une pratique médicale est en réclamation - et en particulier dans la que rien d'autre ne le mentionnerait plus jamais. Les réclamations rejetées conduisent à l'écran et que l'ordre est tout son argument. A demander qu'une chambre de compensation rejetée n'a jamais atteint le payeur, il n'est donc pas signalement de refus; il n'a jamais été payé, il n'est donc pas en rapport de paiement; sa situation a changé une fois, il y a des semaines, et puis rien. Le dépôt en temps voulu est le deuxième parce que c'est le seul délai absolu dans le cycle: après, l'argent a disparu en permanence sans appel, et les pratiques le découvrent généralement des mois plus tard. Les procédures non chargées sont les dernières et sont les plus calmes de toutes, parce que l'échec est une ligne qui n'a jamais été écrite. Les rendez-vous et les rencontres n'apparaissent délibérément PAS ici. Ils vivent dans / les patients, où les règles de la relation de soins sont - un échéancier établi sur une L'écran de commerce serait une surface de carte sans contrôle d'accès d'un graphique. Le vocabulaire reflète le Java: un rendez-vous est l'INTENT, un créneau de créneau et peut ne pas garder; l'ENCOUNTER est l'engagement, la visite qui c'est arrivé et la question d'une réclamation est facturée. Appeler les deux "nominations" Perd le nombre de tout autre nombre dépend. Les caloéchantillons des formateurs des patients passent maintenant par l'intermédiaireServerDate. Le les tableaux cliniques sont TIMESTAMPT, donc ces valeurs portent un décalage, mais les le reste de cette plate-forme envoie LocalDateTime sans aucun - un analyseur syntaxique qui est Le droit pour les deux reste juste lorsqu'une charge utile change de forme en dessous. 3033 tests verts, typecheck clean.

Votre univers vous attend.

Commencez gratuitement en quelques minutes. Ajoutez des produits quand vous êtes prêt. Pas de migration, pas de nouvelles connexions.

Gratuit pour toujours — aucune carte de crédit requise