# Схема взаимодействия систем

# Архитектура сущностей
## Связи
```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
```
## Свойства сущностей
|  |  |
| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
|  |  |
|  |  |
|  |   |
Где
- 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
## Перечень приложений
*Для закрепления приложений в боковом меню смотри документацию по интерфейсу.*
### Встраиваемое приложение в сделке - вкладка **Коворкинг**

Запросы отправляемые в 1С:
- Создание номенклатуры
- Создание контрагента
- Создание договора детского технопарка (для сделок по детскому технопарку)
- Создание счета / чека
Запросы отправляемые в Битрикс24:
- Создание / обновление товара
- Добавление товара в сделку
Запросы отправляемые на ККТ
- Открытие смены
- Выбить чек
Запросы отправляемые в Артонит
- Добавление категории доступа
Запросы отправляемые в WI-FI system
- Создание ваучера
### Встраиваемое приложение в компании / контакте - вкладка вкладка **Коворкинг**

Запросы отправляемые в 1С:
- Создание / обновление контрагента
### Приложение **График реализаций (КВ)**

Запросы отправляемые в 1С
- Создание реализации
Запросы отправляемые на ККТ
- Выбить чек
### Приложение **График реализаций (ДТ)** - аналогичен **График реализаций (КВ)**

### Приложение **Переотправка в 1С**

Предназначено для просмотра текущей очереди запросов для отправки в 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.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", ...) то тарифы без данных опций в подборе не учавствуют
- дальше в зависимости от выбранного диапазона, находятся соответствующие тарифы по единицам измерения и количеству выбранных мест