Skip to content
Merged

1.6.0 #120

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
1430868
Merge pull request #109 from mapiolca/main
mapiolca Dec 5, 2025
8999799
Update mod_timesheetweek_standard.php
mapiolca Dec 5, 2025
48a19d7
Update mod_timesheetweek_standard.php
mapiolca Dec 5, 2025
0d60615
Update mod_timesheetweek_advanced.php
mapiolca Dec 5, 2025
8929de0
Merge pull request #110 from mapiolca/mapiolca-patch-1
mapiolca Dec 5, 2025
7d33b1e
Update timesheetweek_reminder.class.php
mapiolca Dec 5, 2025
1330107
Update timesheetweek_reminder.class.php
mapiolca Dec 5, 2025
0ce6e16
Update timesheetweek_reminder.class.php
mapiolca Dec 5, 2025
13533e9
Update timesheetweek_reminder.class.php
mapiolca Dec 5, 2025
99a1ed6
Update timesheetweek_reminder.class.php
mapiolca Dec 5, 2025
06068dd
Update timesheetweek_reminder.class.php
mapiolca Dec 5, 2025
57bc7d4
Update timesheetweek_reminder.class.php
mapiolca Dec 5, 2025
9a7845e
Update timesheetweek_reminder.class.php
mapiolca Dec 5, 2025
8f5739d
Update timesheetweek_reminder.class.php
mapiolca Dec 5, 2025
2696215
Update timesheetweek_reminder.class.php
mapiolca Dec 5, 2025
efd442c
Update timesheetweek_reminder.class.php
mapiolca Dec 5, 2025
a9333c7
Add reminder exclusion user selection
mapiolca Dec 5, 2025
bd27446
Add excluded users filter to reminder selection
mapiolca Dec 6, 2025
dafa406
Rendre la sélection des utilisateurs exclus en multi-sélection
mapiolca Dec 6, 2025
784caab
Merge pull request #112 from mapiolca/2025-12-05-add-multiselect-for-…
mapiolca Dec 6, 2025
9fe3f43
Update setup.php
mapiolca Dec 6, 2025
1188cdb
Supprimer le contrôle de fenêtre pour le rappel
mapiolca Dec 6, 2025
c7cbcdc
Corriger l'initialisation du rappel
mapiolca Dec 6, 2025
544263b
Update timesheetweek_reminder.class.php
mapiolca Dec 6, 2025
ea001b5
Update timesheetweek_reminder.class.php
mapiolca Dec 6, 2025
471522b
Recalculate reminder start time on setup load
mapiolca Dec 6, 2025
60fb17d
Merge pull request #115 from mapiolca/2025-12-06-recalculate-imesheet…
mapiolca Dec 7, 2025
a031e3b
Fix reminder email handling across Dolibarr versions
mapiolca Dec 7, 2025
6421d1d
Refine reminder email template loading
mapiolca Dec 7, 2025
e291099
Merge pull request #117 from mapiolca/2025-12-07-refactor-email-remin…
mapiolca Dec 7, 2025
f4f2ae4
Update timesheetweek_reminder.class.php
mapiolca Dec 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
161 changes: 112 additions & 49 deletions admin/setup.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,19 @@
$res = require_once __DIR__.'/../../../main.inc.php';
}
if (!$res) {
die('Include of main fails');
die('Include of main fails');
}
require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.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/class/html.form.class.php';
// EN: Load email template class with backward compatibility for older Dolibarr versions.
require_once DOL_DOCUMENT_ROOT.'/cron/class/cronjob.class.php';
// EN: Load email template class with version-aware fallback.

if (floatval(DOL_VERSION) < 23) {
dol_include_once('/timesheetweek/core/class/cemailtemplate.class.php');
if (version_compare(DOL_VERSION, '23.0.0', '>=') || file_exists(DOL_DOCUMENT_ROOT.'/core/class/cemailtemplate.class.php')) {
require_once DOL_DOCUMENT_ROOT.'/core/class/cemailtemplate.class.php';
} else {
require_once DOL_DOCUMENT_ROOT.'/core/class/cemailtemplate.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php';
}

require_once DOL_DOCUMENT_ROOT.'/core/lib/doc.lib.php';
Expand Down Expand Up @@ -354,54 +355,70 @@ function timesheetweekListDocumentModels(array $directories, Translate $langs, a
}

if ($action === 'savereminder') {
$reminderEnabledValue = (int) GETPOST('TIMESHEETWEEK_REMINDER_ENABLED', 'int');
$reminderWeekdayValue = (int) GETPOST('TIMESHEETWEEK_REMINDER_WEEKDAY', 'int');
$reminderHourValue = trim(GETPOST('TIMESHEETWEEK_REMINDER_HOUR', 'alphanohtml'));
$reminderTemplateValue = (int) GETPOST('TIMESHEETWEEK_REMINDER_EMAIL_TEMPLATE', 'int');

$error = 0;

if ($reminderWeekdayValue < 1 || $reminderWeekdayValue > 7) {
setEventMessages($langs->trans('TimesheetWeekReminderWeekdayInvalid'), null, 'errors');
$error++;
$reminderEnabledValue = (int) GETPOST('TIMESHEETWEEK_REMINDER_ENABLED', 'int');
$reminderStartYear = (int) GETPOST('TIMESHEETWEEK_REMINDER_STARTTIMEyear', 'int');
$reminderStartMonth = (int) GETPOST('TIMESHEETWEEK_REMINDER_STARTTIMEmonth', 'int');
$reminderStartDay = (int) GETPOST('TIMESHEETWEEK_REMINDER_STARTTIMEday', 'int');
$reminderStartHour = (int) GETPOST('TIMESHEETWEEK_REMINDER_STARTTIMEhour', 'int');
$reminderStartMinute = (int) GETPOST('TIMESHEETWEEK_REMINDER_STARTTIMEmin', 'int');
$reminderTemplateValue = (int) GETPOST('TIMESHEETWEEK_REMINDER_EMAIL_TEMPLATE', 'int');
$reminderExcludedUsersValue = GETPOST('TIMESHEETWEEK_REMINDER_EXCLUDED_USERS', 'array');
$reminderExcludedUsersList = array();
if (is_array($reminderExcludedUsersValue)) {
foreach ($reminderExcludedUsersValue as $reminderExcludedUserId) {
$reminderExcludedUserId = (int) $reminderExcludedUserId;
if ($reminderExcludedUserId > 0) {
$reminderExcludedUsersList[] = $reminderExcludedUserId;
}
}
}

if (!preg_match('/^(?:[01]\\d|2[0-3]):[0-5]\\d$/', $reminderHourValue)) {
setEventMessages($langs->trans('TimesheetWeekReminderHourInvalid'), null, 'errors');



$error = 0;

$reminderStartTimestamp = dol_mktime($reminderStartHour, $reminderStartMinute, 0, $reminderStartMonth, $reminderStartDay, $reminderStartYear);
if (empty($reminderStartTimestamp)) {
setEventMessages($langs->trans('TimesheetWeekReminderStartTimeInvalid'), null, 'errors');
$error++;
}

if (!$error) {
$results = array();
$results[] = dolibarr_set_const($db, 'TIMESHEETWEEK_REMINDER_ENABLED', ($reminderEnabledValue ? 1 : 0), 'chaine', 0, '', $conf->entity);
$results[] = dolibarr_set_const($db, 'TIMESHEETWEEK_REMINDER_WEEKDAY', $reminderWeekdayValue, 'chaine', 0, '', $conf->entity);
$results[] = dolibarr_set_const($db, 'TIMESHEETWEEK_REMINDER_HOUR', $reminderHourValue, 'chaine', 0, '', $conf->entity);
$results[] = dolibarr_set_const($db, 'TIMESHEETWEEK_REMINDER_STARTTIME', (string) $reminderStartTimestamp, 'chaine', 0, '', $conf->entity);
$results[] = dolibarr_set_const($db, 'TIMESHEETWEEK_REMINDER_EMAIL_TEMPLATE', $reminderTemplateValue, 'chaine', 0, '', $conf->entity);

$results[] = dolibarr_set_const($db, 'TIMESHEETWEEK_REMINDER_EXCLUDED_USERS', implode(',', $reminderExcludedUsersList), 'chaine', 0, '', $conf->entity);

$hasError = false;
foreach ($results as $resultValue) {
if ($resultValue <= 0) {
$hasError = true;
break;
}
}

if ($hasError) {
setEventMessages($langs->trans('Error'), null, 'errors');
} else {
$cronUpdate = TimesheetweekReminder::updateCronStartTime($db, $reminderStartTimestamp, $user);
if ($cronUpdate < 0) {
setEventMessages($langs->trans('TimesheetWeekReminderCronUpdateFailed'), null, 'errors');
} elseif ($cronUpdate === 0) {
setEventMessages($langs->trans('TimesheetWeekReminderCronMissing'), null, 'warnings');
}
setEventMessages($langs->trans('SetupSaved'), null, 'mesgs');
}
}
}

if ($action === 'testreminder') {
if ($action === 'testreminder') {
$reminder = new TimesheetweekReminder($db);
$resultTest = $reminder->sendTest($db, $user); //$resultTest = TimesheetweekReminder::sendTest($db, $user);
//var_dump($resultTest);
if ($resultTest == 0) {
setEventMessages($langs->trans('TimesheetWeekReminderTestSuccess'), null, 'mesgs');
$resultTest = $reminder->sendTest($user);
if ($resultTest >= 0) {
setEventMessages($langs->trans('TimesheetWeekReminderTestSuccess'), null, 'mesgs');
} else {
setEventMessages($langs->trans('TimesheetWeekReminderTestError'), null, 'errors');
setEventMessages($langs->trans('TimesheetWeekReminderTestError'), null, 'errors');
}
}

Expand All @@ -410,9 +427,43 @@ function timesheetweekListDocumentModels(array $directories, Translate $langs, a
$defaultPdf = getDolGlobalString('TIMESHEETWEEK_ADDON_PDF', 'standard_timesheetweek');
$useQuarterDaySelector = getDolGlobalInt('TIMESHEETWEEK_QUARTERDAYFORDAILYCONTRACT', 0);
$reminderEnabled = getDolGlobalInt('TIMESHEETWEEK_REMINDER_ENABLED', 0);
$reminderWeekday = getDolGlobalInt('TIMESHEETWEEK_REMINDER_WEEKDAY', 1);
$reminderHour = getDolGlobalString('TIMESHEETWEEK_REMINDER_HOUR', '18:00');
$reminderStartValue = getDolGlobalString('TIMESHEETWEEK_REMINDER_STARTTIME', '');
$reminderStartTimestamp = '';
if ($reminderStartValue !== '') {
if (is_numeric($reminderStartValue)) {
$reminderStartTimestamp = (int) $reminderStartValue;
} else {
$reminderStartTimestamp = dol_stringtotime($reminderStartValue, 0);
}
}
if (empty($reminderStartTimestamp)) {
$reminderStartTimestamp = dol_now();
}
$reminderCurrentHour = (int) dol_print_date($reminderStartTimestamp, '%H');
$reminderCurrentMinute = (int) dol_print_date($reminderStartTimestamp, '%M');
$reminderWeekday = (int) dol_print_date($reminderStartTimestamp, '%w');
$now = dol_now();
$currentWeekday = (int) dol_print_date($now, '%w');
$daysAhead = ($reminderWeekday - $currentWeekday + 7) % 7;
$referenceDate = dol_time_plus_duree($now, $daysAhead, 'd');
$referenceYear = (int) dol_print_date($referenceDate, '%Y');
$referenceMonth = (int) dol_print_date($referenceDate, '%m');
$referenceDay = (int) dol_print_date($referenceDate, '%d');
$nextReminderTimestamp = dol_mktime($reminderCurrentHour, $reminderCurrentMinute, 0, $referenceMonth, $referenceDay, $referenceYear);
if ($nextReminderTimestamp <= $now) {
$nextReminderTimestamp = dol_time_plus_duree($nextReminderTimestamp, 7, 'd');
}
if ($nextReminderTimestamp !== $reminderStartTimestamp) {
dolibarr_set_const($db, 'TIMESHEETWEEK_REMINDER_STARTTIME', (string) $nextReminderTimestamp, 'chaine', 0, '', $conf->entity);
TimesheetweekReminder::updateCronStartTime($db, $nextReminderTimestamp, $user);
}
$reminderStartTimestamp = $nextReminderTimestamp;
$reminderTemplateId = getDolGlobalInt('TIMESHEETWEEK_REMINDER_EMAIL_TEMPLATE', 0);
$reminderExcludedUsersString = getDolGlobalString('TIMESHEETWEEK_REMINDER_EXCLUDED_USERS', '');
$reminderExcludedUsers = array();
if ($reminderExcludedUsersString !== '') {
$reminderExcludedUsers = array_filter(array_map('intval', explode(',', $reminderExcludedUsersString)));
}
$directories = array_merge(array('/'), (array) $conf->modules_parts['models']);

// EN: Prepare a lightweight object to test numbering module activation.
Expand Down Expand Up @@ -582,32 +633,44 @@ function timesheetweekListDocumentModels(array $directories, Translate $langs, a
print '</td>';
print '</tr>';

$weekdayOptions = array(
1 => $langs->trans('Monday'),
2 => $langs->trans('Tuesday'),
3 => $langs->trans('Wednesday'),
4 => $langs->trans('Thursday'),
5 => $langs->trans('Friday'),
6 => $langs->trans('Saturday'),
7 => $langs->trans('Sunday'),
);
$selectStartTime = $form->select_date($reminderStartTimestamp, 'TIMESHEETWEEK_REMINDER_STARTTIME', 1, 1, 0, '', 1, 0, 1, '', 0, 0, '', '', '', '');

print '<tr class="oddeven">';
print '<td class="nowraponall">'.$langs->trans('TimesheetWeekReminderWeekday').'</td>';
print '<td class="small">'.$langs->trans('TimesheetWeekReminderWeekdayHelp').'</td>';
print '<td class="center">'.$form->selectarray('TIMESHEETWEEK_REMINDER_WEEKDAY', $weekdayOptions, $reminderWeekday, 0, 0, 0, '', 0, 0, 0, '', '', 1).'</td>';
print '<td class="nowraponall">'.$langs->trans('TimesheetWeekReminderStartTime').'</td>';
print '<td class="small">'.$langs->trans('TimesheetWeekReminderStartTimeHelp').'</td>';
print '<td class="center">'.$selectStartTime.'</td>';
print '</tr>';

print '<tr class="oddeven">';
print '<td class="nowraponall">'.$langs->trans('TimesheetWeekReminderHour').'</td>';
print '<td class="small">'.$langs->trans('TimesheetWeekReminderHourHelp').'</td>';
print '<td class="center"><input type="text" name="TIMESHEETWEEK_REMINDER_HOUR" value="'.dol_escape_htmltag($reminderHour).'" size="6" maxlength="5"></td>';
print '<td class="nowraponall">'.$langs->trans('TimesheetWeekReminderEmailTemplate').'</td>';
print '<td class="small">'.$langs->trans('TimesheetWeekReminderEmailTemplateHelp').'</td>';
print '<td class="center">'.$form->selectarray('TIMESHEETWEEK_REMINDER_EMAIL_TEMPLATE', $templateOptions, $reminderTemplateId, 0, 0, 0, '', 0, 0, 0, '', '', $conf->entity).'</td>';
print '</tr>';

$selectExcludedUsers = $form->select_dolusers(
$reminderExcludedUsers,
'TIMESHEETWEEK_REMINDER_EXCLUDED_USERS',
0,
'',
0,
'',
'',
0,
0,
0,
'',
0,
'',
'minwidth300',
0,
0,
1
);

print '<tr class="oddeven">';
print '<td class="nowraponall">'.$langs->trans('TimesheetWeekReminderEmailTemplate').'</td>';
print '<td class="small">'.$langs->trans('TimesheetWeekReminderEmailTemplateHelp').'</td>';
print '<td class="center">'.$form->selectarray('TIMESHEETWEEK_REMINDER_EMAIL_TEMPLATE', $templateOptions, $reminderTemplateId, 0, 0, 0, '', 0, 0, 0, '', '', 1).'</td>';
print '<td class="nowraponall">'.$langs->trans('TimesheetWeekReminderExcludedUsers').'</td>';
print '<td class="small">'.$langs->trans('TimesheetWeekReminderExcludedUsersHelp').'</td>';
print '<td class="center">'.$selectExcludedUsers.'</td>';
print '</tr>';

print '</table>';
Expand Down
Loading