HEX
Server: Apache/2.2.15 (CentOS)
System: Linux ip-10-0-2-146.eu-west-1.compute.internal 2.6.32-754.35.1.el6.centos.plus.x86_64 #1 SMP Sat Nov 7 11:33:42 UTC 2020 x86_64
User: root (0)
PHP: 5.6.40
Disabled: NONE
Upload Files
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">&euro;'.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);
	
			}
		} 
	}
}
?>