Changelog
Ce qui est nouveau.
Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.
· kamo-shared-library
Ligne, note, vendeur, numéro de vente et horloge écrits sur un emploi
SW6b Tâche 3, moitié bibliothèque. Huit nouvelles opérations sur ServiceJobService, plus la filer les enregistrements pour eux et les trois indique les besoins de la page de détail. Trois choses que le serveur possède et aucun client ne peut envoyer: - Les totaux. lignes de travail sur chaque ligne écrivent, et le total d'une ligne est la quantité x unitéManuture. LineInput n'a pas de membre total et JobInput n'a plus la Le travail est trois. Ils étaient sur JobInput quand SW6a a été livré parce qu'il y avait Rien à d'eux de les tirer; les laisser une fois qu'il y aurait une seconde la porte qui passe droit devant la règle. De l'autre côté de cette porte ressemble à -- il faut un sous-total de la demande ET ajoute ses totaux de ligne à lui, de sorte qu'un client qui envoie les deux obtient un chiffre qui Ni l'un ni l'autre, ce qui est l'échec du javadoc de QuoteTotals existe à nommer. - L'horodatage d'approbation. signeAff stamps signoffAté de l'enregistrement du drapeau Il le nettoie quand il devient faux, de sorte que la paire ne peut jamais être en désaccord. Entrée de connexion porte un texte booléen et libre et pas de temps. - L'horloge. horloge timbres de visite réelsDémarquer/répartit en cours et déplace la visite statut avec eux -- ON-SITE in, COMPLÉTÉ. Un cylindrée sans horloge est une appellation illégale d'ÉtatException faisant la appellation de l'état de la visite (409 au responsable du traitement): une fin sans début contribue zéro à TotalLabourMinutes, donc le un symptôme serait un décalage à une journée sans rien dire. Une deuxième l'horlogerie est également refusée; un second passage est une deuxième visite. Chaque enfant est résolu avec son emploi uid ET l'orge comme prédicat dans ONE se demander -- findByUidForJob sur la ligne, vendeur et référentiels de visite. Résoudre par uid et org seul ferait que DELETE /-jobUid-/lignes/-lineUid- n'importe quelle ligne dans l'orgueil à travers une URL qui semble tout à fait correcte. JobView gagne lignes/notes/vendeurs: nul dans la projection de liste (non chargée), toujours rempli dans la projection détaillée (moyens vides aucun). Chargement par rangée lire quatre tables pour peindre une grille qui ne montre rien de tout cela. Mutation-testée: 9 mutations de ce fichier, chacune produisant un nom distinct défaillance -- abandon de la recalcul, ajout de totaux de lignes au-dessus du stocké chiffre, la chute du dispositif de protection de l'horodalement, ne déplace pas l'état de la visite, pas l'accrochage l'approbation, non l'effacement, et la résolution de chacun des trois enfants par uid seuls.
· VOIPService
Mettre en œuvre l'extension KamoPBX, la gestion des utilisateurs et des appareils
Le fournisseur a annoncé extensionManagement, userManagement et deviceManagement comme vrai lors de l'application d'aucun d'entre eux, donc l'interface utilisateur aurait montré des boutons que lancer 501. Les capacités correspondent désormais au comportement. Une extension dans KamoPBX est trois documents - un utilisateur, un appareil appartenant à cet utilisateur, et un flux d'appels mappant le numéro à l'utilisateur. Créer seulement quelques-uns d'entre eux cèdent soit un nombre qui n'anneau n'anneau ni un combiné que rien n'a d'itinéraire vers, donc les trois sont créés ensemble et un échec partiel ramène ce qui a été fait. La suppression d'une extension ne supprime que le flux d'appels. Un membre peut posséder plusieurs et suppression du combiné enregistré d'une personne parce qu'un numéro a été supprimé serait une bien pire surprise qu'un document orphelin. 253 cartes d'essai, 5 nouveaux revêtements de couverture créent, retournement, validation, suppression de portée et l'honnêteté des capacités.
· kamo-shared-library
Lignes d'emploi, notes et fournisseurs afin que les onglets de commande de travail puissent persister
Le travail et les pièces deviennent des rangées de servicesJobLine sur le lieu de travail plutôt que Lignes ServiceLineItem, parce que OrderLineItem.order est facultatif et faux: a ServiceLineItem ne peut exister sans ordre, et un dossier de technicien le travail bien avant que quoi que ce soit ne soit facturé. Rendre ce parent annulablerait laisser un AchatLineItem existe en dehors d'un ordre aussi, donc le test de cartographie fourre-t-on à la place de l'invariant. ServiceJobNote est rédigé et appendice uniquement - non mis à jourAt, créé émoussé et timbré en «PrePersist». ServiceJobVendor est le l'onglet Fournisseurs s'est toujours affiché; le rôle reste libre du texte parce qu'il n'existe pas de vocabulaire de type vendeur pour congeler le schéma. Chaque dépôt parvient à l'orgue par le biais d'une adhésion d'EXPLICIT à la tâche. L'implicite l.job.organization.id rend comme un INNER joindre et silencieusement abandonne les rangées dont l'association est nulle; ServiceJobLineMappingTest affirme la forme plutôt que de lui faire confiance.
· kamo-internal
Une charge clinique défaillante ne doit pas être rendue en tant que résultat vide
Deux d'entre eux ont été expédiés avant que quiconque ne s'aperçoive, et le garde en a trouvé deux autres dans le le plus récent panneau au moment de son exécution - ne pas charger ce que les autres pratiques d'un patient ont déjà été traités comme étant "rien reçu encore", et n'ont pas réussi à charger le partenaire liste libellée comme "aucun partenaire d'échange n'est mis en place", qui enverrait quelqu'un à ajouter les partenaires qui existent déjà. C'est pourquoi il s'agit d'un maître de l'ordre et non d'une note de révision. L'échec est silencieux par construction: pas d'erreur, pas de journal, rien à l'écran, et il ressemble exactement à la état vide sain. Personne ne le signalera jamais comme un bug. Sur un graphique, une liste vide est une mention "pas de mesures", "personne en retard", "pas d'allergies" - et les gens agissent dessus. La même distinction est déjà faite le module côté serveur: "ils n'ont rien" par rapport à "nous ne pouvions pas demander", et 503 plutôt qu'une liste vide du transport en bourse. Cela l'applique à l'application le client. Porté aux surfaces cliniques, parce que d'autres verticales ont leur propre conventions. Un problème qui fixe une erreur, des journaux, re-retourne, retourne ou recharge et aussi un commentaire expliquant pourquoi le silence est juste, sur lequel le patientCommsPanel s'appuie: son calendrier de bling signale la même panne Et une deuxième bannière dirait au lecteur rien de nouveau. Enchaîné à l'essai npm.
· SecurityService
Expiler les paramètres de la plate-forme via l'API system-config
toDto est une liste explicite et updateConfig prend un corps dactylographié, donc les sept de nouvelles colonnes SYSTEME-CONFIGURATION auraient été invisibles et non désordonnées - La carte de réglages de plate-forme aurait rendu vide et l'épargne aurait fait Rien. Le mot de passe de l'administrateur n'est jamais retourné. C'est le maître accréditation derrière chaque compte de locataire, donc un GET cède la sentinelle "-" quand il est défini, et envoyer "----------------------------------------------------------- écraser le justificatif avec la corde littérale. Doté par MANAGE-VOIP-SMS à côté des champs VoIP existants, donc MANAGE-DOCUMENT-AI ne peut pas l'atteindre.
· VOIPService
Déchiffrer le certificat KamoPBX; tester le chemin de refus
Le certificat maître est stocké en texte chiffré par la plate-forme paramétre l'UI, de sorte qu'il doit être déchiffrée avant utilisation et maniement du texte chiffré à l'API en tant que mot de passe Présente comme un mauvais accréditation et envoie celui qui le déboît dans le mauvais sens. Deux nouveaux essais couvrent la trajectoire de refus qui était auparavant apparue à un Kubernetes brut. Erreur DNS à un org admin: pas de compte maître id, et pas d'administrateur justificatif. Les deux affirment que le message nomme la page des paramètres. 248 épreuves passent.
· KlusterServices
Échanger les salutations à KamoCRM-Main-Intro-3
Troisième prise, 40s (en bas des années 60). Chargement à côté des deux précédents plutôt et sur eux, donc revenir à l'un ou l'autre est un changement à une ligne KAMO-ATTENDANT-INTRO plus un rechargement au tir au tir au tir - pas de téléchargement. Source stéréo de 48 kHz convertie en 8 kHz mono Astérisque. Vérifié live: somme de contrôle correspond au fichier local, l'astérisque l'a décodé en 319914 octets de u-law (39,99s à 8000 B/s), et le CDR montre BackGround custom/kamocrm-main-intro-3.
· InitializerService
Entreposage par siège et piscine appartement Enterprise
2 Go par siège sur Free, 4 sur Starter, 5 sur Business. Les entreprises cessent de s'étendre avec des sièges entièrement - un appartement de 150 Go pour l'organisation - qui "N GB par le siège" ne peut pas exprimer, de sorte que la rangée porte une prose surpasse les surfaces d'achat maintenant préféré au nombre. L'unité de caractéristique est GB/siège. L'unité de facturation est un siège partout; les effectifs restent les utilisateurs, être des personnes plutôt que des unités.
· kamo-internal
Carte de réglage de la plate-forme, et arrêtez d'afficher la copie FreePBX
Trois problèmes sur la page du serveur de téléphone KamoPX, tous les miens : - La carte PHONE-SERVER-ID n'était pas gênée, de sorte que chaque fournisseur - KamoPBX, RingCentral et les équipes incluses - ont été données de coller l'id dans le kamo-asterisk-support configure sur un hôte FreePBX. Il n'est que de FreePBX et ne le rend plus que là. - KamoPBX n'avait aucun contenu spécifique au fournisseur. Une org l'orque un nom, un numéro, une basculement active et cette instruction FreePBX. Il obtient maintenant une carte disant Kamo l'exécute, son adresse SIP, l'état de provisionnement, et ce qu'il faut faire ensuite. - Il n'y avait PAS de configuration de plate-forme pour KamoPBX n'importe où, ce qui a fait de la fournisseur inutilisable: rien ne peut fixer le compte maître ou le certificat. Une carte On les possède désormais et avertit en cas de configuration. Les clés du dictionnaire poussées en premier (messages/ sont gitignored ici).
· VOIPService
Lire la configuration de la plate-forme KamoPBX à partir de la base de données
L'ajout d'un serveur de téléphone KamoPBX a échoué avec une erreur DNS Kubernetes brute "Erreur I/O sur PUT ... - montré à une l'organisation qui ne sait ni lire ni agir de son action. Deux causes, toutes deux fixes: - L'agent de fourniture a tenté l'appel sans configuration de plate-forme. Il maintenant vérifie d'abord et refuse avec un message actionnable désignant les paramètres page, au lieu de s'ouvrir à une erreur DNS. - Les paramètres étaient "Valeur seulement, donc il n'y avait aucun moyen de configurer KamoPBX sans un redéployer. Ils viennent maintenant du singleton SYSTEM-CONFIGURATION, que le les paramètres de plate-forme UI écrits; les valeurs par défaut restent un repli de sorte que le Le service continue de démarrer avant que la migration ne se soit produite.
· kamo-shared-library
Paramètres de la plate-forme KamoPBX sur SYSTEM-CONFIGURATION
KamoPBX est la propre plate-forme de Kamo, donc toute sa configuration est à l'échelle de la plate-forme: URL de base, compte maître id, nom de compte, justificatif d'administration, suffixe du royaume SIP et URL WSS. Ils s'assoient sur le singleton SYSTEM-CONFIGURATION à côté de l'actuel singleton VoIP tunables afin qu'un opérateur puisse les définir à partir des paramètres de la plate-forme d'avoir besoin d'un redéploiement pour changer de variable d'environnement. La colonne du mot de passe d'administration est AES-256-GCM de texte chiffré et porte: cette ligne sérialise directement vers la plate-forme des paramètres UI, et sans elle Un certificat principal pour chaque locataire serait sur le fil.
· InitializerService
Seed KamoPBX platform par défaut
Hibernate ddl-auto ajoute les colonnes SYSTEM-CONFIGURATION; s'applique aux lignes nouvellement insérées, de sorte que le singleton existant a besoin d'être remblayé. Seme le défaut non-secret seul. Le compte maître id et l'administrateur sont délibérément laissés NULL - c'est ce qui fait le rapport de l'agent de la disposition 'non encore configuré' et refuse, au lieu d'échouer ou de surfacer Kubernetes Erreur DNS à un administrateur d'un administrateur qui ne peut ni lire ni agir sur elle. Chaque déclaration ne remplit qu'une NULL, de sorte que les éditions UI d'un opérateur survivent aux redéploiements.
· kamo-internal
La grille de la commande de travail lit de véritables emplois dans les services
Chaque rangée de cette grille était un maillon mort par construction. générerMockWorkOrders ids ids String(8000 et i), le clic de ligne enfoncé /commerce/service/8001, et le manipulateur a déclaré «PathVariable UUID id» de sorte que la conversion de l'identifiant a échoué avant tout gestionnaire a couru et la page de détail a rendu son état non trouvé. Quinze lignes, Quinze liens morts, sur un écran qui semblait terminé. Les deux surfaces lisent maintenant ServiceJob à travers Les exportations indirectes GET, PUT et PATCH - exactement ce que ServiceJobCtroller maps, et aucun des deux indicateurs de marché à côté d'elle n'était un modèle sûr: les prix des exportations GET/POST/PATCH/DELETE sans PUT, services-tâches exportées GET/POST/PUT/DELETE sans PATCH. Copier l'un ou l'autre et l'autre sauvegarde répond 405 soulevée par Next lui-même, avec Rien dans les journaux du serveur, alors que chaque lecture ne cesse de fonctionner. serviceJobWireContract.test.ts épingle le verbe mis en regard du contrôleur annotations dans les deux directions et comparez chaque JobView/VisitView/AddressView enregistrement de l'élément TypeScript par nom. Cette comparaison de nom est la deuxième correction. posApi.WorkOrder déclaré serviceName, serviceId et engagementId contre un service d'envoi de DTOOffrantName, ServiceOffreUid et engagementUide. Les trois n'ont jamais appariés, donc le détail Le sous-titre de la page et sa ligne récapitulatif "Service" n'ont pas été définis pour la vie de l'écran et est retomber à un jeton - qui se lit comme "rien enregistré" plutôt que sous la forme d'une typo, c'est pourquoi personne ne l'a trouvée. Supprimé 489 lignes d'un dialogue détaillé qui ne pouvait pas s'ouvrir: false initialisés, setDetailOpen(vrai) n'apparaissait nulle part dans le fichier, et selectedOrder était indépendamment toujours nul. Six manipulateurs l'ont nourri et rien d'autre part et est allé avec. Son onglet Notes était le seul dans la base de code, donc c'était extraits en premier Des départs dignes de connaissance: - Pas de nom de technicien nulle part. ServiceJobApi effectue des visites[. et rien d'autre, et aucun point d'extrémité ne résout un lot d'identifiants de membres à des noms member Directory est une recherche paged dont la propre note interdit d'occuper le personnel liste. La colonne a disparu plutôt que de montrer un id habillé en personne. - "Time attendé", pas "heures de travail". Le serveur somme totalLabourMinutes à partir de la fenêtre réelle de chaque visite parce que le prix du travail pend. un lien vers un emploi. Rendu avec le formatLabourMinutes; pas de terrain d'heures de flot de part et d'autre. - le commerce remplace les dix chaînes de catégorie gratuites, qui n'ont jamais été un vocabulaire Tout ce qui pourrait aller-retour: "Plumbing Repair" est PLUMBING plus WorkClass.REPAIR. - Le statut de gros émet désormais un PATCH par emploi et signale des refus partiels, car la machine d'état vérifie chaque transition. L'ancien manipulateur a mis le champ localement sur tous ces pays et ont fait état d'un succès. - Le travail, les pièces, les entrées de temps et les vendeurs restent employés au niveau local. Aucune entité n'a le fonds n'importe lequel d'entre eux; SW6b les construit. Dictionnaire atterri en premier: kamo-traduction-dictionary 947e585.
· kamo-marketing
Les cartes de plan montrent à quel niveau ADDS, pas tout ce qu'il a
Les cartes listées toutes les caractéristiques incluses - 16 sur Free, 30 sur Starter, 52 sur Entreprises, 57 sur les entreprises. Quatre cartes de hauteur sauvagement inégale, chacune un mur de texte, et entre eux une réaffirmation quasi-complet du tableau de comparaison assis directement en dessous. Les plans sont cumulatifs, donc la seule question à laquelle une carte doit répondre est "quoi Cela me fait obtenir que celui qui est le moins cher n'est pas le cas ». Chaque carte mène maintenant avec le ligne de siège (le chiffre qui ne s'accumule pas), dit à l'étaînage qu'il construit sur, liste au maximum six différents, et envoie le reste à la comparaison Table par "et N plus de caractéristiques". Les entreprises tombent de 52 lignes à huit, quatre cartes sortent presque égales, et la table cesse d'être un duplicata et commence étant la destination. L'ordre des fonctionnalités suit maintenant l'ordre de l'affichage du catalogue. Il a été trié par ordre alphabétique, par catégorie, qui place "AI et Intelligence" au-dessus de "Core Plateforme" et enterré ce qui vend réellement un niveau. CONTRAT: blanc sur l'accent olive mesuré 3,78:1 à l'extrémité sombre du gradient et 3.01:1 à son extrémité de lumière - les deux sous la section 4.5 que les étiquettes semi-plombs 14px ont besoin, C'est pourquoi les boutons et les badges lisent lavés. Chaque surface d'accent maintenant utilise la couleur de fond de la page telle qu'encre: 4,53:1 et 5,68:1, avec le vert gardé à plein régime plutôt qu'à la confusion pour sauver le texte blanc. Nombres de sièges de Redigts et JSON-LD corrigés à 25/100 pour correspondre au catalogue; Ils ont toujours dit 5/25 à partir de la même confusion que le titre de la carte. Vérifié avec une construction de production complète, qui a capturé deux trous de dactylographie tsc --noEmit ne l'a pas fait.
· kamo-internal
Tirez l'histoire d'un patient des pratiques qu'il çouait à suivre
La moitié sortante de l'échange, sur l'onglet d'enregistrement à côté de la surface de libération les enregistrements quittant et les enregistrements arrivent sont le travail d'une personne, et quelqu'un qui a Il suffit d'envoyer un résumé à une autre pratique est la personne la plus susceptible de vouloir la leur. Trois étapes ont été présentées en trois étapes, car c'est ce que sont les normes: demander s'ils connaissent cette personne, demandez-leur ce qu'ils détiennent, aller chercher ceux qui valent la peine d'avoir. Un bouton "importe tout" cacherait la décision du milieu et tirerait une décennie de doublons sur un patient qui a déplacé deux fois des pratiques. Le match n'est jamais auto-croyée: un faux livre l'histoire d'une autre personne dans ce graphique. Récupéré et réconcilié ne se ressemble jamais. Un document tiré d'une autre pratique est leur affirmation - il est attaché et lisible, et rien n'y atteint n'atteint cette Le problème du graphique, les médicaments ou les allergies jusqu'à ce qu'un clinicien enregistre ce qu'ils J'ai pris et ce qu'ils ont laissé. L'état vide le dit, parce que "reçoit" tranquillement lire comme "appliquée" est la façon dont une condition résolue de 2019 devient un problème actif. Une pratique sans réseau embarqué est racontée une fois, clairement, au lieu d'être à l'aide d'un bouton qui échoue toujours - et "ils n'ont pas d'enregistrement correspondant à ce patient" est étiqueté comme leur réponse plutôt que comme un défaut de demande. Ces deux-là doivent Ne se ressemble jamais: le premier est un fait clinique que quelqu'un peut arrêter de regarder parce que de. Également pris par le garde i18n et fixé: j'ai passé une valeur "partenaire" à un message sans espace réservé, et la valeur était de toute façon l'identifiant de patient à distance.
· SecurityService
La moitié sortante du TEFCA - demandez, ne répondez pas seulement
Tout ce qui a été construit jusqu'à présent répond aux questions des autres: découverte, document requête, document, la file d'attente d'examen de correspondance, la comptabilité. Pratique pourrait être ASKED et ne pourrait pas demander - et demander est la direction d'un clinicien les besoins, parce que l'histoire d'un nouveau patient est à la pratique qu'il utilisés pour y assister. ExchangeRequest a porté une colonne de direction tout le temps et seul INBOUND y a jamais écrit. Une requête sortante est une ACQUISITION, et non une divulgation. Le PHI se rend en direction Nous, donc rien ici ne touche le registre de divulgation - l'enregistrer là-bas mettrait une ligne dans la comptabilité d'un patient de 16,52,28 dollars, disant que leur dossier a été allé quelque part, est venu en provenance. Discovery lit la démographie d'un enregistrement d'ur et jamais de l'appelant. Un critère d'évaluation qui accepte des noms dactylographiés est un moyen de demander au réseau "avez-vous quelqu'un appelé ceci", qui est une capacité différente et bien pire que "retrouver mon l'histoire du patient". Chaque étape a besoin de VEW-CHART et d'une relation de soins, découverte incluait: quelles pratiques détiennent des enregistrements pour quelqu'un est lui-même des informations à leur sujet. Un document récupéré est déposé UNRECONCILED et le reste jusqu'à ce qu'un clinicien soit soumis à un clinicien. dit ce qu'ils en ont pris. Un autre résumé de la pratique est leur affirmation, et non le bilan de cette pratique; l'auto-fusion est la façon dont une condition résolue à partir de 2019 devient un problème actif et un médicament arrêté réapparaît sur une liste prescrive contre. La réconciliation nécessite une note, car "réconciliée" seule laisse le lecteur suivant incapable de dire si l'historique extérieur est dans le tableau ou encore dans l'attachement. Les requêtes en panne sont enregistrées aussi fermement que les questions qui réussissent, dans leur propre transactionnelle. "Nous avons demandé et ils ont refusé" est ce que quelqu'un qui enquête sur une lacune dans les besoins d'un patient, et le retour de la rangée avec l'échec effacerait C'est exactement le cas qui vaut la peine d'être conservé. Le transport est un siège de distribution. Dans le cadre du TEFCA, un participant authentifie avec un certificat X.509 délivré en vertu de l'accord commun - obtenu par la signature Accord de participation et fin de l'intégration de QHIN, et non en mettant une chaîne dans une base de données. Cette plate-forme n'a pas de chiffrement au repos pour un secret de ce genre et pas de relation QHIN pour obtenir un à partir de, donc inventer une colonne de jeton et appel le TEFCA produirait quelque chose qui aurait l'air fédéré et se connecte à rien. Ce que les navires sont un transport qui refuse chaque appel avec une phrase nommant le manquants d'intégration, et 503 plutôt qu'une liste vide - "aucun document trouvé" est un fait clinique sur lequel un clinicien peut agir et "nous ne pourrions pas demander" n'est pas, et un un système qui répond aux deux avec une liste vide d'informations enseigne aux gens à faire confiance à une absence qui n'a jamais été établi. Les documents saisis ont leur propre seau et leur propre ligne de stockage, à clé locataires d'abord comme les exportations, parce que rien ne les supprime et une pratique qui Les questions du réseau accumulent chaque résumé qu'il a jamais envoyé. 16 tests sur tout ce qui est au-dessus de la limite.
· kamo-shared-library
Ligne pour les documents extraits d'autres organisations
Sa propre domaine plutôt qu'une part de DOCUMENTS, pour la raison pour laquelle les exportations en vrac ont obtenu one: une pratique qui interroge un réseau d'information sur la santé systématiquement accumule chaque résumé qu'il a jamais été envoyé, et rien ne les supprime - un document récupéré est la preuve de ce que cette pratique a été informée et quand, qui est ce qu'est un Le lecteur vérifie quand le graphique et l'historique extérieur ne sont pas d'accord. Il est dit même que les octets venaient d'ailleurs. Le stockage est réel, c'est Il s'agit de cette pratique, et elle est détenue parce que cette pratique l'a demandée.
· VOIPService
Fournir un compte KamoPBX lors de la création d'un serveur téléphonique
L'ajout d'un serveur téléphonique KamoPX crée désormais le compte sous-jacent et écrit le compte id et royaume de retour à configJson. Tout configJson que le client envoyé est DISCARDED plutôt que fusionné: il n'y a pas de champ légitime pour qu'il le porte, et Accepter l'un serait un moyen de pointer un org sur le compte d'un autre locataire. Une défaillance de provisionnement laisse derrière elle la rangée marquée non connectée à la la raison, plutôt que de la supprimer - l'id peut déjà avoir un compte créé contre lui, et l'opérateur peut réessayer à partir de la page d'instance. Le client est un haricot partagé de sorte que la cache de jeton est réutilisée; construire un par Un appel serait ré-authentifié contre KamoPBX à chaque demande. kamo.pbx. sont des paramètres de plate-forme avec des valeurs de défaut de certificat vierges, donc un les rapports de plate-forme non configurés au lieu deéchoirs ouverts. 246 épreuves passent.
· kamo-internal
KamoPBX est sélectionnable
Le fournisseur est implémenté dans VOIPService, donc la porte à venir se détache. La description ne nomme plus le projet en amont et dit ce qui compte réellement à l'acheteur: Kamo le dirige, et il n'y a rien à signer. Éditer chirurgical uniquement. Ce tableau transporte désormais également la facturationClass et les aliments pour animaux. Le droit de résidence de lockedReason est fonction de travail simultané, de sorte qu'il est laissé en place plutôt que d'extirper - deux sources de vérité pour le catalogue des fournisseurs être pire qu'un long dossier. Fournisseurs de clés de dictionnaireBullet1 a d'abord été poussé (c822cfeb); les messages/est gitignore ici donc une construction locale verte ne prouve rien dans la production.
· SecurityService
API de service à droit-d'enfants
Liste, obtenir, mettre à jour et statut PATCH. Id/(eq) ou 401, un bon(e) contrôle ou 403, une variable de chemin de chaîne par parseUuid ou 400, et une aide défaillante() Supposer l'arrêt IllegalArgumentException du service en 404 pour une ligne manquante et 400 pour tout le reste. Un travail manquant est un 404 pour correspondre à chaque scintilleure et la page de détail rend son état non-fondé hors de ce code, et un 400 là-bas se cacherait "non il existe plus longtemps" derrière "votre demande a été mal formée". Un statut refusé la transition est une demande bien formée contre un emploi qui existe, de sorte que Le message de ServiceJobStatusMachine nommant les deux états atteint le client en tant que lisibles 400. Les lectures prennent VOIR-SERVICE-WORK et écrits prendre MANAGE-SERVICE-WORK, qui est un ENFANT DE VEW dans l'arbre des droits - donc une écriture qui s'est fixée pour VUE serait un Un déclassement silencieux qui semblait encore en cours de révision. Le test de la porte appelle tous les écrire avec une session de vision uniquement pour prouver qu'il n'arrive pas. L'essai permet aux vrais manipulateurs plutôt qu'à cupbiller la source. ServiceTaskBookRightsGateTest indique dans son propre javadoc qu'une source scanne «ne peut pas prouver que le contrôle s'exécute avant l'ouvrage»; BaseLosController résout le session à partir d'un attribut de demande, donc un MockHttpServletRequest portant une la liste des droits est suffisante pour lire le code du statut réel en retour et pour affirmer le service n'a jamais été atteint, qui est la moitié d'un scanner ne peut pas voir: un gestionnaire qui agit puis vérifie les retours 403 ayant déjà écrit la ligne. Atécéralement: la gestion de la droite échangée contre la vue, un contrôle à droite supprimé le bon contrôle s'est déplacé après l'appel de service, échoué() aplati à toujours-400, PATCH/status transformé en PUT, et l'orge de la session remplacée par un littéral. Chacun a produit un échec distinct désignant le manipulateur à défaut.
· kamo-shared-library
Une API de lecture/écriture org lue pour les emplois de service
ServiceJob a été une entité cartographiée avec des dépôts et des tests de réussite et pas de l'impossibilité de lire une ligne. Cela lui donne l'en-tête de l'UI d'ordre de travail fini Désemble déjà, de sorte que le réseau peut arrêter de générer sa propre. Formulé sur ServiceTaskBookApi/Service: String ids et cordes ISO-8601 sur le fil, orgId d'abord sur chaque méthode, chaque lecture mappée à une vue INSIDE le transaction parce que ServiceJob.visites est de Lazy, et le prédicat de locataire dans le JPQL plutôt qu'un contrôle après la charge. ServiceJobRepository déjà Portait les quatre requêtes, donc il n'est pas affecté. Deux décisions de forme que le DTO a dû prendre: - totalLabourMinutes est un nombre entier, ne flottez jamais des heures. Une tâche de 20 minutes est 0,333 heures et trois d'entre eux ne sont pas une heure; ServiceLineItem.labourMinutes plaident en faveur de la colonne et elle est également en attente. Il est résumé à partir des guichets réels des visites, qui est le seul travail qu'un emploi peut atteindre: ServiceLineItem pend d'un ordre sans lien avec un emploi. Temps d'administration, pas le temps facturé. - le commerce n'est pas la catégorie de l'UI. Dix cordes composites libres contre quinze Les constantes de ServiceTrade, et non 1:1 - "Plumbing Repair" est PLUMBING plus WorkClass.REPAIR, et le cours de travail est sur la base d'une rubrique. Le fil porte le commerce et le client rendent une étiquette. Le statut passe par ServiceJobStatusMachine et nulle part ailleurs, ce qui explique pourquoi JobInput n'a pas de membre du statut et StatusInput est son propre dossier. Un statut l'application générale serait accessible par l'intermédiaire de la mise à jour générale, Et la deuxième porte est celle que personne ne vérifie. Les tests sont comportementaux, et non les scanners à la source: le dépôt est un proxy dont findByIdForOrg honore l'ordonnance et dont la découverte BenyId ne fait délibérément pas, donc une lecture non portée est capturée comme une fuite plutôt que comme une rupture. Épreuve de mutations - assertTransition supprimée, assertTransition déplacée après setStatus, le une requête à champ d'action de type org-guichetée par findById, les minutes converties en heures, Filtre d'état déplacé hors de SQL, getVisits() gauche non lu, supprimé, et un composant «statut» ajouté à JobInput. Chacune d'elles a produit un désindésignant la propriété qu'il garde.
· kamo-login
Révéler l'espace de travail présélectionné, et donner la liste la barre de défilement de l'orge
Deux choses sur le cueilleur de l'espace de travail, les deux à peu près la même liste. L'espace de travail qu'un membre utilisé en dernier est présélectionné et nommé sur le bouton, parce que Cet écran est une confirmation plutôt qu'une enquête. Mais rien ne s'y est fait rouler. A Membre de vingt organisations dont la quatorzième siège habituelle a ouvert une liste montrant une ligne en surbrillance qu'ils ne pouvaient pas voir, sous une rubrique, au-dessus d'un bouton nommer un espace de travail qui n'apparaissait nulle part à l'écran. Si la présélection a-t-elle été? visible est descendu là où cet organisme se trouvait dans la liste. Elle est mise en vue une fois, sur place, et seulement lorsqu'elle est vraiment sortie de vue - une rangée déjà à l'écran reste là où elle est, parce que faire défiler une liste qui n'a pas besoin de faire défiler la lecture comme la page se déplaçant sous vous. Centré plutôt que flush à un bord, de sorte que les rangées au-dessus et au-dessous disent encore "c'est une position dans une liste". et qui défile chaque ancêtre parchemin, et sur un écran de connexion, il peut prendre la page avec. La liste est maintenant EPMATHMARKEREP est mesuré par rapport à la liste elle-même. exact, et contrairement à un rectement de délimitation, il n'est pas décalé par l'entrée des rangées transformation. La barre de défilement est la deuxième chose. Chaque accent sur cet écran est mélangé à partir de Couleur-primaire, que la feuille de style du thème a déjà fixée à la suivante: organisation de l'écran est marqué: le rail de sélection, la teinte de la ligne, Pilule "Dernier usage", le bouton. La barre de défilement était la seule pièce de chrome encore rendu dans le gris par défaut du navigateur, qui sur un locataire fortement de marque est le seul gris sur le panneau. C'est des tons de la même pièce maintenant - un translucide le pouce qui s'approfondit sur le vol stationnaire, une piste faible, les deux arrondis. Écrit comme un élément de style plutôt que comme des styles en ligne le reste de ce composants utilisent, parce qu'une barre de défilement n'est accessible que par des pseudo-éléments. Les deux vocabulaires sont là et ni l'un ni l'autre n'est un repli pour l'autre: WebKit et Le chrome lire les pseudo-éléments et ignorer "scrollbar-color", Firefox lit et n'a pas de pseudo-éléments.
· VOIPService
Mettre en œuvre le fournisseur KamoPBX
Remplace le stub. KamoPBX est la propre plate-forme de Kamo, donc l'organisation ne détient pas Agent de certificat: KamoPBXAccountProvisioner crée le compte lorsqu'un téléphone Serveur est ajouté, et KamoPBXClient empêchant un jeton à portée de main-d'œuvre par Appel du seul maître d'identité de Kamo. Auth utilise le nom de l'ap-clé du compte enfant, lu avec le jeton principal et échangés - documentés et schémas. Les sans-papiers comme : 'account'id, Owner-id la revendication n'est délibérément pas utilisée: elle échoue à ouvrir, retournant le privilège complet Jeton PARENT sans erreur lorsque le propriétaire-id est omis. scopedToken() affirme le Le jeton retourné est étendu à l'enfant et rejette un piston à portée de main comme l'escalade des privilèges. Fixée également à partir du stub: - getCallHistory est revenu nul, que le NPE n'importe quel appelant qui itère. - Les CDR sont à la meneur, donc l'histoire s'effondre sur l'interaction-id ou un appel show Deux ou trois fois. - le résultat est fixé par l'essai à exactement ANSWERED/NO RÉPONSE/BUYON/FAILED; Tout ce qui fait silencieusement des compteurs d'appel manqués lire zéro, si inconnu Le hangup provoque l'effondrement de l'affaibli plutôt que de passer. Les paramètres de la plate-forme (URL de base, compte maître, certificat d'administrateur, URL WSS) sont «Injecté à valeur ajoutée et jamais par or. 246 essais passent, dont 29 nouveaux.
· KlusterServices
Applications, médias, manifestes de bord et politique de réseau
- config.ini porte un bloc [zone) à partir du premier jour, donc une deuxième région est une configuration edit, pas la chirurgie. Les secrets sont remplacés par un point d'entrée au début du conteneur. plutôt que de cuire dans la ConfigMap. - ecallmgr est situé à côté de FreeSWITCH dans ONE pod: distribution brute d'erlang, Un cookie partagé, pas de TLS, et leur division franchit la limite 1500/1420 MTU. - Kamailio fait de la publicité 47.181.8.87 en écoutant le 192.168.4.36. - Cilium est par défaut-deny et toEndpoints: est à la portée de l'espace de noms, donc le La règle explicite kamo/kamovoip - kamopbx-apps:8000 est ce qui empêche la phase 3 d'échec comme une temporisation silencieuse.
· kamo-internal
et verrouillage de la carte Entreprise
Enregistre le bon côté client - liste, couleur, icône - et l'ajoute au bon côté du client l'ensemble non-tabing du test de couverture avec une note sur ce qu'il porte réellement, puisqu'il garde une action sur deux services plutôt qu'un onglet Configuration. Le magicien de l'ordre a rendu tous les plans actifs, inclus par l'entreprise, avec un prix lire directement à partir du catalogue. Le serveur retient maintenant ce prix et refuse l'abonnement pur, donc la carte allait montrer un plan il n'avait pas de numéro pour et ne pouvait pas acheter. Il est désactivé avec une note au lieu de laisser quelqu'un promener tout le magicien et rencontrer le refus à la fin. Le serveur est la limite dans les deux sens - EnterprisePlanGuard dans BillingService, et POSController pour le prix. Cela ne fait que sauver le voyage gaspillé.
· BillingService
Refuser un abonnement à l'entreprise en libre-service
L'entreprise est négociée. Se cachant le prix est la présentation; c'est le frontière. Une demande de nommage du plan d'entreprise est rejetée à moins que l'appelant ne - donc deviner le code du plan et l'afficher obtient directement la même réponse que la lecture de la console. Tire uniquement sur un code de plan APPELEUR. Les réconcilients nocturnes amender en direct abonnements à travers le même chemin de mise à jour avec un corps vide et pas HTTP demande du tout - la garde d'un nul cesserait de facturer chaque client négocié. La règle est "tu ne peux pas ni nommer ce plan", pas "ce plan ne peut pas être touché". L'identité est résolue exactement comme PlatformAdminInterceptor le résout, et le verdict est laissé à la plate-forme partagée, donc cela ne peut pas dériver de ce que SecurityService décide de la même personne. Le refus ne désigne aucune autorisation. Un client obtient ce sur quoi il peut agir - contactez-nous - pas un indice qu'un droit existe et qu'ils pourraient l'obtenir.
· SecurityService
Retenir la tarification des entreprises sur le catalogue
L'entreprise est négociée directement avec KamoCRM, donc son taux n'est pas à nous de publier. Chaque surface qui cite un prix plan lise ce seul point d'extrémité - le la page de prix publique via le mandataire de l'APIService, l'assistant d'ordre de commande dans l'application et l'entonnoir d'enregistrement - donc les prix sont supprimés de la charge utile ici plutôt plutôt que de demander à trois clients de se souvenir chacun d'un plan spécial pour un cas. Un appel interne (pouvoir public) n'a pas de droit sur la plate-forme et est toujours caviardé. Un appel de session est caviardé à moins que l'appelant ne soit en attente - La ligne du plan elle-même reste: un lecteur doit encore voir ce que l'entreprise SI et Sois dit de nous parler. Seuls les chiffres s'en vont. C'est la présentation. EnterprisePlanGuard dans BillingService est la limite qui refuse l'achat - quelqu'un qui devine le code du plan et le poste directement obtient la même réponse que quelqu'un qui lise la console.
· kamo-internal
Montrez ce que dit le tableau avant l'inscription de la prescription
Le serveur refuse maintenant une prescription qui entre en conflit avec une allergie enregistrée, un médicament le patient est déjà allumé, ou un patient personne n'a jamais demandé allergies et retourne ce qu'elle a trouvé. Cela le rend. Une carte sous le formulaire plutôt qu'une erreur en ligne, car la prescription est l'action intacte et la prochaine action est une décision clinique, pas une correction. Risque élevé les avertissements sont marqués: "pénicilline" et "pénicilline, forte criticité" ne sont pas les le même avertissement. Le champ de l'annulation pose la question : « Pourquoi prescris-tu ça de toute façon ? - et son assistant dit à quoi sert la réponse. Prescribing over d'une allergie enregistrée est une décision clinique quelqu'un peut avoir besoin de défendre plus tard, et la raison en est de ce que le défend. Le bouton reste désactivé jusqu'à ce qu'il y en ait un. "Ne prescrivez pas" est assis à côté. Un avertissement avec une seule issue est un avertissement les gens apprennent à cliquer. Les avertissements sont éliminés à chaque nouvelle tentative à moins qu'une raison ne soit portée. un accusé de réception dactylographié pour un médicament ne peut pas être réutilisé contre un autre.
· KlusterServices
CouchDB et LapinMQ sur k3m1
CouchDB q-8 / n-1, vérifié en direct. q est fixé à la création de la base de données et KamoPBX crée une base de données par compte plus MODB mensuel, donc q est calibré maintenant pour le le terme cluster à 3 nœuds; n peut être soulevé plus tard en éditant des cartes shard, q ne peut pas. Auto-compace activé - en amont l'amarré et le modèle d'écriture de KamoPBX se fragmente mal. Trois bogues de déploiement trouvés et corrigés en direct: - Monter la ConfigMap sur /opt/couchdb/etc/local.d le rend en lecture seule et le point d'entrée meurt en écrivant docker.ini. Utilise le sous-Path pour le fichier unique. - Un volume de Longhorn frais est détenu par les racines; le couchdb fonctionne comme étant uid 5984 et est sorti 1 sans sortie de journal du tout. Ajout de fsGroup plus un chown initContainer. - Le rabbitmq-diagnostic a besoin de plus que la temporisation de la sonde 1s par défaut; le serveur était en bonne santé (9s startup) mais la sonde a échoué. RabbitMQ fonctionne comme kamopbx, pas l'invité livré:inest avec boucle-utilisateurs off.
· kamo-shared-library
Dis que "les octets sont partis" à l'écart de "le stockage est vers le bas"
openRange a effondré chaque échec de noeud dans une IOException, donc un appelant pourrait faire Rien avec elle, mais retournez 500. Le navigateur n'est pas en mesure de rendre un 500 euros, il obtient un bit, "échou", et sec dessus - donc une fixation dont l'objet Il n'a jamais été écrit qu'un bouton de jeu d'un membre s'est discrète. L'échec Nous a atteints uniquement parce que quelqu'un a dit "il a envoyé mais il ne peut pas le jouer". Les deux causes méritent des réponses opposées. Le contenu absent est permanent et vaut la peine dire clairement que le stockage est inaccessible est transitoire et vaut la peine d'être réessayer. Augmenter ObjectNotStoredException uniquement lorsque la flotte d'accueil a répondu et que chaque réponse était NoSuchKey: un noeud qui ne pouvait pas être atteint pourrait être celui qui détient l'objet, donc un mélange reste une IOException ordinaire. Indiquer à un membre son dossier est perte permanente lors d'une panne partielle est la seule erreur ici qui ne peut pas être Il est revenu. Il étend IOException, de sorte que les sept sites d'appel existants ne fonctionnent pas et d'opter pour la distinction en la rattrapant d'abord.

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