//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "ValidatorThread.h"
#include "Validator.h"
#include "PrinterOPOS.h"
#include "uf_Main.h"
#include "ud_Module.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------

//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall ValidatorThread::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
__fastcall ValidatorThread::ValidatorThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
	bStop=false;
}
//---------------------------------------------------------------------------
void __fastcall ValidatorThread::Execute()
{
	while(!bStop)
	{
		pay=validator->getPay(state);
                Synchronize(UpdateState);
		if(pay!=0)
	               	Synchronize(UpdateCaption);
	}
	validator->endPay();
}
//---------------------------------------------------------------------------
void ValidatorThread::Stop()
{
	bStop=true;
}
//---------------------------------------------------------------------------
//Проверка состояния блокировка интерфейса если идёт приём денег
void __fastcall ValidatorThread::UpdateState()
{

	//TODO оплатил денюжку потом засунул левую либо не доконца засунул не обновляется кнопка оплатить!!!
	if(state==0x15)
        {
	        frmMain->gbtnJCheck->Enabled=false;
        	frmMain->gbtnPCheck->Enabled=false;
        }else
        if(state==0x19 || state==0x81)
        {
        	if(frmMain->sum!=0)
                {
		        frmMain->gbtnJCheck->Enabled=true;
        		frmMain->gbtnPCheck->Enabled=true;
                }
        }

}
//---------------------------------------------------------------------------
//передаём сумму
void __fastcall ValidatorThread::UpdateCaption()
{
	TService* ser=NULL;

	bool isOk=true;
	frmMain->gbtnJCheck->Enabled=true; //разрешаем кнопк платёж
	frmMain->gbtnPCheck->Enabled=true;
	frmMain->gbtnMainMenu->Enabled=false;

	frmMain->sum+=pay;
//	frmMain->Label13->Caption=dModule->language->Values["npay"]+" "+IntToStr(frmMain->sum)+"тг.";
	frmMain->Label9->Caption=dModule->language->Values["npay"]+" "+IntToStr(frmMain->sum)+"тг.";

	//Добавляю к сумме выделенной услуги
	TService* s=NULL;
	for(int i=0;i<dModule->LService->Count;i++)
	{
		if(((TService*)dModule->LService->Items[i])->select)
		{
			s=(TService*)dModule->LService->Items[i];
			break;
		}
	}
	if(s!=NULL)
	{
		s->sum+=pay;
		s->lblSum->Caption=IntToStr(s->sum);
	}



try
{
	//Сохраняем платёж в базе данных
	if(dModule->UserType) //true - Юредическое лицо
	{
		if(dModule->BalanceType==1) //Задолженность по холодной воде
		{
			if(dModule->addPayJuridicalPerson(dModule->UserId, pay, g_printer->getCheckId()+1))
				dModule->OraSession1->Commit();
			else
				{isOk=false; dModule->OraSession1->Rollback();}
		}else
		if(dModule->BalanceType==2) //Задолженность по канализации
		{
			if(dModule->addPayJuridicalPerson(dModule->UserId, pay, g_printer->getCheckId()+1))
				dModule->OraSession1->Commit();
			else
				{isOk=false; dModule->OraSession1->Rollback();}
		}
	}else //false - физическое лицо
	{
		ser=dModule->getSelectService();
		if(ser==NULL){isOk=false; dModule->OraSession1->Rollback();}
		else
		{
			if(dModule->BalanceType==1) //Задолженность по холодной воде
			{
				if(dModule->addPayPhysicalPerson(dModule->UserId, ser->id, pay, g_printer->getCheckId()+1))
					dModule->OraSession1->Commit();
				else
					{isOk=false; dModule->OraSession1->Rollback();}
			}else
			if(dModule->BalanceType==2) //Задолженность по канализации
			{
				if(dModule->addPayPhysicalPerson(dModule->UserId, ser->id, pay, g_printer->getCheckId()+1))
					dModule->OraSession1->Commit();
				else
					{isOk=false; dModule->OraSession1->Rollback();}
			}
		}
	}
}catch(...){isOk=false;}

	//Если не сохранился в базе Оракла то сохраняем локально
	if(!isOk)
	{
		int set_id=0; if(ser!=NULL) set_id=ser->id;
		if(dModule->BalanceType==1)
		{
			dModule->savePay(1,dModule->UserType,dModule->UserId,set_id,pay,g_printer->getCheckId()+1); //Холодная
		}
		else
		if(dModule->BalanceType==2)
			dModule->savePay(2,dModule->UserType,dModule->UserId,set_id,pay,g_printer->getCheckId()+1); //Канализация
	}
}
//---------------------------------------------------------------------------
