diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index 86011980c80..f7ceea4743d 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -28,7 +28,6 @@ */ require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncommreminder.class.php'; @@ -2299,6 +2298,7 @@ class ActionComm extends CommonObject $resql = $this->db->query($sql); if ($resql) { + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php'; $formmail = new FormMail($this->db); while ($obj = $this->db->fetch_object($resql)) { diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 7e0a8ff63b4..b949877dc82 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -4891,6 +4891,164 @@ class Facture extends CommonInvoice return -2; } } + + + /** + * Send reminders by emails for ivoices that are due + * CAN BE A CRON TASK + * + * @param int $nbdays Delay after due date (or before if delay is negative) + * @param string $paymentmode '' or 'all' by default (no filter), or 'LIQ', 'CHQ', CB', ... + * @param int|string $template Name (or id) of email template (Must be a template of type 'facture_send') + * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK) + */ + public function sendEmailsReminderOnDueDate($nbdays = 0, $paymentmode = 'all', $template = '') + { + global $conf, $langs, $user; + + $error = 0; + $this->output = ''; + $this->error = ''; + $nbMailSend = 0; + $errorsMsg = array(); + + if (empty($conf->facture->enabled)) { // Should not happen. If module disabled, cron job should not be visible. + $langs->load("bills"); + $this->output = $langs->trans('ModuleNotEnabled', $langs->transnoentitiesnoconv("Facture")); + return 0; + } + /*if (empty($conf->global->FACTURE_REMINDER_EMAIL)) { + $langs->load("bills"); + $this->output = $langs->trans('EventRemindersByEmailNotEnabled', $langs->transnoentitiesnoconv("Facture")); + return 0; + } + */ + + require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php'; + $formmail = new FormMail($this->db); + + $now = dol_now(); + $tmpinvoice = new Facture($this->db); + + dol_syslog(__METHOD__, LOG_DEBUG); + + $this->db->begin(); + + //Select all action comm reminder + $sql = "SELECT rowid as id FROM ".MAIN_DB_PREFIX."facture as f"; + if (!empty($paymentmode) && $paymentmode != 'all') { + $sql .= ", ".MAIN_DB_PREFIX."c_paiement as cp"; + } + $sql .= " WHERE f.paye = 0"; + $sql .= " AND f.date_lim_reglement = '".$this->db->idate(dol_get_first_hour(dol_time_plus_duree(dol_now(), -1 * $nbdays, 'd'), 'gmt'), 'gmt')."'"; + $sql .= " AND f.entity IN (".getEntity('facture').")"; + if (!empty($paymentmode) && $paymentmode != 'all') { + $sql .= " AND f.fk_mode_reglement = cp.id AND cp.code = '".$this->db->escape($paymentmode)."'"; + } + // TODO Add filter to check there is no payment started + $sql .= $this->db->order("date_lim_reglement", "ASC"); + $resql = $this->db->query($sql); + + if ($resql) { + while ($obj = $this->db->fetch_object($resql)) { + if (!$error) { + // Load event + $res = $tmpinvoice->fetch($obj->id); + if ($res > 0) { + $tmpinvoice->fetch_thirdparty(); + + $outputlangs = new Translate('', $conf); + if ($tmpinvoice->thirdparty->default_lang) { + $outputlangs->setDefaultLang($tmpinvoice->thirdparty->default_lang); + } else { + $outputlangs = $langs; + } + + // Select email template + $arraymessage = $formmail->getEMailTemplate($this->db, 'facture_send', $user, $outputlangs, (is_numeric($template) ? $template : 0), 1, (is_numeric($template) ? '' : $template)); + if (is_numeric($arraymessage) && $arraymessage <= 0) { + $langs->load("bills"); + $this->output = $langs->trans('FailedToFindEmailTemplate', $template); + return 0; + } + + // PREPARE EMAIL + $errormesg = ''; + + // Make substitution in email content + $substitutionarray = getCommonSubstitutionArray($langs, 0, '', $this); + + complete_substitutions_array($substitutionarray, $langs, $this); + + // Content + $sendContent = make_substitutions($langs->trans($arraymessage->content), $substitutionarray); + + //Topic + $sendTopic = (!empty($arraymessage->topic)) ? $arraymessage->topic : html_entity_decode($langs->trans('EventReminder')); + + // Recipient + $res = $tmpinvoice->fetch_thirdparty(); + $recipient = $tmpinvoice->thirdparty; + if ($res > 0) { + if (!empty($recipient->email)) { + $to = $recipient->email; + } else { + $errormesg = "Failed to send remind to thirdparty id=".$tmpinvoice->fk_soc.". No email defined for user."; + $error++; + } + } else { + $errormesg = "Failed to load recipient with thirdparty id=".$tmpinvoice->fk_soc; + $error++; + } + + // Sender + $from = $conf->global->MAIN_MAIL_EMAIL_FROM; + if (empty($from)) { + $errormesg = "Failed to get sender into global setup MAIN_MAIL_EMAIL_FROM"; + $error++; + } + + if (!$error) { + // Errors Recipient + $errors_to = $conf->global->MAIN_MAIL_ERRORS_TO; + + $trackid = 'inv'.$tmpinvoice->id; + // Mail Creation + $cMailFile = new CMailFile($sendTopic, $to, $from, $sendContent, array(), array(), array(), '', "", 0, 1, $errors_to, '', $trackid, '', '', ''); + + // Sending Mail + if ($cMailFile->sendfile()) { + $nbMailSend++; + } else { + $errormesg = $cMailFile->error.' : '.$to; + $error++; + } + } + + if ($errormesg) { + $errorsMsg[] = $errormesg; + } + } else { + $errorsMsg[] = 'Failed to fetch record invoice with ID = '.$obj->id; + $error++; + } + } + } + } else { + $error++; + } + + if (!$error) { + $this->output = 'Nb of emails sent : '.$nbMailSend; + $this->db->commit(); + return 0; + } else { + $this->db->commit(); // We commit also on error, to have the error message recorded. + $this->error = 'Nb of emails sent : '.$nbMailSend.', '.(!empty($errorsMsg)) ? join(', ', $errorsMsg) : $error; + return $error; + } + } } /** @@ -5604,153 +5762,4 @@ class FactureLigne extends CommonInvoiceLine } } } - - - /** - * Send reminders by emails for ivoices that are due - * CAN BE A CRON TASK - * - * @param int $nbdays Delay after due date (or before if delay is negative) - * @param string $paymentmode '' or 'all' by default (no filter), or 'LIQ', 'CHQ', CB', ... - * @param int|string $idtemplate Id or name of of email template (Must be a template of type 'invoice') - * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK) - */ - public function sendEmailsReminderOnDueDate($nbdays = 0, $paymentmode = 'all', $idtemplate = '') - { - global $conf, $langs, $user; - - $error = 0; - $this->output = ''; - $this->error = ''; - $nbMailSend = 0; - $errorsMsg = array(); - - if (empty($conf->facture->enabled)) { // Should not happen. If module disabled, cron job should not be visible. - $langs->load("bills"); - $this->output = $langs->trans('ModuleNotEnabled', $langs->transnoentitiesnoconv("Facture")); - return 0; - } - if (empty($conf->global->FACTURE_REMINDER_EMAIL)) { - $langs->load("bills"); - $this->output = $langs->trans('EventRemindersByEmailNotEnabled', $langs->transnoentitiesnoconv("Facture")); - return 0; - } - - $formmail = new FormMail($this->db); - - // Select email template - $arraymessagetemplate = $formmail->getEMailTemplate($this->db, 'facture', $user, $langs, $idtemplate, 1); - if (is_numeric($arraymessagetemplate) && $arraymessagetemplate <= 0) { - $langs->load("bills"); - $this->output = $langs->trans('FailedToFindEmailTemplate', $idtemplate); - return 0; - } - - $now = dol_now(); - $tmpinvoice = new Facture($this->db); - - dol_syslog(__METHOD__, LOG_DEBUG); - - $this->db->begin(); - - //Select all action comm reminder - $sql = "SELECT rowid as id FROM ".MAIN_DB_PREFIX."facture as f"; - if (!empty($paymentmode) && $paymentmode != 'all') { - $sql .= ", ".MAIN_DB_PREFIX."c_paiement as cp"; - } - $sql .= " WHERE f.paye = 0"; - $sql .= " AND f.date_lim_reglement = '".$this->db->idate(dol_time_plus_duree($now, -1 * $nbdays, 'd'))."'"; // TODO Remove hours into filter - $sql .= " AND f.entity IN (".getEntity('facture').")"; - if (!empty($paymentmode) && $paymentmode != 'all') { - $sql .= " AND f.fk_mode_reglement = cp.id AND cp.code = '".$this->db->escape($paymentmode)."'"; - } - // TODO Add filter to check there is no payment started - $sql .= $this->db->order("date_lim_reglement", "ASC"); - $resql = $this->db->query($sql); - - if ($resql) { - while ($obj = $this->db->fetch_object($resql)) { - if (!$error) { - //Select email template - $arraymessage = $arraymessagetemplate; - - // Load event - $res = $tmpinvoice->fetch($obj->id); - if ($res > 0) { - // PREPARE EMAIL - $errormesg = ''; - - // Make substitution in email content - $substitutionarray = getCommonSubstitutionArray($langs, 0, '', $this); - - complete_substitutions_array($substitutionarray, $langs, $this); - - // Content - $sendContent = make_substitutions($langs->trans($arraymessage->content), $substitutionarray); - - //Topic - $sendTopic = (!empty($arraymessage->topic)) ? $arraymessage->topic : html_entity_decode($langs->trans('EventReminder')); - - // Recipient - $res = $tmpinvoice->fetch_thirdparty(); - $recipient = $tmpinvoice->thirdparty; - if ($res > 0) { - if (!empty($recipient->email)) { - $to = $recipient->email; - } else { - $errormesg = "Failed to send remind to thirdparty id=".$tmpinvoice->fk_soc.". No email defined for user."; - $error++; - } - } else { - $errormesg = "Failed to load recipient with thirdparty id=".$tmpinvoice->fk_soc; - $error++; - } - - // Sender - $from = $conf->global->MAIN_MAIL_EMAIL_FROM; - if (empty($from)) { - $errormesg = "Failed to get sender into global setup MAIN_MAIL_EMAIL_FROM"; - $error++; - } - - if (!$error) { - // Errors Recipient - $errors_to = $conf->global->MAIN_MAIL_ERRORS_TO; - - $trackid = 'inv'.$tmpinvoice->id; - // Mail Creation - $cMailFile = new CMailFile($sendTopic, $to, $from, $sendContent, array(), array(), array(), '', "", 0, 1, $errors_to, '', $trackid, '', '', ''); - - // Sending Mail - if ($cMailFile->sendfile()) { - $nbMailSend++; - } else { - $errormesg = $cMailFile->error.' : '.$to; - $error++; - } - } - - if ($errormesg) { - $errorsMsg[] = $errormesg; - } - } else { - $errorsMsg[] = 'Failed to fetch record invoice with ID = '.$obj->id; - $error++; - } - } - } - } else { - $error++; - } - - if (!$error) { - $this->output = 'Nb of emails sent : '.$nbMailSend; - $this->db->commit(); - return 0; - } else { - $this->db->commit(); // We commit also on error, to have the error message recorded. - $this->error = 'Nb of emails sent : '.$nbMailSend.', '.(!empty($errorsMsg)) ? join(', ', $errorsMsg) : $error; - return $error; - } - } } diff --git a/htdocs/core/lib/date.lib.php b/htdocs/core/lib/date.lib.php index a615c04ca8e..0dde3a93159 100644 --- a/htdocs/core/lib/date.lib.php +++ b/htdocs/core/lib/date.lib.php @@ -547,12 +547,12 @@ function dol_get_last_day($year, $month = 12, $gm = false) * * @param int $date Date GMT * @param mixed $gm False or 0 or 'tzserver' = Return date to compare with server TZ, - * True or 1 or 'gmt' to compare with GMT date. + * 'gmt' to compare with GMT date. * @return int Date for last hour of a given date */ function dol_get_last_hour($date, $gm = 'tzserver') { - $tmparray = dol_getdate($date); + $tmparray = dol_getdate($date, false, ($gm == 'gmt' ? 'gmt' : '')); return dol_mktime(23, 59, 59, $tmparray['mon'], $tmparray['mday'], $tmparray['year'], $gm); } @@ -561,12 +561,12 @@ function dol_get_last_hour($date, $gm = 'tzserver') * * @param int $date Date GMT * @param mixed $gm False or 0 or 'tzserver' = Return date to compare with server TZ, - * True or 1 or 'gmt' to compare with GMT date. + * 'gmt' to compare with GMT date. * @return int Date for last hour of a given date */ function dol_get_first_hour($date, $gm = 'tzserver') { - $tmparray = dol_getdate($date); + $tmparray = dol_getdate($date, false, ($gm == 'gmt' ? 'gmt' : '')); return dol_mktime(0, 0, 0, $tmparray['mon'], $tmparray['mday'], $tmparray['year'], $gm); } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index ce3b89d7805..80681032dfc 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -2290,7 +2290,7 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs = dol_print_error("Functions.lib::dol_print_date function called with a bad value from page ".$_SERVER["PHP_SELF"]); return ''; } elseif (preg_match('/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', $time, $reg)) { // Still available to solve problems in extrafields of type date - // This part of code should not be used. + // This part of code should not be used anymore. dol_syslog("Functions.lib::dol_print_date function called with a bad value from page ".$_SERVER["PHP_SELF"], LOG_WARNING); //if (function_exists('debug_print_backtrace')) debug_print_backtrace(); // Date has format 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS' @@ -2318,7 +2318,7 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs = $timetouse = $time + $offsettz + $offsetdst; // TODO Replace this with function Date PHP. We also should not use anymore offsettz and offsetdst but only offsettzstring. // Here ret is string in PHP setup language (strftime was used). Now we convert to $outputlangs. - $month = adodb_strftime('%m', $timetouse); + $month = adodb_strftime('%m', $timetouse, true); $month = sprintf("%02d", $month); // $month may be return with format '06' on some installation and '6' on other, so we force it to '06'. if ($encodetooutput) { $monthtext = $outputlangs->transnoentities('Month'.$month); @@ -2336,7 +2336,7 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs = if (preg_match('/__a__/i', $format)) { $timetouse = $time + $offsettz + $offsetdst; // TODO Replace this with function Date PHP. We also should not use anymore offsettz and offsetdst but only offsettzstring. - $w = adodb_strftime('%w', $timetouse); // TODO Replace this with function Date PHP. We also should not use anymore offsettz and offsetdst but only offsettzstring. + $w = adodb_strftime('%w', $timetouse, true); // TODO Replace this with function Date PHP. We also should not use anymore offsettz and offsetdst but only offsettzstring. $dayweek = $outputlangs->transnoentitiesnoconv('Day'.$w); $ret = str_replace('__A__', $dayweek, $ret); $ret = str_replace('__a__', dol_substr($dayweek, 0, 3), $ret); @@ -2353,7 +2353,7 @@ function dol_print_date($time, $format = '', $tzoutput = 'auto', $outputlangs = * * @param int $timestamp Timestamp * @param boolean $fast Fast mode. deprecated. - * @param string $forcetimezone '' to use the PHP server timezone. Or use a form like 'Europe/Paris' or '+0200' to force timezone. + * @param string $forcetimezone '' to use the PHP server timezone. Or use a form like 'gmt', 'Europe/Paris' or '+0200' to force timezone. * @return array Array of informations * 'seconds' => $secs, * 'minutes' => $min, @@ -2375,7 +2375,7 @@ function dol_getdate($timestamp, $fast = false, $forcetimezone = '') $datetimeobj = new DateTime(); $datetimeobj->setTimestamp($timestamp); // Use local PHP server timezone if ($forcetimezone) { - $datetimeobj->setTimezone(new DateTimeZone($forcetimezone)); // (add timezone relative to the date entered) + $datetimeobj->setTimezone(new DateTimeZone($forcetimezone == 'gmt' ? 'UTC' : $forcetimezone)); // (add timezone relative to the date entered) } $arrayinfo = array( 'year'=>((int) date_format($datetimeobj, 'Y')), diff --git a/htdocs/core/modules/modFacture.class.php b/htdocs/core/modules/modFacture.class.php index 9b576e292e2..8e9d242a6e3 100644 --- a/htdocs/core/modules/modFacture.class.php +++ b/htdocs/core/modules/modFacture.class.php @@ -121,7 +121,7 @@ class modFacture extends DolibarrModules $datestart = dol_mktime(23, 0, 0, $arraydate['mon'], $arraydate['mday'], $arraydate['year']); $this->cronjobs = array( 0=>array('label'=>'RecurringInvoices', 'jobtype'=>'method', 'class'=>'compta/facture/class/facture-rec.class.php', 'objectname'=>'FactureRec', 'method'=>'createRecurringInvoices', 'parameters'=>'', 'comment'=>'Generate recurring invoices', 'frequency'=>1, 'unitfrequency'=>3600 * 24, 'priority'=>50, 'status'=>1, 'test'=>'$conf->facture->enabled', 'datestart'=>$datestart), - 1=>array('label'=>'SendEmailsRemindersOnDueDate', 'jobtype'=>'method', 'class'=>'compta/facture/class/facture.class.php', 'objectname'=>'Facture', 'method'=>'sendEmailsReminderOnDueDate', 'parameters'=>"10,all,0", 'comment'=>'Send an emails when the unpaid invoices reach a due date + n days', 'frequency'=>1, 'unitfrequency'=>3600 * 24, 'priority'=>50, 'status'=>0, 'test'=>'$conf->facture->enabled', 'datestart'=>$datestart), + 1=>array('label'=>'SendEmailsRemindersOnDueDate', 'jobtype'=>'method', 'class'=>'compta/facture/class/facture.class.php', 'objectname'=>'Facture', 'method'=>'sendEmailsReminderOnDueDate', 'parameters'=>"10,all,EmailTemplateCode", 'comment'=>'Send an emails when the unpaid invoices reach a due date + n days (an email template with EmailTemplateCode must exists. the version in the language of the thirdparty will be used in priority)', 'frequency'=>1, 'unitfrequency'=>3600 * 24, 'priority'=>50, 'status'=>0, 'test'=>'$conf->facture->enabled', 'datestart'=>$datestart), ); // Permissions diff --git a/htdocs/cron/class/cronjob.class.php b/htdocs/cron/class/cronjob.class.php index 0b926f6a802..2af3b39789e 100644 --- a/htdocs/cron/class/cronjob.class.php +++ b/htdocs/cron/class/cronjob.class.php @@ -1140,9 +1140,9 @@ class Cronjob extends CommonObject $ret = dol_include_once($this->classesname); if ($ret === false || (!class_exists($this->objectname))) { if ($ret === false) { - $this->error = $langs->trans('CronCannotLoadClass', $this->classesname, $this->objectname); + $this->error = $langs->transnoentitiesnoconv('CronCannotLoadClass', $this->classesname, $this->objectname); } else { - $this->error = $langs->trans('CronCannotLoadObject', $this->classesname, $this->objectname); + $this->error = $langs->transnoentitiesnoconv('CronCannotLoadObject', $this->classesname, $this->objectname); } dol_syslog(get_class($this)."::run_jobs ".$this->error, LOG_ERR); $this->lastoutput = $this->error; @@ -1155,7 +1155,7 @@ class Cronjob extends CommonObject // test if method exists if (!$error) { if (!method_exists($this->objectname, $this->methodename)) { - $this->error = $langs->trans('CronMethodDoesNotExists', $this->objectname, $this->methodename); + $this->error = $langs->transnoentitiesnoconv('CronMethodDoesNotExists', $this->objectname, $this->methodename); dol_syslog(get_class($this)."::run_jobs ".$this->error, LOG_ERR); $this->lastoutput = $this->error; $this->lastresult = -1; @@ -1163,7 +1163,7 @@ class Cronjob extends CommonObject $error++; } if (in_array(strtolower(trim($this->methodename)), array('executecli'))) { - $this->error = $langs->trans('CronMethodNotAllowed', $this->methodename, $this->objectname); + $this->error = $langs->transnoentitiesnoconv('CronMethodNotAllowed', $this->methodename, $this->objectname); dol_syslog(get_class($this)."::run_jobs ".$this->error, LOG_ERR); $this->lastoutput = $this->error; $this->lastresult = -1; diff --git a/test/phpunit/DateLibTest.php b/test/phpunit/DateLibTest.php index 03eacd13745..78f5b36da49 100644 --- a/test/phpunit/DateLibTest.php +++ b/test/phpunit/DateLibTest.php @@ -36,6 +36,10 @@ if (empty($user->id)) { } $conf->global->MAIN_DISABLE_ALL_MAILS=1; +print "\n".$langs->trans("CurrentTimeZone").' : '.getServerTimeZoneString(); +print "\n".$langs->trans("CurrentHour").' : '.dol_print_date(dol_now('gmt'), 'dayhour', 'tzserver'); +print "\n"; + /** * Class for PHPUnit tests @@ -72,9 +76,6 @@ class DateLibTest extends PHPUnit\Framework\TestCase print __METHOD__." db->type=".$db->type." user->id=".$user->id; - print "\n".$langs->trans("CurrentTimeZone").' : '.getServerTimeZoneString(); - print "\n".$langs->trans("CurrentHour").' : '.dol_print_date(dol_now('gmt'), 'dayhour', 'tzserver'); - //print " - db ".$db->db; print "\n"; } @@ -490,5 +491,30 @@ class DateLibTest extends PHPUnit\Framework\TestCase $conf->global->MAIN_START_WEEK = 0; // start on sunday $prev = dol_get_first_day_week($day, $month, $year); $this->assertEquals(1, (int) $prev['first_day']); // sunday for month 2, year 2015 is the 1st + + return 1; + } + + + /** + * testDolGetFirstHour + * + * @return int + */ + public function testDolGetFirstHour() + { + global $conf; + + $now = 1800 + (24 * 3600 * 10); // The 11th of january 1970 at 0:30 in UTC + $result = dol_get_first_hour($now, 'gmt'); + print __METHOD__." now = ".$now.", dol_print_date(now, 'dayhourrfc', 'gmt') = ".dol_print_date($now, 'dayhourrfc', 'gmt').", result = ".$result.", dol_print_date(result, 'dayhourrfc', 'gmt') = ".dol_print_date($result, 'dayhourrfc', 'gmt')."\n"; + $this->assertEquals('1970-01-11T00:00:00Z', dol_print_date($result, 'dayhourrfc', 'gmt')); // monday for month 2, year 2014 is the 2 + + $now = 23.5 * 3600 + (24 * 3600 * 10); // The 11th of january 1970 at 23:30 in UTC + $result = dol_get_first_hour($now, 'gmt'); + print __METHOD__." now = ".$now.", dol_print_date(now, 'dayhourrfc', 'gmt') = ".dol_print_date($now, 'dayhourrfc', 'gmt').", result = ".$result.", dol_print_date(result, 'dayhourrfc', 'gmt') = ".dol_print_date($result, 'dayhourrfc', 'gmt')."\n"; + $this->assertEquals('1970-01-11T00:00:00Z', dol_print_date($result, 'dayhourrfc', 'gmt')); // monday for month 2, year 2014 is the 2 + + return 1; } }