<?php
declare(strict_types=1);require __DIR__.'/bootstrap.php';$check(!is_file($runtime.'/fixture-journal.json'),'No preparation replay');$old=json_decode(file_get_contents('/tmp/cdx-ai-goods-comment-20261011/private/evidence/fixture-journal.json'),true);$template=json_decode(file_get_contents(__DIR__.'/fixture-values-template.json'),true);$meta=json_decode(file_get_contents(__DIR__.'/structure-'.$lane.'.json'),true);$initial=$own();foreach(['user','upload_file','goods','order','order_goods'] as $t)$check($initial[$t]===$old['after'][$t],'Existing proved own rows '.$t);foreach(['recharge_order','recharge_order_plan','order_address','order_delivery','order_delivery_goods','payment_trade','express'] as $t)$check($initial[$t]===[],'No new own collisions '.$t);foreach($meta['tables'] as $t=>$m)$check($m['foreign_keys']===0&&$m['triggers']===0,'Metadata no side effect '.$t);
$values=[];foreach($tenants as $module=>$tenant){$values[$module]=$template['tables'][$module];$values[$module]['recharge_order']['user_id']=$old['owned'][$module]['user'];foreach(['recharge_order'=>'order_id','recharge_order_plan'=>'order_plan_id'] as $t=>$pk){$cols=array_column($meta['tables'][$t]['columns'],'column_name');$wanted=array_keys($values[$module][$t]);$wanted[]=$pk;sort($cols);sort($wanted);$check($cols===$wanted,'Exact all-column freeze '.$t);foreach($values[$module][$t] as $k=>$v){$col=null;foreach($meta['tables'][$t]['columns'] as $c)if($c['column_name']===$k)$col=$c;$type=strtolower($col['data_type']);if(strpos($type,'decimal')!==false)$check($v==='0.00','All money exact zero '.$k);if($k==='recharge_date')$check($v==='2026-10-11','Legal date');$max=$col['character_maximum_length']??null;if($max!==null&&is_string($v))$check(mb_strlen($v,'UTF-8')<=(int)$max,'Field length '.$k);}$pkcol=array_values(array_filter($meta['tables'][$t]['columns'],static function($c)use($pk){return $c['column_name']===$pk;}))[0];if($dm){$ddl=$read("SELECT DBMS_METADATA.GET_DDL('TABLE',?,'AIZHCT_APP') ddl FROM DUAL",[strtoupper('yoshop_'.$t)])[0]['ddl'];$check(preg_match('/"'.strtoupper($pk).'"[^,\n]*(?:IDENTITY\s*\(|AUTO_INCREMENT\b)/i',$ddl)===1,'DB generated identity '.$t);}else $check($pkcol['extra']==='auto_increment','MySQL generated identity '.$t);}}
$quote=static function($k)use($dm){return $dm?'"'.strtoupper($k).'"':'`'.$k.'`';};$planned=[];foreach($values as $module=>$tables)foreach($tables as $t=>$row){$cols=array_keys($row);$sql='INSERT INTO yoshop_'.$t.' ('.implode(',',array_map($quote,$cols)).') VALUES ('.implode(',',array_fill(0,count($cols),'?')).')';$db->prepare($sql);$planned[$module][$t]=$sql;}$persist('fixture-values.json',$values);$journal=['lane'=>$lane,'before'=>$initial,'before_protect'=>$protect(),'owned'=>$old['owned'],'dml'=>[],'committed'=>false,'template_sha256'=>hash_file('sha256',__DIR__.'/fixture-values-template.json')];$persist('fixture-journal.json',$journal);$db->beginTransaction();try{foreach($tenants as $module=>$tenant){$ownIds=$old['owned'][$module];$order=($query($db,'SELECT * FROM yoshop_order WHERE order_id=? AND store_id=?',[$ownIds['order'],$tenant]))[0];$check($order['order_no']==='CDXCM11F782_'.$module&&(int)$order['order_status']===20&&(int)$order['pay_status']===10&&(int)$order['is_delete']===1,'Existing cancelled own order');foreach(['total_price','order_price','coupon_money','points_money','pay_price','update_price','express_price'] as $k)$check((string)$order[$k]==='0.00'||(float)$order[$k]===0.0,'Existing order funds zero');$s=$db->prepare('UPDATE yoshop_order SET is_delete=0 WHERE order_id=? AND store_id=? AND order_no=? AND is_delete=1');$s->execute([$ownIds['order'],$tenant,$order['order_no']]);$check($s->rowCount()===1,'Exact own preparation update');$journal['dml'][]=['table'=>'order','PK'=>$ownIds['order'],'tenant'=>$tenant,'set'=>['is_delete'=>0]];
foreach(['recharge_order'=>'order_id','recharge_order_plan'=>'order_plan_id'] as $t=>$pk){$row=$values[$module][$t];if($t==='recharge_order_plan')$row['order_id']=$journal['owned'][$module]['recharge_order'];$s=$db->prepare($planned[$module][$t]);$s->execute(array_values($row));$ids=$query($db,'SELECT '.$pk.' FROM yoshop_'.$t.' WHERE store_id=?',[$tenant]);$check(count($ids)===1,'Own generated recharge identity '.$t);$journal['owned'][$module][$t]=(int)$ids[0][$pk];$journal['dml'][]=['table'=>$t,'values'=>$row,'generated_PK'=>(int)$ids[0][$pk]];$persist('fixture-journal.json',$journal);}}
$db->commit();$journal['committed']=true;$journal['after']=$own();$journal['after_protect']=$protect();$check($journal['before_protect']===$journal['after_protect'],'Natural count unchanged');foreach(['user','goods','upload_file','order_goods'] as $t)$check($journal['before'][$t]===$journal['after'][$t],'Reused base unchanged '.$t);$beforeOrders=$journal['before']['order'];foreach($beforeOrders as &$r)$r['is_delete']=is_int($r['is_delete'])?0:'0';unset($r);$check($beforeOrders===$journal['after']['order'],'Only own is_delete changed');$persist('fixture-journal.json',$journal);echo json_encode(['lane'=>$lane,'fixture_UPDATE'=>2,'fixture_INSERT'=>4,'HTTP_business_DML'=>0,'owned'=>$journal['owned'],'committed'=>true]),"\n";}catch(Throwable $e){if($db->inTransaction())$db->rollBack();$journal['failed']=get_class($e);$persist('fixture-journal.json',$journal);throw $e;}
