/** * Handler for the HMI language * $Id$ * $HeadURL$ * $Author$ */ #include "object_charge_administration.h" #include namespace AreaEffectSimulation { ObjectChargeAdministration::ObjectChargeAdministration(MainHandler *mainHandler, QObject *parent) : QObject(parent) , m_mainHandler(mainHandler) , m_logger(getLogger("ObjectChargeAdministration")) { } ObjectChargeAdministration::~ObjectChargeAdministration() { m_mainHandler->dds()->dts()->removeChargeAdministrationByKey(m_data.id); } Core::FunctionReplyObject ObjectChargeAdministration::createObject(const Database::AesChargeAdministration &data) { m_data = data; m_data.changed = m_mainHandler->dds()->currentPartitionTimeMSec(); m_isAdlerChargeType = m_mainHandler->dds()->pdmDtc()->isAdlerChargeType(data.chargeTypeId); // New Data! if (m_data.id <= 0) { if (!m_mainHandler->db()->insert(m_data)) return Core::FunctionReplyObject(m_data.id, tr_lts("dds", "Error inserting ChargeAdministration-data into database.")); } onPublishData(); return Core::FunctionReplyObject(m_data.id); } Core::FunctionReplyObject ObjectChargeAdministration::updateObject(const Database::AesChargeAdministration &data) { m_data = data; m_data.changed = m_mainHandler->dds()->currentPartitionTimeMSec(); if (!m_mainHandler->db()->update(m_data)) return Core::FunctionReplyObject(m_data.id, tr_lts("dds", "Error updating charge with id %1 in database.")).arg(m_data.id); onPublishData(); return Core::FunctionReplyObject(m_data.id); } Core::FunctionReplyObject ObjectChargeAdministration::claimPlannedCharge(int count) { DEBUG_LOG(m_logger) << "claimPlannedCharge for id : " << m_data.chargeTypeId << ", count: " << count; // Works both directions, can "claim" negative count! if (m_data.amount - m_data.planned < count) return Core::FunctionReplyObject(m_data.id, tr_lts("dds", "Not enough charges left. Wanted to claim %1, but only %2 left.")) .arg(count) .arg(m_data.amount - m_data.planned); m_data.planned += count; if (m_data.planned < 0) // cannot have negative planned m_data.planned = 0; m_data.changed = m_mainHandler->dds()->currentPartitionTimeMSec(); if (!m_mainHandler->db()->update(m_data)) return Core::FunctionReplyObject(m_data.id, tr_lts("dds", "Error updating charge with id %1 in database.")).arg(m_data.id); onPublishData(); return Core::FunctionReplyObject(m_data.id); } Core::FunctionReplyObject ObjectChargeAdministration::consumeCharge(int count, bool wasPlanned) { if (!m_isAdlerChargeType) { if (m_data.planned < count) { // consume what is possible WARNING_LOG(m_logger) << "Cannot consume " << count << ", consuming instead " << m_data.planned << " planned"; count = m_data.planned; } DEBUG_LOG(m_logger) << "consumeCharge for id : " << m_data.chargeTypeId << ", count: " << count; if (wasPlanned && m_data.planned < count) return Core::FunctionReplyObject(m_data.id, tr_lts("dds", "Wanted to consume %1 planned charges, but only %2 had been planned.")).arg(count).arg(m_data.planned); if (!wasPlanned && m_data.planned < count) return Core::FunctionReplyObject(m_data.id, tr_lts("dds", "Wanted to consume %1 freely available charges, but only %2 had not yet been planned.")) .arg(count) .arg(m_data.amount - m_data.planned); if (wasPlanned) m_data.planned -= count; } m_data.amount -= count; if (count > 0) m_data.used += count; m_data.changed = m_mainHandler->dds()->currentPartitionTimeMSec(); if (!m_mainHandler->db()->update(m_data)) return Core::FunctionReplyObject(m_data.id, tr_lts("dds", "Error updating charge with id %1 in database.")).arg(m_data.id); onPublishData(); return Core::FunctionReplyObject(m_data.id); } int ObjectChargeAdministration::availableCharge() const { return m_data.amount - m_data.planned; } void ObjectChargeAdministration::onPublishData() { ChargeAdministration ddsData(m_data.id, m_data.chargeTypeId, m_data.partyId, m_data.effectSourceId, m_data.planned, m_data.amount, m_data.used, m_data.amountChangedByOperator, m_data.changed); m_mainHandler->dds()->dts()->publish(ddsData); } } // namespace AreaEffectSimulation