#pragma once

#ifndef APL_WORKFLOW_MGR_NOAUTOLIB
#ifdef _DEBUG
#ifdef UNICODE
#pragma comment (lib,"aplWorkFlowMgr_ud.lib")
#else
#pragma comment (lib,"aplWorkFlowMgrD.lib")
#endif
#else
#ifdef UNICODE
#pragma comment (lib,"aplWorkFlowMgr_u.lib")
#else
#pragma comment (lib,"aplWorkFlowMgr.lib")
#endif
#endif
#endif

#include "StepData.h"
#include "aplNetStepData.h"
#include "aplStepManager.h"

class AFX_EXT_CLASS CaplWorkFlowManager : public CaplDeclareWorkflowManager
{
	// Инициализация 
public:
	/** Инициализирует класс (Ассоциация с классом базы данных) <p>
		@return true при удачном выполнении и false в случае ошибки */
	bool Attach(CaplAPI *api);
	void Detach();

public:
	CaplEntity* e_action; ///< Идентификация объектов (корневой объект)
	CaplAttr* a_action_id;	///< Обозначение
	CaplAttr* a_action_name; ///< Наименование
	CaplAttr* a_action_dscr; ///< Описание

	CaplEntity* e_proc_tmpl; ///< Шаблон процесса
	CaplAttr* a_proc_tmpl_state; ///< Состояние шаблона процесса
	CaplAttr* a_proc_tmpl_var; ///< Массив переменных шаблона процесса (не реализовано)
	CaplAttr* a_proc_tmpl_duration; ///< Длительность выполнения шаблона процесса
	CaplAttr* a_proc_tmpl_holders; ///< Список сотрудников, имеющих право запускать процессы по данному шаблону
	CaplAttr* a_proc_tmpl_managers; ///< Список сотрудников, имеющих право контролировать процесс
	CaplAttr* a_proc_tmpl_editor; ///< Сотрудник редактирующий в настоящий момент
	CaplAttr* a_proc_tmpl_author_txt; ///< Последний изменивший сотрудник
	CaplAttr* a_proc_tmpl_is_system; ///< Системный или нет щаюлон
	CaplAttr* a_proc_tmpl_add_wo_function;
	CaplAttr* a_proc_tmpl_add_wo_module;
	CaplAttr* a_proc_tmpl_set_enddate_by_task;
	CaplAttr* a_proc_tmpl_allow_owner_end_any_task;

	/**@name Атрибуты для отрисовки шаблона в редакторе шаблонов*/
	CaplAttr* a_proc_tmpl_hight; ///<
	CaplAttr* a_proc_tmpl_width; ///<
	CaplAttr* a_proc_tmpl_cols; ///<
	CaplAttr* a_proc_tmpl_rows; ///<
	CaplAttr* a_proc_tmpl_ortogonal; ///<
	
	CaplEntity* e_act_tmpl; ///<Корневой объект для описания элементов шаблона
	CaplAttr* a_act_tmpl_proc_tmpl; ///<ССылка на шаблон процесса
	
	/**@name Атрибуты для отрисовки действия в редакторе шаблонов*/
	CaplAttr* a_act_tmpl_point; ///<
	CaplAttr* a_act_tmpl_cx; ///<
	CaplAttr* a_act_tmpl_cy; ///<
	CaplAttr* a_act_tmpl_color; ///<
	CaplAttr* a_act_tmpl_font; ///<
	CaplAttr* a_act_tmpl_width; ///<
	
	CaplEntity* e_end_point; ///< Начальная точка шаблона (потомок e_act_tmpl)
	CaplEntity* e_start_point; ///< Конечная точка шаблона (потомок e_act_tmpl)

	CaplEntity* e_activity; ///< Действие шаблона (потомок e_act_tmpl)
	CaplAttr* a_activity_managers; ///< Возможные координаторы
	CaplAttr* a_activity_executors; ///< Возможные исполнители
	CaplAttr* a_activity_role; ///< Роль исполнителя
	CaplAttr* a_activity_duration; ///< Длительность
	CaplAttr* a_activity_waiting_time; ///< Задержка выдачи задания
	CaplAttr* a_activity_not_sign; ///< При завершении не требуется простановка статусов
	CaplAttr* a_activity_stop_another_task; ///< Останавливать другие задачи
	
	CaplAttr* a_activity_sub_proc_tmpl; ///< Список возможных подпроцессов (не реализовано)
	CaplAttr* a_activity_ass_tmpl; ///< Декомпозиция действия (не реализовано)
	
	CaplAttr* a_activity_st_mode; ///< Способ (автоматический или ручной) запуска задания по этому действию
	CaplAttr* a_activity_fn_mode; ///< < Способ (автоматический или ручной) завершения задания по этому действию
	
	CaplAttr* a_activity_st_cond; ///< Условия для запуска (не реализовано)
	CaplAttr* a_activity_fn_cond; ///< Условия для завершения (не реализовано)
	
	CaplAttr* a_activity_add_wo;
	CaplAttr* a_activity_give_the_process_owner; ///< Выдавать задание владельцу процесса

	CaplAttr* a_activity_ed_st_mod; ///< Внешний модуль
	CaplAttr* a_activity_ed_st_fun; ///< Функция внешнего модуля, вызываемая при запуске
	CaplAttr* a_activity_ed_st_par; ///< Параметр функции внешнего модуля, вызываемая при запуске
	CaplAttr* a_activity_ed_fn_mod; ///< Внешний модуль
	CaplAttr* a_activity_ed_fn_fun; ///< Функция внешнего модуля, вызываемая при завершении
	CaplAttr* a_activity_ed_fn_par; ///< Параметр функции внешнего модуля, вызываемая при завершении
	
	CaplEntity* e_proc_prot; ///< Настройка для автоматической выдачи задания
	CaplAttr* a_proc_prot_tmpl; ///< Ссылка на шаблон
	CaplAttr* a_proc_prot_name; ///< Ссылка на шаблон
	
	CaplEntity* e_task_tmpl; ///< Настройка для автоматической выдачи задания
	CaplAttr* a_task_tmpl_activity; ///< Ссылка на действие
	CaplAttr* a_task_tmpl_performer; ///< Исполнитель
	CaplAttr* a_task_tmpl_performers; ///< Исполнители для выбора координатором
	CaplAttr* a_task_tmpl_manager; ///< Координатор
	CaplAttr* a_task_tmpl_duration; ///< Длительность
	CaplAttr* a_task_tmpl_waiting_time; ///< Задержка запуска задания
	CaplAttr* a_task_tmpl_id; ///< Обозначение задания
	CaplAttr* a_task_tmpl_name; ///< Наименование задания
	CaplAttr* a_task_tmpl_status; ///< Статус (для ГРПЗ)
	CaplAttr* a_task_tmpl_role; ///<  Роль(для ГРПЗ)
	CaplAttr* a_task_tmpl_proc_prot; ///<  Ссылка на настройку процесса

	CaplEntity* e_act_inst; ///< Общие свойства процессов и заданий
	CaplAttr* a_act_inst_start_date; ///< Дата начала выполнения
	CaplAttr* a_act_inst_end_date; ///<  Фактическая дата завершения
	CaplAttr* a_act_inst_check_date; ///< Контрольная дана
	CaplAttr* a_act_inst_finish_date; ///< Планируемая дата завершения
	CaplAttr* a_act_inst_prior; ///< Приоритет выполнения
	CaplAttr* a_act_inst_percent; ///< Процент выполнения
	CaplAttr* a_act_inst_susp_time; ///< Общее время простоя
	CaplAttr* a_act_inst_last_susp_date; ///< Последняя дата остановки
	
	CaplEntity* e_proc;						///< Процесс
	CaplAttr* a_proc_of_tmpl;				///< Ссылка на шаблон процесса
	CaplAttr* a_proc_owner;					///< Владелец процесса (сотрудник, инициировавший процесс)
	CaplAttr* a_proc_manager;				///< Координатор процесса (сотрудник, инициировавший процесс)
	CaplAttr* a_proc_state;					///< Текущее состояние процесса
	CaplAttr* a_proc_task_prot;				///< Массив прототипов заданий 
	CaplAttr* a_proc_process_prot;			///< Ссылка на прототип процесса 
	CaplAttr* a_proc_first_activity;		///< Действие, с которого началось выполнение процесса
	CaplAttr* a_proc_wo;					///< Рабочие объекты процесса
	CaplAttr* a_proc_archive_date;			///< Дата передачи процесса в архив
	CaplAttr* a_proc_not_for_work;			///< Объекты, с которыми не нужно производить действия во время выполнения заданий процесса

	CaplEntity* e_task; ///< Задание
	CaplAttr* a_task_activity; ///< Ссылка на действие
	CaplAttr* a_task_proc; ///< Ссылка на процесс, в котором было выдано задание
	CaplAttr* a_task_state; ///< Текущее состояние задания 
	CaplAttr* a_task_old_state; ///< Состояние задания до приостановки
	CaplAttr* a_task_prev; ///< Предыдущее задание процесса
	CaplAttr* a_task_performer; ///< Исполнитель
	CaplAttr* a_task_manager; ///< Координатор
//	CaplAttr* a_task_wo; ///< (не используется)
	CaplAttr* a_task_sub_proc; ///< Процессы, запущенные для выполнения задания
	CaplAttr* a_task_notify_date; ///< Дата оповещения исполнителя(координатора) о получении задания
	CaplAttr* a_task_reseave_date; ///< Дата подтверждения исполнителем(координатором) получения задания
	CaplAttr* a_task_triggered_relations; ///< Сработавшие переходы
	
	CaplEntity* e_act_rel; ///< Последовательность элементов шаблона
	CaplAttr* a_act_rel_id; ///< Обозначение
	CaplAttr* a_act_rel_name; ///< Наименование
	CaplAttr* a_act_rel_dscr; ///< Описание
	CaplAttr* a_act_rel_from; ///< Ссылка на элемент "от"
	CaplAttr* a_act_rel_to; ///< ССылка на элемент "к"
	
	/**@name Атрибуты для отрисовки переходов в редакторе шаблонов*/
	CaplAttr* a_act_rel_color; ///< 
	CaplAttr* a_act_rel_font; ///< 
	CaplAttr* a_act_rel_points; ///< 
	CaplAttr* a_act_rel_title_point; ///< 
	CaplAttr* a_act_rel_width; ///< 
	CaplAttr* a_act_rel_arrow_size; ///< 
	
	CaplEntity* e_act_secuence; ///< Последовательность действий
	CaplAttr* a_act_secuence_tmpl; ///< Ссылка на шаблон процесса
	CaplAttr* a_act_secuence_status; ///< Статус, который присваивается рабочим объектам при срабатывании перехода
	CaplAttr* a_act_secuence_not_sign; ///< Не подписывать объекты при этом переходе
	CaplAttr* a_act_secuence_check_status_4_all_obj; ///< Проверять статус при переходе
	CaplAttr* a_act_secuence_check_need_work_4_all_obj; ///< Проверять наличие флага требует доработки



	
	CaplEntity* e_wo; ///< Рабочий объект
	CaplAttr* a_wo_object; ///< Сслка на объект базы данных (документ, версию изделия и т.д.)
	CaplAttr* a_wo_action; ///< Ссылка на процесс(задание)
	CaplAttr* a_wo_for_note; ///< Справочный объект

	CaplEntity* e_apl_font;
	CaplAttr* a_font_name;
	CaplAttr* a_font_height;
	CaplAttr* a_font_weight;
	CaplAttr* a_font_italic;
	CaplAttr* a_font_char_set;

	CaplEntity *e_apl_point;
	CaplAttr *a_apl_point_x;
	CaplAttr *a_apl_point_y;
	
	bool m_bCompleteProcessNotify_4_ParentProcess;  // Если процесс выполняется в рамках задания, посылать сообщение исполнителю задания
		

	/** Если присвоено значение true, на документы ставится ЭЦП*/
	bool m_bUseSignature;
	

	// Настройки

	static BOOL m_b_mark_work_with_color;  // выделять работы цветом
	static BOOL m_b_mark_ended_work_with_color; // выделятьзавершенные работы цветом
	static BOOL m_b_not_show_task_of_future_process; // не показывать задания процессов с датой запуска позднее текущей
	static int  m_i_mark_work_with_color_warning_time;  // За сколько дней до завершения выделять ораньжевым

	static bool LoadOptions();
	static bool SaveOptions();

	virtual void LoadParamsFromDB();

public:

	/** Создание процесса (запуск на выполнение не производится)
		@param id - Обозначение
		@param name - Наименование
		@param dscr - Описание
		@param proc_tmpl - Щаблон, по которому запускается процесс
		@param owner - Владелец (или текущий сотрудник)
		@param manager - Координатор процесса 
		@param start_date - Дата запуска (или текущая дата)
		@param finish_date - Планируемая дата завершения
		@param check_date - Дата контрольной проверки
		@param task_prot - Прототипы заданий
		@param work_objects - Рабочие объекты процесса
		@param priority - Приоритет выполнения 		
		@return ссылка на созданные процесс при удачном выполнении и NULL в случае ошибки */
	CaplInstance* CreateWfProcess(LPCTSTR id, LPCTSTR name, LPCTSTR dscr,
		CaplInstance* proc_tmpl, CaplInstance* owner, CaplInstance* manager,
		LPCTSTR start_date, LPCTSTR finish_date, LPCTSTR check_date, 
		aplExtent &task_prot, aplExtent &work_objects, LPCTSTR priority= _T("medium"));
	
	/** Удаление процесса
		@param process - Процесс
		@param procLog - (не используется)
		@param bSave - Сохранить или нет изменения в базе данных
		@param bVerify - Проверить или нет права на удаление процесса
		@return true при удачном выполнении и false в случае ошибки*/
	bool DeleteWfProcess(CaplInstance* process, CStringArray &procLog, 
		bool bSave= true, bool bVerify= true);
	
	/** Запуск процесса на выполнение
		@param process - Процесс
		@param bVerify - Проверить или нет права на запуск процесса 
		@param first_activity - действие, с которого запускается процесс
		@return true при удачном выполнении и false в случае ошибки*/
	bool RunWfProcess(CaplInstance* process, bool bVerify= true, CaplInstance* first_activity= NULL);
	
	/** Перезапуск процесса
		@param process - Процесс, который необходимо перезапустить
		@return вновь запущенные процесс или NULL в случаие ошибки*/
	CaplInstance* RestartWfProcess(CaplInstance* process);

	/** Приостановка выполнения процесса
		@param process - Процесс
		@param bVerify - Проверить или нет права на остановку процесса  
		@return true при удачном выполнении и false в случае ошибки*/
	bool SuspendWfProcess(CaplInstance* process, bool bVerify= true);

	/** Внештатное завершение процесса
		@param process - Процесс 
		@param bVerify - Проверить или нет права на завершение процесса 
		@return true при удачном выполнении и false в случае ошибки*/
	bool TerminateWfProcess(CaplInstance* process, bool bVerify= true);

	/** Штатное завершение процесса 
		@param process - Процесс 
		@return true при удачном выполнении и false в случае ошибки*/
	bool EndWfProcess(CaplInstance* process);


	/** Возвращает для сотрудника список шаблонов, в которых он имеет 
		право запускать
		@param owner - сотрудник
		@param proc_tmpls - массив шаблонов процесса
		@return true при удачном выполнении и false в случае ошибки*/
	bool GetUserProcessTempList(CaplInstance* owner, aplExtent& proc_tmpls);

	/** Возвращает для сотрудника список запущенных им процессов
		@param owner - сотрудник
		@param procs - массив процессов
		@return true при удачном выполнении и false в случае ошибки*/
	bool GetUserProcessList(CaplInstance* owner, aplExtent& procs, bool bReturnWithArchiveProc = false, bool bOnlyActiveProc = false);

	/** Возвращает для сотрудника список выданных ему заданий
		@param performer - сотрудник
		@param task_list - список заданий
		@param bCompleted - включить выполненные
		@param bCanceled - включить отмененные
		@param bSuspended - включить остановленные
		@return true при наличии новых заданий и false при их отсутствии*/
	virtual bool GetUserTaskList(CaplInstance* performer, aplExtent&task_list, bool bCompleted=true, bool bCanceled=true, bool bSuspended=true);

	/** Возвращает задания процесса
		@param proc - процесс
		@param tasks - список заданий
		@return true при удачном выполнении и false в случае ошибки*/
	bool GetProcessTasks(CaplInstance* proc, aplExtent& tasks);

	/** Возвращает задания процессов
		@param extProcs - процессы
		@param tasks - список заданий
		@return true при удачном выполнении и false в случае ошибки*/
	bool GetProcessTasks(aplExtent& extProcs, aplExtent& tasks);

	/** Возвращает рабочие объекты процесса или задания
		@param task_or_process - задание или процесс
		@param objects - список рабочих объектов
		@return true при удачном выполнении и false в случае ошибки*/
	virtual bool GetWorkObjects(CaplInstance* task_or_process, aplExtent&objects);

	/** Возвращает родительские задания задания процессов
		@param item - процесс или задание
		@param paent_tasks - список родительских заданий (по идее в списке должен быть 1 элемент)
		@return true при удачном выполнении и false в случае ошибки*/
	bool GetParentTasks(CaplInstance *item, aplExtent& paent_tasks);


	/** Проверяет можно ли добавить или удалить рабочий объект текущему пользователю*/
	bool CanChangeWorkObjectsList(CaplInstance* process);

	/** Читает из базы данных в кэш информацию о процессе
		@param process - процесс
		@return true при удачном выполнении и false в случае ошибки*/
	virtual bool LoadProcessInfo(CaplInstance* process);

	/** Читает из базы данных в кэш информацию о процессе
		@param process - процессы
		@return true при удачном выполнении и false в случае ошибки*/
	virtual bool LoadProcessInfo(aplExtent& process);

	/** Выводит диалог со свойствами процесса
		@param process - процесс
		@return true при удачном выполнении и false в случае ошибки*/
	bool ShowProcessProperties(CaplInstance* process);
	
	/** Создает задание
		@param process - процесс, в котором выдается задание
		@param activity - действие, по которому выдается задание
		@param connector - переход по которому создается это задание. Используется в логических блоках при параллельной работе
		@param sub_proc - массив подпроцессов
		@param previous - предыдущее задание
		@param priority - приоритет выполнения
		@param id - обозначение 
		@param name - наименование
		@param dscr - краткое описание
		@param perfomer - исполнитель задания
		@param manager - координатор задания
		@param start_date - дата начала выполнения
		@param finish_date - планируемая дата завершения
		@param check_date - контрольная дата
		@return ссылка на созданное задание или NULL в случае ошибки*/
	CaplInstance* CreateTask(CaplInstance* process, CaplInstance* activity, CaplInstance* connector,
		aplExtent &sub_proc, CaplInstance* previous= NULL, 
		LPCTSTR priority= _T("medium"),
		LPCTSTR id= _T(""), LPCTSTR name= _T(""), LPCTSTR dscr= _T(""),
		CaplInstance* perfomer= NULL, CaplInstance* manager= NULL,  
		LPCTSTR start_date= _T(""), LPCTSTR finish_date= _T(""), LPCTSTR check_date= _T(""));


	//Обработка логического блока
	CaplInstance* CaplWorkFlowManager::CreateLogicalTask(CaplInstance* process, CaplInstance* activity, CaplInstance* connector,
		aplExtent &sub_proc, CaplInstance* previous);

protected:
	// Останавливает все задачи процесса
	bool StopAllProcessTask(CaplInstance *process);

	// Завершает логическую операция и запускает следующие действия
	CaplInstance *EndLogicalTask(CaplInstance *task_log_el);
public:

	/** Выдает задание на исполнение
		@param task - задание
		@param bVerify - проверить или нет права на выдачу задания  
		@return true при удачном выполнении и false в случае ошибки*/
	bool RunTask(CaplInstance* task, bool bVerify= true);

	/** Помечает задание как принятое и вызывает обработчик запуска (вызывается после получения подтверждения)
		@param task - задание
		@return true при удачном выполнении и false в случае ошибки*/
	bool SetTaskWorking(CaplInstance* task);

	/** Перезапускает задание
		@param task - задание, которое необходимо перезапустить
		@param newPerformer - новый исполнитель
		@param newManager - новый координатор
		@return ссылка на вновь выданное задание или NULL в случае ошибки*/
	CaplInstance* RestartTask(CaplInstance* task, 
		CaplInstance* newManager= NULL, CaplInstance* newPerformer= NULL);

	/** Для логического блока. Останавливает все и выполняет переход.
		@param task - задание, которое необходимо перезапустить
		@return ссылка на вновь выданное задание или NULL в случае ошибки*/
	CaplInstance* StopAllAddRunLogcalElement(CaplInstance* task);

	/** Приостанавливает задание
		@param task - задание
		@param bVerify - проверить или нет права на остановку задания  
		@return true при удачном выполнении и false в случае ошибки*/
	bool SuspendTask(CaplInstance* task, bool bVerify= true);

	/** Завершает задание
		@param task - задание
		@return true при удачном выполнении и false в случае ошибки*/
	bool EndTask(CaplInstance* task, CaplInstance* connector= NULL, bool bCancelTask = false, bool bForce = false);

	/** Запускает следующее задание (для возобновления процесса, если новое задание не запустилось по какой-то причине)
		@param task - задание
		@return true при удачном выполнении и false в случае ошибки*/
	bool ReEndTask(CaplInstance* task, CaplInstance* connector= NULL, bool bCancelTask = false, bool bForce = false);


	/** Читает из базы данных в кэш информацию о задании
		@param  task - задание
		@return true при удачном выполнении и false в случае ошибки*/
	bool LoadTaskInfo(CaplInstance* task);
	
	/** Читает из базы данных в кэш информацию о задании
		@param  tasks - задания
		@return true при удачном выполнении и false в случае ошибки*/
	bool LoadTaskInfo(aplExtent& tasks);

	/** Читает из базы данных в кэш информацию об activity
		@param  activity - задание
		@return true при удачном выполнении и false в случае ошибки*/
	bool LoadActivityInfo(CaplInstance* activity);

	/** Читает из базы данных в кэш информацию об activity
		@param  activity - задание
		@return true при удачном выполнении и false в случае ошибки*/
	bool LoadActivityInfo(aplExtent& activity);

	/** Выводит диалог со свойствами задания
		@param  task - задание
		@return true при удачном выполнении и false в случае ошибки*/
	bool ShowTaskProperties(CaplInstance* task);

	/** Возвращает для действия (задания) массивы входных и выходных переходов
		@param task_or_act - задание или действие
		@param in_con - входные переходы
		@param out_con - выходные переходы
		@return true при удачном выполнении и false в случае ошибки*/
	bool GetConnectors(CaplInstance* task_or_act, aplExtent& in_con, aplExtent& out_con);
	
	/** Возвращает массив действий, точек входа и точек завершения шаблона процесса
		@param proc_or_tmpl - процесс или шаблон процесса
		@param activities - массив действий, точек входа и точек завершения
		@return true при удачном выполнении и false в случае ошибки*/
	bool GetProcessComponents(CaplInstance* proc_or_tmpl, aplExtent& activities);

	/** Возвращает массив переходов шаблона процесса
		@param tmpl - шаблон процесса
		@param connectors - массив переходов
		@return true при удачном выполнении и false в случае ошибки*/
	bool GetProcessConnectors(CaplInstance* tmpl, aplExtent& connectors);

	/** Возвращает для сотрудника массив процессов, выполнявшихся по 
		определенному шаблону
		@param owner - сотрудник
		@param proc_tmpls - шаблон процесса
		@param history - массив процессов
		@return true при удачном выполнении и false в случае ошибки*/
	bool GetProcessTmplHistory(CaplInstance* owner,
		CaplInstance* proc_tmpls, aplExtent& history);

	/** Возвращает массив заданий, выдававшихся сотрудником по 
		определенному действию
		@param owner - сотрудник
		@param activity - действие
		@param history - массив заданий
		@return true при удачном выполнении и false в случае ошибки*/
	bool GetActivityHistory(CaplInstance* owner, CaplInstance* activity, 
		aplExtent& history);
	
	/** Ищет в базе данных шаблон процесса по обозначению
		@param id - обозначение шаблона
		@return найденный шаблон процесса или NULL в случае ошибки*/
	CaplInstance* GetProcessTmplById(LPCTSTR id);

	/** Удаляет шаблон процесса из базы данных
		@param tmpl - шаблон процесса
		@param bVerify - проверить или нет права на удаление шаблона процесса  
		@return true при удачном выполнении и false в случае ошибки*/
	bool DeleteProcessTemplate(CaplInstance* tmpl, bool bVerify= true);
	
	/** Выводит диалог со свойствами шаблона процесса или действия
		@param tmpl_or_act - шаблон процесса или действие
		@return true при удачном выполнении и false в случае ошибки*/
	bool ShowTmplProperties(CaplInstance* tmpl_or_act);
 
	/** Проверка шаблона на правильность составления
		@param templ - шаблон процесса*/
	int TemplateValidCheck(CaplInstance * templ, int errMode=false);
	
	/** Чтение шаблонов из базы данных в кэш
		@return true при удачном выполнении и false в случае ошибки */
	bool LoadTemplates();
		
	/** Не реализовано*/
	bool FillWfDates(COleDateTime &startDate, double duration, 
		COleDateTime &checkDate, COleDateTime &finishDate);	
	/** Не реализовано*/
	bool ForwardTaskToPerfomer(CaplInstance* task, CaplInstance* perfomer);
	
	/** Выводит диалог анализа сроков выполнения работ
	@param ciTemplate - шаблон, выбранный по умолчанию
	@param ciActivity - работа, выбранная по умолчанию*/
	void AnalyzeWorkTimes(CaplInstance* ciTemplate=NULL,CaplInstance* ciActivity=NULL);

	/** Выводит диалог запуска нескольких процессов по шаблону
	@param ciTemplate - шаблон
	@param ciTask - задание
	@param crated_proc - массив процессов, который был создан в диалоге*/
	void StartManyProcs(CaplInstance* ciTemplate,CaplInstance* ciTask, aplExtent* crated_proc= NULL);


	/** Выводит диалог со схемой шаблона процесса
	@param wf_template - шаблон процесса
	@param task_for_sel - выделяемое задание*/
	void ShowTemplateSchema(CaplInstance *wf_template, CaplInstance *task_for_sel=0);

	/*Возвраает настройки прототипов для шаблона*/
	bool GetProcessPrototypes(CaplInstance* proc_or_tmpl, aplExtent& prots);
	/*Возвраает items для  настройки прототипов для шаблона*/
	bool GetProcessPrototypeItems(CaplInstance* proc_or_tmpl, aplExtent& items);
	/*выводит диалог для создания нового прототипа процесса*/
	CaplInstance* CreateProcessPrototype(CaplInstance* proc_tmpl);
	/*Показывает настройку прототипов для процесса или прототипа для шаблона процесса :))
	(без моникёров)*/
	bool ShowPrototypes(CaplInstance* proc_or_prot, aplExtent* existProts= NULL, bool bReadOnly= false);

	/** Выводит диалог выбора шаблона процесса или 
	@param templates - список доступных шаблонов процессов
	@param sel_template - шаблон по умолчанию
	@param bShowAllTemplates - показывать в дереве все шаблоны процессов
	@param SelectMode - значение определяющее типы данных которые можно выбрать <br>

		APL_MODE_WFL_SELECT_TEMPLATE - можно выбирать шаблон процесса
		APL_MODE_WFL_SELECT_ACTIVITI - можно выбирать apl_activity

	@return выбранный объект 	*/
	CaplInstance *SelectTemplateSchema(aplExtent &templates, CaplInstance *sel_template=0, bool bShowAllTemplates = true, long SelectMode = APL_MODE_WFL_SELECT_TEMPLATE);

	/* Вызывается из редактора
	код возврата iEditorResultMode = 0 - отмена;  1- создать новый; 2-создать копию ; 3-начать редактирование
	*/
	
	CaplInstance *SelectTemplateSchemaInEditor(aplExtent &templates, int  &iEditorResultMode);

	/*Вызывает обработчики перед началом (bStartModule= true) или завершением (bStartModule= false) задания
	Возвращает 1 при удачном выполнении, 0 в случае ошибки выполнения обработчика и -1, если обработчик вызвать не удалось*/
	BOOL RunProgrammModule(CaplInstance* task, aplExtent& ApprovedWO, CaplInstance* connector= NULL, bool bStartModule= true);

	bool CanAddInstanceInProcess(CaplInstance* process, CaplInstance* inst);

	/*Находит процессы, в которых участвует итем*/
	virtual bool FindProcessContained(CaplInstance *ciItem, aplExtent &aeExtOut);

	/*Находит процессы, в которых участвуют extItems*/
	virtual bool FindProcessContained(aplExtent& extItems, aplExtent& extOut);

	// Возвращает цвет для задачи или процесса
	// bWarning устанавливает в true, если надо выделить жирным
	bool GetItemColor(CaplInstance *item, COLORREF &color, bool *bWarning=0); 

	void ShowColorLegend(); // Показывает диалог с обозначениями цветов

	/** Формирование обозначения процесса при автонумерации
		@param process_or_template - шаблон или процесс
		@param sId - формируемое обозначение
		@return true при удачном выполнении и false в случае ошибки*/
		bool GenerateProcId(CaplInstance* process_or_template, CString &sId);

	/** Для действия или задачи проверяет - является ли объект логическим элементом
		@return true если является и false в другом случае*/
		bool IsItemLogicalElement(CaplInstance *item);	

		// Формирование сообщение для почты
		bool CreateContentForTaskNotify(CString &sContent, CaplInstance *task, LPCTSTR psNotify);

};

//Возвращает TRUE, если при таком задании подпроцесса возникнет цикл
BOOL AFX_EXT_API  aplTestCyrcleInProcess(CaplWorkFlowManager* wf_mgr, CaplInstance* task, CaplInstance* sub_process);
//Сортировка заданий и процессов по дате создания
void AFX_EXT_API  aplSortWfInstances(CaplWorkFlowManager* wf_mgr, aplExtent& tasks, int iLeft, int iRight);

//Проверка, относится ли элемент организационной структуры к сотруднику (если person==NULL,
//проверяется текущий пользователь
BOOL AFX_EXT_API aplIsPersonOrgElement(CaplAPI* api, CaplInstance* Element, CaplInstance* person=NULL);
//bool AFX_EXT_API aplWFSignWO(CaplAPI* api, CaplInstance* approval, CString sSystem, CString &sKey, CString &sPassword, 
//		CString &sSign, CString &sHash, CString &sOpenKey, CCryptographicProvider* prov= NULL);
//bool AFX_EXT_API aplGetSignParams(CaplAPI* api, CString &sSystem, CString &sKey, CString &sPassword, CCryptographicProvider* prov= NULL);


