Joywork/engine/classes/WebAppRaiser/WebAppRaiserAPI.php
2026-05-22 21:21:54 +03:00

1198 lines
44 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
class WebAppRaiserAPI {
private $war_id;
private $war_owner_uid;
private $war_user_id;
private $war_username;
private $war_client_id;
private $war_client_secret;
private $war_access_token;
private $war_refresh_token;
private $war_expires_in;
public $war_expired;
private $is_owner;
private $operation = 'prod'; // [dev||prod]
private $uri = 'webappraiser.ru/api/v1/';
private $auth_uri;
private $api_uri;
private $appraisalCompanyId; // [2 | 1] // Идентификатор оценочной компании
private static $dict_list = array(
'MESSAGE_TYPE'=> 'Словарь №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 '<h1 style="margin: 60px auto;text-align: center;font-size: 3em;">'.$result['message'].'<h1>';
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;
}
}
}