Salta al contenuto
KAMOUniverse

Changelog

Cosa c'è di nuovo.

Ogni miglioramento alla piattaforma, come si spedisce.

  1. · kamo-shared-library

    MANAGE ENTERPRISE SUBSCRIPS

    L'impresa è negoziata, mai self-serve. Questo cancelli giusti entrambi metà di che: vedere che cosa costa, e mettere un'organizzazione su di esso. Categoria.OPERAZIONI piuttosto che CONSOLE - porta un'azione che raggiunge in fatturazione di un inquilino, non uno schermo della console della piattaforma. Sulla spina dorsale della piattaforma piuttosto che l'inquilino per il solito motivo: un inquilino amministratore può modificare i modelli di sicurezza della propria organizzazione, quindi un RoleRightType qui avrebbe lasciato un cliente concedersi il livello negoziato. Persi come EnumType.STRING, quindi l'attesa è sicura.

  2. · SecurityService

    Controllare il grafico prima di scrivere una prescrizione

    La prescrizione è stata aggiunta con la tabella di allergia, la query di controllo dell'interazione e un "contesto di sicurezza" punta tutto seduto accanto a esso, non letto. Un sistema che registra un'allergia e poi scrive la prescrizione comunque senza menzionare che è peggio di uno che non ha mai registrato l'allergia, perché la pratica crede che sia essere controllati. Tre controlli i propri dati della pratica possono rispondere esattamente: il farmaco corrisponde a un allergia registrata, il paziente ci sta già addosso, o nessuno ha mai chiesto allergie. L'ultimo è il suo avvertimento — una lista vuota significa "no allergie conosciute" o "nessuno chiesto", e solo uno di loro è sicuro prescrivere contro. Una riga positiva registrata "non nota allergie" non è trattata come una sostanza. Avvertenze con un riconoscimento richiesto, non rifiuti. Un medico può prescrivere un farmaco che un paziente ha reagito lievemente a anni fa, e un sistema che proibisce che si tratti di una gente. Ciò che non deve accadere è prescrivere in IGNORANCE, così la scrittura viene rifiutata fino a quando il prescrittore ha visto l'avvertimento e dice per iscritto perché stanno procedendo. Questa ragione è collegata a WARN con il membro, il farmaco e il paziente, perché una recensione successiva è quello che è per. 409 anziché 400: nulla è malformato. È una prescrizione valida che i conflitti con ciò che è registrato, e la richiesta identica riesce una volta una ragione è attaccato. Gli avvertimenti viaggiano nel corpo — un rifiuto che solo ha detto "sicuro" avrebbe mandato qualcuno a caccia attraverso il grafico per quello che un computer sapeva già. Abbinamenti gocce punti di forza e parole di riempimento. "Amoxicillin 500mg" e "Amoxicillin" sono lo stesso farmaco in modo che una forza diversa non possa nascondere un'allergia; "tablet", "oral" e "soluzione" appaiono in metà di tutti i nomi di droga e la corrispondenza su di loro sarebbe bandiera ogni prescrizione contro ogni allergia, che è il modo più veloce per fare la gente smette di leggere avvertimenti. DELIBERATELY NON controllo di interazione droga-droga. Questo ha bisogno di un database autorizzato (Prima Databank, Medi-Span) questa piattaforma non ha, e un home-grown approssimazione è la cosa più pericolosa che il file potrebbe contenere: sembrerebbe come il controllo dell'interazione, essere fidati come esso, e perdere la maggior parte delle interazioni. The la classe lo dice in tante parole. 15 test.

  3. · KlusterServices

    Fase 0 cancello dell'infrastruttura

    - TURN sopra TLS su 5349 con un vero cert (turn-kamocrm-com-cert). Senza gira:, un cliente dietro un firewall di egresso di sola 443 non ha un percorso multimediale. Verificato esternamente: ascoltatore, catena valida. - tabella di allocazione porta host autorevole; k3m1 riservata a KamoPBX. - Regole Router NAT documentate in repo, incl. il mancante pbx.kamocrm.com Un record (necessario 42.181.8.87). - Corretto commento di coturn sostenendo k3m1 è 47.181.8.87; è 42.181.8.87 e .87 su 47.x appartiene ad una terza parte non correlata. - Gamma di relè corretto per il reale 52000-65535 (README ha detto 49152). - sonde check-phase0.sh dall'esterno. Le righe UDP riportano INCONCLUSIVE piuttosto che PASS: nc -z -u chiama quasi qualsiasi porta UDP aperta, che sarebbe essere un falso verde sui percorsi SIP e RTP.

  4. · kamo-shared-library

    Portare l'unità di una funzione di piano alle superfici di acquisto

    Il catalogo ha conservato un'unità per funzione per tutto il tempo - "GB/user", "users", "contatti" - e la plan-feature DTO ha abbandonato, così ogni superficie che rende un funzione misurata stampato un numero nudo. La pagina dei prezzi mostra "Storage (15)" e una colonna di confronto di 5 / 15 / 25 / 50, e un lettore ha dovuto raggiungere i Termini molto sotto la piega per imparare significava gigabyte per utente, in piscina. Deriving it per-consumer da featureCode è quello che ha messo una dimensione del blocco stante sul sito di marketing una volta già, quindi viaggia con il valore invece.

  5. · KlusterServices

    Passa il saluto in arrivo a KamoCRM-Main-Intro-2

    Caricato come nuovo file piuttosto che sovrascrivere il vecchio, quindi rotolare indietro è un cambiamento di linea a KAMO ATTENDANT INTRO plus a dialplan reload — no bisogno di ricarica. 48 kHz sorgente stereo convertita in 8 kHz mono Asterisk richiede; 59.9s, giù da 70s. Live verificato: CDR mostra BackGround personalizzato/kamocrm-main-intro-2, e Asterisk decodificato il file a 478954 byte di u-law, esattamente 59.87s a 8000 B/s.

  6. · kamo-internal

    Autore a flat-rate task book, prezzo al minuto

    Sostituisce il riquadro segnaposto SW5 con la vera superficie di autore: tre sottovisioni su una scheda — libri, categorie, voci — a seguito della SubView switcher MarketTaxShippingTab e MarketDiscountsTab già utilizzare per le classi fiscali e i listini dei prezzi. Categorie e iscrizioni per disabili fino a quando non viene scelto un libro, e il nome e la versione del libro scelto rimangono su schermo mentre sono aperti. manodoperaMinutes è deliberatamente il campo più forte sullo schermo. E'... un numero che fa due posti di lavoro — prezzi la linea e dimensiona visita — ed è l'intero motivo per cui un task book batte un listino prezzi. Così ottiene la propria colonna davanti al prezzo, il proprio blocco incorniciato in cima l'editor di ingresso con un live "1h 30m" di lettura, e un avviso sopra il voce di conteggio del tavolo che manca. Un libro di voci di prezzo con nessuna durata è un listino con passi extra, e niente a valle può dirvi che è successo. Anche atterra i due pezzi la superficie non poteva funzionare senza: - No, no. Nessun proxy ha coperto questo percorso: il commercio/quote ha un catch-all, ma è portata a /commerce/quote, così ogni chiamata avrebbe 404'd in browser. Il nuovo percorso esporta PUT e GET/POST/DELETE — il citazioni percorso è modellato su non ha PUT perché citazioni aggiornamento con PATCH, e ogni aggiornamento della cartella delle attività è un @PutMapping, quindi copiarlo verbatim avrebbe fatto ogni lavoro di lettura e ogni risposta salva 405. - app/lib/serviceTaskBookApi.ts, mirroring ServiceTaskBookApi.java. Ogni id è una stringa in entrambe le direzioni: defaultParts trasporta commerce offerings.uid valori, 19-digit Unique rowid() Longs che perdono le loro cifre basse a un doppio JS. BigDecimal rimane un numero — il filo mapper dà a Long un serializzatore JS-safe e lascia BigDecimal da solo. Due comportamenti API modellano il modulo e vengono registrati accanto al codice che funziona intorno a loro. Elencando con marketUid anche filtri isActive = TRUE, in modo che una superficie autorevole usando non poteva mostrare mai un libro che aveva appena in pensione; questo elenca non filtrato e restringe per mercato stesso. E una nullità campo significa "lasciare da solo" sull'aggiornamento, quindi gli input numerici vuoti sono omesso piuttosto che inviato come nullo. Definito da un test contrattuale di livello sorgente: i percorsi e i verbi del cliente contro le mappe di ServiceTaskBookController, i verbi esportati del proxy contro quelli che il cliente usa, e i tipi id contro la stringa. The cross-repo half skips senza un checkout SecurityService; il resto corre sempre.

  7. · SecurityService

    API del task book di destra

    SW5 Task 3, controllore metà. CRUD per libri, categorie, compiti e opzioni, plus GET /{bookUid}/tasks/by-code/{code} - la ricerca di un preventivo o di un ordine di lavoro esegue quando detiene un taskCode memorizzato. Questa è una sola domanda indicizzata contro idx service task book code, non un fetch-the-book-and-scan; funziona per voce di linea su un catalogo di centinaia, motivo per cui è un punto finale. Reads bisogno VIEW SERVICE WORK, scrive bisogno MANAGE SERVICE WORK. Entrambi sono atterrati SW1 ed entrambi già portano i nove endpoint di servizio su POSController. The controllore questo non assomiglia deliberatamente è CommerceMarketController, che non contiene @PreAuthorize ovunque e chiede solo se una sessione esiste - lo stesso foro SW4 trovato su ordini e SW1 trovato sul lavoro di servizio. ServiceTaskBookRightsGateTest perni ogni manubrio, e perni separati che non mutazione si stabilisce per il diritto di vista (MANAGE è un CHILD di VIEW nei diritti albero, quindi accettare VIEW su una scrittura è un downgrade silenzioso) e che nessun gestore accetta VIEW OWN SERVICE WORK del cliente come alternativa. L'inquilino viene dalla sessione ed è passato come il primo servizio argomento, dove diventa un predicato all'interno del JPQL. Non c'è niente che carichi e poi controlla di chi era. Le variabili del percorso arrivano come String e passano attraverso parseUuid, quindi un id malformato è un 400 piuttosto che una primavera 500. "Non trovato" significa non trovato nel tuo ORG, che è l'unica domanda che il repository ha chiesto e l'unica risposta un chiamante dovrebbe andare.

  8. · kamo-shared-library

    Servizio di Task book con CRUD org-scoped e risoluzione del codice

    SW5 Task 3, biblioteca metà. ServiceTaskBookService espone libri, categorie, attività e opzioni dietro un org-scoped API, più risolvereTaskByCode - il ricerca di un preventivo o ordine di lavoro si esibisce quando memorizza un taskCode. Quella è una sola domanda indicizzata contro idx service task book code, raggiunta attraverso Il libro diretto di ServiceTask FK, non un fetch-the-book-then-scan. Ogni punto di entrata prende orgId come il suo primo argomento e la consegna ad un repository il cui JPQL porta il predicato. Niente carichi da uid e controlli l'org in seguito; quella forma è ciò che ha fatto sei endpoint commerciali cross-tenant legge prima SW1 riparato. ServiceTaskBookServiceShapeTest perni entrambe le metà - la regola di firma e 'ogni servizio @Nome della regina organizzazione.id'. Sono necessari due repository che il Task 1 non ha creato: categorie e le opzioni non portano alcun org del proprio, quindi le loro letture org-scoped si uniscono attraverso il libro (due luppolo per un'opzione). Ids e timestamp partono come stringhe in entrambe le direzioni. Offer.uid è un 19-digit Long e un numero JSON in un browser è un doppio, che è lo stesso trappola che ha costretto QuoteConversionResult.orderUid a diventare uno String in SW4. Legge la mappa per vedere all'interno della transazione piuttosto che consegnare entità a un controllore, quindi niente dipende dalla visione aperta che rimane vera. Elimina rifiuti piuttosto che cascata: un libro che contiene ancora le voci di prezzo e una categoria che tiene ancora compiti entrambi rispondono 409. Ritirare un libro è isActive/efficace Fino a quando, che lascia ogni linea venduta risolvibile.

  9. · kamo-internal

    Prezzi, imposte e imposte sui mercati dei servizi

    Un mercato SERVICE ha ottenuto esattamente tre schede — Panoramica, venditori, accordi. I clienti, le tasse e le spese e i prezzi sono stati tutti gated su commerceType === 'RETAIL', che ha nascosto tre superfici un servizio org ha bisogno: classi fiscali (una sotto-vista di Tax & Shipping), liste dei prezzi (una sotto-vista di Sconti e prezzi), e tier conto (Customers). La tre mossa dietro un predicato chiamato, SUPPORTS PRICING SURFACES, così la ragione vive accanto alla regola e l'aggiunta di una verticale è una modifica. I clienti devono viaggiare con Sconti: PriceList.customerPuntamenti a AccountTier, così liste di prezzo non-gating senza foglie di superficie del livello quel campo non riempibile. I prodotti e l'inventario rimangono solo RETAIL. Un task book non è un prodotto catalogo, e mostrare un servizio org una griglia di prodotto vuota implica dovrebbe riempire uno. Aggiunge l'ingresso della scheda di SERVICE-solo task-book (chiave di minuscolo-hyphen, anche se le schede di mercato sono poliziotto da nessun test di copertura). MarketTaskBookTab è un segnaposto che rende un avviso; la superficie di autore atterra prossima e La sostituisce all'ingrosso.

  10. · kamo-internal

    Applicare una remittanza a un reclamo

    "Unapplied money" è denaro che il pagatore ha inviato che nessuno attaccato a un reclamo, e la coda potrebbe essere solo guardato. POST INSURANCE PAYMENTS ha presentato un operazione senza alcun modo per raggiungerlo. Linea per linea, perché è così che un pagatore si aggiudica. Una somma forfettaria contro una la domanda non può rispondere a quale procedura è stata negata e perché — la domanda c'è la coda dei pantaloncini per rispondere e quello che un appello deve discutere. Il reclamo viene rilevato dal numero delle citazioni del pagatore, che è l'unico identificatore una remittanza porta. Digitare e guardare le linee appaiono è la differenza tra la postazione contro il reclamo il pagatore pagato e quello che sembrava simile. Lasciare una riga vuota significa che il pagatore non l'ha risolto, e la finestra di dialogo dice così: il reclamo rimane aperto fino a quando ogni linea porta una cifra. Senza quella frase qualcuno di tipo zero per essere ordinato e chiude un reclamo ancora in fase di lavorazione. Gli importi rimangono in corda per tutto il percorso. Parli per "Validate" avrebbe messo binario punto galleggiante di nuovo in denaro, e 0.1 + 0.2 su una linea di reclamo è una equilibrare un paziente è chiesto di pagare e non può essere detto il motivo.

  11. · SecurityService

    Trovare un reclamo dal numero un preventivo

    Postare una remittanza ha bisogno della pretesa che si stabilisce, e una remittanza non porta — solo il numero della pratica inviata. Senza questa ricerca, applicando denaro significa leggere il numero fuori della remittanza e la caccia per il reclamo occhio, che è come un pagamento raggiunge quello sbagliato. Restituisce il reclamo con le sue linee, perché i pagatori sostengono per linea e posta è per linea. 404 quando non c'è tale numero: "Non abbiamo alcuna pretesa con questo numero" è la risposta che qualcuno invia le esigenze, e un oggetto di successo vuoto legge come una pretesa senza niente.

  12. · kamo-internal

    Quattro cose che potrebbero essere guardate e non fatte

    Ognuno di questi aveva un endpoint funzionante, una funzione client e nessun modo per una persona per raggiungerlo. Chiudere un anello d'ordine. La coda open-loops esiste perché il test ordinato nessuno inseguito è il modo classico di una diagnosi è mancato — e potrebbe solo essere Ricevuto. Una coda che nessuno può cancellare è una gente che smette di aprire. Il motivo è chiesto perché "risultato recensito con il paziente" e "cancellato, lo avevano fatto altrove" chiudono la stessa fila e solo il primo significa che qualcuno ha visto il risultato. Fermare un farmaco. Offerto solo nella lista prescritta: un segnalato farmaco è la prescrizione di qualcun altro, che questa pratica può registrare e Non si può fermare. La ragione conta — un corso finito, un'intolleranza e un interazione tutto fine la prescrizione, e solo gli ultimi due dovrebbero smettere di essere prescritto di nuovo. Ritiro l'accesso al portale, ora che un account id può essere ottenuto. Il pannello carica ciò che l'accesso al paziente ha già sul montaggio piuttosto che dietro un pulsante, perché questa è la prima domanda che qualcuno ci chiede — e invitare qualcuno che è già firmato in sostituisce il loro collegamento di lavoro per nulla. Raccogliere un'esportazione finita. Potrebbe essere iniziato, guardato e cancellato e mai scaricato, che è l'intero punto di eseguire uno. Il manifesto è recuperato prima e i file vengono da esso: un'esportazione di massa è un NDJSON per tipo di risorsa, e indovinare ids produrrebbe un rilascio record che è tranquillamente incompleto. Anche rimosso fetchWaitingRoom, che nulla chiamato. PracticeDayPanel deriva lo stesso set dal giorno che ha già caricato — un viaggio rotondo invece di due, e non può essere d'accordo con il programma accanto a esso. Un commento lo dice, perché un wrapper non utilizzato legge come uno schermo mancante alla persona successiva che controlla questo.

  13. · kamo-shared-library

    Aggiungi il libro delle attività a tasso piatto

    Un catalogo delle mansioni a prezzi i cui contributi portano manodoperaMinutes — il numero che entrambi i prezzi una linea e dimensioni una visita. ServiceLineItem.taskCode, atterrato in SW3, si unisce a ServiceTask.code BY VALUE e non da FK: il libro è versioneto, quindi un la linea venduta deve mantenere il significato che significa quando è stato venduto anche dopo l'entrata è rivalutato o in pensione. ServiceTaskCategory specchi ProductCategory piuttosto che riutilizzarlo — ProductCategory è unito all'Offerta attraverso ProductCategoryMapping, in modo da condividere avrebbe messo "Drain Clearing" e "Kitchen taps" in un albero. L'efficace la finestra viene sollevata da hr/timecard/MemberPayRate. ServiceTask tiene il suo libro direttamente piuttosto che raggiungerlo attraverso l'opzionale categoria: t.category.book è un'unione implicita, che Hibernate rende come un unione interiore, così ogni compito non categorizzato svanirebbe silenziosamente da "i compiti in questo libro". colonnaDefinizione è pinned su ogni FK e ogni colonna di unione di raccolta degli elementi. Verificato esportando il DDL dalla mappatura: nessuna colonna porta una DEFAULT, quindi un FK non impostato rimane nullo invece di inventare un id genitore casuale. Ogni repository letto è org-scoped all'interno della query, mai controllato dopo.

  14. · InitializerService

    Per-estensione PBX schema di fatturazione, riempimento e catalogo

    PbxBillingSchemaMigration è @Order(0) perché aggiunge una colonna. The entità libreria condivisa mappe phone cost mode dal momento in cui la costruzione inizia, quindi qualsiasi corridore che carica una OrgBillingPolicy attraverso JPA lo emette nel suo SELECT - ordinato in ritardo questo corridore non esegue affatto, perché uno prima muore "column ... non esiste" e prende tutta la corsa giù. org extension billing days è in pubblico, non uno schema proprio: ogni altro il tavolo del vuoto è. È unico su (org id, giorno, addon code, abbonamento uid), uno colonna più ampia dell'equivalente di posta, quindi un org con due gruppi di fatturazione mantiene due file di audit piuttosto che una sovrascrittura l'altra. abbonamento uid NON è NULL precisamente così la regola nulls-are-distinct di SQL non può sconfiggere quell'indice. E' il momento giusto. ripara le assegnazioni L'istanzaSyncService era stata cancellata su ogni lotto - nove membri ne hanno tenuto uno e tutte le ventitre righe di estensione leggere null. Riempi solo un vuoto: il lato config si unisce a una stringa di estensione senza ostacoli, quindi è il record più debole e mai sovrascrive un id che è impostato. PbxAddonCatalogMigrazione semi entrambi add-on in ogni catalogo che già vende quelli di posta, ancorati alla fila EMAIL HOSTING per org, mercato e piani compatibili. Scoperto in quel modo piuttosto che da un id hardcoded perché due inquilini propri componenti aggiuntivi con gli stessi codici. KamoCRMPricing Loader li prende anche per cataloghi semenzato da qui in - è solo creato, quindi modificarlo da solo correzioni niente già nel database.

  15. · BillingService

    Servizio telefonico di Bill dall'estensione

    PricingModel.PER EXTENSION, la sua chiave di quantità riservata, un allocatore, un riconciliatore notturno, un cancello di rimozione e l'API di sintesi - il gemello del telefono del per-mailbox lavoro, differendo ovunque i dati lo fanno. Multi-instance è la differenza che attraversa tutto. Un org può eseguire un Server KamoPBX e un server RingCentral subito, così entrambi i componenti aggiuntivi possono fatturare nel stesso mese: l'allocator restituisce un conteggio per abbonamento PER CODE, e ogni l'abbonamento porta entrambi i codici con zero dove nulla è stato attribuito. Che cosa? fa guidare un codice inutilizzato a zero il percorso ordinario piuttosto che lo speciale il riconciliatore di posta ha bisogno. PER EXTENSION è il suo PricingModel, non un riutilizzo di PER MAILBOX, e i suoi parchi conta sotto extensions: piuttosto che mailboxes:. I due riconciliatori funzionano indipendentemente e nessuno può disturbare la quantità dell'altro. Licenziata, mai misurato - un prezzo misurato Stripe rifiuta una quantità errata e non riesce l'intero Abbonamento. PhoneCostMode è un fratello di MailCostMode per lo stesso motivo: riutilizzare mail cost mode renderebbe il nome della colonna falso e muoverebbe silenziosamente soldi del telefono quando un proprietario ha cambiato che paga per posta. L'attribuzione segue membro assegnato direttamente - estensioni non hanno bisogno di concetto primario, perché MEMBER VOIP CONFIG.MEMBER ID è unico e MemberVoipConfigController restituisce 409 su un secondo richiedente, quindi il collegamento è già esclusivo su entrambi i lati. org extension billing days è keyed sull'abbonamento così come il giorno e Codice. La tabella di posta non è, quindi sotto GROUP PAYS OWN il suo secondo gruppo di fatturazione sovrascrive la prima e la riga di audit del giorno è sbagliata per ogni gruppo, ma la Ultimo. Registrato come follow-up piuttosto che copiato. Il pacchetto Voip.billing condiviso-lib è chiamato in @EnableJpaRepositories - che elenco è esplicito, e la modalità di fallimento è il servizio rifiuta di iniziare.

  16. · kamo-marketing

    Give the phone add-ons a phone icon

    PER_EXTENSION already renders as "extension/month" - addOnUnitLabel handles it and needs no change. The icon map does: it is keyed on the lowercased catalog code, and an unmatched key is not an error, it silently falls back to a lightning bolt. Only the two new PBX codes are added here. Three older entries in that map (kamo_email_hosting, video_conferencing, additional_storage) do not match their seeded codes either and are left alone rather than guessed at.

  17. · kamo-internal

    Mostra il costo delle estensioni, dove vengono gestite le estensioni

    ExtensionUsagePanel sulla scheda statistiche, accanto alla casella di posta e pannelli di archiviazione: conteggio per classe, il tasso di catalogo, il totale mensile, e la regola in pianura lingua. Entrambe le regole di classe possono essere mostrate subito, perché un org può eseguire un Server KamoPBX e un server RingCentral nello stesso mese - la casella potrebbe mai produrre. I numeri liberi sono dati lo stesso peso di quello fatturabile. I dispositivi sono gratis sotto entrambe le classi, e le estensioni senza firma - code, IVR, gruppi di anelli - sono liberi sotto la regola di terze parti e sono di solito la maggioranza. Entrambi misurato dall'aggregatore piuttosto che affermato nella copia. Gating sul picker add-a-phone-server, con due regole portate avanti dal e-mail di lavoro perché entrambi sono stati imparati il modo difficile. fallisce OPEN, quindi una fatturazione l'esternalizzazione non può infilare una media di org. E non blocca mai un tipo di fornitore l'org già esegue un'istanza live di - tutti e quattro gli org con un server del telefono oggi non tenere alcun codice aggiuntivo affatto, e dicendo loro il server sono già usare richiede un add-on sarebbe falso. Una scheda bloccata viene mostrata con il motivo su di esso piuttosto che semplicemente sgridato. Le tariffe vengono dal catalogo, mai hardcoded: una tariffa scritta nell'interfaccia utente diventa una bugia la prima volta che il catalogo cambia, e nulla fallisce quando Si'.

  18. · KlusterServices

    Queue timeout e "press 0" entrambi cadono attraverso la segreteria

    Sostituisce il quadrante a mano()+ Vai alla coda loop con app queue. La decisione fattore è DTMF: le cifre NON sono abbinate contro il dialplan mentre Dial() è in esecuzione, quindi "press 0 mentre in attesa" non può essere costruito su Dial() affatto. The l'impostazione `context = kamo-queue-exit` è ciò che rende possibile. estensione -> inoltrata a tale estensione 1 o 2 code 0 -> direttamente alla segreteria telefonica, dal saluto o dalla presa 10 min -> segreteria cattivo exten -> "invalid" prompt, quindi coda Main-line voicemail è mailbox 8100, deliberatamente non uno del personale mailboxes così i messaggi di linea principale non atterrare nella segreteria personale di qualcuno. Il saluto viene giocato con Playback() da suoni / e VoiceMail() è allora chiamato con `s`. Due risultati hanno guidato che: - Una copia installata in un istante. RIMOVATO tra una segreteria telefonica e la successiva chiamata, e VoiceMail cadde all'interno "la persona in estensione ... non è disponibile". The spool è gestito da app voicemail/FreePBX; suoni / non è. - L'opzione `s` salta il saluto e le istruzioni, nonostante i documenti che lo descrivono solo come istruzioni. Con `su` la registrazione mai suonato. Riproduzione + `s` dà la registrazione -> beep -> registrare esattamente. Vivo verificato, ogni percorso separatamente: - timeout della coda: code log EXITWITHTIMEOUT, poi CDR dcontext=kamo-voicemail ultimaapp=Riproduzione personalizzata/kamocrm-highcallv..., userfield QS:TIMEOUT - premere 0: code log EXITWITHKEY|0 con RINGCANCELED sul membro ringing, poi la stessa gamba segreteria - record + negozio: msg0000.gsm scritto alla mailbox 8100 - risposta: code log CONNECT PJSIP/8080 -> COMPLETA Due note di prova che vale la pena conservare. `channel origin` caps chiamate a ~30s, che tronca ogni test più lungo e sembra un difetto del dialplan. E prova silenziosa le registrazioni vengono scartate da maxsilence=10, quindi un INBOX vuoto non significa la registrazione è rotta — provata da impostazione provvisoria maxsilence=0 e il ripristino. Addirittura... risultati della coda sono altrimenti invisibile fuori coda log.

  19. · kamo-shared-library

    Contare le estensioni un server di terze parti non addebita per

    Queues, IVR, gruppi di anelli e risparmi sono le estensioni a cui nessuno è assegnato, e sotto la regola di terzi sono liberi - dodici di una produzione org's diciassette estensioni utilizzabili. classify() li ha lasciati silenziosamente, quindi il numero non esisteva da nessuna parte e il pannello delle statistiche poteva solo affermare che erano liberi piuttosto che mostrarlo. Contato con la stessa chiave dedup il percorso fatturabile utilizza, quindi il numero libero non può raddoppiare di fila la carica non sarebbe.

  20. · kamo-shared-library

    Contare estensioni telefoniche fatturabili

    Aggiunge la gemella telefonica dell'aggregatore per-mailbox: PbxBillingClass con un esaustivo VoipProviderType switch e nessun braccio predefinito, OrgPbxBillingAggregator (no stereotipo di primavera - BillingService dichiara il fagiolo), e l'audit giornaliero snapshot. Una differenza strutturale attraversa tutto a valle. og email provider è unico su org id, quindi esattamente un add-on mail potrebbe mai fatturare non-zero. VOIP PROVIDER INSTANCE è molte righe per org, quindi un org può eseguire KamoPBX e RingCentral subito ed entrambi i componenti aggiuntivi fattura nello stesso mese. La ripartizione è quindi una lista piana che trasporta una classe per estensione, e conteByClass() drive il codice inutilizzato a zero attraverso il percorso ordinario piuttosto che un caso speciale. VoipProviderType è EnumType.ORDINAL, quindi nulla è allegato ad esso; la copertura perni di prova l'ordine così come la classificazione. FREE PBX classifica come terza parte - il raccoglitore lo offre come un PBX on-premise, che è il proprio Asterisk del cliente. KAMO PBX è quindi l'unico tipo ospitato e, dal momento che non esiste un'istanza KAMO PBX e KamoPBXProvider lancia ancora da ogni metodo, PBX HOSTING correttamente non fattura affatto oggi. Entrambi i record di assegnazione sono letti. MEMBER VOIP CONFIG - perché lo schermo del telefono del membro scrive entrambi, quindi il loro sindacato è esattamente ciò che un amministratore impostato. Un numero che decide soldi non deve riposare su una colonna una scansione di sfondo può zero, che è precisamente Che cosa sta facendo il servizio. Estensione BillingDay è incentrata sull'abbonamento così come il giorno e il codice, quindi un org con due gruppi di fatturazione mantiene due file di audit invece di una sovrascrittura l'altro.

  21. · KlusterServices

    Coda Hold-music che suona 8000 e 8080 simultaneamente

    Otto tracce di attesa caricate come la classe "kamocrm-hold" MOH, ammortizzata. The ordine casuale viene da `random=1` sulla riga nella tabella `music` di FreePBX, che è ciò che genera `sort=random` in musiconhold additional.conf — insieme nel DB, non nel conf, o il prossimo FreePBX ricarica lo sovrascrive. Routing dopo il saluto: estensione -> inoltrata a tale estensione (invariata) 1 o 2 code timeout -> coda cattivo exten -> "invalid" prompt, quindi coda La coda e' in un loop, quindi... entrambi suonano subito, prima di rispondere vince, e il chiamante sente tenere la musica invece di ringback in tutto. I membri sono divisi come punti finali PJSIP grezzi piuttosto che attraverso da-did-direct ON PURPOSE: passare attraverso il programma di estensione di FreePBX sarebbe applicare il timer di ogni estensione e poi consegnare il chiamante a quella persona voicemail, che è l'opposto di suonare indefinitamente. Il loop non ha il tappo, come richiesto. La guardia che conta è la ExecIf: solo NOANSWER significa che abbiamo davvero suonato per il timeout completo. CHANUNAVAIL (Nessuno registrato), CONGESTION e BUSY tutti ritornano in millisecondi, quindi senza un MusicOnHold ferma il Goto diventa un giro stretto. Misurato con entrambi i membri deregistrato: 1 secondo di CPU e 24 linee di log in 45 secondi in coda. Inoltre alza la finestra di grazia di WaitExten per suonare la musica tenere, così la consegna da il saluto alla coda non ha un vuoto silenzioso. Live verificato: PJSIP/8080 osservato in Ringing stato sotto Con il canale di chiamata a Ring. L'audio non è nel ConfigMap — saluto 1.1 MB più 7.7 MB di tracce è bene passato il limite dell'oggetto eccd. Entrambi i set vivono sull'host asterisk-libPath e il comando di conversione è documentato accanto ai globali che li chiamano.

  22. · kamo-internal

    Un emoji su un singolo messaggio e un messaggio che puoi correggere

    Un membro ha chiesto sia sulla chat individuale. Essi atterrano sullo stesso menu per messaggio la finestra ha già, accanto a Copy e Unsend. Le reazioni rendono come una barra di chip sotto la bolla — le emoji, quante persone l'hanno usato, e se lo spettatore è uno di loro, con il chip stesso come il toggle così reagendo e non reagire sono un controllo piuttosto che due. I nomi di tooltip che hanno reagito, risolto contro l'elenco dei membri della sessione la finestra già detiene. Un percorso "+" apre il picker dove c'è già un bar per appenderlo; un messaggio senza reazioni passa ancora attraverso il menu. Il raccoglitore si apre come le sei persone effettivamente utilizzare e si espande nell'esistente ricercabile uno su richiesta, perché un pannello 320px è caduto in una finestra di chat 320px non è una reazione rapida. Modificare scambia la bolla per una scatola che tiene ciò che il SENDER ha scritto — originaleTesto, non il traduzione di un lettore può essere guardando — con Invio per salvare e fuga per annullare. Fuga si ferma lì piuttosto che raggiungere la finestra cromata, che avrebbe chiuso l'intera chat su una modifica cancellata. Un messaggio modificato porta "(edited)" per tutti, che è ciò che fa modificare dopo che qualcuno ha letto onesto; che la divulgazione è il motivo per cui la modifica, a differenza di unsend, è ancora offerto su un messaggio che è stato visto. Mentre la scatola è aperta la conversazione viene detto a qualcuno sta modificando - il "... sta modificando" l'indicatore è esistito su entrambe le estremità dal lavoro di digitazione e nulla su web ha mai alzato Ecco. Contato di riferimento e ripubblicato su un intervallo, perché i ricevitori chiariscono una stala indicatore dopo tre secondi e una lunga correzione sembrerebbe altrimenti essersi fermato. Entrambi i controlli vengono fuori con il compositore quando la politica di chat dell'organizzazione congela questo membro: passano attraverso la stessa porta sul server e offrono un controllo che sarà rifiutato è peggio di non offrirlo. Prende @kamo/chat-core 0.1.8 e @kamo/realtime 0.1.1.

  23. · MediaService

    Reagire a un messaggio con un emoji, e correggere quello che hai inviato

    "POST"... "Sistema o cancella l'emoji del chiamante e risponde con... l'intero set di reazione del messaggio, quindi un client che si è corsa converge sul server stato invece di per sé indovinare. La reazione è trattata come parlare: stessa sessione controllo e stessa organizzazione chat policy come l'invio, perché un membro che non può rispondere qui non può rispondere con un 👍. Le emoji sono convalidate, non fidate. È reso verbatim sotto qualcun altro messaggio nella conversazione di tutti, quindi il cancello è a forma di whitelist e strutturale: diviso su il falegname di larghezza zero, nessun segmento può contenere più di un pittografo. Ci vuole una famiglia o una professione tonica della pelle e rifiuta 👍👍, che è due reazioni digitate come una, insieme a testo, solitari e mezza bandiera. PATCH /api/media/messages/{id} corregge un messaggio. Deliberatamente non ha lasciato se qualcuno ha letto, che è l'unica regola che unsend ha — vedere l'impegno condiviso-librario per il perché i due differiscono. Si rifiuta un corpo vuoto su un messaggio senza file (la scrittura di un messaggio è in sospeso, che ha una propria regola), rifiuta un messaggio già consegnato ad un esterno social platform (nessuno qui può raggiungere quella copia), lascia cadere le traduzioni cache del messaggio, e file che diceva. Inoltre: MESSAGE DELETED e ATTACHMENT REVOKED ora portano `id` e `messageId`. La staffa progetti ogni frame attraverso ChatMessageDto, che non ha un campo MessageId, così entrambi gli eventi raggiunto il browser con id: null e ogni abbonato li ha scartati — un messaggio non inviato rimase sullo schermo dell'altro lato fino a quando non si ricaricarono. Il relè javadoc ora dice ad alta voce che si tratta di un permesso, dal momento che è ciò che ha reso possibile una goccia silenziosa.

  24. · kamo-shared-library

    Per-message emoji reazioni, e un messaggio il suo mittente può correggere

    Due cose che un membro ha chiesto sulla chat individuale: un emoji chiunque nella conversazione può mettere su un singolo messaggio, e la capacità di correggere un messaggio che hai già inviato. MEDIA OBJ REACTIONS è una riga per (messaggio, membro, emoji), non un conteggio per emoji. Ogni domanda che il prodotto fa di una reazione riguarda l'OMS: il chip è un gioco, quindi deve sapere se lo spettatore è già in esso, e i suoi nomi di punta degli strumenti che hanno reagito. The vincolo unico è ciò che rende il gioco sicuro sotto un doppio click racing. Modificare mantiene MediaObjMsg.message come il corpo corrente, timbri DATE EDITED e file il corpo sostituito in MEDIA OBJ MSG EDITS. Quella tabella è la risposta al perché la modifica NON è "C'e' qualcuno che l'ha visto" e' il modo in cui non e' piu'. Unsend fa sparire le parole di lettura, quindi rifiutarlo dopo che il fatto è ciò che ferma una conversazione che viene riscritta dietro un lettore indietro; un typo, d'altra parte, è quasi sempre notato dopo che qualcuno ha letto, e lo stesso cancello rifiuti le correzioni esattamente quando sono ricercati. Pagamenti di divulgazione esso invece — ogni lettore è detto che il messaggio è stato modificato, e quello che ha usato dire è tenuto piuttosto che sovrascritto. ChatMessageDto acquisisce i campi su entrambi gli eventi. Che il DTO non sia documentazione: NATS a relè STOMP in MediaService deserializza in esso e re-emette una lista di campo fissa, così un campo che non dichiara mai raggiunge un browser.

  25. · KlusterServices

    Saluto registrato, quadrante per estensione, 1/2 per operatore

    Sostituisce il pattern musicale-on-hold con l'introduzione registrata: - No, no. suona il saluto E ascolta al Allo stesso tempo, così un chiamante può comporre sopra di esso dal primo secondo. Riproduzione() ignorare i tasti fino alla fine del file — 70 secondi di essere ignorato. - 1 e 2 vanno entrambi all'estensione dell'operatore. - Non c'è nulla di di tutto per la fine del saluto va all'operatore, dopo un Finestra di grazia di 4 secondi così un chiamante che inizia a dialling sull'ultima parola può finire; senza di essa arriva la seconda cifra dopo che ci siamo spostati. - Corrispondenza diretta [3-9]XXX, non XXXXX. Con XXXX un singolo "1" è anche partita parziale per un'estensione a 4 cifre, quindi Asterisk deve sedersi TIMEOUT(digit) prima che possa escludere che e il chiamante sente quattro secondi di silenzio. Il costo è che 1 e 2 sono riservati, quindi nessuna estensione può iniziare con loro — che il menu già richiesto. Estensioni numerate 2523 -> 8912 (Briana) e 2000 -> 8000 (Erik). The Il blocco endpoint WebRTC è chiave per l'estensione NUMBER, quindi rinumerare silenziosamente si registra ancora su WS, ma senza DTLS/ICE i media non stabiliscono mai e il chiamante ottiene una chiamata collegata senza audio. 8000 non aveva alcun blocco a partire dal 2000 — ed è ora la destinazione per ogni chiamante che compone 1, quadra 2, o non dice nulla, quindi ha dovuto guadagnarne uno. Salutare l'audio non è in questo ConfigMap: a 1.1 MB farebbe saltare il eccd limite di oggetto. Vive sull'host asterisk-libPath e sul comando di conversione è documentato accanto al globale che lo nomina. Verified live end to end: giochi di saluto (BackGround custom/kamocrm-main-intro); 1 -> da-did-direct 8000; 8912 -> la sua segreteria telefonica con tutti i 3 messaggi intatti; un'estensione sconosciuta gioca pbx-invalid poi cade a 8000.

  26. · KlusterServices

    Inbound auto-attendente — musica in attesa + dial-by-estensione

    Le chiamate in entrata non avevano un posto dove andare: il tavolo "in arrivo" era completamente vuoto, così anche una chiamata consegnata sarebbe morto. Aggiunge il contesto partecipante più i due strumenti che legge. L'opzione m() di WaitExten è il meccanismo — suona una classe musicale-on-hold E raccoglie le cifre contemporaneamente. Background()/Playback() stop alla fine del file e MusicOnHold() non raccoglie nulla, quindi né può esprimere "musica fino i quadranti. Il modulo IVR non è installato su questa scatola (senza ivr details tavolo) e vorrebbe un annuncio registrato piuttosto che la musica comunque. Appendato a extensions custom.conf sotto una guardia gep piuttosto che scritto sopra esso: kamo-asterisk-support possiede un blocco marcatore-delimitato nello stesso file e conserva tutto fuori di esso byte-for-byte. Inoltre crea /var/log/asterisk/cdr-csv. cdr csv ha registrato un ERROR * e* a ATTENZIONE per ogni gamba di chiamata perché quella directory è assente dall'immagine. Il MySQL CDR è quello che leggiamo così niente è stato rotto, ma ha sepolto il log di Asterisk — lo stesso registro usato per diagnosticare errori di chiamata. live verificato: il partecipante risponde e detiene in WaitExten(45,m(default)); un'estensione non valida suona pbx-invalid e torna alla musica; un valido l'estensione raggiunge da-did-direct e rang PJSIP/8080 (ANSWERED, 20s). The Il contatore ATTENDANT TRIES viene inizializzato anche in etichetta, raggiungendo `menu` senza di esso ha lasciato $[ + 1] un errore di parse che poi ha danneggiato il seguente GotoIf, inviando la chiamata da qualche parte indesiderata invece di fallire ad alta voce. La rotta in entrata e le righe di destinazione personalizzate vivono nel FreePBX MariaDB (persistente StatefulSet) e non sono riprodotti qui.

  27. · InitializerService

    Un calendario condiviso per org, un primario per membro

    Il provisioning non aveva nulla sotto di esso, quindi due carichi simultanei prima entrambi inserito. Colpisce ciò che già fatto — venti righe duplicate attraverso sette organizzazioni e tredici membri, vittorie più antiche, perdenti disattivati Invece di eliminare e qualsiasi cosa indicando prima un ri-indicato — poi aggiunge l'indice unico parziale per tipo di calendario che rende impossibile una seconda riga. Parziale perché l'invariante è sui calendari DISPOSITO: un semplice unico l'indice sull'organizzazione proibirebbe un membro, e uno sul l'iscrizione proibirebbe i calendari extra che un membro è libero di creare.

  28. · kamo-internal

    Verificare l'accesso di emergenza e portare le ultime due superfici

    L'endpoint di revisione in vetroresina ha una funzione client che nulla chiama: ogni L'accesso al grafico di emergenza è stato registrato e non c'era schermo per leggerli. A break-glass nessuna recensione è un percorso di audit piuttosto che un controllo, che è il di fronte al motivo per cui la sovvenzione è time-boxed e ragionamento in primo luogo. Si tratta di una sesta scheda sull'ufficio record, la superficie di conformità, e mostra il motivo dichiarato verbatim — quella frase è l'intera sostanza della recensione, e una versione riassuntiva di esso non decide nulla. Mancavano due porte. Il pulsante break-glass è ora offerto solo ad un ruolo che detiene BREAK GLASS PATIENT ACCESS; mostrarlo a qualcuno che non può usarlo insegna loro che il rifiuto è arbitrario, quando la risposta onesta è che il loro ruolo non include l'accesso di emergenza - in modo da ottenere quella frase Invece. E la contabilità della divulgazione è il suo segmento dietro VIEW DISCLOSURE ACCOUNTING: produrre una copia per un paziente e leggere il registro di ovunque il loro record è già andato sono lavori diversi. Questo è l'ultimo dei 26 diritti clinici di cancello qualcosa che una persona può raggiungere.

  29. · kamo-internal

    Alzare e inviare un reclamo dalla coda che ha trovato il lavoro

    Il ciclo di ricavi legge sette code e non potrebbe sollevare un reclamo. Ogni scrittura ora si blocca la coda che ha superato il bisogno di esso piuttosto che vivere su uno schermo del proprio. "Never charge" è un elenco di procedure eseguite senza alcun addebito e senza indicato ragione — nulla ha fallito e nulla ha detto a nessuno — quindi la cosa utile accanto ogni riga sta creando la carica. La riga lascia la coda una volta che esiste, che è il punto della coda. L'invio è offerto solo su un reclamo ancora in DRAFT. Rimborso di un reclamo accettato è come una pratica viene pagato due volte e poi riaccoppiato, e il duplicato del pagatore la logica non è qualcosa da contare sulla notificazione. La conferma dice che il reclamo è una bozza e controllarlo prima di inviare, perché i due passi sono deliberatamente separati e "raizzati" da soli partirebbero persone che credono che fosse andato al pagatore. Entrambe le azioni sono assenti senza MANAGE CLAIMS. I rifiuti portano il server frase, che nomina una restrizione di auto-pagamento o un permesso mancante — o è più uso di qualsiasi cosa questo schermo potrebbe inventare.

  30. · kamo-internal

    Correggere i dettagli di un paziente

    I dettagli potrebbero essere inseriti una volta e mai fissati. Il pannello si trova sotto il riassunto piuttosto che in una schermata delle impostazioni, perché il momento in cui qualcuno nota una misspelt il nome è il momento in cui lo stanno guardando — e non rende nulla affatto senza EDIT PATIENT DEMOGRAPHICS. Solo i campi che l'utente ha effettivamente cambiato vengono inviati. Il server lascia un assente campo da solo, e diffare contro quello che è stato caricato rende questo vero in pratica: un schermo che non rende ogni colonna non può svuotare silenziosamente quelli che Omits. La conseguenza del re-index è indicata prima del salvataggio, non dopo. Nome o data cambiare re-files il paziente per il controllo duplicato e per le richieste di record da altre pratiche; senza dirlo, un nome sposato sembra cosmetico e il risultato è un paziente rintracciabile solo sotto il nome che non usano più. Il MRN è mostrato e non modificabile. È così che il mondo esterno chiama questo persona, e rinumerare rompe ogni riferimento un payer, un laboratorio e una lettera precedente Tieni.

Il tuo universo ti sta aspettando.

Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.

Gratis per sempre — nessuna carta di credito richiesta