13 lines
4.0 KiB
PHP
13 lines
4.0 KiB
PHP
<?php
|
|
use Illuminate\Support\Facades\Auth;use Illuminate\Support\Str;use App\Shared\Context\CompanyContext;use App\Modules\Workshop\WorkshopSchedule;
|
|
require __DIR__.'/sgf-ledger-proof-bootstrap.php';config(['workshop_schedule.enabled'=>true]);$manager=$profiles['workshop_manage']['user_id'];Auth::guard('web')->setUser($u=App\Models\User::findOrFail($manager));$r=Illuminate\Http\Request::create('/api/workshop-schedule','POST');$r->attributes->set('sgf_module','workshop');$r->setUserResolver(fn()=>$u);$session=app('session')->driver();$session->start();$session->put('company_context',$f['scope']+['module_id'=>'workshop','token'=>'schedule-concurrency']);$r->setLaravelSession($session);$app->instance('request',$r);app(CompanyContext::class)->selectFor($manager,1,2,2);$w=app(WorkshopSchedule::class);$dir=$s['root'].'/workshop-schedule-concurrency';if(!is_dir($dir))mkdir($dir,0700,true);$file=$dir.'/progress.json';$mode=$argv[1]??'';
|
|
if($mode==='prepare'){
|
|
if(is_file($file))throw new LogicException('Reuse existing directed concurrency input');$direct=json_decode(file_get_contents($s['root'].'/single-direct-cost.json'),true);$input=['action'=>'book','booking_key'=>(string)Str::uuid(),'version'=>0,'order_id'=>$direct['order'],'technician_id'=>$profiles['workshop_record']['user_id'],'starts_at'=>'2026-11-16T09:00:00+02:00','ends_at'=>'2026-11-16T10:00:00+02:00','reason'=>'Ensaio concorrente sintético de uma única disponibilidade.'];$cuts=[];foreach([1,2] as $i){$input['booking_key']=(string)Str::uuid();$cuts[$i]=$w->preview($manager,$input,(string)Str::uuid())['preview'];}file_put_contents($file,json_encode(['input'=>$input,'cuts'=>$cuts]));echo json_encode(['passed'=>true]).PHP_EOL;
|
|
}elseif($mode==='first'){
|
|
$p=json_decode(file_get_contents($file),true);$host->beginTransaction();try{$result=$w->confirm($manager,$p['cuts'][1]);file_put_contents($dir.'/locked','company row held; first booking not committed');$end=microtime(true)+20;while(!is_file($dir.'/release')&µtime(true)<$end)usleep(50000);if(!is_file($dir.'/release'))throw new LogicException('Release not received');$host->commit();file_put_contents($dir.'/first.json',json_encode(['passed'=>true,'result'=>$result]));}finally{while($host->transactionLevel()>0)$host->rollBack();}
|
|
}elseif($mode==='second'){
|
|
$p=json_decode(file_get_contents($file),true);$r->request->replace(['preview'=>$p['cuts'][2]]);$start=microtime(true);$response=app(App\Modules\Workshop\Http\WorkshopScheduleController::class)->confirm($r,$w);file_put_contents($dir.'/second.json',json_encode(['status'=>$response->getStatusCode(),'elapsed_seconds'=>microtime(true)-$start,'response'=>$response->getData(true)]));
|
|
}elseif($mode==='recover'){
|
|
$p=json_decode(file_get_contents($file),true);$blocked=false;try{$w->confirm($manager,$p['cuts'][2]);}catch(Symfony\Component\HttpKernel\Exception\HttpExceptionInterface $e){$blocked=$e->getStatusCode()===409;}if(!$blocked)throw new LogicException('Conflicting old availability must refuse after release');$first=$w->confirm($manager,$p['cuts'][1]);if(!$first['replayed'])throw new LogicException('First booking must recover');$input=array_replace($p['input'],['booking_key'=>(string)Str::uuid(),'starts_at'=>'2026-11-16T10:00:00+02:00','ends_at'=>'2026-11-16T11:00:00+02:00']);$fresh=$w->preview($manager,$input,(string)Str::uuid());$second=$w->confirm($manager,$fresh['preview']);$rows=$w->listing($manager,['from'=>'2026-11-16','to'=>'2026-11-16'])['bookings'];if($rows->total()!==2)throw new LogicException('Only two distinct adjacent intervals expected');file_put_contents($dir.'/result.json',json_encode(['passed'=>true,'lock'=>'host company row shared with Workshop writers','second_during_lock'=>json_decode(file_get_contents($dir.'/second.json'),true),'after_release'=>'409 stale/conflicting conference; new explicit adjacent interval accepted','first_key_replayed'=>true,'bookings'=>2,'overbookings'=>0,'new_database'=>false,'external_messages'=>false],JSON_PRETTY_PRINT));echo json_encode(['passed'=>true,'proof'=>$dir.'/result.json']).PHP_EOL;
|
|
}else throw new LogicException('Known phase required');
|