// apl_api.h
// Файл объединяющий все классы PSS API

#ifndef _APL_API_MAIN_HEADER
#define _APL_API_MAIN_HEADER

// Задание библиотек для линковки
#ifndef APL_STEP_MGR_NOAUTOLIB
#ifdef _DEBUG
#ifdef UNICODE
#pragma comment (lib,"CaplData_ud.lib")
#pragma comment (lib,"AplTransportClient_ud.lib")
#pragma comment (lib,"aplStepMgr_ud.lib")
#else
#pragma comment (lib,"CaplDataD.lib")
#pragma comment (lib,"AplTransportClientD.lib")
#pragma comment (lib,"aplStepMgrD.lib")
#endif
#else
#ifdef UNICODE
#pragma comment (lib,"CaplData_u.lib")
#pragma comment (lib,"AplTransportClient_u.lib")
#pragma comment (lib,"aplStepMgr_u.lib")
#else
#pragma comment (lib,"CaplData.lib")
#pragma comment (lib,"AplTransportClient.lib")
#pragma comment (lib,"aplStepMgr.lib")
#endif
#endif
#endif

;
#include <atlbase.h>

class CaplAPI;
class CaplStepManager;
class CaplAutorizationManager;
class CaplBPManager;
class CaplCategoryManager;
class CaplChangeManager;
class CaplCharacteristicManager;
class CaplDocManager;
class CaplExchangeManager;
class CaplQueryManager;
class CaplFolderManager;
class CaplMessageManager;
class CaplPrdInstManager;
class CaplProductManager;
class CaplUnitExchangeManager;
class CShowOpt;
class CaplFormManager;
class CaplRequirementMgr;

#define apidata m_api->m_data

#include <aplNetStepData.h>
#include "aplClassifierMgr.h"
#include "CaplPreExploitationMgr.h"

#ifdef _AFXEXT
	#include "aplStepManager.h"
#else
	#include <aplStepManager.h>
#endif

class AFX_EXT_CLASS CShowOpt  
{
public:
	BOOL ShowOption();
	void GetValue(CRegKey &key, CString name, BOOL &param);
	BOOL SaveData();
	BOOL LoadData();
	CShowOpt();
	virtual ~CShowOpt();
	
	BOOL	m_showbpinst_id;
	BOOL	m_showbpinst_name;
	BOOL	m_showbpinst_date;

	BOOL	m_showbpres_id;
	BOOL	m_showbpres_type;
	BOOL	m_showbpres_object;
	BOOL	m_showbpres_amount;
	
	BOOL	m_show_org_struct;
	BOOL	m_show_classificators;

	BOOL	m_prd_id;
	BOOL	m_prd_name;
	BOOL	m_prd_count;
	BOOL	m_prd_position;
	BOOL	m_prd_code;
	BOOL	m_pdf_code;
	BOOL	m_pdf_code1;
	BOOL	m_pdf_code2;

	BOOL	m_appr_pers;
	BOOL	m_appr_status;
	BOOL	m_appr_pers_role;
	BOOL	m_appr_date;
	BOOL	m_appr_time;

	BOOL	m_charact_id;
	BOOL	m_charact_name;
	BOOL	m_charact_value;
	BOOL	m_charact_unit;
	BOOL	m_charact_scope;

	BOOL	m_doc_id;
	BOOL	m_doc_show_add_code_document_type;
	BOOL	m_doc_name;
	BOOL	m_doc_ver;
	BOOL	m_doc_type;
	BOOL	m_doc_editing_user;
	BOOL	m_doc_show_addional_code;
	BOOL	m_doc_show_date;
	BOOL	m_doc_show_inv_num;
	BOOL	m_doc_show_recipient;
	

	bool	m_doc__view_on_dblclick;

	BOOL	m_org_id;
	BOOL	m_org_name;

	BOOL	m_PrdNoShowPlusToPart;

	BOOL m_PrdNoShowReplacedPart; // Не показывать удаленные (после измеений) в структуре

	BOOL	m_categ_id;
	BOOL	m_categ_name;

	BOOL	m_show_charactId_or_name;

	BOOL	m_task_cancel;
	BOOL	m_task_complete;
	BOOL	m_task_suspend;

	BOOL	m_BPType;
	BOOL	m_BPId;
	BOOL	m_BPName;
	BOOL	m_BPDescr;
	BOOL	m_BPNum;

	BOOL	m_auto_wfstate;

	BOOL	m_PrdInstId;
	BOOL	m_PrdInstSN;
	BOOL	m_PrdInstPrd;
	
	BOOL	m_PersonFullInitials;
	BOOL	m_PersonId;

	//Project
	BOOL	m_show_project_id;
	BOOL	m_show_project_num_zak;
	BOOL	m_show_project_name;
	BOOL	m_show_project_type;
	BOOL	m_show_project_state;
	BOOL	m_show_project_number;

	// Refusal
	BOOL	m_show_refusal_doc_type;
	BOOL	m_show_refusal_doc_id;
	BOOL	m_show_refusal_doc_date;
	BOOL	m_show_refusal_state;
	BOOL	m_show_refusal_type;
	BOOL	m_show_refusal_descr;
	BOOL	m_show_refusal_stage;
	BOOL	m_show_refusal_planer;
	BOOL	m_show_refusal_item;

	//Classifier
	BOOL	m_show_classifier_system_id;
	BOOL	m_show_classifier_system_name;

	BOOL	m_show_classifier_level_id;
	BOOL	m_show_classifier_level_name;
	BOOL	m_show_classifier_level_level;

	BOOL	m_show_task_id;
	BOOL	m_show_task_name;
	BOOL	m_show_task_process_id;
	BOOL	m_show_task_process_name;

	BOOL	m_show_process_id;
	BOOL	m_show_process_name;
};

class AFX_EXT_CLASS CaplAPI
{
public:
	bool ChangeCurrentUserPassword();
	bool ChangeUserPassword(CaplInstance* pUser);
	bool SetPasswordSecurity();
	
	bool SelectPdf(CaplInstance** Pdf, LPCTSTR Id=NULL, bool bFindExecute = false, aplStringBindMode BindMode = aplSBLeft);
	CaplAPI();
	virtual ~CaplAPI();

	CShowOpt m_show;//Переменная содержит флаги отображения для всех итемов

	CaplNetStepData m_data;						/**<Источник данных*/

public:
	CaplCategoryManager m_categ_mgr;			/**<Менеджер категорий*/
	CaplDocManager m_doc_mgr;					/**<Менеджер документов*/
	CaplProductManager m_prd_mgr;				/**<Менеджер изделий*/
	CaplPrdInstManager m_prd_inst_mgr;			/**<Менеджер экземпляров изделий*/
	CaplBPManager m_bp_mgr;						/**<Менеджер бизнес-процессов*/
	CaplCharacteristicManager m_charact_mgr;	/**<Менеджер характеристик*/
	CaplUnitExchangeManager m_unit_exch_mgr;	/**<Менеджер перобразования единиц измерений*/
	CaplFolderManager m_folder_mgr;				/**<Менеджер папок*/
	CaplMessageManager m_message_mgr;			/**<Менеджер сообщений*/
	CaplAutorizationManager m_appr_mgr;			/**<Менеджер авторизации*/
	CaplChangeManager m_change_mgr;				/**<Менеджер изменений*/
	CaplQueryManager m_query_mgr;				/**<Менеджер поиска*/
	CaplPreProjectManager* m_project_mgr;		/**<Менеджер проектов*/
	CaplPreForumManager* m_forum_mgr;			/**<Менеджер форума*/
	CaplOptionsManager m_options_mgr;			/**<Менеджер опций*/
	CaplClassifierMgr	m_classifier_mgr;		/**<Менеджер справочников>*/
	CaplFormManager		m_form_mgr;				/**<Менеджер форм>*/
	CaplRequirementMgr	m_req_mgr;				/**<Менеджер требований*/
	CaplPreWMSManager	*m_wms_mgr;				/**<Менеджер объектов складского учета*/
	CaplPreExploitationMgr	*m_expl_mgr;		/**<Менеджер эксплуатации>*/
	CaplStepManager		*m_packet_mgr;			/**<Менеджер пакетов> (Контрольная точка)*/
	CaplStepManager		*m_techGuide_mgr;		/**<Менеджер технический публикаций>*/	
	CaplDeclareWorkflowManager *m_wf_mgr;		/**<Менеджер заданий>*/	
	CaplPreConfigurationMgr *m_config_mgr;		/**<Менеджер конфигураций>*/	

	/**@name Флаги */
	//@{
	/** Флаг предписывющий автоматический вызов сохранения информации в БД (по умолчанию true)*/
	bool m_AutoSave;

	// старый флаг режима назначения доступа. Используется в паре SetAutoSave(true)(сохраняет предыдущее состояние флага в m_data) - SetAutoSave(false)(восстанавливает)
	bool m_old_mode_save_access;

	/** Флаг предписывющий автоматическоназначение доступа по шаблону c вывовом SaveChanges при соотв. настройке работы с БД (по умолчанию true)*/
	bool m_AutoUsurpire;

	/** Флаг указывающий возможность работы в диалоговом режиме (по умолчанию true)*/
	bool m_ModeInteractive;

	/** Размер порции элементов читаемых за 1 прием*/
	int m_MaxItemsLoad;

	/** Вызов из сервера интеграции*/
	bool m_bModeIntegration;

	/** При конфигурировании структур учитывать корневые изделия (pdf)*/
	bool m_bUseConfigurationPdfs;
	//@}

	bool m_bLoadedOrgstruct; // устанавливается в true при чтении оргструктуры.  Если false - надо зачитывать данные сотрудников.

	/** Режим работы из модуля ЛСС3*/
	static bool m_bLss3Mode;
	static void SetLss3Mode();
	static bool GetLss3Mode();

	/**@name Инициализация */
	//@{

	/** Устанавливает соединение с указанной БД сервера для указанного пользователя 
		@param _username имя пользователя. Если параметр не указан, выводится диалог с предложением ввести недостающие параметры 
		@param _pwd пароль пользователя
		@param _name_connect имя подключения, с которым устанавливается соединение. Если параметр не указан, выводится диалог с предложением ввести недостающие параметры 
		@param connection_type тип подключения (тип используемой лицензии)
		@param supress_dlg подавляет вывод стандартного диалога
		@param wait_text сообщение, которое будет выводиться в диалоге ожидания ответа сервера. При пустом значении выводится сообщение по умолчанию
		@return <b>true</b> при удачном выполнении и <b>false</b> в случае ошибки */
	bool Connect(const TCHAR *_username=0, const TCHAR *_pwd=0,const TCHAR* _name_connect=0, long connection_type=apl_LT_DEF_TYPE, const TCHAR* wait_text=0, bool supress_dlg= false);

	/** Разрывает соединение с сервером
		@return <b>true</b> при удачном выполнении и <b>false</b> в случае ошибки */
	bool Disconnect();

	/** Сохраняет изменения в БД*/
	bool SaveChanges();

	/** Ассоциирует менеджеры с источником данных (из Connect вызывается автоматически)*/
	void Init();

	//@}


	/** Возвращает в буфер строку идентифицирующую item 
		@return <b>true</b> при удачном выполнении и <b>false</b> в случае ошибки */
	bool GetItemName(CaplInstance * item, CString &buf);
	CString GetItemName(CaplInstance * item);

	/** Возвращает в names строку из имен объектов из extent, разделенных razdelit
		если razdelit==0, то ипользуется "; "
	    @return true при удачном выполнении и false в случае ошибки */
	bool GetItemsName(aplExtent &ext, CString &names, const TCHAR *razdelit=0);

	/** Возвращает в буфер строку идентифицирующую имя типа item или
		пустую строку - если тип item пустой или не относится к объектам высокого уровня*/
	CString GetItemTypeName(CaplInstance * item);


		/** Возвращает в буфер строку c правильным обозначением версии изделия Если bShowCode==true -  в начало добавляется код
	    @return true при удачном выполнении и false в случае ошибки */
	bool GetPdfName(CaplInstance * pdf, CString &buf, bool bShowCode=false);

	/** Чтение в кэш данных обо всех объектах, содержащихся в ext 
	    @return <b>true</b> при удачном выполнении и <b>false</b> в случае ошибки */
	bool LoadExtentInfo(aplExtent &ext);

	// Упрощенное чтение для работы из TGB (без обработки типов)
	bool LoadExtentInfoPrimitive(aplExtent &ext);

	/** Чтение в кэш данных об объекте
	    @return <b>true</b> при удачном выполнении и <b>false</b> в случае ошибки */
	bool LoadItemInfo(CaplInstance *item);

	/** Фозвращает номер иконки из списка иконок для заданной Instance
		item - Instance, для которой нужно вернуть индекс иконки
		return индекс иконки для заданной Instance и -1 в случае ошибки*/
	int GetInstIco(CaplInstance* item);

	/** Сравнивает два индекси иконки
		Image1 - иконка первой Instance
		Image2 - иконка второй Instance
		return <b>-1</b> если первая Instance должна находится раньше второй, <b>1</b> если вторая должна находится раньше первой и <b>0</b> если номера иконок совпадают*/
	static int aplCompareItemsImage(int Image1, int Image2);

	
	/** Создает GUID
		guid - строка, в которой возвращается  GUID
		@return <b>true</b> при удачном выполнении и false в случае ошибки */
	static bool CreateGuid(CString &guid);
	
	/** Устанавливает флаг работы в диалоговом режиме для всех менеджеров
		mode - новое значение флага
		*/
	void SetModeInteractive(bool mode);
	
	/** Устанавливает флаг автоматического назначения доступа
		mode - новое значение флага
		*/
	void SetAutoUsurpire(bool mode);
	
	/** Устанавливает флаг автоматического сохранения
		mode - новое значение флага
		*/
	void SetAutoSave(bool mode);

	/** Устанавливает размер порции элементов читаемых за 1 прием*/
	void SetMaxItemsLoad(int MaxItemsLoad);

	/**	Показать свойства объекта
		@param Item - объект, для которого необходимо отобразить свойства
		@return <b>true</b> если свойства объекта изменились (нажали кнопку "ОК") и <b>false</b> в противном случае*/
	bool ShowItemProperties(CaplInstance* Item);

	/**	Устанавливает доступ на объект и его дочерние объекты/объекты, входящие в объект
		@param Item - объект, для которого необходимо рекурсивно назначить доступ
		@return <b>true</b> при удачном выполнении и <b>false</b> в случае ошибки */
	bool SetRecursiveAccess(CaplInstance* Item);

	/**	Проверяет, можно ли назначить доступ на объект/экстент: 1) есть ли полный доступ на 
	объект или экстент 2) не взяты ли объекты на редактирование.
	Если нет доступа или объект(ы) на редактировании - выводит сообщение со списком таких объектов
		@param Item - объект, для которого необходимо проверить доступ
		@param extent - экстент объектов, для которых необходимо проверить доступ
		@return <b>true</b> если всем объектам можно назначить доступ и <b>false</b> если хотя на бы один объект нельзя назначить доступ  */
	bool TestAccessChecked(CaplInstance* Item);
	bool TestAccessChecked(aplExtent &extent, bool single=false);

	/**	Удаляет объект по правилам, определенным для этого типа объектов
		@param Item - объект, для который необходимо удалить
		@return <b>true</b> при удачном выполнении и <b>false</b> в случае ошибки */
	bool DeleteItem(CaplInstance* Item);

	bool aplGetCurrentTime(COleDateTime &time);
	bool aplGetCurrentTime(CString &time);
	
	/** Загружает некоторую информацию об инстансах из ext, помещая их на нулевую
		позицию в запросе.
		@param nMaxLoad - максимальное количество элементов, помещаемых в запрос.
			Если nMaxLoad > ext.GetSize(), то запрос выполняется в несколько этапов.
			Если 0, то сразу помещается весь экстент.
		@param bLoadAttrs - надо ли загружать аттрибуты для ext.
		@param fn - пользовательская функция добавления запросов.
		@param data - дополнительный аргумент для пользовательской функции.
		@return <b>true</b> при удачном выполнении и <b>false</b> в случае ошибки
	*/
	bool LoadByParts(aplExtent &ext, int nMaxLoad, bool bLoadAttrs, void(*fn)(CaplAPI *, CaplLoadData &, DWORD), DWORD data);

	/** Определяет поведение функций LoadExtentInfo/LoadItemInfo для значений характеристик
		При установленном true вызывается функция из CaplCharacteristicManager, которая раскручивает 
		табличные характеристики на два уровня
		При установленном false для значений характеристик загружаются только непосредственные атрибуты instance
		
	*/
	bool SetLoadCharacteristicValues(bool is_load);
	bool m_load_characteristic_values;

protected:
	TCHAR *m_data_moved;
	long m_data_moved_size;

private:
};

// выводит диалог для выбора строки
bool AFX_EXT_API aplInputStrValue(LPCTSTR sHеader, LPCTSTR sName, CString &sVal);

#endif





















