Changelog
Was ist neu?
Jede Verbesserung an der Plattform, wie sie geliefert wird.
· kamo-shared-library
Gehaltsperioden, Pausen, Prämien, Arbeitskonten, Perioden, Export
Batches die verbleibenden Lohn-und-Stunden-Schema in eine Shared-Blib-Änderung so die ganze Domain landet in einem einzigen KamoInitializer Lauf statt einer Migration pro Phase. Entities: Bezahlfristen mit Regel-Version Freeze-Säden, Verdienstlinien, Pause Regeln und Verstöße, Arbeitskonten und Arbeitsbereiche, Periodenrechnungen, Salbe und Ledger, Austrittsfälle, Exportchargen, Anwesenheitsvorfälle. Vier reine Motoren, 51 Tests: BreakEvaluator - nie automatisch absaugt ein Mittagessen, weil eine Auto-abgeführte Mahlzeit bucht eine unbezahlte halbe Stunde, die der Arbeitgeber nicht nachweisen kann, war zollfrei. Prämien sind WAGES (Naranjo), so dass sie in die Erträge fließen und nicht in einen Bericht. Eins Prämie pro KATEGORY pro Tag (UPS v. Oberstes Gericht): zwei verpasste Mahlzeiten schulden ein, eine verpasste Mahlzeit plus eine verpasste Ruhe schulden zwei. Ein Essensverzicht wird nur eingehalten wenn die Satzung einen erlaubt - kann ein Arbeitnehmer nicht außerhalb zustimmen. Reste sind ungestanzt, so Schweigen auf Bescheinigung wird nie als Verletzung erzielt. RegularRateRechner - Überstunden werden auf der REGULAR-Rate geschuldet, nicht die Basis Rate. 778.115 gewichteter Durchschnitt, 7788.209 rückwirkende Überstunden auf nichtdiskretionäre Boni, 778.216/218 Ausschlüsse und die Halbzeitprämie: Die Zeit ist bereits in der Gesamtzeit, so dass Überstunden hinzufügen 0.5x, nicht 1,5x. AccrualEngine - eine Decke stoppt accrual ohne Delet Balance, Gedeckelt getrennt von der Decke, und ein Abzug, der den Boden brechen würde wirft, anstatt still einen halben Tag frei zu genehmigen. PayPeriodCalendar generiert, nicht von Hand eingegeben, und überprüfenWeitere Verweigerungen eine Lücke (Arbeit, die zu keinem Zeitraum gehört, nie bezahlt wird) oder eine Überschneidung (zweimal bezahlt).
· kamo-shared-library
Ausnahmemodell und Detektor
Macht das BlockingExceptions-Tor real. Bisher lautete die Übergangstabelle zählen, dass nichts geschrieben, so dass jede Zeitkarte sah sauber und "eine fehlende Punsch ist nie als Null bezahlt ' war ein Kommentar und nicht eine Kontrolle. Die BLOCKING-Unterscheidung ist der ganze Punkt der Taxonomie: eine offene Verschiebung, ein unpairable Punch und eine ungeprüfte vorläufige Punch Stop Fertigstellung, weil Das Schließen über ihnen behauptet etwas, hinter dem niemand stehen kann. Ein Geofence-Fehlschuss und eine Taktung sind ADVISORY und blockieren nie -- die Weigerung, die Zeit aufzuzeichnen oder abzuschließen die tatsächlich gearbeitet wurde, ist die genaue Lohnverletzung, die dieses System verhindert. Der Detektor meldet und repariert nie. Jede Art, eine nicht geschlossene Schicht zu erraten ist falsch: es offen zu lassen, bringt absurde Stunden, Auto-Schließung zu wenig Berichte, eine Obergrenze erfindet eine Figur, die niemand gesehen hat. So wird es stattdessen eine Ausnahme. Idempotent durch Konstruktion über die einzigartige (Mitglied, Datum, Typ) Einschränkung -- Duplikate würden die Anzahl aufblasen und eine Zeitkarte aus einem Grund unefindlich machen Niemand konnte finden.
· kamo-internal
Bestätigen Sie vor dem Stopp einer wiederkehrenden Zahlung
Beide stornieren Aktionen - ein Mitglied eigenen Sitz und ein Gruppenmanager Plan - jetzt fragen zuerst, die Benennung der Datumsabdeckung läuft und, für eine Gruppe, wie viele Menschen halten ihre Sitze bis dahin. Bewusst nicht das gemeinsame ConfirmationDialog. Dass man DESTROY eingeben muss, DELETE, REMOVE oder ERASE bevor der Button aktiviert ist, was für die irreversible Deletions wurde es gebaut. Abbruch ist weder irreversibel noch destruktiv: keine Daten gehen verloren, der Zugriff bleibt bis zum Ende der bezahlten Frist und Sie können sich jederzeit wieder abonnieren. Ein Typ-the-Wort-Spaglet vor Eine Zahlung zu stoppen ist Reibung auf die eine Aktion ein Kunde ist eindeutig berechtigt, leicht zu nehmen. Keiner der beiden Buttons sagt "Abbrechen". In einem Dialog über das Abbrechen bedeutet dieses Wort beides "Verzicht auf diesen Dialog" und "Abruf für mein Abonnement" und kann nicht zuverlässig gelesen werden entweder, so dass beide Buttons ihr Ergebnis nennen: "Keep my plan" und "Stop Future Zahlungen".
· BillingService
Tragen Sie den Erneuerungstermin auf der Abdeckung und Gruppen-Nläge
Beide Oberflächen melden nun aktuellPeriodEnd und cancelAtPeriodEnd. Das Datum ist, was eine Stornierungsbestätigung muss eigentlich sagen: "Sie behalten Ihren Sitz bis zum Ende der Periode" ist Beruhigung in der Zusammenfassung, "Sie halten Ihren Sitz bis zum 14. März" ist Beruhigung jemand kann handeln.
· kamo-internal
Erzählen Sie den Leuten, wenn eine Rechnung sie braucht, und lassen Sie sie aufhören zu zahlen
Ein Banner auf der Startseite, wenn eine Zahlung dieser Person verantwortlich ist für gescheitert, Links direkt auf ihre Abrechnung Seite. Bisher eine fehlgeschlagene Zahlung zeigte sich nur als Apps, die nicht mehr geöffnet - Einschränkung ohne Erklärung, die sich als kaputte Software und nicht als unbezahlte Rechnung liest. Nur für Rechnungen, auf die sie eingreifen können: ihren eigenen Sitz und Gruppen, die sie verwalten. Es macht nichts, wenn nichts geschuldet ist. Abbrechen ist jetzt sichtbar, wo die Person sehen kann, wer zahlt: ein "Automatik abbrechen Zahlungen "Aktion auf ihrem eigenen Sitz, mit Hilfe Text deutlich, dass sie Halten Sie den Sitzplatz bis zum Ende der Zeit, für die sie bereits bezahlt haben. Die Bestätigung benennt das Datum, weil die Angst beim Drücken dieser Taste ist, dass Der Zugriff stoppt sofort. Der Wechsel "Lasst Selbstzahler ihren eigenen Plan wählen" ist weg. Der Plan gehört zu die Organisation und jeder, der in ihr bezahlt - einzeln oder als Gruppe . kauft den gleichen Plan. Das Gruppenpanel stellt nun den Plan der Organisation fest als einen Picker anzubieten.
· BillingService
Ein Plan pro Organisation, eine 25-sitzige Enterprise-Obergrenze und eine Möglichkeit, nicht mehr zu zahlen
Der Plan ist jetzt eine Entscheidung auf Organisationsebene und nichts anderes kann ihn außer Kraft setzen. Einen Selbstzahler oder einen Gruppenmanager ihre eigenen auswählen zu lassen, liest sich wie eine Freundlichkeit und ist ein Fehler der Korrektheit: ************ antwortet "macht dies oder haben diese App" durch OR-ing über jedes Live-Abonnement auf die org, so dass man Person auf einem Sitz Wahl eines höheren Plans geschaltet, dass die Apps des Plans auf für die gesamte Organisation. Pinning jeden Zahler auf den Plan der Organisation macht, dass ODER harmlos - die Abonnements alle Namen der gleichen Plan, so dass, was gewinnt Antworten identisch. OrgPlanService liest den Plan aus dem gleichen Abonnement die Pläne & Billing-Konsole ruft "Ihr Plan", so dass die Regel und der Bildschirm nicht widersprechen kann. Enterprise ist über 25 Sitze erforderlich, gezählt in der gesamten Organisation und jeder Abrechnungsgruppe. Zählen pro Zahler hätte die Aufteilung in Gruppen zu einer Möglichkeit gemacht, kaufen fünfzig Sitze fünfundzwanzig auf einmal. Eine Bearbeitung schließt ein eigenes Abonnement so aus Schrumpfen wird an der neuen Größe gemessen, nicht an der alten. GET /self/alert fährt ein Home-Page-Banner. Eingeschränkter Zugriff ohne Erklärung ist die schlechteste Version dieses Produkts - Apps nicht mehr öffnen und niemand sagt, warum, oder dass die Person, die liest, derjenige ist, der es reparieren kann. Nur für Rechnungen erhoben diese Mitglied ist verantwortlich für: ihren eigenen Sitz und Gruppen, die sie verwalten. Jemanden erzählen Die Karte ihrer Organisation versagt, wenn sie es nicht bezahlen können, ist Lärm, und Lärm ist wie Banner nicht mehr gelesen werden. POST /self/seat/storniert die automatische Zahlung auf einem Sitzplatz, den jemand gekauft hat sich selbst. Immer am Ende des Zeitraums: Sie haben für die laufende Periode bezahlt und Sofort zu stornieren würde diesen Zugang wegnehmen, während nichts zurückerstatten, da dieser Weg verlangt von Stripe keine Proration. Zwei Fehler in cancel() gefunden, während der Verkabelung, dass: - Es war ein stilles No-Op für COMP und TRIAL. Der ganze Körper sitzt hinter einem stripeSubscriptionId null Check, so dass ein Comped oder Testing-Abonnement zurückgegeben 200 mit der Zeile noch ACTIVE - der Anrufer sagte, es funktionierte, wenn sich nichts änderte. Sie weigert sich jetzt und sagt, warum. - umgehend=true bleibt gefährlich und wird absichtlich nicht exponiert: es setzt CANCELED ruft dann FallbackToFree auf, das ACTIVE/FREE mit SitzZT 1 setzt, so eine 25-sitzige Org würde eine arbeitende Person halten und sagen, 24 ihr Sitz wurde für geschnitten eine Sitzzählung Grund, der nie passiert ist. reistlement.fail-open ist hier falsch gesetzt, um SecurityService, die dient /api/security/features und ist das, was die Apps & Features Bildschirm liest. Zwei Dienste Die gleiche Anspruchsfrage anders zu beantworten, ist schlimmer als jede Antwort. Geprüfter Safe: Alle sechs aktiven Pläne tragen eine explizite Reihe für alle 21 Dienste Typen, so dass nichts zuvor gewährt wird verweigert.
· SecurityService
Genehmigungs-Tier-Relay mit Rolle aus Rechten gelöst
THE ROLE IS DECIDED HIER, von den Rechten des Anrufers und ihrem Verhältnis zum Betreff -- nie von der Antragsstelle. Ein Gremium, das seine eigene Rolle benennen könnte würde jeder behaupten, Gehaltsabrechnung zu sein. Präzedenz: PAYROLL (breiterste, redigiert in jedem Zustand), dann MANAGER, dann EMPLOYEE für die eigene Platte. Als der Schnappschuss des Subjekts Manager zählt auf seine eigene -- ein Linienmanager, der seinen eigenen Bericht genehmigt, ist der gewöhnliche Fall und sollte nicht brauchen eine org-weite Recht; das Recht existiert für alle anderen, die Bewertungen. isManagerOf scheitert CLOSED: eine unauflösbare Meldezeile ist keine Autorität.
· kamo-shared-library
APPROVE_TIMECARD_ADJUSTMENTS (197) und FINALIZE_PAY_PERIODS (198)
Aufteilung der Aufgaben ist ausdrücklich: Wer eine Zeitkarte genehmigt, ist nicht automatisch, wer eine Gehaltsfrist darüber abschließen kann. MANAGE_TIMECARDS (183) bleibt das Modul-Gate und ist absichtlich weder. Die Einschreibung ist immer noch KEIN Recht - es ist eine anhaltende Beschäftigungsfakt. Ein Recht Leaks ON durch vier ausgelieferte Verhaltensweisen und verschwindet von einem TERMINATED Mitglied genau dann, wenn HR seine endgültige Zeitkarte vorlegen muss. Bewusst abwesend von NEW_RIGHT_SEEDS: Das trägt ein EXISTING Gran vorwärts, und diese Tor eine Fähigkeit, die niemand hatte. Das Hinzufügen eines Rechts braucht nur ein SecurityService Neustart -- kein KamoInitializer-Pass, kein DDL. Ids durch einen Test angeheftet, weil die ID ist, was member_rights_applied speichert.
· kamo-shared-library
Die Genehmigungsstufen-Staat-Maschine
Mitarbeiter reicht ein --Manager genehmigt -" Gehaltsabrechnung schließt, nach der Entscheidung des Eigentümers. Vier Regeln, die in einem reinen Übergangstisch durchgesetzt und durch 25 Tests angeheftet wurden: 1. Ein Manager kann nicht zustimmen, bis der Mitarbeiter eingereicht hat. Die Vorlage ist die eigene Behauptung des Arbeitnehmers, dass die Stunden ihnen gehören und vollständig; Die Genehmigung ohne sie genehmigt nichts, was jemand bezeugt. 2. Manager-Zulassung LOCKS der Mitarbeiter aus weiteren Bearbeitungen. 3. Ein Manager MAY handeln im Namen -- vorlegen oder genehmigen -- und das ist das einzige sanktionierte Route an Regel 1 vorbei. Es erfordert einen schriftlichen Grund, und die Zeile zeichnet sowohl den Manager auf, der klickte, als auch der Mitarbeiter. 4. Payroll kann in jedem Staat einschließlich gesperrt bearbeiten, immer mit einem Grund. Korrekturen nach Schließung sind Routine und gesetzlich vorgeschrieben; verbieten sie verschiebt einfach die Bearbeitung aus dem Audit-Trail heraus. Segregation der Aufgaben lebt in der Übergangstabelle, nicht in der Rolle Benennung: niemand genehmigt ihre eigene Zeitkarte, und ein Manager ist auch jemandes Mitarbeiter. Nicht zustimmende Kaskaden von PAYROLL_LOCKED bis SUBMITTED, weil Der Entzug einer Genehmigung macht die darauf errichtete Sperre ungültig. Genehmigungen sind auf eine DATE RANGE ausgerichtet, so dass eine Mid-Periode Genehmigung überlebt eine spätere bearbeiten Sie außerhalb ihres Umfangs, anstatt die Arbeit still abzudecken, die sie nie gesehen haben.
· kamo-internal
Mitglied Timecard Tab und die Registerkarte HRS Timecards Einstellungen
Der Reiter ist SELF-SERVICE NUR und abgesperrt auf Identität, genau wie Legal-Compliance: seine Endpunkte nehmen keine Mitglieder-ID überhaupt, so ist es strukturell unfähig, die Stunden eines anderen zu zeigen. checkRecht ist hier unbliebbar -- es kehrt für alles unter Gott-Modus wahr, und die Seite ist selbst kannAn anderer MitgliederAccount ODER in unzusammenhängenden Rechten einschließlich **************** HR, der die Zeitkarte einer bestimmten Person erreicht ist eine andere Oberfläche bei /hr/Besuch, die dem HR-Akteur zugeschrieben wird. Platziert vor Pläne-Billing, so bleibt es in der linken Registerkarte Gruppe -- alles nach es erbt, dass Registerkarte alignRight ml: 'Auto'. Die HRS-Seite gewinnt seine erste echte Registerkarte neben dem ComingSoonTab, registriert in SETTINGS_MENU als Abdeckung Test erfordert in beide Richtungen. Beide Tabs Pad sich auf jedem Rückweg; EinstellungenAnsicht, TabPanel und die Bewegung div alle Angebot Null.
· kamo-internal
/hr/betreuen Dienstplan und die NavTop-Uhrsteuerung
Ersetzen Sie die HrTabPlaceholder Körper. Die Route, HR_TABS Eintrag, MANAGE_TIMECARDS Gate und Tab i18n Schlüssel alle existierten bereits; nichts hier registriert etwas. Roster-Stunden werden Server-Seite aus dem unveränderlichen Punch-Log auf jeder gelesen abgeleitet anstatt als laufende Summe gehalten, so dass ein korrigierter Punch zeigt sofort und ein Fehler produziert eine falsche Zahl einmal anstelle von Compoundieren. Die Taktsteuerung ist neben Legal & Compliance Chrom fixiert, kein NAV_REGISTRY Eintrag: die Registrierung kann keine Position zwischen zwei festen Kontrollen ausdrücken, badgeKey ist Dead Code, und jeder Registry-Eintrag ist Draggable und unpinnable -- Eine Compliance-Uhr darf nicht etwas sein, das jemand vor sich selbst verstecken kann. Es Gates auf der PERSISTED Einschreibung, nie checkRecht, die zurückkehrt für jedes Recht unter dem Gott-Modus und würde eine Uhr in jedem org ein Operator zeigen besucht. timecardControlApplies wird von der Steuerung und ihrer Umfrage geteilt, so dass beide gehen Sie ruhig zusammen -- zwei Kopien dieses Prädikats Drift, und der Ausfall-Modus ist eine versteckte Taste, deren Fetch für immer läuft. Uhrzustand ist ein VIERES unabhängiges Signal: nicht Präsenz (60er Herzschlag, 300er TTL) und nicht available_status, das automatisch auf AWAY bei Logout und Gates gesetzt wird führen und unterstützen Routing. Umfrage-nur für jetzt mit einem 60er-Etage-Etage. Das STOMP Relais landet beim MediaService ändern; Kern NATS ist ungestreamt und verlustig, so dass das REST-Saatgut ohnehin obligatorisch ist.
· kamo-shared-library
Datenbank-Uhr-Accessor auf dem Punch-Repository
Jeder Punsch-Instanz kommt von der DB, nie die JVM: Pods neu starten und Knoten Uhren verzerren, und eine Lohn-Rekord, deren Bestellung hängt davon ab, welche pod beantwortet ist kein Rekord. SQL-Standard CAST, weil ein ::- Cast ist still verstümmelt -- Hibernate liest ':' als Name-Parameter-Präfix und verwandelt sich jetzt():: Zeitstempel in :timestamp.
· kamo-internal
BFF-Route für /api/security/timecards
TimecardService ist ClusterIP ohne Ein-Eingriff, also ohne diese Route das Ganze Feature 404s im Browser, während jeder Service ist gesund und jeder Build ist grün -- der genaue Fehler, der bereits zweimal auf dieser Plattform passiert ist. Keine Genehmigung hier, absichtlich: diese Schicht ist Transport, und eine halbe Kontrolle würde den Glauben einladen, dass es eine Kontrolle ist. forwardToApi besitzt die Abfrage-String. Eine 204 wird als 204 zurückgegeben, anstatt durch .json() gereicht zu werden, das wirft.
· SecurityService
SecurityService Relais zu TimecardService
Die Genehmigungsgrenze. TimecardService hält die Daten und die Engine, aber keine Sitzung; dies hält die Sitzung und entscheidet, wer was tun darf, dann Relais. Die Motor kann daher nie erreicht werden, ohne hier durchzufahren. SecurityService betreibt anyRequest().permitAll() mit handgerollter Person pro Handler, so öffnet sich jede Methode mit einem Wächter, der nicht-null zurückkehrt, um zu verweigern. Selbstbedienung endpoints nehmen KEINE Mitglieder-ID überhaupt -- das Mitglied kommt von der Sitzung, machen sie strukturell unfähig, auf jemand anderen zu handeln. HR-Endpunkte Tor auf MANAGE_TIMECARDS (183). Die Einschreibung wird von der anhaltenden Beschäftigungsreihe statt eines Rechts beantwortet, so ein God-Mode-Operator erscheint nicht in jedem Org, den sie sich ansehen, eingeschrieben. SUDO_MEMBER_ID wird durchgeführt: isSelf() upstream behandelt eine imitierte Sitzung als Zielmitglied, so dass ohne sie ein Imitator Punch wäre als der Mitarbeiter selbst aufgezeichnet. timecard.service.url ist EXPLICITLY in der configmap gesetzt. commission.service.url ist nirgendwo gesetzt und die Produktion hängt von einem wörtlichen in Java, die ein Service Umbenennen würde bei der Laufzeit mit nichts in der Konfiguration zu grep für brechen.
· kamo-shared-library
Arbeitstag Eimering, Stufe 2 der Pipeline
Aufgelöste Intervalle werden pro Business-Datum Sekunden, bereit für den Allokator. Ein Intervall ist SPLIT an jeder Werktagsgrenze, die es überschreitet: eine 22:00-06:00 Schicht unter einem Mitternachtsarbeitstag ist 2 Stunden auf einem Datum und 6 auf dem nächsten. Zuschreibung die ganze Spanne bis zu seinem Startdatum macht tägliche Überstunden und die siebte-Tage-Regel falsch für jeden Nachtarbeiter. Dies ist absichtlich eine DIFFERENT Zuordnung aus dem businessDate fortgesetzt auf der Punch. Der Stempel trägt ein Datum -- für Mahlzeit/Ruhebewertung, die Ausnahme Warteschlange und was der Arbeitnehmer als ihre Schicht sieht -- während Überstunden Zählen Bedürfnisse Stunden verteilt über die Arbeitstage und Arbeitswochen fielen sie tatsächlich in. Beide sind richtig, beides wird gebraucht, und sie zu vermischen ist die Falle. Eine Schicht, die die ARBEITWEEK-Grenze überschreitet, trägt ebenfalls zu zwei Wochen bei' Überstundensummen; alles in einem zu zählen, ist für beide falsch. Akkumuliert in Sekunden durchgehend. Tests decken beide DST-Übergänge ab, eine 50-Stunden-Übergänge Spanne, und Schläge Ende-zu-Ende durch Zuteilung für eine kalifornische Woche.
· InitializerService
KI-Registrierung und Schema-Migration
Die Tische kommen von ddl-auto; dieser Läufer liefert nur das, was Hibernate nicht kann -- die teilweisen eindeutigen Indizes auf einer offenen primären Zuordnung und einer offenen Bezahlung Fenster, und die REVOKE, die die Datenbank die Hälfte der Append-only ist. @Order(0) so landet es vor jedem späteren Läufer JPA SELECT, mit einem 40001 Retry weil Yugabyte Online-Schema ändern und eine Erklärung ausgestellt, während ddl-auto ist immer noch Settling verliert das Rennen. Registriert com.kamo.z.shared.hr.timecard in @EnableJpaRepositories -- diese Liste ist ein explizites Array, während @EntityScan eine Wildcard ist und ein Paket weggelassen wird. Abbrucht den Kontext so NO Läufer läuft, während der Build noch berichtet Erfolg.
· kamo-shared-library
Workweek und Arbeitstag Grenzen
Die Arbeitswoche ist die FLSA Überstunden-Einheit -- eine feste, regelmäßig wiederkehrende 168-Stunden Zeitraum -- und es ist nicht die Zahlungsfrist. Eine zweiwöchentliche Periode hält genau zwei Arbeitswochen; eine halbmonatliche oder monatliche Periode hält immer Bruchteile, so Rechen Überstunden auf einen Zeitraum insgesamt sowohl unterbezahlt und überbezahlt und ist unfixierbar, sobald Perioden exportiert werden. Die Arbeitstaggrenze wird separat getragen und ist nicht unbedingt Mitternacht. A 06:00 Start ist die Standard-Fix für Nachtpersonal: es hält eine 22:00-06:00 Schicht auf EIN Arbeitstag, anstatt ihn auf zwei Halbtage aufzuteilen, was das macht tägliche Überstunden und die siebte-consecutive-Day-Regel funktionieren für sie überhaupt. Grenzen sind Wand-Uhr-Zeiten durch ZonedDateTime gelöst, so 06:00 bleibt 06:00 Uhr an einem 23- oder 25-Stunden-Tag. Tests Pin beide Übergänge, und Pin, dass man Instant ist ein anderes Geschäftsdatum in Los Angeles und Kolkata -- deshalb die Zone der Aufzeichnung wird auf dem Stempel anstatt später abgeleitet beharrt.
· kamo-shared-library
Intervallauflösung, Stufe 1 der Berechnungspipeline
Punches werden Spannweiten gelöst. Reine, totale und überwertige Typen anstatt Entitäten, so dass jede Stufe ist fixture-prüfbar ohne Persistenz Kontext. Die Laufzeiten kommen von Dauer.zwischen auf Instants, nie Wand-Uhr-Subtraktion. Das ist die gesamte DST-Geschichte und die Tests heften sie: eine 22:00-06:00-Schicht ist SEVEN Stunden über Spring-Forward und NINE über Fall-Back. Abzug von Wanduhren berechnet 8 für beide -- eine unterbezahlt, eine überbezahlt, und in einer täglichen Überzeit Gerichtsbarkeit die 9-Stunden-Nacht still verliert seine Überstunden Stunde. Alles Ungehebehaftet kommt eher ungelöst als erraten zurück. Eine nicht geschlossen Schicht ist eine EXCEPTION: Sie offen zu lassen, entstehen absurde Stunden, automatische Schließung an einem geplante Ende-Berichte, und eine feste Kappe erfindet eine Zahl, die niemand gesehen hat. Es darf nie als Null enden - das zahlt nichts für einen Tag, der gearbeitet wurde. Die Mahlzeiten werden gelocht, nie automatisch abgezogen. TRANSFER schließt eine Spannweite und öffnet die Weiter, ohne die Verschiebung zu beenden, so Mahlzeit Timing und Schichtlänge Förderfähigkeit weiterhin eine Mitte der Schicht zwischen den Kostenstellen.
· kamo-shared-library
Nicht-Pyramiden Überstunden Allokator mit Zuständigkeit Vorsatz
Regeln sind DATA auf der RequirementRule-Form bereits in dieser Bibliothek verwendet, nicht Code-Filialen, so Kalifornien ist eine Konfigurationszeile statt einer Neufassung. Zuordnungsauftrag ist tragfähig: tägliche Regeln am höchsten Schwellenwert zuerst (eine 13-Stunden CA Tag ist 1h bei 2x und 4h bei 1,5x, nicht 5h bei 1,5x), dann der siebte aufeinander folgenden Tag, dann wöchentlich NET der Stunden bereits zu einem Tagesprämie. Dieser letzte Schritt ist, was Pyramiding verhindert, und es ist die eine naive Motoren Ausgelassen. Fünf 10-Stunden-Tage in Kalifornien ist 10 Premium-Stunden, nicht 20 -- eine naive Motor zahlt täglich UND wöchentlich für die gleichen zehn Stunden, und JEDE individuelle Regel Test besteht, während es tut. Der Allokator setzt auch Stundenschutz für sich durch Aus und wirft, anstatt einen falschen Gehaltsscheck zurückzugeben. Presets: FLSA Federal, California, Alaska, Nevada, Colorado.
· kamo-internal
Die Org-Zeitzone an den Browser liefern
Das Client Organisation Modell hatte kein Zeitzonenfeld, verwendenFormatters und next-intl sind beide ohne ZeitZone und der Backend-Aufruf von timezoneService 404'd -- konfiguriert. so jeder Zeitstempel in der Browser-Zone gerendert, und der Server ist während SSR. Spiegel alle 27 TimezoneType-Werte statt einer Untermenge: Eine Teilkarte ist ein stille Halbspiegel, wo eine unmapped org fällt durch die Browser-Zone mit kein Signal. GMT-Karten nach Europa/London, nicht UTC -- es beobachtet BST, so vermischen Sie verschieben einen ganzen Tag die Stunden um eine Stunde für die Hälfte des Jahres. Die Org-Zone ist nur ein DISPLAY Fallback. Eine Produktionszählung fand alle 13 orgs auf der unberührte PACIFIC-Verzug, während die Mitglieder PACIFIC/EASTERN/ARIZONA/UTC/ INDIEN, so dass die Zeitzone der Aufzeichnung kommt von der Baustelle statt.
· SecurityService
****************************************************************************************************************************************************************************************************************************************************************
timezoneService.ts hat diesen Endpunkt genannt, seit er geschrieben wurde und existierte in keinem Java-Dienst; der Client hat den 404 geschluckt und auf UTC aufgelöst. Inzwischen useFormatters und Next-intl sind beide ohne Zeit konfiguriert, so dass jeder Timestamp wies in der Browser-Zone -- und der *** Fallback ist der String 'GMT', das ist Europa/London und beobachtet BST. Identität kommt nur aus der Sitzung: SecurityService läuft permitAll mit handgerollt pro Handler auth, also ein Handler, der die Identität aus der Anfrage liest hat überhaupt keine Kontrolle. Registriert com.kamo.z.shared.hr.timecard in @EnableJpaRepositories. Diese Liste ist ein explizites Array, während @ComponentScan/@EntityScan eine Wildcard sind und ein Paket ist die dokumentierte Ursache für zwei vorherige CrashLooping-Einsatzungen.
· kamo-shared-library
WorkSite, der Gerichtsbarkeitsanker
Benannt WorkSite, nicht WorkLocation: TeamMember.workLocation ist eine bestehende office/remote enum und ein zweites Symbol mit diesem Namen würden in jedem Grep kollidieren. zoneId ist eine kostenlose IANA-Stringe statt TimezoneType, weil das enum 27 Werte können einen Multi-State-Arbeitgeber nicht abdecken, und es ist NICHT NULL, weil es die nur vertrauenswürdige Zonenschicht -- jeder Org in der Produktion sitzt auf der unberührten PACIFIC Standard.
· kamo-shared-library
Beschäftigungs- und effektive Zuweisungsrevisionen
Punches wird sich auf ein ASSIGNMENT beziehen, kein Mitglied. Das ist es, was macht Parallelpositionen, die 29 CFR 778.115 gewichtet-durchschnittliche reguläre Rate, Multi-Site-Gerichtsbarkeit und Jobkosten kostenintensibel überhaupt. managerMemberId ist von TeamMember.manager zur Revisionszeit so schnappt Reorganisation kann nicht neu schreiben, wer was genehmigt hat. Der Dienstplan-Enter ist absichtlich nicht auf member_rights_applied gebaut: diese Abfrage ist TeamMember-typed, so dass es auslässt Grant-all org Besitzer und gibt nichts für eine TERMINATED-Mitglied, dessen angewandte Rechte beraubt wurden -- genau die Person deren letzte Zeitkarte HR noch zu produzieren hat.
· kamo-shared-library
Effektive, anhende Bezahlung
Vor diesem Unternehmen gab es nirgendwo auf dieser Plattform eine Mitarbeiterentschädigung. Es wird benötigt: Überstunden werden gegen den regulären FLSA-Rate berechnet, CA verlangt der Satz auf der Lohnrechnung, und ein Export ohne Tarife gibt Lohnabrechnung nichts zu konsumieren. Eine Erhöhung ist ein NEUER ROW. Eine Rate, die innerhalb eines exportierten Zeitraums wirksam ist, erzeugt Retro-Anpassung, nie eine stille Neufassung. Nie ausgesetzt über /api/security/members/{id' -- das Endpunkt kein Recht kontrolliert alle, so dass eine Rate in sie würde jedes Gehalt in der Firma durchsickern.
· kamo-shared-library
Angewerbens Punt-Log und Audit-Event
Beide bedient von NARROW Repository Schnittstellen, nicht JpaRepository: deleteAllInBatch und Bulk JPQL Byge Entität Callbacks, so dass die Schnittstelle Form ist, was macht Anhängen nur real statt beraten. Instant + IANA Zone + Business-Datum sind alle bestehen, so dass die Dauer berechnet wird ab sofort und DST ist kostenlos -- eine 22:00-06:00 Schicht ist 7 Stunden über Feder-Vorwärts und 9 über Fall-Back, während Wand-Uhr Subtraktion berechnet 8 für beide. updatable=false wird absichtlich NICHT auf den gefrorenen Schlagsäulen verwendet: Hibernate würde sie stillschweigend von der UPDATE weglassen, anstatt zu scheitern.
· kamo-shared-library
Timezone-of-Record-Rechensbeschließer
Autorität bestellen Arbeitsstelle -" Mitglied -" org -- UTC. Die Baustelle gewinnt, weil Die Lohn-und-Stunden-Regeln folgen, wo die Arbeit PERFORMED ist. Eine Produktionszählung in dieser Sitzung fand alle 13 Orgs auf dem unberührten PACIFIC Standard und 38 von 63 Mitgliedern ohne Zeitzonen, während die bevölkerten Spanne PACIFIC, EASTERN, ARIZONA, UTC und INDIEN -- eine 13,5-Stunden-Spanne. Die Org Standard ist daher keine brauchbare Quelle der Wahrheit, weshalb WorkSite.zoneId ist NICHT NULL und trägt das Gewicht. Fällt zurück auf UTC statt auf die *** 'GMT'-String, die Europe/London ist und beobachtet BST. Eine untrennbare Lagezone fällt durch, anstatt zu werfen: Die Weigerung, eine Zone zu lösen würde sich weigern, Zeit tatsächlich funktioniert zu erfassen.
· kamo-shared-library
Geteilte WORM-Werschütze
@Column(updatable=false) erzwingt NICHT Unveränderlichkeit -- Überwintern stillschweigend lässt die Spalte aus dem UPDATE aus und das abgestandene Schreiben sieht aus, als wäre es gelungen. Die einzige funktionierende Wache ist ein @PreUpdate, das wirft.
· kamo-shared-library
Domain enums und Punkt-in-time Versionselöser
Enums sind alle @Enumeriert(STRING) auf der Rufstelle: ORDINAL emittiert eine numerische Bereich CHECK mit AND, die SchemaCleanupRunner IN-Liste Sweep absichtlich überspringt und die dann von Hand auf jeden neuen Wert erweitert werden. Der Rechener löst durch das Fenster, dass CONTAINS den Instant, nie von neueste Reihe, und hält geschlossene Fenster in der Kandidaten-Set -- Supersession schließt jedes Fenster außer dem aktuellen, so dass eine Open-Rows-only-Abfrage nichts für jeder historische Augenblick, brechen Retro-Gehält und Audit-Rekonstruktion. Überlap wirft, anstatt zu raten.
· kamo-internal
Zeigen Sie Mitglieder, die für ihren Sitzplatz bezahlen, und hören Sie auf, einen zweiten anzubieten
Der Abdeckung Endpunkt mit Übersetzungsschlüsseln und keine Komponente ausgeliefert, so dass die Frage, die es beantwortet - wer zahlt für meinen Sitz - hatte immer noch nirgendwo zu fragen. SeatCoveragePanel fragt es, und die Antwort füttert die Self-Pay-Panel daneben: jemand, dessen Sitz bereits von ihrer Organisation oder einer Gruppe abgedeckt ist, ist keine länger bot die Möglichkeit, eine andere auf ihrer eigenen Karte zu kaufen. Dieses Angebot hatte keine Wissen über die bestehende Berichterstattung überhaupt, so wurde es jedem gezeigt. Der Plan einer Gruppe kann jetzt auch gestrichen werden, was eine Gruppe mit einem macht Plan deletable - Entfernen einer, die noch Punkte auf ein Live-Abonnement ist abgelehnt, so dass die Ladung nicht verwaist ist. Hinzufügen von jemandem, den die Organisation bereits zahlt für kommt zurück verweigert, anstatt stillschweigend nichts tun, so erklärt sich der Knopf.
· BillingService
Lassen Sie den Plan einer Gruppe annulliert werden und hören Sie auf, für eine Person doppelt zu zahlen.
Drei Lücken in dem, was zuletzt ausgeliefert: Eine Gruppe mit einem Plan konnte nie entfernt werden. delete() weigert sich, während einer Live- Abonnement existiert - korrekt, da die Gruppenreihe das Einzige ist, worauf es an ist das Stripe-Abonnement - aber es gab keine Möglichkeit zu kündigen, so war die Schutzmaßnahme dead end. cancelPlan() gibt die Plätze zuerst frei, so dass der Dienstplan nicht weitergehen kann Die Behauptung, dass Menschen Sitze halten, die nicht mehr existieren. Hinzufügen jemand die Organisation kauft bereits einen Sitz für ist jetzt abgelehnt takeOverFromOrg sagt etwas anderes. Das ist der zweite Weg, um zweimal berechnet werden eine Person und nichts hat es erwischt: Die Einzigartigkeiten des Abonnements pro-Abonnement und AccountLicense erklärt überhaupt keine. Jemanden bewegen aus die Rechnung der Organisation auf eine Gruppe ist eine reale Sache, die ein Manager tut, so ist es erlaubt - absichtlich und nicht durch Zufall. BillingGroupScopeInterceptor bindet jeden /api/billing/groups/{uuid'/**-Anfrage zur Organisation des Anrufers. Die Handler prüfen bereits, und das nicht ersetzen; es existiert, weil diese Kontrollen pro Handler sind und eine Gruppe hat jetzt Sub-Ressourcen, die Geld ausgeben. Die nächste hinzugefügte Route erbt nichts, es sei denn etwas darüber wendet die Regel an. Bewusst schmaler als die Handler: dies regeln, welche Organisation, nicht wer in ihr handeln darf, so können die beiden nicht in uneinnehmbare Antworten abdriften. Eine unbekannte Gruppen-ID geht durch so die handler antwortet "nicht gefunden", anstatt zu bestätigen, dass die ID irgendwo existiert.

Euer Universum wartet.
Fügen Sie Produkte hinzu, wann immer Sie möchten – keine Migration, keine neuen Anmeldungen.
Für immer kostenlos – keine Kreditkarte erforderlich