<?php
declare(strict_types=1);require __DIR__.'/bootstrap.php';
$check(!is_file($runtime.'/fixture-journal.json'),'No preparation replay');require __DIR__.'/inspect.php';$meta=json_decode(file_get_contents(__DIR__.'/structure-'.$lane.'.json'),true);$template=json_decode(file_get_contents(__DIR__.'/fixture-values-template.json'),true);$before=$own();$prior=json_decode(file_get_contents('/tmp/cdx-ai-order-related-read8-20261011/private/evidence/fixture-journal.json'),true);foreach($prior['after'] as $t=>$rows)$check($before[$t]===$rows,'All old own rows exact '.$t);foreach(['goods_sku','goods_image','goods_category_rel','goods_service_rel','goods_spec_rel','printer','store_setting'] as $t)$check($before[$t]===[],'Own preparation collision '.$t);foreach($meta['tables'] as $t=>$m)$check($m['foreign_keys']===0&&$m['triggers']===0,'No FK/trigger '.$t);
$id=$prior['owned']['terminal'];$quote=static function($k)use($dm){return $dm?'"'.strtoupper($k).'"':'`'.$k.'`';};$plan=[];
foreach(['goods_sku','goods_image'] as $table){$row=$template[$table];foreach($row as &$v){if($v==='@existing_terminal_goods')$v=$id['goods'];if($v==='@existing_terminal_local_file')$v=$id['upload_file'];}unset($v);$cols=array_keys($row);$full=$cols;$full[]='id';sort($full);$expected=array_column($meta['tables'][$table]['columns'],'column_name');sort($expected);$check($full===$expected,'Every nonPK explicit '.$table);foreach($meta['tables'][$table]['columns'] as $c){if($c['column_name']==='id'){if($dm){$ddl=$read("SELECT DBMS_METADATA.GET_DDL('TABLE',?,'AIZHCT_APP') ddl FROM DUAL",[strtoupper('yoshop_'.$table)])[0]['ddl'];$check(preg_match('/"ID"[^,\n]*(?:IDENTITY\s*\(|AUTO_INCREMENT\b)/i',$ddl)===1,'Actual DM generated ID');}else $check($c['extra']==='auto_increment','Actual MySQL generated ID');}elseif(isset($c['character_maximum_length'])&&is_string($row[$c['column_name']]))$check(mb_strlen($row[$c['column_name']],'UTF-8')<=(int)$c['character_maximum_length'],'Field length');}$sql='INSERT INTO yoshop_'.$table.' ('.implode(',',array_map($quote,$cols)).') VALUES ('.implode(',',array_fill(0,count($cols),'?')).')';$db->prepare($sql);$plan[$table]=['sql'=>$sql,'values'=>$row];}
$journal=['lane'=>$lane,'before'=>$before,'before_protect'=>$protect(),'owned'=>$prior['owned'],'dml'=>[],'committed'=>false,'template_sha256'=>hash_file('sha256',__DIR__.'/fixture-values-template.json')];$persist('fixture-journal.json',$journal);$db->beginTransaction();try{$s=$db->prepare('UPDATE yoshop_goods SET is_delete=0 WHERE goods_id=? AND store_id=2147001112 AND goods_no=? AND is_delete=1');$s->execute([$id['goods'],'CDXCM11F782_terminal']);$check($s->rowCount()===1,'One exact approved goods restore');$journal['dml'][]=['table'=>'goods','operation'=>'UPDATE','pk'=>$id['goods'],'set'=>['is_delete'=>0]];foreach($plan as $table=>$p){$s=$db->prepare($p['sql']);$s->execute(array_values($p['values']));$check($s->rowCount()===1,'One approved insert');$r=$query($db,'SELECT * FROM yoshop_'.$table.' WHERE goods_id=? AND store_id=2147001112',[$id['goods']]);$check(count($r)===1,'Unique independent identity');$journal['owned']['terminal'][$table]=(int)$r[0]['id'];$journal['dml'][]=['table'=>$table,'operation'=>'INSERT','values'=>$p['values'],'generated_PK'=>(int)$r[0]['id']];}$db->commit();$journal['committed']=true;$journal['after']=$own();$journal['after_protect']=$protect();$expected=$before;foreach($expected['goods'] as &$row)if((int)$row['goods_id']===$id['goods'])$row['is_delete']=$dm?0:'0';unset($row);foreach($before as $t=>$rows)if(!in_array($t,['goods_sku','goods_image'],true))$check($journal['after'][$t]===$expected[$t],'Preparation effect exact '.$t);$check($journal['before_protect']===$journal['after_protect'],'Natural/default unchanged');$persist('fixture-journal.json',$journal);echo json_encode(['lane'=>$lane,'fixture_INSERT'=>2,'fixture_UPDATE'=>1,'API_DML'=>0,'own_new_ids'=>array_intersect_key($journal['owned']['terminal'],array_flip(['goods_sku','goods_image']))]),"\n";}catch(Throwable $e){if($db->inTransaction())$db->rollBack();$journal['failure']=get_class($e).': '.$e->getMessage();$persist('fixture-journal.json',$journal);throw $e;}
