//---------------------------------------------------------------------------
#pragma hdrstop
#include "stdafx.h"
//---------------------------------------------------------------------------
#include "FP300KZ1C.h"
#include <WTools.h>
//---------------------------------------------------------------------------
FP300KZ1C::FP300KZ1C()
{
	//DiscountInvertor=1;
	DocumentNumber=0;
	OperatorNumber=1;
	PayMode="P"; //Наличными
	ActiveLD=-1; //Активное логическое устройство
	UseReceiptRibbon=true; //Печатать на ленте
	UseJournalRibbon=true;
	Absolute=false; //Процентное
	Discount=0; //Скидка
	Tax1=0; Tax2=0; Tax3=0; Tax4=0;
	Department=0;
	StringQuantity=5; //На сколько двиигать бумагу

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

	ListLDDevice=new TSimpleList<LDDevice*>(10,true); //Список LD устройств
}
//---------------------------------------------------------------------------
FP300KZ1C::~FP300KZ1C()
{
	delete ListLDDevice;
}
//---------------------------------------------------------------------------
//Получить состояние ККМ
bool FP300KZ1C::getECRStatus()
{
	GetStatusFP();
	bool b=true;
	unsigned short De,Me,Ye,Ho,Mi,Se;
	b=b && GetDateTime(De,Me,Ye,Ho,Mi,Se); ///<Поолучение даты и времени
	Date=add0(IntToStdStr(De))+"-"+add0(IntToStdStr(Me))+"-"+add0(IntToStdStr(Ye)); //DD-MM-YYYY
	Time=add0(IntToStdStr(Ho))+":"+add0(IntToStdStr(Mi))+":"+add0(IntToStdStr(Se)); //HH:MM:SS
	return b;
}
//---------------------------------------------------------------------------
bool FP300KZ1C::SaveSetup()
{	
	bool b=true;
/*	std::wstring path=getCommonAppPathW()+L"\\NewTon\\Setup.ini";
	std::string str;
	str=toStdStr(cPort->ComNumber);
	b=b && IniWrite(path, "Main", "ComNumber", str.c_str());
	str=toStdStr(cPort->BaudRate);
	b=b && IniWrite(path, "Main", "BaudRate", str.c_str());
	//str=toStdStr(cPort->TimeOut)
	b=b && IniWrite(path, "Main", "TimeOut", "500");
*/
	return b;
}
//---------------------------------------------------------------------------
bool FP300KZ1C::LoadSetup()
{
/*	std::wstring path=getCommonAppPathW()+"\\NewTon\\Setup.ini";
	std::string str;
	str=IniRead(path, "Main", "ComNumber");
	cPort->ComNumber=fromString<int>(str);
	str=IniRead(path, "Main", "BaudRate");
	cPort->BaudRate=fromString<int>(str);
	//Timeout
*/
	return true;
}
//---------------------------------------------------------------------------
//Добавить логическое устройство в конец списка и сразу сохранить в ini файл
///\param Name Имя ЛУ
///\param ComNumber Номер ком-порта ЛУ
///\param BaudRate Скорость работы ЛУ, в бодах или в виде индекса (индекс 0 соответствует скорости 1200 бод)
///\param ComputerName Имя компьютера, на котором установлено физическое устройство
///\param TimeOut Таймаут ожидания ответа от ЛУ
///\param FrType Тип ФР, соответствующий добавляемому ЛУ
bool FP300KZ1C::AddLD(std::string Name,int ComNumber,int BaudRate,std::string ComputerName,int TimeOut,std::string FrType)
{
	//Ищем максимальный номер для уникальности
	int Number=0;
	for(unsigned int i=0;i<ListLDDevice->count();i++)
		if(Number<ListLDDevice->get(i)->Number) Number=ListLDDevice->get(i)->Number;

	LDDevice *dv= new LDDevice;
	dv->Name=Name;
	dv->Number=Number+1;
	dv->ComNumber=ComNumber;
	dv->BaudRate=BaudRate;
	dv->ComputerName=ComputerName;
	dv->TimeOut=TimeOut;
	dv->FrType=FrType;
	ListLDDevice->add(dv);
	SaveLD(); //Персохраняем весь список в ini файл
	return true;
}
//---------------------------------------------------------------------------
//По номеру лог устройство и удаляем
bool FP300KZ1C::DelLD(int LDNumber)
{
	for(unsigned int i=0;i<ListLDDevice->count();i++)
	{
		if(ListLDDevice->get(i)->Number==LDNumber)
		{
			ListLDDevice->del(i);
			i--;
		}
	}
	SaveLD(); //Персохраняем весь список в ini файл
	return true;
}
//---------------------------------------------------------------------------
//ЗАГРУЗИИТЬЛУ
bool FP300KZ1C::LoadLD()
{
	//TIniFileSTD* ini=new TIniFileSTD(getCommonAppPathW()+L"\\Newton\\Setup.ini");
	//delete ini;

	std::wstring str;
	std::wstring path=getCommonAppPathW()+L"\\Newton\\Setup.ini";

	//Загружаем активное логическое устройство
	str=IniReadW(path, L"Main", L"ActiveLD");
	if(str==L"") str=L"-1";
	ActiveLD=fromWString<int>(str);

	ListLDDevice->clear();
	//загружаем количество устройств
	str=IniReadW(path, L"Main", L"LDCount");
	if(str==L"") str=L"0";
	int cnt=fromWString<int>(str);
	for(int i=0; i<cnt; i++)
	{
		str=L"LDDevice"+toStdWStr(i);
		LDDevice *dv= new LDDevice;

		dv->Number=fromWString<int>(IniReadW(path, str, L"Number"));
		dv->Name = WStringToString( IniReadW(path, str, L"Name"), std::locale(""));
		dv->ComNumber=fromWString<int>(IniReadW(path, str, L"ComNumber"));
		dv->BaudRate=fromWString<int>(IniReadW(path, str, L"BaudRate"));
		dv->ComputerName=WStringToString( IniReadW(path, str, L"ComputerName"), std::locale(""));
		dv->TimeOut=fromWString<int>(IniReadW(path, str, L"TimeOut"));
		dv->FrType=WStringToString( IniReadW(path, str, L"FrType"), std::locale(""));

		ListLDDevice->add(dv);
	}

	return true;
}
//---------------------------------------------------------------------------
//Сохраниить логические устройства
bool FP300KZ1C::SaveLD()
{
	std::wstring path=getCommonAppPathW()+L"\\NewTon\\Setup.ini";

	LDDevice *dv;
	//Персохраняем весь список в ini файл
	std::string str=IntToStdStr(ListLDDevice->count());
	//std::string str=toStdStr(ListLDDevice->count());
	//std::string str=toStdStr(ListLDDevice->count());
	IniWriteW(path, L"Main", L"LDCount", StringToWString(str,std::locale("")));
	
	str=IntToStdStr(ActiveLD);
	//str=toStdStr(ActiveLD);
	IniWriteW(path, L"Main", L"ActiveLD", StringToWString(str,std::locale("")));


	for(uint4 i=0;i<ListLDDevice->count();i++)
	{
		
		str="LDDevice"+IntToStdStr(i);
		//str="LDDevice"+toStdStr(i);
		dv=ListLDDevice->get(i);

		IniWriteW(path, StringToWString(str,std::locale("")), L"Number", StringToWString(IntToStdStr(dv->Number),std::locale("")));
		IniWriteW(path, StringToWString(str,std::locale("")), L"Name", StringToWString(dv->Name,std::locale("")));
		IniWriteW(path, StringToWString(str,std::locale("")), L"ComNumber", StringToWString(IntToStdStr(dv->ComNumber),std::locale("")));
		IniWriteW(path, StringToWString(str,std::locale("")), L"BaudRate", StringToWString(IntToStdStr(dv->BaudRate),std::locale("")));
		IniWriteW(path, StringToWString(str,std::locale("")), L"ComputerName", StringToWString(dv->ComputerName,std::locale("")));
		IniWriteW(path, StringToWString(str,std::locale("")), L"TimeOut", StringToWString(IntToStdStr(dv->TimeOut),std::locale("")));
		IniWriteW(path, StringToWString(str,std::locale("")), L"FrType", StringToWString(dv->FrType,std::locale("")));
/*
		IniWriteW(path, StringToWString(str,std::locale("")), L"Number", StringToWString(toStdStr(dv->Number),std::locale("")));
		IniWriteW(path, StringToWString(str,std::locale("")), L"Name", StringToWString(dv->Name,std::locale("")));
		IniWriteW(path, StringToWString(str,std::locale("")), L"ComNumber", StringToWString(toStdStr(dv->ComNumber),std::locale("")));
		IniWriteW(path, StringToWString(str,std::locale("")), L"BaudRate", StringToWString(toStdStr(dv->BaudRate),std::locale("")));
		IniWriteW(path, StringToWString(str,std::locale("")), L"ComputerName", StringToWString(dv->ComputerName,std::locale("")));
		IniWriteW(path, StringToWString(str,std::locale("")), L"TimeOut", StringToWString(toStdStr(dv->TimeOut),std::locale("")));
		IniWriteW(path, StringToWString(str,std::locale("")), L"FrType", StringToWString(dv->FrType,std::locale("")));
*/
	}

	return true;
}
//---------------------------------------------------------------------------
//Обвёртка специально для свойств
int FP300KZ1C::getLDCount()
{
	return ListLDDevice->count();
}
//---------------------------------------------------------------------------
//Обвёртка специально для свойств
std::string FP300KZ1C::ECRFlags()
{
	return Status->getStatus();
}
//---------------------------------------------------------------------------
void FP300KZ1C::setStringForPrinting(std::string str)
{
	replaseChars(str,10,' ');
	StringForPrinting=str;
}
//---------------------------------------------------------------------------
int FP300KZ1C::GetLastPrintedDocNumber2()
{
	int num;
	GetLastPrintedDocNumber(num);
	return num;
}
//---------------------------------------------------------------------------
//Вся сумма в кассе
double FP300KZ1C::getCashSum()
{
	std::string ExitCode;
	double CashSum,ServIn,ServOut;
	ParishOrConsumption("","",0.0,L"",L"",ExitCode,CashSum,ServIn,ServOut);

	return CashSum;
}
//---------------------------------------------------------------------------
//Сума внесений наличности в кассу
double FP300KZ1C::getCashIn()
{
	std::string ExitCode;
	double CashSum,ServIn,ServOut;
	ParishOrConsumption("","",0.0,L"",L"",ExitCode,CashSum,ServIn,ServOut);

	return ServIn;
}
//---------------------------------------------------------------------------
//Сумма выемки налличности из кассы
double FP300KZ1C::getCashOut()
{
	std::string ExitCode;
	double CashSum,ServIn,ServOut;
	ParishOrConsumption("","",0.0,L"",L"",ExitCode,CashSum,ServIn,ServOut);

	return ServOut;
}
//---------------------------------------------------------------------------
//Секунд с начала смены
int FP300KZ1C::getSessionSec()
{
	int sec=0;
	SessionSec(sec); //Секунд с начала смены
	return sec;
}
