add new eet and qt 6.12

This commit is contained in:
2026-10-14 22:38:06 +02:00
parent 464216d6c3
commit 99f98b0451
17 changed files with 505 additions and 100 deletions
+88 -80
View File
@@ -4,10 +4,11 @@
#include "settings/shopsettings.h"
#ifdef EET
#include <eetcpp.h>
#ifdef PRODEJNA_EET_V4
#include "eet/eetv4adapter.h"
#include <eetv4client.h>
#endif
#include <QEventLoop>
#include <QProcessEnvironment>
#include <seasonservice.h>
#include <cmath>
@@ -15,6 +16,15 @@
inline double round(double value) { return value < 0 ? -std::floor(0.5 - value) : std::floor(0.5 + value); }
#endif
namespace
{
bool &eetOnlineState()
{
static bool online = true;
return online;
}
}
VoucherPtr ShopService::createVoucher()
{
QSharedPointer<Voucher> voucher(new Voucher);
@@ -189,96 +199,95 @@ void ShopService::updateRelatedItem(VoucherItem* item, int countAdded)
bool ShopService::processEet(VoucherPtr voucher, QString &message)
{
#ifdef EET
#ifdef PRODEJNA_EET_V4
if (voucher->eetStatus() == Voucher::EET_NOT_ENTERING)
{
return true;
}
if (!eetOnlineState())
{
message = QStringLiteral("EET is offline; the voucher remains queued for sending.");
return false;
}
SettingsService srvSettings("SHOP");
ShopSettingsPtr settings = srvSettings.loadSettings<ShopSettings>();
loadSettings();
EetRequest request;
request.setCelkTrzba(voucher->totalPrice().toDouble());
request.setDatTrzby(voucher->payDateTime());
request.setIdPokl(settings->eetRegisterId());
request.setIdProvoz(settings->eetShopId());
request.setPrvniZaslani(voucher->eetStatus() == Voucher::EET_FOR_SEND);
request.setDicPopl(m_gs->dic());
request.setPoradCis(voucher->numSer());
request.setDatOdesl(QDateTime::currentDateTime());
request.setRezim((EetRequest::EetRezim)settings->eetMode());
EetV4ShopConfig adapterConfig;
adapterConfig.endpoint = QUrl(settings->eetEndpoint());
adapterConfig.taxpayerEic = settings->eetShopId();
adapterConfig.unitId = settings->eetUnitId();
adapterConfig.cashRegisterId = settings->eetRegisterId();
adapterConfig.timeoutMilliseconds = settings->eetTimeout();
adapterConfig.verificationMode = settings->eetTest();
if (m_gs->vatPayer())
EetV4SaleRequest request;
QString adapterError;
if (!EetV4ShopAdapter::createRequest(*voucher, adapterConfig, &request, &adapterError))
{
request.setDan1(voucher->vatAmountHigh().toDouble());
request.setDan2(voucher->vatAmountFirstLower().toDouble());
request.setDan3(voucher->VatAmountSecondLower().toDouble());
request.setZaklDan1(voucher->priceVatHigh().toDouble());
request.setZaklDan2(voucher->priceVatFirstLower().toDouble());
request.setZaklDan3(voucher->priceVatSecondLower().toDouble());
request.setZaklNepodlDph(voucher->priceNoVat().toDouble());
message = adapterError;
voucher->setEetStatus(Voucher::EET_ERROR);
update(voucher);
return false;
}
EetSender *sender = new EetSender(this);
sender->setupSigner(settings->eetCertificate(), settings->eetKeyPassword());
sender->setPlayground(settings->eetPlayground());
QEventLoop loop;
bool replyFinished = false;
connect(sender, &EetSender::sendFinished, [this, voucher, sender, &loop, &replyFinished](){
Transaction tx;
voucher->setEetBkp(sender->resut()->bkp());
voucher->setEetPkp(sender->resut()->pkp());
voucher->setEetFik(sender->resut()->fik());
if (sender->resut()->status() == EetResult::RESPONSE_OK)
{
voucher->setEetSendDateTime(QDateTime::currentDateTime());
voucher->setEetStatus(Voucher::EET_SENT);
}
else
{
voucher->setEetStatus(Voucher::EET_ERROR);
}
this->update(voucher);
tx.commit();
sender->deleteLater();
loop.quit();
replyFinished = true;
});
sender->sendRequest(&request);
if (!replyFinished)
const QString passwordVariable = settings->eetKeyPassword().trimmed();
const QByteArray password = QProcessEnvironment::systemEnvironment()
.value(passwordVariable)
.toUtf8();
if (passwordVariable.isEmpty() || password.isEmpty())
{
loop.exec();
message = QStringLiteral("EET certificate password environment variable is missing.");
voucher->setEetStatus(Voucher::EET_ERROR);
update(voucher);
return false;
}
auto addMessage = [&message](EetMessage *msg, const QString &label){
if (message.isEmpty())
EetV4ClientConfig clientConfig;
clientConfig.endpoint = adapterConfig.endpoint;
clientConfig.timeoutMilliseconds = adapterConfig.timeoutMilliseconds;
EetV4Client client(clientConfig);
EetV4Response response;
QString clientError;
if (!client.sendSale(request,
settings->eetCertificate(),
password,
&response,
&clientError))
{
message = clientError;
voucher->setEetStatus(Voucher::EET_ERROR);
update(voucher);
return false;
}
if (!response.isSuccess() || response.pok.isEmpty())
{
message = response.message.isEmpty()
? QStringLiteral("EET returned an unsuccessful response.")
: response.message;
voucher->setEetStatus(Voucher::EET_ERROR);
update(voucher);
return false;
}
voucher->setEetPok(response.pok);
voucher->setEetSendDateTime(QDateTime::currentDateTime());
voucher->setEetStatus(Voucher::EET_SENT);
update(voucher);
if (!response.warningCodes.isEmpty())
{
message = QStringLiteral("EET warning codes: ");
for (int i = 0; i < response.warningCodes.size(); ++i)
{
message = label + "\n";
if (i > 0)
{
message += QStringLiteral(", ");
}
message += QString::number(response.warningCodes.at(i));
}
message += QString::number(msg->code()) + ": " + msg->message();
};
foreach (EetMessage *msg, sender->resut()->errors()) {
addMessage(msg, "Errors:");
}
foreach (EetMessage *msg, sender->resut()->warnings()) {
addMessage(msg, "Warnings:");
}
return voucher->eetStatus() == Voucher::EET_SENT;
return true;
#else
return true;
#endif
@@ -286,15 +295,15 @@ bool ShopService::processEet(VoucherPtr voucher, QString &message)
void ShopService::setEetOnline(bool online)
{
#ifdef EET
EetSender::m_online = online;
#ifdef PRODEJNA_EET_V4
eetOnlineState() = online;
#endif
}
bool ShopService::isEetOnline()
{
#ifdef EET
return EetSender::m_online;
#ifdef PRODEJNA_EET_V4
return eetOnlineState();
#else
return false;
#endif
@@ -562,4 +571,3 @@ VoucherSum ShopService::summary(const QString& where) {
return sum;
}