Changelog
Qué hay de nuevo.
Cada mejora de la plataforma, a medida que se envía.
· kamo-shared-library
Revisiones de la lista de gráficos, reacción alérgica/gravedad, razones de estado, diagnósticos de pedidos, nota de revisión de resultados
- ClinicalListReview (fhir_chart_list_review): un registro real revisado para la alergia y Listas de medicamentos, por lo que 'revisado' se detiene significando 'existe al menos una fila' - AllergyIntolerance: reaction_text, reaction_severity, status_reason; findActiveForChecking Ahora excluye las afirmaciones NKDA (y filas refutadas); findActiveNoKnownAllergy / findActiveRecord - Condition.status_reason, Observation.status_reason, ServiceRequest.reason_codes, DiagnosticReport.review_note - EncounterDiagnosisRepository; **************** (hoja de flujo de elementos vitales)
· kamo-shared-library
Programe entidades para el reloj de la práctica, las habitaciones, los pagos de escritorio y el alcance de los recordatorios
- PracticeSettings (ehr_practice_settings): la zona horaria de la práctica y la duración predeterminada de la visita - PracticeRoom (ehr_practice_room): habitaciones en las que se coloca a un paciente; retirado, nunca eliminado - PatientPayment (ehr_patient_payment): pagos de escritorio registrados (nunca procesados), anulados con una razón - RecallOutreach (ehr_recall_outreach): intentos de contacto registrados contra un retiro - Cita: room_id, reprogramed_from_id / reprogramed_to_id, checked_out_by_member_id - ScheduleBlock: etiqueta para el tiempo bloqueado (almuerzo, reunión, vacaciones) - PatientRecallRepository: countDue / countOverdue; WaitlistEntryRepository: findCandidatesAnyType (un UUID nulo en ':x IS NULL' llega a Postgres sin escribir) - PhiResourceType: PATIENT_RECALL, PATIENT_PAYMENT añadido
· kamo-shared-library
Registro de registro de recepción: detalles de contacto, contactos de emergencia, contador de MRN, campos de escritura de cobertura
El paciente obtiene el método de contacto preferido, el miembro de atención primaria y la farmacia preferida; Los contactos de emergencia son FHIR Patient.contact (fhir_patient_contact, retirado pero no eliminado); Las tablas de telecomunicaciones y direcciones utilizan las tablas existentes fhir_contact_point / fhir_address (nueva PatientCommunicationRepository para el idioma preferido. Un repositorio por práctica La fila ehr_mrn_counter asigna MRNs en un upsert atómico. La búsqueda de pacientes gana given-name, Consultas de fecha de nacimiento-solo, prefijo-con-fecha-de-nacimiento y por-id Descripción del servicio y EligibilityCheck una nota del verificador. DDL aplicado a la producción antes de este empuje.
· kamo-shared-library
Documentos de gráficos, plantillas de notas de práctica, texto del lado de lectura de la nota y registro de retiro
- PatientDocument (ehr_patient_document): categoría, título, fecha del documento, contenido tipo, tamaño, SHA-256, identificador de imagen + clave de almacenamiento, cargador, error introducido Con quién/cuándo/por qué. Nunca borrado. - ClinicalNoteTemplate (ehr_note_template): plantillas de notas propias de una práctica. - ClinicalNote: columnas entered_in_error_at/_by/_reason; cuerpo de corriente transitoria, Tipo de versión, bandera SI, nombres de autor/cofirmante/paciente para las lecturas. - ClinicalNoteVersion: nombre del autor transitorio. DDL aplicado a la producción a mano (aditivo).
· SecurityService
Rechazamientos reales, decisiones de revisión de rotura de vidrio, envío honesto de reclamos, EOBs escritos a mano
- EhrRuleViolationException: un rechazo de regla de negocio (nota sin firmar al cierre, doble registro, no el autor/cofirmante, auto-cofirma, ya firmado, restringido por la aseguradora, romper el vidrio sin razón, demasiadas exportaciones, La coincidencia suprimida) ahora responde 409/422 con su oración en lenguaje claro En lugar del opaco 'No existe tal registro'. Las negaciones de relación permanecen en 404. - EhrExceptionHandler se ejecuta con la máxima prioridad sobre el comercio global Cubre Calidad, Administración del Portal, CCD, Exportación a Granel y FHIR (un Faltando a la derecha había un 500). - Revisión de romper el vidrio: cola con nombres más historia, y una decisión (apropiado / inapropiado / necesita seguimiento, nota requerida, nunca la suya propia). - Directorio de socios de intercambio para los médicos (VIEW_CHART, solo nombres). - Reclamaciones: CPT/HCPCS, modificador, CIE-10, puntero, NPI y lugar de servicio Comprobaciones de formato; pagador y miembro id de la cobertura elegida; una visita debe ser cerrado a la factura; los procedimientos facturados salen de la cola sin cobrar; un borrador de reclamación ClaimTransport seam: sin cámara de compensación, envíe el formulario de reclamación marca READY y dice así; marca-enviado registra canal, quien y nota. - Las remesas se pueden introducir desde un EOB de papel, y la publicación ahora mueve dinero de no aplicada a aplicada.
· kamo-shared-library
Registre cómo se envió una reclamación y enumera los accesos de emergencia revisados
Una declaración obtiene ready_at, submission_channel, submitted_by_member_id y submission_note, por lo que un reclamo enviado a mano a través de un portal de pagadores o en papel Se registra honestamente en lugar de un giro de estado que pretende ser una cámara de compensación El repositorio de subvenciones de rotura de vidrio gana el historial revisado El buscador muestra la nueva pantalla de revisión debajo de su cola.
· kamo-internal
La factura muestra el bloque de remisión de cuentas por cobrar, al igual que las cotizaciones
El cuadro de diálogo de factura representa el mismo QuoteRemittanceBlock que utiliza la vista previa de la cotización, De los detalles de las cuentas por cobrar del vendedor, mientras que cualquier cosa se debe Switch ahora dice que cubre cotizaciones y facturas.
· kamo-signer-monorepo
El bloque de remisión de la factura se lee exactamente como el de la cotización
Mismo encabezado, etiquetas y aviso de solo crédito ACH (signatario.cita.remisión), con el Referencia de número de factura guardada debajo de ella.
· SecurityService
Las facturas imprimen los detalles de ACH de cuentas por cobrar exactamente como lo hacen las cotizaciones
El PDF y el correo electrónico ahora llevan el bloque de remisión de la cotización, palabra por palabra: - Remitir el pago a - beneficiario (nombre legal) - banco - número de enrutamiento (ABA) - Número de cuenta - el aviso de ACH Credit Only Estos son seguidos por la referencia de número de factura y el propio mercado GET **************** le da a la consola las instrucciones Al igual que en las cotizaciones, aparece cuando Receivables tiene la información de ACH cambiada y ambos números se guardan.
· kamo-internal
Cambie los puestos y las licencias a partir de una fecha, con la vista previa del cargo prorrateado
Cambiar puestos y licencias abre un cuadro de diálogo para establecer: - puestos y licencias de cada complemento (las licencias por usuario siguen a los puestos hasta sobrescrito a máquina); - la fecha en que entra en vigor (hoy o más tarde); - si el cargo prorrateado va en su propia factura ahora (incluso antes de la fecha) o en la próxima renovación; - para las reducciones, un crédito por la parte no utilizada. La vista previa en vivo del servidor muestra el período, los días restantes, cada línea prorrateada, cualquier tarifa de configuración, el total, cómo se facturará y el cargo recurrente antes de Los cambios programados se enumeran en la suscripción y se pueden consultar en la página de Reemplaza el antiguo diálogo de asiento inmediato.
· SecurityService
Puntos finales para cambios de asiento y licencia fechados y prorrateados; el trabajo los aplica
Nuevos puntos finales: - POST **************** - POST /suscripciones/{uid}/cambios - GET /suscripciones/{uid}/cambios - POST **************** El trabajo de facturación por hora aplica cambios cuya fecha ha llegado antes de levantar Facturas, por lo que las renovaciones facturan los nuevos conteos.
· kamo-shared-library
Cambios de licencia de puesto y complemento a mitad de período, en una fecha elegida, prorrateados
SubscriptionChangeService registra un cambio en los puestos de una suscripción activa y Las licencias de complemento son efectivas en cualquier fecha a partir de hoy Cargo prorrateado: precio por período de cada unidad añadida x días restantes / días en el El período en el que cae, por ejemplo, Harmony + 6 asientos desde el 1 de noviembre = 6 x $ 124 x 17/31 = $408.00. El cargo se factura cuando el operador elige: su propio borrador de factura ahora (incluso antes de la fecha efectiva) o en la próxima factura de renovación. En la fecha efectiva, el trabajo de facturación aplica el cambio: - los puestos, licencias y MRR de la suscripción; - el acceso del cliente (número de asientos, filas de asientos, licencias adicionales, caché); - cada borrador de renovación posterior, reconstruido, o dado una línea de ajuste si el personal había Yo lo he editado. Casos de borde: - un cambio exactamente en un día de facturación se lleva a cabo por esa renovación en lugar de Prorrateado dos veces; - una reducción no cobra nada y puede acreditar la parte no utilizada en la próxima renovación; - un cambio programado puede ser cancelado, anulando su borrador de factura; - las tarifas de instalación para los asientos añadidos lean el acuerdo del cliente. La antigua ruta de cambio de asientos ahora pasa por este servicio. Nueva tabla commerce_subscription_changes; nueva columna ****************
· kamo-internal
Estado en lenguaje sencillo en todas partes; precios adicionales acordados y un descuento mensual en el asistente de pedidos
StatusChip (89 sitios de llamadas) mostraba códigos sin procesar como PENDING_APPROVAL; ahora muestra las palabras del diccionario (common.statusCodes), o el código leído en voz alta para una El filtro de la lista de pedidos y el CSV usan las mismas etiquetas. El personal puede introducir un precio acordado por licencia para cada complemento seleccionado y un Descuento mensual; ambos se envían como addonUnitPrices / recurringDiscount y se facturan En cada factura.
· kamo-signer-monorepo
Pagar con tarjeta en la página de la factura
Cuando el servidor lo ofrece (facturas vendidas por la plataforma con saldo), la factura Se envía a /<locale>/i/<token>/pay, que envía el código de pago a la tarjeta El cliente a una página de pago Stripe-hosted (la confirmación bancaria ocurre allí) y Un cliente que regresa ve el pago confirmado.
· SecurityService
Los clientes pagan las facturas con tarjeta en línea; una solicitud de SCA del banco llega al cliente
En las facturas vendidas por la plataforma org (el único vendedor cuya cuenta Stripe es): - la factura pública ofrece Pagar con tarjeta: POST **************** Abre una página hospedada en Stripe que devuelve el mismo enlace de factura (creado del lado del servidor, nunca desde la solicitud); - el pago se registra cuando el cliente vuelve y por el trabajo por hora, Exactamente una vez. Cuando un cargo automático necesita que el cliente lo confirme con su banco, Se envía por correo electrónico la factura con esa solicitud, y los propietarios son alertados como antes.
· BillingService
Pagar una factura de suscripción con tarjeta en una página alojada en Stripe
Internal POST **************** crea un modo de pago Sesión de pago por el importe adeudado. Guarda la tarjeta para futuros pagos automáticos Cargos cuando el cliente tiene una cuenta, y la confirmación de SCA del banco GET /checkout/{id} informa si se pagó y con qué método El proceso de pago del consumidor ignora estas sesiones.
· kamo-shared-library
Hacer un seguimiento del pago pendiente de una factura en línea
Nueva columna nulable **************** más ayudantes para listar y liquidar sesiones pendientes idempotentemente (un pago que lleva La misma referencia de procesador nunca se registra dos veces).
· kamo-shared-library
Los precios adicionales negociados y el descuento de una cotización se trasladan a la suscripción
Convertir una cita ahora lleva: - el precio acordado por licencia de cada complemento (cuando difiera del del catálogo) - el descuento del presupuesto o de la opción aceptada, como importe mensual recurrente (un El descuento del período de la opción se extiende a lo largo de sus meses) Los pedidos registran ambos en custom_pricing, por lo que un borrador de reajuste de precios los mantiene. Activación pone el precio acordado en las licencias adicionales y el descuento en la suscripción (nueva columna nulable **************** para que cada factura Las órdenes de personal pueden indicar tanto directamente como a través de un agente (addonUnitPrices, recurringDiscount).
· kamo-internal
La renovación automática y las notas funcionan en suscripciones activas; tarjeta en archivo y tarjeta de cargo ahora
- El interruptor de renovación automática establece la propia renovación de la suscripción (publicó un campo el Se ignora la actualización de pedidos solo de borrador) y dice cuándo termina un pedido no renovable. - Notas guardar en un pedido en cualquier estado. - Una suscripción de pago con tarjeta muestra la tarjeta en el archivo. - Sus facturas abiertas ofrecen Cargar tarjeta ahora y mostrar por qué el último intento de tarjeta failed.
· kamo-internal
Mostrar las licencias en posesión y en uso donde se asignan buzones y extensiones
Regla del propietario 2026-10-22: los complementos facturan por usuario las licencias compradas, y el Las licencias son el único límite de lo que puede estar en uso. Un LicenseUsageMeter ("4 de 10 licencias en uso", barra animada en el color de la marca de la organización, esquina Cinta, chip de advertencia y nota cuando ya ha terminado, enlace a Planes y facturación) lee GET /api/billing/licenses/usage y aparece en: - Configuración > Administración de buzones de correo electrónico (KamoMail o licencias de terceros) - el selector de extensión de configuración de teléfono del miembro (KamoPBX o de terceros) - Planes y filas de complementos de facturación Los rechazos (409, la frase en lenguaje sencillo del servidor) ahora llegan a la persona: Asignación de buzón, concesión de buzón compartido, asignación de bandeja de entrada personal/Guardar IMAP/OAuth connect y callback todos lo muestran en el panel de ese buzón (varios usados para throw unhandled o decir un error genérico); cada acción de este tipo actualiza la Nuevas cadenas: settings.billing.licenses (kamo-translation-dictionary).
· kamo-internal
Cotizaciones de inicio de suscripciones; aceptación fuera de línea; pedidos de inquilinos; facturación en lenguaje sencillo
- Citas: "Añadir desde el catálogo de suscripciones" rellena una fila de los planes/complementos en vivo (nombre, mensual precio, "por usuario / mes" / "por bloque de 10 GB / mes") y mantiene la referencia del catálogo; Cotizaciones de suscripción aceptadas se convierten a través de un diálogo (método de pago; organización objetivo) "Registro de aceptación" para papel/email/PO; "Registro de aceptación" para correo electrónico/PO aceptaciones; las vistas previas de un borrador llevan una marca de agua y cada impresión se registra; términos de relleno {orgName} con el nombre corto del vendedor. - Asistente de pedidos: organización objetivo solo para la organización de la plataforma; solo personal negociado Precio por asiento y anulación de la tarifa de instalación. - Lista de inscripciones: próxima fecha de facturación, saldo vencido, insignia vencida; un método de pago compartido Ayudante de etiquetas para los seis métodos. - Página de suscripción: eventos en oraciones simples (Activo → Vencido), número de pedido en lugar de El id del registro. - Contacto de ventas: nombre, correo electrónico y teléfono leído desde la plataforma org a través de un extremo estrecho.
· SecurityService
Rechazar un buzón de departamento o contacto que supere las licencias de correo electrónico
Regla del propietario 2026-10-22: los complementos facturan por usuario las licencias compradas; cuántas El número de buzones de correo que pueden estar en uso está limitado solo por ellos El departamento al que se llega en un buzón, o la información de contacto de la organización apuntando a uno, lo asigna a Kamo (OrgMailboxBillingAggregator), por lo que estos Dos salvaciones pueden poner un buzón en uso tan seguramente como asignarlo a un miembro. - MailboxLicenseCapGuard pide la comprobación de licencia interna de BillingService (X-Internal-Auth) antes de POST/PUT /api/security/departments y PUT /org/{id} cambiar el buzón; un rechazo es un 409 con la frase en Mantener o borrar el buzón de correo no es una opción Nunca seleccionada; una interrupción de BillingService falla OPEN con una advertencia. - La puerta de relé de facturación también pasa GET /licenses/usage (los mismos derechos que el Otras lecturas de uso).
· SecurityService
Registre la aceptación fuera de línea, registre las impresiones, convierta las cotizaciones en suscripciones
- PUBLICAR **************** (SEND_QUOTES o MANAGE_QUOTES) - PUBLICAR **************** (VIEW_QUOTES o MANAGE_QUOTES) - POST .../{uid}/convert toma un cuerpo opcional (organización objetivo, método de pago); La conversión como COMP también necesita CREATE_SUBSCRIPTION_ORDERS - POSController rechaza negotiatedUnitPrice / setupFeeOverride de las llamadas solo propias - GET **************** el nombre publicado de la plataforma org, correo electrónico de contacto y teléfono, para el cuadro de diálogo Contacto de ventas, en lugar de constantes codificadas
· kamo-shared-library
Las cotizaciones se convierten en suscripciones; los pedidos del inquilino nunca compensan al vendedor
- Una cotización en un mercado de SUSCRIPCIÓN, o cuyas filas aceptadas se llenaron desde la suscripción El catálogo, se convierte en un SubscriptionOrder (plan, puestos de la cantidad de la cotización, complementos con sus licencias, la tarifa por puesto aceptada como precio negociado, la tarifa de instalación que el cliente vio, el compromiso de la opción aceptada como el ciclo, el método de pago elegido en la conversión). El pedido lleva quote_uid; se rechaza una segunda conversión; se registra un evento CONVERTED. La conversión minorista se mantiene sin cambios. - QuoteService.acceptOffline: el personal registra una aceptación dada en papel / correo electrónico / PO - borrador, enviado, citas vistas o caducadas; totales a través de applyOptionHeadlineTotals; nombres de eventos quién y por qué. - recordPrinted registra un evento PRINTED (las impresiones de borrador lo indican). - Las filas por asiento almacenan el recuento de asientos de la cotización en cada guardado y revisión; la vista de línea envía La cantidad a la que tiene precio una fila. - Las líneas de cita llevan catalog_ref_code / catalog_ref_uid. - Términos de soporte {orgName}, lleno con el nombre corto del vendedor en la página del cliente. - provisionOnApproval y activateCompOrder requieren una organización de destino: un pedido sin ninguna Se utiliza para proveer la suscripción propia del VENDEDOR. - **************** / setupFeeOverride, aplicado después de calculatePrice y se recuerda en custom_pricing para que un borrador de reajuste de precios mantenga el trato. - Los DTO de pedidos y suscripciones llevan la próxima fecha de facturación, el saldo pendiente y una bandera de vencimiento, Leer en dos consultas por lista.
· EmailService
Rechazar un buzón más allá de las licencias de correo electrónico de la organización
Regla del propietario 2026-10-22: los complementos facturan por usuario las licencias compradas; cuántas El número de buzones de correo que pueden estar en uso está limitado solo por ellos Para su uso, se solicita el **************** de BillingService (X-Internal-Auth); un rechazo es un 409 con su frase en lenguaje claro (StatusReasonAdvice), por ejemplo, "Las 10 licencias de correo electrónico de terceros están en uso. Agregar licencias en Facturación para conectar otro buzón." Aplicado, antes de que se escriba cualquier cosa: - crear un buzón (KamoMail lo cuenta de una vez; 3rd-party solo una vez mapeado) - asignar un buzón a un miembro - Crear un buzón compartido, otorgar acceso a uno, volver a activar uno - conectar una bandeja de entrada personal (guardar IMAP, consentimiento OAuth y devolución de llamada) y Asignación de uno ya conectado - Aprovisionamiento de buzón de AI miembros (NOT_READY / LICENSE_LIMIT) Una dirección ya contada nunca es rechazada, nada existente es desasignado, y una interrupción de BillingService falla OPEN con una advertencia. El mailbox-assign, Los puntos finales de acceso compartido y buzón personal ahora pasan el estado de un rechazo y Sentencia a través en lugar de un 500.
· VOIPService
Rechazar una extensión telefónica más allá de las licencias de la organización
Regla del propietario 2026-10-22: los complementos facturan por usuario las licencias compradas; cuántas El uso de las extensiones que puedan estar en uso está limitado solo por ellas Cuando se pone en uso, BillingService's **************** es (X-Internal-Auth); un rechazo es un 409 que lleva su lenguaje claro frase (LicenseCapAdvice), por ejemplo, "Las 10 licencias de teléfono de terceros están Agregar licencias en Facturación para asignar otra extensión." Aplicado, antes de que se escriba cualquier cosa: - PUT /api/voip/member/{id}/config (configuración del teléfono del miembro), nombrando el Extensión que el miembro tiene ahora, por lo que un movimiento en un sistema de terceros es gratuito - POST **************** (nueva extensión; KamoPBX cuentas cada uno activo, de terceros solo uno asignado) - PUT **************** cuando el resultado es ACTIVE - Aprovisionamiento de línea de voz AI (NOT_READY / LICENSE_LIMIT) Una extensión ya contada nunca es rechazada, nada existente es No se asigna, y una interrupción de BillingService falla OPEN con una advertencia.
· BillingService
Uso de licencias y comprobaciones de licencias por unidad para complementos por usuario
Regla del propietario 2026-10-22: cada complemento por usuario factura las licencias compradas, como El número de buzones o extensiones que pueden estar en uso solo está limitado por ellos. - GET /api/billing/licenses/usage (sesión, X-Org-Id): por código de complemento (EMAIL_3P_INTEGRATION, EMAIL_HOSTING, PBX_3P_INTEGRATION, PBX_HOSTING) el número de teléfono de la central Licencias en posesión, en uso, disponibles, sobrepasadas, y si la organización está exenta. - Conseguir **************** Protegido por X-Internal-Auth (comparación en tiempo constante con billing.internal-auth-secret), para que EmailService y VOIPService pregunten antes Poner una unidad más en uso. - Licenciado = AddOnLicenses.licensed sobre la suscripción principal active_addon_codes / addon_quantities (o un plan que incluya el complemento); Las claves reservadas __mailboxes:/__extensions: nunca se leen como licencias. En uso = OrgMailboxBillingAggregator / OrgPbxBillingAggregator, el cuenta el Usos de factura nocturna. - Platform org y OWNER_UNLIMITED están exentos; PAID y COMP están limitados; TRIAL, GRATIS y sin suscripción se dejan a las puertas de derechos existentes. - Solo un cambio que ADDS una unidad más allá de las licencias se rechaza; una unidad ya Un movimiento de extensión de terceros que libera a uno, siempre pasa.
· SecurityService
Endpoints para establecer la renovación automática de una suscripción y las notas de un pedido en cualquier estado
· kamo-shared-library
Activar o desactivar la renovación de una suscripción activa; notas en cualquier pedido
El interruptor de renovación automática de la consola envió un campo que la actualización del pedido solo de borrador no hizo Nunca se guardaba, y las notas fallaban en cualquier orden después del borrador.
· SecurityService
Los clientes con tarjeta se cobran automáticamente el día de la facturación
Para las suscripciones AUTO_BILL, el trabajo de facturación carga cada factura aprobada al Tarjeta guardada del cliente en su día de facturación a través de la tarjeta interna de BillingService endpoint, registra el pago (método CARD, referencia = PaymentIntent) y La batería reintenta una carga fallida cada tres días hasta un máximo de cuatro veces Aprobación y envío de una factura cuyo día de facturación ha llegado a su vencimiento Primero, por lo que el correo electrónico del cliente es un recibo. Nuevos puntos finales: - POST **************** - Conseguir ****************

Tu universo está esperando.
Comience gratis en minutos y agregue productos cuando esté listo, sin migración ni nuevos inicios de sesión.
Gratis para siempre: no se requiere tarjeta de crédito