class createProjectFiles { private $createMinParts; private $createMaxParts; private $uniqueCarsCount; private $manufacturers; private $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private $parts = array(); private $vehicles = array(); private $vehicleNumbers = array(); private $uniquePartNumbers = array(); private $uniqueCars = array(); private $partTransactions;
public function __construct()
{
$this->createMinParts = 500;
$this->createMaxParts = 5000;
$this->uniqueCarsCount = 50;
$this->partTransactions = 10;
$this->manufacturers = array
(
'Toyota',
'General Motors',
'Volkswagen',
'Hyundai',
'Ford',
'Nissan',
'Honda',
'PSA',
'Suzuki',
'Renault',
'Fiat',
'Darnier AG',
'Chrysler',
'BMW',
'Mazda',
'Mitsubishi',
'Tata',
'FAW',
'Geely',
'Cherry',
'Fuji'
);
}
public function setMinParts( $min )
{
$this->createMinParts = $min;
}
public function setMaxParts( $max )
{
$this->createMaxParts = $max;
}
public function setMaxCarCount( $count )
{
$this->uniqueCarsCount = $count;
}
public function createPartTransactions( $partTransactions )
{
$this->partTransactions = $partTransactions;
}
public function generateFiles()
{
$this->generateStock();
$this->addSubstitutePartsToStock();
$this->writeStockFile();
$this->writeVehicleFile();
sort( $this->uniquePartNumbers );
sort( $this->uniqueCars );
sort( $this->vehicleNumbers );
sort( $this->vehicles );
$this->writeTransFile();
}
private function generateVehicleNumber()
{
if( $this->uniqueCarsCount > 0 )
{
// create random car
$vehicleNumber = rand( 10000 , 99999 );
$this->uniqueCars[] = $vehicleNumber;
$this->uniqueCarsCount--;
return sprintf( "%05s" , $vehicleNumber );
}
else
{
// pick random existing car
$vehicleNumber = $this->uniqueCars[ rand( 0 , count( $this->uniqueCars ) -1 ) ];
return sprintf( "%05s" , $vehicleNumber );
}
}
private function generatePartNumber()
{
$randomLetter1 = $this->chars[ rand( 0 , 25 ) ];
$randomLetter2 = $this->chars[ rand( 0 , 25 ) ];
$partNumber = rand( 1 , 99999 );
return $randomLetter1 . $randomLetter2 . sprintf( "%05s" , $partNumber );
}
private function getExistingPartNumber()
{
$randError = rand( 0 , 5 );
if( $randError == 3 )
{
//bogus part
return "AA00000";
}
else
{
return $this->uniquePartNumbers[ rand( 0 , count( $this->uniquePartNumbers ) - 1 ) ];
}
}
private function getExistingVehicleNumber()
{
$randError = rand( 0 , 5 );
if( $randError == 3 )
{
//bogus car
return "00000";
}
else
{
$vehicleNumber = $this->uniqueCars[ rand( 0 , count( $this->uniqueCars ) -1 ) ];
return sprintf( "%05s" , $vehicleNumber );
}
}
private function generateStock()
{
for( $i = 0; $i < rand( $this->createMinParts , $this->createMaxParts ); $i++ )
{
$partNumber = $this->generatePartNumber();
$vehicleNumber = $this->generateVehicleNumber();
$description = "--------dont care--------";
$quatity = rand( 0 , 99999 );
$price = rand( 10 , 999999 );
$reorderL = rand( 0 , 999 );
$reorderQ = rand( 0 , 99999 );
$numparts = rand( 0 , 10 );
if( in_array( $partNumber , $this->uniquePartNumbers ) )
{
continue;
}
else
{
$part = array
(
"partNumber" => $partNumber,
"vehicleNumber" => $vehicleNumber,
"description" => $description,
"quatity" => sprintf( "%05s" , $quatity ),
"price" => sprintf( "%06s" , $price ),
"reorderL" => sprintf( "%03s" , $reorderL ),
"reorderQ" => sprintf( "%05s" , $reorderQ ),
"numSubparts" => sprintf( "%02s" , $numparts ),
"part1" => '',
"part2" => '',
"part3" => '',
"part4" => '',
"part5" => '',
"part6" => '',
"part7" => '',
"part8" => '',
"part9" => '',
"part10" => ''
);
$this->parts[] = $part;
if( !in_array( $vehicleNumber , $this->vehicleNumbers ) )
{
$this->vehicleNumbers[] = $vehicleNumber;
$this->vehicles[ $vehicleNumber ] = array( $vehicleNumber , "-- vehicle description --" ,
sprintf( "%20s" , $this->manufacturers[ rand ( 0 , count( $this->manufacturers ) - 1 ) ] ) );
}
$this->uniquePartNumbers[] = $partNumber;
}
}
}
private function addSubstitutePartsToStock()
{
// add substitute parts to the parts from the parts
for( $t=0; $t < count( $this->parts ); $t++ )
{
$thepart = $this->parts[ $t ];
$numofsubparts = $thepart[ 'numSubparts' ];
$ignoreDuplicates = array();
for( $y =0; $y < $numofsubparts; $y++ )
{
$rand = rand( 0 , count( $this->parts ) -1 );
if( in_array( $this->parts[ $rand ][ 'partNumber' ], $ignoreDuplicates ) )
{
$y = $y -1;
continue;
}
else
{
$index = "part" . ( $y + 1 );
$this->parts[ $t ][ $index ] = $this->parts[ $rand ][ 'partNumber' ];
$ignoreDuplicates[] = $this->parts[ $rand ][ "partNumber" ];
}
}
}
}
private function writeStockFile()
{
// bang out the stock master file
$fp = fopen( "INAUTO-SMF.DAT" , 'w' );
if( $fp )
{
foreach( $this->parts as $part )
{
fwrite( $fp , sprintf( "%-128s" , $part[ 'partNumber' ] .
$part[ 'vehicleNumber' ] .
$part[ 'description' ] .
$part[ 'quatity' ] .
$part[ 'price' ] .
$part[ 'reorderL' ] .
$part[ 'reorderQ' ] .
$part[ 'numSubparts' ] .
$part[ 'part1' ] .
$part[ 'part2' ] .
$part[ 'part3' ] .
$part[ 'part4' ] .
$part[ 'part5' ] .
$part[ 'part6' ] .
$part[ 'part7' ] .
$part[ 'part8' ] .
$part[ 'part9' ] .
$part[ 'part10' ] ) . "\r\n" );
}
fclose( $fp );
}
}
private function writeVehicleFile()
{
$fp = fopen( "INAUTO-VEHICLE.DAT" , 'w' );
if( $fp )
{
ksort( $this->vehicles );
foreach( $this->vehicles as $vehicle )
{
fwrite( $fp , sprintf( "%-49s" , $vehicle[ 0 ] . $vehicle[ 1 ] . $vehicle[ 2 ] ) . "\r\n" );
}
fclose( $fp );
}
}
private function writeTransFile()
{
$fp = fopen( "INAUTO-TRANS.DAT" , 'w' );
if( $fp )
{
$partNumberTransactions = $this->createOrderedPartNumberlist();
for( $partTrans = 0; $partTrans < count( $partNumberTransactions ); $partTrans++ )
{
$i = 0;
$records = array();
$p = rand( 1 , 5 );
while( $i < $p )
{
$type = rand( 1 , 5 );
switch( $type )
{
case 1:
$records[ "$type" ] = $this->createInsertion( $partNumberTransactions[ $partTrans ] );
break;
case 2:
$records[ "$type" ] = $this->createDeletion( $partNumberTransactions[ $partTrans ] );
break;
case 3:
$records[ "$type" ] = $this->createQuantity( $partNumberTransactions[ $partTrans ] );
break;
case 4:
$records[ "$type" ] = $this->createAddSub( $partNumberTransactions[ $partTrans ] );
break;
case 5:
$records[ "$type" ] = $this->createRemoveSub( $partNumberTransactions[ $partTrans ] );
break;
}
$i++;
}
ksort( $records );
foreach( $records as $key => $val )
{
fwrite( $fp , sprintf( "%-129s" , $val ) . "\r\n" );
}
}
fclose( $fp );
}
}
private function createOrderedPartNumberlist()
{
$list = array();
for( $i = 0; $i < $this->partTransactions; $i++ )
{
if( $i % 5 > 0 )
{
// choose existing part number
$list[] = $this->uniquePartNumbers[ rand( 0 , count( $this->uniquePartNumbers ) - 1 ) ];
}
else
{
$list[] = $this->generatePartNumber();
}
}
sort( $list );
return $list;
}
private function createDeletion( $part )
{
return "2" . $part;
}
private function createQuantity( $part )
{
return "3" . $part . sprintf( "%05s" , rand( 0 , 99999 ) );
}
private function createAddSub( $part )
{
return "4" . $part . $this->getExistingPartNumber();
}
private function createRemoveSub( $part )
{
return "5" . $part . $this->getExistingPartNumber();
}
private function createInsertion( $part )
{
$partNumber = $part;
$vehicleNumber = $this->generateVehicleNumber();
$description = "--------dont care--------";
$quatity = rand( 0 , 99999 );
$price = rand( 10 , 999999 );
$reorderL = rand( 0 , 999 );
$reorderQ = rand( 0 , 99999 );
$numparts = rand( 0 , 10 );
$part = array
(
"partNumber" => $partNumber,
"vehicleNumber" => $vehicleNumber,
"description" => $description,
"quatity" => sprintf( "%05s" , $quatity ),
"price" => sprintf( "%06s" , $price ),
"reorderL" => sprintf( "%03s" , $reorderL ),
"reorderQ" => sprintf( "%05s" , $reorderQ ),
"numSubparts" => sprintf( "%02s" , $numparts ),
"part1" => '',
"part2" => '',
"part3" => '',
"part4" => '',
"part5" => '',
"part6" => '',
"part7" => '',
"part8" => '',
"part9" => '',
"part10" => ''
);
$ignoreDuplicates = array();
for( $y =0; $y < $numparts; $y++ )
{
$randSubPart = $this->getExistingPartNumber();
if( in_array( $randSubPart , $ignoreDuplicates ) )
{
$y = $y -1;
continue;
}
else
{
$index = "part" . ( $y + 1 );
$part[ $index ] = $randSubPart;
$ignoreDuplicates[] = $randSubPart;
}
}
return "1" .
$part[ 'partNumber' ] .
$part[ 'vehicleNumber' ] .
$part[ 'description' ] .
$part[ 'quatity' ] .
$part[ 'price' ] .
$part[ 'reorderL' ] .
$part[ 'reorderQ' ] .
$part[ 'numSubparts' ] .
$part[ 'part1' ] .
$part[ 'part2' ] .
$part[ 'part3' ] .
$part[ 'part4' ] .
$part[ 'part5' ] .
$part[ 'part6' ] .
$part[ 'part7' ] .
$part[ 'part8' ] .
$part[ 'part9' ] .
$part[ 'part10' ];
}
}
$creator = new createProjectFiles(); $creator->setMinParts( 500 ); // minimum amount of parts $creator->setMaxParts( 5000 ); // maximum amount of parts $creator->setMaxCarCount( 50 ); // after X cars, no new one will be gnerated and the old car numbers reused $creator->createPartTransactions( 120 ); // number of parts, may contain up to 3 transations per part $creator->generateFiles();