Files
Tools_CPP/devices/Printers/Mebius/__history/PrinterOPOS.cpp.~19~
2024-11-01 12:23:13 +05:00

929 lines
30 KiB
Plaintext

//---------------------------------------------------------------------------
#pragma hdrstop
#include "PrinterOPOS.h"
#include "OposFiscalPrinter_1_7_Lib_OCX.h"
//#include "OposFiscalPrinter_CCO_OCX.h"
#include "ud_Module.h"
#include <Registry.hpp>
#include <Math.h>
#include <DateUtils.hpp>
#include <Dialogs.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
FiscalPrinter* g_printer;
//---------------------------------------------------------------------------
char * kkm_err_msg_ru[] = {
"OK", //0
"ÔÏ ID îøèáêà", //1 FM ID Error
"Îøèáêà çàïèñè â ÔÏ ", //2 FM Rec Error
"Flash Chip íå ìîæåò áûòü î÷èùåí", //3 Flash Chip cant clear
"ÔÏ íå ïóñòà", //4 FM not empty
"Äàííûå â ÔÏ ðàçðóøåííû", //5 FM Data destroyed
"Ðåæ ïðèíòåð èãíîðèð êìä", //6 Cmd ignor prn mode
"Íåò êîäà îïåðàòîðà", //7 Oper code is absent
"Íåò òèïà äîêóìåíòà", //8 Doc type is absent
"Ñåð. íîìåð ÊÊÌ", //9 Ser num CR
"Îøèáêà ïàðîëÿ", //10 Password error
"Îøèáêà äàòà/âðåìÿ", //11 Data/Time error
"Çàâîä. ðåã. ðàíåå", //12 Factory registration has already pass
"Ñåð íîì ÊÊÌ ðàçðóøåí", //13 Ser num CR destroyed
"Ôèñêàëèçàöèÿ ðàíåå", //14 Fiscalize has already pass
"ÊÊÌ íå ôèñê ðåæèì", //15 Not fisc mode CR
"Ôèñêàë ÊÊÌ ðàçðóøåí", //16 Fiscalize Data destroyed
"Ïåðåðåã ÊÊÌ èñ÷åðïàí", //17 Rewrite is conclude
"Ïåðåðåã ÊÊÌ ðàçðóøåí", //18 Rewrite is destroyed
"Ñìåíà îòêðûòà", //19 Shift already open
"Ñì íå áûëà îòêðûòà", //20 Shift not opened
"Ìíîãî òîâàðà â ÷åêå", //21 Many goods in receipt
"ÑÌ â ÔÏ ðàçðóøåííà", //22 EOD data in FM destroyed
"Ôîðìàò äîêóìåíòà", //23 Document format error
"Ïåðåçàïèñü òåêñòà", //24 Text rewrite
"Ìíîãî ïàð-ðîâ äîê", //25 Many parameters in document
"Îø ïàðàìåòð äîê-òà", //26 Document parameters error
"Îø çíà÷åíèÿ ïàð-ðà", //27 Parameters value error
"Íåñóùåñòâóþù îáúåêò", //28 Object non-existent
"Äîê íå áûë çàâåðøåí", //29 Document is not finished
"Òîâàð/îïåð íå ïîëíî", //30 goods/operation description not enough
"Êîíòðîë ñóììà ïàêåòà", //31 Check sum packet
"Ïðèíòåð íå ãîòîâ", //32 Prn not ready
"Âëîæåííûå ïðåðûâàíèÿ", //33 Nested interrupts
"Áàéò ïîäòâ ïðèåì äàííûõ", //34 Check Sum Error
"Ïåðåïîëíåííèå â ÔÏ", //35 Overflow if FM
"Íåèçâåñòíàÿ êîììàíäà", //36 Unknown command
"CRC ÎÇÓ", //37 CRC RAM
"CRC ÔÏ", //38 CRC FM
"Ïîðò äàííûõ íåèñïðàâ", //39 Data port defective
"Ïîðÿäîê ðåêâ ÷åêà", //40 Receipts parameters sequence
"0xy äëÿ îáÿçàò ðåêâ", //41 0xy for required properties
"Äëèííà çàïðîñà", //42 Length request
"Ðàçðÿäíîñòü ÷èñëà", //43 number capacity
"Ïåðåïîëíåíèå", //44 Overflow
"Íåò ÷èñëà", //45 Number is absent
"Íåò îòâåòà", //46 Not response
"Îøèáêà ïåðåäà÷è", //47 Transmission error
"Ìàò. ïåðåïîëíåíèå", //48 Math overflow
"Íåò áóìàãè...", //49 Paper out...
"ÊÊÌ íå ãîòîâà!!!", //50 CR not ready!!!
"Ñáîé ïàìÿòè!!", //51 Memory error!!
"Ïðèíòåð âûêëþ÷åí", //52 Printer off
"Íåäîñòàòî÷íî ïàìÿòè", //53 Insufficient memory
"Äëèííà íîìåðà ìåíüøå", //54 Lenght number less
"Íóëåâàÿ äëèííà íîìåðà", //55 Zero lenght number
"Äëèííà ïàðîëÿ ìåíüøå äîïóñòèìîé", //56 Password lenght less permissible
"Íóëåâàÿ äëèííà ïàðîëÿ", //57 Zero lenght password
"Íåäîïóñòèìàÿ âåëè÷èíà", //58 Impossible value
"Ïðåâûøåí òàéì-àóò", //59 Time-out overdraw
"",
"Îø.ÝÊËÇ",
"Íåäîïóñòèìîå ñîñòîÿíèå ÝÊËÇ",
"Äàííûå ó÷òåíû",
"","","","","","",//69
"","","","","","","","","","",//79
"","","","","","","","","","",//89
"","","","","","","","","","",//99
"","","","","","","","","","",//109
"","","","","","","","","","",//119
"","","","","","","","","","",//129
"","","","","","","","","","",//139
"","","","","","","","","","",//149
"","","","","","","","","","",//159
"","","","","","","","","","",//169
"","","","","","","","","","",//179
"","","","","","","","","","",//189
"","","","","","","","","","",//199
"","","","","","","","","","",//209
"","","","","","","","","","",//219
"","","","","","","","","","",//229
"","","","","","","","","","",//239
"Êîìàíäû íåò",//240 Cmd not init
"Îø. ïîñûëêè êîìàíäû",//241 Cmd write err
"Êîìàíäà íå îòîñëàíà ÊÊÌ-íåãîòîâ(DSR=0)",//242 Prn not ready (DSR=0)
"Êîìàíäà îòîñëàíà, íî îòâåò ÷òî ÊÊÌ-íåãîòîâ",//243 Cmd ok
"Ïðåâûøåíî âðåìÿ îæèäàíèÿ îòâåòà",//244 Cmd resp timeout
"Îøèáêà",//245 Prn error
"Ïðèøëî áîëüøå äàííûõ, ÷åì îæèäàëè",//246 Cmd resp large
"Ïðèøëî ìåíüøå äàííûõ, ÷åì îæèäàëè",//247 Cmd resp small
"Ïðèøëè íåêèå äàííûå",//248
"Ïîðò çàêðûò",//249
"Ïîðò çàêðûò âî âðåìÿ âûïîëíåíèÿ",//250 Cmd break
"ÊÊÌ âûêëþ÷åí èëè ñëîìàí",//251
"ÊÊÌ íåãîòîâ",//252
"Îøèáêà â ïàðàìåòðàõ êîìàíäû",//253
"Íåñóùåñòâóþùèé íîìåð êîìàíäû",//254
"ÊÊÌ çàíÿò(ïðåäûäóùàÿ êîìàíäà)!"//255 Previous cmd run
};
//------------------------------------------------------------------------------
bool FiscalPrinter::getNextCheckId(int &id)
{
CheckId++; //Íîìåð ÷åêà
SaveSetup(); //ñîõðàíÿåì íîìåð ÷åêà
id=CheckId;
return true;
}
//---------------------------------------------------------------------------
bool FiscalPrinter::SaveCheck(int CheckId) //Ñîõðàíåíèå ÷åêà äëÿ ïîñëåäóþùåé ðàñïå÷àòêè (ñóììû)
{
if(dModule->UserType) //true - Þðåäè÷åñêîå ëèöî; false - ôèçè÷åñêîå ëèöî
dModule->SaveCheck(CheckId,dModule->UserId,0,getGoodsPrice());
else
dModule->SaveCheck(CheckId,0,dModule->UserId,getGoodsPrice());
return true;
}
//---------------------------------------------------------------------------
bool FiscalPrinter::deleteCheck(int CheckId) //Óäàëåíèå ÷åêà
{
dModule->UpdateChek(CheckId);
return true;
}
//---------------------------------------------------------------------------
int FiscalPrinter::getCOMPort()
{
int n=-1;
TRegistry* reg=new TRegistry;
reg->RootKey = HKEY_LOCAL_MACHINE;
if(reg->OpenKeyReadOnly("\\SOFTWARE\\OLEforRetail\\ServiceOPOS\\FiscalPrinter\\MbsFiscalPrinter"))
{
n = reg->ReadInteger("COM Num");
}
delete reg;
return n;
}
//---------------------------------------------------------------------------
void FiscalPrinter::setBaudRate(int val)
{
TRegistry* reg=new TRegistry;
reg->RootKey = HKEY_LOCAL_MACHINE;
if(reg->OpenKey("\\SOFTWARE\\OLEforRetail\\ServiceOPOS\\FiscalPrinter\\MbsFiscalPrinter",true))
{
reg->WriteInteger("COM Speed",val);
}
delete reg;
}
//---------------------------------------------------------------------------
int FiscalPrinter::getBaudRate()
{
int n=-1;
TRegistry* reg=new TRegistry;
reg->RootKey = HKEY_LOCAL_MACHINE;
if(reg->OpenKeyReadOnly("\\SOFTWARE\\OLEforRetail\\ServiceOPOS\\FiscalPrinter\\MbsFiscalPrinter"))
{
n = reg->ReadInteger("COM Speed");
}
delete reg;
return n;
}
//---------------------------------------------------------------------------
void FiscalPrinter::setCOMPort(int n)
{
TRegistry* reg=new TRegistry;
reg->RootKey = HKEY_LOCAL_MACHINE;
if(reg->OpenKey("\\SOFTWARE\\OLEforRetail\\ServiceOPOS\\FiscalPrinter\\MbsFiscalPrinter",true))
{
reg->WriteInteger("COM Num",n);
}
delete reg;
}
//---------------------------------------------------------------------------
void FiscalPrinter::LoadSetup()
{
TIniFile* ini=new TIniFile(ExtractFilePath(ParamStr(0))+"\\Setup.ini");
// cPort->port=ini->ReadString("Printer","Port","");
// cPort->BaudRate=ini->ReadInteger("Printer","BaudRate",0);
CheckId=ini->ReadInteger("Printer","CheckCount",0);
TestMode=ini->ReadBool("Printer","TestMode",true);
HeadLine=ini->ReadString("Printer","HeadLine","");
GoodsName=ini->ReadString("Printer","GoodsName","");
CasireName=ini->ReadString("Printer","CasireName","");
AutoOpenShift=ini->ReadBool("Printer","AutoOpenShift",false);
delete ini;
}
//---------------------------------------------------------------------------
void FiscalPrinter::SaveSetup()
{
TIniFile* ini=new TIniFile(ExtractFilePath(ParamStr(0))+"\\Setup.ini");
// ini->WriteString("Printer","Port",cPort->port);
// ini->WriteInteger("Printer","BaudRate",cPort->BaudRate);
ini->WriteInteger("Printer","CheckCount",CheckId);
ini->WriteBool("Printer","TestMode",TestMode);
ini->WriteString("Printer","GoodsName",GoodsName);
ini->WriteString("Printer","CasireName",CasireName);
ini->WriteBool("Printer","AutoOpenShift",AutoOpenShift);
delete ini;
}
//---------------------------------------------------------------------------
int FiscalPrinter::getGoodsPrice()
{
int sum=0;
for(int i=0;i<FListGoods->Count;i++)
sum+=((Goods*)FListGoods->Items[i])->price;
return sum;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
PrinterOPOS::PrinterOPOS(TComponent* AOwner):FiscalPrinter()
{
Crashed=false;
AutoOpenShift=false;
fp=new TOPOSFiscalPrinter(AOwner);
fp->DeviceEnabled = False;
LoadSetup();
}
//---------------------------------------------------------------------------
PrinterOPOS::~PrinterOPOS()
{
delete FListGoods;
delete fp;
}
//---------------------------------------------------------------------------
//Ñîåäåíèòüñÿ ïî COM ïîðòó è ïðîèíèöèàëèçèðîâàòü ïðèíòåð
bool PrinterOPOS::Start()
{
if(fp->DeviceEnabled) return true;
FState = fp->Open(L"MbsFiscalPrinter");
if(FState!=0)
{
saveLog(1,AnsiString(FState)+"(PrinterOPOS::Start)"+GetStatusDescription(FState));
return false;
}
FState = fp->ClaimDevice(1000);
if(FState!=0)
{
saveLog(1,AnsiString(FState)+"(PrinterOPOS::Start)"+GetStatusDescription(FState));
return false;
}
fp->DeviceEnabled = True;
return true;
}
//---------------------------------------------------------------------------
void PrinterOPOS::setHeader(TStrings* Text)
{
long err=0;
try
{
if(Crashed) throw Exception("Äðàéâåð ïðèíòåðà ðàçðóøåí!");
for(int i=0;i<Text->Count;i++)
{
WideString str=Text->Strings[i];
err=fp->SetHeaderLine(i+1,str.c_bstr(),false);
if(err) throw Exception(getLastError(&err));
}
err=fp->ResetPrinter();
if(err)throw Exception(getLastError(&err));
}catch(Exception &exception)
{
if(err==251) Crashed=true; //Êàáçäåö
saveLog(err,"(PrinterOPOS::setHeader)"+exception.Message);
dModule->SendError(err,"(PrinterOPOS::setHeader)"+exception.Message);
}catch(...)
{
saveLog(1,"(PrinterOPOS::setHeader) Íåò îïèñàíèÿ îøèáêè");
dModule->SendError(1,"(PrinterOPOS::setHeader) Íåò îïèñàíèÿ îøèáêè");
}
}
//---------------------------------------------------------------------------
void PrinterOPOS::getHeader(TStrings* Text)
{
TIniFile* ini=new TIniFile(ExtractFilePath(ParamStr(0))+"\\Setup.ini");
Text->Add(ini->ReadString("Printer","HeadLine1",""));
Text->Add(ini->ReadString("Printer","HeadLine2",""));
Text->Add(ini->ReadString("Printer","HeadLine3",""));
Text->Add(ini->ReadString("Printer","HeadLine4",""));
Text->Add(ini->ReadString("Printer","HeadLine5",""));
delete ini;
for(int i=Text->Count-1;i>=0;i--)
if(Text->Strings[i]=="")Text->Delete(i); else break;
}
//---------------------------------------------------------------------------
void PrinterOPOS::setTrailer(TStrings* Text)
{
long err=0;
try
{ if(Crashed) throw Exception("Äðàéâåð ïðèíòåðà ðàçðóøåí!");
for(int i=0;i<Text->Count;i++)
{
WideString str=Text->Strings[i];
err=fp->SetTrailerLine(i+1,str.c_bstr(),false);
if(err) throw Exception(getLastError(&err));
}
err=fp->ResetPrinter();
if(err) throw Exception(getLastError(&err));
}catch(Exception &exception)
{
if(err==251) Crashed=true; //Êàáçäåö
saveLog(err,"(PrinterOPOS::setTrailer)"+exception.Message);
dModule->SendError(err,"(PrinterOPOS::setTrailer)"+exception.Message);
}catch(...)
{
saveLog(1,"(PrinterOPOS::setTrailer) Íåò îïèñàíèÿ îøèáêè");
dModule->SendError(1,"(PrinterOPOS::setTrailer) Íåò îïèñàíèÿ îøèáêè");
}
}
//---------------------------------------------------------------------------
void PrinterOPOS::getTrailer(TStrings* Text)
{
TIniFile* ini=new TIniFile(ExtractFilePath(ParamStr(0))+"\\Setup.ini");
Text->Add(ini->ReadString("Printer","TailLine1",""));
Text->Add(ini->ReadString("Printer","TailLine2",""));
Text->Add(ini->ReadString("Printer","TailLine3",""));
Text->Add(ini->ReadString("Printer","TailLine4",""));
Text->Add(ini->ReadString("Printer","TailLine5",""));
delete ini;
for(int i=Text->Count-1;i>=0;i--)
if(Text->Strings[i]=="")Text->Delete(i); else break;
}
//---------------------------------------------------------------------------
bool PrinterOPOS::PrintLine(WideString line)
{
//Íå ôèñêàëüíàÿ ïå÷àòü
long err=0;
try
{ if(Crashed) throw Exception("Äðàéâåð ïðèíòåðà ðàçðóøåí!");
err=fp->PrintNormal(2, WideString(WideString(WCHAR(0x1B)) + WideString(WCHAR(0x7C)) + line + L"\n").c_bstr());
if(err) throw Exception(getLastError(&err));
}catch(Exception &exception)
{
if(err==251) Crashed=true; //Êàáçäåö
saveLog(err,"(PrinterOPOS::PrintLine)"+exception.Message);
dModule->SendError(err,"(PrinterOPOS::PrintLine)"+exception.Message);
}catch(...)
{
saveLog(1,"(PrinterOPOS::PrintLine) Íåò îïèñàíèÿ îøèáêè");
dModule->SendError(1,"(PrinterOPOS::PrintLine) Íåò îïèñàíèÿ îøèáêè");
}
return err==0;
}
//---------------------------------------------------------------------------
//sales - true ïðîäàæà, false - âîçâðàò
//check - íîìåð ÷åêà åñëè íå çàäàí =0 òî ãåíåðèòüñÿ
//TODO Ôè÷à ýòî ôèêñèðîâàòü íå ðàñïå÷àòàííûå ÷åêè ïîòîì ïå÷àòàòü èõ
bool PrinterOPOS::PrintCheck(bool sales, int check, WideString headLine) //Òåñòîâàÿ ïå÷àòü
{
long err=0;
Currency cur=0;
Currency cAllPrice=0;
bool bOk=true;
try
{ if(Crashed) throw Exception("Äðàéâåð ïðèíòåðà ðàçðóøåí!");
//Ñ÷èòàåì ñóììó â ÷åêå (çàðàíåå íà ñëó÷àé îøèáêè)
cAllPrice=getGoodsPrice();
if(check==0) //åñëè íå çàäàí íîìåð ÷åêà òî ãåíåðèì ñäåñü
{
CheckId++; //Íîìåð ÷åêà
check=CheckId;
SaveSetup(); //ñîõðàíÿåì íîìåð ÷åêà
}
if(fp->RecEmpty) throw Exception("Íåò áóìàãè!");
if(!DayOpened()) throw Exception("Ñìåíà íå îòêðûòà");
Currency UnitPrice,AllPriceDrb,AllPrice;
long Qnt,vat;
BSTR* bstr;
WideString sStr;
BSTR sTmp=new OLECHAR[255];
sTmp=L"";
long MbsResponceCode;
CURRENCY Amount1,Amount2;
//Óñòàíîâêà íîìåðà îòäåëà
//vat=11; sTmp=L"îòäåë";
//err = fp->DirectIO(4, &vat, &sTmp);
//if (err) goto ErrHandler;
//Æåëàòåëüüíî ñäåëàòü â íóòðè ÷åêà TODO!!!
if(headLine.Length()>0)
PrintLine(headLine);
if(sales) fp->FiscalReceiptType = FPTR_RT_SALES; //×åê ïðîäàæè
else fp->FiscalReceiptType=FPTR_RT_SERVICE; //×åê âîçâðàòà
//setTrainingMode(true);
//Ôèñêàëüíàÿ ïå÷àòü (ñ çàãîëîâêîì èëè áåç)
err = fp->BeginFiscalReceipt(true);
if (err) throw Exception(getLastError(&err)); //251
//Òîâàðû èç ñïèñêà â äðàéâåð (TODO Ïðè ïå÷àòè ÷åêà íå ïå÷àòàåòñÿ óñëóãà)
for(int i=0;i<FListGoods->Count;i++)
{
Goods* goods=(Goods*)FListGoods->Items[i];
VarCyFromR8(goods->price*100,&Amount1);
Amount2.int64=0;
WideString tmp=goods->name1+L"-/--/-0";
err=fp->PrintRecItem(tmp.c_bstr(), Amount1, goods->count, goods->VatInfo, Amount2, L"Øò");
if (err) throw Exception(getLastError(&err));
}
ClearGoods();
//óñòàíîâêà íîìåðà ÷åêà (Ïåðåä PrintRecTotal)
err = fp->DirectIO(3, &CheckId, &sTmp);
if (err) throw Exception(getLastError(&err));
//Óñòàíîâêà çíà÷åíèé ìàññèâà íàëîãîâûõ ñòàâîê
//setNalog(1,12);
//Ôîðìèðîâàíèÿ èòîãà â ÷åêå
Amount2.int64=0;
VarCyFromR8(cAllPrice*100,&Amount1);
err=fp->PrintRecTotal(Amount1, Amount1, L"na");
if (err) throw Exception(getLastError(&err));
err = fp->EndFiscalReceipt(True); //Îêîí÷àíèÿ ïå÷àòè, â íåì ïðîèñõîäèò ïå÷àòü äîïîëíèòåëüíîãî òðåéëåðà (AdditionalTrailer) è îáðåçêà áóìàãè
if(err) throw Exception(getLastError(&err));
}
catch(Exception &exception)
{
ClearGoods();
if(err==251) Crashed=true; //Êàáçäåö
saveLog(1,"Îøèáêà ïðè ïå÷àòè ÷åêà: N: "+IntToStr(dModule->UserId)+" ñóììà: "+CurrToStr(cAllPrice)+" ×åê: "+AnsiString(CheckId)+". "+exception.Message);
dModule->SendError(err,"Îøèáêà ïðè ïå÷àòè ÷åêà: N: "+IntToStr(dModule->UserId)+" ñóììà: "+IntToStr(cAllPrice)+" ×åê: "+AnsiString(CheckId)+". "+exception.Message);
bOk=false;
}
catch(...)
{
ClearGoods();
if(err==251) Crashed=true; //Êàáçäåö
saveLog(1,"Íå îïîçíàííàÿ îøèáêà ïðè ïå÷àòè ÷åêà: N: "+IntToStr(dModule->UserId)+" ñóììà: "+IntToStr(cAllPrice)+" ×åê: "+AnsiString(CheckId));
dModule->SendError(1,"Íå îïîçíàííàÿ îøèáêà ïðè ïå÷àòè ÷åêà: N: "+IntToStr(dModule->UserId)+" ñóììà: "+IntToStr(cAllPrice)+" ×åê: "+AnsiString(CheckId));
bOk=false;
}
//ñáðîñ ÷åêà
if(!bOk)
{
fp->PrintRecVoid(L"");
}
return bOk;
}
//---------------------------------------------------------------------------
bool PrinterOPOS::Cut() //Îòðåçàòü áóìàãó
{
long err=0;
try
{
if(Crashed) throw Exception("Äðàéâåð ïðèíòåðà ðàçðóøåí!");
err=fp->PrintNormal(2, WideString(WideString(WCHAR(0x1B)) + WideString(WCHAR(0x7C)) + "75P").c_bstr());
if(err) throw Exception(getLastError(&err));
}catch(Exception &exception)
{
if(err==251) Crashed=true; //Êàáçäåö
saveLog(err,"(PrinterOPOS::Cut)"+exception.Message);
dModule->SendError(err,"(PrinterOPOS::Cut)"+exception.Message);
}catch(...)
{
saveLog(1,"(PrinterOPOS::Cut) Íåò îïèñàíèÿ îøèáêè");
dModule->SendError(1,"(PrinterOPOS::Cut) Íåò îïèñàíèÿ îøèáêè");
}
}
//---------------------------------------------------------------------------
//Ïîëó÷èòü òåêóùåå ñîñòîÿíèå ïðèíòåðà (÷òîá ïðîâåðèòü ãîòîâíîñòü ïå÷àòè)
/*int PrinterOPOS::GetState()
{
if(!fp->DeviceEnabled)FState=245;
//if(FState!=0) return FState;
//ïðîâåðÿåì
//Íàäî äîáàâèòü ëîã
// fp->ResultCodeExtended
return 0;
} */
//---------------------------------------------------------------------------
//Ïðîâåðêà ðîáîòîñïîñîáíîñòè ïðèíòåðà
bool PrinterOPOS::isOk()
{
long err=0;
try
{
if(Crashed) throw Exception("Äðàéâåð ïðèíòåðà ðàçðóøåí!");
if(fp->RecEmpty) throw "Íåò áóìàãè!";
err=fp->ResetPrinter();
if(err) throw Exception(getLastError(&err)); //Î÷èùàåò î÷åðåäü ñ ñîáûòèÿìè
AnsiString str;
if(!dModule->getDayShift())throw Exception("Ñìåíà â áàçå íå îòêðûòà!"); //Ïðîâåðÿåì â áàçå îòêðûòà ëè ñìåí
bool dOpen=DayOpened();
if(!dOpen && AutoOpenShift && OpenShift()) dOpen=true;
if(!dOpen) throw Exception("Ñìåíà íå îòêðûòà!");
if(DayOpened())
{
//Ïðîâåðêà íà äëèíó ñìåíû
TDateTime dt=getDateOpenShift();
str=getLastError(&err);
if(err) throw Exception(getLastError(&err));
dModule->getDate();
if(HoursBetween(dt,dModule->date)>24) //Ðàçíèöà íå áîëåå 24 ÷àñîâ
throw Exception("[1]Ñìåíà íå çàêðûòà");
} else throw Exception("Ïðèíòåð íå ðàáîòàåò!");
BSTR bstr=new OLECHAR[50];
err=fp->GetDate(&bstr);
if(err) throw Exception(getLastError(&err));
}
catch(Exception &exception)
{
if(err==251) Crashed=true; //Êàáçäåö
saveLog(1,"(PrinterOPOS::isOk)"+exception.Message);
dModule->SendError(err,"(PrinterOPOS::isOk)"+exception.Message);
return false;
}
catch (...)
{
if(err==251) Crashed=true; //Êàáçäåö
saveLog(1,"(PrinterOPOS::isOk)Íåîïîçíàííàÿ îøèáêà");
dModule->SendError(1,"(PrinterOPOS::isOk)Íåîïîçíàííàÿ îøèáêà");
return false;
}
return true;
}
//---------------------------------------------------------------------------
//Ïîëó÷èòü äàòó îòêðûòèÿ ñìåíû
TDateTime PrinterOPOS::getDateOpenShift()
{
long err=0;
TDateTime date=0;
try
{
if(Crashed) throw Exception("Äðàéâåð ïðèíòåðà ðàçðóøåí!");
long iTmp;
BSTR sTmp=new OLECHAR[50];
err=fp->DirectIO(13, &iTmp, &sTmp);
if(err) throw Exception(getLastError(&err));
date=StrToDateTime(sTmp);
}catch(Exception &exception)
{
if(err==251) Crashed=true; //Êàáçäåö
saveLog(err,"(PrinterOPOS::getDateOpenShift)"+exception.Message);
dModule->SendError(err,"(PrinterOPOS::getDateOpenShift)"+exception.Message);
}catch(...)
{
saveLog(1,"(PrinterOPOS::getDateOpenShift) Íåò îïèñàíèÿ îøèáêè");
dModule->SendError(1,"(PrinterOPOS::getDateOpenShift) Íåò îïèñàíèÿ îøèáêè");
}
return date;
}
//---------------------------------------------------------------------------
//Îïèñàíèå ñòàòóñà
AnsiString PrinterOPOS::GetStatusDescription(long err)
{
AnsiString str;
try
{
if(err<256)
str=kkm_err_msg_ru[err];
if(str=="") str="Íåò îïèñàíèÿ îøèáêè";
}catch(...)
{
saveLog(1,"(PrinterOPOS::GetStatusDescription) Íåò îïèñàíèÿ îøèáêè");
return "Íåò îïèñàíèÿ îøèáêè";
}
return str;
}
//---------------------------------------------------------------------------
//Ïîëó÷èòü êîä ïîñëåäíåé îøèáêè
AnsiString PrinterOPOS::getLastError(long* err)
{
BSTR str=new OLECHAR[255];
str=L"Íåò îïèñàíèÿ îøèáêè!";
try
{
fp->DirectIO(1, err, &str);
}catch(...)
{
saveLog(1,"(PrinterOPOS::getLastError) Íåò îïèñàíèÿ îøèáêè");
}
if(str==L"") return GetStatusDescription(*err);
return str;
}
//---------------------------------------------------------------------------
AnsiString PrinterOPOS::getLastError()
{
long err;
return getLastError(&err);
}
//---------------------------------------------------------------------------
//Ïå÷àòü îò÷¸òà è çàêðûòèå ñìåíû
bool PrinterOPOS::PrintZReport()
{
long err=0;
try
{
if(Crashed) throw Exception("Äðàéâåð ïðèíòåðà ðàçðóøåí!");
int sum=getDaySum();
err=fp->PrintZReport();
if(err) throw Exception(getLastError(&err));
dModule->addZReport(sum);//Ïîñëàòü íà ñåðâåð âðåìÿ ñíÿòèÿ Z îò÷¸òà
dModule->addPaper(-142*2);//Äëÿ ïîäñ÷¸òà êîíöà áóìàãè
}catch(Exception &exception)
{
if(err==251) Crashed=true; //Êàáçäåö
saveLog(err,"(PrinterOPOS::PrintZReport)"+exception.Message);
dModule->SendError(err,"(PrinterOPOS::PrintZReport)"+exception.Message);
}catch(...)
{
saveLog(1,"(PrinterOPOS::PrintZReport) Íåò îïèñàíèÿ îøèáêè");
dModule->SendError(1,"(PrinterOPOS::PrintZReport) Íåò îïèñàíèÿ îøèáêè");
}
return err==0;
}
//---------------------------------------------------------------------------
//Ïå÷àòü ñóòî÷íîãî îò÷¸òà áåç çàêðûòèÿ ñìåíû
void PrinterOPOS::PrintXReport()
{
long err=0;
try
{ if(Crashed) throw Exception("Äðàéâåð ïðèíòåðà ðàçðóøåí!");
err=fp->PrintXReport();
if(err) throw Exception(getLastError(&err));
}catch(Exception &exception)
{
if(err==251) Crashed=true; //Êàáçäåö
saveLog(err,"(PrinterOPOS::PrintXReport)"+exception.Message);
dModule->SendError(err,"(PrinterOPOS::PrintXReport)"+exception.Message);
}catch(...)
{
saveLog(1,"(PrinterOPOS::PrintXReport) Íåò îïèñàíèÿ îøèáêè");
dModule->SendError(1,"(PrinterOPOS::PrintXReport) Íåò îïèñàíèÿ îøèáêè");
}
}
//---------------------------------------------------------------------------
//Îòêðûòèå ñìåíû
bool PrinterOPOS::OpenShift()
{
long err;
try
{ if(Crashed) throw Exception("Äðàéâåð ïðèíòåðà ðàçðóøåí!");
long n=1;
//if(CasireName==NULL) CasireName=L" ";
BSTR str=CasireName.c_bstr();
err=fp->DirectIO (6,&n,&str);
if(err) throw Exception(getLastError(&err)); //Ïåðåäàë íîìåð è íàçâàíèå êàññèðà
err=fp->SetVatValue(1,L"120");
if(err) throw Exception(getLastError(&err));
}catch(Exception &exception)
{
if(err==251) Crashed=true; //Êàáçäåö
saveLog(err,"(PrinterOPOS::OpenShift)"+exception.Message);
dModule->SendError(err,"(PrinterOPOS::OpenShift)"+exception.Message);
}catch(...)
{
saveLog(1,"(PrinterOPOS::OpenShift) Íåò îïèñàíèÿ îøèáêè");
dModule->SendError(1,"(PrinterOPOS::OpenShift) Íåò îïèñàíèÿ îøèáêè");
}
return err==0;
}
//---------------------------------------------------------------------------
bool PrinterOPOS::DayOpened()
{
return fp->DayOpened;
}
//---------------------------------------------------------------------------
bool PrinterOPOS::setTrainingMode(bool val)
{
long err;
try
{ if(Crashed) throw Exception("Äðàéâåð ïðèíòåðà ðàçðóøåí!");
if(getTrainingMode()==val) return true;
if(val) err=fp->BeginTraining(); else err=fp->EndTraining();
if(err) throw Exception(getLastError(&err));
}catch(Exception &exception)
{
if(err==251) Crashed=true; //Êàáçäåö
saveLog(err,"(PrinterOPOS::setTrainingMode)"+exception.Message);
dModule->SendError(err,"(PrinterOPOS::setTrainingMode)"+exception.Message);
}catch(...)
{
saveLog(1,"(PrinterOPOS::setTrainingMode) Íåò îïèñàíèÿ îøèáêè");
dModule->SendError(1,"(PrinterOPOS::setTrainingMode) Íåò îïèñàíèÿ îøèáêè");
}
return err==0;
}
//---------------------------------------------------------------------------
bool PrinterOPOS::getTrainingMode()
{
return fp->TrainingModeActive;
}
//---------------------------------------------------------------------------
//Çàïîëíåíèå ìàññèâà ñ ñóììàìè ïî íàëîãîâûì ñòàâêàì
bool PrinterOPOS::setNalog(long n,float stavka)
{
long err;
try
{ if(Crashed) throw Exception("Äðàéâåð ïðèíòåðà ðàçðóøåí!");
long s=stavka*10;
WideString str=AnsiString(s);
err = fp->DirectIO(2, &n, &str);
if(err) throw Exception(getLastError(&err));
}catch(Exception &exception)
{
if(err==251) Crashed=true; //Êàáçäåö
saveLog(err,"(PrinterOPOS::setNalog)"+exception.Message);
dModule->SendError(err,"(PrinterOPOS::setNalog)"+exception.Message);
return true;
}catch(...)
{
saveLog(1,"(PrinterOPOS::setNalog) Íåò îïèñàíèÿ îøèáêè");
dModule->SendError(1,"(PrinterOPOS::setNalog) Íåò îïèñàíèÿ îøèáêè");
return true;
}
return err==0;
}
//---------------------------------------------------------------------------
//Äíåâíîé èòîã
int PrinterOPOS::getDaySum()
{
long err;
try
{ if(Crashed) throw Exception("Äðàéâåð ïðèíòåðà ðàçðóøåí!");
long n=1;
BSTR str=new OLECHAR[20];
err=fp->DirectIO (300,&n,&str);
if(err) throw Exception(getLastError(&err));
return StrToInt(str)/100.0;
}catch(Exception &exception)
{
if(err==251) Crashed=true; //Êàáçäåö
saveLog(err,"(PrinterOPOS::getDaySum)"+exception.Message);
dModule->SendError(err,"(PrinterOPOS::getDaySum)"+exception.Message);
return 0;
}catch(...)
{
saveLog(1,"(PrinterOPOS::getDaySum) Íåò îïèñàíèÿ îøèáêè");
dModule->SendError(1,"(PrinterOPOS::getDaySum) Íåò îïèñàíèÿ îøèáêè");
return 0;
}
}
//---------------------------------------------------------------------------
//Ñóììà â êàññå
int PrinterOPOS::getAllSum()
{
long err=0;
try
{ if(Crashed) throw Exception("Äðàéâåð ïðèíòåðà ðàçðóøåí!");
long n=2;
BSTR str=new OLECHAR[20];
err=fp->DirectIO (300,&n,&str);
if(err)throw Exception(getLastError(&err));
return StrToInt(str)/100.0;
}catch(Exception &exception)
{
if(err==251) Crashed=true; //Êàáçäåö
saveLog(err,"(PrinterOPOS::getAllSum)"+exception.Message);
dModule->SendError(err,"(PrinterOPOS::getAllSum)"+exception.Message);
return 0;
}catch(...)
{
saveLog(1,"(PrinterOPOS::getAllSum) Íåò îïèñàíèÿ îøèáêè");
dModule->SendError(1,"(PrinterOPOS::getAllSum) Íåò îïèñàíèÿ îøèáêè");
return 0;
}
}
//---------------------------------------------------------------------------
//sales - true ïðîäàæà, false - âîçâðàò
//check - íîìåð ÷åêà åñëè íå çàäàí =0 òî ãåíåðèòüñÿ
//Ôè÷à ýòî ôèêñèðîâàòü íå ðàñïå÷àòàííûå ÷åêè ïîòîì ïå÷àòàòü èõ
bool FiscalPrinterPort::PrintCheck(bool sales, int check, WideString headLine )
{
//bool err=0;
double cur=0;
double cAllPrice=0;
bool bOk=true;
try
{
//Ñ÷èòàåì ñóììó â ÷åêå (çàðàíåå íà ñëó÷àé îøèáêè)
cAllPrice=getGoodsPrice();
Currency UnitPrice,AllPriceDrb,AllPrice;
long Qnt,vat;
BSTR* bstr;
WideString sStr;
BSTR sTmp=new OLECHAR[255];
sTmp=L"";
long MbsResponceCode;
CURRENCY Amount1,Amount2;
//Ôèñêàëüíûé ÷åê èëè ïðîäàæà
if(sales) bOk = fp->OpenFiscalInv(1,"0000",1);
else bOk = fp->OpenBackInv(1,"0000",1);
if (!bOk) throw Exception(getLastError());
if(headLine.Length()>0)
PrintLine(headLine);
//Òîâàðû èç ñïèñêà â äðàéâåð
for(int i=0;i<FListGoods->Count;i++)
{
Goods* goods=(Goods*)FListGoods->Items[i];
bOk=fp->RegisterSale(goods->name1.c_bstr(),goods->name2.c_bstr(),0,"À",goods->price,goods->count,0,0); //Ðåãèñòðàöèÿ ïðîäàæè (ëèáî âîçâðàòà)
if (!bOk) throw Exception(getLastError());
}
ClearGoods();
//Ôîðìèðîâàíèÿ èòîãà â ÷åêå (îïëàòà)
double Change;
bOk=fp->Total("","","P",cAllPrice,Change);
if (!bOk) throw Exception(getLastError());
//Çàêðûâàåì ÷åê
bOk = fp->CloseFiscalInv();
if(!bOk) throw Exception(getLastError());
}
catch(Exception &exception)
{
ClearGoods();
saveLog(1,"Îøèáêà ïðè ïå÷àòè ÷åêà: N: "+IntToStr(dModule->UserId)+" ñóììà: "+CurrToStr(cAllPrice)+" ×åê: "+AnsiString(CheckId)+". "+exception.Message);
dModule->SendError(bOk,"Îøèáêà ïðè ïå÷àòè ÷åêà: N: "+IntToStr(dModule->UserId)+" ñóììà: "+FloatToStr(cAllPrice)+" ×åê: "+AnsiString(CheckId)+". "+exception.Message);
bOk=false;
}
catch(...)
{
ClearGoods();
saveLog(1,"Íå îïîçíàííàÿ îøèáêà ïðè ïå÷àòè ÷åêà: N: "+IntToStr(dModule->UserId)+" ñóììà: "+FloatToStr(cAllPrice)+" ×åê: "+AnsiString(CheckId));
dModule->SendError(1,"Íå îïîçíàííàÿ îøèáêà ïðè ïå÷àòè ÷åêà: N: "+IntToStr(dModule->UserId)+" ñóììà: "+FloatToStr(cAllPrice)+" ×åê: "+AnsiString(CheckId));
bOk=false;
}
//ñáðîñ ÷åêà
if(!bOk)
{
fp->CancelFiscalInv();
}
return bOk;
}
//---------------------------------------------------------------------------
bool FiscalPrinterPort::PrintZReport()
{
bool bOk;
try
{
double Amount=0,CashSum=0,ServIn=0,ServOut=0;
std::string ExitCode="";
bOk=fp->ParishOrConsumption(Amount,ExitCode,CashSum,ServIn,ServOut);
if(!bOk) throw Exception(getLastError());
bOk=fp->PrintZReport();
if(!bOk) throw Exception(getLastError());
dModule->addZReport(CashSum);//Ïîñëàòü íà ñåðâåð âðåìÿ ñíÿòèÿ Z îò÷¸òà
}
catch(Exception &exception)
{
ClearGoods();
saveLog(1,"Îøèáêà ïðè ïå÷àòè Z îò÷¸òà "+exception.Message);
dModule->SendError(bOk,"Îøèáêà ïðè ïå÷àòè Z îò÷¸òà "+exception.Message);
bOk=false;
}
catch(...)
{
ClearGoods();
saveLog(1,"Íå îïîçíàííàÿ îøèáêà ïðè ïå÷àòè Z îò÷¸òà.");
dModule->SendError(1,"Íå îïîçíàííàÿ îøèáêà ïðè ïå÷àòè Z îò÷¸òà.");
bOk=false;
}
return bOk;
};
//---------------------------------------------------------------------------
bool FiscalPrinterPort::isOk()
{
try
{
if (!fp->DiagnosticInfo()) throw Exception(getLastError());
if(!dModule->getDayShift())throw Exception("Ñìåíà â áàçå íå îòêðûòà!"); //Ïðîâåðÿåì â áàçå îòêðûòà ëè ñìåí
}
catch(Exception &exception)
{
saveLog(1,"(PrinterOPOS::isOk)"+exception.Message);
dModule->SendError(1,"(PrinterOPOS::isOk)"+exception.Message);
return false;
}
catch (...)
{
saveLog(1,"(PrinterOPOS::isOk)Íåîïîçíàííàÿ îøèáêà");
dModule->SendError(1,"(PrinterOPOS::isOk)Íåîïîçíàííàÿ îøèáêà");
return false;
}
return true;
};
//---------------------------------------------------------------------------