# Система фильтров и хуков SalesMan CRM

Хуки позволяют внедрить свой код в систему для изменения/дополнения логики работы. Фильтры позволяют изменить/дополнить результаты выполнения программы. Система аналогична хукам и фильтрам CMS Wordpress.

- **Хук** - это подсистема, позволяющая выполнить свой код в определенных частях системы
- **Фильтр** - это подсистема, позволяющая изменять данные перед выполнением основного кода системы

## Подключение хуков и фильтров

Для подключения своих хуков и фильтров требуется разместить необходимые файлы в нужных местах. Для выполнения своих функций требуется её активировать.

**Пример хука:**

```php
$hooks -> add_action( "task_form_before", "pluginname_form_add_fields" );
function pluginname_form_add_fields( $post = [], $data = [] ) {
	// выполняем свои действия
}
```

**Пример фильтра:**

```php
$hooks -> add_filter( 'task_doitfilter', 'pluginname_task_doit_filter' );
function pluginname_task_doit_filter( $data = [] ) {
    // дополняем данные и возвращаем
	return $data;
}
```

В этом примере мы ставим хук на открытие формы напоминания. При этом будет выполнена наша функция "pluginname_form_add_fields".

> **Примечание:**
>
> Рекомендуется присваивать своим функциям уникальные имена, которые будут ассоциироваться с выполняемым действияем, а также иметь связку с плагином
> - pluginname - уникальный префикс
> - form_add_fields - то, что он делает


### Для плагинов

Требуется разместить файл в папку с плагином. Поддерживается 2 вида файлов:

1. **Исполняемые**
 
    Эти файлы подключаются во время работы программы, а также во время активации/деактивации плагина. Должны иметь то же имя, что и папка с плагином, но в нижнем регистре букв.
     
     ```text
    crmZarplata/crmzarplata.php
    ```

2. **Деинсталляторы**

    Эти файлы подключаются только во время удаления плагина. Подразумевается, что в это время должны быть удалены созданные таблицы в БД, а также наработанные временные файлы

     ```text
    crmZarplata/uninstall.php
    ```
    

### Для модулей

Требуется разместить файл в папку с модулем с соблюдением правила названия файлов. Файлы должны именоваться из 2-х частей:

> - 1 часть. Обозначение принадлежности к хуку: **hook_**
> - 2 часть. Наименование модуля: **modulename**
    
Конечный вид составляет следующую конструкцию:

     ```
    Projects/hook_projects.php
    ```


## Поддерживаемые Хуки

<a id="plugin_activate"></a>

### Хук подключения/отключения/удаления плагинов

- **plugin_activate** - активация плагина

```php
$hooks -> add_action( "plugin_activate", "activate_useronline" );
function activate_useronline($argv = []) {

	$database = $GLOBALS['database'];
	$sqlname  = $GLOBALS['sqlname'];
	$db       = $GLOBALS['db'];
	$rootpath = $GLOBALS['rootpath'];

	//если таблицы нет, то создаем её
	$da = $db -> getOne("SELECT COUNT(*) as count FROM INFORMATION_SCHEMA.STATISTICS WHERE table_schema = '$database' and TABLE_NAME = '{$sqlname}useronline'");
	if ($da == 0) {

		$mes = array();

		try {

			$db -> query("
			CREATE TABLE `{$sqlname}useronline` (
				`id` INT(20) NOT NULL AUTO_INCREMENT,
				`datum` DATETIME NOT NULL COMMENT 'время последней активности',
				`iduser` INT(10) NOT NULL DEFAULT '0' COMMENT 'id сотрудника',
				`status` VARCHAR(10) NOT NULL DEFAULT 'offline' COMMENT 'статус сотрудника',
				`identity` INT(10) NOT NULL DEFAULT '1',
				PRIMARY KEY (`id`)
			)
			COMMENT='Хранилище статусов пользователей: online/offline'
			ENGINE=InnoDB
		");

		}
		catch (Exception $e) {

			$mes[] = 'Ошибка'.$e -> getMessage().' в строке '.$e -> getCode();

		}

	}

	file_put_contents($rootpath."/cash/actions.log", json_encode_cyr($argv));

}
```

- **plugin_deactivate** - деактивация плагина

```php
$hooks -> add_action( 'plugin_deactivate', 'deactivate_useronline' );
function deactivate_useronline($argv = []) {
}
```

- **plugin_uninstall** - удаление плагина

```php
$hooks -> add_action( 'plugin_uninstall', 'uninstall_useronline' );
function uninstall_useronline($argv = []) {
}
```

- **plugin_update** - обновление плагина

```php
$hooks -> add_action( 'plugin_update', 'update_useronline' );
function update_useronline($argv = []) {
}
```

где $argv - массив с названием плагина ["name" => "my_plugin"], по которому можно определить, что производятся действия именно с указанным плагином

<a id="module_activate"></a>

### Хук подключения/отключения/удаления модулей

- **module_activate** - активация модуля
```php
$hooks -> add_action( "module_activate", "activate_xmodule" );
function activate_xmodule($argv = '') {
}
```

- **module_deactivate** - деактивация модуля
```php
$hooks -> add_action( 'module_deactivate', 'deactivate_xmodule' );
function deactivate_xmodule($argv = '') {
}
```

где $argv - код модуля

todo: добавить поддержку версий модулей и обновление


<a id="add_css"></a>

### Подключение css, js и элементы к интерфейсу

- **main__css** - для подключения css-файлов к проекту в основном окне
- **card__css** - для подключения css-файлов к проекту в карточках
- **main__js**  - для подключения собственных js-скриптов к проекту в основном окне
- **card__js**  - для подключения собственных js-скриптов к проекту в карточках
- **main__body** - для подключения файлов к проекту в основном окне
- **card__body** - для подключения файлов к проекту в карточках


**Примеры:**

```php
$hooks -> add_action( 'main__css', 'css_main_useronline' );
function css_main_useronline(){
	print "<link rel=\"stylesheet\" type=\"text/css\" href=\"/plugins/userOnline/css/uo.css\">\n";
}
```

```php
$hooks -> add_action( 'main__js', 'js_main_useronline' );
function js_main_useronline(){
	print "<script type=\"text/javascript\" src=\"/plugins/userOnline/js/uo.js\"></script>\n";
}
```

### Уведомления ( Notify )

- **add_custom_notify** - добавление собственного типа уведомлений (фильтр)
    - в качестве параметра приходит массив событий в виде пар **"событие" => "Название"**
    - необходимо дополнить массив своим значением и вернуть обратно

**Пример:**

```php
$hooks -> add_filter( 'add_custom_notify', 'project_notify' );
function project_notify($events = []) {
	$events = array_merge($events, ["project" => "Проекты"]);
	return $events;
}
```

- **add_custom_notify_icon** - добавление собственной иконки для уведомлений (фильтр)
    - в качестве параметра приходит массив:
       - **ключ-имя** (например, project):
         - icon - код из шрифта (см. /font/fontello/)
         - color - css-класс из набора blue, broun, green, red, orange, fiolet, deepblue, gray2 (см. /css/style.crm.new.css)
    - необходимо дополнить массив своим значением и вернуть обратно

**Пример:**

```php
$hooks -> add_filter( 'add_custom_notify_icon', 'project_notify_icon' );
function project_notify_icon($icons = []) {
	$icons["project"] = [
		"icon"  => "icon-tools",
		"color" => "deepblue"
	];
	return $icons;
}
```

### Уведомления ( Email )

- **add_custom_notify** - добавление собственного типа подписок (фильтр)
    - в качестве параметра приходит массив событий в виде пар **"событие" => "Название"**
    - необходимо дополнить массив своим значением и вернуть обратно

**Пример:**

```php
function comments_subscription($events = []) {

	$events["comments.new"]   = "Обсуждение. Новое обсуждение";
	$events["comments.answer"] = "Обсуждение. Новый ответ";

	return $events;

}
```

<a id="hooks_task"></a>

### Напоминания

Фильтры и действия, связанные с Напоминаниями. Позволяют добавлять свои элементы в форму напоминаний, изменять их перед сохранением Напоминания, а также выполнять собственные действия.

- **form_task_userfilter** - фильтр списка сотрудников (фильтр)
    - array **post** - входящие данные - массив данных по Напоминанию ($_REQUEST)
    - следует вернуть массив с двумя значениями:
      - str **users** - перечисление iduser с разделителем (,)
      - array **selected** - массив выбранных значений


- **task_form_before** - блок перед формой напоминания
    - array **post** - входящие данные ($_REQUEST):
        - int **tid**  - id напоминания, если новое, то не указано
        - int **clid** - id клиента
        - int **did**  - id сделки
        - int **pid**  - id контакта


- **task_form_after** - блок после формы напоминания 
    - array **post** - входящие данные ($_REQUEST):
        - int **tid**  - id напоминания, если новое, то не указано
        - int **clid** - id клиента
        - int **did**  - id сделки
        - int **pid**  - id контакта


- **task_form_doit_before** - блок перед формой выполнения напоминания
    - входящие данные ($_REQUEST):
        - int **tid**  - id напоминания, если новое, то не указано
        - int **clid** - id клиента
        - int **did**  - id сделки
        - int **pid**  - id контакта
        

- **task_form_doit_after** - блок после формы выполнения напоминания
    - array **post** - входящие данные ($_REQUEST):
        - int **tid**  - id напоминания, если новое, то не указано
        - int **clid** - id клиента
        - int **did**  - id сделки
        - int **pid**  - id контакта


- **task_addfilter** - выполнение функции перед добавлением напоминания (фильтр)
    - array **post** - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки
    - выполняется также при сохранении Экспресс-формы, Обращения, обработки Заявки


- **task_editfilter** - выполнение функции перед сохранением изменений напоминания (фильтр)
    - array **post** - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки
    

- **task_doitfilter** - выполнение функции перед сохранением выполнения напоминания (фильтр)
    - array **post** - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **task_add** - выполнение функции после добавления напоминания
    - входящие данные 
        - array **post** - массив всех пришедших из формы данных ($_REQUEST)
        - array **taskdata** - массив данных для Напоминания
    - здесь обрабатываем данные как нам нужно
    - выполняется также при сохранении Экспресс-формы, Обращения, обработки Заявки
    

- **task_edit** - выполнение функции после сохранения изменений напоминания
    - входящие данные 
        - array **post** - массив всех пришедших из формы данных ($_REQUEST)
        - array **taskdata** - массив данных для Напоминания
    - здесь обрабатываем данные как нам нужно


- **task_doit** - выполнение напоминания
    - входящие данные 
        - array **post** - массив всех пришедших из формы данных ($_REQUEST)
        - array **taskdata** - массив данных для Напоминания
    - здесь обрабатываем данные как нам нужно
    

- **task_view** - просмотр напоминания
    - входящие данные 
        - int **tid** - id напоминания


- **task_delete** - удаление напоминания
    - входящие данные 
        - int **tid** - id напоминания


- **task_change_date** - изменение даты (перетаскиванием)
    - входящие данные
        - array - массив данных ($_REQUEST)
            - int **tid** - id напоминания
            - date **datum** - новая дата
            - time **totime** - новое время
            
<a id="hooks_history"></a>

### Активности

Фильтры и действия, связанные с Активностями. Позволяют добавлять свои элементы в форму Активности, изменять перед сохранением Активности, а также выполнять собственные действия.

> Хуки для форм действуют только в форме добавления Активности

- **history_form_before** - блок перед формой Активности
    - array **post** - входящие данные ($_REQUEST):
        - int **сid**  - id записи активности, если новое, то не указано
        - int **clid** - id клиента
        - int **did**  - id сделки
        - int **pid**  - id контакта


- **history_form_after** - блок после формы Активности 
    - array **post** - входящие данные ($_REQUEST):
        - int **tid**  - id напоминания, если новое, то не указано
        - int **clid** - id клиента
        - int **did**  - id сделки
        - int **pid**  - id контакта


- **history_addfilter** - выполнение функции перед добавлением Активности (фильтр)
    - array **post** - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки
    - выполняется также при сохранении Экспресс-формы, Обращения, обработки Заявки


- **history_editfilter** - выполнение функции перед сохранением изменений напоминания (фильтр)
    - array **post** - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **history_add** - выполнение функции после добавления Активности
    - входящие данные 
        - array **post** - массив всех пришедших из формы данных ($_REQUEST)
        - array **taskdata** - массив данных для Напоминания
    - здесь обрабатываем данные как нам нужно
    - выполняется также при сохранении Экспресс-формы, Обращения, обработки Заявки
    

- **history_edit** - выполнение функции после сохранения изменений Активности
    - входящие данные 
        - array **post** - массив всех пришедших из формы данных ($_REQUEST)
        - array **taskdata** - массив данных для Напоминания
    - здесь обрабатываем данные как нам нужно


- **history_delete** - удаление Активности
    - входящие данные 
        - int **id** - id Активности

<a id="hooks_client"></a>

### Клиент

Фильтры и действия, связанные с Клиентом. Позволяют добавлять свои элементы в форму Клиента, изменять их перед сохранением Клиента, а также выполнять собственные действия.

- **client_form_express_before** - блок перед экспресс-формой
      - входящие данные ($_REQUEST)


- **client_form_express_after** - блок после экспресс-формы
    - входящие данные ($_REQUEST)


- **client_form_before** - блок перед формой клиента
    - входящие данные ($_REQUEST)


- **client_form_after** - блок после формы клиента 
    - входящие данные ($_REQUEST)


- **client_addfilter** - выполнение функции перед добавлением клиента (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки
    - выполняется также при сохранении Экспресс-формы, Обращения, обработки Заявки


- **client_editfilter** - выполнение функции перед сохранением изменений клиента (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки
    - выполняется также при сохранении Экспресс-формы, Обращения, обработки Заявки


- **client_add** - выполнение функции после добавления клиента
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **clientdata** - массив данных для Клиента
    - здесь обрабатываем данные как нам нужно
    - выполняется также при сохранении Экспресс-формы, Обращения, обработки Заявки
    

- **client_edit** - выполнение функции после сохранения изменений напоминания
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
                2. array **clientdata** - массив данных для Клиента
    - здесь обрабатываем данные как нам нужно
    - выполняется также при сохранении Экспресс-формы, Обращения, обработки Заявки
    

- **client_view** - просмотр Клиента
    - входящие данные 
        - int **clid** - id Клиента

- **client_card_field** - блок информации по клиенту в карточке клиента
    - входящие данные
        - int **clid** - id Клиента

- **client_delete** - удаление Клиента
    - входящие данные 
        - int **clid** - id Клиента


- **client_change_user** - выполнение функции после сохранения изменения ответственного за клиента
    - входящие данные 
        - array - массив данных ($_REQUEST), в т.ч.
            - int **clid** - id Клиента
            - int **newuser** - iduser нового ответственного
            - str **reason** - комментарий


- **client_change_recvisites** - выполнение функции после сохранения изменения реквизитов клиента
    - входящие данные 
        - array - массив данных ($_REQUEST)


- **client_change_dostup** - выполнение функции после сохранения изменения доступов к карточке клиента
    - входящие данные 
        - array - массив данных ($_REQUEST)


- **client_change_relation** - выполнение функции после сохранения изменения типа отношений клиента
    - входящие данные 
        - array - массив данных ($_REQUEST)

- **client_change_priceLevel** - выполнение функции после сохранения изменения уровня цен
    - входящие данные 
        - array - массив данных ($_REQUEST), в т.ч.
            - str **priceLevel** - новый уровень цен
            - str **oldLevel** - старый уровень цен

<a id="hooks_contact"></a>

### Контакт

Фильтры и действия, связанные с Контактами. Позволяют добавлять свои элементы в форму Контакта, изменять их перед сохранением Контакта, а также выполнять собственные действия.

- **person_form_before** - блок перед формой Контакта
    - входящие данные ($_REQUEST)


- **person_form_after** - блок после формы Контакта 
    - входящие данные ($_REQUEST)


- **person_addfilter** - выполнение функции перед добавлением Контакта (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки
    - выполняется также при сохранении Экспресс-формы, Обращения, обработки Заявки


- **person_editfilter** - выполнение функции перед сохранением изменений Контакта (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки
    - выполняется также при сохранении Экспресс-формы, Обращения, обработки Заявки


- **person_add** - выполнение функции после добавления клиента
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **persondata** - массив данных для Контакта
    - здесь обрабатываем данные как нам нужно
    - выполняется также при сохранении Экспресс-формы, Обращения, обработки Заявки
    

- **person_edit** - выполнение функции после сохранения изменений напоминания
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **persondata** - массив данных для Контакта
    - здесь обрабатываем данные как нам нужно
    - выполняется также при сохранении Экспресс-формы, Обращения, обработки Заявки
    

- **person_view** - просмотр Контакта
    - входящие данные 
        - int **pid** - id Контакта


- **person_delete** - удаление Контакта
    - входящие данные 
        - int **pid** - id Контакта

<a id="hooks_deal"></a>

### Сделка

Фильтры и действия, связанные со Сделкой. Позволяют добавлять свои элементы в форму Сделки, изменять их перед сохранением Сделки, а также выполнять собственные действия.

- **deal_form_before** - блок перед формой Сделки
    - входящие данные ($_REQUEST)


- **deal_form_after** - блок после формы Сделки 
    - входящие данные ($_REQUEST)


- **deal_form_close_before** - блок перед формой закрытия Сделки
    - входящие данные ($_REQUEST)


- **deal_form_close_after** - блок после формы закрытия Сделки 
    - входящие данные ($_REQUEST)


- **deal_form_changestep_before** - блок перед формой изменения этапа Сделки
    - входящие данные ($_REQUEST)


- **deal_form_changestep_after** - блок после формы изменения этапа Сделки 
    - входящие данные ($_REQUEST)


- **deal_addfilter** - выполнение функции перед добавлением Сделки (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки
    - выполняется также при добавлении сделки через Заявку и Обращение


- **deal_editfilter** - выполнение функции перед сохранением изменений Сделки (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки
    - выполняется также при добавлении сделки через Заявку и Обращение


- **deal_add** - выполнение функции после добавления Сделки
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **dealdata** - массив данных для Сделки
    - здесь обрабатываем данные как нам нужно
    - выполняется также при добавлении сделки через Заявку и Обращение
    

- **deal_edit** - выполнение функции после сохранения изменений Сделки
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **dealdata** - массив данных для Сделки
    - здесь обрабатываем данные как нам нужно
    - выполняется также при добавлении сделки через Заявку и Обращение
    

- **deal_view** - просмотр Сделки
    - входящие данные 
        - int **did** - id Сделки

- **deal_card_field** - блок информации по сделке в карточке сделки
    - входящие данные
        - int **did** - id Сделки

- **deal_delete** - удаление Сделки
    - входящие данные 
        - int **did** - id Сделки


- **deal_restore** - восстановление Сделки
    - входящие данные 
        - int **did** - id Сделки

- **deal_freeze** - заморозка/разморозка Сделки
  - входящие данные
    - int **did** - id Сделки
    - string **date** - Дата разморозки (указывается для заморозки)

- **deal_close** - закрытие Сделки
    - входящие данные 
        - array - массив данных ($_REQUEST)


- **deal_change_step** - выполнение функции после сохранения изменения этапа Сделки
    - входящие данные 
        - array - массив данных ($_REQUEST), в т.ч.
            - int **did** - id Сделки
            - int **iduser** - iduser автора события
            - str **reason** - комментарий
            - int **step** - id нового этапа
            - int **stepOld** - id старого этапа
            - str **stepValue** - значение нового этапа, %
            - int **stepValueOld** - значение старого этапа, %


- **deal_change_user** - выполнение функции после сохранения изменения ответственного за Сделку
    - входящие данные 
        - array - массив данных ($_REQUEST), в т.ч.
            - int **did** - id Сделки
            - int **newuser** - iduser нового ответственного
            - str **reason** - комментарий


- **deal_change_dostup** - выполнение функции после сохранения изменения доступов к карточке Сделки
    - входящие данные 
        - array - массив данных ($_REQUEST)


- **deal_change_datumplan** - выполнение функции после сохранения изменения плановой даты Сделки
    - входящие данные 
        - array - массив данных ($_REQUEST)

<a id="hooks_speka"></a>

### Спецификация

Фильтры и действия, связанные со Спецификацией. Позволяют добавлять свои элементы в форму, изменять их перед сохранением Спецификации, а также выполнять собственные действия.

- **speka_form_before** - блок перед формой Спецификации
    - входящие данные ($_REQUEST)


- **speka_form_after** - блок после формы Спецификации 
    - входящие данные ($_REQUEST)


- **speka_addfilter** - выполнение функции перед добавлением позиции Спецификации (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **speka_editfilter** - выполнение функции перед сохранением изменений позиции Спецификации (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **speka_add** - выполнение функции после добавления позиции Спецификации
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **spekadata** - массив данных для Спецификации
    - здесь обрабатываем данные как нам нужно
    

- **speka_edit** - выполнение функции после сохранения изменений позиции Спецификации
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **spekadata** - массив данных для Спецификации
    - здесь обрабатываем данные как нам нужно


- **speka_delete** - удаление позиции Спецификации
    - входящие данные 
        - int **id** - id позиции Спецификации

<a id="hooks_invoices"></a>

### Счета

Фильтры и действия, связанные со Счетами. Позволяют добавлять свои элементы в форму, изменять их перед сохранением Счетов, а также выполнять собственные действия.

- **invoice_form_before** - блок перед формой добавления/редактирования Счета
    - входящие данные ($_REQUEST)


- **invoice_form_after** - блок после формы добавления/редактирования Счета 
    - входящие данные ($_REQUEST)


- **invoice_addfilter** - выполнение функции перед добавлением Счета (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **invoice_editfilter** - выполнение функции перед сохранением изменений Счета (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **invoice_add** - выполнение функции после добавления Счета
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **invoicedata** - массив данных для Счета
    - здесь обрабатываем данные как нам нужно
    

- **invoice_edit** - выполнение функции после сохранения изменений Счета
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **invoicedata** - массив данных для Счета
    - здесь обрабатываем данные как нам нужно


- **invoice_form_express_before** - блок перед формой внесения оплаты (Счет + фиксация Оплаты)
    - входящие данные ($_REQUEST)


- **invoice_form_express_after** - блок после формы внесения оплаты (Счет + фиксация Оплаты)
    - входящие данные ($_REQUEST)

- **invoice_express_filter** - выполнение функции перед внесением оплаты (Счет + фиксация Оплаты)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки
    

- **invoice_express** - выполнение функции после внесения оплаты (Счет + фиксация Оплаты)
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **invoicedata** - массив данных для Счета
    - здесь обрабатываем данные как нам нужно
    

- **invoice_form_do_before** - блок перед формой отметки Счета оплаченным
    - входящие данные ($_REQUEST)


- **invoice_form_do_after** - блок после формы отметки Счета оплаченным
    - входящие данные ($_REQUEST)
    

- **invoice_dofilter** - выполнение фильтра перед отметкой Счета оплаченным (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки
    

- **invoice_do** - выполнение функции после отметки Счета оплаченным Счета
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **invoicedata** - массив данных для Счета
    - здесь обрабатываем данные как нам нужно


- **invoice_undo** - отмена оплаты счета (доступно с релиза 27072023)
    - входящие данные
        1. int **id** - id счета
        2. array **invoicedata** - массив данных
            - did сделки
            - autor - пользователь, выполнивший сделку
    - здесь обрабатываем данные как нам нужно


- **invoice_delete** - удаление Счета
    - входящие данные 
        - int **id** - id Счета

- **invoice_getfilter** - выполнение фильтра перед генерацией Счета
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки, дополнив или заменив их своими (например, массив tagsAttached)


<a id="hooks_akt"></a>

### Акты

Фильтры и действия, связанные с Актами. Позволяют добавлять свои элементы в форму, изменять их перед сохранением Актов, а также выполнять собственные действия.

- **akt_form_before** - блок перед формой добавления/редактирования Акта
    - входящие данные ($_REQUEST)


- **akt_form_after** - блок после формы добавления/редактирования Акта 
    - входящие данные ($_REQUEST)
    

- **akt_addfilter** - выполнение функции перед добавлением Акта (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **akt_editfilter** - выполнение функции перед сохранением изменений Акта (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **akt_add** - выполнение функции после добавления Акта
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **aktdata** - массив данных для Акта
    - здесь обрабатываем данные как нам нужно
    

- **akt_edit** - выполнение функции после сохранения изменений Акта
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **aktdata** - массив данных для Акта
    - здесь обрабатываем данные как нам нужно


- **akt_delete** - удаление Акта
    - входящие данные 
        - int **id** - id Акта

- **akt_tags_filter** - выполнение функции перед генерацией Акта (фильтр)
    - входящие данные
        1. array **tags** - массив тегов для Акта
    - следует вернуть эти данные после обработки


<a id="hooks_docs"></a>

### Документы

Фильтры и действия, связанные с Документами. Позволяют добавлять свои элементы в форму, изменять их перед сохранением Документов, а также выполнять собственные действия.

- **document_form_before** - блок перед формой добавления/редактирования Документа
    - входящие данные ($_REQUEST)


- **document_form_after** - блок после формы добавления/редактирования Документа 
    - входящие данные ($_REQUEST)


- **document_number_filter** - фильтр дает возможность изменить номер документа
    - входящие данные
      - string **type** - тип документа
        - **get_dogovor** - если создается договор
        - **invoice** - если создается счет
        - **get_akt** - если создается акт приема-передачи
        - **get_aktper** - если создается акт приема-передачи для сервисных сделок
      - int **idtype** - id типа документа (таблица contract_type)
      - int **did** - id сделки
    - здесь обрабатываем данные как нам нужно и возвращаем массив, содержащий:
        - int **number** - номер документа до применения шаблона формата номера
        - string **format** - формат номера (если нужен) [пример: {cnum}-{MM}{YY}/{YYYY}]
    

- **document_addfilter** - выполнение функции перед добавлением Документа (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **document_editfilter** - выполнение функции перед сохранением изменений Документа (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **document_add** - выполнение функции после добавления Документа
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **docdata** - массив данных для Документа
    - здесь обрабатываем данные как нам нужно
    

- **document_edit** - выполнение функции после сохранения изменений Документа
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **docdata** - массив данных для Документа
    - здесь обрабатываем данные как нам нужно


- **document_generate_filter** - коррекция данных Документа перед генерацией (фильтр)
    - входящие данные 
        1. array **docdata** - массив данных для генерации Документа
    - следует вернуть эти данные после обработки

- **document_tags_filter** - выполнение функции перед генерацией Документа (фильтр)
    - входящие данные
        1. array **tags** - массив тегов для Документа
    - следует вернуть эти данные после обработки

- **document_generate** - генерация Документа
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **docdata** - массив данных
            - file - сгенерированный файл
            - name - имя файла
            - deid - id документа
    - здесь обрабатываем данные как нам нужно


- **document_send_filter** - выполнение функции перед отправкой Документа по email
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **docdata** - массив данных
    - здесь обрабатываем данные как нам нужно


- **document_send** - выполнение функции после отправки Документа по email
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **docdata** - массив данных
    - здесь обрабатываем данные как нам нужно


- **document_delete** - удаление Документа
    - входящие данные 
        - int **id** - id Документа

<a id="hooks_entry"></a>

### Обращения

Фильтры и действия, связанные с Обращениями. Позволяют добавлять свои элементы в форму, изменять их перед добавлением Обращений, а также выполнять собственные действия.

- **entry_form_before** - блок перед формой Обращения
    - входящие данные ($_REQUEST)


- **entry_form_after** - блок после формы Обращения 
    - входящие данные ($_REQUEST)


- **entry_addfilter** - выполнение функции перед добавлением Обращения (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **entry_editfilter** - выполнение функции перед сохранением изменений Обращения (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **entry_add** - выполнение функции после добавления Обращения
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **entrydata** - массив данных для Обращения
    - здесь обрабатываем данные как нам нужно
    

- **entry_edit** - выполнение функции после сохранения изменений напоминания
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
                2. array **entrydata** - массив данных для Обращения
    - здесь обрабатываем данные как нам нужно

<a id="hooks_leads"></a>

### Контрольные точки (КТ)

Действия, связанные с КТ. Позволяют изменять данные перед обработкой, а также выполнять собственные действия.

- **cp_addfilter** - выполнение функции перед добавлением КТ (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки

- **cp_editfilter** - выполнение функции перед сохранением изменений КТ (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки

- **cp_add** - выполнение функции после добавления КТ
    - входящие данные
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **data** - массив данных для КТ
    - здесь обрабатываем данные как нам нужно

- **cp_edit** - выполнение функции после сохранения изменений КТ
    - входящие данные
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **data** - массив данных для КТ
    - здесь обрабатываем данные как нам нужно

- **cp_doit** - выполнение функции после выполнения КТ
    - входящие данные
        1. int **id** - id КТ
        2. array **data** - массив данных для КТ
    - здесь обрабатываем данные как нам нужно

- **cp_undoit** - восстановление КТ
    - входящие данные
        - int **id** - id КТ

- **cp_delete** - удаление КТ
    - входящие данные
        - int **id** - id КТ

### Заявки

Фильтры и действия, связанные с Заявками. Позволяют добавлять свои элементы в форму, изменять их перед обработкой Заявок, а также выполнять собственные действия.

- **lead_form_before** - блок перед формой добавления/редактирования Заявки
    - входящие данные ($_REQUEST)


- **lead_form_after** - блок после формы добавления/редактирования Заявки
    - входящие данные ($_REQUEST)


- **lead_addfilter** - выполнение функции перед добавлением Заявки (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **lead_editfilter** - выполнение функции перед сохранением изменений Заявки (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **lead_add** - выполнение функции после добавления Заявки
    - входящие данные
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **leaddata** - массив данных для Заявки
    - здесь обрабатываем данные как нам нужно


- **lead_edit** - выполнение функции после сохранения изменений Заявки
    - входящие данные
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **leaddata** - массив данных для Заявки
    - здесь обрабатываем данные как нам нужно


- **lead_workitform_before** - блок перед формой обработки Заявки
    - входящие данные ($_REQUEST)


- **lead_workitform_after** - блок после формы обработки Заявки
    - входящие данные ($_REQUEST)


- **lead_workitfilter** - выполнение функции перед обработкой Заявки (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **lead_workit** - выполнение функции после обработки Заявки
    - входящие данные
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **leaddata** - массив данных для Заявки
    - здесь обрабатываем данные как нам нужно


- **lead_delete** - удаление Заявки
    - входящие данные
        - int **id** - id Акта


- **lead_setuserform_before** - блок перед формой обработки Заявки
    - входящие данные ($_REQUEST)


- **lead_setuserform_after** - блок после формы обработки Заявки
    - входящие данные ($_REQUEST)


- **lead_setuserfilter** - выполнение функции перед обработкой Заявки (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **lead_setuser** - выполнение функции после обработки Заявки ( если назначается куратор )
    - входящие данные
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **leaddata** - массив данных для Заявки
    - здесь обрабатываем данные как нам нужно


- **lead_close** - выполнение функции после обработки Заявки ( если заявка закрывается )
    - входящие данные
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **leaddata** - массив данных для Заявки
    - здесь обрабатываем данные как нам нужно


<a id="hooks_project"></a>

### Проекты

Фильтры и действия, связанные с Проектами. Позволяют добавлять свои элементы в форму, изменять их перед сохранением Проектов, а также выполнять собственные действия.

- **project_form_before** - блок перед формой добавления/изменения Проекта
    - входящие данные ($_REQUEST)


- **project_form_after** - блок после формы добавления/изменения Проекта
    - входящие данные ($_REQUEST)


- **project_addfilter** - выполнение функции перед добавлением Проекта (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **project_editfilter** - выполнение функции перед сохранением изменений Проекта (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **project_add** - выполнение функции после добавления Проекта
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **projectdata** - массив данных для Проекта
    - здесь обрабатываем данные как нам нужно
    

- **project_edit** - выполнение функции после изменения Проекта
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **projectdata** - массив данных для Проекта
    - здесь обрабатываем данные как нам нужно


- **project_delete** - удаление Проекта
    - входящие данные 
        - int **id** - id Проекта


- **project_statusform_before** - блок перед формой изменения статуса Проекта
    - входящие данные ($_REQUEST)


- **project_statusform_after** - блок после формы изменения статуса Проекта
    - входящие данные ($_REQUEST)


- **project_statusfilter** - выполнение функции перед сохранением изменений статуса Проекта (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **project_status** - выполнение функции после изменения статуса Проекта
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **projectdata** - массив данных для Проекта
    - здесь обрабатываем данные как нам нужно


- **projectwork_form_before** - блок перед формой добавления/изменения Работы
    - входящие данные ($_REQUEST)


- **projectwork_form_after** - блок после формы добавления/изменения Работы
    - входящие данные ($_REQUEST)


- **projectwork_addfilter** - выполнение функции перед добавлением Работы (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **projectwork_editfilter** - выполнение функции перед сохранением изменений Работы (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **projectwork_add** - выполнение функции после добавления Работы
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **workdata** - массив данных для Работы
    - здесь обрабатываем данные как нам нужно
    

- **projectwork_edit** - выполнение функции после изменения Работы
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **workdata** - массив данных для Работы
    - здесь обрабатываем данные как нам нужно


- **projectwork_delete** - удаление Работы
    - входящие данные 
        - int **id** - id Работы


- **projectwork_statusform_before** - блок перед формой изменения статуса Работы
    - входящие данные ($_REQUEST)


- **projectwork_statusform_after** - блок после формы изменения статуса Работы
    - входящие данные ($_REQUEST)


- **projectwork_statusfilter** - выполнение функции перед сохранением изменений статуса Работы (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **projectwork_status** - выполнение функции после изменения статуса Работы
    - входящие данные 
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **workdata** - массив данных для Работы
    - здесь обрабатываем данные как нам нужно

<a id="hooks_budjet"></a>

### Бюджет

Фильтры и действия, связанные с Бюджетом. Позволяют добавлять свои элементы в форму, изменять их перед сохранением, а также выполнять собственные действия.

- **budjet_form_before** - блок перед формой добавления/редактирования/клонирования Расхода
    - входящие данные ($_REQUEST)


- **budjet_form_after** - блок после формы добавления/редактирования Расхода
    - входящие данные ($_REQUEST)


- **budjet_addfilter** - выполнение функции перед добавлением Расхода (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **budjet_editfilter** - выполнение функции перед сохранением изменений Расхода (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **budjet_add** - выполнение функции после добавления Расхода
    - входящие данные
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **budjetdata** - массив данных для Расхода
    - здесь обрабатываем данные как нам нужно


- **budjet_edit** - выполнение функции после сохранения изменений Расхода
    - входящие данные
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **budjetdata** - массив данных для Расхода
    - здесь обрабатываем данные как нам нужно


- **budjet_moveform_before** - блок перед формой перемещения средств
    - входящие данные ($_REQUEST)


- **budjet_moveform_after** - блок после формы перемещения средств
    - входящие данные ($_REQUEST)


- **budjet_movefilter** - выполнение функции перед перемещением средств (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **budjet_move** - выполнение функции после перемещения средств
    - входящие данные
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **budjetdata** - массив данных для Расхода
    - здесь обрабатываем данные как нам нужно


- **budjet_unmove** - выполнение функции после отмены перемещения средств
    - входящие данные
        - int **id** - id Расхода
    - здесь обрабатываем данные как нам нужно


- **budjet_do** - выполнение функции после проведения Расхода
    - входящие данные
        - int **id** - id Расхода
    - здесь обрабатываем данные как нам нужно


- **budjet_undo** - выполнение функции после отмены проведения Расхода
    - входящие данные
        - int **id** - id Расхода
    - здесь обрабатываем данные как нам нужно


- **budjet_delete** - удаление Расхода
    - входящие данные
        - int **id** - id Расхода


<a id="hooks_cards"></a>

### Карточки

В этом разделе описаны возможности вставки своих элементов в карточки Клиентов, Контактов, Сделок

- **card_tab** - массив данных, требуемый для добавления новой вкладки
    - входящие данные
        - str **type** - тип карточки: client, contact, deal, project, workplan
        - int **id**   - id записи, соответственно: clid, pid, did, projectid, id
    - ожидаемые данные
        - array **tab**
            - str **name**  - имя вкладки ( латиница, без пробелов )
            - str **title** - название вкладки ( отображается )
            - str **icon**  - класс иконки ( см. /font/fontello/demo.html )
            - str **url**   - адрес скрипта, загружаемого во вкладку

**Пример применения:**

```php
$hooks -> add_filter( "card_tab", "schat_card_tab" );

function schat_card_tab($tab = [], $params = []){
	
	if($params['type'] == 'client' && $params['clid'] > 0){
	
        $tab[] = [
            "name"  => "schat",
            "title" => "Диалоги",
            "class" => "",
            "icon"  => "icon-chat",
            "url"   => "/socialChats/php/card.php"
        ];
    
    }
	
	return $tab;

}
```

### Прайс

Фильтры и действия, связанные с Прайсом. Позволяют добавлять свои элементы в форму Прайса, изменять их перед сохранением Прайса, а также выполнять собственные действия.

- **price_form_before** - блок перед формой Прайса
    - входящие данные ($_REQUEST)


- **price_form_after** - блок после формы Прайса
    - входящие данные ($_REQUEST)


- **price_formfield_before** - выполнение функции перед формой изменения поля Прайса (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **price_formfield_after** - выполнение функции после формы изменением поля Прайса (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **price_addfield** - выполнение функции после добавления поля Прайса
    - входящие данные
        1. array **data** - массив данных для добавления поля
    - здесь обрабатываем данные как нам нужно


- **price_addfilter** - выполнение функции перед добавлением Прайса (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **price_editfilter** - выполнение функции перед сохранением изменений Прайса (фильтр)
    - входящие данные - массив данных ($_REQUEST)
    - следует вернуть эти данные после обработки


- **price_add** - выполнение функции после добавления Прайса
    - входящие данные
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **data** - массив данных для Прайса
    - здесь обрабатываем данные как нам нужно


- **price_edit** - выполнение функции после сохранения изменений Прайса
    - входящие данные
        1. array **post** - массив всех пришедших из формы данных ($_REQUEST)
        2. array **data** - массив данных для Прайса
    - здесь обрабатываем данные как нам нужно


- **price_delete** - удаление Прайса
    - входящие данные
        - int **did** - id Прайса

