File: /www/exchange2/exchange/admin/classes/Controller/CFillSolver.php
<?php
class Controller_CFillSolver
{
function Controller_CFillSolver()
{
if(!isset($_SESSION['username']) && !isset($_SESSION['admin']))
header("Location:adminindex.php?do=index");
}
function fillSolver()
{
include("classes/Model/MFillSolver.php");
include("classes/Display/DFillSolver.php");
include_once("classes/Lib/HandleErrors.php");
$output["errmsg"] = $Err->messages;
$output["errval"] = $Err->values;
$output["style"] = $Err->style;
$_SESSION['errmsg'] = $output["errmsg"];
$output = array();
Bin_Template::CreateTemplate('fillsolver/uploadSBSolver.html',$output);
unset($_SESSION['success_msg'],$_SESSION['errmsg'],$_SESSION['data']);
}
function uploadFillSolver()
{
include("classes/Model/Validation/CheckInputs.php");
include("classes/Model/MAddressBook.php");
include("classes/Model/MFillSolver.php");
include("classes/Display/DFillSolver.php");
include_once("classes/Lib/Parser.php");
Model_MFillSolver::uploadFillSolver();
}
function getFillSolver()
{
Bin_Template::CreateTemplate('fillsolver\showFillSolver.html');
unset($_SESSION['success_msg']);
}
function createBatches()
{
include("classes/Model/MFillSolver.php");
include("classes/Display/DFillSolver.php");
include("classes/Model/Validation/CheckInputs.php");
$output["errmsg"] = $Err->messages;
$output["errval"] = $Err->values;
$output["style"] = $Err->style;
new Model_Validation_CheckInputs("chkbatches");
unset($_SESSION['success_msg'],$_SESSION['errmsg'],$_SESSION['answer1'],$_SESSION['answer2'],$_SESSION['nums'],$_SESSION['targets']);
$count = count($_SESSION['data']);
$output['list']= '<table width="100%" border="0" cellspacing="0" cellpadding="0" class="clsnopad">
<tr>
<td valign="top" align="right" width="20%">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="left">Target Amount: </td>
<td align="right">€'.number_format($_POST['target_amount'],'2','.',',').'</td>
</tr>
</table><br><br>
</td>
<td valign="top" align="center" width="80%"><b>Results</b><br><br></td>
</tr>
<tr>';
for($i=0;$i<count($_SESSION['data']);$i++){
$list[$i] .= number_format($_SESSION['data'][$i],'2','.','');
}
$output['list'] .= '<td valign="top" align="right" style="font-family:Arial;font-size:12px;">';
if(count($list) > 0){
$output['list'] .= '<ul>';
foreach ($list as $key) {
$output['list'] .= '<li style="list-style:none;line-height:20px; padding:2px 0;">'.number_format($key,'2','.',',').'</li>';
}
$output['list'] .= '</ul>';
}
$output['list'] .= '</td><td valign="top" align="left" ><table width="100%" border="0" cellspacing="0" cellpadding="5">
<tr>';
$prior = array();
$inc = 0;
$_SESSION['targets'] = $_POST['target_amount'];
$macro = array();
foreach($list as $key){
if($_SESSION['targets'] > $key){
$macro[] = $key;
}
}
$i = 0;
foreach($macro as $key){
$nums[$i] = $key;
$i++;
}
$_SESSION['nums'] = $nums;
$res = $this->recursiveSubsets( "", 0, 0, $nums,$answer = array(),$prior);
$increment = 1;
$results = '<tr>';
if(count($_SESSION['answer1']) > 0){
foreach ($_SESSION['answer1'] as $index => $key) {
$arrayValues = array();
foreach ($key as $value) {
$index1 = explode("::", $value);
$arrayValues[] = $index1[0];
}
sort($arrayValues);
$_SESSION['answer1'][$index] = $arrayValues;
}
$inc = 1;
foreach ($_SESSION['answer1'] as $key) {
# code...
$output['list'] .='<td valign="top" align="right" style="font-family:Arial;font-size:12px;"><ul><li style="list-style:none;line-height:20px; padding:2px 0;font-weight:bold;">Batch '.$increment.'</li>';
foreach ($key as $value) {
$index1 = explode("::", $value);
$output['list'] .='<li style="list-style:none;line-height:20px; padding:2px 0;">'.number_format($index1[0],'2','.',',').'</li>';
}
$output['list'] .='</ul></td>';
$results .= '<td valign="top" align="right" style="font-weight:bold; line-height:50px; padding-bottom:20px !important;">'.number_format(array_sum($key),'2','.',',').'</td>';
if($increment%5 == 0){
$output['list'] .='</tr>';
$results .='</tr>';
$output['list'] .= $results ;
$results ='';
$inc++;
if($inc < count($answer2)){
$results ='<tr>';
$output['list'] .='<tr>';
}
}else{
$inc++;
}
$increment++;
}
}
$macro = $_SESSION['nums'];
arsort($macro);
$i = 0;
$nums = array();
foreach($macro as $key){
$nums[$i] = $key;
$i++;
}
//if(count($_SESSION['answer1']) == 0){
$_SESSION['nums'] = $nums;
//}
$prior = array();
$inc = 0;
$res = $this->recursiveSubsets1( "", 0, 0, $nums,$answer = array(),$prior);
$val = array();
if(count($_SESSION['answer2']) > 0)
{
foreach ($_SESSION['answer2'] as $index => $key)
{
$arrayValues = array();
foreach ($key as $value) {
$index1 = explode("::", $value);
$arrayValues[] = $index1[0];
}
sort($arrayValues);
$_SESSION['answer2'][$index] = $arrayValues;
$val[$index] = array_sum($arrayValues);
}
arsort($val);
foreach ($val as $index => $key) {
$answer2[] = $_SESSION['answer2'][$index];
}
$output['list'] .='';
$results .= '';
$inc = 1;
foreach ($answer2 as $key) {
$output['list'] .= '<td valign="top" align="right" style="font-family:Arial;font-size:12px;"><ul><li style="list-style:none;line-height:20px; padding:2px 0;font-weight:bold;">Batch '.$increment.'</li>';
foreach ($key as $value) {
$output['list'] .='<li style="list-style:none;line-height:20px; padding:2px 0;">'.number_format($value,'2','.',',').'</li>';
}
$output['list'] .='</ul></td>';
$results .= '<td valign="top" align="right" style="font-weight:bold; line-height:50px; padding-bottom:20px !important;">'.number_format(array_sum($key),'2','.',',').'</td>';
if($increment%5 == 0){
$output['list'] .='</tr>';
$results .='</tr>';
$output['list'] .= $results ;
$results ='';
$inc++;
if($inc < count($answer2)){
$results ='<tr>';
$output['list'] .='<tr>';
}
}else{
$inc++;
}
$increment++;
}
}
if(count($_SESSION['nums']) > 0)
{
sort($_SESSION['nums']);
$output['list'] .='<td valign="top" align="right" style="font-family:Arial;font-size:12px;"><ul><li style="list-style:none;line-height:20px; padding:2px 0;font-weight:bold;">Batch '.$increment.'</li>';
foreach ($_SESSION['nums'] as $key) {
$output['list'] .='<li style="list-style:none;line-height:20px; padding:2px 0;">'.number_format($key,'2','.',',').'</li>';
}
$output['list'] .='</ul></td></tr>';
$results .= '<td valign="top" align="right" style="font-weight:bold; line-height:50px; padding-bottom:20px !important; ">'.number_format(array_sum($_SESSION['nums']),'2','.',',').'</td>';
$increment++;
}
$output['list'] .= $results ;
$output['list'] .= '</tr>
</table>
</td>
</tr>
</table>';
Bin_Template::CreateTemplate('fillsolver/batchresults.html',$output);
unset($_SESSION['success_msg'],$_SESSION['answer2'],$_SESSION['errmsg'],$_SESSION['answer1']);
}
function recursiveSubsets( $list, $sofar, $place,$nums,$answer1,$prior)
{
$target = $_SESSION['targets'];
$nums = $_SESSION['nums'];
for($p = $place; $p < count($nums); ++$p )
{
$current = $nums[$p];
if ( $sofar + $current == $target )
{
$answer = $list.",".$current."::".$p;
$result1 = explode(",",($answer));
$val = array();
foreach ($result1 as $key) {
$exp = explode("::",$key);
$val[] = $exp[0];
}
$answer = implode(",",$val);
$result = explode(",",($list.",".$current."::".$p));
$batch = array();
foreach ($result as $key => $value) {
if($value != "") {
$index = explode("::", $value);
$batch[] = $value;
$nums[$index['1']] = '';
}
}
$_SESSION['answer1'][] = $batch;
$i = 0;
$nums1 = array();
foreach($nums as $key){
if($key !=''){
$nums1[$i] = $key;
$i++;
}
}
$nums = $nums1;
$prior[] = $answer;
$list = '';
$current = '0';
$p = -1;
$sofar = 0;
$_SESSION['nums'] = $nums;
}
else if ($sofar + $current < $target )
{
$this->recursiveSubsets( $list.",".$current."::".$p, $sofar+$current, $p+1,$nums,$answer1,$prior);
}
}
}
function cacheNearestValue($val,$target,$current,$nums){
$newval = array();
foreach ($nums as $key => $value) {
$nntarg = $target + $value;
if($nntarg < $_SESSION['targets']){
$newval[$key] = $nntarg;
}
}
if(count($newval) > 0){
$mx = array_search(max($newval), $newval);
if($newval[$mx] !=''){
$val[] = $nums[$mx];
$nums[$mx] = '';
$i = 0;
$nums1 = array();
foreach($nums as $key){
if($key !=''){
$nums1[$i] = $key;
$i++;
}
}
$nums = $nums1;
$_SESSION['answer2'][] = $val;
}
}else{
if($target < $_SESSION['targets']){
$_SESSION['answer2'][] = $val;
return $nums;
}
}
return $nums;
}
function recursiveSubsets1( $list, $sofar, $place,$nums,$answer1,$prior){
$target = $_SESSION['targets'];
$nums = $_SESSION['nums'];
for ( $p = $place; $p < count($nums); ++$p )
{
$nums = $_SESSION['nums'];
$current = $nums[$p];
if ( $sofar + $current > $target )
{
$answer = $list.",".$current."::".$p;
$val = array();
$newtarget = 0;
$result = explode(",",$list);
$batch = array();
foreach ($result as $key => $value) {
if($value != "") {
$exp = explode("::", $value);
$batch[] = $value;
$nums[$exp['1']] = '';
$newtarget = $newtarget + $exp[0];
}
}
$i = 0;
$nums1 = array();
foreach($nums as $key){
if($key !=''){
$nums1[$i] = $key;
$i++;
}
}
$nums = $nums1;
$newtarget = $newtarget;
$_SESSION['nums'] = $this->cacheNearestValue($batch,$newtarget,$current,$nums);
$nums = $_SESSION['nums'];
$answer = implode(",",$val);
$prior[] = $answer;
$list = '';
$current ='0';
$p = -1;
$sofar = 0;
}
else if ( $sofar + $current < $target )
{
$this->recursiveSubsets1( $list.",".$current."::".$p, $sofar+$current, $p+1,$nums,$answer1,$prior);
}
}
}
}
?>