Changelog
Ce qui est nouveau.
Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.
· kamo-internal
Scénarios d'auteur dans les paramètres CRM, lisez-les sur un appel
Deux onglets de réglages CRM derrière MANAGE-SALES-SCRIPTS - les scripts live et le archive - plus un onglet des scripts de vente dans le Centre d'Interaction derrière VOIR-SALES-SCRIPTS, et une épingle qui maintient le Centre d'Interaction ouvert. Le READER est un TÉLÉPROMPATEUR, PAS UN DOCUMENT. La seule question qui compte Alors que quelqu'un parle à un client, c'est "Où suis-je", donc un progrès de la colonne vertébrale s'écoule vers le bas de la pile de blocs et se remplit au fur et à mesure que les parties sont cochées, la partie suivante non lue est soulevé à plein contraste tandis que les lires s'éloignent, et le fait de cocher un rouleau suivant en place. Un script est vraiment une séquence lue de haut en bas une fois, qui est ce qui permet de bénéficier du traitement séquentiel. Tout le reste à la surface est Il est resté silencieux pour qu'une chose puisse le porter. Le compositeur reflète la même colonne vertébrale, donc un auteur regarde la forme que l'agent verra plutôt qu'à un formulaire qui le produit. Lecture-progrès et l'épingle en direct en sessionStorage: ils survivent à un rechargement dans la languette dans laquelle le membre travaille, ne les suivez pas dans une deuxième maniement d'onglets un appel différent, et sont supprimés lors de la mise sous l'anglais ' app/logout', c'est déjà fait un gros sessionStorage.clear(), donc ni l'un ni l'autre n'a besoin d'être déroulés. Chaque accesseur est emballé, parce que sessionStorage THROWS plutôt que de rendre nul dans un profil durci, et ce code s'exécute à l'intérieur du chrome à l'échelle de l'application. La porte d'ouverture de NavTop s'élargit uniquement à l'accès au chat aux scripts de vente de OU de chat. C'est devait: un agent CRM sur un OG sans l'application Chat ne pouvait pas atteindre le Interaction Center du tout, donc l'onglet des scripts de vente aurait été invisible pour C'est exactement ce pour qui c'est. Chaque languette à l'intérieur porte toujours sa propre porte. Le compositeur prend sa "rien changé encore" de référence un macrotâche après le chargement plutôt que des valeurs qu'il a ensemencées. Lexical reformlorise un document lorsqu'il le charge - équivalent JSON, rarement identique - donc en comparaison avec le La chaîne du serveur a rapporté chaque script nouvellement ouvert tel qu'il a été édité et invité « laisser sans sauver ? » sur le chemin de la sortie d'un personne n'avait touché. Les blocs qui n'ont ni un en-tête ni un texte ne sont supprimés. Un auteur qui ajout un et déplacé ne signifiait pas publier une marche vide, et le lecteur rendrait une case à cocher contre rien. Les deux nouvelles cartes d'atterrissage se joignent à ActiveMarkets et canManageScripts les dépendances de la note de la carte. Les deux s'installent de manière asynchrone, donc sans eux Un mémo a été construit alors que les deux étaient faux et jamais reconstruits. Les quatre marchés Les cartes CRM ci-dessus reposaient déjà sur d'autres changements de dépendance dans le temps; Le nomm aActiveMarkets les fixe en passant.
· KBService
Servir les scripts par un agent lise sur un appel
/api/kb/sales-scripts, sur les deux nouveaux droits. Lectures prendre VISEW-SALES-SCRIPTS ou MANAGE-SALES-SCRIPTS, écrit take MANAGE. SessionHelper.hasRight échoue, ce qui est ce que chaque porte dans ce service dépend de. Ici plutôt que dans SecurityService parce qu'APIService avance déjà /api/kb/- à ce service en gros, la fonctionnalité n'a pas besoin d'un changement de passerelle, et parce que donotmodify.dao.repos est dans cette application La recherche d'un script par le marché du plomb est une requête locale plutôt qu'un appel interservices. Le point d'extrémité de la liste renvoie les résumés avec un bloc COUNT et aucun corps sans bloc. A la liste des paramètres d'une douzaine de scripts n'a pas l'utilité d'une douzaine de documents Lexical complets. et les comptes proviennent d'une requête groupée plutôt que d'une par ligne et la forme Cela a rendu / conduit suffisamment lentement pour être signalé comme une panne. L'EIT/marchés existe afin que le Centre d'Interaction puisse dessiner son sous-bobulaire en un seul Appel. L'alternative était de chercher tous les marchés et tous les scripts et les recouper dans le navigateur: deux allers-retours et une charge utile de script les organes chargés de répondre à une question sur les ids.
· kamo-shared-library
Le script par un membre lit sur un appel, en tant que blocs ordonnés
Deux tableaux et deux droits. Les VENTES-SCRIPTS pend d'un marché en tête d'eau LeadVendor le fait; SALES-SCRIPT-BLOCKS contient les pièces, chacune une lexicale document plus le texte aplati les prévisualisations et l'estimation du temps de lecture lise. Les blocs sont des lignes plutôt qu'un tableau JSON sur le script parce que l'identifiant d'un bloc est sur quoi la lecture en cours d'un membre est mis en jeu. En tant que tableau, la position serait la uniquement l'identité disponible, de sorte qu'un auteur insérant un paragraphe près du haut serait changeant silencieusement la place de tout le monde dans le script. Avec des ids stables, la formulation peut être réécrits et les blocs réordonnés alors que chaque agent à moyen terme garde le les tiques qu'ils ont déjà fabriquées - c'est pourquoi - préserve l'identifiant de tout bloc la charge utile laisse toujours les noms, et pourquoi le test pour elle est le premier du dossier. Saving est un PLAQUET FULL: les blocs portant une mise à jour id en place, les blocs sans on crée l'une, et bloque la charge utile omets sont DÉLÉTÉS. Déclaré sur le DTO et couvert par un test, parce qu'un appelant en supposant par ailleurs perd des données avec Rien à montrer pour elle - le même contrat, et le même piège, comme Contexte/engagement. L'omission des «blocs» est entièrement le cas séparé et sûr qui Lets un renom les laisser tranquilles. VOIR-SALES-SCRIPTS (300) est une racine: la lecture de la hauteur n'est pas sous-entendue par aucun d'un autre droit, et encore moins de VOIELE, depuis le stagiaire qui apprend l'écriture avant qu'on se livre à un plomb, c'est exactement à qui la subvention est destinée. GESTION (301) pendus afin que l'auteur ne puisse être accordé sans la possibilité de lire ce qui est en train d'être Il est écrit, et révoquer la lecture prend l'écriture avec elle. Les deux noms ServiceType.CRM, qui est ce qui les met dans le groupe de sécurité CRM permissionGroupTree dérive des groupes de serviceType, donc aucune édition de groupe n'est nécessaire et un droit en aucun groupe ne peut être accordé du tout.
· DocsService
Remplissez un rectangle, honorez l'opacité d'un point culminant, et caviardez
Trois choses sur la façon dont un document préparé rend les marques du concepteur. Un rectangle a été dessiné comme un contour, de sorte que le poste de remplir un membre choisit maintenant pour couvrir Quelque chose n'est pas arrivé. Il remplit d'abord et frappe après, et seulement s'il est là est une bordure laissée pour dessiner - l'opacité appartient au remblai, et non à la frontière autour de lui. Un point de vue ignoré l'opacité que le concepteur a toujours sauvée et peinte tous les l'un à 30%. Et un rectangle marqué "supprimer le texte sous-marin" a maintenant son texte extrait par PdfRedactor plutôt que simplement couvert. Cela court avant que quoi que ce soit est tiré, Parce qu'il réécrit le flux de contenu de la page. Les annotations avancent également sur les opérations de la page, qui est un correctif dans leur propre droit: une annotation nomme sa page par index dans la DESIGN, et appliquerPageOperations Supprime les pages, donc chaque index a dépassé un index supprimé. Une marque dessinée par la suite atterri sur n'importe quelle page s'était déplacée dans ce créneau - qui pour une boîte de rédaction signifierait supprimer le texte sur la mauvaise page et laisser la bonne seule.
· ESigService
Mettre les annotations du concepteur dans le document signé
flatten() pages vierges appliquées, rotations, modificateurs, valeurs de champ, ordre de page et certificats. Il n'a jamais tiré les annotations. Un rectangle, un sursquet ou une flèche dessiné sur un modèle apparaissait dans le concepteur et dans le navigateur du signataire et Il n'y a tout simplement pas été livré. Pour un point de vue qui manque, c'est l'épanouissement. Pour le rectangle, un membre tire sur un numéro de compte bancaire c'est le contraire de ce qu'ils ont demandé, donc les cinq types sont tirés maintenant, après les valeurs de champ et avant les filigranes qui se trouvent au-dessus de l'ordre dans lequel le concepteur empile ses couches. Un rectangle marqué "supprimer le texte sous-marin" a également son texte extrait, par PdfRedactor, avant que quoi que ce soit est tiré: la rédaction réécrit la page propre flux de contenu, donc une marque estampillée en premier serait réécrit avec le texte il était destiné à survivre. Ni l'un ni l'autre ne lance - une rinçage qui échoue ne doit pas perdre une signature - et un échec est enregistré pour ce qu'il est, c'est-à-dire que le cas de la couverture les mots sont encore dans le dossier délivré.
· kamo-signer-monorepo
Dessiner un rectangle dans la vue du signataire
Le concepteur peut maintenant donner à un rectangle un remplissage et une opacité, ce qui est une membre couvre quelque chose vers le haut. Ce déronneur dessinait fill - "none", donc le signataire a vu un contour vide où un bloc solide était destiné à être - et sur un rectangle à actionner Ils auraient vu directement jusqu'à ce qui était retiré. Le remblai porte l'opacité et la frontière reste solide: évanouissement d'une bordure le long de la frontière Avec un bloc de 30 % le fait de le lire comme une erreur plutôt que comme un choix. Un rectangle Sans remplissageColor est le contour que chacun a été sauvé avant que cela ne tire encore.
· kamo-internal
Faites de l'outil rectangulaire quelque chose avec vous pouvez cacher des choses
L'outil rectangulaire a toujours été dans la barre d'outils d'annotation, mais il a dessiné un esquisse: fill-"non" dans chaque moteur de rendu. Il n'y avait rien pour cacher quoi que ce soit avec, pas d'opacité, et aucun moyen de toucher une forme à nouveau une fois qu'il a été dessiné - annotation la sélection était un code inaccessible, car la couche n'a pris que des événements de pointage pendant un outil de dessin était actif et le manipulateur de clics n'allait que lorsque l'outil de sélection C'était. Donc un rectangle a maintenant un remplissage, une opacité, une frontière qui ne peut être rien, et un changer qui dit que le texte en dessous doit être supprimé plutôt que couvert (le backend fait cette partie). Il arrive comme un bloc noir solide, parce que le recouvrement quelque chose qui se passe est ce que les gens vont pour qu'il fasse; le contour chaque rectangle Sauvegardée avant que cela n'ait encore été ce que ne signifie pas fillColor, donc aucun d'entre eux ne change. Le dessin est soit un geste: le faire glisser, soit cliquer une fois pour l'ancrer et à nouveau pour finir - une presse qui n'allait pas auparavant pour être rejetée comme trop petit pour être conservée, qui est exactement le geste qui commence maintenant. Évadez-le. Une fois dessiné il est sélectionné, avec huit poignées et un corps traînable, en utilisant le même serrage. et la cartographie page-espace comme un coin de champ manche de sorte que les deux se sentent de la même façon. Et parce qu'une annotation sélectionnée n'avait nulle part où aller, un panneau de propriétés vides utilisé pour glisser vers le haut; il en a maintenant un, avec les mêmes contrôles après coup. Les outils à deux points prennent tous le deuxième geste, pas seulement le rectangle, et les points forts obtiennent les poignées aussi - ils sont la même boîte en dessous.
· kamo-shared-library
PdfRedactor, donc un mot couvert est en fait parti
Un rectangle rempli dessiné sur un numéro de compte le cache de l'œil et de Rien d'autre: les glyphes restent dans le flux de contenu de la page, et un copier-coller ou un extracteur de texte les remet directement. Le concepteur de l'essign est sur le point d'offrir "retirer le texte en dessous" sur son outil rectangle, et c'est ce qui doit être C'est vrai pour que cela signifie quoi que ce soit. Chaque glyphe une page peinte est mesuré, et ceux qu'une région recouvrent sont abandonnées à partir du flux de jeton et remplacé par une avance TJ de la largeur exactement occupée - donc le reste de la ligne ne se déplace pas et tout le reste sur la page est en retour non touché. Le texte peint à l'intérieur d'une forme XObject ne peut pas être atteint de cette façon, parce que le Le flux symbolique de la page ne le contient pas. Donc le travail est vérifié par la suite en mesurant à nouveau les glyphes, et une page qui peint encore du texte à l'intérieur d'une région est refait sous la forme d'une image. Cette page perd son texte consultable, qui est un pauvre et est enregistré en tant qu'un seul - mais c'est la seule des deux options qui est pas une fuite silencieuse. PDFBox est déclaré facultatif de sorte qu'il n'atteint pas les vingt services qui n'ouvrez jamais de PDF; les deux qui déclarent déjà 3,03. eux-mêmes.
· kamo-internal
Lier les articles sur un projet de noms
La convention d'auteur doit désigner un article de frère et de sœur en inscrivant son titre dans italique - "Lire "Lire - Rôles de sécurité expliqués" avant de les construire. 181 envergures à travers les projets le font et rien ne les a jamais transformés en liens, donc un article indique au lecteur lequel aller lire et lui laisser trouver c'est ça. Il y a exactement un lien Markdown dans trois cents articles et il indique hors site. Il a également alimenté le bogue KB-link que l'assistant vient d'avoir. contentPlainText est ce qui s'incruste et ce que l'assistant est montré, et une italique dépouillée se lit comme prose, donc la liste de contrôle de configuration a atteint le modèle en nommant une douzaine d'articles sans la manière d'atteindre l'un d'entre eux. C'est gardé dans le service d'IA maintenant, mais une référence c'est un lien n'a pas besoin de garde. La résolution se produit à l'importation, contre la base de connaissances publiée, parce que l'adresse est un guidé et un guid appartient à une base de connaissances plutôt que sur les projets - les écrire dans les fichiers de contenu lierait l'aide centre d'une seule organisation. Il court sur l'arbre converti, où un La référence est déjà un noeud de texte en italique qui détient exactement le titre, qui conserve Markdown-to-lexical.mjs non touchés de sorte que les trois cents autres articles ne peuvent pas régresse. Seule une correspondance de titre exacte est liée, et les italiques font double service ici - 62 italiques Les gammes sont des étiquettes de l'interface utilisateur, des titres d'accentuation ou de questions et le maintien en l'état. Une article se nommant n'est pas une référence, le propre lien de l'auteur gagne toujours, et une deuxième course est un non-op. Vérifié par rapport à la base de connaissances en direct: 181 références, 119 distinctes destinations, 110 articles gagnant des liens, rien de non résolu.
· kamo-internal
Une commission d'installation sur un prix unique, et la suite sur sa propre ligne
Les frais d'installation n'existaient que sur les cotations multi-options, de sorte que le "prix unique" n'avait pas de boîte pour un sur le formulaire ou sur la page imprimée. Il est maintenant assis à côté de Shipping, apparaît dans le rail vivant et les impressions en tant que son propre total. Il est en dehors du passable Total, en miroirs QuoteTotals: un pourcentage de marchandises n'est pas un pourcentage du coût de leur installation. Une adresse est arrivée comme une corde raccordée à la virgule, donc "Suite 400" a couru dans la rue et la ville. L'unité est son propre domaine maintenant et obtient sa propre ligne, sous le sur le bloc de destinataire de la rue, sur les propres détails de l'en-tête du vendeur, et sur la carte d'adresse postale du plomb en mode visualisation, qui est le même l'adresse est lue avant qu'elle n'atteigne un devis.
· InitializerService
Commerce-quotes.setup-fee
Une redevance forfaitaire sur un devis qui présente un prix unique. La redevance déjà a existé sur QuoteOption, où chaque alternative porte sa propre; une feuille plate avait aucune possibilité d'en accrocher un, de sorte qu'il ne pouvait pas non plus enregistrer de frais d'installation. Nullable, donc l'ADD COLUMON est accepté sur une table peuplée et tous les La citation ne tient pas compte de ce qu'elle voulait dire: pas de colonne, pas de frais.
· kamo-shared-library
Une commission d'installation sur un prix unique, et la suite sur sa propre ligne
Deux choses, une citation ne peut pas dire. Une redevance unique de mise en place ne vivait que sur QuoteOption, où chaque alternative porte son qui s'approprient. Un bâche plat n'a pas la possibilité d'en accrocher un, de sorte qu'il ne peut pas enregistrer une configuration le fait de payer, c'est-à-dire que l'on appelle le passage de l'ensemble de la citation à Compare Options, qui modifie la manière dont le document lit pour le client. Quote.setup-fee est le équivalent de feuille fixe. Il se trouve à l'exception du sous-total réduit délibérément: a le pourcentage de celles-ci n'est pas un pourcentage de réduction du coût de leur installation. Une adresse a été assemblée en une corde raccordée à la virgule, donc 'Suite 400' a couru dans la rue et la ville. Ce n'est pas ainsi qu'une adresse est écrite, et sur une citation, C'est à quoi un client est censé poster un chèque. L'unité se déplace maintenant en tant que son champ de vie à la fois sur le bloc client et sur les propres coordonnées de l'orge, en laissant la page Libre de lui donner sa propre ligne. La colonne est annulable - chaque ligne écrite avant qu'elle n'ait pas de frais, et les moyens nuls néant, aucune valeur de la citation n'y apporte de variation.
· kamo-signer-monorepo
La suite sur sa propre ligne, et une commission d'installation sur un prix unique
Deux choses que la page imprimée ne pouvait pas dire. Une adresse est arrivée comme une corde raccordée à la virgule, donc "Suite 400" est entrée dans la rue et la ville - pas comment une adresse est écrite, et c'est la page un client Je ne s'attend pas à afficher un chèque contre. L'unité se déplace désormais comme son propre domaine et est imprimé sur sa propre ligne, sur le bloc destinataire et sur les propres coordonnées du vendeur. Les frais d'installation n'existaient que sur les cotations multi-options, de sorte qu'un prix unique pourrait être ne pas en indiquer un du tout; les modes de commutation pour enregistrer ont changé la façon dont l'ensemble du document Lit. Il a maintenant sa propre ligne totale, montrée uniquement lorsqu'il y en a une.
· InitializerService
Total des cotations stockées par le moteur de tarification
Les colonnes de monnaie de citation sont écrites, non calculées en lecture, donc les deux corrections qui a débarqué le 2026-09-02 - un prix à l'unité de mesure est un taux mensuel que le terme se multiplie, et un terme engagé vaut ce qu'il s'engage à laisser à chaque ligne existante porter l'ancienne arithmétique jusqu'à ce que quelque chose le sauve. Sur la citation qui a exposé c'est une option de trois ans stockée un mois d'elle-même. Appelle QuoteService.reprice, le même code qui évalue un devis à épargne, plutôt que la réexécution des règles monétaires dans SQL. Un remblai avec sa propre copie d'entre eux est une deuxième source de vérité et les deux dérivent le moment soit touché. Les citations terminales sont rapportées, jamais réécrites. Le total des états d'une citation ACCEPTE ce qu'un client a accepté à la figure qui lui a été indiquée; ce chiffre peut être tort, mais le corriger ici, il est simulé d'un document signé. Chacun est enregistrer avec sa valeur stockée et recalculée pour qu'une personne puisse décider. Idémpotent, et ordonné tard parce qu'il charge des entités.
· kamo-signer-monorepo
Imprimer la ligne complète sur le devis du client
Chaque ligne montrait un nom et un montant. Cela demande au client de prendre le la quantité, l'unité, le taux et toute réduction de confiance, et ne leur laisse rien de vérifier une facture ultérieure contre. Les cartes d'option impriment maintenant les mêmes colonnes que la feuille plate, et les deux gagnent un colonne de réduction: une réduction convenue appartient au document qui indique l'accord. Les lignes sans rabais montrent un tiret étouffé plutôt qu'un écart, donc a Une colonne d'entre eux se lit toujours comme délibéré. Correspond au changement de l'impression de kamo-internal, qui existe pour projeter ceci Les deux ne sont utiles qu'au personnel tant qu'ils sont d'accord.
· kamo-internal
Imprimer la ligne complète sur la citation, et arrêter de perdre du travail au commutateur de mode
Deux choses qu'une citation ne peut pas faire. Les éléments de la ligne imprimée à l'intérieur d'une carte d'option ont indiqué un nom et un montant, rien sinon - pas de quantité, pas d'étiquette unitaire, pas de taux, pas de réduction. Cela demande au client de prendre les quatre en fiducie et ne leur laisse rien pour vérifier une facture. Option Cartes imprime maintenant les mêmes colonnes que la feuille plate, et les deux gagnent une réduction colonne: une réduction qui a été convenue doit être visible sur le document qui: l'accord. Passage d'un "prix unique" à un seul prix" et d'une "options de comparaison" mené à bien un seul, et seulement lorsqu'il n'y a pas encore d'option. Retournement et dos donc jetés Tout ce qui avait été dactylographié dans n'importe quel point de vue était laissé pour compte. Les deux modes sont deux les vues de la même chose vendue, donc le commutateur le porte maintenant dans les deux sens; les options passées au-delà de la première sont des alternatives et sont laissées seules, puisque la feuille plate Il n'y a nulle part où les tenir. Le port est deux fonctions pures exportées plutôt que logique à l'intérieur d'un actionneur à clics, Donc le comportement qui était si si mal est maintenant le comportement à l'épreuve.
· kamo-internal
Rééditer un lien de partage à partir de sa ligne, et cesser de perdre l'URL à usage unique
La liste de liens de partage n'offrait aucun moyen de visualiser ou de copier un lien, et rien n'expliquait Pourquoi. Rien ne peut révéler un single existant - seul le jeton SHA-256 est stocké, de sorte que l'URL existe dans la réponse de la menthe et la boîte de réception du client et nulle part ailleurs. La réponse de l'architecture à un lien perdu est d'en frapper un autre, ce qui laisse le copie déjà envoyée en état de marche et révocable de manière indépendante; cette réponse n'était tout simplement pas accessibles à partir de l'interface utilisateur. Chaque ligne le porte maintenant: copiez un nouveau lien mesnts en silence et ouvre le dialogue de copie, Et là où la ligne nomme un destinataire, Email un nouveau lien l'envoie également. Les deux passent Un chemin doMint avec la création du dialogue lui-même, donc les trois ne peuvent pas dériver. Une légende dans la liste indique la contrainte au lieu de laisser le lecteur chasser pour une un bouton qui ne peut exister. Deux réparations plus importantes de la même plainte. Le dialogue URL unique était dédaignable par en arrière-plan, clic et évasion - un clic errant et le lien n'a pas été recouvrable; il n'obtient que par le biais de Done. Et la réponse de la menthe est le OUTCOME tandis que la demande est l'INTENT: demander un courriel et ne pas en recevoir un rendu le même "Lien créé." comme ne le demandait jamais. Les deux sont suivis séparément maintenant et un L'envoi raté dit le dit.
· RAGService
Résoudre les articles un nom de passage en cibles de liaison
Un article de pivot - "Setting Up Your Organization - A Checklist" est un article à laquelle il est possible de envoyer le lecteur à une douzaine d'autres, et nomme chacun d'eux en texte clair. L'éditeur ne stocke pas de nœuds de lien, donc les titres sont tous qui atteignent contentPlainText, qui est ce qui est intégré et ce que l'assistant est montré. Search puis retourna ce passage avec les chemins de la poignée de articles qui correspondaient à la requête vectorielle, et l'assistant, a dit de lier ce qu'il cite, mettre l'une de ces voies sur les douze recommandations. La réponse de recherche porte désormais linkablesArticles: les articles ces passages nom, résolu à de vrais guids, filtrés par le même public échelonner la recherche un filtre utilise - un article que l'assistant peut citer est un article qu'il peut relier. Un titre n'est égal à insérer que s'il est suffisamment précis pour désigner un seul article. "Chat", "Leads" et "Notes" sont des titres d'articles ici aussi et apparaissent en prose ordinaire constamment, donc la correspondance est limitée aux titres de trois mots et douze caractères, sur les limites des mots entiers. Le catalogue est réservé aux titres et drapeaux, Jamais le « corps de la Lob », et est mis en cache par org - cela court sur le chemin de recherche.
· kamo-internal
Demandez si les invités doivent être informés, et comment
L'ajout d'un invité à un événement ne lui a pas été dit, et le dialogue ne l'a jamais dit. Le Seule chose qui a jamais écrit à un invité était un rappel - qui parvient à un collègue dans l'application et atteint une adresse extérieure jamais - donc invitant un client à une réunion n'a contacté personne, et il n'y avait aucun contrôle qui n'aurait eu de contrôle. Une carte sous la liste des invités, sous la forme de la vie privée et des cartes de rappel se trouve entre: un commutateur, et deux puces de route sous celui-ci. L'interrupteur s'allume quand le premier invité arrive, une fois et jamais, parce qu'ajouter quelqu'un à un Rencontrer et ne pas leur dire est le résultat surprenant - et le faire revenir en arrière Il faut même s'en tenir alors que d'autres invités sont encore en train d'être ajoutés. La ligne récapitulative est la partie qui gagne la carte. Un invité extérieur n'a pas de conversation thread et pas de calendrier de Kamo; l'e-mail est la seule voie qui les atteint et c'est ce qui porte le fichier de calendrier. Changer les e-mails les brins, et rien d'autre dans l'interface le dirait. Éteindre la dernière route éteint le tout plutôt que de laisser un changement qui prétend inviter des gens pendant l'envoi Rien. Caché pour le rappel principal, qui possède son propre épargne dans SecurityService: envoyer un guide d'invitation à une réunion pour le moment où vous avez l'intention de les sonner n'est pas Qu'est-ce que la planification d'un rappel signifie. "Mettre à jour et notification" s'en va. Il a été affiché sur le point d'entrée du compositeur de courrier, qui empile sur son propre événement et refuse toute personne dont l'ORGANISATION-EMAIL n'est pas l'expéditeur a column qu'aucun événement calendaire n'a jamais fixé - et envoyé la liste des invités tel qu'il était quand le dialogue s'est ouvert, donc un éditeur qui a ajouté quelqu'un a averti tout le monde sauf lui. Il n'aurait jamais pu courir dans un cas: il a été fermé sur le participant.isOrganizer, qui la synchronisation de l'invité du calendrier écrit comme faux pour chaque ligne. Sauver maintenant fait le travail.
· InitializerService
Les colonnes qui laissent un événement inviter ses invités
Trois événements sur le calendrier, parce que la question de savoir si une réunion invite des personnes appartient à la plutôt que jusqu'au moment où il a été sauvegardé - un éditeur six semaines plus tard qui ajoute Un invité doit le savoir. Toute la durée par défaut du silence des événements existants: CalDAV, le ics l'importateur et le compositeur de rappels-volants écrivent tous par le même service et aucun n'est Il en est ainsi qu'offre ce choix. Deux sur calendar-event-attendees, à la fois nullable, et nul est la valeur porteuse: Cela signifie "jamais dit", qui est ce qu'est chaque rangé existant et ce que chaque invité ajouté par une édition ultérieure. Une valeur par défaut sur l'un ou l'autre rendrait la fonctionnalité entière ne rien faire silencieusement. Appliqué à la main au cluster, car KamoInitializerService n'est pas déployé.
· EmailService
Envoyer l'invitation à la réunion la liste d'invités implicite
Ajouter quelqu'un à la liste d'invités d'un événement ne lui a pas été dit. Un rappel à jamais a écrit à un invité, et un rappel parvient à un membre dans l'application et à une adresse extérieure donc un client invité à une réunion n'a jamais été contacté du tout, et un Un collègue a d'abord entendu parler de quinze minutes avant qu'il ne commence. EventInviteService s'exécute après les commits d'enregistrement, sur un fil asynchronisé. Après la Engagement parce qu'une invitation à une réunion dont la sauvegarde est alors en retard de retour ne peut être rappel; hors du fil parce qu'après l'engagement continue de courir avant que la réponse ne soit écrit, et cinquante conversations SMTP il ya cinquante secondes de spinner sur une sauvegarde qui a déjà réussi. Deux voies, et la différence entre eux est la raison pour laquelle il s'agit de deux contrôles. Le courrier électronique est la seule chose qui peut atteindre une adresse n'appartenant à personne ici, et elle porte la fixation ics - qui est l'ensemble du mécanisme par lequel une réunion a été organisée en Kamo atterrit sur le propre calendrier d'un invité extérieur. Le chat parvient à un collègue dans le fil qu'ils ont déjà avec l'organisateur, par le biais du même couple MediaService AlertChatService utilise, et saute un invité extérieur par construction: un fil de discussion Il y a donc deux membres, il n'y a donc personne à s'adresser. Qui est-ce qui vient de la rangée d'orgueilleux plutôt que de ce que le sauver insérés. Ne jamais dire signifie une invitation, chaque fois qu'elles ont été ajoutées. Derrière SEQUENCE signifie une mise à jour. Niveau signifie silence, donc corriger une faute de frappe n'envoie pas de courrier l'événement. mise à jour ne soulève la SÉQUENCE que lorsque la réunion elle-même s'est déplacée - le description est délibérément sortie, parce que c'est là que les agendas vont et envoient chaque Un invité par ligne entraînait la salle pour ignorer le courrier qui dit que l'heure a changé. Le compte rendu est écrit après qu'une voie a réussi, jamais auparavant: marquer avec optimisme transformerait un échec SMTP transitoire en un invité dont on pensait en permanence qu'il avait Il a été dit, qui est le silence que cela existe pour mettre fin. D'autre part, ORGANISER-EMAIL, à partir de la boîte aux lettres en cours d'envoi. Pas d'événement fait à travers le calendrier n'a jamais porté un, et un ics sans il ne peut pas être répondit à l'"acceptation" de l'invité n'a pas d'adresse. Suppression d'un événement qui Les personnes invitées le rétractent maintenant des invités qui ont été informés, et seulement de ceux-ci.
· kamo-shared-library
Laissez un événement inviter ses invités, et mettez-le sur leur calendrier
Sauver un événement ne le dit à personne. La liste des invités s'est concrétisée et le public a été matérialisé. rangés, et les gens qui s'y trouvaient n'entendirent rien jusqu'à ce qu'un rappel soit tiré, qui atteint un membre dans l'application et atteint une adresse extérieure jamais. Un membre pourrait donc inviter un client à une réunion, regarder le nom figurer sur la liste des invités, et le On ne dira tout simplement jamais au client. Un invité ne pouvait pas non plus voir la réunion. La visibilité a été décidée par la propriété le seul calendrier, donc un événement sur le calendrier de l'organisateur était invisible tous les intéressés y ont été invités. dans les Préférences du calendrier et une colonne derrière depuis ce écran expédié, et Rien ne l'a jamais lu. L'événement porte le choix - que ce soit d'inviter, et par e-mail, chat, ou les deux - parce qu'une édition six semaines plus tard qui ajoute un invité doit savoir s'il s'agit d'un une réunion qui invite les gens. La rame d'ors porte quand il a été dit pour la dernière fois et à que SEQUENCE, qui est ce qui fait "un invité ajouté plus tard reçoit une invitation à la même réunion" est correcte sur un nombre quelconque d'éditions: en la dérivant, d'une nature quelconque les lignes une sauvegarde insérée sont exactement une fois. Visibilité prime une branche invité par le biais d'une JOINTE GUELE explicite, fermée sur cette préférence via un membre id rien ne peut correspondre. Une ligne plutôt qu'une copie par invité: un RSVP, et un organisateur qui déplace la réunion pour tout le monde. Les JOINTSEURSEURS sont porteurs - le calendrier d'organisation n'a pas de propriété membre, donc une expression de chemin implicite chute chaque événement de société partagée, le Piéger findBusyForMember déjà documente.
· SecurityService
Une adresse de membre vous indique votre propre org, pas tous les org
Un membre qui signe avec la boîte aux lettres de l'organisation a marqué le primaire sur son membre les paramètres se sont vu offrir chaque espace de travail auquel leur compte utilisateur appartient. Le l'adresse n'existe qu'à l'intérieur d'une seule organisation et les boîtes aux lettres sont uniques sur (org-id, e-mail), pas à l'échelle mondiale - donc la signature avec elle est signée dans THERE. Le les autres espaces de travail du compte restent accessibles par le nom d'utilisateur du compte ou e-mail, qui est le cas d'un identifiant à l'échelle du compte. L'identifiant porte désormais un champ d'application. Un identifiant de compte le laisse vide et rien ne change; une adresse mailaire membre nomme l'orgue(s) qu'il est primaire, et cet ensemble est la seule chose que l'indicatif peut entrer. Rétrécissement de la liste, le tirage au sort est cosmétique seul: le choix revient à partir d'un navigateur, et le membre est généralement un véritable membre de l'autre les espaces de travail, donc la ré-réprimande de l'appartenance /session/sélectionner passerait. La restriction se trouve donc dans le jeton de sélection, dans Redis, où l'appelant n'est pas parvenu à et revient avec le jeton quand une faute transitoire le retourne, ou un ré-essai s'élargirait silencieusement en une connexion sans restriction. - PrimaryMailboxIdentityLookup: la recherche unscoped retourne les ids avec le identificateur id. Regrette toujours lorsque l'adresse nomme deux comptes différents; un le compte qui le détient dans deux de ses propres options offre les deux, et rien d'autre. - CredentialResult gains orgScope, vide signifiant illimité. - loginWithoutesolvedHost filtres entérisables par celui-ci (ne jamais enlever, donc une adhésion inactive continue de tomber), refuse un indice d'orgo à l'extérieur de celui-ci les mots qu'un mot de passe erroné obtient, et ne présélectionne plus un dernierorg-id le l'adresse ne peut pas atteindre. - OrgSelectTokenService stocke userId:orgIds; un utilisateur nu id d'un pod milieu Le déploiement glissant continue de décoder, en tant que libre. Une restriction illisible finit fermés. - SessionSelectLe Contrôleur refuse un org 403 hors du champ d'application et ne remet pas le jeton en retour - ce n'est pas une faute que le membre n'a pas causé. Le chemin du domaine personnalisé n'est pas touché: l'hôte nomme déjà un org.
· SecurityService
Appliquer la visibilité de la plate-forme et la laisser éditée
GET/PUT /api/security/reports/catalog, tous deux fermés sur MANAGE-REPORTS sur la plate-forme épine. La liste vient de l'ORTURE, pas du tableau d'annulation: un opérateur doit être en mesure de restreindre un rapport qui n'a pas encore de rang, qui est tout à fait signalé jusqu'à Quelqu'un en touche un. Le chèque lui-même est entré dans ReportScopeResolver.mayRun, dont le catalogue, le coureur, les cueilleurs, l'exportateur, la liste de vues sauvegardées et le calendrier balayent tous déjà croix. L'ajouter à chacun d'eux aurait été six chances pour l'un d'eux en désaccord - et celui qui n'était pas d'accord serait celui qui a montré un Rendre compte que la plate-forme était cachée. Il siège EN AVANT les propres droits du rapport, et Dieu ne le dépasse pas. Break glass élargit ce qu'un membre peut voir au sein de son organisation; il s'agit d'une question concernant quels sont les organisations qui ont un rapport pour le cas, et un dieu dans un locataire est toujours en ce locataire. ReportVisibilitéService échoue à OPEN, ce qui est le contraire de tout le reste ici et délibéré : un tableau d'exclusion illisible rendrait sinon chaque rapport sur la plate-forme disparaît, et les rapports en dessous sont toujours fermés par leurs propres droits et leur propre champ d'application. La perte de ce tableau coûte une restriction, pas une la divulgation. La mise en place de TOUTAORGS supprime la ligne plutôt que de stocker la valeur par défaut. Un rapport restreint met fin à ses horaires existants et l'exécution est enregistrée avec "le propriétaire de l'horaire n'a plus accès" - la même piste d'audit que la révocation Quelqu'un a raison, ce qui est la même chose qui se passe.
· kamo-internal
Décider de qui voit chaque rapport, de l'administration de la plate-forme
A Enregistre l'onglet "Configuration" de la console, gâchée par MANAGE-REPORTS Plateforme épine - qui est également, sans autre travail, une ligne dans les droits de gestion dialog, puisque ce dialogue rend le catalogue du serveur. Chaque rapport porte sur les navires de la plate-forme, regroupés par plieuse, chacun avec un contrôle à trois voies: toutes les organisations, l'organisation de la plate-forme uniquement, ou les administrateurs de la plate-forme uniquement. Chaque ligne montre également que le bon nécessaire à un membre dont un membre a encore besoin, car un opérateur restreignant un rapport devrait pouvoir voir qu'il est déjà fermé - la plupart n'ont besoin de rien ici, et d'une console qui se cacherait qui inviterait deux fois à restreindre les choses. Saves par ligne, avec optimisme. Un contrôle à trois sens qui attend lors d'un aller-retour se sent cassé, et le seul coût d'être faux est le bouton en arrière avec le raison. L'exemplaire fait attention à deux portes qui sonnent de la même manière. C'est l'extérieur: à l'intérieur une organisation un rapport a encore besoin du droit qui régit ses données, et les personnes sont toujours ne voir que les enregistrements qu'ils sont autorisés à faire. L'aide dit à haute voix que restreindre un Le rapport met fin à tout horaire déjà établi pour lui - un comportement correct, et le moins une conséquence décelable sur l'écran. Deux choses le type de système et un garde pris plutôt que de revoir: RIGHT-ICON est un Compréhension exhaustive, donc la nouvelle droite ne pouvait pas expédier sans un glyphe; et l'onglet avait pas de lien de menu d'administration de la plate-forme. Tous les onglets ont un, donc le garde maintenant l'exige - un onglet pouvant être joignable uniquement par quelqu'un qui sait déjà que la bande d'onglets est Il y a un onglet que personne ne trouve.
· kamo-internal
Donner au choix de la citation de facturation un écran sur lequel vivre
Le cadre à l'échelle générale décide si un devis est facturé à chaque période ou dans son intégralité D'avant, il existe sur OrgPOSConfig depuis un certain temps, et le critère d'évaluation qui écrit C'est aussi le cas. Le seul composant le rendant est importé par rien, donc aucun membre n'a jamais pu l'atteindre: le cadre n'a été configurable qu'en détachant la main à l'API. Les paramètres du commerce acquièrent un onglet de facturation des devis. Le panel ne porte que la facturation choix; l'autre moitié de cette composante orpheline, le type d'engagement, est déjà desservi par Marchés et champs sur cette même page. L'exemplaire est lu à partir de son espace de noms de message plutôt que dupliqué, puisqu'il est déjà traduit. Saving send back les types d'engagement exactement comme l'indique - le critère d'évaluation traite le activé list comme toute la vérité, donc en omettant qu'elle désactiverait chaque verticale l'organisation l'a fait.
· kamo-shared-library
Laissez la plate-forme décider qui peut voir chaque rapport
MANAGE-REPORTS, annexés à PlatformRightType, et une ligne de dérogation REPORT-CATALOG par rapport portant sur l'un des ALL-ORGS, PLATFORM-ORG-ONLY ou PLATFORM-ADMIN-ONLY. C'est une porte plus grossière que tout le reste dans le cadre et il se trouve devant d'entre eux: un rapport requis du droit décide ce qu'un membre voit à l'intérieur d'un locataire, et le champ d'application au niveau des lignes se rétrécit davantage. Celui-ci décide si le locataire est proposé le rapport, qui est la décision de la plate-forme plutôt que celle de l'organisation. Sur la plate-forme vertébrale délibérément. Un administrateur locataire peut éditer son propre modèles de sécurité, donc un type de rôle à droite ici permettrait à un client d'élargir un rapport La plate-forme avait restreint. Les trois paramètres sont des conditions INDÉPENDANTes, pas une échelle et une plate-forme admin à l'intérieur d'un locataire satisfait PLATFORM-ADMIN-ONLY et non PLATFORM-ORG-ONLY, et a membre de l'organisme de plate-forme qui n'est pas un administrateur satisfait l'inverse. Les lire comme un classement élargirait discrètement l'un des deux, et l'élargissement Cela ressemblerait à la fonctionnalité. Un rapport sans ligne est TOUTES-ORGS, ce que chaque rapport fait aujourd'hui - donc Le fait de commencer à vide changer rien en direct, et limiter un rapport reste un acte délibéré. Appliée à la fin du bon enum car getSortOrder() est ordinal(): un insertion renuméroterait la console. Les subventions sont stockées par nom, donc l'ajout ne change rien n'a déjà été accordé.
· kamo-signer-monorepo
Montrez l'intégralité du terme lorsque le vendeur facture d'avance
La carte a mené avec le taux récurrent indépendamment, donc un client signant un L'accord à payer à trois ans à la signature a vu un chiffre mensuel et un total distinct en dessous de celui-ci. Lorsque la citation dit que le terme est attendu à l'avant-garde, ce total est maintenant le le prix sur la carte et les sous-lignes qui la réaffirment sont supprimés. Lit une base manquante par période, donc rien ne change jusqu'à ce que l'API expédie le champ.
· kamo-internal
Diriger avec l'ensemble du terme lorsque la facture est à l'avant-garde
Une période d'exécution qui facture la durée de la procédure engagée à la signature a vu le taux mensuel sur son propres citations de trois ans. La citation porte maintenant la base dans laquelle elle a été soulevée, et la carte, le rail vivant et l'impression en prévisualisation de chaque plomb avec la figure qui demande en fait - l'ensemble du terme, appelé "due up tome", ou une période comme précédemment. Le choix est un aideur exporté, titre Montant, plutôt que le même ternaire en trois blocs JSX: ces surfaces ne doivent pas être en mesure de ne pas être d'accord sur les cas nombre est le prix. L'équivalent mensuel reste à côté de lui dans les deux sens, parce que c'est le seul chiffre sur lequel compare une option de trois ans et une option annuelle. Lectures indéfinies comme la valeur par défaut, donc cela rend exactement ce qu'il fait Aujourd'hui jusqu'à ce que le service de sécurité expédie le champ.
· InitializerService
Commerce-quotes-billing-basis
Le instantané per-quote de la citation de l'ordreConversionBilling choice, donc une citation conserve les conditions dans lesquelles il a été relevé après qu'un administrateur a modifié le réglage. Nullable - chaque ligne existante l'est avant, et la résolution nulle est de PREMIERE PREMIERE-PRESHUUS-SÉQUENCE, le comportement ces guillemets ont été envoyés sous-tête. Ordre(0) pour la raison habituelle: une fois partagé-lib cartographie la colonne, tout coureur qui Citation l'émet dans son SELECT, et une migration ordonnée tardive n'est jamais en cours.

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