Ir para o conteúdo
KAMOUniverse

Changelog

O que há de novo.

Cada melhoria para a plataforma, como ele envia.

  1. · kamo-shared-library

    GESTÃO ENTERPRISE SUBSCRIÇÕES

    A Enterprise é negociada, nunca servida. Este portão direito ambas as metades de que: ver o que custa, e colocar uma organização nele. Category.OPERAÇÕES em vez de CONSOLE - porta uma ação que atinge Uma facturação de um inquilino, não uma tela da consola da plataforma. Na coluna da plataforma em vez do inquilino pela razão habitual: um inquilino administrador pode editar os modelos de segurança de sua própria organização, RoleRightType aqui deixaria um cliente conceder-se o nível negociado. Persistido como EnumType.STRING, então anexar é seguro.

  2. · SecurityService

    Verifique o gráfico antes de escrever uma prescrição

    A prescrição foi adicionada com a tabela de alergia, a consulta de verificação de interação e um ponto final de "contexto de segurança" sentado ao seu lado, não lido. Um sistema que registra uma alergia e, em seguida, escreve a receita de qualquer forma, sem mencionar é pior do que um que nunca registrou a alergia, porque a prática acredita que é A ser verificado. Três verificações de dados da própria prática podem responder exatamente: alergia registrada, o paciente já está nele, ou ninguém nunca perguntou sobre alergias. Este último é o seu próprio aviso — uma lista vazia significa "não alergias conhecidas" ou "ninguém perguntou", e apenas um deles é seguro para prescrever contra. Uma linha "sem alergias conhecidas" gravada positivamente não é tratada como uma substância. Avisos com um reconhecimento exigido, não recusas. Um clínico pode deliberadamente prescrever uma droga um paciente reagiu levemente a anos atrás, e um sistema que proíbe que seja uma rota de pessoas. O que não deve acontecer é prescrever em IGNORANCE, por isso a escrita é recusada até que o prescritor tenha visto o aviso e diz por escrito porque estão a proceder. Essa razão está registada no Warn com o membro, a droga e o paciente, porque uma revisão posterior é para que serve. 409 em vez de 400: nada é malformado. É uma prescrição válida que em conflito com o que é registrado, e o pedido idêntico sucede uma vez que uma razão está ligado. Os avisos viajam no corpo — uma recusa que só dizia "inseguro" Mandava alguém à procura do que um computador já sabia. A correspondência diminui os pontos fortes e as palavras de preenchimento. "Amoxicilina 500mg" e "Amoxicilina" são o mesmo medicamento de modo que uma força diferente não pode esconder uma alergia; "comprimido", "oral" e "solução" aparecem em metade de todos os nomes de drogas e combinando com eles marcar cada prescrição contra cada alergia, que é a maneira mais rápida de fazer As pessoas param de ler avisos. DELIBERADAMENTE NÃO é a verificação da interacção medicamentosa. Que precisa de uma base de dados licenciada (First Databank, Medi-Span) esta plataforma não tem, e um home-grown aproximação é a coisa mais perigosa que o arquivo poderia conter: ele iria olhar como verificar a interação, ser confiável como ele, e perder a maioria das interações. A A aula diz isso em tantas palavras. 15 testes.

  3. · KlusterServices

    Porta de infraestrutura da fase 0

    - TURN sobre TLS em 5349 com um cert real (turn-kamocrm-com-cert). Sem gira:, um cliente por trás de um firewall de saída 443- só não tem nenhum caminho de mídia. Verificado externamente: ouvinte acima, cadeia valida. - Tabela de alocação de portas de host autorizada; k3m1 reservada para KamoPBX. - Regras do roteador NAT documentadas in-repo, incl. o pbx.kamocrm.com desaparecido Um recorde (necessita de 42.181.8.87). - Coturn comentário corrigido alegando k3m1 é 47.181.8.87; é 42.181.8.87 e .87 em 47.x pertence a um terceiro não relacionado. - Alcance de relé corrigido para o real 52000-65535 (README disse 49152). - sondas de fase 0.sh de fora. As linhas UDP reportam INCONCLUSIVE em vez de PASS: nc -z -u chama quase qualquer porta UDP aberta, que ser um falso verde nos caminhos SIP e RTP.

  4. · kamo-shared-library

    Transportar a unidade do recurso plano para as superfícies de compra

    O catálogo armazenou uma unidade por recurso o tempo todo - "GB/usuário", "usuários", "contactos" - e o DTO do plano-feature deixou cair, então cada superfície renderizando um O recurso medido imprimiu um número nu. A página de preços mostrou "Storage (15)" e uma coluna de comparação de 5 / 15 / 25 / 50, e um leitor teve que alcançar os Termos muito abaixo da dobra para aprender que significava gigabytes por usuário, agrupados. Derivando-o por consumidor do featureCode é o que coloca um tamanho de bloco velho no site de marketing já uma vez, então ele viaja com o valor em vez.

  5. · KlusterServices

    Trocar a saudação de entrada para KamoCRM-Main-Intro-2

    Enviado como um novo arquivo em vez de substituir o antigo, então voltando é uma mudança de uma linha para KAMO ATTENDANT INTRO mais um reload dialplan — não Recarga necessária. Fonte estéreo de 48 kHz convertida para o Asterisco mono de 8 kHz requer; 59,9s, abaixo dos anos 70. Verificado ao vivo: CDR mostra BackGround custom/kamocrm-main-intro-2, e Asterisco decodificado o arquivo para 478954 bytes de u-law, exatamente 59,87s em 8000 B/s.

  6. · kamo-internal

    Autor de um livro de tarefas fixo, preço por minuto

    Substitui o painel de placeholder SW5 pela superfície de criação real: três sub- views em uma aba — livros, categorias, entradas — seguindo o SubView switcher MarketTaxExpediçãoTab e MarketDiscountsTab já usam para classes de impostos e listas de preços. Categorias e entradas permanecem desactivadas até que um livro seja escolhido, e o nome e versão do livro escolhido permaneçam em tela enquanto eles estão abertos. laborMinutes é deliberadamente o campo mais alto na tela. É o um número que faz dois trabalhos — preço da linha e visita — e é por isso que um livro de tarefas bate uma lista de preços. Então... fica sua própria coluna à frente do preço, seu próprio bloco emoldurado no topo do o editor de entrada com uma leitura "1h 30m" ao vivo, e um aviso acima do contas de tabela entradas que estão faltando. Um livro de entradas com preços sem durações é uma lista de preços com passos extras, e nada A jusante pode dizer-lhe que aconteceu. Também pousa as duas peças que a superfície não poderia trabalhar sem: - Está bem. Nenhum proxy cobriu este caminho: commerce/quotes tem um catch-all, mas é escopo para /commerce/quotes, então cada chamada teria 404'd no browser. A nova rota exporta PUT, bem como GET/POST/DELETE — o rota de aspas em que é modelado não tem PUT porque aspas atualização com PATCH, e cada atualização do livro de tarefas é um @PutMapping, então copiando-o verbatim teria feito cada leitura trabalhar e cada resposta salvar 405. - app/lib/serviceTaskBookApi.ts, espelhando ServiceTaskBookApi.java. Cada ID é uma string em ambas as direções: DefaultParts carrega commerce offerings.uid, 19 dígitos unique rowid() Há muito que perde seus dígitos baixos para um JS duplo. BigDecimal permanece um número — o fio mapper dá Long um serializador JS-safe e deixa BigDecimal sozinho. Dois comportamentos API moldam o formulário e são gravados ao lado do código que Trabalha à volta deles. Listando com marketUid também filtros isActive = TRUE, então uma superfície de autoria usando-o nunca poderia mostrar um livro que você tinha apenas reformado; esta lista não filtrado e estreita pelo próprio mercado. E um nulo campo significa "deixá-lo sozinho" na atualização, então inputs numéricos em branco são omitido em vez de enviado como nulo. Pinado por um teste de contrato de nível fonte: os caminhos e verbos do cliente contra os mapeamentos do ServiceTaskBookController, os verbos exportados pelo proxy contra os que o cliente usa, e os tipos id contra string. A cross-repo half skips sem checkout do SecurityService; o resto Corre sempre.

  7. · SecurityService

    API do livro de tarefas no momento certo

    SW5 Tarefa 3, controlador metade. CRUD para livros, categorias, tarefas e opções, mais GET /{bookUid}/tasks/by-code/{code} - a pesquisa de uma citação ou ordem de trabalho executa quando detém um taskCode armazenado. Essa é uma única consulta indexada contra o idx service task book code, não contra um 'fetch-the-book-and-scan'; ele é executado por linha item sobre um catálogo de centenas, por isso é um ponto final. As leituras precisam de VER SERVICE WORK, escrevem precisam de MANAGEM SERVICE WORK. Ambos aterraram em SW1 e ambos já fecham os nove terminais de serviço no POSController. A controlador este não se assemelha deliberadamente é CommerceMarketController, que não carrega nenhum @PreAutorize em qualquer lugar e pergunta apenas se uma sessão existe - o mesmo buraco SW4 encontrado em pedidos e SW1 encontrado em serviço de trabalho. ServiceTaskBookRightsGateTest pinos cada manipulador, e separadamente pinos que não mutação se estabelece para o direito de visão (MANAGEM é uma CRIANÇA de VER nos direitos árvore, assim aceitar a visão em uma escrita é um downgrade silencioso) e que nenhum manipulador aceita VEZ OWN SERVICE WORK do cliente como uma alternativa. O inquilino vem da sessão e é passado como o primeiro serviço argumento, onde se torna um predicado dentro do JPQL. Nada aqui carrega um Remar e depois verificar de quem era. Variáveis de localização chegam como String e passam pelo parseUuid, então um id mal formado é um 400 em vez de uma Primavera 500. "Não encontrado" significa não encontrado em sua ORG, que é a única pergunta que o repositório faz e a única resposta a uma chamada Tenho de ir.

  8. · kamo-shared-library

    Serviço de livro de tarefas com CRUD e resolução de código

    SW5 Tarefa 3, metade da biblioteca. ServiceTaskBookService expõe livros, categorias, tarefas e opções por trás de uma API de org-scoped, além de resolverTaskByCode - o procurar uma cotação ou ordem de trabalho executa quando armazena um taskCode. Essa é... uma única consulta indexada contra idx service task book code, alcançada através O livro directo do ServiceTask, FK, não é uma pesquisa. Cada ponto de entrada toma orgId como seu primeiro argumento e dá-lo a um repositório cujo JPQL carrega o predicado. Nada é carregado por UID e verificações a org depois; essa forma foi o que fez seis terminais de comércio O agente cruzado lê antes de a SW1 os reparar. ServiceTaskBookServiceShapeTest pinos ambas as metades - a regra de assinatura e 'every servicework @Query names organização.id. Foram necessários dois repositórios que a Tarefa 1 não criou: categorias e as opções não carregam nenhuma org própria, de modo que suas leituras org-scoped livro (dois saltos para uma opção). Idds e timestamps saem como cordas em ambas as direções. Offering.uid é um 19 dígitos Long e um número JSON em um navegador é um duplo, que é o mesmo trap que forçou QuoteConversionResult.orderUid para se tornar uma String no SW4. Lê o mapa das vistas dentro da transacção em vez de entregar as entidades a um controlador, então nada depende de open-in-view permanecer verdadeiro. Exclui recusar em vez de cascata: um livro que ainda contém entradas com preços e uma categoria que ainda detém tarefas ambos respondem 409. Aposentar um livro é isActive/effectiveAté, o que deixa todas as linhas vendidas resolvíveis.

  9. · kamo-internal

    Precificação, impostos e níveis de preços para os mercados de serviços

    Um mercado de SERVIÇO tem exatamente três abas — Visão geral, fornecedores, acordos. Clientes, Impostos e Envios e Descontos e Preços foram todos fechados em CommerceType === "RETAIL", que escondeu três superfícies que uma org precisa: classe fiscal (uma sub-visão de Impostos e Envios), listas de preços (uma sub-visão de Descontos & Preços), e níveis de conta (Clientes). O movimento dos três atrás de um predicado nomeado, SUPPORTS PRICING SURFACES, então a razão vive ao lado da regra e adicionando uma vertical é uma edição. Clientes tem que viajar com descontos: PriceList. CustomerTier pontos em AccountTier, lista de preços não-gating sem as folhas de superfície da camada Esse campo não pode ser preenchido. Produtos e Inventário ficar apenas RETAIL. Um livro de tarefas não é um produto catálogo, e mostrar um serviço org uma grade de produto vazia implicaria Deve encher um. Adiciona o item de tabulação SERVICE- only task-book (chave de hífen minúscula, embora as abas de mercado são vigiadas por nenhum teste de cobertura). MarketTaskBookTab é um placeholder que faz um aviso; a criação de terras de superfície substitui-o por grosso.

  10. · kamo-internal

    Aplicar uma remessa a uma reclamação

    "Dinheiro não aplicado" é dinheiro que o pagador enviou que ninguém anexado a uma reivindicação, e a fila só podia ser vista. PAGAMENTOS PÓS-INSERVAÇÃO operação sem forma de alcançá-la. Linha por linha, porque é assim que um pagador julga. Montante fixo em relação a Quanto à segunda questão a fila negation-patterns existe para responder e o um apelo tem que argumentar. O pedido é encontrado pelo número de cotações do ordenante, que é o único identificador Uma remessa leva. Digitar e ver as linhas aparecerem é a diferença entre postagem contra a reivindicação o pagador pago e um que parecia semelhante. Deixar uma linha em branco significa que o pagador não a resolveu, e o diálogo diz assim: A reclamação permanece aberta até que cada linha tenha uma figura. Sem essa frase alguém digita zeros para ser arrumado e fecha uma reivindicação ainda sendo trabalhado. As quantias ficam em fio o tempo todo. Processá-los para "validar" colocaria ponto flutuante binário de volta para o dinheiro, e 0.1 + 0.2 em uma linha de reivindicação é um equilíbrio um paciente é solicitado a pagar e não pode ser dito o motivo para.

  11. · SecurityService

    Encontrar uma reivindicação pelo número de um pagador cotações

    Publicar uma remessa precisa da reivindicação que ela resolve, e uma remessa não leva id interno — apenas o número da prática enviada. Sem esta pesquisa, aplicar dinheiro significa ler o número fora da remessa e caça para a reivindicação por olho, que é como um pagamento atinge o errado. Retorna a reclamação com suas linhas, porque os pagadores julgam por linha e postam é por linha. 404 quando não existe tal número: "não temos nenhuma reivindicação com isso número" é a resposta que alguém precisa postar, e um objeto de sucesso vazio lê como uma reivindicação sem nada.

  12. · kamo-internal

    Quatro coisas que podiam ser vistas e não feitas

    Cada um destes tinha um endpoint de trabalho, uma função do cliente, e nenhuma maneira para uma pessoa para alcançá-lo. A fechar um ciclo de pedidos. A fila de loops abertos existe porque o teste ordenado ninguém perseguido é o modo clássico como um diagnóstico é perdido — e só poderia ser Ler. Uma fila que ninguém consegue limpar é que uma pessoa pára de abrir. Pergunta-se a razão porque "result revisado com o paciente" e "cancelado, eles fizeram isso em outro lugar" fechar a mesma linha e apenas o primeiro significa que alguém viu o resultado. Parar uma medicação. Oferecido apenas na lista prescrita: a reportado medicação é receita de outra pessoa, que esta prática pode gravar e Não consigo parar. A razão é importante — um curso final, uma intolerância e um interação todos terminam a prescrição, e apenas os dois últimos devem parar prescrito de novo. Retirar o acesso ao portal, agora que um ID de conta pode ser obtido. O painel carrega o acesso que o paciente já tem na montagem em vez de atrás de um botão, porque essa é a primeira pergunta que alguém faz sobre ele — e convidar alguém que já está assinado substitui seu link de trabalho para nada. Recolhendo uma exportação terminada. Poderia ser iniciado, observado e cancelado e nunca baixado, que é o ponto todo de executar um. O manifesto é obtido primeiro e os arquivos vêm dele: uma exportação em massa é um NDJSON por tipo de recurso, e adivinhando ids iria produzir um lançamento de registros que é silenciosamente incompleto. Também removido fetchWittingRoom, que nada chamou. PracticeDayPanel deriva o mesmo conjunto a partir do dia em que já tiver carregado — uma viagem de ida e volta em vez de duas, e não pode discordar da programação ao seu lado. Um comentário diz isso, porque um wrapper não utilizado lê como uma tela faltando para a próxima pessoa que auditou isso.

  13. · kamo-shared-library

    Adicionar o livro de tarefas de taxa fixa

    Um catálogo de tarefas a preços cujas entradas têm mão-de-obra tanto preços uma linha e tamanhos uma visita. ServiceLineItem.taskCode, desembarcado em SW3, junta-se ao ServiceTask.code BY VALUE e não por FK: o livro é versionado, então a linha vendida deve manter significado o que significava quando foi vendido mesmo após a entrada é revalorizado ou reformado. ServiceTaskCategory mirrors ProductCategory em vez de reutilizá-lo ProductCategory junta-se à Oferta através do ProductCategoryMapping, por isso partilha Colocava "Drain Clearing" e "Kitchen Taps" numa árvore. A eficácia A janela é retirada do hr/timecard/MemberPayRate. ServiceTask detém seu livro diretamente em vez de alcançá-lo através do opcional categoria: t.category.book é uma associação implícita, que Hibernate renderiza como para que cada tarefa não categorizada desaparecesse silenciosamente das este livro". columnDefinition é fixada em cada FK e em cada coluna de junção de elementos. Verificado exportando a DDL do mapeamento: nenhuma coluna de junção carrega uma DEFAULT, então um FK não definido permanece nulo em vez de inventar um id pai aleatório. Cada leitura do repositório é org-scoped dentro da consulta, nunca verificada depois.

  14. · InitializerService

    Por-extensão esquema de faturamento PBX, backfill e catálogo

    PbxBillingSchemaMigration é @Order(0) porque adiciona uma coluna. A entidade compartilhada-biblioteca mapeia phone cost mode a partir do momento em que a compilação começa, então qualquer corredor que carregue uma Política de OrgBilling através da JPA emite-a na sua SELECT - ordenado tarde este corredor nunca executa em tudo, porque um anterior morre em "Column ... não existe" e leva tudo para baixo. org extension billing days está em público, não um esquema próprio: todos os outros Voip mesa é. É único em (org id, dia, addon code, subscription uid), um coluna maior que o equivalente de e- mail, então uma org com dois grupos de faturamento mantém duas linhas de auditoria em vez de uma sobrescrita. subscription uid não é NOT NULL precisamente para que a regra nulls-are-distinct do SQL não possa derrotar esse índice. **************************** repara as tarefas CasoSyncService tinha sido apagar em cada varredura - nove membros realizada um e todas as vinte e três linhas de extensão são nulas. Apenas preenche um espaço em branco: o lado da configuração junta- se a uma cadeia de extensão sem restrições, por isso é o registo mais fraco e nunca substitui um ID que está definido. PbxAddonCatalogMigration seeds ambos add-ons em cada catálogo que já vende os correios, ancorados na linha EMAIL HOSTING para org, mercado e Planos compatíveis. Alcançado dessa forma ao invés de por um id codificado porque dois Os inquilinos têm complementos com os mesmos códigos. KamoCRMPricing O carregador também os apanha. catálogos semeados a partir daqui - é apenas criação, então editá-lo sozinho corrige Nada já está na base de dados.

  15. · BillingService

    Bill telefone serviço pela extensão

    PreçosModelo.PER EXTENSÃO, sua própria chave de quantidade reservada, um alocador, um reconciliador noturno, um portão de remoção e a API sumária - o gêmeo do telefone Por-mailbox trabalho, diferente em qualquer lugar que os dados fazem. Multi-instância é a diferença que corre através de tudo isso. Uma org pode executar um Servidor KamoPBX e um servidor RingCentral de uma vez, então ambos os add-ons podem faturar no no mesmo mês: o alocador retorna uma contagem por assinatura por CÓDIGO, e cada a assinatura carrega ambos os códigos com zero onde nada foi atribuído. Isso. torna a condução de um código não utilizado para zero o caminho normal em vez do especial caso o reconciliador de correio necessita. PER EXTENSION é o seu próprio Modelo de Preços, não uma reutilização de PER MAILBOX, e estaciona o seu count under extensions: em vez de mailboxes:. Os dois reconciliadores correm independentemente e nenhum dos dois pode perturbar a quantidade do outro. Licenciado, nunca medido - um preço Stripe medido rejeita uma quantidade total e falha o todo Chamada de assinatura. PhoneCostMode é um irmão do MailCostMode pela mesma razão: reutilizar mail cost mode faria o nome da coluna false e moveria silenciosamente o dinheiro do telefone quando um proprietário mudou que paga pelo correio. A atribuição segue o associado atribuído diretamente - extensões não precisam de conceito primário, porque MEMBRO VOIP CONFIG.MEMBER ID é único e o MemberVoipConfigController retorna 409 sobre um segundo requerente, então o link já é exclusivo em ambos os lados. org extension billing days é marcado na assinatura, bem como no dia e Código. A tabela de e-mail não está, então em GROUP PAYS OWN seu segundo grupo de faturamento sobrescrever a primeira e a linha de auditoria do dia é errado para cada grupo, mas o Por último. Gravado como seguimento em vez de copiado. O pacote compartilhamento-lib voip.billing é nomeado em @EnableJpaRepositórios - que lista é explícita, e o modo de falha é o serviço que se recusa a iniciar.

  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

    Mostrar o custo das extensões, onde as extensões são gerenciadas

    ExtensionUsagePanel na página de estatísticas, ao lado da caixa de correio e painéis de armazenamento: contagem por classe, a taxa de catálogo, o total mensal e a regra em plano linguagem. Ambas as regras de classe podem ser mostradas imediatamente, porque uma org pode executar uma Servidor KamoPBX e um servidor RingCentral no mesmo mês - o e- mail do caso poderia nunca produza. Os números livres são dados o mesmo peso que o billable. Dispositivos são livre em ambas as classes, e extensões não atribuídas - filas, IVRs, grupos de anéis - são livres ao abrigo da regra de terceiros e são geralmente a maioria. Ambos são medido pelo agregador em vez de afirmado na cópia. Gating no coletor de servidor de telefone, com duas regras E-mail trabalho porque ambos foram aprendidos da maneira difícil. Falha ABERTO, então um faturamento A deficiência não pode enveredar por uma org mid migration. E nunca tranca um tipo de fornecedor a org já executa uma instância ao vivo de - todas as quatro orgs com um servidor de telefone hoje não tem nenhum código adicional, e dizer-lhes o servidor que eles já são usar requer um complemento seria falso. Um cartão bloqueado é mostrado com a razão sobre ela em vez de simplesmente cinza para fora. Taxas vêm do catálogo, nunca codificadas: uma taxa escrita na UI torna-se uma mentira na primeira vez que o catálogo muda, e nada falha quando Sim.

  18. · KlusterServices

    Tempo limite da fila e "pressionar 0" ambos caem para voicemail

    Substitui o Dial (+) laminado à mão Ir para fila loop com app queue. A decisão fator é DTMF: dígitos NÃO são combinados com o dialplan enquanto Dial() é rodando, então "pressionar 0 enquanto em espera" não pode ser construído em Dial() em tudo. A a configuração `context' da fila = kamo-queue-exit` é o que torna possível. prorrogação -> transmitida a essa prorrogação 1 ou 2 -> fila 0 -> direto para o voicemail, da saudação ou da espera 10 min -> voicemail mau exten -> "inválido" prompt, em seguida, fila O correio de voz da linha principal é caixa de correio 8100, deliberadamente não um dos funcionários caixas de correio para que as mensagens da linha principal não pouse no correio de voz pessoal de alguém. A saudação é tocada com Playback() de sons/ e VoiceMail() é então chamado com `s. Duas descobertas levaram a que: - Uma cópia instalada em... REMOVED entre uma mensagem de voz recarregar e a próxima chamada, e VoiceMail caiu de volta ao "a pessoa na extensão ... não está disponível". A O spool é gerenciado por app voicemail/FreePBX; sons/ não é. - A opção 's' ignora a saudação, bem como as instruções, apesar documentos descrevendo-o apenas como instruções. Com 'su' a gravação nunca Tocava mesmo. Playback + `s` dá gravação -> beep -> registro exatamente. Verificado ao vivo, cada caminho separadamente: - timeout da fila: fila log EXITCOMTHTIMEOUT, então CDR dcontext=kamo- voicemail lastapp=Playback custom/kamocrm- highcallv..., userfield QS:TIMEOUT - carregue em 0: fila log EXITWITKEY então a mesma perna de correio de voz - registro + loja: msg0000.gsm escrito na caixa de correio 8100 - resposta: fila log CONNECT PJSIP/8080 -> COMPLETEAGENTE Duas notas de teste que valem a pena guardar. `canal origina ` chamadas caps em ~30s, que trunca qualquer teste mais longo e parece uma falha dialplan. E teste silencioso as gravações são descartadas por maxsilence=10, pelo que uma INBOX vazia não significa a gravação é quebrada — comprovada pela configuração temporária de maxsilence=0 e restauração. Acrescenta: resultados da fila são de outra forma Invisible outside fila log.

  19. · kamo-shared-library

    Contar as extensões que um servidor de terceiros não cobra

    Filas, IVRs, grupos de anéis e peças sobresselentes são as extensões a que ninguém é atribuído, e sob a regra de terceiros eles são livres - doze de uma org de produção dezessete extensões utilizáveis. clausure() as deixou cair silenciosamente, então o número existia em nenhum lugar e o painel de estatísticas só podia afirmar que eles eram livres em vez de mostrar. Contado com a mesma tecla de dedup que o caminho billable usa, então o número livre não pode contar uma linha dupla que a carga não faria.

  20. · kamo-shared-library

    Contar extensões de telefone Billable

    Adiciona o gêmeo de telefone do agregador per-mailbox: PbxBillingClass com um Comutador VoipProviderType exaustivo e nenhum braço padrão, OrgPbxBillingAggregator (sem estereótipo da Primavera - BillingService declara o feijão), e a auditoria diária instantâneo. Uma diferença estrutural atravessa tudo a jusante. org email providers é único no org id, então exatamente um add-on de e-mail poderia nunca faturar não-zero. VOIP PROVIDER INSTÂNCIA é muitas linhas por org, então uma org pode executar KamoPBX e RingCentral de uma vez e ambos add-ons Bill no mesmo mês. A desagregação é portanto, uma lista plana carregando uma classe por extensão, e unidades countByClass() o código não utilizado a zero através do caminho normal em vez de um caso especial. VoipProviderType é EnumType.ORDINAL, então nada é adicionado a ele; a cobertura teste pinos a ordem, bem como a classificação. FREE PBX classifica como terceiro - o catador oferece como um PBX on-premise, que é o próprio Asterisco do cliente. O KAMO PBX é, portanto, o único tipo hospedado e, uma vez que nenhuma instância KAMO PBX existe e KamoPBXProvider ainda lança de todos os métodos, PBX HOSTING corretamente não conta nada hoje. Ambos os registos são lidos. MEMBRO VOIP CONFIG - porque a tela de configurações de telefone do membro escreve ambas, então A sua união é exactamente o que um administrador define. Um número que decide o dinheiro não deve descansar em uma coluna uma varredura de fundo pode zero, que é precisamente O que a InstanceSyncService lhe estava a fazer. Extensão BillingDay tem a chave na assinatura, bem como no dia e no código, então uma org com dois grupos de faturamento mantém duas linhas de auditoria em vez de uma sobrescrita o outro.

  21. · KlusterServices

    Fila hold-music tocando 8000 e 8080 simultaneamente

    Oito faixas de espera carregadas como a classe 'kamocrm-hold' MOH, embaralhada. A ordem aleatória vem de `random=1` na linha na tabela 'música' do FreePBX, que é o que gera `sort=random' em musiconhold additional.conf — set no DB, não no conf, ou o próximo reload do FreePBX substitui-o. Roteamento após a saudação: extensão -> transmitida para essa extensão (inalterada) 1 ou 2 -> fila timeout -> fila mau exten -> "inválido" prompt, em seguida, fila A fila é... ambos tocam ao mesmo tempo, primeiro a responder ganha, e o ouvinte ouve música em vez de voltar ao ringue. Os membros são discados como parâmetros PJSIP brutos em vez de através de-did-direct ON FINANCIAMENTO: passar pelo plano de extensão do FreePBX aplicar o temporizador de anel de cada extensão e, em seguida, entregar o chamador a essa pessoa voicemail, que é o oposto de tocar indefinidamente. O laço não tem tampa, como solicitado. O guarda que importa é o Executivo: NOANSWER significa que nós realmente chamamos para o tempo total. CHANAVAIL (ninguém registrado), CONGESTION e busy todos retornam em milissegundos, assim sem MusicOnHold pause o Goto torna-se um giro apertado. Medida com ambos os membros desregistrado: 1 segundo de CPU e 24 linhas de log em 45 segundos na fila. Também levanta janela de graça WaitExten para jogar segurar a música, então a entrega de cumprimentar a fila não tem nenhuma lacuna silenciosa. Verified live: PJSIP/8080 observado no estado de Ringing sob Com o canal de chamadas em Ring. Áudio não está no ConfigMap — saudação 1.1 MB mais 7.7 MB de faixas está bem além do limite do objeto etc. Ambos os conjuntos vivem no asterisco-lib hostPath e o comando de conversão está documentado ao lado dos globais que os nomeiam.

  22. · kamo-internal

    Um emoji em uma única mensagem e uma mensagem que você pode corrigir

    Um membro pediu ambos no chat individual. Eles pousam no mesmo menu por mensagem o janela já tem, ao lado de Copiar e Desenviar. Reações render como uma barra de chip sob a bolha — o emoji, quantas pessoas usaram, e se o visualizador é um deles, com o chip em si como o comutador assim reagindo e não-reagindo são um controle em vez de dois. Os nomes das dicas que reagiram, resolveram contra o membro da sessão listar a janela já mantém. Um "+" que se segue abre o catador onde já há uma barra para pendurar; uma mensagem sem reações ainda passa O menu. O catador abre à medida que as seis pessoas realmente usam e se expandem para o existente pesquisável a pedido, porque um painel 320px deixado cair numa janela de chat 320px não é um reacção rápida. Edição troca a bolha por uma caixa contendo o que o SENDER escreveu — originalText, não o tradução que um leitor pode estar olhando — com Enter para salvar e Escapar para cancelar. Escapar pára lá em vez de atingir o cromo da janela, que teria fechado todo o chat numa edição cancelada. Uma mensagem editada carrega "(editada)" para todos, que é o que faz editando depois que alguém o leu honesto; que a divulgação é por isso que editar, ao contrário de não enviar, é ainda oferecido em uma mensagem que foi visto. Enquanto a caixa está aberta, diz-se que alguém está a editar — o "...está a editar" indicador existe em ambas as extremidades desde o trabalho de digitação e nada na web já levantou Ele. Referência-contada e republicada em um intervalo, porque os receptores limpam um velho indicador após três segundos e uma longa correção pareceria ter parado. Ambos os controles saem com o compositor quando a política de chat da organização congela isso membro: eles passam pelo mesmo portão no servidor, e oferecendo um controle que será recusa é pior do que não o oferecer. Toma @kamo/chat-core 0.1.8 e @kamo/realtime 0.1.

  23. · MediaService

    Reagir a uma mensagem com um emoji, e corrigir uma que você enviou

    POST **************** estabelece ou limpa emoji do ouvinte e respostas com todo o conjunto de reação da mensagem, então um cliente que correu convergi para o servidor Estado em vez de em seu próprio palpite. Reagir é tratado como falar: mesma sessão-membro verificar e mesma política de chat da organização que o envio, porque um membro que não possa responder aqui pode não responder com um . O emoji em si é validado, não confiável. É verbatim verbatim sob outra pessoa mensagem na conversa de todos, de modo que o portão é em forma de lista branca e estrutural: split on a junta de largura zero, nenhum segmento pode conter mais de um pictograma. Isso requer uma família ou um e recusam a profissão, que é duas reações tipificadas como uma, juntamente com o texto, Uniões solitárias e meia bandeira. PATCH /api/media/mensagens/{id} corrige uma mensagem. Deliberadamente NÃO gated em se alguém leu-o, que é a única regra que o unsend tem — veja o commit bibliotecário compartilhado para o porquê os dois diferem. Ele recusa um corpo em branco em uma mensagem sem arquivos (brincar uma mensagem é não o enviar, que tem sua própria regra), recusa uma mensagem já entregue a um plataforma social (nada aqui pode chegar a essa cópia), deixa cair as traduções em cache da mensagem, e arquiva o que costumava dizer. Além disso: MENSAGEM DELETADA e ATAQUE REVOCADA agora carregam `id`, bem como `mensageId'. O relé projeta cada frame através do ChatMessageDto, que não tem campo messageId, então ambos os eventos chegou ao navegador com id: null e cada assinante os descartou — uma mensagem não enviada Ficou no ecrã do outro lado até recarregarem. O relé do Javadoc agora diz em voz alta que é uma allowlist, uma vez que foi isso que tornou possível uma queda silenciosa.

  24. · kamo-shared-library

    Reações emoji por mensagem, e uma mensagem que seu remetente pode corrigir

    Duas coisas que um membro pediu no chat individual: um emoji qualquer pessoa na conversa pode colocar uma única mensagem, e a capacidade de corrigir uma mensagem que você já enviou. MEDIA OBJ REACTIONS é uma linha por (mensagem, membro, emoji), não uma contagem por emoji. Cada pergunta que o produto faz de uma reação é sobre a OMS: o chip é uma alternância, então ele tem que saber se o espectador já está nele, e seus nomes de dicas que reagiram. A Restrição única é o que faz com que a alternância segura sob um duplo clique corrida. Edição mantém MediaObjMsg.message como o corpo atual, selos DATE EDITED, e arquivos do corpo substituído em MEDIA OBJ MSG EDITS. Essa tabela é a resposta para por que a edição não é Fechado em "alguém viu" do jeito que não foi enviado. Desenviar faz as palavras de leitura desaparecerem, então recusando-o após o fato é o que impede uma conversa sendo reescrita por trás de um leitor atrás; um erro de digitação, por outro lado, é quase sempre notado depois que alguém o leu, e o mesmo portão recusaria correções exatamente quando elas são desejadas. A divulgação é paga em vez disso — todo leitor é dito que a mensagem foi editada, e o que costumava dizer é mantido em vez de substituir. ChatMessageDto ganha os campos em ambos os eventos. Esse DTO não é documentação: NATS para STOMP relé no MediaService desserializa para ele e re-emite uma lista de campos fixo, assim, um campo que ele não declara nunca atinge um navegador.

  25. · KlusterServices

    Cumprimento gravado, dial-by-extension, 1/2 para operador

    Substitui o padrão music-on-hold hold com a introdução gravada: - Está bem. toca a saudação E escuta no Ao mesmo tempo, para que um chamador possa discar sobre ele a partir do primeiro segundo. Reprodução () ignoraria as teclas até que o arquivo terminasse — 70 segundos de ser ignorado. - 1 e 2 vão para a extensão do operador. - Nada discado até o final da saudação vai para o operador, após um 4 segundos janela de graça para um chamador que começa a discar na última palavra pode terminar; sem ele o segundo dígito chega depois de termos seguido em frente. - Correspondências de marcação directa [3-9]XXX, não XXX. Com XXXX um único "1" também é um correspondência parcial para uma extensão de 4 dígitos, assim Asterisco deve sentar-se através TIMEOUT( dígito) antes de poder descartar isso e o chamador ouvir quatro segundos do silêncio. O custo é que 1 e 2 são reservados, por isso nenhuma extensão pode começar Com eles — que o menu já exigia. Extensões renumeradas 2523 -> 8912 (Briana) e 2000 -> 8000 (Erik). A WebRTC bloco final é chaveado por extensão NÚMERO, por isso renumeração silenciosa encaderna uma extensão lá: ainda registra sobre WS, mas sem DTLS/ICE a mídia nunca estabelece e o chamador recebe uma chamada conectada com não Áudio. 8000 não tinham qualquer bloco em 2000 — e é agora o destino para Cada pessoa que liga 1, marca 2, ou não diz nada, por isso tinha de ganhar um. Saudação de áudio não está neste ConfigMap: em 1.1 MB ele iria explodir o etcd limite de objetos. Ele vive no asterisco-lib hostPath e no comando de conversão está documentado ao lado do global que o nomeia. Verified live end to end: feature plays (BackGround custom/kamocrm-main-intro); 1 -> de-did-direct 8000; 8912 -> sua mensagem de voz com todas as 3 mensagens intactas; uma extensão desconhecida joga pbx-inválida em seguida cai para 8000.

  26. · KlusterServices

    Inbound auto-attendent - música em espera + dial-by-extension

    Chamadas de entrada não tinham para onde ir: a mesa de entrada estava completamente vazia, Então até mesmo uma chamada entregue teria um beco sem saída. Adiciona o contexto de serviço mais os dois tunbles que ele lê. A opção m() do WaitExten é o mecanismo — ele toca uma classe de música em espera AND coleta dígitos simultaneamente. Background ()/Playback () parar no final do arquivo e MusicOnHold () não coleta nada, então nenhum pode expressar "música até o chamador disca". O módulo IVR não está instalado nesta caixa (sem ivr details tabela) e gostaria de um anúncio gravado em vez de música de qualquer maneira. Aplicado ao extensions custom.conf sob um grep guard em vez de escrito sobre it: kamo-asterisco-suporte possui um bloco delimitado por marcadores no mesmo arquivo e preserva tudo fora dele byte-for-byte. Também cria /var/log/asterisco/cdr-csv. cdr csv logou um ERROR * e * a ATENÇÃO para cada chamada leg porque esse diretório está ausente da imagem. O MySQL CDR é aquele que lemos então nada foi quebrado, mas enterrou o Asterisco log — o mesmo log usado para diagnosticar falhas de chamada. Verificado ao vivo: respostas de atendente e detém em WaitExten(45,m(default)); uma extensão inválida reproduz pbx- invalid e volta para a música; uma extensão atinge de-did-direct e tocou PJSIP/8080 (ANSWERED, 20s). A O contador ATENDANT TRIES também está inicializado no rótulo — atingindo `menu` sem ele deixou $[ + 1] um erro de processamento que depois corrompeu o seguinte GotoIf, enviando a chamada para algum lugar sem intenção em vez de falhar alto. A rota de entrada e as linhas de Destino Personalizado vivem no FreePBX MariaDB (statefulset persistente) e não são reproduzidos aqui.

  27. · InitializerService

    Um calendário compartilhado por org, um primário por membro

    Provisionamento não tinha nada por baixo dele, então duas cargas simultâneas de primeira ambos inserido. Recolher o que já fez — vinte linhas duplicadas sete organizações e treze membros, vitórias mais antigas, perdedores desativados em vez de eliminado e qualquer coisa apontando para um re-pointed primeiro — em seguida, adiciona o índice único parcial por tipo de calendário que torna uma segunda linha impossível. Parcial porque o invariante está nos calendários PROVISIONADOS: uma simples única índice sobre a organização proibiria o próprio membro, e um sobre o a associação proibiria os calendários extras que um membro é livre para criar.

  28. · kamo-internal

    Reveja o acesso de emergência e feche as duas últimas superfícies

    O endpoint de revisão de vidro de quebra teve uma função cliente que nada chamou: o acesso ao prontuário de emergência foi gravado e não havia tela para lê-los. A break-glass ninguém revê é uma trilha de auditoria em vez de um controle, que é o o oposto da razão pela qual o subsídio é cronometrado e racional em primeiro lugar. É uma sexta aba no escritório de registros, a superfície de conformidade, e mostra a razão expressa verbatim — essa frase é toda a substância do reexame, e uma versão resumida dela não decide nada. Dois portões desaparecidos. O botão de vidro de ruptura é agora oferecido apenas a um role que detém o BREAK GLASS PATIENT ACCESS; mostrando-o a alguém que não pode usá-lo ensina-lhes a recusa é arbitrária, quando a resposta honesta é que o seu papel não inclui o acesso de emergência — então eles recebem essa frase Em vez disso. E a contabilidade de divulgação é seu próprio segmento atrás VER DISCLUSURE ACCOUNTING: produzindo uma cópia para um paciente e lendo o O registo de onde quer que o seu registo já tenha ido são trabalhos diferentes. Esse é o último dos 26 direitos clínicos de portar algo que uma pessoa pode alcançar.

  29. · kamo-internal

    Levantar e enviar uma reclamação da fila que encontrou o trabalho

    O ciclo de receita leu sete filas e não conseguiu levantar uma reclamação. Cada um escreve agora pendura fora da fila que surgiu a necessidade para ele em vez de viver em uma tela Por conta própria. "Nunca cobrado" é uma lista de procedimentos realizados sem custo e sem indicação razão — nada falhou e nada disse a ninguém — de modo que a coisa útil ao lado cada linha está criando a carga. A linha deixa a fila uma vez que ela existe, que é o ponto da fila. O envio é oferecido apenas em uma reivindicação ainda no DRAFT. Reenviar um pedido aceite é como uma prática é paga duas vezes e depois recuperado, e duplicado do pagador A lógica não é algo em que se possa confiar. A confirmação diz que a reclamação é um rascunho e para verificar antes de enviar, porque os dois passos são deliberadamente separados e "raised" sozinho iria deixar As pessoas acreditavam que tinha ido para o pagador. Ambas as ações estão ausentes sem MANAGEM CLAIMS. As recusas são próprias do servidor sentença, que nomeia uma restrição de auto-pagamento ou uma permissão em falta — quer seja mais uso do que qualquer coisa que este ecrã possa inventar.

  30. · kamo-internal

    Corrigir os detalhes de um paciente

    Os detalhes poderiam ser digitados uma vez e nunca corrigidos. O painel fica sob o resumo em vez de numa tela de configurações, porque no momento em que alguém nota um erro nome é o momento em que eles estão olhando para ele — e não dá absolutamente nada sem EDIT PATIENT DEMOGRAFIA. Somente os campos que o usuário realmente mudou são enviados. O servidor deixa um ausente campo sozinho, e diffing contra o que foi carregado torna isso verdadeiro na prática: a tela que não renderiza todas as colunas então não pode esvaziar silenciosamente as Omite. A consequência do re-index é indicada antes de salvar, não depois. Nome ou data alterar rearquiva o paciente para verificação duplicada e para solicitações de registros de outras práticas; sem dizê-lo, um nome casado parece cosmético e o resultado é um paciente que só pode ser encontrado sob o nome que já não usam. O MRN é mostrado e não editável. É assim que o mundo exterior nomeia isto pessoa, e renumeração quebra cada referência um pagador, um laboratório e uma carta anterior Já esperem.

Seu universo está esperando.

Comece gratuitamente em minutos.Adicione produtos sempre que estiver pronto — sem migração, sem novos logins.

Gratuito para sempre — não é necessário cartão de crédito