//---------------------------------------------------------------------------
#ifndef FP300KZ1CH
#define FP300KZ1CH
//---------------------------------------------------------------------------
#include "FP300KZ.h"
//#include "../Printer.h"
//#include "../../ComPort.h"
#include <stdTools.h>
#include <structs.h>
#include <string>
//---------------------------------------------------------------------------
struct LDDevice //Логическое устройство
{
	int Number; //Номер или id устройства
	std::string Name; //Имя ЛУ
	int ComNumber; //Номер ком-порта ЛУ
	int BaudRate; //Скорость работы ЛУ, в бодах или в виде индекса (индекс 0 соответствует скорости 1200 бод)
	std::string ComputerName; //Имя компьютера, на котором установлено физическое устройство
	int TimeOut; //Таймаут ожидания ответа от ЛУ
	std::string FrType; //Тип ФР, соответствующий добавляемому ЛУ
};
//---------------------------------------------------------------------------
//Специальный класс 1с драйвера
class FP300KZ1C : public FP300KZ
{
	//private:
	public:
		TSimpleList<LDDevice*> *ListLDDevice; //список устройств
		//SProp* PropMas;

		int StringQuantity; //На сколько строк двигать бумагу
		int StringNumber; //Для изменения заголовока чека и хвоста
		bool ReportType; //Полный либо сокращённый фискальный отчёт
		std::string BarCode; //("ШтрихКод") для последующей печати
		std::string Date;//("Дата") "DD-MM-YYYY" дата в ККМ, получаемое методом GETECRSTATUS
		std::string Time; //Время "HH:MM:SS" TIMESTR
		//std::string TimeStr; //ВРЕМЯСТРОКА тоже самое что и Time
		int Department; //Отдел
		bool Absolute;
		double Discount;//СКИДКА
		double Change; //Сдача только чтение

//		float DiscountInvertor; //ЗНАКСКИДКИ (умнож на скидку)
		int DocumentNumber; //НОМЕРДОКУМЕНТА
		int OperatorNumber; //НОМЕРОПЕРАТОРА
		double Price; //ЦЕНА
		double Summ1,Summ2,Summ3,Summ4,Summ5,Summ6,Summ7,Summ8;
		double Quantity; //КОЛИЧЕСТВО
		//int ResultCode; //РЕЗУЛЬТАТ выполнения последней команды
		std::string RNN,RNM; //РНМ см ПОЛУЧИТЬДЛИННЫЕЗАВОДСКОЙНОМЕРИРНМ()

		std::string ROUGHVALVE;//ГРУБЫЙКЛАПАН Пустая строка
		//std::string SerialNumber; //SERIALNUMBER ЗАВОДСКОЙНОМЕР (смотри: PrinterNumber)
		std::string StringHead;
		std::string StringTail;
		std::string StringForPrinting; // СТРОКАДЛЯПЕЧАТИ
		void setStringForPrinting(std::string str);

		double Tax1, Tax2, Tax3, Tax4, Tax5; // (НАЛОГ1, НАЛОГ2, НАЛОГ3, НАЛОГ4, НАЛОГ5)

		bool Open; //Открыт фискальный или служебный чек
		int Items; //Количество зарегистрированных продаж в текущем или последнем фискальном чеке.
		double Amount; //Сумма последнего фискального чека
		double Tender; //Сумма оплаты текущего или последнего чека


		double getCashIn(); //float CashIn; //КэшИн Float, чтение/запись, используется как показатель суммы внесения после выполенния опереции CASHINCOME (ВНЕСЕНИЕ), CASHOUTCOME (ВЫПЛАТА) и покупок/продаж
		double getCashOut(); //float CashOut; //КэшАут Float, чтение/запись, используется как показатель суммы выплат после выполенния опереции CASHINCOME (ВНЕСЕНИЕ), CASHOUTCOME (ВЫПЛАТА)
		double getCashSum(); //float CashSum; //КэшСумма Float, чтение/запись, используется как показатель суммы наличности в кассе после выполенния опереции CASHINCOME (ВНЕСЕНИЕ), CASHOUTCOME (ВЫПЛАТА) и покупок/продаж
		int getSessionSec();
		std::string getStatuses();

		//int TimeOut; //ТАЙМАУТПРИЕМАБАЙТА

		std::string FIRSTSESSIONDATE; //Указывает дату начала для печати отчета методом FISCALREPORTFORDATESRANGE (ФИСКАЛЬНЫЙОТЧЁТПОДИАПАЗОНУДАТ)
		std::string LASTSESSIONDATE; //Указывает дату окончания для печати отчета методом FISCALREPORTFORDATESRANGE (ФИСКАЛЬНЫЙОТЧЁТПОДИАПАЗОНУДАТ)
		int FirstSessionNumber; //Указывает начальную смену для печати отчета методом FISCALREPORTFORSESSIONRANGE (ФИСКАЛЬНЫЙОТЧЁТПОДИАПАЗОНУСМЕН)
		int LastSessionNumber; //Указывает конечную смену для печати отчета методом FISCALREPORTFORSESSIONRANGE (ФИСКАЛЬНЫЙОТЧЁТПОДИАПАЗОНУСМЕН)


		int LDIndex; //ИНДЕКСЛУ Integer, чтение/запись, содержит текущее выбранное логическое устройство
		int LDNumber; //НОМЕРЛУ Integer, чтение/запись, содержит текущее выбранное логическое устройство
		std::string LDName; //ИМЯЛУ Строка, чтение/запись, содержит имя текущего логического устройства. По-умолчанию инициализируется строкой «Устройство №N», где N — порядковый номер устройства (начиная с 1)

		//std::string ECRFlafs; //ФЛАГИККМ Строка, чтение, содержит полный развернутый статус ККМ в виде строки размером 6*8 байт, состоящей из символов '0' или '1', позволяющей получить любую информацию о текущем статусе ККМ. Строка состояния соответствует побитному описанию статуса ФР Порт. Заполняется применением метода GETECRSTATUS (ПОЛУЧИТЬСОСТОЯНИЕККМ)
		int LineNumber; //НОМЕРЛИНИИ чтение/запись, задает номер строки для загрузки в качестве графического логотипа методом LOADLINEDATA (ЗАГРУЗКАГРАФИКИ)
		std::string LineData; //ГРАФИЧЕСКАЯИНФОРМАЦИЯ Cтрока, чтение/запись, задает содержимое загружаемой строки шрафического логотипа методом LOADLINEDATA (ЗАГРУЗКАГРАФИКИ)
//		float TaxA, TaxB, TaxC, TaxD, TaxE; //(СУММАА, СУММАБ, СУММАВ, СУММАГ) Float, чтние, содержит сумму накоплений в кассе за смену (до снятия Z-отчета) по налоговым ставкам A, B, C, D. Сумма может быть получена вызовом метода (GETSUMS (СУММАНАКОПЛЕНИЙ))
		std::string PayMode; //ТИПОПЛАТЫ Задает тип оплаты, используемый при оплате и закрытии чека. Может быть указан один из следующих типов: ‘P’ – Оплата наличными; ‘N’ – Оплата в кредит; ‘C’ – Оплата чеком; ‘D’ – Оплата дебитной картой ‘I’ - Программируемый тип оплаты 1 ‘J’ - Программируемый тип оплаты 2 ‘K’ - Программируемый тип оплаты 3 ‘L’ - Программируемый тип оплаты 4 Примечание: по-умолчанию (если свойство не проинициализировано) используется оплата наличными.

		//Перременные для работы с логическим устройством
		int ActiveLD; //Активное логическое устройство
		std::string LDComputerName; //ИМЯКОМПЬЮТЕРАЛУ Строка, чтение/запись, задает имя компьютера, на котором установлено физическое устройство ФР. Примечание: В даной версии поддерживается, но не используется.
		int LDTimeOut; //ТАЙМАУТЛУ Integer, чтение/запись, задает таймаут для текущего ЛУ
		int LDBaudRate; //СКОРОСТЬОБМЕНАЛУ чтеие/запись, устанавливает или получает текущую скорость обмена с ФР, сохраненную или сохраняемую в ЛУ. Используется методами ENUMLD (ПЕРЕЧИСЛИТЬЛУ), GETPARAMLD (ПОЛУЧИТЬПАРАМЕТРЫЛУ), SETACTIVELD (УСТАНОВИТЬАКТИВНОЕЛУ), SETPARAMLD (УСТАНОВИТЬПАРАМЕТРЫЛУ),
		int LDComNumber; //COMПОРТЛУ Integer, чтеие/запись, устанавливает или получает текущий порт для обмена с ФР, сохраненный ли сохраняемый в ЛУ. Используется методами ENUMLD (ПЕРЕЧИСЛИТЬЛУ), GETPARAMLD (ПОЛУЧИТЬПАРАМЕТРЫЛУ), SETACTIVELD (УСТАНОВИТЬАКТИВНОЕЛУ), SETPARAMLD (УСТАНОВИТЬПАРАМЕТРЫЛУ),
		
		std::string LDFrType;
		std::string FrType; //

		//bool PORTLOCKED; //ПОРТЗАБЛОКИРОВАН Boolean, чтение, утсанавливается в True (1), если порт используется и в False (0), если порт свободен
		bool UseReceiptRibbon; //Печатать либо не печатать при выполнении функций: PrintString, PrintWideString, FeedDocument.
		bool UseJournalRibbon; //ИспользоватьОперационныйЖурнал

		FP300KZ1C();
		~FP300KZ1C();
		bool getECRStatus();

		bool SaveSetup();
		bool LoadSetup();
		bool AddLD(std::string Name,int ComNumber,int BaudRate,std::string  ComputerName,int TimeOut,std::string FrType);  //<Добавить логическое устройство
		bool DelLD(int LDNumber);
		bool LoadLD(); //Загрузить логические устройства
		bool SaveLD();
		int getLDCount(); //LDCount ОЛИЧЕСТВОЛУ Integer, чтение, содержит количество логических устройств, получаемое методом GETCOUNTLD (ПОЛУЧИТЬКОЛИЧЕСТВОЛУ), изменяется при удалении или добавлении нового ЛУ
		int GetLastPrintedDocNumber2();
		std::string ECRFlags(); //Свойство в виде метода
};
//---------------------------------------------------------------------------
#endif