'Словарь №1,Тип сообщения', 'OBJECT_TYPE'=> 'Словарь №2, Тип объекта оценки', 'BUILDING_STAGE'=> 'Словарь №3, Стадия строительства', 'DECORATION_TYPE'=> 'Словарь №4, Состояние отделки помещения', 'WALL_MATERIAL'=> 'Словарь №5, Материал стен дома', 'VERIFICATION_STATUS'=> 'Словарь №6, Статус проверки', 'EGRN_EXTRACT_REQUEST_STATUS'=> 'Словарь №7, Статус заказа справки об объекте неждвижимости', 'APPRAISAL_SERVICE_TYPE'=> 'Словарь №8, Тип услуги при заказеоценки', 'REPORT_USAGE_TYPE' => 'Словарь №9, Цель оценки', 'ORDER_STATE'=> 'Словарь №10, Статус заказа', 'ORDER_STATE_COLOR'=> 'Цвета статусов заказа', 'VERIFICATION_RESULT'=> 'Словарь №11, Результат проверки', 'ACCOUNT_TYPE' => 'Типы учетных записей в системе', ); // Словарь №1,Тип сообщения private static $MESSAGE_TYPE = array( 'ORDER_ACCEPTED' => 'Заказ принят', 'ORDER_DECLINED'=> 'Заказ отклонен', 'CALCULATION_READY'=> 'Выполнен расчет', 'REQUEST_STATE_UPDATED'=> 'Заказ обновлен', 'REPORT_READY'=> 'Отчет готов', 'CHAT_MESSAGE_RECEIVED' => 'Получено текстовое сообщение', 'CHAT_MESSAGE' => 'Сообщение', ); // Словарь №2, Тип объекта оценки private static $OBJECT_TYPE = array( 'ROOM' => 'Комната', 'FLAT'=> 'Квартира', 'HOUSE'=> 'Дом', //'LAST_ROOM'=> 'Последняя комната', 'TOWNHOUSE' => 'Таунхаус', 'APARTMENTS'=> 'Апартаменты', 'FLAT_PART'=> 'Доля в квартире', //'AUTO'=> 'Автомобиль', 'PARKING_PLACE'=> 'Парковочное место', //'BUSINESS'=> 'Бизнес', 'COMMERCIAL'=> 'Коммерческая недвижимость', //'COURT'=> 'Для суда', //'EQUIPMENT'=> 'Оборудование', //'INVESTMENT'=> 'Инвестиции', 'LAND_PLOT'=> 'Земельный участок', ); // Словарь №3, Стадия строительства private static $BUILDING_STAGE = array( 'NEW'=> 'Новостройка', 'BUILT'=> 'Дом построен', ); // Словарь №4, Состояние отделки помещения private static $DECORATION_TYPE = array( 'NO_DECORATION'=> 'Без отделки', 'OVERHAUL_REQUIRED'=> 'Требуется капитальный ремонт', 'FOR_FINISHING'=> 'Предчистовая отделка', 'COSMETIC_REQUIRED'=> 'Требуется косметический ремонт', 'GOOD'=> 'Хорошее состояние', 'IMPROVED'=> 'Улучшенная отделка', 'EURO'=> 'Евроремонт', 'EXCLUSIVE'=> 'Эксклюзивный ремонт', ); // Словарь №5, Материал стен дома private static $WALL_MATERIAL = array( 'PANEL'=> 'Панельный', 'BLOCK'=> 'Блочный', 'MONOLITHIC_BRICK'=> 'Монолитно-кирпичный', 'BRICK'=> 'Кирпичный', 'MONOLITHIC'=> 'Монолитный', 'WOOD'=> 'Деревянный', ); // Словарь №6, Статус проверки private static $VERIFICATION_STATUS = array( 'NOT_VERIFIED'=> 'Проверка не производилась', 'IN_PROGRESS' => 'Идет проверка', 'COMPLETED'=> 'Проверка завершена успешно', 'ERROR'=> 'Проверка завершена с ошибками', ); // Словарь №7, Статус заказа справки об объекте неждвижимости private static $EGRN_EXTRACT_REQUEST_STATUS = array( 'NOT_REQUESTED'=> 'Справка не заказывалась', 'REQUESTED'=> 'Справка заказан и ожидает получения', 'READY' => 'Справка сформирована', 'ERROR' => 'При формировании справки произошла ошибка', ); // Словарь №8, Тип услуги при заказеоценки private static $APPRAISAL_SERVICE_TYPE = array( 'APPRAISAL'=> 'Оценка', 'CALCULATION'=> 'Расчет стоимости', ); // Словарь №9, Цель оценки private static $REPORT_USAGE_TYPE = array( 'COLLATERAL'=> 'Для целей залога', 'MORTGAGE'=> 'Для оформления закладной', 'PROCEEDING'=> 'Для судопроизводства', 'CHILD_SERVICES' => 'Для органов опеки', 'BUYING_SELLING' => 'Для купли-продажи', 'NOTARY' => 'Для нотариуса', 'CADASTRAL_VALUE_CONTEST'=> 'Оспаривание кадастровой стоимости', 'ANOTHER'=> 'Другое', ); // Словарь №10, Статус заказа private static $ORDER_STATE = array( 'CREATED'=> 'Создан', 'SENT'=> 'Отправлен', 'WORK'=> 'В работе', 'CLOSED'=> 'Закрыт (выполнен)', 'DECLINED'=> 'Отклонен', 'CANCELED'=> 'Отменен', ); // color, border private static $ORDER_STATE_COLOR = array( 'CREATED'=> ['#237ef7', '#3a8efa'], // обычный 'SENT'=> ['#237ef7', '#3a8efa'], //'Отправлен', // синий 'WORK'=> ['orange', 'orange'], //'В работе', // желтый 'CLOSED'=> ['#4CAF50', '#43a047'], // 'Закрыт (выполнен)', // зеленый 'DECLINED'=> ['#e2574cd9', '#9436295e'], // 'Отклонен', // красный 'CANCELED'=> ['#757575', '#d0d0d0'], // 'Отменен', // серый ); // Словарь №11, Результат проверки private static $VERIFICATION_RESULT = array( 'PROCESSING'=> 'Идет получение данных', 'GOOD'=> 'Проверка пройдена успешно', 'ATTENTION' => 'Результат проверки требует внимания', 'BAD'=> 'Результат проверки критический', 'ERROR'=> 'Отклонен', ); // Словарь №12, Типы учетных записей в системе private static $ACCOUNT_TYPE = array( 'APPRAISER'=> 'Оценочная компания', 'BANK'=> 'Банк', 'AGENCY' => 'Агентство', ); public function __construct(User $user) { if ($this->operation == 'dev') { $this->auth_uri = 'https://beta.'.$this->uri; $this->api_uri = 'https://r.beta.'.$this->uri; $this->appraisalCompanyId = 2; } else { $this->auth_uri = 'https://app.'.$this->uri; $this->api_uri = 'https://r.'.$this->uri; $this->appraisalCompanyId = 1; } if(empty($user->id)) $user->id = $_SESSION['id']; $this->war_user_id = $user->id; $this->war_expired = NULL; // Это флаг, который позволяет нам отличить владельца ключа от пользователя. $this->is_owner = true; $user->api['is_owner'] = true; $sql = "SELECT aw.*, wu.* FROM user_api_war aw INNER JOIN war_users wu ON wu.api_id = aw.id WHERE wu.uid = {$this->war_user_id}"; $q = mysql_query($sql); $r = mysql_fetch_assoc($q); if (!empty($r)) { $this->war_id = $r['id']; $this->war_owner_uid = $r['user_id']; $this->war_username = $r['username']; $this->war_client_id = $r['client_id']; $this->war_client_secret = $r['client_secret']; $this->war_access_token = $r['access_token']; $this->war_refresh_token = $r['refresh_token']; $this->war_expires_in = $r['expires_in']; $user->api['war_id'] = $r['id']; $user->api['war_owner_uid'] = $r['user_id']; $user->api['war_username'] = $r['username']; $user->api['war_pincode'] = $r['pincode']; $user->api['war_client_id'] = $r['client_id']; $user->api['war_client_secret'] = $r['client_secret']; $user->api['war_access_token'] = $r['access_token']; $user->api['war_refresh_token'] = $r['refresh_token']; $user->api['war_expires_in'] = $r['expires_in']; if(empty($r['expires_in'])) { $this->war_expired = NULL; } elseif($r['expires_in'] < time()) { $res = $this->auth_request('refresh_token'); if($res['status'] == 'success') { $this->war_expired = false; } else { $this->war_expired = true; } } else { $this->war_expired = false; } if(!empty($r['user_id']) && $r['user_id'] != $r['uid'] ) { $this->is_owner = false; $user->api['is_owner'] = false; } } } public static function save($fields) { // valid_fields format: 'form data field' => 'DB data field' $valid_fields = array( 'war_id'=> 'id', 'war_user_id'=> 'user_id', 'war_username'=> 'username', 'war_pincode' => 'pincode', 'war_client_id'=> 'client_id', 'war_client_secret'=> 'client_secret', 'war_access_token'=> 'access_token', 'war_refresh_token'=> 'refresh_token', 'war_expires_in'=> 'expires_in', 'war_token_type'=> 'token_type', ); $id = WebAppRaiserDB::save('user_api_war', $fields, $valid_fields); if($id){ $uid = $fields['war_user_id']; $user_fields = array( 'uid' => $uid, 'api_id' => $id, 'updateDate' => time(), ); $user_valid_fields = array( 'uid' => 'uid', 'api_id' => 'api_id', 'updateDate' => 'updateDate', ); //print_r($user_fields); $sql = "DELETE FROM `war_users` WHERE `uid`=$uid AND `api_id`=$id"; mysql_query($sql); WebAppRaiserDB::save('war_users', $user_fields, $user_valid_fields); } return $id; } // 3.Polling (Опрос сервисом Внешней системой о получении новых сообщений) public function apiMessages($id = false, $del = false) { $entry_point = 'messages'; $return = array( 'status' => 'success', 'msg' => '', 'info' => array(), 'result' => array(), 'fields' => array(), ); if($id === false){ // Получение списка новых сообщений $res = $this->request($entry_point.'/new'); $return['info'] = $res['info']; $return['result'] = $res['result']; // Ответ - массив: [id, date, type] if ($return['info']['http_code'] == '200'){ // Запрос прошел без ошибок return $return; } else { // Произошла ошибка $return["msg"] = "Ошибка обращения к API webappraiser при получении списка новых сообщений. "; $return["msg"] .= $return['result']['message']; $return["status"] = 'error'; return $return; } } else { $id = (int)$id; if ($del == false) { // Получение полного содержимого сообщения $res = $this->request($entry_point.'/'.$id); $return['info'] = $res['info']; $return['result'] = $res['result']; // Ответ - элемент: [id, date, type, ... ] if ($return['info']['http_code'] == '200'){ // Запрос прошел без ошибок сохраняем запись в базу данных $valid_fields = array( 'id' => 'id', 'out_id' => 'out_id', 'api_id' => 'api_id', 'date' => 'date', 'type' => 'type', 'orderId' => 'orderId', 'fields' => 'fields', ); $fields_fields = array(); foreach(['comment', 'value', 'text'] as $key){ if(isset($return['result'][$key])) $fields_fields[$key] = $return['result'][$key]; } $msg_id = 0; $test_records = WebAppRaiserDB::select('war_msg', 'out_id', $return['result']['id']); foreach($test_records as $test_record){ if($test_record['api_id'] == $this->war_id){ $msg_id = $test_record['id']; } } $fields = array( 'id' => $msg_id, 'out_id' => $return['result']['id'], 'api_id' => $this->war_id, 'date' => strtotime($return['result']['date']), 'type' => $return['result']['type'], 'orderId' => $return['result']['orderId'], 'fields' => base64_encode(serialize($fields_fields)), ); $inner_id = WebAppRaiserDB::save('war_msg', $fields, $valid_fields); if($inner_id){ $return["msg"] = "Сообщение сохранено."; //$return["status"] = 'success'; } else{ $return["msg"] = "Возникла проблема при сохранении сообщения в базу данных."; $return["status"] = 'error'; } return $return; } else { // Произошла ошибка $return["msg"] = "Ошибка обращения к API webappraiser при чтении одного сообщения. "; $return["msg"] .= $return['result']['message']; $return["status"] = 'error'; return $return; } } else { // Удаление сообщения из очереди $res = $this->request($entry_point.'/'.$id, [], 'DELETE'); $return['info'] = $res['info']; $return['result'] = $res['result']; // Ответ - нет if ($return['info']['http_code'] == '200'){ // Запрос прошел без ошибок return $return; } else { // Произошла ошибка $return["msg"] = "Ошибка обращения к API webappraiser при удалении сообщения. "; $return["msg"] .= $return['result']['message']; $return["status"] = 'error'; return $return; } } } return $return; } // Получаем список сообщений public function getMessages() { return $this->apiMessages(); } // Получаем одно сообщение public function getMessage($id) { return $this->apiMessages($id); } // Удаляем сообщение из очереди public function deleteMessage($id) { return $this->apiMessages($id, true); } // 4. Работа с заказами // $op = list | get | create | delete public function apiOrders($id = 0, $op = 'list', $fields = []) { $entry_point = 'orders'; $return = array( 'status' => 'success', 'msg' => '', 'info' => array(), 'result' => array(), 'fields' => array(), ); if ($id === 0) { if($op == 'list') { // 4.1.Получение списка заказов if(empty($fields)){ // page - страница, size - элементов на странице $fields = ['page'=>1, 'size'=>50]; } $return['result'] = $this->request($entry_point, $fields, 'GET'); // Ответ - массив [content[id,number,serviceType,objectType,state,customerName,address,requestDate], size, totalElements, totalPages, pageNumber] } elseif($op == 'create'){ // 4.2.Отправка заказа $valid_fields = array( 'api_id' => 'api_id', 'orderId' => 'orderId', // 'Целое число', // Идентификатор заказа во Внешней системе 'serviceType' => 'serviceType', // 'Код', // обязательно, Тип услуги оценки, Словарь №8 'objectType' => 'objectType', // 'Код', // обязательно, Тип объекта оценки, Словарь №2 'reportUsageType'=> 'reportUsageType', // 'Код', // обязательно, Цель оценки, Словарь №9 'address' => 'address', // 'Текст', // обязательно, Адрес объекта оценки 'customerName' => 'customerName', // 'Текст', // ФИО клиента 'customerPhone' => 'customerPhone', // 'Текст', // Контактный телефон клиента 'customerEmail' => 'customerEmail', // 'Текст', // Email клиента 'сontactName' => 'сontactName', // ФИО контактного лица 'сontactPhone' => 'сontactPhone', // Номер телефона контактного лица 'сontactEmail' => 'сontactEmail', // Email контактного лица 'inspectionContactName' => 'inspectionContactName', // 'Текст', // ФИО, ответственного за осмотр 'inspectionContactPhone' => 'inspectionContactPhone', // 'Текст', // Контактный телефон, ответственного за осмотр 'bankId' => 'bankId', // 'Целое число', // Идентификатор банка в Системе 'bankManagerName' => 'bankManagerName', // 'Текст', // ФИО менеджера банка 'bankManagerEmail' => 'bankManagerEmail', // 'Текст', // Email менеджера банка 'managerComment' => 'managerComment', // 'Текст', // Комментарий менеджера 'managerEmail' => 'managerEmail', // 'Текст', // Email менеджера 'deliveryRequired' => 'deliveryRequired', // true\false // Требуется доставка отчета 'deliveryAddress' => 'deliveryAddress', // Текст // Адрес доставки 'deliveryContactName' => 'deliveryContactName', // Текст // Контактное лицо для доставки 'deliveryContactPhone' => 'deliveryContactPhone', // Текст // Номер телефона контактного лица для доставки //'customerPassportSerial' => 'Текст', // Серия паспорта клиента //'customerPassportNumber' => 'Текст', // Номер паспорта клиента //'customerPassportSub' => 'Текст', // Код подразделения, выдавшего паспорт клиенту //'customerPassportIssuedBy' => 'Текст', // Название отделения, кем выдан паспорт клиенту //'customerPassportIssueDate' => 'Дата', // Дата выдачи паспорта //'customerPassportAddress' => 'Текст', // Адрес регистрации клиента 'appraisalCompanyId' => 'appraisalCompanyId', // 'Целое число', // Обязательно, Идентификатор оценочной компании 'contractCost' => 'contractCost', // 'Целое число', // Стоимость объекта при покупке 'allowMessaging' => 'allowMessaging', // Разрешить обмен сообщениями 'calculationId' => 'calculationId', 'Целое число', // Идентификатор автоматического расчета из п.6 /*'files' => 'files', /* array( 'name' => 'Название категории', 'files' => ['name' => 'название', 'data' => 'Base64:data'] ), // Прикрепляемые файлы // */ ); //TODO Файлы обрабатывать отдельно из массива $_FILES // Ответ - элемент: [id - идентификатор заказа] $match = WebAppRaiserDB::matchFieldsToSave($fields, $valid_fields); $res = $this->request($entry_point.'/create', $match['fields_to_save'], 'POST'); $return['info'] = $res['info']; $return['result'] = $res['result']; $return['body'] = $res['body']; $return['match'] = $match; if ($return['info']['http_code'] == '200'){ // без ошибок, сохраняем заказ в свою базу $fields['id'] = $return['result']['id']; $fields['requestDate'] = time(); $fields['api_id'] = $this->war_id; $return['fields'] = $fields; $inner_id = WebAppRaiserOrder::save($fields); if($inner_id){ $return["msg"] = "Заказ сохранен."; //$return["status"] = 'success'; } else{ $return["msg"] = "Возникла проблема при сохранении в базу данных."; $return["status"] = 'error'; } return $return; } else { // Произошла ошибка $return["msg"] = "Ошибка обращения к API webappraiser. "; $return["msg"] .= $return['result']['message']; $return["status"] = 'error'; return $return; } } } elseif(is_numeric($id) && $id > 0 && $op == 'get'){ // 4.3.Получение информации о заказе //$result = $this->request('orders/'.$id); /* Ответ - элемент: [ 'id' => 'Целое число' - Да Идентификатор заказа 'externalId' => 'Целое число' - Идентификатор заказа во Внешней системе 'number' => 'Текст' - Номер заказа 'state' => 'Код' - Статус заказа. Словарь №10 'serviceType' => 'Код' - Тип услуги оценки, Словарь №8 'objectType' => 'Код' - Тип объекта оценки, Словарь №2 'reportUsageType' => 'Код' - Цель оценки, Словарь №9 'preliminaryCalculationValue' => 'Число' - Стоимость, полученная в результате расчета 'address' => 'Текст' - Адрес объекта оценки 'customerName' => 'Текст' - ФИО клиента 'requestDate' => 'Дата и время' - Дата заказа 'payed' => 'true\false' - обязательно, Оплачено 'reportPrinted' => 'true\false' - обязательно, Отчет распечатан 'reportReady' => 'true\false' - обязательно, Отчет готов 'deliveryRequired' => 'true/false' - обязательно, Требуется доставка 'deliveryAddress' => 'Текст' - Адрес доставки 'documentsChecked' => 'true/false' - обязательно, Документы проверены 'inspectionRequired' => 'true/false' - обязательно, Требуется осмотр 'inspectionConfirmed' => 'true/false' - обязательно, Осмотр согласован 'inspectionDate' => 'Дата и время' - Дата осмотра 'inspected' => 'true/false' - обязательно, Осмотр проведен 'appraisalManagerName' => 'Текст' - ФИО менеджера оценочной компании * ] */ $res = $this->request($entry_point.'/'.$id, [], 'GET'); $return['info'] = $res['info']; $return['result'] = $res['result']; if ($return['info']['http_code'] == '200'){ // без ошибок, сохраняем заказ в свою базу $api_fields = $return['result']; unset($api_fields['requestDate']); unset($api_fields['externalId']); //$api_fields['requestDate'] = strtotime($api_fields['requestDate']); $api_fields['readyDate'] = strtotime($api_fields['readyDate']); $api_fields['inspectionDate'] = strtotime($api_fields['inspectionDate']); $api_fields['woid'] = $fields['woid']; $api_fields['api_id'] = $this->war_id; $api_fields['updateDate'] = time(); $return['fields'] = $api_fields; $inner_id = WebAppRaiserOrder::save($api_fields); if($inner_id){ $return["msg"] = "Заказ сохранен."; //$return["status"] = 'success'; //$return["match_fields"] = $inner_id; } else{ $return["msg"] = "Возникла проблема при сохранении в базу данных."; $return["status"] = 'error'; } return $return; } else { // Произошла ошибка $return["msg"] = "Ошибка обращения к API webappraiser. "; $return["msg"] .= $return['result']['message']; $return["status"] = 'error'; return $return; } } elseif(is_numeric($id) && $id > 0 && $op == 'delete'){ // 4.7.Удаление заказа $res = $this->request($entry_point.'/'.$id, [], 'DELETE'); $return['info'] = $res['info']; $return['result'] = $res['result']; if ($return['info']['http_code'] == '200'){ // без ошибок, удаляем заказ из своей базы $rowsNum = WebAppRaiserOrder::delete($id); if($rowsNum > 0){ $return["msg"] = "Заказ удален."; //$return["status"] = 'success'; } else{ $return["msg"] = "Возникла проблема при удалении заказа из базы данных."; $return["status"] = 'error'; } return $return; } else { // Произошла ошибка $return["msg"] = "Ошибка обращения к API webappraiser. "; $return["msg"] .= $return['result']['message']; $return["status"] = 'error'; return $return; } } return $return; } // Список заказов для данной страницы в данном объеме public function listOrders($fields) { if(empty($fields)){ $fields = ['page'=>1, 'size'=>50]; } return $this->apiOrders(0, 'list', $fields); } // Создание заказа на оценку public function createOrder($fields) { return $this->apiOrders(0,'create', $fields); } // Показать один объект public function getOrder($fields) { return $this->apiOrders($fields['order_id'], 'get', $fields); } // Удалить один объект public function deleteOrder($fields) { return $this->apiOrders($fields['order_id'], 'delete'); } // 4.4.Отправка дополнительных документов к заказу public function addDocuments($id, $fields) { $entry_point = 'orders/'.$id.'/addDocuments'; $return = array( 'status' => 'success', 'msg' => '', 'info' => array(), 'result' => array(), 'fields' => array(), ); //msg('Fields for API', [$entry_point, $fields]); $res = $this->request($entry_point, $fields, 'POST'); //msg('API result', [$res]); $return['info'] = $res['info']; $return['result'] = $res['result']; $return['body'] = $res['body']; $return['fields'] = $fields; if ($return['info']['http_code'] == '200'){ // без ошибок, файлы отправлены $return["msg"] = "Файлы отправлены."; //$return["status"] = 'success'; return $return; } else { // Произошла ошибка $return["msg"] = "Ошибка обращения к API webappraiser. "; $return["msg"] .= $return['result']['message']; $return["status"] = 'error'; return $return; } return $return; } // 4.5.Получение отчета об оценке public function getRaiserReport($fields){ $entry_point = 'orders/'.$fields['order_id'].'/downloadReportPackage'; $return = array( 'status' => 'success', 'msg' => '', 'info' => array(), 'result' => array(), 'fields' => array(), ); // ответ Набор документов в формате zip. $res = $this->requestFile($entry_point, $fields, 'GET'); //msg('API result', [$res]); //$return['info'] = $res['info']; //$return['result'] = $res['result']; //$return['body'] = $res['body']; //return $return; } // 4.6.Получение списка сообщений в заказе public function сhatMessages($id){ $entry_point = 'orders/'.$id.'/chatMessages'; $return = array( 'status' => 'success', 'msg' => '', 'info' => array(), 'result' => array(), 'fields' => array(), ); $res = $this->request($entry_point, [], 'GET'); //msg('API result', [$res]); $return['info'] = $res['info']; $return['result'] = $res['result']; $return['body'] = $res['body']; if ($return['info']['http_code'] == '200'){ // Запрос прошел без ошибок сохраняем запись в базу данных $valid_fields = array( 'id' => 'id', 'out_id' => 'out_id', 'api_id' => 'api_id', 'date' => 'date', 'type' => 'type', 'orderId' => 'orderId', 'fields' => 'fields', ); //msg('RETURN', $return['result']); if(is_array($return['result'])){ foreach($return['result'] as $msg_item){ $fields_fields = array(); foreach(['sourceType', 'userName', 'text', 'unread'] as $key){ if(isset($msg_item[$key])) $fields_fields[$key] = $msg_item[$key]; } $msg_id = 0; $test_records = WebAppRaiserDB::select('war_msg', 'out_id', $msg_item['id']); foreach($test_records as $test_record){ if($test_record['api_id'] == $this->war_id){ $msg_id = $test_record['id']; } } $fields = array( 'id' => $msg_id, 'api_id' => $this->war_id, 'out_id' => $msg_item['id'], 'date' => strtotime($msg_item['date']), 'type' => 'CHAT_MESSAGE', 'orderId' => $id, 'fields' => base64_encode(serialize($fields_fields)), ); $inner_id = WebAppRaiserDB::save('war_msg', $fields, $valid_fields); if($inner_id){ //$return["msg"] = "Сообщение сохранено."; //$return["status"] = 'success'; } else{ $return["msg"] = "Возникла проблема при сохранении сообщения в базу данных."; $return["status"] = 'error'; } } if($return["status"] == 'success'){ $return["msg"] = "Сообщение сохранено."; } } return $return; } else { // Произошла ошибка $return["msg"] = "Ошибка обращения к API webappraiser при чтении одного сообщения. "; $return["msg"] .= $return['result']['message']; $return["status"] = 'error'; return $return; } return $return; } // 4.7.Отправка текстового сообщения к заказу public function sendChatMessage($id, $fields){ $entry_point = 'orders/'.$id.'/sendChatMessage'; $return = array( 'status' => 'success', 'msg' => '', 'info' => array(), 'result' => array(), 'fields' => array(), ); $res = $this->request($entry_point, $fields, 'POST'); //msg('API result', [$res]); $return['info'] = $res['info']; $return['result'] = $res['result']; $return['body'] = $res['body']; $return['fields'] = $fields; if ($return['info']['http_code'] == '200'){ // без ошибок, сообщение отправлено $return["msg"] = "Сообщение отправлено."; //$return["status"] = 'success'; return $return; } else { // Произошла ошибка $return["msg"] = "Ошибка обращения к API webappraiser. "; $return["msg"] .= $return['result']['message']; $return["status"] = 'error'; return $return; } return $return; } //4.7.Принятие заказа в работу оценочной компанией (polling) //4.8.Отклонение заказа оценочной компанией (polling) //4.9.Получение информации об изменении статуса заказа (polling) //4.10.Получение информации о готовности отчета (polling) // 4.11.Получение информации о готовности расчета (polling) //4.12.Получение текстового сообщения по заказу (polling) //5. Получение списка банков public function getBanks(){ $entry_point = 'banks'; $return = array( 'status' => 'success', 'msg' => '', 'info' => array(), 'result' => array(), 'fields' => array(), ); $res = $this->request($entry_point, [], 'GET'); $return['info'] = $res['info']; $return['result'] = $res['result']; if ($return['info']['http_code'] == '200'){ // без ошибок, сохраняем заказ в свою базу $return["msg"] = "Успех"; //$return["status"] = 'success'; return $return; } else { // Произошла ошибка $return["msg"] = "Ошибка обращения к API webappraiser. "; $return["msg"] .= $return['result']['message']; $return["status"] = 'error'; return $return; } return $return; } // Загрузка кэшированных данных по банкам и обновление кэша раз в сутки public function loadBanks() { $banks = array(); $time = time(); $sql_res = mysql_query("SELECT * FROM war_banks"); while ($row = mysql_fetch_array($sql_res)) { $banks_res[] = $row; } //$banks_res = mysql_fetch_assoc($sql_res); $update_flag = (!empty($banks_res))?false:true; foreach($banks_res as $bank_item){ $test_time = $time - (60*60*24); if ($bank_item["updateDate"] < $test_time){ $update_flag = true; } $banks[$bank_item['id']] = $bank_item['name']; } if ($update_flag) { // Обновляем кэш $api_res = $this->getBanks(); if($api_res['status'] == 'success'){ foreach($api_res['result'] as $api_item){ if(isset($banks[$api_item['id']])){ $sql = sprintf("UPDATE `war_banks` SET `name`='%s', `updateDate`=%d WHERE `id`=%d", $api_item['name'], $time, $api_item['id']); mysql_query($sql); } else{ $sql = sprintf("INSERT INTO `war_banks` (`id`, `name`, `updateDate`) VALUES ('%d', '%s', '%d')", $api_item['id'], $api_item['name'], $time); mysql_query($sql); $banks[$api_item['id']] = $api_item['name']; } } } } return $banks; } //6. Расчет стоимости объекта //6.1.Проверка информации по адресу (устаревшее) //6.2.Проверка наличия информации для проведения расчета // calculations/checkInformation //6.3.Расчет стоимости объекта // calculations/calculate public function getCalculate($fields) { $entry_point = 'calculations/calculate'; $return = array( 'status' => 'success', 'msg' => '', 'info' => array(), 'result' => array(), 'fields' => array(), ); $valid_fields = array( 'objectType' => 'objectType', 'address'=> 'address', 'cadNum'=> 'cadNum', 'buildingStage'=> 'buildingStage', 'floor'=> 'floor', 'totalFloors'=> 'totalFloors', 'square' => 'square', 'decorationType'=> 'decorationType', 'buildYear'=> 'buildYear', 'wallMaterial'=> 'wallMaterial', 'latitude'=> 'latitude', 'longitude'=> 'longitude', 'estimateValue' => 'estimateValue', 'saveCalculation'=> 'saveCalculation', ); $match = WebAppRaiserDB::matchFieldsToSave($fields, $valid_fields); $res = $this->request($entry_point, $match['fields_to_save'], 'POST'); $return['info'] = $res['info']; $return['result'] = $res['result']; $return['body'] = $res['body']; $return['match'] = $match; $return['fields'] = $fields; if ($return['info']['http_code'] == '200'){ return $return; } else { // Произошла ошибка $return["msg"] = "Ошибка обращения к API webappraiser. "; $return["msg"] .= $return['result']['message']; $return["status"] = 'error'; return $return; } return $return; } private function request($path, $fields = [], $method = 'GET') { $body = json_encode($fields); $url = $this->api_uri; $token = $this->war_access_token; $ch = curl_init($url.$path); switch ($method){ case 'POST': $header = array( 'Content-Type: application/json; charset=UTF-8', 'Content-Length: ' . strlen($body), 'Authorization: Bearer ' . $token ); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_POST, 1); // Specify the request method as POST curl_setopt($ch, CURLOPT_POSTFIELDS, $body); // Set the posted fields // Returns the data/output as a string instead of raw data curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); break; case 'GET': curl_setopt($ch,CURLOPT_URL, $url.$path); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charset=UTF-8', //'Content-Length: ' . strlen($body), 'Authorization: Bearer ' . $token )); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); break; case 'PUT': case 'DELETE': curl_setopt($ch,CURLOPT_URL, $url.$path); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charset=UTF-8', 'Content-Length: ' . strlen($body), 'Authorization: Bearer ' . $token )); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_POSTFIELDS, $body); // Set the posted fields // Returns the data/output as a string instead of raw data curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); break; } curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // This will follow any redirects // get stringified data/output. See CURLOPT_RETURNTRANSFER $data = curl_exec($ch); // get info about the request $info = curl_getinfo($ch); // close curl resource to free up system resources curl_close($ch); $result = json_decode($data, true); return array('result' => $result,'info'=> $info, 'body'=> $body); } private function requestFile($path, $fields = [], $method = 'GET') { //$body = json_encode($fields); $url = $this->api_uri; $token = $this->war_access_token; $ch = curl_init($url.$path); switch ($method){ /*case 'POST': $header = array( 'Content-Type: application/json; charset=UTF-8', 'Content-Length: ' . strlen($body), 'Authorization: Bearer ' . $token ); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_POST, 1); // Specify the request method as POST curl_setopt($ch, CURLOPT_POSTFIELDS, $body); // Set the posted fields // Returns the data/output as a string instead of raw data curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); break; // */ case 'GET': curl_setopt($ch,CURLOPT_URL, $url.$path); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Authorization: Bearer ' . $token )); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); break; /*case 'PUT': case 'DELETE': curl_setopt($ch,CURLOPT_URL, $url.$path); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charset=UTF-8', 'Content-Length: ' . strlen($body), 'Authorization: Bearer ' . $token )); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_POSTFIELDS, $body); // Set the posted fields // Returns the data/output as a string instead of raw data curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); break; // */ } curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // This will follow any redirects // get stringified data/output. See CURLOPT_RETURNTRANSFER $file = curl_exec($ch); $info = curl_getinfo($ch); $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $header = substr($file, 0, $header_size); // Get the Body from response $body = substr($file, $header_size); // Explode Header rows into an array $header_items = explode("\n", $header); $disposition = ''; foreach ($header_items as $header_item){ if(strpos($header_item, 'filename')){ $disposition = $header_item; } } // Close cURL handler curl_close($ch); // find the filname in the headers. $file_name = 'Report-object-'.$fields['object_id'].'-order-'.$fields['order_id'].'.zip'; if(empty($disposition)){ $disposition = 'Content-Disposition: attachment; filename='.$file_name; } if($info['http_code'] == '200') { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header($disposition); echo $body; exit; } else { $result = json_decode($body, true); echo '

'.$result['message'].'

'; exit; } } // $grant_type = 'password' | 'refresh_token' public function auth_request($grant_type = 'password', $fields = array()) { $return = array( 'status' => 'success', 'msg' => '', 'info' => array(), 'result' => array(), 'fields' => $fields, ); $url = $this->auth_uri.'oauth/token'; if ($grant_type == 'password') { $req_fields = array( 'username' => $fields['war_username'], 'client_id' => $fields['war_client_id'], 'client_secret' => $fields['war_client_secret'], 'grant_type' => $grant_type, ); $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, 1); // Specify the request method as POST curl_setopt($ch, CURLOPT_POSTFIELDS, $req_fields); // Set the posted fields // Returns the data/output as a string instead of raw data curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // This will follow any redirects // get stringified data/output. See CURLOPT_RETURNTRANSFER $data = curl_exec($ch); // get info about the request $info = curl_getinfo($ch); // close curl resource to free up system resources curl_close($ch); $result = json_decode($data, true); $return['info'] = $info; $return['result'] = $result; if ($info['http_code'] == '200'){ // без ошибок, обновляем и сохраняем почту и токен. $db_fields = array ( 'war_id' => $this->war_id, 'war_user_id' => $fields['war_user_id'], 'war_username' => $fields['war_username'], 'war_client_id' => $fields['war_client_id'], 'war_client_secret' => $fields['war_client_secret'], 'war_access_token' => $result['access_token'], 'war_refresh_token' => $result['refresh_token'], 'war_expires_in' => time() + $result['expires_in'], 'war_token_type' => $result['token_type'], ); if(!empty($fields['war_pincode'])) { $db_fields['war_pincode'] = $fields['war_pincode']; } if(self::save($db_fields)){ $return["msg"] = "Токен сохранен."; //$return["status"] = 'success'; } else { $return["msg"] = "Ошибка сохранения токена в базу данных"; $return["status"] = 'error'; } return $return; } else { // Произошла ошибка $return["msg"] = "Ошибка соединения с webappraiser. "; $return["msg"] .= $info['message']; $return["status"] = 'error'; return $return; } return $return; } else { // Обновляем токен данных через refresh_token $fields = array( 'grant_type' => 'refresh_token', 'refresh_token' => $this->war_refresh_token, ); $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, 1); // Specify the request method as POST curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); // Set the posted fields // Returns the data/output as a string instead of raw data curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // This will follow any redirects $data = curl_exec($ch); $info = curl_getinfo($ch); curl_close($ch); $result = json_decode($data, true); $return['info'] = $info; $return['result'] = $result; if ($info['http_code'] == '200'){ // без ошибок, обновляем и сохраняем токен. $fields = array ( 'war_id' => $this->war_id, 'war_access_token' => $result['access_token'], 'war_refresh_token' => $result['refresh_token'], 'war_expires_in' => time() + $result['expires_in'], 'war_token_type' => $result['token_type'], ); self::save($fields); $return["msg"] = "Токен сохранен."; $return["status"] = 'success'; return $return; } else { // Произошла ошибка //TODO если просрочен refresh_token то делать запрос заново $return["msg"] = "Ошибка соединения с webapprizer. "; $return["msg"] .= $info['message']; $return["status"] = 'error'; return $return; } } return $return; } public static function getDict($dict_name, $item = '', $info = false) { if (isset(self::$dict_list[$dict_name])) { $dict = self::$$dict_name; if($info){ return self::$dict_list[$dict_name]; } elseif(!empty($item) && isset($dict[$item])){ return $dict[$item]; } elseif(!empty($item) && !isset($dict[$item])){ return false; } else { return $dict; } } else { return false; } } public function get($name){ if(isset($this->$name)) { return $this->$name; } else { return false; } } }