Changelog
Co nowego.
Każde ulepszenie platformy, jak to wysyła.
· BillingService
Przenieś datę odnowienia na pokrycie i ładunki grupy
Obie powierzchnie informują teraz o aktualnej PeriodEnd i cancelAtPeriodEnd. Data jest tym, co Potwierdzenie anulowania musi powiedzieć: "Trzymasz swoje miejsce do końca Okres" jest otuchy w abstrakcyjnym, "utrzymujesz swoje miejsce do 14 marca" To pewność, że ktoś może działać.
· kamo-internal
Powiedz ludziom, kiedy rachunek ich potrzebuje i pozwól im przestać płacić
Baner na stronie głównej, gdy płatność, za którą ta osoba jest odpowiedzialna Nie udało się, linkując bezpośrednio do ich strony rozliczeniowej. Do tej pory nieudana płatność Pojawiły się tylko jako aplikacje, które już nie otwierają - ograniczenie bez wyjaśnienia, To jest odczytywane jako zepsute oprogramowanie, a nie zapłaconą fakturę. Wychowany tylko dla Rachunki, na których mogą działać: własne miejsce i grupy, którymi zarządzają. To renderuje Nic, gdy nic nie jest należne. Anulowanie jest teraz widoczne, gdy osoba może zobaczyć, kto płaci: "Anuluj automatyczny Wypłata" akcji na własnym miejscu, z tekstem pomocy mówiącym wyraźnie, że Zatrzymaj miejsce do końca okresu, za który już zapłacili. A. w tym, w tym, że Potwierdzenie nazwy daty, ponieważ strach podczas naciśnięcia tego przycisku jest taki Dostęp zatrzymuje się natychmiast. Przełącznik „Niech samopłatnicy wybierają własny plan” zniknęła. Plan należy do Organizacja i każdy, kto płaci w niej – indywidualnie lub jako grupa – Kupuje ten sam plan. Panel grupowy określa teraz plan organizacji, a raczej - niż oferowanie pickera.
· BillingService
Jeden plan na organizację, 25-miejscowy pułap Enterprise i sposób na zaprzestanie płacenia
Plan jest teraz decyzją na poziomie organizacji i nic innego nie może go zastąpić. Pozwalanie samopłatnikowi lub kierownikowi grupy wybrać własne odczyty jak życzliwość i Jest błędem poprawności: - odpowiedzi "czy to org Posiadaj tę aplikację" przez OR-ing w każdej subskrypcji na żywo, która celuje w org, więc Osoba na jednym miejscu, wybierając wyższy plan, zmieniła aplikacje tego planu dla Cała organizacja. Przypinanie każdego płatnika do planu organizacji robi to OR Nieszkodliwe — subskrypcje nazywają ten sam plan, więc niezależnie od tego, w jakim momencie wygra odpowiedzi Identycznie. OrgPlanService odczytuje plan z tej samej subskrypcji Plans & Konsola rozliczeniowa wywołuje "twoi plan", więc reguła i ekran nie mogą się nie zgadzać. Przedsiębiorstwo jest wymagane powyżej 25 miejsc, liczone w całej organizacji i każdego Grupa rozliczeniowa. Liczenie na płatnika sprawiłoby, że podział na grupy byłby sposobem Kup pięćdziesiąt miejsc dwadzieścia pięć razy na raz. Edycja wyklucza własną subskrypcję, więc Kurczenie jest mierzone w stosunku do nowych rozmiarów, a nie starych. GET /self/alerts prowadzi baner strony głównej. Ograniczony dostęp bez wyjaśnienia Jest to najgorsza wersja tego produktu - aplikacje przestają się otwierać i nikt nie mówi dlaczego, lub To osoba czytająca to osoba, która może to naprawić. Podniesione tylko dla rachunków to Członek jest odpowiedzialny za: własne siedziby i grupy, którymi zarządza. Powiedzieć komuś Karta ich organizacji nie powiodła się, gdy nie mogą zapłacić, to hałas, a hałas jest Jak banery przestają czytać. POST /self/seat/cancel zatrzymuje automatyczną płatność na miejscu, które ktoś kupił Sami. Zawsze na końcu okresu: płacili za bieżący okres, oraz Odwołanie natychmiast odebrałoby ten dostęp, nie zdając mu pieniędzy, ponieważ Ta ścieżka prosi Stripe'a o brak progresu. Dwa błędy w cancel() znalezione podczas okablowania tego: - To był cichy mecz dla COMP i TRIAL. Całe ciało siedzi za stripSubscriptionId null check, więc zwrócona subskrypcja konstruowana lub próbna 200 z rzędu nadal ACTIVE - dzwoniąc powiedział, że działa, gdy nic się nie zmieniło. Teraz odmawia i mówi dlaczego. - nadajnie prawdy pozostaje niebezpieczni i celowo nie jest narażony: ustawia Następnie oddzwonij do awaryjnegoToFree, który ustawia ACTIVE / DARMO z siedziskiemCo to 1, więc 25-miejscowy org zatrzymałby jedną osobę pracującą i powiedziałby, że ich miejsce zostało obcięte. Powód, dla którego nigdy się nie wydarzyło. uprawnieni.fail-open jest fałszywy tutaj, aby pasował do SecurityService, która służy /api/security/features i jest tym, co czyta ekran i aplikacje. Dwie usługi Odpowiadanie na to samo pytanie o uprawnienia jest gorsze niż którekolwiek z tych odpowiedzi. Zweryfikowany sejf: wszystkie sześć aktywnych planów niesie wyraźny rząd dla wszystkich 21 usług Rodzaje, więc nic wcześniej nie jest odrzucone.
· SecurityService
Przekaźnik poziomu aprobatowego z rolą rozwiązaną z praw
Rola jest tutaj zdobędna, od praw dzwonienia i ich związku z Przedmiot – nigdy od ciała z prośbą. Ciało, które może nazwać swoją własną rolę Pozwoliłoby każdemu twierdzić, że jest payrollem. Obecność: PAYROLL (szersza, edytuje w dowolnym stanie), następnie MANAGER, następnie EMPLOYEE - Na własny rekord. Bycie miganym menedżerem podmiotu liczy się na własną rękę - kierownik linii zatwierdzający własne sprawozdanie jest zwykłym przypadkiem i nie powinien Potrzeba prawa całego org; prawo istnieje dla wszystkich innych, którzy recenzują. IsManagerOf nie powiedzie się: nierozwiązywalna linia raportowania nie jest autorytetem.
· kamo-shared-library
APPROVE_TIMECARD_ADJARMENTS (197) i FINALIZE_PAY_PERIODS (198) - Kto odpowiedział?
Podzielone tak, że separacja obowiązków jest wyraźna: kto zatwierdzi kartę czasową, nie Kto automatycznie może zamknąć nad nim okres płatniczy. MANAGE_TIMECARDS (183) - Kto żyje Pozostają bramą modułu i celowo nie są ani żadne z nich. Zapisy wciąż nie są prawem – jest to utrzymujący się fakt zatrudnienia. Prawo do pracy Przecieki przez cztery wysyłane zachowania i znikają z członka TERMINATED Dokładnie wtedy, gdy HR musi wyprodukować swoją ostatnią kartę czasu. Celowo nieobecny na NEW_RIGHT_SEEDS: który ma SZYBY DOSTAWY Do przodu, a te bramy zdolność, której nikt nie miał. Dodanie prawa wymaga tylko Uruchamianie SecurityService - brak przepustki KamoInitializer, bez DDL. Ids przypięty przez test, ponieważ id jest tym, co sejmowami member_rights_applied.
· kamo-shared-library
Maszyna stanowa poziomu homologacji
Pracownik składa -> menedżer zatwierdza -> zamknięcia płac, zgodnie z decyzją właściciela. Cztery zasady, egzekwowane w czystym stole przejściowym i przypięte przez 25 testów: 1. Menedżer NIE MOŻONY zatwierdzić do momentu złożenia przez pracownika. Zgłoszenie jest własne twierdzenie pracownika, że godziny są ich i pełne; Zatwierdzenie bez jego nie zatwierdza niczego, cokolwiek, o czym nikt nie został poświadczony. 2. Zatwierdzenie menedżera LOCKS pracownik z dalszych edycji. 3. Menedżer może działać w imieniu – przedłożyć lub zatwierdzić – i to jest jedyne Zawarta droga po przeliczeniu 1. Wymaga pisemnego powodu, a wiersz Rejestruje zarówno menedżera, który kliknął, jak i za którym stał pracownik. 4. Payroll może edytować w każdym stanie, w tym zablokowany, zawsze z powodu. Korekty po zamknięciu są rutynowe i wymagane prawnie; zabraniając im Po prostu przenosi edycję z ścieżki audytu. Segregacja obowiązków żyje w tabeli przejściowej, a nie w nazewnictwie: Nikt Zatwierdza własną kartę czasową, a menedżer jest również czyimś pracownikiem. Niezatwierdzenie kaskad od PAYROLL_LOCKED aż do SUBMITTED, ponieważ Wycofanie zgody unieważnia wbudowanego na nim zamka. Zatwierdzenia są szerzone do DATE RANGE, więc zatwierdzenie w połowie okresu przetrwa później Edycja poza zakresem, zamiast po cichu pokrywać pracę, której nigdy nie widziała.
· kamo-internal
Zakładka Karta Czasu Członkowskiego i zakładka Ustawienia kart HRS
Zakładka członkowska to JEDNEJ-SERWISY TYLKO i zamykana na tożsamość, dokładnie tak: Zgodność prawna: jego punkty końcowe nie biorą w ogóle identyfikatora członka, więc jest to strukturalnie Niezdolny do pokazywania cudzych godzin. czek Prawność nie ma tu sensu - to Odniesienia są prawdziwe dla wszystkiego w trybie bogu, a strona jest prawdziwa Czy możnaViewOtherMemberAcount OR w niezwiązanych z tym prawach HR docierający do karty czasowej konkretnej osoby jest Inna powierzchnia przy /hr/attendance, przypisana aktorowi HR. Umieszczony przed planami-rozliczenie, aby pozostać w grupie lewej zakładki - wszystko po Odziedzicza tę zakładkę alignRight ml:'auto'. Strona HRS zyskuje swoją pierwszą prawdziwą kartę obok ComingSoonTab, zarejestrowanej w SETTINGS_MENU, ponieważ test pokrycia wymaga w obu kierunkach. Obydwa tabs pad Same na każdej ścieżce powrotnej; SettingsView, TabPanel i ruch div wszystkie Podaż zero.
· kamo-internal
/hr/attendance i sterowanie zegarem NavTop
Zastępuje ciało uchwytu HrTabPlaceholder. Trasa, wpis HR_TABS, MANAGE_TIMECARDS Brama i tabu i18n kluczy już istniały; nic tutaj nie rejestruje niczego. Godziny składu pochodzą z serwera na boku od niezmiennego dziennika dziurknięcia na każdym odczyt Zamiast trzymać się jako całość biegową, więc poprawiony cios pokazuje natychmiast i Błąd raz daje nieprawidłową liczbę zamiast składania. Sterowanie zegarem jest stałe chrom obok Legal & Compliance, a nie NAV_REGISTRY wpis: rejestr nie może wyrazić pozycji między dwoma stałymi kontrolami, jego OdznakKey jest martwym kodem, a każdy wpis w rejestrze jest przeciągalny i nie do pokonania - Zegar zgodności nie może być czymś, co ktoś może ukryć przed samym sobą. Bramy na zapisie PERSISTED, nigdy nie sprawdzajRight, który zwraca się do niego Każdy odpowiedni w trybie bogu i pokazuje zegar w każdym org, operatorze Odwiedzione. TimecardControllies są dzielone przez kontrolę i jej sondaże, więc oba Idź spokojnie razem - dwie kopie tego predykatu dryfu, a tryb awaryjny to Ukryty przycisk, którego pobranie działa na zawsze. Stan zegara jest czwórką niezależnym sygnałem: nie obecność (60s heartbeat, 300s TTL), a nie dostępność_status, który jest automatycznie ustawiony do AWAY na zalogu i bramkach Ołów i wsparcie routingu. Sondaż tylko na razie z lat 60-tych. Przekaźnik STOMP ląduje z MediaService Zmiana; podstawowy NATS jest niestruzony i stratny, więc nasiona REST i tak są obowiązkowe.
· kamo-shared-library
Dostęp do zegara bazy danych w repozytorium stempla
Każdy punch instant pochodzi z DB, nigdy JVM: strąki restart i węzeł Zegary wykrzywiają się i rekord płacy, którego zamówienie zależy od tego, która kapsuła odpowiada Nie jest to rekord. SQL-standard CAST, ponieważ a: cast jest cicho zniekształcony -- Hibernate brzmi ":" jako prefiks o nazwieparametr i obraca się teraz()::timestamp w :timestamp.
· kamo-internal
Trasa BFF dla /api/security/timecards
TimecardService to ClusterIP bez wnikania, więc bez tej trasy całość Funkcja 404s w przeglądarce, podczas gdy każda usługa jest zdrowa i każda kompilka jest Zielony - dokładna awaria, która już dwukrotnie miała miejsce na tej platformie. Nie ma tu autoryzacji, celowo: ta warstwa jest transportem i pół-sprawdź Zaprosiłoby przekonanie, że jest to kontrola. forwardToApi jest właścicielem ciągu zapytania. 204 jest zwracany jako 204, a nie przechodzi przez .json(), który rzuca.
· SecurityService
przekaźnik SecurityService do TimecardService
- Na granicy autoryzacji. TimecardService przechowuje dane i silnik, ale nie Sesja; odbywa się sesja i decyduje, kto może co zrobić, a następnie przekaźnie. W tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym, w tym Silnik nigdy nie może być dostępny bez przechodzenia przez tędy. SecurityService uruchamia dowolną quest().wykonujAll() z ręcznie walcowanym na ręcznym auth, Tak więc każda metoda otwiera się od strażnika, który nie zwraca nienujenia, aby odmówić. Samoobsługa Punkty końcowe w ogóle NIE odbywają identyfikatora członka - członek pochodzi z sesji, tworząc Niezdolne strukturalnie do działania na kogoś innego. Brama punktów końcowych HR na MANAGE_TIMECARDS (183). Na rekrutację odpowiada ustawiony rząd zatrudnienia, a nie z prawa, więc Operator trybu boskiego nie pojawia się zapisany w każdym orgu, na który patrzy. SUDO_MEMBER_ID jest przenoszony przez: isSelf() upstream traktuje podszywanie się pod nią Sesja jako członek docelowy, więc bez niej uderzenie naśladowca byłoby Nagrane jako własne. Timecard.service.url jest ustawiony EXPLICITLY w configmap. prowizji.service.url Jest nigdzie ustawiony, a produkcja zależy od literalnej w Javie, którą Usługa Nazwa złamie się w czasie pracy z niczym w config to grep for.
· kamo-shared-library
Workday bucketing, etap 2 rurociągu
Rozwiązane interwały stają się sekundami na datę pracy, gotowe na alokator. Interwał to SPLIT na każdej granicy dnia pracy, który krzyżuje: zmiana o 22:00-06:00 W ciągu nocy w dzień roboczy jest 2 godziny na jeden dzień i 6 w następnym. Przypisywanie Cały okres do daty rozpoczęcia daje codzienne nadgodziny i regułę siódmego dnia Złe dla każdego pracownika nocnego. Jest to celowo DIERENTA przypisania ze strony firmyData utrzymująca się na Po uderzenie. Poncz niesie jedną datę - do oceny posiłków / restauracji, wyjątek Kolejka i to, co pracownik postrzega jako zmianę - podczas gdy nadgodziny liczą potrzeby godziny dzielone w ciągu dni roboczych i tygodni pracy, w których faktycznie się wpadli. Oba Są poprawne, oba są potrzebne, a wiązanie ich jest pułapką. Przejście przez granicę WORKWEEK również przyczynia się do dwóch tygodni. Całkowite sumy w godzinach nadliczbowych; liczenie tego wszystkiego w obu przypadkach jest złe dla obu. Gromaduje się w sekundach przez cały czas. Testy obejmują oba przejścia DST, 50-godzinne Rozpiętość i uderza end-to-end poprzez przydział na tydzień w Kalifornii.
· InitializerService
Rejestracja i migracja schematu KI
Tabele pochodzą z ddl-auto; ten biegacz dostarcza tylko to, czego Hibernate nie może... Częściowo unikalne indeksy przy jednym otwartym przydziale podstawowym i jednym otwartym oprocentowaniu Okno i REVOKE, który jest bazą danych, jest połową tylko dopłat. Nakaz(0), więc ląduje przed późniejszym JPA SELECT każdego biegacza, z repróbą 40001 Ponieważ Yugabyte zmienia schemat online i oświadczenie wydane podczas ddl-auto Nadal osiedla się przegrywa wyścig. Rejestruje com.kamo.z.shared.hr.timecard in .EnableJpezyre - ta lista Jest to tablica wyraźna, podczas gdy EntityScan jest dziką kartą i pominięciem pakietu Abortuje kontekst, więc żaden biegacz nie działa, podczas gdy budowa nadal informuje o sukcesie.
· kamo-shared-library
Tydzień pracy i granice dnia roboczego
Tygodnie pracy to jednostka nadgodzin FLSA - stała, regularnie powtarzająca się 168-godzinna Okres - i to nie jest okres wypłaty. Dwutygodniowy okres zawiera dokładnie dwa Tygodnia pracy; okres półmiesięczny lub miesięczny zawsze zawiera ułamkowe, więc Obliczanie nadgodzin w okresie całkowitym zarówno niedopłaca, jak i przepłacaniu i jest Nieustalowalne po wywozie okresów. Granica dnia pracy jest przenoszona oddzielnie i niekoniecznie jest północą. A A 06:00 start jest standardową poprawką dla personelu nocnego: utrzymuje się na zmianie 22:00-06:00 Jeden dzień pracy zamiast dzielić go na dwa pół dnia, co sprawia, że Codzienne nadgodziny i zasada siódmego dnia z dnia nacięcia pracy dla nich w ogóle. Granice to czasy zegara ściennego rozwiązywane za pośrednictwem ZonedDateTime, więc 06:00 pozostaje 06:00 w dzień 23- lub 25-godzinny. Testy przypinają oba przejścia i przypnij to Bodziąca chwila to inna randka biznesowa w Los Angeles i Kalkucie - dlatego Strefa rekordu jest utrzymywana na ciosie, a nie później.
· kamo-shared-library
Rozdzielczość interwałowa, etap 1 rurociągu obliczeniowego
Ciosy stają się rozwiązywane rozpiętości. Czyste, całkowite i ponad typy wartości, a nie Podmioty tak, że każdy etap jest sprawdzany, bez kontekstu trwałości. Czas trwania pochodzi z Duration. pomiędzy chwilami, nigdy nie odejmowaniem w zegarze. To jest cała historia DST, a testy przypinają ją: zmiana o 22:00-06:00 jest SEVEN godziny na wiosnę do przodu i dziewięć na opad. Odeczajanie zegarów ściennych oblicza 8 dla obu - jednego niedopłacania, jednego przepłacania, a w ciągu dnia W jurysdykcji 9-godzinna noc po cichu traci nadgodziny. Wszystko, co nie sparowalne, wraca jako nierozwiązane, a nie zgadywane. Niezamknięty Zmiana jest wyjątkiem: pozostawienie jej otwartej nabywach absurdalnych godzin, autozamykając w Planowane podranie raportowanie i stały cap wynalazł numer, którego nikt nie widział. Nigdy nie może sfinalizować się jako zero - to nie płaci nic za dzień, który został przepracowany. Posiłki są wykrawane, nigdy nie odprowadzane automatycznie. TRANSFER zamyka jedną przepiętność i otwiera Następny bez zakończenia zmiany, więc czas posiłku i kwalifikowalność długości zmiany Kontynuuj w połowie zmiany między centrami kosztów.
· kamo-shared-library
Niepirający arcykarota w nadgodzinach z predysjami jurysdykcyjnymi
Zasady to DANE dotyczące kształtu Reguł RequirementU używany już w tej bibliotece, a nie Kodowanie gałęzi, więc Kalifornia jest wierszem konfiguracji zamiast przepisu. Zamówienie alokacji jest nośnikiem: dzienne zasady najwyższej klasy (lata 13 godzin CA dzień wynosi 1 h na 2x i 4h przy 1,5x, a nie 5h przy 1,5x), a następnie siódmy Z rzędu, a następnie cotygodniowy NET godziny już z codzienną premią. Ten ostatni krok jest tym, co zapobiega piramidowaniu, a to jest jeden naiwny silnik. Omij. Pięć 10-godzinnych dni w Kalifornii to 10 godzin premium, a nie 20 - naiwny Silnik płaci codziennie i co tydzień przez te same dziesięć godzin i KAŻDEGO indywidualnego przepisu Test przechodzi, póki to robi. Alokator zapewnia również zachowanie godzin na Wyjście i rzuca, zamiast zwracać złą wypłatę. Ustawienia: FLSA federalny, Kalifornia, Alaska, Nevada, Kolorado.
· kamo-internal
Dostarcz org timezone do przeglądarki
Model organizacji klienta nie miał pola strefy czasowej, useFormatters i next-intl Oba są skonfigurowane bez timeZone, a TimezoneService backend połączenia 404'd - Tak więc co godzinę renderowane w strefie przeglądarki, a serwer jest podczas SSR. Ludzi wszystkie 27 wartości TimezoneType zamiast podzbioru: mapa częściowa jest Cichy pół-lustra, w której nieobjęty org wpada do strefy przeglądarki Nie ma sygnału. Mapy GMT do Europy / Londynu, a nie UTC - obserwuje BST, więc conpoflating Przeklęty cały dzień o godzinę przez pół roku. Strefa org jest tylko odwrotem DISPLAY. Spis produkcji znalazł wszystkie 13 orgs na Nietknięta domyślność PACIFIC, podczas gdy członkowie obejmują PACIFIC/EASTERN/ARIZONA/UTC/ INDIA, więc strefa rekordu karty czasowej pochodzi z miejsca pracy.
· SecurityService
GET .
timezoneService.ts nazwał ten punkt końcowy od czasu jego napisania i istniał Nie ma usługi Java; klient połknął 404 i postanowił do UTC. W międzyczasie UżywajFormatters i next-intl są skonfigurowane bez wymiany czasu, więc każdy Wytłaki znacznika czasu w strefie przeglądarki - a "opadek" to ciąg znaków "GMT", czyli Europa/Londyn i obserwuje BST. Tożsamość pochodzi tylko z sesji: SecurityService działa zezwoleniemAll with ręcznie walcowane na ręczne auth, więc opiekuna, który odczytuje tożsamość od żądania Nie ma żadnej kontroli. Zarejestruj się com.kamo.z.shared.hr.timecard w .EnableJpaRepositories. Ta lista jest Tablica wyraźna, podczas gdy „ComponentScan” są wildcard, a pominięcie Pakiet jest udokumentowaną przyczyną dwóch wcześniejszych rozmieszczenia CrashLooping.
· kamo-shared-library
WorkSite, kotwica jurysdykcłwina
Nazwany WorkSite, a nie WorkLocation: TeamMember. WorkLocation jest istniejący Biuro/zdalna enum i drugi symbol według tej nazwy zderzałyby się w każdym grepie. StrefaId jest darmowym strunem IANA, a nie TimezoneType, ponieważ ta enum's 27 Wartości nie mogą obejmować wielopaństwowego pracodawcy i nie jest to NULL, ponieważ jest to Tylko wiarygodna warstwa strefy - każdy org w produkcji znajduje się na nietkniętym PACIFIC domyślnie.
· kamo-shared-library
Zatrudnienie i efektywne zmiany w przydaniu
Wykrawanie będzie odnosić się do ASSIGNMENT, a nie członka. To właśnie tworzy Równocze pozycje, 29 CFR 778.115 wagowo regularnych stawek, Sejmia jurysdykcja wielona miejscu i kosztowanie pracy w ogóle są wyraźne. MenedżerMemberId jest migawkowany z TeamMember.manager w czasie rewizji, więc a więc Reorganizacja nie może przepisać, kto co zatwierdził. Wyszukiwarka składu celowo nie jest zbudowana na member_rights_applied: to zapytanie Jest przypisany przez TeamMember, więc pomija wszystkich właścicieli org i nie zwraca nic za Członek, którego prawa zostały odebrane – dokładnie osoba Czyja ostatnia karta czasu HR musi jeszcze wyprodukować.
· kamo-shared-library
Skuteczna, dodana stawka wynagrodzenia
Na tej platformie nie istniało żadne odszkodowanie dla pracowników poza tym podmiotem. Jest to wymagane: nadgodziny są obliczane w stosunku do regularnej stawki FLSA, wymaga CA Stawka na wyciągu płacowego i eksport bez stawek daje płacę Nie ma nic do konsumpcji. Podwyżką jest nowy ROW. Stawka efektywna w okresie eksportowym generuje Reakcyjne dostosowanie, nigdy ciche przeróbki. Nigdy nie narażonych przez /api/security/members/'id' -- ten punkt końcowy sprawdza się bez prawa na Wszystko, więc umieszczenie stawki w nim wyciekłoby każdą pensję w firmie.
· kamo-shared-library
Wydarzenie dziennika i audytu tylko do Appendly
Obydwa obsługiwane przez interfejsy repozytorium NARROW, a nie JpaRepozytorium: deleteAllInBatch I masowe połączenia jednostki JPQL zmiksowane, więc kształt interfejsu jest tym, co tworzy Dodać tylko rzeczywiste niż doradztwo. Natychmiastowa + strefa IANA + data biznesowa jest uspokojona, więc czas trwania jest obliczany Z natychmiastowych i DST jest poprawny za darmo - zmiana o 22:00-06:00 to 7 godzin Przez wiosnę do przodu i 9 przez upadek, podczas odejścia w zegarze ściennym Okomplikuje 8 dla obu. updatable-false jest celowo NIE używane na zamrożonych kolumnach stempla: Hibernacji Po cichu pominęliby je z AKTUALIZACJA, zamiast porażek.
· kamo-shared-library
Timezone-recordret
Strona pracy porządku władzy -> członek -> org -> UTC. Strona robocza wygrywa, ponieważ Zasady płac i godzin pracy są zgodne z miejscem pracy PERFORMED. Spis produkcji w tej sesji znalazł wszystkie 13 org na nietkniętym PACIFIC Domyślnie i 38 z 63 członków bez strefy czasowej, podczas gdy te zaludnione Obejrzymy PACIFIC, EASTERN, ARIZONA, UTC i INDIA - 13,5-godzinny spread. The org Niedomyślne jest zatem użytecznym źródłem prawdy, dlatego WorkSite.zoneId Nie jest NULL i nie ma wagi. Zwrot do UTC, a nie do łańcucha "GMT", który jest Europą / Londynem I obserwuje BST. Nieodłączne miejsce tonie przechodzi, a nie rzuca: Odmowa rozwiązania strefy odmówiłaby rejestrowania czasu faktycznie przepracowanego.
· kamo-shared-library
Wspólny strażnik odmowny WORM
"Kolumna (updateable-false) NIE egzekwuje niestabilności - Hibernate cicho Pominie kolumnę z AKTUALIZACJA, a nieświeże pisanie wygląda na to, że się udało. Jedyną pracującą strażą jest "PreUpdate, która rzuca".
· kamo-shared-library
Domain enums i point-in-time version resolver
Enums są wszystkie ’Enumerated(STRING) na stronie połączenia: ORDINAL emituje numeryczny Zakres zawierający i który SchemaCleanupRunner's IN-list sweep Celowo przeskakiwa, a które następnie muszą być poszerzone ręcznie na każdą nową wartość. Rozt. rozwiązaniem rozwiązuje się przez okno, które w chwili obecnej, nigdy przez Najnowszy rzęd, a okna zamykają zamknięte okna w zestawie kandydaci - supersesja zamyka się Każde okno z wyjątkiem bieżącego, więc zapytanie tylko otwarte nie zwraca nic dla Każda historyczna chwila, łamanie retro wynagrodzenia i rekonstrukcja audytu. Nakłada się na siebie Rzuca raczej niż zgadywać.
· kamo-internal
Pokaż członkom, którzy płacą za swoje miejsce, i przestań oferować drugą
Punkt końcowy pokrycia był dostarczany z kluczami do tłumaczenia i bez komponentu, więc Pytanie, na które odpowiada – kto płaci za moje miejsce – wciąż nie było gdzie zadawać. SeatCoveragePanel pyta o to, a odpowiedź zasila panel samopłatny obok: Ktoś, kogo miejsce jest już objęte przez ich organizację lub grupę, nie jest Dłużej oferował możliwość zakupu innego na własnej karcie. Ta oferta nie miała Znajomość istniejącego zasięgu w ogóle, więc została pokazana wszystkim. Plan grupy można również anulować teraz, co sprawia, że grupa z Plan można go usunąć - usunięcie takiego, który wciąż wskazuje na subskrypcję na żywo, jest Odmowa, więc zarzut nie jest osierocony. Dodanie kogoś, za kogo organizacja już płaci, wraca, a nie odmówi. Po cichu nic nie robiąc, więc przycisk wyjaśnia sam.
· BillingService
Niech plan grupy zostanie anulowany i przestań płatować podwójnie za jedną osobę
Trzy luki w tym, co zostało wysłane: Grupa z planem nigdy nie może zostać usunięta. delete() odmawia podczas zamieszkania Subskrypcja istnieje - poprawne, ponieważ wiersz grupy jest jedyną rzeczą, która wskazuje na Subskrypcja Stripe - ale nie było sposobu na anulowanie, więc zabezpieczenie było ślepy zaułka. cancelPlan() zwalnia najpierw miejsca, więc skład nie może trwać Twierdzenie, że ludzie mają miejsca, które już nie istnieją. Dodanie kogoś, dla kogo organizacja już kupuje miejsce, jest teraz odrzucane, chyba że OdZDG mówi inaczej. To drugi sposób, w jaki należy oskarżyć dwa razy. Pojedyncza osoba i nic go nie złapali: unikalne dla subskrypcji Na subskrypcję i AccountLicense deklaruje brak w ogóle. Przenieś kogoś od Ustawa organizacji na grupę jest prawdziwą rzeczą, którą robi menedżer, więc Dozwolone – celowo, a nie przez przypadek. BillingGroupScopeInterceptor wiąże każdy /api/billing/groups/-uuid? request Do organizacji dzwoniącza. Opiekuńcy już sprawdzają, a to nie Zastąp je; istnieje, ponieważ te kontrole są na rękojmię, a grupa ma teraz Podzasoby, które wydają pieniądze. Następna droga dodana nic nie dziedziczy, chyba że Coś powyżej stosuje regułę. Celowo węższe od obsługi: To rozstrzyga, która organizacja, a nie kto w jej obrębie może działać, więc obaj nie mogą Wpadamy w nie zgadzające się odpowiedzi. Nieznana grupa id przechodzi przez tak Kierownik odpowiada "nie znaleziony", zamiast potwierdzić, że id istnieje gdzieś.
· kamo-internal
Grupa, na którą możesz włożyć ludzi i zapłacić za
Tworzenie grupy wytworzyło nazwę i nic więcej – nie ma sposobu, aby dodawać kogokolwiek, nie ma mowy Za menedżera wybrać plan, nie ma nic do zapłacenia. Otwarcie grupy pokazuje teraz, kto Płaci, kto na nim jest, kto wciąż czeka na miejsce, a plan kontroluje to. Kup te miejsca. Stworzenie jednego pyta, kto płaci, za pomocą kanonicznego zbieracza członków. Kiedyś wysyłał Konto organizacji uid, i właśnie dlatego każda grupa została obciążona Organizacja; płatnik jest teraz rozwiązany z serwerem od menedżera i KontoUid w ogóle nie jest już na drutach. W składzie wyróżnia się siedzeniem od czekania na niego. Menedżer, który stawia Osiem osób na pięciu miejscach mówi się, że trzem kolegom nie ma dostępu, a nie Dowiedziać się od nich.
· BillingService
Spraw, aby grupy rozliczeniowe działały na koniec i przestań za darmo za darmo za nic
Grupa może teraz gromadzić ludzi, kupować plan na własnej karcie swojego menedżera i ręcznie - Na zewnątrz. Nic z tego nie istniało: jedyne operacje były tworzone, aprobujące i usunąć, więc właściciel, który stworzył grupę, dostał etykietę i nie ma możliwości jej użycia. BillingGroupSeatService to miejsce, w którym pieniądze są wydawane, przechowywane Poza rejestrowaniem, więc nie można dodać nowej trasy, która przeskakiwała bramy. Subtad() odrzuca przed create() jest nazywany raczej niż po, ponieważ create() Otwiera subskrypcję na żywo Stripe — niezatwierdzona grupa, spuścizna, menedżer Bez karty lub nasadki siedzenia wszystko zatrzymuje się. Dwie wady sprawiły, że grupa uznała niewłaściwą osobę: - Płatnik był jakimkolwiek kontemUid, który organ żądający o nazwie, niesprawdzony, i Konsola wysłała organizację. Grupa rozliczana organizacji nie jest Grupa rozliczeniowa; jest to druga nazwa własnej subskrypcji organizacji. Płatnik jest teraz wywodzący się od menedżera i obaj są dochodzeniowi, aby się zgodzić Zanim cokolwiek zostanie naliczone. Wysyłanie accountUid jest odrzucane wprost. - gwar]KonfliktMamber ponownie wykorzystuje najstarszy link członkini członka, dla którego Każdy, kto kiedykolwiek został dodany do konta organizacji, jest kontem organizacji. Upewnij się, żePersonalAccountForMember identyfikuje się przez pierwotnego Członka, który jest Jedyne pole, które mówi, że konto należy do osoby. Tam, gdzie właściciel zarządza własną grupą, "swoją kartą" i "organizacją" Karta" jest naprawdę tym samym wierszem konta i tym samym klientem Stripe, i nie Kod może je rozróżnić. Odmawia się to, chyba że zostanie to potwierdzone, a nie papierowane. Nad koniec. Oddzielnie, dwa żywe robaki znalezione tutaj: - /self/seat obciążył członka i nigdy nie wydał mu miejsca. Nazywa się create() I zwrócono; nie było żadnego wiersza Subskrypcji i nie było AccountLicense, więc Kupujący pozostał nielicencjonowany, podczas gdy ich karta była rozliczana co miesiąc. - Transakcyjne w AccountBillingService dryfowało na metodę prywatną, więc Wiosna zignorowała to i zapewnia, żeAccountForMember działa bez żadnej transakcji. A A (t) Awaria między dwoma oszczędnościami osierocony Konto, następna odsłona nie mogła Zobacz, a następujące wezwanie stworzyło drugie. /self/coverage to nowe: odpowiada "kto płaci za moje miejsce", co nic nie zrobił. To również powstrzymuje kogoś już zakrytego, oferowanie drugiego miejsca na Własna karta.
· InitializerService
Schemat dla grup, które faktycznie mogą zapłacić
Trzech biegaczy: BillingGroupRosterMigration tworzy billing_pay_group_members — kogo grupa oznacza za to, że zanim cokolwiek kupi. org_id jest na to denormalizowany Tak więc baza danych może egzekwować "członek jest w większości jednej aktywnej grupy rozliczeniowej na osobę Organizacja" jako częściowa unikalna. Dwie grupy płacące za jedną osobę to dwie Zarzuty za jedno miejsce, a nic innego w schemacie by go nie złapało: Unikat unikalnych subskrypcji są w przypadku subskrypcji, a AccountLicense nie ma żadnego. Dodaje billing_group_uid do account_subscriptions I zastępuje trzykolumn unikalny dwoma częściowymi unikalnymi. Poszerzenie go do Cztery kolumny nie zadziałałyby - NULL są tutaj odrębne w unikalnym indeksie, więc Każdy niegrupowy rząd przestałby być ograniczony. BillingPayGroupColumration dodaje market_id, seat_limit i status oraz znamion Istniejące grupy LEGACY. Zostały one obciążone na każde konto, które jest zgodne z prośbą Ciało przenoszone, a konsola wysłała organizację, więc ich account_uid jest Prawie na pewno źle. Nie ma bezpiecznego sposobu, aby zgadnąć, która karta była przeznaczona, i Odgadywanie błędnych rachunków niewłaściwą osobę, więc odmawia się im w punkcie zarzutu Zamiast naprawiać. Pierwsza runda pokazała, dlaczego ponowne wykonanie ma znaczenie: oba indeksy zastępcze nie powiodły się 40001 nie mógł serializować dostępu, biegacz zarejestrował "pominięty" i kontynuował, oraz DROP starego przymusu odniósł sukces – pozostawiając account_subscriptions Bez żadnej wyjątkowości, co jest surowo gorsze niż kolizja, która to rozwiązuje. Oświadczenia DDL ponownie próbują awarii serializacji, a spadek jest pomijany Całkowicie, chyba że oba zamienniki są potwierdzone.

Twój wszechświat czeka.
Rozpocznij bezpłatnie w kilka minut.Dodaj produkty, kiedy tylko będziesz gotowy — bez migracji, bez nowych logowań.
Bezpłatne na zawsze — nie wymaga karty kredytowej