Changelog
Qué hay de nuevo.
Cada mejora de la plataforma, a medida que se envía.
· BillingService
Llegar la fecha de renovación de la cobertura y las cargas útiles grupales
Ambas superficies informan ahora de la corrientePeriodEnd y cancelanAtPeriodEnd. La fecha es lo que una confirmación de cancelación en realidad necesita decir "tú mantienes tu asiento hasta el final del periodo" es tranquilidad en abstracto, "súdate tu asiento hasta el 14 de marzo" es tranquilidad alguien puede actuar.
· kamo-internal
Dile a la gente cuando una factura los necesita, y deja que dejen de pagar
Una pancarta en la página de inicio cuando un pago de la que esta persona es responsable tiene fracasó, enlazando directamente a su página de facturación. Hasta ahora un pago fallido Apague sólo como aplicaciones que ya no se abrieron restricciones sin explicación, que se lee como software roto en lugar de una factura impagasta. Criado sólo para Los proyectos de ley en los que pueden actuar: su propio asiento, y los grupos que manejan. Lo hace. nada cuando no se debe nada. Cancelación ahora es visible donde la persona puede ver quién paga: un "Cancel automático acción de pagos en su propio asiento, con el texto de ayuda diciendo claramente que ellos mantener el asiento hasta el final del período que ya han pagado. El la confirmación nombra la fecha, porque el miedo al presionar ese botón es que las paradas de acceso inmediatamente. El interruptor de "Que los autopagadores elijan su propio plan" se ha ido. El plan pertenece a la organización y todos los que pagan dentro de ella individualmente o como grupo compra ese mismo plan. El panel del grupo ahora afirma más bien el plan de la organización que ofrecer un recolector.
· BillingService
Un plan por organización, un techo de 25 sesos y una forma de dejar de pagar
El plan es ahora una decisión a nivel de organización y nada más puede anularla. Dejar que un autopago o un gerente de grupo escojan sus propias lecturas como una amabilidad y es un error de corrección: ************* respuestas "hace este org tener esta aplicación" por OR-ing a través de cada suscripción en vivo con el org, así que una persona en un asiento eligiendo un plan más alto cambió las aplicaciones de ese plan encendidas para el toda la organización. Pinning cada pagador al plan de la organización hace que eso inofenables - las suscripciones nombran el mismo plan, así que lo que gane respuestas Idealmente. OrgPlanService lee el plan de la misma suscripción los Plans y La consola de facturación llama "su plan", por lo que la regla y la pantalla no pueden estar en desacuerdo. Empresa se requiere por encima de 25 asientos, contados en toda la organización y cada uno de los Grupo de facturación. Contar por pagador habría hecho dividir en grupos una forma de comprar cincuenta asientos veinticinco a la vez. Una edición excluye su propia suscripción por lo que La contracción se mide contra el nuevo tamaño, no con el viejo. GET /self/alerts conduce un banner de página de la casa. Acceso restringido sin explicación es la peor versión de este producto - las aplicaciones dejan de abrir y nadie dice por qué, o que la persona que lee es la que puede arreglarlo. Sólo se ha recaudado para las facturas esto el miembro es el responsable: su propio escaño y grupos que manejan. Ditiendo a alguien La tarjeta de su organización falló cuando no pueden pagarlo es ruido, y el ruido es cómo las pancartas dejan de leerse. POST /self/seat/cancel para el pago automático en un asiento que alguien compró ellos mismos. Siempre al final del período: han pagado el período actual, y La cancelación inmediatamente le quitaría ese acceso mientras no se reembolsa nada, ya que ese camino le pide a Stripe que no haya prorrateado. Dos errores en cancelación() encontrados mientras cableaba eso: - Fue una silenciosa no-op para COMP y TRIAL. Todo el cuerpo se sienta detrás de un stripeSuscripciónId comprobación nula, por lo que una suscripción de prueba o desayuno devuelto 200 con la fila todavía ACTIVE - la persona que llama dijo que funcionaba cuando nada cambió. Ahora se niega y dice por qué. - inmediato=true sigue siendo peligroso y deliberadamente no está expuesto: se establece CANCELED entonces llama a fallarToFree, que establece ACTIVE/FREE con asientoCount 1, así que a 25 asientos org mantendría a una persona trabajadora y le decía a 24 que su asiento estaba cortado para una razón de que eso nunca sucedió. entitlement.fallil-open se establece falso aquí para que coinija a SecurityService, que sirve /api/seguridad/caractericias y es lo que lee la pantalla Apps y características. Dos servicios Responder la misma pregunta de derecho de manera diferente es peor que cualquiera de las dos respuestas. Otojo verificado: los seis planes activos llevan una fila explícita para todo el servicio 21 Tipos, por lo que nada previamente concedido se está negando.
· SecurityService
Releo de nivel de aprobación con función resuelta de los derechos
EL ROLE ESTA DECIENDO DE DIDOE, de los derechos del que llaman y su relación con la sujeto... nunca del órgano de solicitud. Un cuerpo que podría nombrar su propio papel dejaría que cualquiera pretenda estar en nómina. Precedencia: PAYROLL (más ancho, ediciones en cualquier estado), luego MANAGER, luego EMPLOYEE por un historial. Ser el gerente de la instantánea del sujeto cuenta por sí solo -- un gestor de línea que aprueba su propio informe es el caso ordinario y no debe Necesita un derecho de toda lana; el derecho existe para todos los demás que revisan. esManagerOf fall CLOSED: una línea de información irresoluble no es autoridad.
· kamo-shared-library
APPROVE-TIMECARD-ADJUSTMENTS (197) y FINALIZE-PAY-PERIODS (198)
Dividir para que la separación de los deberes sea expresible: quien apruebe una tarjeta de tiempo no es A quien pueda cerrar un período de pago. MANAGE-TIMECARDS (183) se queda la puerta del módulo y no es deliberadamente ninguna de las dos. La inscripción sigue siendo un derecho, es un hecho laboral persistente. Un derecho Se filtra a cuatro comportamientos enviados y desvanece de un miembro TERMINATED exactamente cuando HR debe producir su tarjeta de tiempo final. Internada deliberadamente de NUEVALUZ-SEEDS: que lleva una subvención EXISTING Adelante, y esta puerta una capacidad que nadie tenía. Añadir un derecho sólo un SecurityService restart -- no KamoInitializer pass, no DDL. Ids atrapados por una prueba, porque el identificador es lo que las tiendas de aplicación de los miembros.
· kamo-shared-library
La máquina estatal de nivel de homologación
El empleado presenta el gerente aprueba el cierre de la nómina, según la decisión del propietario. Cuatro reglas, impuestas en una mesa de transición pura y sujetadas por 25 pruebas: 1. Un gerente NO PUEDE aprobar hasta que el empleado se haya presentado. La presentación es la afirmación del propio empleado de que las horas son suyas y completas; aprobar sin que no apruebe nada de lo que nadie haya dado fe. 2. Aprobación de gerente LOCKS el empleado fuera de otras ediciones. 3. Un gerente puede actuar en nombre -presente o apruebado- y ese es el único ruta sancionada pasada la regla 1. Requiere una razón escrita, y la fila graba tanto al gerente que hizo clic como al empleado se presentó. 4. La nómina puede editar en el estado de Nueva York incluyendo bloqueado, siempre con una razón. Correcciones después de cercanía son rutinarias y legalmente requeridas; prohibiéndolas Sólo mueve la edición fuera de la pista de auditoría. Segregación de deberes vive en la mesa de transición, no en el nombre de rol: nadie Aprueba su propia tarjeta de tiempo, y un gerente también es empleado de alguien. Cacadas noprobantes de PAYROLL-LOCKED hasta el final, porque retirar una aprobación invalida la cerrazón construida sobre ella. Las aprobaciones se sitúan en una RANGE de la FECHA por lo que una aprobación de mitad de período sobrevive más tarde Editit fuera de su alcance en lugar de cubrir silenciosamente el trabajo que nunca vio.
· kamo-internal
Member Timecard pestaña y la pestaña de configuración de tarjetas de tiempo HRS
La pestaña de miembro es SELF-SERVICE ONBLO y cerrada con identidad, exactamente igual que cumplimiento legal: sus endpoints no toman ningún id de miembro, por lo que es estructuralmente incapaz de mostrar las horas de otra persona. CheckRight es inutilizable aquí... devuelve verdad para todo bajo modo dios, y la propia página canViewOtherMemberAccount ORs in derechos no relacionados, incluyendo **************** HR llegar a la tarjeta de tiempo de una persona específica es una superficie diferente en /hr/asistencia, atribuida al actor de RR.HH. Colocado antes de planos, así que se mantiene en el grupo de la cuenta izquierda, algo después hereda que pestaña alinearRight ml:'auto'. La página de HRS gana su primera pestaña real junto al ComingSoonTab, registrado en SETTINGS-MENU, ya que la prueba de cobertura requiere en ambas direcciones. Ambas tabsitas almohadilla en cada camino de regreso; SettingsView, TabPanel y el movimiento div todos el suministro cero.
· kamo-internal
/hr/asistencia lista y el control de reloj NavTop
Reemplaza el cuerpo de HrTabPlaceholder. La ruta, entrada HR-TABS, MANAGE-TIMECARDS Las llaves de la puerta y la pestaña i18n ya existían; aquí nada registra nada. Las horas de las nubes se derivan del lado del servidor del instante inmutable en cada lectura en lugar de mantenerse como un total corrido, así que un golpe corregido muestra inmediatamente y un insecto produce un número equivocado una vez en lugar de componer. El control del reloj es cromado fijo junto Legal & Compliance, no un NAV-REGISTRY entrada: el registro no puede expresar una posición entre dos controles fijos, insigngeKey es código muerto, y cada entrada del registro es arrastrable e ingiro -- un reloj de cumplimiento no debe ser algo que alguien pueda esconderse de sí mismo. Se aferra a la inscripción PERSISTED, nunca comprobar la derecha, que devuelve la verdad para cada derecho bajo modo dios y mostraría un reloj en cada org un operador visitada. cronometradorControlApplies es compartido por el control y sus encuestas, por lo que ambos tranquilo juntos, dos copias de esa deriva predicada, y el modo de fracaso es un botón oculto cuya travesía corre para siempre. El estado del reloj es una hermosa señal independiente: no presencia (latidos del corazón de los 60, 300s TTL), y no availability.status, que se establece automáticamente para AWAY en el logout y las puertas plomo y apoyo enrutamiento. Sólo en votación por ahora con un piso de los 60. El relevo STOMP aterriza con el MediaService cambio; el núcleo NATS no se transmite y pierde por lo que la semilla REST es obligatoria de todos modos.
· kamo-shared-library
Acceso alcista de reloj de base de datos en el repositorio de ponche
Cada instante de ponche viene del DB, nunca la JVM: las vainas se reinician y el nodo relojes sesgar, y un registro salarial cuyo pedido depende de qué vaina contestada es no es un disco. CAST estándar de SQL, porque un elenco de un elenco está en silencio - Hibernate Lee ':' como un prefijo de parámetro nombrado y se convierte ahora en:temperal en:timestamp.
· kamo-internal
Ruta BFF para /api/security/timecards
TimecardService es ClusterIP sin entrada, por lo que sin esta ruta todo cuenta con 404s en el navegador, mientras que cada servicio es saludable y cada compilación es verde... el fallo exacto que ya ha ocurrido dos veces en esta plataforma. No hay autorización aquí, deliberadamente: esta capa es transporte, y un chequeo medio Invitaría la creencia de que es un control. forwardToApi es el dueño de la cuerda de la consulta. Un 204 es devuelto como 204 en lugar de ser pasado por .json(), que lanza.
· SecurityService
SecurityService relevo a TimecardService
El límite de autorización. TimecardService mantiene los datos y el motor, pero no sesión; esto celebra la sesión y decide quién puede hacer qué, luego retransmite. El Por lo tanto, el motor nunca se puede llegar sin pasar por aquí. SecurityService ejecuta cualquier...permitAll() con laminado a mano por mango, Así que cada método se abre con un guardia que devuelve la no-null para negarse. Autoservicio endpoints tomar NO miembro id en absoluto - el miembro viene de la sesión, haciendo que sean estructuralmente incapaces de actuar sobre otra persona. Puntos de final de HR encendidas MANAGE-TIMECARDS (183). La inscripción se responde desde la persistente fila de empleo en lugar de una derecha, así que un operador de modo dios no aparece inscrito en cada org que miren. SUDO-MEMBER-ID se lleva a través: isSelf() golos aguas arriba un imitado sesión como el miembro objetivo, así que sin él el puñetazo de un imitador sería registrado como el propio empleado. timecard.service.url se establece EXPLICITAMENTE en el configmap. comisión.service.url no está en ninguna parte y la producción depende de un literal en Java, que un Servicio El cambio se rompería en el tiempo de ejecución sin nada en la configuración para grep for.
· kamo-shared-library
Cubos de la jornada laboral, etapa 2 de la tubería
Los intervalos resueltos se convierten en segundos por día de negocio, listos para el acosador. Un intervalo es SPLIT en cada límite de día de trabajo que cruza: un turno de 22:00-06:00 en un día de trabajo de medianoche es de 2 horas en una fecha y 6 en la siguiente. Atribuyando Todo el lapso hasta su fecha de inicio hace horas extra diarias y la regla del séptimo día incorrecto por cada trabajador de la noche. Esta es deliberadamente una atribución DIFERENTE de la empresaDe persistió en el ponche. El ponche lleva una fecha: para la evaluación de comidas/descanso, la excepción cola y lo que el empleado ve como su turno, mientras que las horas extras necesitan horas repartidas en las jornadas de trabajo y semanas de trabajo en las que realmente cayeron. Ambos son correctos, ambos son necesarios, y conflarlos es la trampa. Un cambio que cruza el límite de la WORKWEEK también contribuye a dos semanas de duración. Total de horas extras; contarlo todo en cualquiera de los dos es errónito para ambos. Acumula en segundos. Las pruebas cubren ambas transiciones DST, una hora span, y golpes de extremo a extremo a través de la asignación para una semana en California.
· InitializerService
Registro de KI y migración de esquemas
Las mesas provienen de ddl-auto; este corredor suministra sólo lo que Hibernate no puede... los índices únicos parciales en una asignación primaria abierta y una tasa de pago abierta ventana, y el REVOKE que es la base de datos la mitad de solo apéndice. Ordenador (0) por lo que aterriza ante el JPA SELECT de cualquier corredor posterior, con un 40001 de nuevo porque Yugabyte hace el cambio de esquema en línea y una declaración emitida mientras ddl-auto Todavía se está asentando pierde la carrera. Registros com.kamo.z.shared.hr.timecard en EnableJpaRepositorios - esa lista es una matriz explícita, mientras que EntityScan es comodín, y omitiendo un paquete Aborta el contexto para que NO runner corra mientras la construcción todavía reporta éxito.
· kamo-shared-library
Cáseos de la semana laboral y de la jornada laboral
La semana laboral es la unidad de horas extras de la FLSA, una unidad fija, recurrente de 168 horas. período -- y NO es el período de pago. Un período quincenalcele tiene exactamente dos semanas de trabajo; un período semimensural o mensual siempre tiene los fraccionarios, por lo que computar en horas extras en un período total tanto de pago insuficiente como de sobrepagos y no . . . . . . . . . . . . . . . . . . . . . . . El límite de la jornada laboral se lleva por separado y no es necesariamente medianoche. A El inicio de las 06:00 es la solución estándar para el personal nocturno: mantiene un turno de 22:00-06:00 en Un día de trabajo en lugar de dividirlo a través de dos medio día, que es lo que hace Las horas extras diarias y la regla del séptimo día consecutivo funcionan para ellos. Los límites son tiempos de las horas de pared resueltos a través de ZonedDateTime, por lo que las 06:00 estancias 06:00 en un día de 23 o 25 horas. Pruebas pin ambas transiciones, y pinar esa instantáneo es una fecha de negocios diferente en Los Ángeles y Kolkata, por eso La zona de registro persiste en el ponche en lugar de derivarse más tarde.
· kamo-shared-library
Resolución intervalada, etapa 1 del oleoducto de cálculo
Los golpes se resuelven. Tipos de valores puros, totales y sobrevalorados en lugar de entidades para que cada etapa sea fija-estable sin contexto de persistencia. Las duraciones provienen de Duración. entre instantes, nunca resta descargo de pared. Esa es toda la historia de DST y el pin de pruebas: un turno de 22:00-06:00 es SEVEN horas a lo largo de la primavera y NINE a lo largo de la caída. Resta de relojes de pared calcula 8 para ambos: un pago insuficiente, un pago excesivo, y en un tiempo de porción diario La noche de 9 horas pierde silenciosamente su hora extra. Cualquier cosa incompar vuelve como no resuelta en lugar de adivinar. Un no cerrado el cambio es una EXCEPTION: dejarlo abierto acumula horas absurdas, cierre automático en un Final programado sub-reports, y una gorra fija inventa un número que nadie presenció. Nunca debe terminar como cero, eso no paga nada por un día que se trabajó. Las comidas son perforadas, nunca se deducen automáticamente. TRANSFERENCIA cierra un lapso y abre el siguiente sin terminar el turno, así que el tiempo de la comida y elegibilidad de la longitud de turno continuar durante un movimiento de mitad de turno entre centros de costos.
· kamo-shared-library
Acosador de horas extras no piquedante con presets de jurisdicción
Las reglas son DATA sobre la forma RequirementRule ya utilizada en esta biblioteca, no ramas de código, por lo que California es una fila de configuración en lugar de una reescrimina. Orden de asignación es carga: reglas diarias de mayor umbral-derregla-primero (una hora de 13 horas El día de CA es 1h a 2x y 4h a 1.5x, no 5h a 1.5x), luego el séptimo día consecutivo, entonces NET semanal de horas ya en una prima diaria. Ese último paso es lo que impide la pirámide, y es el único motor ingenuo omita. Cinco días de 10 horas en California son 10 horas premium, no 20 - un ingenuo motor paga diariamente Y semanalmente por las mismas diez horas, y TODO regla individual La prueba pasa mientras lo hace. El azalador también afirma la conservación de la hora en el Sal y tira en lugar de devolver un cheque de pago equivocado. Presets: FLSA federal, California, Alaska, Nevada, Colorado.
· kamo-internal
Entrega la zona horaria de org al navegador
El modelo de organización cliente no tenía campo de zona horaria, useFormatters y de próxima responsabilidad están configurados con sin timeZone, y timezoneService llama al backend 404'd -- así cada sello de tiempo que se realiza en la zona del navegador, y el servidor durante la SSR. Espejos los 27 valores de TimezoneType en lugar de un subconjunto: un mapa parcial es un silencioso medio espejo donde un org sin machacar a través de la zona del navegador con No hay señal. Mapas GMT a Europa/Londres, no UTC -- observa BST, tan conflante ellos cambia una hora de un día entero durante media jornada. La zona de org es sólo un retroceso de DISPLAY. Un censo de producción encontró los 13 orgs en el impago no tocado PACIFIC mientras los miembros abarcan PACIFIC/EASTERN/ARIZONA/UTC/ INDIA, por lo que la zona de tiempo del registro proviene del lugar de trabajo.
· SecurityService
GET *************
timezoneService.ts ha llamado a este punto de endpoint desde que fue escrito y existió en ningún servicio Java; el cliente se tragó el 404 y resolvió UTC. Mientras tanto useFormatters y siguiente-indembre están configurados sin horarioZona, por lo que cada marcas de tiempo en la zona del navegador - y el *** retroceso es la cadena 'GMT', que es Europa/Londres y observa BST. La identidad viene de la sesión solamente: SecurityService ejecuta permisoTodo con lanzamiento a mano a mano de la manoa auth, así que un manejador que lee la identidad de la solicitud no tiene control alguno. Registros com.kamo.z.shared.hr.timecard en EnableJpaRepositorios. Esa lista es una matriz explícita, mientras que el comodín, ComponentScan/EntityScan, y omitiendo un El paquete es la causa documentada de dos despliegues previos de CrashLooping.
· kamo-shared-library
WorkSite, el ancla de jurisdicción
Nombrado WorkSite, no WorkLocation: TeamMember.workUbicación es un existente oficina/remote enum y un segundo símbolo con ese nombre chocarían en cada gruñido. zoneId es una cuerda libre de IANA en lugar de TimezoneType porque eso es 27 los valores no pueden cubrir a un empleador multiestatal, y NO es NULL porque es el sólo capa de zona confiable - cada org en producción se sienta en los intactos Predeterminado PACIFIC.
· kamo-shared-library
El empleo y las revisiones efectivas de la asignación
Los golpes harán referencia a un ASSIGNMENTO, no a un miembro. Eso es lo que hace posiciones simultáneas, la tasa regular media ponderada de 29 CFR 778.115, jurisdicción multi-sitio y trabajo que cuesta en absoluto expresibilidad. gerenteMemberId es instantánea de TeamMember.manager en el momento de la revisión así que a la reorganización no puede reescribir quién aprobó qué. El buscador de la lista no se basa deliberadamente en member-rights-applied: esa consulta es de TeamMember-type, por lo que omite a los dueños de subvenciones y no devuelve nada para un Miembro TERMINATED cuyos derechos aplicados fueron despojados - precisamente la persona cuya tarjeta de tiempo final aún tiene que producir.
· kamo-shared-library
Tarifa salarial con fecha efectiva y solo a apéndice
Ninguna compensación de empleados existió en ninguna parte de esta plataforma antes de esta entidad. Se requiere: las horas extras se calculan contra la tarifa regular de la FLSA, CA requiere la tasa sobre la declaración salarial, y una exportación sin tarifas da nómina Nada que consumir. Un aumento es un NUEVO ROW. Una tasa efectiva dentro de un período exportado genera un Ajuste retro, nunca una reescrimina silenciosa. Nunca expuesto a través /api/security/members/.id - ese endpoint comprueba que no right at Todo, así que poner una tasa en ella se filtraría cada salario en la empresa.
· kamo-shared-library
Apegar-on-on-ponche registro y auditoría evento de auditoría
Ambos servidos por interfaces de repositorio de NARROW, no JpaRepository: deleteAllInBatch y la entidad de bypass JPQL a granel callbacks, por lo que la forma de la interfaz es lo que hace Adentro-sólo real en lugar de asesoramiento. Instant . Zona IANA . fecha de negocios están todos perseverados, por lo que la duración se calcula desde instantes y DST es correcto de forma gratuita - un turno de 22:00-06:00 es de 7 horas a lo largo de la primavera y 9 en todo el mundo, mientras que la resta descargo de las paredes cócten 8 para ambos. updatable=false NO se usa deliberadamente en las columnas de ponche congeladas: Hibernate los omitiría silenciosamente de la ACTADATE en lugar de fracasar.
· kamo-shared-library
Resolve de registro en la zona horaria
Oportunidad de la orden de trabajo sitio de trabajo --miembro -- org -- UTC. El lugar de trabajo gana porque Las reglas de salario y hora siguen donde el trabajo es PERFORMED. Un censo de producción en esta sesión encontró los 13 orgs en el PACIFIC intacto Fallo y 38 de 63 miembros sin zona horaria, mientras que los poblados Abarcar PACIFIC, EASTERN, ARIZONA, UTC e INDIA, una extensión de 13,5 horas. La org Por lo tanto, por defecto no es una fuente de verdad utilizable, por lo que WorkSite.zoneId NO NULL y lleva el peso. Cae de nuevo a UTC en lugar de a la cuerda *** 'GMT', que es Europa/Londres y observa BST. Cae una zona de sitio inparseable en lugar de tirar: negarse a resolver una zona se negaría a registrar el tiempo realmente trabajado.
· kamo-shared-library
Guardia de rechazo de WORM compartido
Column(updatable=false) NO hace cumplir la inmutabilidad - Hibernate silenciosamente omite la columna de la ACTATE y la escritura rane parece que tuvo éxito. El único guardia de trabajo es un "PreUpdate" que lanza.
· kamo-shared-library
Domain enums y versión punto a tiempo resolver
Los Enums son todos en el sitio de la llamada: ORDINAL emite una numérica gama CHECK contiene AND, que SchemaCleanupRunner barre su barrido en la lista IN salta deliberadamente y que luego debe ampliarse a mano en cada nuevo valor. El solucionador se resuelve por la ventana que CONTAINS el instante, nunca por última vez, y mantiene las ventanas cerradas en el conjunto de candidatos - se cierra la supersesión cada ventana menos la actual, así que una consulta de sólo tiras abiertas no devuelve nada por cualquier instante histórico, rompiendo la paga retro y la reconstrucción de auditoría. Superpumoso lanzamientos en lugar de adivinar.
· kamo-internal
Mostrar a los miembros que pagan por su asiento, y dejen de ofrecer un segundo
El endpoint de cobertura se envió con las teclas de traducción y sin componente, por lo que el Cuestionar las respuestas -quién paga por mi asiento todavía no tenía dónde hacerse. SeatCoveragePanel le pregunta, y la respuesta alimenta el panel de autopago a su lado: alguien cuyo asiento ya está cubierto por su organización o un grupo no es más tiempo ofreció la oportunidad de comprar otro en su propia tarjeta. Esa oferta no tenía conocimiento de la cobertura existente en absoluto, por lo que se mostró a todos. El plan de un grupo también se puede cancelar ahora, que es lo que hace a un grupo con un plan deletable - eliminar uno que todavía apunta a una suscripción en vivo es Así que la acusación no queda huérfana. Agregar a alguien que la organización ya paga por vuelve se negó en lugar de silenciosamente no hace nada, así que el botón se explica.
· BillingService
Deje que el plan de un grupo sea cancelado, y deje de pagar dos veces por una persona
Tres huecos en lo que se envió último: Un grupo con un plan nunca podría ser eliminado. suscripción existe correcta, ya que la fila de grupo es lo único que apunta a la suscripción de Stripe, pero no había manera de cancelar, por lo que la salvaguardia era un el párr. cancelarPlan (en primer lugar, por lo que la lista no puede continuar La gente que se lleva a cabo escaños que ya no existen. Agregar a alguien por quien la organización ya compra un asiento es ahora rechazado a menos que takeOverFromOrg dice lo contrario. Esa es la segunda forma de ser cargado dos veces por una persona y nada atrayado: Suscripción Los únicos de suscripción por suscripción y cuentaLicense declara que ninguna en absoluto. Alejándote de alguien de el proyecto de ley de la organización sobre un grupo es algo real que un gerente hace, así que lo es permitido deliberadamente en lugar de por accidente. BillingGroupScopeInterceptor se une a cada petición /api/billing/groups/-uuid-/** a la organización del llamante. Los manejadores ya comprueban, y esto no los sustituye; existe porque esos cheques son por manejador y un grupo ahora tiene los escasos recursos que gastan dinero. La siguiente ruta añadida no hereda nada a menos que Algo por encima aplica la regla. Deliberadamente más estrecha que los manejadores: esto resuelve qué organización, no quién dentro de ella puede actuar, por lo que los dos no pueden derivar en respuestas en desacuerdo. Un id de grupo desconocido pasa por lo que el El manejador responde "no encontrado" en lugar de confirmar que el identificador existe en alguna parte.
· kamo-internal
Un grupo en el que puedes poner a la gente y pagar
Crear un grupo produjo un nombre y nada más de no tener forma de añadir a nadie, de ninguna manera para que su gerente elija un plan, no hay dónde pagar. Abrir un grupo ahora muestra quién paga, quién está en él, quién sigue esperando un asiento, y el plan controla que Compra esos asientos. Crear uno pregunta quién paga, usando el selector de miembros canónicos. Solía enviar la cuenta de la organización uid, que es exactamente la razón por la que todos los grupos fueron facturados la organización; el pagador ahora se resuelve servidor-lado del gerente y cuentaUid ya no está en el alambre en absoluto. La lista distingue tener un asiento de esperar a uno. Un gerente que pone ocho personas en cinco asientos dicen que tres colegas no tienen acceso en lugar de A averiguarlo de ellos.
· BillingService
Hacer que los grupos de facturación funcionen a extremo, y dejar de pagar por cuenta propia por nada
Un grupo ahora puede reunir a la gente, comprar un plan en la propia tarjeta de su gerente, y la mano sus asientos fuera. Nada de eso existía: las únicas operaciones fueron creadas, aprueban y borrar, así que un propietario que hizo un grupo consiguió una etiqueta y no hay manera de usarla. BillingGroupSeatService es donde se mueve dinero y se emite derecho, se mantiene aparte del registro para que no se pueda añadir ninguna nueva ruta que salte las puertas. suscripción() se niega antes de crear () se llama en lugar de después, porque crear () abre una suscripción en vivo Stripe a un grupo no aprobado, uno heredado, un gerente sin tarjeta o una brecha de tapa de asiento parada allí. Dos defectos hicieron que el grupo facturara de la persona equivocada: - El pagador era cualquier cuentaUid la petición que el cuerpo de solicitud no se controlaba, y el La consola envió la organización. Un grupo facturado a la organización no es un Grupo de facturación; es un segundo nombre para la propia suscripción de la organización. El pagador se deriva ahora del gerente y los dos se aseguran de ponerse de acuerdo antes de que se cargue nada. Envío de cuentaUid es rechazado de plano. - asegurarAccountForMember reutiliza el enlace de contador más antiguo del miembro, que para Cualquier persona añadida a la cuenta de la organización es la cuenta de la organización. asegurarPersonalAccountForMember identifica por parte de la gremimbre primario en su lugar, que es el único campo que dice una cuenta pertenece a una persona. Donde un propietario gestiona su propio grupo, "su tarjeta" y "la organización" tarjeta" son genuinamente la misma fila de cuenta y el mismo cliente de Stripe, y no El código puede distinguirlos. Eso se rechaza a menos que se confirme, en lugar de en papel ya está. Por separado, dos bichos vivos se encontraron aquí: - /-sea acusó al miembro y nunca les dio un asiento. Llamó a crear () y devolvió; no hubo fila de suscripción y no había cuentaLicense, así que el comprador se quedó sin licencia mientras su tarjeta era facturada todos los meses. - Transacción en AccountBillingService se había desplazado a un método privado, así que La primavera lo ignoró y se aseguró de queAccountForMember corriera sin ninguna transacción. A Fallo entre sus dos salvas huérfano una cuenta la siguiente mirada no pudo ver, y la siguiente llamada creó una segunda. /self/coverage es nuevo: responde "quién paga mi asiento", que nada hizo. También es lo que impide que a alguien ya cubierto le ofrezcan un segundo asiento en su propia carta.
· InitializerService
Esquema para grupos que realmente pueden pagar
Tres corredores: BillingGroupRosterMigration crea facting.pay-group.miembros - a quién grupo significa pagar, antes de que haya comprado algo. org. org.id se desnormaliza en él por lo que la base de datos puede hacer cumplir "un miembro está en al día en un grupo de facturación activa por organización" como un único parcial. Dos grupos que pagan a una persona son dos carga con un asiento, y nada más en el esquema lo atraparía: Suscripción Los únicos de suscripción son por suscripción y la licencia de cuenta no tiene ninguna. **************** añade billing.group.uid a account.subscripciones y sustituye el de tres columnas únicas con dos únicas parciales. Ampliándolo a cuatro columnas no funcionarían. Los NULLs son distintos dentro de un índice único aquí, así que cada fila no grupal dejaría de estar limitada. BillingPayGupColumnsMigración añade market-id, seat-limit y estatus, y marcas grupos existentes LEGACY. Esos fueron facturados a cualquier cuenta uid la solicitud. cuerpo llevado, y la consola envió a la organización, por lo que su cuenta es Casi seguro que está mal. No hay manera segura de adivinar qué tarjeta estaba mal, y adivinar facturas equivocadas a la persona equivocada, por lo que se les niega en el punto de acusación en lugar de reparado. La primera carrera mostró por qué el reintento importa: ambos índices de reemplazo fallaron con 40001 no pudo serializar el acceso, el corredor lo anotó "saltado" y seguidó, y el DROP de la antigua restricción entonces tuvo éxito de dejar cuenta suscripciones sin una singularidad en absoluto, lo que es estrictamente peor que la colisión que esto fija. Declaraciones de DDL ahora se instruye sobre el fracaso de la serialización, y la gota se salta A menos que ambos reemplazos estén confirmados en su lugar.

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