Есть у нас на работе развлекуха такого плана:
1)каждую пятницу мне пишет начальник(ну или сам себе) 6 заявок в хэлпдеск с практически одинаковым текстом(даты меняются) и статусом «В план». В плане заявок больше и они разные, но эти 6 повторяются.
2)каждую пятницу(ну или по факту, но проще делать это в пятницу) я ставлю 6 заявкам за прошлую неделю статус «Передана на верификацию» и пишу в решении что-то типа выполнено.
3)каждый понедельник я ставлю всем заявкам со статусом «В план» статус «Плановая».
В общем лень — двигатель прогресса и меня все это счастье за месяц подзадолбало(Месяц на новом месте, где вдруг нужно стало составлять план. С чем я и пытаюсь морально справится. Т.к. по планам никогда не работал и это напряжно. Но логика в этом есть, когда полный завал работы — нужно расставлять приоритеты и делать хоть что-то).
В силу своего поверхностного(ну а какого же еще знания, если я университетов или хотя бы курсов по этой теме не заканчивал) знания php решил на этом деле и решить свою «проблему». Знаю, можно было решить все запросом в базе данных, но это не наш метод. Да и не любит стороннее ПО, когда лезут в его хранилища или исходный код, особенно учитывая что хэлпдеск висит на другом отделе.
Осложнилось все тем, что хэлпдеск нагло врет по поводу параметров запросов(ну или у меня руки кривые, что допускаю), заявлен json.
Если немного порыться в настройках, можно найти документацию по ссылке http://helpdesk.farmin.by/SetUpWizard.do?forwardTo=apidoc
Все это конечно на английском, который я(как и php) никогда не учил, но т.к. вечно работаю с иностранным ПО, то немного понимаю. Плюс в хроме есть замечательная возможность перевода(весьма кривого), но в совокупности эти два фактора достаточны для понимания сути написанного.
Все что я там нашел полезного, это то как сделать ключ api(хотя я его и без инструкций сделал уже). Описываются REST-запросы, что сложилось впечатление будто я залез на википедию, а не техническую документацию почитать. Ну и формат запросов приведен(и он даже оттуда отправляет) в виде:
В общем все бы было отлично, если бы это самое апи хоть что-то делало!!! Чтоб вы понимали:
Во-первых: Error when performing — null — null, а во-вторых ответ в виде:
<?xml version="1.0" encoding="UTF-8" ?> <API version="1.0"> <response> <operation name=""> <result> <status>Failed</status> <message>Error when performing - null - null</message> </result> </operation> </response> </API>
Ну нифига это не заявленный JSON, а обычный XML. Ну я хорошо порылся и нашел документацию и на него, правда опять на английском 🙂
Но трэш в том, что хэлпдеск то у нас на русском и поля у него соответственно тоже:
Ну а XML и русские символы в полях это конечно да… В общем, порывшись я таки нашел как это организовано. Если отправить запрос вида
1 |
http://helpdesk.farmin.by/sdpapi/request/35288?TECHNICIAN_KEY=*****************&OPERATION_NAME=GET_REQUEST |
, то в ответ придет XML с нужными полями формата:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <API version="1.0"> <response> <operation name="GET_REQUEST_FIELDS"> <result> <statuscode>200</statuscode> <status>Success</status> <message>Request Details fetched successfully</message> </result> <Details type="GET_REQUEST_FIELDS"> <record> <parameter> <name>name</name> <value>REQUESTID</value> </parameter> <parameter> <name>value</name> <value>35288</value> </parameter> <parameter> <name>type</name> <value>Not Editable</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Приоритет</value> </parameter> <parameter> <name>name</name> <value>priority</value> </parameter> <parameter> <name>VALUE</name> <value>1. Высокий</value> <value>2. Средний</value> <value>3. Обычный</value> <value>4. Низкий</value> </parameter> <parameter> <name>defaultvalue</name> <value>3. Обычный</value> </parameter> <parameter> <name>type</name> <value>Pick List</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Плановое время</value> </parameter> <parameter> <name>name</name> <value>Плановое время</value> </parameter> <parameter> <name>value</name> <value>5</value> </parameter> <parameter> <name>type</name> <value>Numeric</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Статус</value> </parameter> <parameter> <name>name</name> <value>status</value> </parameter> <parameter> <name>VALUE</name> <value>В план</value> <value>В работе</value> <value>Выполнена</value> <value>Закрыта</value> <value>Неактуально, будет отклонено.</value> <value>Отклонена</value> <value>Открыта</value> <value>Передана на валидацию заказчику</value> <value>Передана на верификацию</value> <value>План развития ПО</value> <value>Плановая</value> <value>Приостановлено</value> <value>Проводится верификация</value> <value>Решение предоставлено</value> <value>Срочная</value> <value>Требуется доработка</value> </parameter> <parameter> <name>defaultvalue</name> <value>Плановая</value> </parameter> <parameter> <name>type</name> <value>Pick List</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Организация</value> </parameter> <parameter> <name>name</name> <value>Организация</value> </parameter> <parameter> <name>VALUE</name> <value>ОДО Фармин</value> <value>ООО Комповид</value> <value>ООО Не Ска</value> <value>ООО Фитобел</value> <value>Проксима</value> <value>Фармин (группа компаний)</value> <value>ЧФУП Чигряй</value> </parameter> <parameter> <name>defaultvalue</name> <value>ОДО Фармин</value> </parameter> <parameter> <name>type</name> <value>Pick List</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Режим</value> </parameter> <parameter> <name>name</name> <value>mode</value> </parameter> <parameter> <name>VALUE</name> <value>WEB интерфейс</value> <value>Телефонный звонок</value> <value>Электронная почта</value> </parameter> <parameter> <name>defaultvalue</name> <value>WEB интерфейс</value> </parameter> <parameter> <name>type</name> <value>Pick List</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Категория</value> </parameter> <parameter> <name>name</name> <value>category</value> </parameter> <parameter> <name>VALUE</name> <value>Интернет</value> <value>Консультация</value> <value>Локальная сеть</value> <value>Материально технические</value> <value>Оборудование</value> <value>Обслуживание</value> <value>Обучение</value> <value>Общие</value> <value>Операционные системы</value> <value>Периферийные устройства</value> <value>Почта</value> <value>Претензии по товару</value> <value>Программное обеспечение</value> <value>Розница</value> <value>Телефония</value> </parameter> <parameter> <name>defaultvalue</name> <value>Программное обеспечение</value> </parameter> <parameter> <name>type</name> <value>Pick List</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Группа</value> </parameter> <parameter> <name>name</name> <value>group</value> </parameter> <parameter> <name>VALUE</name> <value>WMS</value> <value>Заказ канцтоваров</value> <value>Закупка компьютерного оборудования</value> <value>Изменение и доработка программ</value> <value>Информационные технологии</value> <value>Книга отзывов и предложений</value> <value>Материально-хозяйственная служба</value> <value>Претензии по товару</value> <value>Проблема с телефонией</value> <value>Удостоверения кассира</value> </parameter> <parameter> <name>defaultvalue</name> <value>Изменение и доработка программ</value> </parameter> <parameter> <name>type</name> <value>Pick List</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Подкатегория</value> </parameter> <parameter> <name>name</name> <value>subCategory</value> </parameter> <parameter> <name>VALUE</name> <value>1C:Арника</value> <value>1С:7 Бухгалтерия</value> <value>1С:8 Бухгалтерия предприятия</value> <value>1С:8 ЗиУП</value> <value>1С:8 Управление торговлей</value> <value>Assistant</value> <value>BookKeeper</value> <value>iRetailManagement</value> <value>iRetailPOS</value> <value>Jet заказ</value> <value>Jet розница Dezira</value> <value>OLAP Кубы</value> <value>ServiceDesk Plus</value> <value>Web заказ</value> <value>Браузер Chrome</value> <value>Мобильное приложение</value> <value>Обсуждения/Консультации</value> <value>Почтовый клиент Outlook</value> <value>Почтовый клиент Thunderbird</value> <value>Прочее</value> <value>Разработка сайтов</value> <value>Сервисы обмена</value> <value>Фармасервис</value> </parameter> <parameter> <name>type</name> <value>Pick List</value> </parameter> <parameter> <name>defaultvalue</name> <value>1С:8 Управление торговлей</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Специалист</value> </parameter> <parameter> <name>name</name> <value>technician</value> </parameter> <parameter> <name>VALUE</name> <value>Алексей Дубовцов</value> <value>Сергей Дудко</value> </parameter> <parameter> <name>defaultvalue</name> <value>Сергей Дудко</value> </parameter> <parameter> <name>type</name> <value>Pick List</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Ложный вызов</value> </parameter> <parameter> <name>name</name> <value>Ложный вызов</value> </parameter> <parameter> <name>VALUE</name> <value>Да</value> <value>Нет</value> </parameter> <parameter> <name>DEFAULTVALUE</name> <value/> </parameter> <parameter> <name>type</name> <value>Pick List</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Адреса эл. почты для уведомлений</value> </parameter> <parameter> <name>name</name> <value>emailcc</value> </parameter> <parameter> <name>VALUE</name> <value/> </parameter> <parameter> <name>type</name> <value>Not Editable</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Класс задачи</value> </parameter> <parameter> <name>name</name> <value>Класс задачи</value> </parameter> <parameter> <name>VALUE</name> <value>Внеплановая</value> <value>Консультация по работе ПО</value> <value>Назначение прав пользователей</value> <value>Ошибка пользователя</value> <value>Ошибка программного обеспечения</value> <value>Плановая</value> <value>Прочее</value> </parameter> <parameter> <name>defaultvalue</name> <value>Плановая</value> </parameter> <parameter> <name>type</name> <value>Pick List</value> </parameter> </record> <record> <parameter> <name>name</name> <value>RequesterID</value> </parameter> <parameter> <name>value</name> <value>938</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Сведения об авторе заявки</value> </parameter> <parameter> <name>name</name> <value>RequesterDetails</value> </parameter> <parameter> <name>value</name> <value>Алексей Дубовцов</value> </parameter> <parameter> <name>TYPE</name> <value/> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Тема</value> </parameter> <parameter> <name>name</name> <value>Subject</value> </parameter> <parameter> <name>value</name> <value>Обработка ошибок обмена 1с - БК -WMS - сайты</value> </parameter> <parameter> <name>type</name> <value>Single Line</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Описание</value> </parameter> <parameter> <name>name</name> <value>Description</value> </parameter> <parameter> <name>value</name> <value><div>Обработка ошибок обмена 1с - БК -WMS - сайты</div></value> </parameter> <parameter> <name>TYPE</name> <value/> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Дата создания</value> </parameter> <parameter> <name>name</name> <value>createddate</value> </parameter> <parameter> <name>value</name> <value>1506663569050</value> </parameter> <parameter> <name>type</name> <value>Date/Time Field</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Дата ответа</value> </parameter> <parameter> <name>name</name> <value>respondeddate</value> </parameter> <parameter> <name>value</name> <value>0</value> </parameter> <parameter> <name>TYPE</name> <value/> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Срок выполнения</value> </parameter> <parameter> <name>name</name> <value>duebydate</value> </parameter> <parameter> <name>value</name> <value>1507009380000</value> </parameter> <parameter> <name>type</name> <value>Date/Time Field</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Дата принятия решения</value> </parameter> <parameter> <name>name</name> <value>resolveddate</value> </parameter> <parameter> <name>value</name> <value>0</value> </parameter> <parameter> <name>TYPE</name> <value/> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Дата выполнения</value> </parameter> <parameter> <name>name</name> <value>completeddate</value> </parameter> <parameter> <name>value</name> <value>0</value> </parameter> <parameter> <name>TYPE</name> <value/> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Срок ответа (время)</value> </parameter> <parameter> <name>name</name> <value>frduebydate</value> </parameter> <parameter> <name>value</name> <value>0</value> </parameter> <parameter> <name>type</name> <value>Date/Time Field</value> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Вложения</value> </parameter> <parameter> <name>name</name> <value>attachment</value> </parameter> <parameter> <name>VALUE</name> <value/> </parameter> <parameter> <name>TYPE</name> <value/> </parameter> </record> <record> <parameter> <name>displayname</name> <value>Основание</value> </parameter> <parameter> <name>name</name> <value>reason</value> </parameter> <parameter> <name>VALUE</name> <value/> </parameter> <parameter> <name>TYPE</name> <value/> </parameter> </record> <record> <parameter> <name>name</name> <value>REQUESTEREMAIL</value> </parameter> <parameter> <name>value</name> <value></value> </parameter> <parameter> <name>type</name> <value>Not Editable</value> </parameter> </record> </Details> </operation> </response> </API>
В общем какая-то дичайшая дичь. Но в итоге вот что получилось.
Ну и сам код(старался писать его максимально расширяемым):
<?php date_default_timezone_set('Europe/Minsk'); //без присвоенной таймзоны data не работает!!! $datetime = new DateTime(); //создаем дату $date = $datetime->modify('friday this week'); //сдвигаем до пятницы $datetime = new DateTime(); //создаем дату $start_d = $date->modify('monday next week'); //сдвигаем до понедельника $datetime = new DateTime(); //создаем дату $end_d = $date->modify('friday next week'); //сдвигаем до след.пятницы $timeout = 5000; //таймаут запроса к хэлпдеск $login = $_GET['login']; $command = $_GET['command']; $mykey = $_GET['mykey']; if(($mykey != '**********************') || !isset($command) || !isset($login)){ //проверяем ключи exit; } $appform = new mysqli("localhost", "**********************", "**********************", "plan"); if ($appform->connect_errno) { echo "Не удалось подключиться к MySQL:".$appform->connect_error; exit; } $i=0; $arraydb; $appform->query("SET NAMES utf8"); //отбираем заявки if ($result = $appform->query("SELECT * FROM `zayavki` WHERE `technician_loginname`='".$login."'")) { while( $row = $result->fetch_assoc() ){ $arraydb[$i] = $row; $i++; } $result->close(); } if(!isset($arraydb)){ //если заявок нет завершаем скрипт $appform->close(); exit; } $server = 'http://helpdesk.farmin.by/sdpapi/request'; $techkey = '56**********************660'; for($i=0; $i < count($arraydb); $i++){ /* костыли начало */ if($login == 'sergei.dudko'){ if($arraydb[$i]['subject'] == '1С8:УТ11 Сопоставление остатков 1с и БК в количественном и суммовом выражении'){ $arraydb[$i]['description'] = '1С8:УТ11 Сопоставление остатков 1С и БК в количественном и суммовом выражении на '.date_format($date, "d.m.Y").'г. по всем складам'; } if(substr($arraydb[$i]['subject'], 0, 21) == 'Оценка плановых задач'){ $arraydb[$i]['description'] = 'Оценка плановых задач на период с '.date_format($start_d, 'd.m.Y').' по '.date_format($end_d, 'd.m.Y'); $arraydb[$i]['subject'] = $arraydb[$i]['description']; $arraydb[$i]['description'] .= PHP_EOL; $arraydb[$i]['description'] .= 'Составление плана'; } } /* костыли конец */ if($command == 'inplan'){ //закрываем старые и создаем новые заявки if(isset($arraydb[$i]['uid'])){ $text = 'выполнено'; $resp = AddResolution($server, $techkey, $arraydb[$i]['uid'], $text); } if($resp == 'Success'){ usleep($timeout); $status = 'Передана на верификацию'; UpdateStatus($server, $techkey, $arraydb[$i]['uid'], $status); usleep($timeout); } $status = 'В план'; $uid = NewApp($server, $techkey, $arraydb[$i]['requester'], $arraydb[$i]['subject'], $arraydb[$i]['description'], $arraydb[$i]['category'], $arraydb[$i]['subcategory'], $arraydb[$i]['department'], $arraydb[$i]['group'], $arraydb[$i]['technician'], $arraydb[$i]['technician_loginname'], $status); if(isset($uid)){ $appform->query("UPDATE `zayavki` SET `uid`='".$uid."', `status`='".$status."' WHERE `Id`='".$arraydb[$i]['Id']."'"); } usleep($timeout); //ждем секунду } if($command == 'plan'){ //обновляем статус $status = 'Плановая'; if(isset($arraydb[$i]['uid'])){ $uid = UpdateStatus($server, $techkey, $arraydb[$i]['uid'], $status); if($uid == 'Success'){ $appform->query("UPDATE `zayavki` SET `status`='".$status."' WHERE `Id`='".$arraydb[$i]['Id']."'"); } usleep($timeout); //ждем секунду } } } /* $requester = 'Алексей Дубовцов'; $subject = '1С8:УТ11 Сопоставление остатков 1с и БК в количественном и суммовом выражении'; $description = '1С8:УТ11 Сопоставление остатков 1С и БК в количественном и суммовом выражении на 29 сентября 2017 г. по всем складам'; $category = 'Программное обеспечение'; $subcategory = '1С:8 Управление торговлей'; $department = 'Отдел программного обеспечения'; $group ='Изменение и доработка программ'; $technician = 'Сергей Дудко'; $technician_loginname = 'sergei.dudko'; $status = 'План развития ПО'; */ function NewApp($server, $techkey, $requester, $subject, $description, $category, $subcategory, $department, $group, $technician, $technician_loginname, $status){ //новая заявка $operation = 'ADD_REQUEST'; $data = '<Operation> <Details> <requester>'.$requester.'</requester> <subject>'.$subject.'</subject> <description>'.$description.'</description> <callbackURL></callbackURL> <requesttemplate></requesttemplate> <priority></priority> <site></site> <group>'.$group.'</group> <technician></technician> <level></level> <status>'.$status.'</status> <service></service> <department>'.$department.'</department> <category>'.$category.'</category> <subcategory>'.$subcategory.'</subcategory> <technician>'.$technician.'</technician> <technician_loginname>'.$technician_loginname.'</technician_loginname> <createdtime>'.time().'</createdtime> <completedtime>5</completedtime> <respondedtime>4</respondedtime> <FR_DUETIME>3</FR_DUETIME> <RESOLVEDTIME>2</RESOLVEDTIME> </Details> </Operation>'; $request = 'TECHNICIAN_KEY='.$techkey.'&OPERATION_NAME='.$operation.'&INPUT_DATA='.$data; $answarray = simplexml_load_string(SendRequest($request, $server)); $idreq = $answarray->response->operation->Details->workorderid; return $idreq; //string(24) "35376" } /* $idreq = '35362'; $status = 'Плановая'; */ function UpdateStatus($server, $techkey, $idreq, $status){ //апдейт статуса $server = $server.'/'.$idreq; $operation = 'EDIT_REQUEST'; $data = '<Operation> <Details> <parameter> <name>status</name> <value>'.$status.'</value> </parameter> </Details> </Operation>'; $request = 'TECHNICIAN_KEY='.$techkey.'&OPERATION_NAME='.$operation.'&INPUT_DATA='.$data; $answarray = simplexml_load_string(SendRequest($request, $server)); $answer = $answarray->response->operation->result->status; return $answer; //string(24) "Success" } /* $idreq = '35362'; $text = 'Выполнено'; */ function AddResolution($server, $techkey, $idreq, $text){ //добавляем ответ $server = $server.'/'.$idreq.'/resolution'; $operation = 'ADD_RESOLUTION'; $data = '<Operation> <Details> <resolution> <resolutiontext>'.$text.'</resolutiontext> </resolution> </Details> </Operation>'; $request = 'TECHNICIAN_KEY='.$techkey.'&OPERATION_NAME='.$operation.'&INPUT_DATA='.$data; $answarray = simplexml_load_string(SendRequest($request, $server)); $answer = $answarray->result->status; return $answer; //string(24) "Success" } function SendRequest($request, $server){ $curl = curl_init($server); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $request); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); $response = curl_exec($curl); return $response; } $appform->close(); exit;