= $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 " ; 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 " ; debug (0, $query) ; $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 = "" ; /************************************************ * Stampo in ogni caso prima quelli forzati Best ************************************************/ foreach ($arr_forzati as $id_cliente_best) { $str .= "" ; $str .= "" . htmlspecialchars($arr_nomi_cli[$id_cliente_best]) . "" ; $str .= "" . 'ü' . "" ; $str .= "" . $Vx[$id_cliente_best] . "" ; $str .= "" . $Vy[$id_cliente_best] . "" ; $str .= "" . $Vz[$id_cliente_best] . "" ; $str .= "" . $V[$id_cliente_best] . "" ; $str .= "" ; } @reset($arr_forzati) ; foreach($ARR_ORD as $id_cliente => $v) { if (! in_array($id_cliente, $arr_forzati)) { $str .= "" ; $str .= "" . htmlspecialchars($arr_nomi_cli[$id_cliente]) . "" ; $str .= "" ; $str .= "" . $Vx[$id_cliente] . "" ; $str .= "" . $Vy[$id_cliente] . "" ; $str .= "" . $Vz[$id_cliente] . "" ; $str .= "" . $V[$id_cliente] . "" ; $str .= "" ; } } $str .= "" ; $header = "NOME CLIENTE,FORZATO,VENDUTO
(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" ; ?> <? echo TITLE ?> Stampa i primi Clienti
Piramide dei Clienti (in base ai dati del e calcolata sui clienti con un numero ordini minimo di )