<?php
include_once("c_client.php");
class c_page_cab_client_push extends c_page_cab_client
{
    public $h1='Выгрузка данных на внешний шлюз - документация для разработчиков' ;
    public $use_datepicker=1 ;

    function second_menu_config()
     { $this->second_menu_show_all=1 ;
       //$this->second_menu['/cab/client/get/docs/']=array('title'=>'Информация','class'=>'fa fa-user-md') ;
       $this->second_menu['/cab/client/push/mo/']=array('title'=>'Выгрузка МО') ;
       //$this->second_menu['/cab/client/get/last_mo_personal/']=array('title'=>'get_last_mo_perosnal') ;
       //$this->second_menu['/cab/client/get/list_mo/']=array('title'=>'get_list_mo') ;
       //$this->second_menu['/cab/client/get/demo/']=array('title'=>'Тест работы шлюза','class'=>'fa fa-user-md') ;
       //$this->second_menu['/cab/client/get/ext/']=array('title'=>'Внешний источник','class'=>'fa fa-user-md') ;
       //$this->second_menu['/cab/client/get/docs/']=array('title'=>'Документация','class'=>'fa fa-user-md') ;

     }

   function block_main()
   { $this->page_title() ;
       return ;
     if (! MEMBER()->info['UID'])  MEMBER()->info['UID']=ENGINE()->generate_UID() ;
     include_once(_DIR_EXT.$this->report_dir) ;
     $report_obj=new $this->report_name() ;
     $report_obj->usl_select_org='client_id='.MEMBER()->id;
     //$report_obj->filter=ENGINE()->parse_url(_CUR_FILTER); // выполняется в конструкторе
     $report_obj->filter['client_id']=MEMBER()->id;

     ?><h3>URL запроса</h3>
       http://dev.kvzrm.ru/get/client/<?echo MEMBER()->info['UID']?>/<?echo $this->action?>/<strong class="green">Формат ответа</strong>/<br><br>
       Формат ответа - json,xml
       <h3>Описание параметров GET-запроса</h3>
       <? $report_obj->manual_tags_in() ;?>

       <h3>Пример формирования запроса</h3>
       <?
       $report_obj->setting() ;
       echo $report_obj->panel_info_filter() ;

       if (_sizeof($this->filter))
       { ?><strong>Массив параметров запроса:</strong><?
         $arr[]=$this->filter ;
         print_2x_arr($arr,array('no_show_index'=>1)) ;
       }


       $this->show_url($this->filter,'JSON') ;
       $this->show_url($this->filter,'XML') ;

      ?><h3>Описание тегов:</h3><?
      $report_obj->manual_tags_out() ;
   }

 /*
    function block_main3()
        { //damp_array($_POST) ;
          $this->page_title() ;
          ?><p>Данные для выгрузки данных системы через шлюз</p>
            <p>Интерфейс взаимодействие с API оборудования должен быть реализован посредством HTTP RESTful. Параметры запросов-ответов:</p>
            <ul><li>формат запроса – GET;</li>
                <li>формат возвращаемых данных – XML, JSON, OData, XLS;</li>
                <li>кодировка данных – UTF-8;</li>
            </ul>
            <strong>Информация, доступная для скачивания через шлюз:</strong>
            <ul><li>Получение списка сотрудников (get_list_personals);</li>
                <li>Получение информациии по последнему МО сотрудника c действующим допуском (get_last_mo);</li>
                <li>Получение списка проведенных МО за указанный промежуток времени (get_list_mo_by_time);</li>
                <li>Получение списка проведенных МО сотрудника (get_list_mo_to_personal);</li>
                <li>Получение списка событий проходов сотрудника (get_list_skip_personal);</li>
            </ul>
            <table class="basic fz_normal left">
                <tr><td>Адрес шлюза</td><td colspan="2">http://<?echo _MAIN_DOMAIN?>/get/</td></tr>
                <tr><td>GET-параметры</td><td>ext=client</td><td>Используемой модуль для выгрузки данных</td></tr>
                <tr><td></td><td>mode</td><td>Тип загружаемых данных</td></tr>
                <tr><td></td><td>uid=<?echo MEMBER()->info['UID']?></td><td>UID клиента</td></tr>
                <tr><td></td><td>pass=<?echo MEMBER()->info['access_pass']?></td><td>Пароль клиента для доступа к XML-шлюзу</td></tr>
            </table>
          <?

          $this->show_manual() ;
        }

        function show_manual()
          { ?>  <h1>Интерфейс для получения информации по МО сотрудника</h1>
                <h2>Параметры запроса</h2>
                <p>Запрос производится обращением на URL, который включает в себя параметры запроса:</p>
                <p><strong>http://<?echo _MAIN_DOMAIN?>/get/mo/UID_CLIENT/UID_PERSON</strong></p>
                <ul>
                  <li>UID_CLIENT - UID клиента системы, назначенный вам при регистрации в системе</li>
                  <li>UID_PERSON - UID сотрудника</li>
                </ul>
                <p>Пример URL: <strong>http://<?echo _MAIN_DOMAIN?>/get/mo/6831923912739183/39352287-8e40-e311-a462-001e671f718d22</strong>, в данном запросе:</p>
                <ul>
                          <li>6831923912739183 - UID клиента системы</li>
                          <li>39352287-8e40-e311-a462-001e671f718d22 - UID сотрудника</li>
                </ul>
                <p>Параметры, которые можно передать в строке запроса:</p>
                        <ul>
                                  <li>check - вывод результата в виде таблицы</li>
                                  <li>manual - данное руководство</li>
                        </ul>
                <p>Примеры URL с параметрами</p>
                        <ul>
                                  <li>http://<?echo _MAIN_DOMAIN?>/get/mo/6831923912739183/97591a93-9598-e311-a462-001e671f718d?check</li>
                                  <li>http://<?echo _MAIN_DOMAIN?>/get/mo/?manual</li>
                        </ul>
                <h2>Формат ответа</h2>
                <p>Ответ системы происходит в формате JSON, поля ответа:</p>
                <ul>
                          <li><strong>time_now</strong> - текущее время сервера</li>
                          <li><strong>time_from</strong> - время, от которого происходил поиск МО</li>
                          <li><strong>name</strong> -  ФИО сотрудника</li>
                          <li><strong>dr</strong> -  дата рождения сотрудника</li>
                          <li><strong>org_name</strong> -  организация сотрудника</li>
                          <li><strong>otdel_name</strong> -  подразделение сотрудника</li>
                          <li><strong>terminal_name</strong> -  терминал, на котором сотрудник проходил МО</li>
                          <li><strong>time_MO</strong> -  дата прохождения МО</li>
                          <li><strong>mo_id</strong> - id сессии МО</li>
                          <li><strong>mo_result_id</strong> - id результата МО на терминале (1: осмотр окончен, успешно, 2: осмотр окончен, ошибка, 3: осмотр не проводился)</li>
                          <li><strong>mo_result_text</strong> - текстовое описание результата МО</li>
                          <li><strong>mo_dopusk_id</strong> - id допуска(1: допуск получен, 2: допуск запрещен)</li>
                          <li><strong>mo_dopusk_text</strong> - текстовое описание допуска</li>
                </ul>
                <p><strong>Пример ответа системы в формате JSON</strong></p>
                <p>{"time_now":"22.10.2015 14:41:14","time_from":"22.10.2015 06:41:14","name":"\u0410\u0437\u0430\u0440\u043e\u0432 \u041f\u0430\u0432\u0435\u043b \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447","dr":"03.01.1992","org_name":"\u041e\u041e\u041e \u00ab\u0422\u0440\u0430\u043d\u0441\u043a\u043e\u043c\u00bb ","otdel_name":"\u0411\u0443\u043a\u0435\u0442 \u0442\u0430\u043a\u0441\u0438","terminal_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0435\u0432\u0441\u043a\u0430\u044f \u041c\u0422-6","time_MO":"22.10.2015 12:42","mo_id":"175477","mo_result_id":"2","mo_result_text":"\u041e\u0441\u043c\u043e\u0442\u0440 \u043e\u043a\u043e\u043d\u0447\u0435\u043d, \u0443\u0441\u043f\u0435\u0448\u043d\u043e","mo_dopusk_id":"1","mo_dopusk_text":"\u0414\u043e\u043f\u0443\u0441\u043a \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d"}</p>
                <p><strong>Пример ответа системы в тестовом режиме (при передаче параметра check)</strong></p>
                <style>
                 table.debug {table-layout:fixed;border-collapse:collapse;empty-cells:show;margin:10px 0;background:white;}
                 table.debug td{border:1px solid gray;padding:5px;}
                 table.debug td strong{color:black;}
               </style>              <table class="left debug damp_array"><tr><td>time_now</td><td>22.10.2015 14:41:30</td></tr><tr><td>time_from</td><td>22.10.2015 06:41:30</td></tr><tr><td>name</td><td>Азаров Павел Геннадьевич</td></tr><tr><td>dr</td><td>03.01.1992</td></tr><tr><td>org_name</td><td>ООО «Транском»</div></td></tr><tr><td>otdel_name</td><td>Букет такси</td></tr><tr><td>terminal_name</td><td>Алексеевская МТ-6</td></tr><tr><td>time_MO</td><td>22.10.2015 12:42</td></tr><tr><td>mo_id</td><td>175477</td></tr><tr><td>mo_result_id</td><td>2</td></tr><tr><td>mo_result_text</td><td>Осмотр окончен, успешно</td></tr><tr><td>mo_dopusk_id</td><td>1</td></tr><tr><td>mo_dopusk_text</td><td>Допуск разрешен</td></tr></table>
                <h2>Сообщения о ошибках</h2>
                <p>В случае ошибочного ввода параметров запроса или отсутствия данных по МО, системой будет возвращен код ошибки и его текстовое описание:</p>
                <ul>
                                  <li><strong>error_code</strong> - код ошибки</li>
                                  <li><strong>error_text</strong> - описание ошибки</li>
                </ul>
                <p><strong>Воможные коды ошибок и их описания</strong></p>
                <ul>
                                  <li><strong>client_undefined</strong> - неверный UID клиента для доступа к системе</li>
                                  <li><strong>person_undefined</strong> - неверный UID сотрудника</li>
                                  <li><strong>mo_not_found</strong> - Сотрудник последние 8 часов МО не проходил</li>
                        </ul>

            <?
          }

    function block_main2()
    { $this->page_title() ;
      ?><br>
        <h2>Получение списка сотрудников</h2>
        <h2>Получение информациии по последнему МО сотрудника (с действующим пропуском)</h2>
        <h2>Получение списка МО за указанный промежуток времени</h2>
        <h2>Получение списка МО сотрудника</h2>
        <h2>Получение списка событий проходов сотрудника</h2>

        <h3>Описание тегов XML-файла</h3>

        <table class="basic fz_normal left">
            <tr><td>Persons</td><td></td><td>Контейнер списка сотрудников. Должен находиться в корне документа</td></tr>
            <tr><td>Person</td><td></td><td>Контейнер описания сотрудника. Должен находиться в контейнере persons</td></tr>
            <tr><td>Uuid</td><td>string(32)</td><td>Ваш уникальный идентификатор сотрудника.</td></tr>
            <tr><td>Name</td><td>string(256)</td><td>ФИО сотрудника</td></tr>
            <tr><td>Phone</td><td>string(12)</td><td>Телефон сотрудника</td></tr>
            <tr><td>Propusk</td><td>string(32)</td><td>Номер пропуска</td></tr>
            <tr><td>TabNumber</td><td>string(32)</td><td>Табельный номер</td></tr>
            <tr><td>DrivingLicense</td><td>string(32)</td><td>Серия, номер водительского удостоверения сотрудника</td></tr>
            <tr><td>DateMedSpravka</td><td>string(32)</td><td>Дата выдачи мед.справки, формат ДД.ММ.ГГГГ</td></tr>
            <tr><td>Dr</td><td>string(10)</td><td>Дата рождения сотрудника, формат ДД.ММ.ГГГГ</td></tr>
            <tr><td>Pol</td><td>string(1)</td><td>Пол сотрудника, М/Ж</td></tr>
            <tr><td>Adres</td><td>string(256)</td><td>Адрес</td></tr>
            <tr><td>Org</td><td>string(256)</td><td>Название организации сотрудника</td></tr>
            <tr><td>Structure</td><td>string(256)</td><td>Название подразделения организации</td></tr>
            <tr><td>Working</td><td>string(256)</td><td>Должность</td></tr>
            <tr><td>FullAccess</td><td>string(256)</td><td>Проход всегда</td></tr>
            <tr><td>Images_url</td><td></td><td>Контейнер списка фото. Должен находиться в контейнере person</td></tr>
        </table>
        <br><h2>Алгоритм загрузки списка сотрудников</h2>
        <ul>
            <li>Uuid сотрудника  - уникальный идентификатор в вашей системе. В работе системе ЭСМО используется только для синхронизации данных на шлюзе, поле обязательно для заполнения.</li>
            <li>При загрузке данных сотрудники идентифицируются по Uuid.</li>
            <li>Если сотрудник найден, информация по нему будет обновлена.</li>
            <li>Если сотрудник не найден, будет создана новая запись.</li>
            <li><strong>Если указано новое название организации, новая организация будет добавлена в базу автоматически.</strong></li>
            <li>Если указано новое для организации название подразделения, новое подразделение будет добавлен в организацию автоматически.</li>
            <li>Для сотрудника указывается одно фото в контейнере Images_url.</li>
            <li>Загрузка фото на сервер производиться асинхронно, так как при большом объему записей обработка фото может занять значительное время.</li>
            <li>Фото идентифицируется по названию файла, если при последующей передаче данных будет передано новое имя фото, старое фото будет удалено.</li>
            <li>Асинхронный процесс загрузки фото загрузит новые изображения примерно в течении 5 мин после загрузки XML, но конкретное время определяется длиной общей очереди всех клентов.</li>
        </ul>
        <br><h2>Описание ответа шлюза</h2>
                <p>Ответ шлюза приходит в формате tag=value, в случае ошибки будет возвращен только один тег ошибки</p>
                <p>В случае успешной загрузки, будет возвращен набор тегов с описанием кол-ва добавленных и новых записей. Теги при этому будут разделены переносом строки.</p>
                <table class="basic fz_normal left">
                    <tr><td>Ошибки</td><td>error=member_not_found</td><td>неверный client_id</td></tr>
                    <tr><td></td><td>error=member_is_not_client</td><td>указанный аккаунт не является клиентом системы ЭСМО</td></tr>
                    <tr><td></td><td>error=client_disabled</td><td>Аккаунт клиента заблокирован</td></tr>
                    <tr><td></td><td>error=not_valid_XML_source</td><td>Неверный формат XML, ошибка при разборе файла</td></tr>
                    <tr><td>Успешный импорт</td><td>person_count=XXX</td><td>Число обработанных контейнеров с описаниеми сотрудников</td></tr>
                    <tr><td></td><td>person_update=XXX</td><td>Число обновленных записей по сотрудникам</td></tr>
                    <tr><td></td><td>person_adding=XXX</td><td>Число новых записей по сотрудникам</td></tr>
                    <tr><td></td><td>person_enabled=XXX</td><td>Общее число активных сотрудников после импорта</td></tr>
                    <tr><td></td><td>person_disabled=XXX</td><td>Общее число заблокированных сотрудников после импорта</td></tr>
                    <tr><td></td><td>strusture_add=XXX</td><td>Число добавленных подразделений</td></tr>
                    <tr><td></td><td>img_exist=XXX</td><td>Число изображений, уже добавленных ранее к сотрудникам</td></tr>
                    <tr><td></td><td>img_to_upload=XXX</td><td>Число изображений, поставленных в очередь на загрузку</td></tr>
                    <tr><td></td><td>img_to_delete=XXX</td><td>Число изображений на удаление (отсутствующих в контейнерах сотрудников)</td></tr>
                </table>
      <?

    }

    /*
     *
     * Для чего мне понадобилась OData. У меня проект на Yii2. Проект представляет собой REST API. Для него мне понадобился инструмент для произвольных выборок из базы, чтобы внутренние клиенты компании могли вести разработку своих проектов не ожидая, пока наша команда реализует для них очередной метод для отдачи чего-либо. POData дает именно то, что надо — готовый инструмент для произвольных выборок, поэтому лично меня не смущает на данный момент поддержка только GET.
     Другие инструменты мне тоже интересны. Как в Apigility реализована фильтрация по произвольным условиям? Я по докам вижу только то, что можно задать набор строгих равенств, которые будут объединены только через логическое И: что-то вроде localhost:8000/books?title=php&sort=year
     Ну и OData — стандарт и под него подстроились некоторые UI библиотеки, что тоже на мой взгляд очень привлекательно.
     * */



function show_url($filter,$mode)
    {   $inner_filter=$filter; ;
        $inner_filter['limit']='limit 3' ;

        ?><h3>Строка запроса <?echo $mode?>:</h3><?
        $url=_MAIN_PROTOCOL._MAIN_DOMAIN.'/get/client/'.MEMBER()->info['UID'].'/'.$this->action.'/'.$mode.'/'.((_sizeof($filter))? '?'.http_build_query($filter):'') ;
        $url=strtolower($url) ;
        $url_inner=_MAIN_PROTOCOL._MAIN_DOMAIN.'/get/client/'.MEMBER()->info['UID'].'/'.$this->action.'/'.$mode.'/'.((_sizeof($inner_filter))? '?'.http_build_query($inner_filter):'') ;
        $url_inner=strtolower($url_inner) ;
        echo $url.'<br>' ;
        ?><h3>Пример ответа на запрос (полная выгрузка, ссылка откроется в новой вкладке)</h3><?
        ?><a href="<?echo $url?>" target="_blank"><?echo $url?></a><?
        ?><h3>Пример ответа на запрос (с ограничением в 3 позиции)</h3><?
        $text=file_get_contents($url_inner) ;  // $url_json_inner - запрос с параметром limit
        if ($mode=='JSON')
        {   //$text=stripcslashes($text) ;
            $arr=json_decode($text) ;

            ?><textarea class="code" readonly><?echo JSON::encode($arr);?></textarea><?
        }
        else {?><textarea class="code" readonly><?echo $text?></textarea><?}


    }



}



?>
