Changelog
Ce qui est nouveau.
Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.
· kamo-shared-library
GESTIONNÉRÉTAIRES-SUBSCRIPTIONS
L'entreprise est négociée, jamais en libre-service. Cette droite porte les deux moitiés de qui : voir ce qu'il coûte, et mettre une organisation à son sujet. Catégorie.OPERATIONS plutôt que CONSOLE - elle porte une action qui entre en jeu une facturation du locataire, pas un seul écran de la console de la plate-forme. Sur la face de la plate-forme plutôt que sur le front de fermi pour la raison habituelle: un locataire l'administrateur peut modifier les modèles de sécurité de sa propre organisation, donc a RoleRightType permettrait à un client de s'accorder lui-même le niveau négocié. Persisté en tant qu'EnumType.STRING, donc l'ajout est sûr.
· SecurityService
Vérifiez le tableau avant d'écrire une ordonnance
La prescription a été ajoutée avec le tableau des allergies, la requête interaction-checking et un point d'extrémité du "diatour de sécurité" tout à côté, non lu. Un système qui enregistre une allergie et ensuite écrit la prescription de toute façon sans la mentionner est pire que celui qui n'a jamais enregistré l'allergie, parce que la pratique croit qu'il est en cours de vérification. Trois vérifient les données de la pratique elles-mêmes peuvent répondre exactement: le médicament correspond à une allergie enregistrée, le patient est déjà sur elle, ou personne n'a jamais demandé allergies du tout. Ce dernier est son propre avertissement - une liste vide signifie "non allergies connues » ou « personne interrogé », et un seul d'entre eux est sûr à prescrire contre. Une ligne "aucune allergie connue" enregistrée positivement n'est pas traitée comme une fond. Avertissements avec accusé de réception obligatoire, et non de refus. Un clinicien peut prescrire délibérément un médicament un patient a réagi légèrement jusqu'à il y a des années, et un système Cela l'interdit est une seule route. Ce qui ne doit pas se passer, c'est la prescription dans IGNORANCE, donc l'écriture est refusée jusqu'à ce que le prescripteur ait vu l'avertissement et dit par écrit pourquoi ils se poursuivent. Cette raison est enregistrée à WARN avec le membre, le médicament et le patient, parce qu'un examen ultérieur est à quoi il sert. 409 plutôt que 400: rien n'est mal formé. Il s'agit d'une prescription valide qui conflits avec ce qui est enregistré, et la demande identique réussit une fois qu'une raison est joint. Les avertissements voyagent dans le corps - un refus qui n'a fait que dire "non sûr" envoyer quelqu'un à la chasse sur le graphique pour ce qu'un ordinateur savait déjà. L'adaptation des douves et les mots de remplissage. "Amoxicilline 500mg" et "Amoxicilline" sont le même médicament, de sorte qu'une force différente ne peut pas cacher une allergie; "refusez", "oral" et "solution" apparaissent dans la moitié de tous les noms de médicaments et correspondants sur ceux-ci signaler chaque prescription contre toute allergie, ce qui est le moyen le plus rapide de faire les gens arrêtent de lire les avertissements. NE PAS vérifier les interactions médicamenteuses. Cela nécessite une base de données sous licence (Première Databank, Medi-Span) cette plateforme n'a pas, et une base nationale l'approximation est la chose la plus dangereuse que le fichier pourrait contenir: il aurait l'air comme la vérification de l'interaction, rejoigne-le, et manquez la plupart des interactions. Le la classe le dit en autant de mots. 15 essais.
· KlusterServices
Porte d'infrastructure de la phase 0
- TURN sur TLS sur 5349 avec un vrai cert (tour-kamocrm-com-cert). Sans rames: un client derrière un pare-feu de sortie de 443 seulement n'a pas de chemin médiatique. Vérifié à l'extérieur: l'auditeur vers le haut, la chaîne valide. - Tableau d'attribution des ports hôtes autorisés; k3m1 réservé au KamoPBX. - Règles du routeur NAT documentées en repo, y compris l'absence pbx.kamocrm.com Un record (nécessaire 42.181.8.87). - Commentaire de cotour corrigé selon lequel k3m1 est de 47.181.8.87; il est 42.181.8.87 et .87 sur 47.x appartiennent à un tiers sans lien de parenté. - Gamme de relais corrigée à la largeur réelle 52000-65535 (README dit 49152). - les sondes de vérification de phase0.sh de l'extérieur. Les lignes UDP font état INCONCLUSIVE plutôt que PASS: nc -z -u n'allumeront presque n'importe quel port de l'UDP, ce qui être un faux vert sur les chemins SIP et RTP.
· kamo-shared-library
Porter l'unité d'une fonctionnalité de plan aux surfaces d'achat
Le catalogue a stocké une unité par fonction tout au long - "GB/utilisateur", "utilisateurs", "contacts" - et le plan-car DTO l'a laissé tomber, de sorte que chaque surface rendant un une caractéristique mesurée imprimée un nombre nu. La page des prix a montré "Storage (15)" et une colonne de comparaison de 5/15/25/25/50, et un lecteur doit atteindre les conditions bien en dessous du pli pour apprendre, cela signifiait gigaoctets par utilisateur, en mutualé. Le dévoiler par consommateur à partir de featureCode est ce qui met une taille de bloc rassis sur la Un site de marketing déjà, donc il voyage avec la valeur à la place.
· KlusterServices
Échanger les salutations à KamoCRM-Main-Intro-2
Téléchargé en tant que nouveau fichier plutôt que d'écraser l'ancien, donc en arrière est un changement en une ligne en KAMO-ATTENDANT-INTRO plus un rechargement de dialplan re-télécharger nécessaire. Source stéréo de 48 kHz convertie en 8 kHz mono Astérisque nécessite 59,9 s, en baisse par rapport aux années 70. Vérifié en direct: CDR montre BackGround custom/kamocrm-main-tro-2, et Asterisk a décodé le fichier à 478954 octets de u-law, exactement 59.87s à 8000 B/s.
· kamo-internal
Auteur d'un livret de travail à prix forfaitaire, évalué à la minute
Remplace la vitre d'espace SW5 par la surface d'auteur réelle: trois sous-vues sur un onglet - livres, catégories, rubriques - suivant le SubView Commutateur MarketTaxShippingTab et MarketDiscountsTaquestsTauve-t-il utiliser pour les classes d'imposition et les listes de prix. Catégories et entrées restent handicapées jusqu'à ce qu'un livre soit choisi, et le nom et la version du livre choisi restent sur écran pendant qu'ils sont ouverts. labourMignages est délibérément le champ le plus bruyant sur l'écran. C'est le un numéro qui fait deux emplois - il fixe la ligne et il dimensionne le et c'est la raison pour laquelle un livre de tâches bat une liste de prix. Donc il obtient sa propre colonne avant le prix, son propre bloc encadré au sommet de l'éditeur d'entrée avec un lecture en direct "1h 30m", et un avertissement au-dessus du les entrées de comptage de table qui le manquent. Un livre d'entrées au prix coûtant sans durée est une liste de prix avec des étapes supplémentaires, et rien en aval peut vous dire que c'est arrivé. Lande également les deux pièces, la surface ne pourrait pas fonctionner sans: - - Aucun procuration n'a couvert cette voie: le commerce/les citations ont une fourche, mais c'est devant/commerce/boursage, donc chaque appel aurait 404'd dans le navigateur. La nouvelle itinéraire exporte PUT ainsi que GET/POST/DELETE les citations sur route sur laquelle il est modélisé n'a pas de PUT parce que les citations mises à jour avec PATCH, et chaque mise à jour du livre de tâches est un "PutMapping", donc la copie irait in extenso chaque travail de lecture et chaque réponse sauvegardée 405. - app/lib/serviceTaskBookApi.ts, en miroir ServiceTaskBookApi.java. Chaque id est une chaîne dans les deux sens: defaultParts transporte commerce-offings.uid valeurs, 19 chiffres uniques-rowid() Longueur qui perd leurs chiffres inférieurs à un double JS. BigDecimal reste un numéro et le fil Le mapper donne à Long un sérialiseur sécurisé JS et laisse BigDecimal seul. Deux comportements API façonnent la forme et sont enregistrés à côté du code qui travaille autour d'eux. L'inscription avec les filtres de l'Uti est également active et VRAI, Donc une surface de création l'utilisant ne pourrait jamais montrer un livre que vous aviez juste retraité; il s'agit d'une liste non filtrée et se rétrécie par le marché lui-même. Et un nul champ signifie "le laisser seul" à la mise à jour, de sorte que les entrées numériques vides sont omises plutôt qu'envoyées comme nulles. Épension par un test de contrat au niveau de la source: les chemins et les verbes du client contre les cartographies de ServiceTaskBookPurcteur, les verbes exportés du proxy contre ceux que le client utilise, et les types d'ID contre la chaîne. Le demi-recueillage croisée sans caisse du service de sécurité; le reste toujours courir.
· SecurityService
Livre de tâches à droite API
SW5 Tâche 3, demi-contrôleur. CRUD pour les livres, catégories, tâches et options, plus GET /-bookUid/tasks/by-code/-code------------------------------------------------ s'exécute lorsqu'il détient une tâche stockéeCode. Celle-ci est une requête unique indexée contre idx-service-task-book-code, pas un fetch-the-book-and-scan; il fonctionne par ligne de l'article sur un catalogue de centaines, c'est pourquoi il s'agit d'un point de terminaison. Les lectures ont besoin de VEW-SERVICE-WORK, écrits besoin de MANAGE-SERVICE-WORK. Tous deux ont atterri en SW1 et les deux portent déjà les neuf critères de service sur POSController. Le contrôleur que celui-ci ne ressemble pas délibérément est CommerceMarketController, qui ne porte pas de prépondérance nulle part et ne demande que si une session existe - le même trou SW4 trouvé sur les commandes et SW1 sur le travail de service. ServiceTaskBookRightsGatePortisPortopies chaque gestionnaire, et pincements séparés qui ne sont pas la mutation se contente du droit de regard (MANUI est un ENFANT DE VUE dans les droits Arbre, donc accepter VUE sur une écriture est une dégradation silencieuse) et qu'aucun manieur accepte la variante du client. Le locataire vient de la session et est passé comme premier service. argument, où il devient un prédicat à l'intérieur du JPQL. Rien ici ne charge un puis vérifient à qui il s'agissait. Les variables de chemin arrivent comme corde et passent parseUuid, donc un id malformé est un 400 au lieu d'un printemps 500. "Non trouvé" signifie ne pas trouver dans VOTRE ORG, qui est la seule question posée par le dépôt et la seule réponse d'un appelant devrait être compris.
· kamo-shared-library
Service de livre de tâches avec CRUD org-scoped et résolution de code
SW5 Tâche 3, moitié de bibliothèque. ServiceTaskBookService expose des livres, des catégories, tâches et options derrière une API org-scoped, plus resolveTaskByCode - le recherche d'un devis ou d'un ordre de travail s'exécute lorsqu'il stocke un code de tâche. Celui-là est une requête indexée unique contre idx-service-task-book-code, atteint à l'aide d'un code Le livre direct de ServiceTask FK, pas un fetch-the-book-alors-scan. Chaque point d'entrée prend l'orgId comme premier argument et le donne à un un référentiel dont JPQL porte le prédicat. Rien ne charge par uid et contrôle l'org après; cette forme est ce qui a fait six critères commerciaux Le commis dit avant que SW1 ne les répare. ServiceTaskBookServiceShapeTest Pinces à parts à la fois - la règle de signature et "tous les travaux de service" organisation.id'. Deux référentiels sont nécessaires que la tâche 1 ne crée pas: catégories et les options n'apportent pas d'org, de sorte que leurs lectures d'org-scopeds se joignent à travers le Livre (deux houblons pour une option). Les igots et les horodatages laissent en conditions dans les deux sens. Offering.uid est un Longue et un numéro JSON dans un navigateur est un double, qui est le même Piège qui a forcé QuoteConversionResult.orderUid pour devenir une chaîne dans SW4. Lire la carte des vues à l'intérieur de la transaction plutôt que de remettre des entités à un contrôleur, donc rien ne dépend de l'ouverture de vue reste vrai. Supprime les refus plutôt que la cascade: un livre qui contient encore des entrées au prix et une catégorie qui détient encore les tâches à la fois la réponse 409. Retirer un livre est isActive/effectiveUntUil, qui laisse chaque ligne vendue résolvable.
· kamo-internal
Non-passe de la tarification, de la fiscalité et des niveaux pour les marchés des services
Un marché du SERVICE a obtenu exactement trois onglets - Overview, Vendeurs, Accords. Clients, taxes et expéditions et rabais et prix ont tous été fermés sur commerceType et 'RETAIL', qui cachait trois surfaces par un og d'assistance: classes d'impôts (sous-convue de la fiscalité et de la navigation), listes de prix (une sous-examen de la sous-vue de Réductions et prix) et niveaux de compte (clients). Les trois mouvements derrière un prédicat nommé, SUPPORTS-PRICING-SURFACES, donc la raison vit à côté de la règle et l'ajout d'une verticale est une édition. Les clients doivent voyager avec des réductions: PriceList.cuscler Points de plus à CompteTier, donc des listes de prix non coupantes sans les feuilles de surface de niveau ce champ non rempli. Les produits et les stocks restent uniquement DÉTAIL. Un livre de tâches n'est pas un produit catalogue, et la présentation d'un service d'une grille de produits vides impliqueraient il devrait en remplir un. Ajoute l'entrée de l'onglet Annuaire des tâches uniquement SERVICE (touche en traits bas-cas-quantsissur, cependant les onglets de marché ne sont surveillés par aucun test de couverture). MarketTaskBookTab est un un espace réservé qui rend un avis; les terres de surface de la source qui le deviennent ensuite et le remplace en gros.
· kamo-internal
Appliquer une remise à une réclamation
"monnaie non appliquée" est de l'argent que le payeur a envoyé que personne attaché à une réclamation, Et la file d'attente ne pouvait être regardée que. APST-INSURANCE-PAYMENTS l'opération n'a pas pour effet de l'atteindre. Ligne par ligne, parce que c'est ainsi qu'un payeur statue. Une somme forfaitaire contre un la demande ne peut pas répondre à la procédure qui a été refusée et pourquoi, Il existe une file d'attente pour répondre et celui qu'un appel doit argumenter. La réclamation est trouvée par le numéro de la cotation du payeur, qui est le seul identifiant un transfert de fonds. L'arranger et regarder les lignes apparaître est la différence entre le dépôt de la créance payée par le payeur et celui qui a eu la même valeur. Laisser une ligne vierge signifie que le payeur ne l'a pas réglée, et le dialogue le dit : la réclamation reste ouverte jusqu'à ce que chaque ligne porte un chiffre. Sans cette phrase Quelqu'un tape-Ton pour être bien rangé et clôt une revendication toujours en cours de travail. Les montants restent des cordes tout le long du chemin. Les analyser en "valider" en les mettant le virage flottant binaire en argent, et 0,1 x 0,2 sur une ligne de réclamation est un le rééquilibrage est demandé à un patient de payer et on ne peut pas se dire la raison.
· SecurityService
Trouver une réclamation par le numéro un payeur cotation
L'apurement d'un transfert de fonds a besoin de la réclamation qu'il règle, et une remise de fonds n'est pas id - uniquement le nombre de la pratique envoyée. Sans cette recherche, appliquer l'argent signifie lire le numéro sur la remise sur fonds et la chasse pour la réclamation par l'œil, c'est ainsi qu'un paiement arrive au mauvais. Renvoie la réclamation avec ses lignes, car les payeurs statuent par ligne et affectation est par ligne. 404 En l'absence d'un tel nombre: "nous n'avons pas de prétention avec cela numéro" est la réponse que quelqu'un a posté les besoins, et un objet de succès vide lit comme une affirmation avec rien à son égard.
· kamo-internal
Quatre choses qui pourraient être regardés et non faits
Chacun d'entre eux avait un point de terminaison d'appel, une fonction client, et aucun moyen pour une personne. pour l'atteindre. Fermeture d'une boucle d'ordre. La file d'attente en boucle ouverte existe parce que l'épreuve ordonnée Personne n'est la façon classique dont un diagnostic est manqué - et il ne pourrait être que LIRE. Une file d'attente que personne ne peut comprendre qu'un seul peuple s'arrête de s'ouvrir. La raison en est posée. car "résultats examinés avec le patient" et "annulé, ils l'ont fait D'ailleurs "fermettez la même ligne et seulement la première signifie que quelqu'un a vu le résultat. Arrêter un médicament. Proposé sur la liste prescrite uniquement : médicaments est la prescription de quelqu'un d'autre, que cette pratique peut enregistrer et ne peut pas s'arrêter. La raison en est la situation - un cours terminé, une intolérance et un toute interaction met fin à la prescription, et seuls les deux derniers devraient l'arrêter. Révisé à nouveau. Retirer l'accès au portail, maintenant qu'un compte id peut être obtenu. La table ronde charge ce que l'accès du patient a déjà sur le support plutôt que derrière un bouton, Parce que c'est la première question que quelqu'un s'y pose - et inviter quelqu'un qui est déjà signé remplace leur lien de travail pour rien. Collecte d'une exportation finale. Il pourrait être commencé, regardé et annulé et Jamais téléchargé, ce qui est tout l'intérêt de l'exécuter. Le manifeste est freché en premier et les fichiers proviennent de lui: une exportation en vrac est une NDJSON par le type de ressource, et les ids de devinance produiraient un communiqué d'enregistrement qui est silencieusement incomplets. Egalement enlevéfreWaitingRoom, qui n'a rien appelé. PracticeDayPanel en déduit le même ensemble à partir du jour où il a déjà été chargé - un aller-retour au lieu de deux, Et il ne peut être en désaccord avec le calendrier à côté. Un commentaire le dit, parce qu'un l'emballage non utilisé lit comme un écran manquant à la personne suivante qui l'audit.
· kamo-shared-library
Ajouter le livret de tâches à plat
Un catalogue de tâches à prix dont les entrées portent la main-d'œuvreMinutes - le nombre que Tant les prix d'une ligne que la taille d'une visite. ServiceLineItem.taskCode, débarqué en SW3, joint à ServiceTask.code BY VALUE et non par FK: le livre est publié, donc a la ligne vendue doit indiquer ce qu'elle signifie lorsqu'elle a été vendue même après l'entrée est reprice ou retraité. ServiceTaskCategory reflète ProductCategory plutôt que de la réutiliser ProductCategory est joint à l'offre par le biais de la cartographie de la catégorie des produits, donc le partage Il mettrait "Drain clearing" et "Kitchen taps" dans un arbre. L'efficacité La fenêtre est soulevée de hr/card/MemberPayRate. ServiceTask détient son livre directement plutôt que de l'atteindre par l'intermédiaire de l'option catégorie: t.category.book est une jonction implicite, que Hibernate rend comme un l'adhésion intérieure, de sorte que toutes les tâches non classées disparaîtraient silencieusement des tâches dans ce livre ». columnDefinition est pincée sur chaque FK et chaque colonne de jointure d'éléments-collecte. Vérifié par l'exportation de la DDL à partir de la cartographie: aucune colonne jointure ne porte un DEFAULT, donc un FK non mis en place reste nul au lieu d'inventer une id parent aléatoire. Chaque dépôt lu est org-sescaillé à l'intérieur de la requête, jamais vérifié par la suite.
· InitializerService
Schéma de facturation PBX par extension, retournement et catalogue
PbxBillingSchemaMigration est 'Order(0) parce qu'il ajoute une colonne. Le l'entité de bibliothèque partagée mappe le mode phone-cost-cost à partir du moment où la construction commence, donc tout coureur chargeant un OrgBillingPolicy par l'intermédiaire de l'APP l'émet dans son SELECT - ordre tard ce coureur n'exécute jamais du tout, parce qu'un précédent meurt sur "La colonne ... n'existe pas" et enlève tout. org-extension-billing-days est en public, pas un schéma propre: tous les autres La table voip est. Il est unique sur (org-id, day, addon-code, abonnement-uid), un colonne plus large que l'équivalent de courrier, donc un organisme avec deux groupes de facturation tient deux lignes d'audit plutôt que l'une d'entre elles. NULL donc la règle nulls-are-distinct de SQL ne peut pas vaincre cet indice. - Répare les affectations InstanceSyncService avait effacer chaque rive-lait - neuf membres détenaient un et un les vingt-trois lignes d'extension lues nulles. Ne remplit qu'une ébauche: la face config jointes sur une chaîne d'extension non contrainte, donc c'est le record le plus faible et jamais écrase un id qui est mis. PbxAddonCatalogMigration graines à la fois dans chaque catalogue qui déjà vend les courriers, ancrés à la ligne EMAIL-HOSTING pour l'orge, le marché et le marché des plans compatibles. Porté de cette façon plutôt que par un id codé en dur parce que deux les locataires possèdent des add-ons avec les mêmes codes. KamoCRMPricingLouange Les a aussi, pour Les catalogues enseignés à partir d'ici - il est créé - donc l'édition est à elle seule fixe Rien n'est déjà dans la base de données.
· BillingService
Service de facturation par téléphone par extension
PricingModel.PER-EXTENSION, sa propre clé de quantité réservée, un allocator, un un réchauffeur nocturne, une porte d'enlèvement et l'API résumée - le jumeau de téléphone de la le fonctionnement de la boîte de courrier par courrier, différent partout où les données le font. La multi-instance est la différence qui traverse tout cela. Une gencilaire peut courir un Serveur KamoPBX et un serveur RingCentral à la fois, de sorte que les deux add-ons peuvent facturer dans le le même mois: l'expéditeur retourne un comptage par abonnement PER CODE, et chaque l'abonnement porte les deux codes avec zéro où rien n'a été attribué. Que fait conduire un code non utilisé pour mettre fin à la trajectoire ordinaire plutôt que la voie spéciale cas d'approvisionnement en relais de courrier. Perzexen est son propre modèle de prix, et non une réutilisation de PER-MAILBOX, et les parcs son comptent sous les extensions: plutôt que les boîtes à lettres:. Les deux conciliateurs courent indépendamment et pas plus ne peuvent perturber la quantité de l'autre. Sous licence, jamais - un prix de Stripe dosé rejette une quantité pure et simple et échoue à l'ensemble appel d'abonnement. PhoneCostMode est un frère de MailCostMode pour la même raison: réutiliser mail-cost-mode rendrait le nom de la colonne faux et déplacerait silencieusement le l'argent de téléphone quand un propriétaire changeant qui paie pour le courrier. L'attribution suit la membre affecté directement - les extensions n'ont pas besoin d'un concept primaire, car MEMBER-VOIP-CONFIG.MEMBER-ID est unique et MemberVoipConfigRetourne 409 sur un deuxième requérant, de sorte que le lien est déjà exclusif des deux côtés. org-extension-billing-days est mis à la disposition de l'abonnement ainsi que du jour et code. Le tableau de courrier n'est pas, donc sous GROUP-PAYS-OWN son deuxième groupe de facturation écrase la première et la ligne d'audit de la journée est erronée pour chaque groupe, mais dernier. Enregistré comme un suivi plutôt que copié. Le paquet de partage voip.billing est nommé dans "EnableJpaRepositories - que liste est explicite, et le mode de défaillance est le service qui refuse de commencer.
· kamo-marketing
Donnez aux add-ons du téléphone une icône de téléphone
PER-EXTENSION rend déjà "extension/mois" - ajouterOnUnitLabel la manipule et n'a pas besoin de changement. La carte d'icônes est: elle est calibrée sur le catalogue en minuscules code, et une touche inégalée n'est pas une erreur, il retombe silencieusement à un Boulon de fouet. Seuls les deux nouveaux codes PBX sont ajoutés ici. Trois entrées plus anciennes dans cette carte (kamo-email-hosting, video-conferencing, supplément-stockage) ne correspondent pas à leur Les codes enseignés soit et sont laissés seuls plutôt que devinés.
· kamo-internal
Indiquer quel coût d'extension, où les extensions sont gérées
ExtensionUsagePanel sur l'onglet stats, à côté de la boîte aux lettres et des panneaux de stockage: le nombre par classe, le taux de catalogue, le total mensuel et la règle en clair langue. Les deux règles de classe peuvent être affichées en même temps, car un gis peut exécuter un Serveur KamoPBX et serveur RingCentral le même mois - le courrier de l'affaire pourrait Ne jamais produire. Les numéros gratuits sont de même poids que celui facturable. Les dispositifs sont gratuits dans les deux classes, et extensions non attribuées - files d'attente, RIV, groupes de bague - sont libres en vertu de la règle des tiers et sont généralement majoritaires. Les deux sont mesuré par l'agrégateur plutôt que par l'exemplaire. Gating on the add-a-phone-server picker, avec deux règles reportées du Le courrier électronique fonctionne parce que les deux ont été appris à la deb manière difficile. Il échoue OUVERT, donc une facturation les coupures ne peuvent pas induire dans une migration intermédiaire. Et il ne verrouille jamais un type de fournisseur l'orge gère déjà une instance en direct de - les quatre orges avec un serveur téléphonique aujourd'hui ne contiennent aucun code additionnel, et leur disant le serveur qu'ils sont déjà l'utilisation nécessite un ajout serait faux. Une carte verrouillée est indiquée pour la raison. plutôt que simplement grisé. Les taux proviennent du catalogue, jamais codé en dur: un taux écrit dans l'UI devient un mensonge la première fois que le catalogue change, et rien ne manque quand il le fait.
· KlusterServices
La temporisation des files d'attente et la "presse 0" tombent toutes les deux par messagerie vocale
Remplace la boucle de file Dial()-Goto-rollé par app-queue. La décision facteur est DTMF: les chiffres NE sont PAS appariés avec le dialplan alors que Dial() est en courant, donc "pressez 0 en attente" ne peut pas être construit sur Dial() du tout. Le Le paramètre « contexte » de la file d'attente est ce qui le rend possible. a été transmise à cette extension 1 ou 2 ----------------------------------------------- e) directement sur la messagerie vocale, depuis l'accueil ou la prise de parole 10 min. mauvaise exten - - prompte "invalide", puis file d'attente La messagerie vocale principale est la boîte aux lettres 8100, qui ne fait délibérément pas partie du personnel. les boîtes aux lettres de sorte que les messages de ligne principale n'atterrissent pas dans la messagerie vocale personnelle de quelqu'un. L'accueil est joué avec Playback() from sounds/ et VoiceMail() est alors Appelé avec 's'. Deux conclusions ont conduit à cela : - Une copie installée en z était silencieusement REMOVED entre un rechargement de la messagerie vocale et le prochain appel, et VoiceMail est tombé Retour à l'intérine "la personne à l'extension ... est indisponible". Le le spool est géré par app-voicemail/FreePBX; les sons/ ne l'est pas. - L'option saute l'accueil ainsi que les instructions, malgré la docs le décrivant comme des instructions seulement. Avec l'enregistrement n'a jamais été enregistré joués du tout. Lecture de lecture et de lecture donne l'enregistrement --------------------------------------- Vérifié en direct, chaque chemin séparément: - temporisation de la file d'attente: queue-log EXITWITHTIMEOUT, puis CDR dcontext-kamo-voicemail lastapp-Playback custom/kamocrm-highcallv..., userfield QS:TIMEOUT - appuyez sur 0: file d'attente-log EXITWIKEY-0 avec RINGCANCELED sur l'organe de sonnerie, puis la même jambe de messagerie vocale - enregistrement et magasin : msg00.gsm écrit à la boîte aux lettres 8100 - réponse: queue-log CONNECT PJSIP/8080 - Deux notes d'essai qui valent la peine d'être conservées. «chaîne de départ» plafonne les appels à 30 dollars, qui tronqué plus de test et ressemble à un défaut du plan d'harmonie. Et test silencieux les enregistrements sont jetés par maxsilence 10, de sorte qu'un INBOX vide ne signifie pas L'enregistrement est cassé - prouvé en mettant temporairement maxsilence 0 et en restaureur. Ajout : les résultats en file d'attente sont autres invisible en dehors de la file d'attente.
· kamo-shared-library
Compter les extensions, un serveur tiers ne facture pas
Les files d'attente, les RIV, les groupes de ring et les pièces de rechange sont les extensions auxquelles personne n'est affecté, et en vertu de la règle des tiers, ils sont gratuits - douze d'une unité de production 17 extensions utilisables. class() les a abandonnés silencieusement, donc le nombre n'existe nulle part et le groupe de statistiques ne peut que affirmer qu'ils sont libres plutôt que de le montrer. Compté avec la même clé dedup utilisée le chemin facturable, donc le nombre gratuit ne peut pas compter une ligne deux rangées par la redevance.
· kamo-shared-library
Compter les extensions de téléphone facturables
Ajoute le jumeau de téléphone de l'agrégateur par boîte aux lettres: PbxBillingClass avec un Commutateur de type VoipProvider et pas de bras par défaut, OrgPbxBillingAggregator (pas de stéréotype de printemps - BillingService déclare le haricot), et l'audit quotidien instantané. Une différence structurelle passe par tout ce qui est en aval. est unique sur org-id, donc exactement un add-on de courrier pourrait jamais facturer non-zéro. VOIP-PROVIDER-INSTANCE est de nombreuses lignes par org, de sorte qu'une org peut rouler KamoPBX et RingCentral à la fois et les deux suppléments de facture au cours du même mois. La répartition est donc une liste plate portant une classe par extension, et countByClass() drives le code non utilisé à zéro par la voie ordinaire plutôt qu'un cas particulier. VoipProviderType est EnumType.ORDINAL, donc rien n'y est annexé; la couverture les broches d'essai de l'ordre ainsi que la classification. FREE-PBX classe en tant que tiers - le sélecteur l'offre en tant que PBX sur site, qui est l'astérisque du client. KAMO-PBX est donc le seul type hébergé et, étant donné qu'il n'existe pas d'instance KAMO-PBX et KamoPBXProvider encore lancé à partir de Chaque méthode, PBX-HOSTING ne facture rien du tout du tout aujourd'hui. Les deux dossiers d'affectation sont lus - et MEMBER-VOIP-CONFIG - parce que l'écran de réglages téléphoniques des membres écrit les deux, donc leur syndicat est exactement ce qu'un administrateur a défini. Un nombre qui décide de l'argent ne doit pas reposer sur une colonne un balayage de fond peut être nul, ce qui est précisément Ce que InstanceSyncService lui faisait. ExtensionBillingDay est mis à l'écoute sur l'abonnement ainsi que le jour et le code, donc un og avec deux groupes de facturation conserve deux lignes d'audit au lieu d'une annulation l'autre.
· KlusterServices
En-attente de la sonde de trous de musique 8000 et 8080 simultanément
Huit pistes de maintien téléchargées sous la forme de la classe MOH, qui s'est mélangée. Le l'ordre aléatoire vient de "random"1 sur la ligne dans la table de musique de FreePBX, qui est ce qui génère le jeu de l'album en musiconhold.s.conf. Il est dans la DB, pas dans la conf, ou dans le prochain FreePBX le écrase. Rimage après la salutation: extension --r' transmise à cette extension (inchangé) 1 ou 2 ------------------------------------------------------ temporisation ------------------------------------- mauvaise exten - - prompte "invalide", puis file d'attente La file d'attente est en boucle, donc les deux sonnent à la fois, d'abord pour répondre aux gains, et l'appelant entend tenir de la musique au lieu de sonnerie. Les membres sont appelés points d'extrémité bruts du PJSIP plutôt que de manière à travers à partir de did-direct ON PINPOSE: passer par l'avion d'extension de FreePBX appliquer la temporisation de la sonnerie de chaque extension, puis la main de l'appelant à celle-ci la messagerie vocale, qui est l'opposé de sonner indéfiniment. La boucle n'a pas de plafond, comme demandé. Le garde qui compte est l'Exec If: seulement NOANSWER signifie que nous avons vraiment sonné pour le temps plein. CHANUNAVAL (personne personne enregistrés), CONGESTION et BUSY tous en retour en millisecondes, donc sans MusicOnHold pausez le Goto devient un tourneau serré. Mesuré avec les deux membres retraité: 1 seconde de CPU et 24 lignes logarithmiques à 45 secondes en file d'attente. Sautent également la fenêtre de grâce de WaitExten pour jouer de la musique, donc le transfert de Les salutations pour faire la queue n'ont pas de fossé silencieux. Vérifié vivant : PJSIP/8080 observé à l'état de l'anneau sous avec le canal de l'appelant dans l'anneau. L'audio n'est pas dans la ConfigMap et le salut 1,1 MB plus 7,7 MB de pistes est bien au-delà de la limite d'objet etcd. Les deux ensembles vivent sur l'hôte astérisque-libPath et la commande de conversion est documentée à côté des globals qui les nomment.
· kamo-internal
Un emoji sur un seul message, et un message que vous pouvez corriger
Un membre a demandé les deux sur le chat individuel. Ils atterrissent sur le même menu permessage le La fenêtre a déjà, à côté de Copy et Unsend. Les réactions se présentent sous la bulle - l'emoji, combien de personnes l'ont utilisé, et si le spectateur est l'un d'entre eux, avec la puce elle-même comme la bascule réagissant ainsi et la réaction est un contrôle plutôt que deux. Les noms d'infobullition qui ont réagi, résolus contre la liste du membre de la session, la fenêtre est déjà en attente. Un "-" qui suit ouvre le cueilleur où il y a déjà un bar à accrocher; un message sans réactions encore passe le menu. Le cueilleur s'ouvre à mesure que les six personnes utilisent et s'étendent à l'actuel interrogeant un à la demande, parce qu'un panneau 320px tombé dans une fenêtre de discussion 320px n'est pas un réaction rapide. L'édition échange la bulle contre une boîte contenant ce que le SENDER a écrit - originalText, pas le traduction d'un lecteur peut être en train d'examiner - avec Enter to save et Escape pour annuler. Évasion s'arrête là plutôt que d'atteindre la fenêtre chrome, qui aurait fermé toute la discussion sur une édition annulée. Un message édité transporte "(édité)" pour tout le monde, ce qui fait l'édition après que quelqu'un l'ait lu honnêtement; cette divulgation est pourquoi l'édition, contrairement à l'absence d'envoi, est encore sur un message qui a été vu. Pendant que la boîte est ouverte, on dit que quelqu'un est en train d'éditer - le "... est en train d'éditer" Un indicateur a existé à ces deux extrémités depuis le travail de frappe et rien sur le web n'a jamais été relevé c'est ça. Référence et republié sur un intervalle, parce que les récepteurs netnent une virage Un indicateur après trois secondes et une correction longue semble autrement s'être arrêté. Les deux contrôles se sont retirés avec le compositeur lorsque la politique de discussion de l'organisation est gelée. membre: ils passent par la même porte sur le serveur, et offrent un contrôle qui sera Le refus est pire que de ne pas l'offrir. Prend le groupe zkamo/chat-core 0,1.8 et zkamo/réaltime 0,1.
· MediaService
Réagir à un message avec un emoji, et corriger celui que vous avez envoyé
· kamo-shared-library
Les réactions emoji par message, et un message que son expéditeur peut corriger
Deux choses qu'un membre a demandé sur le chat individuel: un emoji n'importe qui dans la conversation peut mettre un message unique, et la possibilité de corriger un message que vous avez déjà envoyé. MEDIA-OBJ-REACTIONS est d'une ligne par (message, membre, emoji), pas un compte par emoji. Chaque question que le produit pose d'une réaction concerne l'OMS: la puce est une bascule, donc il doit savoir si le spectateur y est déjà, et ses noms d'infobullition qui ont réagi. Le Une contrainte unique est ce qui rend le basculeur sûr sous un double-clic de course. L'édition conserve MediaObjMsg.message comme le corps actuel, tamponne DATE-EDITED et le fichier il a remplacé dans MEDIA-OBJ-MSG-EDITS. Ce tableau est la réponse à pourquoi l'édition n'est PAS A-t-il "qu'est-ce que quelqu'un l'a vu" comme il n'y a pas d'enlever. Unsend fait disparaître les mots de lecture, donc le refus après le fait est ce qui empêche une conversation d'être réécrite derrière celui d'un lecteur dos; une faute de frappe, d'un autre côté, est presque toujours remarquée après que quelqu'un l'ait lu, et la même porte refuserait des corrections exactement au moment où elles sont souhaitées. Différences de déclaration Au lieu de cela - chaque lecteur est dit que le message a été édité, et ce qu'il disait était conservé plutôt qu'écrasée. ChatMessageDto gagne les champs sur lesquels les deux événements circulent. Ce DTO n'est pas de la documentation: NATS à STOMP relais dans MediaService désérialigne en lui et ré-émet une liste de champs fixe, donc un champ qu'il ne déclare jamais atteint un navigateur.
· KlusterServices
Salutations enregistrées, par extension, 1/2 à l'opérateur
Remplace le modèle de maintien en jeu par l'introduction enregistrée: - joue la salutation ET écoute au en même temps, pour qu'un appel d'offres puisse le composer à partir de la première seconde. Lecture() ignorerait les keypresses jusqu'à la fin du fichier - 70 secondes pour être ignoré. - 1 et 2 vont tous les deux à l'extension de l'opérateur. - Rien de composé parus à la fin de l'accueil va à l'opérateur, après un Fenêtre de grâce de 4 secondes pour qu'un appelant qui commence à composer sur le dernier mot peut finit; sans lui, le deuxième chiffre arrive après que nous avons passé. - Correspondance directe par cadran - [3-9-XXX, pas XXXX. Avec le 'XXXX' un seul "1" est aussi un correspondant partiel à une extension à 4 chiffres, de sorte qu'Asterisk doit s'asseoir à travers TIMEOUT (chiffre) avant qu'il puisse écarter et l'appelant entend quatre secondes du silence. Le coût est que 1 et 2 sont réservés, donc aucune extension ne peut commencer avec eux - ce que le menu a déjà besoin. Les prorogations sont renumérotées 2523 - 8912 (Briana) et 2000 - 8 000 euros (Erik). Le Le bloc d'évaluation WebRTC est mis à la clé par l'extension NUMBER, renuméroté ainsi silencieusement touche une extension: il s'enregistre toujours sur WS, mais sans DTLS/ICE les médias ne s'établissent jamais et l'appelant reçoit un appel connecté sans audio. 8 000 n'avaient pas de bloc du tout en 2000 - et c'est maintenant la destination de chaque appelant qui compose 1, claque, ou ne dit rien, donc il a dû en gagner un. Le salut audio n'est pas dans cette ConfigMap: à 1,1 Mo, il soufflerait le etc. la limite de l'objet. Il vit sur l'hôte de l'astérisque-libPath et le commandement de conversion est documenté à côté du mondial qui le nomme. Vérifié en direct: jeux de bienvenue (Retourner custom/kamocrm-main-intro); 1- de did-direct 8000; 8912 - sa messagerie vocale avec les 3 messages intacts; une extension inconnue joue pbx-invalide puis tombe à 8000.
· KlusterServices
Auto-assisterant à l'entrée et musique en attente et numéro par extension
Les appels entrants n'avaient nulle part où aller: la table "introing" était complètement vide, Même un appel livré aurait été arrêté. Ajoute le contexte de l'accompagnateur plus les deux tunables qu'il lit. L'option m() de WaitExten est le mécanisme - il joue un cours de musique-main-hold-lien ET collecte des chiffres simultanément. Arrière-plan)/Playback() s'arrête à la fin de la fichier et MusicOnHold() ne collecte rien, donc ni l'un ni l'autre ne peut exprimer "la musique jusqu'à ce que les cadrans de l'appelant". Le module IVR n'est pas installé sur cette boîte (pas d'informations d'ouverture et voudrait une annonce enregistrée plutôt que de la musique de toute façon. Appliqué à l'adresse extensions-custom.conf sous un grep guard plutôt qu'écrit sur it: kamo-asterisk-support possède un bloc délimité par un marqueur dans le même fichier et préserve tout ce qui sort son octet contre octet. C'est aussi en train de créer /var/log/asterisk/cdr-csv. cdr-csv a enregistré un ERROR MISE EN GARDE pour chaque jambe d'appel parce que ce répertoire est absent de l'image. Le MySQL CDR est celui que nous lisons donc rien n'a été brisé, mais il a enterré le Log du myocarde d'astérisque : le même logarithme utilisé pour diagnostiquer les défauts d'appel. Vérifié en direct: réponses et prises en attente dans WaitExten(45,m(par contre-légitime)); une extension invalide joue pbx-invalid et reboucle la musique; une valeur l'extension atteint-did-direct et rang PJSIP/8080 (ANSWERED, 20s). Le Le compteur deATTENDANT-TRIES est également initialisé au niveau de l'étiquette, atteignant le menu sans qu'il soit laissé à l'écart une erreur d'analyse qui corrompait alors les suivantes: GotoIf, envoyer l'appel quelque part involontairement au lieu d'échouer haut et fort. La route entrante et les rangées de destinations personnalisées en direct dans le FreePBX MariaDB (persistant StatefulSet) et ne sont pas reproduits ici.
· InitializerService
Un calendrier partagé par org, un primaire par membre
L'approvisionnement n'avait rien sous-le, donc deux premières charges simultanées les deux insérés. Écroque à l'écart ce que cela a déjà fait - vingt lignes dupliquées à travers sept organisations et treize adhésions, les plus anciens, les perdants désactivés plutôt que supprimé et quoi que ce soit pointant en premier, puis ajouter l'indice unique partiel par type de calendrier qui rend une deuxième ligne impossible. Partiellement parce que l'invariant est sur les calendriers PROVISIONS: un unique clair l'indice sur l'organisation n'interdirait pas le propre membre, et un sur le l'adhésion n'interdirait pas les calendriers supplémentaires qu'un membre est libre de créer.
· kamo-internal
Revoir l'accès d'urgence et porte les deux dernières surfaces
Le critère d'évaluation du brise-verre avait une fonction cliente que rien n'appelait: L'accès d'urgence aux cartes a été enregistré et il n'y avait pas d'écran pour les lire. A brise-verrouillage que personne ne revoit la trace d'audit plutôt qu'un contrôle, qui est le c'est l'opposé de la raison pour laquelle la subvention est assortie de délais et de raison-elle. Il s'agit d'un sixième onglet du bureau des dossiers, de la surface de mise en conformité, et il montre la raison déclarée in extenso - cette phrase est la substance entière de l'examen, et une version résumée de celle-ci ne décide rien. Deux portes qui manquaient. Le bouton de rupture en verre n'est plus disponible qu'à un le rôle qui détient BREAK-GLASS-PATIENT-ACCESS; le montrer à quelqu'un qui ne peut l'utilisation leur enseigne le refus est arbitraire, quand la réponse honnête est que leur rôle n'inclut pas l'accès d'urgence - ils obtiennent cette phrase à la place. Et la comptabilité de l'information est son propre segment derrière VEW-DISCLOSURE-ACCOUNTING: production d'une copie pour un patient et lecture Partout, leur registre est déjà passé à des emplois différents. C'est le dernier des 26 droits cliniques d'atteindre ce qu'une personne peut atteindre.
· kamo-internal
Lever et envoyer une réclamation à partir de la file d'attente qui a trouvé l'œuvre
Le cycle des recettes se lisait dans sept files d'attente et ne pouvait pas présenter de réclamation. Chaque écriture maintenant pend de la file d'attente qui en faisait surface le besoin plutôt que de vivre sur un écran de sien. "J'ai toujours été facturé" est une liste des procédures effectuées sans frais et non. raison - rien n'a manqué et rien n'a dit à personne - donc la chose utile à côté chaque ligne crée la charge. La rangée laisse la file d'attente une fois qu'elle existe, qui est le point de la file d'attente. L'envoi n'est proposé que sur une demande encore en vue de la demande. Réenvoi d'une réclamation acceptée est la façon dont une pratique est payée deux fois puis récupérée, et le doublement du payeur la logique n'est pas quelque chose à invoquer. La confirmation indique que la demande est un projet et de la vérifier avant d'envoyer, parce que les deux étapes sont délibérément séparées et "élevé" seule Les gens croyaient qu'il était allé au payeur. Les deux actions sont absentes sans GESTION-CLAIMS. Les refus portent le serveur propre la phrase, qui désigne une restriction de rémunération personnelle ou une autorisation manquante - soit est plus d'utilisation que tout cet écran pourrait inventer.
· kamo-internal
Corriger les détails du patient
Les détails peuvent être saisis une seule fois et jamais fixés. Le groupe se réunit sous le résumé. plutôt que dans un écran de réglages, parce que le moment où quelqu'un remarque une erreur d'eau le nom est le moment où ils le regardent - et il ne rend rien du tout sans EDIT-PATIENT-DEMOGRAPHICS. Seuls les champs que l'utilisateur a effectivement changés sont envoyés. Le serveur laisse un absent le seul champ, et se differ contre ce qui a été chargé rend cela vrai dans la pratique: a un écran qui ne rend pas chaque colonne alors ne peut pas vider silencieusement ceux qu'il omet. La conséquence de la réindexation est indiquée avant l'épargne, et non après. Nom ou date modifier re-doseler le patient pour la vérification en double et pour les demandes d'enregistrement de d'autres pratiques; sans le dire, un nom marié semble cosmétique et le résultat est un patient pouvant être trouvé uniquement sous le nom qu'il n'utilise plus. Le MRN est représenté et non éditable. C'est comme ça que le monde extérieur nomme ce la personne, et la renumérotation brise chaque référence, un payeur, un laboratoire et une lettre préalable qui sont déjà tenues.

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