Files
qt5-legatus-legacy/Lts/Services/AreaEffectSimulation/handler_charge_administration.cpp
T
torstenandCopilot 3028302f7b Qt6 Migration: Merge latest Qt5 devel content and apply migration fixes
- Merged 292 changed files from dlbo snapshot
- Fixed IDL enum collisions (PortType, PdmEventType)
- Fixed Grantlee template for C++11 scoped enums
- Fixed CMake VERSION_GREATER syntax
- Added missing directories (THP, LtsRestClient, etc.)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-09-15 18:20:51 +00:00

169 lines
6.5 KiB
C++
Executable File

/**
* Handler for all exercise objects
* $Id$
* $HeadURL$
* $Author$
* Created by Hanna E. Rathje, SLSE, 2015-09-03
*/
#include "handler_charge_administration.h"
#include "object_charge_administration.h"
namespace AreaEffectSimulation
{
HandlerChargeAdministration::HandlerChargeAdministration(MainHandler *mainHandler)
: HandlerBase(mainHandler, QStringLiteral("ChargeAdministration"))
, Interface::Fts::ChargeAdministrationModifyRequestHandler(mainHandler->dds()->fts())
{
}
bool HandlerChargeAdministration::init()
{
bool bRet = true;
// create charge administration objects
auto cb = [this, &bRet](const Database::AesChargeAdministration &area)
{
// Create and init Object
ObjectChargeAdministration *ifs(new ObjectChargeAdministration(m_mainHandler, this));
Core::FunctionReplyObject ret = ifs->createObject(area);
if (ret.error())
{
delete ifs;
ERROR_LOG(m_logger) << ret();
bRet = false;
return;
}
// Push into Map
m_chargeAdminObjMap.insert(ifs->id(), ifs);
};
// read all ChargeAdministrations from database
if (!m_mainHandler->db()->select(cb) || !bRet)
{
ERROR_LOG(m_logger) << "Error reading data from database!";
return false;
}
DEBUG_LOG(m_logger) << "m_chargeAdminiObjMap.size() = " << m_chargeAdminObjMap.size();
return true;
}
int HandlerChargeAdministration::getObjectChargeAdministrationId(int partyId, int chargeTypeId, ProjectDataManagement::EffectSource effectSourceId)
{
for (ObjectChargeAdministration *val : qAsConst(m_chargeAdminObjMap))
{
if (val->data().partyId == partyId && val->data().chargeTypeId == chargeTypeId && val->data().effectSourceId == effectSourceId)
return val->id();
}
return 0;
}
void HandlerChargeAdministration::onChargeAdministrationModifyRequest(const rti::core::SampleIdentity &cookie, const ChargeAdministrationModifyRequest &request)
{
DEBUG_LOG(m_logger) << "onChargeAdministrationModifyRequest: " << request;
ChargeAdministrationModifyRequest newRequest = request;
if (!newRequest.amountChangedByOperator())
newRequest.id() = getObjectChargeAdministrationId(request.partyId(), request.chargeTypeId(), request.effectSourceId());
const auto ret = newRequest.id() > 0 ? chargeAdministrationModifyRequest(newRequest) : chargeAdministrationCreateRequest(request);
if (ret.error())
WARNING_LOG(m_logger) << ret();
m_mainHandler->dds()->fts()->chargeAdministrationModifyReply(cookie, ret);
}
Core::FunctionReplyObject HandlerChargeAdministration::chargeAdministrationCreateRequest(const ChargeAdministrationModifyRequest &request)
{
Database::AesChargeAdministration newData;
newData.chargeTypeId = request.chargeTypeId();
newData.partyId = request.partyId();
newData.effectSourceId = request.effectSourceId();
newData.amount = request.amount();
newData.amountChangedByOperator = request.amountChangedByOperator();
ObjectChargeAdministration *ifs(new ObjectChargeAdministration(m_mainHandler, this));
Core::FunctionReplyObject ret = ifs->createObject(newData);
if (ret.error())
{
delete ifs;
return ret;
}
m_chargeAdminObjMap.insert(ifs->id(), ifs);
return Core::FunctionReplyObject(ifs->id());
}
Core::FunctionReplyObject HandlerChargeAdministration::chargeAdministrationModifyRequest(const ChargeAdministrationModifyRequest &request)
{
Core::FunctionReplyObject ret;
ObjectChargeAdministration *ifs = getObjectFromMap(m_chargeAdminObjMap, request.id(), ret);
if (!ifs)
return ret;
Database::AesChargeAdministration newData(ifs->data());
newData.id = request.id();
newData.chargeTypeId = request.chargeTypeId();
newData.partyId = request.partyId();
newData.amount = request.amount();
newData.amountChangedByOperator = request.amountChangedByOperator();
if (newData.amountChangedByOperator && newData.amount < newData.planned)
return Core::FunctionReplyObject(request.id(), tr_lts("dds", "Amount is smaller than planned (%1 < %2).")).arg(newData.amount).arg(newData.planned);
return ifs->updateObject(newData);
}
Core::FunctionReplyObject HandlerChargeAdministration::claimPlannedCharge(int chargeTypeId, int partyId, int count)
{
for (ObjectChargeAdministration *val : qAsConst(m_chargeAdminObjMap))
{
if (val->data().partyId == partyId && val->data().chargeTypeId == chargeTypeId)
return val->claimPlannedCharge(count);
}
return Core::FunctionReplyObject(tr_lts("dds", "No stock found for ChargeType %1 and Party %2.")).arg(chargeTypeId).arg(partyId);
}
Core::FunctionReplyObject HandlerChargeAdministration::consumeCharge(int chargeTypeId, int partyId, int count, bool wasPlanned)
{
DEBUG_LOG(m_logger) << "chargeTypeId: " << chargeTypeId << ", partyId: " << partyId << ", count: " << count;
ProjectDataManagement::EffectSource effectSource = ProjectDataManagement::EffectSource::ES_Internal;
ParticipantManagement::ConnectState connectState = m_mainHandler->dds()->ppmDtc()->saaConnectedState(partyId);
DEBUG_LOG(m_logger) << "connectState: " << connectState;
if (m_mainHandler->dds()->ppmDtc()->isPartyAdlerVerbund(partyId) && connectState == ParticipantManagement::ConnectState::Connected
&& m_mainHandler->dds()->pdmDtc()->isAdlerChargeType(chargeTypeId))
effectSource = ProjectDataManagement::EffectSource::ES_ADLER;
else if (!m_mainHandler->dds()->ppmDtc()->isPartyAdlerVerbund(partyId) && connectState == ParticipantManagement::ConnectState::Connected
&& m_mainHandler->dds()->pdmDtc()->isAdlerChargeType(chargeTypeId))
effectSource = ProjectDataManagement::EffectSource::ES_ADLER_STANDALONE;
DEBUG_LOG(m_logger) << "effectSource: " << effectSource;
for (ObjectChargeAdministration *val : qAsConst(m_chargeAdminObjMap))
{
if (val->data().partyId == partyId && val->data().chargeTypeId == chargeTypeId && val->data().effectSourceId == effectSource)
{
DEBUG_LOG(m_logger) << "val: chargeAdminId " << val->id();
return val->consumeCharge(count, wasPlanned);
}
}
WARNING_LOG(m_logger) << " No ChargeAdmin for chargeTypeId: " << chargeTypeId << ", partyId: " << partyId << ", effectSource: " << effectSource << " found.";
return Core::FunctionReplyObject(tr_lts("dds", "No stock found for ChargeType %1 and Party %2.")).arg(chargeTypeId).arg(partyId);
}
int HandlerChargeAdministration::availableCharge(int chargeTypeId, int partyId) const
{
for (ObjectChargeAdministration *val : qAsConst(m_chargeAdminObjMap))
{
if (val->data().partyId == partyId && val->data().chargeTypeId == chargeTypeId)
return val->availableCharge();
}
return 0;
}
} // Namespace AreaEffectSimulation