- 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>
169 lines
6.5 KiB
C++
Executable File
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
|