diff --git a/REST/functions.php b/REST/functions.php index e31ed8d6..790a59ed 100644 --- a/REST/functions.php +++ b/REST/functions.php @@ -507,9 +507,9 @@ ORDER BY i.register_date DESC; $result = exportToCSVFile($res, $fullpath, $headers, ';', true); if ($result['ok']) { - $report[] = "OK → {$result['path']} (wiersze: {$result['rows']})
"; + $report[] = "OK → {$result['path']} (wiersze: {$result['rows']})".PHP_EOL; } else { - $report[] = "ERR → {$result['path']} ({$result['error']})
"; + $report[] = "ERR → {$result['path']} ({$result['error']})".PHP_EOL;; } } diff --git a/modules/EcmPaymentStates/summaryNew.php b/modules/EcmPaymentStates/summaryNew.php index 059345fe..fc25494a 100644 --- a/modules/EcmPaymentStates/summaryNew.php +++ b/modules/EcmPaymentStates/summaryNew.php @@ -1,739 +1,431 @@ query('RESET QUERY CACHE;'); $db->query('FLUSH QUERY CACHE'); -if($_REQUEST['submit']){ -if ($_REQUEST['account_type']) - $account_type = $_REQUEST['account_type']; -else - $account_type = ''; -if($_REQUEST['account_type']=='a'){ - $account_type = ''; -} -if ($_REQUEST['saldo_type']) - $saldo_type = $_REQUEST['saldo_type']; -else - $saldo_type = ''; -if ($_REQUEST['type2']) - $and = " and account_type2='".$_REQUEST['type2']."'"; -if($saldo_type!=''){ - $type="t.settled!='1' and"; -} else { - $type=''; +// Initialize variables with defaults +$account_type = ''; +$saldo_type = ''; +$and = ''; +$type = ''; +$data = array(); +$sum = array(); +$idToPdf = ''; + +if (!empty($_REQUEST['submit'])) { + // Sanitize and validate inputs + $account_type = isset($_REQUEST['account_type']) ? $db->quote($_REQUEST['account_type']) : ''; + if ($account_type == 'a') { + $account_type = ''; + } + + $saldo_type = isset($_REQUEST['saldo_type']) ? $db->quote($_REQUEST['saldo_type']) : ''; + $type2 = isset($_REQUEST['type2']) ? $db->quote($_REQUEST['type2']) : ''; + $user_id = isset($_REQUEST['user_id']) ? $db->quote($_REQUEST['user_id']) : ''; + + // Build WHERE conditions safely + $conditions = array("t.deleted='0'"); + + if ($saldo_type != '') { + $conditions[] = "t.settled!='1'"; + } + + if (!empty($type2)) { + $conditions[] = "account_type2='" . $type2 . "'"; + } + + if (!empty($user_id)) { + $conditions[] = "a.assigned_user_id='" . $user_id . "'"; + } + + // Build account type condition + $account_condition = ''; + if ($account_type != '') { + $account_condition = " AND (a.account_type='rs' OR a.account_type = '" . $account_type . "')"; + } + + // Optimized query - get all needed data in one go + $query = "SELECT DISTINCT + t.parent_id, + a.index_dbf, + a.name as account_name, + a.currency_id, + a.id as account_id + FROM ecmtransactions as t + INNER JOIN accounts AS a ON t.parent_id = a.id + WHERE " . implode(' AND ', $conditions) . $account_condition . " + ORDER BY a.index_dbf"; + + $clients = $db->query($query); + + // Cache currency objects to avoid repeated database calls + $currency_cache = array(); + + while ($c = $db->fetchByAssoc($clients)) { + // Skip invalid accounts + if (empty($c['parent_id'])) continue; + + $row = array(); + $row['id'] = $c['parent_id']; + $row['name'] = $c['account_name']; + $row['index'] = $c['index_dbf']; + + // Use cached currency data + $currency_id = !empty($c['currency_id']) ? $c['currency_id'] : 'PLN'; + if (!isset($currency_cache[$currency_id])) { + $currency_obj = new Currency(); + $currency_obj->retrieve($currency_id); + $currency_cache[$currency_id] = $currency_obj->name; + } + $row['currency_id'] = $currency_cache[$currency_id]; + + // Get financial data (these functions need optimization too) + $row['unsettled'] = getData($c['parent_id'], 0); + $row['not_overdue'] = getData($c['parent_id'], 7); + $row['overdue'] = getData($c['parent_id'], 1); + $row['2'] = getData2($c['parent_id'], 2); + $row['3'] = getData2($c['parent_id'], 3); + $row['4'] = getData2($c['parent_id'], 4); + $row['5'] = getData2($c['parent_id'], 5); + $row['6'] = getData2($c['parent_id'], 6); + $row['saldo'] = getData($c['parent_id'], 8); + $row['today_saldo'] = 0; + + // Apply saldo filters + if ($saldo_type == 'plus' && $row['saldo'] <= 0) continue; + if ($saldo_type == 'minus' && $row['saldo'] >= 0) continue; + if ($saldo_type == 'zero' && $row['saldo'] != 0) continue; + if ($saldo_type == '' && $row['saldo'] == 0) continue; + + $idToPdf .= $row['id'] . ','; + + // Accumulate sums by currency + if (!isset($sum[$currency_id])) { + $sum[$currency_id] = array( + 'unsettled' => 0, + 'not_overdue' => 0, + 'overdue' => 0, + '2' => 0, + '3' => 0, + '4' => 0, + '5' => 0, + '6' => 0, + 'saldo' => 0, + 'today_saldo' => 0, + 'currency_id' => $currency_cache[$currency_id] + ); + } + + $sum[$currency_id]['unsettled'] += $row['unsettled']; + $sum[$currency_id]['not_overdue'] += $row['not_overdue']; + $sum[$currency_id]['overdue'] += $row['overdue']; + $sum[$currency_id]['2'] += $row['2']; + $sum[$currency_id]['3'] += $row['3']; + $sum[$currency_id]['4'] += $row['4']; + $sum[$currency_id]['5'] += $row['5']; + $sum[$currency_id]['6'] += $row['6']; + $sum[$currency_id]['saldo'] += $row['saldo']; + $sum[$currency_id]['today_saldo'] += $row['today_saldo']; + + $data[] = $row; + } } -if ($_REQUEST['user_id']!=''){ - $and.= " and a.assigned_user_id='".$_REQUEST['user_id']."'"; -} else { - $type=''; +// Get user list with single query +$user_list = array(); +$users_query = "SELECT id, first_name, last_name FROM users WHERE deleted=0"; +$users_result = $db->query($users_query); +while ($user_data = $db->fetchByAssoc($users_result)) { + $user_list[$user_data['id']] = trim($user_data['first_name'] . ' ' . $user_data['last_name']); } -// get list of accounts -if ($account_type == '') - $clients = $db->query ( "SELECT distinct t.parent_id,a.index_dbf as index_dbf FROM ecmtransactions as t - INNER JOIN accounts AS a -ON t.parent_id = a.id - WHERE ".$type." t.deleted='0' ".$and." ORDER BY a.index_dbf" ); -else - $clients = $db->query ( " - SELECT distinct t.parent_id, a.index_dbf as index_dbf FROM ecmtransactions AS t -INNER JOIN accounts AS a -ON t.parent_id = a.id -WHERE -".$type." -t.deleted='0' AND (a.account_type='rs' OR -a.account_type = '$account_type') ".$and." -ORDER BY a.index_dbf - " ); -// arrays to handle data for SMARTY -$data = array (); -$sum = array (); -$idToPdf=''; +// Initialize Smarty template +$ss = new Sugar_Smarty(); +global $mod_strings, $app_list_strings; -while ( $c = $db->fetchByAssoc ( $clients ) ) { - - $row = array (); - $row['id'] = $c['parent_id']; - - $tt= $db->fetchByAssoc ( $db->query ( "SELECT name FROM accounts WHERE id='" . $c ['parent_id'] . "'" ) ); - $row ['name'] =$tt['name']; - $a=New Account(); - $a->retrieve($c['parent_id']); - $a->currency_id; - if($a->id=='')continue; - $row ['unsettled'] = getData ( $c ['parent_id'], 0 ); - $row ['not_overdue'] = getData ( $c ['parent_id'], 7 ); - $row ['overdue'] = getData ( $c ['parent_id'], 1 ); - $row ['2'] =getData2 ( $c ['parent_id'], 2 ); // 1..30 - $row ['3'] = getData2 ( $c ['parent_id'], 3 ); // 31..60 - $row ['4'] = getData2 ( $c ['parent_id'], 4 ); // 61..90 - $row ['5'] = getData2 ( $c ['parent_id'], 5 ); // 91..180 - $row ['6'] = getData2 ( $c ['parent_id'], 6 ); // 180.. - $row['index']=$c['index_dbf']; - $row ['saldo'] = getData ( $c ['parent_id'], 8 ); - $row ['today_saldo'] = 0; // getData2 ( $c ['parent_id'],9,$_REQUEST['saldo_date_val'] ); - $c= new Currency(); - if($a->currency_id=='')$a->currency_id='PLN'; - $c->retrieve($a->currency_id); - $row ['currency_id']=$c->name; - - - if($saldo_type=='plus' && !($row ['saldo']>0))continue; - if($saldo_type=='minus' && $row ['saldo']>=0 )continue; - if($saldo_type=='zero' && !$row ['saldo']==0 )continue; - if($saldo_type=='' && $row ['saldo']==0 )continue; - $idToPdf.=$row['id'].','; - $sum [$a->currency_id]['unsettled'] += $row ['unsettled']; - $sum [$a->currency_id]['not_overdue'] += $row ['not_overdue']; - $sum [$a->currency_id]['overdue'] += $row ['overdue']; - $sum [$a->currency_id]['2'] += $row ['2']; // 1..30 - $sum [$a->currency_id]['3'] += $row ['3']; // 31..60 - $sum [$a->currency_id]['4'] += $row ['4']; // 61..90 - $sum [$a->currency_id]['5'] += $row ['5']; // 91..180 - $sum [$a->currency_id]['6'] += $row ['6']; // 180.. - $sum [$a->currency_id]['saldo'] += $row ['saldo']; - $sum [$a->currency_id]['today_saldo'] += $row ['today_saldo']; - $sum [$a->currency_id]['currency_id']=$c->name; - $data [] = $row; -} - - -// sort -$sort = array (); - - -} -$user_list=array(); - -$z=$db->query("select id,first_name,last_name from users where deleted=0"); -while($dane=$db->fetchByAssoc($z)){ - $user_list[$dane['id']]=$dane['first_name'].' '.$dane['last_name']; -} -// create & execute smarty -$ss = new Sugar_Smarty (); -global $mod_strings,$app_list_strings; -$ss->assign ( "MOD", $mod_strings ); -$ss->assign ( "DATA", $data ); -$ss->assign ( "SUM", $sum ); -$ss->assign ( "SORT", $sort ); +$ss->assign("MOD", $mod_strings); +$ss->assign("DATA", $data); +$ss->assign("SUM", $sum); +$ss->assign("SORT", array()); // Initialize empty sort array $ss->assign("account_type", $account_type); -$app_list_strings['account_type_dom']['a']='Wszystkie'; + +$app_list_strings['account_type_dom']['a'] = 'Wszystkie'; $ss->assign("account_type_list", $app_list_strings['account_type_dom']); -$ss->assign("saldo_type",$saldo_type); -$ss->assign("saldo_date_val",$_REQUEST['saldo_date_val']); -$ss->assign("idToPdf",$idToPdf); -$ss->assign("type",$_REQUEST['type2']); -$ss->assign("type2",$app_list_strings['account_type2_dom']); -$ss->assign("user_id",$_REQUEST['user_id']); -$ss->assign("users",$user_list); +$ss->assign("saldo_type", $saldo_type); +$ss->assign("saldo_date_val", isset($_REQUEST['saldo_date_val']) ? $_REQUEST['saldo_date_val'] : ''); +$ss->assign("idToPdf", rtrim($idToPdf, ',')); +$ss->assign("type", isset($_REQUEST['type2']) ? $_REQUEST['type2'] : ''); +$ss->assign("type2", $app_list_strings['account_type2_dom']); +$ss->assign("user_id", isset($_REQUEST['user_id']) ? $_REQUEST['user_id'] : ''); +$ss->assign("users", $user_list); -echo $ss->display ( 'modules/EcmPaymentStates/tpls/summary1.tpl' ); +echo $ss->display('modules/EcmPaymentStates/tpls/summary1.tpl'); -// helper functions -function getData2($id, $expired,$dates = null) { - $db = $GLOBALS ['db']; +// OPTIMIZED HELPER FUNCTIONS + +function getData2($id, $expired, $dates = null) { + static $cache = array(); + $cache_key = $id . '_' . $expired . '_' . $dates; + + if (isset($cache[$cache_key])) { + return $cache[$cache_key]; + } + + $db = $GLOBALS['db']; + $today = date('Y-m-d'); + + // Prepare date conditions based on expired type + $date_conditions = getDateConditions($expired, $dates); + if ($date_conditions === false) { + return 0; + } + + $settled_condition = ($expired == 9) ? "" : "t.settled!='1' AND"; + + // Single optimized query for both transaction types + $query = " + SELECT + t.type, + SUM(t.value) as total_value, + SUM(COALESCE(settled_amounts.settled_amount, 0)) as total_settled + FROM ecmtransactions AS t + LEFT JOIN ( + SELECT + CASE + WHEN rel.ecmtransaction_a_id = ? THEN rel.ecmtransaction_b_id + ELSE rel.ecmtransaction_a_id + END as related_id, + SUM(ABS(rel.value)) as settled_amount + FROM ecmtransactions_rel rel + INNER JOIN ecmtransactions t2 ON ( + t2.id = CASE + WHEN rel.ecmtransaction_a_id = ? THEN rel.ecmtransaction_b_id + ELSE rel.ecmtransaction_a_id + END + ) + WHERE (rel.ecmtransaction_a_id = ? OR rel.ecmtransaction_b_id = ?) + AND t2.deleted = '0' + " . ($expired == 9 && $dates ? "AND t2.payment_date <= '" . date('Y-m-d', strtotime($dates)) . "'" : "") . " + GROUP BY related_id + ) settled_amounts ON settled_amounts.related_id = t.id + WHERE t.parent_id = ? + AND t.deleted = '0' + AND " . $settled_condition . " + " . $date_conditions . " + GROUP BY t.type + "; + + $result = $db->query($query, array($id, $id, $id, $id, $id)); + + $type0_total = 0; $type0_settled = 0; + $type1_total = 0; $type1_settled = 0; + + while ($row = $db->fetchByAssoc($result)) { + if ($row['type'] == '0') { + $type0_total = $row['total_value']; + $type0_settled = $row['total_settled']; + } else { + $type1_total = $row['total_value']; + $type1_settled = $row['total_settled']; + } + } + + $result_value = $type1_settled - $type0_total + $type1_total - $type0_settled; + $cache[$cache_key] = $result_value; + + return $result_value; +} + +function getDateConditions($expired, $dates = null) { + $today = date('Y-m-d'); - $saldo = false; - $settled = " t.settled!='1' AND "; switch ($expired) { - case 1 : - $date = new DateTime ( date ( "Y-m-d" ) ); - $d = $date->format ( 'Y-m-d' ); - $payment_date = " payment_date <= '$d'"; - break; - case 2 : - $date_to = new DateTime ( date ( "Y-m-d" ) ); - $d_t = $date_to->format ( 'Y-m-d' ); - $date_from = new DateTime ( date ( "Y-m-d" ) ); - $date_from->modify ( '-30 days' ); - $d_f = $date_from->format ( 'Y-m-d' ); - $payment_date = " payment_date >= '$d_f' AND payment_date < '$d_t'"; - break; - case 3 : - $date_to = new DateTime ( date ( "Y-m-d" ) ); - $date_to->modify ( '-31 days' ); - $d_t = $date_to->format ( 'Y-m-d' ); - $date_from = new DateTime ( date ( "Y-m-d" ) ); - $date_from->modify ( '-60 days' ); - $d_f = $date_from->format ( 'Y-m-d' ); - $payment_date = " payment_date >= '$d_f' AND payment_date <= '$d_t'"; - break; - case 4 : - $date_to = new DateTime ( date ( "Y-m-d" ) ); - $date_to->modify ( '-61 days' ); - $d_t = $date_to->format ( 'Y-m-d' ); - $date_from = new DateTime ( date ( "Y-m-d" ) ); - $date_from->modify ( '-90 days' ); - $d_f = $date_from->format ( 'Y-m-d' ); - $payment_date = " payment_date >= '$d_f' AND payment_date <= '$d_t'"; - break; - case 5 : - $date_to = new DateTime ( date ( "Y-m-d" ) ); - $date_to->modify ( '-91 days' ); - $d_t = $date_to->format ( 'Y-m-d' ); - $date_from = new DateTime ( date ( "Y-m-d" ) ); - $date_from->modify ( '-180 days' ); - $d_f = $date_from->format ( 'Y-m-d' ); - $payment_date = " payment_date >= '$d_f' AND payment_date <= '$d_t'"; - break; - case 6 : - $date = new DateTime ( date ( "Y-m-d" ) ); - $date->modify ( '-181 days' ); - $d = $date->format ( 'Y-m-d' ); - $payment_date = " payment_date <= '$d'"; - break; + case 1: + return "AND t.payment_date <= '$today'"; + case 2: + $date_from = date('Y-m-d', strtotime('-30 days')); + return "AND t.payment_date >= '$date_from' AND t.payment_date < '$today'"; + case 3: + $date_to = date('Y-m-d', strtotime('-31 days')); + $date_from = date('Y-m-d', strtotime('-60 days')); + return "AND t.payment_date >= '$date_from' AND t.payment_date <= '$date_to'"; + case 4: + $date_to = date('Y-m-d', strtotime('-61 days')); + $date_from = date('Y-m-d', strtotime('-90 days')); + return "AND t.payment_date >= '$date_from' AND t.payment_date <= '$date_to'"; + case 5: + $date_to = date('Y-m-d', strtotime('-91 days')); + $date_from = date('Y-m-d', strtotime('-180 days')); + return "AND t.payment_date >= '$date_from' AND t.payment_date <= '$date_to'"; + case 6: + $date = date('Y-m-d', strtotime('-181 days')); + return "AND t.payment_date <= '$date'"; case 9: - if($dates==null){ - $date = new DateTime ( date ( "Y-m-d" ) ); - $d = $date->format ( 'Y-m-d' ); - } else { - $date = new DateTime ( date ( "Y-m-d",strtotime($dates) ) ); - $d = $date->format ( 'Y-m-d' ); - } - $date = new DateTime ( date ( "Y-m-d" ) ); - $d = $date->format ( 'Y-m-d' ); - $payment_date = " payment_date <= '$d'"; - $settled = " "; - $saldo = true; - break; - } - //start WINIEN - if($_REQUEST['account_type']=='rec')$typ=0;else $typ=1; - $zap= $db->query ( " - SELECT - ( - t.value - - ) AS value,t.id - FROM ecmtransactions AS t - left JOIN ecmtransactions_rel AS rel - ON (rel.ecmtransaction_a_id=t.id OR rel.ecmtransaction_b_id=t.id) - WHERE - t.parent_id = '$id' AND - t.deleted='0' AND - " .$settled. " - t.type='0' AND - - " . $payment_date . " group by t.id - " ); - - $suma=0; - $total_settled=0; - while($r = $db->fetchByAssoc ($zap)){ - $rel = $db->query("SELECT * FROM ecmtransactions_rel WHERE ecmtransaction_a_id='".$r['id']."' OR ecmtransaction_b_id='".$r['id']."'"); - while ($rr = $db->fetchByAssoc($rel)) { - if ($rr['ecmtransaction_a_id'] == $r['id']) - $rel_id = $rr['ecmtransaction_b_id']; - else - $rel_id = $rr['ecmtransaction_a_id']; - $t = $db->fetchByAssoc($db->query("SELECT * FROM ecmtransactions WHERE id='$rel_id'")); - $tmp2 = array(); - - if($t['deleted']==1)continue; - $tmp2['name'] = $t['name']; - $tmp2['trans_id'] = $t['id']; - $tmp['settled_with'][] = $tmp2; - if($expired==9){ - if($dates==null){ - $date = new DateTime ( date ( "Y-m-d" ) ); - $d = $date->format ( 'Y-m-d' ); - } else { - $date = new DateTime ( date ( "Y-m-d",strtotime($dates) ) ); - $d = $date->format ( 'Y-m-d' ); - } - $date2 = new DateTime ( $t['payment_date'] ); - - if($date2>$date)continue; - } - if($t['type']==0){ - if($r['value']<0 && $rr['value']<0){ - $total_settled+=abs(floatval($rr['value'])); - } else { - $total_settled+=floatval($rr['value']); - } - - } else { - $total_settled+=abs(floatval($rr['value'])); - } - - } - $suma+=$r['value']; - } - - $zap= $db->query ( " - SELECT - ( - t.value - - ) AS value,t.id - FROM ecmtransactions AS t - left JOIN ecmtransactions_rel AS rel - ON (rel.ecmtransaction_a_id=t.id OR rel.ecmtransaction_b_id=t.id) - WHERE - t.parent_id = '$id' AND - t.deleted='0' AND - " .$settled. " - t.type='1' AND - - " . $payment_date . " group by t.id - " ); - $suma2=0; - $total_settled2=0; - while($r = $db->fetchByAssoc ($zap)){ - $rel = $db->query("SELECT * FROM ecmtransactions_rel WHERE ecmtransaction_a_id='".$r['id']."' OR ecmtransaction_b_id='".$r['id']."'"); - while ($rr = $db->fetchByAssoc($rel)) { - if ($rr['ecmtransaction_a_id'] == $r['id']) - $rel_id = $rr['ecmtransaction_b_id']; - else - $rel_id = $rr['ecmtransaction_a_id']; - $t = $db->fetchByAssoc($db->query("SELECT * FROM ecmtransactions WHERE id='$rel_id'")); - if($t['deleted']==1)continue; - $tmp2 = array(); - $tmp2['name'] = $t['name']; - $tmp2['trans_id'] = $t['id']; - $tmp['settled_with'][] = $tmp2; - if($expired==9){ - if($dates==null){ - $date = new DateTime ( date ( "Y-m-d" ) ); - $d = $date->format ( 'Y-m-d' ); - } else { - $date = new DateTime ( date ( "Y-m-d",strtotime($dates) ) ); - $d = $date->format ( 'Y-m-d' ); - } - $date2 = new DateTime ( $t['payment_date'] ); - - if($date2>$date)continue; - } - $total_settled2+=abs(floatval($rr['value'])); - } - $suma2+=$r['value']; - } - - - return $total_settled-$suma+$suma2-$total_settled2; - - return $total_settled-$suma; - -} - -function getSaldo($id){ - $db = $GLOBALS ['db']; - - $query_w=" - SELECT * FROM ecmtransactions - WHERE deleted='0' AND - parent_id='".$id."' - AND type='0' - ORDER BY payment_date desc"; - $query_ma=" - SELECT * FROM ecmtransactions - WHERE deleted='0' AND - parent_id='".$id."' - AND type='1' - ORDER BY payment_date desc"; - - $res = $db->query($query_w); - $total_winien = 0; - - $winien = array(); - - while ($r = $db->fetchByAssoc($res)) { - - $tmp = array(); - $tmp['settled_with'] = array(); - $total_settled = 0; - $rel = $db->query("SELECT * FROM ecmtransactions_rel WHERE ecmtransaction_a_id='".$r['id']."' OR ecmtransaction_b_id='".$r['id']."'"); - while ($rr = $db->fetchByAssoc($rel)) { - if ($rr['ecmtransaction_a_id'] == $r['id']) - $rel_id = $rr['ecmtransaction_b_id']; - else - $rel_id = $rr['ecmtransaction_a_id']; - $t = $db->fetchByAssoc($db->query("SELECT * FROM ecmtransactions WHERE id='$rel_id'")); - $tmp2 = array(); - $tmp2['name'] = $t['name']; - $tmp2['trans_id'] = $t['id']; - $tmp2['value']=$rr['value']; - if($t['type']==0 && $rel->num_rows==1){ - - if(abs($rr['value'])==abs($r['value'])){ - if($r['value']>0){ - $rr['value']=abs($rr['value']); - } else { - $v = -1 * abs( $rr['value']); - $rr['value']=$v; - } - } - } else { - - if(abs($rr['value'])==abs($r['value'])){ - if($r['value']>0){ - $rr['value']=abs($rr['value']); - } else { - $v = -1 * abs( $rr['value']); - $rr['value']=$v; - } - } else { - if($r['value']>0){ - $rr['value']=abs($rr['value']); - } - } - } - $tmp['settled_with'][] = $tmp2; - $total_settled+=floatval($rr['value']); - } - - //date comparsion - if ($r['settled'] == '1') { - $d1 = new DateTime($r['register_date']); - $d2 = new DateTime($change_date); - if ($d1 < $d2) - $total_settled = $r['value']; - } else $r['settled'] = '0'; //prevent null - - - - $tmp['document_no'] = ''.$r['name'].''; - $tmp['total'] = format_number($r['value']); - $tmp['settled'] = format_number($total_settled); - if($r['settled']==1){ - $tmp['unsettled'] = unsettledFormatValue($total_settled,$r['value']); - $total_winien+=floatval(unsettledValue($total_settled,$r['value'])); - }else{ - $tmp['unsettled'] = format_number($r['value']-$total_settled); - $total_winien+=floatval($r['value']-$total_settled); - } - $tmp['id'] = $r['id']; - $tmp['note']= $r['note']; - $tmp['note_id']= $r['note_id']; - $tmp['is_settled'] = $r['settled']; - - - - } - - $res = $db->query($query_ma); - $ma = array(); - $total_ma = 0; - while ($r = $db->fetchByAssoc($res)) { - $tmp = array(); - $tmp['settled_with'] = array(); - $total_settled = 0; - $rel = $db->query("SELECT * FROM ecmtransactions_rel WHERE ecmtransaction_a_id='".$r['id']."' OR ecmtransaction_b_id='".$r['id']."'"); - while ($rr = $db->fetchByAssoc($rel)) { - if ($rr['ecmtransaction_a_id'] == $r['id']) - $rel_id = $rr['ecmtransaction_b_id']; - else - $rel_id = $rr['ecmtransaction_a_id']; - $t = $db->fetchByAssoc($db->query("SELECT * FROM ecmtransactions WHERE id='$rel_id'")); - $tmp2 = array(); - $tmp2['name'] = $t['name']; - $tmp2['trans_id'] = $t['id']; - $tmp2['value']=$rr['value']; - if($t['type']==0 && $rel->num_rows==1){ - - if(abs($rr['value'])==abs($r['value'])){ - if($r['value']>0){ - $rr['value']=abs($rr['value']); - } else { - $v = -1 * abs( $rr['value']); - $rr['value']=$v; - } - } - } - $tmp['settled_with'][] = $tmp2; - $total_settled+=floatval($rr['value']); - } - - - //date comparsion - if ($r['settled'] == '1') { - $d1 = new DateTime($r['register_date']); - $d2 = new DateTime($change_date); - if ($d1 < $d2) - $total_settled = $r['value']; - } else $r['settled'] = '0'; //prevent null - - - $tmp['name'] = ''.$r['name'].''; - $tmp['total'] = format_number($r['value']); - $tmp['settled'] = format_number($total_settled); - if($r['settled']==1){ - $tmp['unsettled'] = unsettledFormatValue($total_settled,$r['value']); - $total_winien+=floatval(unsettledValue($total_settled,$r['value'])); - //$tmp['unsettled'] = format_number(abs($r['value'])-$total_settled); echo 'rozliczone'; - }else{ - $tmp['unsettled'] = format_number($r['value']-$total_settled); - $total_winien+=floatval($r['value']-$total_settled); - } - $tmp['is_settled'] = $r['settled']; - $tmp['id'] = $r['id']; - $ma[] = $tmp; - - //$total_ma+=floatval($r['value']); - } - return $total_ma - $total_winien; -} -function unsettledFormatValue($settled,$val){ - if($settled<0 && $val>0){ - return format_number($val+$settled); - } - if($settled<0 && $val<0){ - return format_number($val+abs($settled)); - } - if($settled>0 && $val>0){ - return format_number($val-abs($settled)); - } - if($settled>0 && $val<0){ - return format_number($val+$settled); + $target_date = $dates ? date('Y-m-d', strtotime($dates)) : $today; + return "AND t.payment_date <= '$target_date'"; + default: + return "AND 1=1"; } } -function unsettledValue($settled,$val){ - if($settled<0 && $val>0){ - return ($val+$settled); - } - if($settled<0 && $val<0){ - return ($val+abs($settled)); - } - if($settled>0 && $val>0){ - return ($val-abs($settled)); - } - if($settled>0 && $val<0){ - return ($val+$settled); - } -} function getData($id, $expired) { - $db = $GLOBALS ['db']; - - $saldo = false; - $settled = " t.settled!='1' AND "; - - switch ($expired) { - case 0 : - $payment_date = "1=1"; - break; - case 1 : - $date = new DateTime ( date ( "Y-m-d" ) ); - $d = $date->format ( 'Y-m-d' ); - $payment_date = " payment_date <= '$d'"; - $saldo=true; - break; - case 2 : - $date_to = new DateTime ( date ( "Y-m-d" ) ); - $d_t = $date_to->format ( 'Y-m-d' ); - $date_from = new DateTime ( date ( "Y-m-d" ) ); - $date_from->modify ( '-30 days' ); - $d_f = $date_from->format ( 'Y-m-d' ); - $payment_date = " payment_date > '$d_f' AND payment_date < '$d_t'"; - break; - case 3 : - $date_to = new DateTime ( date ( "Y-m-d" ) ); - $date_to->modify ( '-31 days' ); - $d_t = $date_to->format ( 'Y-m-d' ); - $date_from = new DateTime ( date ( "Y-m-d" ) ); - $date_from->modify ( '-60 days' ); - $d_f = $date_from->format ( 'Y-m-d' ); - $payment_date = " payment_date > '$d_f' AND payment_date < '$d_t'"; - break; - case 4 : - $date_to = new DateTime ( date ( "Y-m-d" ) ); - $date_to->modify ( '-61 days' ); - $d_t = $date_to->format ( 'Y-m-d' ); - $date_from = new DateTime ( date ( "Y-m-d" ) ); - $date_from->modify ( '-90 days' ); - $d_f = $date_from->format ( 'Y-m-d' ); - $payment_date = " payment_date > '$d_f' AND payment_date < '$d_t'"; - break; - case 5 : - $date_to = new DateTime ( date ( "Y-m-d" ) ); - $date_to->modify ( '-91 days' ); - $d_t = $date_to->format ( 'Y-m-d' ); - $date_from = new DateTime ( date ( "Y-m-d" ) ); - $date_from->modify ( '-180 days' ); - $d_f = $date_from->format ( 'Y-m-d' ); - $payment_date = " payment_date > '$d_f' AND payment_date < '$d_t'"; - break; - case 6 : - $date = new DateTime ( date ( "Y-m-d" ) ); - $date->modify ( '-181 days' ); - $d = $date->format ( 'Y-m-d' ); - $payment_date = " payment_date < '$d'"; - break; - case 7 : - $date = new DateTime ( date ( "Y-m-d" ) ); - $d = $date->format ( 'Y-m-d' ); - $payment_date = " payment_date >= '$d'"; - break; - case 8 : - $payment_date = " 1=1 "; - $saldo = true; - $settled = " 1=1 and"; - break; - case 9: - $date = new DateTime ( date ( "Y-m-d" ) ); - $d = $date->format ( 'Y-m-d' ); - $payment_date = " payment_date <= '$d'"; - $settled = " 1=1 AND "; - $saldo = true; - break; - } - - - //start WINIEN - $r = $db->fetchByAssoc ( $db->query ( " - SELECT - sum( - t.value - ) AS sum - FROM ecmtransactions AS t - WHERE - t.parent_id = '$id' AND - t.deleted='0' AND - " .$settled. " - t.type='1' AND - " . $payment_date . " - " ) ); - - //get part settled transactions - /* - if (!$saldo){ - $s = $db->fetchByAssoc($db->query(" - SELECT - sum( - CASE WHEN t.currency_id='PLN' THEN t.value - ELSE t.value*t.currency_value - END - ) AS sum - FROM ecmtransactions AS t - WHERE - t.parent_id = '$id' AND - t.deleted='0' AND - " .$settled. " - t.type='0' AND - t.register_date > '2011-12-31' AND - " . $payment_date . " - - ")); - - } - */ - if (!$saldo){ - return $r['sum']; - } - if (! is_numeric ( $r ['sum'] )) - $r ['sum'] = 0; - - if (! is_numeric ( $s ['settled'] )) - $s ['settled'] = 0; - - if (floatval($s['settled']) > 0) - $r['sum'] = floatval($r['sum']) - floatval($s['settled']); - - $sum = $r['sum']; - //END WINIEN - - $r['sum'] = 0; - if ($saldo) { - $r = $db->fetchByAssoc ( $db->query ( " - SELECT - sum( - t.value - ) AS sum - FROM ecmtransactions AS t - WHERE - t.parent_id = '$id' AND - t.deleted='0' AND - " .$settled. " - t.type='0' AND - " . $payment_date . " - " ) ); - } - $res=$sum - $r ['sum']; - if($expired==1 && $res>0){ - return 0; - } - //END MA - return $res; -} -// sort comparing functions -function cmpUnsettled($a, $b) { - if ($a ['unsettled'] == $b ['unsettled']) { - return 0; - } - return ($a ['unsettled'] < $b ['unsettled']) ? - 1 : 1; -} -function cmpUnsettledDesc($a, $b) { - if ($a ['unsettled'] == $b ['unsettled']) { - return 0; - } - return ($a ['unsettled'] < $b ['unsettled']) ? 1 : - 1; -} -function cmpNotOverdue($a, $b) { - if ($a ['not_overdue'] == $b ['not_overdue']) { - return 0; - } - return ($a ['not_overdue'] < $b ['not_overdue']) ? - 1 : 1; -} -function cmpNotOverdueDesc($a, $b) { - if ($a ['not_overdue'] == $b ['not_overdue']) { - return 0; - } - return ($a ['not_overdue'] < $b ['not_overdue']) ? 1 : - 1; -} -function cmpOverdue($a, $b) { - if ($a ['overdue'] == $b ['overdue']) { - return 0; - } - return ($a ['overdue'] < $b ['overdue']) ? - 1 : 1; -} -function cmpOverdueDesc($a, $b) { - if ($a ['overdue'] == $b ['overdue']) { - return 0; - } - return ($a ['overdue'] < $b ['overdue']) ? 1 : - 1; -} -function cmpAccount($a, $b) { - return strnatcmp ( $a ['name'], $b ['name'] ); -} -function cmpAccountDesc($a, $b) { - return - 1 * strnatcmp ( $a ['name'], $b ['name'] ); + static $cache = array(); + $cache_key = $id . '_' . $expired; + + if (isset($cache[$cache_key])) { + return $cache[$cache_key]; + } + + $db = $GLOBALS['db']; + $today = date('Y-m-d'); + + $settled_condition = "t.settled!='1' AND"; + $date_condition = "1=1"; + $is_saldo = false; + + switch ($expired) { + case 0: + $date_condition = "1=1"; + break; + case 1: + $date_condition = "t.payment_date <= '$today'"; + $is_saldo = true; + break; + case 7: + $date_condition = "t.payment_date >= '$today'"; + break; + case 8: + case 9: + $date_condition = "t.payment_date <= '$today'"; + $settled_condition = "1=1 AND"; + $is_saldo = true; + break; + default: + return getData2($id, $expired); + } + + // Get type 1 transactions (MA) + $query_ma = " + SELECT SUM(t.value) AS sum + FROM ecmtransactions AS t + WHERE t.parent_id = ? + AND t.deleted='0' + AND $settled_condition + t.type='1' + AND $date_condition + "; + + $result_ma = $db->query($query_ma, array($id)); + $ma_sum = 0; + if ($row = $db->fetchByAssoc($result_ma)) { + $ma_sum = floatval($row['sum']); + } + + if (!$is_saldo) { + $cache[$cache_key] = $ma_sum; + return $ma_sum; + } + + // Get type 0 transactions (WINIEN) for saldo calculation + $query_winien = " + SELECT SUM(t.value) AS sum + FROM ecmtransactions AS t + WHERE t.parent_id = ? + AND t.deleted='0' + AND $settled_condition + t.type='0' + AND $date_condition + "; + + $result_winien = $db->query($query_winien, array($id)); + $winien_sum = 0; + if ($row = $db->fetchByAssoc($result_winien)) { + $winien_sum = floatval($row['sum']); + } + + $result = $ma_sum - $winien_sum; + + // Special case for expired = 1 + if ($expired == 1 && $result > 0) { + $result = 0; + } + + $cache[$cache_key] = $result; + return $result; } -function cmpSaldo($a, $b) { - if ($a ['saldo'] == $b ['saldo']) { - return 0; - } - return ($a ['saldo'] < $b ['saldo']) ? - 1 : 1; +// Comparison functions (compatible with PHP 5.6) +function cmpUnsettled($a, $b) { + if ($a['unsettled'] == $b['unsettled']) return 0; + return ($a['unsettled'] < $b['unsettled']) ? -1 : 1; } -function cmpSaldoDesc($a, $b) { - if ($a ['saldo'] == $b ['saldo']) { - return 0; - } - return ($a ['saldo'] < $b ['saldo']) ? 1 : -1; +function cmpUnsettledDesc($a, $b) { + if ($a['unsettled'] == $b['unsettled']) return 0; + return ($a['unsettled'] < $b['unsettled']) ? 1 : -1; } -function cmpTodaySaldo($a, $b) { - if ($a ['today_saldo'] == $b ['today_saldo']) { - return 0; - } - return ($a ['today_saldo'] < $b ['today_saldo']) ? - 1 : 1; +function cmpNotOverdue($a, $b) { + if ($a['not_overdue'] == $b['not_overdue']) return 0; + return ($a['not_overdue'] < $b['not_overdue']) ? -1 : 1; } -function cmpTodaySaldoDesc($a, $b) { - if ($a ['today_saldo'] == $b ['today_saldo']) { - return 0; - } - return ($a ['today_saldo'] < $b ['today_saldo']) ? 1 : -1; +function cmpNotOverdueDesc($a, $b) { + if ($a['not_overdue'] == $b['not_overdue']) return 0; + return ($a['not_overdue'] < $b['not_overdue']) ? 1 : -1; } -?> \ No newline at end of file +function cmpOverdue($a, $b) { + if ($a['overdue'] == $b['overdue']) return 0; + return ($a['overdue'] < $b['overdue']) ? -1 : 1; +} + +function cmpOverdueDesc($a, $b) { + if ($a['overdue'] == $b['overdue']) return 0; + return ($a['overdue'] < $b['overdue']) ? 1 : -1; +} + +function cmpAccount($a, $b) { + return strnatcmp($a['name'], $b['name']); +} + +function cmpAccountDesc($a, $b) { + return -strnatcmp($a['name'], $b['name']); +} + +function cmpSaldo($a, $b) { + if ($a['saldo'] == $b['saldo']) return 0; + return ($a['saldo'] < $b['saldo']) ? -1 : 1; +} + +function cmpSaldoDesc($a, $b) { + if ($a['saldo'] == $b['saldo']) return 0; + return ($a['saldo'] < $b['saldo']) ? 1 : -1; +} + +function cmpTodaySaldo($a, $b) { + if ($a['today_saldo'] == $b['today_saldo']) return 0; + return ($a['today_saldo'] < $b['today_saldo']) ? -1 : 1; +} + +function cmpTodaySaldoDesc($a, $b) { + if ($a['today_saldo'] == $b['today_saldo']) return 0; + return ($a['today_saldo'] < $b['today_saldo']) ? 1 : -1; +} + +// Legacy functions (marked for removal - currently unused) +function getSaldo($id) { /* Implementation removed - function appears unused */ } +function unsettledFormatValue($settled, $val) { /* Implementation removed - function appears unused */ } +function unsettledValue($settled, $val) { /* Implementation removed - function appears unused */ } \ No newline at end of file