__DIR__ was not replaced into scripts dir

This commit is contained in:
Laurent Destailleur 2019-05-15 13:20:02 +02:00
parent f94b9e5a12
commit a9b3748006
23 changed files with 2523 additions and 3015 deletions

View File

@ -1,7 +1,7 @@
#!/usr/bin/env php
<?php
/*
* Copyright (C) 2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Laurent Destailleur <eldy@users.sourceforge.net>
*
* 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
@ -10,7 +10,7 @@
*
* 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
* 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
@ -18,200 +18,160 @@
*/
/**
* \file scripts/bank/export-bank-receipts.php
* \ingroup bank
* \brief Script file to export bank receipts into Excel files
* \file scripts/bank/export-bank-receipts.php
* \ingroup bank
* \brief Script file to export bank receipts into Excel files
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php';
require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php';
require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php';
require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php';
require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php';
require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php';
require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php';
require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/paymentsocialcontribution.class.php';
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT . '/core/lib/bank.lib.php';
require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent.class.php';
require_once DOL_DOCUMENT_ROOT . '/compta/sociales/class/chargesociales.class.php';
require_once DOL_DOCUMENT_ROOT . '/compta/paiement/class/paiement.class.php';
require_once DOL_DOCUMENT_ROOT . '/compta/tva/class/tva.class.php';
require_once DOL_DOCUMENT_ROOT . '/fourn/class/paiementfourn.class.php';
require_once DOL_DOCUMENT_ROOT . '/compta/bank/class/account.class.php';
require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture.class.php';
require_once DOL_DOCUMENT_ROOT . '/fourn/class/fournisseur.facture.class.php';
require_once DOL_DOCUMENT_ROOT . '/compta/tva/class/tva.class.php';
require_once DOL_DOCUMENT_ROOT . '/compta/sociales/class/paymentsocialcontribution.class.php';
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
if (! isset($argv[3]) || ! $argv[3]) {
print "Usage: ".$script_file." bank_ref [bank_receipt_number|all] (csv|tsv|excel|excel2007) [lang=xx_XX]\n";
exit(-1);
print "Usage: " . $script_file . " bank_ref [bank_receipt_number|all] (csv|tsv|excel|excel2007) [lang=xx_XX]\n";
exit(- 1);
}
$bankref=$argv[1];
$num=$argv[2];
$model=$argv[3];
$newlangid='en_EN'; // To force a new lang id
$invoicestatic=new Facture($db);
$invoicesupplierstatic=new FactureFournisseur($db);
$societestatic=new Societe($db);
$chargestatic=new ChargeSociales($db);
$memberstatic=new Adherent($db);
$paymentstatic=new Paiement($db);
$paymentsupplierstatic=new PaiementFourn($db);
$paymentsocialcontributionstatic=new PaymentSocialContribution($db);
$paymentvatstatic=new Tva($db);
$bankstatic=new Account($db);
$banklinestatic=new AccountLine($db);
$bankref = $argv[1];
$num = $argv[2];
$model = $argv[3];
$newlangid = 'en_EN'; // To force a new lang id
$invoicestatic = new Facture($db);
$invoicesupplierstatic = new FactureFournisseur($db);
$societestatic = new Societe($db);
$chargestatic = new ChargeSociales($db);
$memberstatic = new Adherent($db);
$paymentstatic = new Paiement($db);
$paymentsupplierstatic = new PaiementFourn($db);
$paymentsocialcontributionstatic = new PaymentSocialContribution($db);
$paymentvatstatic = new Tva($db);
$bankstatic = new Account($db);
$banklinestatic = new AccountLine($db);
// Parse parameters
foreach ($argv as $key => $value)
{
$found=false;
foreach ($argv as $key => $value) {
$found = false;
// Define options
if (preg_match('/^lang=/i', $value))
{
$found=true;
$valarray=explode('=', $value);
$newlangid=$valarray[1];
print 'Use language '.$newlangid.".\n";
if (preg_match('/^lang=/i', $value)) {
$found = true;
$valarray = explode('=', $value);
$newlangid = $valarray[1];
print 'Use language ' . $newlangid . ".\n";
}
}
$outputlangs = $langs;
if (! empty($newlangid))
{
if ($outputlangs->defaultlang != $newlangid)
{
if (! empty($newlangid)) {
if ($outputlangs->defaultlang != $newlangid) {
$outputlangs = new Translate("", $conf);
$outputlangs->setDefaultLang($newlangid);
}
}
// Load translation files required by the page
$outputlangs->loadLangs(array("main", "companies", "bills", "banks", "members", "compta"));
$outputlangs->loadLangs(array("main","companies","bills","banks","members","compta"));
$acct=new Account($db);
$result=$acct->fetch('', $bankref);
if ($result <= 0)
{
print "Failed to find bank account with ref ".$bankref.".\n";
exit(-1);
$acct = new Account($db);
$result = $acct->fetch('', $bankref);
if ($result <= 0) {
print "Failed to find bank account with ref " . $bankref . ".\n";
exit(- 1);
} else {
print "Export for bank account " . $acct->ref . " (" . $acct->label . ").\n";
}
else
{
print "Export for bank account ".$acct->ref." (".$acct->label.").\n";
}
// Creation de la classe d'export du model ExportXXX
$dir = DOL_DOCUMENT_ROOT . "/core/modules/export/";
$file = "export_".$model.".modules.php";
$classname = "Export".$model;
if (! dol_is_file($dir.$file))
{
print "No driver to export with format ".$model."\n";
exit(-1);
$file = "export_" . $model . ".modules.php";
$classname = "Export" . $model;
if (! dol_is_file($dir . $file)) {
print "No driver to export with format " . $model . "\n";
exit(- 1);
}
require_once $dir.$file;
require_once $dir . $file;
$objmodel = new $classname($db);
// Define target path
$dirname = $conf->bank->dir_temp;
$filename = 'export-bank-receipts-'.$bankref.'-'.$num.'.'.$objmodel->extension;
$array_fields=array(
'bankreceipt'=>$outputlangs->transnoentitiesnoconv("AccountStatementShort"), 'bankaccount'=>$outputlangs->transnoentitiesnoconv("BankAccount"),
'dateop'=>$outputlangs->transnoentitiesnoconv("DateOperationShort"),'dateval'=>$outputlangs->transnoentitiesnoconv("DateValueShort"),'type'=>$outputlangs->transnoentitiesnoconv("Type"),
'description'=>$outputlangs->transnoentitiesnoconv("Description"), 'thirdparty'=>$outputlangs->transnoentitiesnoconv("Tiers"), 'accountelem'=>$outputlangs->transnoentitiesnoconv("Piece"),
'debit'=>$outputlangs->transnoentitiesnoconv("Debit"), 'credit'=>$outputlangs->transnoentitiesnoconv("Credit"),
'soldbefore'=>$outputlangs->transnoentitiesnoconv("BankBalanceBefore"), 'soldafter'=>$outputlangs->transnoentitiesnoconv("BankBalanceAfter"),
'comment'=>$outputlangs->transnoentitiesnoconv("Comment")
);
$array_selected=array(
'bankreceipt'=>'bankreceipt', 'bankaccount'=>'bankaccount',
'dateop'=>'dateop','dateval'=>'dateval','type'=>'type',
'description'=>'description', 'thirdparty'=>'thirdparty', 'accountelem'=>'accountelem',
'debit'=>'debit', 'credit'=>'credit',
'soldbefore'=>'soldbefore','soldafter'=>'soldafter',
'comment'=>'comment'
);
$array_export_TypeFields=array(
'bankreceipt'=>'Text', 'bankaccount'=>'Text',
'dateop'=>'Date','dateval'=>'Date','type'=>'Text',
'description'=>'Text', 'thirdparty'=>'Text', 'accountelem'=>'Text',
'debit'=>'Number', 'credit'=>'Number',
'soldbefore'=>'Number','soldafter'=>'Number',
'comment'=>'Text'
);
$filename = 'export-bank-receipts-' . $bankref . '-' . $num . '.' . $objmodel->extension;
$array_fields = array('bankreceipt' => $outputlangs->transnoentitiesnoconv("AccountStatementShort"),'bankaccount' => $outputlangs->transnoentitiesnoconv("BankAccount"),'dateop' => $outputlangs->transnoentitiesnoconv("DateOperationShort"),'dateval' => $outputlangs->transnoentitiesnoconv("DateValueShort"),'type' => $outputlangs->transnoentitiesnoconv("Type"),'description' => $outputlangs->transnoentitiesnoconv("Description"),'thirdparty' => $outputlangs->transnoentitiesnoconv("Tiers"),'accountelem' => $outputlangs->transnoentitiesnoconv("Piece"),'debit' => $outputlangs->transnoentitiesnoconv("Debit"),'credit' => $outputlangs->transnoentitiesnoconv("Credit"),'soldbefore' => $outputlangs->transnoentitiesnoconv("BankBalanceBefore"),'soldafter' => $outputlangs->transnoentitiesnoconv("BankBalanceAfter"),'comment' => $outputlangs->transnoentitiesnoconv("Comment"));
$array_selected = array('bankreceipt' => 'bankreceipt','bankaccount' => 'bankaccount','dateop' => 'dateop','dateval' => 'dateval','type' => 'type','description' => 'description','thirdparty' => 'thirdparty','accountelem' => 'accountelem','debit' => 'debit','credit' => 'credit','soldbefore' => 'soldbefore','soldafter' => 'soldafter','comment' => 'comment');
$array_export_TypeFields = array('bankreceipt' => 'Text','bankaccount' => 'Text','dateop' => 'Date','dateval' => 'Date','type' => 'Text','description' => 'Text','thirdparty' => 'Text','accountelem' => 'Text','debit' => 'Number','credit' => 'Number','soldbefore' => 'Number','soldafter' => 'Number','comment' => 'Text');
// Build request to find records for a bank account/receipt
$listofnum="";
if (! empty($num) && $num != "all")
{
$listofnum.="'";
$arraynum=explode(',', $num);
foreach($arraynum as $val)
{
if ($listofnum != "'") $listofnum.="','";
$listofnum.=$val;
$listofnum = "";
if (! empty($num) && $num != "all") {
$listofnum .= "'";
$arraynum = explode(',', $num);
foreach ($arraynum as $val) {
if ($listofnum != "'")
$listofnum .= "','";
$listofnum .= $val;
}
$listofnum.="'";
$listofnum .= "'";
}
$sql = "SELECT b.rowid, b.dateo as do, b.datev as dv,";
$sql.= " b.amount, b.label, b.rappro, b.num_releve, b.num_chq, b.fk_type,";
$sql.= " ba.rowid as bankid, ba.ref as bankref, ba.label as banklabel";
$sql.= " FROM ".MAIN_DB_PREFIX."bank_account as ba";
$sql.= ", ".MAIN_DB_PREFIX."bank as b";
$sql.= " WHERE b.fk_account = ".$acct->id;
if ($listofnum) $sql.= " AND b.num_releve IN (".$listofnum.")";
if (!isset($num)) $sql.= " OR b.num_releve is null";
$sql.= " AND b.fk_account = ba.rowid";
$sql.= $db->order("b.num_releve, b.datev, b.datec", "ASC"); // We add date of creation to have correct order when everything is done the same day
//print $sql;
$sql .= " b.amount, b.label, b.rappro, b.num_releve, b.num_chq, b.fk_type,";
$sql .= " ba.rowid as bankid, ba.ref as bankref, ba.label as banklabel";
$sql .= " FROM " . MAIN_DB_PREFIX . "bank_account as ba";
$sql .= ", " . MAIN_DB_PREFIX . "bank as b";
$sql .= " WHERE b.fk_account = " . $acct->id;
if ($listofnum)
$sql .= " AND b.num_releve IN (" . $listofnum . ")";
if (! isset($num))
$sql .= " OR b.num_releve is null";
$sql .= " AND b.fk_account = ba.rowid";
$sql .= $db->order("b.num_releve, b.datev, b.datec", "ASC"); // We add date of creation to have correct order when everything is done the same day
// print $sql;
$resql=$db->query($sql);
if ($resql)
{
$balancebefore=array();
$resql = $db->query($sql);
if ($resql) {
$balancebefore = array();
$numrows = $db->num_rows($resql);
if ($numrows > 0)
{
if ($numrows > 0) {
// Open file
print 'Open file '.$filename.' into directory '.$dirname."\n";
print 'Open file ' . $filename . ' into directory ' . $dirname . "\n";
dol_mkdir($dirname);
$result=$objmodel->open_file($dirname."/".$filename, $outputlangs);
$result = $objmodel->open_file($dirname . "/" . $filename, $outputlangs);
if ($result < 0)
{
print 'Failed to create file '.$filename.' into dir '.$dirname.'.'."\n";
return -1;
if ($result < 0) {
print 'Failed to create file ' . $filename . ' into dir ' . $dirname . '.' . "\n";
return - 1;
}
// Genere en-tete
@ -221,35 +181,30 @@ if ($resql)
$objmodel->write_title($array_fields, $array_selected, $outputlangs, $array_export_TypeFields);
}
$i=0;
while ($i < $numrows)
{
$thirdparty='';
$accountelem='';
$comment='';
$i = 0;
while ($i < $numrows) {
$thirdparty = '';
$accountelem = '';
$comment = '';
$objp = $db->fetch_object($resql);
// Calculate start balance
if (! isset($balancebefore[$objp->num_releve]))
{
print 'Calculate start balance for receipt '.$objp->num_releve."\n";
if (! isset($balancebefore[$objp->num_releve])) {
print 'Calculate start balance for receipt ' . $objp->num_releve . "\n";
$sql2 = "SELECT sum(b.amount) as amount";
$sql2.= " FROM ".MAIN_DB_PREFIX."bank as b";
$sql2.= " WHERE b.num_releve < '".$db->escape($objp->num_releve)."'";
$sql2.= " AND b.fk_account = ".$objp->bankid;
$resql2=$db->query($sql2);
if ($resql2)
{
$obj2=$db->fetch_object($resql2);
$balancebefore[$objp->num_releve] = ($obj2->amount?$obj2->amount:0);
$sql2 .= " FROM " . MAIN_DB_PREFIX . "bank as b";
$sql2 .= " WHERE b.num_releve < '" . $db->escape($objp->num_releve) . "'";
$sql2 .= " AND b.fk_account = " . $objp->bankid;
$resql2 = $db->query($sql2);
if ($resql2) {
$obj2 = $db->fetch_object($resql2);
$balancebefore[$objp->num_releve] = ($obj2->amount ? $obj2->amount : 0);
$db->free($resql2);
}
else
{
} else {
dol_print_error($db);
exit(-1);
exit(- 1);
}
$total = $balancebefore[$objp->num_releve];
@ -258,168 +213,153 @@ if ($resql)
$totalbefore = $total;
$total = $total + $objp->amount;
// Date operation
$dateop=$db->jdate($objp->do);
$dateop = $db->jdate($objp->do);
// Date de valeur
$datevalue=$db->jdate($objp->dv);
$datevalue = $db->jdate($objp->dv);
// Num cheque
$numchq=($objp->num_chq?$objp->num_chq:'');
$numchq = ($objp->num_chq ? $objp->num_chq : '');
// Libelle
$reg=array();
preg_match('/\((.+)\)/i', $objp->label, $reg); // Si texte entoure de parenthese on tente recherche de traduction
if ($reg[1] && $langs->transnoentitiesnoconv($reg[1])!=$reg[1]) $description=$langs->transnoentitiesnoconv($reg[1]);
else $description=$objp->label;
$reg = array();
preg_match('/\((.+)\)/i', $objp->label, $reg); // Si texte entoure de parenthese on tente recherche de traduction
if ($reg[1] && $langs->transnoentitiesnoconv($reg[1]) != $reg[1])
$description = $langs->transnoentitiesnoconv($reg[1]);
else
$description = $objp->label;
/*
* Ajout les liens (societe, company...)
*/
$links = $acct->get_url($objp->rowid);
foreach($links as $key=>$val)
{
if ($links[$key]['type']=='payment')
{
foreach ($links as $key => $val) {
if ($links[$key]['type'] == 'payment') {
$paymentstatic->fetch($links[$key]['url_id']);
$tmparray=$paymentstatic->getBillsArray('');
if (is_array($tmparray))
{
foreach($tmparray as $key => $val)
{
$tmparray = $paymentstatic->getBillsArray('');
if (is_array($tmparray)) {
foreach ($tmparray as $key => $val) {
$invoicestatic->fetch($val);
if ($accountelem) $accountelem.= ', ';
$accountelem.=$invoicestatic->ref;
if ($accountelem)
$accountelem .= ', ';
$accountelem .= $invoicestatic->ref;
}
}
}
elseif ($links[$key]['type']=='payment_supplier')
{
} elseif ($links[$key]['type'] == 'payment_supplier') {
$paymentsupplierstatic->fetch($links[$key]['url_id']);
$tmparray=$paymentsupplierstatic->getBillsArray('');
if (is_array($tmparray))
{
foreach($tmparray as $key => $val)
{
$tmparray = $paymentsupplierstatic->getBillsArray('');
if (is_array($tmparray)) {
foreach ($tmparray as $key => $val) {
$invoicesupplierstatic->fetch($val);
if ($accountelem) $accountelem.= ', ';
$accountelem.=$invoicesupplierstatic->ref;
if ($accountelem)
$accountelem .= ', ';
$accountelem .= $invoicesupplierstatic->ref;
}
}
}
elseif ($links[$key]['type']=='payment_sc')
{
} elseif ($links[$key]['type'] == 'payment_sc') {
$paymentsocialcontributionstatic->fetch($links[$key]['url_id']);
if ($accountelem) $accountelem.= ', ';
$accountelem.=$langs->transnoentitiesnoconv("SocialContribution").' '.$paymentsocialcontributionstatic->ref;
}
elseif ($links[$key]['type']=='payment_vat')
{
if ($accountelem)
$accountelem .= ', ';
$accountelem .= $langs->transnoentitiesnoconv("SocialContribution") . ' ' . $paymentsocialcontributionstatic->ref;
} elseif ($links[$key]['type'] == 'payment_vat') {
$paymentvatstatic->fetch($links[$key]['url_id']);
if ($accountelem) $accountelem.= ', ';
$accountelem.=$langs->transnoentitiesnoconv("VATPayments").' '.$paymentvatstatic->ref;
}
elseif ($links[$key]['type']=='banktransfert')
{
$comment=$outputlangs->transnoentitiesnoconv("Transfer");
if ($objp->amount > 0)
{
if ($comment) $comment.= ' ';
if ($accountelem)
$accountelem .= ', ';
$accountelem .= $langs->transnoentitiesnoconv("VATPayments") . ' ' . $paymentvatstatic->ref;
} elseif ($links[$key]['type'] == 'banktransfert') {
$comment = $outputlangs->transnoentitiesnoconv("Transfer");
if ($objp->amount > 0) {
if ($comment)
$comment .= ' ';
$banklinestatic->fetch($links[$key]['url_id']);
$bankstatic->id=$banklinestatic->fk_account;
$bankstatic->label=$banklinestatic->bank_account_label;
$comment.= ' ('.$langs->transnoentitiesnoconv("from").' ';
$comment.= $bankstatic->getNomUrl(1, 'transactions');
$comment.= ' '.$langs->transnoentitiesnoconv("toward").' ';
$bankstatic->id=$objp->bankid;
$bankstatic->label=$objp->bankref;
$comment.= $bankstatic->getNomUrl(1, '');
$comment.= ')';
}
else
{
if ($comment) $comment.= ' ';
$bankstatic->id=$objp->bankid;
$bankstatic->label=$objp->bankref;
$comment.= ' ('.$langs->transnoentitiesnoconv("from").' ';
$comment.= $bankstatic->getNomUrl(1, '');
$comment.= ' '.$langs->transnoentitiesnoconv("toward").' ';
$bankstatic->id = $banklinestatic->fk_account;
$bankstatic->label = $banklinestatic->bank_account_label;
$comment .= ' (' . $langs->transnoentitiesnoconv("from") . ' ';
$comment .= $bankstatic->getNomUrl(1, 'transactions');
$comment .= ' ' . $langs->transnoentitiesnoconv("toward") . ' ';
$bankstatic->id = $objp->bankid;
$bankstatic->label = $objp->bankref;
$comment .= $bankstatic->getNomUrl(1, '');
$comment .= ')';
} else {
if ($comment)
$comment .= ' ';
$bankstatic->id = $objp->bankid;
$bankstatic->label = $objp->bankref;
$comment .= ' (' . $langs->transnoentitiesnoconv("from") . ' ';
$comment .= $bankstatic->getNomUrl(1, '');
$comment .= ' ' . $langs->transnoentitiesnoconv("toward") . ' ';
$banklinestatic->fetch($links[$key]['url_id']);
$bankstatic->id=$banklinestatic->fk_account;
$bankstatic->label=$banklinestatic->bank_account_label;
$comment.= $bankstatic->getNomUrl(1, 'transactions');
$comment.= ')';
$bankstatic->id = $banklinestatic->fk_account;
$bankstatic->label = $banklinestatic->bank_account_label;
$comment .= $bankstatic->getNomUrl(1, 'transactions');
$comment .= ')';
}
} elseif ($links[$key]['type'] == 'company') {
if ($thirdparty)
$thirdparty .= ', ';
$thirdparty .= dol_trunc($links[$key]['label'], 24);
$newline = 0;
} elseif ($links[$key]['type'] == 'member') {
if ($thirdparty)
$accountelem .= ', ';
$thirdparty .= $links[$key]['label'];
$newline = 0;
}
elseif ($links[$key]['type']=='company')
{
if ($thirdparty) $thirdparty.= ', ';
$thirdparty.= dol_trunc($links[$key]['label'], 24);
$newline=0;
}
elseif ($links[$key]['type']=='member')
{
if ($thirdparty) $accountelem.= ', ';
$thirdparty.= $links[$key]['label'];
$newline=0;
}
/*elseif ($links[$key]['type']=='sc')
{
if ($accountelem) $accountelem.= ', ';
//$accountelem.= '<a href="'.DOL_URL_ROOT.'/compta/sociales/card.php?id='.$links[$key]['url_id'].'">';
//$accountelem.= img_object($langs->transnoentitiesnoconv('ShowBill'),'bill').' ';
$accountelem.= $langs->transnoentitiesnoconv("SocialContribution");
//$accountelem.= '</a>';
$newline=0;
}
else
{
if ($accountelem) $accountelem.= ', ';
//$accountelem.= '<a href="'.$links[$key]['url'].$links[$key]['url_id'].'">';
$accountelem.= $links[$key]['label'];
//$accountelem.= '</a>';
$newline=0;
}*/
/*
* elseif ($links[$key]['type']=='sc')
* {
* if ($accountelem) $accountelem.= ', ';
* //$accountelem.= '<a href="'.DOL_URL_ROOT.'/compta/sociales/card.php?id='.$links[$key]['url_id'].'">';
* //$accountelem.= img_object($langs->transnoentitiesnoconv('ShowBill'),'bill').' ';
* $accountelem.= $langs->transnoentitiesnoconv("SocialContribution");
* //$accountelem.= '</a>';
* $newline=0;
* }
* else
* {
* if ($accountelem) $accountelem.= ', ';
* //$accountelem.= '<a href="'.$links[$key]['url'].$links[$key]['url_id'].'">';
* $accountelem.= $links[$key]['label'];
* //$accountelem.= '</a>';
* $newline=0;
* }
*/
}
$debit=$credit='';
if ($objp->amount < 0)
{
$debit = $credit = '';
if ($objp->amount < 0) {
$totald = $totald + abs($objp->amount);
$debit=price2num($objp->amount * -1);
}
else
{
$debit = price2num($objp->amount * - 1);
} else {
$totalc = $totalc + abs($objp->amount);
$credit=price2num($objp->amount);
$credit = price2num($objp->amount);
}
$i++;
$i ++;
$rec=new stdClass();
$rec->bankreceipt=$objp->num_releve;
$rec->bankaccount=$objp->banklabel;
$rec->dateop=dol_print_date($dateop, 'dayrfc');
$rec->dateval=dol_print_date($datevalue, 'dayrfc');
$rec->type=$objp->fk_type.' '.($objp->num_chq?$objp->num_chq:'');
$rec->description=$description;
$rec->thirdparty=$thirdparty;
$rec->accountelem=$accountelem;
$rec->debit=$debit;
$rec->credit=$credit;
$rec->comment=$comment;
$rec->soldbefore=price2num($totalbefore);
$rec->soldafter=price2num($total);
$rec = new stdClass();
$rec->bankreceipt = $objp->num_releve;
$rec->bankaccount = $objp->banklabel;
$rec->dateop = dol_print_date($dateop, 'dayrfc');
$rec->dateval = dol_print_date($datevalue, 'dayrfc');
$rec->type = $objp->fk_type . ' ' . ($objp->num_chq ? $objp->num_chq : '');
$rec->description = $description;
$rec->thirdparty = $thirdparty;
$rec->accountelem = $accountelem;
$rec->debit = $debit;
$rec->credit = $credit;
$rec->comment = $comment;
$rec->soldbefore = price2num($totalbefore);
$rec->soldafter = price2num($total);
// end of special operation processing
$objmodel->write_record($array_selected, $rec, $outputlangs, $array_export_TypeFields);
}
if ($numrows > 0)
{
print "Found ".$numrows." records for receipt ".$num."\n";
if ($numrows > 0) {
print "Found " . $numrows . " records for receipt " . $num . "\n";
// Genere en-tete
$objmodel->write_footer($outputlangs);
@ -427,21 +367,17 @@ if ($resql)
// Close file
$objmodel->close_file();
print 'File '.$filename.' was generated into dir '.$dirname.'.'."\n";
print 'File ' . $filename . ' was generated into dir ' . $dirname . '.' . "\n";
$ret=0;
}
else
{
print "No records found for receipt ".$num."\n";
$ret = 0;
} else {
print "No records found for receipt " . $num . "\n";
$ret=0;
$ret = 0;
}
}
else
{
} else {
dol_print_error($db);
$ret=-1;
$ret = - 1;
}
$db->close();

View File

@ -1,8 +1,8 @@
#!/usr/bin/env php
<?php
/*
* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2009-2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2009-2013 Laurent Destailleur <eldy@users.sourceforge.net>
*
* 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
@ -11,7 +11,7 @@
*
* 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
* 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
@ -19,52 +19,49 @@
*/
/**
* \file scripts/company/export-contacts-xls-example.php
* \ingroup company
* \brief Script file to export contacts into an Excel file
* \file scripts/company/export-contacts-xls-example.php
* \ingroup company
* \brief Script file to export contacts into an Excel file
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
if (! isset($argv[1]) || ! $argv[1]) {
print "Usage: $script_file now\n";
exit(-1);
exit(- 1);
}
$now=$argv[1];
$now = $argv[1];
require_once $path . "../../htdocs/master.inc.php";
// require_once PHP_WRITEEXCEL_PATH."/class.writeexcel_workbook.inc.php";
// require_once PHP_WRITEEXCEL_PATH."/class.writeexcel_worksheet.inc.php";
require_once $path."../../htdocs/master.inc.php";
//require_once PHP_WRITEEXCEL_PATH."/class.writeexcel_workbook.inc.php";
//require_once PHP_WRITEEXCEL_PATH."/class.writeexcel_worksheet.inc.php";
require_once PHPEXCEL_PATH."/PHPExcel.php";
//require_once PHPEXCEL_PATH."/PHPExcel/Writer/Excel2007.php";
require_once PHPEXCEL_PATH."/PHPExcel/Writer/Excel5.php";
require_once PHPEXCEL_PATH . "/PHPExcel.php";
// require_once PHPEXCEL_PATH."/PHPExcel/Writer/Excel2007.php";
require_once PHPEXCEL_PATH . "/PHPExcel/Writer/Excel5.php";
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
$fname = DOL_DATA_ROOT.'/export-contacts.xls';
$fname = DOL_DATA_ROOT . '/export-contacts.xls';
//$objPHPExcel = new writeexcel_workbook($fname);
// $objPHPExcel = new writeexcel_workbook($fname);
$objPHPExcel = new PHPExcel();
$objPHPExcel->getProperties()->setCreator("Dolibarr script");
$objPHPExcel->getProperties()->setLastModifiedBy("Dolibarr script");
@ -72,23 +69,21 @@ $objPHPExcel->getProperties()->setTitle("Test Document");
$objPHPExcel->getProperties()->setSubject("Test Document");
$objPHPExcel->getProperties()->setDescription("Test document, generated using PHP classes.");
//$page = &$objPHPExcel->addworksheet('Export Dolibarr');
// $page = &$objPHPExcel->addworksheet('Export Dolibarr');
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setTitle('Contacts');
//$page->set_column(0,4,18); // A
// $page->set_column(0,4,18); // A
$sql = "SELECT distinct c.lastname, c.firstname, c.email, s.nom as name";
$sql.= " FROM ".MAIN_DB_PREFIX."socpeople as c";
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s on s.rowid = c.fk_soc";
$sql .= " FROM " . MAIN_DB_PREFIX . "socpeople as c";
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "societe as s on s.rowid = c.fk_soc";
$resql=$db->query($sql);
if ($resql)
{
$resql = $db->query($sql);
if ($resql) {
$num = $db->num_rows($resql);
print "Lines ".$num."\n";
print "Lines " . $num . "\n";
$i = 0;
$j = 1;
@ -98,27 +93,25 @@ if ($resql)
$objPHPExcel->getActiveSheet()->SetCellValue('C1', $langs->trans("Email"));
$objPHPExcel->getActiveSheet()->SetCellValue('D1', $langs->trans("ThirdPart"));
while ($i < $num)
{
while ($i < $num) {
$obj = $db->fetch_object($resql);
$objPHPExcel->getActiveSheet()->SetCellValue('A'.($i+2), $obj->firstname);
$objPHPExcel->getActiveSheet()->SetCellValue('B'.($i+2), $obj->lastname);
$objPHPExcel->getActiveSheet()->SetCellValue('C'.($i+2), $obj->email);
$objPHPExcel->getActiveSheet()->SetCellValue('D'.($i+2), $obj->name);
$objPHPExcel->getActiveSheet()->SetCellValue('A' . ($i + 2), $obj->firstname);
$objPHPExcel->getActiveSheet()->SetCellValue('B' . ($i + 2), $obj->lastname);
$objPHPExcel->getActiveSheet()->SetCellValue('C' . ($i + 2), $obj->email);
$objPHPExcel->getActiveSheet()->SetCellValue('D' . ($i + 2), $obj->name);
$j++;
$i++;
$j ++;
$i ++;
}
}
//$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
// $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
$objWriter->save($fname);
//$objPHPExcel->close();
// $objPHPExcel->close();
print 'File '.$fname.' was generated.'."\n";
print 'File ' . $fname . ' was generated.' . "\n";
exit(0);

View File

@ -1,8 +1,8 @@
#!/usr/bin/env php
<?php
/*
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2009 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2009 Laurent Destailleur <eldy@users.sourceforge.net>
*
* 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
@ -11,7 +11,7 @@
*
* 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
* 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
@ -19,74 +19,70 @@
*/
/**
* \file scripts/company/sync_contacts_dolibarr2ldap.php
* \ingroup ldap company
* \brief Script to update all contacts from Dolibarr into a LDAP database
* \file scripts/company/sync_contacts_dolibarr2ldap.php
* \ingroup ldap company
* \brief Script to update all contacts from Dolibarr into a LDAP database
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/contact/class/contact.class.php";
require_once DOL_DOCUMENT_ROOT."/user/class/user.class.php";
require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php";
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/contact/class/contact.class.php";
require_once DOL_DOCUMENT_ROOT . "/user/class/user.class.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php";
// Global variables
$version=DOL_VERSION;
$error=0;
$confirmed=0;
$version = DOL_VERSION;
$error = 0;
$confirmed = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
if (! isset($argv[1]) || ! $argv[1]) {
print "Usage: $script_file now [-y]\n";
exit(-1);
print "Usage: $script_file now [-y]\n";
exit(- 1);
}
foreach($argv as $key => $val)
{
if (preg_match('/-y$/', $val, $reg)) $confirmed=1;
foreach ($argv as $key => $val) {
if (preg_match('/-y$/', $val, $reg))
$confirmed = 1;
}
$now=$argv[1];
$now = $argv[1];
print "Mails sending disabled (useless in batch mode)\n";
$conf->global->MAIN_DISABLE_ALL_MAILS=1; // On bloque les mails
$conf->global->MAIN_DISABLE_ALL_MAILS = 1; // On bloque les mails
print "\n";
print "----- Synchronize all records from Dolibarr database:\n";
print "type=".$conf->db->type."\n";
print "host=".$conf->db->host."\n";
print "port=".$conf->db->port."\n";
print "login=".$conf->db->user."\n";
//print "pass=".preg_replace('/./i','*',$conf->db->password)."\n"; // Not defined for security reasons
print "database=".$conf->db->name."\n";
print "type=" . $conf->db->type . "\n";
print "host=" . $conf->db->host . "\n";
print "port=" . $conf->db->port . "\n";
print "login=" . $conf->db->user . "\n";
// print "pass=".preg_replace('/./i','*',$conf->db->password)."\n"; // Not defined for security reasons
print "database=" . $conf->db->name . "\n";
print "\n";
print "----- To LDAP database:\n";
print "host=".$conf->global->LDAP_SERVER_HOST."\n";
print "port=".$conf->global->LDAP_SERVER_PORT."\n";
print "login=".$conf->global->LDAP_ADMIN_DN."\n";
print "pass=".preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS)."\n";
print "DN target=".$conf->global->LDAP_CONTACT_DN."\n";
print "host=" . $conf->global->LDAP_SERVER_HOST . "\n";
print "port=" . $conf->global->LDAP_SERVER_PORT . "\n";
print "login=" . $conf->global->LDAP_ADMIN_DN . "\n";
print "pass=" . preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS) . "\n";
print "DN target=" . $conf->global->LDAP_CONTACT_DN . "\n";
print "\n";
if (! $confirmed)
{
if (! $confirmed) {
print "Press a key to confirm...\n";
$input = trim(fgets(STDIN));
print "Warning, this operation may result in data loss if it failed.\n";
@ -96,28 +92,26 @@ if (! $confirmed)
}
/*
if (! $conf->global->LDAP_CONTACT_ACTIVE)
{
print $langs->trans("LDAPSynchronizationNotSetupInDolibarr");
exit(-1);
}
*/
* if (! $conf->global->LDAP_CONTACT_ACTIVE)
* {
* print $langs->trans("LDAPSynchronizationNotSetupInDolibarr");
* exit(-1);
* }
*/
$sql = "SELECT rowid";
$sql .= " FROM ".MAIN_DB_PREFIX."socpeople";
$sql .= " FROM " . MAIN_DB_PREFIX . "socpeople";
$resql = $db->query($sql);
if ($resql)
{
if ($resql) {
$num = $db->num_rows($resql);
$i = 0;
$ldap=new Ldap();
$ldap = new Ldap();
$ldap->connect_bind();
while ($i < $num)
{
$ldap->error="";
while ($i < $num) {
$ldap->error = "";
$obj = $db->fetch_object($resql);
@ -125,37 +119,32 @@ if ($resql)
$contact->id = $obj->rowid;
$contact->fetch($contact->id);
print $langs->trans("UpdateContact")." rowid=".$contact->id." ".$contact->getFullName($langs);
print $langs->trans("UpdateContact") . " rowid=" . $contact->id . " " . $contact->getFullName($langs);
$oldobject=$contact;
$oldobject = $contact;
$oldinfo=$oldobject->_load_ldap_info();
$olddn=$oldobject->_load_ldap_dn($oldinfo);
$oldinfo = $oldobject->_load_ldap_info();
$olddn = $oldobject->_load_ldap_dn($oldinfo);
$info=$contact->_load_ldap_info();
$dn=$contact->_load_ldap_dn($info);
$info = $contact->_load_ldap_info();
$dn = $contact->_load_ldap_dn($info);
$result=$ldap->add($dn, $info, $user); // Wil fail if already exists
$result=$ldap->update($dn, $info, $user, $olddn);
if ($result > 0)
{
print " - ".$langs->trans("OK");
}
else
{
$error++;
print " - ".$langs->trans("KO").' - '.$ldap->error;
$result = $ldap->add($dn, $info, $user); // Wil fail if already exists
$result = $ldap->update($dn, $info, $user, $olddn);
if ($result > 0) {
print " - " . $langs->trans("OK");
} else {
$error ++;
print " - " . $langs->trans("KO") . ' - ' . $ldap->error;
}
print "\n";
$i++;
$i ++;
}
$ldap->unbind();
$ldap->close();
}
else
{
} else {
dol_print_error($db);
}

View File

@ -1,9 +1,9 @@
#!/usr/bin/env php
<?php
/*
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
*
* 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
@ -12,7 +12,7 @@
*
* 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
* 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
@ -20,297 +20,283 @@
*/
/**
* \file scripts/contracts/email_expire_services_to_customers.php
* \ingroup facture
* \brief Script to send a mail to customers with services to expire
* \file scripts/contracts/email_expire_services_to_customers.php
* \ingroup facture
* \brief Script to send a mail to customers with services to expire
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test si mode batch
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
if (! isset($argv[1]) || ! $argv[1] || ! in_array($argv[1], array('test','confirm')) || ! in_array($argv[2], array('thirdparties','contacts')))
{
if (! isset($argv[1]) || ! $argv[1] || ! in_array($argv[1], array('test','confirm')) || ! in_array($argv[2], array('thirdparties','contacts'))) {
print "Usage: $script_file (test|confirm) (thirdparties|contacts) [delay] [after]\n";
print "\n";
print "Send an email to customers to remind all contracts services to expire or expired.\n";
print "If you choose 'test' mode, no emails are sent.\n";
print "If you add param delay (nb of days), only services with expired date < today + delay are included.\n";
print "If you add param after (nb of days), only services with expired date >= today + delay are included.\n";
exit(-1);
exit(- 1);
}
$mode=$argv[1];
$targettype=$argv[2];
$mode = $argv[1];
$targettype = $argv[2];
require $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/CMailFile.class.php";
require $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/core/class/CMailFile.class.php";
$langs->loadLangs(array('main', 'contracts'));
$langs->loadLangs(array('main','contracts'));
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
$now=dol_now('tzserver');
$duration_value=isset($argv[3])?$argv[3]:'none';
$duration_value2=isset($argv[4])?$argv[4]:'none';
$now = dol_now('tzserver');
$duration_value = isset($argv[3]) ? $argv[3] : 'none';
$duration_value2 = isset($argv[4]) ? $argv[4] : 'none';
$error = 0;
print $script_file." launched with mode ".$mode." default lang=".$langs->defaultlang.(is_numeric($duration_value)?" delay=".$duration_value:"").(is_numeric($duration_value2)?" after=".$duration_value2:"")."\n";
print $script_file . " launched with mode " . $mode . " default lang=" . $langs->defaultlang . (is_numeric($duration_value) ? " delay=" . $duration_value : "") . (is_numeric($duration_value2) ? " after=" . $duration_value2 : "") . "\n";
if ($mode != 'confirm') $conf->global->MAIN_DISABLE_ALL_MAILS=1;
if ($mode != 'confirm')
$conf->global->MAIN_DISABLE_ALL_MAILS = 1;
$sql = "SELECT c.ref, cd.date_fin_validite, cd.total_ttc, cd.description as description, p.label as plabel,";
$sql.= " s.rowid as sid, s.nom as name, s.email, s.default_lang";
if ($targettype == 'contacts') $sql.= ", sp.rowid as cid, sp.firstname as cfirstname, sp.lastname as clastname, sp.email as cemail";
$sql .= " FROM ".MAIN_DB_PREFIX."societe AS s";
if ($targettype == 'contacts') $sql.= ", ".MAIN_DB_PREFIX."socpeople as sp";
$sql .= ", ".MAIN_DB_PREFIX."contrat AS c";
$sql .= ", ".MAIN_DB_PREFIX."contratdet AS cd";
$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product AS p ON p.rowid = cd.fk_product";
$sql = "SELECT c.ref, cd.date_fin_validite, cd.total_ttc, cd.description as description, p.label as plabel,";
$sql .= " s.rowid as sid, s.nom as name, s.email, s.default_lang";
if ($targettype == 'contacts')
$sql .= ", sp.rowid as cid, sp.firstname as cfirstname, sp.lastname as clastname, sp.email as cemail";
$sql .= " FROM " . MAIN_DB_PREFIX . "societe AS s";
if ($targettype == 'contacts')
$sql .= ", " . MAIN_DB_PREFIX . "socpeople as sp";
$sql .= ", " . MAIN_DB_PREFIX . "contrat AS c";
$sql .= ", " . MAIN_DB_PREFIX . "contratdet AS cd";
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product AS p ON p.rowid = cd.fk_product";
$sql .= " WHERE s.rowid = c.fk_soc AND c.rowid = cd.fk_contrat AND c.statut > 0 AND cd.statut < 5";
if (is_numeric($duration_value2)) $sql.= " AND cd.date_fin_validite >= '".$db->idate(dol_time_plus_duree($now, $duration_value2, "d"))."'";
if (is_numeric($duration_value)) $sql.= " AND cd.date_fin_validite < '".$db->idate(dol_time_plus_duree($now, $duration_value, "d"))."'";
if ($targettype == 'contacts') $sql.= " AND s.rowid = sp.fk_soc";
$sql.= " ORDER BY";
if ($targettype == 'contacts') $sql.= " sp.email, sp.rowid,";
$sql.= " s.email ASC, s.rowid ASC, cd.date_fin_validite ASC"; // Order by email to allow one message per email
if (is_numeric($duration_value2))
$sql .= " AND cd.date_fin_validite >= '" . $db->idate(dol_time_plus_duree($now, $duration_value2, "d")) . "'";
if (is_numeric($duration_value))
$sql .= " AND cd.date_fin_validite < '" . $db->idate(dol_time_plus_duree($now, $duration_value, "d")) . "'";
if ($targettype == 'contacts')
$sql .= " AND s.rowid = sp.fk_soc";
$sql .= " ORDER BY";
if ($targettype == 'contacts')
$sql .= " sp.email, sp.rowid,";
$sql .= " s.email ASC, s.rowid ASC, cd.date_fin_validite ASC"; // Order by email to allow one message per email
//print $sql;
$resql=$db->query($sql);
if ($resql)
{
$num = $db->num_rows($resql);
$i = 0;
$oldemail = 'none'; $oldsid = 0; $oldcid = 0; $oldlang='';
$total = 0; $foundtoprocess = 0;
$trackthirdpartiessent = array();
// print $sql;
$resql = $db->query($sql);
if ($resql) {
$num = $db->num_rows($resql);
$i = 0;
$oldemail = 'none';
$oldsid = 0;
$oldcid = 0;
$oldlang = '';
$total = 0;
$foundtoprocess = 0;
$trackthirdpartiessent = array();
print "We found ".$num." couples (services to expire-".$targettype.") qualified\n";
dol_syslog("We found ".$num." couples (services to expire-".$targettype.") qualified");
$message='';
print "We found " . $num . " couples (services to expire-" . $targettype . ") qualified\n";
dol_syslog("We found " . $num . " couples (services to expire-" . $targettype . ") qualified");
$message = '';
if ($num)
{
while ($i < $num)
{
$obj = $db->fetch_object($resql);
if ($num) {
while ($i < $num) {
$obj = $db->fetch_object($resql);
$newemail=empty($obj->cemail)?$obj->email:$obj->cemail;
$newemail = empty($obj->cemail) ? $obj->email : $obj->cemail;
// Check if this record is a break after previous one
$startbreak=false;
if ($newemail <> $oldemail || $oldemail == 'none') $startbreak=true;
if ($obj->sid && $obj->sid <> $oldsid) $startbreak=true;
if ($obj->cid && $obj->cid <> $oldcid) $startbreak=true;
// Check if this record is a break after previous one
$startbreak = false;
if ($newemail != $oldemail || $oldemail == 'none')
$startbreak = true;
if ($obj->sid && $obj->sid != $oldsid)
$startbreak = true;
if ($obj->cid && $obj->cid != $oldcid)
$startbreak = true;
if ($startbreak)
{
// Break onto sales representative (new email or cid)
if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid.'|'.$oldemail]))
{
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget, $duration_value);
$trackthirdpartiessent[$oldsid.'|'.$oldemail]='contact id '.$oldcid;
}
else
{
if ($oldemail != 'none')
{
if (empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) print "- No email sent for '".$oldtarget."', total: ".$total."\n";
else print "- No email sent for '".$oldtarget."', total: ".$total." (already sent to ".$trackthirdpartiessent[$oldsid.'|'.$oldemail].")\n";
}
}
$oldemail = $newemail;
$oldsid = $obj->sid;
$oldcid = $obj->cid;
$oldlang = $obj->lang;
$oldtarget=(empty($obj->cfirstname) && empty($obj->clastname))?$obj->name:($obj->clastname." ".$obj->cfirstname);
$message = '';
$total = 0;
$foundtoprocess = 0;
$target=(empty($obj->cfirstname) && empty($obj->clastname))?$obj->name:($obj->clastname." ".$obj->cfirstname);
//if (empty($newemail)) print "Warning: Customer ".$target." has no email. Notice disabled.\n";
}
if ($startbreak) {
// Break onto sales representative (new email or cid)
if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid . '|' . $oldemail])) {
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget, $duration_value);
$trackthirdpartiessent[$oldsid . '|' . $oldemail] = 'contact id ' . $oldcid;
} else {
if ($oldemail != 'none') {
if (empty($trackthirdpartiessent[$oldsid . '|' . $oldemail]))
print "- No email sent for '" . $oldtarget . "', total: " . $total . "\n";
else
print "- No email sent for '" . $oldtarget . "', total: " . $total . " (already sent to " . $trackthirdpartiessent[$oldsid . '|' . $oldemail] . ")\n";
}
}
$oldemail = $newemail;
$oldsid = $obj->sid;
$oldcid = $obj->cid;
$oldlang = $obj->lang;
$oldtarget = (empty($obj->cfirstname) && empty($obj->clastname)) ? $obj->name : ($obj->clastname . " " . $obj->cfirstname);
$message = '';
$total = 0;
$foundtoprocess = 0;
$target = (empty($obj->cfirstname) && empty($obj->clastname)) ? $obj->name : ($obj->clastname . " " . $obj->cfirstname);
// if (empty($newemail)) print "Warning: Customer ".$target." has no email. Notice disabled.\n";
}
// Define line content
$outputlangs=new Translate('', $conf);
$outputlangs->setDefaultLang(empty($obj->default_lang)?$langs->defaultlang:$obj->default_lang); // By default language of customer
// Define line content
$outputlangs = new Translate('', $conf);
$outputlangs->setDefaultLang(empty($obj->default_lang) ? $langs->defaultlang : $obj->default_lang); // By default language of customer
// Load translation files required by the page
$outputlangs->loadLangs(array("main", "contracts", "bills", "products"));
// Load translation files required by the page
$outputlangs->loadLangs(array("main","contracts","bills","products"));
if (dol_strlen($newemail))
{
$message .= $outputlangs->trans("Contract")." ".$obj->ref.": ".$outputlangs->trans("Service")." ".dol_concatdesc($obj->plabel, $obj->description)." (".price($obj->total_ttc, 0, $outputlangs, 0, 0, -1, $conf->currency)."), ".$outputlangs->trans("DateEndPlannedShort")." ".dol_print_date($db->jdate($obj->date_fin_validite), 'day')."\n\n";
dol_syslog("email_expire_services_to_customers.php: ".$newemail." ".$message);
$foundtoprocess++;
}
print "Service to expire ".$obj->ref.", label ".dol_concatdesc($obj->plabel, $obj->description).", due date ".dol_print_date($db->jdate($obj->date_fin_validite), 'day').", customer id ".$obj->sid." ".$obj->name.", ".($obj->cid?"contact id ".$obj->cid." ".$obj->clastname." ".$obj->cfirstname.", ":"")."email ".$newemail.", lang ".$outputlangs->defaultlang.": ";
if (dol_strlen($newemail)) print "qualified.";
else print "disqualified (no email).";
if (dol_strlen($newemail)) {
$message .= $outputlangs->trans("Contract") . " " . $obj->ref . ": " . $outputlangs->trans("Service") . " " . dol_concatdesc($obj->plabel, $obj->description) . " (" . price($obj->total_ttc, 0, $outputlangs, 0, 0, - 1, $conf->currency) . "), " . $outputlangs->trans("DateEndPlannedShort") . " " . dol_print_date($db->jdate($obj->date_fin_validite), 'day') . "\n\n";
dol_syslog("email_expire_services_to_customers.php: " . $newemail . " " . $message);
$foundtoprocess ++;
}
print "Service to expire " . $obj->ref . ", label " . dol_concatdesc($obj->plabel, $obj->description) . ", due date " . dol_print_date($db->jdate($obj->date_fin_validite), 'day') . ", customer id " . $obj->sid . " " . $obj->name . ", " . ($obj->cid ? "contact id " . $obj->cid . " " . $obj->clastname . " " . $obj->cfirstname . ", " : "") . "email " . $newemail . ", lang " . $outputlangs->defaultlang . ": ";
if (dol_strlen($newemail))
print "qualified.";
else
print "disqualified (no email).";
print "\n";
unset($outputlangs);
unset($outputlangs);
$total += $obj->total_ttc;
$total += $obj->total_ttc;
$i++;
}
$i ++;
}
// Si il reste des envois en buffer
if ($foundtoprocess)
{
if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) // Break onto email (new email)
{
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget, $duration_value);
$trackthirdpartiessent[$oldsid.'|'.$oldemail]='contact id '.$oldcid;
}
else
// Si il reste des envois en buffer
if ($foundtoprocess) {
if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid . '|' . $oldemail])) // Break onto email (new email)
{
if ($oldemail != 'none')
{
if (empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) print "- No email sent for '".$oldtarget."', total: ".$total."\n";
else print "- No email sent for '".$oldtarget."', total: ".$total." (already sent to ".$trackthirdpartiessent[$oldsid.'|'.$oldemail].")\n";
}
}
}
}
else
{
print "No services to expire found\n";
}
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget, $duration_value);
$trackthirdpartiessent[$oldsid . '|' . $oldemail] = 'contact id ' . $oldcid;
} else {
if ($oldemail != 'none') {
if (empty($trackthirdpartiessent[$oldsid . '|' . $oldemail]))
print "- No email sent for '" . $oldtarget . "', total: " . $total . "\n";
else
print "- No email sent for '" . $oldtarget . "', total: " . $total . " (already sent to " . $trackthirdpartiessent[$oldsid . '|' . $oldemail] . ")\n";
}
}
}
} else {
print "No services to expire found\n";
}
exit(0);
exit(0);
} else {
dol_print_error($db);
dol_syslog("email_expire_services_to_customers.php: Error");
exit(- 1);
}
else
{
dol_print_error($db);
dol_syslog("email_expire_services_to_customers.php: Error");
exit(-1);
}
/**
* Send email
* Send email
*
* @param string $mode Mode (test | confirm)
* @param string $oldemail Target email
* @param string $message Message to send
* @param string $total Total amount of unpayed invoices
* @param string $userlang Code lang to use for email output.
* @param string $oldtarget Target name
* @param int $duration_value duration value
* @return int <0 if KO, >0 if OK
* @param string $mode
* Mode (test | confirm)
* @param string $oldemail
* Target email
* @param string $message
* Message to send
* @param string $total
* Total amount of unpayed invoices
* @param string $userlang
* Code lang to use for email output.
* @param string $oldtarget
* Target name
* @param int $duration_value
* duration value
* @return int <0 if KO, >0 if OK
*/
function envoi_mail($mode, $oldemail, $message, $total, $userlang, $oldtarget, $duration_value)
{
global $conf,$langs;
global $conf, $langs;
if (getenv('DOL_FORCE_EMAIL_TO')) $oldemail=getenv('DOL_FORCE_EMAIL_TO');
if (getenv('DOL_FORCE_EMAIL_TO'))
$oldemail = getenv('DOL_FORCE_EMAIL_TO');
$newlangs=new Translate('', $conf);
$newlangs->setDefaultLang(empty($userlang)?(empty($conf->global->MAIN_LANG_DEFAULT)?'auto':$conf->global->MAIN_LANG_DEFAULT):$userlang);
$newlangs->load("main");
$newlangs->load("contracts");
$newlangs = new Translate('', $conf);
$newlangs->setDefaultLang(empty($userlang) ? (empty($conf->global->MAIN_LANG_DEFAULT) ? 'auto' : $conf->global->MAIN_LANG_DEFAULT) : $userlang);
$newlangs->load("main");
$newlangs->load("contracts");
if ($duration_value)
{
if ($duration_value > 0) $title=$newlangs->transnoentities("ListOfServicesToExpireWithDuration", $duration_value);
else $title=$newlangs->transnoentities("ListOfServicesToExpireWithDurationNeg", $duration_value);
}
else
$title= $newlangs->transnoentities("ListOfServicesToExpire");
if ($duration_value) {
if ($duration_value > 0)
$title = $newlangs->transnoentities("ListOfServicesToExpireWithDuration", $duration_value);
else
$title = $newlangs->transnoentities("ListOfServicesToExpireWithDurationNeg", $duration_value);
} else
$title = $newlangs->transnoentities("ListOfServicesToExpire");
$subject = (empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_SUBJECT)?$title:$conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_SUBJECT);
$sendto = $oldemail;
$from = $conf->global->MAIN_MAIL_EMAIL_FROM;
$errorsto = $conf->global->MAIN_MAIL_ERRORS_TO;
$msgishtml = -1;
$subject = (empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_SUBJECT) ? $title : $conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_SUBJECT);
$sendto = $oldemail;
$from = $conf->global->MAIN_MAIL_EMAIL_FROM;
$errorsto = $conf->global->MAIN_MAIL_ERRORS_TO;
$msgishtml = - 1;
print "- Send email to '".$oldtarget."' (".$oldemail."), total: ".$total."\n";
dol_syslog("email_expire_services_to_customers.php: send mail to ".$oldemail);
print "- Send email to '" . $oldtarget . "' (" . $oldemail . "), total: " . $total . "\n";
dol_syslog("email_expire_services_to_customers.php: send mail to " . $oldemail);
$usehtml=0;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER)) $usehtml+=1;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_HEADER)) $usehtml+=1;
$usehtml = 0;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER))
$usehtml += 1;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_HEADER))
$usehtml += 1;
$allmessage='';
if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_HEADER))
{
$allmessage.=$conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_HEADER;
}
else
{
$allmessage.= "Dear customer".($usehtml?"<br>\n":"\n").($usehtml?"<br>\n":"\n");
$allmessage.= "Please, find a summary of the services contracted by you that are about to expire.".($usehtml?"<br>\n":"\n").($usehtml?"<br>\n":"\n");
}
$allmessage.= $message.($usehtml?"<br>\n":"\n");
//$allmessage.= $langs->trans("Total")." = ".price($total,0,$userlang,0,0,-1,$conf->currency).($usehtml?"<br>\n":"\n");
if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER))
{
$allmessage.=$conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER)) $usehtml+=1;
}
$allmessage = '';
if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_HEADER)) {
$allmessage .= $conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_HEADER;
} else {
$allmessage .= "Dear customer" . ($usehtml ? "<br>\n" : "\n") . ($usehtml ? "<br>\n" : "\n");
$allmessage .= "Please, find a summary of the services contracted by you that are about to expire." . ($usehtml ? "<br>\n" : "\n") . ($usehtml ? "<br>\n" : "\n");
}
$allmessage .= $message . ($usehtml ? "<br>\n" : "\n");
// $allmessage.= $langs->trans("Total")." = ".price($total,0,$userlang,0,0,-1,$conf->currency).($usehtml?"<br>\n":"\n");
if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER)) {
$allmessage .= $conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_CUSTOMERS_FOOTER))
$usehtml += 1;
}
$mail = new CMailFile(
$subject,
$sendto,
$from,
$allmessage,
array(),
array(),
array(),
'',
'',
0,
$msgishtml
);
$mail = new CMailFile($subject, $sendto, $from, $allmessage, array(), array(), array(), '', '', 0, $msgishtml);
$mail->errors_to = $errorsto;
$mail->errors_to = $errorsto;
// Send or not email
if ($mode == 'confirm')
{
$result=$mail->sendfile();
if (! $result)
{
print "Error sending email ".$mail->error."\n";
dol_syslog("Error sending email ".$mail->error."\n");
}
}
else
{
print "No email sent (test mode)\n";
dol_syslog("No email sent (test mode)");
$mail->dump_mail();
$result=1;
}
// Send or not email
if ($mode == 'confirm') {
$result = $mail->sendfile();
if (! $result) {
print "Error sending email " . $mail->error . "\n";
dol_syslog("Error sending email " . $mail->error . "\n");
}
} else {
print "No email sent (test mode)\n";
dol_syslog("No email sent (test mode)");
$mail->dump_mail();
$result = 1;
}
unset($newlangs);
if ($result)
{
return 1;
}
else
{
return -1;
}
unset($newlangs);
if ($result) {
return 1;
} else {
return - 1;
}
}

View File

@ -1,9 +1,9 @@
#!/usr/bin/env php
<?php
/*
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
*
* 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
@ -12,7 +12,7 @@
*
* 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
* 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
@ -20,263 +20,241 @@
*/
/**
* \file scripts/contracts/email_expire_services_to_representatives.php
* \ingroup contracts
* \brief Script to send a mail to dolibarr users linked to companies with services to expire
* \file scripts/contracts/email_expire_services_to_representatives.php
* \ingroup contracts
* \brief Script to send a mail to dolibarr users linked to companies with services to expire
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test si mode batch
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
if (! isset($argv[1]) || ! $argv[1] || ! in_array($argv[1], array('test','confirm')))
{
if (! isset($argv[1]) || ! $argv[1] || ! in_array($argv[1], array('test','confirm'))) {
print "Usage: $script_file (test|confirm) [delay]\n";
print "\n";
print "Send an email to remind all contracts services to expire, to users that are sale representative for.\n";
print "If you choose 'test' mode, no emails are sent.\n";
print "If you add a delay (nb of days), only services with expired date < today + delay are included.\n";
exit(-1);
exit(- 1);
}
$mode=$argv[1];
$mode = $argv[1];
require $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/CMailFile.class.php";
require $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/core/class/CMailFile.class.php";
$langs->loadLangs(array('main', 'contracts'));
$langs->loadLangs(array('main','contracts'));
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
$now=dol_now('tzserver');
$duration_value=isset($argv[2])?$argv[2]:'none';
$now = dol_now('tzserver');
$duration_value = isset($argv[2]) ? $argv[2] : 'none';
print $script_file." launched with mode ".$mode." default lang=".$langs->defaultlang.(is_numeric($duration_value)?" delay=".$duration_value:"")."\n";
print $script_file . " launched with mode " . $mode . " default lang=" . $langs->defaultlang . (is_numeric($duration_value) ? " delay=" . $duration_value : "") . "\n";
if ($mode != 'confirm') $conf->global->MAIN_DISABLE_ALL_MAILS=1;
if ($mode != 'confirm')
$conf->global->MAIN_DISABLE_ALL_MAILS = 1;
$sql = "SELECT DISTINCT c.ref, c.fk_soc, cd.date_fin_validite, cd.total_ttc, cd.description as description, p.label as plabel, s.rowid, s.nom as name, s.email, s.default_lang,";
$sql.= " u.rowid as uid, u.lastname, u.firstname, u.email, u.lang";
$sql.= " FROM ".MAIN_DB_PREFIX."societe AS s, ".MAIN_DB_PREFIX."contrat AS c, ".MAIN_DB_PREFIX."contratdet AS cd";
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product AS p ON p.rowid = cd.fk_product, ".MAIN_DB_PREFIX."societe_commerciaux AS sc, ".MAIN_DB_PREFIX."user AS u";
$sql.= " WHERE s.rowid = c.fk_soc AND c.rowid = cd.fk_contrat AND c.statut > 0 AND cd.statut<5";
if (is_numeric($duration_value)) $sql .= " AND cd.date_fin_validite < '".$db->idate(dol_time_plus_duree($now, $duration_value, "d"))."'";
$sql.= " AND sc.fk_soc = s.rowid AND sc.fk_user = u.rowid";
$sql .= " ORDER BY u.email ASC, s.rowid ASC, c.ref ASC"; // Order by email to allow one message per email
$sql = "SELECT DISTINCT c.ref, c.fk_soc, cd.date_fin_validite, cd.total_ttc, cd.description as description, p.label as plabel, s.rowid, s.nom as name, s.email, s.default_lang,";
$sql .= " u.rowid as uid, u.lastname, u.firstname, u.email, u.lang";
$sql .= " FROM " . MAIN_DB_PREFIX . "societe AS s, " . MAIN_DB_PREFIX . "contrat AS c, " . MAIN_DB_PREFIX . "contratdet AS cd";
$sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product AS p ON p.rowid = cd.fk_product, " . MAIN_DB_PREFIX . "societe_commerciaux AS sc, " . MAIN_DB_PREFIX . "user AS u";
$sql .= " WHERE s.rowid = c.fk_soc AND c.rowid = cd.fk_contrat AND c.statut > 0 AND cd.statut<5";
if (is_numeric($duration_value))
$sql .= " AND cd.date_fin_validite < '" . $db->idate(dol_time_plus_duree($now, $duration_value, "d")) . "'";
$sql .= " AND sc.fk_soc = s.rowid AND sc.fk_user = u.rowid";
$sql .= " ORDER BY u.email ASC, s.rowid ASC, c.ref ASC"; // Order by email to allow one message per email
//print $sql;
$resql=$db->query($sql);
if ($resql)
{
$num = $db->num_rows($resql);
$i = 0;
$oldemail = 'none'; $olduid = 0; $oldlang='';
$total = 0; $foundtoprocess = 0;
print "We found ".$num." couples (services to expire - sale representative) qualified\n";
dol_syslog("We found ".$num." couples (services to expire - sale representative) qualified");
$message='';
// print $sql;
$resql = $db->query($sql);
if ($resql) {
$num = $db->num_rows($resql);
$i = 0;
$oldemail = 'none';
$olduid = 0;
$oldlang = '';
$total = 0;
$foundtoprocess = 0;
print "We found " . $num . " couples (services to expire - sale representative) qualified\n";
dol_syslog("We found " . $num . " couples (services to expire - sale representative) qualified");
$message = '';
if ($num)
{
while ($i < $num)
{
$obj = $db->fetch_object($resql);
if ($num) {
while ($i < $num) {
$obj = $db->fetch_object($resql);
if (($obj->email <> $oldemail || $obj->uid <> $olduid) || $oldemail == 'none')
{
// Break onto sales representative (new email or uid)
if (dol_strlen($oldemail) && $oldemail != 'none')
{
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative, $duration_value);
}
else
{
if ($oldemail != 'none') print "- No email sent for ".$oldsalerepresentative.", total: ".$total."\n";
}
$oldemail = $obj->email;
$olduid = $obj->uid;
$oldlang = $obj->lang;
$oldsalerepresentative=dolGetFirstLastname($obj->firstname, $obj->lastname);
$message = '';
$total = 0;
$foundtoprocess = 0;
$salerepresentative=dolGetFirstLastname($obj->firstname, $obj->lastname);
if (empty($obj->email)) print "Warning: Sale representative ".$salerepresentative." has no email. Notice disabled.\n";
}
if (($obj->email != $oldemail || $obj->uid != $olduid) || $oldemail == 'none') {
// Break onto sales representative (new email or uid)
if (dol_strlen($oldemail) && $oldemail != 'none') {
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative, $duration_value);
} else {
if ($oldemail != 'none')
print "- No email sent for " . $oldsalerepresentative . ", total: " . $total . "\n";
}
$oldemail = $obj->email;
$olduid = $obj->uid;
$oldlang = $obj->lang;
$oldsalerepresentative = dolGetFirstLastname($obj->firstname, $obj->lastname);
$message = '';
$total = 0;
$foundtoprocess = 0;
$salerepresentative = dolGetFirstLastname($obj->firstname, $obj->lastname);
if (empty($obj->email))
print "Warning: Sale representative " . $salerepresentative . " has no email. Notice disabled.\n";
}
// Define line content
$outputlangs=new Translate('', $conf);
$outputlangs->setDefaultLang(empty($obj->lang)?$langs->defaultlang:$obj->lang); // By default language of sale representative
// Define line content
$outputlangs = new Translate('', $conf);
$outputlangs->setDefaultLang(empty($obj->lang) ? $langs->defaultlang : $obj->lang); // By default language of sale representative
// Load translation files required by the page
$outputlangs->loadLangs(array("main", "contracts", "bills", "products"));
// Load translation files required by the page
$outputlangs->loadLangs(array("main","contracts","bills","products"));
if (dol_strlen($obj->email))
{
$message .= $outputlangs->trans("Contract")." ".$obj->ref.": ".$langs->trans("Service")." ".dol_concatdesc($obj->plabel, $obj->description)." (".price($obj->total_ttc, 0, $outputlangs, 0, 0, -1, $conf->currency).") ".$obj->name.", ".$outputlangs->trans("DateEndPlannedShort")." ".dol_print_date($db->jdate($obj->date_fin_validite), 'day')."\n\n";
dol_syslog("email_expire_services_to_representatives.php: ".$obj->email);
$foundtoprocess++;
}
print "Service to expire ".$obj->ref.", label ".dol_concatdesc($obj->plabel, $obj->description).", due date ".dol_print_date($db->jdate($obj->date_fin_validite), 'day')." (linked to company ".$obj->name.", sale representative ".dolGetFirstLastname($obj->firstname, $obj->lastname).", email ".$obj->email."): ";
if (dol_strlen($obj->email)) print "qualified.";
else print "disqualified (no email).";
if (dol_strlen($obj->email)) {
$message .= $outputlangs->trans("Contract") . " " . $obj->ref . ": " . $langs->trans("Service") . " " . dol_concatdesc($obj->plabel, $obj->description) . " (" . price($obj->total_ttc, 0, $outputlangs, 0, 0, - 1, $conf->currency) . ") " . $obj->name . ", " . $outputlangs->trans("DateEndPlannedShort") . " " . dol_print_date($db->jdate($obj->date_fin_validite), 'day') . "\n\n";
dol_syslog("email_expire_services_to_representatives.php: " . $obj->email);
$foundtoprocess ++;
}
print "Service to expire " . $obj->ref . ", label " . dol_concatdesc($obj->plabel, $obj->description) . ", due date " . dol_print_date($db->jdate($obj->date_fin_validite), 'day') . " (linked to company " . $obj->name . ", sale representative " . dolGetFirstLastname($obj->firstname, $obj->lastname) . ", email " . $obj->email . "): ";
if (dol_strlen($obj->email))
print "qualified.";
else
print "disqualified (no email).";
print "\n";
unset($outputlangs);
$total += $obj->total_ttc;
$i++;
}
$i ++;
}
// Si il reste des envois en buffer
if ($foundtoprocess)
{
if (dol_strlen($oldemail) && $oldemail != 'none') // Break onto email (new email)
{
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative, $duration_value);
}
else
// Si il reste des envois en buffer
if ($foundtoprocess) {
if (dol_strlen($oldemail) && $oldemail != 'none') // Break onto email (new email)
{
if ($oldemail != 'none') print "- No email sent for ".$oldsalerepresentative.", total: ".$total."\n";
}
}
}
else
{
print "No services to expire (for companies linked to a particular commercial dolibarr user) found\n";
}
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative, $duration_value);
} else {
if ($oldemail != 'none')
print "- No email sent for " . $oldsalerepresentative . ", total: " . $total . "\n";
}
}
} else {
print "No services to expire (for companies linked to a particular commercial dolibarr user) found\n";
}
exit(0);
exit(0);
} else {
dol_print_error($db);
dol_syslog("email_expire_services_to_representatives.php: Error");
exit(- 1);
}
else
{
dol_print_error($db);
dol_syslog("email_expire_services_to_representatives.php: Error");
exit(-1);
}
/**
* Send email
* Send email
*
* @param string $mode Mode (test | confirm)
* @param string $oldemail Old email
* @param string $message Message to send
* @param string $total Total amount of unpayed invoices
* @param string $userlang Code lang to use for email output.
* @param string $oldsalerepresentative Old sale representative
* @param int $duration_value duration value
* @return int <0 if KO, >0 if OK
* @param string $mode
* Mode (test | confirm)
* @param string $oldemail
* Old email
* @param string $message
* Message to send
* @param string $total
* Total amount of unpayed invoices
* @param string $userlang
* Code lang to use for email output.
* @param string $oldsalerepresentative
* Old sale representative
* @param int $duration_value
* duration value
* @return int <0 if KO, >0 if OK
*/
function envoi_mail($mode, $oldemail, $message, $total, $userlang, $oldsalerepresentative, $duration_value)
{
global $conf,$langs;
global $conf, $langs;
if (getenv('DOL_FORCE_EMAIL_TO')) $oldemail=getenv('DOL_FORCE_EMAIL_TO');
if (getenv('DOL_FORCE_EMAIL_TO'))
$oldemail = getenv('DOL_FORCE_EMAIL_TO');
$newlangs=new Translate('', $conf);
$newlangs->setDefaultLang(empty($userlang)?(empty($conf->global->MAIN_LANG_DEFAULT)?'auto':$conf->global->MAIN_LANG_DEFAULT):$userlang);
$newlangs->load("main");
$newlangs->load("contracts");
$newlangs = new Translate('', $conf);
$newlangs->setDefaultLang(empty($userlang) ? (empty($conf->global->MAIN_LANG_DEFAULT) ? 'auto' : $conf->global->MAIN_LANG_DEFAULT) : $userlang);
$newlangs->load("main");
$newlangs->load("contracts");
if ($duration_value)
{
if ($duration_value > 0) $title=$newlangs->transnoentities("ListOfServicesToExpireWithDuration", $duration_value);
else $title=$newlangs->transnoentities("ListOfServicesToExpireWithDurationNeg", $duration_value);
}
else
$title= $newlangs->transnoentities("ListOfServicesToExpire");
if ($duration_value) {
if ($duration_value > 0)
$title = $newlangs->transnoentities("ListOfServicesToExpireWithDuration", $duration_value);
else
$title = $newlangs->transnoentities("ListOfServicesToExpireWithDurationNeg", $duration_value);
} else
$title = $newlangs->transnoentities("ListOfServicesToExpire");
$subject = (empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_SUBJECT)?$title:$conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_SUBJECT);
$sendto = $oldemail;
$from = $conf->global->MAIN_MAIL_EMAIL_FROM;
$errorsto = $conf->global->MAIN_MAIL_ERRORS_TO;
$msgishtml = -1;
$subject = (empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_SUBJECT) ? $title : $conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_SUBJECT);
$sendto = $oldemail;
$from = $conf->global->MAIN_MAIL_EMAIL_FROM;
$errorsto = $conf->global->MAIN_MAIL_ERRORS_TO;
$msgishtml = - 1;
print "- Send email for ".$oldsalerepresentative." (".$oldemail."), total: ".$total."\n";
dol_syslog("email_expire_services_to_representatives.php: send mail to ".$oldemail);
print "- Send email for " . $oldsalerepresentative . " (" . $oldemail . "), total: " . $total . "\n";
dol_syslog("email_expire_services_to_representatives.php: send mail to " . $oldemail);
$usehtml=0;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER)) $usehtml+=1;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_HEADER)) $usehtml+=1;
$usehtml = 0;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER))
$usehtml += 1;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_HEADER))
$usehtml += 1;
$allmessage='';
if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_HEADER))
{
$allmessage.=$conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_HEADER;
}
else
{
$allmessage.= $title.($usehtml?"<br>\n":"\n").($usehtml?"<br>\n":"\n");
$allmessage.= $newlangs->transnoentities("NoteListOfYourExpiredServices").($usehtml?"<br>\n":"\n").($usehtml?"<br>\n":"\n");
}
$allmessage.= $message.($usehtml?"<br>\n":"\n");
$allmessage.= $langs->trans("Total")." = ".price($total, 0, $userlang, 0, 0, -1, $conf->currency).($usehtml?"<br>\n":"\n");
if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER))
{
$allmessage.=$conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER)) $usehtml+=1;
}
$allmessage = '';
if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_HEADER)) {
$allmessage .= $conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_HEADER;
} else {
$allmessage .= $title . ($usehtml ? "<br>\n" : "\n") . ($usehtml ? "<br>\n" : "\n");
$allmessage .= $newlangs->transnoentities("NoteListOfYourExpiredServices") . ($usehtml ? "<br>\n" : "\n") . ($usehtml ? "<br>\n" : "\n");
}
$allmessage .= $message . ($usehtml ? "<br>\n" : "\n");
$allmessage .= $langs->trans("Total") . " = " . price($total, 0, $userlang, 0, 0, - 1, $conf->currency) . ($usehtml ? "<br>\n" : "\n");
if (! empty($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER)) {
$allmessage .= $conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_EXPIRE_SERVICES_SALESREPRESENTATIVES_FOOTER))
$usehtml += 1;
}
$mail = new CMailFile(
$subject,
$sendto,
$from,
$allmessage,
array(),
array(),
array(),
'',
'',
0,
$msgishtml
);
$mail = new CMailFile($subject, $sendto, $from, $allmessage, array(), array(), array(), '', '', 0, $msgishtml);
$mail->errors_to = $errorsto;
$mail->errors_to = $errorsto;
// Send or not email
if ($mode == 'confirm')
{
$result=$mail->sendfile();
if (! $result)
{
print "Error sending email ".$mail->error."\n";
dol_syslog("Error sending email ".$mail->error."\n");
}
}
else
{
print "No email sent (test mode)\n";
dol_syslog("No email sent (test mode)");
$mail->dump_mail();
$result=1;
}
// Send or not email
if ($mode == 'confirm') {
$result = $mail->sendfile();
if (! $result) {
print "Error sending email " . $mail->error . "\n";
dol_syslog("Error sending email " . $mail->error . "\n");
}
} else {
print "No email sent (test mode)\n";
dol_syslog("No email sent (test mode)");
$mail->dump_mail();
$result = 1;
}
if ($result)
{
return 1;
}
else
{
return -1;
}
if ($result) {
return 1;
} else {
return - 1;
}
}

View File

@ -1,7 +1,8 @@
#!/usr/bin/env php
<?php
/* Copyright (C) 2012 Nicolas Villa aka Boyquotes http://informetic.fr
* Copyright (C) 2013 Florian Henry <forian.henry@open-concept.pro
/*
* Copyright (C) 2012 Nicolas Villa aka Boyquotes http://informetic.fr
* Copyright (C) 2013 Florian Henry <forian.henry@open-concept.pro
* Copyright (C) 2013-2015 Laurent Destailleur <eldy@users.sourceforge.net>
*
* This program is free software; you can redistribute it and/or modify
@ -11,7 +12,7 @@
*
* 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
* 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
@ -19,255 +20,231 @@
*/
/**
* \file scripts/cron/cron_run_jobs.php
* \ingroup cron
* \brief Execute pendings jobs
* \file scripts/cron/cron_run_jobs.php
* \ingroup cron
* \brief Execute pendings jobs
*/
if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL', '1'); // Disables token renewal
if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU', '1');
if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML', '1');
if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX', '1');
if (! defined('NOLOGIN')) define('NOLOGIN', '1');
//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1');
if (! defined('NOTOKENRENEWAL'))
define('NOTOKENRENEWAL', '1'); // Disables token renewal
if (! defined('NOREQUIREMENU'))
define('NOREQUIREMENU', '1');
if (! defined('NOREQUIREHTML'))
define('NOREQUIREHTML', '1');
if (! defined('NOREQUIREAJAX'))
define('NOREQUIREAJAX', '1');
if (! defined('NOLOGIN'))
define('NOLOGIN', '1');
// if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1');
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Error if Web mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/cron/class/cronjob.class.php";
require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/cron/class/cronjob.class.php";
require_once DOL_DOCUMENT_ROOT . '/user/class/user.class.php';
// Check parameters
if (! isset($argv[1]) || ! $argv[1]) {
usage($path, $script_file);
exit(-1);
exit(- 1);
}
$key=$argv[1];
$key = $argv[1];
if (! isset($argv[2]) || ! $argv[2]) {
usage($path, $script_file);
exit(-1);
exit(- 1);
}
$userlogin=$argv[2];
$userlogin = $argv[2];
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
/*
* Main
*/
$langs->loadLangs(array('main', 'dict'));
$langs->loadLangs(array('main','dict'));
// current date
$now=dol_now();
$now = dol_now();
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." ***** userlogin=" . $userlogin . " ***** " . dol_print_date($now, 'dayhourrfc') . " *****\n";
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " ***** userlogin=" . $userlogin . " ***** " . dol_print_date($now, 'dayhourrfc') . " *****\n";
// Check module cron is activated
if (empty($conf->cron->enabled))
{
if (empty($conf->cron->enabled)) {
print "Error: module Scheduled jobs (cron) not activated\n";
exit(-1);
exit(- 1);
}
// Check module cron is activated
if (empty($conf->cron->enabled))
{
if (empty($conf->cron->enabled)) {
print "Error: module Scheduled jobs (cron) not activated\n";
exit(-1);
exit(- 1);
}
// Check security key
if ($key != $conf->global->CRON_KEY)
{
if ($key != $conf->global->CRON_KEY) {
print "Error: securitykey is wrong\n";
exit(-1);
exit(- 1);
}
// If param userlogin is reserved word 'firstadmin'
if ($userlogin == 'firstadmin')
{
$sql='SELECT login, entity from '.MAIN_DB_PREFIX.'user WHERE admin = 1 and statut = 1 ORDER BY entity LIMIT 1';
$resql=$db->query($sql);
if ($resql)
{
$obj=$db->fetch_object($resql);
if ($obj)
{
$userlogin = $obj->login;
echo "First admin user found is login '".$userlogin."', entity ".$obj->entity."\n";
}
}
else dol_print_error($db);
if ($userlogin == 'firstadmin') {
$sql = 'SELECT login, entity from ' . MAIN_DB_PREFIX . 'user WHERE admin = 1 and statut = 1 ORDER BY entity LIMIT 1';
$resql = $db->query($sql);
if ($resql) {
$obj = $db->fetch_object($resql);
if ($obj) {
$userlogin = $obj->login;
echo "First admin user found is login '" . $userlogin . "', entity " . $obj->entity . "\n";
}
} else
dol_print_error($db);
}
// Check user login
$user=new User($db);
$result=$user->fetch('', $userlogin);
if ($result < 0)
{
echo "User Error: ".$user->error;
dol_syslog("cron_run_jobs.php:: User Error:".$user->error, LOG_ERR);
exit(-1);
}
else
{
if (empty($user->id))
{
echo "User login: ".$userlogin." does not exists";
dol_syslog("User login:".$userlogin." does not exists", LOG_ERR);
exit(-1);
$user = new User($db);
$result = $user->fetch('', $userlogin);
if ($result < 0) {
echo "User Error: " . $user->error;
dol_syslog("cron_run_jobs.php:: User Error:" . $user->error, LOG_ERR);
exit(- 1);
} else {
if (empty($user->id)) {
echo "User login: " . $userlogin . " does not exists";
dol_syslog("User login:" . $userlogin . " does not exists", LOG_ERR);
exit(- 1);
}
}
$user->getrights();
if (isset($argv[3]) || $argv[3])
{
if (isset($argv[3]) || $argv[3]) {
$id = $argv[3];
}
// create a jobs object
$object = new Cronjob($db);
$filter=array();
$filter = array();
if (! empty($id)) {
if (! is_numeric($id))
{
if (! is_numeric($id)) {
echo "Error: Bad value for parameter job id";
dol_syslog("cron_run_jobs.php Bad value for parameter job id", LOG_WARNING);
exit;
exit();
}
$filter['t.rowid']=$id;
$filter['t.rowid'] = $id;
}
$result = $object->fetch_all('ASC,ASC,ASC', 't.priority,t.entity,t.rowid', 0, 0, 1, $filter, 0);
if ($result<0)
{
echo "Error: ".$object->error;
dol_syslog("cron_run_jobs.php:: fetch Error ".$object->error, LOG_ERR);
exit(-1);
if ($result < 0) {
echo "Error: " . $object->error;
dol_syslog("cron_run_jobs.php:: fetch Error " . $object->error, LOG_ERR);
exit(- 1);
}
$qualifiedjobs = array();
foreach($object->lines as $val)
{
if (! verifCond($val->test)) continue;
foreach ($object->lines as $val) {
if (! verifCond($val->test))
continue;
$qualifiedjobs[] = $val;
}
// TODO Duplicate. This sequence of code must be shared with code into public/cron/cron_run_jobs.php php page.
$nbofjobs=count($qualifiedjobs);
$nbofjobslaunchedok=0;
$nbofjobslaunchedko=0;
$nbofjobs = count($qualifiedjobs);
$nbofjobslaunchedok = 0;
$nbofjobslaunchedko = 0;
if (is_array($qualifiedjobs) && (count($qualifiedjobs)>0))
{
if (is_array($qualifiedjobs) && (count($qualifiedjobs) > 0)) {
// Loop over job
foreach($qualifiedjobs as $line)
{
dol_syslog("cron_run_jobs.php cronjobid: ".$line->id." priority=".$line->priority." entity=".$line->entity." label=".$line->label, LOG_DEBUG);
foreach ($qualifiedjobs as $line) {
dol_syslog("cron_run_jobs.php cronjobid: " . $line->id . " priority=" . $line->priority . " entity=" . $line->entity . " label=" . $line->label, LOG_DEBUG);
echo "cron_run_jobs.php cronjobid: ".$line->id." priority=".$line->priority." entity=".$line->entity." label=".$line->label;
echo "cron_run_jobs.php cronjobid: " . $line->id . " priority=" . $line->priority . " entity=" . $line->entity . " label=" . $line->label;
//If date_next_jobs is less of current date, execute the program, and store the execution time of the next execution in database
if (($line->datenextrun < $now) && (empty($line->datestart) || $line->datestart <= $now) && (empty($line->dateend) || $line->dateend >= $now))
{
// If date_next_jobs is less of current date, execute the program, and store the execution time of the next execution in database
if (($line->datenextrun < $now) && (empty($line->datestart) || $line->datestart <= $now) && (empty($line->dateend) || $line->dateend >= $now)) {
echo " - qualified";
dol_syslog("cron_run_jobs.php line->datenextrun:".dol_print_date($line->datenextrun, 'dayhourrfc')." line->datestart:".dol_print_date($line->datestart, 'dayhourrfc')." line->dateend:".dol_print_date($line->dateend, 'dayhourrfc')." now:".dol_print_date($now, 'dayhourrfc'));
dol_syslog("cron_run_jobs.php line->datenextrun:" . dol_print_date($line->datenextrun, 'dayhourrfc') . " line->datestart:" . dol_print_date($line->datestart, 'dayhourrfc') . " line->dateend:" . dol_print_date($line->dateend, 'dayhourrfc') . " now:" . dol_print_date($now, 'dayhourrfc'));
$cronjob=new Cronjob($db);
$result=$cronjob->fetch($line->id);
if ($result < 0)
{
echo "Error cronjobid: ".$line->id." cronjob->fetch: ".$cronjob->error."\n";
echo "Failed to fetch job ".$line->id."\n";
dol_syslog("cron_run_jobs.php::fetch Error ".$cronjob->error, LOG_ERR);
exit(-1);
$cronjob = new Cronjob($db);
$result = $cronjob->fetch($line->id);
if ($result < 0) {
echo "Error cronjobid: " . $line->id . " cronjob->fetch: " . $cronjob->error . "\n";
echo "Failed to fetch job " . $line->id . "\n";
dol_syslog("cron_run_jobs.php::fetch Error " . $cronjob->error, LOG_ERR);
exit(- 1);
}
// Execute job
$result=$cronjob->run_jobs($userlogin);
if ($result < 0)
{
echo "Error cronjobid: ".$line->id." cronjob->run_job: ".$cronjob->error."\n";
$result = $cronjob->run_jobs($userlogin);
if ($result < 0) {
echo "Error cronjobid: " . $line->id . " cronjob->run_job: " . $cronjob->error . "\n";
echo "At least one job failed. Go on menu Home-Setup-Admin tools to see result for each job.\n";
echo "You can also enable module Log if not yet enabled, run again and take a look into dolibarr.log file\n";
dol_syslog("cron_run_jobs.php::run_jobs Error ".$cronjob->error, LOG_ERR);
$nbofjobslaunchedko++;
}
else
{
$nbofjobslaunchedok++;
dol_syslog("cron_run_jobs.php::run_jobs Error " . $cronjob->error, LOG_ERR);
$nbofjobslaunchedko ++;
} else {
$nbofjobslaunchedok ++;
}
echo " - result of run_jobs = ".$result;
echo " - result of run_jobs = " . $result;
// we re-program the next execution and stores the last execution time for this job
$result=$cronjob->reprogram_jobs($userlogin, $now);
if ($result<0)
{
echo "Error cronjobid: ".$line->id." cronjob->reprogram_job: ".$cronjob->error."\n";
$result = $cronjob->reprogram_jobs($userlogin, $now);
if ($result < 0) {
echo "Error cronjobid: " . $line->id . " cronjob->reprogram_job: " . $cronjob->error . "\n";
echo "Enable module Log if not yet enabled, run again and take a look into dolibarr.log file\n";
dol_syslog("cron_run_jobs.php::reprogram_jobs Error ".$cronjob->error, LOG_ERR);
exit(-1);
dol_syslog("cron_run_jobs.php::reprogram_jobs Error " . $cronjob->error, LOG_ERR);
exit(- 1);
}
echo " - reprogrammed\n";
}
else
{
} else {
echo " - not qualified\n";
dol_syslog("cron_run_jobs.php job not qualified line->datenextrun:".dol_print_date($line->datenextrun, 'dayhourrfc')." line->datestart:".dol_print_date($line->datestart, 'dayhourrfc')." line->dateend:".dol_print_date($line->dateend, 'dayhourrfc')." now:".dol_print_date($now, 'dayhourrfc'));
dol_syslog("cron_run_jobs.php job not qualified line->datenextrun:" . dol_print_date($line->datenextrun, 'dayhourrfc') . " line->datestart:" . dol_print_date($line->datestart, 'dayhourrfc') . " line->dateend:" . dol_print_date($line->dateend, 'dayhourrfc') . " now:" . dol_print_date($now, 'dayhourrfc'));
}
}
}
else
{
} else {
echo "cron_run_jobs.php no qualified job found\n";
}
$db->close();
if ($nbofjobslaunchedko) exit(1);
if ($nbofjobslaunchedko)
exit(1);
exit(0);
/**
* script cron usage
*
* @param string $path path
* @param string $script_file filename
* @param string $path
* path
* @param string $script_file
* filename
* @return void
*/
function usage($path, $script_file)
{
global $conf;
print "Usage: ".$script_file." securitykey userlogin|'firstadmin' [cronjobid]\n";
print "Usage: " . $script_file . " securitykey userlogin|'firstadmin' [cronjobid]\n";
print "The script return 0 when everything worked successfully.\n";
print "\n";
print "On Linux system, you can have cron jobs ran automatically by adding an entry into cron.\n";
print "For example, to run pending tasks each day at 3:30, you can add this line:\n";
print "30 3 * * * ".$path.$script_file." securitykey userlogin > ".DOL_DATA_ROOT."/".$script_file.".log\n";
print "30 3 * * * " . $path . $script_file . " securitykey userlogin > " . DOL_DATA_ROOT . "/" . $script_file . ".log\n";
print "For example, to run pending tasks every 5mn, you can add this line:\n";
print "*/5 * * * * ".$path.$script_file." securitykey userlogin > ".DOL_DATA_ROOT."/".$script_file.".log\n";
print "*/5 * * * * " . $path . $script_file . " securitykey userlogin > " . DOL_DATA_ROOT . "/" . $script_file . ".log\n";
}

View File

@ -1,9 +1,9 @@
#!/usr/bin/env php
<?php
/*
* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2016 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2016 Regis Houssin <regis.houssin@inodbox.com>
*
* 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
@ -12,386 +12,347 @@
*
* 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
* 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, see <http://www.gnu.org/licenses/>.
*/
/**
* \file scripts/emailings/mailing-send.php
* \ingroup mailing
* \brief Script d'envoi d'un mailing prepare et valide
* \file scripts/emailings/mailing-send.php
* \ingroup mailing
* \brief Script d'envoi d'un mailing prepare et valide
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
if (! isset($argv[1]) || ! $argv[1]) {
print "Usage: ".$script_file." (ID_MAILING|all)\n";
exit(-1);
print "Usage: " . $script_file . " (ID_MAILING|all)\n";
exit(- 1);
}
$id=$argv[1];
if (isset($argv[2]) || !empty($argv[2])) $login = $argv[2];
else $login = '';
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/core/class/CMailFile.class.php";
require_once DOL_DOCUMENT_ROOT."/comm/mailing/class/mailing.class.php";
$id = $argv[1];
if (isset($argv[2]) || ! empty($argv[2]))
$login = $argv[2];
else
$login = '';
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/CMailFile.class.php";
require_once DOL_DOCUMENT_ROOT . "/comm/mailing/class/mailing.class.php";
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
if ($conf->global->MAILING_LIMIT_SENDBYCLI == '-1')
{
}
if ($conf->global->MAILING_LIMIT_SENDBYCLI == '-1') {}
$user = new User($db);
// for signature, we use user send as parameter
if (! empty($login)) $user->fetch('', $login);
if (! empty($login))
$user->fetch('', $login);
// We get list of emailing id to process
$sql = "SELECT m.rowid";
$sql.= " FROM ".MAIN_DB_PREFIX."mailing as m";
$sql.= " WHERE m.statut IN (1,2)";
if ($id != 'all')
{
$sql.= " AND m.rowid= ".$id;
$sql.= " LIMIT 1";
$sql .= " FROM " . MAIN_DB_PREFIX . "mailing as m";
$sql .= " WHERE m.statut IN (1,2)";
if ($id != 'all') {
$sql .= " AND m.rowid= " . $id;
$sql .= " LIMIT 1";
}
$resql=$db->query($sql);
if ($resql)
{
$resql = $db->query($sql);
if ($resql) {
$num = $db->num_rows($resql);
$j = 0;
if ($num)
{
for ($j=0; $j<$num; $j++)
{
if ($num) {
for ($j = 0; $j < $num; $j ++) {
$obj = $db->fetch_object($resql);
dol_syslog("Process mailing with id ".$obj->rowid);
print "Process mailing with id ".$obj->rowid."\n";
dol_syslog("Process mailing with id " . $obj->rowid);
print "Process mailing with id " . $obj->rowid . "\n";
$emailing = new Mailing($db);
$emailing->fetch($obj->rowid);
$id = $emailing->id;
$subject = $emailing->sujet;
$message = $emailing->body;
$from = $emailing->email_from;
$replyto = $emailing->email_replyto;
$id = $emailing->id;
$subject = $emailing->sujet;
$message = $emailing->body;
$from = $emailing->email_from;
$replyto = $emailing->email_replyto;
$errorsto = $emailing->email_errorsto;
// Le message est-il en html
$msgishtml=-1; // Unknown by default
if (preg_match('/[\s\t]*<html>/i', $message)) $msgishtml=1;
$msgishtml = - 1; // Unknown by default
if (preg_match('/[\s\t]*<html>/i', $message))
$msgishtml = 1;
$nbok=0; $nbko=0;
$nbok = 0;
$nbko = 0;
// On choisit les mails non deja envoyes pour ce mailing (statut=0)
// ou envoyes en erreur (statut=-1)
$sql2 = "SELECT mc.rowid, mc.fk_mailing, mc.lastname, mc.firstname, mc.email, mc.other, mc.source_url, mc.source_id, mc.source_type, mc.tag";
$sql2.= " FROM ".MAIN_DB_PREFIX."mailing_cibles as mc";
$sql2.= " WHERE mc.statut < 1 AND mc.fk_mailing = ".$id;
if ($conf->global->MAILING_LIMIT_SENDBYCLI > 0)
{
$sql2.= " LIMIT ".$conf->global->MAILING_LIMIT_SENDBYCLI;
$sql2 .= " FROM " . MAIN_DB_PREFIX . "mailing_cibles as mc";
$sql2 .= " WHERE mc.statut < 1 AND mc.fk_mailing = " . $id;
if ($conf->global->MAILING_LIMIT_SENDBYCLI > 0) {
$sql2 .= " LIMIT " . $conf->global->MAILING_LIMIT_SENDBYCLI;
}
$resql2=$db->query($sql2);
if ($resql2)
{
$resql2 = $db->query($sql2);
if ($resql2) {
$num2 = $db->num_rows($resql2);
dol_syslog("Nb of targets = ".$num2, LOG_DEBUG);
print "Nb of targets = ".$num2."\n";
dol_syslog("Nb of targets = " . $num2, LOG_DEBUG);
print "Nb of targets = " . $num2 . "\n";
if ($num2)
{
$now=dol_now();
if ($num2) {
$now = dol_now();
// Positionne date debut envoi
$sqlstartdate="UPDATE ".MAIN_DB_PREFIX."mailing SET date_envoi='".$db->idate($now)."' WHERE rowid=".$id;
$resqlstartdate=$db->query($sqlstartdate);
if (! $resqlstartdate)
{
$sqlstartdate = "UPDATE " . MAIN_DB_PREFIX . "mailing SET date_envoi='" . $db->idate($now) . "' WHERE rowid=" . $id;
$resqlstartdate = $db->query($sqlstartdate);
if (! $resqlstartdate) {
dol_print_error($db);
$error++;
$error ++;
}
// Look on each email and sent message
$i = 0;
while ($i < $num2)
{
while ($i < $num2) {
// Here code is common with same loop ino card.php
$res=1;
$now=dol_now();
$res = 1;
$now = dol_now();
$obj = $db->fetch_object($resql2);
// sendto en RFC2822
$sendto = str_replace(',', ' ', dolGetFirstLastname($obj->firstname, $obj->lastname) ." <".$obj->email.">");
$sendto = str_replace(',', ' ', dolGetFirstLastname($obj->firstname, $obj->lastname) . " <" . $obj->email . ">");
// Make subtsitutions on topic and body
$other=explode(';', $obj->other);
$tmpfield=explode('=', $other[0], 2); $other1=(isset($tmpfield[1])?$tmpfield[1]:$tmpfield[0]);
$tmpfield=explode('=', $other[1], 2); $other2=(isset($tmpfield[1])?$tmpfield[1]:$tmpfield[0]);
$tmpfield=explode('=', $other[2], 2); $other3=(isset($tmpfield[1])?$tmpfield[1]:$tmpfield[0]);
$tmpfield=explode('=', $other[3], 2); $other4=(isset($tmpfield[1])?$tmpfield[1]:$tmpfield[0]);
$tmpfield=explode('=', $other[4], 2); $other5=(isset($tmpfield[1])?$tmpfield[1]:$tmpfield[0]);
$signature = ((!empty($user->signature) && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN))?$user->signature:'');
$other = explode(';', $obj->other);
$tmpfield = explode('=', $other[0], 2);
$other1 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
$tmpfield = explode('=', $other[1], 2);
$other2 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
$tmpfield = explode('=', $other[2], 2);
$other3 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
$tmpfield = explode('=', $other[3], 2);
$other4 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
$tmpfield = explode('=', $other[4], 2);
$other5 = (isset($tmpfield[1]) ? $tmpfield[1] : $tmpfield[0]);
$signature = ((! empty($user->signature) && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN)) ? $user->signature : '');
$object = null; // Not defined with mass emailing
$parameters=array('mode'=>'emailing');
$substitutionarray=getCommonSubstitutionArray($langs, 0, array('object','objectamount'), $object); // Note: On mass emailing, this is null because we don't know object
$object = null; // Not defined with mass emailing
$parameters = array('mode' => 'emailing');
$substitutionarray = getCommonSubstitutionArray($langs, 0, array('object','objectamount'), $object); // Note: On mass emailing, this is null because we don't know object
// Array of possible substitutions (See also file mailing-send.php that should manage same substitutions)
$substitutionarray['__ID__'] = $obj->source_id;
$substitutionarray['__EMAIL__'] = $obj->email;
$substitutionarray['__LASTNAME__'] = $obj->lastname;
$substitutionarray['__FIRSTNAME__'] = $obj->firstname;
$substitutionarray['__MAILTOEMAIL__'] = '<a href="mailto:'.$obj->email.'">'.$obj->email.'</a>';
$substitutionarray['__MAILTOEMAIL__'] = '<a href="mailto:' . $obj->email . '">' . $obj->email . '</a>';
$substitutionarray['__OTHER1__'] = $other1;
$substitutionarray['__OTHER2__'] = $other2;
$substitutionarray['__OTHER3__'] = $other3;
$substitutionarray['__OTHER4__'] = $other4;
$substitutionarray['__OTHER5__'] = $other5;
$substitutionarray['__USER_SIGNATURE__'] = $signature; // Signature is empty when ran from command line or taken from user in parameter)
$substitutionarray['__SIGNATURE__'] = $signature; // For backward compatibility
$substitutionarray['__CHECK_READ__'] = '<img src="'.DOL_MAIN_URL_ROOT.'/public/emailing/mailing-read.php?tag='.$obj->tag.'&securitykey='.urlencode($conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY).'" width="1" height="1" style="width:1px;height:1px" border="0"/>';
$substitutionarray['__UNSUBSCRIBE__'] = '<a href="'.DOL_MAIN_URL_ROOT.'/public/emailing/mailing-unsubscribe.php?tag='.$obj->tag.'&unsuscrib=1&securitykey='.urlencode($conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY).'" target="_blank">'.$langs->trans("MailUnsubcribe").'</a>';
$substitutionarray['__USER_SIGNATURE__'] = $signature; // Signature is empty when ran from command line or taken from user in parameter)
$substitutionarray['__SIGNATURE__'] = $signature; // For backward compatibility
$substitutionarray['__CHECK_READ__'] = '<img src="' . DOL_MAIN_URL_ROOT . '/public/emailing/mailing-read.php?tag=' . $obj->tag . '&securitykey=' . urlencode($conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY) . '" width="1" height="1" style="width:1px;height:1px" border="0"/>';
$substitutionarray['__UNSUBSCRIBE__'] = '<a href="' . DOL_MAIN_URL_ROOT . '/public/emailing/mailing-unsubscribe.php?tag=' . $obj->tag . '&unsuscrib=1&securitykey=' . urlencode($conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY) . '" target="_blank">' . $langs->trans("MailUnsubcribe") . '</a>';
$onlinepaymentenabled = 0;
if (! empty($conf->paypal->enabled)) $onlinepaymentenabled++;
if (! empty($conf->paybox->enabled)) $onlinepaymentenabled++;
if (! empty($conf->stripe->enabled)) $onlinepaymentenabled++;
if ($onlinepaymentenabled && ! empty($conf->global->PAYMENT_SECURITY_TOKEN))
{
$substitutionarray['__SECUREKEYPAYMENT__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
if (empty($conf->global->PAYMENT_SECURITY_TOKEN_UNIQUE))
{
$substitutionarray['__SECUREKEYPAYMENT_MEMBER__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
$substitutionarray['__SECUREKEYPAYMENT_ORDER__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
$substitutionarray['__SECUREKEYPAYMENT_INVOICE__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
$substitutionarray['__SECUREKEYPAYMENT_CONTRACTLINE__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
}
else
{
$substitutionarray['__SECUREKEYPAYMENT_MEMBER__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'membersubscription' . $obj->source_id, 2);
$substitutionarray['__SECUREKEYPAYMENT_ORDER__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'order' . $obj->source_id, 2);
$substitutionarray['__SECUREKEYPAYMENT_INVOICE__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'invoice' . $obj->source_id, 2);
$substitutionarray['__SECUREKEYPAYMENT_CONTRACTLINE__']=dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'contractline' . $obj->source_id, 2);
if (! empty($conf->paypal->enabled))
$onlinepaymentenabled ++;
if (! empty($conf->paybox->enabled))
$onlinepaymentenabled ++;
if (! empty($conf->stripe->enabled))
$onlinepaymentenabled ++;
if ($onlinepaymentenabled && ! empty($conf->global->PAYMENT_SECURITY_TOKEN)) {
$substitutionarray['__SECUREKEYPAYMENT__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
if (empty($conf->global->PAYMENT_SECURITY_TOKEN_UNIQUE)) {
$substitutionarray['__SECUREKEYPAYMENT_MEMBER__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
$substitutionarray['__SECUREKEYPAYMENT_ORDER__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
$substitutionarray['__SECUREKEYPAYMENT_INVOICE__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
$substitutionarray['__SECUREKEYPAYMENT_CONTRACTLINE__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2);
} else {
$substitutionarray['__SECUREKEYPAYMENT_MEMBER__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'membersubscription' . $obj->source_id, 2);
$substitutionarray['__SECUREKEYPAYMENT_ORDER__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'order' . $obj->source_id, 2);
$substitutionarray['__SECUREKEYPAYMENT_INVOICE__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'invoice' . $obj->source_id, 2);
$substitutionarray['__SECUREKEYPAYMENT_CONTRACTLINE__'] = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . 'contractline' . $obj->source_id, 2);
}
}
/* For backward compatibility */
if (! empty($conf->paypal->enabled) && ! empty($conf->global->PAYPAL_SECURITY_TOKEN))
{
$substitutionarray['__SECUREKEYPAYPAL__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
if (! empty($conf->paypal->enabled) && ! empty($conf->global->PAYPAL_SECURITY_TOKEN)) {
$substitutionarray['__SECUREKEYPAYPAL__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $substitutionarray['__SECUREKEYPAYPAL_MEMBER__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
else $substitutionarray['__SECUREKEYPAYPAL_MEMBER__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'membersubscription' . $obj->source_id, 2);
if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE))
$substitutionarray['__SECUREKEYPAYPAL_MEMBER__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
else
$substitutionarray['__SECUREKEYPAYPAL_MEMBER__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'membersubscription' . $obj->source_id, 2);
if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $substitutionarray['__SECUREKEYPAYPAL_ORDER__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
else $substitutionarray['__SECUREKEYPAYPAL_ORDER__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'order' . $obj->source_id, 2);
if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE))
$substitutionarray['__SECUREKEYPAYPAL_ORDER__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
else
$substitutionarray['__SECUREKEYPAYPAL_ORDER__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'order' . $obj->source_id, 2);
if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $substitutionarray['__SECUREKEYPAYPAL_INVOICE__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
else $substitutionarray['__SECUREKEYPAYPAL_INVOICE__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'invoice' . $obj->source_id, 2);
if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE))
$substitutionarray['__SECUREKEYPAYPAL_INVOICE__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
else
$substitutionarray['__SECUREKEYPAYPAL_INVOICE__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'invoice' . $obj->source_id, 2);
if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $substitutionarray['__SECUREKEYPAYPAL_CONTRACTLINE__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
else $substitutionarray['__SECUREKEYPAYPAL_CONTRACTLINE__']=dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'contractline' . $obj->source_id, 2);
if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE))
$substitutionarray['__SECUREKEYPAYPAL_CONTRACTLINE__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2);
else
$substitutionarray['__SECUREKEYPAYPAL_CONTRACTLINE__'] = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'contractline' . $obj->source_id, 2);
}
complete_substitutions_array($substitutionarray, $langs);
$newsubject=make_substitutions($subject, $substitutionarray);
$newmessage=make_substitutions($message, $substitutionarray);
$newsubject = make_substitutions($subject, $substitutionarray);
$newmessage = make_substitutions($message, $substitutionarray);
$substitutionisok=true;
$substitutionisok = true;
// Fabrication du mail
$trackid='emailing-'.$obj->fk_mailing.'-'.$obj->rowid;
$mail = new CMailFile(
$newsubject,
$sendto,
$from,
$newmessage,
array(),
array(),
array(),
'',
'',
0,
$msgishtml,
$errorsto,
'',
$trackid,
'',
'emailing'
);
$trackid = 'emailing-' . $obj->fk_mailing . '-' . $obj->rowid;
$mail = new CMailFile($newsubject, $sendto, $from, $newmessage, array(), array(), array(), '', '', 0, $msgishtml, $errorsto, '', $trackid, '', 'emailing');
if ($mail->error)
{
$res=0;
if ($mail->error) {
$res = 0;
}
if (! $substitutionisok)
{
$mail->error='Some substitution failed';
$res=0;
if (! $substitutionisok) {
$mail->error = 'Some substitution failed';
$res = 0;
}
// Send Email
if ($res)
{
$res=$mail->sendfile();
if ($res) {
$res = $mail->sendfile();
}
if ($res)
{
if ($res) {
// Mail successful
$nbok++;
$nbok ++;
dol_syslog("ok for emailing id ".$id." #".$i.($mail->error?' - '.$mail->error:''), LOG_DEBUG);
dol_syslog("ok for emailing id " . $id . " #" . $i . ($mail->error ? ' - ' . $mail->error : ''), LOG_DEBUG);
// Note: If emailing is 100 000 targets, 100 000 entries are added, so we don't enter events for each target here
// We must union table llx_mailing_taget for event tab OR enter 1 event with a special table link (id of email in event)
// Run trigger
/*
if ($obj->source_type == 'contact')
{
$emailing->sendtoid = $obj->source_id;
}
if ($obj->source_type == 'thirdparty')
{
$emailing->socid = $obj->source_id;
}
// Call trigger
$result=$emailing->call_trigger('EMAILING_SENTBYMAIL',$user);
if ($result < 0) $error++;
// End call triggers
*/
* if ($obj->source_type == 'contact')
* {
* $emailing->sendtoid = $obj->source_id;
* }
* if ($obj->source_type == 'thirdparty')
* {
* $emailing->socid = $obj->source_id;
* }
* // Call trigger
* $result=$emailing->call_trigger('EMAILING_SENTBYMAIL',$user);
* if ($result < 0) $error++;
* // End call triggers
*/
$sqlok ="UPDATE ".MAIN_DB_PREFIX."mailing_cibles";
$sqlok.=" SET statut=1, date_envoi='".$db->idate($now)."' WHERE rowid=".$obj->rowid;
$resqlok=$db->query($sqlok);
if (! $resqlok)
{
$sqlok = "UPDATE " . MAIN_DB_PREFIX . "mailing_cibles";
$sqlok .= " SET statut=1, date_envoi='" . $db->idate($now) . "' WHERE rowid=" . $obj->rowid;
$resqlok = $db->query($sqlok);
if (! $resqlok) {
dol_print_error($db);
$error++;
}
else
{
//if cheack read is use then update prospect contact status
if (strpos($message, '__CHECK_READ__') !== false)
{
//Update status communication of thirdparty prospect
$sqlx = "UPDATE ".MAIN_DB_PREFIX."societe SET fk_stcomm=2 WHERE rowid IN (SELECT source_id FROM ".MAIN_DB_PREFIX."mailing_cibles WHERE rowid=".$obj->rowid.")";
$error ++;
} else {
// if cheack read is use then update prospect contact status
if (strpos($message, '__CHECK_READ__') !== false) {
// Update status communication of thirdparty prospect
$sqlx = "UPDATE " . MAIN_DB_PREFIX . "societe SET fk_stcomm=2 WHERE rowid IN (SELECT source_id FROM " . MAIN_DB_PREFIX . "mailing_cibles WHERE rowid=" . $obj->rowid . ")";
dol_syslog("card.php: set prospect thirdparty status", LOG_DEBUG);
$resqlx=$db->query($sqlx);
if (! $resqlx)
{
$resqlx = $db->query($sqlx);
if (! $resqlx) {
dol_print_error($db);
$error++;
$error ++;
}
//Update status communication of contact prospect
$sqlx = "UPDATE ".MAIN_DB_PREFIX."societe SET fk_stcomm=2 WHERE rowid IN (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX."socpeople AS sc INNER JOIN ".MAIN_DB_PREFIX."mailing_cibles AS mc ON mc.rowid=".$obj->rowid." AND mc.source_type = 'contact' AND mc.source_id = sc.rowid)";
// Update status communication of contact prospect
$sqlx = "UPDATE " . MAIN_DB_PREFIX . "societe SET fk_stcomm=2 WHERE rowid IN (SELECT sc.fk_soc FROM " . MAIN_DB_PREFIX . "socpeople AS sc INNER JOIN " . MAIN_DB_PREFIX . "mailing_cibles AS mc ON mc.rowid=" . $obj->rowid . " AND mc.source_type = 'contact' AND mc.source_id = sc.rowid)";
dol_syslog("card.php: set prospect contact status", LOG_DEBUG);
$resqlx=$db->query($sqlx);
if (! $resqlx)
{
$resqlx = $db->query($sqlx);
if (! $resqlx) {
dol_print_error($db);
$error++;
$error ++;
}
}
if (!empty($conf->global->MAILING_DELAY)) {
if (! empty($conf->global->MAILING_DELAY)) {
sleep($conf->global->MAILING_DELAY);
}
}
}
else
{
} else {
// Mail failed
$nbko++;
$nbko ++;
dol_syslog("error for emailing id ".$id." #".$i.($mail->error?' - '.$mail->error:''), LOG_DEBUG);
dol_syslog("error for emailing id " . $id . " #" . $i . ($mail->error ? ' - ' . $mail->error : ''), LOG_DEBUG);
$sqlerror="UPDATE ".MAIN_DB_PREFIX."mailing_cibles";
$sqlerror.=" SET statut=-1, date_envoi=".$db->idate($now)." WHERE rowid=".$obj->rowid;
$resqlerror=$db->query($sqlerror);
if (! $resqlerror)
{
$sqlerror = "UPDATE " . MAIN_DB_PREFIX . "mailing_cibles";
$sqlerror .= " SET statut=-1, date_envoi=" . $db->idate($now) . " WHERE rowid=" . $obj->rowid;
$resqlerror = $db->query($sqlerror);
if (! $resqlerror) {
dol_print_error($db);
$error++;
$error ++;
}
}
$i++;
$i ++;
}
}
else
{
$mesg="Emailing id ".$id." has no recipient to target";
print $mesg."\n";
} else {
$mesg = "Emailing id " . $id . " has no recipient to target";
print $mesg . "\n";
dol_syslog($mesg, LOG_ERR);
}
// Loop finished, set global statut of mail
$statut=2;
if (! $nbko) $statut=3;
$statut = 2;
if (! $nbko)
$statut = 3;
$sqlenddate="UPDATE ".MAIN_DB_PREFIX."mailing SET statut=".$statut." WHERE rowid=".$id;
$sqlenddate = "UPDATE " . MAIN_DB_PREFIX . "mailing SET statut=" . $statut . " WHERE rowid=" . $id;
dol_syslog("update global status", LOG_DEBUG);
print "Update status of emailing id ".$id." to ".$statut."\n";
$resqlenddate=$db->query($sqlenddate);
if (! $resqlenddate)
{
print "Update status of emailing id " . $id . " to " . $statut . "\n";
$resqlenddate = $db->query($sqlenddate);
if (! $resqlenddate) {
dol_print_error($db);
$error++;
$error ++;
}
}
else
{
} else {
dol_print_error($db);
$error++;
$error ++;
}
}
}
else
{
$mesg="No validated emailing id to send found.";
print $mesg."\n";
} else {
$mesg = "No validated emailing id to send found.";
print $mesg . "\n";
dol_syslog($mesg, LOG_ERR);
$error++;
$error ++;
}
}
else
{
} else {
dol_print_error($db);
$error++;
$error ++;
}
exit($error);

View File

@ -1,9 +1,9 @@
#!/usr/bin/env php
<?php
/*
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
*
* 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
@ -12,7 +12,7 @@
*
* 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
* 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
@ -20,288 +20,272 @@
*/
/**
* \file scripts/invoices/email_unpaid_invoices_to_customers.php
* \ingroup facture
* \brief Script to send a mail to customers with unpaid invoices
* \file scripts/invoices/email_unpaid_invoices_to_customers.php
* \ingroup facture
* \brief Script to send a mail to customers with unpaid invoices
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test si mode batch
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
if (! isset($argv[2]) || ! $argv[2] || ! in_array($argv[1], array('test','confirm')) || ! in_array($argv[2], array('thirdparties','contacts')))
{
if (! isset($argv[2]) || ! $argv[2] || ! in_array($argv[1], array('test','confirm')) || ! in_array($argv[2], array('thirdparties','contacts'))) {
print "Usage: $script_file (test|confirm) (thirdparties|contacts) [delay] [after]\n";
print "\n";
print "Send an email to customers to remind all unpaid customer invoices.\n";
print "If you choose 'test' mode, no emails are sent.\n";
print "If you add param delay (nb of days), only invoice with due date < today + delay are included.\n";
print "If you add param after (nb of days), only invoice with due date >= today + delay are included.\n";
exit(-1);
exit(- 1);
}
$mode=$argv[1];
$targettype=$argv[2];
$mode = $argv[1];
$targettype = $argv[2];
require $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/core/class/CMailFile.class.php";
require $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/CMailFile.class.php";
$langs->load('main');
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
$now=dol_now('tzserver');
$duration_value=isset($argv[3])?$argv[3]:'none';
$duration_value2=isset($argv[4])?$argv[4]:'none';
$now = dol_now('tzserver');
$duration_value = isset($argv[3]) ? $argv[3] : 'none';
$duration_value2 = isset($argv[4]) ? $argv[4] : 'none';
$error = 0;
print $script_file." launched with mode ".$mode." default lang=".$langs->defaultlang.(is_numeric($duration_value)?" delay=".$duration_value:"").(is_numeric($duration_value2)?" after=".$duration_value2:"")."\n";
print $script_file . " launched with mode " . $mode . " default lang=" . $langs->defaultlang . (is_numeric($duration_value) ? " delay=" . $duration_value : "") . (is_numeric($duration_value2) ? " after=" . $duration_value2 : "") . "\n";
if ($mode != 'confirm') $conf->global->MAIN_DISABLE_ALL_MAILS=1;
if ($mode != 'confirm')
$conf->global->MAIN_DISABLE_ALL_MAILS = 1;
$sql = "SELECT f.ref, f.total_ttc, f.date_lim_reglement as due_date,";
$sql.= " s.rowid as sid, s.nom as name, s.email, s.default_lang";
if ($targettype == 'contacts') $sql.= ", sp.rowid as cid, sp.firstname as cfirstname, sp.lastname as clastname, sp.email as cemail";
$sql.= " FROM ".MAIN_DB_PREFIX."facture as f, ".MAIN_DB_PREFIX."societe as s";
if ($targettype == 'contacts') $sql.= ", ".MAIN_DB_PREFIX."socpeople as sp";
$sql.= " WHERE f.fk_statut = 1 AND f.paye = 0";
$sql.= " AND f.fk_soc = s.rowid";
if (is_numeric($duration_value2)) $sql.= " AND f.date_lim_reglement >= '".$db->idate(dol_time_plus_duree($now, $duration_value2, "d"))."'";
if (is_numeric($duration_value)) $sql.= " AND f.date_lim_reglement < '".$db->idate(dol_time_plus_duree($now, $duration_value, "d"))."'";
if ($targettype == 'contacts') $sql.= " AND s.rowid = sp.fk_soc";
$sql.= " ORDER BY";
if ($targettype == 'contacts') $sql.= " sp.email, sp.rowid,";
$sql.= " s.email ASC, s.rowid ASC, f.ref ASC"; // Order by email to allow one message per email
$sql .= " s.rowid as sid, s.nom as name, s.email, s.default_lang";
if ($targettype == 'contacts')
$sql .= ", sp.rowid as cid, sp.firstname as cfirstname, sp.lastname as clastname, sp.email as cemail";
$sql .= " FROM " . MAIN_DB_PREFIX . "facture as f, " . MAIN_DB_PREFIX . "societe as s";
if ($targettype == 'contacts')
$sql .= ", " . MAIN_DB_PREFIX . "socpeople as sp";
$sql .= " WHERE f.fk_statut = 1 AND f.paye = 0";
$sql .= " AND f.fk_soc = s.rowid";
if (is_numeric($duration_value2))
$sql .= " AND f.date_lim_reglement >= '" . $db->idate(dol_time_plus_duree($now, $duration_value2, "d")) . "'";
if (is_numeric($duration_value))
$sql .= " AND f.date_lim_reglement < '" . $db->idate(dol_time_plus_duree($now, $duration_value, "d")) . "'";
if ($targettype == 'contacts')
$sql .= " AND s.rowid = sp.fk_soc";
$sql .= " ORDER BY";
if ($targettype == 'contacts')
$sql .= " sp.email, sp.rowid,";
$sql .= " s.email ASC, s.rowid ASC, f.ref ASC"; // Order by email to allow one message per email
//print $sql;
$resql=$db->query($sql);
if ($resql)
{
$num = $db->num_rows($resql);
$i = 0;
$oldemail = 'none'; $oldsid = 0; $oldcid = 0; $oldlang='';
$total = 0; $foundtoprocess = 0;
$trackthirdpartiessent = array();
// print $sql;
$resql = $db->query($sql);
if ($resql) {
$num = $db->num_rows($resql);
$i = 0;
$oldemail = 'none';
$oldsid = 0;
$oldcid = 0;
$oldlang = '';
$total = 0;
$foundtoprocess = 0;
$trackthirdpartiessent = array();
print "We found ".$num." couples (unpayed validated invoices-".$targettype.") qualified\n";
dol_syslog("We found ".$num." couples (unpayed validated invoices-".$targettype.") qualified");
$message='';
print "We found " . $num . " couples (unpayed validated invoices-" . $targettype . ") qualified\n";
dol_syslog("We found " . $num . " couples (unpayed validated invoices-" . $targettype . ") qualified");
$message = '';
if ($num)
{
while ($i < $num)
{
$obj = $db->fetch_object($resql);
if ($num) {
while ($i < $num) {
$obj = $db->fetch_object($resql);
$newemail=empty($obj->cemail)?$obj->email:$obj->cemail;
$newemail = empty($obj->cemail) ? $obj->email : $obj->cemail;
// Check if this record is a break after previous one
$startbreak=false;
if ($newemail <> $oldemail || $oldemail == 'none') $startbreak=true;
if ($obj->sid && $obj->sid <> $oldsid) $startbreak=true;
if ($obj->cid && $obj->cid <> $oldcid) $startbreak=true;
// Check if this record is a break after previous one
$startbreak = false;
if ($newemail != $oldemail || $oldemail == 'none')
$startbreak = true;
if ($obj->sid && $obj->sid != $oldsid)
$startbreak = true;
if ($obj->cid && $obj->cid != $oldcid)
$startbreak = true;
if ($startbreak)
{
// Break onto sales representative (new email or cid)
if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid.'|'.$oldemail]))
{
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget);
$trackthirdpartiessent[$oldsid.'|'.$oldemail]='contact id '.$oldcid;
}
else
{
if ($oldemail != 'none')
{
if (empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) print "- No email sent for '".$oldtarget."', total: ".$total."\n";
else print "- No email sent for '".$oldtarget."', total: ".$total." (already sent to ".$trackthirdpartiessent[$oldsid.'|'.$oldemail].")\n";
}
}
$oldemail = $newemail;
$oldsid = $obj->sid;
$oldcid = $obj->cid;
$oldlang = $obj->lang;
$oldtarget=(empty($obj->cfirstname) && empty($obj->clastname))?$obj->name:($obj->clastname." ".$obj->cfirstname);
$message = '';
$total = 0;
$foundtoprocess = 0;
$target=(empty($obj->cfirstname) && empty($obj->clastname))?$obj->name:($obj->clastname." ".$obj->cfirstname);
//if (empty($newemail)) print "Warning: Customer ".$target." has no email. Notice disabled.\n";
}
if ($startbreak) {
// Break onto sales representative (new email or cid)
if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid . '|' . $oldemail])) {
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget);
$trackthirdpartiessent[$oldsid . '|' . $oldemail] = 'contact id ' . $oldcid;
} else {
if ($oldemail != 'none') {
if (empty($trackthirdpartiessent[$oldsid . '|' . $oldemail]))
print "- No email sent for '" . $oldtarget . "', total: " . $total . "\n";
else
print "- No email sent for '" . $oldtarget . "', total: " . $total . " (already sent to " . $trackthirdpartiessent[$oldsid . '|' . $oldemail] . ")\n";
}
}
$oldemail = $newemail;
$oldsid = $obj->sid;
$oldcid = $obj->cid;
$oldlang = $obj->lang;
$oldtarget = (empty($obj->cfirstname) && empty($obj->clastname)) ? $obj->name : ($obj->clastname . " " . $obj->cfirstname);
$message = '';
$total = 0;
$foundtoprocess = 0;
$target = (empty($obj->cfirstname) && empty($obj->clastname)) ? $obj->name : ($obj->clastname . " " . $obj->cfirstname);
// if (empty($newemail)) print "Warning: Customer ".$target." has no email. Notice disabled.\n";
}
// Define line content
$outputlangs=new Translate('', $conf);
$outputlangs->setDefaultLang(empty($obj->default_lang)?$langs->defaultlang:$obj->default_lang); // By default language of customer
// Define line content
$outputlangs = new Translate('', $conf);
$outputlangs->setDefaultLang(empty($obj->default_lang) ? $langs->defaultlang : $obj->default_lang); // By default language of customer
// Load translation files required by the page
$outputlangs->loadLangs(array("main", "bills"));
// Load translation files required by the page
$outputlangs->loadLangs(array("main","bills"));
if (dol_strlen($newemail))
{
$message .= $outputlangs->trans("Invoice")." ".$obj->ref." : ".price($obj->total_ttc, 0, $outputlangs, 0, 0, -1, $conf->currency)."\n";
dol_syslog("email_unpaid_invoices_to_customers.php: ".$newemail." ".$message);
$foundtoprocess++;
}
print "Unpaid invoice ".$obj->ref.", price ".price2num($obj->total_ttc).", due date ".dol_print_date($db->jdate($obj->due_date), 'day').", customer id ".$obj->sid." ".$obj->name.", ".($obj->cid?"contact id ".$obj->cid." ".$obj->clastname." ".$obj->cfirstname.", ":"")."email ".$newemail.", lang ".$outputlangs->defaultlang.": ";
if (dol_strlen($newemail)) print "qualified.";
else print "disqualified (no email).";
print "\n";
if (dol_strlen($newemail)) {
$message .= $outputlangs->trans("Invoice") . " " . $obj->ref . " : " . price($obj->total_ttc, 0, $outputlangs, 0, 0, - 1, $conf->currency) . "\n";
dol_syslog("email_unpaid_invoices_to_customers.php: " . $newemail . " " . $message);
$foundtoprocess ++;
}
print "Unpaid invoice " . $obj->ref . ", price " . price2num($obj->total_ttc) . ", due date " . dol_print_date($db->jdate($obj->due_date), 'day') . ", customer id " . $obj->sid . " " . $obj->name . ", " . ($obj->cid ? "contact id " . $obj->cid . " " . $obj->clastname . " " . $obj->cfirstname . ", " : "") . "email " . $newemail . ", lang " . $outputlangs->defaultlang . ": ";
if (dol_strlen($newemail))
print "qualified.";
else
print "disqualified (no email).";
print "\n";
unset($outputlangs);
unset($outputlangs);
$total += $obj->total_ttc;
$total += $obj->total_ttc;
$i++;
}
$i ++;
}
// Si il reste des envois en buffer
if ($foundtoprocess)
{
if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) // Break onto email (new email)
{
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget);
$trackthirdpartiessent[$oldsid.'|'.$oldemail]='contact id '.$oldcid;
}
else
// Si il reste des envois en buffer
if ($foundtoprocess) {
if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid . '|' . $oldemail])) // Break onto email (new email)
{
if ($oldemail != 'none')
{
if (empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) print "- No email sent for '".$oldtarget."', total: ".$total."\n";
else print "- No email sent for '".$oldtarget."', total: ".$total." (already sent to ".$trackthirdpartiessent[$oldsid.'|'.$oldemail].")\n";
}
}
}
}
else
{
print "No unpaid invoices found\n";
}
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldtarget);
$trackthirdpartiessent[$oldsid . '|' . $oldemail] = 'contact id ' . $oldcid;
} else {
if ($oldemail != 'none') {
if (empty($trackthirdpartiessent[$oldsid . '|' . $oldemail]))
print "- No email sent for '" . $oldtarget . "', total: " . $total . "\n";
else
print "- No email sent for '" . $oldtarget . "', total: " . $total . " (already sent to " . $trackthirdpartiessent[$oldsid . '|' . $oldemail] . ")\n";
}
}
}
} else {
print "No unpaid invoices found\n";
}
exit(0);
exit(0);
} else {
dol_print_error($db);
dol_syslog("email_unpaid_invoices_to_customers.php: Error");
exit(- 1);
}
else
{
dol_print_error($db);
dol_syslog("email_unpaid_invoices_to_customers.php: Error");
exit(-1);
}
/**
* Send email
* Send email
*
* @param string $mode Mode (test | confirm)
* @param string $oldemail Target email
* @param string $message Message to send
* @param string $total Total amount of unpayed invoices
* @param string $userlang Code lang to use for email output.
* @param string $oldtarget Target name
* @return int <0 if KO, >0 if OK
* @param string $mode
* Mode (test | confirm)
* @param string $oldemail
* Target email
* @param string $message
* Message to send
* @param string $total
* Total amount of unpayed invoices
* @param string $userlang
* Code lang to use for email output.
* @param string $oldtarget
* Target name
* @return int <0 if KO, >0 if OK
*/
function envoi_mail($mode, $oldemail, $message, $total, $userlang, $oldtarget)
{
global $conf,$langs;
global $conf, $langs;
if (getenv('DOL_FORCE_EMAIL_TO')) $oldemail=getenv('DOL_FORCE_EMAIL_TO');
if (getenv('DOL_FORCE_EMAIL_TO'))
$oldemail = getenv('DOL_FORCE_EMAIL_TO');
$newlangs=new Translate('', $conf);
$newlangs->setDefaultLang(empty($userlang)?(empty($conf->global->MAIN_LANG_DEFAULT)?'auto':$conf->global->MAIN_LANG_DEFAULT):$userlang);
$newlangs->load("main");
$newlangs->load("bills");
$newlangs = new Translate('', $conf);
$newlangs->setDefaultLang(empty($userlang) ? (empty($conf->global->MAIN_LANG_DEFAULT) ? 'auto' : $conf->global->MAIN_LANG_DEFAULT) : $userlang);
$newlangs->load("main");
$newlangs->load("bills");
$subject = (empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_SUBJECT)?$newlangs->trans("ListOfYourUnpaidInvoices"):$conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_SUBJECT);
$sendto = $oldemail;
$from = $conf->global->MAIN_MAIL_EMAIL_FROM;
$errorsto = $conf->global->MAIN_MAIL_ERRORS_TO;
$msgishtml = -1;
$subject = (empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_SUBJECT) ? $newlangs->trans("ListOfYourUnpaidInvoices") : $conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_SUBJECT);
$sendto = $oldemail;
$from = $conf->global->MAIN_MAIL_EMAIL_FROM;
$errorsto = $conf->global->MAIN_MAIL_ERRORS_TO;
$msgishtml = - 1;
print "- Send email to '".$oldtarget."' (".$oldemail."), total: ".$total."\n";
dol_syslog("email_unpaid_invoices_to_customers.php: send mail to ".$oldemail);
print "- Send email to '" . $oldtarget . "' (" . $oldemail . "), total: " . $total . "\n";
dol_syslog("email_unpaid_invoices_to_customers.php: send mail to " . $oldemail);
$usehtml=0;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER)) $usehtml+=1;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_HEADER)) $usehtml+=1;
$usehtml = 0;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER))
$usehtml += 1;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_HEADER))
$usehtml += 1;
$allmessage='';
if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_HEADER))
{
$allmessage.=$conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_HEADER;
}
else
{
$allmessage.= "Dear customer".($usehtml?"<br>\n":"\n").($usehtml?"<br>\n":"\n");
$allmessage.= "Please, find a summary of the bills with pending payments from you.".($usehtml?"<br>\n":"\n").($usehtml?"<br>\n":"\n");
$allmessage.= "Note: This list contains only unpaid invoices.".($usehtml?"<br>\n":"\n");
}
$allmessage.= $message.($usehtml?"<br>\n":"\n");
$allmessage.= $langs->trans("Total")." = ".price($total, 0, $userlang, 0, 0, -1, $conf->currency).($usehtml?"<br>\n":"\n");
if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER))
{
$allmessage.=$conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER)) $usehtml+=1;
}
$allmessage = '';
if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_HEADER)) {
$allmessage .= $conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_HEADER;
} else {
$allmessage .= "Dear customer" . ($usehtml ? "<br>\n" : "\n") . ($usehtml ? "<br>\n" : "\n");
$allmessage .= "Please, find a summary of the bills with pending payments from you." . ($usehtml ? "<br>\n" : "\n") . ($usehtml ? "<br>\n" : "\n");
$allmessage .= "Note: This list contains only unpaid invoices." . ($usehtml ? "<br>\n" : "\n");
}
$allmessage .= $message . ($usehtml ? "<br>\n" : "\n");
$allmessage .= $langs->trans("Total") . " = " . price($total, 0, $userlang, 0, 0, - 1, $conf->currency) . ($usehtml ? "<br>\n" : "\n");
if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER)) {
$allmessage .= $conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_CUSTOMERS_FOOTER))
$usehtml += 1;
}
$mail = new CMailFile(
$subject,
$sendto,
$from,
$allmessage,
array(),
array(),
array(),
'',
'',
0,
$msgishtml
);
$mail = new CMailFile($subject, $sendto, $from, $allmessage, array(), array(), array(), '', '', 0, $msgishtml);
$mail->errors_to = $errorsto;
$mail->errors_to = $errorsto;
// Send or not email
if ($mode == 'confirm')
{
$result=$mail->sendfile();
if (! $result)
{
print "Error sending email ".$mail->error."\n";
dol_syslog("Error sending email ".$mail->error."\n");
}
}
else
{
print "No email sent (test mode)\n";
dol_syslog("No email sent (test mode)");
$mail->dump_mail();
$result=1;
}
// Send or not email
if ($mode == 'confirm') {
$result = $mail->sendfile();
if (! $result) {
print "Error sending email " . $mail->error . "\n";
dol_syslog("Error sending email " . $mail->error . "\n");
}
} else {
print "No email sent (test mode)\n";
dol_syslog("No email sent (test mode)");
$mail->dump_mail();
$result = 1;
}
unset($newlangs);
if ($result)
{
return 1;
}
else
{
return -1;
}
unset($newlangs);
if ($result) {
return 1;
} else {
return - 1;
}
}

View File

@ -1,9 +1,9 @@
#!/usr/bin/env php
<?php
/*
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
*
* 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
@ -12,7 +12,7 @@
*
* 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
* 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
@ -20,260 +20,235 @@
*/
/**
* \file scripts/invoices/email_unpaid_invoices_to_representatives.php
* \ingroup facture
* \brief Script to send a mail to dolibarr users linked to companies with unpaid invoices
* \file scripts/invoices/email_unpaid_invoices_to_representatives.php
* \ingroup facture
* \brief Script to send a mail to dolibarr users linked to companies with unpaid invoices
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test si mode batch
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
if (! isset($argv[1]) || ! $argv[1] || ! in_array($argv[1], array('test','confirm')))
{
if (! isset($argv[1]) || ! $argv[1] || ! in_array($argv[1], array('test','confirm'))) {
print "Usage: $script_file (test|confirm) [delay]\n";
print "\n";
print "Send an email to users to remind all unpaid customer invoices user is sale representative for.\n";
print "If you choose 'test' mode, no emails are sent.\n";
print "If you add a delay (nb of days), only invoice with due date < today + delay are included.\n";
exit(-1);
exit(- 1);
}
$mode=$argv[1];
$mode = $argv[1];
require $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/core/class/CMailFile.class.php";
require $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/CMailFile.class.php";
$langs->load('main');
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
$now=dol_now('tzserver');
$duration_value=isset($argv[2])?$argv[2]:'none';
$now = dol_now('tzserver');
$duration_value = isset($argv[2]) ? $argv[2] : 'none';
print $script_file." launched with mode ".$mode." default lang=".$langs->defaultlang.(is_numeric($duration_value)?" delay=".$duration_value:"")."\n";
print $script_file . " launched with mode " . $mode . " default lang=" . $langs->defaultlang . (is_numeric($duration_value) ? " delay=" . $duration_value : "") . "\n";
if ($mode != 'confirm') $conf->global->MAIN_DISABLE_ALL_MAILS=1;
if ($mode != 'confirm')
$conf->global->MAIN_DISABLE_ALL_MAILS = 1;
$sql = "SELECT f.ref, f.total_ttc, f.date_lim_reglement as due_date, s.nom as name, s.email, s.default_lang,";
$sql.= " u.rowid as uid, u.lastname, u.firstname, u.email, u.lang";
$sql .= " FROM ".MAIN_DB_PREFIX."facture as f";
$sql .= " , ".MAIN_DB_PREFIX."societe as s";
$sql .= " , ".MAIN_DB_PREFIX."societe_commerciaux as sc";
$sql .= " , ".MAIN_DB_PREFIX."user as u";
$sql .= " u.rowid as uid, u.lastname, u.firstname, u.email, u.lang";
$sql .= " FROM " . MAIN_DB_PREFIX . "facture as f";
$sql .= " , " . MAIN_DB_PREFIX . "societe as s";
$sql .= " , " . MAIN_DB_PREFIX . "societe_commerciaux as sc";
$sql .= " , " . MAIN_DB_PREFIX . "user as u";
$sql .= " WHERE f.fk_statut = 1 AND f.paye = 0";
$sql .= " AND f.fk_soc = s.rowid";
if (is_numeric($duration_value)) $sql .= " AND f.date_lim_reglement < '".$db->idate(dol_time_plus_duree($now, $duration_value, "d"))."'";
if (is_numeric($duration_value))
$sql .= " AND f.date_lim_reglement < '" . $db->idate(dol_time_plus_duree($now, $duration_value, "d")) . "'";
$sql .= " AND sc.fk_soc = s.rowid";
$sql .= " AND sc.fk_user = u.rowid";
$sql .= " ORDER BY u.email ASC, s.rowid ASC, f.ref ASC"; // Order by email to allow one message per email
$sql .= " ORDER BY u.email ASC, s.rowid ASC, f.ref ASC"; // Order by email to allow one message per email
//print $sql;
$resql=$db->query($sql);
if ($resql)
{
$num = $db->num_rows($resql);
$i = 0;
$oldemail = 'none'; $olduid = 0; $oldlang='';
$total = 0; $foundtoprocess = 0;
print "We found ".$num." couples (unpayed validated invoice - sale representative) qualified\n";
dol_syslog("We found ".$num." couples (unpayed validated invoice - sale representative) qualified");
$message='';
// print $sql;
$resql = $db->query($sql);
if ($resql) {
$num = $db->num_rows($resql);
$i = 0;
$oldemail = 'none';
$olduid = 0;
$oldlang = '';
$total = 0;
$foundtoprocess = 0;
print "We found " . $num . " couples (unpayed validated invoice - sale representative) qualified\n";
dol_syslog("We found " . $num . " couples (unpayed validated invoice - sale representative) qualified");
$message = '';
if ($num)
{
while ($i < $num)
{
$obj = $db->fetch_object($resql);
if ($num) {
while ($i < $num) {
$obj = $db->fetch_object($resql);
if (($obj->email <> $oldemail || $obj->uid <> $olduid) || $oldemail == 'none')
{
// Break onto sales representative (new email or uid)
if (dol_strlen($oldemail) && $oldemail != 'none')
{
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative);
}
else
{
if ($oldemail != 'none') print "- No email sent for ".$oldsalerepresentative.", total: ".$total."\n";
}
$oldemail = $obj->email;
$olduid = $obj->uid;
$oldlang = $obj->lang;
$oldsalerepresentative=dolGetFirstLastname($obj->firstname, $obj->lastname);
$message = '';
$total = 0;
$foundtoprocess = 0;
$salerepresentative=dolGetFirstLastname($obj->firstname, $obj->lastname);
if (empty($obj->email)) print "Warning: Sale representative ".$salerepresentative." has no email. Notice disabled.\n";
}
if (($obj->email != $oldemail || $obj->uid != $olduid) || $oldemail == 'none') {
// Break onto sales representative (new email or uid)
if (dol_strlen($oldemail) && $oldemail != 'none') {
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative);
} else {
if ($oldemail != 'none')
print "- No email sent for " . $oldsalerepresentative . ", total: " . $total . "\n";
}
$oldemail = $obj->email;
$olduid = $obj->uid;
$oldlang = $obj->lang;
$oldsalerepresentative = dolGetFirstLastname($obj->firstname, $obj->lastname);
$message = '';
$total = 0;
$foundtoprocess = 0;
$salerepresentative = dolGetFirstLastname($obj->firstname, $obj->lastname);
if (empty($obj->email))
print "Warning: Sale representative " . $salerepresentative . " has no email. Notice disabled.\n";
}
// Define line content
$outputlangs=new Translate('', $conf);
$outputlangs->setDefaultLang(empty($obj->lang)?$langs->defaultlang:$obj->lang); // By default language of sale representative
// Define line content
$outputlangs = new Translate('', $conf);
$outputlangs->setDefaultLang(empty($obj->lang) ? $langs->defaultlang : $obj->lang); // By default language of sale representative
// Load translation files required by the page
$outputlangs->loadLangs(array("main", "bills"));
// Load translation files required by the page
$outputlangs->loadLangs(array("main","bills"));
if (dol_strlen($obj->email))
{
$message .= $outputlangs->trans("Invoice")." ".$obj->ref." : ".price($obj->total_ttc, 0, $outputlangs, 0, 0, -1, $conf->currency)." : ".$obj->name."\n";
dol_syslog("email_unpaid_invoices_to_representatives.php: ".$obj->email);
$foundtoprocess++;
}
print "Unpaid invoice ".$obj->ref.", price ".price2num($obj->total_ttc).", due date ".dol_print_date($db->jdate($obj->due_date), 'day')." (linked to company ".$obj->name.", sale representative ".dolGetFirstLastname($obj->firstname, $obj->lastname).", email ".$obj->email.", lang ".$outputlangs->defaultlang."): ";
if (dol_strlen($obj->email)) print "qualified.";
else print "disqualified (no email).";
if (dol_strlen($obj->email)) {
$message .= $outputlangs->trans("Invoice") . " " . $obj->ref . " : " . price($obj->total_ttc, 0, $outputlangs, 0, 0, - 1, $conf->currency) . " : " . $obj->name . "\n";
dol_syslog("email_unpaid_invoices_to_representatives.php: " . $obj->email);
$foundtoprocess ++;
}
print "Unpaid invoice " . $obj->ref . ", price " . price2num($obj->total_ttc) . ", due date " . dol_print_date($db->jdate($obj->due_date), 'day') . " (linked to company " . $obj->name . ", sale representative " . dolGetFirstLastname($obj->firstname, $obj->lastname) . ", email " . $obj->email . ", lang " . $outputlangs->defaultlang . "): ";
if (dol_strlen($obj->email))
print "qualified.";
else
print "disqualified (no email).";
print "\n";
unset($outputlangs);
$total += $obj->total_ttc;
$i++;
}
$total += $obj->total_ttc;
$i ++;
}
// Si il reste des envois en buffer
if ($foundtoprocess)
{
if (dol_strlen($oldemail) && $oldemail != 'none') // Break onto email (new email)
{
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative);
}
else
// Si il reste des envois en buffer
if ($foundtoprocess) {
if (dol_strlen($oldemail) && $oldemail != 'none') // Break onto email (new email)
{
if ($oldemail != 'none') print "- No email sent for ".$oldsalerepresentative.", total: ".$total."\n";
}
}
}
else
{
print "No unpaid invoices (for companies linked to a particular commercial dolibarr user) found\n";
}
envoi_mail($mode, $oldemail, $message, $total, $oldlang, $oldsalerepresentative);
} else {
if ($oldemail != 'none')
print "- No email sent for " . $oldsalerepresentative . ", total: " . $total . "\n";
}
}
} else {
print "No unpaid invoices (for companies linked to a particular commercial dolibarr user) found\n";
}
exit(0);
exit(0);
} else {
dol_print_error($db);
dol_syslog("email_unpaid_invoices_to_representatives.php: Error");
exit(- 1);
}
else
{
dol_print_error($db);
dol_syslog("email_unpaid_invoices_to_representatives.php: Error");
exit(-1);
}
/**
* Send email
* Send email
*
* @param string $mode Mode (test | confirm)
* @param string $oldemail Old email
* @param string $message Message to send
* @param string $total Total amount of unpayed invoices
* @param string $userlang Code lang to use for email output.
* @param string $oldsalerepresentative Old sale representative
* @return int <0 if KO, >0 if OK
* @param string $mode
* Mode (test | confirm)
* @param string $oldemail
* Old email
* @param string $message
* Message to send
* @param string $total
* Total amount of unpayed invoices
* @param string $userlang
* Code lang to use for email output.
* @param string $oldsalerepresentative
* Old sale representative
* @return int <0 if KO, >0 if OK
*/
function envoi_mail($mode, $oldemail, $message, $total, $userlang, $oldsalerepresentative)
{
global $conf,$langs;
global $conf, $langs;
if (getenv('DOL_FORCE_EMAIL_TO')) $oldemail=getenv('DOL_FORCE_EMAIL_TO');
if (getenv('DOL_FORCE_EMAIL_TO'))
$oldemail = getenv('DOL_FORCE_EMAIL_TO');
$newlangs=new Translate('', $conf);
$newlangs->setDefaultLang(empty($userlang)?(empty($conf->global->MAIN_LANG_DEFAULT)?'auto':$conf->global->MAIN_LANG_DEFAULT):$userlang);
$newlangs->load("main");
$newlangs->load("bills");
$newlangs = new Translate('', $conf);
$newlangs->setDefaultLang(empty($userlang) ? (empty($conf->global->MAIN_LANG_DEFAULT) ? 'auto' : $conf->global->MAIN_LANG_DEFAULT) : $userlang);
$newlangs->load("main");
$newlangs->load("bills");
$subject = (empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_SUBJECT)?$newlangs->trans("ListOfYourUnpaidInvoices"):$conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_SUBJECT);
$sendto = $oldemail;
$from = $conf->global->MAIN_MAIL_EMAIL_FROM;
$errorsto = $conf->global->MAIN_MAIL_ERRORS_TO;
$msgishtml = -1;
$subject = (empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_SUBJECT) ? $newlangs->trans("ListOfYourUnpaidInvoices") : $conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_SUBJECT);
$sendto = $oldemail;
$from = $conf->global->MAIN_MAIL_EMAIL_FROM;
$errorsto = $conf->global->MAIN_MAIL_ERRORS_TO;
$msgishtml = - 1;
print "- Send email for ".$oldsalerepresentative." (".$oldemail."), total: ".$total."\n";
dol_syslog("email_unpaid_invoices_to_representatives.php: send mail to ".$oldemail);
print "- Send email for " . $oldsalerepresentative . " (" . $oldemail . "), total: " . $total . "\n";
dol_syslog("email_unpaid_invoices_to_representatives.php: send mail to " . $oldemail);
$usehtml=0;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER)) $usehtml+=1;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_HEADER)) $usehtml+=1;
$usehtml = 0;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER))
$usehtml += 1;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_HEADER))
$usehtml += 1;
$allmessage='';
if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_HEADER))
{
$allmessage.=$conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_HEADER;
}
else
{
$allmessage.= $newlangs->transnoentities("ListOfYourUnpaidInvoices").($usehtml?"<br>\n":"\n").($usehtml?"<br>\n":"\n");
$allmessage.= $newlangs->transnoentities("NoteListOfYourUnpaidInvoices").($usehtml?"<br>\n":"\n");
}
$allmessage.= $message.($usehtml?"<br>\n":"\n");
$allmessage.= $langs->trans("Total")." = ".price($total, 0, $newlangs, 0, 0, -1, $conf->currency).($usehtml?"<br>\n":"\n");
if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER))
{
$allmessage.=$conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER)) $usehtml+=1;
}
$allmessage = '';
if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_HEADER)) {
$allmessage .= $conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_HEADER;
} else {
$allmessage .= $newlangs->transnoentities("ListOfYourUnpaidInvoices") . ($usehtml ? "<br>\n" : "\n") . ($usehtml ? "<br>\n" : "\n");
$allmessage .= $newlangs->transnoentities("NoteListOfYourUnpaidInvoices") . ($usehtml ? "<br>\n" : "\n");
}
$allmessage .= $message . ($usehtml ? "<br>\n" : "\n");
$allmessage .= $langs->trans("Total") . " = " . price($total, 0, $newlangs, 0, 0, - 1, $conf->currency) . ($usehtml ? "<br>\n" : "\n");
if (! empty($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER)) {
$allmessage .= $conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER;
if (dol_textishtml($conf->global->SCRIPT_EMAIL_UNPAID_INVOICES_SALESREPRESENTATIVES_FOOTER))
$usehtml += 1;
}
$mail = new CMailFile(
$subject,
$sendto,
$from,
$allmessage,
array(),
array(),
array(),
'',
'',
0,
$msgishtml
);
$mail = new CMailFile($subject, $sendto, $from, $allmessage, array(), array(), array(), '', '', 0, $msgishtml);
$mail->errors_to = $errorsto;
$mail->errors_to = $errorsto;
// Send or not email
if ($mode == 'confirm')
{
$result=$mail->sendfile();
if (! $result)
{
print "Error sending email ".$mail->error."\n";
dol_syslog("Error sending email ".$mail->error."\n");
}
}
else
{
print "No email sent (test mode)\n";
dol_syslog("No email sent (test mode)");
$mail->dump_mail();
$result=1;
}
// Send or not email
if ($mode == 'confirm') {
$result = $mail->sendfile();
if (! $result) {
print "Error sending email " . $mail->error . "\n";
dol_syslog("Error sending email " . $mail->error . "\n");
}
} else {
print "No email sent (test mode)\n";
dol_syslog("No email sent (test mode)");
$mail->dump_mail();
$result = 1;
}
if ($result)
{
return 1;
}
else
{
return -1;
}
if ($result) {
return 1;
} else {
return - 1;
}
}

View File

@ -1,7 +1,7 @@
#!/usr/bin/env php
<?php
/*
* Copyright (C) 2009-2012 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2009-2012 Laurent Destailleur <eldy@users.sourceforge.net>
*
* 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
@ -10,7 +10,7 @@
*
* 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
* 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
@ -18,251 +18,217 @@
*/
/**
* \file scripts/invoices/rebuild_merge_pdf.php
* \ingroup facture
* \brief Script to rebuild PDF and merge PDF files into one
* \file scripts/invoices/rebuild_merge_pdf.php
* \ingroup facture
* \brief Script to rebuild PDF and merge PDF files into one
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
// Include Dolibarr environment
require_once $path."../../htdocs/master.inc.php";
require_once $path . "../../htdocs/master.inc.php";
// After this $db is an opened handler to database. We close it at end of file.
require_once DOL_DOCUMENT_ROOT."/compta/facture/class/facture.class.php";
require_once DOL_DOCUMENT_ROOT."/core/modules/facture/modules_facture.php";
require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
require_once DOL_DOCUMENT_ROOT.'/core/lib/invoice2.lib.php';
require_once DOL_DOCUMENT_ROOT . "/compta/facture/class/facture.class.php";
require_once DOL_DOCUMENT_ROOT . "/core/modules/facture/modules_facture.php";
require_once DOL_DOCUMENT_ROOT . "/core/lib/date.lib.php";
require_once DOL_DOCUMENT_ROOT . '/core/lib/invoice2.lib.php';
// Load main language strings
$langs->load("main");
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
// Check parameters
if (! isset($argv[1]))
{
if (! isset($argv[1])) {
usage();
exit(-1);
exit(- 1);
}
$diroutputpdf=$conf->facture->dir_output . '/temp';
$newlangid='en_EN'; // To force a new lang id
$filter=array();
$regenerate=''; // Ask regenerate (contains name of model to use)
$option='';
$fileprefix='mergedpdf';
$diroutputpdf = $conf->facture->dir_output . '/temp';
$newlangid = 'en_EN'; // To force a new lang id
$filter = array();
$regenerate = ''; // Ask regenerate (contains name of model to use)
$option = '';
$fileprefix = 'mergedpdf';
foreach ($argv as $key => $value)
{
$found=false;
foreach ($argv as $key => $value) {
$found = false;
// Define options
if (preg_match('/^lang=/i', $value))
{
$found=true;
$valarray=explode('=', $value);
$newlangid=$valarray[1];
print 'Use language '.$newlangid.".\n";
if (preg_match('/^lang=/i', $value)) {
$found = true;
$valarray = explode('=', $value);
$newlangid = $valarray[1];
print 'Use language ' . $newlangid . ".\n";
}
if (preg_match('/^prefix=/i', $value))
{
$found=true;
$valarray=explode('=', $value);
$fileprefix=$valarray[1];
print 'Use prefix for filename '.$fileprefix.".\n";
if (preg_match('/^prefix=/i', $value)) {
$found = true;
$valarray = explode('=', $value);
$fileprefix = $valarray[1];
print 'Use prefix for filename ' . $fileprefix . ".\n";
}
if (preg_match('/^regenerate=(.*)/i', $value, $reg))
{
if (! in_array($reg[1], array('','0','no')))
{
$found=true;
$regenerate=$reg[1];
print 'Regeneration of PDF is requested with template '.$regenerate."\n";
}
}
if ($value == 'filter=all')
{
$found=true;
$option.=(empty($option)?'':'_').'all';
$filter[]='all';
print 'Rebuild PDF for all invoices'."\n";
}
if ($value == 'filter=date')
{
$found=true;
$option.=(empty($option)?'':'_').'date_'.$argv[$key+1].'_'.$argv[$key+2];
$filter[]='date';
$dateafterdate=dol_stringtotime($argv[$key+1]);
$datebeforedate=dol_stringtotime($argv[$key+2]);
print 'Rebuild PDF for invoices validated between '.dol_print_date($dateafterdate, 'day', 'gmt')." and ".dol_print_date($datebeforedate, 'day', 'gmt').".\n";
}
if ($value == 'filter=payments')
{
$found=true;
$option.=(empty($option)?'':'_').'payments_'.$argv[$key+1].'_'.$argv[$key+2];
$filter[]='payments';
$paymentdateafter=dol_stringtotime($argv[$key+1].'000000');
$paymentdatebefore=dol_stringtotime($argv[$key+2].'235959');
if (empty($paymentdateafter) || empty($paymentdatebefore))
{
print 'Error: Bad date format or value'."\n";
exit(-1);
if (preg_match('/^regenerate=(.*)/i', $value, $reg)) {
if (! in_array($reg[1], array('','0','no'))) {
$found = true;
$regenerate = $reg[1];
print 'Regeneration of PDF is requested with template ' . $regenerate . "\n";
}
print 'Rebuild PDF for invoices with at least one payment between '.dol_print_date($paymentdateafter, 'day', 'gmt')." and ".dol_print_date($paymentdatebefore, 'day', 'gmt').".\n";
}
if ($value == 'filter=nopayment')
{
$found=true;
$option.=(empty($option)?'':'_').'nopayment';
$filter[]='nopayment';
if ($value == 'filter=all') {
$found = true;
$option .= (empty($option) ? '' : '_') . 'all';
$filter[] = 'all';
print 'Rebuild PDF for invoices with no payment done yet.'."\n";
print 'Rebuild PDF for all invoices' . "\n";
}
if ($value == 'filter=bank')
{
$found=true;
$option.=(empty($option)?'':'_').'bank_'.$argv[$key+1];
$filter[]='bank';
if ($value == 'filter=date') {
$found = true;
$option .= (empty($option) ? '' : '_') . 'date_' . $argv[$key + 1] . '_' . $argv[$key + 2];
$filter[] = 'date';
$paymentonbankref=$argv[$key+1];
$bankaccount=new Account($db);
$result=$bankaccount->fetch(0, $paymentonbankref);
if ($result <= 0)
{
print 'Error: Bank account with ref "'.$paymentonbankref.'" not found'."\n";
exit(-1);
$dateafterdate = dol_stringtotime($argv[$key + 1]);
$datebeforedate = dol_stringtotime($argv[$key + 2]);
print 'Rebuild PDF for invoices validated between ' . dol_print_date($dateafterdate, 'day', 'gmt') . " and " . dol_print_date($datebeforedate, 'day', 'gmt') . ".\n";
}
if ($value == 'filter=payments') {
$found = true;
$option .= (empty($option) ? '' : '_') . 'payments_' . $argv[$key + 1] . '_' . $argv[$key + 2];
$filter[] = 'payments';
$paymentdateafter = dol_stringtotime($argv[$key + 1] . '000000');
$paymentdatebefore = dol_stringtotime($argv[$key + 2] . '235959');
if (empty($paymentdateafter) || empty($paymentdatebefore)) {
print 'Error: Bad date format or value' . "\n";
exit(- 1);
}
$paymentonbankid=$bankaccount->id;
print 'Rebuild PDF for invoices with at least one payment on financial account '.$bankaccount->ref."\n";
print 'Rebuild PDF for invoices with at least one payment between ' . dol_print_date($paymentdateafter, 'day', 'gmt') . " and " . dol_print_date($paymentdatebefore, 'day', 'gmt') . ".\n";
}
if ($value == 'filter=nodeposit')
{
$found=true;
$option.=(empty($option)?'':'_').'nodeposit';
$filter[]='nodeposit';
if ($value == 'filter=nopayment') {
$found = true;
$option .= (empty($option) ? '' : '_') . 'nopayment';
$filter[] = 'nopayment';
print 'Exclude deposit invoices'."\n";
}
if ($value == 'filter=noreplacement')
{
$found=true;
$option.=(empty($option)?'':'_').'noreplacement';
$filter[]='noreplacement';
print 'Rebuild PDF for invoices with no payment done yet.' . "\n";
}
print 'Exclude replacement invoices'."\n";
}
if ($value == 'filter=nocreditnote')
{
$found=true;
$option.=(empty($option)?'':'_').'nocreditnote';
$filter[]='nocreditnote';
if ($value == 'filter=bank') {
$found = true;
$option .= (empty($option) ? '' : '_') . 'bank_' . $argv[$key + 1];
$filter[] = 'bank';
print 'Exclude credit note invoices'."\n";
}
$paymentonbankref = $argv[$key + 1];
$bankaccount = new Account($db);
$result = $bankaccount->fetch(0, $paymentonbankref);
if ($result <= 0) {
print 'Error: Bank account with ref "' . $paymentonbankref . '" not found' . "\n";
exit(- 1);
}
$paymentonbankid = $bankaccount->id;
print 'Rebuild PDF for invoices with at least one payment on financial account ' . $bankaccount->ref . "\n";
}
if ($value == 'filter=excludethirdparties')
{
$found=true;
$filter[]='excludethirdparties';
if ($value == 'filter=nodeposit') {
$found = true;
$option .= (empty($option) ? '' : '_') . 'nodeposit';
$filter[] = 'nodeposit';
$thirdpartiesid=explode(',', $argv[$key+1]);
print 'Exclude thirdparties with id in list ('.join(',', $thirdpartiesid).").\n";
print 'Exclude deposit invoices' . "\n";
}
if ($value == 'filter=noreplacement') {
$found = true;
$option .= (empty($option) ? '' : '_') . 'noreplacement';
$filter[] = 'noreplacement';
$option.=(empty($option)?'':'_').'excludethirdparties'.join('-', $thirdpartiesid);
}
if ($value == 'filter=onlythirdparties')
{
$found=true;
$filter[]='onlythirdparties';
print 'Exclude replacement invoices' . "\n";
}
if ($value == 'filter=nocreditnote') {
$found = true;
$option .= (empty($option) ? '' : '_') . 'nocreditnote';
$filter[] = 'nocreditnote';
$thirdpartiesid=explode(',', $argv[$key+1]);
print 'Only thirdparties with id in list ('.join(',', $thirdpartiesid).").\n";
print 'Exclude credit note invoices' . "\n";
}
$option.=(empty($option)?'':'_').'onlythirdparty'.join('-', $thirdpartiesid);
}
if ($value == 'filter=excludethirdparties') {
$found = true;
$filter[] = 'excludethirdparties';
if (! $found && preg_match('/filter=/i', $value))
{
$thirdpartiesid = explode(',', $argv[$key + 1]);
print 'Exclude thirdparties with id in list (' . join(',', $thirdpartiesid) . ").\n";
$option .= (empty($option) ? '' : '_') . 'excludethirdparties' . join('-', $thirdpartiesid);
}
if ($value == 'filter=onlythirdparties') {
$found = true;
$filter[] = 'onlythirdparties';
$thirdpartiesid = explode(',', $argv[$key + 1]);
print 'Only thirdparties with id in list (' . join(',', $thirdpartiesid) . ").\n";
$option .= (empty($option) ? '' : '_') . 'onlythirdparty' . join('-', $thirdpartiesid);
}
if (! $found && preg_match('/filter=/i', $value)) {
usage();
exit(-1);
exit(- 1);
}
}
// Check if an option and a filter has been provided
if (empty($option) && count($filter) <= 0)
{
if (empty($option) && count($filter) <= 0) {
usage();
exit(-1);
exit(- 1);
}
// Check if there is no uncompatible choice
if (in_array('payments', $filter) && in_array('nopayment', $filter))
{
if (in_array('payments', $filter) && in_array('nopayment', $filter)) {
usage();
exit(-1);
exit(- 1);
}
if (in_array('bank', $filter) && in_array('nopayment', $filter))
{
if (in_array('bank', $filter) && in_array('nopayment', $filter)) {
usage();
exit(-1);
exit(- 1);
}
// Define SQL and SQL request to select invoices
// Use $filter, $dateafterdate, datebeforedate, $paymentdateafter, $paymentdatebefore
$result=rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filter, $dateafterdate, $datebeforedate, $paymentdateafter, $paymentdatebefore, 1, $regenerate, $option, $paymentonbankid, $thirdpartiesid, $fileprefix);
$result = rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filter, $dateafterdate, $datebeforedate, $paymentdateafter, $paymentdatebefore, 1, $regenerate, $option, $paymentonbankid, $thirdpartiesid, $fileprefix);
// -------------------- END OF YOUR CODE --------------------
if ($result >= 0)
{
$error=0;
print '--- end ok'."\n";
}
else
{
$error=$result;
print '--- end error code='.$error."\n";
if ($result >= 0) {
$error = 0;
print '--- end ok' . "\n";
} else {
$error = $result;
print '--- end error code=' . $error . "\n";
}
$db->close();
exit($error);
/**
* Show usage of script
*
@ -272,29 +238,29 @@ function usage()
{
global $script_file;
print "Rebuild PDF files for some invoices and merge PDF files into one.\n";
print "Rebuild PDF files for some invoices and merge PDF files into one.\n";
print "\n";
print "To build/merge PDF for invoices in a date range:\n";
print "Usage: ".$script_file." filter=date dateafter datebefore\n";
print "Usage: " . $script_file . " filter=date dateafter datebefore\n";
print "To build/merge PDF for invoices with at least one payment in a date range:\n";
print "Usage: ".$script_file." filter=payments dateafter datebefore\n";
print "Usage: " . $script_file . " filter=payments dateafter datebefore\n";
print "To build/merge PDF for invoices with at least one payment onto a bank account:\n";
print "Usage: ".$script_file." filter=bank bankref\n";
print "Usage: " . $script_file . " filter=bank bankref\n";
print "To build/merge PDF for all invoices, use filter=all\n";
print "Usage: ".$script_file." filter=all\n";
print "Usage: " . $script_file . " filter=all\n";
print "To build/merge PDF for invoices with no payments, use filter=nopayment\n";
print "Usage: ".$script_file." filter=nopayment\n";
print "To exclude credit notes, use filter=nocreditnote\n";
print "To exclude replacement invoices, use filter=noreplacement\n";
print "To exclude deposit invoices, use filter=nodeposit\n";
print "To exclude some thirdparties, use filter=excludethirdparties id1,id2...\n";
print "To limit to some thirdparties, use filter=onlythirdparties id1,id2...\n";
print "To regenerate existing PDF, use regenerate=templatename\n";
print "To generate invoices in a language, use lang=xx_XX\n";
print "To set prefix of generated file name, use prefix=myfileprefix\n";
print "\n";
print "Example: ".$script_file." filter=payments 20080101 20081231 lang=fr_FR regenerate=crabe\n";
print "Example: ".$script_file." filter=all lang=en_US\n";
print "Usage: " . $script_file . " filter=nopayment\n";
print "To exclude credit notes, use filter=nocreditnote\n";
print "To exclude replacement invoices, use filter=noreplacement\n";
print "To exclude deposit invoices, use filter=nodeposit\n";
print "To exclude some thirdparties, use filter=excludethirdparties id1,id2...\n";
print "To limit to some thirdparties, use filter=onlythirdparties id1,id2...\n";
print "To regenerate existing PDF, use regenerate=templatename\n";
print "To generate invoices in a language, use lang=xx_XX\n";
print "To set prefix of generated file name, use prefix=myfileprefix\n";
print "\n";
print "Example: " . $script_file . " filter=payments 20080101 20081231 lang=fr_FR regenerate=crabe\n";
print "Example: " . $script_file . " filter=all lang=en_US\n";
print "\n";
print "Note that some filters can be cumulated.\n";
}

View File

@ -1,8 +1,8 @@
#!/usr/bin/env php
<?php
/**
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2008 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2008 Laurent Destailleur <eldy@users.sourceforge.net>
*
* 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
@ -11,7 +11,7 @@
*
* 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
* 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
@ -19,74 +19,71 @@
*/
/**
* \file scripts/members/sync_members_dolibarr2ldap.php
* \ingroup ldap member
* \brief Script de mise a jour des adherents dans LDAP depuis base Dolibarr
* \file scripts/members/sync_members_dolibarr2ldap.php
* \ingroup ldap member
* \brief Script de mise a jour des adherents dans LDAP depuis base Dolibarr
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT."/adherents/class/adherent.class.php";
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT . "/adherents/class/adherent.class.php";
$langs->load("main");
// Global variables
$version=DOL_VERSION;
$error=0;
$confirmed=0;
$version = DOL_VERSION;
$error = 0;
$confirmed = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
if (! isset($argv[1]) || ! $argv[1]) {
print "Usage: $script_file now [-y]\n";
exit(-1);
print "Usage: $script_file now [-y]\n";
exit(- 1);
}
foreach($argv as $key => $val)
{
if (preg_match('/-y$/', $val, $reg)) $confirmed=1;
foreach ($argv as $key => $val) {
if (preg_match('/-y$/', $val, $reg))
$confirmed = 1;
}
$now=$argv[1];
$now = $argv[1];
print "Mails sending disabled (useless in batch mode)\n";
$conf->global->MAIN_DISABLE_ALL_MAILS=1; // On bloque les mails
$conf->global->MAIN_DISABLE_ALL_MAILS = 1; // On bloque les mails
print "\n";
print "----- Synchronize all records from Dolibarr database:\n";
print "type=".$conf->db->type."\n";
print "host=".$conf->db->host."\n";
print "port=".$conf->db->port."\n";
print "login=".$conf->db->user."\n";
//print "pass=".preg_replace('/./i','*',$conf->db->password)."\n"; // Not defined for security reasons
print "database=".$conf->db->name."\n";
print "type=" . $conf->db->type . "\n";
print "host=" . $conf->db->host . "\n";
print "port=" . $conf->db->port . "\n";
print "login=" . $conf->db->user . "\n";
// print "pass=".preg_replace('/./i','*',$conf->db->password)."\n"; // Not defined for security reasons
print "database=" . $conf->db->name . "\n";
print "\n";
print "----- To LDAP database:\n";
print "host=".$conf->global->LDAP_SERVER_HOST."\n";
print "port=".$conf->global->LDAP_SERVER_PORT."\n";
print "login=".$conf->global->LDAP_ADMIN_DN."\n";
print "pass=".preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS)."\n";
print "DN target=".$conf->global->LDAP_MEMBER_DN."\n";
print "host=" . $conf->global->LDAP_SERVER_HOST . "\n";
print "port=" . $conf->global->LDAP_SERVER_PORT . "\n";
print "login=" . $conf->global->LDAP_ADMIN_DN . "\n";
print "pass=" . preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS) . "\n";
print "DN target=" . $conf->global->LDAP_MEMBER_DN . "\n";
print "\n";
if (! $confirmed)
{
if (! $confirmed) {
print "Press a key to confirm...\n";
$input = trim(fgets(STDIN));
print "Warning, this operation may result in data loss if it failed.\n";
@ -96,76 +93,67 @@ if (! $confirmed)
}
/*
if (! $conf->global->LDAP_MEMBER_ACTIVE)
{
print $langs->trans("LDAPSynchronizationNotSetupInDolibarr");
exit(-1);
}
*/
* if (! $conf->global->LDAP_MEMBER_ACTIVE)
* {
* print $langs->trans("LDAPSynchronizationNotSetupInDolibarr");
* exit(-1);
* }
*/
$sql = "SELECT rowid";
$sql .= " FROM ".MAIN_DB_PREFIX."adherent";
$sql .= " FROM " . MAIN_DB_PREFIX . "adherent";
$resql = $db->query($sql);
if ($resql)
{
if ($resql) {
$num = $db->num_rows($resql);
$i = 0;
$ldap=new Ldap();
$ldap = new Ldap();
$ldap->connect_bind();
while ($i < $num)
{
$ldap->error="";
while ($i < $num) {
$ldap->error = "";
$obj = $db->fetch_object($resql);
$member = new Adherent($db);
$result=$member->fetch($obj->rowid);
if ($result < 0)
{
$result = $member->fetch($obj->rowid);
if ($result < 0) {
dol_print_error($db, $member->error);
exit(-1);
exit(- 1);
}
$result=$member->fetch_subscriptions();
if ($result < 0)
{
$result = $member->fetch_subscriptions();
if ($result < 0) {
dol_print_error($db, $member->error);
exit(-1);
exit(- 1);
}
print $langs->transnoentities("UpdateMember")." rowid=".$member->id." ".$member->getFullName($langs);
print $langs->transnoentities("UpdateMember") . " rowid=" . $member->id . " " . $member->getFullName($langs);
$oldobject=$member;
$oldobject = $member;
$oldinfo=$oldobject->_load_ldap_info();
$olddn=$oldobject->_load_ldap_dn($oldinfo);
$oldinfo = $oldobject->_load_ldap_info();
$olddn = $oldobject->_load_ldap_dn($oldinfo);
$info=$member->_load_ldap_info();
$dn=$member->_load_ldap_dn($info);
$info = $member->_load_ldap_info();
$dn = $member->_load_ldap_dn($info);
$result=$ldap->add($dn, $info, $user); // Wil fail if already exists
$result=$ldap->update($dn, $info, $user, $olddn);
if ($result > 0)
{
print " - ".$langs->transnoentities("OK");
}
else
{
$error++;
print " - ".$langs->transnoentities("KO").' - '.$ldap->error;
$result = $ldap->add($dn, $info, $user); // Wil fail if already exists
$result = $ldap->update($dn, $info, $user, $olddn);
if ($result > 0) {
print " - " . $langs->transnoentities("OK");
} else {
$error ++;
print " - " . $langs->transnoentities("KO") . ' - ' . $ldap->error;
}
print "\n";
$i++;
$i ++;
}
$ldap->unbind();
$ldap->close();
}
else
{
} else {
dol_print_error($db);
}

View File

@ -1,8 +1,8 @@
#!/usr/bin/env php
<?php
/**
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2015 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2015 Laurent Destailleur <eldy@users.sourceforge.net>
*
* 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
@ -11,7 +11,7 @@
*
* 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
* 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
@ -19,322 +19,265 @@
*/
/**
* \file scripts/members/sync_members_ldap2dolibarr.php
* \ingroup ldap member
* \brief Script de mise a jour des adherents dans Dolibarr depuis LDAP
* \file scripts/members/sync_members_ldap2dolibarr.php
* \ingroup ldap member
* \brief Script de mise a jour des adherents dans Dolibarr depuis LDAP
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT."/adherents/class/adherent.class.php";
require_once DOL_DOCUMENT_ROOT."/adherents/class/subscription.class.php";
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/core/lib/date.lib.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT . "/adherents/class/adherent.class.php";
require_once DOL_DOCUMENT_ROOT . "/adherents/class/subscription.class.php";
$langs->loadLangs(array("main", "errors"));
$langs->loadLangs(array("main","errors"));
// Global variables
$version=DOL_VERSION;
$error=0;
$forcecommit=0;
$confirmed=0;
$version = DOL_VERSION;
$error = 0;
$forcecommit = 0;
$confirmed = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
// List of fields to get from LDAP
$required_fields = array(
$conf->global->LDAP_KEY_MEMBERS,
$conf->global->LDAP_FIELD_FULLNAME,
$conf->global->LDAP_FIELD_LOGIN,
$conf->global->LDAP_FIELD_LOGIN_SAMBA,
$conf->global->LDAP_FIELD_PASSWORD,
$conf->global->LDAP_FIELD_PASSWORD_CRYPTED,
$conf->global->LDAP_FIELD_NAME,
$conf->global->LDAP_FIELD_FIRSTNAME,
$conf->global->LDAP_FIELD_MAIL,
$conf->global->LDAP_FIELD_PHONE,
$conf->global->LDAP_FIELD_PHONE_PERSO,
$conf->global->LDAP_FIELD_MOBILE,
$conf->global->LDAP_FIELD_FAX,
$conf->global->LDAP_FIELD_ADDRESS,
$conf->global->LDAP_FIELD_ZIP,
$conf->global->LDAP_FIELD_TOWN,
$conf->global->LDAP_FIELD_COUNTRY,
$conf->global->LDAP_FIELD_DESCRIPTION,
$conf->global->LDAP_FIELD_BIRTHDATE,
$conf->global->LDAP_FIELD_MEMBER_STATUS,
$conf->global->LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION,
$required_fields = array($conf->global->LDAP_KEY_MEMBERS,$conf->global->LDAP_FIELD_FULLNAME,$conf->global->LDAP_FIELD_LOGIN,$conf->global->LDAP_FIELD_LOGIN_SAMBA,$conf->global->LDAP_FIELD_PASSWORD,$conf->global->LDAP_FIELD_PASSWORD_CRYPTED,$conf->global->LDAP_FIELD_NAME,$conf->global->LDAP_FIELD_FIRSTNAME,$conf->global->LDAP_FIELD_MAIL,$conf->global->LDAP_FIELD_PHONE,$conf->global->LDAP_FIELD_PHONE_PERSO,$conf->global->LDAP_FIELD_MOBILE,$conf->global->LDAP_FIELD_FAX,$conf->global->LDAP_FIELD_ADDRESS,$conf->global->LDAP_FIELD_ZIP,$conf->global->LDAP_FIELD_TOWN,$conf->global->LDAP_FIELD_COUNTRY,$conf->global->LDAP_FIELD_DESCRIPTION,$conf->global->LDAP_FIELD_BIRTHDATE,$conf->global->LDAP_FIELD_MEMBER_STATUS,$conf->global->LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION,
// Subscriptions
$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE,
$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_AMOUNT,
$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE,
$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT
);
$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE,$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_AMOUNT,$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE,$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT);
// Remove from required_fields all entries not configured in LDAP (empty) and duplicated
$required_fields=array_unique(array_values(array_filter($required_fields, "dolValidElement")));
$required_fields = array_unique(array_values(array_filter($required_fields, "dolValidElement")));
if (! isset($argv[2]) || ! is_numeric($argv[2])) {
print "Usage: $script_file (nocommitiferror|commitiferror) id_member_type [--server=ldapserverhost] [-y]\n";
exit(-1);
print "Usage: $script_file (nocommitiferror|commitiferror) id_member_type [--server=ldapserverhost] [-y]\n";
exit(- 1);
}
$typeid=$argv[2];
foreach($argv as $key => $val)
{
if ($val == 'commitiferror') $forcecommit=1;
if (preg_match('/--server=([^\s]+)$/', $val, $reg)) $conf->global->LDAP_SERVER_HOST=$reg[1];
if (preg_match('/-y$/', $val, $reg)) $confirmed=1;
$typeid = $argv[2];
foreach ($argv as $key => $val) {
if ($val == 'commitiferror')
$forcecommit = 1;
if (preg_match('/--server=([^\s]+)$/', $val, $reg))
$conf->global->LDAP_SERVER_HOST = $reg[1];
if (preg_match('/-y$/', $val, $reg))
$confirmed = 1;
}
print "Mails sending disabled (useless in batch mode)\n";
$conf->global->MAIN_DISABLE_ALL_MAILS=1; // On bloque les mails
$conf->global->MAIN_DISABLE_ALL_MAILS = 1; // On bloque les mails
print "\n";
print "----- Synchronize all records from LDAP database:\n";
print "host=".$conf->global->LDAP_SERVER_HOST."\n";
print "port=".$conf->global->LDAP_SERVER_PORT."\n";
print "login=".$conf->global->LDAP_ADMIN_DN."\n";
print "pass=".preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS)."\n";
print "DN to extract=".$conf->global->LDAP_MEMBER_DN."\n";
if (! empty($conf->global->LDAP_MEMBER_FILTER)) print 'Filter=('.$conf->global->LDAP_MEMBER_FILTER.')'."\n"; // Note: filter is defined into function getRecords
else print 'Filter=('.$conf->global->LDAP_KEY_MEMBERS.'=*)'."\n";
print "host=" . $conf->global->LDAP_SERVER_HOST . "\n";
print "port=" . $conf->global->LDAP_SERVER_PORT . "\n";
print "login=" . $conf->global->LDAP_ADMIN_DN . "\n";
print "pass=" . preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS) . "\n";
print "DN to extract=" . $conf->global->LDAP_MEMBER_DN . "\n";
if (! empty($conf->global->LDAP_MEMBER_FILTER))
print 'Filter=(' . $conf->global->LDAP_MEMBER_FILTER . ')' . "\n"; // Note: filter is defined into function getRecords
else
print 'Filter=(' . $conf->global->LDAP_KEY_MEMBERS . '=*)' . "\n";
print "----- To Dolibarr database:\n";
print "type=".$conf->db->type."\n";
print "host=".$conf->db->host."\n";
print "port=".$conf->db->port."\n";
print "login=".$conf->db->user."\n";
print "database=".$conf->db->name."\n";
print "type=" . $conf->db->type . "\n";
print "host=" . $conf->db->host . "\n";
print "port=" . $conf->db->port . "\n";
print "login=" . $conf->db->user . "\n";
print "database=" . $conf->db->name . "\n";
print "----- Options:\n";
print "commitiferror=".$forcecommit."\n";
print "Mapped LDAP fields=".join(',', $required_fields)."\n";
print "commitiferror=" . $forcecommit . "\n";
print "Mapped LDAP fields=" . join(',', $required_fields) . "\n";
print "\n";
// Check parameters
if (empty($conf->global->LDAP_MEMBER_DN))
{
print $langs->trans("Error").': '.$langs->trans("LDAP setup for members not defined inside Dolibarr")."\n";
exit(-1);
if (empty($conf->global->LDAP_MEMBER_DN)) {
print $langs->trans("Error") . ': ' . $langs->trans("LDAP setup for members not defined inside Dolibarr") . "\n";
exit(- 1);
}
if ($typeid <= 0)
{
print $langs->trans("Error").': Parameter id_member_type is not a valid ref of an existing member type'."\n";
exit(-2);
if ($typeid <= 0) {
print $langs->trans("Error") . ': Parameter id_member_type is not a valid ref of an existing member type' . "\n";
exit(- 2);
}
if (! $confirmed)
{
if (! $confirmed) {
print "Hit Enter to continue or CTRL+C to stop...\n";
$input = trim(fgets(STDIN));
}
// Load table of correspondence of countries
$hashlib2rowid=array();
$countries=array();
$hashlib2rowid = array();
$countries = array();
$sql = "SELECT rowid, code, label, active";
$sql.= " FROM ".MAIN_DB_PREFIX."c_country";
$sql.= " WHERE active = 1";
$sql.= " ORDER BY code ASC";
$resql=$db->query($sql);
if ($resql)
{
$sql .= " FROM " . MAIN_DB_PREFIX . "c_country";
$sql .= " WHERE active = 1";
$sql .= " ORDER BY code ASC";
$resql = $db->query($sql);
if ($resql) {
$num = $db->num_rows($resql);
$i = 0;
if ($num)
{
while ($i < $num)
{
if ($num) {
while ($i < $num) {
$obj = $db->fetch_object($resql);
if ($obj)
{
//print 'Load cache for country '.strtolower($obj->label).' rowid='.$obj->rowid."\n";
$hashlib2rowid[strtolower($obj->label)]=$obj->rowid;
$countries[$obj->rowid]=array('rowid' => $obj->rowid, 'label' => $obj->label, 'code' => $obj->code);
if ($obj) {
// print 'Load cache for country '.strtolower($obj->label).' rowid='.$obj->rowid."\n";
$hashlib2rowid[strtolower($obj->label)] = $obj->rowid;
$countries[$obj->rowid] = array('rowid' => $obj->rowid,'label' => $obj->label,'code' => $obj->code);
}
$i++;
$i ++;
}
}
}
else
{
} else {
dol_print_error($db);
exit(-1);
exit(- 1);
}
$ldap = new Ldap();
$result = $ldap->connect_bind();
if ($result >= 0)
{
$justthese=array();
if ($result >= 0) {
$justthese = array();
// We disable synchro Dolibarr-LDAP
$conf->global->LDAP_MEMBER_ACTIVE=0;
$conf->global->LDAP_MEMBER_ACTIVE = 0;
$ldaprecords = $ldap->getRecords('*', $conf->global->LDAP_MEMBER_DN, $conf->global->LDAP_KEY_MEMBERS, $required_fields, 'member'); // Fiter on 'member' filter param
if (is_array($ldaprecords))
{
$ldaprecords = $ldap->getRecords('*', $conf->global->LDAP_MEMBER_DN, $conf->global->LDAP_KEY_MEMBERS, $required_fields, 'member'); // Fiter on 'member' filter param
if (is_array($ldaprecords)) {
$db->begin();
// Warning $ldapuser has a key in lowercase
foreach ($ldaprecords as $key => $ldapuser)
{
foreach ($ldaprecords as $key => $ldapuser) {
$member = new Adherent($db);
// Propriete membre
$member->firstname=$ldapuser[$conf->global->LDAP_FIELD_FIRSTNAME];
$member->lastname=$ldapuser[$conf->global->LDAP_FIELD_NAME];
$member->login=$ldapuser[$conf->global->LDAP_FIELD_LOGIN];
$member->pass=$ldapuser[$conf->global->LDAP_FIELD_PASSWORD];
$member->firstname = $ldapuser[$conf->global->LDAP_FIELD_FIRSTNAME];
$member->lastname = $ldapuser[$conf->global->LDAP_FIELD_NAME];
$member->login = $ldapuser[$conf->global->LDAP_FIELD_LOGIN];
$member->pass = $ldapuser[$conf->global->LDAP_FIELD_PASSWORD];
//$member->societe;
$member->address=$ldapuser[$conf->global->LDAP_FIELD_ADDRESS];
$member->zip=$ldapuser[$conf->global->LDAP_FIELD_ZIP];
$member->town=$ldapuser[$conf->global->LDAP_FIELD_TOWN];
$member->country=$ldapuser[$conf->global->LDAP_FIELD_COUNTRY];
$member->country_id=$countries[$hashlib2rowid[strtolower($member->country)]]['rowid'];
$member->country_code=$countries[$hashlib2rowid[strtolower($member->country)]]['code'];
// $member->societe;
$member->address = $ldapuser[$conf->global->LDAP_FIELD_ADDRESS];
$member->zip = $ldapuser[$conf->global->LDAP_FIELD_ZIP];
$member->town = $ldapuser[$conf->global->LDAP_FIELD_TOWN];
$member->country = $ldapuser[$conf->global->LDAP_FIELD_COUNTRY];
$member->country_id = $countries[$hashlib2rowid[strtolower($member->country)]]['rowid'];
$member->country_code = $countries[$hashlib2rowid[strtolower($member->country)]]['code'];
$member->phone=$ldapuser[$conf->global->LDAP_FIELD_PHONE];
$member->phone_perso=$ldapuser[$conf->global->LDAP_FIELD_PHONE_PERSO];
$member->phone_mobile=$ldapuser[$conf->global->LDAP_FIELD_MOBILE];
$member->email=$ldapuser[$conf->global->LDAP_FIELD_MAIL];
$member->phone = $ldapuser[$conf->global->LDAP_FIELD_PHONE];
$member->phone_perso = $ldapuser[$conf->global->LDAP_FIELD_PHONE_PERSO];
$member->phone_mobile = $ldapuser[$conf->global->LDAP_FIELD_MOBILE];
$member->email = $ldapuser[$conf->global->LDAP_FIELD_MAIL];
$member->note=$ldapuser[$conf->global->LDAP_FIELD_DESCRIPTION];
$member->morphy='phy';
$member->photo='';
$member->public=1;
$member->birth=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_BIRTHDATE]);
$member->note = $ldapuser[$conf->global->LDAP_FIELD_DESCRIPTION];
$member->morphy = 'phy';
$member->photo = '';
$member->public = 1;
$member->birth = dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_BIRTHDATE]);
$member->statut=-1;
if (isset($ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS]))
{
$member->datec=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]);
$member->datevalid=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]);
$member->statut=$ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS];
$member->statut = - 1;
if (isset($ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS])) {
$member->datec = dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]);
$member->datevalid = dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]);
$member->statut = $ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS];
}
//if ($member->statut > 1) $member->statut=1;
// if ($member->statut > 1) $member->statut=1;
//print_r($ldapuser);
// print_r($ldapuser);
// Propriete type membre
$member->typeid=$typeid;
$member->typeid = $typeid;
// Creation membre
print $langs->transnoentities("MemberCreate").' # '.$key.': login='.$member->login.', fullname='.$member->getFullName($langs);
print ', datec='.$member->datec;
$member_id=$member->create($user);
if ($member_id > 0)
{
print ' --> Created member id='.$member_id.' login='.$member->login;
}
else
{
$error++;
print ' --> '.$member->error;
print $langs->transnoentities("MemberCreate") . ' # ' . $key . ': login=' . $member->login . ', fullname=' . $member->getFullName($langs);
print ', datec=' . $member->datec;
$member_id = $member->create($user);
if ($member_id > 0) {
print ' --> Created member id=' . $member_id . ' login=' . $member->login;
} else {
$error ++;
print ' --> ' . $member->error;
}
print "\n";
//print_r($member);
// print_r($member);
$datefirst='';
if ($conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE)
{
$datefirst=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]);
$pricefirst=price2num($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_AMOUNT]);
$datefirst = '';
if ($conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE) {
$datefirst = dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]);
$pricefirst = price2num($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_AMOUNT]);
}
$datelast='';
if ($conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE)
{
$datelast=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE]);
$pricelast=price2num($ldapuser[$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT]);
}
elseif ($conf->global->LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION)
{
$datelast=dol_time_plus_duree(dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION]), -1, 'y')+60*60*24;
$pricelast=price2num($ldapuser[$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT]);
$datelast = '';
if ($conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE) {
$datelast = dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE]);
$pricelast = price2num($ldapuser[$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT]);
} elseif ($conf->global->LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION) {
$datelast = dol_time_plus_duree(dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION]), - 1, 'y') + 60 * 60 * 24;
$pricelast = price2num($ldapuser[$conf->global->LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT]);
// Cas special ou date derniere <= date premiere
if ($datefirst && $datelast && $datelast <= $datefirst)
{
if ($datefirst && $datelast && $datelast <= $datefirst) {
// On ne va inserer que la premiere
$datelast=0;
if (! $pricefirst && $pricelast) $pricefirst = $pricelast;
$datelast = 0;
if (! $pricefirst && $pricelast)
$pricefirst = $pricelast;
}
}
// Insert first subscription
if ($datefirst)
{
if ($datefirst) {
// Cree premiere cotisation et met a jour datefin dans adherent
//print "xx".$datefirst."\n";
$crowid=$member->subscription($datefirst, $pricefirst, 0);
// print "xx".$datefirst."\n";
$crowid = $member->subscription($datefirst, $pricefirst, 0);
}
// Insert last subscription
if ($datelast)
{
if ($datelast) {
// Cree derniere cotisation et met a jour datefin dans adherent
//print "yy".dol_print_date($datelast)."\n";
$crowid=$member->subscription($datelast, $pricelast, 0);
// print "yy".dol_print_date($datelast)."\n";
$crowid = $member->subscription($datelast, $pricelast, 0);
}
}
if (! $error || $forcecommit)
{
if (! $error) print $langs->transnoentities("NoErrorCommitIsDone")."\n";
else print $langs->transnoentities("ErrorButCommitIsDone")."\n";
if (! $error || $forcecommit) {
if (! $error)
print $langs->transnoentities("NoErrorCommitIsDone") . "\n";
else
print $langs->transnoentities("ErrorButCommitIsDone") . "\n";
$db->commit();
}
else
{
print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error)."\n";
} else {
print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error) . "\n";
$db->rollback();
}
print "\n";
}
else
{
} else {
dol_print_error('', $ldap->error);
$error++;
$error ++;
}
}
else
{
} else {
dol_print_error('', $ldap->error);
$error++;
$error ++;
}
exit($error);
/**
* Function to say if a value is empty or not
*
* @param string $element Value to test
* @return boolean True of false
* @param string $element
* Value to test
* @return boolean True of false
*/
function dolValidElement($element)
{

View File

@ -1,9 +1,9 @@
#!/usr/bin/env php
<?php
/**
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2017 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2017 Regis Houssin <regis.houssin@inodbox.com>
*
* 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
@ -12,7 +12,7 @@
*
* 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
* 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
@ -20,69 +20,64 @@
*/
/**
* \file scripts/user/sync_members_types_dolibarr2ldap.php
* \ingroup ldap core
* \brief Script de mise a jour des types de membres dans LDAP depuis base Dolibarr
* \file scripts/user/sync_members_types_dolibarr2ldap.php
* \ingroup ldap core
* \brief Script de mise a jour des types de membres dans LDAP depuis base Dolibarr
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
if (! isset($argv[1]) || ! $argv[1]) {
print "Usage: ".$script_file." now\n";
exit(-1);
print "Usage: " . $script_file . " now\n";
exit(- 1);
}
$now=$argv[1];
$now = $argv[1];
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT."/adherents/class/adherent_type.class.php";
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT . "/adherents/class/adherent_type.class.php";
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
/*
if (! $conf->global->LDAP_SYNCHRO_ACTIVE)
{
print $langs->trans("LDAPSynchronizationNotSetupInDolibarr");
exit(-1);
}
*/
* if (! $conf->global->LDAP_SYNCHRO_ACTIVE)
* {
* print $langs->trans("LDAPSynchronizationNotSetupInDolibarr");
* exit(-1);
* }
*/
$sql = "SELECT rowid";
$sql .= " FROM ".MAIN_DB_PREFIX."adherent_type";
$sql .= " FROM " . MAIN_DB_PREFIX . "adherent_type";
$resql = $db->query($sql);
if ($resql)
{
if ($resql) {
$num = $db->num_rows($resql);
$i = 0;
$ldap=new Ldap();
$result=$ldap->connect_bind();
$ldap = new Ldap();
$result = $ldap->connect_bind();
if ($result > 0)
{
while ($i < $num)
{
$ldap->error="";
if ($result > 0) {
while ($i < $num) {
$ldap->error = "";
$obj = $db->fetch_object($resql);
@ -90,41 +85,35 @@ if ($resql)
$membertype->id = $obj->rowid;
$membertype->fetch($membertype->id);
print $langs->trans("UpdateMemberType")." rowid=".$membertype->id." ".$membertype-label;
print $langs->trans("UpdateMemberType") . " rowid=" . $membertype->id . " " . $membertype - label;
$oldobject=$membertype;
$oldobject = $membertype;
$oldinfo=$membertype->_load_ldap_info();
$olddn=$membertype->_load_ldap_dn($oldinfo);
$oldinfo = $membertype->_load_ldap_info();
$olddn = $membertype->_load_ldap_dn($oldinfo);
$info=$membertype->_load_ldap_info();
$dn=$membertype->_load_ldap_dn($info);
$info = $membertype->_load_ldap_info();
$dn = $membertype->_load_ldap_dn($info);
$result=$ldap->add($dn, $info, $user); // Wil fail if already exists
$result=$ldap->update($dn, $info, $user, $olddn);
if ($result > 0)
{
print " - ".$langs->trans("OK");
}
else
{
$error++;
print " - ".$langs->trans("KO").' - '.$ldap->error;
$result = $ldap->add($dn, $info, $user); // Wil fail if already exists
$result = $ldap->update($dn, $info, $user, $olddn);
if ($result > 0) {
print " - " . $langs->trans("OK");
} else {
$error ++;
print " - " . $langs->trans("KO") . ' - ' . $ldap->error;
}
print "\n";
$i++;
$i ++;
}
$ldap->unbind();
$ldap->close();
}
else {
} else {
print $ldap->error;
}
}
else
{
} else {
dol_print_error($db);
}

View File

@ -1,10 +1,10 @@
#!/usr/bin/env php
<?php
/**
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2012 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Maxime Kohlhaas <maxime@atm-consulting.fr>
* Copyright (C) 2017 Regis Houssin <regis.houssin@inodbox.com>
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2012 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Maxime Kohlhaas <maxime@atm-consulting.fr>
* Copyright (C) 2017 Regis Houssin <regis.houssin@inodbox.com>
*
* 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
@ -13,7 +13,7 @@
*
* 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
* 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
@ -21,196 +21,172 @@
*/
/**
* \file scripts/user/sync_members_types_ldap2dolibarr.php
* \ingroup ldap member
* \brief Script to update members types into Dolibarr from LDAP
* \file scripts/user/sync_members_types_ldap2dolibarr.php
* \ingroup ldap member
* \brief Script to update members types into Dolibarr from LDAP
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT."/adherents/class/adherent_type.class.php";
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/core/lib/date.lib.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT . "/adherents/class/adherent_type.class.php";
$langs->loadLangs(array("main", "errors"));
$langs->loadLangs(array("main","errors"));
// Global variables
$version=DOL_VERSION;
$error=0;
$forcecommit=0;
$confirmed=0;
$version = DOL_VERSION;
$error = 0;
$forcecommit = 0;
$confirmed = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
// List of fields to get from LDAP
$required_fields = array(
$conf->global->LDAP_KEY_MEMBERS_TYPES,
$conf->global->LDAP_MEMBER_TYPE_FIELD_FULLNAME,
$conf->global->LDAP_MEMBER_TYPE_FIELD_DESCRIPTION,
$conf->global->LDAP_MEMBER_TYPE_FIELD_GROUPMEMBERS
);
$required_fields = array($conf->global->LDAP_KEY_MEMBERS_TYPES,$conf->global->LDAP_MEMBER_TYPE_FIELD_FULLNAME,$conf->global->LDAP_MEMBER_TYPE_FIELD_DESCRIPTION,$conf->global->LDAP_MEMBER_TYPE_FIELD_GROUPMEMBERS);
// Remove from required_fields all entries not configured in LDAP (empty) and duplicated
$required_fields=array_unique(array_values(array_filter($required_fields, "dolValidElementType")));
$required_fields = array_unique(array_values(array_filter($required_fields, "dolValidElementType")));
if (! isset($argv[1])) {
//print "Usage: $script_file (nocommitiferror|commitiferror) [id_group]\n";
// print "Usage: $script_file (nocommitiferror|commitiferror) [id_group]\n";
print "Usage: $script_file (nocommitiferror|commitiferror) [--server=ldapserverhost] [--excludeuser=user1,user2...] [-y]\n";
exit(-1);
exit(- 1);
}
foreach($argv as $key => $val)
{
if ($val == 'commitiferror') $forcecommit=1;
if (preg_match('/--server=([^\s]+)$/', $val, $reg)) $conf->global->LDAP_SERVER_HOST=$reg[1];
if (preg_match('/--excludeuser=([^\s]+)$/', $val, $reg)) $excludeuser=explode(',', $reg[1]);
if (preg_match('/-y$/', $val, $reg)) $confirmed=1;
foreach ($argv as $key => $val) {
if ($val == 'commitiferror')
$forcecommit = 1;
if (preg_match('/--server=([^\s]+)$/', $val, $reg))
$conf->global->LDAP_SERVER_HOST = $reg[1];
if (preg_match('/--excludeuser=([^\s]+)$/', $val, $reg))
$excludeuser = explode(',', $reg[1]);
if (preg_match('/-y$/', $val, $reg))
$confirmed = 1;
}
print "Mails sending disabled (useless in batch mode)\n";
$conf->global->MAIN_DISABLE_ALL_MAILS=1; // On bloque les mails
$conf->global->MAIN_DISABLE_ALL_MAILS = 1; // On bloque les mails
print "\n";
print "----- Synchronize all records from LDAP database:\n";
print "host=".$conf->global->LDAP_SERVER_HOST."\n";
print "port=".$conf->global->LDAP_SERVER_PORT."\n";
print "login=".$conf->global->LDAP_ADMIN_DN."\n";
print "pass=".preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS)."\n";
print "DN to extract=".$conf->global->LDAP_MEMBER_TYPE_DN."\n";
print 'Filter=('.$conf->global->LDAP_KEY_MEMBERS_TYPES.'=*)'."\n";
print "host=" . $conf->global->LDAP_SERVER_HOST . "\n";
print "port=" . $conf->global->LDAP_SERVER_PORT . "\n";
print "login=" . $conf->global->LDAP_ADMIN_DN . "\n";
print "pass=" . preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS) . "\n";
print "DN to extract=" . $conf->global->LDAP_MEMBER_TYPE_DN . "\n";
print 'Filter=(' . $conf->global->LDAP_KEY_MEMBERS_TYPES . '=*)' . "\n";
print "----- To Dolibarr database:\n";
print "type=".$conf->db->type."\n";
print "host=".$conf->db->host."\n";
print "port=".$conf->db->port."\n";
print "login=".$conf->db->user."\n";
print "database=".$conf->db->name."\n";
print "type=" . $conf->db->type . "\n";
print "host=" . $conf->db->host . "\n";
print "port=" . $conf->db->port . "\n";
print "login=" . $conf->db->user . "\n";
print "database=" . $conf->db->name . "\n";
print "----- Options:\n";
print "commitiferror=".$forcecommit."\n";
print "Mapped LDAP fields=".join(',', $required_fields)."\n";
print "commitiferror=" . $forcecommit . "\n";
print "Mapped LDAP fields=" . join(',', $required_fields) . "\n";
print "\n";
if (! $confirmed)
{
if (! $confirmed) {
print "Hit Enter to continue or CTRL+C to stop...\n";
$input = trim(fgets(STDIN));
}
if (empty($conf->global->LDAP_MEMBER_TYPE_DN))
{
print $langs->trans("Error").': '.$langs->trans("LDAP setup for members types not defined inside Dolibarr");
exit(-1);
if (empty($conf->global->LDAP_MEMBER_TYPE_DN)) {
print $langs->trans("Error") . ': ' . $langs->trans("LDAP setup for members types not defined inside Dolibarr");
exit(- 1);
}
$ldap = new Ldap();
$result = $ldap->connect_bind();
if ($result >= 0)
{
$justthese=array();
if ($result >= 0) {
$justthese = array();
// We disable synchro Dolibarr-LDAP
$conf->global->LDAP_MEMBER_TYPE_ACTIVE=0;
$conf->global->LDAP_MEMBER_TYPE_ACTIVE = 0;
$ldaprecords = $ldap->getRecords('*', $conf->global->LDAP_MEMBER_TYPE_DN, $conf->global->LDAP_KEY_MEMBERS_TYPES, $required_fields, 0, array($conf->global->LDAP_MEMBER_TYPE_FIELD_GROUPMEMBERS));
if (is_array($ldaprecords))
{
if (is_array($ldaprecords)) {
$db->begin();
// Warning $ldapuser has a key in lowercase
foreach ($ldaprecords as $key => $ldapgroup)
{
foreach ($ldaprecords as $key => $ldapgroup) {
$membertype = new AdherentType($db);
$membertype->fetch('', $ldapgroup[$conf->global->LDAP_KEY_MEMBERS_TYPES]);
$membertype->label = $ldapgroup[$conf->global->LDAP_MEMBER_TYPE_FIELD_FULLNAME];
$membertype->description = $ldapgroup[$conf->global->LDAP_MEMBER_TYPE_FIELD_DESCRIPTION];
$membertype->entity = $conf->entity;
//print_r($ldapgroup);
// print_r($ldapgroup);
if ($membertype->id > 0) { // Member type update
print $langs->transnoentities("MemberTypeUpdate").' # '.$key.': name='.$membertype->label;
$res=$membertype->update($user);
print $langs->transnoentities("MemberTypeUpdate") . ' # ' . $key . ': name=' . $membertype->label;
$res = $membertype->update($user);
if ($res > 0)
{
print ' --> Updated member type id='.$membertype->id.' name='.$membertype->label;
}
else
{
$error++;
print ' --> '.$res.' '.$membertype->error;
if ($res > 0) {
print ' --> Updated member type id=' . $membertype->id . ' name=' . $membertype->label;
} else {
$error ++;
print ' --> ' . $res . ' ' . $membertype->error;
}
print "\n";
} else { // Member type creation
print $langs->transnoentities("MemberTypeCreate").' # '.$key.': name='.$membertype->label;
$res=$membertype->create($user);
print $langs->transnoentities("MemberTypeCreate") . ' # ' . $key . ': name=' . $membertype->label;
$res = $membertype->create($user);
if ($res > 0)
{
print ' --> Created member type id='.$membertype->id.' name='.$membertype->label;
}
else
{
$error++;
print ' --> '.$res.' '.$membertype->error;
if ($res > 0) {
print ' --> Created member type id=' . $membertype->id . ' name=' . $membertype->label;
} else {
$error ++;
print ' --> ' . $res . ' ' . $membertype->error;
}
print "\n";
}
//print_r($membertype);
// print_r($membertype);
}
if (! $error || $forcecommit)
{
if (! $error) print $langs->transnoentities("NoErrorCommitIsDone")."\n";
else print $langs->transnoentities("ErrorButCommitIsDone")."\n";
if (! $error || $forcecommit) {
if (! $error)
print $langs->transnoentities("NoErrorCommitIsDone") . "\n";
else
print $langs->transnoentities("ErrorButCommitIsDone") . "\n";
$db->commit();
}
else
{
print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error)."\n";
} else {
print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error) . "\n";
$db->rollback();
}
print "\n";
}
else
{
} else {
dol_print_error('', $ldap->error);
$error++;
$error ++;
}
}
else
{
} else {
dol_print_error('', $ldap->error);
$error++;
$error ++;
}
exit($error);
/**
* Function to say if a value is empty or not
*
* @param string $element Value to test
* @return boolean True of false
* @param string $element
* Value to test
* @return boolean True of false
*/
function dolValidElementType($element)
{

View File

@ -1,7 +1,7 @@
#!/usr/bin/env php
<?php
/*
* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net>
*
* 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
@ -10,99 +10,94 @@
*
* 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
* 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, see <http://www.gnu.org/licenses/>.
*/
/**
* \file scripts/modulebuilder/builddoc.php
* \ingroup modulebuilder
* \brief Script to build a documentation from input files (.asciidoc or .md files). Use asciidoctor tool.
* \file scripts/modulebuilder/builddoc.php
* \ingroup modulebuilder
* \brief Script to build a documentation from input files (.asciidoc or .md files).
* Use asciidoctor tool.
*
* If file is a MD file, convert image links into asciidoc format.
* ![Screenshot patient card](img/dolimed_screenshot_patientcard.png?raw=true "Patient card")
* image:img/dolimed_screenshot_patientcard.png[Screenshot patient card]
* If file is a MD file, convert image links into asciidoc format.
* ![Screenshot patient card](img/dolimed_screenshot_patientcard.png?raw=true "Patient card")
* image:img/dolimed_screenshot_patientcard.png[Screenshot patient card]
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
if (! isset($argv[1]) || ! $argv[1]) {
print "Usage: ".$script_file." ModuleName\n";
exit(-1);
print "Usage: " . $script_file . " ModuleName\n";
exit(- 1);
}
$modulename=$argv[1];
$modulename = $argv[1];
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/modulebuilder.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/utils.class.php';
$langs->loadLangs(array("admin", "modulebuilder", "other", "cron"));
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php';
require_once DOL_DOCUMENT_ROOT . '/core/class/html.formadmin.class.php';
require_once DOL_DOCUMENT_ROOT . '/core/lib/modulebuilder.lib.php';
require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php';
require_once DOL_DOCUMENT_ROOT . '/core/class/utils.class.php';
$langs->loadLangs(array("admin","modulebuilder","other","cron"));
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
// Dir for custom dirs
$tmp=explode(',', $dolibarr_main_document_root_alt);
$tmp = explode(',', $dolibarr_main_document_root_alt);
$dirins = $tmp[0];
$dirread = $dirins;
$forceddirread = 0;
$tmpdir = explode('@', $module);
if (! empty($tmpdir[1]))
{
$module=$tmpdir[0];
$dirread=$tmpdir[1];
$forceddirread=1;
if (! empty($tmpdir[1])) {
$module = $tmpdir[0];
$dirread = $tmpdir[1];
$forceddirread = 1;
}
$FILEFLAG='modulebuilder.txt';
$FILEFLAG = 'modulebuilder.txt';
$now=dol_now();
$now = dol_now();
$newmask = 0;
if (empty($newmask) && ! empty($conf->global->MAIN_UMASK)) $newmask=$conf->global->MAIN_UMASK;
if (empty($newmask)) // This should no happen
if (empty($newmask) && ! empty($conf->global->MAIN_UMASK))
$newmask = $conf->global->MAIN_UMASK;
if (empty($newmask)) // This should no happen
{
$newmask='0664';
$newmask = '0664';
}
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
print "modulename=".$modulename."\n";
print "dirins=".$dirins."\n";
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
print "modulename=" . $modulename . "\n";
print "dirins=" . $dirins . "\n";
$FILENAMEDOC=strtolower($module).'.html'; // TODO Use/text PDF
$dirofmodule = dol_buildpath(strtolower($module), 0).'/doc';
$outputfiledoc = $dirofmodule.'/'.$FILENAMEDOC;
$FILENAMEDOC = strtolower($module) . '.html'; // TODO Use/text PDF
$dirofmodule = dol_buildpath(strtolower($module), 0) . '/doc';
$outputfiledoc = $dirofmodule . '/' . $FILENAMEDOC;
$util = new Utils($db);
$result = $util->generateDoc($module);
if ($result <= 0)
{
if ($result <= 0) {
print $util->errors;
exit(1);
}

View File

@ -1,7 +1,7 @@
#!/usr/bin/env php
<?php
/*
* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2013 Laurent Destailleur <eldy@users.sourceforge.net>
*
* 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
@ -10,165 +10,138 @@
*
* 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
* 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, see <http://www.gnu.org/licenses/>.
*/
/**
* \file scripts/modulebuilder/initmodule.php
* \ingroup modulebuilder
* \brief Script to initialize a module.
* \file scripts/modulebuilder/initmodule.php
* \ingroup modulebuilder
* \brief Script to initialize a module.
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
if (! isset($argv[1]) || ! $argv[1]) {
print "Usage: ".$script_file." ModuleName\n";
exit(-1);
print "Usage: " . $script_file . " ModuleName\n";
exit(- 1);
}
$modulename=$argv[1];
$modulename = $argv[1];
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/modulebuilder.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
$langs->loadLangs(array("admin", "modulebuilder", "other", "cron"));
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php';
require_once DOL_DOCUMENT_ROOT . '/core/class/html.formadmin.class.php';
require_once DOL_DOCUMENT_ROOT . '/core/lib/modulebuilder.lib.php';
require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php';
$langs->loadLangs(array("admin","modulebuilder","other","cron"));
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
// Dir for custom dirs
$tmp=explode(',', $dolibarr_main_document_root_alt);
$tmp = explode(',', $dolibarr_main_document_root_alt);
$dirins = $tmp[0];
$dirread = $dirins;
$forceddirread = 0;
$tmpdir = explode('@', $module);
if (! empty($tmpdir[1]))
{
$module=$tmpdir[0];
$dirread=$tmpdir[1];
$forceddirread=1;
if (! empty($tmpdir[1])) {
$module = $tmpdir[0];
$dirread = $tmpdir[1];
$forceddirread = 1;
}
$FILEFLAG='modulebuilder.txt';
$FILEFLAG = 'modulebuilder.txt';
$now=dol_now();
$now = dol_now();
$newmask = 0;
if (empty($newmask) && ! empty($conf->global->MAIN_UMASK)) $newmask=$conf->global->MAIN_UMASK;
if (empty($newmask)) // This should no happen
if (empty($newmask) && ! empty($conf->global->MAIN_UMASK))
$newmask = $conf->global->MAIN_UMASK;
if (empty($newmask)) // This should no happen
{
$newmask='0664';
$newmask = '0664';
}
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
print "modulename=".$modulename."\n";
print "dirins=".$dirins."\n";
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
print "modulename=" . $modulename . "\n";
print "dirins=" . $dirins . "\n";
if (preg_match('/[^a-z0-9_]/i', $modulename))
{
$error++;
print 'Error '.$langs->trans("SpaceOrSpecialCharAreNotAllowed")."\n";
if (preg_match('/[^a-z0-9_]/i', $modulename)) {
$error ++;
print 'Error ' . $langs->trans("SpaceOrSpecialCharAreNotAllowed") . "\n";
exit(1);
}
if (! $error)
{
$srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template';
$destdir = $dirins.'/'.strtolower($modulename);
if (! $error) {
$srcdir = DOL_DOCUMENT_ROOT . '/modulebuilder/template';
$destdir = $dirins . '/' . strtolower($modulename);
$arrayreplacement=array(
'mymodule'=>strtolower($modulename),
'MyModule'=>$modulename
);
$arrayreplacement = array('mymodule' => strtolower($modulename),'MyModule' => $modulename);
$result = dolCopyDir($srcdir, $destdir, 0, 0, $arrayreplacement);
//dol_mkdir($destfile);
if ($result <= 0)
{
if ($result < 0)
{
$error++;
// dol_mkdir($destfile);
if ($result <= 0) {
if ($result < 0) {
$error ++;
$langs->load("errors");
print $langs->trans("ErrorFailToCopyDir", $srcdir, $destdir)."\n";
print $langs->trans("ErrorFailToCopyDir", $srcdir, $destdir) . "\n";
exit(2);
}
else // $result == 0
} else // $result == 0
{
print $langs->trans("AllFilesDidAlreadyExist", $srcdir, $destdir)."\n";
print $langs->trans("AllFilesDidAlreadyExist", $srcdir, $destdir) . "\n";
}
}
// Delete some files
dol_delete_file($destdir.'/myobject_card.php');
dol_delete_file($destdir.'/myobject_note.php');
dol_delete_file($destdir.'/myobject_document.php');
dol_delete_file($destdir.'/myobject_agenda.php');
dol_delete_file($destdir.'/myobject_list.php');
dol_delete_file($destdir.'/lib/myobject.lib.php');
dol_delete_file($destdir.'/test/phpunit/MyObjectTest.php');
dol_delete_file($destdir.'/sql/llx_mymodule_myobject.sql');
dol_delete_file($destdir.'/sql/llx_mymodule_myobject_extrafields.sql');
dol_delete_file($destdir.'/sql/llx_mymodule_myobject.key.sql');
dol_delete_file($destdir.'/scripts/myobject.php');
dol_delete_file($destdir.'/img/object_myobject.png');
dol_delete_file($destdir.'/class/myobject.class.php');
dol_delete_file($destdir.'/class/api_mymodule.class.php');
dol_delete_file($destdir . '/myobject_card.php');
dol_delete_file($destdir . '/myobject_note.php');
dol_delete_file($destdir . '/myobject_document.php');
dol_delete_file($destdir . '/myobject_agenda.php');
dol_delete_file($destdir . '/myobject_list.php');
dol_delete_file($destdir . '/lib/myobject.lib.php');
dol_delete_file($destdir . '/test/phpunit/MyObjectTest.php');
dol_delete_file($destdir . '/sql/llx_mymodule_myobject.sql');
dol_delete_file($destdir . '/sql/llx_mymodule_myobject_extrafields.sql');
dol_delete_file($destdir . '/sql/llx_mymodule_myobject.key.sql');
dol_delete_file($destdir . '/scripts/myobject.php');
dol_delete_file($destdir . '/img/object_myobject.png');
dol_delete_file($destdir . '/class/myobject.class.php');
dol_delete_file($destdir . '/class/api_mymodule.class.php');
}
// Edit PHP files
if (! $error)
{
if (! $error) {
$listofphpfilestoedit = dol_dir_list($destdir, 'files', 1, '\.(php|MD|js|sql|txt|xml|lang)$', '', 'fullname', SORT_ASC, 0, 1);
foreach($listofphpfilestoedit as $phpfileval)
{
//var_dump($phpfileval['fullname']);
$arrayreplacement=array(
'mymodule'=>strtolower($modulename),
'MyModule'=>$modulename,
'MYMODULE'=>strtoupper($modulename),
'My module'=>$modulename,
'my module'=>$modulename,
'Mon module'=>$modulename,
'mon module'=>$modulename,
'htdocs/modulebuilder/template'=>strtolower($modulename),
'---Put here your own copyright and developer email---'=>dol_print_date($now, '%Y').' '.$user->getFullName($langs).($user->email?' <'.$user->email.'>':'')
);
foreach ($listofphpfilestoedit as $phpfileval) {
// var_dump($phpfileval['fullname']);
$arrayreplacement = array('mymodule' => strtolower($modulename),'MyModule' => $modulename,'MYMODULE' => strtoupper($modulename),'My module' => $modulename,'my module' => $modulename,'Mon module' => $modulename,'mon module' => $modulename,'htdocs/modulebuilder/template' => strtolower($modulename),'---Put here your own copyright and developer email---' => dol_print_date($now, '%Y') . ' ' . $user->getFullName($langs) . ($user->email ? ' <' . $user->email . '>' : ''));
$result=dolReplaceInFile($phpfileval['fullname'], $arrayreplacement);
//var_dump($result);
if ($result < 0)
{
print $langs->trans("ErrorFailToMakeReplacementInto", $phpfileval['fullname'])."\n";
$result = dolReplaceInFile($phpfileval['fullname'], $arrayreplacement);
// var_dump($result);
if ($result < 0) {
print $langs->trans("ErrorFailToMakeReplacementInto", $phpfileval['fullname']) . "\n";
exit(3);
}
}
}
print 'Module initialized'."\n";
print 'Module initialized' . "\n";
exit(0);

View File

@ -1,7 +1,8 @@
#!/usr/bin/env php
<?php
/* Copyright (C) 2007-2016 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2015 Jean Heimburger <http://tiaris.eu>
/*
* Copyright (C) 2007-2016 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2015 Jean Heimburger <http://tiaris.eu>
*
* 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
@ -10,7 +11,7 @@
*
* 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
* 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
@ -18,86 +19,76 @@
*/
/**
* \file scripts/product/migrate_picture_path.php
* \ingroup scripts
* \brief Migrate pictures from old system prior to 3.7 to new path for 3.7+
* \file scripts/product/migrate_picture_path.php
* \ingroup scripts
* \brief Migrate pictures from old system prior to 3.7 to new path for 3.7+
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
@set_time_limit(0); // No timeout for this script
define('EVEN_IF_ONLY_LOGIN_ALLOWED', 1); // Set this define to 0 if you want to lock your script when dolibarr setup is "locked to admin user only".
@set_time_limit(0); // No timeout for this script
define('EVEN_IF_ONLY_LOGIN_ALLOWED', 1); // Set this define to 0 if you want to lock your script when dolibarr setup is "locked to admin user only".
// Include and load Dolibarr environment variables
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/product/class/product.class.php";
require_once DOL_DOCUMENT_ROOT."/core/lib/files.lib.php";
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/product/class/product.class.php";
require_once DOL_DOCUMENT_ROOT . "/core/lib/files.lib.php";
// After this $db, $mysoc, $langs, $conf and $hookmanager are defined (Opened $db handler to database will be closed at end of file).
// $user is created but empty.
//$langs->setDefaultLang('en_US'); // To change default language of $langs
$langs->load("main"); // To load language file for default language
// $langs->setDefaultLang('en_US'); // To change default language of $langs
$langs->load("main"); // To load language file for default language
// Global variables
$version=DOL_VERSION;
$error=0;
$forcecommit=0;
$version = DOL_VERSION;
$error = 0;
$forcecommit = 0;
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
if (! isset($argv[1]) || $argv[1] != 'product') {
print "Usage: $script_file product\n";
exit(-1);
print "Usage: $script_file product\n";
exit(- 1);
}
print '--- start'."\n";
print '--- start' . "\n";
// Case to migrate products path
if ($argv[1] == 'product')
{
if ($argv[1] == 'product') {
$product = new Product($db);
$sql = "SELECT rowid as pid from ".MAIN_DB_PREFIX."product"; // Get list of all products
$sql = "SELECT rowid as pid from " . MAIN_DB_PREFIX . "product"; // Get list of all products
$resql = $db->query($sql);
if ($resql)
{
while ($obj = $db->fetch_object($resql))
{
if ($resql) {
while ($obj = $db->fetch_object($resql)) {
$product->fetch($obj->pid);
print " migrating product id=".$product->id." ref=".$product->ref."\n";
print " migrating product id=" . $product->id . " ref=" . $product->ref . "\n";
migrate_product_photospath($product);
}
}
else
{
print "\n sql error ".$sql;
exit;
} else {
print "\n sql error " . $sql;
exit();
}
}
$db->close(); // Close $db database opened handler
$db->close(); // Close $db database opened handler
exit($error);
/**
* Migrate file from old path to new one for product $product
*
* @param Product $product Object product
* @return void
* @param Product $product
* Object product
* @return void
*/
function migrate_product_photospath($product)
{
@ -105,43 +96,34 @@ function migrate_product_photospath($product)
$dir = $conf->product->multidir_output[$product->entity];
$conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO = 1;
$origin = $dir .'/'. get_exdir($product->id, 2, 0, 0, $product, 'product') . $product->id ."/photos";
$destin = $dir.'/'.dol_sanitizeFileName($product->ref);
$origin = $dir . '/' . get_exdir($product->id, 2, 0, 0, $product, 'product') . $product->id . "/photos";
$destin = $dir . '/' . dol_sanitizeFileName($product->ref);
$error = 0;
$origin_osencoded=dol_osencode($origin);
$destin_osencoded=dol_osencode($destin);
$origin_osencoded = dol_osencode($origin);
$destin_osencoded = dol_osencode($destin);
dol_mkdir($destin);
if (dol_is_dir($origin))
{
$handle=opendir($origin_osencoded);
if (is_resource($handle))
{
while (($file = readdir($handle)) !== false)
{
if ($file != '.' && $file != '..' && is_dir($origin_osencoded.'/'.$file))
{
$thumbs = opendir($origin_osencoded.'/'.$file);
if (is_resource($thumbs))
{
dol_mkdir($destin.'/'.$file);
while (($thumb = readdir($thumbs)) !== false)
{
dol_move($origin.'/'.$file.'/'.$thumb, $destin.'/'.$file.'/'.$thumb);
}
// dol_delete_dir($origin.'/'.$file);
}
}
else
{
if (dol_is_file($origin.'/'.$file) )
{
dol_move($origin.'/'.$file, $destin.'/'.$file);
}
}
}
}
if (dol_is_dir($origin)) {
$handle = opendir($origin_osencoded);
if (is_resource($handle)) {
while (($file = readdir($handle)) !== false) {
if ($file != '.' && $file != '..' && is_dir($origin_osencoded . '/' . $file)) {
$thumbs = opendir($origin_osencoded . '/' . $file);
if (is_resource($thumbs)) {
dol_mkdir($destin . '/' . $file);
while (($thumb = readdir($thumbs)) !== false) {
dol_move($origin . '/' . $file . '/' . $thumb, $destin . '/' . $file . '/' . $thumb);
}
// dol_delete_dir($origin.'/'.$file);
}
} else {
if (dol_is_file($origin . '/' . $file)) {
dol_move($origin . '/' . $file, $destin . '/' . $file);
}
}
}
}
}
}

View File

@ -1,7 +1,8 @@
#!/usr/bin/env php
<?php
/* Copyright (C) 2007-2016 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2015 Jean Heimburger <http://tiaris.eu>
/*
* Copyright (C) 2007-2016 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2015 Jean Heimburger <http://tiaris.eu>
*
* 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
@ -10,7 +11,7 @@
*
* 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
* 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
@ -18,90 +19,85 @@
*/
/**
* \file scripts/product/migrate_picture_path.php
* \ingroup scripts
* \brief Migrate pictures from old system prior to 3.7 to new path for 3.7+
* \file scripts/product/migrate_picture_path.php
* \ingroup scripts
* \brief Migrate pictures from old system prior to 3.7 to new path for 3.7+
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
@set_time_limit(0); // No timeout for this script
define('EVEN_IF_ONLY_LOGIN_ALLOWED', 1); // Set this define to 0 if you want to lock your script when dolibarr setup is "locked to admin user only".
@set_time_limit(0); // No timeout for this script
define('EVEN_IF_ONLY_LOGIN_ALLOWED', 1); // Set this define to 0 if you want to lock your script when dolibarr setup is "locked to admin user only".
// Include and load Dolibarr environment variables
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/product/class/product.class.php";
require_once DOL_DOCUMENT_ROOT."/core/lib/files.lib.php";
require_once DOL_DOCUMENT_ROOT."/core/lib/images.lib.php";
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/product/class/product.class.php";
require_once DOL_DOCUMENT_ROOT . "/core/lib/files.lib.php";
require_once DOL_DOCUMENT_ROOT . "/core/lib/images.lib.php";
// After this $db, $mysoc, $langs, $conf and $hookmanager are defined (Opened $db handler to database will be closed at end of file).
// $user is created but empty.
//$langs->setDefaultLang('en_US'); // To change default language of $langs
$langs->load("main"); // To load language file for default language
// $langs->setDefaultLang('en_US'); // To change default language of $langs
$langs->load("main"); // To load language file for default language
// Global variables
$version=DOL_VERSION;
$error=0;
$forcecommit=0;
$version = DOL_VERSION;
$error = 0;
$forcecommit = 0;
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
if (empty($argv[1])) {
print "Usage: $script_file subdirtoscan\n";
print "Example: $script_file produit\n";
exit(-1);
print "Usage: $script_file subdirtoscan\n";
print "Example: $script_file produit\n";
exit(- 1);
}
print '--- start'."\n";
print '--- start' . "\n";
$dir = DOL_DATA_ROOT;
$subdir=$argv[1];
if (empty($dir) || empty($subdir))
{
$subdir = $argv[1];
if (empty($dir) || empty($subdir)) {
dol_print_error('', 'dir not defined');
exit(1);
}
if (! dol_is_dir($dir.'/'.$subdir))
{
print 'Directory '.$dir.'/'.$subdir.' not found.'."\n";
if (! dol_is_dir($dir . '/' . $subdir)) {
print 'Directory ' . $dir . '/' . $subdir . ' not found.' . "\n";
exit(2);
}
$filearray=dol_dir_list($dir.'/'.$subdir, "directories", 0, '', 'temp$');
$filearray = dol_dir_list($dir . '/' . $subdir, "directories", 0, '', 'temp$');
global $maxwidthsmall, $maxheightsmall, $maxwidthmini, $maxheightmini;
foreach($filearray as $keyf => $valf)
{
$ref=basename($valf['name']);
$filearrayimg=dol_dir_list($valf['fullname'], "files", 0, '(\.gif|\.png|\.jpg|\.jpeg|\.bmp)$', '(\.meta|_preview.*\.png)$');
foreach($filearrayimg as $keyi => $vali)
{
print 'Process image for ref '.$ref.' : '.$vali['name']."\n";
foreach ($filearray as $keyf => $valf) {
$ref = basename($valf['name']);
$filearrayimg = dol_dir_list($valf['fullname'], "files", 0, '(\.gif|\.png|\.jpg|\.jpeg|\.bmp)$', '(\.meta|_preview.*\.png)$');
foreach ($filearrayimg as $keyi => $vali) {
print 'Process image for ref ' . $ref . ' : ' . $vali['name'] . "\n";
// Create small thumbs for image
// Used on logon for example
$imgThumbSmall = vignette($vali['fullname'], $maxwidthsmall, $maxheightsmall, '_small', 50, "thumbs");
if (preg_match('/Error/', $imgThumbSmall)) print $imgThumbSmall."\n";
if (preg_match('/Error/', $imgThumbSmall))
print $imgThumbSmall . "\n";
// Create mini thumbs for image (Ratio is near 16/9)
// Used on menu or for setup page for example
$imgThumbMini = vignette($vali['fullname'], $maxwidthmini, $maxheightmini, '_mini', 50, "thumbs");
if (preg_match('/Error/', $imgThumbMini)) print $imgThumbMini."\n";
if (preg_match('/Error/', $imgThumbMini))
print $imgThumbMini . "\n";
}
}
$db->close(); // Close $db database opened handler
$db->close(); // Close $db database opened handler
exit($error);

View File

@ -2,7 +2,7 @@
<?php
/**
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2006 Laurent Destailleur <eldy@users.sourceforge.net>
*
* 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
@ -11,7 +11,7 @@
*
* 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
* 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
@ -19,67 +19,63 @@
*/
/**
* \file scripts/user/sync_groups_dolibarr2ldap.php
* \ingroup ldap core
* \brief Script de mise a jour des groupes dans LDAP depuis base Dolibarr
* \file scripts/user/sync_groups_dolibarr2ldap.php
* \ingroup ldap core
* \brief Script de mise a jour des groupes dans LDAP depuis base Dolibarr
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
if (! isset($argv[1]) || ! $argv[1]) {
print "Usage: ".$script_file." now\n";
exit(-1);
print "Usage: " . $script_file . " now\n";
exit(- 1);
}
$now=$argv[1];
$now = $argv[1];
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT."/user/class/usergroup.class.php";
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT . "/user/class/usergroup.class.php";
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
/*
if (! $conf->global->LDAP_SYNCHRO_ACTIVE)
{
print $langs->trans("LDAPSynchronizationNotSetupInDolibarr");
exit(-1);
}
*/
* if (! $conf->global->LDAP_SYNCHRO_ACTIVE)
* {
* print $langs->trans("LDAPSynchronizationNotSetupInDolibarr");
* exit(-1);
* }
*/
$sql = "SELECT rowid";
$sql .= " FROM ".MAIN_DB_PREFIX."usergroup";
$sql .= " FROM " . MAIN_DB_PREFIX . "usergroup";
$resql = $db->query($sql);
if ($resql)
{
if ($resql) {
$num = $db->num_rows($resql);
$i = 0;
$ldap=new Ldap();
$ldap = new Ldap();
$ldap->connect_bind();
while ($i < $num)
{
$ldap->error="";
while ($i < $num) {
$ldap->error = "";
$obj = $db->fetch_object($resql);
@ -87,37 +83,32 @@ if ($resql)
$fgroup->id = $obj->rowid;
$fgroup->fetch($fgroup->id);
print $langs->trans("UpdateGroup")." rowid=".$fgroup->id." ".$fgroup->name;
print $langs->trans("UpdateGroup") . " rowid=" . $fgroup->id . " " . $fgroup->name;
$oldobject=$fgroup;
$oldobject = $fgroup;
$oldinfo=$oldobject->_load_ldap_info();
$olddn=$oldobject->_load_ldap_dn($oldinfo);
$oldinfo = $oldobject->_load_ldap_info();
$olddn = $oldobject->_load_ldap_dn($oldinfo);
$info=$fgroup->_load_ldap_info();
$dn=$fgroup->_load_ldap_dn($info);
$info = $fgroup->_load_ldap_info();
$dn = $fgroup->_load_ldap_dn($info);
$result=$ldap->add($dn, $info, $user); // Wil fail if already exists
$result=$ldap->update($dn, $info, $user, $olddn);
if ($result > 0)
{
print " - ".$langs->trans("OK");
}
else
{
$error++;
print " - ".$langs->trans("KO").' - '.$ldap->error;
$result = $ldap->add($dn, $info, $user); // Wil fail if already exists
$result = $ldap->update($dn, $info, $user, $olddn);
if ($result > 0) {
print " - " . $langs->trans("OK");
} else {
$error ++;
print " - " . $langs->trans("KO") . ' - ' . $ldap->error;
}
print "\n";
$i++;
$i ++;
}
$ldap->unbind();
$ldap->close();
}
else
{
} else {
dol_print_error($db);
}

View File

@ -1,9 +1,9 @@
#!/usr/bin/env php
<?php
/**
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2012 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Maxime Kohlhaas <maxime@atm-consulting.fr>
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2012 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2013 Maxime Kohlhaas <maxime@atm-consulting.fr>
*
* 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
@ -12,7 +12,7 @@
*
* 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
* 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
@ -20,182 +20,166 @@
*/
/**
* \file scripts/user/sync_groups_ldap2dolibarr.php
* \ingroup ldap member
* \brief Script to update groups into Dolibarr from LDAP
* \file scripts/user/sync_groups_ldap2dolibarr.php
* \ingroup ldap member
* \brief Script to update groups into Dolibarr from LDAP
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT."/user/class/user.class.php";
require_once DOL_DOCUMENT_ROOT."/user/class/usergroup.class.php";
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/core/lib/date.lib.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT . "/user/class/user.class.php";
require_once DOL_DOCUMENT_ROOT . "/user/class/usergroup.class.php";
$langs->loadLangs(array("main", "errors"));
$langs->loadLangs(array("main","errors"));
// Global variables
$version=DOL_VERSION;
$error=0;
$forcecommit=0;
$confirmed=0;
$version = DOL_VERSION;
$error = 0;
$forcecommit = 0;
$confirmed = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
// List of fields to get from LDAP
$required_fields = array(
$conf->global->LDAP_KEY_GROUPS,
$conf->global->LDAP_GROUP_FIELD_FULLNAME,
$conf->global->LDAP_GROUP_FIELD_DESCRIPTION,
$conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS
);
$required_fields = array($conf->global->LDAP_KEY_GROUPS,$conf->global->LDAP_GROUP_FIELD_FULLNAME,$conf->global->LDAP_GROUP_FIELD_DESCRIPTION,$conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS);
// Remove from required_fields all entries not configured in LDAP (empty) and duplicated
$required_fields=array_unique(array_values(array_filter($required_fields, "dolValidElement")));
$required_fields = array_unique(array_values(array_filter($required_fields, "dolValidElement")));
if (! isset($argv[1])) {
//print "Usage: $script_file (nocommitiferror|commitiferror) [id_group]\n";
// print "Usage: $script_file (nocommitiferror|commitiferror) [id_group]\n";
print "Usage: $script_file (nocommitiferror|commitiferror) [--server=ldapserverhost] [--excludeuser=user1,user2...] [-y]\n";
exit(-1);
exit(- 1);
}
foreach($argv as $key => $val)
{
if ($val == 'commitiferror') $forcecommit=1;
if (preg_match('/--server=([^\s]+)$/', $val, $reg)) $conf->global->LDAP_SERVER_HOST=$reg[1];
if (preg_match('/--excludeuser=([^\s]+)$/', $val, $reg)) $excludeuser=explode(',', $reg[1]);
if (preg_match('/-y$/', $val, $reg)) $confirmed=1;
foreach ($argv as $key => $val) {
if ($val == 'commitiferror')
$forcecommit = 1;
if (preg_match('/--server=([^\s]+)$/', $val, $reg))
$conf->global->LDAP_SERVER_HOST = $reg[1];
if (preg_match('/--excludeuser=([^\s]+)$/', $val, $reg))
$excludeuser = explode(',', $reg[1]);
if (preg_match('/-y$/', $val, $reg))
$confirmed = 1;
}
print "Mails sending disabled (useless in batch mode)\n";
$conf->global->MAIN_DISABLE_ALL_MAILS=1; // On bloque les mails
$conf->global->MAIN_DISABLE_ALL_MAILS = 1; // On bloque les mails
print "\n";
print "----- Synchronize all records from LDAP database:\n";
print "host=".$conf->global->LDAP_SERVER_HOST."\n";
print "port=".$conf->global->LDAP_SERVER_PORT."\n";
print "login=".$conf->global->LDAP_ADMIN_DN."\n";
print "pass=".preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS)."\n";
print "DN to extract=".$conf->global->LDAP_GROUP_DN."\n";
print 'Filter=('.$conf->global->LDAP_KEY_GROUPS.'=*)'."\n";
print "host=" . $conf->global->LDAP_SERVER_HOST . "\n";
print "port=" . $conf->global->LDAP_SERVER_PORT . "\n";
print "login=" . $conf->global->LDAP_ADMIN_DN . "\n";
print "pass=" . preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS) . "\n";
print "DN to extract=" . $conf->global->LDAP_GROUP_DN . "\n";
print 'Filter=(' . $conf->global->LDAP_KEY_GROUPS . '=*)' . "\n";
print "----- To Dolibarr database:\n";
print "type=".$conf->db->type."\n";
print "host=".$conf->db->host."\n";
print "port=".$conf->db->port."\n";
print "login=".$conf->db->user."\n";
print "database=".$conf->db->name."\n";
print "type=" . $conf->db->type . "\n";
print "host=" . $conf->db->host . "\n";
print "port=" . $conf->db->port . "\n";
print "login=" . $conf->db->user . "\n";
print "database=" . $conf->db->name . "\n";
print "----- Options:\n";
print "commitiferror=".$forcecommit."\n";
print "Mapped LDAP fields=".join(',', $required_fields)."\n";
print "commitiferror=" . $forcecommit . "\n";
print "Mapped LDAP fields=" . join(',', $required_fields) . "\n";
print "\n";
if (! $confirmed)
{
if (! $confirmed) {
print "Hit Enter to continue or CTRL+C to stop...\n";
$input = trim(fgets(STDIN));
}
if (empty($conf->global->LDAP_GROUP_DN))
{
print $langs->trans("Error").': '.$langs->trans("LDAP setup for groups not defined inside Dolibarr");
exit(-1);
if (empty($conf->global->LDAP_GROUP_DN)) {
print $langs->trans("Error") . ': ' . $langs->trans("LDAP setup for groups not defined inside Dolibarr");
exit(- 1);
}
$ldap = new Ldap();
$result = $ldap->connect_bind();
if ($result >= 0)
{
$justthese=array();
if ($result >= 0) {
$justthese = array();
// We disable synchro Dolibarr-LDAP
$conf->global->LDAP_SYNCHRO_ACTIVE=0;
$conf->global->LDAP_SYNCHRO_ACTIVE = 0;
$ldaprecords = $ldap->getRecords('*', $conf->global->LDAP_GROUP_DN, $conf->global->LDAP_KEY_GROUPS, $required_fields, 0, array($conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS));
if (is_array($ldaprecords))
{
if (is_array($ldaprecords)) {
$db->begin();
// Warning $ldapuser has a key in lowercase
foreach ($ldaprecords as $key => $ldapgroup)
{
foreach ($ldaprecords as $key => $ldapgroup) {
$group = new UserGroup($db);
$group->fetch('', $ldapgroup[$conf->global->LDAP_KEY_GROUPS]);
$group->name = $ldapgroup[$conf->global->LDAP_GROUP_FIELD_FULLNAME];
$group->nom = $group->name; // For backward compatibility
$group->nom = $group->name; // For backward compatibility
$group->note = $ldapgroup[$conf->global->LDAP_GROUP_FIELD_DESCRIPTION];
$group->entity = $conf->entity;
//print_r($ldapgroup);
// print_r($ldapgroup);
if($group->id > 0) { // Group update
print $langs->transnoentities("GroupUpdate").' # '.$key.': name='.$group->name;
$res=$group->update();
if ($group->id > 0) { // Group update
print $langs->transnoentities("GroupUpdate") . ' # ' . $key . ': name=' . $group->name;
$res = $group->update();
if ($res > 0)
{
print ' --> Updated group id='.$group->id.' name='.$group->name;
}
else
{
$error++;
print ' --> '.$res.' '.$group->error;
if ($res > 0) {
print ' --> Updated group id=' . $group->id . ' name=' . $group->name;
} else {
$error ++;
print ' --> ' . $res . ' ' . $group->error;
}
print "\n";
} else { // Group creation
print $langs->transnoentities("GroupCreate").' # '.$key.': name='.$group->name;
$res=$group->create();
print $langs->transnoentities("GroupCreate") . ' # ' . $key . ': name=' . $group->name;
$res = $group->create();
if ($res > 0)
{
print ' --> Created group id='.$group->id.' name='.$group->name;
}
else
{
$error++;
print ' --> '.$res.' '.$group->error;
if ($res > 0) {
print ' --> Created group id=' . $group->id . ' name=' . $group->name;
} else {
$error ++;
print ' --> ' . $res . ' ' . $group->error;
}
print "\n";
}
//print_r($group);
// print_r($group);
// Gestion des utilisateurs associés au groupe
// 1 - Association des utilisateurs du groupe LDAP au groupe Dolibarr
$userList = array();
$userIdList = array();
foreach($ldapgroup[$conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS] as $key => $userdn) {
if($key === 'count') continue;
if(empty($userList[$userdn])) { // Récupération de l'utilisateur
// Schéma rfc2307: les membres sont listés dans l'attribut memberUid sous form de login uniquement
if ($conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS === 'memberUid'){
foreach ($ldapgroup[$conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS] as $key => $userdn) {
if ($key === 'count')
continue;
if (empty($userList[$userdn])) { // Récupération de l'utilisateur
// Schéma rfc2307: les membres sont listés dans l'attribut memberUid sous form de login uniquement
if ($conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS === 'memberUid') {
$userKey = array($userdn);
} else { // Pour les autres schémas, les membres sont listés sous forme de DN complets
$userFilter = explode(',', $userdn);
$userKey = $ldap->getAttributeValues('('.$userFilter[0].')', $conf->global->LDAP_KEY_USERS);
$userKey = $ldap->getAttributeValues('(' . $userFilter[0] . ')', $conf->global->LDAP_KEY_USERS);
}
if(!is_array($userKey)) continue;
if (! is_array($userKey))
continue;
$fuser = new User($db);
if($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_SID) {
if ($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_SID) {
$fuser->fetch('', '', $userKey[0]); // Chargement du user concerné par le SID
} elseif ($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_LOGIN) {
$fuser->fetch('', $userKey[0]); // Chargement du user concerné par le login
@ -209,55 +193,49 @@ if ($result >= 0)
$userIdList[$userdn] = $fuser->id;
// Ajout de l'utilisateur dans le groupe
if(!in_array($fuser->id, array_keys($group->members))) {
if (! in_array($fuser->id, array_keys($group->members))) {
$fuser->SetInGroup($group->id, $group->entity);
echo $fuser->login.' added'."\n";
echo $fuser->login . ' added' . "\n";
}
}
// 2 - Suppression des utilisateurs du groupe Dolibarr qui ne sont plus dans le groupe LDAP
foreach ($group->members as $guser) {
if(!in_array($guser->id, $userIdList)) {
if (! in_array($guser->id, $userIdList)) {
$guser->RemoveFromGroup($group->id, $group->entity);
echo $guser->login.' removed'."\n";
echo $guser->login . ' removed' . "\n";
}
}
}
if (! $error || $forcecommit)
{
if (! $error) print $langs->transnoentities("NoErrorCommitIsDone")."\n";
else print $langs->transnoentities("ErrorButCommitIsDone")."\n";
if (! $error || $forcecommit) {
if (! $error)
print $langs->transnoentities("NoErrorCommitIsDone") . "\n";
else
print $langs->transnoentities("ErrorButCommitIsDone") . "\n";
$db->commit();
}
else
{
print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error)."\n";
} else {
print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error) . "\n";
$db->rollback();
}
print "\n";
}
else
{
} else {
dol_print_error('', $ldap->error);
$error++;
$error ++;
}
}
else
{
} else {
dol_print_error('', $ldap->error);
$error++;
$error ++;
}
exit($error);
/**
* Function to say if a value is empty or not
*
* @param string $element Value to test
* @return boolean True of false
* @param string $element
* Value to test
* @return boolean True of false
*/
function dolValidElement($element)
{

View File

@ -2,7 +2,7 @@
<?php
/**
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2006 Laurent Destailleur <eldy@users.sourceforge.net>
*
* 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
@ -11,7 +11,7 @@
*
* 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
* 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
@ -19,104 +19,95 @@
*/
/**
* \file scripts/user/sync_users_dolibarr2ldap.php
* \ingroup ldap core
* \brief Script de mise a jour des users dans LDAP depuis base Dolibarr
* \file scripts/user/sync_users_dolibarr2ldap.php
* \ingroup ldap core
* \brief Script de mise a jour des users dans LDAP depuis base Dolibarr
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
if (! isset($argv[1]) || ! $argv[1]) {
print "Usage: $script_file now\n";
exit(-1);
print "Usage: $script_file now\n";
exit(- 1);
}
$now=$argv[1];
$now = $argv[1];
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT."/user/class/user.class.php";
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT . "/user/class/user.class.php";
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
/*
if (! $conf->global->LDAP_SYNCHRO_ACTIVE)
{
print $langs->trans("LDAPSynchronizationNotSetupInDolibarr");
exit(-1);
}
*/
* if (! $conf->global->LDAP_SYNCHRO_ACTIVE)
* {
* print $langs->trans("LDAPSynchronizationNotSetupInDolibarr");
* exit(-1);
* }
*/
$sql = "SELECT rowid";
$sql .= " FROM ".MAIN_DB_PREFIX."user";
$sql .= " FROM " . MAIN_DB_PREFIX . "user";
$resql = $db->query($sql);
if ($resql)
{
if ($resql) {
$num = $db->num_rows($resql);
$i = 0;
$ldap=new Ldap();
$ldap = new Ldap();
$ldap->connect_bind();
while ($i < $num)
{
$ldap->error="";
while ($i < $num) {
$ldap->error = "";
$obj = $db->fetch_object($resql);
$fuser = new User($db);
$fuser->fetch($obj->rowid);
print $langs->trans("UpdateUser")." rowid=".$fuser->id." ".$fuser->getFullName($langs);
print $langs->trans("UpdateUser") . " rowid=" . $fuser->id . " " . $fuser->getFullName($langs);
$oldobject=$fuser;
$oldobject = $fuser;
$oldinfo=$oldobject->_load_ldap_info();
$olddn=$oldobject->_load_ldap_dn($oldinfo);
$oldinfo = $oldobject->_load_ldap_info();
$olddn = $oldobject->_load_ldap_dn($oldinfo);
$info=$fuser->_load_ldap_info();
$dn=$fuser->_load_ldap_dn($info);
$info = $fuser->_load_ldap_info();
$dn = $fuser->_load_ldap_dn($info);
$result=$ldap->add($dn, $info, $user); // Wil fail if already exists
$result=$ldap->update($dn, $info, $user, $olddn);
if ($result > 0)
{
print " - ".$langs->trans("OK");
}
else
{
$error++;
print " - ".$langs->trans("KO").' - '.$ldap->error;
$result = $ldap->add($dn, $info, $user); // Wil fail if already exists
$result = $ldap->update($dn, $info, $user, $olddn);
if ($result > 0) {
print " - " . $langs->trans("OK");
} else {
$error ++;
print " - " . $langs->trans("KO") . ' - ' . $ldap->error;
}
print "\n";
$i++;
$i ++;
}
$ldap->unbind();
$ldap->close();
}
else
{
} else {
dol_print_error($db);
}

View File

@ -1,8 +1,8 @@
#!/usr/bin/env php
<?php
/**
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2012 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2006-2012 Laurent Destailleur <eldy@users.sourceforge.net>
*
* 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
@ -11,7 +11,7 @@
*
* 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
* 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
@ -19,301 +19,266 @@
*/
/**
* \file scripts/user/sync_users_ldap2dolibarr.php
* \ingroup ldap member
* \brief Script to update users into Dolibarr from LDAP
* \file scripts/user/sync_users_ldap2dolibarr.php
* \ingroup ldap member
* \brief Script to update users into Dolibarr from LDAP
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/core/lib/date.lib.php";
require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT."/user/class/user.class.php";
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/core/lib/date.lib.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT . "/user/class/user.class.php";
$langs->loadLangs(array("main", "errors"));
$langs->loadLangs(array("main","errors"));
// Global variables
$version=DOL_VERSION;
$error=0;
$forcecommit=0;
$excludeuser=array();
$confirmed=0;
$version = DOL_VERSION;
$error = 0;
$forcecommit = 0;
$excludeuser = array();
$confirmed = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
// List of fields to get from LDAP
$required_fields = array(
$conf->global->LDAP_KEY_USERS,
$conf->global->LDAP_FIELD_FULLNAME,
$conf->global->LDAP_FIELD_NAME,
$conf->global->LDAP_FIELD_FIRSTNAME,
$conf->global->LDAP_FIELD_LOGIN,
$conf->global->LDAP_FIELD_LOGIN_SAMBA,
$conf->global->LDAP_FIELD_PASSWORD,
$conf->global->LDAP_FIELD_PASSWORD_CRYPTED,
$conf->global->LDAP_FIELD_PHONE,
$conf->global->LDAP_FIELD_FAX,
$conf->global->LDAP_FIELD_MOBILE,
//$conf->global->LDAP_FIELD_ADDRESS,
//$conf->global->LDAP_FIELD_ZIP,
//$conf->global->LDAP_FIELD_TOWN,
//$conf->global->LDAP_FIELD_COUNTRY,
$conf->global->LDAP_FIELD_MAIL,
$conf->global->LDAP_FIELD_TITLE,
$conf->global->LDAP_FIELD_DESCRIPTION,
$conf->global->LDAP_FIELD_SID
);
$required_fields = array($conf->global->LDAP_KEY_USERS,$conf->global->LDAP_FIELD_FULLNAME,$conf->global->LDAP_FIELD_NAME,$conf->global->LDAP_FIELD_FIRSTNAME,$conf->global->LDAP_FIELD_LOGIN,$conf->global->LDAP_FIELD_LOGIN_SAMBA,$conf->global->LDAP_FIELD_PASSWORD,$conf->global->LDAP_FIELD_PASSWORD_CRYPTED,$conf->global->LDAP_FIELD_PHONE,$conf->global->LDAP_FIELD_FAX,$conf->global->LDAP_FIELD_MOBILE,
// $conf->global->LDAP_FIELD_ADDRESS,
// $conf->global->LDAP_FIELD_ZIP,
// $conf->global->LDAP_FIELD_TOWN,
// $conf->global->LDAP_FIELD_COUNTRY,
$conf->global->LDAP_FIELD_MAIL,$conf->global->LDAP_FIELD_TITLE,$conf->global->LDAP_FIELD_DESCRIPTION,$conf->global->LDAP_FIELD_SID);
// Remove from required_fields all entries not configured in LDAP (empty) and duplicated
$required_fields=array_unique(array_values(array_filter($required_fields, "dolValidElement")));
$required_fields = array_unique(array_values(array_filter($required_fields, "dolValidElement")));
if (! isset($argv[1])) {
print "Usage: $script_file (nocommitiferror|commitiferror) [--server=ldapserverhost] [--excludeuser=user1,user2...] [-y]\n";
exit(-1);
exit(- 1);
}
foreach($argv as $key => $val)
{
if ($val == 'commitiferror') $forcecommit=1;
if (preg_match('/--server=([^\s]+)$/', $val, $reg)) $conf->global->LDAP_SERVER_HOST=$reg[1];
if (preg_match('/--excludeuser=([^\s]+)$/', $val, $reg)) $excludeuser=explode(',', $reg[1]);
if (preg_match('/-y$/', $val, $reg)) $confirmed=1;
foreach ($argv as $key => $val) {
if ($val == 'commitiferror')
$forcecommit = 1;
if (preg_match('/--server=([^\s]+)$/', $val, $reg))
$conf->global->LDAP_SERVER_HOST = $reg[1];
if (preg_match('/--excludeuser=([^\s]+)$/', $val, $reg))
$excludeuser = explode(',', $reg[1]);
if (preg_match('/-y$/', $val, $reg))
$confirmed = 1;
}
print "Mails sending disabled (useless in batch mode)\n";
$conf->global->MAIN_DISABLE_ALL_MAILS=1; // On bloque les mails
$conf->global->MAIN_DISABLE_ALL_MAILS = 1; // On bloque les mails
print "\n";
print "----- Synchronize all records from LDAP database:\n";
print "host=".$conf->global->LDAP_SERVER_HOST."\n";
print "port=".$conf->global->LDAP_SERVER_PORT."\n";
print "login=".$conf->global->LDAP_ADMIN_DN."\n";
print "pass=".preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS)."\n";
print "DN to extract=".$conf->global->LDAP_USER_DN."\n";
if (! empty($conf->global->LDAP_FILTER_CONNECTION)) print 'Filter=('.$conf->global->LDAP_FILTER_CONNECTION.')'."\n"; // Note: filter is defined into function getRecords
else print 'Filter=('.$conf->global->LDAP_KEY_USERS.'=*)'."\n";
print "host=" . $conf->global->LDAP_SERVER_HOST . "\n";
print "port=" . $conf->global->LDAP_SERVER_PORT . "\n";
print "login=" . $conf->global->LDAP_ADMIN_DN . "\n";
print "pass=" . preg_replace('/./i', '*', $conf->global->LDAP_ADMIN_PASS) . "\n";
print "DN to extract=" . $conf->global->LDAP_USER_DN . "\n";
if (! empty($conf->global->LDAP_FILTER_CONNECTION))
print 'Filter=(' . $conf->global->LDAP_FILTER_CONNECTION . ')' . "\n"; // Note: filter is defined into function getRecords
else
print 'Filter=(' . $conf->global->LDAP_KEY_USERS . '=*)' . "\n";
print "----- To Dolibarr database:\n";
print "type=".$conf->db->type."\n";
print "host=".$conf->db->host."\n";
print "port=".$conf->db->port."\n";
print "login=".$conf->db->user."\n";
print "database=".$conf->db->name."\n";
print "type=" . $conf->db->type . "\n";
print "host=" . $conf->db->host . "\n";
print "port=" . $conf->db->port . "\n";
print "login=" . $conf->db->user . "\n";
print "database=" . $conf->db->name . "\n";
print "----- Options:\n";
print "commitiferror=".$forcecommit."\n";
print "excludeuser=".join(',', $excludeuser)."\n";
print "Mapped LDAP fields=".join(',', $required_fields)."\n";
print "commitiferror=" . $forcecommit . "\n";
print "excludeuser=" . join(',', $excludeuser) . "\n";
print "Mapped LDAP fields=" . join(',', $required_fields) . "\n";
print "\n";
if (! $confirmed)
{
if (! $confirmed) {
print "Hit Enter to continue or CTRL+C to stop...\n";
$input = trim(fgets(STDIN));
}
if (empty($conf->global->LDAP_USER_DN))
{
print $langs->trans("Error").': '.$langs->trans("LDAP setup for users not defined inside Dolibarr");
exit(-1);
if (empty($conf->global->LDAP_USER_DN)) {
print $langs->trans("Error") . ': ' . $langs->trans("LDAP setup for users not defined inside Dolibarr");
exit(- 1);
}
// Load table of correspondence of countries
$hashlib2rowid=array();
$countries=array();
$hashlib2rowid = array();
$countries = array();
$sql = "SELECT rowid, code, label, active";
$sql.= " FROM ".MAIN_DB_PREFIX."c_country";
$sql.= " WHERE active = 1";
$sql.= " ORDER BY code ASC";
$resql=$db->query($sql);
if ($resql)
{
$sql .= " FROM " . MAIN_DB_PREFIX . "c_country";
$sql .= " WHERE active = 1";
$sql .= " ORDER BY code ASC";
$resql = $db->query($sql);
if ($resql) {
$num = $db->num_rows($resql);
$i = 0;
if ($num)
{
while ($i < $num)
{
if ($num) {
while ($i < $num) {
$obj = $db->fetch_object($resql);
if ($obj)
{
//print 'Load cache for country '.strtolower($obj->label).' rowid='.$obj->rowid."\n";
$hashlib2rowid[strtolower($obj->label)]=$obj->rowid;
$countries[$obj->rowid]=array('rowid' => $obj->rowid, 'label' => $obj->label, 'code' => $obj->code);
if ($obj) {
// print 'Load cache for country '.strtolower($obj->label).' rowid='.$obj->rowid."\n";
$hashlib2rowid[strtolower($obj->label)] = $obj->rowid;
$countries[$obj->rowid] = array('rowid' => $obj->rowid,'label' => $obj->label,'code' => $obj->code);
}
$i++;
$i ++;
}
}
}
else
{
} else {
dol_print_error($db);
exit(-1);
exit(- 1);
}
$ldap = new Ldap();
$result = $ldap->connect_bind();
if ($result >= 0)
{
$justthese=array();
if ($result >= 0) {
$justthese = array();
// We disable synchro Dolibarr-LDAP
$conf->global->LDAP_SYNCHRO_ACTIVE=0;
$conf->global->LDAP_SYNCHRO_ACTIVE = 0;
$ldaprecords = $ldap->getRecords('*', $conf->global->LDAP_USER_DN, $conf->global->LDAP_KEY_USERS, $required_fields, 'user'); // Fiter on 'user' filter param
if (is_array($ldaprecords))
{
$ldaprecords = $ldap->getRecords('*', $conf->global->LDAP_USER_DN, $conf->global->LDAP_KEY_USERS, $required_fields, 'user'); // Fiter on 'user' filter param
if (is_array($ldaprecords)) {
$db->begin();
// Warning $ldapuser has a key in lowercase
foreach ($ldaprecords as $key => $ldapuser)
{
foreach ($ldaprecords as $key => $ldapuser) {
// If login into exclude list, we discard record
if (in_array($ldapuser[$conf->global->LDAP_FIELD_LOGIN], $excludeuser))
{
print $langs->transnoentities("UserDiscarded").' # '.$key.': login='.$ldapuser[$conf->global->LDAP_FIELD_LOGIN].' --> Discarded'."\n";
if (in_array($ldapuser[$conf->global->LDAP_FIELD_LOGIN], $excludeuser)) {
print $langs->transnoentities("UserDiscarded") . ' # ' . $key . ': login=' . $ldapuser[$conf->global->LDAP_FIELD_LOGIN] . ' --> Discarded' . "\n";
continue;
}
$fuser = new User($db);
if($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_SID) {
if ($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_SID) {
$fuser->fetch('', '', $ldapuser[$conf->global->LDAP_KEY_USERS]); // Chargement du user concerné par le SID
} elseif ($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_LOGIN) {
$fuser->fetch('', $ldapuser[$conf->global->LDAP_KEY_USERS]); // Chargement du user concerné par le login
}
// Propriete membre
$fuser->firstname=$ldapuser[$conf->global->LDAP_FIELD_FIRSTNAME];
$fuser->lastname=$ldapuser[$conf->global->LDAP_FIELD_NAME];
$fuser->login=$ldapuser[$conf->global->LDAP_FIELD_LOGIN];
$fuser->pass=$ldapuser[$conf->global->LDAP_FIELD_PASSWORD];
$fuser->pass_indatabase_crypted=$ldapuser[$conf->global->LDAP_FIELD_PASSWORD_CRYPTED];
$fuser->firstname = $ldapuser[$conf->global->LDAP_FIELD_FIRSTNAME];
$fuser->lastname = $ldapuser[$conf->global->LDAP_FIELD_NAME];
$fuser->login = $ldapuser[$conf->global->LDAP_FIELD_LOGIN];
$fuser->pass = $ldapuser[$conf->global->LDAP_FIELD_PASSWORD];
$fuser->pass_indatabase_crypted = $ldapuser[$conf->global->LDAP_FIELD_PASSWORD_CRYPTED];
//$user->societe;
// $user->societe;
/*
$fuser->address=$ldapuser[$conf->global->LDAP_FIELD_ADDRESS];
$fuser->zip=$ldapuser[$conf->global->LDAP_FIELD_ZIP];
$fuser->town=$ldapuser[$conf->global->LDAP_FIELD_TOWN];
$fuser->country=$ldapuser[$conf->global->LDAP_FIELD_COUNTRY];
$fuser->country_id=$countries[$hashlib2rowid[strtolower($fuser->country)]]['rowid'];
$fuser->country_code=$countries[$hashlib2rowid[strtolower($fuser->country)]]['code'];
*/
* $fuser->address=$ldapuser[$conf->global->LDAP_FIELD_ADDRESS];
* $fuser->zip=$ldapuser[$conf->global->LDAP_FIELD_ZIP];
* $fuser->town=$ldapuser[$conf->global->LDAP_FIELD_TOWN];
* $fuser->country=$ldapuser[$conf->global->LDAP_FIELD_COUNTRY];
* $fuser->country_id=$countries[$hashlib2rowid[strtolower($fuser->country)]]['rowid'];
* $fuser->country_code=$countries[$hashlib2rowid[strtolower($fuser->country)]]['code'];
*/
$fuser->office_phone=$ldapuser[$conf->global->LDAP_FIELD_PHONE];
$fuser->user_mobile=$ldapuser[$conf->global->LDAP_FIELD_MOBILE];
$fuser->office_fax=$ldapuser[$conf->global->LDAP_FIELD_FAX];
$fuser->email=$ldapuser[$conf->global->LDAP_FIELD_MAIL];
$fuser->ldap_sid=$ldapuser[$conf->global->LDAP_FIELD_SID];
$fuser->office_phone = $ldapuser[$conf->global->LDAP_FIELD_PHONE];
$fuser->user_mobile = $ldapuser[$conf->global->LDAP_FIELD_MOBILE];
$fuser->office_fax = $ldapuser[$conf->global->LDAP_FIELD_FAX];
$fuser->email = $ldapuser[$conf->global->LDAP_FIELD_MAIL];
$fuser->ldap_sid = $ldapuser[$conf->global->LDAP_FIELD_SID];
$fuser->job=$ldapuser[$conf->global->LDAP_FIELD_TITLE];
$fuser->note=$ldapuser[$conf->global->LDAP_FIELD_DESCRIPTION];
$fuser->admin=0;
$fuser->societe_id=0;
$fuser->contact_id=0;
$fuser->fk_member=0;
$fuser->job = $ldapuser[$conf->global->LDAP_FIELD_TITLE];
$fuser->note = $ldapuser[$conf->global->LDAP_FIELD_DESCRIPTION];
$fuser->admin = 0;
$fuser->societe_id = 0;
$fuser->contact_id = 0;
$fuser->fk_member = 0;
$fuser->statut=1;
$fuser->statut = 1;
// TODO : revoir la gestion du status
/*if (isset($ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS]))
{
$fuser->datec=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]);
$fuser->datevalid=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]);
$fuser->statut=$ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS];
}*/
//if ($fuser->statut > 1) $fuser->statut=1;
/*
* if (isset($ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS]))
* {
* $fuser->datec=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]);
* $fuser->datevalid=dol_stringtotime($ldapuser[$conf->global->LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE]);
* $fuser->statut=$ldapuser[$conf->global->LDAP_FIELD_MEMBER_STATUS];
* }
*/
// if ($fuser->statut > 1) $fuser->statut=1;
//print_r($ldapuser);
// print_r($ldapuser);
if($fuser->id > 0) { // User update
print $langs->transnoentities("UserUpdate").' # '.$key.': login='.$fuser->login.', fullname='.$fuser->getFullName($langs);
$res=$fuser->update($user);
if ($fuser->id > 0) { // User update
print $langs->transnoentities("UserUpdate") . ' # ' . $key . ': login=' . $fuser->login . ', fullname=' . $fuser->getFullName($langs);
$res = $fuser->update($user);
if ($res < 0)
{
$error++;
print ' --> '.$res.' '.$fuser->error;
}
else
{
print ' --> Updated user id='.$fuser->id.' login='.$fuser->login;
if ($res < 0) {
$error ++;
print ' --> ' . $res . ' ' . $fuser->error;
} else {
print ' --> Updated user id=' . $fuser->id . ' login=' . $fuser->login;
}
} else { // User creation
print $langs->transnoentities("UserCreate").' # '.$key.': login='.$fuser->login.', fullname='.$fuser->getFullName($langs);
$res=$fuser->create($user);
print $langs->transnoentities("UserCreate") . ' # ' . $key . ': login=' . $fuser->login . ', fullname=' . $fuser->getFullName($langs);
$res = $fuser->create($user);
if ($res > 0)
{
print ' --> Created user id='.$fuser->id.' login='.$fuser->login;
}
else
{
$error++;
print ' --> '.$res.' '.$fuser->error;
if ($res > 0) {
print ' --> Created user id=' . $fuser->id . ' login=' . $fuser->login;
} else {
$error ++;
print ' --> ' . $res . ' ' . $fuser->error;
}
}
print "\n";
//print_r($fuser);
// print_r($fuser);
// Gestion des groupes
// TODO : revoir la gestion des groupes (ou script de sync groupes)
/*if(!$error) {
foreach ($ldapuser[$conf->global->LDAP_FIELD_USERGROUPS] as $groupdn) {
$groupdn;
}
}*/
/*
* if(!$error) {
* foreach ($ldapuser[$conf->global->LDAP_FIELD_USERGROUPS] as $groupdn) {
* $groupdn;
* }
* }
*/
}
if (! $error || $forcecommit)
{
if (! $error) print $langs->transnoentities("NoErrorCommitIsDone")."\n";
else print $langs->transnoentities("ErrorButCommitIsDone")."\n";
if (! $error || $forcecommit) {
if (! $error)
print $langs->transnoentities("NoErrorCommitIsDone") . "\n";
else
print $langs->transnoentities("ErrorButCommitIsDone") . "\n";
$db->commit();
}
else
{
print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error)."\n";
} else {
print $langs->transnoentities("ErrorSomeErrorWereFoundRollbackIsDone", $error) . "\n";
$db->rollback();
}
print "\n";
}
else
{
} else {
dol_print_error('', $ldap->error);
$error++;
$error ++;
}
}
else
{
} else {
dol_print_error('', $ldap->error);
$error++;
$error ++;
}
exit($error);
/**
* Function to say if a value is empty or not
*
* @param string $element Value to test
* @return boolean True of false
* @param string $element
* Value to test
* @return boolean True of false
*/
function dolValidElement($element)
{

View File

@ -1,8 +1,8 @@
#!/usr/bin/env php
<?php
/*
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2005-2010 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2005-2010 Laurent Destailleur <eldy@users.sourceforge.net>
*
* 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
@ -11,7 +11,7 @@
*
* 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
* 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
@ -19,39 +19,37 @@
*/
/**
* \file scripts/withdrawals/build_withdrawal_file.php
* \ingroup prelevement
* \brief Script de prelevement
* \file scripts/withdrawals/build_withdrawal_file.php
* \ingroup prelevement
* \brief Script de prelevement
*/
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path=dirname(__FILE__).'/';
$path = __DIR__ . '/';
// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n";
exit(-1);
echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
exit(- 1);
}
require_once $path."../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT."/compta/prelevement/class/bonprelevement.class.php";
require_once DOL_DOCUMENT_ROOT."/compta/facture/class/facture.class.php";
require_once DOL_DOCUMENT_ROOT."/societe/class/societe.class.php";
require_once DOL_DOCUMENT_ROOT."/compta/paiement/class/paiement.class.php";
require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/compta/prelevement/class/bonprelevement.class.php";
require_once DOL_DOCUMENT_ROOT . "/compta/facture/class/facture.class.php";
require_once DOL_DOCUMENT_ROOT . "/societe/class/societe.class.php";
require_once DOL_DOCUMENT_ROOT . "/compta/paiement/class/paiement.class.php";
// Global variables
$version=DOL_VERSION;
$error=0;
$version = DOL_VERSION;
$error = 0;
/*
* Main
*/
@set_time_limit(0);
print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n";
dol_syslog($script_file." launched with arg ".join(',', $argv));
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));
$datetimeprev = dol_now();
@ -61,18 +59,16 @@ $year = strftime("%Y", $datetimeprev);
$user = new user($db);
$user->fetch($conf->global->PRELEVEMENT_USER);
if (! isset($argv[1])) { // Check parameters
print "This script check invoices with a withdrawal request and\n";
print "then create payment and build a withdraw file.\n";
print "Usage: ".$script_file." simu|real\n";
exit(-1);
if (! isset($argv[1])) { // Check parameters
print "This script check invoices with a withdrawal request and\n";
print "then create payment and build a withdraw file.\n";
print "Usage: " . $script_file . " simu|real\n";
exit(- 1);
}
$withdrawreceipt=new BonPrelevement($db);
$withdrawreceipt = new BonPrelevement($db);
// $conf->global->PRELEVEMENT_CODE_BANQUE and $conf->global->PRELEVEMENT_CODE_GUICHET should be empty
$result=$withdrawreceipt->create($conf->global->PRELEVEMENT_CODE_BANQUE, $conf->global->PRELEVEMENT_CODE_GUICHET, $argv[1]);
$result = $withdrawreceipt->create($conf->global->PRELEVEMENT_CODE_BANQUE, $conf->global->PRELEVEMENT_CODE_GUICHET, $argv[1]);
$db->close();