# Схема взаимодействия систем ![](https://www.dropbox.com/s/by6hk2eq75qkrtn/interaction%20scheme.png?dl=1) # Архитектура сущностей ## Связи ```mermaid erDiagram uc_order ||--|| b24_client : field_b24_client_link uc_order ||--|{ params_ordered_items : field_params_ordered_items uc_order ||--|{ check_queue : field_check_queue params_ordered_items ||--|| area : field_tid uc_order ||--|{ co_tariff : products co_tariff ||--|{ tariff_options : field_tariff_options b24_client ||--|{ user_acs : field_b24_client_acs_users user_acs ||--|{ user_acs_access : field_user_acs_access user_acs_access ||--|{ access_category : field_area_access_category_link area ||--|{ co_tariff : field_applicable_tariff area ||--|{ access_category : field_area_access_category_link ``` ## Свойства сущностей | ![](https://www.dropbox.com/s/o3kmds24a45nj3t/crop_01.png?dl=1) | ![](https://www.dropbox.com/s/v7yxv5qi1ylujrc/crop_02.png?dl=1) | | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | ![](https://www.dropbox.com/s/22om9kewghs5ybr/crop_03.png?dl=1) | ![](https://www.dropbox.com/s/wc7ka7kvmzuzdot/crop_04.png?dl=1) | | ![](https://www.dropbox.com/s/rebhomoy6yxltez/crop_05.png?dl=1) | ![](https://www.dropbox.com/s/ykmdcwfxqgkp1fv/crop_06.png?dl=1) | | ![](https://www.dropbox.com/s/0c4evqs87c1p2iv/crop_07.png?dl=1) | ![](https://www.dropbox.com/s/0o61z41b2jssmt8/crop_08.png?dl=1) ![](https://www.dropbox.com/s/d0htx99rzeuvf1s/crop_09.png?dl=1) | Где - uc_order - заказ на сайте - field_b24_deal_id - id сделки на портале - field_b24_client_link - id клиента на сайте - field_order_pay_type - тип оплаты - field_params_ordered_items - id наборов полей "Параметры заказанных позиций" - field_check_queue - id наборов полей "Очередь чеков / реализаций" - field_invoice_doc_num - номер документа - field_guid_buh_prod_1c - guid 1C - b24_client - клиент - field_b24_id - id клиента на портале Битрикс24 - field_b24_client_acs_user_link - id пользователя Артонит - field_guid_buh_prod_1c - guid 1C - co_tariff - тариф - field_tariff_price - стоимость - field_unit_measurement - единица измерения - field_amount - количество - field_tariff_options - опции - field_service_code - код услуги - field_guid_buh_1c - guid 1C - tariff_options - опции тарифов - params_ordered_items - набор полей (Параметры заказанных позиций) - field_tid - id помещения - field_nid - id тарифа - field_order_product_period - период услуги (unixtime) - check_queue - набор полей очереди чеков (реализаций) - field_check_period_start - Дата начала - field_check_date_to_print - Дата печати чека - field_check_days - Количество дней - field_check_done - признак Чек выбит - field_check_sum - Сумма - field_check_only_realization - признак Только реализация - field_check_json_service_cost - Услуга с суммой (в json формате) - field_check_doc_num - Номер документа - field_check_doc_date - Дата документа - field_guid_buh_prod_1c - guid 1С - area - помещение - field_applicable_tariff - id применяемых тарифов - field_area_access_category_link - id категорий доступа - user_acs - пользователь Артонит - field_user_acs_id - id в системе Артонит - field_user_acs_surname - фамилия - field_user_acs_name - имя - field_user_acs_patronymic - отчество - field_user_acs_access - набор полей (Выданное разрешение) - access_category - категория доступа - field_access_category_id - id категории доступа # Тестирование Для тестирования примеров, необходимо создать в корневой папке сайта файл с расширением php, например test.php со следующим содержимым: ```php <?php define('DRUPAL_ROOT', getcwd()); require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); // Код из примера ``` После этого необходимо открыть страницу с адресом созданного файла - например https://kalibr.co/test.php, что в свою очередь вызовет выполнение кода. # Обмен с Битрикс24 ## Перечень приложений *Для закрепления приложений в боковом меню смотри документацию по интерфейсу.* ### Встраиваемое приложение в сделке - вкладка **Коворкинг** ![](https://www.dropbox.com/s/jt2mcuci705ugrg/selection_01.png?dl=1) Запросы отправляемые в 1С: - Создание номенклатуры - Создание контрагента - Создание договора детского технопарка (для сделок по детскому технопарку) - Создание счета / чека Запросы отправляемые в Битрикс24: - Создание / обновление товара - Добавление товара в сделку Запросы отправляемые на ККТ - Открытие смены - Выбить чек Запросы отправляемые в Артонит - Добавление категории доступа Запросы отправляемые в WI-FI system - Создание ваучера ### Встраиваемое приложение в компании / контакте - вкладка вкладка **Коворкинг** ![](https://www.dropbox.com/s/3jc04wn6u7vnty6/selection_02.png?dl=1) Запросы отправляемые в 1С: - Создание / обновление контрагента ### Приложение **График реализаций (КВ)** ![](https://www.dropbox.com/s/zcowi2lwzfuoyq3/selection_03.png?dl=1) Запросы отправляемые в 1С - Создание реализации Запросы отправляемые на ККТ - Выбить чек ### Приложение **График реализаций (ДТ)** - аналогичен **График реализаций (КВ)** ![](https://www.dropbox.com/s/f2o17hz8g5nvfll/selection_04.png?dl=1) ### Приложение **Переотправка в 1С** ![](https://www.dropbox.com/s/6yo4vje1z7c6s8t/selection_05.png?dl=1) Предназначено для просмотра текущей очереди запросов для отправки в 1С ### Приложение **СКУД** ![](https://www.dropbox.com/s/ftpf1bvmvvy6ajt/selection_06.png?dl=1) Запросы отправляемые в Артонит: - Получение id пользователя по номеру пропуска - Запрос данных пользователя по id ## Создание/обновление товара Функция: `inetsys_bitrix_b24_product_add_update($nid)` Входной аргумент `$nid` - id тарифа на сайте - Создать тариф на сайте https://www.kalibr.co/node/add/co-tariff, заполнить необходимые поля - Выполнить код ```php inetsys_bitrix_b24_product_add_update($nid); ``` Где $nid - id созданного тарифа В результате будет создан новый продукт на портале Битрикс24 ## Удаление всех товаров из сделки ```php inetsys_bitrix_b24_delete_all_product_from_deal($deal_id); ``` Где $deal_id - id сделки на портале Битрикс24 В результате все товары будут удалены из сделки ## Добавление товара в сделку ```php inetsys_bitrix_b24_add_product_to_lead_or_deal($deal_id, 'deal', [$nid]); ``` Где - $deal_id - id сделки - $nid - id тарифа на сайте ### Пример добавления товаров из заказа в сделку ```php // удаляем все товары в сделке inetsys_bitrix_b24_delete_all_product_from_deal($deal_id); // загрузка заказа с сайта $order = uc_order_load($oid, TRUE); $products_to_deal = []; foreach ($order->products as $product) { $products_to_deal[] = ['nid' => $product->nid, 'qty' => $product->qty]; } // добавление товаров из заказа в сделку inetsys_bitrix_b24_add_product_to_lead_or_deal($deal_id, 'deal', $products_to_deal, TRUE); ``` Где - $deal_id - id сделки - $oid - id заказа на сайте ## Обновление контакта Для обновления контакта на портале Битрикс24 нужно выполнить ```php inetsys_bitrix_b24_contact_update($b24_id, $nid); ``` Где - $b24_id - id контакта на портале - $nid - id контакта на сайте При этом на портале обновятся следующие данные: - Обновится контакт - Обновятся реквизиты - Обновятся банковские реквизиты ## Обновление компании Для обновления компании на портале Битрикс24 нужно выполнить ```php inetsys_bitrix_b24_company_update($b24_id, $nid); ``` Где - $b24_id - id компании на портале - $nid - id контакта на сайте При этом на портале обновятся следующие данные: - Обновится компания - Обновятся реквизиты - Обновятся банковские реквизиты ## Генерация документа в сделке по шаблону (УПД) для генерации документа нужно выполнить ```php inetsys_bitrix_generate_document_by_template_with_change_product_cost_by_fc_id($fc_id); ``` Где $fc_id - id набора полей в заказе на сайте (содержащий все необходимые данные) При этом происходит следующее - в сделку на портале временно подставляются товары со стоимостями реализаций - запускается генерация документа по шаблону - возвращаются товары с их изначальными стоимостями Функция внутри себя вызывает вспомогательную функцию `inetsys_bitrix_generate_document_by_template_with_change_product_cost($deal_id, $template_id, $product_cost, $timestamp = NULL)` Аргументами которой являются: - $deal_id - id сделки - $template_id - id шаблона (48 - детский технопарк, 40 - коворкинг юридическое лицо, 72 - коворкинг физическое лицо) - $product_cost - массив с товарами которые нужно подставить на момент генерации документа - $timestamp - временная метка (необязательный параметр) ## Добавление комментария в сделку Для добавления комментария в сделку нужно выполнить: ```php inetsys_bitrix_add_comment_to_deal($deal_id, $text); ``` Где - $deal_id - id сделки - $text - текст комментария ## Отправка уведомления пользователю портала Для отправки уведомления пользователю нужно выполнить: ```php inetsys_bitrix_send_notification_to_user_b24($user_id, $message); ``` Где - $user_id - id пользователя на портале - $message - текст уведомления ## Генерация QR кода для оплаты в сделку (Детский технопарк) Для генерации QR кода оплаты нужно выполнить: ```php inetsys_bitrix_generate_qr_code($deal_id); ``` Где $deal_id - id сделки ## Установка значений в пользовательские поля сделки ```php inetsys_bitrix_set_deal_user_field($deal_id, $uf, $value); ``` Где: - $deal_id - id сделки на портале - $uf - машинное имя пользовательского поля (например UF_CRM_1607072609522) - $value - значение которое необходимо установить Примеры использования: - установка строки номенклатуры Детского технопарка - установка номера счета - установка номера последней УПД - установка логина и пароля от WI-FI system # Обмен с 1С > Для обмена с 1С создан отдельный класс `ExchangeProd` файл `inetsys_bitrix_buh_prod.exchange.inc` > Все запросы в 1С логируются в файл /var/www/owner/data/mod-tmp/kalibr_buh_prod_exchange_debug.txt > Тип запросов: **POST** > Формат данных: **JSON** ## Создание номенклатуры Метод: `newNomenclature` - Создать тариф на сайте https://www.kalibr.co/node/add/co-tariff - Выполнить код ```php $exchangeProd = new \ExchangeProd(); $exchangeProd->newNomenclature($nid); ``` Где $nid - id тарифа на сайте В 1С будут отправлены следующие данные ``` $data: Array ( [title] => Аренда рабочего места в зоне коворкинга: тариф месяц тим (стр. 17) [cost] => 11250 ) ``` Где title - название тарифа, cost - стоимость тарифа Ответ 1С ``` $result: Array ( [response] => { "GUID": "8d9c0987-e863-11eb-b817-ac1f6bba0723", "success": "true" } [statusCode] => 200 [error] => ) ``` Где GUID - guid созданого тарифа в 1С, он сохраняется на сайте. ## Создание контрагента Методы: - `createIndividual` - создание физического лица - `createLegal` - создание юридического лица - Создать контрагента на сайте https://www.kalibr.co/node/add/b24-client - Выполнить код Для физического лица: ```php $exchangeProd = new \ExchangeProd(); $exchangeProd->createIndividual($nid); ``` Для юридического лица: ```php $exchangeProd = new \ExchangeProd(); $exchangeProd->createLegal($nid); ``` Где $nid - id контрагента на сайте В 1С будут отправлены следующие данные Для физического лица: ``` $data: Array ( [surname] => Гаммель [name] => Екатерина [second_name] => Ильдаровна [document_type] => Паспорт гражданина РФ [series] => 6512 [number] => 564543 [issued_by] => Отдел УФМС России по Свердловской обл. в Кировском р-не г. Екатеринбурга [date_issue] => 2010-10-10T00:00:00 [unit_code] => 660-004 [register_timestamp] => 1626606039 [email] => [uid] => 81060 [ДатаРождения] => 1900-01-01T00:00:00 [Пол] => М [Ребёнок] => [Родитель] => 00000000-0000-0000-0000-000000000000 [СтепеньРодства] => [ДокументОснованиеОпеки] => [ФИОРодПадеже] => [ФИОДатПадеже] => [ФИОВинПадеже] => [АдресПоПрописке] => г. Москва ш.Варшавское д168 кв 1253 [АдресПроживания] => [МобильныйТелефон] => [ВидДокумента] => ) ``` Для юридического лица: ``` $data: Array ( [uid] => 76737 [inn] => 9715294330 [short_name] => ООО "ЮСБ" [full_name] => Общество с ограниченной ответственностью "ЮСБ" [ogrn] => 1177746196649 [kpp] => 771701001 [reg_date] => 0001-01-01T00:00:00 [cert_series] => [okpo] => [oktmo] => [okved] => [ceo] => Тростин И.А. [ch_accountant] => [actual_address] => 129085, г. Москва, ул. Годовикова, д.9, стр.1, под. 1.1, эт. 1, п.1.2, к. 1.2.2. [legal_address] => 129085, г. Москва, ул. Годовикова, д.9, стр.1, под. 1.1, эт. 1, п.1.2, к. 1.2.2. [email] => [phone] => [bank_details] => Array ( ) ) ``` Ответ 1С ``` $result: Array ( [response] => { "GUID": "fdb29e99-9dda-11eb-b816-ac1f6bba0723", "success": "true" } [statusCode] => 200 [error] => ) ``` Где GUID - guid созданого контрагента в 1С, он сохраняется на сайте. ## Создание договора детского технопарка Метод: `newContract` Параметры: - $oid - id заказа на сайте - $contract_num - номер договора (необязательный параметр) ```php $exchangeProd = new \ExchangeProd(); $exchangeProd->newContract($oid); ``` В 1С будут отправлены следующие данные ``` $data: Array ( [from] => 2021-06-29T00:00:00 [to] => 2021-07-09T00:00:00 [contract_id] => 270 [contract_total] => 7000 [subject_contract] => Посещение мероприятия по направлению "3D моделирование и компьютерная анимация" по договору №270 от 29.06.2021, за Астахова Никиту Сергеевича [user_guid] => 124729e1-d8ac-11eb-b817-ac1f6bba0723 [childrens] => Array ( [0] => Array ( [name] => Астахов Никита Сергеевич ) ) ) ``` Ответ 1С ``` $result: Array ( [response] => { "GUID": "124729e2-d8ac-11eb-b817-ac1f6bba0723", "success": "true" } [statusCode] => 200 [error] => ) ``` Где GUID - guid созданного договора ## Создание счета, чека, реализации Метод: `createOrder` Параметры: - $oid - обязательный параметр, id заказа на сайте - $is_legal - признак физическое лицо (FALSE) или юридическое лицо (TRUE) - $is_realization признак что это реализация (по умолчанию FALSE) - $custom_total - собственная сумма заказа (по умолчанию NULL) - $check_fc_id - для реализаций используется дополнительный id набора полей из заказа (по умолчанию NULL) - $custom_doc_num - собственный номер документа (по умолчанию NULL) - $custom_doc_date - собственная дата документа (по умолчанию NULL) - $contract_num - номер договора детского технопарка (по умолчанию NULL) - $queue_key - номер элемента из очереди переотправки запросов в 1С (по умолчанию NULL) ### Создание счета - Создать заказ на сайте https://www.kalibr.co/admin/store/orders/create - Выполнить ```php $exchangeProd = new \ExchangeProd(); $exchangeProd->createOrder($oid, TRUE); ``` Где $oid - id заказа на сайте, $is_legal - признак того что это физическое или юридическое лицо В 1С будут отправлены следующие данные ``` $data: Array ( [from] => 2021-07-21T00:00:00 [to] => 2021-08-20T23:59:59 [order_id] => 2166 [order_total] => 149600 [op_type] => invoice [doc_num] => КЦ-07021 [doc_date] => 2021-07-20T08:57:24 [user_guid] => 83aab51b-0508-11e8-a6be-000c2901c5bf [items_guid] => Array ( [0] => Array ( [guid] => 4300e4db-7c05-11eb-b816-ac1f6bba0723 [qty] => 1 [price] => 149600 ) ) [conract_guid] => ) ``` Ответ 1С ``` $result: Array ( [response] => { "GUID": "1dd2b977-e91f-11eb-b817-ac1f6bba0723", "success": "true" } [statusCode] => 200 [error] => ) ``` Где GUID - guid созданного счета, он сохраняется на сайте ### Создание чека - Создать заказ на сайте https://www.kalibr.co/admin/store/orders/create - Выполнить ```php $exchangeProd = new \ExchangeProd(); $exchangeProd->createOrder($oid); ``` Где $oid - id заказа на сайте В 1С будут отправлены следующие данные ``` $data: Array ( [from] => 2021-07-18T11:00:00 [to] => 2021-07-18T13:59:59 [order_id] => 2162 [order_total] => 3000 [op_type] => check [doc_num] => КАКЦ-002988 [doc_date] => 2021-07-18T14:01:50 [user_guid] => 4e0efc43-e7b7-11eb-b817-ac1f6bba0723 [items_guid] => Array ( [0] => Array ( [guid] => b63a31e4-81b0-11eb-b816-ac1f6bba0723 [qty] => 3 [price] => 3000 ) ) [conract_guid] => ) ``` Ответ 1С ``` $result: Array ( [response] => { "GUID": "4e0efc45-e7b7-11eb-b817-ac1f6bba0723", "success": "true" } [statusCode] => 200 [error] => ) ``` Где GUID - guid созданного чека, он сохраняется на сайте ### Создание реализации Выполнить ```php $exchangeProd = new \ExchangeProd(); $exchangeProd->createOrder($oid, FALSE, TRUE, $total, $fc_id); ``` Где: - $oid - id заказа на сайте - $total - сумма реализации - $fc_id - id набора полей в заказе на сайте Набор полей в заказе содержит следующие поля: - Сумма - Услуга с суммой (в формате json) - и другие необходимые поля все поля в наборе получают значения автоматически при формировании заказа для этого вызывается функция `inetsys_bitrix_fill_check_queue_for_order($oid, $only_realization)` Где - $oid - id заказа на сайте - $only_realization - признак (TRUE/FALSE) того что требуются только реализации (отправляемые в 1С) или еще нужно выбивать чек на ККТ В 1С будут отправлены следующие данные ``` $data: Array ( [from] => 2021-06-21T00:00:00 [to] => 2021-07-20T23:59:59 [order_id] => 2077 [order_total] => 5416.67 [op_type] => realization [doc_num] => КАКЦ-07049 [doc_date] => 2021-07-20T00:00:00 [user_guid] => d71a4307-b7be-11eb-b817-ac1f6bba0723 [items_guid] => Array ( [0] => Array ( [guid] => e67127be-859c-11eb-b816-ac1f6bba0723 [qty] => 1 [price] => 5416.67 ) ) [conract_guid] => ) ``` Ответ 1С ``` $result: Array ( [response] => { "GUID": "178a44c4-e91e-11eb-b817-ac1f6bba0723", "success": "true" } [statusCode] => 200 [error] => ) ``` Где GUID - guid созданной реализации, он сохраняется на сайте ## Очередь переотправки запросов в 1С Основным методом работы с 1С является `createOrder`, внутри него выполняются все другие необходимые методы описанные выше (Создание номенклатуры, Создание контрагента, Создание договора) Все вызовы метода `createOrder` помещаются в очередь, после успешной отработки - удаляются из очереди. Вызов переотправки происходит автоматически по расписанию (cron) Схематичное представление реализации очереди запросов в 1С ```mermaid graph TD start([Вызов метода обмена]) --> method method{Передан ключ из очереди} -- Да --> set_queue_item_temp set_queue_item_temp(Меняем флаг на временный) --> result method -- Нет --> add_to_queue add_to_queue(Добавить в очередь с флагом временный) --> result result{Отправка запроса в 1С} -- Успешно --> success result -- Ошибка --> set_queue_item_active set_queue_item_active([Убрать флаг временный]) success([Удалить из очереди]) ``` Для принудительной очистки очереди переотправки нужно выполнить: ```php inetsys_bitrix_clean_resend_queue(); ``` ## Ошибки при обмене с 1С > Данные запросов и ответов логируются в файле **/var/www/owner/data/mod-tmp/kalibr_buh_prod_exchange_debug.txt** ### Значение поля не уникально Пример Данные которые были отправлены: ``` $data: Array ( [from] => 2021-07-15T15:00:00 [to] => 2021-07-15T16:59:59 [order_id] => 2156 [order_total] => 4000.00 [op_type] => realization [doc_num] => КАКЦ-07035 [doc_date] => 2021-07-15T00:00:00 [user_guid] => b0fa6188-1ded-11e8-a6be-000c2901c5bf [items_guid] => Array ( [0] => Array ( [guid] => 8d5a16f5-8314-11eb-b816-ac1f6bba0723 [qty] => 2 [price] => 4000 ) ) [conract_guid] => ) ``` Был получен ответ от 1С: ``` $result: Array ( [response] => { "response": "\n{HTTPСервис.CRM_Api.Модуль(1393)}: Ошибка при вызове метода контекста (Записать): Значение \"КАКЦ-07035\" поля \"Номер\" не уникально", "error": "" } [statusCode] => 500 [error] => ) ``` Такой ответ говорит о том что в 1С документ с номером **КАКЦ-07035** уже есть Такая ошибка не требует действий, так как неуспешный запрос остается в очереди переотправки запросов в 1С Такой запрос будет отправлен из очереди но уже с новым номером, так как данная ошибка специально обрабатывается системой. ### Ошибка при вызове метода контекста (Записать) Пример Данные которые были отправлены: ``` $data: Array ( [from] => 2021-06-01T00:00:00 [to] => 2021-11-30T23:59:59 [order_id] => 2027 [order_total] => 381600 [op_type] => invoice [doc_num] => КЦ-06001 [doc_date] => 2021-06-01T20:16:41 [user_guid] => 61724031-32f6-11ea-b80b-ac1f6bba0722 [items_guid] => Array ( [0] => Array ( [guid] => 7a941d6e-bfa0-11eb-b817-ac1f6bba0723 [qty] => 1 [price] => 381600 ) ) [conract_guid] => ) ``` Был получен ответ от 1С: ``` $result: Array ( [response] => {HTTPСервис.CRM_Api.Модуль(2051)}: Ошибка при вызове метода контекста (Записать) [statusCode] => 500 [error] => ) ``` Данная ошибка действий не требует, так как неуспешный запрос будет автоматически переотправлен из очереди запросов. ### Time out Пример Данные которые были отправлены: ``` $data: Array ( [from] => 2021-07-03T13:00:00 [to] => 2021-07-03T14:59:59 [order_id] => 2121 [order_total] => 2000.00 [op_type] => realization [doc_num] => КАКЦ-07007 [doc_date] => 2021-07-03T00:00:00 [user_guid] => f3c186c7-3ea3-11ea-b80b-ac1f6bba0722 [items_guid] => Array ( [0] => Array ( [guid] => b63a31e4-81b0-11eb-b816-ac1f6bba0723 [qty] => 2 [price] => 2000 ) ) [conract_guid] => ) ``` Ответ от 1С не был получен в течение 90 секунд, в файле лога будет запись следующего содержания: ``` $result: Array ( [response] => [statusCode] => 0 [error] => Operation timed out after 90000 milliseconds with 0 bytes received ) ``` Данная ошибка действий не требует, так как неуспешный запрос будет автоматически переотправлен из очереди запросов. # Обмен с Артонит > Для обмена с Артонит создан отдельный класс `AcsExchange` файл `inetsys_acs.exchange.inc` > Протокол обмена: **SOAP** ## Получение Id пользователя по номеру пропуска ```php $user_id = inetsys_acs_get_user_id_by_card($card); ``` Где $card - номер пропуска $user_id - id пользователя в системе ## Запрос данных пользователя по ID ```php $info = inetsys_acs_get_user_info_by_id($user_id); ``` Где $user_id - id пользователя в системе $info - объект с информацией о пользователе ## Получение списка категорий доступа ```php $acs_exchange = new AcsExchange(); $result = $acs_exchange->getEnumAccess(); ``` $result - объект содержащий перечень всех категорий доступа ## Добавление категории доступа ```php $acs_exchange = new \AcsExchange(); $result = $acs_exchange->userAccessAdd($user_id, $category_id); ``` Где - $user_id - id пользователя в системе - $category_id - id категории доступа ## Удаление категории доступа ```php $acs_exchange = new \AcsExchange(); $result = $acs_exchange->userAccessDel($user_id, $category_id); ``` Где - $user_id - id пользователя в системе - $category_id - id категории доступа ## Получение номера пропуска по id пользователя ```php $card = inetsys_acs_card_get_by_user($user_id); ``` Где $user_id - id пользователя в системе $card - объект содержащий номер пропуска пользователя ## Добавить пользователя в заказ Для получения доступа к помещениям по пропуску в рамках сделки, необходимо добавить пользователя в заказ Для этого нужно выполнить ```php inetsys_acs_user_access_add_by_order($oid, $user_id); ``` Где - $oid - id заказа на сайте - $user_id - id пользователя на сайте # ККТ > Для обмена с ККТ создан отдельный класс `TerminalFAClient` файл `TerminalFAClient.php` > Список доступных ККТ и их ip можно посмотреть в панели администрирования по адресу https://www.kalibr.co/admin/structure/taxonomy/kkt_list > Все открытые смены на ККТ автоматически закрываются по расписанию в 23:55 ## Открыть смену на ККТ Для открытия смены на ККТ нужно выполнить: ```php $path_to_terminal = libraries_get_path('terminal'); include_once $path_to_terminal . '/lib/Client/TerminalFAClient.php'; $terminalClient = new TerminalFAClient($terminal_ip, 7777); $terminalClient->openSession($cashier_name); ``` Где - $terminal_ip - ip адрес ККТ - $cashier_name - ФИО кассира для которого необходимо открыть смену Для использования данного метода внутри приложения, создана вспомогательная функция, которая предполагает что в сессии уже есть ФИО текущего пользователя портала ```php inetsys_bitrix_terminal_open_session($terminal_ip); ``` В которой реализованы дополнительные проверки: - Открыта ли сейчас смена на ККТ - Проверка на какого кассира была ранее открыта смена - При необходимости текущая смена закрывается и открывается для текущего кассира ## Закрыть смену на ККТ Для закрытия смены на ККТ нужно выполнить: ```php $path_to_terminal = libraries_get_path('terminal'); include_once $path_to_terminal . '/lib/Client/TerminalFAClient.php'; $terminalClient = new TerminalFAClient($terminal_ip, 7777); $terminalClient->closeSession($cashier_name); ``` Где - $terminal_ip - ip адрес ККТ - $cashier_name - ФИО кассира от имени которого закрывается смена ## Выбить чек Для выбивки чека необходимо что бы смена на ККТ была открыта и выполнить: ```php $path_to_terminal = libraries_get_path('terminal'); include_once $path_to_terminal . '/lib/Client/TerminalFAClient.php'; $terminalClient = new TerminalFAClient($terminal_ip, 7777); $terminalClient->openCheck(); $terminalClient->sendItem($product_title, $product_cost, $product_qty, $SignOfSubjectOfCalculation, $MethodOfCalculation); $terminalClient->sendPaymentData($total_cost, $email, $oid, $pay_type, $current_cashier, $org_name, $org_inn); $terminalClient->sendAutomaticDeviceData('', '', '1'); $check_result = $terminalClient->formCheck($total_cost, $add_info); ``` Где - $terminal_ip - ip адрес ККТ - $product_title - наименование товарной позиции - $product_cost - стоимость товарной позиции - $product_qty - количество товарных позиций - $SignOfSubjectOfCalculation - Признак предмета расчета (4 - УСЛУГА, 10 - ПЛАТЕЖ) - $MethodOfCalculation - Признак способа расчета (4 - ПОЛНЫЙ РАСЧЕТ, 1 - ПОЛНАЯ ПРЕДОПЛАТА) - $total_cost - итого по чеку - $email - телефон или email покупателя - $oid - id заказа на сайте - $pay_type - тип оплаты (cash - наличными, electron - безналичными) - $current_cashier - ФИО кассира - $org_name - наименование организации (необходим если выбивается чек на организацию) - $org_inn - ИНН организации (необходим если выбивается чек на организацию) - $add_info - дополнительные текст в чеке (например: "Признак способа расчета: ПОЛНЫЙ РАСЧЕТ...") $check_result - результат выбивки чека (массив содержащий ФП, ФД, номер чека...) Так же создана вспомогательная функция ```php inetsys_bitrix_do_terminal_check($kkt_ip, $oid, $pay_type, $email, $current_cashier, $org_short_name, $org_inn); ``` Набор полей аналогичен набору описанному выше # WI-FI system > Для обмена с WI-FI system создан отдельный модуль `inetsys_wifi.module` ## Создать доступ к WI-FI Выполнить: ```php $voucher = inetsys_wifi_get_voucher($client_title, $connection_count, $act, $login); ``` Где - $client_title - наименование клиента (ФИО или название организации) для удобства просмотра ваучеров в системе - $connection_count - количество одновременных подключений - $act - действие (**create_voucher** - создание нового ваучера, **update_voucher** - обновление существующего) - $login - логин в системе WI-FI system (необязательный параметр, используется для обновления существующего ваучера) ## Прекращение доступа к WI-FI Для прекращения доступа необходимо установить лимит по ваучеру равным 1 Выполнить: ```php $voucher = inetsys_wifi_get_voucher($client_title, 1, 'update_voucher', $login, 1); ``` Параметры аналогичны методу создания доступа к WI-FI # Запланированные задания (CRON) | Описание | Время запуска | Команда | | ----------------------------------------------------- | ----------------------------------- | ---------------------------------------- | | Закрытие смен на ККТ | в 23:55 каждый день | inetsys_bitrix_terminal_session_close(); | | Получение ваучеров WI-FI | в 55 минут каждого часа | inetsys_wifi_create_vouchers(); | | Обнуление ваучеров WI-FI | в 05 минут каждого часа | inetsys_wifi_zeroing_vouchers(); | | Получение доступного списка категорий доступа Артонит | в 01:55 и в 12:55 | inetsys_acs_get_enum_access(); | | Добавление категорий доступа пользователям Артонит | в 50 минут каждого часа | inetsys_acs_user_access_add_callback(); | | Удаление категорий доступа у пользователей Артонит | в 10 минут каждого часа | inetsys_acs_user_access_del_callback(); | | Отправка сегодняшних реализаций | в 19:00, 20:00, 21:00, 22:00, 23:00 | inetsys_bitrix_send_today_realization(); | | Переотправка неуспешных запросов в 1С | каждые 10 минут | inetsys_bitrix_do_resend_queue(); | # Связка SVG карты помещения (рабочие места) с id на сайте Список всех помещений находиться на сайте https://www.kalibr.co/admin/structure/taxonomy/tariffs_coworking Что бы узнать id помещения на сайте можно перейти в редактирование помещения, в адресной строке браузера будет ссылка вида https://www.kalibr.co/taxonomy/term/746/edit, где число 746 это и есть id помещения на сайте Далее этот id необходимо указать в svg карте в теге **use** атрибут **data-id** присвоив ему значение id помещения на сайте ![](https://www.dropbox.com/s/5ea0mkkospp0ci6/svg%20example.png?dl=1) # Подбор тарифов для нефиксированных мест Настройка применяемых тарифов происходит в панели администрирования сайтом https://www.kalibr.co/taxonomy/term/530/edit Для подбора тарифов используется функция `inetsys_co_get_actual_places` вызываемая через ajax Аргументами функции являются две метки времени (в формате _Unix time_) начало и окончание выбранного диапазона На основе этих двух дат: - подбираются необходимые тарифы для месяца, недели, дня - подсчитывается количество свободных мест в выбранном диапазоне Подбор тарифов работает следующим образом: - получение всех тарифов заданых у термина "Рабочие места" - если указаны опции тарифа (например: "Чемпион", "Еду в Москву", ...) то тарифы без данных опций в подборе не учавствуют - дальше в зависимости от выбранного диапазона, находятся соответствующие тарифы по единицам измерения Для подсчета количества свободных мест в указанном диапазоне используется функция `inetsys_bitrix_get_count_free_places` на вход которой подаются две временные метки (начало и окончание диапазона) # Подбор тарифов для фиксированных мест Настройка применяемых тарифов происходит в панели администрирования сайтом для каждого конкретного места указывается свой набор применяемых тарифов Для подбора тарифов используется функция `inetsys_co_get_tariffs_by_filter` вызываемая через ajax Подбор тарифов работает следующим образом: - получение всех тарифов заданых у выбранных мест - если указаны опции тарифа (например: "Чемпион", "Summer", ...) то тарифы без данных опций в подборе не учавствуют - дальше в зависимости от выбранного диапазона, находятся соответствующие тарифы по единицам измерения и количеству выбранных мест