Saltar al contenido
KAMOUniverse

Changelog

Qué hay de nuevo.

Cada mejora de la plataforma, a medida que se envía.

  1. · kamo-shared-library

    Billete todo el término por adelantado, y dilo en la cita

    Un org que cobra por adelantado vio la tarifa mensual en un acuerdo de tres años. El decidir que ya existía. pero sólo alcanzó citaConversionService, en el momento de la conversión. El El propio documento siempre tenía un precio como si el cliente pagara por período. applyOptionHeadlineTotals ahora se ramifica sobre la base: toma FULL-CONTRACT contractTotal (que ya lleva la cuota de configuración, por lo que no se debe añadir dos veces), FIRST-PERIOD-PLUS-SETUP guarda la primera factura. periodTotal y mensualEquivalente no se tocará bajo ambos - las insignios de ahorro se comparan con mensualEquivalente, y moverlo cambiaría cada criterio de la página. La base es STAMPED en la cita cuando se levanta en lugar de resolver en vivo. Una cita establece términos, y un administrador volteando el interruptor de org la próxima semana debe no volverlos a presentar en un documento que un cliente ya tiene. Leer el ajuste de org en el momento de la conversión hizo exactamente eso: volvió a abarchar las citas que ya estaban Aceptada. Conversion ahora lee el propio sello de la cita, y revisarlo lleva a través de una revisión no puede volver a basar en silencio una negociación en vivo. La columna es nula porque cada fila existente es anterior a ella; se resuelve nula a PRIMERO.PERIOD.PLUS-SETUP, que es lo que esas citas fueron enviadas, así que nada ya en manos de un cliente cambia de valor.

  2. · DaemonService

    El barrido programado de Tick SecurityService

    Cada cinco minutos. Un horario está listo en el minuto, así que una garra de maraña más fina no compra nada un miembro se daría cuenta y uno más grueso hace un reporte de las 8:00 llegar a las 8:15. DaemonService es el dueño de esto por la misma razón por la que es dueño del paquete legal y barrión el correo electrónico: réplicas: 1 con estrategia Recrear significa que la vieja vaina se ha ido antes de que comience el nuevo, por lo que una ventana de despliegue no puede dispararse dos veces. Un programado en SecurityService, que rueda con oleada, puede ser y no hay ShedLock en cualquier lugar de esta flota, por lo que el conteo de vainas es toda la garantía. DesordenarLa ejecución concurrente porque un barrido largo no debe tener un segundo comenzó en su parte: ambos encontrarían los mismos horarios debidos, ya que nextRunAt es sólo avancén una vez que el primero los haya reclamado, y el mismo informe saldría dos veces. Tiempos explícitos por la misma razón por la que los trabajos de hermanos los tienen. RestTemplate espera para siempre, y un hilo clavado aquí significa que el barrido nunca corre de nuevo hasta que la vaina se reinicie, lo que es indistinguible de "no se debía nada". Nada sobre un informe cruza este proceso: el barrido devuelve cuenta, nunca rejas.

  3. · SecurityService

    Ejecute los informes que se deben, y envíalos

    Una variable interna, X-Internal-Auth cerrada y constante en comparación, que DaemonService se aferra. El cron se queda en el demonio porque son réplicas: 1 con estrategia Recrear, por lo que una ventana de despliegue no puede disparar doble; un programado en un servicio que rueda con la oleada puede, y no hay ShedLock en ninguna parte de esta flota. Para un trabajo cuya producción es las cifras de una organización enviadas por correo electrónico a una lista de direcciones, "generalmente una vez" no es una propiedad. Cada horario funciona como su PROPIY, con derechos recomputados en el tiempo de ejecución de su subvenciones almacenadas -no como el demonio, que no tiene ninguno, y no como quien editó por última vez el horario. Revocar el acceso de alguien detiene sus horarios produciendo datos ya no deberían ver en la siguiente carrera, en lugar de cada vez que una sesión expira. Sin eso, un horario es una manera de hacer que el servidor lea datos en su en nombre de que no podías leerte a ti mismo. nextRunAt está avanzado ANTES de la entrega se intenta. Un accidente a mitad de carrera y luego cuesta un enviado perdido en lugar de un bucle sin límites de duplicados, y un semanario perdido El informe es un fracaso mucho más barato que el mismo informe que llega cuarenta veces. El archivo renderizado va como un adjunto en lugar de un enlace, porque estos son enviado rutinariamente a un cliente o a un contador sin cuenta. Una mala dirección sí. no le costó al resto de beneficiarios su informe, pero una carrera donde cada dirección falló grafió FAILED en lugar de entregarse a nadie. Un informe vacío no se envía a menos el propietario lo pidió: un correo electrónico semanal que siempre llega para de leerse.

  4. · EmailService

    Deja que un transaccional envíe llevar un archivo adjunto

    Sumado a los informes programados, que son un PDF o libro de trabajo que tiene que llegar a las personas que pueden no tener cuenta - un enlace no sería una entrega para ellos. La capa SMTP ha tomado accesorios desde que fue escrito; esta ruta simplemente pasó null. Así que nada sobre cómo se construye el correo cambia, el campo es opcional, y cada uno el llamante existente toma exactamente la ruta que siempre hizo. Base64 en lugar de multiparte porque este endpoint es JSON servidor-to-server y Cada persona que llama ya construye un cuerpo JSON. Apegos sobredimensionados y malformados son REFUSADO en lugar de truncado: un libro de trabajo rebotado de 40MB cuesta el dominio de envío reputación, y una silenciosamente truncada es un archivo que el destinatario no puede abrir y No puedo explicarlo. El lanzamiento es lo que permite al llamante registrar una carrera fallida en lugar de un Entregó uno.

  5. · kamo-shared-library

    Llega el correo electrónico que un informe programado llega

    INFORME.SCHEDULED, registrado en CANONICAL-KEYS ausente de esa lista una plantilla es un 404, sea cual sea el archivo que exista a su lado. El organismo establece el alcance de los datos. Un destinatario que no es el propietario del horario no tiene otra forma de distinguir un total de toda la organización de uno que cubre sólo lo que el propietario puede ver, y esos son documentos diferentes. También nombra al propietario dos veces: una vez como que estableció el calendario, y una vez como cuyas cifras son.

  6. · SecurityService

    Las listas un diálogo compartido elige de, y un objetivo de compartir que se adapte a cada id

    GET ************* devuelve la gente de la organización, departamentos y funciones como opciones de selección, en una llamada y en una sola forma. Construido en los proveedores de opciones de presentación de informes y no sobre los miembros, los departamentos y las funciones endpoints: cada uno responde a la pregunta de una pantalla diferente y devuelven una diferente la forma, y un diálogo de compartir consumiendo los tres se rompería cuando cualquiera de ellos cambiaron por razones ajenas a la presentación de informes. Cád visto en SHARE-REPORTS - la lista de todo el mundo en la organización no es algo para entregarle a un miembro sin razón verlo. Un objetivo de participación es ahora una cuerda en todo. Un miembro id es un miembro de 19 dígitos largo y un departamento o rol id es un UUID; la columna Larga con la que comenzó podría mantener la mitad los tipos, y la mitad no podría haber fracasado al emparecer silenciosamente No hay nadie. El departamento y los controles de rol se comparan como texto y resolución por membresía AHORA en lugar de por lo que ocurrió una sesión cuando se hizo la parte. Cada uno de los tres cheques de membresía falla cerrado. Una parte que no puede ser evaluar no concede.

  7. · kamo-internal

    Pasa por cada golpe de búsqueda, no solo el más nuevo

    La búsqueda en la parte superior de una ventana de chat marcó cada ocurrencia de la consulta y luego se desplaza a exactamente uno de ellos - el más nuevo - sin nada que decir cuántos otros había y no había forma de llegar a ellos. Un miembro que busca una conversación para una factura Número podía ver la palabra resaltada tres pantallas hacia arriba y no tenía control que Llévatelos a ello. Ahora se comporta como la barra de encuentro ya se parece: un mostrador que lee "3/12", una flecha hacia los mensajes más viejos y uno hacia el más nuevo, Enter y Shift.Enter para el mismo dos jugadas, y el golpe se paró en madera en ámbar sólido contra la amarilla de la descansa. Aterrizaje en el más reciente golpe no ha cambiado, por lo que un miembro que solo escribió una consulta y leer el resultado ve lo que siempre hicieron, ahora con el conteo a su lado. Dos decisiones por debajo valen la pena de deletizar. Los golpes se cuentan por ocurrencia en lugar de por mensaje, y en contra de las palabras el Burbujas realmente dibujan la traducción donde un mensaje tiene uno, que la vieja búsqueda no lo hizo. El contador y las marcas son dos vistas de una lista producida por una sola escane (encuentro de ocurrencias, compartido con el resaltador), por lo que "12" es siempre exactamente el número de marcas en pantalla. Dos escaneos que discreparon incluso ligeramente dejarían flechas aterrizando en nada. paged: los mensajes llegan al fondo mientras una búsqueda es abierta y las páginas más antiguas aterrizan en el Como "resultado 3" se convertiría silenciosamente en un mensaje diferente. De ello se desprende que "1 de 3" en el El golpe más antiguo no significa que no hay nada más viejo. Sólo que nada más viejo ha sido . . . .. ..apareciendo desde allí pide la página anterior y aterriza en lo que trae, el mismo movimiento que la lista ya hace cuando alguien se desplaza hacia arriba. Envuelve. al más nuevo sólo una vez que el servidor se ha acabado, o después de que han llegado cinco páginas sin golpes en absoluto: una prensa de una flecha no debe ser capaz de caminar un año-mucho conversa de vuelta a su primer mensaje. La geometría de reposo de la barra de herramientas está intacta. El mostrador y las flechas aparecen con el consulta más que con el campo, porque cuestan unos sesenta píxeles y un vacío La caja de búsqueda no tiene nada que contar.

  8. · kamo-shared-library

    Un informe de trabajo de servicio, y un objetivo de participación que se adapte a cada identificación

    ServiceWorkReport es el décimo informe de semillas y el que hace un alcance a nivel de fila real en lugar de meramente presente. El comercio lleva el propio/todo par de la plataforma. VIEWWWAB-SERVICE-WORK se sienta al lado de VIEW-SERVICE-WORK como un hermano y una visita lleva asignadoMemberId, por lo que un técnico que sostiene sólo el derecho más estrecho ve su propio trabajo mientras su supervisor ve la sucursal. Una definición, dos respuestas, y nada inventado para informar. Sin ella SELF y TEAM estarían caminos no probados en la parte de este sistema es menos aceptable salir sin pruebas. Las filas son visitas, no trabajos: un trabajo con tres visitas es de tres piezas de trabajo, posiblemente por tres personas en tres días, y derruncándose hace "quién hizo qué, cuando" incontestable. ReportViewShare.targetId se convierte en target-key, una cadena. Un miembro id es un miembro de 19 dígitos Largo pero un departamento y un papel son UUIDs, por lo que una columna INT8 podría mantener la mitad de la acciones tipo y la mitad no podría haber fallado al igualar silenciosamente No hay nadie. Rebautizado en lugar de reescribir porque la actualización de esquema de Hibernate añade un columna y no reecle una; la vieja columna nunca fue escrita. LeadPipelineConversionReport aplica ahora el propio piso sin asignar de la red de plomo. Sin ella el informe es una segunda manera, sin auditar de ver la piscina no asignada, y su grupo cuenta con /leads sin razón visible.

  9. · kamo-internal

    Pin las carpetas conocidas en la parte superior de la barra lateral

    Inbox, Drafts, Sent, Junk, Basura, Papelera y Archivo dejan de moverse. Mantienen esa orden. en la parte superior de la lista de carpetas, y todo lo que el miembro hizo se sienta debajo bajo un título de "Mis carpetas", todavía libremente reordenable. Las filas clavadas no están registradas en absoluto en lugar de rechazar la caída: una fila que simplemente decodificadores para moverse sigue siendo un objetivo de caída, por lo que dejar caer un carpeta en la bandeja de entrada animaría toda la lista y luego lo pondría en silencio de vuelta. Mantienen la columna de agarre como espacio vacío, por lo que ambos grupos comparten una izquierda borde en lugar de leer como dos listas. Pinning es deliberadamente más estrecho que es SpistemFolder, que coincide con la hoja en cualquier profundidad para que los propios clientes de un miembro.Archivo dibuja el icono de archivo. Es el llamado correcto para un icono y el equivocado para una posición, así que rank mira fijamente raíz sólo una carpeta que alguien archivado bajo su propio padre se queda suyo arreglar, al igual que las subcarpetas de una carpeta clavada. El spam se sienta en la ranura de Junk. El backend se normaliza a Junk donde quiera que escriba, así que un servidor que lista "Spam" está nombrando la misma carpeta y no debe caer entre el miembro. El rango vive en la carpetaTargets, que ya es dueña de la carpeta compartida Vocabulario, por lo que el movidor ordena sus raíces de la misma manera y los dos superficies no puede desviarse de nuevo. aplicarFolderOrder se mueve a lib/email al lado it: vitest's include include globs no cubre la aplicación/ganchos, así que la lógica de pedido se deja allí fue recogido por nada y pasó nunca corriendo. Miembros que arrastraron su bandeja de entrada antes de este cambio aún lo nombran en sus salvas preferencia. Esas entradas son ignoradas, y el siguiente drag las escribe.

  10. · kamo-marketing

    Reconstruir el índice como un mapa del producto

    Era una lista recursiva de los trescientos artículos, sangrado por profundidad. Todo estaba en la página y nada era encontrable, y la página pesaba 3.9 MB. La forma se toma prestada del producto. La puerta delantera de un cliente de KamoCRM es el Home launchpad -- una cuadrícula de áreas de las que elijas -- por lo que el frente del centro de ayuda la puerta es el mismo gesto, y alguien que llega ya sabe leerlo. Las baldosas son un mapa de escalas en lugar de una cuadrícula de cartas. Cada lista lo que realmente es dentro de ella con conteos reales, por lo que una baldosa es tan alta como su área es grande: Cliente El gerente de relaciones tiene ocho secciones y cuarenta y nueve artículos y lo parece, a continuación a Calendar con cinco. Tarjetas de altura con un icono cada una de las cuales sería más ordenado y tergrearía mal el producto - y dieciséis contornos diferencian 16 áreas mucho peores que dieciséis tablas de contenidos. Zonas que no tienen secciones listan sus artículos en su lugar, así que ninguna ficha dice sólo su propio nombre. La búsqueda es la acción principal y ahora se encuentra por encima de todo, clasificado (un éxito en el inicio de un título vence uno más tarde, que supera a uno en el cuerpo) y se agrupa por área, porque "en qué parte del producto está esto" es la mayor parte de la respuesta. Los partidos están marcados en su lugar. Una tira de punto de partida para un visitante por primera vez, deliberadamente sin numerar: el tres leídos como una secuencia y no son uno, ya que el tercero es de un administrador La mayoría de los miembros nunca servirán. Los condes y las cejas se colocan en la cara mono ya en la marca, y la La secundaria beige, que el sitio casi había dejado de usar, lleva el estructura. Eso evita que la página sea verde monocromado sin introducir cualquier cosa que no sea KamoCRM. Las páginas de categoría y sección también dejan de ser callejones sin salida: "En esta sección" ahora hace que los enlaces que el servidor nunca fue enviando, dos-up con extractos y un contar donde una sección tiene una.

  11. · kamo-internal

    El Report Studio - una biblioteca, y un renderr para cada informe

    /informes es un estante, no una cuadrícula de cartas: doscientas cajas redondeadas idénticas es un pared a escáner, y una fila da una sala de nombres de un informe para ser leído. Viaje de vistas salvados bajo el informe al que pertenecen, que es lo que enseña la distinción el todo El subsistema se basa en el control de "Nuevo informe" en ninguna parte, porque un informe es una clase Java y lo que un miembro guarda aquí es una configuración de uno. El estudio es de tres bandas: lo que estás pidiendo, una frase diciendo de qué está puesto pantalla, y la respuesta. La banda media es de carga. Falla una pantalla de reporte cuando alguien puede ver cifras y no puede decir cuáles son las cifras de la cuestionar en esa categoría. cuántas filas, durante qué período, redujo cómo, y cubrir cuánto de la organización encaja en una oración. La nota de datos-scopio se encuentra allí literalmente, porque un total producido bajo "sólo sus propios registros" es un documento diferente y nada más en pantalla los distingue. Nada en aplicaciones/componentes/informes pregunta qué informe está renderizado. visibleStudioControls lee las capacidades declaradas de una definición y dibuja el controles a juego; ParámetroEnvío de controla en el tipo de parámetro; cada celda rinde a través del descriptor de ReportFormat de su columna. Un informe solo de KPI recibe un período y un botón de Run y nada más, sin una línea de código que lo sepa existe y el día que esto deja de ser cierto, añadiendo un informe deja de ser un Java cambio. formatters.ts es el único lugar que un valor se convierte en una cuerda, y su gemelo Java lee el mismo descriptor, así una figura en pantalla y la figura en un PDF descargado No puedo discrepar. Las fechas pasan por la aplicación/lib/serverTime.ts en lugar de un segundo parser: Java escribe LocalDateTime sin desplazamiento y un navegador lee que como hora local, que está a horas. La paleta de gráficos es hex fija, no derivada de --color-primaria. Todos los demás. color aquí es un tinte de la marca de la organización, que es el adecuado para cromo y incorrecto para un gráfico, una primaria de marca blanca pálida daría una paleta de serie a nadie podría distinguirse. La orden fue buscada y validada en lugar de ojo: Los ocho pasan la banda de ligereza, el suelo de croma, la separación CVD, la visión normal controles de suelo y contraste en la superficie de luz de esta aplicación, que es la única superficie lo ha hecho. --report-* sigue exactamente el patrón --legal-* y --training-*, y su sello es --accent-work, que la paleta de Instrument Panel ya nombra como el acento para "tazos, calendario, informes". Los informes ocupan su lugar en el navegado, el espejo AppType, las banderas de la Organización y el árbol de permiso. Sus cinco derechos son ingranables sin el último.

  12. · SecurityService

    Ejecuta, exporta y programa los informes del Informe Estudio

    El servicio la mitad del marco: el catálogo, la carrera, los recolectores, cuatro exportadores, opiniones y horarios salvados. La autorización es explícita en cada ruta, porque este servicio corre todo en la cadena de filtros. Dos derechos están siempre en juego. VIEW-REPORTS abre el módulo, y el propio dominio del informe decide si ese informe puede ser gestionado y cómo gran parte de la organización que cubre. Sólo admite a nadie a ningún dato, que es lo que hace que la aplicación sea segura para encenderse para un inquilino. ReportScopeResolver lee los derechos de hermanos OWN/ALL existentes de la plataforma y Nada inventado para informar. Un informe que no nombra razón más estrecha es toda la organización y lo dice en una nota el estudio y cada impresión de exportación un total producido bajo "únicamente sus propios registros" no es el mismo documento como uno producido sobre toda la organización, y un lector no puede decir ellos aparte de lo contrario. la desinfección () es el límite que impide que una vista guardada se convierta en una definida por el usuario informe: una solicitud sólo puede elegir entre lo que la definición ya declaró. Es tira de columnas desconocidas, niveles de agrupación y parámetros, pero deliberadamente se deje una columna desconocida en un FILTER para que el motor de la consulta se niegue a tirar un escondido la columna cambia la presentación, soltando un filtro cambia la respuesta. Exportaciones leen el mismo InformeResultado La pantalla fue extraída y formato a través de el mismo descriptor de ReporteFormat, así que una figura en un PDF y la celda de la que vino No puedo discrepar. El cuaderno escribe números como números con una máscara de formato más bien que como cuerdas preformateadas, que es la diferencia entre una hoja de cálculo y a CSV con una extensión diferente. El PDF lleva la organización, el período, el alcance de los datos, quién lo corrió y los números de página. Un informe programado funciona como su PROPIO, con derechos reservados en el momento de la ejecución, por lo que Revocar el acceso detiene un horario en su siguiente carrera en lugar de cada vez que una sesión expire. nextRunAvances antes de la entrega: no hay ShedLock en esta flota y réplicas: 1 es todo lo que impide un doble envío. pdf y poi-ooxml se añaden AQUI y no a la biblioteca compartida de kamo, que cada uno de los los escáneres de componentes de servicio, se enviarían a 60 imágenes que nunca render a report. kamo.reporting.enabled se establece en ConfigMap de este servicio y en ningún otro lugar; esa propiedad es lo que impide que se construya un grano de reporte en servicios que no pueden satisfacerlo. También cambia los nombres de una entrada rancia en ******************* ec2ae5e renombrado ************* a la .syncLabels sin cambiar el nombre de su línea de base, que falló el trinquete en origen/principal en ambas direcciones en una vez. El manejador resuelve una persona que llama. null, así que esto es un cambio de nombre, no una ampliación.

  13. · kamo-shared-library

    El marco del Estudio de Informe y nueve informes basados en él

    Un informe es ahora una clase de Java aquí y nada en ningún otro lugar. Definición de Informe describe lo que es un informe, qué se le puede preguntar, qué columnas tiene y cómo cada uno debe ser leído; el frontend hace lo que declara, así que añadir un el informe no necesita endpoint, no hay página y no TypeScript. Las piezas que llevan el peso: - ReportarCapacidad es la razón por la que el frontend puede ser genérico. Un informe que declara solo FAVORITE y SCHEDULE no consigue constructor de filtros, ni column manager y no Panel de grupo .GestiónOverviewReport existe en parte como el canario para eso. - ReportFormat es un descriptor, nunca una cadena renderizada, así que una moneda en el tabla, el punta de la herramienta del gráfico, el CSV y el PDF no pueden estar en desacuerdo. - ReportSecurityScope proviene de los derechos de dominio de cada informe, nunca de un informando bien. Un informe de ventas se amplía en VIEW-ALL-LEADS exactamente como el líder La red sí, por lo que la información nunca puede convertirse en una manera de evitar el modelo de seguridad. - InformeQuerySupport pone el alcance predicado primero, rechaza una columna desconocida clave en lugar de dejarlo caer, y a la izquierda en cada asociación. Unirse implícitamente es una INNER, y las filas sin nada en el otro lado son las que Alguien está buscando. - ReportAggregator mantiene a un grupo nulo como propio grupo, por lo que los subtotales aún añaden hasta el gran total. - Las fechas se resuelven en la zona horaria del miembro y están medio abiertas. A las 03:30 UTC on El 1 de septiembre un miembro en Los Ángeles sigue en agosto. Cada clase de reportajes lleva "Component Y "ConditionalOnProperty". Eso no es decoración: cada servicio escanea com.kamo pero declara explícito Habilitar la lista de los depósitos, así que un Componento que necesita una EntidadManager es construido en todos ellos y CrashLoops los que no pueden satisfacerlo. El propiedad se establece sólo en SecurityService, y ReportBeansAreConditionalTest falla la construcción si un informe lo olvida. Reports es una aplicación (ServiceType id 32) con cinco derechos (295-299). VIEW-REPORTS es la puerta del módulo y no concede datos por sí misma. Los nombres VIEW-REPORTS y EXPORT-REPORTS existió en los ids 1 y 2 hasta 2026-08-14, cuando fueron removidos junto con las terras detrás de ellos; los derechos persisten como getd (), por lo que no hay subvención hechos antes de entonces pueden resolverlos. PhiModule.REPORTING es PERMITADO - el motor lee en el cúmulo y las tiendas no copia. Exportar y programar sí salen del límite y se rigen por su derechos propios y por EMAIL.

  14. · kamo-internal

    El importador, y tres cosas que nos enseñó

    Publica el corpus impulsando la API de KBService real en lugar de escribir filas - un INSERT directo se salta la versión fila, el evento kb.article. publicado es lo único que indexa un artículo para el Asistente de IA, y la de traducción fan-out. Una importación que parecía exitosa y dejó "tranía de inteligencia con Este artículo "no hacer nada en trescientos artículos es el tipo de fracaso Nadie se da cuenta durante un mes. Tres defectos que salió a la superficie, todo arreglado aquí: Los ids de 19 dígitos nunca deben tocar un número de JavaScript. Números (en el caso de los números '11684848248608710') es 1168485648209608700. Una sesión acuñada con ese org id autentica perfectamente y se resuelve a una organización que no existe - la visión general Volvió vacío y leyó como "la base de conocimiento está vacía". La misma trampa a por segunda vez en el artículo uid, donde el reordenamiento respondió 403 porque el padre Iid había sido redondeado y no coincidía con nada. Los ids de sesión están ahora escritos en el JSON como literales crudos, y los ids del artículo se leen fuera del texto de respuesta antes JSON.parse puede tocarlos. El padre nulo de una categoría es la sección, no la raíz. Enviar nulo habría publicó dieciséis años de artículos de primer nivel, y el sitio de marketing, que pide el árbol de abajo del centro de ayuda... habría mostrado una página vacía. kubectl port-forward no sobrevive a unos pocos miles de peticiones. Transporte Falls ahora reten con backoff; errores HTTP no, porque repetir un 403 cuatro veces sólo tarda más en fracasar. El autor es Sage, quien ya autora del artículo del Centro de Ayuda. Un artículo autor y último editor provienen de la sesión que lo escribió y son mostrados por nombre en cada artículo de la consola.

  15. · kamo-shared-library

    Persiste en la regla de cotización de un mercado, y rechazar una semi-estado

    Los DTO llevaban citaContactMode y citoCitaContactoMiembroId pero ningún escritor leyó ellos, así que el escenario redondeó el formulario y se cayó en silencio. Tanto las rutas de creación como actualización ahora lo aplican. El miembro se mantiene sólo bajo EXPLICIT y se despeja de otra manera, por lo que un mercado que interruptores de vuelta no deja a una persona atrás para ser reinatada por una volterización posterior, y EXPLICIT nombrando a nadie es rechazado en lugar de degradado silenciosamente versión tranquila imprime un nombre diferente en la siguiente cita que quien haya guardado el la forma esperada. El mirador es org-scoped: los ids miembros son globalmente únicos, así que un Unscopio dejaría a un inquilino nombrar al personal de otro inquilino en su propio documento.

  16. · kamo-internal

    Elija a quién nombra una cita como contacto del cliente

    El diálogo de mercado gana "cuar el contacto futuro de Quote" bajo Citas Habilitar: la pista agente asignado, una elección hecha por cotización, o una persona explícita escogió con el mismo AgentSeleccionador utiliza el filtro /leads. Bajo Ajustable Per Quote el editor crece una sección de Contacto, sembrada de la instantánea que el servidor tomó cuando la cita se levantó, que es el agente de la pista, así que se abre en la persona que ya está allí. y salva el cambio con el resto de la cita. Las tres decisiones del lado del cliente se movieron de dos grandes componentes en app/lib/quotes/quoteContact.ts. Se les preguntó en ambas pantallas y en las pantallas No estar de acuerdo es invisible hasta que un documento imprime a la persona equivocada; como un módulo también son probables, lo que las ternaries en línea en un diálogo de 1300 línea no lo fueron. La vista previa muestra un contacto recién elegido por su nombre con el título, teléfono y correo electrónico en blanco: esos son resueltos del lado del buzón y la extensión de ese miembro, así que llevar el número de la persona anterior bajo un nuevo nombre sería mentira el La pancarta de cambio no excusa.

  17. · SecurityService

    Honra la regla de contacto de un mercado donde una cita nombra a alguien

    El detalle del personal, la vista previa del personal y la propia página del cliente ahora resuelven el contacto a través de un método, por lo que no pueden discrepar sobre quién está impreso en el el mismo documento. Bajo ASSIGNED-AGENT que es el agente del delantero resuelto por lectura, como antes; debajo de los otros dos modos es la instantánea que lleva la cita, con el agente del delantero como el retroceso de una cita levantada antes de que existiera el escenario o uno nombrando a alguien que se ha ido desde entonces. Crear estampillas la instantánea del mercado en lugar del cuerpo de solicitud, y actualización se aplica un nuevo contacto solo cuando el mercado funciona ADJUSTABLE-PER-QUOTE y el miembro pertenece al org a un mercado que nombra un contacto explícito significa que, y un PATCH hecho a mano es cómo esa promesa se rompería de otra manera. QuoteControler cinco manejadores construyó por separado cliente/agente/ajustable; Ahora comparten un personal, que es lo que mantiene a los tres consistentes.

  18. · kamo-internal

    El corpus de artículo, y el oleoducto que lo construye

    307 artículos en 16 categorías y 29 secciones, del proyecto 248 artículos de Documentación/ más 59 escrito aquí: cada categoría y página de destino de sección, un set de inicio de Getting que cubre el bordo de la borradores nunca llegaron, una categoría de Plataforma la carpeta de origen sólo tenía una LEER para, y los dos artículos de creación de miembros que simplemente faltaban. Cuatro piezas: Markdown-alexicó para dar forma a las tiendas de base de conocimiento. El conjunto de nodos es una lista blanca de lo que ambos renderizadores ya manejan, porque el renderizador público dibuja un nodo desconocido como un div desnudo - sin error, no Advertencia, un párrafo que ha perdido silenciosamente su estilo en una página que nadie es mirando. Las listas eran la parte difícil: una línea en blanco no debe terminar una (la borradores tienen huecos de capturas de pantalla entre pasos, y terminar allí reiniciar el numeración en 1) y un elemento sangrado es una sub-lista, no una frase adjuntada al escaño por encima de ella. lib/limpio-fuente Qué un borrador debe dejar de decir antes de que se publique. Las constantes de permiso se convierten en las palabras en la pantalla; parentheticals nombrando a .tsx archivo o un campo de entidad van completamente; la casilla de verificación de revisión y el La llamada de borrador-método va; y las referencias cruzadas se retitulan en lugar de borrado, por lo que "ver cómo veo mi tarjeta de tiempo?" señala el artículo nombre publicado en lugar de uno que ya no existe. lib/ Títulos de preguntas a los publicados. Cómo-tos tomar una regla; el 53 conceptos se nombran a mano, porque una regla que podría convertir "What's the diferencia entre Estado y Sub-Status?" en un nombre de página tendría más excepciones que los casos. Revisan balas en busca de colisiones en todo el conjunto árbol antes de que se ejecute una importación - la base de datos las limita por organización, no por padre. construir-relaciones El gráfico ver-también, construido sin dirección porque los enlaces son simétrica en el producto. 594 enlaces, 3 a 6 por artículo. Semilla de la los borradores relacionados: la materia frontal, que alguien eligió mientras escribía; rematado de la posición en el árbol. La similitud de texto clasifica a los candidatos, pero nunca califica uno por sí solo: "Notas" y "Cómo Buscar y filtrar tu Los líderes comparten cada palabra sobre la búsqueda y no tienen nada que ver con cada uno a otro. Ninguna página está relacionada con su propio padre o hijo: una sección ya enumera sus artículos, y un artículo ya tiene migas de pan. 57 pruebas, y la lista de inclusión de vitest crece una línea para que realmente funcionen.

  19. · kamo-shared-library

    Un mercado decide quién nombra una cotización como contacto del cliente

    QuoteContactMode da un LeadMarket tres respuestas: el agente asignado del plomo (Resolvido por lectura, que es lo que hace cada cita hoy y qué columna nula Por lo que se refiere a cada cita, una persona explícita, o una elección hecha en cada cita. Estos dos últimos son instantánea en Quote.contactMemberId cuando se levanta la cita, así que cambiando un La mente del mercado nunca reescribe el contacto que un cliente ya fue dado, y a la revisión lleva la instantánea hacia adelante. Es la misma oferta. QuoteService toma el contacto resuelto como argumento en lugar de leerlo fuera del cuerpo de solicitud: este módulo llega a la pista sólo por id suave, y un valor Un cliente podría establecer dejar que cualquiera sea nombrado en un documento. Actualización lo honra sólo cuando el que llama pasa uno, que es como se aplica ADJUSTABLE-PER-QUOTE lado del servidor en lugar de por el editor escondiendo un campo. agenteForMember se nombra en lugar de sobrecargado agentePara(nll, ...) sería ambiguo en cualquier lugar de llamada pasando un null literal y la forma de tomar el plomo Ahora los delegados a ella, por lo que los dos no pueden derivar en un documento impreso.

  20. · InitializerService

    Columnas para el contacto de cotización de un mercado y la instantánea per-cita

    Nombres de mercado su respuesta en QUOTE-CONTACT-MODE (-QUOTE-CONTACT-MEMBER-ID cuando esa respuesta es una persona explícita), y cada cita mantiene el contacto que fue criados con en ************* Ambos nulos sin defecto: a nulo modo lee como el agente asignado y una instantánea nula cae de nuevo a él, así que cada mercado existente y la cotización no ha cambiado hasta que alguien elige lo contrario.

  21. · kamo-internal

    Cuesto de los artículos relacionados con un artículo

    KbRelatedPanel es un componente en tres lugares: cura en el compositor y el editor, y lee de nuevo en la opinión del artículo. Añadiendo un artículo aquí también añade esto a ese artículo, y el panel lo dice - de lo contrario el La segunda mitad de la escritura parece algo que editar un artículo no debería lo han hecho. Dos modos, porque los enlaces pueden elegirse antes de que exista el artículo. Con una guisante el panel es dueño de su estado y escribe cada cambio directamente a través de: un reordenamiento Perdido por un olvidado Save es un reordenamiento que nadie gana dos veces. Sin uno, el compositor sostiene la selección y la PUTs después de crear, como una llamada separada para la misma razón de presentación-para-revisión es una - un enlace que no se ahorra en caso de Deja atrás el artículo escrito en lugar de derribarlo con él. Las sugerencias provienen del servidor, que clasifica a los hermanos por delante de los artículos que simplemente compartir vocabulario, y los filtra a través del mismo alcance del lector que cualquiera otra lectura. El panel mantiene la respuesta del servidor en lugar de la lista que envió, por lo que un guid el servidor caído no se muestra como guardado.

  22. · KBService

    Artículos relacionados, y un camino público que mantiene el árbol

    Tres cosas, todas alcanzando la misma página. Artículos relacionados. KbArticleRelationService es el dueño de la "ver también" simétrica enlaces: lista, conjunto, sugerente, y un claro que se ejecuta en suave borrado así que un jubilado artículo no se queda en la lista de otra persona y la acorta silenciosamente. Lee a través de KbReaderScope - una lista de relaciones sin filtrar nombra los títulos de los artículos que las banderas de la audiencia se esconden, que es el oráculo las respuestas 404 para evitar, llegando por una puerta diferente. El público Leer es aún más estrecho: publicado y publicable sólo, por lo que una página de marketing no puede vincular a un visitante con material solo para miembros. Vía pública. KbPublicArticleDTO ahora lleva camino y ancestros. El camino es el Cadena de la bala BELOW la raíz de sección, por lo que /helpcenter/help-center es irrepresentable y un consumidor puede construir un enlace anidado en lugar de uno plano. Esto no es cosmético: la búsqueda de artículos se resuelve en el último segmento de caminos, así que a enlace construido a partir de la babosa desnuda todavía hace la página correcta y la pérdida La jerarquía no aparece en ninguna parte hasta que alguien lee el mapa del sitio. Una lectura en lugar de cuatro. buildPublicTreeIndex reemplaza la separada buildUidToGuidMap / buildPublicChildrenMap scans -- una sola página de artículo fue hacer tres lecturas de mesa completa más un cuarto para su padre, todas las proyecciones de la misma lista. Las migas de pan y las tarjetas relacionadas se traducen ahora con el artículo en lugar de permanecer inglés debajo de un cuerpo traducido. 98 pruebas, 30 de ellas nuevas: forma de ruta y ciclos en KbPublicPathTest, espejo de mantenimiento y filtrado de alcance en KbArticleRelationServiceTest.

  23. · InitializerService

    Migración para las RELACIONES KB-ARTICLE

    Espejos KbArticleRelation in kamo-shared-library. Escrito explícitamente que dejar a ddl-auto para que los valores UID y FECHA-CREATED predeterminados vivan en el base de datos, que es lo que permite a un SQL insertar el trabajo sin nombrarlos. El índice único está en el par ordenado, no en el no ordenado: (A, B) y (B,A) se espera que ambos existan, y la constricción de la pareja no ordenada rechazar la fila espejo que el servicio escribe en cada enlace. Ya se aplicó a la producción ejecutando estas declaraciones como la aplicación kamo usuario; son idempotente, por lo que una carrera KI completa posterior es un no-op.

  24. · kamo-shared-library

    Relaciones de artículo a artículo

    KB-ARTICLE-RELATIONS contiene los vínculos comisariados "ver también" entre los artículos en una base de conocimiento. Las filas son por dirección y el par se mantiene simétrico por KbArticleRelationService, que es lo único permitido para escribirlos... una pareja a medias muestra el enlace en un artículo y no en el otro, y es invisible desde el lado que aún tiene su fila. Dos filas en lugar de una por lo que cada dirección lleva su propio SORT-ORDER: un artículo ordena la lista debajo de ella sin perturbar el otro extremo, y cada Leer permanece un solo vistazo indexado en ARTICLE-ID. El DDL ya está aterrizado ************* en KamoInitializerService, aplicado a Yugabyte como usuario de la aplicación kamo).

  25. · SecurityService

    Página y busque en el directorio org, y detenga a dos constructores de filas a la deriva

    Las terminales de las redes responden con todo el conjunto establecido en un solo cuerpo. Eso está bien para un miembro de una docena de ogs e imposible de imposible para un operador en una finca destinada a llegar a la veinte. Añade GET /org/network-directory, que coincide, pedidos y ventanas en la base de datos y devuelve una página. scope=all está cerrado en exactamente el chequeo de todas las redes aplica el sistema de revisión. PlatformRightsService para que las tres rutas a la derecha sigan trabajando y la lista Nunca puede ser más amplia que la acción detrás de ella. La misma respuesta cabalga hacia atrás que canEnterAsSystemMember, por lo que un cliente construye sus filas y sus botones de una respuesta. mis redes y redes tenían un constructor de fila manuscrita cada uno, y las copias tenían ya a la deriva: todas las redes nunca emitían primariaColor, logoUrl o logoSimpleUrl, Así que /network dibujaba cada org un operador no era un miembro de la consola por defecto acento más que el propio org. Nada lo informó. Las llaves estaban simplemente ausentes. y el retroceso del cliente hizo el resto. Los tres ahora comparten OrgNetworkRowBuilder.

  26. · kamo-marketing

    Base inicial hasta $10 en cada término

    69 / 59 / 49, desde 59 / 49 / 39. La escalera de compromiso está intacta por el diseño. todavía exactamente $10 de descuento por un año y $20 por tres que es el estándar cada Ahora la superficie se declara en dólares en lugar de como porcentaje. Los retrocesos en cinco archivos se mueven con él, y los cheques de precio-apox se retiran de la Cifras superpuestas para que nadie pega un viejo precio de Starter de vuelta a una comparación página. Las tres descripciones de metadatos citadas "$39/seat/mo" como del precio de precio; El resultado de la búsqueda muestra es una reclamación de precios como cualquier otra. El comentario del paquete en PricingClient mantiene sus cifras de $53/$59, pero ahora está fechado: son la razón de una decisión pasada, no de una cita en vivo, y un rancio sin fecha precio en un comentario se lee como un error a la siguiente persona. Verificado contra el catálogo en vivo en lugar de los retrocesos: los tres años de Starter renders de asiento era $49 / Ahora $32.83, y la tira de la página principal está de acuerdo con /precio.

  27. · kamo-internal

    La oferta de ejecución, sobre Planes y facturación y en la plataforma de lanzamiento

    La consola cotizaba precios de lista mientras kamocrm.com anunciaba un tercio de la misma plan, porque nada en kamo-internal podía ver que existiera una oferta. Ahora Lee la oferta resuelta de BillingService y muestra lo que hace al precio: una pancarta por encima del elegidor de plan con una cuenta atrás y lo que ahorra en el orden en mano, y cada tarjeta plan cubierta se halizado de su tarifa comprometida a la ofreció una. La estimación por debajo ya de los precios que muestra la tarjeta, por lo que los dos no puedo discrepar. El launchpad gana una píldora de una línea junto a la píldora de prueba a su LEFT, y se muestra si se ha levantado o no la píldora del juicio, ya que una organización pasó su juicio sin La suscripción es exactamente para quién es la oferta. Está cerrada a la hora de poder actuar. es un miembro que puede comprar su propio asiento, o un propietario que puede comprar el organización, y quién no está pagando ya. Esa última prueba dice cobertura.source, no cobertura.paidPor pagadoPor pagado, dice la OMS cubre el asiento, y Alguien sentado en la suscripción de free-default de la organización dice ORGANIZACION mientras no estaba en ningún plan pagado. Ofreciendo una actualización a alguien Ya pagar es la forma más rápida de hacer invisible una bandera. planOffer.ts sostiene la aritmética por lo que la píldora y la consola no pueden derivar, y porque se trata de números en los que la gente gasta dinero: el porcentaje sale de la tasa para el término COMPMITADO al precio de la lista de mes a mes, que coincidía ************* 18 pruebas cubren ese pedido, el asiento y término escalada, que un plan descubierto se deja solo, y que la fecha final es la el último día el código funciona en lugar del primer día que no lo es. Las marcas-server-timestlams ataron el parse de caducidad: "new Date($"d.T23:59:59Z) es UTC explícita y correcta, pero el guardia no puede distinguirlo del ingenuo micrófono de cuerda existe para atrapar, y una gente de guardia que aprende a discutir con ella es peor que el bicho. Pasa por el sarén de la navega ahora, que mantiene un valor solo de fecha en la medianoche de la UTC - así que el plazo es que más un día, que también es más claro sobre por qué.

  28. · BillingService

    Sirviar la oferta de running, y decir si un asiento es realmente PAID para

    Añade GET /markets/-id-/promotion. No había manera de que una superficie de compra en la aplicación se hiciera a sabe que una oferta estaba funcionando en todo el sitio de marketing leyó promociones a través de la representante del catálogo público, y kamo-internal no tenían equivalente, por lo que los Planes y Factura Console cotizó precios de lista mientras que kamocrm.com anunció un tercero fuera del mismo plan. Devuelve la oferta RESOLVED, no la fila cruda. Todo consumidor de la forma cruda ha tenido que volver a - las mismas tres cosas - si está en vivo hoy en día, qué planes cubre por código en lugar de por UUID, y qué ciclos y cada uno que lo hizo así se equivocó al menos uno: el sitio de marketing ensabró un código de dos planes en un cada código de planificación comparando UUIDs con los códigos del plan, y su héroe filtrado en el descuento TYPE y nada en silencio durante meses. La vida viene de SuscripciónPromociones.che, el mismo cálculo predicadoPrecio se aplica cuando en realidad descuenta un pedido, por lo que una superficie no puede anunciar una compra de código decodificador. Los planes vuelven en orden de exhibición, porque las superficies las escriben en un La frase y "Business and Starter" se lee como si los niveles corrieron cuesta abajo. /self/coverage ahora también devuelve la fuente. Nombres pagados de la OMS cubre un asiento, que es una pregunta diferente de si se está pagando algo por ello: un miembro en la suscripción por defecto de la organización lee apagadoBy=ORGANIZATION y está en No hay un plan pagado. Cualquier cosa que ofrezca una actualización tiene que ser capaz de decir esos aparte, y pagadoBy no.

  29. · kamo-marketing

    La oferta llega al héroe y a la franja de precios

    El héroe ya tenía una cinta de cuenta regresiva, y había estado haciendo nada desde entonces el catálogo se movió a un porcentaje: "pickHeroOffer" filtrado en FLAT-PER-SEAT porque la copia de la pancarta era "$18/sat cada mes durante 12 meses". Un segundo, Una definición más estrecha de "qué oferta está corridando" era todo el problema, así que es se ha ido el héroe, la página de precios, la página de la oferta, la calculadora y ahora el La tira de la página de inicio todos leyeron la resolución de resolución de la promoción. La cinta se vuelve a enrojecer al porcentaje, se enlaza a /precio/oferta, y cuenta hasta el FIN del último día (medianoche se acabó un día antes). Lleva el acento ámbar que la oferta desgasta en cualquier otra superficie, por lo que es reconocible como el promoción antes de que se lea una palabra; su tinta CTA se mide en contra de eso gradiente en lugar de blanco izquierdo, que es por debajo de 4.5:1 en ambos extremos. La tira de la página de inicio ahora hace el mismo componente de PlanPrice /precio hace, Ahora, y lo que salvas en lugar de su propia escalera laminada a mano sobre anualPrecio. Ambos se abren en HOME-TERM, nombrado una vez en plan-prichate.ts porque tres superficies estaban por defecto independiente, y los CTAs de la tira llevan el código en los planos el portadas de oferta. Plan ids en una promoción resuelta ahora regresa en orden CATALOG. La API devuelve en orden de consulta - Negocios antes de Starter - y el héroe los escribe en un frase, así que se leía "en todos los asientos de Negocio e Inicio", como si los niveles corrió cuesta abajo. check-i18n-keys no podía ver Hero.tsx EN TODO: se une a Const [t, slideshow] = esperar **************** ...]) y el guardia sólo entendió Const t = ... Tres llaves faltantes en el componente más leído del sitio, invisible a la guardia cuyo propósito entera es atrapar un camino clave crudo que hace que sea visible Texto. Ahora entiende la forma desestructurada, y más importante, un archivo que se traduce claramente pero no produce ningún espacio de nombre que se haya dismitido, Así que la siguiente nueva forma de unión cuesta una actualización de guardia en lugar de envío "home.heroOfferCta" en el héroe. La cobertura pasó de 1044 llaves a 1073. check-plan-precios crece a 55 cheques, cubriendo cómo se escriben los planes de una oferta out and resolveDar sobre la forma contra la forma que la API realmente devuelve . que se deniega un ascenso cuyos planes no se resuelvan en lugar de ampliarse. Verificado contra el catálogo en vivo en lugar de la caída: página de inicio y /precio ambos renderizados $0 / $26.13 / $66.33 / Custom.

  30. · kamo-marketing

    Un ferrocarril de compromiso a tres mandatos, y una promoción que la página puede probar

    Nuevos precios: Inicio $59/$49/$39 y Negocios $119/$109/$99 por asiento por mes en on mandatos mensuales, anuales y de tres años. El carril sustituye al par mensual/anual y su píldora "Save 18%" - un porcentaje era la unidad equivocada para un piso $ 10 / $ 20 por asiento, así que la píldora cotizaba cualquier plan que fuera el plan "encontrado" regresó primero, y un Toggle no puede expresar tres opciones de todos modos. Su pulgar es un candado que se cierra como el término se alarga, que es el subtítulo anterior ("Lock in your rate today") hecho literalmente. La banda de ofertas declara la promoción de la carrera una vez, por encima de las cartas, y dice que es aplicado automáticamente. Eso es verdad más que decorativo: el plan CTAs ahora carry ?code=, que RegisterFlow ya lee en sp.checkout-code, y sólo en planifica la oferta cubre realmente el envío de AUTUMN a la compra desde el Libre O Libre o La tarjeta Enterprise prometería un descuento el servidor y luego decodificaría. Inicio y programa de tarjetas de negocios era / Ahora / lo que guardas, y la promoción viene fuera de la tasa TERM, no el precio de lista de entrada primero, luego quitar el porcentaje de descuento el número ya reducido, a juego ******************* Cuatro superficies estaban cada una haciendo esta aritmética y discrepando, por lo que se mueve en app/lib/plan-pricing.ts y todos ellos leen la misma respuesta. El El porcentaje de promoción de la calculadora estaba cobrando contra complementos, buzones, extensiones y almacenamiento, así como asientos, por lo que su estimación salió por debajo de lo que el servidor Bills; ahora está en contacto con los asientos del plan como el del servidor. /principio/oferta se reconstruye en torno a cualquier promoción que el catálogo lleve. Tenía "18DOFF / $18 off Business" codificado en el cliente Y en su página de retroceso AND a través de nueve cuerdas del diccionario, y el catálogo había pasado por encima de los tres. También: package-lock.json estaba fuera de sincronía con el paquete.json (está desaparecidos, Así que "npm ci" que es lo que el Dockerfile ejecuta - fracasó en la principal. La construcción de la imagen se rompió independientemente de este trabajo.

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