public function confirmLetterPrinted($confirmto = null, $confirmdate = null)
 {
     // admin users can set confirmto and confirm up to a specific point, steamrollering whatever else is in there
     if (!is_null($confirmto)) {
         if (!($dls = $this->date_letter_sent)) {
             $dls = new OphTrOperationbooking_Operation_Date_Letter_Sent();
             $dls->element_id = $this->id;
         }
         if ($confirmto == self::LETTER_GP) {
             $dls->date_invitation_letter_sent = Helper::convertNHS2MySQL($confirmdate);
             $dls->date_1st_reminder_letter_sent = Helper::convertNHS2MySQL($confirmdate);
             $dls->date_2nd_reminder_letter_sent = Helper::convertNHS2MySQL($confirmdate);
             $dls->date_gp_letter_sent = Helper::convertNHS2MySQL($confirmdate);
         }
         if ($confirmto == self::LETTER_INVITE) {
             $dls->date_invitation_letter_sent = Helper::convertNHS2MySQL($confirmdate);
             $dls->date_1st_reminder_letter_sent = null;
             $dls->date_2nd_reminder_letter_sent = null;
             $dls->date_gp_letter_sent = null;
         }
         if ($confirmto == self::LETTER_REMINDER_1) {
             $dls->date_invitation_letter_sent = Helper::convertNHS2MySQL($confirmdate);
             $dls->date_1st_reminder_letter_sent = Helper::convertNHS2MySQL($confirmdate);
             $dls->date_2nd_reminder_letter_sent = null;
             $dls->date_gp_letter_sent = null;
         }
         if ($confirmto == self::LETTER_REMINDER_2) {
             $dls->date_invitation_letter_sent = Helper::convertNHS2MySQL($confirmdate);
             $dls->date_1st_reminder_letter_sent = Helper::convertNHS2MySQL($confirmdate);
             $dls->date_2nd_reminder_letter_sent = Helper::convertNHS2MySQL($confirmdate);
             $dls->date_gp_letter_sent = null;
         }
         if ($confirmto == 'noletters') {
             $dls->date_invitation_letter_sent = null;
             $dls->date_1st_reminder_letter_sent = null;
             $dls->date_2nd_reminder_letter_sent = null;
             $dls->date_gp_letter_sent = null;
         }
         if (!$dls->save()) {
             throw new Exception('Unable to save date letter sent: ' . print_r($dls->getErrors(), true));
         }
         OELog::log("Letter print confirmed, datelettersent={$dls->id} confirmdate='{$confirmdate}'");
         // Only confirm if letter is actually due
     } elseif ($this->getDueLetter() !== $this->getLastLetter()) {
         if ($dls = $this->date_letter_sent) {
             if ($dls->date_invitation_letter_sent == null) {
                 $dls->date_invitation_letter_sent = date('Y-m-d H:i:s');
             } elseif ($dls->date_1st_reminder_letter_sent == null) {
                 $dls->date_1st_reminder_letter_sent = date('Y-m-d H:i:s');
             } elseif ($dls->date_2nd_reminder_letter_sent == null) {
                 $dls->date_2nd_reminder_letter_sent = date('Y-m-d H:i:s');
             } elseif ($dls->date_gp_letter_sent == null) {
                 $dls->date_gp_letter_sent = date('Y-m-d H:i:s');
             } elseif ($dls->date_scheduling_letter_sent == null) {
                 $dls->date_scheduling_letter_sent = date('Y-m-d H:i:s');
             }
             if (!$dls->save()) {
                 throw new SystemException("Unable to update date_letter_sent record {$dls->id}: " . print_r($dls->getErrors(), true));
             }
             OELog::log("Letter print confirmed, datelettersent={$dls->id}");
         } else {
             $dls = new OphTrOperationbooking_Operation_Date_Letter_Sent();
             $dls->element_id = $this->id;
             $dls->date_invitation_letter_sent = date('Y-m-d H:i:s');
             if (!$dls->save()) {
                 throw new SystemException('Unable to save new date_letter_sent record: ' . print_r($dls->getErrors(), true));
             }
             OELog::log("Letter print confirmed, datelettersent={$dls->id}");
         }
     }
 }
 public function cancel($reason, $cancellation_comment, $reschedule = false)
 {
     $this->booking_cancellation_date = date('Y-m-d H:i:s');
     $this->cancellation_reason_id = $reason->id;
     $this->cancellation_comment = $cancellation_comment;
     $this->cancellation_user_id = Yii::app()->session['user']->id;
     if (!$this->save()) {
         throw new Exception('Unable to save booking: ' . print_r($this->getErrors(), true));
     }
     OELog::log("Booking cancelled: {$this->id}");
     if (!$reschedule) {
         if (!$this->operation->event->addIssue('Operation requires scheduling')) {
             throw new Exception('Unable to add event issue: ' . print_r($this->operation->event->getErrors(), true));
         }
         if (Yii::app()->params['urgent_booking_notify_hours'] && Yii::app()->params['urgent_booking_notify_email']) {
             if (strtotime($this->session->date) <= strtotime(date('Y-m-d')) + Yii::app()->params['urgent_booking_notify_hours'] * 3600) {
                 if (!is_array(Yii::app()->params['urgent_booking_notify_email'])) {
                     $targets = array(Yii::app()->params['urgent_booking_notify_email']);
                 } else {
                     $targets = Yii::app()->params['urgent_booking_notify_email'];
                 }
                 foreach ($targets as $email) {
                     if (!Mailer::mail($email, '[OpenEyes] Urgent cancellation made', "A cancellation was made with a TCI date within the next 24 hours.\n\nDisorder: " . $this->operation->getDisorderText() . "\n\nPlease see: http://" . @$_SERVER['SERVER_NAME'] . "/transport\n\nIf you need any assistance you can reply to this email and one of the OpenEyes support personnel will respond.", 'From: ' . Yii::app()->params['urgent_booking_notify_email_from'] . "\r\n")) {
                     }
                     Yii::app()->user->setFlash('warning.email-failure', 'E-mail Failure. Failed to send one or more urgent booking notification E-mails.');
                 }
             }
         }
         $this->audit('booking', 'cancel');
         $this->operation->event->episode->episode_status_id = 3;
         if (!$this->operation->event->episode->save()) {
             throw new Exception('Unable to update episode status for episode: ' . print_r($operation->event->episode->getErrors(), true));
         }
         // we've just cancelled a booking and updated the element_operation status to 'needs rescheduling'
         // any time we do that we need to add a new record to date_letter_sent
         $date_letter_sent = new OphTrOperationbooking_Operation_Date_Letter_Sent();
         $date_letter_sent->element_id = $this->element_id;
         if (!$date_letter_sent->save()) {
             throw new Exception('Unable to save date_letter_sent: ' . print_r($date_letter_sent->getErrors(), true));
         }
     }
 }