<?php
declare(strict_types=1);require __DIR__.'/bootstrap.php';require __DIR__.'/natural.php';$check(!is_file($runtime.'/fixture-journal.json'),'No successful preparation replay');$old=json_decode(file_get_contents('/tmp/cdx-ai-dashboard-export-read8-20261011/private/evidence/final-original.json'),true);$before=$own();foreach($old['original'] as $t=>$rows)$check($before[$t]===$rows,'All old23 exact '.$t);foreach(['store_user','store_user_role','store_user_relation','store_role','store_role_menu','store'] as $t)$check($before[$t]===[],'No prior own identity/privilege/store '.$t);$meta=json_decode(file_get_contents(__DIR__.'/structure-'.$lane.'.json'),true);foreach($meta['tables'] as $t=>$m)$check($m['foreign_keys']===0&&$m['triggers']===0,'Fresh FK/trigger zero '.$t);$template=json_decode(file_get_contents(__DIR__.'/fixture-values-template.json'),true);$row=$template['store_user'];$keys=array_keys($row);$full=$keys;$full[]='store_user_id';sort($full);$all=array_column($meta['tables']['store_user']['columns'],'column_name');sort($all);$check($full===$all,'All12 nonPK explicit');if($dm){$ddl=$read("SELECT DBMS_METADATA.GET_DDL('TABLE','YOSHOP_STORE_USER','AIZHCT_APP') ddl FROM DUAL")[0]['ddl'];$check(preg_match('/"STORE_USER_ID"[^,\n]*(?:IDENTITY\s*\(|AUTO_INCREMENT\b)/i',$ddl)===1,'Actual target generated PK');}else $check($meta['tables']['store_user']['columns'][0]['extra']==='auto_increment','Actual source generated PK');foreach($tenants as $module=>$tenant)$check((int)$read('SELECT COUNT(*) n FROM yoshop_store_user WHERE user_name=?',['cdxop11f64c_'.$module])[0]['n']===0,'Fresh username collision');$naturalBefore=$natural();$quote=static function($k)use($dm){return $dm?'"'.strtoupper($k).'"':'`'.$k.'`';};$sql='INSERT INTO yoshop_store_user ('.implode(',',array_map($quote,$keys)).') VALUES ('.implode(',',array_fill(0,count($keys),'?')).')';$db->prepare($sql);
$plans=[];foreach($tenants as $module=>$tenant){$r=$row;foreach($r as &$v){if($v==='@module_tenant')$v=$tenant;elseif(is_string($v)&&strpos($v,'@module')!==false)$v=str_replace('@module',$module,$v);if(is_string($v)&&strpos($v,'@private_invalid_hash')===0)$v='!SYNTHETIC_NON_LOGIN!'.bin2hex(random_bytes(16));}unset($v);$check(password_get_info($r['password'])['algoName']==='unknown'&&!password_verify('CDXOP11F64C_PROBE',$r['password']),'Invalid non-login hash is not accepted');foreach($meta['tables']['store_user']['columns'] as $c){$k=$c['column_name'];if($k==='store_user_id')continue;$check(array_key_exists($k,$r)&&$r[$k]!==null,'Explicit required value '.$k);$max=$c['character_maximum_length']??$c['data_length']??null;if(strpos(strtolower($c['data_type']),'char')!==false&&$max!==null)$check(mb_strlen($r[$k],'UTF-8')<=(int)$max,'Actual field length '.$k);}$plans[$module]=$r;}
if(defined('OPERATOR_PREFLIGHT_ONLY')){echo json_encode(['lane'=>$lane,'pure_preflight'=>true,'all_old23_exact'=>true,'own6_identity_tables_empty'=>true,'natural'=>naturalDigest($naturalBefore),'invalid_hash_verified'=>true,'business_dml'=>0]),"\n";exit;}
$journal=['lane'=>$lane,'before'=>$before,'natural_before'=>$naturalBefore,'before_protect'=>$protect(),'dml'=>[],'owned'=>[],'committed'=>false,'template_sha256'=>hash_file('sha256',__DIR__.'/fixture-values-template.json')];$persist('fixture-journal.json',$journal);$db->beginTransaction();try{foreach($plans as $module=>$r){$stmt=$db->prepare($sql);$stmt->execute(array_values($r));$check($stmt->rowCount()===1,'Only one approved account insert');$got=$query($db,'SELECT * FROM yoshop_store_user WHERE store_id=? AND user_name=?',[$r['store_id'],$r['user_name']]);$check(count($got)===1,'Exact same-tenant generated own ID');$id=(int)$got[0]['store_user_id'];foreach($r as $k=>$v){if(is_int($v))$check((int)$got[0][$k]===$v,'Integer full row roundtrip '.$k);else $check($got[0][$k]===$v,'Exact full row bytes '.$k);}$journal['owned'][$module]=$id;$journal['dml'][]=['table'=>'store_user','values'=>$r,'generated_PK'=>$id];$persist('fixture-journal.json',$journal);}$tx=[];foreach($pks as $t=>$pk)$tx[$t]=$query($db,'SELECT * FROM yoshop_'.$t.' WHERE store_id IN (2147001111,2147001112) ORDER BY '.$pk);foreach($before as $t=>$rows)if($t==='store_user')$check(count($tx[$t])===2,'Only two new own rows');else $check($tx[$t]===$rows,'All old/role/menu/store sets exact before commit '.$t);$check($natural()===$naturalBefore,'Natural dictionaries/identity digests exact before commit');$check($protect()===$journal['before_protect'],'Prior natural protection exact');$db->commit();$journal['committed']=true;$journal['after']=$own();$journal['natural_after']=$natural();$check($journal['after']===$tx&&$journal['natural_after']===$naturalBefore,'Independent postcommit full row/natural exact');$persist('fixture-journal.json',$journal);echo json_encode(['lane'=>$lane,'preparation_INSERT'=>2,'UPDATE'=>0,'DELETE'=>0,'DDL'=>0,'own_new_ids'=>$journal['owned'],'natural'=>naturalDigest($naturalBefore),'invalid_hash_verified'=>true]),"\n";}catch(Throwable $e){if($db->inTransaction())$db->rollBack();$journal['failure']=get_class($e).': '.$e->getMessage();$persist('fixture-journal.json',$journal);throw $e;}
