Commits

Anonymous committed e994a16 Draft

added controllers

Comments (0)

Files changed (8)

application/controllers/BillController.php

+<?php
+
+require_once APPLICATION_PATH . '/models/realCourses.php';
+require_once APPLICATION_PATH . '/models/history.php';
+require_once APPLICATION_PATH . '/models/Dogovor.php';
+require_once APPLICATION_PATH . '/models/dup_user.php';
+//require_once APPLICATION_PATH . '/models/courseForAccount.php';
+require_once APPLICATION_PATH . '/models/Lanta/TempClients.php';
+require_once APPLICATION_PATH . '/models/MegatekEncryptionService/EncryptionService.php';
+require_once APPLICATION_PATH . '/models/ClientRouter.php';
+require_once APPLICATION_PATH . '/models/Lanta/ClientAccess.php';
+
+class BillController extends Zend_Controller_Action {
+
+    public function init() {
+        $this->params = $this->getRequest()->getParams();
+        $auth = Zend_Auth::getInstance();
+        $identity = $auth->getIdentity();
+        if (!$identity) {
+            $url = 'http://'
+                    . $this->getRequest()->getHttpHost()
+                    . '/CabinetPersonal'
+                    . '/login/index?redirectUrl='
+                    . str_replace('&', '||', 'http://' . $this->getRequest()->getHttpHost() . $_SERVER['REDIRECT_URL']);
+            $this->_redirect($url);
+        }
+
+        $d = new Dogovor();
+        $this->dup_user = new dup_user();
+        $this->dup_user->loadCurrentUser();
+        $clientAccess = new ClientAccess();
+        $clientRouter = new ClientRouter($clientAccess, $this->dup_user->getUsKey());
+        $this->client = $clientRouter->load($clientRouter->getByUsKey($this->dup_user->getUsKey()));
+        if (
+                !isset($this->params['DGCODE'])
+                || !$d->isUsers($this->params['DGCODE'], $this->dup_user->getUsKey())
+        ) {
+            $url = 'http://'
+                    . $this->getRequest()->getHttpHost()
+                    . '/CabinetPersonal'
+                    . '/cabinet/';
+            $this->_redirect($url);
+        }
+
+
+        $d->load($d->getByCode($this->params['DGCODE']));
+        $this->dogovor = $d;
+        $this->view->dogovor = $d;
+        $this->view->dgCode = $this->params['DGCODE'];
+        $this->_helper->_layout->setLayout('bill');
+    }
+
+    public function prepayAction() {
+        $this->view->client = $this->client;
+        $this->view->dup_user = $this->dup_user;
+        $this->view->tourists = $this->dogovor->getTouristsByDgCode($this->params['DGCODE']);
+        $this->view->orderList = $this->dogovor->getOrderListByDgCode($this->params['DGCODE']);
+
+        $avia = array();
+        $railway = array();
+
+        $avia = $this->dogovor->getAviaByDgCode($this->params['DGCODE']);
+        $railway = $this->dogovor->getRailByDgCode($this->params['DGCODE']);
+        $this->view->transfer = array_merge($railway, $avia);
+        //var_dump($this->dogovor->getHotelsByDgCode($this->params['DGCODE']));
+        $this->view->hotel = $this->dogovor->getHotelsByDgCode($this->params['DGCODE']);
+
+        $course = $this->dogovor->getCourseByDgCode($this->params['DGCODE']);
+
+        if (!$course) {
+            $realCourses = new realCourses();
+            if ($this->dogovor->getRate() != 'рб') {
+                $course = array_shift($realCourses->getCourse(date('Y-m-d', time()), $this->dogovor->getRate(), 'рб'));
+            } else {
+                $course = array(
+                    'RC_COURSE' => '1'
+                );
+            }
+        }
+        $ammount = $this->dogovor->getToPaySumm() * $course['RC_COURSE'];
+        $h = new History();
+        $name = $this->client->getFirstNameRus() . ' ' . $this->client->getSurnameRus();
+        $h->saveCourse($this->params['DGCODE'], $name, $ammount);
+        $this->view->payBefore = $this->dogovor->getPayBeforeDateByDgCode($this->params['DGCODE']);
+        $this->view->course = $course;
+        $this->view->toPaySumm = $ammount;
+        $this->tax = 0;
+        $this->additionalPaymentConvert = 0;
+    }
+
+    public function confirmAction() {
+        $this->view->client = $this->client;
+        $this->view->dup_user = $this->dup_user;
+        $this->view->tourists = $this->dogovor->getTouristsByDgCode($this->params['DGCODE']);
+        $this->view->orderList = $this->dogovor->getOrderListByDgCode($this->params['DGCODE']);
+        $avia = array();
+        $railway = array();
+        $avia = $this->dogovor->getAviaByDgCode($this->params['DGCODE']);
+        $railway = $this->dogovor->getRailByDgCode($this->params['DGCODE']);
+        $this->view->transfer = array_merge($railway, $avia);
+        $this->view->hotel = $this->dogovor->getHotelsByDgCode($this->params['DGCODE']);
+        $course = $this->dogovor->getCourseByDgCode($this->params['DGCODE']);
+
+        if (!$course) {
+            $realCourses = new realCourses();
+            if ($this->dogovor->getRate() != 'рб') {
+                $course = array_shift(
+                        $realCourses->getCourse(
+                                date('Y-m-d', time())
+                                , $this->dogovor->getRate()
+                                , 'рб'
+                        )
+                );
+            } else {
+                $course = array(
+                    'RC_COURSE' => '1'
+                );
+            }
+        }
+        $ammount = $this->dogovor->getToPaySumm() * $course['RC_COURSE'];
+        $h = new History();
+        $name = $this->client->getFirstNameRus() . ' ' . $this->client->getSurnameRus();
+        $h->saveCourse($this->params['DGCODE'], $name, $ammount);
+        $this->view->payBefore = $this->dogovor->getPayBeforeDateByDgCode($this->params['DGCODE']);
+        $this->view->course = $course;
+        $this->view->toPaySumm = $ammount;
+        $this->tax = 0;
+        $this->additionalPaymentConvert = 0;
+    }
+}

application/controllers/CabinetController.php

+<?php
+
+require_once APPLICATION_PATH . '/models/dup_user.php';
+require_once APPLICATION_PATH . '/models/history.php';
+require_once APPLICATION_PATH . '/models/Dogovor.php';
+require_once APPLICATION_PATH . '/models/Lanta/TempClients.php';
+require_once APPLICATION_PATH . '/models/Lanta/Last/Currency.php';
+require_once APPLICATION_PATH . '/models/realCourses.php';
+require_once APPLICATION_PATH . '/models/pr/city.php';
+require_once APPLICATION_PATH . '/models/ClientRouter.php';
+require_once APPLICATION_PATH . '/models/Lanta/ClientAccess.php';
+require_once APPLICATION_PATH . '/models/Lanta/PrivateUser/DogovorSettings.php';
+
+
+/**
+ *  Контроллер кабинета частника.
+ *
+ *
+ */
+class CabinetController extends Zend_Controller_Action {
+
+    public $config = array();
+
+    public $params = array();
+
+    public $client = array();
+
+    /**
+     * Метод инициализации запускается при обращении к любому контроллеру кабинета.
+     * 
+     */
+
+    public function init() {
+        //Запишем параметры в член класса
+        $this->params = $this->getRequest()->getParams();
+
+        //Сразу выгрузим конфиг в член класса.
+	    $bootstrap = $this->getInvokeArg('bootstrap');
+	    $config = $bootstrap->getOptions();
+        $this->config = $config;
+
+        //Проверяем, авторизован ли зашедший пользователь
+        $auth = Zend_Auth::getInstance();
+        $identity = $auth->getIdentity();
+        //Если такой пользователь не найден - редиректим на страницу авторизации
+        if (!$identity) {
+            $url = 'http://'
+                    . $this->getRequest()->getHttpHost()
+                    . '/' . $this->config['applicationName']
+                    . '/login/index?redirectUrl='
+                    . str_replace('&', '||', 'http://' . $this->getRequest()->getHttpHost() . $_SERVER['REDIRECT_URL']);
+            $this->_redirect($url);
+        }
+
+        //Объект dup_user
+        $dup_user = new dup_user();
+        //Загружаем пользователя, для более удобной работы. Подробнее о загрузке в объект см в документации.
+        $dup_user->loadCurrentUser();
+        //объект ClientAccess
+        $clientAccess = new ClientAccess();
+        //Объект ClientRouter. Необходим для работы с клиентом. Он определяет к какому типу клиентов относится пользователь и работает с соответствующим интерфейсом.
+        $clientRouter = new ClientRouter($clientAccess, $dup_user->getUsKey());
+        //Загружаем clientRouter`a
+        $client = $clientRouter->load($clientRouter->getByUsKey($dup_user->getUsKey()));
+
+        //Запишем клиента в член класса
+        $this->client = $client;
+        //Запишем дуп юзера в член класса
+        $this->dup_user = $dup_user;
+
+        //Отдадим шаблону клиента, т.к. клиент используется почти во всех шаблонах.
+        $this->view->client = $client;
+
+        //Выставляем layout по умолчанию
+        $this->_helper->_layout->setLayout('cabinet');
+
+        //Счетчики находятся здесь.
+        if (isset($config['countersFilePath']) && file_exists($config['countersFilePath'])) {
+            $this->view->counterPath = $config['countersFilePath'];
+        }
+
+        //Передаем css`ки
+        $this->view->headLink()
+                ->appendStylesheet('http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/themes/base/jquery-ui.css')
+                ->appendStylesheet('http://www.lantatur.ru/css/lanta1.css')
+                ->appendStylesheet('http://www.lantatur.ru/css/cabinet.css')
+                ->appendStylesheet('/css/cabinetpersonal.css')
+                ->appendStylesheet('http://www.lantatur.ru/css/text-decor_lantatur.css');
+
+    }
+
+    /**
+     * Метод Index вызывается по умолчанию и отвечает за главную страницу кабинета.(Забронированные туры)
+     * @return <mixed>
+     *
+     */
+
+    public function indexAction() {
+
+        //Костыль для $_GET и $this->params. Не помню зачем это нужно.
+        $_REQUEST = array_merge($this->params, $_REQUEST);
+        unset($this->params['dgCode']);
+        unset($this->params['startDate']);
+        unset($this->params['endDate']);
+        unset($this->params['offset']);
+
+        //Это какая-то лажа для пагинации.
+        //TODO отрефакторить через this->params хотя бы
+        $countOnPage = (isset($_REQUEST['offset']) && intval($_REQUEST['offset'])) ? intval($_REQUEST['offset']) : 15; //Количество элементов на страницу
+        $page = (isset($_REQUEST['page']) && intval($_REQUEST['page'])) ? intval($_REQUEST['page']) : 1; //страница
+        
+        unset($_REQUEST['page']); //Обнуляем, необходимо для пагинации.
+        $d = new Dogovor();
+        $dogovors = $d->getByDupUserKey($this->dup_user->getUsKey());
+
+        //Тут идет поиск по забронированным турам.
+        $params = array();
+
+        //Если в фильрации указан DGCODE.
+        if (isset($_REQUEST['dgCode']) && $_REQUEST['dgCode']) {
+           $params['CODE like ?'] = '%' . $_REQUEST['dgCode'] . '%';
+        }
+        //Если указана дата начала тура
+        if (isset($_REQUEST['startDate']) && $_REQUEST['startDate']) {
+            $parseDate = date_parse($_REQUEST['startDate']);
+            $params['TURDATE >= ?'] =
+                date('Y-m-d', mktime($parseDate['hour'], $parseDate['minute'], $parseDate['second'], $parseDate['month'], $parseDate['day'], $parseDate['year']));
+        }
+        if (isset($_REQUEST['endDate']) && $_REQUEST['endDate']) {
+            $parseDate = date_parse($_REQUEST['endDate']);
+            $params['TURDATE <= ?'] =
+                date('Y-m-d', mktime($parseDate['hour'], $parseDate['minute'], $parseDate['second'], $parseDate['month'], $parseDate['day'], $parseDate['year']));;
+        }
+
+        
+        $params['DupUserKey = ?'] = $this->dup_user->getUsKey();
+        
+        //Получаем договоры по заданным критериям поиска.
+        $dogovors = $d->get($params, ((isset($_REQUEST['archive']) && $_REQUEST['archive'] > 0) ? 1 : 0));
+        
+        //Для удобной работы с полученным массивом во view делаем из полученных данных - объекты dogovor.
+        foreach ($dogovors as $k => &$v) {
+            //Для этого проходимся по массиву, клонируем и загружаем объект.
+            $n = clone $d;
+            $v['obj'] = $n->load($v);
+        }
+        
+        //Пагинатор
+        $paginator = Zend_Paginator::factory($dogovors);
+        $paginator->setItemCountPerPage($countOnPage);
+        $paginator->setCurrentPageNumber($page);
+        
+        //Отдаем view необходимые переменные.
+        $this->view->paginator = $paginator;
+        $this->view->dogovors = $dogovors;
+        
+        //Явно указываем layout.
+        $this->_helper->_layout->setLayout('cabinet');
+        
+        return $this->render('index');
+    }
+
+
+    /**
+     * Метод order управляет страницей заказа в кабинете.
+     * @return <mixed>
+     */
+    
+    public function orderAction() {
+        
+        //Если был отправлен текст от частника - запускаем соответствующий метод.
+        if (isset($this->params['historyText'])) {
+            if (!$this->historyAddAction()) {
+                $this->view->errors->history->notAdded = true;
+            }
+        }
+
+        $d = new Dogovor();
+        $h = new history();
+        $c = new city();
+
+        //Проверяем, был ли передан DGCODE и к тому ли пользователю этот код относится.
+        if (!isset($this->params['DGCODE'])
+                || !$d->isUsers($this->params['DGCODE'], $this->dup_user->getUsKey())
+        ) {
+            //Если нет - редиректим на главную страницу
+            $this->redirectToMain();
+            return false;
+        }
+        
+        //Загружаем договор.
+        $d->load($d->getByCode($this->params['DGCODE']));
+
+        //Получаем сообщения по DGCODE`у
+        $history = $h->getMessagesByDgCode($this->params['DGCODE']);
+
+        $messageArr = array(); //Массив с сообщениями от пользователя
+        foreach ($history as $k => $v) {
+            //Проходимся по массиву, клонируем, загружаем, удаляем.
+            $i = clone $h;
+            $i->load($v);
+            $messageArr[] = $i;
+            unset($i);
+        }
+
+        //Получаем объект курсов валют
+        $realCoursesObj = new realCourses($this->params['DGCODE']);
+        //Получаем статус договора
+        $orderStatus = $d->getDogovorStatus($d->getStatusKey());
+        //Получаем настройки по договору
+        $dogovorSettings = new DogovorSettings();
+        
+        //Партнеры
+        $partnerCities = $c->getPartnersCities();
+        //Филиалы
+        $filials = $c->getFilialsCities();
+        
+        //Устанавливаем явно layout
+        $this->_helper->_layout->setLayout('cabinet');
+
+        //Отдаем переменные шаблону
+        $this->view->dogovor = $d;
+        $this->view->orderList = $d->getOrderListByDgCode($this->params['DGCODE']);
+        $this->view->tourists = $d->getTouristsByDgCode($this->params['DGCODE']);
+        $this->view->filials = $filials;
+        $this->view->offertaAgreed = true;//$dogovorSettings->getOffertaAgreedByDgCode($this->params['DGCODE']);
+        $this->view->documentOffice = $dogovorSettings->getOfficePrKeyByDgCode($this->params['DGCODE']);
+        $this->view->dogovorStatus = $orderStatus['OS_NAME_RUS'];
+        $this->view->history = $messageArr;
+        $this->view->date = $d->getTimeLeftToPay();
+        $this->view->realCourses = array_shift($realCoursesObj->getCourse(date('Y-m-d', time()), $d->getRate(), 'рб'));
+        
+        return $this->render('order');
+    }
+
+    /**
+     * Метод управляет профилем пользователя в личном кабинете частника
+     * @return <void>
+     */
+    public function profileAction() {
+        //получаем форму профиля для частника.
+        $form = $this->profileForm();
+
+        //Если форма была отправлена - обновляем пользователя.
+        if ($form->isValid($_POST)) {
+            //Получаем валидные данные из формы.
+            $values = $form->getValidValues($_POST);
+            //Отправляем данные на обновление пользователя
+            $this->client->update($values, $this->dup_user->getUsKey());
+            
+            //После обновления нужно перезагрузить юзера.
+            //Получаем объект ClientAccess для работы с любым типом пользователя.
+            $clientAccess = new ClientAccess();
+            //Получаем клиента через ClientRouter, при этом отдаем ему объект ClientAccess.
+            $clientRouter = new ClientRouter($clientAccess, $this->dup_user->getUsKey());
+            $client = $clientRouter->load($clientRouter->getByUsKey($this->dup_user->getUsKey()));
+
+            //Обновляем клиента в членах класса.
+            $this->client = $client;
+            $this->view->client = $client;
+        }
+        
+        return $this->render('profile');
+    }
+
+    /**
+     * Для упрощения выделил редирект в отдельный метод. Надо бы его сделать private по идее.
+     * @return <void>
+     */
+    public function redirectToMain() {
+        $url = 'http://'
+                . $this->getRequest()->getHttpHost()
+                . '/' . $this->config['applicationName'] . '/cabinet/';
+        $this->_redirect($url);
+    }
+
+    /**
+     * Метод добавляет сообщение в хистори (переписка с частником)
+     * @return <array>
+     */
+    public function historyAddAction() {
+
+        $h = new history();
+        $d = new Dogovor();
+
+        //Проверяем, относится ли эта заявка к пользователю.
+        if (!isset($this->params['DGCODE'])
+                || !$d->isUsers($this->params['DGCODE'], $this->dup_user->getUsKey())
+        ) {
+            return false;
+        }
+
+        $who = $this->client->getFirstNameRus() . " " . $this->client->getSurnameRus();
+        $data = array(
+            'DGCOD' => $this->params['DGCODE'],
+            'WHO'   => $who,
+            'TEXT'  => $_REQUEST['historyText'],
+            'MOD'   => 'www',
+        );
+        return $h->insert($data);
+    }
+
+    /**
+     * Метод, управляющей страницей оплаты.
+     *
+     * @return <void>
+     *
+     */
+    public function payAction() {
+
+        if (!isset($this->params['DGCODE'])) { return false; }
+
+        $d                  = new Dogovor();
+        $clientAccess       = new ClientAccess();
+        $realCoursesObj     = new realCourses($this->params['DGCODE']);
+        $c                  = new city();
+        $dogovorSettings    = new DogovorSettings();
+
+        //Загружаем форму профиля. Необходима для 1 шага способов оплаты.
+        $form = $this->profileForm();
+        
+        //Если в процессе пользователь изменил какие-то личные данные - обновляем пользователя.
+        if ($form->isValid($_POST)) {
+            //Получаем валидные данные из формы.
+            $values = $form->getValidValues($_POST);
+
+            //Обновляем клиента
+            $this->client->update($values, $this->dup_user->getUsKey());
+            
+            //После обновления нужно перезагрузить юзера.
+            $clientRouter = new ClientRouter($clientAccess, $this->dup_user->getUsKey());
+            $client = $clientRouter->load($clientRouter->getByUsKey($this->dup_user->getUsKey()));
+            
+            //Обновляем клиента в члене класса и в шаблоне.
+            $this->client = $client;
+            $this->view->client = $client;
+
+            //Проверяем, передан ли код договора и принадлежит ли этот договор пользователю.
+            if (!isset($this->params['DGCODE'])
+                    || !$d->isUsers($this->params['DGCODE'], $this->dup_user->getUsKey())
+            ) {
+                //Если нет - редиректим пользователя на главную страницу.
+                $this->redirectToMain();
+                return false;
+            }
+            
+            //Загружаем договор в объект
+            $d->load($d->getByCode($this->params['DGCODE']));
+
+            //Определяем города с нишими партнерами.
+            $partnerCities = $c->getPartnersCities();
+            
+            //Определяем города с нашими филиалами.
+            $filials = $c->getFilialsCities();
+
+            //Отдаем переменные шаблону
+            $this->view->dogovor = $d;
+            //Вычисляем и отдаем курсы валют шаблону
+            $this->view->realCourses = array_shift($realCoursesObj->getCourse(date('Y-m-d', time()), $d->getRate(), 'рб'));
+            $this->view->partnerCities = $partnerCities;
+            $this->view->filials = $filials;
+            //Убрали getOffertaAgreedByDgCode ;)
+            $this->view->offertaAgreed = true; //$this->view->offertaAgreed = $dogovorSettings->getOffertaAgreedByDgCode($this->params['DGCODE']);
+            $this->view->documentOffice = $dogovorSettings->getOfficePrKeyByDgCode($this->params['DGCODE']);
+
+            //Определяем тип шаблона для рендеринга. Тип шаблона зависит от выбранного способа оплаты.
+            if (isset($this->params['type'])) {
+                return $this->render('payments/' . $this->params['type']);
+            }
+        }
+    }
+    
+    /**
+     * Метод отправляет путевку в архив
+     * Это ajax метод
+     * @return <string> - JSON. В случае удачи возвращает result. В случае ошибки - error.
+     *
+     */
+    public function archiveAction() {
+
+        //Выключаем layout, Т.к. это ajax метод.
+        $this->_helper->layout->disableLayout();
+        $this->_helper->viewRenderer->setNoRender();
+        
+        $ds = new DogovorSettings();
+        $d = new Dogovor();
+        if (
+                !isset($this->params['DGCODE'])
+                || !$d->isUsers($this->params['DGCODE'], $this->dup_user->getUsKey())
+        ) {
+            echo Zend_Json::encode(array('error' => 'Permission denied'));
+            return false;
+        }
+        echo Zend_Json::encode(array('result' => $ds->toggleArchive($this->params['DGCODE'])));
+        return true;
+    }
+
+    /**
+     * Метод аннулирования путевки. Не используется
+     * @return <type>
+     */
+    public function annulmentAction() {
+        $this->view->client = $this->client;
+        return $this->render('annulment');
+    }
+
+    /**
+     * Метод, управляющий таблицей офисов Ланты.
+     * Это ajax метод.
+     * @return <void>
+     */
+    public function officesAction() {
+
+        //т.к. это ajax метод - выключаем layout
+        $this->_helper->layout->disableLayout();
+        
+        if (!isset($this->params['cityName'])) {
+            return false;
+        }
+        $c = new city();
+        $officesCities = $c->getOfficesByCityName($this->params['cityName']);
+
+        //Передаем переменные шаблону.
+        $this->view->offices = $officesCities;
+    }
+
+    /**
+     * Метод управляет таблицей филиалов ланты
+     *
+     * @return <mixed> - Возвращает false, если не передали город. Если все ОК, то рендерит страницу филиалов.
+     */
+    public function filialsAction() {
+
+        //Т.к. это ajax метод - вырубаем Layout
+        $this->_helper->layout->disableLayout();
+
+        //Если не передали название города, для которого мы ищем филиалы - возвращаем false
+        if (!isset($this->params['cityName'])) {
+            return false;
+        }
+        //Получаем филиалы по городу.
+        $c = new city();
+        $filialsCities = $c->getFilialsByCityName($this->params['cityName']);
+
+        //Отдаем филиалы шаблону
+        $this->view->filials = $filialsCities;
+    }
+
+    /**
+     * Метод управляет страницей регионов в кабинете частника.
+     *
+     * @return <mixed>
+     *
+     */
+    public function regionofficeAction() {
+
+        $d = new Dogovor();
+        $c = new city();
+        
+        //Если не передали код договора или договор не принадлежит авторизованному пользователю 
+        if (
+                !isset($this->params['DGCODE'])
+                || !$d->isUsers($this->params['DGCODE'], $dup_user->getUsKey())
+        ) {
+            return false;
+        }
+
+        if (!isset($this->params['cityName'])) {
+            return false;
+        }
+
+        //Загружаем договор в объект.
+        $d->load($d->getByCode($this->params['DGCODE']));
+
+        //Получаем региональные офисы по названию города.
+        $regionOffices = $c->getOfficesByCityName($this->params['cityName']);
+
+        //т.к. Это ajax метод - выключаем layout.
+        $this->_helper->layout->disableLayout();
+
+        //Отдаем переменные шаблону.
+        $this->view->regionOffices = $regionOffices;
+        $this->view->dgCode = $this->params['DGCODE'];
+        //$this->dogovor = $d;
+    }
+
+    /**
+     * Метод содержит форму профиля, которая используется на странице оплаты и на странице редактирования профиля.
+     * Эта форма не рендерится стандартными Zend`овыми способами, она используется в контроллере для валидации пришедших от клиента параметров.
+     * @return Zend_Form
+     */
+    public function profileForm() {
+        $form = new Zend_Form();
+        $form->setAction('/')
+                ->setMethod('post');
+
+        //Фамилия
+        $surname = $form->createElement('text', 'FNAMERUS');
+        $surname->addValidator('alnum')
+                ->addValidator('stringLength', false, array(2, 70))
+                ->setLabel('Фамилия')
+                ->setRequired(true);
+        $surname->setValue($this->client->getSurnameRus());
+
+        //Имя
+        $firstName = $form->createElement('text', 'NAMERUS');
+        $firstName->addValidator('StringLength', false, array(2))
+                ->setLabel('Имя')
+                ->setRequired(true);
+
+        //Patronym
+        $patronym = $form->createElement('text', 'SNAMERUS');
+        $patronym->addValidator('StringLength', false, array(2))
+                ->setLabel('Отчество');
+
+        //profileBirthdate
+        $birthdate = $form->createElement('text', 'BIRTHDAY');
+        $birthdate->addValidator('StringLength', false, array(2))
+                ->setLabel('Дата рождения');
+
+        //profilePassportSerial
+        $passportSerial = $form->createElement('text', 'PASPORTSER');
+        $passportSerial->setLabel('Паспорт серия');
+
+        //profilePassportNumber
+        $passportNumber = $form->createElement('text', 'PASPORTNUM');
+        $passportNumber->setLabel('Паспорт номер');
+
+        //profilePassportNumber
+        $passportDate = $form->createElement('text', 'PASPORTDATE');
+        $passportDate->addValidator('StringLength', false, array(1, 255))
+                ->setLabel('Дата выдачи паспорта');
+
+        //profilePassportGived
+        $passportGived = $form->createElement('text', 'PASPORTBYWHOM');
+        $passportGived->setLabel('Кем выдан');
+
+        //profileAddressIndex
+        $addressIndex = $form->createElement('text', 'POSTINDEX');
+        $addressIndex->setLabel('Индекс');
+
+        //profileAddressCity
+        $addressSerial = $form->createElement('text', 'POSTCITY');
+        $addressSerial->setLabel('Город');
+
+        //profileAddressStreet
+        $addressStreet = $form->createElement('text', 'POSTSTREET');
+        $addressStreet->setLabel('Улица');
+
+        //profileAddressHouse
+        $addressHouse = $form->createElement('text', 'POSTBILD');
+        $addressHouse->setLabel('Дом');
+
+        //profileAddressFlat
+        $addressFlat = $form->createElement('text', 'POSTFLAT');
+        $addressFlat->setLabel('Квартира');
+
+        //Телефон
+        $phone = $form->createElement('text', 'PHONE');
+        $phone->setLabel('Телефон');
+
+        //Email
+        $email = $form->createElement('text', 'mail');
+        $email->setLabel('Email');
+
+        //Имя пользователя
+        $submit = $form->createElement('submit', 'profileSubmit');
+        $submit->setLabel('Войти');
+        
+        $form->addElement($surname)
+                ->addElement($firstName)
+                ->addElement($patronym)
+                ->addElement($birthdate)
+                ->addElement($phone)
+                ->addElement($email)
+                ->addElement($passportSerial)
+                ->addElement($passportNumber)
+                ->addElement($passportGived)
+                ->addElement($passportDate)
+                ->addElement($addressIndex)
+                ->addElement($addressSerial)
+                ->addElement($addressStreet)
+                ->addElement($addressHouse)
+                ->addElement($addressFlat);
+        return $form;
+    }
+
+    /**
+     * Метод отправляет информацию о бронировании в выбранный пользователем офис.
+     * Это ajax метод. Этот метод нужно отрефакторить.
+     * @return <mixed>
+     */
+    public function sendorderAction() {
+
+        //Выключаем layout, Т.к. это ajax метод.
+        $this->_helper->layout->disableLayout();
+        $this->_helper->viewRenderer->setNoRender();
+
+        if (!isset($this->params['office'])) {
+            return false;
+        }
+
+        $c               = new City();
+        $d               = new Dogovor();
+        $dogovorSettings = new DogovorSettings();
+
+        if (!$d->isUsers($this->params['dgCode'], $this->dup_user->getUsKey())) {
+            return false;
+        }
+
+        //Получаем города с нашими офисами.
+        $offices = $c->getByKey($this->params['office']);
+
+        //Записываем в специальную таблицу параметров путевки для частника
+        $data = array(
+            'OFFICEPRKEY' => $this->params['office']
+        );
+        $dogovorSettings->setDocumentOffice($this->params['dgCode'], $this->params['office']);
+
+        //Формируем и отправляем письмо.
+        $body = 'Бронирование путевки ' . $this->params['dgCode'];
+        $body .= "\n" . 'Контактные данные бронирующего: ';
+        $body .= "\n Имя: " . $this->client->getFirstNameRus();
+        $body .= "\n Фамилия: " . $this->client->getSurnameRus();
+        $body .= "\n Email: " . $this->client->getEmail();
+        $body .= "\n Телефон " . $this->client->getPhone();
+        $body .= "\n\n Данные о путевке:";
+        $body .= "\n Заказ:";
+        foreach ($d->getOrderListByDgCode($this->params['dgCode']) as $k => $v) {
+            $body .= "\n" . $v['DL_NAME'] . ' : ' . $v['DL_NMEN'];
+        }
+        $office = explode('_', $this->params['office']);
+        $mail = new Zend_Mail('UTF-8');
+
+        $mail->setBodyText($body);
+        $mail->setFrom('noreply@lantatur.ru');
+        foreach (explode(';', $offices['PR_EMAIL']) as $k => $v) {
+            $mail->addTo($v);
+        }
+        $mail->addTo('its.man11@lantatur.ru');
+        $mail->addTo($email);
+        $mail->setSubject('Заявка на бронирование ' . $this->params['dgCode']);
+        $mail->send();
+        //По идее тут должен был бы вернуться какой-то JSON о том, насколько удачно все прошло.
+    }
+
+    /**
+     * Метод ставит отметку о том, что пользователь подписал договор.
+     * Это ajax метод.
+     * @return <void>
+     *
+     */
+    public function offertaagreedAction() {
+
+        //Выключаем layout, Т.к. это ajax метод.
+        $this->_helper->layout->disableLayout();
+        $this->_helper->viewRenderer->setNoRender();
+
+        $d = new Dogovor();
+
+        if (
+                !isset($this->params['dgCode'])
+                        || !$d->isUsers($this->params['dgCode'], $this->dup_user->getUsKey())
+        ) {
+
+            return false;
+        }
+        
+        $dogovorSettings = new DogovorSettings();
+        $dogovorSettings->setOffertaAgreed($this->params['dgCode'], 1);
+        //По идее тут должен был бы вернуться какой-то JSON о том, насколько удачно все прошло.
+    }
+
+}

application/controllers/CabinetController.php~

+<?php
+
+require_once APPLICATION_PATH . '/models/dup_user.php';
+require_once APPLICATION_PATH . '/models/history.php';
+require_once APPLICATION_PATH . '/models/Dogovor.php';
+require_once APPLICATION_PATH . '/models/Lanta/TempClients.php';
+require_once APPLICATION_PATH . '/models/Lanta/Last/Currency.php';
+require_once APPLICATION_PATH . '/models/realCourses.php';
+require_once APPLICATION_PATH . '/models/pr/city.php';
+require_once APPLICATION_PATH . '/models/ClientRouter.php';
+require_once APPLICATION_PATH . '/models/Lanta/ClientAccess.php';
+require_once APPLICATION_PATH . '/models/Lanta/PrivateUser/DogovorSettings.php';
+
+
+/**
+ *  Контроллер кабинета частника.
+ *
+ *
+ */
+class CabinetController extends Zend_Controller_Action {
+
+    public $config = array();
+
+    public $params = array();
+
+    public $client = array();
+
+    /**
+     * Метод инициализации запускается при обращении к любому контроллеру кабинета.
+     * 
+     */
+
+    public function init() {
+        //Запишем параметры в член класса
+        $this->params = $this->getRequest()->getParams();
+
+        //Сразу выгрузим конфиг в член класса.
+	$bootstrap = $this->getInvokeArg('bootstrap');
+	$config = $bootstrap->getOptions();
+        $this->config = $config;
+
+        //Проверяем, авторизован ли зашедший пользователь
+        $auth = Zend_Auth::getInstance();
+        $identity = $auth->getIdentity();
+        //Если такой пользователь не найден - редиректим на страницу авторизации
+        if (!$identity) {
+            $url = 'http://'
+                    . $this->getRequest()->getHttpHost()
+                    . '/' . $this->config['applicationName']
+                    . '/login/index?redirectUrl='
+                    . str_replace('&', '||', 'http://' . $this->getRequest()->getHttpHost() . $_SERVER['REDIRECT_URL']);
+            $this->_redirect($url);
+        }
+
+        //Объект dup_user
+        $dup_user = new dup_user();
+        //Загружаем пользователя, для более удобной работы. Подробнее о загрузке в объект см в документации.
+        $dup_user->loadCurrentUser();
+        //объект ClientAccess
+        $clientAccess = new ClientAccess();
+        //Объект ClientRouter. Необходим для работы с клиентом. Он определяет к какому типу клиентов относится пользователь и работает с соответствующим интерфейсом.
+        $clientRouter = new ClientRouter($clientAccess, $dup_user->getUsKey());
+        //Загружаем clientRouter`a
+        $client = $clientRouter->load($clientRouter->getByUsKey($dup_user->getUsKey()));
+
+        //Запишем клиента в член класса
+        $this->client = $client;
+        //Запишем дуп юзера в член класса
+        $this->dup_user = $dup_user;
+
+        //Отдадим шаблону клиента, т.к. клиент используется почти во всех шаблонах.
+        $this->view->client = $client;
+
+        //Выставляем layout по умолчанию
+        $this->_helper->_layout->setLayout('cabinet');
+
+        //Счетчики находятся здесь.
+        if (isset($config['countersFilePath']) && file_exists($config['countersFilePath'])) {
+            $this->view->counterPath = $config['countersFilePath'];
+        }
+
+        //Передаем css`ки
+        $this->view->headLink()
+                ->appendStylesheet('http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/themes/base/jquery-ui.css')
+                ->appendStylesheet('http://www.lantatur.ru/css/lanta1.css')
+                ->appendStylesheet('http://www.lantatur.ru/css/cabinet.css')
+                ->appendStylesheet('/css/cabinetpersonal.css')
+                ->appendStylesheet('http://www.lantatur.ru/css/text-decor_lantatur.css');
+
+    }
+
+    /**
+     * Метод Index вызывается по умолчанию и отвечает за главную страницу кабинета.(Забронированные туры)
+     * @return <mixed>
+     *
+     */
+
+    public function indexAction() {
+
+        //Костыль для $_GET и $this->params. Не помню зачем это нужно.
+        $_REQUEST = array_merge($this->params, $_REQUEST);
+        unset($this->params['dgCode']);
+        unset($this->params['startDate']);
+        unset($this->params['endDate']);
+        unset($this->params['offset']);
+
+        //Это какая-то лажа для пагинации.
+        //TODO отрефакторить через this->params хотя бы
+        $countOnPage = (isset($_REQUEST['offset']) && intval($_REQUEST['offset'])) ? intval($_REQUEST['offset']) : 15; //Количество элементов на страницу
+        $page = (isset($_REQUEST['page']) && intval($_REQUEST['page'])) ? intval($_REQUEST['page']) : 1; //страница
+        
+        unset($_REQUEST['page']); //Обнуляем, необходимо для пагинации.
+        $d = new Dogovor();
+        $dogovors = $d->getByDupUserKey($this->dup_user->getUsKey());
+
+        //Тут идет поиск по забронированным турам.
+        $params = array();
+
+        //Если в фильрации указан DGCODE.
+        if (isset($_REQUEST['dgCode']) && $_REQUEST['dgCode']) {
+           $params['CODE like ?'] = '%' . $_REQUEST['dgCode'] . '%';
+        }
+        //Если указана дата начала тура
+        if (isset($_REQUEST['startDate']) && $_REQUEST['startDate']) {
+            $parseDate = date_parse($_REQUEST['startDate']);
+            $params['TURDATE >= ?'] =
+                date('Y-m-d', mktime($parseDate['hour'], $parseDate['minute'], $parseDate['second'], $parseDate['month'], $parseDate['day'], $parseDate['year']));
+        }
+        if (isset($_REQUEST['endDate']) && $_REQUEST['endDate']) {
+            $parseDate = date_parse($_REQUEST['endDate']);
+            $params['TURDATE <= ?'] =
+                date('Y-m-d', mktime($parseDate['hour'], $parseDate['minute'], $parseDate['second'], $parseDate['month'], $parseDate['day'], $parseDate['year']));;
+        }
+
+        
+        $params['DupUserKey = ?'] = $this->dup_user->getUsKey();
+        
+        //Получаем договоры по заданным критериям поиска.
+        $dogovors = $d->get($params, ((isset($_REQUEST['archive']) && $_REQUEST['archive'] > 0) ? 1 : 0));
+        
+        //Для удобной работы с полученным массивом во view делаем из полученных данных - объекты dogovor.
+        foreach ($dogovors as $k => &$v) {
+            //Для этого проходимся по массиву, клонируем и загружаем объект.
+            $n = clone $d;
+            $v['obj'] = $n->load($v);
+        }
+        
+        //Пагинатор
+        $paginator = Zend_Paginator::factory($dogovors);
+        $paginator->setItemCountPerPage($countOnPage);
+        $paginator->setCurrentPageNumber($page);
+        
+        //Отдаем view необходимые переменные.
+        $this->view->paginator = $paginator;
+        $this->view->dogovors = $dogovors;
+        
+        //Явно указываем layout.
+        $this->_helper->_layout->setLayout('cabinet');
+        
+        return $this->render('index');
+    }
+
+
+    /**
+     * Метод order управляет страницей заказа в кабинете.
+     * @return <mixed>
+     */
+    
+    public function orderAction() {
+        
+        //Если был отправлен текст от частника - запускаем соответствующий метод.
+        if (isset($this->params['historyText'])) {
+            if (!$this->historyAddAction()) {
+                $this->view->errors->history->notAdded = true;
+            }
+        }
+
+        $d = new Dogovor();
+        $h = new history();
+        $c = new city();
+
+        //Проверяем, был ли передан DGCODE и к тому ли пользователю этот код относится.
+        if (!isset($this->params['DGCODE'])
+                || !$d->isUsers($this->params['DGCODE'], $this->dup_user->getUsKey())
+        ) {
+            //Если нет - редиректим на главную страницу
+            $this->redirectToMain();
+            return false;
+        }
+        
+        //Загружаем договор.
+        $d->load($d->getByCode($this->params['DGCODE']));
+
+        //Получаем сообщения по DGCODE`у
+        $history = $h->getMessagesByDgCode($this->params['DGCODE']);
+
+        $messageArr = array(); //Массив с сообщениями от пользователя
+        foreach ($history as $k => $v) {
+            //Проходимся по массиву, клонируем, загружаем, удаляем.
+            $i = clone $h;
+            $i->load($v);
+            $messageArr[] = $i;
+            unset($i);
+        }
+
+        //Получаем объект курсов валют
+        $realCoursesObj = new realCourses($this->params['DGCODE']);
+        //Получаем статус договора
+        $orderStatus = $d->getDogovorStatus($d->getStatusKey());
+        //Получаем настройки по договору
+        $dogovorSettings = new DogovorSettings();
+        
+        //Партнеры
+        $partnerCities = $c->getPartnersCities();
+        //Филиалы
+        $filials = $c->getFilialsCities();
+        
+        //Устанавливаем явно layout
+        $this->_helper->_layout->setLayout('cabinet');
+
+        //Отдаем переменные шаблону
+        $this->view->dogovor = $d;
+        $this->view->orderList = $d->getOrderListByDgCode($this->params['DGCODE']);
+        $this->view->tourists = $d->getTouristsByDgCode($this->params['DGCODE']);
+        $this->view->filials = $filials;
+        $this->view->offertaAgreed = true;//$dogovorSettings->getOffertaAgreedByDgCode($this->params['DGCODE']);
+        $this->view->documentOffice = $dogovorSettings->getOfficePrKeyByDgCode($this->params['DGCODE']);
+        $this->view->dogovorStatus = $orderStatus['OS_NAME_RUS'];
+        $this->view->history = $messageArr;
+        $this->view->date = $d->getTimeLeftToPay();
+        $this->view->realCourses = array_shift($realCoursesObj->getCourse(date('Y-m-d', time()), $d->getRate(), 'рб'));
+        
+        return $this->render('order');
+    }
+
+    /**
+     * Метод управляет профилем пользователя в личном кабинете частника
+     * @return <void>
+     */
+    public function profileAction() {
+        //получаем форму профиля для частника.
+        $form = $this->profileForm();
+
+        //Если форма была отправлена - обновляем пользователя.
+        if ($form->isValid($_POST)) {
+            //Получаем валидные данные из формы.
+            $values = $form->getValidValues($_POST);
+            //Отправляем данные на обновление пользователя
+            $this->client->update($values, $this->dup_user->getUsKey());
+            
+            //После обновления нужно перезагрузить юзера.
+            //Получаем объект ClientAccess для работы с любым типом пользователя.
+            $clientAccess = new ClientAccess();
+            //Получаем клиента через ClientRouter, при этом отдаем ему объект ClientAccess.
+            $clientRouter = new ClientRouter($clientAccess, $this->dup_user->getUsKey());
+            $client = $clientRouter->load($clientRouter->getByUsKey($this->dup_user->getUsKey()));
+
+            //Обновляем клиента в членах класса.
+            $this->client = $client;
+            $this->view->client = $client;
+        }
+        
+        return $this->render('profile');
+    }
+
+    /**
+     * Для упрощения выделил редирект в отдельный метод. Надо бы его сделать private по идее.
+     * @return <void>
+     */
+    public function redirectToMain() {
+        $url = 'http://'
+                . $this->getRequest()->getHttpHost()
+                . '/' . $this->config['applicationName'] . '/cabinet/';
+        $this->_redirect($url);
+    }
+
+    /**
+     * Метод добавляет сообщение в хистори (переписка с частником)
+     * @return <array>
+     */
+    public function historyAddAction() {
+
+        $h = new history();
+        $d = new Dogovor();
+
+        //Проверяем, относится ли эта заявка к пользователю.
+        if (!isset($this->params['DGCODE'])
+                || !$d->isUsers($this->params['DGCODE'], $this->dup_user->getUsKey())
+        ) {
+            return false;
+        }
+
+        $who = $this->client->getFirstNameRus() . " " . $this->client->getSurnameRus();
+        $data = array(
+            'DGCOD' => $this->params['DGCODE'],
+            'WHO'   => $who,
+            'TEXT'  => $_REQUEST['historyText'],
+            'MOD'   => 'www',
+        );
+        return $h->insert($data);
+    }
+
+    /**
+     * Метод, управляющей страницей оплаты.
+     *
+     * @return <void>
+     *
+     */
+    public function payAction() {
+
+        if (!isset($this->params['DGCODE'])) { return false; }
+
+        $d                  = new Dogovor();
+        $clientAccess       = new ClientAccess();
+        $realCoursesObj     = new realCourses($this->params['DGCODE']);
+        $c                  = new city();
+        $dogovorSettings    = new DogovorSettings();
+
+        //Загружаем форму профиля. Необходима для 1 шага способов оплаты.
+        $form = $this->profileForm();
+        
+        //Если в процессе пользователь изменил какие-то личные данные - обновляем пользователя.
+        if ($form->isValid($_POST)) {
+            //Получаем валидные данные из формы.
+            $values = $form->getValidValues($_POST);
+
+            //Обновляем клиента
+            $this->client->update($values, $this->dup_user->getUsKey());
+            
+            //После обновления нужно перезагрузить юзера.
+            $clientRouter = new ClientRouter($clientAccess, $this->dup_user->getUsKey());
+            $client = $clientRouter->load($clientRouter->getByUsKey($this->dup_user->getUsKey()));
+            
+            //Обновляем клиента в члене класса и в шаблоне.
+            $this->client = $client;
+            $this->view->client = $client;
+
+            //Проверяем, передан ли код договора и принадлежит ли этот договор пользователю.
+            if (!isset($this->params['DGCODE'])
+                    || !$d->isUsers($this->params['DGCODE'], $this->dup_user->getUsKey())
+            ) {
+                //Если нет - редиректим пользователя на главную страницу.
+                $this->redirectToMain();
+                return false;
+            }
+            
+            //Загружаем договор в объект
+            $d->load($d->getByCode($this->params['DGCODE']));
+
+            //Определяем города с нишими партнерами.
+            $partnerCities = $c->getPartnersCities();
+            
+            //Определяем города с нашими филиалами.
+            $filials = $c->getFilialsCities();
+
+            //Отдаем переменные шаблону
+            $this->view->dogovor = $d;
+            //Вычисляем и отдаем курсы валют шаблону
+            $this->view->realCourses = array_shift($realCoursesObj->getCourse(date('Y-m-d', time()), $d->getRate(), 'рб'));
+            $this->view->partnerCities = $partnerCities;
+            $this->view->filials = $filials;
+            //Убрали getOffertaAgreedByDgCode ;)
+            $this->view->offertaAgreed = true; //$this->view->offertaAgreed = $dogovorSettings->getOffertaAgreedByDgCode($this->params['DGCODE']);
+            $this->view->documentOffice = $dogovorSettings->getOfficePrKeyByDgCode($this->params['DGCODE']);
+
+            //Определяем тип шаблона для рендеринга. Тип шаблона зависит от выбранного способа оплаты.
+            if (isset($this->params['type'])) {
+                return $this->render('payments/' . $this->params['type']);
+            }
+        }
+    }
+    
+    /**
+     * Метод отправляет путевку в архив
+     * Это ajax метод
+     * @return <string> - JSON. В случае удачи возвращает result. В случае ошибки - error.
+     *
+     */
+    public function archiveAction() {
+
+        //Выключаем layout, Т.к. это ajax метод.
+        $this->_helper->layout->disableLayout();
+        $this->_helper->viewRenderer->setNoRender();
+        
+        $ds = new DogovorSettings();
+        $d = new Dogovor();
+        if (
+                !isset($this->params['DGCODE'])
+                || !$d->isUsers($this->params['DGCODE'], $this->dup_user->getUsKey())
+        ) {
+            echo Zend_Json::encode(array('error' => 'Permission denied'));
+            return false;
+        }
+        echo Zend_Json::encode(array('result' => $ds->toggleArchive($this->params['DGCODE'])));
+        return true;
+    }
+
+    /**
+     * Метод аннулирования путевки. Не используется
+     * @return <type>
+     */
+    public function annulmentAction() {
+        $this->view->client = $this->client;
+        return $this->render('annulment');
+    }
+
+    /**
+     * Метод, управляющий таблицей офисов Ланты.
+     * Это ajax метод.
+     * @return <void>
+     */
+    public function officesAction() {
+
+        //т.к. это ajax метод - выключаем layout
+        $this->_helper->layout->disableLayout();
+        
+        if (!isset($this->params['cityName'])) {
+            return false;
+        }
+        $c = new city();
+        $officesCities = $c->getOfficesByCityName($this->params['cityName']);
+
+        //Передаем переменные шаблону.
+        $this->view->offices = $officesCities;
+    }
+
+    /**
+     * Метод управляет таблицей филиалов ланты
+     *
+     * @return <mixed> - Возвращает false, если не передали город. Если все ОК, то рендерит страницу филиалов.
+     */
+    public function filialsAction() {
+
+        //Т.к. это ajax метод - вырубаем Layout
+        $this->_helper->layout->disableLayout();
+
+        //Если не передали название города, для которого мы ищем филиалы - возвращаем false
+        if (!isset($this->params['cityName'])) {
+            return false;
+        }
+        //Получаем филиалы по городу.
+        $c = new city();
+        $filialsCities = $c->getFilialsByCityName($this->params['cityName']);
+
+        //Отдаем филиалы шаблону
+        $this->view->filials = $filialsCities;
+    }
+
+    /**
+     * Метод управляет страницей регионов в кабинете частника.
+     *
+     * @return <mixed>
+     *
+     */
+    public function regionofficeAction() {
+
+        $d = new Dogovor();
+        $c = new city();
+        
+        //Если не передали код договора или договор не принадлежит авторизованному пользователю 
+        if (
+                !isset($this->params['DGCODE'])
+                || !$d->isUsers($this->params['DGCODE'], $dup_user->getUsKey())
+        ) {
+            return false;
+        }
+
+        if (!isset($this->params['cityName'])) {
+            return false;
+        }
+
+        //Загружаем договор в объект.
+        $d->load($d->getByCode($this->params['DGCODE']));
+
+        //Получаем региональные офисы по названию города.
+        $regionOffices = $c->getOfficesByCityName($this->params['cityName']);
+
+        //т.к. Это ajax метод - выключаем layout.
+        $this->_helper->layout->disableLayout();
+
+        //Отдаем переменные шаблону.
+        $this->view->regionOffices = $regionOffices;
+        $this->view->dgCode = $this->params['DGCODE'];
+        //$this->dogovor = $d;
+    }
+
+    /**
+     * Метод содержит форму профиля, которая используется на странице оплаты и на странице редактирования профиля.
+     * Эта форма не рендерится стандартными Zend`овыми способами, она используется в контроллере для валидации пришедших от клиента параметров.
+     * @return Zend_Form
+     */
+    public function profileForm() {
+        $form = new Zend_Form();
+        $form->setAction('/')
+                ->setMethod('post');
+
+        //Фамилия
+        $surname = $form->createElement('text', 'FNAMERUS');
+        $surname->addValidator('alnum')
+                ->addValidator('stringLength', false, array(2, 70))
+                ->setLabel('Фамилия')
+                ->setRequired(true);
+        $surname->setValue($this->client->getSurnameRus());
+
+        //Имя
+        $firstName = $form->createElement('text', 'NAMERUS');
+        $firstName->addValidator('StringLength', false, array(2))
+                ->setLabel('Имя')
+                ->setRequired(true);
+
+        //Patronym
+        $patronym = $form->createElement('text', 'SNAMERUS');
+        $patronym->addValidator('StringLength', false, array(2))
+                ->setLabel('Отчество');
+
+        //profileBirthdate
+        $birthdate = $form->createElement('text', 'BIRTHDAY');
+        $birthdate->addValidator('StringLength', false, array(2))
+                ->setLabel('Дата рождения');
+
+        //profilePassportSerial
+        $passportSerial = $form->createElement('text', 'PASPORTSER');
+        $passportSerial->setLabel('Паспорт серия');
+
+        //profilePassportNumber
+        $passportNumber = $form->createElement('text', 'PASPORTNUM');
+        $passportNumber->setLabel('Паспорт номер');
+
+        //profilePassportNumber
+        $passportDate = $form->createElement('text', 'PASPORTDATE');
+        $passportDate->addValidator('StringLength', false, array(1, 255))
+                ->setLabel('Дата выдачи паспорта');
+
+        //profilePassportGived
+        $passportGived = $form->createElement('text', 'PASPORTBYWHOM');
+        $passportGived->setLabel('Кем выдан');
+
+        //profileAddressIndex
+        $addressIndex = $form->createElement('text', 'POSTINDEX');
+        $addressIndex->setLabel('Индекс');
+
+        //profileAddressCity
+        $addressSerial = $form->createElement('text', 'POSTCITY');
+        $addressSerial->setLabel('Город');
+
+        //profileAddressStreet
+        $addressStreet = $form->createElement('text', 'POSTSTREET');
+        $addressStreet->setLabel('Улица');
+
+        //profileAddressHouse
+        $addressHouse = $form->createElement('text', 'POSTBILD');
+        $addressHouse->setLabel('Дом');
+
+        //profileAddressFlat
+        $addressFlat = $form->createElement('text', 'POSTFLAT');
+        $addressFlat->setLabel('Квартира');
+
+        //Телефон
+        $phone = $form->createElement('text', 'PHONE');
+        $phone->setLabel('Телефон');
+
+        //Email
+        $email = $form->createElement('text', 'mail');
+        $email->setLabel('Email');
+
+        //Имя пользователя
+        $submit = $form->createElement('submit', 'profileSubmit');
+        $submit->setLabel('Войти');
+        
+        $form->addElement($surname)
+                ->addElement($firstName)
+                ->addElement($patronym)
+                ->addElement($birthdate)
+                ->addElement($phone)
+                ->addElement($email)
+                ->addElement($passportSerial)
+                ->addElement($passportNumber)
+                ->addElement($passportGived)
+                ->addElement($passportDate)
+                ->addElement($addressIndex)
+                ->addElement($addressSerial)
+                ->addElement($addressStreet)
+                ->addElement($addressHouse)
+                ->addElement($addressFlat);
+        return $form;
+    }
+
+    /**
+     * Метод отправляет информацию о бронировании в выбранный пользователем офис.
+     * Это ajax метод. Этот метод нужно отрефакторить.
+     * @return <mixed>
+     */
+    public function sendorderAction() {
+
+        //Выключаем layout, Т.к. это ajax метод.
+        $this->_helper->layout->disableLayout();
+        $this->_helper->viewRenderer->setNoRender();
+
+        if (!isset($this->params['office'])) {
+            return false;
+        }
+
+        $c               = new City();
+        $d               = new Dogovor();
+        $dogovorSettings = new DogovorSettings();
+
+        if (!$d->isUsers($this->params['dgCode'], $this->dup_user->getUsKey())) {
+            return false;
+        }
+
+        //Получаем города с нашими офисами.
+        $offices = $c->getByKey($this->params['office']);
+
+        //Записываем в специальную таблицу параметров путевки для частника
+        $data = array(
+            'OFFICEPRKEY' => $this->params['office']
+        );
+        $dogovorSettings->setDocumentOffice($this->params['dgCode'], $this->params['office']);
+
+        //Формируем и отправляем письмо.
+        $body = 'Бронирование путевки ' . $this->params['dgCode'];
+        $body .= "\n" . 'Контактные данные бронирующего: ';
+        $body .= "\n Имя: " . $this->client->getFirstNameRus();
+        $body .= "\n Фамилия: " . $this->client->getSurnameRus();
+        $body .= "\n Email: " . $this->client->getEmail();
+        $body .= "\n Телефон " . $this->client->getPhone();
+        $body .= "\n\n Данные о путевке:";
+        $body .= "\n Заказ:";
+        foreach ($d->getOrderListByDgCode($this->params['dgCode']) as $k => $v) {
+            $body .= "\n" . $v['DL_NAME'] . ' : ' . $v['DL_NMEN'];
+        }
+        $office = explode('_', $this->params['office']);
+        $mail = new Zend_Mail('UTF-8');
+
+        $mail->setBodyText($body);
+        $mail->setFrom('noreply@lantatur.ru');
+        foreach (explode(';', $offices['PR_EMAIL']) as $k => $v) {
+            $mail->addTo($v);
+        }
+        $mail->addTo('its.man11@lantatur.ru');
+        $mail->addTo($email);
+        $mail->setSubject('Заявка на бронирование ' . $this->params['dgCode']);
+        $mail->send();
+        //По идее тут должен был бы вернуться какой-то JSON о том, насколько удачно все прошло.
+    }
+
+    /**
+     * Метод ставит отметку о том, что пользователь подписал договор.
+     * Это ajax метод.
+     * @return <void>
+     *
+     */
+    public function offertaagreedAction() {
+
+        //Выключаем layout, Т.к. это ajax метод.
+        $this->_helper->layout->disableLayout();
+        $this->_helper->viewRenderer->setNoRender();
+
+        $d = new Dogovor();
+
+        if (
+                !isset($this->params['dgCode'])
+                        || !$d->isUsers($this->params['dgCode'], $this->dup_user->getUsKey())
+        ) {
+
+            return false;
+        }
+        
+        $dogovorSettings = new DogovorSettings();
+        $dogovorSettings->setOffertaAgreed($this->params['dgCode'], 1);
+        //По идее тут должен был бы вернуться какой-то JSON о том, насколько удачно все прошло.
+    }
+
+}

application/controllers/ErrorController.php

+<?php
+
+class ErrorController extends Zend_Controller_Action
+{
+
+    public function errorAction()
+    {
+        $errors = $this->_getParam('error_handler');
+        
+        if (!$errors || !$errors instanceof ArrayObject) {
+            $this->view->message = 'You have reached the error page';
+            return;
+        }
+        
+        switch ($errors->type) {
+            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
+            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
+            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
+                // 404 error -- controller or action not found
+                $this->getResponse()->setHttpResponseCode(404);
+                $priority = Zend_Log::NOTICE;
+                $this->view->message = 'Page not found';
+                break;
+            default:
+                // application error
+                $this->getResponse()->setHttpResponseCode(500);
+                $priority = Zend_Log::CRIT;
+                $this->view->message = 'Application error';
+                break;
+        }
+        
+        // Log exception, if logger available
+        if ($log = $this->getLog()) {
+            $log->log($this->view->message, $priority, $errors->exception);
+            $log->log('Request Parameters', $priority, $errors->request->getParams());
+        }
+        
+        // conditionally display exceptions
+        if ($this->getInvokeArg('displayExceptions') == true) {
+            $this->view->exception = $errors->exception;
+        }
+        
+        $this->view->request   = $errors->request;
+    }
+
+    public function getLog()
+    {
+        $bootstrap = $this->getInvokeArg('bootstrap');
+        if (!$bootstrap->hasResource('Log')) {
+            return false;
+        }
+        $log = $bootstrap->getResource('Log');
+        return $log;
+    }
+
+
+}
+

application/controllers/IndexController.php

+<?php
+
+class IndexController extends Zend_Controller_Action {
+
+    public function init() {
+	$bootstrap = $this->getInvokeArg('bootstrap');
+	$this->config = $bootstrap->getOptions();
+        $applicationName = $this->config['applicationName'];
+        $url = 'http://'
+            . $this->getRequest()->getHttpHost()
+            . '/' . $applicationName . '/cabinet/';
+        $this->_redirect($url);
+    }
+
+    public function indexAction() {
+        
+    }
+}

application/controllers/LoginController.php

+<?php
+
+require_once APPLICATION_PATH . '/models/dup_user.php';
+require_once APPLICATION_PATH . '/models/ResourceAdapterFactory.php';
+require_once APPLICATION_PATH . '/models/Lanta/TempClients.php';
+require_once APPLICATION_PATH . '/models/MegatekEncryptionService/EncryptionService.php';
+require_once APPLICATION_PATH . '/models/ClientRouter.php';
+require_once APPLICATION_PATH . '/models/Lanta/ClientAccess.php';
+
+class LoginController extends Zend_Controller_Action {
+
+    public function init() {
+        $bootstrap = $this->getInvokeArg('bootstrap');
+	$config = $bootstrap->getOptions();
+        $this->config = $config;
+        $this->params = $this->getRequest()->getParams();
+        if (
+                isset($this->params['lo'])
+                && $this->params['lo'] == 'cabinet'
+        ) {
+            $this->_helper->_layout->setLayout('cabinet');
+            if (!isset($this->params['redirectUrl'])) {
+
+                $this->view->redirectUrl = 'http://' . $this->getRequest()->getHttpHost() . '/' . $this->config['applicationName'] . '/cabinet/';
+            } else {
+                $this->view->redirectUrl = $this->params['redirectUrl'];
+            }
+        } else {
+            $this->_helper->_layout->setLayout('layout');
+        }
+
+        $this->view->cabinetAgencyUrl = $config['cabinetAgencyUrl'];
+        $this->view->baseUrl = $this->getRequest()->getBaseUrl();
+        //Счетчики здесь
+        if (isset($config['countersFilePath']) && file_exists($config['countersFilePath'])) {
+            $this->view->counterPath = $config['countersFilePath'];
+        }
+
+}
+
+    public function loginForm() {
+        $applicationName = $this->config['applicationName'];
+        $form = new Zend_Form();
+        $form->setAction('/')
+                ->setMethod('post');
+
+        //Имя пользователя
+        $username = $form->createElement('text', 'userId');
+        $username->addValidator('alnum')
+                ->addValidator('stringLength', false, array(6, 20))
+                ->setLabel('Логин')
+                ->setRequired(true);
+
+        if (isset($_REQUEST['loginUsername'])) {
+            $username->setValue($this->params['loginUsername']);
+        }
+        //Пароль
+        $password = $form->createElement('password', 'password');
+        $password->addValidator('StringLength', false, array(6))
+                ->setLabel('Пароль')
+                ->setRequired(true);
+
+        //Имя пользователя
+        $submit = $form->createElement('submit', 'loginSubmit');
+        $submit->setLabel('Войти');
+
+        //Url нужен для переброса со страницы логина мегатека на страницу бронирования
+        $redirectUrl = '';
+        if (!isset($this->params['redirectUrl'])) {
+            $redirectUrl = 'http://' . $this->getRequest()->getHttpHost() . '/' . $applicationName . '/cabinet/';
+        } else {
+            $redirectUrl = $this->params['redirectUrl'];
+        }
+
+        $redirectTo = $form->createElement('hidden', 'redirectUrl');
+        $redirectTo->setValue(str_replace('||', '&', $redirectUrl));
+        $form->addElement($username)
+             ->addElement($password)
+             ->addElement($redirectTo)
+             ->addElement($submit);
+        return $form;
+    }
+
+    public function forgotpasswordAction() {
+        $params = $this->getRequest()->getParams();
+        if (isset($params['forgotSubmit'])) {
+            if ($this->doRestorePassword()) {
+                $this->view->sent = true;
+            } else {
+                $this->view->error = true;
+            }
+        }
+        return $this->render('forgot');
+    }
+
+    public function indexAction() {
+        $params = $this->getRequest()->getParams();
+        $form = $this->loginForm();
+        $auth = Zend_Auth::getInstance();
+        $identity = $auth->getIdentity();
+        if (
+            is_array($this->params)
+            && count($this->params) > 0
+            && isset($this->params['loginSubmit'])
+        ) {
+            //Логин здесь
+            return $this->dologinAction();
+        }
+        //Редирект
+        if ($identity && isset($this->params['redirectUrl'])) {
+            $es = new EncryptionService();
+            $dup_user = new dup_user();
+            $dup_user->loadCurrentUser();
+            $this->view->showRedirectForm = true;
+            $this->view->userId = $dup_user->getUsId();
+            $this->view->userPassword = $es->decrypt($dup_user->getPassword());
+        }
+        if (isset($this->params['redirectUrl'])) {
+            $this->view->redirectUrl = $this->params['redirectUrl'];
+        } else {
+            $this->view->redirectUrl = 'http://' . $this->getRequest()->getHttpHost() . '/' . $this->config['applicationName'] . '/cabinet/';
+        }
+        $this->view->form = $form;
+        return $this->render('index');
+    }
+
+    public function dologinAction() {
+        $res = array();
+        $this->_helper->layout->disableLayout();
+        $params = array(
+            'loginUsername' => $this->params['loginUsername'],
+            'loginPassword' => $this->params['loginPassword'],
+            'redirectUrl' => $this->params['redirectUrl']
+        );
+        
+        //Локальная аутентификация
+        if (
+            is_array($this->params)
+            && count($this->params) > 0
+            && isset($this->params['loginUsername'])
+            && isset($this->params['loginPassword'])
+        ) {
+            $es = new EncryptionService();
+            $username = $this->params['loginUsername'];
+            $password = $es->encrypt($this->params['loginPassword']);
+            $dup_user = new dup_user();
+            if ($user = $dup_user->getByUsId($username)) {
+                if (isset($user['US_PRKEY'])
+                        && intval($user['US_PRKEY']) > 0
+                        && intval($user['US_PRKEY']) != 47508
+                ) {
+                    $res = array('result' => false, 'agency' => 1);
+                    die(json_encode($res));
+                }
+            }
+            $adapter = ResourceAdapterFactory::factory('Ms');
+            //Выставляем auth адаптеры
+            //Здесь хер разберешь
+            $authAdapter = new Zend_Auth_Adapter_DbTable($adapter);
+            $authAdapter->setTableName('dup_user');
+            $authAdapter->setIdentityColumn('US_ID');
+            $authAdapter->setCredentialColumn('US_PASSWORD');
+            $authAdapter->setIdentity($username);
+            $authAdapter->setCredential($password);
+            if (isset($this->params['rememberMe']) && $this->params['rememberMe'] != 'false') {
+                Zend_Session::rememberMe(60 * 60 * 24 * 30);
+            } else {
+                Zend_Session::forgetMe();
+            }
+            $auth = Zend_Auth::getInstance();
+            $result = $auth->authenticate($authAdapter);
+            $res = array();
+            if ($result->isValid()) {
+                $res = array('result' => "true");
+            } else {
+                $res = array('result' => "false");
+            }
+        } else {
+            $res = array('result' => 'error');
+        }
+        if (isset($this->params['onAfterLoginRedirectUrl'])) {
+            $url = str_replace('||', '&', $this->params['onAfterLoginRedirectUrl']);
+            $this->_redirect($url);
+        }
+        die(json_encode($res));
+    }
+
+    public function doRestorePassword() {
+        $params = $this->getRequest()->getParams();
+        if (isset($params['forgotEmail']) || isset($params['forgotUsername'])) {
+            $user = array();
+            $dup_user = new dup_user();
+            $clientAccess = new ClientAccess();
+            
+            $client = array();
+            if (
+                    isset($params['forgotEmail'])
+                    && strlen($params['forgotEmail']) > 0
+            ) {
+                //$clientRouter = new ClientRouter($clientAccess, $user['US_KEY']);
+                //$client = $clientRouter->getByEmail($params['forgotEmail']);
+                //$user = $dup_user->getByUsKey($client->getDupUserKey());
+                
+            } elseif ($params['forgotUsername']) {
+                $user = $dup_user->getByUsId($params['forgotUsername']);
+                if ($user) {
+                    $dup_user->load($user);
+                    $clientRouter = new ClientRouter($clientAccess, $user['US_KEY']);
+                    $client = $clientRouter->load($clientRouter->getByUsKey($dup_user->getUsKey()));
+                } else {
+                    return false;
+                }
+            }
+            $this->client = $client;
+            
+            if (!$user) {
+                return false;
+            }
+            $encryptionService = new EncryptionService();
+
+            $body = 'Восстановление пароля для личного кабинета частного лица.';
+            $body .= "\n" . 'Ваш логин: ' . $user['US_ID'];
+            $body .= "\n" . 'Ваш пароль: ' . $encryptionService->decrypt($user['US_PASSWORD']);
+            $mail = new Zend_Mail('UTF-8');
+            $mail->setBodyText($body);
+            $mail->setFrom('noreply@lantatur.ru');
+            $mail->addTo($client->getEmail());
+            //$mail->addTo('its.man11@lantatur.ru');
+            $mail->setSubject('Восстановление пароля');
+            return ($mail->send()) ? true : false;
+        }
+    }
+
+    public function dologoutAction() {
+        $params = $this->getRequest()->getParams();
+        Zend_Auth::getInstance()->clearIdentity();
+        if (isset($params['redirectUrl'])) {
+            $url = str_replace('||', '&', $params['redirectUrl']);
+            $this->_redirect($url);
+        } else {
+            $url = 'http://' . $this->getRequest()->getHttpHost();
+            $this->_redirect($url);
+            die(json_encode(array('result' => 'true')));
+        }
+    }
+}

application/controllers/RegistrationController.php

+<?php
+
+require_once APPLICATION_PATH . '/models/dup_user.php';
+require_once APPLICATION_PATH . '/models/Lanta/TempClients.php';
+require_once APPLICATION_PATH . '/models/MegatekEncryptionService/EncryptionService.php';
+require_once APPLICATION_PATH . '/languages/FormErrors.php';
+
+class RegistrationController extends Zend_Controller_Action {
+
+    public function init() {
+        $params = $this->getRequest()->getParams();
+        if (
+                isset($params['lo'])
+                && $params['lo'] == 'cabinet'
+        ) {
+            $this->_helper->_layout->setLayout('cabinet');
+        }
+	$bootstrap = $this->getInvokeArg('bootstrap');
+	$config = $bootstrap->getOptions();
+        $this->config = $config;
+        if (isset($config['countersFilePath']) && file_exists($config['countersFilePath'])) {
+            $this->view->counterPath = $config['countersFilePath'];
+        }
+
+    }
+
+    public function registrationForm() {
+        $form = new Zend_Form();
+        $form->setAction('/')
+                ->setMethod('post');
+        
+        $translate = new Zend_Translate(
+            array(
+                'adapter' => 'array',
+                'content' => APPLICATION_PATH . '/languages/FormErrors.php',
+                'locale'  => 'ru'
+            )
+        );
+        
+        $form->setTranslator($translate);
+        //Имя пользователя
+        $username = $form->createElement('text', 'registerUsername');
+        $username->addValidator('alnum')
+                ->addValidator('stringLength', false, array(6, 20))
+                ->setLabel('Логин')
+                ->setRequired(true);
+                
+        //Имя пользователя
+        $email = $form->createElement('text', 'registerEmail');
+        $email->addValidator('stringLength', false, array(6, 255))
+                ->setLabel('E-mail')
+                ->setRequired(true);
+                
+        //Имя
+        $firstName = $form->createElement('text', 'registerFirstName');
+        $firstName->addValidator('alnum')
+                ->addValidator('stringLength', false, array(2, 255))
+                ->setLabel('Имя')
+                ->setRequired(true);
+                
+        //Фамилия
+        $surname = $form->createElement('text', 'registerSurname');
+        $surname->addValidator('alnum')
+                ->addValidator('stringLength', false, array(2, 255))
+                ->setLabel('Фамилия')
+                ->setRequired(true);
+                
+        //Пароль
+        $password = $form->createElement('password', 'registerPassword');
+        $password->addValidator('StringLength', false, array(6))
+                ->setLabel('Пароль')
+                ->setRequired(true);
+                
+        //Телефон
+        $phone = $form->createElement('text', 'registerPhone');
+        $phone->addValidator('StringLength', false, array(3))
+                ->addValidator('regex', false, array('/^(\(?\+?[0-9]*\)?)?[0-9_\- \(\)]*$/'))
+                ->setRequired(true)
+                ->setLabel('Телефон');
+                
+        $form->addElement($username)
+                ->addElement($email)
+                ->addElement($password)
+                ->addElement($firstName)
+                ->addElement($surname)
+                ->addElement($phone)
+                ->addElement('submit', 'registerSubmit', array('label' => 'Зарегистрировать'));
+        return $form;
+    }
+
+    public function indexAction() {
+        $form = $this->registrationForm();
+        if (is_array($_POST) && count($_POST) > 0) {
+            if ($form->isValid($_POST)) {
+                $validValues = $form->getValidValues($_POST);
+                if ($this->doRegisterAction()) {
+                    $this->redirectToLogin();