Changelog
Cosa c'è di nuovo.
Ogni miglioramento alla piattaforma, come si spedisce.
· kamo-shared-library
Recensioni dell'elenco dei grafici, reazione allergica / gravità, ragioni dello stato, diagnosi dell'ordine, nota di revisione dei risultati
- ClinicalListReview (fhir_chart_list_review): un vero e proprio record revisionato per l'allergia e Elenchi di farmaci, quindi 'reviewed' si ferma significando 'almeno una riga esiste' - AllergyIntolerance: reaction_text, reaction_severity, status_reason; findActiveForChecking Ora esclude le asserzioni NKDA (e le righe confutate); findActiveNoKnownAllergy / findActiveRecord - Condition.status_reason, Observation.status_reason, ServiceRequest.reason_codes, DiagnosticReport.review_note - EncounterDiagnosisRepository; **************** (scheda di flusso vitale)
· kamo-shared-library
Pianificare le entità per l'orologio, le stanze, i pagamenti al banco e il richiamo della pratica
- PracticeSettings (ehr_practice_settings): il fuso orario della pratica e la durata predefinita della visita - PracticeRoom (ehr_practice_room): stanze in cui un paziente viene messo; ritirato, mai cancellato - PatientPayment (ehr_patient_payment): pagamenti al banco registrati (mai elaborati), annullati con un motivo - RecallOutreach (ehr_recall_outreach): tentativi di contatto registrati contro un richiamo - Appuntamento: room_id, rescheduled_from_id / rescheduled_to_id, checked_out_by_member_id - ScheduleBlock: etichetta per il tempo bloccato (pranzo, riunione, vacanza) - PatientRecallRepository: countDue / countOverdue; WaitlistEntryRepository: findCandidatesAnyType (un UUID null in ':x IS NULL' raggiunge Postgres non digitato) - PhiResourceType: PATIENT_RECALL, PATIENT_PAYMENT aggiunti
· kamo-shared-library
Record di registrazione della reception: dettagli di contatto, contatti di emergenza, contatore MRN, campi di scrittura della copertura
Il paziente ottiene il metodo di contatto preferito, il membro di assistenza primaria e la farmacia preferita; i contatti di emergenza sono FHIR Patient.contact (fhir_patient_contact, ritirato non cancellato); Le tabelle telecom e indirizzo utilizzano le tabelle esistenti fhir_contact_point / fhir_address (nuovo PatientCommunicationRepository per la lingua preferita. Un repository per ambulatorio La riga ehr_mrn_counter assegna gli MRN in un upsert atomico birth-date-only, prefisso-con-data-di-natività e by-id query. PriorAuthorization ottiene un Descrizione del servizio e EligibilityCheck una nota del verificatore. DDL applicato alla produzione prima di questo push.
· kamo-shared-library
Documenti grafici, modelli di note pratiche, testo di lettura della nota e record di prelievo
- PatientDocument (ehr_patient_document): categoria, titolo, data del documento, contenuto Tipo, dimensione, SHA-256, identificazione dell'immagine + chiave di archiviazione, uploader, inserito-in-errore Con chi/quando/perché. Mai cancellato. - ClinicalNoteTemplate (ehr_note_template): modelli di nota di una pratica. - ClinicalNote: colonne inserito_in_errore_a/_per/_motivo; corpo corrente transiente, Tipo di versione, bandiera SI, nome autore/cofirmatario/paziente per le letture. - ClinicalNoteVersion: nome dell'autore transiente. DDL applicato alla produzione a mano (additivo).
· SecurityService
Rifiuti reali, decisioni di revisione del vetro, invio onesto del reclamo, EOB digitati a mano
- EhrRuleViolationException: un rifiuto di business-rule (nota non firmata alla chiusura, doppia prenotazione, non l'autore/cofirmatario, auto-cofirma, già firmato, restrizioni da parte dell'assicuratore, rottura del vetro senza motivo, troppe esportazioni, Corrispondenza soppressa) ora risponde 409/422 con la sua frase in linguaggio semplice Le negazioni di relazione rimangono 404. - EhrExceptionHandler viene eseguito alla massima priorità rispetto al commercio globale Consulenza e copre la qualità, l'amministrazione del portale, CCD, l'esportazione di massa e FHIR (un Manca a destra c'era un 500). - Break-glass revisione: coda con i nomi più la storia, e una decisione (appropriato / inappropriato / ha bisogno di follow-up, nota obbligatoria, mai la tua). - Directory partner di scambio per i medici (VIEW_CHART, solo nomi). - Richieste: CPT/HCPCS, modificatore, ICD-10, puntatore, NPI e luogo di servizio Controlli di formato; pagatore e id membro dalla copertura scelta; una visita deve essere chiuso alla fattura; le procedure fatturate lasciano la coda non addebitata; una bozza di richiesta Leggere per il costruttore. ClaimTransport cucitura: senza clearing house, inviare contrassegna READY e dice così; contrassegna-invia i record del canale, chi e nota. - Le rimesse possono essere inserite da un EOB cartaceo e la pubblicazione ora sposta denaro Da non applicato ad applicato.
· kamo-shared-library
Registrare come è stato inviato un reclamo ed elencare gli accessi di emergenza esaminati
Una dichiarazione ottiene ready_at, submission_channel, submitted_by_member_id e submission_note, quindi un reclamo inviato a mano attraverso un portale di pagamento o su carta È registrato onestamente invece di un flip di stato che finge una clearinghouse Il repository delle sovvenzioni break-glass ottiene la cronologia revisionata Trova la nuova schermata di revisione sotto la sua coda.
· kamo-internal
La fattura mostra il blocco di rimessa dei crediti, come fanno le quotazioni
La finestra di dialogo della fattura visualizza lo stesso QuoteRemittanceBlock utilizzato dall'anteprima del preventivo, dai dettagli dei Crediti del venditore, mentre tutto è dovuto. I Crediti Switch ora dice che copre preventivi e fatture.
· kamo-signer-monorepo
Il blocco di rimessa della fattura si legge esattamente come quello del preventivo
Stesso titolo, etichette e avviso ACH Credit Only (signer.quote.remit), con il Fattura-numero di riferimento tenuto sotto di esso.
· SecurityService
Le fatture stampano i dettagli ACH dei crediti esattamente come le quotazioni
Il PDF e l'e-mail ora contengono il blocco di rimessa del preventivo, parola per parola: - Inviare il pagamento a - beneficiario (nome legale) - banca - numero di routing (ABA) - numero di conto - l'avviso ACH Credit Only Questi sono seguiti dal riferimento del numero di fattura e dal proprio mercato GET **************** fornisce alla console le istruzioni necessarie Come sulle citazioni, appare quando i Crediti hanno le informazioni ACH commutate E entrambi i numeri salvati.
· kamo-internal
Modifica delle postazioni e delle licenze a partire da una data, con l'anteprima della tariffa proporzionale
Modifica postazioni e licenze apre una finestra di dialogo per impostare: - postazioni e licenze di ciascun add-on (le licenze per utente seguono le postazioni fino Scritto sopra (typed over); - la data di entrata in vigore (oggi o più tardi); - se l'addebito proporzionale va su una propria fattura ora (anche prima del data) o al successivo rinnovo; - per le riduzioni, un credito per la parte non utilizzata. L'anteprima dal vivo del server mostra il periodo, i giorni rimanenti, ogni riga proporzionale, eventuali costi di configurazione, il totale, come verrà fatturato e l'addebito ricorrente prima Le modifiche programmate sono elencate nell'abbonamento e possono essere modificate in qualsiasi momento Sostituisce la vecchia finestra di dialogo del posto immediato.
· SecurityService
Endpoint per le modifiche di licenza e sede datate e proporzionali; il lavoro le applica
Nuovi endpoint: - POST **************** - POST /subscriptions/{uid}/modifiche - GET /iscrizioni/{uid}/modifiche - POST **************** Il lavoro di fatturazione oraria applica le modifiche la cui data è arrivata prima del sollevamento Le fatture, quindi i rinnovi fatturano i nuovi conti.
· kamo-shared-library
Cambiamenti a metà periodo di licenze di postazioni e componenti aggiuntivi, in una data selezionata, proporzionalmente
SubscriptionChangeService registra una modifica ai posti di un abbonamento attivo e Le licenze aggiuntive saranno efficaci in qualsiasi data a partire da oggi Costo pro rata: prezzo per periodo di ogni unità aggiunta x giorni rimanenti / giorni nel periodo periodo in cui cade, ad esempio Harmony +6 posti dal 1° novembre = 6 x $124 x 17/31 = $408.00. L'addebito viene fatturato quando l'operatore sceglie: la propria bozza di fattura ora (anche prima della data effettiva) o sulla successiva fattura di rinnovo. Alla data di entrata in vigore il processo di fatturazione applica la modifica: - le postazioni, le licenze e i MRR dell'abbonamento; - l'accesso del cliente (numero di posti, file di posti, licenze aggiuntive, cache); - ogni successivo progetto di rinnovo, ricostruito, o dato una linea di regolazione se il personale aveva Io l'ho modificato. Casi di bordo: - un cambiamento esattamente in un giorno di fatturazione è portato da quel rinnovo piuttosto che pro rata due volte; - una riduzione non addebita nulla e può accreditare la parte non utilizzata al successivo rinnovo; - una modifica programmata può essere annullata, annullando la sua bozza di fattura; - le spese di installazione per i posti aggiunti leggono l'accordo del CLIENTE. Il vecchio percorso per il cambio posto ora passa attraverso questo servizio. Nuova tabella commerce_subscription_changes; nuova colonna ****************
· kamo-internal
Stati ovunque in linguaggio semplice; prezzi aggiuntivi concordati e uno sconto mensile nella procedura guidata dell'ordine
StatusChip (89 siti di chiamata) mostrava codici grezzi come PENDING_APPROVAL; ora Mostra le parole del dizionario (common.statusCodes), o il codice letto ad alta voce per uno Il filtro della lista degli ordini e il CSV utilizzano le stesse etichette. Il personale può inserire un prezzo concordato per licenza per ogni componente aggiuntivo selezionato e un Sconto mensile; entrambi vengono inviati come addonUnitPrices / recurringDiscount e fatturati su ogni fattura.
· kamo-signer-monorepo
Paga con carta sulla pagina della fattura
Quando il server lo offre (fatture vendute dalla piattaforma con un saldo), la fattura Invia il messaggio a /<locale>/i/<token>/pay, che invia il messaggio a /<locale>/i/<token>/pay Il cliente viene reindirizzato a una pagina di pagamento ospitata da Stripe (la conferma bancaria avviene lì) e Un cliente che ritorna vede il pagamento confermato.
· SecurityService
I clienti pagano le fatture con carta online; una richiesta SCA della banca raggiunge il cliente
Sulle fatture vendute dalla piattaforma org (l'unico venditore il cui account Stripe è): - la fattura pubblica offre Pagamento con carta di credito: POST **************** apre una pagina ospitata da Stripe che ritorna allo stesso link della fattura (creato lato server, mai dalla richiesta); - il pagamento viene registrato quando il cliente torna e dal lavoro orario, Esattamente una volta. Quando un addebito automatico richiede che il cliente lo confermi con la propria banca, Viene inviata via email la fattura con la richiesta, e i proprietari vengono avvisati come prima.
· BillingService
Paga una fattura di abbonamento con carta su una pagina ospitata da Stripe
Internal POST **************** crea una modalità di pagamento Sessione di checkout per l'importo dovuto. Salva la carta per il futuro automatico Spese quando il cliente ha un conto, e la conferma SCA della banca GET /checkout/{id} riporta se è stato pagato e con quale metodo Il checkout del consumatore ignora queste sessioni.
· kamo-shared-library
Tracciare il pagamento con carta online di una fattura in sospeso
Nuova colonna nullable **************** più aiutanti per elencare e regolare le sessioni in sospeso idempotentemente (un pagamento che porta Lo stesso riferimento del processore non viene mai registrato due volte).
· kamo-shared-library
I prezzi aggiuntivi negoziati e lo sconto di un preventivo si applicano all'abbonamento
La conversione di una citazione ora porta: - il prezzo concordato per licenza di ciascun add-on (quando differisce da quello del catalogo) - lo sconto del preventivo o dell'opzione accettata, come importo mensile ricorrente (un Il periodo di sconto dell'opzione è distribuito sui suoi mesi) Gli ordini registrano entrambi in custom_pricing, quindi una bozza di reprice li mantiene. Attivazione mette il prezzo concordato sulle licenze aggiuntive e lo sconto sull'abbonamento (nuova colonna nullable **************** così ogni fattura Gli ordini dello staff possono indicare sia direttamente che indirettamente il valore del deal (addonPrezziUnitari, recurringSconto).
· kamo-internal
Il rinnovo automatico e le note funzionano sugli abbonamenti live; carta su file e carta di credito ora
- L'interruttore di rinnovo automatico imposta il proprio rinnovo dell'abbonamento (ha pubblicato un campo il Aggiornamento dell'ordine di bozza ignorato) e dice quando un ordine non rinnovabile termina. - Note salvare su un ordine in qualsiasi stato. - Un abbonamento a pagamento con carta mostra la carta su file. - Le sue fatture aperte offrono la carta di ricarica ora e mostrano perché l'ultimo tentativo di carta fallimento.
· kamo-internal
Visualizzare le licenze detenute e in uso in cui sono assegnate cassette postali e interni
Regola del proprietario 2026-10-22: i componenti aggiuntivi fatturano per utente le licenze acquistate e il Le licenze sono l'unico limite su ciò che può essere in uso ("4 su 10 licenze in uso", barra animata nei colori del marchio dell'organizzazione, angolo Nastro, chip di avvertimento e nota quando già finito, collegamento a piani e fatturazione) Legge GET /api/billing/licenses/usage e appare su: - Impostazioni > Gestione caselle di posta elettronica (KamoMail o licenze di terze parti) - il selettore di estensioni delle impostazioni del telefono del membro (KamoPBX o di terze parti) - Piani e fatturazione add-on righe I rifiuti (409, la frase in linguaggio semplice del server) ora raggiungono la persona: Assegnazione cassetta postale, concessione cassetta postale condivisa, assegnazione cassetta postale personale/salvataggio IMAP/OAuth connect e callback lo mostrano tutti nel pannello di quella casella di posta (molti usano gettare unhandled o dire un fallimento generico); ogni tale azione aggiorna il Nuove stringhe: settings.billing.licenses (kamo-dizionario di traduzione).
· kamo-internal
Abbonamenti di avvio delle quotazioni; accettazione offline; ordini dei tenant; fatturazione in linguaggio semplice
- Quotazioni: "Aggiungi dal catalogo di abbonamento" riempie una riga dai piani/componenti aggiuntivi live (nome, mensile prezzo, "per utente / mese" / "per blocco da 10 GB / mese") e mantiene il riferimento del catalogo; Le offerte di abbonamento accettate vengono convertite tramite una finestra di dialogo (metodo di pagamento; organizzazione di destinazione) "Record di accettazione" per carta/e-mail/PO; "Record di accettazione" per carta/e-mail/PO Le anteprime di una BOZZA sono contrassegnate da una filigrana e ogni stampa viene registrata; {orgName} con il nome breve del venditore. - Procedura guidata dell'ordine: organizzazione di destinazione solo per l'org della piattaforma; negoziato solo dallo staff Sostituzione del prezzo per posto e della commissione di installazione. - Elenco delle iscrizioni: prossima data di fatturazione, saldo dovuto, badge scaduto; un metodo di pagamento condiviso Aiuto per l'etichetta per tutti e sei i metodi. - Pagina di sottoscrizione: eventi in frasi semplici (Attiva → Scadenza), numero di ordine invece di L'id del record. - Contatta le vendite: nome, e-mail e telefono letti dalla piattaforma org tramite un endpoint stretto.
· SecurityService
Rifiutare un reparto o una cassetta postale di contatto oltre le licenze di posta elettronica
Regola del proprietario 2026-10-22: addebito per utente delle licenze acquistate; quante Il numero di cassette postali che possono essere in uso è limitato solo da esse Il dipartimento raggiunto in una cassetta postale o le informazioni di contatto dell'organizzazione puntando a uno, lo mappa in Kamo (OrgMailboxBillingAggregator), quindi questi Due salvataggi possono mettere in uso una cassetta postale con la stessa certezza con cui la si assegna a un membro. - MailboxLicenseCapGuard chiede il controllo della licenza interna di BillingService (X-Internal-Auth) prima di POST/PUT /api/security/departments e PUT /org/{id} cambiare la casella di posta; un rifiuto è un 409 con la frase in Mantenere o svuotare la cassetta postale non è possibile Non è mai selezionato; un'interruzione di BillingService non riesce OPEN con un avviso. - La porta di relè di fatturazione passa anche GET /licenses/usage (stessi diritti del Altri usi leggono).
· SecurityService
Registra l'accettazione offline, registra le stampe, converti le quotazioni in abbonamenti
- POST **************** (SEND_QUOTES o MANAGE_QUOTES) - POST **************** (VIEW_QUOTES o MANAGE_QUOTES) - POST .../{uid}/convert prende un corpo facoltativo (organizzazione di destinazione, metodo di pagamento); La conversione come COMP richiede anche CREATE_SUBSCRIPTION_ORDERS - POSController rifiuta negotiatedUnitPrice / setupFeeOverride da chiamanti OWN-only - GET **************** il nome pubblicato della piattaforma org, e-mail di contatto e telefono, per la finestra di dialogo Contatta le vendite, invece di costanti codificate
· kamo-shared-library
Le quotazioni vengono convertite in abbonamenti; gli ordini degli inquilini non compenseranno mai il venditore
- Una quotazione in un mercato di ABBONAMENTO, o le cui righe accettate sono state riempite dalla sottoscrizione Catalogo, si converte in un SubscriptionOrder (piano, posti dalla quantità del preventivo, componenti aggiuntivi con Le loro licenze, la tariffa per posto accettata come prezzo negoziato, la commissione di installazione che il cliente visto, l'impegno dell'opzione accettata come il ciclo, il metodo di pagamento scelto al momento della conversione). L'ordine contiene quote_uid; una seconda conversione viene rifiutata; viene registrato un evento CONVERTED. La conversione al dettaglio rimane invariata. - QuoteService.acceptOffline: il personale registra un'accettazione data su carta / e-mail / PO - bozza, inviata, Quotazioni visualizzate o scadute; totali tramite applyOptionHeadlineTotals; nomi degli eventi chi e perché. - recordPrinted registra un evento PRINTED (le bozze di stampa lo dicono). - Le righe per sedile memorizzano il conteggio dei posti della citazione ad ogni salvataggio e revisione; la visualizzazione della riga invia La quantità a cui è valutata una riga. - Le righe di citazione portano catalog_ref_code / catalog_ref_uid. - Termini di supporto {orgName}, riempito con il nome breve del venditore sulla pagina del cliente. - provisionOnApproval e activateCompOrder richiedono un'organizzazione di destinazione - un ordine senza utilizzato per fornire l'abbonamento del VENDITORE. - **************** / setupFeeOverride, applicato dopo calculatePrice e ricordato in custom_pricing in modo che una bozza di reprice mantenga l'accordo. - Gli ordini e gli abbonamenti DTO portano la prossima data di fatturazione, il saldo in sospeso e una bandiera in ritardo, Leggere in due query per lista.
· EmailService
Rifiutare una cassetta postale oltre le licenze di posta dell'organizzazione
Regola del proprietario 2026-10-22: addebito per utente delle licenze acquistate; quante Il numero di cassette postali che possono essere in uso è limitato solo da esse Per l'utilizzo, viene richiesto il **************** di BillingService (X-Internal-Auth); un rifiuto è un 409 con la sua frase in linguaggio semplice (StatusReasonAdvice), ad esempio "Tutte le 10 licenze di posta elettronica di terze parti sono in uso. Aggiungere licenze in Fatturazione per connettere un'altra cassetta postale." Forzato, prima che qualcosa sia scritto: - creazione di una casella di posta (KamoMail la conta in una sola volta; 3rd-party solo una volta mappata) - assegnare una casella di posta a un membro - creare una cassetta postale condivisa, concedere l'accesso a una, riattivarne una - collegamento di una casella di posta personale (salvataggio IMAP, consenso OAuth e callback) e Assegnare uno già connesso - Provisioning della cassetta postale AI membro (NOT_READY / LICENSE_LIMIT) Un indirizzo già conteggiato non viene mai rifiutato, nulla di esistente è non assegnato, e un'interruzione del servizio BillingService non riesce ad aprire con un avviso Gli endpoint di accesso condiviso e cassetta postale personale ora passano lo stato di un rifiuto e Sentenza attraverso invece di un 500.
· VOIPService
Rifiutare un interno telefonico oltre le licenze dell'organizzazione
Regola del proprietario 2026-10-22: addebito per utente delle licenze acquistate; quante L'utilizzo delle estensioni che possono essere in uso è limitato solo da esse In uso, BillingService's **************** è richiesto (X-Internal-Auth); un rifiuto è un 409 con il suo linguaggio chiaro frase (LicenseCapAdvice), ad esempio "Tutte le 10 licenze telefoniche di terze parti sono Aggiungi licenze in Fatturazione per assegnare un altro interno." Forzato, prima che qualcosa sia scritto: - PUT /api/voip/member/{id}/config (impostazioni del telefono del membro), L'estensione che il membro detiene ora, quindi una mossa su un sistema di terze parti è gratuita - POST **************** (nuova estensione; KamoPBX conteggi (ogni attiva, 3-party solo una assegnata) - PUT **************** quando il risultato è ATTIVATO - AI fornitura di linea vocale (NOT_READY / LICENSE_LIMIT) Un'estensione già conteggiata non viene mai rifiutata, nulla di esistente viene Non assegnato e un'interruzione di BillingService non riesce OPEN con un avviso.
· BillingService
Utilizzo delle licenze e controlli delle licenze per unità per i componenti aggiuntivi per utente
Regola del proprietario 2026-10-22: ogni componente aggiuntivo per utente fattura le licenze acquistate, come Il numero di cassette postali o interni che possono essere utilizzati è limitato solo da essi. - GET /api/billing/licenses/usage (sessione, X-Org-Id): per codice add-on (EMAIL_3P_INTEGRATION, EMAIL_HOSTING, PBX_3P_INTEGRATION, PBX_HOSTING) il numero di indirizzi IP Licenze detenute, in uso, disponibili, over-by, e se l'organizzazione è esente. - Ottenere **************** Protetto da X-Internal-Auth (a tempo costante rispetto a billing.internal-auth-secret), per EmailService e VOIPService da chiedere prima Mettere un'unità in più in uso. - Licenza = AddOnLicenses.licensed sopra l'abbonamento primario active_addon_codes / addon_quantities (o un piano che include il componente aggiuntivo); Le chiavi riservate __mailboxes:/__extensions: non vengono mai lette come licenze. In uso = OrgMailboxBillingAggregator / OrgPbxBillingAggregator, il conteggio dei La fattura notturna usa. - Platform org e OWNER_UNLIMITED sono esenti; PAID e COMP sono limitati; TRIAL, GRATUITO e nessun abbonamento sono lasciati ai cancelli di diritto esistente. - Solo una modifica che aggiunge un'unità oltre le licenze viene rifiutata; un'unità già Una mossa non contata, o una mossa di estensione di terze parti che ne libera una, passa sempre.
· SecurityService
Endpoint per impostare il rinnovo automatico di un abbonamento e le note di un ordine in qualsiasi stato
· kamo-shared-library
Attivare o disattivare il rinnovo per un abbonamento attivo; note su qualsiasi ordine
L'interruttore di rinnovo automatico della console ha inviato un campo che l'aggiornamento dell'ordine di bozza non ha fatto Non ho, quindi non è mai stato salvato; e le note non sono riuscite su qualsiasi ordine oltre la bozza.
· SecurityService
I clienti con carta vengono addebitati automaticamente il giorno della fatturazione
Per gli abbonamenti AUTO_BILL il processo di fatturazione addebita ogni fattura approvata al La carta salvata del cliente il giorno della fatturazione tramite la carta interna di BillingService endpoint, registra il pagamento (metodo CARD, riferimento = PaymentIntent) e Una ricarica non riuscita viene riprovata ogni tre giorni fino a un massimo di quattro volte Approvazione e invio di una fattura il cui giorno di fatturazione è arrivato In primo luogo, quindi l'e-mail del cliente è una ricevuta. Nuovi endpoint: - POST **************** - Ottenere ****************

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