Files
qt-migration-legatus/qt5-before/dlbo/Lts/Services/AreaEffectSimulation/handler_charge_administration.cpp
T
torstenandCopilot 7173785915 Qt6 Migration: Complete migration with DDS/RTI support and build validation
Major Changes:
- Merged latest Qt5 devel content from dlbo (292 files changed, 7 new dirs)
- Consolidated forward-declarations and include folders
- Removed unneeded modules per Niklas' repo check list

Build System Fixes:
- Fixed CMake VERSION_GREATER syntax in ParticipantManagement/CMakeLists.txt
- Added VLC packages (libvlc-dev, vlc-plugin-base) to docker_build.sh
- Added PostgreSQL dev packages (libpq-dev, postgresql-server-dev-all) to Dockerfile
- Fixed locale warnings (ANSI_X3.4-1968 → C.UTF-8)
- Fixed ArcGIS SDK path warnings when BUILD_ARCGIS=OFF

Code Generation Fixes:
- Fixed IDL enum collisions (PortType→CorePortType/DdsutPortType, PdmEventType)
- Fixed Grantlee template svc_translation.cpp.grantlee:
  - Changed {{ idl_enum.name }}_def:: to {{ idl_enum.name }}::
  - Fixed .underlying() calls for C++11 scoped enums (enum class)
- Removed generated files from repo (moc_*, *_dtc.h, *_ftc.h)

Validation:
- BUILD_RTI=ON: SUCCESS
- BUILD_RTI=OFF: SUCCESS
- C++17 standard maintained for RTI 7.7 compatibility
- Ubuntu 26.04 Docker environment verified

Remaining Warnings (expected):
- BgViewer, KDChart, KDReports, Poppler-Qt6 not found (optional features)

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

169 lines
6.5 KiB
C++

/**
* 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