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

#ifndef PrinterOPOSH
#define PrinterOPOSH
//---------------------------------------------------------------------------
#include "OposFiscalPrinter_1_7_Lib_OCX.h"
//---------------------------------------------------------------------------
const LONG FPTR_RT_CASH_IN = 1;
const LONG FPTR_RT_CASH_OUT = 2;
const LONG FPTR_RT_GENERIC = 3;
const LONG FPTR_RT_SALES = 4;
const LONG FPTR_RT_SERVICE = 5;
const LONG FPTR_RT_SIMPLE_INVOICE = 6;
//---------------------------------------------------------------------------
//Продаваемый товар
class Goods
{
	private:
	public:
		WideString name; //Название товара
		double price; //Цена за еденицу
		long count; //Количество
		long VatInfo; //Номер налоговой ставки из справочника
		Goods(WideString name,double price, long count,long VatInfo){this->name=name; this->price=price; this->count=count; this->VatInfo=VatInfo; };
};
//---------------------------------------------------------------------------
//Обвёртка для OPOS фискального принтера
class PrinterOPOS
{
	private:
		bool Crashed;
		TOPOSFiscalPrinter *fp;
		long FState;
		TList* FListGoods;
	public:
		AnsiString HeadLine; //Первая строка в чеке "Оплата за услуги водоснабжения"
		long CheckId; //Сколько распечатали чеков на данном терминале
		bool TestMode;

		bool setTrainingMode(bool val);
		bool getTrainingMode();

		PrinterOPOS(TComponent* AOwner);
		virtual ~PrinterOPOS();
		void LoadSetup();
		void SaveSetup();
		bool Start(); //Соедениться по COM порту и проинициализировать принтер
		bool PrintCheck(bool sales, int check); //Печать чека
		bool SaveCheck(int CheckId); //Сохранение чека для последующей распечатки
		bool deleteCheck(int CheckId); //Удаление чека из базы
		int getNextCheckId();

		bool PrintLine(WideString line);
		void addGoods(Goods* goods);
		void ClearGoods();
		int getGoodsPrice();
		void Cut(); //Отрезать бумагу
		int GetState(); //0 - Нет ошибок готов к печати чека
		bool isOk(); //Проверка работоспособности принтера
		AnsiString GetStatusDescription(long StatusCode); //Описание статуса
		AnsiString getLastError(long* err); //Получить код последней ошибки
		AnsiString getLastError(); //Получить код последней ошибки
		TDateTime getDateOpenShift(); //Получить дату открытия смены

		void setHeader(TStrings* Text);
		void getHeader(TStrings* Text);
		void setTrailer(TStrings* Text);
		void getTrailer(TStrings* Text);
		int getCOMPort();
		void setCOMPort(int n);
		int getBaudRate();
		void setBaudRate(int val);
		int getDaySum();//Сумма в касса с прошлого Z отчёта


		bool PrintZReport(); //Печать отчёта и закрытие смены
		void PrintXReport(); //Печать суточного отчёта без закрытия смены
		bool OpenShift(); //Открытие смены
		bool DayOpened(); //Отрыта ли смена

		bool setNalog(long n,float stavka); //Заполнение массива с суммами по налоговым ставкам

		void PrintCheck(TStringList* Text){}; //Print lines and cut
		void Push(){}; //В OPOS драйвере нет такой функции
};
//---------------------------------------------------------------------------
extern PrinterOPOS* printerOPOS;
//---------------------------------------------------------------------------
#endif
