Changelog
Qué hay de nuevo.
Cada mejora de la plataforma, a medida que se envía.
· VOIPService
Sirva la URL de ganch en el webhook, de una definición
Un administrador que añade un proveedor de texto tiene que pegar la URL entrante de Kamo en el La propia consola de portadores, y nada les dijo lo que era. Falta ese paso. sin síntomas en el lado que nadie se pone a prueba primero: los mensajes envían perfectamente y cada uno de los respuesta se ha retirado. GET **************** lo contesta. Servido en lugar de codificado duro en el navegador por la razón RingCentral redirección URI se sirve: el valor viene de una propiedad de despliegue, y una copia en el frontend se mantiene con confianza Mostrando al viejo huésped después de los movimientos reales. La URL ahora tiene una definición. TelnyxProvisioner lo hace en el cliente Perfil de mensajería y la pantalla de configuración SHOWS it to anybody peding it by mano; cuando eran dos cuerdas nada habría fallado si se desplazaban a la deriva. administrador simplemente habría sido instruido para configurar una URL nada Escucha. InboundWebhookUrls es esa definición, y su prueba afirma que cada La babosa que construye se resuelve a través de InboundSmsNormalizer, por lo que las dos partes están de acuerdo por construcción en lugar de por una mesa alguien debe recordar actualizar. La variable también informa si la entrada de un transportista está genuinamente cableada. verificación de firmas Y un analizador. Entregando a alguien una URL para un transportista cuyas cargas útiles Nada puede leer sería una instrucción para configurar algo que luego se niega cada mensaje, que es peor que decir claramente que aún no está apoyado.
· kamo-internal
Una configuración que cubre cada número en un sistema telefónico
El diseño de enrutamiento aprobado tenía tres niveles y sólo dos de ellos eran accesibles. Un número podría nombrar a su propio proveedor de texto, y en su defecto que el servidor de teléfono era , pero el nivel medio, "a menos que un número diga lo contrario, nuestro Los textos pasan por Telnyx", se implementó en TextRouter y en ninguna parte. An organización con doscientos DIDs en un FreePBX tuvo que editar doscientas filas a expresa un hecho, que es el trabajo de entrada de datos que la pantalla de Numbers debía Evite. Ahora es un descenso en el propio servidor telefónico. Tres cosas que vale la pena nombrar: - La fusión corre LAST en salvado (). Cada rama proveedor por encima de ella ASSIGNS configJson en lugar de fusionarse en él, así que la primera versión de esto fue Caído silenciosamente en los servidores de Telnyx - el único proveedor cuya rama le sucede vengan después de donde originalmente se sentó. - "Nada - establecer cada número individualmente" en lugar de una opción en blanco, porque un El menú vacío dice como una decisión no es una decisión. - La clave es una cadena en dos idiomas en dos repositorios, y la deriva es SILENT: la configuración salva, el descenso todavía muestra al proveedor que estaba eligido, y cada número que depende de la caída silenciosamente cae a enviar mensajes a través del servidor telefónico, que para FreePBX significa no enviar mensajes de texto en absoluto. Así que el formulario de importación DEFAULTEXT-INSTANCE-KEY, y textRouteContract.ts pins está en contra de TextRouter.java de la forma en que BillingCycles.test.ts pins la facturación enum. Ese guardia es deliberadamente honesto sobre lo que prueba. La mitad de rompe-repo cuando el pago por hermanos está ausente o rancio, que es la mayor parte del tiempo. por lo que se llama "cuando esa fuente está disponible" y un pase allí significa "no Contradijo, nunca "verificado". La afirmación que siempre corre es la que atrapó un cambio de nombre cuando el guardia fue investigado rompiéndolo a propósito. Design doc actualizado: los dos límites que enumera como diferidos, solo por compañía. organización incapaz de enhebrar una respuesta, y MMS a través de Telnyx están cerrados en voipserva 8eaebfb.
· kamo-internal
Reate a un cambio de estatus, no sólo a un comentario
· kamo-internal
Actualizaciones de hilo en vivo, y reacciones que en realidad son alcanzables
Se construyeron dos mitades del hilo y luego se dejaron sin conexión. El servidor ha publicado cada evento de comentarios y estado a .chat.session.. ya que la función aterrizó, y nada se suscribió, así que la transcripción sólo se movió cuando el lector publicó algo ellos mismos, y dos personas trucando lo mismo El informe vio diferentes historias hasta que uno de ellos recargó. Ahora se suscribe a través del mismo contexto que utiliza la primera carga, después de que la primera carga se ha establecido así que un Marco que llega a medio de la captura no está sobrescrito por la página ya en vuelo. Relee la página en lugar de adjuntar el marco, que es lo opuesto a lo que chat lo hace y delibera: una charla corre a cientos de mensajes, un hilo de errores es un p.mierda, y el marco no lleva ni la cita de respuesta ni la lista de reacciones La fila adjuntada haría sin su cita hasta que algo más forzara una recarga. El endpoint de las reacciones fue peor: servidor, servicio y campo DTO todos enviados, y no El cliente podría llegar a algo. No había ruta, ni método api y nada dibujado. Ahora tiene los tres, y viaja como el estado presénquito. que un delta, por lo que un doble clic de carreras converge en lugar de voltear dos veces; el La respuesta del servidor reemplaza la lista de la fila en lugar de fusionarse en ella. Cuatro emojis, ofrecidos en línea. Un hilo de error no es un chat. Las reacciones útiles son "Yo también golpeé esto", "mirándolo" y un seleccionador completo sería más control que la conversación ha sido para. Las fichas no usadas se dibujan sólo en el flota de su comentar, por lo que diez comentarios no son cuarenta botones grises. Las pruebas fingen el contexto websocket a propósito: el DEFAULT real es un no-op que solo advierte, por lo que una prueba sin alcance de proveedor habría pasado mientras que la La suscripción estaba totalmente ausente.
· MediaService
La página de hilos nombra a su lector, y deja caer un ayudante sin usar
En la página de hilos, para que la consola pueda distinguir el propio espectador reacciones de todos los demás sin una segunda llamada a /api/user-info. Un árbitro rellenado por una segunda captura de asintón está vacía para la primera representación, y una reacción chip que empieza sin llenar y se corrige un momento después se lee como un fallido Haz clic. Una cadena, por la razón de que cada identificación en esta característica es uno: un int64 de 19 dígitos pierde precisión a través de JSON.parse. Se ha ido como conveniencia para el caso vacío y nunca se ha llamado.
· VOIPService
En realidad cree la configuración de la cuenta de Telnyx, lleva MMS y deja que un org solo para portadores mantenga los hilos
Tres brechas, y la primera fue la característica que no funcionaba en absoluto. PROVISIONING de TELNYX WAS DEFINED Y CALLED POR NVISTO TelnyxProvider.provision., asegurarMemberCredential () y ************* todos existieron y no tenían llamadas. Así que un administrador pegó una tecla API, guardada, se le dijo que el servidor telefónico fue creado, y nada de nada fue creado en su cuenta de Telnyx después de la cual el proveedor informó vozCalls=false y sms=false con un remedio diciéndoles que press Save, que no habría hecho nada para siempre. TelnyxSetupService ahora se ejecuta en crear y en cada actualización, idempotentemente, el camino El registro de gancho de JustCall ya lo hace. Escribe la conexión y ids de perfil de mensajería de nuevo en configJson, por eso es un servicio y no a línea en el proveedor: un proveedor se construye DESDE esa configuración y no tiene deslocalización. Asignando un número ahora menta la credencial SIP de ese miembro y adjunte el número al perfil de mensajería, el paso manual más perdido, y el que no tiene síntoma, porque un número no adplejo envía perfectamente y nunca recibes. MMS Telnyx toma medias, nunca bytes. JustCall ya había resuelto exactamente esto. con un enlace público respaldado por Redis; simplemente se llamaba así por JustCall. Ahora se extiende un OutboundMediaHandoff neutral, por lo que un grano sirve a ambos y no el sitio de llamadas JustCall o la prueba cambió. Ambos raíles de Telnyx llevan medios de comunicación, y cada negativa se declara "no" MMS en el porta transport, no configurado configurado, o un archivo que el fabricante se niega a El miembro nunca ve llegar un texto con la imagen desapareciendo en silencio. A CARRIER-ONLY ORG AHORA UNA CONVERSIONES Este es el límite que el anterior commit documentó en lugar de arreglar. VOIP-CONVERSATIONS.INSTANCE-ID es nulo (kamo-shared-library ae95b01e), así que un org con números y un transportista y ningún servidor telefónico puede enhebrar una respuesta en lugar de Hátelo dejé caer. Dos cosas que tuvieron que moverse con ella: - El dedupe. SQL trata a los NULLs como DISTINCT, por lo que el índice único existente se detiene cubriendo exactamente las filas que esto introduce. Un índice parcial único en (ORG-ID, MIEMBROS-ID, EXTERNAL-PHONE-NUMBER) WHERE INSTANCE-ID IS NULL lo cubre. - Dos NPE esperando la primera null. El evento NATS fue construido con Map.of, que lanza un null VALUE atadas por el manejador de abajo y registradas a la advertencia, Así que la ventana de SMS del miembro simplemente nunca se actualizaría. Llamados SmsController .toString() en él directamente. DDL para ambos está en documentos/sql/ y aplicado a mano; InitializerService no es desplegado en este grupo.
· kamo-shared-library
Una conversación de texto puede existir sin un servidor telefónico
VOIP-CONVERSATIONS.INSTANCE-ID NO era NULL, que decidió silenciosamente que cada hilo de texto pertenece a un PBX. Una organización que compra números y mensajes de un transportista y las respuestas no se llaman en absoluto, solo mensajes de texto, sin servidor telefónico En cualquier lugar no tiene VoipProviderInstance para un hilo a quien pertenecer. Esos orgs podría SEND (la propia ruta de texto de un número no necesita ningún servidor telefónico) y tener cada respuesta caído, porque ingerir no pudo construir una conversación para archivarlo. Null es ahora un estado real y el javadoc dice lo que significa, incluyendo la cosa nunca debe ser: un BulkTextProviderInstance id. Ambas mesas están UUID-keyed y entregar un id a la fábrica equivocada falla como "ninguna instancia" en lugar de fracasar fuerte. Dedupe sobrevive a la nula, pero no de forma gratuita. SQL trata a los NULLs como distintos, por lo que el las paradas de índice únicas existentes cubren estas filas. El DDL al lado de VOIPService añade un índice único parcial en (ORG-ID, MIEMBROS-ID, EXTERNAL-PHONE-NUMBER) WHERE INSTANCE-ID ES NULL para exactamente ese caso.
· kamo-internal
El plan que elegiste viaja a la página que lo vende
"Muévete a los negocios" abrió la consola de facturación sin nada seleccionado. La elección de la persona Acababa de hacerse, se cayó al suelo y se les pidió que volvieran a hacerlo, en una pantalla listar cuatro planes y abrir en ninguno el momento de este viaje en el que tenían ya decidido. El código ahora monta la misma cadena de consulta que la sub-tab, construida y lee por planLinks.ts para la razón por la que el sub-tab es: un valor no reconocido es ignorado por el diseño, por lo que un error tipopetivo produce un enlace que funciona, aterriza en algún lugar plausible y no es donde decía que iba. Uno módulo dueño de ambas mitades es lo que permite una prueba atrapa eso. En el camino, porque los códigos de plan se comparan por la igualdad frente a la catálogo en todas partes y un enlace no es lugar para inventar una segunda ortografía. No validado aquí - este módulo no sabe qué planes existen, por lo que un marcador rancio da a su código sobre y la consola ignora lo que no puede igualar, en lugar de equivocarse con alguien que siguió un vínculo que les dieron. El lado de la consola está aterrizando por separado, en un pase concurrente de una sesión concurrente sobre ese archivo.
· kamo-shared-library
Las dos cartas que recibe un cliente cuando su tarjeta falla
BillingService ha querido enviar esto desde que DunningNotifier fue escrito. Es los publicó en **************** un punto final que nunca ha existió en EmailService, donde el único controlador bajo ese prefijo sirve fotos de directorio y se tragó el 404 por diseño, porque un fallo por correo debe no hacer que Stripe vuelva a intentar un gancho web. Así que un cliente cuya tarjeta caducada consiguió una base de datos fila y silencio: sin letra, sin bandera, nada. La primera que lo supieron fue Las aplicaciones se niegan a abrir una semana después, cuando se acabó el periodo de gracia. Dos plantillas canónicas, siguiendo la constante/clave de la llave dividida la HR y familias de firma electrónica ya utilizan la facturación. pago fallido y facturación.service-suspendido, semilla per-org como todos los demás. Ambos van a la dirección de BILLING en la cuenta en lugar de a un miembro, porque la persona que paga rutinariamente no es una persona que firma, y ambos enlace directamente a la factura hoscada de Stripe: alguien cuyo acceso acaba de detenerse no debería tener que entrar en el producto para pagar el producto. La redacción hace la obra que las superficies no pudieron. El primero dice lo que es excepcional, lo que se detiene, y el día exacto se detiene. La segunda lidera con "No se ha borrado nada", porque ese es el miedo en ese momento y no La pantalla lo estaba respondiendo. La mitad de BillingService apuntando DunningNotifier en /api/email/templates/send, que existe y está detrás de InternaAuthFilter aterriza por separado.
· kamo-internal
Una tarjeta de plan dice lo que añade al que está debajo
El seleccionador dio un precio, un techo de asiento y una frase. Elegir entre $46 y $80 a asiento en eso es una decisión con una respuesta obvia, y para la mayoría de los equipos es el equivocado. el catálogo ha llevado toda la matriz de capacidad todo el tiempo y la página de compra nunca mostró una línea de ella. Cada tarjeta ahora nombra lo que su plan enciende que el anterior no, cuatro a tiempo con un conteo para el resto. Derivado, no escrito: planAgregaverOver lee lo mismo filas /myplan renders, por lo que un cambio de catálogo se mueve tanto y ninguno puede ir rancio. Nombres de una característica que el catálogo no ha nombrado se salta en lugar de mostrarse como SHARED-MAILBOXES a alguien que nunca había visto este producto antes.
· kamo-internal
Una forma de llegar a las ventas, y un control de asiento que conoce el límite del plan
ContactoSalesDialog tiene los propios datos de KamoCRM Inc. . (949) 298-9960 x1 como constantes, deliberadamente. Todas las demás direcciones de esta plataforma pertenecen a al inquilino, y resolver este de la misma manera enviaría a un cliente preguntando por un KamoCRM planea volver a la línea de ventas de su propia organización. Ambos son enlaces vivos, así como texto, con botones de copia; el teléfono href lleva la extensión como ;ext=1 para que un tap lo marque. Un componente, utilizado por la página del plan y la consola, porque un número de teléfono que nadie nota es rancio es exactamente lo que dos copias producen. Las tarjetas plan de la consola estaban equivocadas de tres maneras para la página que se ocupa de nuevos clientes. Enterprise imprimió una firma $99 por asiento. su plan-tipo es CUSTOM y kamocrm.com dice "Acostumbrado", así que una compañía estaba contando un prospecto dos cosas diferentes y llevaba un Insignia de "33% de descuento" bajo un precio que no tenía. Ahora lee Priced en la aplicación, no lleva figura, y ofrece lo único que realmente puede sacarlo adelante: a conversación. Starter y Negocio nunca mencionó la tarifa única de inicio $99 por asiento, que es de $495 en un pedido de cinco asientos. Toda la primera factura citada como si fuera nada. El escalópefe del asiento corrió a 9.999 cualquier plan seleccionado. **************** siempre ha impuesto los techos reales, para que alguien pudiera construir un orden de cuarenta asientos, ver un total de sumar, y ser rechazado en la salva sin nada apuntar al número que estaba equivocado. Ahora se detiene al límite del plan y dice qué plan lo estableció y qué conlleva más; está deshabilitado hasta que se elija un plan, ya que el límite máximo es propiedad de esa elección; y elegir un plan más pequeño trae el conteo hacia atrás en lugar de fijar precios cinco para doce personas hasta los objetos del servidor. pinzaSeatsToPlan se comparte con el seleccionador y probado, porque la misma regla tiene que sostenerse cuando el SEATS se mueve y cuando lo hace el PLAN. También: el CTA primario fue el azul predeterminado de MUI en una consola de marca blanca, el de un color encendido la página que no pertenece a nadie, en el botón más importante.
· kamo-internal
Una pantalla de números, por lo que las llamadas y los textos pueden provenir de diferentes empresas
Una organización compra sus números a una empresa y contesta las llamadas con a otro. Eso es ordinario, y Kamo no pudo describirlo: enviar mensajes de texto era una propiedad de la SERVER PHONE de un miembro, así que una orga cuyos DIDs y SMS provenían de Telnyx y cuyas llamadas fueron respondidas por su propia FreePBX no podía enviar mensajes de texto en absoluto. Configuración de los números de teléfono es donde se dice ahora, y se sienta entre Proveedores y Extensiones porque ese es el orden en que se realiza el trabajo. Una fila se lee como una frase "1" (949) 555-1212 - Sarah Chen - Llamadas anillo Los textos de Office PBX pasan por Telnyx - no una cuadrícula de ids del proveedor. El número y la persona es lo primero, porque esas son las dos cosas un administrador En realidad lo sabe. La decisión que vale la pena defender, y el único NúmerosTab.test.tsx existe para proteger: un servidor de teléfono que no puede texto es OFERTADO en el menú desplegable Textos, deshabilitado, con la razón fuera de él. Filtrarlo es la aplicación obvia y lo es el que deja a alguien atascado, un administrador que no encuentra su teléfono sistema en esa lista concluye que la pantalla está rota, mientras que uno que lee "FreePBX no puede enviar mensajes de texto" sepa añadir un proveedor de texto en su lugar. Las razones vienen del servidor, donde cada proveedor escribe el suyo propio. "Encuentra mis números" importa lo que los proveedores ya saben, porque escribiendo treinta Los DIDs correctamente no son una cosa que pedir a nadie y uno mal escrito falla en silencio. Telnyx se une a ambos recolectores. Su tarjeta pasa la mayor parte de sus palabras en el público webhook clave: está en una página diferente del portal Telnyx de la tecla API, y falta no tiene ningún síntoma de enviar mensajes salen perfectamente y cada respuesta es rechazada. La tarjeta también dice por adelantado lo que Telnyx no tiene, por lo que es una decisión Alguien hace antes de cometer en lugar de un descubrimiento después. Kamo naves No logo de Telnyx; una inicial tintada es honesta acerca de ser nuestro, donde algo dibujado parecer que su marca no lo sería. Dos cosas encontradas mientras lo construían: - La recarga de NumbersTab dependía de la empresa, y el uso de lasTrataciones no promete una identidad estable - por lo que el efecto volvió a disparar en cada render y la pantalla nunca cargada terminada. No es un error, sólo un spinner permanente. La prueba lo atrapó. - El menú de configuración y el mapa de la etiqueta del proveedor tienen pruebas de cobertura que demandó mantenimiento para una nueva pestaña y un nuevo proveedor. Ambos tenían razón.
· VOIPService
Textos de ruta por Número, y añadir Telnyx a ambos lados de la misma
Una organización puede comprar sus DIDs y sus mensajes de texto de una empresa y responder a la Llamadas con otra. Kamo no podía expresar eso: los mensajes de texto de un miembro eran un propiedad de su SERVER PHONE, así que un org cuyo número provenía de Telnyx y cuyas llamadas fueron respondidas por su propio FreePBX no pudo enviar un mensaje en absoluto. declara sms (falso), la pasarela se negó antes de que se alcanzara a ningún proveedor, y el consejo "añadir a un proveedor de SMS" condujo a un carril que no pudo abrir un conversación. Así que la pregunta pasó del proveedor al número. ORG.PHONE-NUMBER dice quién es el dueño de un número, lo que responde a sus llamadas y lo que lleva sus textos. TEXT-ROUTE-KIND se sienta junto al identificador de instancia en lugar de inferirlo de ella, porque las dos mesas de candidatos son ambas con UUID-llamadas y entregando un id a la fábrica equivocada no falla fuerte, falla como "ninguna instancia", y el texto nunca se envía. InboundRail ya documentó ese peligro. TextRouter se resuelve en tres niveles: la propia ruta del número, luego un nombre por defecto por el servidor del teléfono (por lo que 200 DIDs en un PBX es una configuración, no 200 filas), y luego el servidor de teléfono en sí mismo, que es exactamente el comportamiento de hoy, por lo que un org que Nunca abre la pantalla de Numbers sigue funcionando sin haber configurado nada. El carril a granel finalmente hereda el contrato de envío. TextSender tiene dos adaptadores y SmsGateway habla con él, así que BulkTextProvider.sendText . cuyo errorMessage es siempre el e.get de un portadorMessage() Ya no puede poner un SocketTimeoutException delante de alguien tratando de enviar un mensaje a un cliente. Y BulkTextContorpería ahora da sus mensajes a VoipMessageService.ingest en lugar de grabar una palabra clave y detenerse, por lo que una respuesta en un número de portador se convierte en una conversación. Palabra clave el manejo no se movió; se movió DOWN, en la secuencia de todos los demás carriles ya acciones. VoipNumberOwnership gana SOURCE-ORG-NUMBER en el máximo: los otros dos Fuentes infieren la propiedad de una columna que pasa a sostener un número, mientras que esto Uno lee una fila cuyo propósito es decir quién es el dueño. Telnyx llega como servidor telefónico y un transportista. Como servidor telefónico es el primero honesto acerca de no ser un PBX: sin buzón de voz, sin dispositivos, sin colas, no agente dice que y cada una de esas banderas falsas ahora lleva una sentencia a un miembro puede leer, porque una capacidad que es falsa sin razón escrita se hace como una pantalla vacía. Eso es lo que CapabilityLimit and PhoneCapability son para; SMS ha tenido este tratamiento desde smsUnavailableReason (), y el resto de la superficie ahora lo tiene también. Su credencial de sucavidad está acuñada con la propia ORG tecla API, por lo que a diferencia de RingCentral nadie tiene que a bordo de cada miembro en un transportista Portal. Dos cosas que vale la pena saber: - OrgPhoneNumberService se lleva PhoneProviderFactory . El ciclo es real y legítima, y Spring Boot ha prohibido las referencias circulares por defecto desde 2.6 Sin él el contexto no comienza, y ninguna prueba de unidad aquí se encontraría porque todos alitan a sus Docstors a mano. - Un org solo de texto (números y un transportista, sin servidor telefónico) puede enviar pero no puede Enseñar una respuesta: VOIP-CONVERSATIONS.INSTANCE-ID NO es NULL y parte de la índice de dedupe. Esa caída es ahora un ERROR que nombra el número en lugar de una advertencia. El DDL de ORG.PHONE-NUMBER se aplica a mano. docs/sql/. InitializerService no es desplegado en este grupo.
· kamo-shared-library
Telnyx, el primer proveedor que es tanto un servidor de telefonía como un transportista
Telnyx vende SIP tronking, DIDs y mensajes, y una organización puede comprarlas Se desplaza independientemente. El caso para el caso de: DIDs y textos comprados a Telnyx, con las llamadas respondidas por el propio FreePBX del cliente. Derrumbándolo en uno entrada obligaría a los que sean la misma decisión, por lo que TELNYX se adjunta a ambos VoipProviderType y BulkTextProviderType. Ambos enums son EnumType.ORDINAL, por lo que ambos apéndices están al final. El texto a granel uno tenía esa propiedad documentada en su javadoc y aplicada por nada; ahora tiene la misma prueba ordinal que el teléfono enum ha dicho, afirmó donde alguien agrega un El proveedor ya está haciendo que se detenga y piense. Facturación Telnyx THIRD-PARTY: el org tiene su propia cuenta de Telnyx y paga a Telnyx minuto y por mensaje, por lo que lo que Kamo factura es la integración. An la línea Telnyx no asignada no cuesta nada, lo que es correcto, una credencial de telefonía Sin ningún miembro detrás es uno con el que no estamos haciendo nada. No hay bache de versión. 17 servicios pin 1.6.0 y cada servicio que Dockerfile reconstruye esta biblioteca de principal, por lo que un bache dejaría a todos resolviendo una versión que no existe en ninguna parte. Remontaciones recientes a tipos/enviados de la misma manera.
· kamo-internal
La estante reemplaza las cartas por aplicación, y cuatro correcciones a sus filas
El launchpad era un muro de una tarjeta por aplicación. La Plataforma de Aplicaciones enumera cada una de las esas aplicaciones en un solo panel, con lo que cada una hace y todo dentro de ella, así que la cuadrícula de las baldosas decía los mismos nombres dos veces. Las cartas se han ido; lo que es Si se le deja en el lapábar el estante, los widgets y las notas clavadas del miembro. Repintando una aplicación sin tapujos se movió con ellos que era el control de la esquina de la tarjeta, y el propio pin de la estantería es ahora. HomeCardPinControl y appPanes se fueron con el tarjetas; LEAF-TOOL-KEYS fue la única cosa en appPanes que las sobrevivió y ahora se sienta en navRegistry, junto a las opciones que describe. Cuatro correcciones en la propia estantería: - El chevron viene ANTES del alfiler, así que cada alfiler se sienta en la misma línea vertical si su fila se abre o no a nada. Verificado a 8 filas, una x. - La mitad abierta crece ahora: es un flex de una fila, por lo que su eje principal es el ancho y el estiramiento sólo alcanzaron su altura, por lo que sus filas Parado a falta de la columna que les habían dado. - Un botón solitario de la aplicación abierta se centra tanto en los ejes, y se dimensiona a su etiqueta más bien que estirado a través del panel. El lideraje de 8px de la lista se deja caer con él, o Es 8px de compensación unilateral que impide que el centelones esté centrado. - Ese botón ahora dice "Aplica abierta".
· BillingService
La tarifa de inicio de una plan, y la oferta en vivo, en el alambre
PlanDto llevaba sólo la tasa recurrente, por lo que cada superficie citando un plan cotizaba un precio el cliente no se cobraría: La cuota de inicio de KamoCRM es de $99 el asiento, que es de $495 en un Orden de inicio de cinco asientos antes de que se factú a un solo mes. La página de precios públicos siempre ha lo demostró; las superficies en la aplicación no tenían forma de hacerlo. El plan también lleva ahora la oferta que se ejecuta en el mercado, resuelta por la misma predicar que realmente descuenta un pedido. Una página citando el precio de lista junto a un 33%-off en vivo la promoción se equivoca en el desfase del cliente y una cita del descuento después de lapso no es un número que una página decida por sí misma.
· kamo-internal
El hilo del informe en el cajón, estanterías y emisora persiste
SistemBugThread hace todo lo que alguien ha dicho sobre un informe y cada uno de los estado por el que ha pasado, bajo la llamada al estado actual: las respuestas de la convocatoria "por qué está aquí ahora", que es lo que vinieron la mayoría de los lectores, y la transcripción responde "cómo llegó aquí", que es lo que necesita el cuarto intento de solución. Lee ******************* y no los endpoints de sesión de los medios todas las demás transcripciones en la consola se utiliza. Los autorizados por miembros del período de sesiones; un hilo de insecto es legible por todos el INFORME es visible, que es un lejano conjunto más ancho que la gente que ha publicado en él. Un diálogo ahora recoge el comentario de los tres estados que llevan uno. Ellos difieren en la redacción y en si el campo puede quedar vacío, y ambos se leen fuera de la condición de la estad, así que estanterías y emisoras Persistas se niegan a un espacio en blanco y una negación todavía - No lo hace. El título sigue la demanda: una negación explica una decisión, una estantería explica un retraso, y una solución fallida informa lo que todavía está roto, y encabezando todo Tres "Razón para la negación" hicieron que el último leyera como una disculpa. Etaca Persiste es su propio botón junto a Fix Verified y su propio endpoint, dibujado de la respuesta del servidor, nunca se derivó. Su público es más allá de Fix Verified's y sus estados de salida son diferentes, por lo que un cliente infierirlo de "canManage" o de la propiedad lo escondería exactamente de la para el que existe. Está desactivado en el desplegable de triaje por la misma razón: La reapertura de un informe allí se saltaría la razón por la que existe el estatus para llevar. "SystemBugDrawerTriage" ganó una solución de análisis que vale la pena nombrar al compositor del hilo un área de texto en la misma página y viene primero en orden de documento, y "role="dialog"] No se diferencia a los dos porque el cajón también lleva ese papel. Un descopio Miraup escribió la razón de negación en la casilla de comentarios y envió la negación en blanco.
· EmailService
Variables de vista de SYSTEM-BUG-COMMENT
Sin ellos el editor de plantillas entrega la nueva letra con agujeros donde el número de informe, el remitente y el botón van, que se lee como una plantilla rota en lugar de como una vista previa perdida. No hay un cuerpo de comentarios entre ellos, deliberadamente: la carta no cita una. A El hilo conductor del informe es lector por todos al que el informe es visible, pero esta carta está dirigido a una persona y se envía hacia adelante como cualquier otro correo.
· InitializerService
System.bug.media-session-guid, y su índice de mirada
La columna detrás del hilo de comentario de un informe, que coincide ******************* . VARCHAR (36), porque MEDIA-SESSIONS.GUID es se encuentra en sí una columna de cuerda de 36 caracteres y un desajuste tipo en la unión El tiempo de consulta por quien sea desafortunado. Enloqueble, y sin relleno. Secvería una sesión según el informe existente significa la redacción de cuatro mesas en el orden correcto con los guidos correctos, que pertenece al servicio que Ya sabe cómo "SystemBugService.ensureThread" lo hace en el primer tacto. Un nulo Aquí significa "no abierto todavía", nunca un error.
· SecurityService
Enviar A AI le dice a todo el mundo en el hilo, no sólo al reportero
El despacho envía la misma carta que MediaService, por lo que su audiencia tiene que moverse de la misma manera: cada participante en el hilo del informe menos quien haya actuado, cada uno con su propio saludo y su propia zona horaria, en lugar de solo al reportero. La caminata participante se duplica aquí en lugar de compartir, y la duplicación es este servicio no tiene cliente de MediaService, y añadir uno por lo que un despacho puede dirigir un correo electrónico pondría una llamada HTTP en la ruta de la escritura de estado. El Regla que repite es dos líneas, y ambas partes pasan por la misma SystemBugStatusEmail predicates.
· MediaService
El hilo detrás de un informe, y los dos estados que necesitan uno
SisstemBugThreadService es toda la característica: MediaSession de un informe, el estado hechos escritos en ella con la razón que su autor dio, los comentarios a cualquiera que puede ver que el informe puede salir, las respuestas, las reacciones y el silencio por miembro. Cada punto de entrada es SystemBugController, nunca MediaController. Eso no es los criterios de referencia genéricos de los medios de comunicación autorizan por membresía de sesión y un error hilo es legible por todos el informe es visible, que es un conjunto mucho más amplio que la gente que ha publicado en él. La membresía aquí significa "ha tomado parte" y existe para decidir a quién está escrito. Ruando el hilo por los propios del insecto La regla de la visibilidad es lo que mantiene esa regla en el único lugar que la posee. Los hilos se crean perezosamente y semilla, no se llenan. Los informes existían antes de hilos lo hicieron, así que "media-session"-guid" es nulo y "ensureThread" lo llena en primer toque: escribir un evento CREATED estampado con el propio tiempo de creación de la fila, y moviendo cualquier "denial" que la fila todavía lleva a la transcripción antes de Despejado la columna. Sin esa siembra, sustituyendo la columna por un hilo habría tirado silenciosamente la frase por informe que hizo el viejo diseño Se las arregla para mantener. Es la lectura escrita que lo hace; se queda de detalle. Sólo de lectura porque es el camino caliente. La acción más amplia es la más ampliada sobre un informe y la única capacidad que no se acoja por el espectador: cualquiera que pueda verlo puede decir que una solución fracasó, porque la persona que entra en una solución rota muy a menudo no es la persona que presentó la denuncia. Se estrecha por STATUS en su lugar - un informe que nunca afirmó ser arreglar no tiene nada que contradecir. El correo electrónico de estado ahora planea una carta por participante. Plans () * toma el audiencia como parámetro para que la regla se mantenga probable sin un contexto de primavera, y comentarios independientes paseo ChatEmailEmailEl libro de texto existente de Service bajo su propia clave de plantilla, una letra por destinatario hasta que se lea, digerida, sere respeda.
· kamo-shared-library
Estanterías, correcciones falladas y todo el historial de comentarios de un informe
Un informe mantuvo exactamente una frase. "system.bug.denial-reason" fue sobrescrito por cada movimiento de estado posterior, por lo que un error que fue negado, explicado, reabierto, fijo y encontrado todavía roto terminó con una razón de cuatro y sin manera de leer el descansa. La solución obvia es una tabla de "system-bug-history" con una columna de nota. Esa tabla. entonces tiene que crecer el roscado, editar la historia, las reacciones, los apegos, mudo per-miembro y estado no leído - todo lo cual las mesas de corriente de los medios detrás de cada charla y cada boleto de apoyo ya tiene. Así que un informe recibe una MediaSession en su lugar, bajo un nuevo tipo de tipo "SYSTEM-BUG", exactamente como ya lo hace el "SupportTicket": el estado cambia están escritos en como mensajes de sistema que llevan la razón que dio su autor, comentarios como ordinarias. Dos estados vienen con él. SHELVED está estacionado-no-rechacido, lo cual podría ser que podría no decir que uno es una posición de cola y la otra es una decisión, y un reportero dijo "Decidimos no hacerlo" sobre el trabajo que no hace más que esperar para presentar informes. ISSUE-PERSISTS es su contrapeso: una solución enviada que no se mantuvo. Ambos requieren una razón; una negación deliberadamente todavía no lo hace, porque forzar a uno allí sólo enseña a la gente a escribir una parada completa. La membresía en un hilo de error no significa lo que significa en un chat. El hilo es legibles por todos el INFORME es visible para: .MediaSessionMember . . . . . . . . . . . . . . . . . . . . "ha tomado parte", y decide quién está enviado por correo electrónico y quién ha silenciado. Por eso nada Aquí se sirve a través de MediaController, cuya regla de acceso es la membresía de EI. La audiencia de la carta de estado sigue: cada participante menos el actor, más bien que el reportero solo. El viejo "el reportero lo movió, así que no envíen nada" veto habría hecho que los Persistas de la edición no notifiquen a nadie menos a nadie que haya escrito. la solución que acaba de fallar.
· kamo-internal
Un esbozo de documento, y un esqueleto en la propia forma de la página
Sólo el héroe era un verdadero rubio. Todo lo demás - las nueve categorías del libro mayor, el paneles de cuenta, el pacto, cada opción de actualización era un div de estilo, por lo que un lector de pantalla el usuario tenía un punto de referencia en la página más larga en el área de configuración y ninguna manera de moverse entre categorías. Ahora son h2 y h3, y el libro mayor sigue el patrón de acordeón de ARIA con el encabezado WRAPPING su jugada: anidado de la otra manera que la categoría se anuncia como parte de El control y deja de ser un lugar al que puedas saltar. El estado de carga era un spinner centrado, que es el instrumento equivocado aquí. Una petición llena toda la pantalla, así que el spinner se sentó en medio de la nada y el diseño terminado Luego llegó a la vez y cambió todo bajo el lector. El esqueleto tiene lo real proporciones - la banda de héroes con su carril, la columna de libro mayor, la columna más corta de paneles a su lado, así que la llegada es un relleno en lugar de un salto. No lleva movimiento propio más allá de la ola de MUI; la página tiene exactamente una animación deliberada y no debería tener que competir con lo que estaba en pantalla un momento antes. Las pruebas sujetan el contorno y el concordeamiento anidando, además de dos cosas el libro mayor se hace bien y dejaría silenciosamente de hacer bien: el "100.0000" del catálogo se renderizaría como 100, y un La característica booleana nunca se describió como ilimitada.
· kamo-internal
Dibusean las reglas del dios que el servidor ahora tiene
La cuenta de los Usuarios cerró todas las filas de dioses para todos, y ambas mitades estaban equivocadas. Demasiado suelto, porque la cerradura vivió sólo en este componente. Respondió a una llamada directa de cualquier persona que sostuviera MANAGE-USERS. Demasiado apretado, porque También dejó fuera al que llamaba derecho a la edición. GodAccountGuard es el autoridad ahora, y el cajón lee llamadaIsGod de la misma respuesta que el fila: encerrado para todos los demás, vivir para un compañero, y dicho en voz alta en el El tono de advertencia cuando está en vivo, porque una rema de dioses editables parece ordinaria. La bandera sintética era el único control que se quedaba en vivo en una remo de dioses, y es el más pesado en la pantalla, detiene la cuenta autenticando. Es se mueve en la misma puerta que el resto. La imitación se retira en un blanco de dios. El servidor lo rechaza en ambas puertas, y un botón que se ofrece y luego se niega a leer como una falla en lugar de como la regla que es. accountIsGod sube desde el perfil de la forma en que el miembroType ya lo hace, y el servidor le dice sólo a un lector elegible para Dios.
· SecurityService
Sólo un dios puede administrar un dios, y ningún dios es en personado
Los VERDENOS alcanzaron la identidad de cristal. UsuarioAdminController custodiado solo el Usuario del Sistema, por lo que un titular no dios podría desactivar una cuenta de dios y revocar sus sesiones en vivo, reescribir sus identificadores de registro, abanderararlo sintético, o enviar un restablecimiento de contraseña para ello a cada uno de ellos una forma de desarmar a la gente Quién lo desharía de otra manera. La consola ya dibujaba la fila como intocable y lo dijo en un comentario; nada detrás de la pantalla estuvo de acuerdo. GodAccountGuard aplica la norma de pares PlataformaAdministratorController ya retenidas en la cuenta de los derechos que se han mantenido. La cuenta era la más débil de las dos puertas: tomar la contraseña de alguien es un superset de tomar sus derechos. Guarda los cinco caminos de escritura, y El brazo PLATFORMADMIN de la UsuarioAccountEditPolicy, que es el otro de la misma derecha la superficie: Actualización de la identidad del perfil del miembro y dirección personal Puntos finales. Las lecturas permanecen abiertas, para que la consola pueda explicar la negativa. El objetivo falla cerrado y la llamada falla abierta, deliberadamente: una fila que no se puede leer es dios, una fila que no existe no lo es, y un llamante que no se puede resolver no lo es. Sólo levantando una restricción es lo que decide por qué parte va por cada lado. La imitación se niega al mismo objetivo, sin ningún tipo de pareja. El La puerta de cross-org siempre ha rechazado un dios ******************* la puerta del mismo-org detrás de la página de ajustes nunca lo hizo, lo que lo hizo más barato de las dos maneras en. Suplantar a un dios le da a la llamada a la última plataforma Entrando, por lo que no admite la excepción, ni siquiera para otro dios. Las respuestas ahora llevan al llamanteIsGod, y el miembro carga de pago lleva cuentaIsGod para un lector elegible para Dios. Sin ellos la consola tiene que cerrar cada hilera de dioses para todos, incluido el que llama con derecho a la edición.
· kamo-internal
El personal puede escribir la frase que el cliente lee
La nota visible del cliente tenía una columna, un campo DTO y una página de plan lista para renderizarla, y No hay manera de que alguien lo establezca, así que Harmony's era el único que existiría, y sólo porque estaba sembrado a mano. Es una segunda caja en lugar de un encendido de "mostrarse esto al cliente" en la nota interna. Un interruptor invita a reutilizar una frase escrita para colegas, y la nota interna es donde el personal registra lo que se concedió y a quién; sólo puede permanecer franco si publican algo es un acto de redacción separado. El vacío se mantiene la respuesta normal, un acuerdo sin clientes La nota sigue siendo completa de sus términos estructurados. Ambas notas están ahora etiquetadas en la lista, porque la diferencia entre ellas es el todo punto y un segundo párrafo no etiquetado se lee como más de los primeros.
· kamo-internal
El suave obtiene una bandeja de entrada, y una ventana SMS es un hilo
La ventana de la herramienta SMS se abrió en un dialpad de doce llaves y luego se convirtió en una pestaña de tres pestañas ventana -- Chat / Templates / CRM -- titulado "Conversación "Conversación a3f1c8de-".... Ninguno de Así es como cualquiera usa mensajes de texto, y dos de las tres pestañas no eran reales: SmsCrmTab era DUMMY-CONTACT y DUMMY-ACTIVITY ("John Smith, Acme Corp", codificado, mostrado a cada miembro de cada cliente) mientras que un verdadero revés Miraup ya existía en SoftphoneCRM, y SmsTemplatesTab leyó un cinco ítems Sólido de VOIPService's SmsTemplateController fue incitado por cualquier cosa. Tampoco había dónde VER tus textos: la ventana mostraba una conversación y no podía llegar a otro, por lo que las únicas rutas a un hilo eran una entrada notificación que le ha hecho estallar una ventana, o el Centro de Interacción. La ventana - Dos estados, sin pestañas: un recolector de recipientes, o un hilo. Plantillas se mudaron a la botón de perno del compositor en la API real; detalle de contacto a la información de la cabecera pane renderizado SoftphoneCRM. SmsCrmTab, SmsTemplatesTab, smsTemplateData y SmsNewConversation se eliminan. - Compose es receptor-primero y no tiene caja de mensajes. Eso es lo que hace el cajas de cierre y atención: una ventana que se cierra a favor de uno ya abierto cierran vacíos por construcción, por lo que "una ventana de herramientas nunca debe perder lo que un miembro Efecta sin ningún manejo cuidadoso. - El panel de contacto intercambia con "display", nunca una prestación condicional - que destruiría al compositor cada vez que alguien lo miró, que es el falla que la vieja barra de policía seguía produciendo. Una conversación, una ventana La tienda de herramientas siempre ha dedupedido en props.conversationId -- un-minimize, El aumento, brillo. No pudo ver una ventana de SMS abierta por tuvimos tuvimos números de PHONE, porque SmsTool resolvió el id en el estado local y nunca se lo dijo a la tienda, así que abrir esa conversación de cualquier otro lugar construyó una segunda ventana encima de la primera. SmsTool ahora parchea el id en sus propios accesorios (como ChatTool hace para su sessionGuid) y los títulos de la ventana con el contacto. Elecilla de un destinatario arregla tres maneras: crear aquí, adoptar aquí, o levantar la ventana que la tiene y cerrar este. El suave Una quinta pestaña TEXTS, compuesta por lo que ya existía para la Centro de Interacción -- useConversationRows' text bucket, ConversationRow, sin leerForRow, openConversation -- además de búsqueda y un botón de nuevo mensaje. El la insignia lee UnreadContext.bySurface.sms, ya vive sobre el enchufe, por lo que no cuesta nada. Nombres de contacto ConversationRow admitió que "no hay un vistazo inverso del lado del servidor de un número a un nombre de contacto, por lo que una fila de texto se titula por su número". Nuevo **************** espejos buzón de la forma e índices de la dirección contactos por canonicalPhone, en el navegador porque la búsqueda del destinatario carga ellos de todos modos. Un índice vuelve a titular la cabecera, la lista TEXTS y el navegador. También fijo: SmsNotificationListener estamturó cada fotograma de enchufe INBOUND y ignoró la dirección que el evento siempre ha llevado, por lo que el propio miembro se adentró texto volvió a ser el del cliente y lesvantó una ventana para Algo que acababan de hacer. La ventana ahora por toda la superficie de texto en GET /sms/capabilidad en lugar de dejar que un Equipo o FreePBX org lo descubra por presionar en silencio, y un envío rechazado muestra la propia sentencia del proveedor con el mensaje marcado No entregado. Requiere la confirmación de voipservice que añade /sms/capacidad y el resultado de envío.
· kamo-internal
Una pílr la píltuidad del Plan Libre, y una página en /myplan detrás de ambas pastillas
La píldora de prueba vivió dos veces el ferrocarril nav y el launchpad con la cuenta regresiva, la puerta tipo miembro y el estilismo copiado entre ellos. Ambos cerrados en un juicio en vivo, así que un organización cuyo juicio acababa de terminar no vio nada en absoluto: sin píldora, sin explicación, no firmar que el producto se había vuelto más pequeño. Y ninguna píldora fue a ninguna parte, así que un miembro que Entendió que la cuenta atrás no tenía el siguiente paso. Ahora ambos estados están definidos una vez, en PlanPill, que mantiene las dos formas del carril y la El primer edil de lanzamiento, al tiempo que decide el MEANING en un solo lugar. Muestra a cada miembro del equipo y ENLACES sólo para alguien que puede actuar sobre el plan; para todos los demás la punta de la herramienta es el toda la característica, por eso cada estado tiene un solo miembro gemelo nombrando a quién preguntar en su lugar. /myplan responde dónde está la organización, cuánto tiempo tiene, qué puede usar, qué Plan más grande agrega, y los términos que negoció. Tres cosas que vale la pena mantener: El término carril es el héroe, y es un dispositivo con tres significados. su plazo, un plan pagado que avanza a través de su período de facturación, un juicio expirado al final. Se establece en su verdadera anchura y animado con un marco clave en lugar de desde el estado, por lo que un El guión lento o una hidratación fallida todavía muestra la figura real en lugar de una barra vacía. El libro de ley imprime valores, no garra cómodas. El catálogo lleva los números reales de los más de 100 contactos, dos oleoductos, 4 GB por asiento, ilimitados y son lo que decide un propietario. Excluidos filas permanecen, desmayadas y ordenadas a continuación: son el argumento para mejorar, y esconderlos haría que el plan Gratuito parezca completo. Las actualizaciones son una diferencia, no una red de precios. El lector ya tiene un plan; su pregunta es lo que consiguen que no tienen. Ordenado por precio por cuántos rejistas un plan iluminarse se ve equivalente y no lo es, ya que un plan más grande superpuesto puede añadir menos. La compra todavía ocurre en BillingConsole, que este enlace profundo se enlaza por sub-tab. Reconstrucción La salida aquí sería una segunda implementación de la única cosa que no debe tener dos. La paleta sigue la convención de la casa -plan-* rampa mezclada de --color-primaria con una excepción: los colores estatales son fijos, porque una organización cuya marca es ámbar De lo contrario llevaría una placa de prueba en su color pagado, y la única cosa que esta página existe Diría que sería lo que no se podía decir.
· BillingService
Un punto final detrás de la propia página del plan del cliente
GET /api/billing/self/plan responde todo /myplan renders: el plan, qué la organización puede realmente utilizar, el catálogo para comparar con los asientos, y su lista, almacenamiento, renovación y cualquier acuerdo negociado. Una petición en lugar de seis, por una razón más allá de los estados de carga: el nivel de acceso no se puede decidir honestamente en el navegador. Decidirlo allí significa enumerar el de la cuenta los miembros, y un miembro sólo pueden enumerarlos si ya tienen el acceso decidido. Así que se decide aquí, dos veces la puerta del cliente decide qué hacer a la OFERTA, esto decide lo que puede ser leer y un llamante SELF-PAY recibe una carga útil la lista de asientos, totales de organización y Nunca se puso acuerdo. Retención de golpes escondidos: alguien leyendo la pestaña de la red de una página que se les permite abrir en caso de que no se les permitiera saber nada de que se les permitiera que se les dijera. El juicio es la trampa que vale la pena nombrar. Una suscripción de prueba se sienta en plan-code = GRATIS, porque TrialAdminService convierte la fila de predeterminado en su lugar, mientras que en el momento en que entitlementService concede subvenciones todo el catálogo ilimitado. Servir las propias filas del plan durante un juicio decirle a un cliente que no tiene IA, firmas electrónicas o SSO mientras están en el medio de Usando los tres en la semana están decidiendo si comprar. Así que un juicio activo informa la unión del catálogo incluido. Un juicio de PENDING deliberadamente no: su reloj no ha comenzado, y prometiendo que de lo contrario es mentira el producto contradice en el primer clic. El acuerdo se devuelve derivado, nunca transcrito. La prosa es clienteVisibleNota y Sólo eso; notas internas nunca dejan el servicio. Y el costo del siguiente asiento es un número de SetupFees.forAddedSeats El mismo código que plantea la carga en lugar de un frase que describe la norma, porque una sentencia es una segunda aplicación que eventualmente no está de acuerdo con la primera.
· SecurityService
Digamos en qué plan está una organización, y quién puede cambiarlo
La consola podría decir que un juicio estaba corrido y nada más. "TRIAL" o nula, por lo que las organizaciones gratuitas, de duración vencida, remunerada y compuestas eran todas iguales valores - por lo que una organización cuyo juicio acababa de terminar no vio ninguna píldora, no explicación, y ninguna señal de que el producto se había hecho más pequeño. planMode nombra el estado y planAccessTier nombra quién puede actuar en él. Ambos monta el carga útil cada página que ya carga, por lo que las pastillas que las leen cuestan no extra petición en cualquier ruta que importe, porque el ferrocarril nav rendere en todos ellos. El derechoFuente está deliberadamente intacto. Tiene dos valores hoy y se lee por dos sitios de píldora plus, pre-autnática, ************* que pinta las pantallas de inicio de sesión y registro; ensancionándola cambiaría lo que los tres significan en una vez. La precedencia es PAID - COMP - TRIAL-ACTIVE - TRIAL-PENDING - TRIAL-EXPIRED - GRATIS suscripciones filtradas por la regla de la vida compartida. EntitlementModeResolver utiliza, por lo que los dos no pueden discrepar sobre una cuenta PAST-DUE dentro su período de gracia. Es carga: una fila de FREE-DEFAULT se siembra en la inscripción y nunca es eliminado cuando se compra un plan, por lo que "la primera fila encontrada" se cobran GRATIS por la mayoría de los que pagan clientes. El nivel se resuelve aquí en lugar de en el navegador porque el navegador no puede resolverlo honestamente: decidirlo de las filas de contador significa listado de miembros, que ya requiere que el acceso se decida. Un delegado sólo cuenta con una cuenta que financia ESTE el personal de la plataforma administra habitualmente cuentas dirigidas a otros lugares.

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