'user', 'requestData' => [ 'title' => [ 'validation' => DataValidator::length(1, 200), 'error' => ERRORS::INVALID_TITLE ], 'content' => [ 'validation' => DataValidator::length(10, 5000), 'error' => ERRORS::INVALID_CONTENT ], 'departmentId' => [ 'validation' => DataValidator::dataStoreId('department'), 'error' => ERRORS::INVALID_DEPARTMENT ], 'language' => [ 'validation' => DataValidator::in(Language::getSupportedLanguages()), 'error' => ERRORS::INVALID_LANGUAGE ] ] ]; if(!Controller::isUserSystemEnabled() && !Controller::isStaffLogged()) { $validations['permission'] = 'any'; $validations['requestData']['captcha'] = [ 'validation' => DataValidator::captcha(), 'error' => ERRORS::INVALID_CAPTCHA ]; $validations['requestData']['email'] = [ 'validation' => DataValidator::email(), 'error' => ERRORS::INVALID_EMAIL ]; $validations['requestData']['name'] = [ 'validation' => DataValidator::length(2, 40), 'error' => ERRORS::INVALID_NAME ]; } return $validations; } public function handler() { $this->title = Controller::request('title'); $this->content = Controller::request('content', true); $this->departmentId = Controller::request('departmentId'); $this->language = Controller::request('language'); $this->email = Controller::request('email'); $this->name = Controller::request('name'); if(!Controller::isStaffLogged() && Department::getDataStore($this->departmentId)->private){ throw new Exception(ERRORS::INVALID_DEPARTMENT); } $this->storeTicket(); if(!Controller::isUserSystemEnabled()) { $this->sendMail(); } $staffs = Staff::find('send_email_on_new_ticket = 1'); foreach ($staffs as $staff) { if($staff->sharedDepartmentList->includesId(Controller::request('departmentId'))) { $this->sendMailStaff($staff->email); } } Log::createLog('CREATE_TICKET', $this->ticketNumber); Response::respondSuccess([ 'ticketNumber' => $this->ticketNumber ]); } private function storeTicket() { $department = Department::getDataStore($this->departmentId); $author = Controller::getLoggedUser(); $ticket = new Ticket(); $fileUploader = FileUploader::getInstance(); $fileUploader->setPermission(FileManager::PERMISSION_TICKET, $ticket->generateUniqueTicketNumber()); $imagePaths = $this->uploadImages(Controller::isStaffLogged()); $fileUploader = $this->uploadFile(Controller::isStaffLogged()); $ticket->setProperties(array( 'title' => $this->title, 'content' => $this->replaceWithImagePaths($imagePaths, $this->content), 'language' => $this->language, 'department' => $department, 'file' => ($fileUploader instanceof FileUploader) ? $fileUploader->getFileName() : null, 'date' => Date::getCurrentDate(), 'unread' => false, 'unreadStaff' => true, 'closed' => false, 'authorName' => $this->name, 'authorEmail' => $this->email, )); $ticket->setAuthor($author); if(Controller::isUserSystemEnabled() || Controller::isStaffLogged()) { $author->sharedTicketList->add($ticket); } if(Controller::isUserSystemEnabled() && !Controller::isStaffLogged()) { $author->tickets++; $this->email = $author->email; $this->name = $author->name; } $author->store(); $ticket->store(); $this->ticketNumber = $ticket->ticketNumber; } private function sendMail() { $mailSender = MailSender::getInstance(); $mailSender->setTemplate(MailTemplate::TICKET_CREATED, [ 'to' => $this->email, 'name' => $this->name, 'ticketNumber' => $this->ticketNumber, 'title' => $this->title, 'url' => Setting::getSetting('url')->getValue() ]); $mailSender->send(); } private function sendMailStaff($email) { $mailSender = MailSender::getInstance(); $mailSender->setTemplate(MailTemplate::TICKET_CREATED_STAFF, [ 'to' => $email, 'name' => $this->name, 'ticketNumber' => $this->ticketNumber, 'title' => $this->title ]); $mailSender->send(); } }