Salta al contenuto
KAMOUniverse

Changelog

Cosa c'è di nuovo.

Ogni miglioramento alla piattaforma, come si spedisce.

  1. · kamo-shared-library

    Paga i periodi, le rotture, i premi, i conti del lavoro, le accruals, le esportazioni

    Batte il restante schema salari-e-ora in un cambiamento condiviso-lib così il tutto il dominio atterra in un unico run KamoInitializer piuttosto che una migrazione per fase. Entità: i periodi di pagamento con le colonne di bloccaggio delle regole, le linee di guadagno, la rottura regole e violazioni, conti di lavoro e segmenti di lavoro, politiche di accrual, bilancia e registro, lasciare casi, esportare lotti, presenze. Quattro motori puri, 51 test: BreakEvaluator — mai auto-deduce un pranzo, perché un pasto auto-dedotto libri una mezz'ora non pagata il datore di lavoro non può dimostrare era duty-free. Premiums sono WAGES (Naranjo), quindi fluiscono in guadagni piuttosto che un rapporto. Uno premio per CATEGORY al giorno (UPS v. Superior Court): due pasti mancati devono uno, un pasto mancato più un riposo perso deve due. Un pasto waiver è onorato solo dove lo statuto lo permette — un dipendente non può acconsentire al di fuori di esso. Riposo sono scomparsi, quindi il silenzio sull'attestazione non viene mai segnato come una violazione. RegolareRateCalculator — straordinario è dovuto sul tasso REGULAR, non la base tasso. 778.115 media ponderata, 778.209 straordinario retroattivo bonus non discrezionali, 778.216/218 esclusioni, e il premio di metà tempo: il tempo diritto è già nel totale, così il tempo straordinario aggiunge 0.5x, non 1,5x. AccrualEngine — un soffitto smette di accrual senza eliminare l'equilibrio, il riporto è bloccato separatamente dal soffitto, e una deduzione che viola il pavimento lancia piuttosto che approvare silenziosamente mezza giornata di riposo. PayPeriodCalendar — generato, non rientrato a mano, e verificareRifiuti dovuti un divario (lavoro appartenente a nessun periodo, mai pagato) o una sovrapposizione (pagato due volte).

  2. · kamo-shared-library

    Eccezione modello e rivelatore

    Rende reale il bloccoExceptions gate. Finora la tabella di transizione ha letto un contare che nulla ha scritto, così ogni timecard sembrava pulita e 'un pugno mancante è mai pagato come zero' era un commento piuttosto che un controllo. La distinzione BLOCKING è l'intero punto della tassonomia: un turno aperto, un punzone incontaminabile e una finalizzazione provvisoria senza pari, perché chiudendo su di loro afferma qualcosa che nessuno può stare dietro. A geofence miss and uno skew orologio sono ADVISORY e non bloccare mai -- rifiutando di registrare o finalizzare il tempo che è stato effettivamente lavorato è l'esatta violazione salariale questo sistema previene. Il rivelatore segnala e non ripara mai. Ogni modo di indovinare un turno non chiuso è sbagliato: lasciarlo acceca ore assurde, auto-chiusura sotto-reporte, un cappello inventa una figura che nessuno ha assistito. Quindi diventa un'eccezione. Idemponte per costruzione tramite il vincolo unico (membro, data, tipo) -- i duplicati avrebbero gonfiato il conteggio e reso una cartolina non definitiva per un motivo Nessuno poteva trovare.

  3. · kamo-internal

    Confermare prima di interrompere un pagamento ricorrente

    Entrambi annullano le azioni — il proprio posto di un membro e il piano di un direttore di gruppo — ora chiedono in primo luogo, nominare la copertura della data corre a e, per un gruppo, quante persone tengono la loro fino ad allora. Deliberatamente non la Confermazione condivisaDialog. Quello richiede di digitare DESTROY, DELETE, REMOVE o ERASE prima che il suo pulsante consenta, che è giusto per cancellazioni irreversibili per cui è stato costruito. La cancellazione non è né irreversibile né distruttivo: nessun dato è perso, l'accesso continua alla fine del periodo pagato, e puoi iscriverti di nuovo quando vuoi. Un gauntlet tipo la parola davanti fermare un pagamento è attrito su un'azione un cliente è inequivocabilmente diritto di prendere facilmente. Né il pulsante dice "Cancel". In una finestra di dialogo sulla cancellazione, quella parola significa entrambi "abbandonare questa finestra di dialogo" e "cancella il mio abbonamento" e non può essere letto in modo affidabile come entrambi i pulsanti nominano il loro risultato: "Mantenere il mio piano" e "Stop future pagamenti».

  4. · BillingService

    Portare la data di rinnovo sulla copertura e i carichi di pagamento di gruppo

    Entrambe le superfici ora riportano correntePeriodEnd e annullanoAtPeriodEnd. La data è ciò una conferma di cancellazione in realtà ha bisogno di dire — "mantenete il vostro posto fino alla fine del periodo" è rassicurazione nell'astratto, "mantenete il vostro posto fino al 14 marzo" è rassicurazione che qualcuno può agire.

  5. · kamo-internal

    Di' alla gente quando serve un conto e lascia che smettano di pagare

    Un banner sulla home page quando un pagamento per cui questa persona è responsabile ha fallito, collegando direttamente alla loro pagina di fatturazione. Fino ad ora un pagamento fallito si è presentato solo come applicazioni che non hanno più aperto — restrizione senza spiegazioni, che legge come software rotto piuttosto che una fattura non pagata. Solo per bollette su cui possono agire: il proprio posto, e gruppi che gestiscono. Rende niente quando non c'e' nulla di dovuto. Cancellare è ora visibile dove la persona può vedere chi paga: un "Cancel automatico i pagamenti" azione sul proprio posto, con il testo di aiuto che dice chiaramente che essi mantenere il posto fino alla fine del periodo per cui hanno già pagato. The conferma la data, perché la paura quando premendo quel pulsante è che l'accesso si ferma immediatamente. L'interruttore "I self-payers scelgono il loro piano" è andato. Il piano appartiene a l'organizzazione e tutti coloro che pagano dentro di essa — individualmente o come gruppo — compra lo stesso piano. Il gruppo afferma ora il piano dell'organizzazione piuttosto che offrire un picker.

  6. · BillingService

    Un piano per organizzazione, un soffitto Enterprise 25 posti, e un modo per smettere di pagare

    Il piano è ora una decisione a livello organizzativo e nient'altro può superarlo. Lasciare un self-payer o un manager di gruppo scegliere le proprie letture come una gentilezza e è un bug di correttezza: # Le risposte # # fanno questo org # avere questa app" da OR-ing attraverso ogni abbonamento live che si rivolge all'org, quindi uno persona su un posto scegliendo un piano più alto scambiato app del piano per Tutta l'organizzazione. Infilare ogni pagatore al piano dell'organizzazione fa che O innocuo — gli abbonamenti tutti nominano lo stesso piano, in modo che ogni volta che vince risposte Identicamente. OrgPlanService legge il piano dallo stesso abbonamento Plans & la console di fatturazione chiama "il tuo piano", quindi la regola e lo schermo non possono essere in disaccordo. L'impresa è richiesta al di sopra di 25 posti, contati in tutta l'organizzazione e ogni Gruppo di fatturazione. Contare il per-payer avrebbe fatto dividere in gruppi un modo per comprare cinquanta posti venticinque alla volta. Una modifica esclude il proprio abbonamento così il restringimento è misurato contro la nuova dimensione, non il vecchio. GET / sé / avvisi guida un banner home-page. Accesso limitato senza spiegazione è la versione peggiore di questo prodotto — le applicazioni smettere di aprire e nessuno dice perché, o che la persona che legge è quello che può risolvere. Solo sollevato per fatture questo membro è responsabile per: il proprio posto e gruppi che gestiscono. Dire a qualcuno la carta della loro organizzazione fallita quando non possono pagare è rumore, e il rumore è come i banner smettono di essere letti. POST /self/seat/cancel ferma il pagamento automatico su un sedile qualcuno comprato loro stessi. Sempre a fine periodo: hanno pagato per il periodo attuale, e cancellare immediatamente porterebbe via quell'accesso mentre il rimborso nulla, dal momento che quel sentiero non chiede a Stripe alcuna prorazione. Due bug in cancellazione() trovati durante il cablaggio: - E' stato un no-op silenzioso per la COMP e la TRIAL. Tutto il corpo siede dietro un stripeSubscriptionId null check, quindi un abbonamento comped o trial restituito 200 con la fila ancora ACTIVE — il chiamante ha detto che ha funzionato quando nulla è cambiato. Ora rifiuta e dice perché. - immediato=la verità rimane pericolosa e deliberatamente non è esposta: imposta CANCELED chiama fallbackToFree, che imposta ACTIVE/FREE con sedePaese 1, quindi un 25 posti org avrebbe mantenuto una persona di lavoro e dire 24 loro posto è stato tagliato per un motivo per cui non e' mai successo. entitlement.fail-open è impostato falso qui per abbinare SecurityService, che serve /api/security/features ed è ciò che lo schermo Apps & caratteristiche legge. Due servizi rispondere alla stessa domanda di diritto in modo diverso è peggio di una risposta. Sicuro verificato: tutti e sei i piani attivi portano una riga esplicita per tutti i 21 servizi tipi, quindi nulla precedentemente concesso è negato.

  7. · SecurityService

    Relè omologato con ruolo risolto dai diritti

    IL RUOLO E' DECIDEto QUI, dai diritti dell'interprete e dal loro rapporto con la soggetto -- mai dal corpo di richiesta. Un corpo che potrebbe nominare il proprio ruolo avrebbe permesso a chiunque pretendere di essere payroll. Precedence: PAYROLL (broadest, modifiche in qualsiasi stato), poi MANAGER, poi EMPLOYEE per il proprio record. Essendo il manager istantaneo del soggetto conta da solo - un direttore di linea che approva il proprio rapporto è il caso ordinario e non dovrebbe bisogno di un diritto di org a livello; il diritto esiste per tutti gli altri che recensioni. isManagerOf fallisce CLOSED: una linea di reporting irrisolvibile non è autorità.

  8. · kamo-shared-library

    APPROVAZIONE TIMECARD ADJUSTMENTS (197) e FINALIZE PAY PERIODS (198)

    Dividere così la separazione dei doveri è esprimibile: chi approva una cartolina non è automaticamente chiunque può chiudere un periodo di pagamento su di esso. MANAGE TIMECARDs (183) rimane il cancello del modulo e non è deliberatamente né. L'iscrizione non è ancora un diritto -- è un fatto di lavoro persistito. A destra perdite attraverso quattro comportamenti spediti e sparisce da un membro TERMINATO esattamente quando le risorse umane devono produrre la loro scheda temporale finale. Deliberatamente assente da NEW RIGHT SEEDS: che trasporta una sovvenzione EXISTING avanti, e questo cancello una capacità che nessuno aveva. Aggiungere un giusto ha bisogno solo di SecurityService riavvia -- no KamoInitializer pass, no DDL. Ids pinned da un test, perché l'id è ciò che member rights applied memorizza.

  9. · kamo-shared-library

    La macchina di stato del livello di approvazione

    Il dipendente presenta -> il manager approva -> payroll chiude, per decisione del proprietario. Quattro regole, applicate in una tabella di transizione pura e fissate da 25 test: 1. Un manager non può approvare fino a quando il dipendente ha presentato. La presentazione è la propria affermazione del dipendente che le ore sono loro e complete; approvare senza approvare nulla che nessuno ha attestato. 2. Il responsabile approva LOCKS il dipendente da ulteriori modifiche. 3. Un manager MAY atto per conto -- presentare o approvare -- e questo è l'unico percorso sanzionato dalla regola 1. Richiede una ragione scritta, e la fila registra sia il manager che ha cliccato e il dipendente è stato in piedi. 4. Payroll può modificare in qualsiasi stato compreso bloccato, sempre con un motivo. Le correzioni dopo la chiusura sono di routine e legalmente necessarie; prescriverle Basta spostare la modifica dal percorso di audit. La segregazione dei doveri vive nella tabella di transizione, non nel nome del ruolo: nessuno approva la loro scheda temporale, e un manager è anche un dipendente di qualcuno. Cascate non approvate da PAYROLL LOCKED fino a SUBMITTED, perché revocare un'approvazione invalida la serratura costruita su di esso. Le approvazioni sono indirizzate a un RANGE DATE in modo che un'approvazione mid-period sopravviva più tardi modificare al di fuori della sua portata invece di coprire silenziosamente il lavoro che non ha mai visto.

  10. · kamo-internal

    Scheda Member Timecard e scheda impostazioni HRS Timecard

    La scheda membro è SELF-SERVICE SOLO e gated su identità, esattamente come la conformità giuridica: i suoi punti finali non prendono affatto parte, quindi è strutturalmente incapace di mostrare le ore di qualcun altro. checkRight è inutilizzabile qui -- ritorna vero per tutto sotto la modalità dio, e la pagina è propria canViewOtherMemberAccount ORs in diritti non correlati tra cui Non e' vero. Il raggiungimento di una specifica carta temporale di una persona è una superficie diversa a /hr/attenzione, attribuita all'attore HR. Posizionato prima di programma-billing in modo che rimanga nel gruppo tab sinistra -- qualsiasi cosa dopo eredita quella scheda e' alignRight ml:'auto'. La pagina HRS guadagna la sua prima scheda reale accanto al ComingSoonTab, registrato in Impostazioni MENU come il test di copertura richiede in entrambe le direzioni. Entrambe le schede pad se stessi su ogni percorso di ritorno; SettingsView, TabPanel e il movimento div tutti fornitura zero.

  11. · kamo-internal

    /hr / roster di attenzione e il controllo orologio NavTop

    Sostituisce il corpo HrTabPlaceholder. Il percorso, ingresso HR TABS, MANAGE TIMECARDS cancello e scheda i18n chiavi tutto già esistito; niente qui registra nulla. Le ore di rotazione sono derivate dal server-side dal registro di punzone immutabile su ogni lettura piuttosto che tenere come un totale in esecuzione, quindi un pugno corretto mostra immediatamente e un bug produce un numero sbagliato una volta invece di mescolare. Il controllo dell'orologio è fissato cromato accanto Legal & Compliance, non un NAV REGISTRY ingresso: il registro non può esprimere una posizione tra due controlli fissi, badgeKey è codice morto, e ogni voce del Registro di sistema è trascinabile e imprendibile -- un orologio di conformità non deve essere qualcosa che qualcuno può nascondere da sé. Si accede all'iscrizione PERSISTED, mai checkRight, che ritorna vero per ogni destra sotto la modalità dio e mostrerebbe un orologio in ogni org un operatore visitato. timecardControlApplies è condiviso dal controllo e dal suo inquinamento così sia andare in silenzio insieme -- due copie di quella deriva predicata, e la modalità di fallimento è un pulsante nascosto il cui fetch corre per sempre. Lo stato dell'orologio è un segnale indipendente FOURTH: non la presenza ( battito cardiaco 60s, 300s TTL), e non disponibilità status, che è automatico per AWAY su logout e cancelli guida e supporto routing. Poll-solo per ora con un piano 60. Il relè STOMP atterra con il MediaService cambiamento; NATS nucleo è a monte e perso quindi il seme REST è obbligatorio comunque.

  12. · kamo-shared-library

    Database-clock accessor sul repository dei pugni

    Ogni istante di pugno viene dal DB, mai il JVM: i pod riavviano e nodo orologio skew, e un record salariale il cui ordine dipende da quale pod ha risposto Non un record. SQL-standard CAST, perché un: cast è silenziosamente mangled -- Hibernate legge ':' come prefisso denominato-parametro e si trasforma ora()::timestamp in :timestamp.

  13. · kamo-internal

    Itinerario BFF per /api/security/timecards

    TimecardService è ClusterIP senza ingresso, quindi senza questa rotta l'intero caratteristica 404s nel browser mentre ogni servizio è sano e ogni costruzione è verde -- l'esatto fallimento che è già accaduto due volte su questa piattaforma. Nessuna autorizzazione qui, deliberatamente: questo strato è il trasporto, e mezzo controllo invitare la convinzione che è un controllo. forwardToApi possiede la stringa di query. Un 204 viene restituito come 204 piuttosto che essere passato attraverso .json(), che getta.

  14. · SecurityService

    Relè di SecurityService a TimecardService

    Il confine dell'autorizzazione. TimecardService detiene i dati e il motore ma non sessione; questo tiene la sessione e decide chi può fare cosa, poi relè. The il motore non può quindi essere raggiunto senza passare da qui. Il servizio di sicurezza gestisce qualsiasiRichiesta().permitAll() con autista a mano laminato, così ogni metodo si apre con una guardia che restituisce non-null di rifiutare. Self-service endpoints non prendere alcun membro id affatto -- il membro viene dalla sessione, facendo loro strutturalmente incapaci di agire su qualcun altro. Cancello degli endpoint HR MANAGE TIMECARDS (183). L'iscrizione viene data risposta dalla riga di lavoro perseverata piuttosto che da un diritto, quindi un operatore di Dio-mode non appare iscritta in ogni org che guardano. SUDO MEMBER ID è trasportato attraverso: èSelf() a monte tratta un impersonato sessione come membro di destinazione, quindi senza di esso un pugno di impersonatore sarebbe registrato come il dipendente. timecard.service.url è impostato EXPLICITLY nella configurazionemap. Commissione.service.url è impostato da nessuna parte e la produzione dipende da un letterale in Java, che un servizio rinominare si romperebbe a runtime con nulla in configurazione a grep per.

  15. · kamo-shared-library

    Secchiatura della giornata di lavoro, fase 2 della pipeline

    Gli intervalli risolti diventano per-business-date secondi, pronti per l'allocatore. Un intervallo è SPLIT ad ogni confine del giorno di lavoro attraversa: un turno di 22:00-06:00 sotto una giornata di lavoro di mezzanotte è 2 ore su una data e 6 il prossimo. Attributivo l'intero arco alla sua data di inizio rende gli straordinari giornalieri e la regola del settimo giorno sbagliato per ogni lavoratore notturno. Questo è deliberatamente un attribuzione DIFFERENTE dal businessDate persistito su il pugno. Il pugno porta una data -- per la valutazione del pasto/riposo, l'eccezione la coda e ciò che il dipendente vede come il loro turno -- mentre il tempo di conteggio dei bisogni ore apporte attraverso i giorni di lavoro e workweeks in realtà sono caduti. Entrambi sono corretti, entrambi sono necessari, e conflating loro è la trappola. Un passaggio che attraversa il confine di WORKWEEK contribuisce anche a due settimane' i totali di straordinario; il conteggio di tutto in uno è sbagliato per entrambi. Accumula in pochi secondi durante tutto. I test coprono entrambe le transizioni DST, 50 ore sculaccia, e pugni fine-fine attraverso l'assegnazione per una settimana della California.

  16. · InitializerService

    Registrazione KI e migrazione degli schemi

    Le tabelle provengono da ddl-auto; questo corridore fornisce solo ciò che Hibernate non può -- gli indici unici parziali su un incarico primario aperto e un pay-rate aperto finestra, e il REVOKE che è il database metà di append-only. @Order(0) quindi atterra prima di qualsiasi secondo JPA SELECT, con una 40001 retry perché Yugabyte fa cambio di schema online e una dichiarazione rilasciata mentre ddl-auto è ancora in regola perde la gara. Registra il com.kamo.z.shared.hr.timecard in @EnableJpaRepositories -- quella lista è un array esplicito mentre @EntityScan è wildcard, e omettendo un pacchetto interrompe il contesto in modo da nessun corridore corre mentre la costruzione riporta ancora il successo.

  17. · kamo-shared-library

    Workweek e confini del giorno di lavoro

    La settimana lavorativa è l'unità di straordinario FLSA -- un fisso, regolarmente ricorrenti 168 ore periodo -- e non è il periodo di pagamento. Un periodo biweekly detiene esattamente due workweeks; un periodo semestrale o mensile contiene sempre quelli frazionari, quindi calcolo straordinario su un periodo totale sia sottopagamenti che sovrapagamenti ed è una volta che i periodi sono esportati. Il confine della giornata di lavoro è trasportato separatamente e non è necessariamente mezzanotte. A 06:00 inizio è la fissa standard per il personale notturno: mantiene un 22:00-06:00 turno su Una giornata di lavoro invece di dividerla in due mezza giornata, che è ciò che rende Il tempo straordinario quotidiano e la regola del settimo giorno lavora per loro. Boundaries sono i tempi di parete risolti attraverso ZonedDateTime, quindi 06:00 soggiorni 06:00 su un 23- o 25-ora giorno. I test pin entrambe le transizioni, e pin che uno instant è una data di business diversa a Los Angeles e Kolkata -- ecco perché la zona di record è persistita sul pugno piuttosto che derivato in seguito.

  18. · kamo-shared-library

    Risoluzione intervallare, fase 1 della pipeline di calcolo

    Le punture vengono risolte. Tipi puri, totali e sopra i valori piuttosto che entità così ogni fase è fissabile con nessun contesto di persistenza. Le durazioni provengono da Duration.tra gli istanti, mai subtrazione a parete. Questa è l'intera storia della DST e i test lo indicano: un turno di 22:00-06:00 è SEVEN ore tra la primavera e la NINE in autunno. Sottrarre orologi da parete computes 8 per entrambi -- uno underpaying, uno overpaying, e in un giurisdizione la notte di 9 ore perde silenziosamente la sua ora di straordinario. Tutto ciò che è irraggiungibile torna come irrisolto piuttosto che indovinato. Un non chiuso turn è un EXCEPTION: lasciarlo aperto matura ore assurde, auto-chiusura e un tappo fisso inventa un numero che nessuno ha visto. Non deve mai finalizzare come zero -- che non paga nulla per un giorno che è stato lavorato. I pasti sono puniti, mai auto-detratti. TRANSFER chiude un arco e apre il il prossimo senza terminare il turno, quindi il tempo del pasto e l'ammissibilità della lunghezza del turno Continuare attraverso una mossa a metà turno tra i centri di costo.

  19. · kamo-shared-library

    Assegnatore straordinario non piramide con preset di giurisdizione

    Le regole sono DATI sulla forma RequirementRule già utilizzata in questa libreria, non codice rami, quindi la California è una riga di configurazione invece di una riscrittura. L'ordine di allocazione è carico-portante: le regole quotidiane più alta soglia-prima (un 13 ore CA giorno è 1h a 2x e 4h a 1,5x, non 5h a 1,5x), poi il settimo giorno consecutivo, poi NET settimanale di ore già ad un premio giornaliero. Quell'ultimo passo è quello che impedisce la piramide, ed è l'unico motore ingenuo Omit. Cinque giorni di 10 ore in California è 10 ore premium, non 20 -- un ingenuo il motore paga ogni giorno E settimanale per le stesse dieci ore, e ogni regola individuale il test passa mentre lo fa. L'allocatore afferma anche la conservazione dell'ora sul uscire e butta piuttosto che restituire un paycheck sbagliato. Preimpostazioni: FLSA Federal, California, Alaska, Nevada, Colorado.

  20. · kamo-internal

    Consegnare il fuso orario org al browser

    Il modello di organizzazione client non aveva campo di fuso orario, utilizzareFormatters e prossimo-intl sono entrambi configurati senza tempoZone, e la chiamata backend di timezoneService 404'd -- così ogni timestamp reso nella zona del browser, e il server è durante SSR. Specchi tutti i 27 valori TimezoneTipo piuttosto che un sottoinsieme: una mappa parziale è una mezzo mirrore silenzioso dove un org non mappato passa attraverso alla zona del browser con Nessun segnale. GMT mappe in Europa/London, non UTC -- osserva BST, così conflating loro sposta un'intera giornata di ore per un'ora per metà dell'anno. La zona di org è solo un fallback DISPLAY. Un censimento di produzione ha trovato tutti i 13 org su il default PACIFIC intatto mentre i membri coprono PACIFIC/EASTERN/ARIZONA/UTC/ INDIA, così la zona di timecard di record viene dal sito di lavoro invece.

  21. · SecurityService

    E' IL MOMENTO GIUSTO

    timezoneService.ts ha chiamato questo endpoint da quando è stato scritto ed è esistito in nessun servizio Java; il cliente ha ingoiato il 404 e risolto a UTC. Nel frattempo useFormatters e next-intl sono entrambi configurati senza timeZone, quindi ogni rendering timestamp nella zona del browser -- e il *** fallback è la stringa «GMT», che è Europa/Londra e osserva BST. L'identità viene dalla sessione solo: SecurityService funziona permessoTutti con mano-rolled per-handler auth, quindi un gestore che legge l'identità dalla richiesta non ha alcun controllo. Registra il com.kamo.z.shared.hr.timecard in @EnableJpaRepositories. Quella lista è un array esplicito mentre @ComponentScan/@EntityScan sono wildcard, e omettendo un pacchetto è la causa documentata di due precedenti CrashLooping schieramenti.

  22. · kamo-shared-library

    WorkSite, l'ancora della giurisdizione

    Nome WorkSite, non WorkLocation: TeamMember.workLocation è un esistente ufficio / rimuovere enum e un secondo simbolo da quel nome sarebbe collidere in ogni grana. ZoneId è una stringa IANA libera piuttosto che TimezoneType perché quella enum è 27 i valori non possono coprire un datore di lavoro multi-stato, e non è NULL perché è il solo strato di zona affidabile -- ogni org in produzione siede sul intatto Di default PACIFIC.

  23. · kamo-shared-library

    L'occupazione e le revisioni di assegnazione con efficacia

    Le punture riferiranno un ASSIGNMENT, non un membro. Questo è ciò che rende posizione corrente, il 29 CFR 778.115 tasso medio ponderato, Competenza multi-sito e costo del lavoro espresso a tutti. managerMemberId è snapshot da TeamMember.manager in tempo di revisione così un la riorganizzazione non può riscrivere chi ha approvato cosa. Il roster finder non è volutamente costruito su member rights applied: quella query è di tipo TeamMember, quindi omette tutti i proprietari di borse e non restituisce nulla per un Membro TERMINATO i cui diritti applicati sono stati spogliati - precisamente la persona la cui scheda temporale finale HR deve ancora produrre.

  24. · kamo-shared-library

    Tassi di pagamento effettivi, solo append-

    Nessuna compensazione dei dipendenti esisteva ovunque su questa piattaforma prima di questa entità. È richiesto: il tempo di straordinario è calcolato contro il tasso regolare FLSA, CA richiede il tasso sulla dichiarazione salariale, e un'esportazione senza tassi dà payroll niente da consumare. Un aumento è un NUOVO ROW. Un tasso efficace all'interno di un periodo esportato genera un regolazione retrò, mai una riscrittura silenziosa. Non esposto tramite /api/security/members/{id} -- quel punto finale non verifica alcun diritto tutto, quindi mettere un tasso in esso perderebbe ogni stipendio in azienda.

  25. · kamo-shared-library

    Evento di registrazione e audit solo in Allegato

    Entrambi serviti da interfacce NARROW Repository, non JpaRepository: deleteAllInBatch e all'ingrosso JPQL bypass entità callback, quindi la forma dell'interfaccia è ciò che rende append-solo reale piuttosto che consultivo. Instant + IANA zona + data di affari sono tutti persistiti, quindi la durata è calcolata da istanti e DST è corretto per libero -- un turno 22:00-06:00 è 7 ore in primavera e 9 in autunno-back, mentre sottotrazione a parete Compute 8 per entrambi. updatable=false non è volutamente utilizzato sulle colonne di punzone congelate: Hibernate li ometterebbe silenziosamente dall'UPDATE piuttosto che fallire.

  26. · kamo-shared-library

    Timezone-of-record

    Sito di lavoro di ordine dell'autorità -> membro -> org -> UTC. Il sito di lavoro vince perché le regole salariali e orari seguono dove il lavoro è PERFORMED. Un censimento di produzione questa sessione ha trovato tutti e 13 gli org sul PACIFIC intatto default e 38 di 63 membri senza fuso orario, mentre quelli popolati span PACIFIC, EASTERN, ARIZONA, UTC e INDIA -- una diffusione di 13,5 ore. L'org di default non è quindi una fonte utilizzabile di verità, motivo per cui WorkSite.zoneId non è NULL e trasporta il peso. Torna all'UTC piuttosto che alla stringa *** 'GMT', che è Europa/London e osserva BST. Una zona del sito imperdibile passa piuttosto che lanciare: rifiutarsi di risolvere una zona si rifiuterebbe di registrare il tempo effettivamente lavorato.

  27. · kamo-shared-library

    Guardia di rifiuto WORM condivisa

    @Column(updatable=false) NON applica l'immutabilità -- Hibernate silenziosamente omette la colonna dall'UPDATE e la scritta stante sembra che sia riuscita. L'unica guardia di lavoro è un @PreUpdate che lancia.

  28. · kamo-shared-library

    Enums di dominio e risolutore di versione point-in-time

    Enums sono tutti @Enumerated(STRING) al sito di chiamata: ORDINAL emette un numerico gamma CHECK contenente AND, che SchemaCleanupRunner saltare deliberatamente e che deve poi essere ampliato a mano su ogni nuovo valore. Il risolutore si risolve dalla finestra che CONTAINS l'istante, mai da ultima fila, e mantiene le finestre chiuse nel set candidato -- la supersessione chiude ogni finestra ma quella attuale, quindi una query aperta-solo non restituisce nulla per qualsiasi istante storico, rottura retrò pagamento e revisione di revisione. Overlap getta piuttosto che indovinare.

  29. · kamo-internal

    Mostra i membri che pagano per il loro posto, e smettila di offrire un secondo

    Il punto finale di copertura spedito con chiavi di traduzione e nessun componente, quindi il domandare le risposte — che paga per il mio posto — non aveva ancora alcun posto da fare. SeatCoveragePanel lo chiede, e la risposta alimenta il pannello self-pay accanto a esso: qualcuno la cui sede è già coperta dalla loro organizzazione o da un gruppo non è più a lungo offerto la possibilità di acquistare un altro sulla propria carta. Questa offerta non aveva conoscenza della copertura esistente a tutti, così è stato mostrato a tutti. Il piano di un gruppo può anche essere annullato ora, che è ciò che rende un gruppo con un piano deletable — rimuovere uno che ancora punti in un abbonamento live è rifiutata così l'accusa non è orfana. Aggiunta di qualcuno l'organizzazione già paga per torna indietro rifiutato piuttosto che silenziosamente non fare nulla, quindi il pulsante si spiega.

  30. · BillingService

    Lasciate che il piano di un gruppo sia annullato e fermate il doppio pagamento per una persona

    Tre lacune in quello che ha spedito ultimo: Un gruppo con un piano non potrebbe mai essere rimosso. delete() rifiuta mentre un live l'abbonamento esiste — corretto, in quanto la riga di gruppo è l'unica cosa che indica l'abbonamento a Stripe — ma non c'era modo di annullare, quindi la salvaguardia era una cancellarePlan() rilascia prima i sedili, quindi il gallo non può continuare sostenendo che le persone tengono posti che non esistono più. Aggiunta di qualcuno l'organizzazione già compra un posto per è ora rifiutato a meno che takeOverFromOrg dice diversamente. Questo è il secondo modo per essere addebitato due volte per una persona e niente catturato: AbbonamentoGli unici di Member sono per-iscrizione e AccountLicense non dichiara affatto. Trasferire qualcuno da il disegno di legge dell'organizzazione su un gruppo è una cosa reale che fa un manager, quindi è — deliberatamente piuttosto che per caso. BillingGroupScopeInterceptor lega ogni /api/billing/groups/{uuid}/** richiesta all'organizzazione del chiamante. I gestori controllano già, e questo non sostituirli; esiste perché questi controlli sono per-handler e un gruppo ora ha sub-risorse che spendono soldi. Il prossimo percorso aggiunto non eredita nulla a meno che qualcosa sopra si applica la regola. Deliberatamente più stretto dei gestori: questo stabilisce quale organizzazione, non chi al suo interno può agire, così i due non possono alla deriva in risposte in disaccordo. Un id gruppo sconosciuto passa attraverso così il handler risponde "non trovato" piuttosto che confermare l'id esiste da qualche parte.

Il tuo universo ti sta aspettando.

Aggiungi i prodotti quando sei pronto: nessuna migrazione, nessun nuovo login, nessuna richiesta di pagamento.

Gratis per sempre — nessuna carta di credito richiesta