2
0
forked from Wavyzz/dolibarr
Files
dolibarr-fork/htdocs/telephonie/script/facturation-emission.php
2005-06-06 14:26:07 +00:00

795 lines
18 KiB
PHP

<?PHP
/* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
*
* 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 <limit>\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() );
?>