Merge branch 'develop' of git@github.com:Dolibarr/dolibarr.git into develop

This commit is contained in:
Laurent Destailleur 2014-02-25 10:01:43 +01:00
commit 67d44f2cb8
4 changed files with 136 additions and 95 deletions

View File

@ -34,7 +34,7 @@ require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php';
$langs->load("mails");
$langs->load("bills"); $langs->load("bills");
$id = (GETPOST('facid','int') ? GETPOST('facid','int') : GETPOST('id','int')); $id = (GETPOST('facid','int') ? GETPOST('facid','int') : GETPOST('id','int'));
@ -57,10 +57,16 @@ $resultmasssend='';
*/ */
// Send remind email // Send remind email
if ($action == 'presend' && GETPOST('cancel')) $action=''; if ($action == 'presend' && GETPOST('cancel'))
{
$action='';
if (GETPOST('models')=='facture_relance') $mode='sendmassremind'; // If we made a cancel from submit email form, this means we must be into mode=sendmassremind
}
if ($action == 'presend' && GETPOST('sendmail')) if ($action == 'presend' && GETPOST('sendmail'))
{ {
if (GETPOST('models')=='facture_relance') $mode='sendmassremind'; // If we made a cancel from submit email form, this means we must be into mode=sendmassremind
if (!isset($user->email)) if (!isset($user->email))
{ {
$error++; $error++;
@ -73,10 +79,10 @@ if ($action == 'presend' && GETPOST('sendmail'))
$error++; $error++;
setEventMessage("InvoiceNotChecked","warnings"); setEventMessage("InvoiceNotChecked","warnings");
} }
if (! $error) if (! $error)
{ {
$compteEmailEnvoi = 0; $nbsent = 0;
$nbignored = 0; $nbignored = 0;
for ($i = 0; $i < $countToSend; $i++) for ($i = 0; $i < $countToSend; $i++)
@ -86,13 +92,19 @@ if ($action == 'presend' && GETPOST('sendmail'))
if ($result > 0) // Invoice was found if ($result > 0) // Invoice was found
{ {
if ($object->statut != 1) continue; // Payment done or started or canceled if ($object->statut != 1)
{
continue; // Payment done or started or canceled
}
// Read PDF // Read document
$filename=dol_sanitizeFileName($object->ref); // TODO Use future field $object->fullpathdoc to know where is stored default file
// TODO If not defined, use $object->modelpdf (or defaut invoice config) to know what is template to use to regenerate doc.
$filename=dol_sanitizeFileName($object->ref).'.pdf';
$filedir=$conf->facture->dir_output . '/' . dol_sanitizeFileName($object->ref); $filedir=$conf->facture->dir_output . '/' . dol_sanitizeFileName($object->ref);
$file = $filedir . '/' . $filename.'.pdf'; // TODO What if ODT ? $file = $filedir . '/' . $filename;
$mime = 'application/pdf';
if (dol_is_file($file)) if (dol_is_file($file))
{ {
$object->fetch_thirdparty(); $object->fetch_thirdparty();
@ -105,10 +117,21 @@ if ($action == 'presend' && GETPOST('sendmail'))
$langs->load("commercial"); $langs->load("commercial");
$from = $user->getFullName($langs) . ' <' . $user->email .'>'; $from = $user->getFullName($langs) . ' <' . $user->email .'>';
$replyto = $from; $replyto = $from;
$message = $conf->global->RELANCES_MASSE_TEXTE_EMAIL; $subject = GETPOST('subject');
$subject = $conf->global->RELANCES_MASSE_OBJET_EMAIL; $message = GETPOST('message');
$sendtocc = GETPOST('sentocc');
$substitutionarray=make_substitutions($message, $substitutionarray);
$substitutionarray=array(
'__ID__' => $object->id,
'__EMAIL__' => $object->thirdparty->email,
'__CHECK_READ__' => '<img src="'.DOL_MAIN_URL_ROOT.'/public/emailing/mailing-read.php?tag='.$obj2->tag.'&securitykey='.urlencode($conf->global->MAILING_EMAIL_UNSUBSCRIBE_KEY).'" width="1" height="1" style="width:1px;height:1px" border="0"/>',
//'__LASTNAME__' => $obj2->lastname,
//'__FIRSTNAME__' => $obj2->firstname,
'__REF__' => $object->ref,
'__REFCLIENT__' => $object->thirdparty->name
);
$message=make_substitutions($message, $substitutionarray);
$actiontypecode='AC_FAC'; $actiontypecode='AC_FAC';
$actionmsg=$langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto.".\n"; $actionmsg=$langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto.".\n";
@ -118,12 +141,9 @@ if ($action == 'presend' && GETPOST('sendmail'))
$actionmsg.=$langs->transnoentities('TextUsedInTheMessageBody').":\n"; $actionmsg.=$langs->transnoentities('TextUsedInTheMessageBody').":\n";
$actionmsg.=$message; $actionmsg.=$message;
} }
// Create form object
include_once(DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php'); // Create form object
$formmail = new FormMail($db); $attachedfiles=array('paths'=>array($file), 'names'=>array($filename), 'mimes'=>array($mime));
$formmail->clear_attached_files();
$formmail->add_attached_files($file, $object->ref.'.pdf', 'application/pdf');
$attachedfiles=$formmail->get_attached_files();
$filepath = $attachedfiles['paths']; $filepath = $attachedfiles['paths'];
$filename = $attachedfiles['names']; $filename = $attachedfiles['names'];
$mimetype = $attachedfiles['mimes']; $mimetype = $attachedfiles['mimes'];
@ -137,7 +157,7 @@ if ($action == 'presend' && GETPOST('sendmail'))
} }
else else
{ {
$result=$mailfile->sendfile(); //$result=$mailfile->sendfile();
if ($result) if ($result)
{ {
$resultmasssend.=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($from,2),$mailfile->getValidAddress($sendto,2)); // Must not contain " $resultmasssend.=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($from,2),$mailfile->getValidAddress($sendto,2)); // Must not contain "
@ -159,42 +179,53 @@ if ($action == 'presend' && GETPOST('sendmail'))
if ($result < 0) { $error++; $this->errors=$interface->errors; } if ($result < 0) { $error++; $this->errors=$interface->errors; }
// Fin appel triggers // Fin appel triggers
if ($error) if (! $error)
{
$resultmasssend.=$langs->trans("MailSent").': '.$sendto."<br>\n";
}
else
{ {
dol_print_error($db); dol_print_error($db);
} }
$compteEmailEnvoi ++; $nbsent++;
} }
else else
{ {
$langs->load("other"); $langs->load("other");
$resultmasssend.='<div class="error">';
if ($mailfile->error) if ($mailfile->error)
{ {
$resultmasssend.=$langs->trans('ErrorFailedToSendMail',$from,$sendto); $resultmasssend.=$langs->trans('ErrorFailedToSendMail',$from,$sendto);
$resultmasssend.='<br>'.$mailfile->error; $resultmasssend.='<br><div class="error">'.$mailfile->error.'</div>';
} }
else else
{ {
$resultmasssend.='No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS'; $resultmasssend.='<div class="warning">No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS</div>';
} }
$resultmasssend.='</div>';
} }
} }
} }
} }
else else
{ {
$nbignored++;
$langs->load("other"); $langs->load("other");
print $resultmasssend='<div class="error">'.$langs->trans('ErrorCantReadFile',$file).'</div>'; $resultmasssend.='<div class="error">'.$langs->trans('ErrorCantReadFile',$file).'</div>';
dol_syslog('Failed to read file: '.$file); dol_syslog('Failed to read file: '.$file);
break ; break ;
} }
} }
} }
setEventMessage($compteEmailEnvoi. '/'.$countToSend.' '.$langs->trans("RemindSent")); if ($nbsent)
{
$action=''; // Do not show form post if there was at least one successfull sent
setEventMessage($nbsent. '/'.$countToSend.' '.$langs->trans("RemindSent"));
}
else
{
setEventMessage($langs->trans("NoRemindSent"), 'warnings');
}
} }
} }
@ -349,7 +380,7 @@ if (! $sortorder) $sortorder="ASC";
$limit = $conf->liste_limit; $limit = $conf->liste_limit;
$sql = "SELECT s.nom, s.rowid as socid"; $sql = "SELECT s.nom, s.rowid as socid, s.email";
$sql.= ", f.rowid as facid, f.facnumber, f.increment, f.total as total_ht, f.tva as total_tva, f.total_ttc, f.localtax1, f.localtax2, f.revenuestamp"; $sql.= ", f.rowid as facid, f.facnumber, f.increment, f.total as total_ht, f.tva as total_tva, f.total_ttc, f.localtax1, f.localtax2, f.revenuestamp";
$sql.= ", f.datef as df, f.date_lim_reglement as datelimite"; $sql.= ", f.datef as df, f.date_lim_reglement as datelimite";
$sql.= ", f.paye as paye, f.fk_statut, f.type"; $sql.= ", f.paye as paye, f.fk_statut, f.type";
@ -380,7 +411,7 @@ if ($search_societe) $sql .= " AND s.nom LIKE '%".$db->escape($search_societ
if ($search_montant_ht) $sql .= " AND f.total = '".$db->escape($search_montant_ht)."'"; if ($search_montant_ht) $sql .= " AND f.total = '".$db->escape($search_montant_ht)."'";
if ($search_montant_ttc) $sql .= " AND f.total_ttc = '".$db->escape($search_montant_ttc)."'"; if ($search_montant_ttc) $sql .= " AND f.total_ttc = '".$db->escape($search_montant_ttc)."'";
if (GETPOST('sf_ref')) $sql .= " AND f.facnumber LIKE '%".$db->escape(GETPOST('sf_ref'))."%'"; if (GETPOST('sf_ref')) $sql .= " AND f.facnumber LIKE '%".$db->escape(GETPOST('sf_ref'))."%'";
$sql.= " GROUP BY s.nom, s.rowid, f.rowid, f.facnumber, f.increment, f.total, f.tva, f.total_ttc, f.localtax1, f.localtax2, f.revenuestamp, f.datef, f.date_lim_reglement, f.paye, f.fk_statut, f.type "; $sql.= " GROUP BY s.nom, s.rowid, s.email, f.rowid, f.facnumber, f.increment, f.total, f.tva, f.total_ttc, f.localtax1, f.localtax2, f.revenuestamp, f.datef, f.date_lim_reglement, f.paye, f.fk_statut, f.type ";
if (! $user->rights->societe->client->voir && ! $socid) $sql .= ", sc.fk_soc, sc.fk_user "; if (! $user->rights->societe->client->voir && ! $socid) $sql .= ", sc.fk_soc, sc.fk_user ";
$sql.= " ORDER BY "; $sql.= " ORDER BY ";
$listfield=explode(',',$sortfield); $listfield=explode(',',$sortfield);
@ -424,11 +455,70 @@ if ($resql)
dol_htmloutput_mesg($mesg); dol_htmloutput_mesg($mesg);
print '<form id="form_generate_pdf" method="POST" action="'.$_SERVER["PHP_SELF"].'?sortfield='. $sortfield .'&sortorder='. $sortorder .'">'; print '<form id="form_unpaid" method="POST" action="'.$_SERVER["PHP_SELF"].'?sortfield='. $sortfield .'&sortorder='. $sortorder .'">';
if (! empty($mode) && $action == 'presend')
{
include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
$formmail = new FormMail($db);
print '<br>';
print_fiche_titre($langs->trans("SendRemind"),'','').'<br>';
$topicmail="MailTopicSendRemindUnpaidInvoices";
$modelmail="facture_relance";
// Cree l'objet formulaire mail
include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
$formmail = new FormMail($db);
$formmail->withform=-1;
$formmail->fromtype = 'user';
$formmail->fromid = $user->id;
$formmail->fromname = $user->getFullName($langs);
$formmail->frommail = $user->email;
$formmail->withfrom=1;
$liste=array();
$formmail->withto=$langs->trans("AllRecipientSelectedForRemind");
$formmail->withtofree=0;
$formmail->withtoreadonly=1;
$formmail->withtocc=1;
$formmail->withtoccc=$conf->global->MAIN_EMAIL_USECCC;
$formmail->withtopic=$langs->transnoentities($topicmail, '__FACREF__', '__REFCLIENT__');
$formmail->withfile=$langs->trans("EachInvoiceWillBeAttachedToEmail");
$formmail->withbody=1;
$formmail->withdeliveryreceipt=1;
$formmail->withcancel=1;
// Tableau des substitutions
//$formmail->substit['__FACREF__']='';
$formmail->substit['__SIGNATURE__']=$user->signature;
//$formmail->substit['__REFCLIENT__']='';
$formmail->substit['__PERSONALIZED__']='';
$formmail->substit['__CONTACTCIVNAME__']='';
// Tableau des parametres complementaires du post
$formmail->param['action']=$action;
$formmail->param['models']=$modelmail;
$formmail->param['facid']=$object->id;
$formmail->param['returnurl']=$_SERVER["PHP_SELF"].'?id='.$object->id;
print $formmail->get_form();
print '<br>'."\n";
}
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">'; print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
print '<input type="hidden" name="mode" value="'.$mode.'">'; print '<input type="hidden" name="mode" value="'.$mode.'">';
if ($late) print '<input type="hidden" name="late" value="'.dol_escape_htmltag($late).'">'; if ($late) print '<input type="hidden" name="late" value="'.dol_escape_htmltag($late).'">';
if ($resultmasssend)
{
print '<br><strong>'.$langs->trans("ResultOfMassSending").':</strong><br>'."\n";
print $langs->trans("Selected").': '.$countToSend."\n<br>";
print $langs->trans("Ignored").': '.$nbignored."\n<br>";
print $langs->trans("Sent").': '.$nbsent."\n<br>";
//print $resultmasssend;
print '<br>';
}
$i = 0; $i = 0;
print '<table class="liste" width="100%">'; print '<table class="liste" width="100%">';
print '<tr class="liste_titre">'; print '<tr class="liste_titre">';
@ -572,8 +662,9 @@ if ($resql)
else else
{ {
// Checkbox to send remind // Checkbox to send remind
print '<td align="center">'; print '<td class="nowrap" align="center">';
print '<input class="flat checkforsend" type="checkbox" name="toSend[]" value="'.$objp->facid.'">'; if ($objp->email) print '<input class="flat checkforsend" type="checkbox" name="toSend[]" value="'.$objp->facid.'">';
else print img_picto($langs->trans("NoEMail"), 'warning.png');
print '</td>' ; print '</td>' ;
} }
@ -617,64 +708,11 @@ if ($resql)
} }
else else
{ {
$langs->load("mails");
if ($action != 'presend') if ($action != 'presend')
{ {
print '<div class="tabsAction">'; print '<div class="tabsAction">';
print '<a href="'.$_SERVER["PHP_SELF"].'?mode=sendremind&action=presend" class="butAction" name="buttonsendremind" value="'.dol_escape_htmltag($langs->trans("SendRemind")).'">'.$langs->trans("SendRemind").'</a>'; print '<a href="'.$_SERVER["PHP_SELF"].'?mode=sendremind&action=presend" class="butAction" name="buttonsendremind" value="'.dol_escape_htmltag($langs->trans("SendRemind")).'">'.$langs->trans("SendRemind").'</a>';
print '</div>'; print '</div>';
}
else
{
include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
$formmail = new FormMail($db);
print '<br>';
print_fiche_titre($langs->trans("SendRemind"),'','').'<br>';
$topicmail="MailTopicSendRemindUnpaidInvoices";
$modelmail="facture_relance";
// Cree l'objet formulaire mail
include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
$formmail = new FormMail($db);
$formmail->fromtype = 'user';
$formmail->fromid = $user->id;
$formmail->fromname = $user->getFullName($langs);
$formmail->frommail = $user->email;
$formmail->withfrom=1;
$liste=array();
$formmail->withto='';
$formmail->withtocc=1;
$formmail->withtoccc=$conf->global->MAIN_EMAIL_USECCC;
$formmail->withtopic=$langs->transnoentities($topicmail, '__FACREF__', '__REFCLIENT__');
$formmail->withfile=$langs->trans("EachInvoiceWillBeAttachedToEmail");
$formmail->withbody=1;
$formmail->withdeliveryreceipt=1;
$formmail->withcancel=1;
// Tableau des substitutions
//$formmail->substit['__FACREF__']='';
$formmail->substit['__SIGNATURE__']=$user->signature;
//$formmail->substit['__REFCLIENT__']='';
$formmail->substit['__PERSONALIZED__']='';
$formmail->substit['__CONTACTCIVNAME__']='';
// Tableau des parametres complementaires du post
$formmail->param['action']=$action;
$formmail->param['models']=$modelmail;
$formmail->param['facid']=$object->id;
$formmail->param['returnurl']=$_SERVER["PHP_SELF"].'?id='.$object->id;
print $formmail->get_form();
}
if ($resultmasssend)
{
print '<br><strong>'.$langs->trans("ResultOfMassSending").':</strong><br>'."\n";
print $resultmasssend;
print '<br>'; print '<br>';
} }
} }

View File

@ -35,7 +35,7 @@ class FormMail
{ {
var $db; var $db;
var $withform; var $withform; // 1=Include HTML form tag and show submit button, 0=Do not include form tag and submit button, -1=Do not include form tag but include submit button
var $fromname; var $fromname;
var $frommail; var $frommail;
@ -43,7 +43,7 @@ class FormMail
var $replytomail; var $replytomail;
var $toname; var $toname;
var $tomail; var $tomail;
var $withsubstit; // Show substitution array var $withsubstit; // Show substitution array
var $withfrom; var $withfrom;
var $withto; // Show recipient emails var $withto; // Show recipient emails
@ -249,7 +249,7 @@ class FormMail
$form=new Form($this->db); $form=new Form($this->db);
$out.= "\n<!-- Debut form mail -->\n"; $out.= "\n<!-- Debut form mail -->\n";
if ($this->withform) if ($this->withform == 1)
{ {
$out.= '<form method="POST" name="mailform" enctype="multipart/form-data" action="'.$this->param["returnurl"].'">'."\n"; $out.= '<form method="POST" name="mailform" enctype="multipart/form-data" action="'.$this->param["returnurl"].'">'."\n";
$out.= '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'" />'; $out.= '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'" />';
@ -619,7 +619,7 @@ class FormMail
$out.= "</td></tr>\n"; $out.= "</td></tr>\n";
} }
if (! empty($this->withform)) if ($this->withform == 1 || $this->withform == -1)
{ {
$out.= '<tr><td align="center" colspan="2"><center>'; $out.= '<tr><td align="center" colspan="2"><center>';
$out.= '<input class="button" type="submit" id="sendmail" name="sendmail" value="'.$langs->trans("SendMail").'"'; $out.= '<input class="button" type="submit" id="sendmail" name="sendmail" value="'.$langs->trans("SendMail").'"';
@ -639,7 +639,7 @@ class FormMail
$out.= '</table>'."\n"; $out.= '</table>'."\n";
if (! empty($this->withform)) $out.= '</form>'."\n"; if ($this->withform == 1) $out.= '</form>'."\n";
$out.= "<!-- Fin form mail -->\n"; $out.= "<!-- Fin form mail -->\n";
return $out; return $out;

View File

@ -31,7 +31,6 @@ require_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/modules/fichinter/modules_fichinter.php'; require_once DOL_DOCUMENT_ROOT.'/core/modules/fichinter/modules_fichinter.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/fichinter.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/fichinter.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
require_once DOL_DOCUMENT_ROOT . '/core/class/html.formcontract.class.php';
if (! empty($conf->projet->enabled)) if (! empty($conf->projet->enabled))
{ {
@ -858,7 +857,8 @@ if (! empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && $user->rights->ficheint
$form = new Form($db); $form = new Form($db);
$formfile = new FormFile($db); $formfile = new FormFile($db);
$formcontract = new FormContract($db); if ($conf->contrat->enabled)
$formcontract = new FormContract($db);
llxHeader('',$langs->trans("Fichinter")); llxHeader('',$langs->trans("Fichinter"));
@ -983,7 +983,7 @@ if ($action == 'create')
$numprojet=$formproject->select_projects($soc->id,GETPOST('projectid','int'),'projectid'); $numprojet=$formproject->select_projects($soc->id,GETPOST('projectid','int'),'projectid');
if ($numprojet==0) if ($numprojet==0)
{ {
print ' &nbsp; <a href="'.DOL_DOCUMENT_ROOT.'/projet/fiche.php?socid='.$soc->id.'&action=create">'.$langs->trans("AddProject").'</a>'; print ' &nbsp; <a href="'.DOL_URL_ROOT.'/projet/fiche.php?socid='.$soc->id.'&action=create">'.$langs->trans("AddProject").'</a>';
} }
print '</td></tr>'; print '</td></tr>';
} }

View File

@ -83,6 +83,9 @@ EachInvoiceWillBeAttachedToEmail=A document using default invoice document templ
MailTopicSendRemindUnpaidInvoices=Remind of invoice %s (%s) MailTopicSendRemindUnpaidInvoices=Remind of invoice %s (%s)
SendRemind=Send remind by EMails SendRemind=Send remind by EMails
RemindSent=%S remind(s) sent RemindSent=%S remind(s) sent
AllRecipientSelectedForRemind=All thirdparties selected and if an email is set (note that one mail per invoice will be sent)
NoRemindSent=No remind by EMail sent
ResultOfMassSending=Result of mass remind sending by EMail
# Libelle des modules de liste de destinataires mailing # Libelle des modules de liste de destinataires mailing
MailingModuleDescContactCompanies=Contacts/addresses of all third parties (customer, prospect, supplier, ...) MailingModuleDescContactCompanies=Contacts/addresses of all third parties (customer, prospect, supplier, ...)