From 3d1ff4fd174fd04317c793b9fb3a3e568ee7e3f0 Mon Sep 17 00:00:00 2001 From: Rodolphe Quiedeville Date: Thu, 7 Apr 2005 07:56:34 +0000 Subject: [PATCH] Nouveau fichier --- .../script/facturation-emission.php | 733 ++++++++++++++++++ 1 file changed, 733 insertions(+) create mode 100644 htdocs/telephonie/script/facturation-emission.php diff --git a/htdocs/telephonie/script/facturation-emission.php b/htdocs/telephonie/script/facturation-emission.php new file mode 100644 index 00000000000..eebace048cd --- /dev/null +++ b/htdocs/telephonie/script/facturation-emission.php @@ -0,0 +1,733 @@ + + * + * 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 + * + */ + +require ("../../master.inc.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"); +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."/contrat/contrat.class.php"); +require_once (DOL_DOCUMENT_ROOT."/lib/dolibarrmail.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 bu 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"; + + $sql .= " LIMIT 1"; + + $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.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, $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 (!$error) + { + + $result = $fac->addline($facid, + $libelle, + $factel->cout_vente_remise, + 1, + '19.6', + 0, + 0); + + } + } + + } /* Fin de la boucle */ + } + + /*********************************/ + /* */ + /* 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; + } + } + + /**************************************/ + /* */ + /* Ventilation des lignes de factures */ + /* TELEPHONIE_COMPTE_VENTILATION */ + /* */ + /**************************************/ + + if (!$error && !$cancel_facture) + { + if (defined("TELEPHONIE_COMPTE_VENTILATION")) + { + + if (is_numeric(TELEPHONIE_COMPTE_VENTILATION)) + { + + $sql = " UPDATE ".MAIN_DB_PREFIX."facturedet"; + $sql .= " SET fk_code_ventilation = ".TELEPHONIE_COMPTE_VENTILATION; + $sql .= " WHERE fk_facture = ".$facid; + + if (! $db->query($sql) ) + { + dolibarr_syslog("Erreur de ventilation"); + $error++; + } + } + } + } + + /**************************************/ + /* */ + /* 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 .= "Facture prélevée sur votre compte numéro "; + $message .= $fac->client->bank_account->number; + $message .= " à partir du ".strftime("%d/%m/%Y",$datetimeprev); + $message .= "."; + } + + 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 ($ligne->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, $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); + + $ligne = new LigneTel($db); + + if ($ligne->fetch_by_facture_number($fact->id) == 0) + { + $emails = $ligne->get_contact_facture(); + } + + 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); + + $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."; + + $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($ligne->contact_facture_id) ; $kj++) + { + $sendtoid = $ligne->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() ); + +?>