---
# System prepended metadata

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

---

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

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