diff --git a/ChangeLog.md b/ChangeLog.md index cfaa082..6221782 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,14 @@ # CHANGELOG MODULE TIMESHEETWEEK FOR [DOLIBARR ERP CRM](https://www.dolibarr.org) +## 1.6.2 (14/12/2025) +- Envoie les notifications de changement d'état avec des versions HTML pour conserver les actions et caractères spéciaux. / Sends status change notifications with HTML variants to preserve actions and special characters. +- Décode les entités HTML dans les objets générés pour afficher correctement les accents dans les courriels. / Decodes HTML entities in generated subjects to display accented characters correctly in emails. +- Calcule la signature des notifications en utilisant MAIN_APPLICATION_TITLE ou, à défaut, le nom de la société. / Builds notification signatures using MAIN_APPLICATION_TITLE or, if unavailable, the company name. +- Ajoute les traductions de TimesheetWeek en allemand, espagnol et italien. / Adds German, Spanish and Italian translations for TimesheetWeek. +- Aligne les traductions et la documentation pour les locales en_US, fr_FR, de_DE, es_ES et it_IT. / Aligns translations and documentation for en_US, fr_FR, de_DE, es_ES and it_IT locales. +- Corrige l'ajout du modèle de template par défaut pour les installations Dolibarr utilisant multicompany. / Fixes adding the default template model for Dolibarr instances using multicompany. +- Corrige le retour d'information lors de l'exécution du rappel de feuille d'heures. / Fixes the feedback returned when running the timesheet reminder. + ## 1.6.1 (08/12/2025) - Fige les heures contractuelles dans la fiche hebdomadaire et les PDF pour conserver le contexte en cas d'évolution du contrat. / Freezes contract hours in the weekly card and PDFs to preserve context when an employee contract changes. diff --git a/README.md b/README.md index 9e0ea0e..33aad5e 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ TimesheetWeek ajoute une gestion hebdomadaire des feuilles de temps fidèle à l ### Traductions -Les fichiers de traduction sont disponibles dans `langs/en_US` et `langs/fr_FR`. Toute nouvelle chaîne doit être renseignée simultanément dans les deux langues conformément aux pratiques Dolibarr. +Les fichiers de traduction sont disponibles dans `langs/en_US`, `langs/fr_FR`, `langs/de_DE`, `langs/es_ES` et `langs/it_IT`. Toute nouvelle chaîne doit être renseignée simultanément dans ces langues conformément aux pratiques Dolibarr. ## 🇬🇧 Overview @@ -84,7 +84,7 @@ TimesheetWeek delivers weekly timesheet management that follows Dolibarr design ### Translations -Translation sources are stored under `langs/en_US` and `langs/fr_FR`. Please keep both locales aligned for every new string to stay compatible with Dolibarr's translation workflow. +Translation sources are stored under `langs/en_US`, `langs/fr_FR`, `langs/de_DE`, `langs/es_ES` and `langs/it_IT`. Please keep these locales aligned for every new string to stay compatible with Dolibarr's translation workflow. Other external modules are available on [Dolistore.com](https://www.dolistore.com). diff --git a/class/timesheetweek.class.php b/class/timesheetweek.class.php index 32e7993..1999907 100644 --- a/class/timesheetweek.class.php +++ b/class/timesheetweek.class.php @@ -1824,53 +1824,60 @@ public function sendNativeMailNotification($triggerCode, User $actionUser, $reci } $methods = array('sendEmailsFromTemplate', 'sendEmailsCommon', 'sendEmailsFromModel', 'sendEmails', 'sendMails'); + $message = isset($options['message']) ? (string) $options['message'] : ''; + $htmlMessage = isset($options['message_html']) ? (string) $options['message_html'] : $message; + $isHtml = !empty($options['ishtml']) ? 1 : 0; $payload = array( - 'trigger' => $triggerCode, - 'action' => $triggerCode, - 'code' => $triggerCode, - 'event' => $triggerCode, - 'user' => $actionUser, - 'actionuser' => $actionUser, - 'actor' => $actionUser, - 'currentuser' => $actionUser, - 'langs' => $langs, - 'language' => $langs, - 'conf' => $conf, - 'subject' => isset($options['subject']) ? (string) $options['subject'] : '', - 'message' => isset($options['message']) ? (string) $options['message'] : '', - 'content' => isset($options['message']) ? (string) $options['message'] : '', - 'body' => isset($options['message']) ? (string) $options['message'] : '', - 'sendto' => $sendto, - 'emailto' => $sendto, - 'email_to' => $sendto, - 'sendtolist' => $sendto, - 'sendtocc' => isset($options['cc']) ? (string) $options['cc'] : '', - 'emailcc' => isset($options['cc']) ? (string) $options['cc'] : '', - 'sendtobcc' => isset($options['bcc']) ? (string) $options['bcc'] : '', - 'emailbcc' => isset($options['bcc']) ? (string) $options['bcc'] : '', - 'replyto' => isset($options['replyto']) ? (string) $options['replyto'] : '', - 'emailreplyto' => isset($options['replyto']) ? (string) $options['replyto'] : '', - 'deliveryreceipt' => !empty($options['deliveryreceipt']) ? 1 : 0, - 'trackid' => !empty($options['trackid']) ? (string) $options['trackid'] : 'timesheetweek-'.$this->id.'-'.$triggerCode, - 'substitutions' => $substitutions, - 'substitutionarray' => $substitutions, - 'mail_substitutions' => $substitutions, - 'array_substitutions' => $substitutions, - 'files' => isset($options['files']) && is_array($options['files']) ? $options['files'] : array(), - 'filearray' => isset($options['files']) && is_array($options['files']) ? $options['files'] : array(), - 'filename' => isset($options['filenames']) && is_array($options['filenames']) ? $options['filenames'] : array(), - 'filenameList' => isset($options['filenames']) && is_array($options['filenames']) ? $options['filenames'] : array(), - 'mimetype' => isset($options['mimetypes']) && is_array($options['mimetypes']) ? $options['mimetypes'] : array(), - 'mimetypeList' => isset($options['mimetypes']) && is_array($options['mimetypes']) ? $options['mimetypes'] : array(), - 'joinfiles' => isset($options['files']) && is_array($options['files']) ? $options['files'] : array(), - 'mode' => 'email', - 'recipient' => $recipient, - 'email' => $sendto, - 'context' => $this->context, - 'moreinval' => array('context' => $this->context, 'timesheetweek' => $this), - 'params' => isset($options['params']) && is_array($options['params']) ? $options['params'] : array(), - 'options' => $options, + 'trigger' => $triggerCode, + 'action' => $triggerCode, + 'code' => $triggerCode, + 'event' => $triggerCode, + 'user' => $actionUser, + 'actionuser' => $actionUser, + 'actor' => $actionUser, + 'currentuser' => $actionUser, + 'langs' => $langs, + 'language' => $langs, + 'conf' => $conf, + 'subject' => isset($options['subject']) ? (string) $options['subject'] : '', + 'message' => $message, + 'content' => $htmlMessage, + 'body' => $htmlMessage, + 'sendto' => $sendto, + 'emailto' => $sendto, + 'email_to' => $sendto, + 'sendtolist' => $sendto, + 'sendtocc' => isset($options['cc']) ? (string) $options['cc'] : '', + 'emailcc' => isset($options['cc']) ? (string) $options['cc'] : '', + 'sendtobcc' => isset($options['bcc']) ? (string) $options['bcc'] : '', + 'emailbcc' => isset($options['bcc']) ? (string) $options['bcc'] : '', + 'replyto' => isset($options['replyto']) ? (string) $options['replyto'] : '', + 'emailreplyto' => isset($options['replyto']) ? (string) $options['replyto'] : '', + 'deliveryreceipt' => !empty($options['deliveryreceipt']) ? 1 : 0, + 'trackid' => !empty($options['trackid']) ? (string) $options['trackid'] : 'timesheetweek-'.$this->id.'-'.$triggerCode, + 'substitutions' => $substitutions, + 'substitutionarray' => $substitutions, + 'mail_substitutions' => $substitutions, + 'array_substitutions' => $substitutions, + 'files' => isset($options['files']) && is_array($options['files']) ? $options['files'] : array(), + 'filearray' => isset($options['files']) && is_array($options['files']) ? $options['files'] : array(), + 'filename' => isset($options['filenames']) && is_array($options['filenames']) ? $options['filenames'] : array(), + 'filenameList' => isset($options['filenames']) && is_array($options['filenames']) ? $options['filenames'] : array(), + 'mimetype' => isset($options['mimetypes']) && is_array($options['mimetypes']) ? $options['mimetypes'] : array(), + 'mimetypeList' => isset($options['mimetypes']) && is_array($options['mimetypes']) ? $options['mimetypes'] : array(), + 'joinfiles' => isset($options['files']) && is_array($options['files']) ? $options['files'] : array(), + 'mode' => 'email', + 'recipient' => $recipient, + 'email' => $sendto, + 'message_html' => $htmlMessage, + 'html' => $htmlMessage, + 'ishtml' => $isHtml, + 'msgishtml' => $isHtml, + 'context' => $this->context, + 'moreinval' => array('context' => $this->context, 'timesheetweek' => $this), + 'params' => isset($options['params']) && is_array($options['params']) ? $options['params'] : array(), + 'options' => $options, ); foreach ($methods as $methodName) { @@ -1953,6 +1960,12 @@ protected function mapMailMethodArguments(array $signature, array $payload) $value = $payload['subject']; } elseif ((strpos($lower, 'message') !== false || strpos($lower, 'content') !== false || strpos($lower, 'body') !== false) && isset($payload['message'])) { $value = $payload['message']; + } elseif (strpos($lower, 'html') !== false) { + if (strpos($lower, 'message') !== false && isset($payload['message_html'])) { + $value = $payload['message_html']; + } elseif (isset($payload['ishtml'])) { + $value = $payload['ishtml']; + } } elseif (strpos($lower, 'reply') !== false && isset($payload['replyto'])) { $value = $payload['replyto']; } elseif (strpos($lower, 'cc') !== false && isset($payload['sendtocc'])) { diff --git a/class/timesheetweek_reminder.class.php b/class/timesheetweek_reminder.class.php index 7f3e984..22f0a54 100644 --- a/class/timesheetweek_reminder.class.php +++ b/class/timesheetweek_reminder.class.php @@ -282,7 +282,7 @@ public function run($dbInstance = null, $limit = 0, $forcerun = 0, array $target $this->output = $langs->trans('TimesheetWeekReminderSendSuccess', $emailsSent); dol_syslog(__METHOD__.' sent='.$emailsSent, LOG_DEBUG); - return $emailsSent; + return 0; } /** * Send a reminder test email to the current user using the configured template. diff --git a/core/modules/modTimesheetWeek.class.php b/core/modules/modTimesheetWeek.class.php index 3795b57..1ebb66e 100644 --- a/core/modules/modTimesheetWeek.class.php +++ b/core/modules/modTimesheetWeek.class.php @@ -112,7 +112,7 @@ public function __construct($db) } // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated', 'experimental_deprecated' or a version string like 'x.y.z' -$this->version = '1.6.1'; + $this->version = '1.6.2'; // Url to the file with your last numberversion of this module $this->url_last_version = 'https://moduleversion.lesmetiersdubatiment.fr/ver.php?m=timesheetweek'; diff --git a/core/triggers/interface_99_modTimesheetWeek_TimesheetWeekTriggers.class.php b/core/triggers/interface_99_modTimesheetWeek_TimesheetWeekTriggers.class.php index c94edff..28ccf96 100644 --- a/core/triggers/interface_99_modTimesheetWeek_TimesheetWeekTriggers.class.php +++ b/core/triggers/interface_99_modTimesheetWeek_TimesheetWeekTriggers.class.php @@ -118,7 +118,7 @@ protected function handleActionCreateNotification($event, User $actionUser, $lan return 0; } - $meta = $this->buildNotificationData($timesheet, $actionUser, $langs); + $meta = $this->buildNotificationData($timesheet, $actionUser, $langs, $conf); $baseSubstitutions = $meta['base_substitutions']; if (!is_array($timesheet->context)) { @@ -187,12 +187,13 @@ protected function sendNotification($action, TimesheetWeek $timesheet, User $act $templateKeys = array(); $recipients = array(); - $meta = $this->buildNotificationData($timesheet, $actionUser, $langs); + $meta = $this->buildNotificationData($timesheet, $actionUser, $langs, $conf); $employee = $meta['employee']; $validator = $meta['validator']; $employeeName = $meta['employee_name']; $validatorName = $meta['validator_name']; $actionUserName = $meta['action_user_name']; + $mailSignature = $meta['mail_signature']; $baseSubstitutions = $meta['base_substitutions']; $url = $meta['url']; @@ -268,6 +269,7 @@ protected function sendNotification($action, TimesheetWeek $timesheet, User $act $substitutions = $baseSubstitutions; $substitutions['__RECIPIENT_FULLNAME__'] = $recipient->getFullName($langs); + $substitutions['__TIMESHEETWEEK_MAIL_SIGNATURE__'] = $mailSignature; $template = null; $tplResult = 0; @@ -295,16 +297,17 @@ protected function sendNotification($action, TimesheetWeek $timesheet, User $act $emailFrom = $conf->global->MAIN_INFO_SOCIETE_MAIL; } - if ($tplResult > 0 && $template) { - $subjectTemplate = !empty($template->subject) ? $template->subject : $template->topic; - $bodyTemplate = $template->content; + if ($tplResult > 0 && $template) { + $subjectTemplate = !empty($template->subject) ? $template->subject : $template->topic; + $bodyTemplate = $template->content; - $subject = make_substitutions($subjectTemplate, $substitutions); - $message = make_substitutions($bodyTemplate, $substitutions); + $subject = make_substitutions($subjectTemplate, $substitutions); + $subject = dol_html_entity_decode($subject, ENT_QUOTES); + $message = make_substitutions($bodyTemplate, $substitutions); - if (!empty($template->email_from)) { - $emailFrom = make_substitutions($template->email_from, $substitutions); - } + if (!empty($template->email_from)) { + $emailFrom = make_substitutions($template->email_from, $substitutions); + } $templateTo = ''; if (!empty($template->email_to)) { @@ -353,9 +356,10 @@ protected function sendNotification($action, TimesheetWeek $timesheet, User $act } } } - } else { - $recipientName = $recipient->getFullName($langs); - $subject = $langs->trans($subjectKey, $timesheet->ref); + } else { + $recipientName = $recipient->getFullName($langs); + $subject = $langs->trans($subjectKey, $timesheet->ref); + $subject = dol_html_entity_decode($subject, ENT_QUOTES); if ($action === 'TIMESHEETWEEK_SUBMITTED') { $messageArgs = array( @@ -365,7 +369,7 @@ protected function sendNotification($action, TimesheetWeek $timesheet, User $act $timesheet->week, $timesheet->year, $url, - $actionUserName, + $mailSignature, ); } else { $messageArgs = array( @@ -375,7 +379,7 @@ protected function sendNotification($action, TimesheetWeek $timesheet, User $act $timesheet->year, $actionUserName, $url, - $actionUserName, + $mailSignature, ); } @@ -405,51 +409,56 @@ protected function sendNotification($action, TimesheetWeek $timesheet, User $act } } - if (empty($subject) || empty($message)) { - dol_syslog(__METHOD__.': '.$langs->trans('TimesheetWeekNotificationMailError', 'Empty template'), LOG_WARNING); - continue; - } + if (empty($subject) || empty($message)) { + dol_syslog(__METHOD__.': '.$langs->trans('TimesheetWeekNotificationMailError', 'Empty template'), LOG_WARNING); + continue; + } - $sendto = implode(',', array_unique(array_filter($sendtoList))); - $cc = implode(',', array_unique(array_filter($ccList))); - $bcc = implode(',', array_unique(array_filter($bccList))); - - $nativeResult = $timesheet->sendNativeMailNotification( - $action, - $actionUser, - $recipient, - $langs, - $conf, - $substitutions, - array( - 'subject' => $subject, - 'message' => $message, - 'sendto' => $sendto, - 'cc' => $cc, - 'bcc' => $bcc, - 'replyto' => $emailFrom, - 'trackid' => 'timesheetweek-'.$timesheet->id.'-'.$action.'-'.($recipient ? (int) $recipient->id : 0), - ) - ); - - if ($nativeResult > 0) { - $sent += $nativeResult; - continue; - } + $sendto = implode(',', array_unique(array_filter($sendtoList))); + $cc = implode(',', array_unique(array_filter($ccList))); + $bcc = implode(',', array_unique(array_filter($bccList))); + $messageHtml = !empty($template) ? $message : dol_nl2br($message); + $trackId = 'timesheetweek-'.$timesheet->id.'-'.$action.'-'.($recipient ? (int) $recipient->id : 0); + $isHtml = 1; + + $nativeResult = $timesheet->sendNativeMailNotification( + $action, + $actionUser, + $recipient, + $langs, + $conf, + $substitutions, + array( + 'subject' => $subject, + 'message' => $message, + 'message_html' => $messageHtml, + 'sendto' => $sendto, + 'cc' => $cc, + 'bcc' => $bcc, + 'replyto' => $emailFrom, + 'trackid' => $trackId, + 'ishtml' => $isHtml, + ) + ); + + if ($nativeResult > 0) { + $sent += $nativeResult; + continue; + } - $mail = new CMailFile($subject, $sendto, $emailFrom, $message, array(), array(), array(), $cc, $bcc, 0, 0); - if ($mail->sendfile()) { - $sent++; - } else { - $errmsg = $mail->error ? $mail->error : 'Unknown error'; - dol_syslog(__METHOD__.': '.$langs->trans('TimesheetWeekNotificationMailError', $errmsg), LOG_WARNING); - } - } + $mail = new CMailFile($subject, $sendto, $emailFrom, $messageHtml, array(), array(), array(), $cc, $bcc, 0, $isHtml, '', '', $trackId); + if ($mail->sendfile()) { + $sent++; + } else { + $errmsg = $mail->error ? $mail->error : 'Unknown error'; + dol_syslog(__METHOD__.': '.$langs->trans('TimesheetWeekNotificationMailError', $errmsg), LOG_WARNING); + } + } - return $sent; - } + return $sent; + } - /** + /** * Dispatch business notifications relying on Dolibarr's Notification module. * * FR : Déclenche les notifications métier en s'appuyant sur le module Notification natif. @@ -468,7 +477,7 @@ protected function dispatchBusinessNotification($action, TimesheetWeek $timeshee return 0; } - $meta = $this->buildNotificationData($timesheet, $actionUser, $langs); + $meta = $this->buildNotificationData($timesheet, $actionUser, $langs, $conf); $baseSubstitutions = $meta['base_substitutions']; if (!is_array($timesheet->context)) { @@ -752,49 +761,74 @@ protected function createDefaultTemplate($templateClass, array $templateKeys, $a dol_syslog(__METHOD__.': failed to create default template for '.$action.' - '.(!empty($template->error) ? $template->error : 'unknown error'), LOG_WARNING); } - return null; - } - - /** - * Build common notification metadata reused across automatic e-mails and business notifications. - * - * FR : Construit les métadonnées partagées par les e-mails automatiques et les notifications métiers. - * EN : Build the metadata shared by automatic e-mails and business notifications. - * - * @param TimesheetWeek $timesheet - * @param User $actionUser - * @param Translate $langs - * @return array - */ - protected function buildNotificationData(TimesheetWeek $timesheet, User $actionUser, $langs) - { - $employee = $this->fetchUser($timesheet->fk_user); - $validator = $this->fetchUser($timesheet->fk_user_valid); - - $employeeName = $employee ? $employee->getFullName($langs) : ''; - $validatorName = $validator ? $validator->getFullName($langs) : ''; - $actionUserName = $actionUser->getFullName($langs); - $url = dol_buildpath('/timesheetweek/timesheetweek_card.php', 2).'?id='.(int) $timesheet->id; - - $baseSubstitutions = array( - '__TIMESHEETWEEK_REF__' => $timesheet->ref, - '__TIMESHEETWEEK_WEEK__' => $timesheet->week, - '__TIMESHEETWEEK_YEAR__' => $timesheet->year, - '__TIMESHEETWEEK_URL__' => $url, - '__TIMESHEETWEEK_EMPLOYEE_FULLNAME__' => $employeeName, - '__TIMESHEETWEEK_VALIDATOR_FULLNAME__' => $validatorName, - '__ACTION_USER_FULLNAME__' => $actionUserName, - '__RECIPIENT_FULLNAME__' => '', - ); - - return array( - 'employee' => $employee, - 'validator' => $validator, - 'employee_name' => $employeeName, - 'validator_name' => $validatorName, - 'action_user_name' => $actionUserName, - 'url' => $url, - 'base_substitutions' => $baseSubstitutions, - ); - } -} + return null; + } + + /** + * Build notification signature depending on Dolibarr configuration. + * + * @param Translate $langs + * @param Conf $conf + * + * @return string + */ + protected function buildMailSignature($langs, $conf) + { + $signature = ''; + if (!empty($conf->global->MAIN_APPLICATION_TITLE)) { + $signature = $langs->transnoentities('TimesheetWeekMailSignatureWithAppTitle', $conf->global->MAIN_APPLICATION_TITLE); + } else { + $companyName = !empty($conf->global->MAIN_INFO_SOCIETE_NOM) ? $conf->global->MAIN_INFO_SOCIETE_NOM : ''; + $signature = $langs->transnoentities('TimesheetWeekMailSignatureWithoutAppTitle', $companyName); + } + + return $signature; + } + + /** + * Build common notification metadata reused across automatic e-mails and business notifications. + * + * FR : Construit les métadonnées partagées par les e-mails automatiques et les notifications métiers. + * EN : Build the metadata shared by automatic e-mails and business notifications. + * + * @param TimesheetWeek $timesheet + * @param User $actionUser + * @param Translate $langs + * @param Conf $conf + * @return array + */ + protected function buildNotificationData(TimesheetWeek $timesheet, User $actionUser, $langs, $conf) + { + $employee = $this->fetchUser($timesheet->fk_user); + $validator = $this->fetchUser($timesheet->fk_user_valid); + + $employeeName = $employee ? $employee->getFullName($langs) : ''; + $validatorName = $validator ? $validator->getFullName($langs) : ''; + $actionUserName = $actionUser->getFullName($langs); + $url = dol_buildpath('/timesheetweek/timesheetweek_card.php', 2).'?id='.(int) $timesheet->id; + $mailSignature = $this->buildMailSignature($langs, $conf); + + $baseSubstitutions = array( + '__TIMESHEETWEEK_REF__' => $timesheet->ref, + '__TIMESHEETWEEK_WEEK__' => $timesheet->week, + '__TIMESHEETWEEK_YEAR__' => $timesheet->year, + '__TIMESHEETWEEK_URL__' => $url, + '__TIMESHEETWEEK_EMPLOYEE_FULLNAME__' => $employeeName, + '__TIMESHEETWEEK_VALIDATOR_FULLNAME__' => $validatorName, + '__ACTION_USER_FULLNAME__' => $actionUserName, + '__TIMESHEETWEEK_MAIL_SIGNATURE__' => $mailSignature, + '__RECIPIENT_FULLNAME__' => '', + ); + + return array( + 'employee' => $employee, + 'validator' => $validator, + 'employee_name' => $employeeName, + 'validator_name' => $validatorName, + 'action_user_name' => $actionUserName, + 'mail_signature' => $mailSignature, + 'url' => $url, + 'base_substitutions' => $baseSubstitutions, + ); + } + } diff --git a/langs/de_DE/timesheetweek.lang b/langs/de_DE/timesheetweek.lang new file mode 100644 index 0000000..4997181 --- /dev/null +++ b/langs/de_DE/timesheetweek.lang @@ -0,0 +1,311 @@ +# Translation file + +# +# Generic +# + +# Module label 'ModuleTimesheetWeekName' +ModuleTimesheetWeekName = Weekly timesheets +# Module description 'ModuleTimesheetWeekDesc' +ModuleTimesheetWeekDesc = Module to Manage Timesheets in Dolibarr + +# +# Admin page +# +TimesheetWeekSetup = TimesheetWeek setup +Settings = Settings +TimesheetWeekSetupPage = TimesheetWeek setup page +TimesheetWeekNumberingHelp = Choose the numbering mask that will generate references for weekly timesheets. +TimesheetWeekNumberingEmpty = No numbering module is available. +TimesheetWeekNumberingActivate = Activate this mask +TimesheetWeekPDFModelsHelp = Enable the PDF templates that can be generated from a weekly timesheet. +TimesheetWeekPDFModelsEmpty = No PDF template is available. +PDFStandardTimesheetWeekDescription = Standard PDF model for weekly timesheets +TimesheetWeekPdfReferenceLabel = Timesheet reference: %s +TimesheetWeekPdfApprovedDetails = Approved on %s by %s +TimesheetWeekDailyRateOptions = Daily-rate options +TimesheetWeekDailyRateOptionsHelp = Configure the helpers available for daily-rate contracts. +TimesheetWeekQuarterDayForDailyContract = Quarter-day selector for daily-rate contracts +TimesheetWeekQuarterDayForDailyContractHelp = Allow daily-rate employees to declare quarter days instead of half-days only. +TimesheetWeekReminderSectionTitle = Weekly email reminder +TimesheetWeekReminderSectionHelp = Configure the automatic reminder asking users to fill, validate or send their weekly timesheets. +TimesheetWeekReminderEnabled = Enable automatic reminder +TimesheetWeekReminderEnabledHelp = Turn the weekly reminder on or off. +TimesheetWeekReminderStartTime = Reminder start date and time +TimesheetWeekReminderStartTimeHelp = Choose the exact date and time when the next reminder must start running. +TimesheetWeekReminderStartTimeInvalid = Please select a valid date and time for the reminder start. +TimesheetWeekReminderCronUpdateFailed = Unable to update the cron start date for the reminder task. +TimesheetWeekReminderCronMissing = Reminder cron task not found; please reactivate the module to recreate it. +TimesheetWeekReminderEmailTemplate = Email template for reminder +TimesheetWeekReminderEmailTemplateHelp = Choose the Dolibarr email template used to send the reminder. +TimesheetWeekReminderExcludedUsers = Users excluded from the reminder +TimesheetWeekReminderExcludedUsersHelp = Select users who must not receive the weekly reminder email. +TimesheetWeekReminderCronLabel = Weekly timesheet reminder +TimesheetWeekReminderCronComment = Send weekly reminder emails prompting users to complete their timesheets. +TimesheetWeekReminderTemplateMissing = Reminder email template is not configured. +TimesheetWeekReminderSendFailed = Failed to send the reminder email to %s. +TimesheetWeekReminderSendSuccess = Reminder email successfully sent to %s. +TimesheetWeekReminderSendTest = Send test email +TimesheetWeekReminderTestSuccess = Test reminder email sent +TimesheetWeekReminderTestError = Unable to send the test reminder email. +TimesheetWeekReminderTemplateLabel = Timesheetweek - Timesheet reminder +TimesheetWeekReminderTemplateSubject = Timesheet submission reminder +TimesheetWeekReminderTemplateBody = Hello __TSW_USER_FIRSTNAME__,\nPlease submit your weekly timesheet before Monday 8:00.\n__TSW_TIMESHEET_NEW_URL__\nRegards, __TSW_DOLIBARR_TITLE__ +NewSection=New section +TIMESHEETWEEK_MYPARAM1 = My param 1 +TIMESHEETWEEK_MYPARAM1Tooltip = My param 1 tooltip +TIMESHEETWEEK_MYPARAM2=My param 2 +TIMESHEETWEEK_MYPARAM2Tooltip=My param 2 tooltip + +# +# Multicompany sharing +# +TIMESHEETWEEKSharing = TimesheetWeek sharing +TIMESHEETWEEKSharingDescription = Configure Multicompany sharing for weekly timesheets. +ShareTimesheetWeek = Share weekly timesheets +ShareTimesheetweek = Share weekly timesheets +ShareTimesheetWeekTooltip = Allow entities to access the same weekly timesheets across the group. +ShareTimesheetWeekNumbering = Share weekly timesheet numbering +ShareTimesheetweeknumbering = Share weekly timesheet numbering +ShareTimesheetWeekNumberingTooltip = Synchronize numbering sequences for weekly timesheets between entities. +SelectWeekPlaceholder = -- Select a week -- + + +# +# About page +# +About = About +TimesheetWeekAbout = About TimesheetWeek +TimesheetWeekAboutPage = TimesheetWeek about page +TimesheetWeekAboutGeneral = General information +TimesheetWeekAboutVersion = Version +TimesheetWeekAboutFamily = Family +TimesheetWeekAboutDescription = Description +TimesheetWeekAboutMaintainer = Publisher +TimesheetWeekAboutResources = Resources +TimesheetWeekAboutDocumentation = Documentation +TimesheetWeekAboutDocumentationLink = Open the README +TimesheetWeekAboutSupport = Support +TimesheetWeekAboutSupportValue = Reach your integrator or the Dolistore support team for any request. +TimesheetWeekAboutContact = Publisher website +TimesheetWeekDescription = TimesheetWeek module to manage entry, approval and reporting of weekly timesheets. + +# +# Sample page +# +TimesheetWeekArea = Home TimesheetWeek +Timesheet = Timesheet +TimesheetWeek = Timesheet week +TimesheetWeek_List = List of timesheet weeks +TimesheetWeekList = Timesheet weeks +ListTimesheetWeek = Timesheet weeks +NewTimesheetWeek = New timesheet week +QuickCreateTimesheetWeek = Quick-create a weekly timesheet +List TimesheetWeek = Timesheet weeks +New TimesheetWeek = New timesheet week +ShowTimesheetWeek = Show timesheet week %s +MyPageName = My page name + +# +# Sample widget +# +MyWidget = My widget +MyWidgetDescription = My widget description + +# +# Errors & status changes +# +BadStatusForSubmit = This timesheet cannot be submitted from its current status. +NoLineToSubmit = No lines to submit on this timesheet. +RefGenerationFailed = Unable to generate a definitive reference for the timesheet. +BadStatusForApprove = Only submitted timesheets can be approved. +BadStatusForRefuse = Only submitted timesheets can be refused. +AlreadyDraft = This timesheet is already in draft status. +TimesheetSaved = Timesheet saved. +Lines = lines +InvalidWeekFormat = Invalid week format (expected YYYY-Www). +TimesheetIsNotEditable = This timesheet cannot be edited in its current status. +NoHoursToSubmit = No hours have been recorded on this timesheet. +TimesheetSubmitted = Timesheet submitted. +TimesheetApproved = Timesheet approved. +TimesheetRefused = Timesheet refused. +TimesheetSealed = Timesheet sealed. +TimesheetUnsealed = Timesheet unsealed. +StatusSetToDraft = Timesheet set back to draft status. +ActionNotAllowedOnThisStatus = This action is not allowed on the current status. +CannotSetDraftWhenSealed = A sealed timesheet must be unsealed before returning to draft status. +TimesheetWeekRedirectExisting = A timesheet already exists for this week. Redirecting to the existing sheet. +Draft = Draft +Submitted = Submitted +Approved = Approved +Refused = Refused +SealTimesheet = Seal +UnsealTimesheet = Unseal +ConfirmValidate = Do you confirm the approval of this timesheet? +ConfirmRefuse = Do you confirm the refusal of this timesheet? +Refuse = Refuse +ApproveSelection = Approve selection +RefuseSelection = Refuse selection +SealSelection = Seal selection +DeleteSelection = Delete selection +TimesheetWeekMassApproveSuccess = %s timesheet(s) approved. +TimesheetWeekMassRefuseSuccess = %s timesheet(s) refused. +TimesheetWeekMassSealSuccess = %s timesheet(s) sealed. +TimesheetWeekMassActionErrors = Unable to process: %s. +TimesheetWeekMassDeleteOnlyDraft = Only draft timesheets can be deleted in bulk. +GenerateSummaryPdf = Generate summary PDF +TimesheetWeekMassMergePdf = Generate merged PDF for selected timesheets +TimesheetWeekMassMergeForbidden = You are not allowed to access timesheet %s +TimesheetWeekMassMergeGenerationFailed = Failed to generate PDF for %s +TimesheetWeekMassMergeMissingFile = Unable to find the generated PDF for %s +TimesheetWeekMassMergeNoEligible = No PDF could be generated from the selected timesheets +TimesheetWeekMassMergeError = Failed to merge the selected timesheets into a single PDF +TimesheetWeekMassMergeSuccess = Merged PDF generated successfully +TimesheetWeekSummaryNoSelection = Please select at least one timesheet to create the summary. +TimesheetWeekSummaryUnauthorizedSheet = Some selected timesheets were ignored because you are not allowed to read them. +TimesheetWeekSummaryMissingUser = The employee linked to a selected timesheet no longer exists. +TimesheetWeekSummaryNoData = No readable timesheet was found in the selection. +TimesheetWeekSummaryTitle = Weekly timesheets summary +TimesheetWeekSummaryGeneratedOn = Generated on %s +TimesheetWeekSummaryGeneratedOnBy = Generated on %s by %s +TimesheetWeekSummaryColumnWeek = Week +TimesheetWeekSummaryColumnStart = Start date +TimesheetWeekSummaryColumnEnd = End date +TimesheetWeekSummaryColumnTotalHours = Declared hours +TimesheetWeekSummaryColumnTotalDays = Declared days +TimesheetWeekSummaryColumnContractHours = Contract hours +TimesheetWeekSummaryColumnContractDays = Contract days +TimesheetWeekSummaryColumnOvertime = Overtime +TimesheetWeekSummaryColumnMeals = Meal allowances +TimesheetWeekSummaryColumnZone1 = Zone 1 trips +TimesheetWeekSummaryColumnZone2 = Zone 2 trips +TimesheetWeekSummaryColumnZone3 = Zone 3 trips +TimesheetWeekSummaryColumnZone4 = Zone 4 trips +TimesheetWeekSummaryColumnZone5 = Zone 5 trips +TimesheetWeekSummaryColumnStatus = Status +TimesheetWeekSummaryColumnApprovedBy = Approved by +TimesheetWeekSummaryStatusApprovedBy = Approved by %s +TimesheetWeekSummaryStatusSealedBy = Sealed by %s +TimesheetWeekSummaryUserTitle = %s +TimesheetWeekSummaryTotalsLabel = Totals +TimesheetWeekSummaryTableTooTall = The summary for %s contains too many rows to fit on a single page. +TimesheetWeekSummaryGenerated = Summary PDF ready. +TimesheetWeekSummaryFilename = Weekly timesheets summary - Week %s to %s.pdf +TimesheetWeekSummaryHeaderWeekRange = Week #%1$s %2$s +TimesheetWeekPreviewPdf = PDF preview +TimesheetWeekDownloadPdf = PDF download + +TimesheetWeekStatusDraft = Draft +TimesheetWeekStatusSubmitted = Submitted +TimesheetWeekStatusApproved = Approved +TimesheetWeekStatusSealed = Sealed +TimesheetWeekStatusRefused = Refused +BadStatusForSeal = Only approved timesheets can be sealed. +BadStatusForUnseal = Only sealed timesheets can be unsealed. +TimesheetWeekAgendaCreated = Timesheet %s created. +TimesheetWeekAgendaSubmitted = Timesheet %s submitted. +TimesheetWeekDailyRateLabel = Daily rate contract +TimesheetWeekDailyRateFullDay = Full day +TimesheetWeekDailyRateMorning = Morning +TimesheetWeekDailyRateAfternoon = Afternoon +TimesheetWeekDailyRateOneDay = 1 day +TimesheetWeekDailyRateHalfDay = 0.5 day +TimesheetWeekDailyRateQuarterDay = 0.25 day +TimesheetWeekDailyRateDurationsLegend = Available daily-rate durations: %1$s / %2$s / %3$s +LastModification = Last modification +TotalDays = Total days +TimesheetWeekTotalDays = Total days +TimesheetWeekAgendaApproved = Timesheet %s approved. +TimesheetWeekAgendaRefused = Timesheet %s refused. +TimesheetWeekAgendaSealed = Timesheet %s sealed. +TimesheetWeekAgendaUnsealed = Timesheet %s unsealed. +TimesheetWeekAgendaReopened = Timesheet %s reopened to draft. +TimesheetWeekAgendaDeleted = Timesheet %s deleted. +TimesheetWeekAgendaDefaultLabel = Timesheet %s activity. +AgendaEventCreationFailed = Unable to create the agenda event linked to this timesheet. +AssignedTasks = Assigned tasks +NoTasksAssigned = No tasks are assigned for this week. +ProjectTaskColumn = Project / Task +Meal = Meal +Meals = Meals +Zone = Zone +Zone1Count = Zone 1 days +Zone2Count = Zone 2 days +Zone3Count = Zone 3 days +Zone4Count = Zone 4 days +Zone5Count = Zone 5 days +MealCount = Meals count +TotalHours = Total hours +Overtime = Overtime +TimesheetWeekMailDefaultSubject = Timesheet %s +TimesheetWeekMailDefaultBody = Hello,\n\nPlease find the weekly timesheet %s (week %s / %s).\n\nBest regards, +TimesheetWeekMailSendToHelp = Separate email addresses with commas. +Sendbymail = Send by mail +TimesheetWeekNotificationSubmitSubject = Timesheet %s submitted +TimesheetWeekNotificationSubmitBody = Hello %s,\n\nThe employee %s submitted the timesheet %s for week %s/%s.\nYou can review it here: %s\n\n%s +TimesheetWeekNotificationApproveSubject = Timesheet %s approved +TimesheetWeekNotificationApproveBody = Hello %s,\n\nYour timesheet %s for week %s/%s was approved by %s.\nYou can review it here: %s\n\n%s +TimesheetWeekNotificationRefuseSubject = Timesheet %s refused +TimesheetWeekNotificationRefuseBody = Hello %s,\n\nYour timesheet %s for week %s/%s was refused by %s.\nYou can review it here: %s\n\n%s +TimesheetWeekNotificationMissingRecipient = No recipient available for notification (%s). +TimesheetWeekNotificationMailError = Unable to send notification email: %s +TimesheetWeekNotificationNoEmail = The recipient %s has no email address. +Validator = User responsible for approval +TimesheetWeekNotificationValidatorFallback = User responsible for approval +TimesheetWeekNotificationEmployeeFallback = Employee +TimesheetWeekAjaxForbidden = You are not allowed to update this timesheet. +TimesheetWeekAjaxUpdateError = Unable to update field %s. +TimesheetWeekAjaxUpdateSuccess = Field %s updated successfully. +TimesheetWeekConfirmMassDelete = Do you confirm the deletion of the %s selected timesheets? +TimesheetWeekErrorNoSelection = Please select at least one timesheet before launching a mass action. +TimesheetWeekDayMonday = Monday +TimesheetWeekDayTuesday = Tuesday +TimesheetWeekDayWednesday = Wednesday +TimesheetWeekDayThursday = Thursday +TimesheetWeekDayFriday = Friday +TimesheetWeekDaySaturday = Saturday +TimesheetWeekDaySunday = Sunday +TimesheetWeekNotificationTriggerError = Unable to execute notification trigger %s. +Notify_TIMESHEETWEEK_SUBMIT = Timesheet submitted +Notify_TIMESHEETWEEK_APPROVE = Timesheet approved +Notify_TIMESHEETWEEK_REFUSE = Timesheet refused +TimesheetWeekElementTimeNote = Timesheet %s - %s - %s +ErrorFailedToLoadEmailTemplateClass = Failed to load email template manager class. + +TimesheetWeekTemplateSubmitLabel = Timesheet submission notification +TimesheetWeekTemplateSubmitSubject = Timesheet __TIMESHEETWEEK_REF__ submitted by __TIMESHEETWEEK_EMPLOYEE_FULLNAME__ +TimesheetWeekTemplateSubmitBody = Hello __RECIPIENT_FULLNAME__,\n\nThe employee __TIMESHEETWEEK_EMPLOYEE_FULLNAME__ submitted the timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ +TimesheetWeekTemplateApproveLabel = Timesheet approval notification +TimesheetWeekTemplateApproveSubject = Timesheet __TIMESHEETWEEK_REF__ approved +TimesheetWeekTemplateApproveBody = Hello __RECIPIENT_FULLNAME__,\n\nYour timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__ was approved by __TIMESHEETWEEK_VALIDATOR_FULLNAME__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ +TimesheetWeekTemplateRefuseLabel = Timesheet refusal notification +TimesheetWeekTemplateRefuseSubject = Timesheet __TIMESHEETWEEK_REF__ refused +TimesheetWeekTemplateRefuseBody = Hello __RECIPIENT_FULLNAME__,\n\nYour timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__ was refused by __TIMESHEETWEEK_VALIDATOR_FULLNAME__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ + +TimesheetWeekPDFModels = TimesheetWeek PDF templates + +ModelEnabled = Model %s enabled + +ModelDisabled = Model %s disabled + +# +# Permissions +# +TimesheetWeekRightReadOwn = Read his own timesheets +TimesheetWeekRightReadChild = Read subordinates' timesheets +TimesheetWeekRightReadAll = Read all timesheets +TimesheetWeekRightWriteOwn = Create/Update own timesheets +TimesheetWeekRightWriteChild = Create/Update subordinates' timesheets +TimesheetWeekRightWriteAll = Create/Update all timesheets +TimesheetWeekRightDeleteOwn = Delete own timesheets +TimesheetWeekRightDeleteChild = Delete subordinates' timesheets +TimesheetWeekRightDeleteAll = Delete all timesheets +TimesheetWeekRightValidateGeneric = Validate timesheets (generic) +TimesheetWeekRightValidateOwn = Validate own timesheets +TimesheetWeekRightValidateChild = Validate subordinates' timesheets +TimesheetWeekRightValidateAll = Validate all timesheets +TimesheetWeekRightSeal = Seal timesheets +TimesheetWeekRightUnseal = Unseal timesheets + +TimesheetWeekMailSignatureWithAppTitle = Best regards,\n%s +TimesheetWeekMailSignatureWithoutAppTitle = Best regards,\nYour Dolibarr %s. diff --git a/langs/en_US/timesheetweek.lang b/langs/en_US/timesheetweek.lang index 90c399f..4997181 100644 --- a/langs/en_US/timesheetweek.lang +++ b/langs/en_US/timesheetweek.lang @@ -242,11 +242,11 @@ TimesheetWeekMailDefaultBody = Hello,\n\nPlease find the weekly timesheet %s (we TimesheetWeekMailSendToHelp = Separate email addresses with commas. Sendbymail = Send by mail TimesheetWeekNotificationSubmitSubject = Timesheet %s submitted -TimesheetWeekNotificationSubmitBody = Hello %s,\n\nThe employee %s submitted the timesheet %s for week %s/%s.\nYou can review it here: %s\n\nBest regards,\n%s +TimesheetWeekNotificationSubmitBody = Hello %s,\n\nThe employee %s submitted the timesheet %s for week %s/%s.\nYou can review it here: %s\n\n%s TimesheetWeekNotificationApproveSubject = Timesheet %s approved -TimesheetWeekNotificationApproveBody = Hello %s,\n\nYour timesheet %s for week %s/%s was approved by %s.\nYou can review it here: %s\n\nBest regards,\n%s +TimesheetWeekNotificationApproveBody = Hello %s,\n\nYour timesheet %s for week %s/%s was approved by %s.\nYou can review it here: %s\n\n%s TimesheetWeekNotificationRefuseSubject = Timesheet %s refused -TimesheetWeekNotificationRefuseBody = Hello %s,\n\nYour timesheet %s for week %s/%s was refused by %s.\nYou can review it here: %s\n\nBest regards,\n%s +TimesheetWeekNotificationRefuseBody = Hello %s,\n\nYour timesheet %s for week %s/%s was refused by %s.\nYou can review it here: %s\n\n%s TimesheetWeekNotificationMissingRecipient = No recipient available for notification (%s). TimesheetWeekNotificationMailError = Unable to send notification email: %s TimesheetWeekNotificationNoEmail = The recipient %s has no email address. @@ -274,13 +274,13 @@ ErrorFailedToLoadEmailTemplateClass = Failed to load email template manager clas TimesheetWeekTemplateSubmitLabel = Timesheet submission notification TimesheetWeekTemplateSubmitSubject = Timesheet __TIMESHEETWEEK_REF__ submitted by __TIMESHEETWEEK_EMPLOYEE_FULLNAME__ -TimesheetWeekTemplateSubmitBody = Hello __RECIPIENT_FULLNAME__,\n\nThe employee __TIMESHEETWEEK_EMPLOYEE_FULLNAME__ submitted the timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\nBest regards,\n__ACTION_USER_FULLNAME__ +TimesheetWeekTemplateSubmitBody = Hello __RECIPIENT_FULLNAME__,\n\nThe employee __TIMESHEETWEEK_EMPLOYEE_FULLNAME__ submitted the timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ TimesheetWeekTemplateApproveLabel = Timesheet approval notification TimesheetWeekTemplateApproveSubject = Timesheet __TIMESHEETWEEK_REF__ approved -TimesheetWeekTemplateApproveBody = Hello __RECIPIENT_FULLNAME__,\n\nYour timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__ was approved by __TIMESHEETWEEK_VALIDATOR_FULLNAME__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\nBest regards,\n__ACTION_USER_FULLNAME__ +TimesheetWeekTemplateApproveBody = Hello __RECIPIENT_FULLNAME__,\n\nYour timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__ was approved by __TIMESHEETWEEK_VALIDATOR_FULLNAME__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ TimesheetWeekTemplateRefuseLabel = Timesheet refusal notification TimesheetWeekTemplateRefuseSubject = Timesheet __TIMESHEETWEEK_REF__ refused -TimesheetWeekTemplateRefuseBody = Hello __RECIPIENT_FULLNAME__,\n\nYour timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__ was refused by __TIMESHEETWEEK_VALIDATOR_FULLNAME__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\nBest regards,\n__ACTION_USER_FULLNAME__ +TimesheetWeekTemplateRefuseBody = Hello __RECIPIENT_FULLNAME__,\n\nYour timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__ was refused by __TIMESHEETWEEK_VALIDATOR_FULLNAME__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ TimesheetWeekPDFModels = TimesheetWeek PDF templates @@ -306,3 +306,6 @@ TimesheetWeekRightValidateChild = Validate subordinates' timesheets TimesheetWeekRightValidateAll = Validate all timesheets TimesheetWeekRightSeal = Seal timesheets TimesheetWeekRightUnseal = Unseal timesheets + +TimesheetWeekMailSignatureWithAppTitle = Best regards,\n%s +TimesheetWeekMailSignatureWithoutAppTitle = Best regards,\nYour Dolibarr %s. diff --git a/langs/es_ES/timesheetweek.lang b/langs/es_ES/timesheetweek.lang new file mode 100644 index 0000000..4997181 --- /dev/null +++ b/langs/es_ES/timesheetweek.lang @@ -0,0 +1,311 @@ +# Translation file + +# +# Generic +# + +# Module label 'ModuleTimesheetWeekName' +ModuleTimesheetWeekName = Weekly timesheets +# Module description 'ModuleTimesheetWeekDesc' +ModuleTimesheetWeekDesc = Module to Manage Timesheets in Dolibarr + +# +# Admin page +# +TimesheetWeekSetup = TimesheetWeek setup +Settings = Settings +TimesheetWeekSetupPage = TimesheetWeek setup page +TimesheetWeekNumberingHelp = Choose the numbering mask that will generate references for weekly timesheets. +TimesheetWeekNumberingEmpty = No numbering module is available. +TimesheetWeekNumberingActivate = Activate this mask +TimesheetWeekPDFModelsHelp = Enable the PDF templates that can be generated from a weekly timesheet. +TimesheetWeekPDFModelsEmpty = No PDF template is available. +PDFStandardTimesheetWeekDescription = Standard PDF model for weekly timesheets +TimesheetWeekPdfReferenceLabel = Timesheet reference: %s +TimesheetWeekPdfApprovedDetails = Approved on %s by %s +TimesheetWeekDailyRateOptions = Daily-rate options +TimesheetWeekDailyRateOptionsHelp = Configure the helpers available for daily-rate contracts. +TimesheetWeekQuarterDayForDailyContract = Quarter-day selector for daily-rate contracts +TimesheetWeekQuarterDayForDailyContractHelp = Allow daily-rate employees to declare quarter days instead of half-days only. +TimesheetWeekReminderSectionTitle = Weekly email reminder +TimesheetWeekReminderSectionHelp = Configure the automatic reminder asking users to fill, validate or send their weekly timesheets. +TimesheetWeekReminderEnabled = Enable automatic reminder +TimesheetWeekReminderEnabledHelp = Turn the weekly reminder on or off. +TimesheetWeekReminderStartTime = Reminder start date and time +TimesheetWeekReminderStartTimeHelp = Choose the exact date and time when the next reminder must start running. +TimesheetWeekReminderStartTimeInvalid = Please select a valid date and time for the reminder start. +TimesheetWeekReminderCronUpdateFailed = Unable to update the cron start date for the reminder task. +TimesheetWeekReminderCronMissing = Reminder cron task not found; please reactivate the module to recreate it. +TimesheetWeekReminderEmailTemplate = Email template for reminder +TimesheetWeekReminderEmailTemplateHelp = Choose the Dolibarr email template used to send the reminder. +TimesheetWeekReminderExcludedUsers = Users excluded from the reminder +TimesheetWeekReminderExcludedUsersHelp = Select users who must not receive the weekly reminder email. +TimesheetWeekReminderCronLabel = Weekly timesheet reminder +TimesheetWeekReminderCronComment = Send weekly reminder emails prompting users to complete their timesheets. +TimesheetWeekReminderTemplateMissing = Reminder email template is not configured. +TimesheetWeekReminderSendFailed = Failed to send the reminder email to %s. +TimesheetWeekReminderSendSuccess = Reminder email successfully sent to %s. +TimesheetWeekReminderSendTest = Send test email +TimesheetWeekReminderTestSuccess = Test reminder email sent +TimesheetWeekReminderTestError = Unable to send the test reminder email. +TimesheetWeekReminderTemplateLabel = Timesheetweek - Timesheet reminder +TimesheetWeekReminderTemplateSubject = Timesheet submission reminder +TimesheetWeekReminderTemplateBody = Hello __TSW_USER_FIRSTNAME__,\nPlease submit your weekly timesheet before Monday 8:00.\n__TSW_TIMESHEET_NEW_URL__\nRegards, __TSW_DOLIBARR_TITLE__ +NewSection=New section +TIMESHEETWEEK_MYPARAM1 = My param 1 +TIMESHEETWEEK_MYPARAM1Tooltip = My param 1 tooltip +TIMESHEETWEEK_MYPARAM2=My param 2 +TIMESHEETWEEK_MYPARAM2Tooltip=My param 2 tooltip + +# +# Multicompany sharing +# +TIMESHEETWEEKSharing = TimesheetWeek sharing +TIMESHEETWEEKSharingDescription = Configure Multicompany sharing for weekly timesheets. +ShareTimesheetWeek = Share weekly timesheets +ShareTimesheetweek = Share weekly timesheets +ShareTimesheetWeekTooltip = Allow entities to access the same weekly timesheets across the group. +ShareTimesheetWeekNumbering = Share weekly timesheet numbering +ShareTimesheetweeknumbering = Share weekly timesheet numbering +ShareTimesheetWeekNumberingTooltip = Synchronize numbering sequences for weekly timesheets between entities. +SelectWeekPlaceholder = -- Select a week -- + + +# +# About page +# +About = About +TimesheetWeekAbout = About TimesheetWeek +TimesheetWeekAboutPage = TimesheetWeek about page +TimesheetWeekAboutGeneral = General information +TimesheetWeekAboutVersion = Version +TimesheetWeekAboutFamily = Family +TimesheetWeekAboutDescription = Description +TimesheetWeekAboutMaintainer = Publisher +TimesheetWeekAboutResources = Resources +TimesheetWeekAboutDocumentation = Documentation +TimesheetWeekAboutDocumentationLink = Open the README +TimesheetWeekAboutSupport = Support +TimesheetWeekAboutSupportValue = Reach your integrator or the Dolistore support team for any request. +TimesheetWeekAboutContact = Publisher website +TimesheetWeekDescription = TimesheetWeek module to manage entry, approval and reporting of weekly timesheets. + +# +# Sample page +# +TimesheetWeekArea = Home TimesheetWeek +Timesheet = Timesheet +TimesheetWeek = Timesheet week +TimesheetWeek_List = List of timesheet weeks +TimesheetWeekList = Timesheet weeks +ListTimesheetWeek = Timesheet weeks +NewTimesheetWeek = New timesheet week +QuickCreateTimesheetWeek = Quick-create a weekly timesheet +List TimesheetWeek = Timesheet weeks +New TimesheetWeek = New timesheet week +ShowTimesheetWeek = Show timesheet week %s +MyPageName = My page name + +# +# Sample widget +# +MyWidget = My widget +MyWidgetDescription = My widget description + +# +# Errors & status changes +# +BadStatusForSubmit = This timesheet cannot be submitted from its current status. +NoLineToSubmit = No lines to submit on this timesheet. +RefGenerationFailed = Unable to generate a definitive reference for the timesheet. +BadStatusForApprove = Only submitted timesheets can be approved. +BadStatusForRefuse = Only submitted timesheets can be refused. +AlreadyDraft = This timesheet is already in draft status. +TimesheetSaved = Timesheet saved. +Lines = lines +InvalidWeekFormat = Invalid week format (expected YYYY-Www). +TimesheetIsNotEditable = This timesheet cannot be edited in its current status. +NoHoursToSubmit = No hours have been recorded on this timesheet. +TimesheetSubmitted = Timesheet submitted. +TimesheetApproved = Timesheet approved. +TimesheetRefused = Timesheet refused. +TimesheetSealed = Timesheet sealed. +TimesheetUnsealed = Timesheet unsealed. +StatusSetToDraft = Timesheet set back to draft status. +ActionNotAllowedOnThisStatus = This action is not allowed on the current status. +CannotSetDraftWhenSealed = A sealed timesheet must be unsealed before returning to draft status. +TimesheetWeekRedirectExisting = A timesheet already exists for this week. Redirecting to the existing sheet. +Draft = Draft +Submitted = Submitted +Approved = Approved +Refused = Refused +SealTimesheet = Seal +UnsealTimesheet = Unseal +ConfirmValidate = Do you confirm the approval of this timesheet? +ConfirmRefuse = Do you confirm the refusal of this timesheet? +Refuse = Refuse +ApproveSelection = Approve selection +RefuseSelection = Refuse selection +SealSelection = Seal selection +DeleteSelection = Delete selection +TimesheetWeekMassApproveSuccess = %s timesheet(s) approved. +TimesheetWeekMassRefuseSuccess = %s timesheet(s) refused. +TimesheetWeekMassSealSuccess = %s timesheet(s) sealed. +TimesheetWeekMassActionErrors = Unable to process: %s. +TimesheetWeekMassDeleteOnlyDraft = Only draft timesheets can be deleted in bulk. +GenerateSummaryPdf = Generate summary PDF +TimesheetWeekMassMergePdf = Generate merged PDF for selected timesheets +TimesheetWeekMassMergeForbidden = You are not allowed to access timesheet %s +TimesheetWeekMassMergeGenerationFailed = Failed to generate PDF for %s +TimesheetWeekMassMergeMissingFile = Unable to find the generated PDF for %s +TimesheetWeekMassMergeNoEligible = No PDF could be generated from the selected timesheets +TimesheetWeekMassMergeError = Failed to merge the selected timesheets into a single PDF +TimesheetWeekMassMergeSuccess = Merged PDF generated successfully +TimesheetWeekSummaryNoSelection = Please select at least one timesheet to create the summary. +TimesheetWeekSummaryUnauthorizedSheet = Some selected timesheets were ignored because you are not allowed to read them. +TimesheetWeekSummaryMissingUser = The employee linked to a selected timesheet no longer exists. +TimesheetWeekSummaryNoData = No readable timesheet was found in the selection. +TimesheetWeekSummaryTitle = Weekly timesheets summary +TimesheetWeekSummaryGeneratedOn = Generated on %s +TimesheetWeekSummaryGeneratedOnBy = Generated on %s by %s +TimesheetWeekSummaryColumnWeek = Week +TimesheetWeekSummaryColumnStart = Start date +TimesheetWeekSummaryColumnEnd = End date +TimesheetWeekSummaryColumnTotalHours = Declared hours +TimesheetWeekSummaryColumnTotalDays = Declared days +TimesheetWeekSummaryColumnContractHours = Contract hours +TimesheetWeekSummaryColumnContractDays = Contract days +TimesheetWeekSummaryColumnOvertime = Overtime +TimesheetWeekSummaryColumnMeals = Meal allowances +TimesheetWeekSummaryColumnZone1 = Zone 1 trips +TimesheetWeekSummaryColumnZone2 = Zone 2 trips +TimesheetWeekSummaryColumnZone3 = Zone 3 trips +TimesheetWeekSummaryColumnZone4 = Zone 4 trips +TimesheetWeekSummaryColumnZone5 = Zone 5 trips +TimesheetWeekSummaryColumnStatus = Status +TimesheetWeekSummaryColumnApprovedBy = Approved by +TimesheetWeekSummaryStatusApprovedBy = Approved by %s +TimesheetWeekSummaryStatusSealedBy = Sealed by %s +TimesheetWeekSummaryUserTitle = %s +TimesheetWeekSummaryTotalsLabel = Totals +TimesheetWeekSummaryTableTooTall = The summary for %s contains too many rows to fit on a single page. +TimesheetWeekSummaryGenerated = Summary PDF ready. +TimesheetWeekSummaryFilename = Weekly timesheets summary - Week %s to %s.pdf +TimesheetWeekSummaryHeaderWeekRange = Week #%1$s %2$s +TimesheetWeekPreviewPdf = PDF preview +TimesheetWeekDownloadPdf = PDF download + +TimesheetWeekStatusDraft = Draft +TimesheetWeekStatusSubmitted = Submitted +TimesheetWeekStatusApproved = Approved +TimesheetWeekStatusSealed = Sealed +TimesheetWeekStatusRefused = Refused +BadStatusForSeal = Only approved timesheets can be sealed. +BadStatusForUnseal = Only sealed timesheets can be unsealed. +TimesheetWeekAgendaCreated = Timesheet %s created. +TimesheetWeekAgendaSubmitted = Timesheet %s submitted. +TimesheetWeekDailyRateLabel = Daily rate contract +TimesheetWeekDailyRateFullDay = Full day +TimesheetWeekDailyRateMorning = Morning +TimesheetWeekDailyRateAfternoon = Afternoon +TimesheetWeekDailyRateOneDay = 1 day +TimesheetWeekDailyRateHalfDay = 0.5 day +TimesheetWeekDailyRateQuarterDay = 0.25 day +TimesheetWeekDailyRateDurationsLegend = Available daily-rate durations: %1$s / %2$s / %3$s +LastModification = Last modification +TotalDays = Total days +TimesheetWeekTotalDays = Total days +TimesheetWeekAgendaApproved = Timesheet %s approved. +TimesheetWeekAgendaRefused = Timesheet %s refused. +TimesheetWeekAgendaSealed = Timesheet %s sealed. +TimesheetWeekAgendaUnsealed = Timesheet %s unsealed. +TimesheetWeekAgendaReopened = Timesheet %s reopened to draft. +TimesheetWeekAgendaDeleted = Timesheet %s deleted. +TimesheetWeekAgendaDefaultLabel = Timesheet %s activity. +AgendaEventCreationFailed = Unable to create the agenda event linked to this timesheet. +AssignedTasks = Assigned tasks +NoTasksAssigned = No tasks are assigned for this week. +ProjectTaskColumn = Project / Task +Meal = Meal +Meals = Meals +Zone = Zone +Zone1Count = Zone 1 days +Zone2Count = Zone 2 days +Zone3Count = Zone 3 days +Zone4Count = Zone 4 days +Zone5Count = Zone 5 days +MealCount = Meals count +TotalHours = Total hours +Overtime = Overtime +TimesheetWeekMailDefaultSubject = Timesheet %s +TimesheetWeekMailDefaultBody = Hello,\n\nPlease find the weekly timesheet %s (week %s / %s).\n\nBest regards, +TimesheetWeekMailSendToHelp = Separate email addresses with commas. +Sendbymail = Send by mail +TimesheetWeekNotificationSubmitSubject = Timesheet %s submitted +TimesheetWeekNotificationSubmitBody = Hello %s,\n\nThe employee %s submitted the timesheet %s for week %s/%s.\nYou can review it here: %s\n\n%s +TimesheetWeekNotificationApproveSubject = Timesheet %s approved +TimesheetWeekNotificationApproveBody = Hello %s,\n\nYour timesheet %s for week %s/%s was approved by %s.\nYou can review it here: %s\n\n%s +TimesheetWeekNotificationRefuseSubject = Timesheet %s refused +TimesheetWeekNotificationRefuseBody = Hello %s,\n\nYour timesheet %s for week %s/%s was refused by %s.\nYou can review it here: %s\n\n%s +TimesheetWeekNotificationMissingRecipient = No recipient available for notification (%s). +TimesheetWeekNotificationMailError = Unable to send notification email: %s +TimesheetWeekNotificationNoEmail = The recipient %s has no email address. +Validator = User responsible for approval +TimesheetWeekNotificationValidatorFallback = User responsible for approval +TimesheetWeekNotificationEmployeeFallback = Employee +TimesheetWeekAjaxForbidden = You are not allowed to update this timesheet. +TimesheetWeekAjaxUpdateError = Unable to update field %s. +TimesheetWeekAjaxUpdateSuccess = Field %s updated successfully. +TimesheetWeekConfirmMassDelete = Do you confirm the deletion of the %s selected timesheets? +TimesheetWeekErrorNoSelection = Please select at least one timesheet before launching a mass action. +TimesheetWeekDayMonday = Monday +TimesheetWeekDayTuesday = Tuesday +TimesheetWeekDayWednesday = Wednesday +TimesheetWeekDayThursday = Thursday +TimesheetWeekDayFriday = Friday +TimesheetWeekDaySaturday = Saturday +TimesheetWeekDaySunday = Sunday +TimesheetWeekNotificationTriggerError = Unable to execute notification trigger %s. +Notify_TIMESHEETWEEK_SUBMIT = Timesheet submitted +Notify_TIMESHEETWEEK_APPROVE = Timesheet approved +Notify_TIMESHEETWEEK_REFUSE = Timesheet refused +TimesheetWeekElementTimeNote = Timesheet %s - %s - %s +ErrorFailedToLoadEmailTemplateClass = Failed to load email template manager class. + +TimesheetWeekTemplateSubmitLabel = Timesheet submission notification +TimesheetWeekTemplateSubmitSubject = Timesheet __TIMESHEETWEEK_REF__ submitted by __TIMESHEETWEEK_EMPLOYEE_FULLNAME__ +TimesheetWeekTemplateSubmitBody = Hello __RECIPIENT_FULLNAME__,\n\nThe employee __TIMESHEETWEEK_EMPLOYEE_FULLNAME__ submitted the timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ +TimesheetWeekTemplateApproveLabel = Timesheet approval notification +TimesheetWeekTemplateApproveSubject = Timesheet __TIMESHEETWEEK_REF__ approved +TimesheetWeekTemplateApproveBody = Hello __RECIPIENT_FULLNAME__,\n\nYour timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__ was approved by __TIMESHEETWEEK_VALIDATOR_FULLNAME__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ +TimesheetWeekTemplateRefuseLabel = Timesheet refusal notification +TimesheetWeekTemplateRefuseSubject = Timesheet __TIMESHEETWEEK_REF__ refused +TimesheetWeekTemplateRefuseBody = Hello __RECIPIENT_FULLNAME__,\n\nYour timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__ was refused by __TIMESHEETWEEK_VALIDATOR_FULLNAME__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ + +TimesheetWeekPDFModels = TimesheetWeek PDF templates + +ModelEnabled = Model %s enabled + +ModelDisabled = Model %s disabled + +# +# Permissions +# +TimesheetWeekRightReadOwn = Read his own timesheets +TimesheetWeekRightReadChild = Read subordinates' timesheets +TimesheetWeekRightReadAll = Read all timesheets +TimesheetWeekRightWriteOwn = Create/Update own timesheets +TimesheetWeekRightWriteChild = Create/Update subordinates' timesheets +TimesheetWeekRightWriteAll = Create/Update all timesheets +TimesheetWeekRightDeleteOwn = Delete own timesheets +TimesheetWeekRightDeleteChild = Delete subordinates' timesheets +TimesheetWeekRightDeleteAll = Delete all timesheets +TimesheetWeekRightValidateGeneric = Validate timesheets (generic) +TimesheetWeekRightValidateOwn = Validate own timesheets +TimesheetWeekRightValidateChild = Validate subordinates' timesheets +TimesheetWeekRightValidateAll = Validate all timesheets +TimesheetWeekRightSeal = Seal timesheets +TimesheetWeekRightUnseal = Unseal timesheets + +TimesheetWeekMailSignatureWithAppTitle = Best regards,\n%s +TimesheetWeekMailSignatureWithoutAppTitle = Best regards,\nYour Dolibarr %s. diff --git a/langs/fr_FR/timesheetweek.lang b/langs/fr_FR/timesheetweek.lang index ed38a7d..f749f81 100644 --- a/langs/fr_FR/timesheetweek.lang +++ b/langs/fr_FR/timesheetweek.lang @@ -230,11 +230,11 @@ TimesheetWeekMailDefaultBody = Bonjour,\n\nVeuillez trouver la feuille de temps TimesheetWeekMailSendToHelp = Séparez les adresses e-mail par des virgules. Sendbymail = Envoyer par mail TimesheetWeekNotificationSubmitSubject = Feuille de temps %s soumise -TimesheetWeekNotificationSubmitBody = Bonjour %s,\n\nLe salarié %s a soumis la feuille de temps %s pour la semaine %s/%s.\nVous pouvez la consulter ici : %s\n\nCordialement,\n%s +TimesheetWeekNotificationSubmitBody = Bonjour %s,\n\nLe salarié %s a soumis la feuille de temps %s pour la semaine %s/%s.\nVous pouvez la consulter ici : %s\n\n%s TimesheetWeekNotificationApproveSubject = Feuille de temps %s approuvée -TimesheetWeekNotificationApproveBody = Bonjour %s,\n\nVotre feuille de temps %s pour la semaine %s/%s est désormais approuvée par %s.\nVous pouvez la consulter ici : %s\n\nCordialement,\n%s +TimesheetWeekNotificationApproveBody = Bonjour %s,\n\nVotre feuille de temps %s pour la semaine %s/%s est désormais approuvée par %s.\nVous pouvez la consulter ici : %s\n\n%s TimesheetWeekNotificationRefuseSubject = Feuille de temps %s refusée -TimesheetWeekNotificationRefuseBody = Bonjour %s,\n\nVotre feuille de temps %s pour la semaine %s/%s a été refusée par %s.\nVous pouvez la consulter ici : %s\n\nCordialement,\n%s +TimesheetWeekNotificationRefuseBody = Bonjour %s,\n\nVotre feuille de temps %s pour la semaine %s/%s a été refusée par %s.\nVous pouvez la consulter ici : %s\n\n%s TimesheetWeekNotificationMissingRecipient = Aucun destinataire défini pour la notification (%s). TimesheetWeekNotificationMailError = Impossible d'envoyer la notification e-mail : %s TimesheetWeekNotificationNoEmail = Le destinataire %s n'a pas d'adresse e-mail. @@ -262,13 +262,13 @@ ErrorFailedToLoadEmailTemplateClass = Impossible de charger la classe de gestion TimesheetWeekTemplateSubmitLabel = Notification de soumission de feuille de temps TimesheetWeekTemplateSubmitSubject = Feuille de temps __TIMESHEETWEEK_REF__ soumise par __TIMESHEETWEEK_EMPLOYEE_FULLNAME__ -TimesheetWeekTemplateSubmitBody = Bonjour __RECIPIENT_FULLNAME__,\n\nLe salarié __TIMESHEETWEEK_EMPLOYEE_FULLNAME__ a soumis la feuille de temps __TIMESHEETWEEK_REF__ pour la semaine __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__.\nVous pouvez la consulter ici : __TIMESHEETWEEK_URL__\n\nCordialement,\n__ACTION_USER_FULLNAME__ +TimesheetWeekTemplateSubmitBody = Bonjour __RECIPIENT_FULLNAME__,\n\nLe salarié __TIMESHEETWEEK_EMPLOYEE_FULLNAME__ a soumis la feuille de temps __TIMESHEETWEEK_REF__ pour la semaine __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__.\nVous pouvez la consulter ici : __TIMESHEETWEEK_URL__\n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ TimesheetWeekTemplateApproveLabel = Notification d'approbation de feuille de temps TimesheetWeekTemplateApproveSubject = Feuille de temps __TIMESHEETWEEK_REF__ approuvée -TimesheetWeekTemplateApproveBody = Bonjour __RECIPIENT_FULLNAME__,\n\nVotre feuille de temps __TIMESHEETWEEK_REF__ pour la semaine __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__ est désormais approuvée par __TIMESHEETWEEK_VALIDATOR_FULLNAME__.\nVous pouvez la consulter ici : __TIMESHEETWEEK_URL__\n\nCordialement,\n__ACTION_USER_FULLNAME__ +TimesheetWeekTemplateApproveBody = Bonjour __RECIPIENT_FULLNAME__,\n\nVotre feuille de temps __TIMESHEETWEEK_REF__ pour la semaine __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__ est désormais approuvée par __TIMESHEETWEEK_VALIDATOR_FULLNAME__.\nVous pouvez la consulter ici : __TIMESHEETWEEK_URL__\n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ TimesheetWeekTemplateRefuseLabel = Notification de refus de feuille de temps TimesheetWeekTemplateRefuseSubject = Feuille de temps __TIMESHEETWEEK_REF__ refusée -TimesheetWeekTemplateRefuseBody = Bonjour __RECIPIENT_FULLNAME__,\n\nVotre feuille de temps __TIMESHEETWEEK_REF__ pour la semaine __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__ a été refusée par __TIMESHEETWEEK_VALIDATOR_FULLNAME__.\nVous pouvez la consulter ici : __TIMESHEETWEEK_URL__\n\nCordialement,\n__ACTION_USER_FULLNAME__ +TimesheetWeekTemplateRefuseBody = \n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ TimesheetWeekPDFModels = Modèles PDF TimesheetWeek @@ -306,3 +306,6 @@ TimesheetWeekRightValidateChild = Valider les feuilles des subordonnés TimesheetWeekRightValidateAll = Valider toutes les feuilles de temps TimesheetWeekRightSeal = Sceller les feuilles de temps TimesheetWeekRightUnseal = Desceller les feuilles de temps + +TimesheetWeekMailSignatureWithAppTitle = Cordialement,\n%s +TimesheetWeekMailSignatureWithoutAppTitle = Cordialement,\nVotre Dolibarr %s. diff --git a/langs/it_IT/timesheetweek.lang b/langs/it_IT/timesheetweek.lang new file mode 100644 index 0000000..4997181 --- /dev/null +++ b/langs/it_IT/timesheetweek.lang @@ -0,0 +1,311 @@ +# Translation file + +# +# Generic +# + +# Module label 'ModuleTimesheetWeekName' +ModuleTimesheetWeekName = Weekly timesheets +# Module description 'ModuleTimesheetWeekDesc' +ModuleTimesheetWeekDesc = Module to Manage Timesheets in Dolibarr + +# +# Admin page +# +TimesheetWeekSetup = TimesheetWeek setup +Settings = Settings +TimesheetWeekSetupPage = TimesheetWeek setup page +TimesheetWeekNumberingHelp = Choose the numbering mask that will generate references for weekly timesheets. +TimesheetWeekNumberingEmpty = No numbering module is available. +TimesheetWeekNumberingActivate = Activate this mask +TimesheetWeekPDFModelsHelp = Enable the PDF templates that can be generated from a weekly timesheet. +TimesheetWeekPDFModelsEmpty = No PDF template is available. +PDFStandardTimesheetWeekDescription = Standard PDF model for weekly timesheets +TimesheetWeekPdfReferenceLabel = Timesheet reference: %s +TimesheetWeekPdfApprovedDetails = Approved on %s by %s +TimesheetWeekDailyRateOptions = Daily-rate options +TimesheetWeekDailyRateOptionsHelp = Configure the helpers available for daily-rate contracts. +TimesheetWeekQuarterDayForDailyContract = Quarter-day selector for daily-rate contracts +TimesheetWeekQuarterDayForDailyContractHelp = Allow daily-rate employees to declare quarter days instead of half-days only. +TimesheetWeekReminderSectionTitle = Weekly email reminder +TimesheetWeekReminderSectionHelp = Configure the automatic reminder asking users to fill, validate or send their weekly timesheets. +TimesheetWeekReminderEnabled = Enable automatic reminder +TimesheetWeekReminderEnabledHelp = Turn the weekly reminder on or off. +TimesheetWeekReminderStartTime = Reminder start date and time +TimesheetWeekReminderStartTimeHelp = Choose the exact date and time when the next reminder must start running. +TimesheetWeekReminderStartTimeInvalid = Please select a valid date and time for the reminder start. +TimesheetWeekReminderCronUpdateFailed = Unable to update the cron start date for the reminder task. +TimesheetWeekReminderCronMissing = Reminder cron task not found; please reactivate the module to recreate it. +TimesheetWeekReminderEmailTemplate = Email template for reminder +TimesheetWeekReminderEmailTemplateHelp = Choose the Dolibarr email template used to send the reminder. +TimesheetWeekReminderExcludedUsers = Users excluded from the reminder +TimesheetWeekReminderExcludedUsersHelp = Select users who must not receive the weekly reminder email. +TimesheetWeekReminderCronLabel = Weekly timesheet reminder +TimesheetWeekReminderCronComment = Send weekly reminder emails prompting users to complete their timesheets. +TimesheetWeekReminderTemplateMissing = Reminder email template is not configured. +TimesheetWeekReminderSendFailed = Failed to send the reminder email to %s. +TimesheetWeekReminderSendSuccess = Reminder email successfully sent to %s. +TimesheetWeekReminderSendTest = Send test email +TimesheetWeekReminderTestSuccess = Test reminder email sent +TimesheetWeekReminderTestError = Unable to send the test reminder email. +TimesheetWeekReminderTemplateLabel = Timesheetweek - Timesheet reminder +TimesheetWeekReminderTemplateSubject = Timesheet submission reminder +TimesheetWeekReminderTemplateBody = Hello __TSW_USER_FIRSTNAME__,\nPlease submit your weekly timesheet before Monday 8:00.\n__TSW_TIMESHEET_NEW_URL__\nRegards, __TSW_DOLIBARR_TITLE__ +NewSection=New section +TIMESHEETWEEK_MYPARAM1 = My param 1 +TIMESHEETWEEK_MYPARAM1Tooltip = My param 1 tooltip +TIMESHEETWEEK_MYPARAM2=My param 2 +TIMESHEETWEEK_MYPARAM2Tooltip=My param 2 tooltip + +# +# Multicompany sharing +# +TIMESHEETWEEKSharing = TimesheetWeek sharing +TIMESHEETWEEKSharingDescription = Configure Multicompany sharing for weekly timesheets. +ShareTimesheetWeek = Share weekly timesheets +ShareTimesheetweek = Share weekly timesheets +ShareTimesheetWeekTooltip = Allow entities to access the same weekly timesheets across the group. +ShareTimesheetWeekNumbering = Share weekly timesheet numbering +ShareTimesheetweeknumbering = Share weekly timesheet numbering +ShareTimesheetWeekNumberingTooltip = Synchronize numbering sequences for weekly timesheets between entities. +SelectWeekPlaceholder = -- Select a week -- + + +# +# About page +# +About = About +TimesheetWeekAbout = About TimesheetWeek +TimesheetWeekAboutPage = TimesheetWeek about page +TimesheetWeekAboutGeneral = General information +TimesheetWeekAboutVersion = Version +TimesheetWeekAboutFamily = Family +TimesheetWeekAboutDescription = Description +TimesheetWeekAboutMaintainer = Publisher +TimesheetWeekAboutResources = Resources +TimesheetWeekAboutDocumentation = Documentation +TimesheetWeekAboutDocumentationLink = Open the README +TimesheetWeekAboutSupport = Support +TimesheetWeekAboutSupportValue = Reach your integrator or the Dolistore support team for any request. +TimesheetWeekAboutContact = Publisher website +TimesheetWeekDescription = TimesheetWeek module to manage entry, approval and reporting of weekly timesheets. + +# +# Sample page +# +TimesheetWeekArea = Home TimesheetWeek +Timesheet = Timesheet +TimesheetWeek = Timesheet week +TimesheetWeek_List = List of timesheet weeks +TimesheetWeekList = Timesheet weeks +ListTimesheetWeek = Timesheet weeks +NewTimesheetWeek = New timesheet week +QuickCreateTimesheetWeek = Quick-create a weekly timesheet +List TimesheetWeek = Timesheet weeks +New TimesheetWeek = New timesheet week +ShowTimesheetWeek = Show timesheet week %s +MyPageName = My page name + +# +# Sample widget +# +MyWidget = My widget +MyWidgetDescription = My widget description + +# +# Errors & status changes +# +BadStatusForSubmit = This timesheet cannot be submitted from its current status. +NoLineToSubmit = No lines to submit on this timesheet. +RefGenerationFailed = Unable to generate a definitive reference for the timesheet. +BadStatusForApprove = Only submitted timesheets can be approved. +BadStatusForRefuse = Only submitted timesheets can be refused. +AlreadyDraft = This timesheet is already in draft status. +TimesheetSaved = Timesheet saved. +Lines = lines +InvalidWeekFormat = Invalid week format (expected YYYY-Www). +TimesheetIsNotEditable = This timesheet cannot be edited in its current status. +NoHoursToSubmit = No hours have been recorded on this timesheet. +TimesheetSubmitted = Timesheet submitted. +TimesheetApproved = Timesheet approved. +TimesheetRefused = Timesheet refused. +TimesheetSealed = Timesheet sealed. +TimesheetUnsealed = Timesheet unsealed. +StatusSetToDraft = Timesheet set back to draft status. +ActionNotAllowedOnThisStatus = This action is not allowed on the current status. +CannotSetDraftWhenSealed = A sealed timesheet must be unsealed before returning to draft status. +TimesheetWeekRedirectExisting = A timesheet already exists for this week. Redirecting to the existing sheet. +Draft = Draft +Submitted = Submitted +Approved = Approved +Refused = Refused +SealTimesheet = Seal +UnsealTimesheet = Unseal +ConfirmValidate = Do you confirm the approval of this timesheet? +ConfirmRefuse = Do you confirm the refusal of this timesheet? +Refuse = Refuse +ApproveSelection = Approve selection +RefuseSelection = Refuse selection +SealSelection = Seal selection +DeleteSelection = Delete selection +TimesheetWeekMassApproveSuccess = %s timesheet(s) approved. +TimesheetWeekMassRefuseSuccess = %s timesheet(s) refused. +TimesheetWeekMassSealSuccess = %s timesheet(s) sealed. +TimesheetWeekMassActionErrors = Unable to process: %s. +TimesheetWeekMassDeleteOnlyDraft = Only draft timesheets can be deleted in bulk. +GenerateSummaryPdf = Generate summary PDF +TimesheetWeekMassMergePdf = Generate merged PDF for selected timesheets +TimesheetWeekMassMergeForbidden = You are not allowed to access timesheet %s +TimesheetWeekMassMergeGenerationFailed = Failed to generate PDF for %s +TimesheetWeekMassMergeMissingFile = Unable to find the generated PDF for %s +TimesheetWeekMassMergeNoEligible = No PDF could be generated from the selected timesheets +TimesheetWeekMassMergeError = Failed to merge the selected timesheets into a single PDF +TimesheetWeekMassMergeSuccess = Merged PDF generated successfully +TimesheetWeekSummaryNoSelection = Please select at least one timesheet to create the summary. +TimesheetWeekSummaryUnauthorizedSheet = Some selected timesheets were ignored because you are not allowed to read them. +TimesheetWeekSummaryMissingUser = The employee linked to a selected timesheet no longer exists. +TimesheetWeekSummaryNoData = No readable timesheet was found in the selection. +TimesheetWeekSummaryTitle = Weekly timesheets summary +TimesheetWeekSummaryGeneratedOn = Generated on %s +TimesheetWeekSummaryGeneratedOnBy = Generated on %s by %s +TimesheetWeekSummaryColumnWeek = Week +TimesheetWeekSummaryColumnStart = Start date +TimesheetWeekSummaryColumnEnd = End date +TimesheetWeekSummaryColumnTotalHours = Declared hours +TimesheetWeekSummaryColumnTotalDays = Declared days +TimesheetWeekSummaryColumnContractHours = Contract hours +TimesheetWeekSummaryColumnContractDays = Contract days +TimesheetWeekSummaryColumnOvertime = Overtime +TimesheetWeekSummaryColumnMeals = Meal allowances +TimesheetWeekSummaryColumnZone1 = Zone 1 trips +TimesheetWeekSummaryColumnZone2 = Zone 2 trips +TimesheetWeekSummaryColumnZone3 = Zone 3 trips +TimesheetWeekSummaryColumnZone4 = Zone 4 trips +TimesheetWeekSummaryColumnZone5 = Zone 5 trips +TimesheetWeekSummaryColumnStatus = Status +TimesheetWeekSummaryColumnApprovedBy = Approved by +TimesheetWeekSummaryStatusApprovedBy = Approved by %s +TimesheetWeekSummaryStatusSealedBy = Sealed by %s +TimesheetWeekSummaryUserTitle = %s +TimesheetWeekSummaryTotalsLabel = Totals +TimesheetWeekSummaryTableTooTall = The summary for %s contains too many rows to fit on a single page. +TimesheetWeekSummaryGenerated = Summary PDF ready. +TimesheetWeekSummaryFilename = Weekly timesheets summary - Week %s to %s.pdf +TimesheetWeekSummaryHeaderWeekRange = Week #%1$s %2$s +TimesheetWeekPreviewPdf = PDF preview +TimesheetWeekDownloadPdf = PDF download + +TimesheetWeekStatusDraft = Draft +TimesheetWeekStatusSubmitted = Submitted +TimesheetWeekStatusApproved = Approved +TimesheetWeekStatusSealed = Sealed +TimesheetWeekStatusRefused = Refused +BadStatusForSeal = Only approved timesheets can be sealed. +BadStatusForUnseal = Only sealed timesheets can be unsealed. +TimesheetWeekAgendaCreated = Timesheet %s created. +TimesheetWeekAgendaSubmitted = Timesheet %s submitted. +TimesheetWeekDailyRateLabel = Daily rate contract +TimesheetWeekDailyRateFullDay = Full day +TimesheetWeekDailyRateMorning = Morning +TimesheetWeekDailyRateAfternoon = Afternoon +TimesheetWeekDailyRateOneDay = 1 day +TimesheetWeekDailyRateHalfDay = 0.5 day +TimesheetWeekDailyRateQuarterDay = 0.25 day +TimesheetWeekDailyRateDurationsLegend = Available daily-rate durations: %1$s / %2$s / %3$s +LastModification = Last modification +TotalDays = Total days +TimesheetWeekTotalDays = Total days +TimesheetWeekAgendaApproved = Timesheet %s approved. +TimesheetWeekAgendaRefused = Timesheet %s refused. +TimesheetWeekAgendaSealed = Timesheet %s sealed. +TimesheetWeekAgendaUnsealed = Timesheet %s unsealed. +TimesheetWeekAgendaReopened = Timesheet %s reopened to draft. +TimesheetWeekAgendaDeleted = Timesheet %s deleted. +TimesheetWeekAgendaDefaultLabel = Timesheet %s activity. +AgendaEventCreationFailed = Unable to create the agenda event linked to this timesheet. +AssignedTasks = Assigned tasks +NoTasksAssigned = No tasks are assigned for this week. +ProjectTaskColumn = Project / Task +Meal = Meal +Meals = Meals +Zone = Zone +Zone1Count = Zone 1 days +Zone2Count = Zone 2 days +Zone3Count = Zone 3 days +Zone4Count = Zone 4 days +Zone5Count = Zone 5 days +MealCount = Meals count +TotalHours = Total hours +Overtime = Overtime +TimesheetWeekMailDefaultSubject = Timesheet %s +TimesheetWeekMailDefaultBody = Hello,\n\nPlease find the weekly timesheet %s (week %s / %s).\n\nBest regards, +TimesheetWeekMailSendToHelp = Separate email addresses with commas. +Sendbymail = Send by mail +TimesheetWeekNotificationSubmitSubject = Timesheet %s submitted +TimesheetWeekNotificationSubmitBody = Hello %s,\n\nThe employee %s submitted the timesheet %s for week %s/%s.\nYou can review it here: %s\n\n%s +TimesheetWeekNotificationApproveSubject = Timesheet %s approved +TimesheetWeekNotificationApproveBody = Hello %s,\n\nYour timesheet %s for week %s/%s was approved by %s.\nYou can review it here: %s\n\n%s +TimesheetWeekNotificationRefuseSubject = Timesheet %s refused +TimesheetWeekNotificationRefuseBody = Hello %s,\n\nYour timesheet %s for week %s/%s was refused by %s.\nYou can review it here: %s\n\n%s +TimesheetWeekNotificationMissingRecipient = No recipient available for notification (%s). +TimesheetWeekNotificationMailError = Unable to send notification email: %s +TimesheetWeekNotificationNoEmail = The recipient %s has no email address. +Validator = User responsible for approval +TimesheetWeekNotificationValidatorFallback = User responsible for approval +TimesheetWeekNotificationEmployeeFallback = Employee +TimesheetWeekAjaxForbidden = You are not allowed to update this timesheet. +TimesheetWeekAjaxUpdateError = Unable to update field %s. +TimesheetWeekAjaxUpdateSuccess = Field %s updated successfully. +TimesheetWeekConfirmMassDelete = Do you confirm the deletion of the %s selected timesheets? +TimesheetWeekErrorNoSelection = Please select at least one timesheet before launching a mass action. +TimesheetWeekDayMonday = Monday +TimesheetWeekDayTuesday = Tuesday +TimesheetWeekDayWednesday = Wednesday +TimesheetWeekDayThursday = Thursday +TimesheetWeekDayFriday = Friday +TimesheetWeekDaySaturday = Saturday +TimesheetWeekDaySunday = Sunday +TimesheetWeekNotificationTriggerError = Unable to execute notification trigger %s. +Notify_TIMESHEETWEEK_SUBMIT = Timesheet submitted +Notify_TIMESHEETWEEK_APPROVE = Timesheet approved +Notify_TIMESHEETWEEK_REFUSE = Timesheet refused +TimesheetWeekElementTimeNote = Timesheet %s - %s - %s +ErrorFailedToLoadEmailTemplateClass = Failed to load email template manager class. + +TimesheetWeekTemplateSubmitLabel = Timesheet submission notification +TimesheetWeekTemplateSubmitSubject = Timesheet __TIMESHEETWEEK_REF__ submitted by __TIMESHEETWEEK_EMPLOYEE_FULLNAME__ +TimesheetWeekTemplateSubmitBody = Hello __RECIPIENT_FULLNAME__,\n\nThe employee __TIMESHEETWEEK_EMPLOYEE_FULLNAME__ submitted the timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ +TimesheetWeekTemplateApproveLabel = Timesheet approval notification +TimesheetWeekTemplateApproveSubject = Timesheet __TIMESHEETWEEK_REF__ approved +TimesheetWeekTemplateApproveBody = Hello __RECIPIENT_FULLNAME__,\n\nYour timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__ was approved by __TIMESHEETWEEK_VALIDATOR_FULLNAME__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ +TimesheetWeekTemplateRefuseLabel = Timesheet refusal notification +TimesheetWeekTemplateRefuseSubject = Timesheet __TIMESHEETWEEK_REF__ refused +TimesheetWeekTemplateRefuseBody = Hello __RECIPIENT_FULLNAME__,\n\nYour timesheet __TIMESHEETWEEK_REF__ for week __TIMESHEETWEEK_WEEK__/__TIMESHEETWEEK_YEAR__ was refused by __TIMESHEETWEEK_VALIDATOR_FULLNAME__.\nYou can review it here: __TIMESHEETWEEK_URL__\n\n__TIMESHEETWEEK_MAIL_SIGNATURE__ + +TimesheetWeekPDFModels = TimesheetWeek PDF templates + +ModelEnabled = Model %s enabled + +ModelDisabled = Model %s disabled + +# +# Permissions +# +TimesheetWeekRightReadOwn = Read his own timesheets +TimesheetWeekRightReadChild = Read subordinates' timesheets +TimesheetWeekRightReadAll = Read all timesheets +TimesheetWeekRightWriteOwn = Create/Update own timesheets +TimesheetWeekRightWriteChild = Create/Update subordinates' timesheets +TimesheetWeekRightWriteAll = Create/Update all timesheets +TimesheetWeekRightDeleteOwn = Delete own timesheets +TimesheetWeekRightDeleteChild = Delete subordinates' timesheets +TimesheetWeekRightDeleteAll = Delete all timesheets +TimesheetWeekRightValidateGeneric = Validate timesheets (generic) +TimesheetWeekRightValidateOwn = Validate own timesheets +TimesheetWeekRightValidateChild = Validate subordinates' timesheets +TimesheetWeekRightValidateAll = Validate all timesheets +TimesheetWeekRightSeal = Seal timesheets +TimesheetWeekRightUnseal = Unseal timesheets + +TimesheetWeekMailSignatureWithAppTitle = Best regards,\n%s +TimesheetWeekMailSignatureWithoutAppTitle = Best regards,\nYour Dolibarr %s. diff --git a/sql/data.sql b/sql/data.sql index 3df3103..673dd7b 100644 --- a/sql/data.sql +++ b/sql/data.sql @@ -1,6 +1,6 @@ INSERT INTO llx_c_email_templates (entity,module,type_template,lang,private,fk_user,datec,label,position,active,enabled,joinfiles,topic,content) VALUES ( - 1,'timesheetweek','actioncomm_send','fr_FR', 0,NULL, NOW(), + 0,'timesheetweek','actioncomm_send','fr_FR', 0,NULL, NOW(), 'Rappel du vendredi soir', 100, 1,