* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ * $Source$ * * * Script de facturation * Emets les factures compta en partant des factures téléphonique * */ /** \file htdocs/telephonie/script/facturation-emission.php \ingroup telephonie \brief Emission des factures \version $Revision$ */ require ("../../master.inc.php"); $opt = getopt("l:c:"); $limit = $opt['l']; $optcontrat = $opt['c']; if (strlen($limit) == 0 && strlen($optcontrat) == 0) { print "Usage :\n php facturation-emission.php -l \n"; exit; } require_once (DOL_DOCUMENT_ROOT."/facture.class.php"); require_once (DOL_DOCUMENT_ROOT."/societe.class.php"); require_once (DOL_DOCUMENT_ROOT."/paiement.class.php"); require_once (DOL_DOCUMENT_ROOT."/lib/dolibarrmail.class.php"); require_once (DOL_DOCUMENT_ROOT."/telephonie/lignetel.class.php"); require_once (DOL_DOCUMENT_ROOT."/telephonie/facturetel.class.php"); require_once (DOL_DOCUMENT_ROOT."/telephonie/telephonie.contrat.class.php"); $error = 0; $datetime = time(); $datetimeprev = $datetime; // Date du prélèvement $date = strftime("%d%h%Y%Hh%Mm%S",$datetime); $user = new User($db, 1); $month = strftime("%m", $datetime); $year = strftime("%Y", $datetime); if ($month == 1) { $month = "12"; $year = $year - 1; } else { $month = substr("00".($month - 1), -2) ; } /* * Lecture du batch * */ $sql = "SELECT MAX(rowid) FROM ".MAIN_DB_PREFIX."telephonie_facturation_batch"; $resql = $db->query($sql); if ( $resql ) { $row = $db->fetch_row($resql); $batch_id = $row[0]; dolibarr_syslog("Traitement du batch ".$batch_id); $db->free($resql); } else { $error = 1; dolibarr_syslog("Erreur ".$error); } /* * Traitements * */ if (!$error) { /*************************************************************** * * Lectures des contrats a traiter * * ***************************************************************/ dolibarr_syslog("Lecture des contrats"); $sql = "SELECT distinct(c.rowid)"; $sql .= " FROM ".MAIN_DB_PREFIX."telephonie_facture as f"; $sql .= " , ".MAIN_DB_PREFIX."telephonie_societe_ligne as l"; $sql .= " , ".MAIN_DB_PREFIX."telephonie_contrat as c"; $sql .= " WHERE f.fk_facture IS NULL"; $sql .= " AND f.fk_batch = ".$batch_id; $sql .= " AND f.isfacturable = 'oui'"; $sql .= " AND f.fk_ligne = l.rowid "; $sql .= " AND l.fk_contrat = c.rowid"; if (strlen($optcontrat) > 0) { $sql .= " AND c.rowid=".$optcontrat; dolibarr_syslog("Limite sur le contrat : ".$optcontrat); } else { $sql .= " LIMIT $limit"; } $contrats = array(); $resql = $db->query($sql) ; if ( $resql ) { $num = $db->num_rows($resql); $i = 0; while ($i < $num) { $row = $db->fetch_row($resql); $contrats[$i] = $row[0]; $i++; } $db->free(); } else { $error = 2; dolibarr_syslog("Erreur $error"); } } /* * * */ if (!$error) { dolibarr_syslog("Nombre de contrats à facturer ".sizeof($contrats)); $xcli = 0; $xclis = sizeof($contrats); foreach ($contrats as $contrat) { $xcli++; /* Lecture des factures téléphoniques du contrat */ dolibarr_syslog($xcli."/".$xclis." Contrat à facturer id=".$contrat." (".memory_get_usage() .")"); $sql = "SELECT f.rowid, s.idp FROM "; $sql .= MAIN_DB_PREFIX."telephonie_facture as f"; $sql .= ",".MAIN_DB_PREFIX."telephonie_societe_ligne as l"; $sql .= " , ".MAIN_DB_PREFIX."telephonie_contrat as c"; $sql .= ",".MAIN_DB_PREFIX."societe as s"; $sql .= " WHERE f.fk_batch = ".$batch_id; $sql .= " AND c.rowid = ".$contrat; $sql .= " AND l.fk_contrat = c.rowid"; $sql .= " AND l.rowid = f.fk_ligne"; $sql .= " AND s.idp = c.fk_soc_facture "; $sql .= " AND f.fk_facture IS NULL"; $sql .= " AND f.isfacturable = 'oui'"; $sql .= " ORDER BY l.code_analytique ASC, l.rowid DESC"; $numlignes = array(); if ( $db->query($sql) ) { $num = $db->num_rows(); $i = 0; while ($i < $num) { $objp = $db->fetch_object(); $numlignes[$i] = $objp->rowid; $i++; } $db->free(); dolibarr_syslog("Contrat $contrat : $i factures trouvées à générer"); $factures_prev = array(); $factures_a_mailer = array(); if (sizeof($numlignes) > 0) { facture_contrat($db, $user, $contrat, $numlignes, $datetime, $factures_prev, $factures_a_mailer); } if (sizeof($numlignes) > 0) { _prelevements($db, $user, $factures_prev); } if (sizeof($numlignes) > 0) { _emails($db, $user, $contrat, $factures_a_mailer); } } else { $error = 1; print $db->error(); } } } function facture_contrat($db, $user, $contrat_id, $factel_ids, $datetime, &$factures_prev, &$factures_a_mailer) { /* * Traitements * */ $i = 0; $error = 0; /* Ouverture de la transaction */ if (! $db->query("BEGIN") ) { $error++; } /* Lecture du contrat */ if (!$error) { $contrat = new TelephonieContrat($db); if ( $contrat->fetch($contrat_id) >= 0) { } else { $error++; dolibarr_syslog("Impossible de lire le contrat"); } } /* Lecture de la société */ if (!$error) { $soc = new Societe($db); if ($soc->fetch($contrat->client_facture_id) ) { if ($verbose) dolibarr_syslog($soc->nom); } else { $error = 132; } } /* Recuperation des infos de factures dans la base * Creation de la facture * */ if (!$error) { if ($verbose) dolibarr_syslog("Création facture pour $soc->nom"); $fac = new Facture($db, $soc->id); $cancel_facture = 1; $fac->date = $datetime; $fac->cond_reglement = 1; $fac->remise_percent = 0; $facid = $fac->create($user); if ($facid > 0) { } else { dolibarr_syslog("Erreur création objet facture"); $error = 4; } } /* * Lecture des différentes lignes rattachées * */ if (!$error) { foreach ($factel_ids as $factel_id) { /* Lecture de la facture téléphonique */ $factel = new FactureTel($db); if ($factel->fetch($factel_id) == 0) { } else { dolibarr_syslog("ERREUR lecture facture téléphonique $factel_id"); $error++; } /* Lecture de la ligne correspondante */ $ligne = new LigneTel($db); if ($ligne->fetch($factel->ligne) == 1) { } else { dolibarr_syslog("ERREUR lecture ligne $factel->ligne"); $error++; } if (!$error && $ligne->facturable) /* Test si on doit facturer ou non la ligne */ { $cancel_facture = 0; /* Création du lien entre les factures */ if ($factel->affect_num_facture_compta($facid) == 0) { } else { $error++; } $soca = new Societe($db); $soca->fetch($ligne->client_id); /* Insertion des lignes de factures */ $libelle = ""; if (strlen(trim($ligne->code_analytique)) > 0) { $libelle .= "".$ligne->code_analytique." "; } $dm = mktime (1,1,1,strftime("%m",$datetime), -1, strftime("%Y",$datetime)); $libelle .= "Communications téléphoniques de la ligne $ligne->numero"; $libelle .= " mois de ".strftime("%B %Y",$dm); if (trim($soca->ville)) { $libelle .= " (".$soca->ville.")"; } if (!$error) { $ventil = 0 ; if (defined("TELEPHONIE_COMPTE_VENTILATION")) { if (is_numeric(TELEPHONIE_COMPTE_VENTILATION)) { $ventil = TELEPHONIE_COMPTE_VENTILATION; } } $result = $fac->addline($facid, $libelle, $factel->cout_vente_remise, 1, '19.6', 0, 0,'','',$ventil); } } } /* Fin de la boucle des lignes */ } /*********************************/ /* */ /* Ajout des services */ /* */ /*********************************/ if (!$error) { $sql = "SELECT s.libelle_facture, sc.montant"; $sql .= " FROM ".MAIN_DB_PREFIX."telephonie_contrat_service as sc"; $sql .= " , ".MAIN_DB_PREFIX."telephonie_service as s"; $sql .= " WHERE sc.fk_contrat = ".$contrat_id; $sql .= " AND s.rowid = sc.fk_service"; $sql .= " AND sc.montant > 0"; $resql = $db->query($sql) ; if ( $resql ) { $num = $db->num_rows($resql); $is = 0; while ($is < $num) { $row = $db->fetch_row($resql); $result = $fac->addline($facid, $row[0], $row[1], 1, '19.6', 0, 0, 0); $is++; } $db->free(); } else { $error = 2; dolibarr_syslog("Erreur $error"); } } /*********************************/ /* */ /* Validation de la facture */ /* */ /*********************************/ if (!$error && !$cancel_facture) { if ($verbose) dolibarr_syslog("Validation de la facture : $facid"); $y = substr($year, -1); $m = substr("00".$month, -2); if ( $fac->set_valid($facid, $user, $soc) ) { $valid_ok = 1; } else { $valid_ok = 0; $error = 5; } } /**************************************/ /* */ /* Factures détaillées */ /* */ /**************************************/ if (!$error && !$cancel_facture) { foreach ($factel_ids as $factel_id) { /* Lecture de la facture téléphonique */ $factel = new FactureTel($db); if ($factel->fetch($factel_id) == 0) { } else { dolibarr_syslog("ERREUR lecture facture téléphonique $factel_id"); $error++; } /* Lecture de la ligne correspondante */ $ligne = new LigneTel($db); if ($ligne->fetch($factel->ligne) == 1) { } else { dolibarr_syslog("ERREUR lecture ligne $factel->ligne"); $error++; } if (!$error) { $facok = 0; // Différents modèles de factures détaillées $modele = "standard"; if (strlen($ligne->pdfdetail) > 0) { $modele = $ligne->pdfdetail; } require_once (DOL_DOCUMENT_ROOT."/telephonie/pdf/pdfdetail_".$modele.".modules.php"); $class = "pdfdetail_".$modele; $facdet = new $class($db, $ligne, $year, $month, $factel); if ($facdet->write_pdf_file($factel, $factel->ligne) == 0) { $facok++; } else { dolibarr_syslog("ERREUR lors de Génération du pdf détaillé"); $error = 19; } } } } /*********************************/ /* */ /* Creation du pdf de la facture */ /* */ /*********************************/ if (!$error && !$cancel_facture && $valid_ok == 1) { if ($verbose) dolibarr_syslog("Génération du pdf facture : $facid"); $fac->fetch($facid); $fac->fetch_client(); $fac->client->rib(); $message = ""; if ($fac->client->bank_account->verif() && $ligne->mode_paiement == 'pre') { $message .= "Cette facture sera prélevée sur votre compte bancaire numéro : "; $message .= $fac->client->bank_account->number; } if ($verbose) dolibarr_syslog("Création du pdf facture : $facid"); if (! facture_pdf_create($db, $facid, $message)) { $error = 1; print "- ERREUR de génération du pdf de la facture\n"; } } if (!$error && !$cancel_facture) { $db->query("COMMIT"); /* $soc * $ligne */ if ($contrat->facturable) { array_push($factures_a_mailer, $facid); if ($soc->verif_rib()) { array_push($factures_prev, $facid); } else { dolibarr_syslog("facture $facid non preleve, RIB incorrect"); } } if ($verbose) dolibarr_syslog("Commit de la transaction");; } else { $db->query("ROLLBACK"); dolibarr_syslog("ROLLBACK de la transaction");; } } function _prelevements($db, $user, $factures_prev) { /******************************************************************** * * * * * Emissions des demandes de prelevement * * * * * ********************************************************************/ dolibarr_syslog("[PR] Debut demande de prelevement"); dolibarr_syslog("[PR] Nombre de factures ".sizeof($factures_prev)); if (sizeof($factures_prev) > 0) { foreach ($factures_prev as $fac) { $fact = new Facture($db); $fact->fetch($fac); $fact->mode_reglement(3); $fact->demande_prelevement($user); } } dolibarr_syslog("[PR] Fin demande de prelevement"); } function _emails($db, $user, $contrat_id, $factures_a_mailer) { /******************************************************************** * * * * * Envoi des factures par emails * * * * * ********************************************************************/ dolibarr_syslog("[EM] Debut envoie de mail"); if (sizeof($factures_a_mailer) > 0) { foreach ($factures_a_mailer as $fac) { $fact = new Facture($db); $fact->fetch($fac); $contrat = new TelephonieContrat($db); $contrat->fetch($contrat_id); $emails = $contrat->get_contact_facture(); $ligne = new LigneTel($db); if ($ligne->fetch_by_facture_number($fact->id) == 0) { } if (sizeof($emails > 0)) { $sendto = ""; for ($k = 0 ; $k < sizeof($emails) ; $k++) { $sendto .= html_entity_decode($emails[$k]) . ","; } $sendto = substr($sendto,0,strlen($sendto) - 1); dolibarr_syslog("[EM] Envoi email à ".html_entity_decode($sendto) ); $subject = ereg_replace("#FACREF#",$fact->ref,TELEPHONIE_MAIL_FACTURATION_SUJET); $subject = ereg_replace("#CONTRAT#",$contrat->ref, $subject); $from = TELEPHONIE_EMAIL_FACTURATION_EMAIL; $message = "Bonjour,\n\n"; $message .= "Veuillez trouver ci-joint notre facture numéro $fact->ref du ".strftime("%d/%m/%Y",$fact->date)."."; $message .= "\nEgalement joint à ce mail le détails de vos communications.\n\n"; $message .= TELEPHONIE_MAIL_FACTURATION_SIGNATURE; $mailfile = new DolibarrMail($subject, $sendto, $from, $message); $mailfile->addr_bcc = TELEPHONIE_EMAIL_FACTURATION_EMAIL; $arr_file = array(); $arr_name = array(); $arr_mime = array(); $facfile = FAC_OUTPUTDIR . "/" . $fact->ref . "/" . $fact->ref . ".pdf"; /* * Join la facture */ array_push($arr_file, $facfile); array_push($arr_mime, "application/pdf"); array_push($arr_name, $fact->ref.".pdf"); $dir = FAC_OUTPUTDIR . "/" . $fact->ref . "/"; $handle=opendir(FAC_OUTPUTDIR . "/" . $fact->ref . "/"); /* * Joint les détails * */ while (($file = readdir($handle))!==false) { if (is_readable($dir.$file) && substr($file, -11) == '-detail.pdf') { array_push($arr_file, $dir.$file); array_push($arr_mime, "application/pdf"); array_push($arr_name, $file); } if (is_readable($dir.$file) && substr($file, -11) == '-detail.xls') { array_push($arr_file, $dir.$file); array_push($arr_mime, "application/vns.ms-excel"); array_push($arr_name, $file); } } $mailfile->PrepareFile($arr_file, $arr_mime, $arr_name); if ( $mailfile->sendfile() ) { for ($kj = 0 ; $kj < sizeof($contrat->contact_facture_id) ; $kj++) { $sendtoid = $contrat->contact_facture_id[$kj]; $sendtox = $emails[$kj]; $actioncode=9; $actionmsg="Envoyée à $sendtox"; $actionmsg2="Envoi Facture par mail"; $sql = "INSERT INTO ".MAIN_DB_PREFIX."actioncomm (datea,fk_action,fk_soc,note,fk_facture, fk_contact,fk_user_author, label, percent) VALUES (now(), '$actioncode' ,'$fact->socidp' ,'$actionmsg','$fact->id','$sendtoid','$user->id', '$actionmsg2',100);"; if (! $db->query($sql) ) { print $db->error(); } else { //print "TOTO".$sendto. " ". $sendtoid ." \n"; } } } } else { dolibarr_syslog("Aucun email trouvé"); } } } } /* * FIN * */ $db->close(); dolibarr_syslog("Conso mémoire ".memory_get_usage() ); ?>