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

#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()
{
	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 - физическое лицо
	{
	        TService* 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)
	{
		if(dModule->BalanceType==1)
			dModule->savePay(1,dModule->UserType,dModule->UserId,ser->id,pay,g_printer->getCheckId()+1); //Холодная
		else
                if(dModule->BalanceType==2)
			dModule->savePay(2,dModule->UserType,dModule->UserId,ser->id,pay,g_printer->getCheckId()+1); //Канализация
	}
}
//---------------------------------------------------------------------------
