Added Bcc option for team managers.
authoranuko <support@anuko.com>
Sat, 9 Sep 2017 18:34:41 +0000 (18:34 +0000)
committeranuko <support@anuko.com>
Sat, 9 Sep 2017 18:34:41 +0000 (18:34 +0000)
40 files changed:
WEB-INF/lib/mail/Mailer.class.php
WEB-INF/lib/ttReportHelper.class.php
WEB-INF/lib/ttTeamHelper.class.php
WEB-INF/lib/ttUser.class.php
WEB-INF/resources/ca.lang.php
WEB-INF/resources/cs.lang.php
WEB-INF/resources/da.lang.php
WEB-INF/resources/de.lang.php
WEB-INF/resources/en.lang.php
WEB-INF/resources/es.lang.php
WEB-INF/resources/et.lang.php
WEB-INF/resources/fa.lang.php
WEB-INF/resources/fi.lang.php
WEB-INF/resources/fr.lang.php
WEB-INF/resources/he.lang.php
WEB-INF/resources/hu.lang.php
WEB-INF/resources/it.lang.php
WEB-INF/resources/ja.lang.php
WEB-INF/resources/ko.lang.php
WEB-INF/resources/nl.lang.php
WEB-INF/resources/no.lang.php
WEB-INF/resources/pl.lang.php
WEB-INF/resources/pt-br.lang.php
WEB-INF/resources/pt.lang.php
WEB-INF/resources/ro.lang.php
WEB-INF/resources/ru.lang.php
WEB-INF/resources/sk.lang.php
WEB-INF/resources/sl.lang.php
WEB-INF/resources/sr.lang.php
WEB-INF/resources/sv.lang.php
WEB-INF/resources/tr.lang.php
WEB-INF/resources/zh-cn.lang.php
WEB-INF/resources/zh-tw.lang.php
WEB-INF/templates/footer.tpl
WEB-INF/templates/profile_edit.tpl
dbinstall.php
invoice_send.php
mysql.sql
profile_edit.php
report_send.php

index a52e3c9..2d674ac 100644 (file)
@@ -33,6 +33,7 @@ class Mailer {
   var $mSender;
   var $mReceiver;
   var $mReceiverCC;
+  var $mReceiverBCC;
 
   function __construct($type='mail') {
     $this->mMailMode = $type;
@@ -58,6 +59,10 @@ class Mailer {
     $this->mReceiverCC = $value;
   }
 
+  function setReceiverBCC($value) {
+    $this->mReceiverBCC = $value;
+  }
+
   function setSender($value) {
     $this->mSender = $value;
   }
@@ -68,6 +73,7 @@ class Mailer {
 
     $headers = array('From' => $this->mSender, 'To' => $this->mReceiver);
     if (isset($this->mReceiverCC)) $headers = array_merge($headers, array('CC' => $this->mReceiverCC));
+    if (isset($this->mReceiverBCC)) $headers = array_merge($headers, array('BCC' => $this->mReceiverBCC));
     $headers = array_merge($headers, array(
       'Subject' => $subject,
       'MIME-Version' => '1.0',
@@ -84,11 +90,15 @@ class Mailer {
         break;
 
     case 'smtp':
-        // Mail_smtp does not do CC -> recipients conversion
+        // Mail_smtp does not do CC or BCC -> recipients conversion.
         if (!empty($this->mReceiverCC)) {
           // make exactly one space after a comma
           $recipients .= ', ' . preg_replace('/,[[:space:]]+/', ', ', $this->mReceiverCC);
         }
+        if (!empty($this->mReceiverBCC)) {
+          // make exactly one space after a comma
+          $recipients .= ', ' . preg_replace('/,[[:space:]]+/', ', ', $this->mReceiverBCC);
+        }
 
         $host = defined('MAIL_SMTP_HOST') ? MAIL_SMTP_HOST : 'localhost';
         $port = defined('MAIL_SMTP_PORT') ? MAIL_SMTP_PORT : '25';
index 71cee91..f1fc590 100644 (file)
@@ -1575,7 +1575,7 @@ class ttReportHelper {
   // sendFavReport - sends a favorite report to a specified email, called from cron.php
   static function sendFavReport($report, $email) {
     // We are called from cron.php, we have no $bean in session.
-    // cron.php set global $user and $i18n objects to match our favorite report user.
+    // cron.php sets global $user and $i18n objects to match our favorite report user.
     global $user;
     global $i18n;
 
@@ -1587,6 +1587,8 @@ class ttReportHelper {
     $mailer->setCharSet(CHARSET);
     $mailer->setContentType('text/html');
     $mailer->setSender(SENDER);
+    if (!empty($user->bcc_email))
+      $mailer->setReceiverBCC($user->bcc_email);
     $mailer->setReceiver($email);
     $mailer->setMailMode(MAIL_MODE);
     if (!$mailer->send($report['name'], $body))
index febf075..92169eb 100644 (file)
@@ -776,6 +776,7 @@ class ttTeamHelper {
     $task_required_part = ' , task_required = '.intval($fields['task_required']);
     $record_type_part = '';
     $uncompleted_indicators_part = '';
+    $bcc_email_part = '';
     $plugins_part = '';
     $lock_spec_part = '';
     $workday_hours_part = '';
@@ -790,13 +791,14 @@ class ttTeamHelper {
     if (isset($fields['tracking_mode'])) $tracking_mode_part = ', tracking_mode = '.intval($fields['tracking_mode']);
     if (isset($fields['record_type'])) $record_type_part = ', record_type = '.intval($fields['record_type']);
     if (isset($fields['uncompleted_indicators'])) $uncompleted_indicators_part = ', uncompleted_indicators = '.intval($fields['uncompleted_indicators']);
+    if (!empty($fields['bcc_email'])) $bcc_email_part = ', bcc_email = '.$mdb2->quote($fields['bcc_email']);
     if (isset($fields['plugins'])) $plugins_part = ', plugins = '.$mdb2->quote($fields['plugins']);
     if (isset($fields['lock_spec'])) $lock_spec_part = ', lock_spec = '.$mdb2->quote($fields['lock_spec']);
     if (isset($fields['workday_hours'])) $workday_hours_part = ', workday_hours = '.$mdb2->quote($fields['workday_hours']);
 
     $sql = "update tt_teams set $name_part $addr_part $currency_part $lang_part $decimal_mark_part
       $date_format_part $time_format_part $week_start_part $tracking_mode_part $task_required_part $record_type_part
-      $uncompleted_indicators_part $plugins_part $lock_spec_part $workday_hours_part where id = $team_id";
+      $uncompleted_indicators_part $bcc_email_part $plugins_part $lock_spec_part $workday_hours_part where id = $team_id";
     $affected = $mdb2->exec($sql);
     if (is_a($affected, 'PEAR_Error')) return false;
 
index 50f27eb..7ace196 100644 (file)
@@ -46,6 +46,7 @@ class ttUser {
   var $task_required = 0;       // Whether task selection is required on time entires.
   var $record_type = 0;         // Record type (duration vs start and finish, or both).
   var $uncompleted_indicators = 0; // Uncompleted time entry indicators (show nowhere or on users page).
+  var $bcc_email = null;        // Bcc email.
   var $currency = null;         // Currency.
   var $plugins = null;          // Comma-separated list of enabled plugins.
   var $team = null;             // Team name.
@@ -67,7 +68,7 @@ class ttUser {
     $sql = "SELECT u.id, u.login, u.name, u.team_id, u.role, u.client_id, u.email, t.name as team_name, 
       t.address, t.currency, t.lang, t.decimal_mark, t.date_format, t.time_format, t.week_start,
       t.tracking_mode, t.project_required, t.task_required, t.record_type, t.uncompleted_indicators,
-      t.plugins, t.lock_spec, t.workday_hours, t.custom_logo
+      t.bcc_email, t.plugins, t.lock_spec, t.workday_hours, t.custom_logo
       FROM tt_users u LEFT JOIN tt_teams t ON (u.team_id = t.id) WHERE ";
     if ($id)
       $sql .= "u.id = $id";
@@ -99,6 +100,7 @@ class ttUser {
       $this->task_required = $val['task_required'];
       $this->record_type = $val['record_type'];
       $this->uncompleted_indicators = $val['uncompleted_indicators'];
+      $this->bcc_email = $val['bcc_email'];
       $this->team = $val['team_name'];
       $this->address = $val['address'];
       $this->currency = $val['currency'];
index d28d319..0c6ba89 100644 (file)
@@ -150,6 +150,8 @@ $i18n_key_words = array(
 'label.password' => 'Paraula de pas',
 'label.confirm_password' => 'Confirmar paraula de pas',
 'label.email' => 'E-mail',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.date' => 'Data',
 // TODO: translate the following.
 // 'label.start_date' => 'Start date',
index be74980..57d2cdd 100644 (file)
@@ -140,6 +140,8 @@ $i18n_key_words = array(
 'label.password' => 'heslo',
 'label.confirm_password' => 'potvrdit heslo',
 // 'label.email' => 'email',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.total' => 'celkem',
 // TODO: translate the following.
 // 'label.page' => 'Page',
index eb747f6..f5129ea 100644 (file)
@@ -131,6 +131,8 @@ $i18n_key_words = array(
 'label.password' => 'Adgangskode',
 'label.confirm_password' => 'Gentag adgangskode',
 'label.email' => 'E-mail',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.date' => 'Dato',
 'label.start_date' => 'Start dato',
 'label.end_date' => 'Slut dato',
index fc3fcd2..658c32b 100644 (file)
@@ -127,6 +127,8 @@ $i18n_key_words = array(
 'label.password' => 'Passwort',
 'label.confirm_password' => 'Passwort bestätigen',
 'label.email' => 'E-Mail',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.date' => 'Datum',
 'label.start_date' => 'Anfangsdatum',
 'label.end_date' => 'Enddatum',
index 750ca4a..242437d 100644 (file)
@@ -131,6 +131,7 @@ $i18n_key_words = array(
 'label.password' => 'Password',
 'label.confirm_password' => 'Confirm password',
 'label.email' => 'Email',
+'label.bcc' => 'Bcc',
 'label.date' => 'Date',
 'label.start_date' => 'Start date',
 'label.end_date' => 'End date',
index 82c1440..e2fb922 100644 (file)
@@ -152,6 +152,8 @@ $i18n_key_words = array(
 'label.password' => 'Contraseña',
 'label.confirm_password' => 'Confirmar Contraseña',
 'label.email' => 'Email',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.date' => 'Fecha',
 'label.start_date' => 'Fecha de inicio',
 'label.end_date' => 'Fecha de fin',
index 342a43a..0acbd8a 100644 (file)
@@ -153,6 +153,7 @@ $i18n_key_words = array(
 'label.confirm_password' => 'Kinnita salasõna',
 // TODO: translate the following.
 // 'label.email' => 'Email',
+// 'label.bcc' => 'Bcc',
 // 'label.date' => 'Date',
 // 'label.start_date' => 'Start date',
 // 'label.end_date' => 'End date',
index 8056140..5283184 100644 (file)
@@ -139,6 +139,8 @@ $i18n_key_words = array(
 'label.password' => 'رمز عبور',
 'label.confirm_password' => 'تکرار رمزعبور',
 'label.email' => 'ایمیل',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.date' => 'تاریخ',
 'label.start_date' => 'تاریخ شروع',
 'label.end_date' => 'تاریخ اتمام',
index 87f3d1e..c84bfd3 100644 (file)
@@ -129,6 +129,8 @@ $i18n_key_words = array(
 'label.password' => 'Salasana',
 'label.confirm_password' => 'Vahvista salasana',
 'label.email' => 'Sähköposti',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.date' => 'Päiväys',
 'label.start_date' => 'Aloituspäivä',
 'label.end_date' => 'Päättymispäivä',
index da31428..fad8dee 100644 (file)
@@ -142,6 +142,8 @@ $i18n_key_words = array(
 'label.password' => 'Mot de passe',
 'label.confirm_password' => 'Confirmez le mot de passe',
 'label.email' => 'Email',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.date' => 'Date',
 'label.start_date' => 'Date de début',
 'label.end_date' => 'Date de fin',
index 3c10a64..d57e556 100644 (file)
@@ -143,6 +143,8 @@ $i18n_key_words = array(
 'label.password' => 'סיסמה',
 'label.confirm_password' => 'בדיקת סיסמה',
 'label.email' => 'דואר אלקטרוני',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.date' => 'תאריך',
 'label.start_date' => 'תאריך התחלה',
 'label.end_date' => 'תאריך סיום',
index 3d7200f..dec8e10 100644 (file)
@@ -133,6 +133,8 @@ $i18n_key_words = array(
 'label.password' => 'jelszó',
 'label.confirm_password' => 'jelszó megerősítése',
 // 'label.email' => 'email',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.total' => 'összesen',
 // Translate the following.
 // 'label.page' => 'Page',
index d4aeef8..78ed589 100644 (file)
@@ -132,6 +132,8 @@ $i18n_key_words = array(
 'label.password' => 'password',
 'label.confirm_password' => 'conferma password',
 'label.email' => 'e-mail',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.total' => 'totale',
 // Translate the following.
 // 'label.page' => 'Page',
index a12b0f9..a194c71 100644 (file)
@@ -136,6 +136,8 @@ $i18n_key_words = array(
 'label.password' => 'パスワード',
 'label.confirm_password' => 'パスワードの確認',
 'label.email' => 'Eメール',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.total' => '合計',
 // Translate the following.
 // 'label.page' => 'Page',
index d498dac..0f2e2ff 100644 (file)
@@ -132,6 +132,8 @@ $i18n_key_words = array(
 'label.password' => '암호',
 'label.confirm_password' => '암호 확인',
 'label.email' => '이메일',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.total' => '합계',
 // TODO: translate the following.
 // 'label.page' => 'Page',
index 3c0b3a2..4dd659d 100644 (file)
@@ -130,6 +130,8 @@ $i18n_key_words = array(
 'label.password' => 'Wachtwoord',
 'label.confirm_password' => 'Bevestig wachtwoord',
 'label.email' => 'E-mailadres',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.date' => 'Datum',
 'label.start_date' => 'Begindatum',
 'label.end_date' => 'Einddatum',
index 822d45e..93f4efe 100644 (file)
@@ -132,6 +132,8 @@ $i18n_key_words = array(
 'label.password' => 'Passord',
 'label.confirm_password' => 'Bekreft passord',
 // 'label.email' => 'email',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.total' => 'totalt',
 // TODO: translate the following.
 // 'label.page' => 'Page',
index d64895c..281fb62 100644 (file)
@@ -134,6 +134,8 @@ $i18n_key_words = array(
 'label.password' => 'Hasło',
 'label.confirm_password' => 'Potwierdź hasło',
 'label.email' => 'E-mail',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.date' => 'Data',
 'label.start_date' => 'Data początkowa',
 'label.end_date' => 'Data końcowa',
index 7eed160..91794a1 100644 (file)
@@ -129,6 +129,8 @@ $i18n_key_words = array(
 'label.password' => 'Senha',
 'label.confirm_password' => 'Confirme a senha',
 'label.email' => 'E-mail',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.date' => 'Data',
 'label.start_date' => 'Data inicial',
 'label.end_date' => 'Data final',
index a7de8f7..488a3d0 100644 (file)
@@ -129,8 +129,9 @@ $i18n_key_words = array(
 // 'label.manager_login' => 'manager login',
 'label.password' => 'senha',
 'label.confirm_password' => 'confirme a senha',
-// 'label.email' => 'email',
 // TODO: translate the following.
+// 'label.email' => 'email',
+// 'label.bcc' => 'Bcc',
 // 'label.page' => 'Page',
 // 'label.condition' => 'Condition',
 
index 22fc465..ea64a58 100644 (file)
@@ -135,7 +135,9 @@ $i18n_key_words = array(
 // 'label.manager_login' => 'manager login',
 'label.password' => 'parola',
 'label.confirm_password' => 'confirma parola',
+// TODO: translate the following.
 // 'label.email' => 'email',
+// 'label.bcc' => 'Bcc',
 'label.total' => 'total',
 // TODO: translate the following.
 // 'label.page' => 'Page',
index 69def8e..a488dc7 100644 (file)
@@ -131,6 +131,7 @@ $i18n_key_words = array(
 'label.password' => 'Пароль',
 'label.confirm_password' => 'Подтверждение пароля',
 'label.email' => 'Адрес e-mail',
+'label.bcc' => 'Скрытая копия',
 'label.date' => 'Дата',
 'label.start_date' => 'Начальная дата',
 'label.end_date' => 'Конечная дата',
index eb9c876..0b398f6 100644 (file)
@@ -140,6 +140,8 @@ $i18n_key_words = array(
 'label.password' => 'Heslo',
 'label.confirm_password' => 'Potvrdenie hesla',
 'label.email' => 'E-mail',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.date' => 'Dátum',
 'label.start_date' => 'Dátum začiatku',
 'label.end_date' => 'Dátum konca',
index 6bfa049..4642765 100644 (file)
@@ -136,6 +136,8 @@ $i18n_key_words = array(
 'label.password' => 'geslo',
 // 'label.confirm_password' => 'confirm password',
 'label.email' => 'email',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.total' => 'total',
 // TODO: translate the following.
 // 'label.page' => 'Page',
index 3201171..3afdbc7 100644 (file)
@@ -131,6 +131,8 @@ $i18n_key_words = array(
 'label.password' => 'Lozinka',
 'label.confirm_password' => 'Potvrdi lozinku',
 'label.email' => 'Email',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.date' => 'Datum',
 'label.start_date' => 'Početni datum',
 'label.end_date' => 'Krajnji datum',
index 119223a..266ee3e 100644 (file)
@@ -130,6 +130,8 @@ $i18n_key_words = array(
 'label.password' => 'Lösenord',
 'label.confirm_password' => 'Bekräfta lösenord',
 'label.email' => 'E-postadress',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.date' => 'Datum',
 'label.start_date' => 'Startdatum',
 'label.end_date' => 'Slutdatum',
index 58c1976..0bc3c92 100644 (file)
@@ -136,6 +136,8 @@ $i18n_key_words = array(
 'label.password' => 'parola',
 'label.confirm_password' => 'parolayı tekrala',
 'label.email' => 'e-posta',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.total' => 'toplam',
 // TODO: translate the following.
 // 'label.page' => 'Page',
index 1735524..80d3fe5 100644 (file)
@@ -146,7 +146,8 @@ $i18n_key_words = array(
 'label.password' => '密码',
 'label.confirm_password' => '确认密码',
 'label.email' => '电子邮件',
-// Translate the following.
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 // 'label.date' => 'Date',
 // 'label.start_date' => 'Start date',
 // 'label.end_date' => 'End date',
index dbed304..69d9e01 100644 (file)
@@ -134,6 +134,8 @@ $i18n_key_words = array(
 'label.password' => '密碼',
 'label.confirm_password' => '確認密碼',
 'label.email' => '電子郵件',
+// TODO: translate the following.
+// 'label.bcc' => 'Bcc',
 'label.total' => '總計',
 // TODO: translate the following.
 // 'label.page' => 'Page',
index 97ae2df..1b3cff0 100644 (file)
@@ -12,7 +12,7 @@
       <br>
       <table cellspacing="0" cellpadding="4" width="100%" border="0">
         <tr>
-          <td align="center">&nbsp;Anuko Time Tracker 1.11.48.3664 | Copyright &copy; <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
+          <td align="center">&nbsp;Anuko Time Tracker 1.12.0.3665 | Copyright &copy; <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
             <a href="https://www.anuko.com/lp/tt_4.htm" target="_blank">{$i18n.footer.credits}</a> |
             <a href="https://www.anuko.com/lp/tt_5.htm" target="_blank">{$i18n.footer.license}</a> |
             <a href="https://www.anuko.com/lp/tt_7.htm" target="_blank">{$i18n.footer.improve}</a>
index d30d6ca..c4e0f58 100644 (file)
@@ -164,7 +164,12 @@ function handlePluginCheckboxes() {
             <td align="right" nowrap>{$i18n.form.profile.uncompleted_indicators}:</td>
             <td>{$forms.profileForm.uncompleted_indicators.control}</td>
           </tr>
-
+{if $user->isManager()}
+          <tr>
+            <td align="right" nowrap>{$i18n.label.bcc}:</td>
+            <td>{$forms.profileForm.bcc_email.control} <a href="https://www.anuko.com/lp/tt_10.htm" target="_blank">{$i18n.label.what_is_it}</a></td>
+          </tr>
+{/if}
           {* initialize preview text *}
           <script>
             MakeFormatPreview("date_format_preview", document.getElementById("format_date"));
index 4199288..9a0451b 100755 (executable)
@@ -640,6 +640,7 @@ if ($_POST) {
     setChange("ALTER TABLE `tt_teams` ADD `project_required` smallint(2) NOT NULL DEFAULT '0' AFTER `tracking_mode`");
     setChange("ALTER TABLE `tt_cron` ADD `report_condition` varchar(255) default NULL AFTER `email`");
     setChange("ALTER TABLE `tt_fav_reports` ADD `status` tinyint(4) default '1'");
+    setChange("ALTER TABLE `tt_teams` ADD `bcc_email` varchar(100) default NULL AFTER `uncompleted_indicators`");
   }
   
   // The update_clients function updates projects field in tt_clients table.
index bc290a6..3d219ab 100644 (file)
@@ -86,6 +86,8 @@ if ($request->isPost()) {
     $mailer->setReceiver($cl_receiver);
     if (isset($cl_cc))
       $mailer->setReceiverCC($cl_cc);
+    if (!empty($user->bcc_email))
+      $mailer->setReceiverBCC($user->bcc_email);
     $mailer->setMailMode(MAIL_MODE);
     if ($mailer->send($cl_subject, $body))
       $msg->add($i18n->getKey('form.mail.invoice_sent'));
index b7cd700..e926292 100644 (file)
--- a/mysql.sql
+++ b/mysql.sql
@@ -28,6 +28,7 @@ CREATE TABLE `tt_teams` (
   `task_required` smallint(2) NOT NULL DEFAULT '0',          # whether a task selection is required or optional
   `record_type` smallint(2) NOT NULL DEFAULT '0',            # time record type ("start and finish", "duration", or both)
   `uncompleted_indicators` smallint(2) NOT NULL DEFAULT '0', # whether to show indicators for users with uncompleted time entries
+  `bcc_email` varchar(100) default NULL,                     # bcc email to copy all reports to
   `plugins` varchar(255) default NULL,                       # a list of enabled plugins for team
   `lock_spec` varchar(255) default NULL,                     # Cron specification for record locking,
                                                              # for example: "0 10 * * 1" for "weekly on Mon at 10:00".
index 11ca295..d4036ec 100644 (file)
@@ -71,6 +71,7 @@ if ($request->isPost()) {
     $cl_expenses = $request->getParameter('expenses');
     $cl_tax_expenses = $request->getParameter('tax_expenses');
     $cl_notifications = $request->getParameter('notifications');
+    $cl_bcc_email = trim($request->getParameter('bcc_email'));
     $cl_locking = $request->getParameter('locking');
     $cl_quotas = $request->getParameter('quotas');
   }
@@ -92,6 +93,7 @@ if ($request->isPost()) {
     $cl_task_required = $user->task_required;
     $cl_record_type = $user->record_type;
     $cl_uncompleted_indicators = $user->uncompleted_indicators;
+    $cl_bcc_email = $user->bcc_email;
 
     // Which plugins do we have enabled?
     $plugins = explode(',', $user->plugins);
@@ -182,6 +184,11 @@ if ($user->canManageTeam()) {
   $uncompleted_indicators_options[UNCOMPLETED_INDICATORS] = $i18n->getKey('form.profile.uncompleted_indicators_show');
   $form->addInput(array('type'=>'combobox','name'=>'uncompleted_indicators','style'=>'width: 150px;','data'=>$uncompleted_indicators_options,'value'=>$cl_uncompleted_indicators));
 
+  // Add bcc email control, for manager only.
+  if ($user->isManager()) {
+    $form->addInput(array('type'=>'text','maxlength'=>'100','name'=>'bcc_email','value'=>$cl_bcc_email));
+  }
+
   $form->addInput(array('type'=>'checkbox','name'=>'charts','value'=>$cl_charts));
   $form->addInput(array('type'=>'checkbox','name'=>'clients','value'=>$cl_clients,'onchange'=>'handlePluginCheckboxes()'));
   $form->addInput(array('type'=>'checkbox','name'=>'client_required','value'=>$cl_client_required));
@@ -217,6 +224,9 @@ if ($request->isPost()) {
     if (!ttValidString($cl_team, true)) $err->add($i18n->getKey('error.field'), $i18n->getKey('label.team_name'));
     if (!ttValidString($cl_address, true)) $err->add($i18n->getKey('error.field'), $i18n->getKey('label.address'));
     if (!ttValidString($cl_currency, true)) $err->add($i18n->getKey('error.field'), $i18n->getKey('label.currency'));
+    if ($user->isManager()) {
+      if (!ttValidEmail($cl_bcc_email, true)) $err->add($i18n->getKey('error.field'), $i18n->getKey('label.bcc'));
+    }
   }
   // Finished validating user input.
 
@@ -261,6 +271,7 @@ if ($request->isPost()) {
         'task_required' => $cl_task_required,
         'record_type' => $cl_record_type,
         'uncompleted_indicators' => $cl_uncompleted_indicators,
+        'bcc_email' => $cl_bcc_email,
         'plugins' => $plugins));
     }
     if ($update_result) {
index 9389cff..b72c8b2 100644 (file)
@@ -83,6 +83,8 @@ if ($request->isPost()) {
     $mailer->setReceiver($cl_receiver);
     if (isset($cl_cc))
       $mailer->setReceiverCC($cl_cc);
+    if (!empty($user->bcc_email))
+      $mailer->setReceiverBCC($user->bcc_email);
     $mailer->setMailMode(MAIL_MODE);
     if ($mailer->send($cl_subject, $body))
       $msg->add($i18n->getKey('form.mail.report_sent'));