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