Location: PHPKode > projects > Progetto e3g > e3g_0.19.2/libraries/e3g_cron.php
<?php
/**
 * Progetto e3g - Equogest/GestiGAS
 *   Software gestionali per l'economia solidale
 *   <http://www.progettoe3g.org>
 *
 * Copyright (C) 2003-2009
 *   Andrea Piazza <http://www.andreapiazza.it>
 *   Marco Munari  <http://www.marcomunari.it>
 *
 * @package Progetto e3g - Equogest/GestiGAS
 * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
 * 
 * Questo  programma e' software  libero; e' lecito redistribuirlo  o
 * modificarlo secondo i termini  della Licenza Pubblica Generica GNU
 * come  pubblicata dalla Free  Software  Foundation; o la versione 2
 * della licenza o (a propria scelta) una versione successiva.
 * 
 * Questo programma e' distribuito nella  speranza che sia  utile, ma
 * SENZA  ALCUNA GARANZIA;  senza  neppure la  garanzia implicita  di
 * NEGOZIABILITA' o di APPLICABILITA' PER  UN PARTICOLARE  SCOPO.  Si
 * veda la Licenza Pubblica Generica GNU per avere maggiori dettagli.
 * 
 * Questo  programma deve  essere  distribuito assieme  ad una  copia
 * della Licenza Pubblica Generica GNU.
*/


require_once( dirname(__FILE__) . '/../config.php' );
require_once( dirname(__FILE__) . '/../libraries/pop3_class/pop3.php' );


//------------------------------------------------------------------------------
// Funzione richiamata periodicamente da cron o simili
//------------------------------------------------------------------------------
function e3g_cron() {
    
    $p4a =& p4a::singleton();
    $db =& p4a_db::singleton();

    $sql_text = 
        "SELECT mailing_list, " .
        "       notifica_apertura, ( notifica_apertura_data = CURDATE() ) AS notifica_apertura_inviata_oggi, " .
        "       notifica_chiusura, ( notifica_chiusura_data = CURDATE() ) AS notifica_chiusura_inviata_oggi, " .
        "       notifica_lista_spesa, ( notifica_lista_spesa_data = CURDATE() ) AS notifica_lista_spesa_inviata_oggi " .
        "  FROM _aziende" .
        " WHERE prefix = '" . $p4a->e3g_prefix . "'";
    $query = $db->getRow( $sql_text );

//  if ( $query["mailing_list"] )      e3g_mailing_list();

    if ( $query["notifica_apertura"] and !$query["notifica_apertura_inviata_oggi"] ) 
        e3g_notifica_apertura();

    if ( $query["notifica_chiusura"] and !$query["notifica_chiusura_inviata_oggi"] ) 
        e3g_notifica_chiusura();   

//    if ( $query["notifica_lista_spesa"] and !$query["notifica_lista_spesa_inviata_oggi"] ) 
//        e3g_notifica_lista_spesa();   
}


//------------------------------------------------------------------------------
// Visualizzazione messaggi a scopo debug
//------------------------------------------------------------------------------
function e3g_debug( $a_message ) {
    echo "<PRE>$a_message</PRE>\n";
}                        


//------------------------------------------------------------------------------
// Gestione mailing_list
//------------------------------------------------------------------------------
function e3g_mailing_list() {
 
//TODO Scrivere eventuali errori in un file di testo da usare come log
//TODO Fare in modo che l'output del debug, se attivato, venga scritto nello stesso log
//TODO Aggiungere voce di menu che permetta di controllare tale log
//TODO Impostare l'X-Mailer di invio come e3g/GestiGAS v... (direttamente nella funzione e3g_invia_email)
/*TODO Intestazioni facoltative, esempio da lista retegas (sympa):
    List-Id: <gas.liste.retelilliput.org>
    List-Archive: <http://liste.retelilliput.org/wws/arc/gas>
    List-Help: <mailto:hide@address.com?subject=help>
    List-Owner: <mailto:gas-hide@address.com>
    List-Post: <mailto:hide@address.com>
    List-Subscribe: <mailto:hide@address.com?subject=subscribe%20gas>
    List-Unsubscribe: <mailto:hide@address.com?subject=unsubscribe%20gas> 
*/
//TODO Fare in modo che un utente possa eliminarsi dalla lista anche via email
//     o meglio disattivare la ricezione dei messaggi
//     (nel senso di impostare [PREFIX]anagrafiche.mailing_list a zero)

    
    // Determina l'ora di invio del messaggio (la riga e' quella iniziante con "Date:")
    // ESEMPI: "Date: Mon, 23 Mar 2009 17:26:02 +0100"
    function GetSendDate( $headers ) {
        for( $line=0; $line<count($headers); $line++) 
            if ( strpos($headers[$line], "Date: ") === 0 ) break;
        if ( $line < count($headers) ) 
            return substr( $headers[$line], 6 );
    }
      
        
    // Determina il mittente dall'header del messaggio (la riga e' quella iniziante con "From:")
    // ESEMPI: "From: Marco Munari <hide@address.com>" (talvolta il nick e' tra doppi apici)
    // RIFERIMENTI: (generalita') http://news.aioe.org/spip.php?article94
    // RIFERIMENTI: (sul vero mittente di un msg) http://www.ol-service.com/sikurezza/misterpici/Privacy_Email.htm 
    function GetMittente( $headers ) {
        for( $line=0; $line<count($headers); $line++) 
            if ( strpos($headers[$line], "From: ") === 0 ) break;
        if ( $line < count($headers) ) 
            return substr( $headers[$line], 
                1 + strpos($headers[$line], "<"), strpos($headers[$line], ">") - strpos($headers[$line], "<") - 1 );        
    }
      
        
    // Determina l'oggetto dall'header del messaggio (la riga e' quella iniziante con "Subject:")
    // ESEMPI: "Subject: Prova invio messaggio"
    // RIFERIMENTI: http://news.aioe.org/spip.php?article94 - http://www.anti-phishing.it/tecniche/headers.php
    function GetOggetto( $headers ) {
        for( $line=0; $line<count($headers); $line++) 
            if ( strpos($headers[$line], "Subject: ") === 0 ) break;
        if ( $line < count($headers) ) {
            $oggetto = substr( $headers[$line], 9 );
            return $oggetto;        
        }      
    }
     
        
    // Oggetto: aggiunge l'eventuale [PREFISSO]
    function ReOggetto( $a_oggetto, $prefisso ) {
        if ( !strpos($a_oggetto, $prefisso) )            
            return $prefisso . " " . $a_oggetto;
        else        
            return $a_oggetto;        
    }
     
        
    // Questa funzione dovrebbe ripulire il corpo del messaggio se questo e' stato composto come HTML
    // Content-Type:
    // E' diviso in due parti: la prima indica in che formato è stato scritto il post (text plain o HTML), 
    // la seconda indica il charset. Dove per charset indichiamo un set di caratteri (che può essere standard o meno). 
// TODO Per ora restituisce tutto il $body        
    // ATTENZIONE che $body e' un array
    function GetCorpo( $body, $modello_header, $modello_footer ) {
//        for ( $line=0; $line<count($body); $line++ )
//            e3g_debug( HtmlSpecialChars($body[$line]) );

        // Eventuale aggiunta di header e footer
        $s_body = implode( "", $body );
        if ( trim($modello_header) <> "" and !( strpos($s_body, $modello_header) === 0 ) ) 
            array_unshift( $body, $modello_header );  // Aggiunge l'elemento all'inizio dell'array 
        if ( trim($modello_footer) <> "" and !( strrpos($s_body, $modello_footer) === (strlen($s_body)-strlen($modello_footer)) ) ) 
            array_push( $body, $modello_footer );  // Aggiunge l'elemento in coda all'array 
        
        return $body;
    }


    $p4a =& p4a::singleton();
    $db =& p4a_db::singleton();

    $sql_text = "SELECT ml.* " .  
                "  FROM _mailing_list AS ml " .
                " WHERE ml.prefix = '" . $p4a->e3g_prefix . "'" ;
    $query1 = $db->getRow( $sql_text );

    // Se tipo "mailing-list" o "forum + mailing-list"
    if ( $query1["tipo_lista"]==2 or $query1["tipo_lista"]==3 ) { 
        $pop3 = new pop3_class;

        // Imposta parametri di connessione
        $pop3->hostname = $query1["pop_server"];   // POP 3 server host name                      
        $pop3->port = $query1["pop_port"];         // POP 3 server host port, usually 110 but some servers use other ports (Gmail uses 995)              
        $pop3->tls = 0;                            // Establish secure connections using TLS      
        $user = $query1["pop_user"];               // Authentication user name                    
        $password = $query1["pop_password"];       // Authentication password                     
        $pop3->realm = "";                         // Authentication realm or domain              
        $pop3->workstation = "";                   // Workstation for NTLM authentication         
        $apop = 0;                                 // Use APOP authentication                     
        $pop3->authentication_mechanism = "USER";  // SASL authentication mechanism               
        $pop3->debug = 0;                          // Output debug information                    
        $pop3->html_debug = 1;                     // Debug information is in HTML                
        $pop3->join_continuation_header_lines = 1; // Concatenate headers split in multiple lines 
        
        // Connessione server di posta
        if ( ($error = $pop3->Open()) == "" ) {

            // Login con nome utente e password
            if( ($error = $pop3->Login($user,$password,$apop)) == "" ) {

                // Verifica presenza messaggi
                if ( ($error = $pop3->Statistics($messages,$size)) == "" /*&& $messages > 0*/ ) {  // $messages: n° messaggi; $size: ampiezza totale
                   
                    // Prepara elenco utenti a cui spedire il messaggio
                    $sql_text = "SELECT descrizione, email FROM " . $p4a->e3g_prefix . "anagrafiche " .
                                " WHERE tipocfa = 'C' AND tipoutente <> 'A' AND stato = 1 AND mailing_list = 1 " .
                             " ORDER BY descrizione";  
                    $query2 = $db->getAll( $sql_text );

                    $result = $pop3->ListMessages( "", 1 );  
                    if ( GetType($result) == "array" ) {
                        for ( Reset($result), $message=1; $message<=count($result); Next($result), $message++ ) {
                            e3g_debug( "MESSAGGIO " . Key($result) . ", Unique ID: \"" . $result[Key($result)] . "\"" );

                            if ( ( $error = $pop3->RetrieveMessage($message,$headers,$body,2) ) == "" ) {
                                // Decodifica il mittente
                                $mittente = GetMittente( $headers );
                                // Se il mittente è uno degli iscritti, allora...                         
                                foreach ( $query2 as $record ) 
                                    if ( $record["email"] == $mittente ) break;
                                    
                                // ...prepara i dati per comporre il messaggio da inviare
                                $data_invio = GetSendDate( $headers );
                                $mittente_name = $record["descrizione"];
                                $oggetto = GetOggetto( $headers );
                                $corpo = GetCorpo( $body, $query1["modello_header"], $query1["modello_footer"] );
                                
                                if ( $record["email"] == $mittente ) {
                                    // A) Mittente iscritto alla mailing-list -> invio del messaggio ad ogni utente iscritto 
                                    foreach ( $query2 as $record ) {
                                        if ( $record["email"] == $mittente ) break;
                                        
                                        e3g_debug( "  DESTINATARIO: " . $record["descrizione"] . " <" .$record["email"] . ">" );
                                        e3g_debug( "  - MITTENTE: $mittente_name <$mittente>" );
                                        e3g_debug( "  - OGGETTO: $oggetto" );
                                        for ( $line=0; $line<count($corpo); $line++ )
                                            e3g_debug( "  - CORPO RIGA $line: ",HtmlSpecialChars($corpo[$line]) );
                                            
                                        if ( !e3g_invia_email( ReOggetto( $oggetto, $query1["prefisso"] ), 
                                                               $corpo, 
                                                               $record["email"], $record["descrizione"], 
                                                               3, $mittente, $mittente_name,
                                                                 ( $query1["reply_to"] == 1 ? $query1["email"] : $mittente ), 
                                                                 ( $query1["reply_to"] == 1 ? "Mailing-list " . $p4a->e3g_azienda_rag_soc : $mittente_name ) ) ) {
                                            e3g_debug( "Si sono verificati errori durante l'invio a: " . $record["descrizione"] . " <" .$record["email"] . ">" ); 
                                        }
                                        
                                    }
                                        
                                }
                                else {
                                    // B) Mittente NON iscritto alla mailing-list -> risposta con un msg informativo 
                                    e3g_debug( "  -> Non spedito perche' il mittente <$mittente> non e' conosciuto." );
                                    
                                    $corpo = "Salve $mittente_name,\n" .
                                        "il messaggio che hai inviato il $data_invio non e' stato inoltrato alla mailing-list perche' solo gli iscritti alla lista possono inviare messaggi e " .
                                        "l'indirizzo e-mail dal quale hai scritto non risulta tra quelli ammessi.\n\n" .
                                        "I riferimenti al tuo messaggio sono i seguenti:\n" .
                                        "    Mittente: $mittente\n" .
                                        "    Oggetto: $oggetto\n" .
                                        "    Data invio: $data_invio";

                                    e3g_invia_email(
                                        "Mailing-list " . $query1["prefisso"] . ": problema con il messaggio '$oggetto'", 
                                        $corpo, 
                                        $mittente, $mittente_name );
                               }
 
                               // Marcatura messaggio come da cancellare [l'eliminazione effetiva avviene al ->Close()]
                               $error = $pop3->DeleteMessage($message);
                            }
                        } 
                        $error = $pop3->ResetDeletedMessages();  // Solo a scopo di debug
                    }
                    else
                        $error = $result;
                }
            }
            // Disconnessione server
            if( $error == "" && ($error=$pop3->Close()) == "" )
                e3g_debug( "Disconnected from the POP3 server &quot;".$pop3->hostname."&quot;." );                            
        }
    
        if ( $error != "" )
            e3g_debug( "<H2>Error: ",HtmlSpecialChars($error),"</H2>" );
    }
}


//------------------------------------------------------------------------------
// Notifiche apertura ordine
//------------------------------------------------------------------------------
function e3g_notifica_apertura() {
    $p4a =& p4a::singleton();
    $db =& p4a_db::singleton();

    // Se oggi si APRE almeno un ordine...
    $qu_fornitori = $db->getAll( 
        "SELECT f.descrizione, fp.datafine, " .
        "       COUNT( a.codice ) AS n_articoli " .
        "  FROM " . $p4a->e3g_prefix . "fornitoreperiodo fp " . 
        "       JOIN " . $p4a->e3g_prefix . "anagrafiche f ON f.codice = fp.fornitore AND f.stato = 1 " . 
        "       LEFT JOIN " . $p4a->e3g_prefix . "articoli a ON a.centrale = f.codice AND a.stato = 1 " .
        "  WHERE " . e3g_where_ordini_aperti("fp") .
        "    AND fp.datainizio = CURDATE() " .
      " GROUP BY f.descrizione, fp.datafine " .
      " ORDER BY f.descrizione" );  
    
    if ( $qu_fornitori ) {
        $oggetto = $p4a->e3g_azienda_rag_soc . ", apertura ordine";

        /* OGGETTO: Manto-GAS, apertura ordine
         * 
         * Salve Mario Rossi,
         * 
         * si apre oggi il periodo d'ordine nei confronti dei seguenti fornitori:
         * 
         * - Az. Agr. Gozzi Cesare e Franco, fino al 28/02/2009 (1 articolo)
         * - Eugea / Ecologia Urbana, fino al 28/02/2009 (6 articoli)
         * 
         * Per ordinare, collegarsi a: http://www.gestigas.org/e3g/?prefix=mantogas
         */        

        // Prepara parte di messaggio centrale con elenco fornitori
        $msg_centro = "";
        foreach ( $qu_fornitori as $qu_fornitore ) {
            // Esempio: "- Eugea / Ecologia Urbana, fino al 28 febbraio (6 articoli)"
            $msg_centro .=
                "- " . $qu_fornitore["descrizione"] . ", fino al " . e3g_format_mysql_data( $qu_fornitore["datafine"] ) .
                " (" . $qu_fornitore["n_articoli"] . " articol" . ( $qu_fornitore["n_articoli"]==1 ? "o" : "i" ) . ")\n";
        }
        // Parte di messaggio finale
        $msg_fine = "\nPer ordinare, collegarsi a: " . P4A_APPLICATION_URL . "?prefix=$p4a->e3g_prefix";
                
        // Invia la mail ad ogni utente attivo
        $qu_utenti = $db->getAll( 
            "SELECT descrizione, email FROM " . $p4a->e3g_prefix . "anagrafiche " .
            " WHERE tipocfa = 'C' AND tipoutente <> 'A' AND stato = 1 " );

        $n_invii = 0;
        foreach ( $qu_utenti as $qu_utente ) {
            // Parte di messaggio iniziale
            $msg_inizio = 
                "Salve " . $qu_utente["descrizione"] . ",\n\n" .
                "si apre oggi il periodo d'ordine nei confronti dei seguenti fornitori:\n\n";

            if ( !e3g_invia_email( $oggetto, 
                                   $msg_inizio . $msg_centro . $msg_fine, 
                                   $qu_utente["email"], $qu_utente["descrizione"] ) ) 
                e3g_debug( "Si sono verificati errori durante l'invio a: " . $qu_utente["descrizione"] );
            $n_invii++; 
        }
        
        // Aggiorna _aziende con la data odierna per evitare ulteriore spedizione
        $db->query( "UPDATE _aziende " .
            "   SET notifica_apertura_data = CURDATE() " .
            " WHERE prefix = '" . $p4a->e3g_prefix . "'" );
            
        return $n_invii;  // TODO Però potrebbero essersi verificati degli errori
    }
    else
        return false;  // Niente da notificare
}


//------------------------------------------------------------------------------
// Notifica anticipatamente la chiusura ordine
//------------------------------------------------------------------------------
function e3g_notifica_chiusura() {
    $p4a =& p4a::singleton();
    $db =& p4a_db::singleton();

    // Se alla data di (oggi+notifica_chiusura_gg) si CHIUDE almeno un ordine...
    $qu_fornitori = $db->getAll( 
        "SELECT f.descrizione, fp.datafine, az.notifica_chiusura_gg, " .
        "       COUNT( a.codice ) AS n_articoli " .
        "  FROM " . $p4a->e3g_prefix . "fornitoreperiodo AS fp " . 
        "       JOIN " . $p4a->e3g_prefix . "anagrafiche AS f ON f.codice = fp.fornitore AND f.stato = 1 " . 
        "       LEFT JOIN " . $p4a->e3g_prefix . "articoli AS a ON a.centrale = f.codice AND a.stato = 1 " .
        "       JOIN _aziende AS az ON az.prefix = '" . $p4a->e3g_prefix . "'" .
        "  WHERE " . e3g_where_ordini_aperti("fp") .
        "    AND DATE_SUB( fp.datafine, INTERVAL az.notifica_chiusura_gg DAY ) = CURDATE() " .
      " GROUP BY f.descrizione, fp.datafine, az.notifica_chiusura_gg " .
      " ORDER BY f.descrizione" );  
    
    if ( $qu_fornitori ) {
        $oggetto = $p4a->e3g_azienda_rag_soc . ", chiusura ordine tra " . $qu_fornitori[0]["notifica_chiusura_gg"] . " giorn" .
            ( $qu_fornitori[0]["notifica_chiusura_gg"]==1 ? "o" : "i" );

        /* OGGETTO: Manto-GAS, chiusura ordine tra 3 giorni
         * 
         * Salve Mario Rossi,
         * 
         * il 28/02/2009 si chiuderà il periodo d'ordine nei confronti dei seguenti fornitori:
         * 
         * - Az. Agr. Gozzi Cesare e Franco (1 articolo)
         * - Eugea / Ecologia Urbana (6 articoli)
         * 
         * La tua attuale lista della spesa è vuota.
         * La tua attuale lista della spesa è composta da 45 articoli per un importo totale di 123 euro.
         * 
         * Per ordinare, collegarsi a: http://www.gestigas.org/e3g/?prefix=mantogas
         */        

        // Prepara parte di messaggio centrale con elenco fornitori
        $msg_centro = "";
        foreach ( $qu_fornitori as $qu_fornitore ) {
            // Esempio: "- Eugea / Ecologia Urbana, fino al 28 febbraio (6 articoli)"
            $msg_centro .=
                "- " . $qu_fornitore["descrizione"] . " (" . $qu_fornitore["n_articoli"] . " articol" . ( $qu_fornitore["n_articoli"]==1 ? "o" : "i" ) . ")\n";
        }
        // Parte di messaggio finale
        $msg_fine = "\nPer ordinare, collegarsi a: " . P4A_APPLICATION_URL . "?prefix=$p4a->e3g_prefix";
                
        // Invia la mail ad ogni utente attivo
        $qu_utenti = $db->getAll( 
            "SELECT u.descrizione, u.email, " .
            "       SUM( c.qta ) AS qta, SUM( c.prezzoven * c.qta ) AS importo " .
            "  FROM " . $p4a->e3g_prefix . "anagrafiche AS u " .
            "       LEFT JOIN " . $p4a->e3g_prefix . "carrello AS c ON c.codutente = u.codice " .
            " WHERE u.tipocfa = 'C' AND u.tipoutente <> 'A' AND u.stato = 1 " .
         " GROUP BY u.descrizione, u.email " );

        $n_invii = 0;
        foreach ( $qu_utenti as $qu_utente ) {
            // Parte di messaggio iniziale
            $msg_inizio = 
                "Salve " . $qu_utente["descrizione"] . ",\n\n" .
                "il " . e3g_format_mysql_data( $qu_fornitore["datafine"] ) . " si chiudera' il periodo d'ordine nei confronti dei seguenti fornitori:\n\n";

            // Parte di messaggio coi dati sulla lista della spesa
            $qta = (integer) $qu_utente[ "qta" ];
            $importo = (double) $qu_utente[ "importo" ];
     
            if ( $qta == 0 )
                $msg_spesa = "\nLa tua attuale lista della spesa e' vuota.\n";
            else 
                $msg_spesa = "\nLa tua attuale lista della spesa e' composta da $qta articol" . ( $qta==1 ? "o" : "i" ) . 
                    " per un importo totale di " . $importo . " euro.\n";

            if ( !e3g_invia_email( $oggetto, 
                                   $msg_inizio . $msg_centro . $msg_spesa . $msg_fine, 
                                   $qu_utente["email"], $qu_utente["descrizione"] ) ) 
                e3g_debug( "Si sono verificati errori durante l'invio a: " . $qu_utente["descrizione"] ); 
            $n_invii++; 
        }
        
        // Aggiorna _aziende con la data odierna per evitare ulteriore spedizione
        $db->query( "UPDATE _aziende " .
            "   SET notifica_chiusura_data = CURDATE() " .
            " WHERE prefix = '" . $p4a->e3g_prefix . "'" );

        return $n_invii;  // TODO Però potrebbero essersi verificati degli errori
    }
    else
        return false;  // Niente da notificare
}


//------------------------------------------------------------------------------
// Notifica la lista della spesa il giorno successivo alla chiusura dell'ordine
//------------------------------------------------------------------------------
function e3g_notifica_lista_spesa() {
    /*TODO
     * 
     * ************************ DA TERMINARE ***********************************
     * 
ALTER TABLE _aziende ADD notifica_lista_spesa CHAR( 1 ) NOT NULL DEFAULT '0';
ALTER TABLE _aziende ADD notifica_lista_spesa_data DATE NULL DEFAULT '2000-01-01';
*/    
    $p4a =& p4a::singleton();
    $db =& p4a_db::singleton();
    
    // Se ieri si è CHIUSO almeno un ordine...
    $qu_fornitori = $db->getAll( 
        "SELECT f.descrizione, fp.datafine, az.notifica_chiusura_gg, " .
        "       COUNT( a.codice ) AS n_articoli " .
        "  FROM " . $p4a->e3g_prefix . "fornitoreperiodo AS fp " . 
        "       JOIN " . $p4a->e3g_prefix . "anagrafiche AS f ON f.codice = fp.fornitore AND f.stato = 1 " . 
        "       LEFT JOIN " . $p4a->e3g_prefix . "articoli AS a ON a.centrale = f.codice AND a.stato = 1 " .
        "       JOIN _aziende AS az ON az.prefix = '" . $p4a->e3g_prefix . "'" .

        "  WHERE " . e3g_where_ordini_aperti("fp") .
        "    AND DATE_SUB( fp.datafine, INTERVAL az.notifica_chiusura_gg DAY ) = CURDATE() " .

      " GROUP BY f.descrizione, fp.datafine, az.notifica_chiusura_gg " .
      " ORDER BY f.descrizione" );  
    
    if ( $qu_fornitori ) {
        $oggetto = $p4a->e3g_azienda_rag_soc . ", chiusura ordine tra " . $qu_fornitori[0]["notifica_chiusura_gg"] . " giorn" .
            ( $qu_fornitori[0]["notifica_chiusura_gg"]==1 ? "o" : "i" );

        /* OGGETTO: Manto-GAS, lista della spesa
         * 
         * Salve Mario Rossi,
         * 
         * il 28/02/2009 si e' chiuso il periodo d'ordine nei confronti dei seguenti fornitori:
         * 
         * - Az. Agr. Gozzi Cesare e Franco (1 articolo)
         * - Eugea / Ecologia Urbana (6 articoli)
         * 
         * La tua lista della spesa è vuota.
         * La tua attuale lista della spesa è composta da 45 articoli per un importo totale di 123 euro; ecco il dettaglio:
         * 
         * [...]
         */        

        // Prepara parte di messaggio centrale con elenco fornitori
        $msg_centro = "";
        foreach ( $qu_fornitori as $qu_fornitore ) {
            // Esempio: "- Eugea / Ecologia Urbana, fino al 28 febbraio (6 articoli)"
            $msg_centro .=
                "- " . $qu_fornitore["descrizione"] . " (" . $qu_fornitore["n_articoli"] . " articol" . ( $qu_fornitore["n_articoli"]==1 ? "o" : "i" ) . ")\n";
        }
        // Parte di messaggio finale
        $msg_fine = "\nPer ordinare, collegarsi a: " . P4A_APPLICATION_URL . "?prefix=$p4a->e3g_prefix";
                
        // Invia la mail ad ogni utente attivo
        $qu_utenti = $db->getAll( 
            "SELECT u.descrizione, u.email, " .
            "       SUM( c.qta ) AS qta, SUM( c.prezzoven * c.qta ) AS importo " .
            "  FROM " . $p4a->e3g_prefix . "anagrafiche AS u " .
            "       LEFT JOIN " . $p4a->e3g_prefix . "carrello AS c ON c.codutente = u.codice " .
            " WHERE u.tipocfa = 'C' AND u.tipoutente <> 'A' AND u.stato = 1 " .
         " GROUP BY u.descrizione, u.email " );

        $n_invii = 0;
        foreach ( $qu_utenti as $qu_utente ) {
            // Parte di messaggio iniziale
            $msg_inizio = 
                "Salve " . $qu_utente["descrizione"] . ",\n\n" .
                "il " . e3g_format_mysql_data( $qu_fornitore["datafine"] ) . " si chiudera' il periodo d'ordine nei confronti dei seguenti fornitori:\n\n";

            // Parte di messaggio coi dati sulla lista della spesa
            $qta = (integer) $qu_utente[ "qta" ];
            $importo = (double) $qu_utente[ "importo" ];
     
            if ( $qta == 0 )
                $msg_spesa = "\nLa tua attuale lista della spesa e' vuota.\n";
            else 
                $msg_spesa = "\nLa tua attuale lista della spesa e' composta da $qta articol" . ( $qta==1 ? "o" : "i" ) . 
                    " per un importo totale di " . $importo . " euro.\n";

            if ( !e3g_invia_email( $oggetto, 
                                   $msg_inizio . $msg_centro . $msg_spesa . $msg_fine, 
                                   $qu_utente["email"], $qu_utente["descrizione"] ) ) 
                e3g_debug( "Si sono verificati errori durante l'invio a: " . $qu_utente["descrizione"] ); 
            $n_invii++; 
        }
        
        // Aggiorna _aziende con la data odierna per evitare ulteriore spedizione
        $db->query( "UPDATE _aziende " .
            "   SET notifica_lista_spesa_data = CURDATE() " .
            " WHERE prefix = '" . $p4a->e3g_prefix . "'" );

        return $n_invii;  // TODO Però potrebbero essersi verificati degli errori
    }
    else
        return false;  // Niente da notificare
}

?>
Return current item: Progetto e3g