14 lines
5.8 KiB
PHP
14 lines
5.8 KiB
PHP
<?php
|
|
require __DIR__.'/sgf-hr-personnel-proof-bootstrap.php';$start=[$host->table('hp_versions')->count(),$host->table('hp_commands')->count()];$salary=$host->table('rm_versions')->orderBy('id')->get()->toJson();$host->beginTransaction();try{
|
|
$ck=$uuid();$d9=$uuid();$d10=$uuid();$ek=$uuid();$lk=$uuid();$report=$uuid();$c=$hpPreview(13,$hpInput('contract',$ck,0,$contractData));$ok($host->table('hp_versions')->count()===$start[0],'personnel preview persists no version');[$v1,$cut,$key]=$hpCommand(13,$hpInput('contract',$ck,0,$contractData));$again=$hpConfirm(13,$cut['preview']);$ok($again['replayed']&&$again['id']===$v1['id'],'personnel replay exact same result');$reject(fn()=>$hpPreview(13,$hpInput('contract',$ck,1,['decision'=>'approved'],'review')),403,'own contract review denied');[$v2]=$hpCommand(14,$hpInput('contract',$ck,1,['decision'=>'approved'],'review'));$ok($v2['state']==='approved','contract reviewed distinctly');
|
|
foreach([[$d9,'2026-11-09',$ranges,true],[$d10,'2026-11-10',null,false]]as[$key,$date,$actual,$conferred]){$in=['operation'=>'establish','worker_key'=>$workerKey,'contract_key'=>$ck,'date'=>$date,'reference_on'=>'2026-11-11','planned'=>$ranges,'actual'=>$actual,'leave_conferred'=>$conferred,'evidence'=>$evidence];[$a]=$hpCommand(13,$hpInput('day',$key,0,$in));[$b]=$hpCommand(14,$hpInput('day',$key,1,['decision'=>'approved'],'review'));if($date==='2026-11-09')$ok($b['impact']['after']['effective']['result']['unaccounted_minutes']===0,'480 declared in480 planned minutes');else$ok($b['impact']['after']['effective']['result']['unaccounted_minutes']===null,'undeclared day remains unknown');}
|
|
$ent=['operation'=>'establish','worker_key'=>$workerKey,'contract_key'=>$ck,'valid_from'=>'2026-11-01','valid_to'=>'2026-12-31','minutes'=>960,'evidence'=>$evidence];[$a]=$hpCommand(13,$hpInput('entitlement',$ek,0,$ent));[$a]=$hpCommand(14,$hpInput('entitlement',$ek,1,['decision'=>'approved'],'review'));
|
|
$leave=['operation'=>'establish','worker_key'=>$workerKey,'contract_key'=>$ck,'entitlement_key'=>$ek,'day_key'=>$d10,'date'=>'2026-11-10','reference_on'=>'2026-11-11','intervals'=>$ranges,'evidence'=>$evidence];[$a]=$hpCommand(13,$hpInput('leave',$lk,0,$leave));[$b]=$hpCommand(14,$hpInput('leave',$lk,1,['decision'=>'approved'],'review'));$ok($b['impact']['after']['effective']['result']['balance_after']['available_minutes']===480&&$b['impact']['after']['effective']['status']==='reserved','reviewed leave reserves480 once');
|
|
[$a]=$hpCommand(13,$hpInput('leave',$lk,2,array_replace($leave,['operation'=>'take'])));[$b]=$hpCommand(14,$hpInput('leave',$lk,3,['decision'=>'approved'],'review'));$bal=$b['impact']['after']['effective']['result']['balance_after'];$ok($bal['reserved_minutes']===0&&$bal['taken_minutes']===480&&$bal['available_minutes']===480,'reviewed take shifts reserved to used no double count');
|
|
$actualDay=['operation'=>'amend','worker_key'=>$workerKey,'contract_key'=>$ck,'date'=>'2026-11-10','reference_on'=>'2026-11-11','planned'=>$ranges,'actual'=>[],'leave_conferred'=>true,'evidence'=>$evidence];[$a]=$hpCommand(13,$hpInput('day',$d10,2,$actualDay));[$b]=$hpCommand(14,$hpInput('day',$d10,3,['decision'=>'approved'],'review'));$ok($b['impact']['after']['effective']['result']['leave_minutes']===480&&$b['impact']['after']['effective']['result']['unaccounted_minutes']===0,'explicit no work and taken leave conferred');
|
|
$ri=['operation'=>'establish','worker_key'=>$workerKey,'period'=>'2026-11','evidence'=>$evidence];[$a]=$hpCommand(13,$hpInput('report',$report,0,$ri));[$b]=$hpCommand(14,$hpInput('report',$report,1,['decision'=>'approved'],'review'));$result=$b['impact']['after']['effective']['result'];$ok($result['known_days']===2&&$result['other_calendar_days_unknown']===28&&!$result['complete_month_proven'],'two explicit days not invented whole month');$select(17);$csv=$hp->export($hrActor(17),$b['id']);$ok(hash('sha256',$csv['bytes'])===$csv['sha256'],'reviewed report export immutable SHA');
|
|
$reject(fn()=>$hpPreview(13,$hpInput('contract',$uuid(),0,array_replace($contractData,['reference'=>'QA-OVERLAP']))),409,'overlapping effective contract denied');$reject(fn()=>$hpPreview(13,$hpInput('contract',$ck,2,array_replace($contractData,['operation'=>'terminate','valid_to'=>'2026-11-08']))),409,'termination excludes dependent dates denied');$reject(fn()=>$hpPreview(13,$hpInput('contract',$ck,2,array_replace($contractData,['operation'=>'cancel']))),409,'contract cancellation with dependencies denied');
|
|
[$a]=$hpCommand(13,$hpInput('leave',$lk,4,array_replace($leave,['operation'=>'cancel'])));[$b]=$hpCommand(14,$hpInput('leave',$lk,5,['decision'=>'approved'],'review'));$bal=$b['impact']['after']['effective']['result']['balance_after'];$ok($bal['available_minutes']===960&&$bal['taken_minutes']===0,'reviewed cancellation restores full explicit budget');$select(17);$ok($hp->export($hrActor(17),$b['id'])['sha256']!==$csv['sha256'],'new decision has independent frozen export');
|
|
$reject(fn()=>$hpPreview(13,$hpInput('day',$uuid(),0,array_replace($actualDay,['operation'=>'establish']))),409,'same person day duplicate denied');$reject(fn()=>$hpPreview(17,$hpInput('contract',$uuid(),0,$contractData)),403,'HR reader cannot prepare personnel');$reject(fn()=>$hpPreview(13,$hpInput('contract',$uuid(),0,$contractData)+['tenant_id'=>2]),422,'personnel input context override denied');
|
|
}finally{$host->rollBack();}$ok([$host->table('hp_versions')->count(),$host->table('hp_commands')->count()]===$start,'all personnel test facts rolled back');$ok($host->table('rm_versions')->orderBy('id')->get()->toJson()===$salary,'existing payroll versions unchanged');file_put_contents($work.'/hp-result.json',json_encode(['passed'=>true,'checks'=>$checks,'all_fixtures_rolled_back'=>true,'new_salary_versions'=>0],JSON_PRETTY_PRINT));echo json_encode(['passed'=>true,'checks'=>count($checks),'proof'=>$work.'/hp-result.json']).PHP_EOL;
|