Changelog
Ce qui est nouveau.
Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.
· kamo-internal
Dites aux gens quand une facture a besoin d'eux, et laissez-les arrêter de payer
Une bannière sur la page d'accueil lorsqu'un paiement est responsable de cette personne a n'a pas réussi, liant directement à leur page de facturation. Jusqu'à présent, un échec d'un paiement n'est apparu que sous la forme d'applications qui ne s'ouvraient plus - restriction sans explication, qui se lit comme un logiciel cassé plutôt qu'une facture impayée. Levé uniquement pour les factures sur lesquelles ils peuvent agir: leur propre siège, et les groupes qu'ils gèrent. Il rend Rien quand il n'y a rien de dus. La bannissement est maintenant visible là où la personne peut voir qui paie: un " Anciennement automatique l'action de paiement" à leur propre siège, avec le texte d'aide disant clairement qu'ils conserver le siège jusqu'à la fin de la période qu'ils ont déjà payée. Le la confirmation nomme la date, parce que la peur quand on appuie sur ce bouton est que l'accès s'arrête immédiatement. Le changement "Qu'ils choisissent leur propre plan" "Laissez les contribuables choisir leur propre plan" a disparu. Le plan appartient à l'organisation et tous ceux qui y paient - individuellement ou en tant que groupe - achète ce même plan. Le groupe de travail indique maintenant le plan de l'organisation au lieu de plutôt qu'offrir un cueilleur.
· BillingService
Un plan par organisation, un plafond de 25 places pour l'entreprise et un moyen de cesser de payer
Le plan est maintenant une décision au niveau de l'organisation et rien d'autre ne peut l'emporter. Laisser un payeur autonome ou un gestionnaire de groupe choisir son propre exemple de gentillesse et est un bug de l'exactitude: - répond "fait cet org avoir cette application" en OR-ing pour chaque abonnement en direct ciblant l'organisation, de sorte qu'un Personne sur un siège choisissant un plan plus élevé a changé les applications de ce plan pour le l'ensemble de l'organisation. L'épinglage de chaque payeur au plan de l'organisation fait que les RUP inoffensive - les abonnements nomment tous le même plan, de sorte que celui qui gagne les réponses à l'identique. OrgPlanService lit le plan à partir du même abonnement la facturation de la console appelle "votre plan", de sorte que la règle et l'écran ne peuvent pas être en désaccord. L'entreprise est requise au-dessus de 25 sièges, comptés dans l'ensemble de l'organisation et dans chaque pays. groupe de facturation. Le comptage par payeur aurait fait de la scission en groupes un moyen de Achète cinquante sièges vingt-cinq à la fois. Une édition exclut son propre abonnement. la rétrécissement est mesurée par rapport à la nouvelle taille, et non à l'ancienne. GET /self/alerts conduit une bannière de la page d'accueil. Accès restreint sans explication est la pire version de ce produit - les applications s'arrêtent de l'ouverture et personne ne dit pourquoi, ou que la personne qui lit est celle qui peut le réparer. Seulement soulevée pour les projets de loi membre est responsable de leur propre siège et des groupes qu'ils gèrent. Dire à quelqu'un La carte de leur organisation a échoué lorsqu'elle ne peut pas la payer est du bruit, et le bruit est comment les bannières cessent d'être lues. POST /self/se asseoir/annuler arrête le paiement automatique sur un siège quelqu'un acheté eux-mêmes. Toujours à la fin de la période: ils ont payé pour la période en cours, et l'annulation immédiate prendrait cet accès tout en ne remboursant rien, puisque Ce chemin demande à Stripe de ne pas se profaner. Deux bugs in cancel() trouvés en câblant que: - C'était un non-op silencieux pour COMP et TRIAL. Tout le corps est assis derrière un stripeSubscriptionId null check, donc un abonnement composé ou d'essai renvoyé 200, la ligne toujours ACTIVE - l'appelant a dit qu'il fonctionnait quand rien ne changeait. Il refuse et dit pourquoi. - immédiatement - vrai reste dangereux et n'est délibérément pas exposé: il définit ANNULÉE puis appelle le backbackToFree, qui définit les ACTIF/FREE avec le siègeCount 1, donc a 25 places garderaient une personne qui travaillait et diraient 24 que son siège a été coupé pour une raison de siège qui n'a jamais eu lieu. l'obligation.fail-open est mis faux ici pour correspondre à SecurityService, qui sert /api/sécurité/caractéristiques et est ce que l'écran des applications et des caractéristiques lit. Deux services Il est pire que l'une ou l'autre de ces réponses. Sécurité vérité: les six plans actifs portent une ligne explicite pour l'ensemble des 21 services de types, donc rien n'est accordé précédemment n'est refusé.
· SecurityService
Relais d'approbation avec rôle résolu à partir des droits
Le rôle est établi ici, depuis les droits de l'appelant et sa relation avec le sujet -- jamais de l'organe de demande. Un organe qui pourrait nommer son propre rôle permettrait à quiconque de prétendre être des états de paie. Précédecence : PAYROLL (plus large, éditant dans n'importe quel état), puis MANAGER, puis EMPLOYEE pour son propre dossier. Le fait d'être le gestionnaire instantané du sujet compte à lui seul -- un responsable de ligne qui approuve son propre rapport est le cas ordinaire et ne devrait pas J'ai besoin d'un droit à l'échelle de l'ordre; le droit existe pour tous ceux qui examinent. isManagerOf échoue à FERMÉ: une ligne de déclaration non résolutable n'est pas une autorité.
· kamo-shared-library
APPROUVES-ÉTALONNÉES (197) et FINALISATION-PAY-PERIODS (198)
La séparation des tâches est exprimable: quiconque approuve une carte de temps n'est pas automatiquement, quiconque peut clôturer une période de paie sur ce surla. GESTIONNAIRES ET TEMPS (183) reste la porte du module et n'est pas délibérément ni l'un ni l'autre. L'inscription n'est toujours pas un droit - c'est un fait d'emploi persistant. Un droit f) Facteurs et fuites d'un membre TERMINATED exactement quand les ressources humaines doivent produire leur dernière carte de temps. Délibérablement absent de NEW-RIGHT-SEEDS: qui est titulaire d'une subvention EXISTANTE et cette porte une capacité que personne n'avait. L'ajout d'un droit n'a besoin que d'un SecurityService redémarre -- pas de collage KamoInitializer, pas de DDL. Ids épinglés par un test, parce que l'id est ce que le membre - droits - a appliqué les stocks.
· kamo-shared-library
Machine d'état d'homologation de niveau
Le chef de l'emploi soumet le gestionnaire approuve la clôture des états de paie, conformément à la décision du propriétaire. Quatre règles, appliquées dans une table de transition pure et épinglées par 25 tests: 1. Un directeur NE PEUT PAS approuver jusqu'à ce que l'employé se soit présenté. La demande est l'affirmation de l'employée selon laquelle les heures sont les leurs et sont complètes; En l'agréant, sans qu'il n'approuve rien, qui n'a été attesté. 2. L'approbation du gestionnaire LOCKS l'employé à partir d'autres modifications. 3. Un gestionnaire PEUT agir au nom - soumettre ou approuver - et c'est le seul voie sanctionnée par l'article 1. Elle exige une raison écrite, et la ligne enregistre à la fois le gérant qui a cliqué et l'employé pour. 4. Les états de paie peuvent être édités à tout état, y compris verrouillé, toujours avec une raison. Les rectifications après la fermeture sont routinières et légalement nécessaires; les interdire Il suffit de déplacer l'édition hors de la piste d'audit. La séparation des tâches vit dans la table de transition, pas dans la désignation de rôle: personne approuve leur propre carte de temps, et un manager est aussi l'employé de quelqu'un. Non-approbation des cascades de PAYROLL-LOCKÉS jusqu'à SUBMITTED, parce que le retrait d'une homologation invalide la serrure qui y est construite. Les homologations sont prévues à une norme DATE RANGE, de sorte qu'une homologation en milieu de période survit une période ultérieure. éditer en dehors de son champ d'application au lieu de couvrir silencieusement le travail qu'il n'a jamais vu.
· kamo-internal
Onglet des membres de la carte de temps et onglet des paramètres HRS Timecards
L'onglet membre est UNIQUEMENT AUTO-SERVICE et fermé sur l'identité, exactement comme respect de la loi: ses critères d'évaluation ne prennent aucun membre id, de sorte qu'il est structurellement incapable de montrer les heures de quelqu'un d'autre. checkLe droit est inutilisable ici -- il retours vrais pour tout en mode dieu, et la page est propre canViewAutres membresCompte RUPs en droits indépendants, y compris - La carte de suivi du HR par une personne spécifique est une surface différente à /hr/assisterance, attribuée à l'acteur HR. Placé avant la facturation des plans pour qu'il reste dans le groupe d'onglets de gauche -- n'importe quoi après il hérite de cet ongletAlignement droit ml:'auto'. La page HRS acquiert son premier onglet réel en dehors du ComingSoonTab, enregistré en SETTINGS-MENU comme critère de couverture nécessite dans les deux sens. Tous les deux tabs pavé sur chaque chemin de retour; ParamètresView, TabPanel et le mouvement div tout l'alimentation zéro.
· kamo-internal
/hr/sciente de présence et contrôle de l'horloge NavTop
Remplace le corps HrTabPlaceholder. L'itinéraire, entrée HR-TABS, MANAGE-TIMECARDS gate and tab i18n clés a déjà existé, rien ici n'enregistre quoi que ce soit. Les heures de liste sont dérivées côté serveur à partir du journal de poinçon immuable sur chaque lecture plutôt que de rester en tant que total en cours, de sorte qu'un coup de poinçon corrigé apparaît immédiatement et un bug produit un mauvais nombre une fois au lieu de se mélanger. La commande de l'horloge est fixe chrome à côté de Legal and Compliance, pas un NAV-REGISTRY saisie: le registre ne peut pas exprimer une position entre deux commandes fixes, sa badgeKey est le code mort, et chaque entrée de registre est glgérable et inébranlable. une horloge de conformité ne doit pas être quelque chose que quelqu'un peut se cacher d'eux-mêmes. Il porte sur l'inscription PERSISTED, never checkRight, qui revient vrai pour tous les droits sous mode dieu et montreraient une horloge dans chaque opérateur d'org timecardControlApplies est partagé par le contrôle et son sondage. aller silencieuse ensemble -- deux copies de cette dérive de prédicat, et le mode de défaillance est un bouton caché dont la recherche fonctionne pour toujours. L'état d'horloge est un NOTA QUATRE signal indépendant: non présence (60s battements de cœur, 300 s) TTL), et non de disponibilité, qui est automatiquement réglé sur AWAY sur la déconnexion et les portes pilote et soutien au routage. Un sondage réservé pour l'instant avec un plancher des années 60. Le relais STOMP atterrit avec le MediaService changement; le NATS de base est non diffusé et perdante de sorte que la graine REST est de toute façon obligatoire.
· kamo-shared-library
Accesseur d'horlogerie de base de données sur le dépôt de poinçons
Chaque instant de poinçon vient du DB, jamais la JVM: les gousses redémarrent et noeuds les horloges, et un record de salaire dont l'ordre dépend de la dose de la dose traitée est pas un compte rendu. CAST standard SQL, parce qu'un cassant est silencieusement mêlé -- Hibernate lit ':' en tant que préfixe nommé-paramètre et tourne maintenant()::timestamp en:timestamp.
· kamo-internal
BFF itinéraire pour /api/sécurité/cartes à temps
TimecardService est ClusterIP sans ingress, donc sans cette route l'ensemble Disposition 404 dans le navigateur pendant que chaque service est sain et chaque build est vert -- l'échec exact qui s'est déjà produit deux fois sur cette plate-forme. Pas d'autorisation ici, délibérément: cette couche est transport, et un demi-contrôle inviterait la conviction qu'il s'agit d'un contrôle. forwardToApi possède la chaîne de requête. Un 204 est retourné comme 204 au lieu d'être passé par .json(), qui lance.
· SecurityService
Relais de SecurityService à TimecardService
La frontière de l'autorisation. TimecardService détient les données et le moteur, mais non session; cela tient la session et décide qui peut faire quoi, puis retransmet. Le Un moteur ne peut donc jamais être atteint sans passer par ici. SecurityService exécute anyRequest().permitAll() avec authsée à la main, Donc chaque méthode s'ouvre avec un garde qui retourne non-nulle à refuser. Libre-service les critères d'évaluation prennent NO membre id du tout -- le membre vient de la session, rendant ils sont structurellement incapables d'agir sur quelqu'un d'autre. Critères d'évaluation HR sur MANUI-TIMECARDS (183). Il est répondu à l'inclusion à partir de la ligne d'emploi persistante plutôt qu'un droit, de sorte que un opérateur de mode dieu ne semble pas inscrit dans toutes les organisations qu'il regarde. SUDO-MEMBER-ID est transporté à travers: isSelf() en amont traite une imitation en tant que membre cible, donc sans lui un coup de poing de l'imitateur serait enregistré comme étant le propriétaire de l'employé. timecard.service.url est défini EXPLICITEMENT dans la configmap. commission.service.url n'est fixé nulle part et la production dépend d'un littéral en Java, qu'un service renommer casse au moment de l'exécution avec rien dans la configuration pour laquelle grep.
· kamo-shared-library
Déchets de journée de travail, étape 2 de l'oléoduc
Les intervalles résolus deviennent des secondes par date d'affaires, prêts pour l'expéditeur. Un intervalle est SPLIT à chaque limite de travail qu'il traverse: a 22:00-06:00 sous une journée de travail de minuit, c'est 2 heures à un jour et 6 heures sur la prochaine. Attribution l'ensemble de la plage jusqu'à sa date de début fait des heures supplémentaires quotidiennes et la règle du septième jour tort pour tous les travailleurs de nuit. Il s'agit délibérément d'une attribution DIFFÉRENTE de la rubrique de l'entreprise le poinçon. Le poinçon comporte une date -- pour l'évaluation des repas/repos, l'exception et ce que l'employé considère comme leur poste - alors que les besoins de comptage des heures supplémentaires les heures réparties entre les jours de travail et les semaines de travail dans lesquelles elles sont en fait tombées. Les deux sont correctes, les deux sont nécessaires, et les confondre est le piège. Un décalage franchissant la frontière entre la SEMAINE DE TRAVAIL contribue également à deux semaines. les totaux d'heures supplémentaires; compter tout cela dans l'un ou l'autre est une erreur pour les deux. Accumulage en quelques secondes. Les essais couvrent les deux transitions de la DST, soit 50 heures. et frappent de bout en bout en fonction de l'allocation pour une semaine californienne.
· InitializerService
Enregistrement KI et migration des schémas
Les tables proviennent de ddl-auto; ce coureur ne fournit que ce que Hibernate ne peut pas -- les indices uniques partiels sur une affectation primaire ouverte et un taux de rémunération ouvert et le REVOKE qui est la moitié de la base de données de l'appendice uniquement. "Order(0) de sorte qu'il atterrit avant tout SÉLECTION DE JPA du coureur ultérieur, avec une réessai de 40001 Parce que Yugabyte change de schéma en ligne et un communiqué publié pendant que ddl-auto est toujours en train de s'installer perd la course. Enregistre com.kamo.z.shared.hr.timecard dans la liste des référentiels de la liste des règlements d'exécution de la liste est un réseau explicite tandis que «EntityScan est un caractère générique, et en omettant un paquet» avorte le contexte, donc NO runner court alors que la construction continue de rapporter le succès.
· kamo-shared-library
Semaine de travail et limites de la journée de travail
La semaine de travail est l'unité des heures supplémentaires de la FLSA - une unité fixe, régulièrement récurrente de 168 heures. période -- et ce n'est PAS la période de paie. Une période bihebdomadaire est exactement de deux semaines de travail; une période semestrielle ou mensuelle est toujours faible ou mensuelle en contient toujours fractionnaires, de sorte que calcul des heures supplémentaires sur une période totale à la fois sous-payeur et sur-pays impréparables une fois que des périodes sont exportées. La frontière de la journée de travail est transportée séparément et n'est pas nécessairement de minuit. A 06:00 début est la solution standard pour le personnel de nuit: il garde un groupe de 22:00-06:00 UN jour de travail au lieu de le diviser en deux demi-journées, ce qui fait les heures supplémentaires quotidiennes et la règle du septième jour de la journée fonctionnent pour eux. Les limites sont des heures de paroi résolues à travers le temps de zonedDateTime, donc 06:00 reste 06:00 un jour de 23 ou 25 heures. Tests épingle à la fois transitions, et épingle celle-ci instant est une date d'affaires différente à Los Angeles et Kolkata -- c'est pourquoi la zone d'enregistrement est maintenue sur le coup de poing plutôt que dérivée plus tard.
· kamo-shared-library
Résolution d'intervalle, étape 1, phase 1 de la filière de calcul
Les coups de poing deviennent des travées résolues. Types de valeurs pures, totales et sur valeur plutôt que les entités, de sorte que chaque étape est testée avec un contexte de persistance. Les durées viennent de Duration.between on emmanche, jamais de soustraction murale. C'est l'histoire entière de la DST et les tests l'épingle: un changement de service de 22:00-06:00 est SEVEN heures sur l'avant-printemps et NINE sur l'abri. Horloges murales soustractées calcul 8 pour les deux -- un sous-payant, un surpayant, et dans un temps de prolongation quotidien La nuit de 9 heures perd silencieusement son heure-temps. Tout ce qui est inapte à l'état est résolu plutôt que deviné. Un écran fermé le changement est une EXCEPTION: le laisser ouvert revient des heures absurdes, la fermeture automatique à un Les sous-déclarations de fin programmée, et un plafond fixe invente un certain nombre de personnes dont personne n'a été témoin. Il ne doit jamais finaliser comme zéro -- cela ne paie rien pendant une journée qui a été travaillée. Les repas sont perforés, jamais déductibles. TRANSFERT ferme une travée et ouvre le après sans mettre fin à l'équipe, donc l'éligibilité au salaire et le changement de vitesse continuer à traverser le transfert à mi-chemin entre les centres de coûts.
· kamo-shared-library
Alliant-réducteur d'heures supplémentaires non pyramidant avec préréglage de la juridiction
Les règles sont des données DATA sur la forme de la règle des besoins déjà utilisée dans cette bibliothèque, non Les branches de code, donc la Californie est une ligne de configuration au lieu d'une réécriture. L'ordre d'attribution est porteur de charge: règles journalières - seuil le plus élevé (une durée de 13 heures) CA jour est de 1h à 2x et 4h à 1,5x, pas 5h à 1,5x), puis le septième pendant une journée, puis NET hebdomadaire d'heures déjà à une prime journalière. Cette dernière étape est ce qui empêche la pyramide, et c'est celui des moteurs naifs omite. Cinq jours de 10 heures en Californie sont 10 heures premium, pas 20 heures -- un naif le moteur paie quotidiennement ET hebdomadaire pendant les mêmes dix heures, et TOUTE règle individuelle l'essai passe pendant qu'il le fait. L'expéditeur affirme également la conservation des heures sur la Sortez et jetez plutôt que de renvoyer un mauvais salaire. Préréglages : FLSA fédéral, Californie, Alaska, Nevada, Colorado.
· kamo-internal
Délivrez le fuseau horaire de l'administration au navigateur
Le modèle d'organisation client n'avait pas de champ de fuseau horaire, d'utilisationFormatters et d'un prochain-intl. sont tous les deux configurés sans temps - un, et le backend zone de fuseau horaire 404'd - donc chaque horodatage rendu dans la zone du navigateur, et le serveur pendant la SSR. Rétroviseurs toutes les 27 valeurs de type fuseau horaire plutôt qu'un sous-ensemble: une carte partielle est a demi-miroir silencieux où une orge non démodé tombe à la zone de navigation avec pas de signal. Cartes GMT vers l'Europe/Londres, pas UTC -- il observe la BST, donc confondre Ils changent une journée entière d'heures d'une heure pendant six mois. La zone d'orge est une contre-recche uniquement. Un recensement de la production a permis de constater les 13 orges le défaut PACIFIC non modifié pendant que les membres s'étendent sur PACIFIC/ÉASTERN/Arrêt/UTC/ L'INDE, donc la zone de record de la carte de temps vient du chantier à la place.
· SecurityService
EGEU
timezoneService.ts a appelé ce critère depuis qu'il a été écrit et il existait dans le cas d'un service Java; le client a avalé le 404 et a résolu l'UTC. Pendant ce temps useFormatters et next-intl sont tous deux configurés sans temps - un, donc chaque timestampes rend dans la zone du navigateur -- et la raccordée est la chaîne "GMT", qui est Europe/Londres et observe la BST. L'identité vient uniquement de la session: SecurityService exécute un permis. Authsame roulier à la main, donc un gestionnaire qui lit l'identité à partir de la demande n'a aucun contrôle. Enregistre la carte com.kamo.z.shared.hr.time en «EnableJpaRepositories. Cette liste est un tableau explicite tandis que ComponentScan/EntityScan est un caractère générique, et en omettant un Un paquet est la cause documentée de deux déploiements antérieurs de CrashLooping.
· kamo-shared-library
WorkSite, base de la juridiction
Site de travail nommé, pas WorkLocation: TeamMember.workLocation est un site existant bureau/éloquet enum et un second symbole de ce nom entre en collision dans chaque grep. zoneId est une chaîne IANA libre plutôt que TimezoneType parce que ce enum est 27 les valeurs ne peuvent pas couvrir un employeur multi-états, et ce n'est PAS NULL parce que c'est le Seulement une couche de zone fiable -- chaque gisement de production se trouve sur l'intouché Par défaut PACIFIQUE.
· kamo-shared-library
Emploi et révisions d'affectation à jour
Les coups de poing feront référence à un ASSIGNMENT, et non à un membre. C'est ce qui fait les positions concurrentes, le 29 CFR 778.115, taux normal moyen pondéré, la juridiction multisite et le coût de l'emploi sont singuleux. manager MemberId est pris en compte par TeamMember.manager au moment de la révision. la réorganisation ne peut pas réécrire qui a approuvé quoi. Le chercheur de la liste n'est délibérément pas construit sur la base des droits des membres: cette question est de type TeamMember, de sorte qu'il omet tous les propriétaires d'une hypothèque et ne retourne rien pour un Un membre TERMINÉTÉ dont les droits appliqués ont été dépouillés - précisément la personne dont la dernière carte de temps de ressources doit encore produire.
· kamo-shared-library
Taux de rémunération appliqué à l'évaluation et à l'appendice uniquement
Aucune compensation des salariés n'existait nulle part sur cette plate-forme avant cette entité. Elle est nécessaire: les heures supplémentaires sont calculées en fonction du taux normal de la FLSA, l'AC exige le taux sur l'état des salaires et une exportation sans taux donne une masse salariale Rien à consommer. Une augmentation est une NOUVELLE FONCTION. Un taux effectif à l'intérieur d'une période exportée génère un rétro-ajustement, jamais une réécriture silencieuse. Jamais exposé via /api/sûreté/sannoty/-id---------------------------- Tous, donc mettre un taux dedans fuirait chaque salaire dans l'entreprise.
· kamo-shared-library
Logique de frappe et événement d'audit
Les deux desservis par les interfaces NARROW Repository, et non JpaRepository: deleteAllInBatch et les rappels d'entité de dérivation JPQL en masse, donc la forme de l'interface est ce qui fait Appliquer uniquement des éléments réels plutôt que des conseils. La date d'activité est maintenue, donc la durée est calculée. à partir des instants et la DST est correcte gratuitement -- une équipe de 22:00-06:00 est de 7 heures sur l'avant-pression et 9 par l'arre, tandis que la soustraction de l'horloge murale 6 pour les deux. updatable-faux est délibérément NE PAS utiliser sur les colonnes de poinçon congelées: Hibernate les omettre silencieusement de l'obligation d'utiliser plutôt que d'échouer.
· kamo-shared-library
Récepteur de fuseau horaire de l'enregistrement
Site de travail de l'autorité de commande - membre ----------------------------------------------- Le chantier gagne parce que Les règles relatives aux salaires et aux heures de travail suivent l'endroit où les travaux sont PERFORMÉS. Un recensement de la production de cette session a trouvé les 13 orages sur le PACIFIC intact. par défaut et 38 des 63 membres sans fuseau horaire du tout, tandis que les membres forfaits PACIFIC, ORIENTAL, ARIzONA, UTC et INDE -- un écart de 13,5 heures. L'orge le défaut n'est donc pas une source de vérité utilisable, c'est pourquoi WorkSite.zoneId NON NULL et porte le poids. Retourne à l'UTC plutôt qu'à la chaîne « GMT », qui est Europe/Londres et observe la BST. Une zone de site insaisable tombe à travers plutôt que de jeter: refuser de résoudre une zone refuserait d'enregistrer le temps effectivement travaillé.
· kamo-shared-library
Garage de refus partagé de la WORM
«Le colombonie (défaut-faux-faux) n'impose PAS l'immuabilité - en hiberné en silence omet la colonne de l'UPDATE et l'écriture rassise semble avoir réussi. Le seul garde de travail est un « Pré-Update » qui lance.
· kamo-shared-library
Résolveur de version point-in-time et de la version point-time
Les enums sont tous «numérés) sur le site d'appel: ORDINAL émet un chiffre CHECK contenant ET, quel schéma de balayage de la liste IN de la gamme de Pleaup-Runner des sauts délibérés et qui doivent ensuite être élargis à la main sur chaque nouvelle valeur. Le résolveur résout par la fenêtre qui CONTENT l'instant, jamais par La dernière rangée, et garde les fenêtres fermées dans le set du candidat -- la supersession se ferme chaque fenêtre mais la fenêtre actuelle, donc une requête open-rows only ne retourne rien pour tout moment historique, la réduction des salaires rétro et la reconstruction de l'audit. Surlap Il lance plutôt que de deviner.
· kamo-internal
Montrez aux membres qui paient pour leur siège, et arrêtez d'offrir un deuxième
Le point d'extrémité de couverture expédié avec des clés de traduction et sans composante, donc le Question, il répond - qui paie pour mon siège - n'avait toujours nulle part où être demandé. SeatCoveragePanel le demande, et la réponse alimente le panneau de paiement autonome à côté d'elle: une personne dont le siège est déjà couvert par son organisation ou un groupe n'est pas plus longtemps offre la possibilité d'en acheter une autre sur leur propre carte. Cette offre n'avait pas la connaissance de la couverture existante, elle a donc été montrée à tout le monde. Un plan de groupe peut également être annulé maintenant, ce qui fait qu'un groupe a un groupe plan de suppression - enlever un qui pointe encore à un abonnement en direct est Il a donc été refusé que l'accusation n'est pas orpheline. En additionnant quelqu'un que l'organisation paie déjà pour revient refusé plutôt que ne rien faire silencieusement, alors le bouton s'explique.
· BillingService
Que le plan d'un groupe soit annulé, et cesse de payer deux fois pour une personne
Trois lacunes dans ce qui a été expédié en dernier: Un groupe avec un plan ne peut jamais être supprimé. delete() refuse pendant qu'il véridique l'abonnement existe - correct, puisque la ligne de groupe est la seule chose pointant sur l'abonnement Stripe - mais il n'y avait aucun moyen d'annuler, donc la garantie était un isad. annulerPlan() libère les sièges en premier, donc la liste ne peut pas continuer prétendre que les gens détiennent des sièges qui n'existent plus. L'ajout d'une personne pour laquelle l'organisation achète déjà un siège est maintenant refusée à moins que takeOverFromOrg dit le contraire. C'est la deuxième façon d'être facturé deux fois pour une personne et rien ne l'a rattrapé: les conditions uniques du membre d'abonnement par souscription et AccountLicense ne déclare aucune. Déplacer quelqu'un de le projet de loi de l'organisation sur un groupe est une chose réelle qu'un gestionnaire fait, donc c'est autorisés - délibérément plutôt que par accident. BillingGroupScopeIntercepteur se lie à chaque /api/billing/groups/--------------------------------------- à l'organisation de l'appelant. Les manipulateurs vérifient déjà, et ce n'est pas le cas. les remplacer; il existe parce que ces contrôles sont à main et qu'un groupe a maintenant les sous-ressources qui dépensent de l'argent. La voie suivante ajoutée n'hérite rien si Ce qui est au-dessus, il applique la règle. Délibérément plus étroit que les manipulateurs: qui règle quelle organisation, et non qui en son sein peut agir, de sorte que les deux ne peuvent pas s'éternisant vers des réponses en désaccord. Un groupe inconnu passe à travers ainsi le le gestionnaire répond "ne pas trouvé" plutôt que de confirmer que l'id existe quelque part.
· kamo-internal
Un groupe sur lequel vous pouvez mettre les gens et payer
La création d'un groupe a produit un nom et rien d'autre - aucun moyen d'ajouter qui que ce soit, pas de solution. pour que son directeur choisisse un plan, nulle part où payer. L'ouverture d'un groupe montre maintenant qui qui est sur elle, qui attend toujours un siège, et le plan contrôle que achetez ces sièges. Créer quelqu'un demande qui paie, en utilisant le cueilleur des membres canoniques. Il avait l'habitude d'envoyer le compte de l'organisation uid, c'est exactement la raison pour laquelle chaque groupe a été facturé à l'organisation; le payeur est désormais résolu en face du serveur du gestionnaire et compteUid n'est plus du tout sur le fil. La liste distingue le fait d'avoir un siège de l'attente. Un directeur qui met huit personnes à cinq sièges sont informées que trois collègues n'ont pas accès plutôt que s'en acquérir.
· BillingService
Faire en sorte que les groupes de facturation fonctionnent à bout de bout en bout, et arrêter la facturation à payer pour rien
Un groupe peut maintenant rassembler des gens, acheter un plan sur la carte de son manager, et main ses sièges. Rien de tout cela n'existait: les seules opérations étaient en cours de création, a approuvé Et supprimer, donc un propriétaire qui a fait un groupe a obtenu une étiquette et aucun moyen de l'utiliser. Facture GroupSeatService est le cas où l'argent est émis, à l'exception de la tenue des enregistrements, il n'est pas possible d'ajouter une nouvelle itinéraire qui saute les portes. subscribe() refuse avant create() est appelé plutôt qu'après, car create() ouvre un abonnement en direct Stripe - un groupe non approuvé, un groupe hérité, un gestionnaire sans perfaction de la carte ou d'un casse-tête de siège, tout s'arrête là. Deux défauts ont fait de la facture de groupe la mauvaise personne: - Le payeur était n'importe quel compteUtilisé par l'organe de demande nommé, non contrôlé, et la console a envoyé celle de l'organisation. Un groupe facturé à l'organisation n'est pas un groupe groupe de facturation; c'est un prénom pour l'abonnement de l'organisation. Le payeur est maintenant dérivé du gestionnaire et les deux sont censés convenir avant que tout ne soit facturé. L'envoi du compteUid est purement et simplement rejeté. - assurerAccountForMember réutilise le lien de compte le plus ancien du membre, qui pour Toute personne ayant jamais ajouté au compte de l'organisation est le compte de l'organisation. e) AssurerCompteilleure identifie par le membre principal, qui est plutôt le seul champ qui dit qu'un compte appartient à une personne. Lorsqu'un propriétaire gère son propre groupe, "la carte" et "l'organisation" carte" sont vraiment la même ligne de compte et le même client Stripe, et non code peut les distinguer. Cela est refusé sauf confirmation, plutôt que paper par-dessus. Par ailleurs, deux insectes vivants trouvés ici: -/se asseoir le siège a accusé le membre et ne leur a jamais attribué de siège. Il s'appelle create() et renvoyé; il n'y a pas eu d'abonnement de rangée de membre ni de licence de compte, de sorte qu'il n'y a pas l'acheteur n'a pas séjourné en personne pendant que sa carte était facturée tous les mois. - «Transactionnel dans AccountBillingService avait dérivé sur une méthode privée, de sorte qu'il Spring l'a ignoré et s'est rallié à l'exercice de ce qu'il a effectué sans transaction. A échec entre ses deux sauvegardes d'un compte orphelin la prochaine consultation n'a pas pu pouvoir voir, et l'appel suivant a créé un second. /self/coverage est nouveau: il répond "qui paie pour mon siège", ce que rien n'a fait. C'est aussi ce qui empêche quelqu'un déjà couvert d'être offert un deuxième siège sur leur propre carte.
· InitializerService
Schéma pour les groupes qui peuvent effectivement payer
Trois coureurs: BillingGroupRosterMigration crée des membres de facturation de la facturation des membres de la facturation signifie payer, avant qu'il n'ait acheté quoi que ce soit. org-id est dénormalisé sur lui de sorte que la base de données peut faire respecter "un membre est sur la plupart un groupe de facturation actif par groupe de facturation l'organisation" en tant qu'unique partielle. Deux groupes payant pour une personne sont deux des charges pour un siège, et rien d'autre dans le schéma ne l'attraperait: Les conditions uniques du sous-abonnement sont par souscription et AccountLicense n'en a pas. - Ajout de facturation-groupe-uid à compte-abscriptions et remplace la trois colonnes unique par deux uniques partiels. l'agrandir pour quatre colonnes ne fonctionneraient pas - les NULL sont distincts à l'intérieur d'un index unique ici, donc toute ligne autre que le groupe cesserait d'être contrainte. BillingPayGroupColumnsMigration ajoute l'identifiant du marché, la limite des sièges et du statut, ainsi que des marques Groupes existants LEGACY. Ceux-ci ont été facturés à n'importe quel compte uid la demande l'organisme transporté, et la console a envoyé celle de l'organisation, donc leur compte-uid est presque certainement mal. Il n'y a pas de moyen sûr de deviner quelle carte était prévue, et deviner de fausses factures la mauvaise personne, donc elles sont refusées au point d'accusation au lieu de réparer. La première course a montré pourquoi le retry est important: les deux indices de remplacement ont échoué avec 40001 ne pouvait pas sérialiser l'accès, le coureur connecté "skipped" et transporté, et le DROP de l'ancienne contrainte a ensuite succédé - en laissant un compte-sabons sans caractère unique, ce qui est strictement pire que la collision que celle-ci. Les déclarations DDL réessayent maintenant sur la défaillance de la sérialisation, et la goutte est sautée entièrement à moins que les deux remplacements ne soient confirmés en place.
· kamo-shared-library
Que un groupe de facturation soit son propre payeur
Un groupe pourrait être nommé et rien d'autre. Son abonnement n'a jamais été fixé Rien dans la plate-forme appelée setAbonnement - donc abonnement - abonnement - abonnement - abonnement - abonnement - abonnement - abonnement - abonnement - abonnement - a nul pour toujours et le groupe ne pouvait acheter ni détenir un seul siège. Trois choses ont dû changer dans le modèle: BillingGroupMembre est nouveau. La vérité du siège reste là où elle était, sur SubscriptionMembre et AccountLicense, mais SubscriptionMember.subscription n'est PAS NULL, donc jusqu'à un Un groupe achète un plan, il n'y a nulle part où enregistrer les personnes qu'il existe à couvrir et rassembler les gens avant d'acheter des sièges pour eux est tout le but. C'est intention; c'est le droit. Comptes Abonnements de facturation GroupUid et le (compte, marché, entité cible) une contrainte unique sort de l'entité. Un groupe facture son directeur, le compte du gestionnaire, visant le même org sur le même marché que n'importe quel siège que le gérant a déjà acheté pour lui-même - le même tuple. Donc un groupe est le premier l'achat n'a pas échoué, il a trouvé l'abonnement personnel du gérant et a réécrit c'est-à-dire plan, sièges, rayé id. Pas d'exception, pas de deuxième ligne. La règle est maintenant comme deux indices uniques partiels que la JPA ne peut exprimer, créé par KamoInitializer; la déclaration de l'entité devait aller ou ddl-auto recréerait l'ancienne contrainte devant le coureur qui le laisse tomber. est supprimé plutôt que déprécié. Il retourne facultatif sur la force d'une contrainte qui n'est plus existe, donc une fois qu'un compte détient à la fois un abonnement personnel et un abonnement de groupe, un abonnement personnel et un abonnement de groupe correspond à deux rangées et lance sur les cinq sites d'appels sur trois services. Le fait de le découvrir par autocomplet était l'option la plus dangereuse. En outre: les groupes d'autorisation() incluent désormais REQUIES-APPROBATION. Exclut cela a fait la voie d'approbation impossible à atteindre - la création d'un groupe a été refusée purement et simplement, tandis que code fixant le drapeau approuvé demandé doit Approval() et ne pourrait donc jamais la réponse "déjà approuvée". Un propriétaire qui a choisi la surveillance n'a eu aucun groupe.

Votre univers vous attend.
Commencez gratuitement en quelques minutes. Ajoutez des produits quand vous êtes prêt. Pas de migration, pas de nouvelles connexions.
Gratuit pour toujours — aucune carte de crédit requise