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

    Ajouter l'onglet Politiques, et cesser d'offrir des chats aux refuse le backend

    Quatre points de vue sur un projet de règlement, parce qu'il y a quatre questions différentes Et aucune disposition ne leur répond à tous. Les règles sont ce que chaque règle fait, Matrix est à quoi ressemble l'organisation, Simulator est ce qu'il advient de deux nommés Les gens, l'activité est ce que la politique fait à tout le monde. Une règle est une phrase, pas une forme. Un administrateur assemblant un sens à partir de six déroulgations étiquetées interprètent mal leur propre politique; l'une libellée: "Les ventes peuvent être ne pas discuter avec tout le monde dans un département différent" ne le fera pas. Chaque éditable phrase est une puce, et la phrase fonctionne en direct dans l'application/le dib afin qu'ils puissent être le vocabulaire traverse cette limite en tant que données plutôt qu'en tant que traducteur, puisque claque les fait courir dans l'environnement des nœuds. Les deux extrémités d'une règle à sens unique sont dites exprès séparément. "Les ventes peuvent commencer b) S'il s'agit de s'engager avec Engineering, qui ne peut répondre que pendant que cette fenêtre reste ouverte" décrit ce que fait le moteur; toute formulation symétrique unique décrirait un une règle qui n'existe pas. La commande est ce que coûte la première correspondance-gagnant, donc le conseil d'administration le paie à la baisse: l'impact du projet est vérifié en permanence par rapport à ce qui est réellement vivant, ombragé et les règles qui font double emploi sont désignées sous la règle qu'elles affectent, et la publication montre combien de paires il bloque avant le bouton. De nouvelles règles et chaque modèle arrivent en mode d'audit, où ils enregistrent ce qu'ils auraient bloqué et bloqués Rien. La liste est annotée et non filtrée. Un membre bloqué garde son nom, photo et la présence, et leur bouton de chat s'explique au lieu de disparaître. Créances /api/members/directory, que le picker d'add-members de ChatBox a c'est aller chercher depuis qu'il a été écrit -- la route n'a jamais existé, donc la demande 404'd et le dialogue ont rendu une liste vide sans rien signaler un problème.

  2. · InitializerService

    Créer le schéma de politique de chat

    Six tableaux: l'ensemble de règles, ses règles et leurs clauses, la réponse subventions derrière "la ne répugnent que pendant que leur fenêtre est ouverte", et la traînée de ce que la politique a refusé. Chaque déclaration est écrite pour être complète et idempotente, parce que ce coureur est appliqué à la main aussi souvent qu'il est exécuté. Pousser ce repo ne déploie rien. il n'y a pas d'IC et pas de charge de travail - tandis que MediaService et SecurityService à la fois run ddl-auto:none, donc rien ne crée ces tables à leur startup non plus. Si la DDL n'a pas atterri d'abord, ces services se déploient proprement puis lancent chaque politique est lue. Le DDL pour ce changement a été appliqué à Yugabyte avant les deux poussées de service. et vérifiés en exécutant les deux requêtes de clipshot du moteur contre lui plutôt que par la vérification du catalogue. L'essai qui l'accompagne compare les entités à ces déclarations par réflexion. À l'intérieur de l'initialiseur Hibernate crée les tables à partir des entités avant n'importe quel coureur exécute, donc une colonne manquant ici est invisible de ce côté et fatal sur l'autre.

  3. · SecurityService

    Annoter la liste des membres avec son verdict de politique de discussion

    SecurityService sert la liste de l'interface de discussion à partir de laquelle l'interface utilisateur de chat est constituée, il doit donc Répondre avec les mêmes verdicts que MediaService applique avec -- un partagé l'évaluateur, ou le produit propose des conversations, puis le backend refuse et il se lit comme une discussion brisée plutôt que comme une politique. La liste est annotée, jamais filtrée. Un membre de la politique maintient son nom, photo et présence et ne perd que le bouquet de discussion, qui porte alors l'explication de l'organisation. les cacher aurait été moins de travail et aurait fait mentir la liste sur qui travaille ici. Les verdicts pour la résolution de la liste entière en un seul passage d'un instantané mis en cache. Demander par membre aurait mis une évaluation -- et sur une cache froide, une requête -- à l'intérieur d'une boucle qui tourne déjà une fois par collègue. Une politique qui échoue laisse chaque rangée non annotée plutôt que d'échouer de la liste: le chemin d'envoi est toujours l'autorité, donc le coût est une offre confuse, pas une imprésion non forcée politique.

  4. · MediaService

    Appliquer la politique d'orge de chat et fermer deux trous sur lequel il s'est assis

    Applique la politique aux trois endroits où une conversation peut commencer ou se poursuivre: la création de session, l'ajout du membre et le chemin d'envoi. Une pièce n'est pas gênée par paire -- la porte d'invitation est la porte de message directe, donc vous pouvez amener quelqu'un dans une pièce exactement quand vous auriez pu leur envoyer un message, et une pièce qui rétrécit Retour à deux membres bloqués est relu en tant que message direct. Deux trous préexistants étaient directement dans ce cadre et sont fixés avec lui. Le critère d'évaluation d'envoi n'a jamais vérifié que l'expéditeur appartenait à la session, de sorte qu'il n'y en a pas. un membre authentifié pourrait poster dans n'importe quelle session guid qu'ils pourraient deviner -- a La porte politique aurait été décorative sans elle. Et les indicateurs de dactylographie ont été publié à un ninge /topic/chat/typing que chaque client connecté dans le l'organisation souscrit à; leur cadrage par session arrête la fuite et stoppe une une paire séparée de la signalisation l'une à l'autre. La réponse revient "répondre uniquement pendant que leur fenêtre est ouverte": le navigateur rend compte ce qu'il peut voir et le serveur décide, avec une grâce qui survit une absence battre et non un ordinateur portable fermé. Leur diffusion est par membre et gardée, puisque une subvention falsifiée débloquerait un compositeur de la politique verrouillée. L'écriture d'administrateur est son propre haricot et sa propre transaction. Sur YugabyteDB une lecture après une écriture dans une transaction augmente 40001 et avorte tout autour d'elle, et un auto-invité - Transactionnel n'est pas une frontière du tout -- donc la sauvegarde lit Avant, écrit et ne lit à nouveau qu'une fois qu'il s'est engagé.

  5. · kamo-shared-library

    Ajouter le moteur de politique de discussion en discussion

    Décide si un membre peut ouvrir une conversation avec un autre, et si Ils peuvent en envoyer dans un qui existe. Les règles sont une liste ordonnée par rapport aux commandes. paires et le premier match décide, donc chaque verdict nomme exactement une règle -- qui est ce qui permet aux paramètres UI s'expliquer au lieu de demander un administrateur pour lui faire confiance. La règle d'orientation est la partie portant la charge. Une règle écrite SUBJET - CIBLE est évalué à partir des deux extrémités: l'acteur est le côté dont il est écrit, inverser le côté dont il est écrit. Sans cela, "Les ventes peuvent envoyer un message L'ingénierie à sens unique" correspondrait à la fois qu'un vendeur agit et se retrouverait tout ce qui reste en dessous quand un ingénieur ne fait rien dans le seul la direction il existe de restreindre. L'absence n'est jamais d'accord. Une clause de département, de titre ou de gestionnaire ne peut correspondre un membre clair, et l'inapplicabilité court-circuite avant la négation, de sorte que "pas en vente" ne balaye pas dans tous les abonnés qui n'ont pas du tout de département. L'évaluateur ne tient aucun dépôt et n'ouvre pas de session: deux requêtes créent une Un instantané par or, et chaque verdict après cela est fixé à l'arithmétique. Résoudre un la chaîne de gestion par l'intermédiaire de l'APP aurait été une question par lien par membre à l'adresse suivante: profondeur non bornée, sur un chemin qui court chaque fois qu'une cache se refroidit.

  6. · kamo-internal

    Réorganiser les onglets et peindre les Binders et les téléchargements

    La bande indique Originals - Modifiés - Communs - Liants - Téléchargements, qui met les trois points de vue des documents et les deux destinations qui les suivent. Les liants et les téléchargements portent maintenant ce le fait de lire visuellement: brun et bleu fonds avec des étiquettes blanches et des icônes. Le z dans peintedTab est porteur de charge. Les onglets parents valent leurs enfants par l'intermédiaire de .MuiTab-root, un sélecteur descendant qui surpasse une plaine par onglet sx, donc un seul et perd la cascade et l'étiquette reste grise sur la nouvelle Contexte.

  7. · kamo-internal

    Dites quand un document sélectionné n'a pas pu être ajouté

    Le classeur Docs sélectionné saute un document qu'il ne peut pas tenir légalement plutôt que échec de la synchronisation entière, ce qui est juste - mais il l'a fait silencieusement, donc un liant en tenant moins de documents que le membre vérifié comme la fonction étant cassé, et le seul endroit où la raison existait était le journal DocsService.

  8. · kamo-internal

    Plier l'onglet Modifier dans les liants

    La bande est maintenant originale et lie-lien modifiée et commune et téléchargements. Modifier est née: tout ce qu'il a fait - arranger les documents vérifiés, les prévisualiser, fusionner dans un PDF ou un zip - l'organisateur a déjà fait mieux, et il l'a fait pour une liste que vous pourriez garder. Ce qui les relie, c'est une entrée "Selected Docs" à l'étogée au sommet du liant. liste. Il contient tout ce qui est vérifié dans la grille et est réécrit sur chaque change de sélection, donc un membre vérifie les documents dans Originals, ouvre les Binders, et les y trouve dans l'ordre. Il ne peut être renommé, supprimé ou partagé; Bouton qui le sauvegarde, "Enregistrer en tant que liant", est le même dupliqué que l'éditeur déjà, a été réétiqueté - sur tout autre liant, il est écrit "Dultate This Binder", et les deux font un nouveau classeur du membre qui tient tout le ouvrir une cale. Le téléchargement propose désormais la zip à côté du PDF fusionné, qui est la dernière chose que l'onglet Modify pourrait faire qu'un liant ne pouvait pas. Abandes modifiées PublishedWithChanges for Difference, deux documents côte à côte le côté, et le bouton mort de la barre d'outils "Préparer et télécharger" maintenant ouvre le liant son label a toujours été décrit.

  9. · DocsService

    Servir et synchroniser le classeur Docs sélectionné

    POST /api/docs/binders/scratch fetche le classeur de l'appelant Selected Docs pour une collection, en la créant en première utilisation, et remplace ses documents par le sélection de grille dans le même aller-retour - l'organisateur l'appelle ceci sur chaque le changement de sélection, et deux appels par case à cocher est la différence entre a un liant qui suit la grille et qui la retarde visiblement. La synchronisation contient chaque document encore sélectionné à la position du membre. l'aérative et accompagne les nouvelles; les séparateurs et les pages générées sont jamais touché, parce qu'ils sont les propres ajouts du membre plutôt qu'un la réflexion de la grille. Un document qui ne peut légalement adhérer au reliure est sautés plutôt que de manquer l'ensemble de la synchronisation - une sélection de grille n'est pas organisée, Une mauvaise rangée ne doit pas empêcher les vingt autres d'arriver. L'ordonnancement les règles sont une fonction pure de sorte qu'elles peuvent être testées sans base de données. Renommer, supprimer, partager et modifier les modèles sont refusés pour cela, et les règles pour ce qui peut devenir un élément de DOC maintenant dans un assistant, ajoutant à la main et la synchronisation ne peut pas dériver vers l'extérieur de ce qu'ils acceptent.

  10. · InitializerService

    Ajouter liants.is-sracherche

    Quatre déclarations plutôt qu'un ALTER: les classeurs sont peuplés, et Yugabyte rejette l'ensemble de l'AJOUTER COLONNE ... PAS DE LA NULL plutôt que la clause, donc la colonne arrive annulable, est remblayée, gagne son DEFAULT, et seulement alors est resserré. - Ordre(0) selon la convention de colonne - l'entité partage-lib Maintenant les cartes sont rayures, donc n'importe quel coureur qui charge un Liant avant que celui-ci meure sur une colonne qui n'existe pas encore.

  11. · kamo-shared-library

    Marquer le liant Selected Docs auto-géré du membre

    diffament le liant par (propriétaire, collecte) dont les documents sont la sélection de grille DocManager plutôt qu'une liste organisée. C'est un liant ordinaire à tous autres égards, de sorte que la requête de la liste doit l'exclure à la main: l'organisateur le fait de l'intégrer au-dessus de la liste, et la laisserait en place Il y a deux fois et - pire - offrez-le dans chaque cueilleur "ajouter au liant". La recherche retourne une liste plutôt qu'une Facultative parce que deux onglets ouvrant le l'organisateur ensemble peut tous les deux manquer et les deux insérer; l'appelant prend le plus ancien.

  12. · kamo-internal

    Assembler le record de plomb au lieu de le tenir derrière une spinner

    L'état de chargement de l'onglet Détails était une carte de quatorze rangées d'impulsions MUI grises a la forme que la vitre ne prend jamais, sur une horloge perélément, remplacée en gros par un La disposition, il ne ressemble en rien. Et il a attendu sur "loading.insights" : un record qui était déjà arrivé assis derrière des tenants jusqu'à ce qu'une communication sans rapport Le nombre est revenu. La vitre montre maintenant sa propre disposition pendant qu'elle attend quatre tuiles de stat, la barres de rappels, deux rangées de trois cartes, aux largeurs réelles sous une bande de marque lumière traversant la page sur une diagonale, et les vraies cartes main à partir de leurs fantômes sur le même ordre, donc le compte-rendu se résout le long du chemin lumière parcourue. Seul l'enregistrement porte la vitre; les comptes et la liste des tâches se déchirer à l'intérieur de leurs propres carreaux, et les vitres du marché prolongent l'entrée ordre lorsque sa configuration atterrit. La tête de mât rejoint la même séquence: un fantôme en forme de nom au lieu du mot "Chargement", et un rail de trois segments sur son bord inférieur - enregistrement, activité, Configuration - où un segment remplit le blanc au moment où il va chercher atterrit. Réel arrivées, pas une minuterie. Il est absolument positionné de sorte que l'onglet souligne reste flusher avec le contenu qu'il marque. Un squelette qui ne se résout jamais est le pire état terminal qu'une conception de chargement ait, donc un bilan raté cède maintenant la place à ce qui s'est passé et un Retry qui re-sauvage l'ouverture des froissements, sur les onglets Détails et hypothécaires. La chorégraphie de 'kmail' dans globals.css devient la maison de la famille 'kload' les mêmes règles, même contrat de changement de forme réduite, plus la garniture de rap et les segments du rail. /messages, /notes et /network se déplacent inchangés. Pas de nouvelles clés i18n.

  13. · SecurityService

    Demander à EmailService de renvoyer le courrier électronique passé d'une avance

    Implémente le LeadEmailBackfillTrigger de la bibliothèque partagée, tic-tac "Associer Les anciens E-Mails w/ Lead" sur une épargne-chargeur atteignent le seul service qui peut lire boîtes aux lettres. Deux risques traités ici plutôt que dans LeadService. Il attend l'engagement: le back-fill s'alignent contre le point de contact que l'enregistrement est toujours en train d'écrire, et allumé en ligne, il courrait contre une rangée aucune autre connexion ne peut encore voir, trouver Rien, et rapportez le succès. Et il ne fait jamais attendre le membre : même accepter le travail est un saut à un autre service qui peut être en baisse, donc il sort sur une fil de fond avec temporisations courtes. Le pire résultat à la disposition du membre est une avance qui a été sauvée normalement.

  14. · EmailService

    Scanner les boîtes aux lettres de l'orge à la demande pour obtenir le courrier électronique précédent d'une personne principale

    Servir la boîte à cocher "Associer les anciens courriers électroniques avec le plomb". D'un chef de file et Adresse qui vient d'être enregistrée, lire INBOX et Sent de chaque boîte aux lettres dans cette case L'organisation du plomb remonte à un an et joignez tout ce qui porte l'adresse. Chaque garde de la trajectoire automatique s'applique toujours, car les deux chemins maintenant partage un classement(): un organisme dont les adresses ne peuvent être classées sont refusées, un fil purement intérieur est refusé, et une adresse d'entreprise n'est jamais une correspondance candidat - alors cocher la case sur une piste dont le courrier électronique est le domaine noreply-org-domaine toujours n'associe rien au lieu de remettre ce courrier entier de l'entreprise ruisseau. En plus de ceux-ci, l'adresse de l'adressage principal doit en fait être sur la message. Sortie du fil de demande et du fil unique: une organisation entière Les boîtes aux lettres prennent beaucoup plus de temps à lire qu'une réduction de plomb peut bloquer, et le courrier serveur ne permet qu'une poignée de connexions par utilisateur pour l'ensemble de la dose, donc La simultanéité ici affamerait le balayage vivant plutôt que d'aller plus vite. Le le point d'extrémité répond 202 "queued", jamais "avoir quelque chose" - le membre regarde le L'onglet Courrier électronique se remplissent. La sélection des dossiers passe à MailboxFolderScope afin que le balayage et le remblayage ne peut pas dériver sur le lieu de résidence du courrier; un calendrier dont le contenu dépendait de laquelle chemin trouvé un message d'abord serait pire que l'un ou l'autre.

  15. · kamo-shared-library

    Laisser un courrier de réclamation en chef antérieur à son adresse électronique

    L'adaptation est le point-in-time par conception - un point de contact ne fait que revendiquer du trafic à l'intérieur de sa fenêtre, donc éditer un lead ne peut pas réécrire rétroactivement l'historique. Le le coût est qu'une avance entrée après le début de la conversation ne peut jamais montrer que et le membre n'a aucun moyen de dire "cette adresse était déjà les leurs ». linkHistoric est comme ça. Il élargit exactement une chose, la fenêtre, et rien autre: l'adresse doit toujours être un point de contact de cette avance exacte, en ce Ensemble exact, dans une fenêtre. Il ne peut pas inventer une allumette, traverser un locataire, ou atteindre un plomb qui n'a jamais tenu l'adresse - les essais brossent chacun de ceux-ci, parce que tous trois faillis silencieusement, comme le courrier attaché à la mauvaise tête se lit comme un chef qui Nous avons vraiment écrit. LeadService acquiert la couture qui porte l'intention du membre (une option facultative) LeadEmailBackfillTrigger, absent dans les services sans accès au courrier) et les deux demander que les DTO gagnent le drapeau. Le drapeau n'est délibérément pas persistant: il décrit un épargne, et chaque expéditeur existant - importe, les critères d'admission, MeridianLink patches, l'auto-sauvegarde de la serrure et n'envoie rien et ainsi de suite n'accroche pas la numéraire de la boîte aux lettres qu'elle n'a jamais demandée.

  16. · kamo-internal

    Offre à associer le courrier électronique passé lorsque l'adresse d'une sonde est fixée

    Le courrier est mis en correspondance avec un fil conducteur strictement point en temps: une adresse seulement le trafic à partir du moment où il est enregistré, de sorte que l'édition d'un lead aujourd'hui ne peut pas réécrire dont le courrier était la semaine dernière. C'est juste pour la trajectoire automatique et mauvais pour le cas où un membre frappe effectivement - entrer dans une piste qu'il a déjà a envoyé un courrier électronique, puis trouver l'onglet Emails vide et le thread apparemment perdus. Ainsi, les deux placent l'adresse d'une sonde propre peut être définie et le panneau de contact sur /leads/view/'id' et la nouvelle forme-chef-le--------------------------------------------- Cours en ligne avec la boîte de sous-marche à côté. Ticking il demande au serveur d'aller chercher; Le laisser seul ne change rien. La case n'apparaît qu'une fois qu'une adresse a été tapés, et ne se souvient jamais d'être coché: il en décrit un sauf, pas le plomb, Donc il n'est pas persisté et le constructeur de la liste blanche omet complètement quand il est faux plutôt que d'envoyer un faux balayeur de serrette l'auto-sauté de la serrure rejouer en tant que rejouant en tant que choix.

  17. · kamo-internal

    Un agent s'est préparateur d'affectation, de réservation et du filtre

    Le contrôle de l'agent affecté sur le volet d'affectation d'une personne responsable était un élément local dans LeadViewClient. Deux autres endroits le voulaient exactement, donc ça bouge à et prenez le dialogue avec le cueilleur. Le volet d'affectation est inchangé en regard et en comportement - il n'appartient plus le code. Réserve Opportunity - un membre titulaire de l'EDIT-OPPORTUNITIES, la droite de ces portes la gestion des opportunités sur /leads/opportunités/réservi, obtient maintenant un agent de vente champ désignant qui est la réserve. Il s'ouvre sur eux-mêmes, donc classer leur La demande propre ne coûte rien de plus. Contrairement à l'agent assigné par le plomb, il ne peut pas être vidés: une réserve est la revendication de quelqu'un, et un non-propriétaire n'est pas un état Le registre peut tenir. C'est l'ensemble de "clearable" faux - pas de bouton clair sur le champ, et non, et non, Retirez dans le cueilleur. Le filtre /leads Agent était un Select alimenté par un aller-retour de l'ensemble du personnel un répertoire, d'où vient ses options et pourquoi il ne pouvait qu'offrir une page d'un og qui peut être portée à cinq chiffres de personnes. Il passe à la même vitesse Saiseur, qui recherche une page à la fois, donc le filtre peut maintenant atteindre chaque nom et l'ensemble de l'analyseur pli, sa cache de module et son filtre ACTIVE ont disparu Avec elle, le même nettoyage déjà le volet d'affectation. Les réponses utiles de ce filtre incluent trois qui ne sont pas des personnes, donc MemberPickerDialog croît les lignes «quickOptions»: les rangées épinglées au-dessus des résultats, ici Moi-même d'abord, puis tous les plombs, puis les leads non attribués pour un membre autorisé à voir ceux-ci. Je mène moi-même parce que c'est la réponse souhaitée le plus souvent et celle a La recherche de répertoire rend le plus difficile à atteindre, sinon vous tapez votre propre nom et Sortez-vous des homonymes. Les sentinelles passent à leadGridQuery à côté le mappage qui les lit. Ils étaient littéraux à cordes aux deux endroits, et un la dérive entre les deux ne manquerait pas de compiler: la requête traiterait sentinelle non reconnue en tant que membre id, filtrer sur un membre personne n'est, et montrer un Grille vide - qui se lit comme "tu n'ont pas de sondes" plutôt que comme un bug. La session transporte un membre id et un e-mail mais pas de nom d'affichage, donc l'ensemencement le formulaire de réserve avec "vous" le résout une fois par la recherche d'annuaire. Le match est sur le membre id, jamais sur l'e-mail qui a produit la page: une boîte aux lettres partagée Renvoie plusieurs personnes, et prendre la première serait une opportunité pour une Un collègue qui ne l'a jamais demandé. En outre, les gouttes getAgentFilterMemberId, qui n'avaient pas d'appelant et d'analyse Membre à 19 chiffres.

  18. · SecurityService

    Accepter une réserve émise pour un autre agent

    POST - aujourd'hui honore BeadOfMemberId, Chez EDIT-OPPORTUNITIES - la droite qui permet de gérer les opportunités sur la liste réservée, et déjà droit nécessaire pour faire passer une occasion d'un mandat à l'autre après le fait. CREATE-OPPORTUNITIES à elle seule ne fait que le dossier qui se porte le vôtre. Un appelant sans qu'il désigne un agent est REFUSÉ plutôt que d'avoir le champ lâchée. Enregistrer silencieusement la réserve sous leur propre nom attribuerait une réclamation à quelqu'un qui n'a jamais réussi, et montrerait au gérant une demande croient qu'ils ont déposé pour quelqu'un d'autre. L'agent nommé est validé par opposition à commissionEligibleMemberIds - le même Possibilité d'utilisation PrimaryAgent et le même pool que le picker offre. Stationnement d'une réserve sur quelqu'un qui ne peut pas ouvrir le plomb, il réserve inapplicable pour eux. L'acteur de l'histoire reste la personne qui a agi; la note dit à qui c'était pour lui. Et parce que DEMANDE-SUBMITTED va à des approbateurs, l'agent pour lequel il a été déposé est ajoutés explicitement - ils ne sont pas un alyseur, donc sinon le premier serait l'audition d'une réclamation à leur nom est son approbation ou son refus. Exige de la migration KamoInitializerService ajoutant CREATED-BY-MEMBER-ID courir d'abord, ou la première lecture de n'importe quel lancer de réservation.

  19. · InitializerService

    Ajouter

    Enregistre qui a déposé une réserve quand ce n'est pas l'agent qu'il nomme, donc quelqu'un la gestion des possibilités d'accès peut en soulever un au nom d'un agent de vente sans le procès-verbal; avoir à prétendre que l'agent l'a fait lui-même. Nullable sans remblai, pour la raison PRIMARY-AGENT-MEMBER-ID n'a pris aucun: nul: "le demandeur l'a déposé lui-même", chaque ligne antérieure à cette colonne a été véritablement auto-infurcissable, et la copie du demandeur inventerait un fait et mettre une ligne "Facé par" sur l'histoire que personne n'a joué. Pas d'indice - rien ne filtre ou trie dessus, donc on coûterait à chaque écriture et à chaque achat Non lu. Cela doit être déployé et exécuté AVANT le changement du service de sécurité qui cartographie colonne: services run ddl-auto:none, et Hibernate nom chaque colonne mappée en son SELECT, donc le service commencerait en bonne santé et ensuite lancerait la première lecture de toute réserve.

  20. · kamo-shared-library

    Laisser un gestionnaire formuler une réservation pour un agent

    Quelqu'un qui gère les opportunités peut maintenant déposer une demande de réservation sur une vente pour le compte de l'agent. CreateReservationRequest se traduit surBehalfOfMemberId pour elle. L'agent nommé devient DEMANDE-BY-MEMBER-ID, et non la personne qui l'a déposé. Toutes les règles en aval ne relèvent pas de cette colonne - qui peut demander une extension, qui la commission suit, ce que le filtre Agent de la liste réservée correspond - donc La revendication doit se prononcer là où ces règles se présentent, et c'est vraiment la revendication de l'agent. Qui s'est assis au clavier va dans un nouveau CRÉATED-BY-MEMBER-ID plutôt qu'être plié dans la même colonne, de sorte qu'aucun des faits ne doit être déduit de l'autre. Nullable et nul conserve son propre sens: le demandeur l'a déposé lui-même. PRIMARY-AGENT-MEMBER-ID est volontairement laissé nul sur ce chemin. Cela signifie "un a retiré cela de l'agent qui a demandé", et la liste réservée rend un amber "Remissié de" ligne pour elle - mais une demande déposée pour un agent n'a jamais été a décollé de n'importe qui, donc "réassigné" reste faux et "on-BehalfOf" dit le vrai à la place.

  21. · kamo-internal

    Cacher les contrôles d'équilibre que free-for-all ne peut pas utiliser

    Le solde créditeur, le montant journalier et le solde Max agissent tous sur un solde accordé, et un produit FFA n'a pas d'acceptation là-bas et dépense son propre crédit. Les laisser éditables a invité un gestionnaire à fixer des nombres qui ne pourraient jamais se lier. Ils sont maintenant en train de devenir une puce en sourdine avec une infobulle. Max Passage journalier éditable et est le véritable levier sur un produit FFA: le back-end compte maintenant un L'acceptation par la FFA en tant que dépense, de sorte que le plafond s'applique là aussi.

  22. · kamo-shared-library

    Rendre l'acceptation gratuite pour tous, afin qu'elle puisse être plafonnée

    La FFA a contourné le système de crédit purement et simplement, ce qui a laissé un gestionnaire sans levier c'est-à-dire Max Daily Spend. Si vous vous assurait de rester si (-ffa) et ne pouvait pas coiffer un produit FFA, et "accepté aujourd'hui" n'avait pas de rangées à compter parce que rien n'a jamais été dépensé. Une acceptation de la FFA empêle désormais un crédit et le dépense en tête dans le même bloc en tant que réclamation, donc le registre des dépenses existe toujours et ne peut jamais dériver de la affectation. Max Daily Spend quitte la succursale pour les crédits uniquement et s'applique à les deux voies - free-for-all signifie que le membre n'a pas obtenu de solde à payer Non qu'un gestionnaire ne peut pas lier le nombre qu'il en prend par jour. Délibérément encore uniquement au crédit: le changement de crédit à l'échelle de l'orge et le contrôle du solde. La FFA n'a pas d'équilibre pour manquer. Le bouchon est vérifié après ceux-ci, donc un crédit Un membre qui est à la fois brisé et plafonné ne parvient pas à signaler les INSUFFICIENT-CREDITS. Note AcceptResult.creditSpent est maintenant vrai sur le chemin de la FFA (il a été documenté comme suit: toujours faux). C'est exact - un crédit est vraiment consommé - et il atteint le accepter la réponse et la charge utile de publication intitulée "L'émission" NATS. Enjeux d'affectation de plombType still L'histoire de l'Auto-ASSIGN pour FFA, donc l'histoire maintient les deux à part.

  23. · kamo-internal

    Nommez le demandeur, déplacez la ligne d'orge, raccourcir le bouton Ouvrir Org

    Trois ajustements des surfaces d'appui. "Open org as System User" est maintenant "Ouvrir Org", assis immédiatement après l'assignation/la cession plutôt qu'à la fin de la ligne - il appartient à la même question, à la même question, à la réponse suivante: est l'autre chose que vous faites quand un billet atterrit sur votre bureau et la réponse est à l'intérieur du locataire du client. L'infobullère indique toujours que l'onglet s'ouvre en tant qu'utilisateur du système, que la courte étiquette laisse tomber. Il garde son poids; c'est une porte dans quelqu'un d'autre et ne devraient pas lire comme un frère ou une autre. L'organisation sort de l'en-tête du billet et sur la gauche du "Nouveau billet" rangée, qui laisse l'en-tête pour le billet lui-même. Avec plusieurs onglets ouvrir la barre de languette porte plutôt la commande de nouveau ticket, de sorte que la rangée rend pour l'organisation seule. chaque onglet peut être un client différent, et c'est exactement quand il vaut la peine de le dire. Le Le titre de la fenêtre se lit maintenant comme suit : « 'personne', 'org' », construit en un seul endroit parce que le le chemin de renom de visiteur pousse un titre aussi et une deuxième expression est comment l'orge tranquillement tombe au moment où un visiteur anonyme donne son nom. Les lignes de discussion et de soutien sont titrées après la personne qui a demandé, toujours. Ouverture d'un billet rejoint son chat, donc un occupé accumule des agents, et le titrage de l'autre Les participants ont renommé la ligne chaque fois qu'un collègue l'a regardé - la même la conversation apparaissant comme une personne différente. Le nom du demandeur est désormais d'accord avec le visage déjà sur la ligne.

  24. · kamo-internal

    Dites quelle horloge le dialogue de l'événement est allumé, et montrer l'heure de début

    Quatre choses que le compositeur s'est mal passé, sur /calendar et sur la page principale. La zone était celle du navigateur. C'est un fait à propos de l'ordinateur portable, pas à propos de la membre: quelqu'un dont le profil dit Eastern et qui travaille de Denver continue de réserver leur journée à l'Est, et le dialogue enseigné "13pm Mountain" avec rien à l'écran pour le révéler. De nouveaux événements sont désormais constitués dans le rôle de membre zone de profil, résolue par le fuseau horaire/efficace de SecurityService - qui a existé depuis août et n'avait pas de route Next en face de lui, donc chaque appel 404'd inside Next et est retombé à l'UTC. La zone est nommée sur la valeur, sous le cueilleur, et à côté de la date dans l'en-tête, sur le décalage effectivement en vigueur à la date de l'événement plutôt qu'à celui d'aujourd'hui. Les champs de début et d'extrémité étaient assis côte à côte avec une flèche entre eux et non étiquettes du tout, deux boîtes inopinées partageant la largeur de la carte à cette largeur une entrée date-heure-local a moins de place que son propre contenu n'en a besoin, de sorte que la lecture a été coupé. Avec la tête de la carte "Démarrer le temps" et les seuls mots visibles étant Les boutons d'aujourd'hui / Demain / Tous les jours à côté, rien à l'écran dit un début Il y avait le temps d'ajuster. Ils sont empilés sur toute la largeur maintenant, chacun nommé, et la carte est dirigée "Quand". Un nouvel événement a commencé en haut de l'heure actuelle, ce qui est dans le passé pour cinquante-neuf minutes sur une soixantaine; le rappel de la page principale a été ajouté une heure et a gardé les minutes impaires, offrant 16h37. Les deux utilisent maintenant defaultEventStart une heure, arrondie jusqu'au quart d'heure. Le calendrier par défaut était quel que soit le service listé en premier, et le service répertorie d'abord le calendrier partagé de l'organisation, car il s'agit l'ordre de lecture dans la barre latérale où il s'agit d'un filtre. Ici, la première entrée est également la valeur par défaut, de sorte qu'un nouvel événement a été publié à l'échelle générale, à moins que le membre ont remarqué et choisi de ne pas prendre une décision qu'ils n'ont jamais prise. Le membre principal Le calendrier mène maintenant, et le partage porte un badge "org-wide". Le compositeur de rappel principal n'enseigne plus la zone du lead en silence; il offre c'est un commutateur à appose étiqueté à côté du membre. Son contexte compositeur est timide, qui est porteuse plutôt que bien rangée - construit en ligne, c'était un objet frais chaque rendu, donc les calendriers arrivant du réseau moyen de fixation a réinitialisé le dialogue et rejeté ce que le membre était entré.

  25. · SecurityService

    Publier les comptes des déclarations Hibernate à Prometheus

    /actuator/prométhée déjà transporté jdbc' et hikaricp' mais pas d'hibernés, parce que Spring Boot 3 ne préfigure que les métriques est sur le chemin de la classe. Ajouté, plus hibernate.generate-statistics. La raison en est concrète. L'audit de ce service pour les questions de la zone no 1 a dû être effectuée au moyen de la pulpation pour les navigations d'association, et cette méthode est erronée dans les deux directions: il surrebond, parce qu'un nom d'association comme "vendeur" ou "utilisateur" est paresseux sur certaines entités et avide d'autres (9 des 67 sites signalés ont été trouvés; d'être impatient et n'avoir besoin de rien), et il sous-décompte mal, parce qu'il voit .getX().getY() mais pas itération sur une collection paresseuse - qui est la plus grande partie du surface réelle. les états hibants - des états totaux répondent à la même question par mesure. Un critère d'évaluation l'émission de 200 déclarations par appel est visible quelle que soit la forme que prend le code, et ouverture-vue sur le fait que chacun de ces charges paresseux est par ailleurs silencieux. Coûte quelques pour cent. Il vaut la peine d'être servie dans un service où le dernier audit a trouvé quatre des critères d'évaluation séparés de O(rows).

  26. · kamo-internal

    Montrez la photo du demandeur sur chaque ligne de discussion d'assistance

    Chaque ligne de Chats et Supports portait le même glyphe de soutien bleu, ce qui n'est pas utile à tout quand la liste est ce que vous scannez pour décider quoi prendre. Le visage est maintenant le qui a demandé. Le glyphe survit pour exactement un cas, et c'est un fait du serveur plutôt qu'une supposition: un visiteur anonyme de chat en ligne n'a pas d'enregistrement de membre, donc le ticket désigne le membre du SYSTEME de l'organisme - le propriétaire - en tant que demandeur. Montrer cette photo mettrait la mauvaise personne sur la conversation, et sur le marketing de la plate-forme widget serait le visage de celui qui lit la liste. L'annuaire de l'adresse de téléspectateur est toujours consulté en premier lieu, car c'est la copie en direct. membre qui a changé sa photo il y a un instant est déjà là - et le L'URL du serveur est la gouffre qui couvre les demandeurs dans d'autres organisations, qui Cet annuaire n'a jamais entendu parler. Les initiales ne retombent délibérément PAS au titre de la ligne: sur une ligne de support, le titre est la contrepartie, de sorte qu'un demandeur que le serveur ne pourrait pas nommer serait donné les initiales de l'agent de soutien, sur l'avatar qui existe pour dire qui demande. Avec ni un nom ni une photo, il n'y a personne à dessiner, et le glyphe est honnête.

  27. · MediaService

    Placez le visage et le nom du demandeur sur chaque ligne de discussion de support

    Une ligne de discussion et de support a montré le même glyphe de soutien sur chaque ligne, donc une file d'attente de Il s'agissait d'une paroi de cercles bleus identiques. Le visage des gens scanne pour est Quel qu'il soit accusé, donc la ligne porte maintenant l'id de l'auteur, son nom d'affichage et sa photo. La photo est résolue ici plutôt que laissée au client, qui est l'ensemble difficulté: tous les autres avatars de ce flux sont remblayés du spectateur un annuaire d'organisation, et un demandeur d'appui est toujours - sur le bureau de la plate-forme - quelqu'un membre d'autre, donc ce répertoire ne revient rien pour exactement les lignes C'est pour. Deux lectures groupées couvrent une page, dans le même esprit que le visiteur pré-extraction à côté d'eux. La rangée de l'avatar est relue par id au lieu d'être retirée de member.getAvatar(): L'avatar est une hiérarchie JOINED et l'association est paresseuse, donc ce qui revient est un l'extrait d'AvatarPhoto est faux à travers elle même après initialisation, et chaque photo téléchargée serait recherchée sur le vecteur Avatar Creator chemin. Le chargement par id donne la sous-classe concrète et son extension de fichier. requestorAmbigueous est le cas pour lequel le glyphe survit, et c'est un cas spécifique plutôt qu'une haie: un visiteur anonyme de chat en ligne n'a pas d'enregistrement de membre, donc le le titulaire du propriétaire du titre de réception désigne le membre du SYSTEME de l'organisation, le propriétaire. Leur photo mettrait la mauvaise personne sur la conversation, et sur le marketing de la plate-forme widget serait le visage de celui qui lit la liste.

  28. · kamo-internal

    Le pool compte sur l'en-tête du produit, aujourd'hui accepté par membre

    Leads Available a été rendu dans chaque rangée membre d'un groupe de produits, mais il s'agit d'un propriété du pool (produit, marché) - le même nombre a répété colonne pour autant de membres que de règles en attente. Il se déplace vers l'en-tête du groupe, une fois, où il appartient. La colonne libérée montre maintenant ce qui manquait réellement: combien de personnes en tête chaque membre a accepté jusqu'à présent aujourd'hui, rendu "3 / 10" contre leur Max Daily Spend La hauteur libre restante est lisible en un coup d'oeil. Le compte vient de /gérer, qui résout "aujourd'hui" de la même manière que le plafond - le lieu de temporel du membre.

  29. · kamo-shared-library

    Résoudre l'URL photo d'un membre à partir de la bibliothèque partagée

    La liste des Chats et Supports est sur le point de montrer le visage du demandeur, et un soutien Le demandeur est - sur le propre bureau de la plate-forme - toujours membre de quelqu'un d'autre. Tous les autre avatar dans cet aliment est refoulé sur le client à partir de l'ordre VIEWER annuaire, qui n'a jamais entendu parler d'eux, donc celui-ci doit être résolu côté serveur par MediaService. Cela signifie un second service désignant un objet d'avatar, et le chemin d'objet est exactement la chose qui ne doit pas exister deux fois: elle était préfixée avec n'importe quel hôte demande est arrivée, donc une photo téléchargée sur un ou un domaine d'org 404'd quand on lisait à partir de Un autre, dégradant pour les initiales et ressemblant à "pas de photo" plutôt qu'à un bug. Donc AvatarObjectPass se déplace ici et la copie de SecurityService devient une délétion alias ne détenant pas de ses propres chaînes. MemberAvatarUrls ajoute le reste de la résolution: Member-override before user par défaut, photo vs Avatar Creator décidé par le DISCRIMINATOR avant l'instance de l'avatar chargé est un indicateur supplétif du type de base, de sorte que l'instance d'envoi de chaque téléchargement photo au chemin vectoriel et au domaine de thème hôte. Un hôte qui n'est pas un domaine ne donne pas d'URL plutôt qu'une supposition: aucune image ne se dégrade en initiales, une URL cassée n'est pas de plus. Ajout également de REQUESTOR-ID aux deux projections de support de discussion.

  30. · SecurityService

    Retourner le nombre de jours de chaque membre par produit

    Manage-Credits montre Max Daily Spend, mais rien sur sa quantité d'utilisation, de sorte qu'un gestionnaire ne pouvait pas dire si un membre était une tête de rang à partir de son plafond ou s'il avait pas commencés. /gage maintenant retours acceptésJusqu'à un jour clé memberId::vendorProductId. "Aujourd'hui" est résolus exactement comme CreditLeadAssignmentService le résout lorsqu'il est soumis à l'application de la Le créneau horaire du MEMBRE, début de la journée à aujourd'hui, en comptant le même LeadCredit.dateFruit lignes - donc le chiffre est littéralement le nombre que le cap est a été testé par rapport à un avis plutôt qu'à un deuxième avis sur ce qu'est un jour. Une requête groupée par membre, pas une par membre x produit. Note : rapport sur les produits de la FFA 0: l'acceptation y est sans frais, et le plafond le fait ne s'appliquent pas non plus à eux (le bloc de crédit est en retard si (-ffa)), de sorte que deux colonnes restent cohérentes.

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