/*****************************************************************************
* arr_pu: contiene i valori pu
* arr_prod_acq: contiene il valore del parametro Prodotti Acquistati
* 13.1.2006: vengono considerati anche i clienti che sono stati
* forzati come Best (flag Best della tabella clienti)
*****************************************************************************/
include ("../common/public.php") ;
$arrParGen = array() ;
$arrParGen = RecuperaParametriGenerali($arrParGen, $tparametri) ;
$cp_venduto = $arrParGen['PercVendCP'] ;
$cp_prodotti = $arrParGen['PercProdCP'] ;
$cp_pagamenti = $arrParGen['PercPagCP'] ;
$cp_nordini = $arrParGen['NumOrdCP'] ;
$AnnoCalcolo = $anno - 1 ;
$tclienti_cp = "clienti" ;
$tsarzi_cp = "sarzi_$AnnoCalcolo" ;
function CalcolaDiffGiorni($datafine, $datainizio, $giorni)
{
/***************************************************************************************
* se il metodo di pagamento è anticipato (giorni = 0) oppure Contrassegno (giorni 999)
* oppure Vista Fattura (giorni 999) allora va bene (ritorna 1)
****************************************************************************************/
if ($giorni == 999 or $giorni == 0)
return 1 ;
if ($datainizio == "0000-00-00")
return 2 ; // CASO DA NON CONSIDERARE
if ($datafine == "0000-00-00")
return 0 ;
// ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $datafine, $reg_fine) ;
// ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $datainizio, $reg_inizio) ;
preg_match ("/([0-9]{4})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})/", $datafine, $reg_fine) ;
preg_match ("/([0-9]{4})[-\/]([0-9]{1,2})[-\/]([0-9]{1,2})/", $datainizio, $reg_inizio) ;
$ggpass = dateDiff($reg_fine[3], $reg_fine[2], $reg_fine[1], $reg_inizio[3], $reg_inizio[2], $reg_inizio[1]) ;
if ($ggpass <= $giorni)
return 1 ;
else
return 0 ;
}
$arr_valori = array() ;
$arr_cli_for_pro = array() ;
$arr_pu = array() ;
$arr_prod_acq = array() ;
$arr_nomi_cli = array() ;
/****************************************************************************
* $arr_forzati contiene gli id dei clienti che sono stati forzati come Best
*****************************************************************************/
$arr_forzati = array() ;
/************************************************************************
* arr_pagamenti mi dice per ogni cliente quanti sono gli ordini pagati
* in tempo (campo OK) e quanti non pagati in tempo (campo NOT_OK)
*************************************************************************/
$arr_pagamenti = array() ;
/***
* considero subito i clienti che hanno un numero di ordini >= $cp_nordini.
***/
$q = "
select
TMP.IdCliente,
TMP.TotaleOrdini
from
(
select
O.IdCliente,
count(*) as TotaleOrdini
from
ordini O
where
O.Anno = $AnnoCalcolo
group by
O.IdCliente
order by
TotaleOrdini
) as TMP
where
TMP.TotaleOrdini >= $cp_nordini
" ;
debug (1, $q) ;
list($n, $d) = $db->RecuperaDati($q) ;
$strIdClienti = implode(",", $d['IdCliente']) ;
$dbfor = new FC_SQL ;
$id_old_fornitore = 0 ;
$old_id_ordine = 0 ;
$query = "
select
O.* ,
O.idcliente as id_cliente,
D.*,
(D.NumCartoni * D.ConfezioniDa) as totbottiglie,
F.nome as nome_fornitore,
(F.Importanza * F.Facilita) as PU,
C.nome as nome_cliente,
C.Best,
P.modalita as tipo_pagamento,
P.giorni as giorni
from
ordini O
inner join dettagli D on D.idordine = O.idOrdini and D.Anno = $AnnoCalcolo
inner join fornitori F on F.idfornitori = O.idfornitore
inner join clienti C on C.idclienti = O.idcliente
inner join pagamenti P on O.idpagamento = P.idpagamenti
where
O.Anno = $AnnoCalcolo and
O.idcliente IN ($strIdClienti)
order by
C.nome,
O.idfornitore,
O.idordini,
D.idprodotto asc
" ;
$db->query($query) ;
while ($db->next_record())
{
if ( $db->f("Best") == 1 and !in_array($db->f("id_cliente"), $arr_forzati) )
$arr_forzati[] = $db->f("id_cliente") ;
$importo = 0 ;
$id_ordine = $db->f("IdOrdini") ;
if ($id_ordine != $old_id_ordine)
{
if ($old_id_ordine != 0)
{
debug (0, "Entro ; $id_ordine ; $data_invio_assegno, $data_sped_fattura, $giorni") ;
$ok = CalcolaDiffGiorni($data_invio_assegno, $data_sped_fattura, $giorni) ;
if ($ok == 1)
$arr_pagamenti[$id_cliente]['OK'] ++ ;
elseif ($ok == 0)
$arr_pagamenti[$id_cliente]['NOT_OK'] ++ ;
$arr_pagamenti[$id_cliente]['TOT_ORDINI'] ++ ;
}
$pp = $old_id_ordine ;
$old_id_ordine = $id_ordine ;
$sc_1 = ($imp_ordine * $sconto1 / 100) ;
$imp_ordine1 = $imp_ordine - $sc_1 ;
$sc_2 = ($imp_ordine1 * $sconto2 / 100) ;
$tot_sc = $sc_1 + $sc_2 ;
$imp_ordine = $imp_ordine - $tot_sc - $valNC ;
$imp_sing_for += $imp_ordine ;
if ($id_cliente > 0)
$arr_venduto[$id_cliente] += $imp_ordine ;
$imp_ordine = 0;
}
$tipo_pagamento = $db->f("tipo_pagamento") ;
$giorni = $db->f("giorni") ;
$data_sped_fattura = $db->f("DataSpedFattura") ;
$data_invio_assegno = $db->f("DataInvAss") ;
$id_cliente = $db->f("id_cliente") ;
$id_fornitore = $db->f("IdFornitore") ;
$nome_fornitore = $db->f("nome_fornitore") ;
$tot_bottiglie = $db->f("totbottiglie") ;
$importoNC = $db->f("ImportoNC") ;
$sconto1 = $db->f("Sconto1") ;
$sconto2 = $db->f("Sconto2") ;
$scontoprd = $db->f("ScontoPrd") ;
if (! array_key_exists($id_fornitore, $arr_pu))
$arr_pu[$id_fornitore] = $db->f("PU") ;
if (! array_key_exists($id_cliente, $arr_nomi_cli))
$arr_nomi_cli[$id_cliente] = $db->f("nome_cliente") ;
if (! array_key_exists($id_cliente, $arr_cli_for_pro) or
(! array_key_exists($id_fornitore, $arr_cli_for_pro[$id_cliente]))
)
$arr_cli_for_pro[$id_cliente][$id_fornitore] = array() ;
if ($importoNC > 0)
$valNC = ($importoNC / 1.2) ;
else
$valNC = 0 ;
if ($id_fornitore != $idsarzi)
$id_prodotto = $db->f("IdProdotto") ;
else
$id_prodotto = substr($db->f("IdProdotto"), 2) ;
$arr_cli_for_pro[$id_cliente][$id_fornitore]['id_prodotti'] = array() ;
if (! @in_array($id_prodotto, $arr_cli_for_pro[$id_cliente][$id_fornitore]['id_prodotti']))
{
debug (0, "ID $id_prodotto NON PRESENTE") ;
$arr_cli_for_pro[$id_cliente][$id_fornitore]['num_prodotti'] += 1 ;
$arr_cli_for_pro[$id_cliente][$id_fornitore]['id_prodotti'][] = $id_prodotto ;
unset($arr_prodotti) ;
$arr_prodotti = array() ;
unset($arr_id_trovati) ;
$arr_id_trovati = array() ;
$arr_valori[$id_cliente] = array() ;
if (!@array_key_exists($id_fornitore, $arr_valori[$id_cliente]))
{
$id_old_fornitore = $id_fornitore ;
$costo_tot_pro = 0 ;
$costo_pro_acq = 0 ;
$imp_sing_for = 0 ;
/****************************************************
* per questo fornitore conto il numero di prodotti
****************************************************/
if ($id_fornitore != $idsarzi)
$qfor = "
select
*
from
prodotti
where
fornitore = $id_fornitore
" ;
else
$qfor = "
select
*
from
$tsarzi_cp
" ;
debug (0, $qfor) ;
$dbfor->query($qfor) ;
$max_pro = $dbfor->num_rows() ;
debug (0, "ID FORNITORE = $id_fornitore ; MAX_PRO = $max_pro ; ID PRODOTTO = $id_prodotto ; TOT BOTTIGLIE = $tot_bottiglie ;") ;
while ($dbfor->next_record())
{
$costo_tot_pro += $dbfor->f("PrezzoUnitario") ;
$arr_prodotti[$dbfor->f("IdProdotti")] = $dbfor->f("PrezzoUnitario") ;
}
$arr_valori[$id_cliente][$id_fornitore] = array("nome_fornitore" => $nome_fornitore,
"tot_prodotti" => $max_pro,
"costo_tot_prodotti" => $costo_tot_pro ) ;
}
else
{
/******************************************************************************************
* i valori totali per questa coppia cliente / fornitori li ho già contati
* mi concentro sul singolo prodotto
********************************************************************************************/
if ($id_fornitore != $idsarzi)
$qfor = "
select
*
from
prodotti
where
fornitore = $id_fornitore
and IdProdotti = $id_prodotto
" ;
else
$qfor = "
select
*
from
$tsarzi_cp
where
IdProdotti = $id_prodotto
" ;
debug (0, $qfor) ;
$dbfor->query($qfor) ;
debug (0, "ID FORNITORE = $id_fornitore ; MAX_PRO = $max_pro ; ID PRODOTTO = $id_prodotto ; TOT BOTTIGLIE = $tot_bottiglie ;") ;
while ($dbfor->next_record())
$arr_prodotti[$dbfor->f("IdProdotti")] = $dbfor->f("PrezzoUnitario") ;
}
}
else
{
/******************************************************************************************
* i valori totali per questa coppia cliente / fornitori li ho già contati
* mi concentro sul singolo prodotto
********************************************************************************************/
if ($id_fornitore != $idsarzi)
$qfor = "
select
*
from
prodotti
where
fornitore = $id_fornitore
and IdProdotti = $id_prodotto
" ;
else
$qfor = "
select
*
from
$tsarzi_cp
where
IdProdotti = $id_prodotto
" ;
$dbfor->query($qfor) ;
while ($dbfor->next_record())
$arr_prodotti[$dbfor->f("IdProdotti")] = $dbfor->f("PrezzoUnitario") ;
}
if (!array_key_exists($id_cliente, $arr_valori))
$arr_valori[$id_cliente] = array() ;
if (
array_key_exists($id_prodotto, $arr_prodotti) and
! in_array($id_prodotto, $arr_id_trovati)
)
{
$arr_id_trovati[] = $id_prodotto ;
$arr_valori[$id_cliente][$id_fornitore]['prodotti_acq'] += 1 ;
$arr_valori[$id_cliente][$id_fornitore]['costo_prodotti_acq'] += $arr_prodotti[$id_prodotto] ;
}
if (array_key_exists($id_prodotto, $arr_prodotti))
{
$impparz = $tot_bottiglie * $arr_prodotti[$id_prodotto] ;
if ($scontoprd != "")
$impparz = CalcolaScontoProdotto($impparz, $scontoprd) ;
$imp_ordine += $impparz ;
}
}
/**********************************************
* bisogna fare il discorso sull'ultimo ordine
***********************************************/
$old_id_ordine = $id_ordine ;
$ok = CalcolaDiffGiorni($data_invio_assegno, $data_sped_fattura, $giorni) ;
if ($ok == 1)
$arr_pagamenti[$id_cliente]['OK'] ++ ;
elseif ($ok == 0)
$arr_pagamenti[$id_cliente]['NOT_OK'] ++ ;
$arr_pagamenti[$id_cliente]['TOT_ORDINI'] ++ ;
$sc_1 = ($imp_ordine * $sconto1 / 100) ;
$imp_ordine1 = $imp_ordine - $sc_1 ;
$sc_2 = ($imp_ordine1 * $sconto2 / 100) ;
$tot_sc = $sc_1 + $sc_2 ;
$imp_ordine = $imp_ordine - $tot_sc - $valNC ;
$imp_sing_for += $imp_ordine ;
debug (0, "IMP ORDINE = $imp_ordine ; TOT_SC = $tot_sc ; IMP SING FOR = $imp_sing_for ; VALNC = $valNC") ;
$arr_venduto[$id_cliente] += $imp_ordine ;
$imp_ordine = 0;
/*************************************************************************************
* tolgo dall'arr_pagamenti tutti i clienti che hanno un numero di ordini < $cp_nordini
* Questo valore è parametrico e viene letto nel file common/public.php.
* In $arr_cl_da_eliminare ho la lista di tutti gli id dei clienti da non considerare
* in quanto non hanno il numero minimo di ordini richiesto
**************************************************************************************/
@reset($arr_pagamenti) ;
$arr_tmp = $arr_pagamenti ;
$arr_pagamenti = array() ;
foreach($arr_tmp as $id_cl => $arr_id_cl)
// while(list($id_cl, $arr_id_cl) = each($arr_tmp))
{
if ($arr_id_cl['TOT_ORDINI'] < $cp_nordini)
$arr_cl_da_eliminare[] = $id_cl ;
else
$arr_pagamenti["$id_cl"] = array('OK' => $arr_id_cl['OK'], 'NOT_OK' => $arr_id_cl['NOT_OK'], 'TOT_ORDINI' => $arr_id_cl['TOT_ORDINI']) ;
}
/******************************************
* mi calcolo le percentuali sui pagamenti
******************************************/
@reset($arr_pagamenti) ;
foreach($arr_pagamenti as $id_cliente => $arr_ok)
// while (list($id_cliente, $arr_ok) = each($arr_pagamenti) )
{
$arr_pagamenti[$id_cliente]['PERC_OK'] = ($arr_ok['OK'] / ($arr_ok['OK'] + $arr_ok['NOT_OK'])) * 100 ;
$arr_pag_perc[$id_cliente] = ($arr_ok['OK'] / ($arr_ok['OK'] + $arr_ok['NOT_OK'])) * 100 ;
}
$p_max = max($arr_pag_perc) ;
$p_min = min($arr_pag_perc) ;
/************************************
* faccio il discorso sui pagamenti
************************************/
foreach($arr_pag_perc as $id_cliente => $p)
$Vz[$id_cliente] = ($p - $p_min) / ($p_max - $p_min) ;
/*********************************************************************
* devo togliere dall'arr_venduto i clienti che non devo considerare
*********************************************************************/
arsort($arr_venduto) ;
$arr_tmp_ven = $arr_venduto ;
$arr_venduto = array() ;
$arr_cl_da_eliminare = array() ;
foreach($arr_tmp_ven as $id_cl => $val_venduto)
// while(list($id_cl, $val_venduto) = each($arr_tmp_ven))
{
if (@!in_array($id_cl, $arr_cl_da_eliminare))
$arr_venduto["$id_cl"] = $val_venduto ;
}
$x_max = max($arr_venduto) ;
$x_min = min($arr_venduto) ;
debug(0, "x_max = $x_max ; x_min = $x_min") ;
/************************************
* faccio il discorso sul venduto
************************************/
foreach($arr_venduto as $id_cliente => $x)
$Vx[$id_cliente] = ($x - $x_min) / ($x_max - $x_min) ;
/***************************************
* mi calcolo le percentuali
****************************************/
$arr_tmp_val = $arr_valori ;
$arr_valori = array() ;
foreach($arr_tmp_val as $id_cl => $arr_param)
{
if (@!in_array($id_cl, $arr_cl_da_eliminare))
$arr_valori["$id_cl"] = $arr_param ;
}
@reset($arr_valori) ;
foreach($arr_valori as $id_cliente => $arr_id_fornitori)
{
foreach($arr_id_fornitori as $id_fornitore => $arr_sing_forn)
{
if ($arr_sing_forn['tot_prodotti'] > 0)
{
$perc_prodotti = ($arr_sing_forn['prodotti_acq'] / $arr_sing_forn['tot_prodotti']) * 100 ;
$perc_costo = ($arr_sing_forn['costo_prodotti_acq'] / $arr_sing_forn['costo_tot_prodotti']) * 100 ;
}
else
{
$perc_prodotti = 0 ;
$perc_costo = 0 ;
}
$arr_valori[$id_cliente][$id_fornitore]['perc_prodotti'] = $perc_prodotti ;
$arr_valori[$id_cliente][$id_fornitore]['perc_costo'] = $perc_costo ;
$arr_valori[$id_cliente][$id_fornitore]['ica'] = ($perc_prodotti + $perc_costo) / 2 ;
$arr_prod_acq[$id_cliente] += $arr_pu[$id_fornitore] * $arr_valori[$id_cliente][$id_fornitore]['ica'] ;
}
}
$y_max = max($arr_prod_acq) ;
$y_min = min($arr_prod_acq) ;
/***********************************************
* faccio il discorso sui prodotti acquistati
***********************************************/
foreach($arr_prod_acq as $id_cliente => $y)
{
if (($y_max - $y_min) > 0)
$Vy[$id_cliente] = @(($y - $y_min) / ($y_max - $y_min)) ;
else
$Vy[$id_cliente] = 0 ;
}
/*******************************
* mi calcolo i valori finali
*******************************/
foreach($arr_venduto as $id_cliente => $x)
$V[$id_cliente] = ($Vx[$id_cliente] * $cp_venduto) + ($Vy[$id_cliente] * $cp_prodotti) + ($Vz[$id_cliente] * $cp_pagamenti) ;
arsort($V) ;
arsort($Vx) ;
arsort($Vy) ;
arsort($Vz) ;
foreach($V as $id_cliente => $v)
$arr_id_clienti[] = $id_cliente ;
$str_id_clienti = implode(",", $arr_id_clienti) ;
$str_id_clienti_forzati = implode(",", $arr_forzati) ;
@reset($V) ;
@reset($Vx) ;
@reset($Vy) ;
@reset($Vz) ;
if (!isset($ord) or $ord == "vf")
$ARR_ORD = $V ;
elseif ($ord == "ve")
$ARR_ORD = $Vx ;
elseif ($ord == "pr")
$ARR_ORD = $Vy ;
elseif ($ord == "pa")
$ARR_ORD = $Vz ;
$str = "
(peso = $cp_venduto %),PRODOTTI ACQUISTATI
(peso = $cp_prodotti %),PAGAMENTI
(peso = $cp_pagamenti %),VALORE FINALE" ;
$strSort = "str,na,int,int,int,int" ;
$iniWP = "28,7,15,18,15,15" ;
$setColType = "ro,ro,ro,ro,ro,ro" ;
$setColAlign = "left,center,center,center,center,center" ;
?>