</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term>string <parameter>period</parameter></term>
+ <listitem>
+ <para>Периодичность снятия абонплаты:
+ <simplelist type="vert">
+ <member>month — ежемесячное снятие</member>
+ <member>day — ежедневное снятие</member>
+ </simplelist>
+ </para>
+ </listitem>
+ </varlistentry>
<varlistentry>
<term>array of struct <parameter>dirprices</parameter></term>
<listitem>
</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term>string <parameter>period</parameter></term>
+ <listitem>
+ <para>Периодичность снятия абонплаты:
+ <simplelist type="vert">
+ <member>month — ежемесячное снятие</member>
+ <member>day — ежедневное снятие</member>
+ </simplelist>
+ </para>
+ </listitem>
+ </varlistentry>
<varlistentry>
<term>array of struct <parameter>dirprices</parameter></term>
<listitem>
</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term>string <parameter>period</parameter></term>
+ <listitem>
+ <para>Периодичность снятия абонплаты:
+ <simplelist type="vert">
+ <member>month — ежемесячное снятие</member>
+ <member>day — ежедневное снятие</member>
+ </simplelist>
+ </para>
+ </listitem>
+ </varlistentry>
<varlistentry>
<term>array of struct <parameter>dirprices</parameter></term>
<listitem>
#ifndef TARIFF_H
#define TARIFF_H
-#include <ctime>
+#include "os_int.h"
#include <string>
+#include <cstring>
+#include <ctime>
-#include "os_int.h"
-#include "tariff_conf.h"
+struct TARIFF_DATA;
class TARIFF {
public:
+ enum PERIOD { DAY = 0, MONTH };
+
+ static std::string PeriodToString(PERIOD period);
+ static PERIOD StringToPeriod(const std::string& value);
+
virtual ~TARIFF() {}
virtual double GetPriceWithTraffType(uint64_t up,
uint64_t down,
virtual double GetPassiveCost() const = 0;
virtual double GetFee() const = 0;
virtual double GetFree() const = 0;
+ virtual PERIOD GetPeriod() const = 0;
virtual const std::string & GetName() const = 0;
virtual void SetName(const std::string & name) = 0;
virtual const TARIFF_DATA & GetTariffData() const = 0;
};
+inline
+std::string TARIFF::PeriodToString(TARIFF::PERIOD period)
+{
+switch (period)
+ {
+ case DAY: return "day";
+ case MONTH: return "month";
+ }
+return "month"; // Classic behaviour.
+}
+
+inline
+TARIFF::PERIOD TARIFF::StringToPeriod(const std::string& value)
+{
+if (strcasecmp(value.c_str(), "day") == 0)
+ return DAY;
+return MONTH; // Classic behaviour.
+}
+
#endif
#ifndef TARIFF_CONF_H
#define TARIFF_CONF_H
-#include <string>
-#include <vector>
-
+#include "tariff.h"
#include "resetable.h"
#include "const.h"
+#include <string>
+#include <vector>
+
//-----------------------------------------------------------------------------
enum
{
//-----------------------------------------------------------------------------
struct TARIFF_CONF
{
- double fee;
- double free;
- int traffType;
- double passiveCost;
- std::string name;
+ double fee;
+ double free;
+ int traffType;
+ double passiveCost;
+ std::string name;
+ TARIFF::PERIOD period;
TARIFF_CONF()
: fee(0),
free(0),
traffType(TRAFF_UP_DOWN),
passiveCost(0),
- name()
+ name(),
+ period(TARIFF::MONTH)
{}
TARIFF_CONF(const std::string & n)
free(0),
traffType(TRAFF_UP_DOWN),
passiveCost(0),
- name(n)
+ name(n),
+ period(TARIFF::MONTH)
{}
};
//-----------------------------------------------------------------------------
free(),
traffType(),
passiveCost(),
- name()
+ name(),
+ period()
{}
TARIFF_CONF_RES & operator=(const TARIFF_CONF & tc)
traffType = tc.traffType;
passiveCost = tc.passiveCost;
name = tc.name;
+ period = tc.period;
return *this;
}
tc.name = name;
tc.passiveCost = passiveCost;
tc.traffType = traffType;
+ tc.period = period;
return tc;
}
- RESETABLE<double> fee;
- RESETABLE<double> free;
- RESETABLE<int> traffType;
- RESETABLE<double> passiveCost;
- RESETABLE<std::string> name;
+ RESETABLE<double> fee;
+ RESETABLE<double> free;
+ RESETABLE<int> traffType;
+ RESETABLE<double> passiveCost;
+ RESETABLE<std::string> name;
+ RESETABLE<TARIFF::PERIOD> period;
};
//-----------------------------------------------------------------------------
struct TARIFF_DATA
# Parameter: required
# Value: directory path
# Default: /usr/lib/stg
-ModulesPath = /usr/lib/stg
+ModulesPath = ../stargazer/modules
-#################################################################################
-Store module
+#################################################################################Store module
# Configure the module that works with the database server
# Option - the name of the module without 'mod_' at the beginning and '.so'
# in the end ie full name of the module mod_store_files.so
# Working server directory, provides data on tariffs, users, administrators.
# Parameter: required
# Value: directory path
- WorkDir = /var/stargazer
+ WorkDir = ../stargazer/var/stargazer
# Owner, group and permissions of the files of user statistics (stat)
# Parameter: required
# Parameter: required
# Value: IP address or DNS name
# Default: localhost
- # server = localhost
+# server = localhost
# Path to the database on the server or its alias
# Parameter: required
# Value: file path
# Default: /var/stg/stargazer.fdb
- # database = /var/stg/stargazer.fdb
+# database = /var/stg/stargazer.fdb
# Database username
# Parameter: required
# Value: any, supported by database
# Default: stg
- # user = stg
+# user = stg
# Database password
# Parameter: required
# Value: any, supported by database
# Default: 123456
- # password = 123456
+# password = 123456
#</DestStoreModule>
-<DestStoreModule store_postgresql>
+#<DestStoreModule store_postgresql>
# Database server address
# Parameter: required
# Value: IP address or DNS name
# Default: localhost
- server = localhost
+# server = altair.local
# Database name
# Parameter: required
# Value: any, supported by database
# Default: stargazer
- database = stargazer
+# database = stg
# Database username
# Parameter: mandatory
# Value: any, supported by database
# Default: stg
- user = stg
+# user = stg
# Database password
# Parameter: required
# Value: any, supported by database
# Default: 123456
- password = 123456
+# password = 123456
-</DestStoreModule>
+#</DestStoreModule>
-#<DestStoreModule store_mysql>
+<DestStoreModule store_mysql>
# Database server address
# Parameter: required
# Value: IP address or DNS name
# Default: localhost
- # dbhost = localhost
+ dbhost = altair.local
# Database name
# Parameter: required
# Value: any, supported by database
# Default: stg
- # dbname = stg
+ dbname = stg
# Database username
# Parameter: required
# Value: any, supported by database
# Default: stg
- # dbuser = stg
+ dbuser = stg
# Database password
# Parameter: required
# Value: any, supported by database
# Default: 123456
- # rootdbpass = 123456
+ rootdbpass = 123456
-#</DestStoreModule>
+</DestStoreModule>
then
DEFS="$DEFS -DLINUX"
PLUGINS="$PLUGINS
- capture/ether_linux
- capture/ipq_linux"
+ capture/ether_linux"
LIB_THREAD=-lpthread
else
if [ "$OS" = "bsd" ]
* DB migration from v01 to v02 (mysql)
*/
-ALTER TABLE users ADD DisabledDetailStat INT(3) DEFAULT 0;
+ALTER TABLE tariffs ADD period VARCHAR(32) NOT NULL DEFAULT 'month';
+
+CREATE TABLE info
+(
+ version INTEGER NOT NULL
+);
+
+INSERT INTO info VALUES (1);
version INTEGER NOT NULL
);
-INSERT INTO tb_info VALUES (5);
+INSERT INTO tb_info VALUES (1);
structVal["freemb"] = xmlrpc_c::value_double(data.tariffConf.free);
structVal["passivecost"] = xmlrpc_c::value_double(data.tariffConf.passiveCost);
structVal["traffType"] = xmlrpc_c::value_int(data.tariffConf.traffType);
+structVal["period"] = xmlrpc_c::value_string(TARIFF::PeriodToString(data.tariffConf.period));
std::vector<xmlrpc_c::value> prices(DIR_NUM);
data.tariffConf.traffType = xmlrpc_c::value_int(it->second);
}
+if ((it = structVal.find("period")) != structVal.end())
+ {
+ data.tariffConf.period = TARIFF::StringToPeriod(xmlrpc_c::value_string(it->second));
+ }
+
if ((it = structVal.find("dirprices")) != structVal.end())
{
std::vector<xmlrpc_c::value> prices(
break;
}
+ answerList->push_back("<Period value=\"" + TARIFF::PeriodToString(it->tariffConf.period) + "\"/>");
+
answerList->push_back("</tariff>");
}
answerList->push_back("</Tariffs>");
}
return 0;
}
+
+ if (strcasecmp(el, "Period") == 0)
+ {
+ td.tariffConf.period = TARIFF::StringToPeriod(attr[1]);
+ return 0;
+ }
}
return -1;
}
printfd(__FILE__, "FILES_STORE::RestoreTariff - invalid trafftype for tariff '%s'\n", tariffName.c_str());
return -1;
}
+
+if (conf.ReadString("Period", &str, "month") < 0)
+ td->tariffConf.period = TARIFF::MONTH;
+else
+ td->tariffConf.period = TARIFF::StringToPeriod(str);
return 0;
}
//-----------------------------------------------------------------------------
cf.WriteString("TraffType", "max");
break;
}
+
+ cf.WriteString("Period", TARIFF::PeriodToString(td.tariffConf.period));
}
return 0;
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
errorStr = "Error moving dir from " + fileName + ".new to " + fileName;
- printfd(__FILE__, "FILES_STORE::SaveTariff - rename failed. Message: '%s'\n", strerror(errno));
+ printfd(__FILE__, "FILES_STORE::EditMessage - rename failed. Message: '%s'\n", strerror(errno));
return -1;
}
STGLIBS = ibpp \
common \
locker \
+ logger \
crypto
+LIBS = -lfbclient
+
include ../../Makefile.in
#include "stg/ibpp.h"
#include "stg/plugin_creator.h"
+#include "stg/logger.h"
#include "firebird_store.h"
using namespace std;
db(),
mutex(),
til(IBPP::ilConcurrency),
- tlr(IBPP::lrWait)
+ tlr(IBPP::lrWait),
+ schemaVersion(0),
+ WriteServLog(GetStgLogger())
{
pthread_mutex_init(&mutex, NULL);
}
{
db = IBPP::DatabaseFactory(db_server, db_database, db_user, db_password, "", "KOI8U", "");
db->Connect();
+ return CheckVersion();
}
catch (IBPP::Exception & ex)
{
return 0;
}
//-----------------------------------------------------------------------------
+int FIREBIRD_STORE::CheckVersion()
+{
+IBPP::Transaction tr = IBPP::TransactionFactory(db, IBPP::amRead, til, tlr);
+IBPP::Statement st = IBPP::StatementFactory(db, tr);
+
+string name;
+
+try
+ {
+ tr->Start();
+ st->Execute("SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG=0 AND RDB$RELATION_NAME = 'TB_INFO'");
+ if (!st->Fetch())
+ {
+ schemaVersion = 0;
+ }
+ else
+ {
+ st->Execute("SELECT version FROM tb_info");
+ while (st->Fetch())
+ st->Get(1, schemaVersion);
+ }
+ tr->Commit();
+ WriteServLog("FIREBIRD_STORE: Current DB schema version: %d", schemaVersion);
+ }
+
+catch (IBPP::Exception & ex)
+ {
+ tr->Rollback();
+ strError = "IBPP exception";
+ printfd(__FILE__, ex.what());
+ return -1;
+ }
+
+return 0;
+}
+//-----------------------------------------------------------------------------
extern "C" STORE * GetStore();
+class STG_LOGGER;
+
class FIREBIRD_STORE : public STORE {
public:
FIREBIRD_STORE();
mutable pthread_mutex_t mutex;
mutable IBPP::TIL til;
mutable IBPP::TLR tlr;
+ int schemaVersion;
+ STG_LOGGER & WriteServLog;
int SaveStat(const USER_STAT & stat, const std::string & login, int year = 0, int month = 0) const;
+ int CheckVersion();
};
time_t ts2time_t(const IBPP::Timestamp & ts);
}
st->Get(1, id);
st->Close();
- st->Prepare("update tb_tariffs set \
- fee = ?, \
- free = ?, \
- passive_cost = ?, \
- traff_type = ? \
- where pk_tariff = ?");
- st->Set(1, td.tariffConf.fee);
- st->Set(2, td.tariffConf.free);
- st->Set(3, td.tariffConf.passiveCost);
- st->Set(4, td.tariffConf.traffType);
- st->Set(5, id);
+ if (schemaVersion > 0)
+ {
+ st->Prepare("update tb_tariffs set \
+ fee = ?, \
+ free = ?, \
+ passive_cost = ?, \
+ traff_type = ?, \
+ period = ? \
+ where pk_tariff = ?");
+ st->Set(1, td.tariffConf.fee);
+ st->Set(2, td.tariffConf.free);
+ st->Set(3, td.tariffConf.passiveCost);
+ st->Set(4, td.tariffConf.traffType);
+ st->Set(5, TARIFF::PeriodToString(td.tariffConf.period));
+ st->Set(6, id);
+ }
+ else
+ {
+ st->Prepare("update tb_tariffs set \
+ fee = ?, \
+ free = ?, \
+ passive_cost = ?, \
+ traff_type = ? \
+ where pk_tariff = ?");
+ st->Set(1, td.tariffConf.fee);
+ st->Set(2, td.tariffConf.free);
+ st->Set(3, td.tariffConf.passiveCost);
+ st->Set(4, td.tariffConf.traffType);
+ st->Set(5, id);
+ }
st->Execute();
st->Close();
threshold = ?, \
time_day_begins = ?, \
time_day_ends = ? \
- where fk_tariff = ? and dir_num = ?");
+ where fk_tariff = ? and dir_num = ?");
st->Set(1, pda);
st->Set(2, pdb);
st->Set(3, pna);
try
{
tr->Start();
- st->Prepare("select * from tb_tariffs where name = ?");
+ st->Prepare("select * from tb_tariffs where name = ?"); // TODO: explicit field order!
st->Set(1, tariffName);
st->Execute();
if (!st->Fetch())
st->Get(4, td->tariffConf.free);
st->Get(5, td->tariffConf.passiveCost);
st->Get(6, td->tariffConf.traffType);
+ if (schemaVersion > 0)
+ {
+ std::string period;
+ st->Get(7, period);
+ td->tariffConf.period = TARIFF::StringToPeriod(period);
+ }
st->Close();
st->Prepare("select * from tb_tariffs_params where fk_tariff = ?");
st->Set(1, id);
SRCS = ./mysql_store.cpp
STGLIBS = common \
+ logger \
crypto
MYSQL_CFLAGS = $(shell mysql_config --cflags)
#include "stg/user_stat.h"
#include "stg/blowfish.h"
#include "stg/plugin_creator.h"
+#include "stg/logger.h"
#include "mysql_store.h"
#define adm_enc_passwd "cjeifY8m3"
: errorStr(),
version("mysql_store v.0.67"),
storeSettings(),
- settings()
+ settings(),
+ schemaVersion(0),
+ WriteServLog(GetStgLogger())
{
};
//-----------------------------------------------------------------------------
}
ret = CheckAllTables(sock);
}
- }
- else
- ret = CheckAllTables(sock);
- mysql_close(sock);
+ }
+ else
+ {
+ ret = CheckAllTables(sock);
+ }
+ if (!ret)
+ {
+ WriteServLog("MYSQL_STORE: Current DB schema version: %d", schemaVersion);
+ MakeUpdates(sock);
+ }
+ mysql_close(sock);
}
-
}
return ret;
}
//-----------------------------------------------------------------------------
int MYSQL_STORE::CheckAllTables(MYSQL * sock)
{
+//info-------------------------------------------------------------------------
+if(!IsTablePresent("info",sock))
+{
+ sprintf(qbuf,"CREATE TABLE info (version INTEGER NOT NULL)");
+
+ if(MysqlQuery(qbuf,sock))
+ {
+ errorStr = "Couldn't create info table With error:\n";
+ errorStr += mysql_error(sock);
+ mysql_close(sock);
+ return -1;
+ }
+
+ sprintf(qbuf,"INSERT INTO info SET version=0");
+
+ if(MysqlQuery(qbuf,sock))
+ {
+ errorStr = "Couldn't write default version. With error:\n";
+ errorStr += mysql_error(sock);
+ mysql_close(sock);
+ return -1;
+ }
+ schemaVersion = 0;
+}
+else
+{
+ std::vector<std::string> info;
+ if (GetAllParams(&info, "info", "version"))
+ schemaVersion = 0;
+ else
+ {
+ if (info.empty())
+ schemaVersion = 0;
+ else
+ GetInt(info.front(), &schemaVersion, 0);
+ }
+}
//admins-----------------------------------------------------------------------
if(!IsTablePresent("admins",sock))
{
res += param;
}
- res += "PassiveCost DOUBLE DEFAULT 0.0, Fee DOUBLE DEFAULT 0.0,"\
- "Free DOUBLE DEFAULT 0.0, TraffType VARCHAR(10) DEFAULT '')";
+ res += "PassiveCost DOUBLE DEFAULT 0.0, Fee DOUBLE DEFAULT 0.0,"
+ "Free DOUBLE DEFAULT 0.0, TraffType VARCHAR(10) DEFAULT '',"
+ "period VARCHAR(32) NOT NULL DEFAULT 'month')";
if(MysqlQuery(res.c_str(),sock))
{
res += "PassiveCost=0.0, Fee=10.0, Free=0,"\
"SinglePrice0=1, SinglePrice1=1,PriceDayA1=0.75,PriceDayB1=0.75,"\
- "PriceNightA0=1.0,PriceNightB0=1.0,TraffType='up+down'";
+ "PriceNightA0=1.0,PriceNightB0=1.0,TraffType='up+down',period='month'";
if(MysqlQuery(res.c_str(),sock))
{
mysql_close(sock);
return -1;
}
+
+ sprintf(qbuf,"UPDATE info SET version=1");
+
+ if(MysqlQuery(qbuf,sock))
+ {
+ errorStr = "Couldn't write default version. With error:\n";
+ errorStr += mysql_error(sock);
+ mysql_close(sock);
+ return -1;
+ }
+ schemaVersion = 1;
}
//users-----------------------------------------------------------------------
return 0;
}
//-----------------------------------------------------------------------------
+int MYSQL_STORE::MakeUpdates(MYSQL * sock)
+{
+if (schemaVersion < 1)
+ {
+ if (MysqlQuery("ALTER TABLE tariffs ADD period VARCHAR(32) NOT NULL DEFAULT 'month'", sock))
+ {
+ errorStr = "Couldn't update tariffs table to version 1. With error:\n";
+ errorStr += mysql_error(sock);
+ mysql_close(sock);
+ return -1;
+ }
+ if (MysqlQuery("UPDATE info SET version = 1", sock))
+ {
+ errorStr = "Couldn't update DB schema version to 1. With error:\n";
+ errorStr += mysql_error(sock);
+ mysql_close(sock);
+ return -1;
+ }
+ schemaVersion = 1;
+ WriteServLog("MYSQL_STORE: Updated DB schema to version %d", schemaVersion);
+ }
+return 0;
+}
//-----------------------------------------------------------------------------
int MYSQL_STORE::GetAllParams(vector<string> * ParamList,
return -1;
}
+if (schemaVersion > 0)
+{
+ str = row[5+8*DIR_NUM];
+ param = "Period";
+
+ if (str.length() == 0)
+ {
+ mysql_free_result(res);
+ errorStr = "Cannot read tariff " + tariffName + ". Parameter " + param;
+ mysql_close(sock);
+ return -1;
+ }
+
+ td->tariffConf.period = TARIFF::StringToPeriod(str);
+ }
+else
+ {
+ td->tariffConf.period = TARIFF::MONTH;
+ }
+
mysql_free_result(res);
mysql_close(sock);
return 0;
res += " TraffType='max'";
break;
}
+
+if (schemaVersion > 0)
+ res += ", Period='" + TARIFF::PeriodToString(td.tariffConf.period) + "'";
+
strprintf(¶m, " WHERE name='%s' LIMIT 1", tariffName.c_str());
res += param;
if(MysqlSetQuery(res.c_str()))
{
- errorStr = "Couldn't save admin:\n";
+ errorStr = "Couldn't save tariff:\n";
//errorStr += mysql_error(sock);
return -1;
}
using namespace std;
//-----------------------------------------------------------------------------
extern "C" STORE * GetStore();
+class STG_LOGGER;
//-----------------------------------------------------------------------------
class MYSQL_STORE_SETTINGS
{
virtual int WriteLogString(const string & str, const string & login) const;
int GetAllParams(vector<string> * ParamList, const string & table, const string & name) const;
int CheckAllTables(MYSQL * sock);
+ int MakeUpdates(MYSQL * sock);
bool IsTablePresent(const string & str,MYSQL * sock);
mutable string errorStr;
- int MysqlQuery(const char* sQuery,MYSQL * sock) const;
+ int MysqlQuery(const char* sQuery,MYSQL * sock) const;
int MysqlGetQuery(const char * Query,MYSQL * & sock) const;
int MysqlSetQuery(const char * Query) const;
MYSQL * MysqlConnect() const ;
string version;
MYSQL_STORE_SETTINGS storeSettings;
MODULE_SETTINGS settings;
+ int schemaVersion;
+ STG_LOGGER & WriteServLog;
};
//-----------------------------------------------------------------------------
STGLIBS = common \
crypto \
+ logger \
locker
PG_CFLAGS = $(shell pg_config --includedir)
#include "stg/module_settings.h"
#include "stg/plugin_creator.h"
+#include "stg/logger.h"
#include "postgresql_store_utils.h"
#include "postgresql_store.h"
mutex(),
version(0),
retries(3),
- connection(NULL)
+ connection(NULL),
+ WriteServLog(GetStgLogger())
{
pthread_mutex_init(&mutex, NULL);
}
return -1;
}
+WriteServLog("POSTGRESQL_STORE: Current DB schema version: %d", version);
+
return 0;
}
//-----------------------------------------------------------------------------
extern "C" STORE * GetStore();
+class STG_LOGGER;
+
class POSTGRESQL_STORE : public STORE {
public:
POSTGRESQL_STORE();
int retries;
PGconn * connection;
+
+ STG_LOGGER & WriteServLog;
};
extern const volatile time_t stgTime;
{
printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to escape name'\n");
if (RollbackTransaction())
- {
- printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to rollback transaction'\n");
- }
+ {
+ printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to rollback transaction'\n");
+ }
return -1;
}
{
printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to escape name'\n");
if (RollbackTransaction())
- {
- printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to rollback transaction'\n");
- }
+ {
+ printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to rollback transaction'\n");
+ }
return -1;
}
{
printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to escape name'\n");
if (RollbackTransaction())
- {
- printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to rollback transaction'\n");
- }
+ {
+ printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to rollback transaction'\n");
+ }
return -1;
}
printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Invalid number of tuples. Wanted 1, actulally %d'\n", tuples);
PQclear(result);
if (RollbackTransaction())
- {
- printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to rollback transaction'\n");
- }
+ {
+ printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to rollback transaction'\n");
+ }
return -1;
}
fee = " << td.tariffConf.fee << ", \
free = " << td.tariffConf.free << ", \
passive_cost = " << td.tariffConf.passiveCost << ", \
- traff_type = " << td.tariffConf.traffType << " \
- WHERE pk_tariff = " << id;
+ traff_type = " << td.tariffConf.traffType;
+
+if (version > 6)
+ query << ", period = '" << TARIFF::PeriodToString(td.tariffConf.period) << "'";
+
+query << " WHERE pk_tariff = " << id;
result = PQexec(connection, query.str().c_str());
{
printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to escape name'\n");
if (RollbackTransaction())
- {
- printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n");
- }
+ {
+ printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n");
+ }
return -1;
}
std::stringstream query;
query << "SELECT pk_tariff, \
fee, \
- free, \
- passive_cost, \
- traff_type \
- FROM tb_tariffs WHERE name = '" << ename << "'";
+ free, \
+ passive_cost, \
+ traff_type";
+
+if (version > 6)
+ query << ", period";
+
+query << " FROM tb_tariffs WHERE name = '" << ename << "'";
result = PQexec(connection, query.str().c_str());
printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Invalid number of tuples. Wanted 1, actulally %d'\n", tuples);
PQclear(result);
if (RollbackTransaction())
- {
- printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n");
- }
+ {
+ printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n");
+ }
return -1;
}
tuple >> td->tariffConf.passiveCost;
tuple >> td->tariffConf.traffType;
+if (version > 6)
+ td->tariffConf.period = TARIFF::StringToPeriod(PQgetvalue(result, 0, 5));
+
PQclear(result);
query.str("");
query << "SELECT dir_num, \
price_day_a, \
price_day_b, \
- price_night_a, \
- price_night_b, \
- threshold, \
- EXTRACT(hour FROM time_day_begins), \
- EXTRACT(minute FROM time_day_begins), \
- EXTRACT(hour FROM time_day_ends), \
- EXTRACT(minute FROM time_day_ends) \
- FROM tb_tariffs_params \
- WHERE fk_tariff = " << id;
+ price_night_a, \
+ price_night_b, \
+ threshold, \
+ EXTRACT(hour FROM time_day_begins), \
+ EXTRACT(minute FROM time_day_begins), \
+ EXTRACT(hour FROM time_day_ends), \
+ EXTRACT(minute FROM time_day_ends) \
+ FROM tb_tariffs_params \
+ WHERE fk_tariff = " << id;
result = PQexec(connection, query.str().c_str());
PQclear(result);
printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): '%s'\n", strError.c_str());
if (RollbackTransaction())
- {
- printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n");
- }
+ {
+ printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n");
+ }
return -1;
}
double GetPassiveCost() const { return tariffData.tariffConf.passiveCost; }
double GetFee() const { return tariffData.tariffConf.fee; }
double GetFree() const { return tariffData.tariffConf.free; }
+ PERIOD GetPeriod() const { return tariffData.tariffConf.period; }
void Print() const;
if (passive.ConstData() || tariff == NULL)
return;
+if (tariff->GetPeriod() != TARIFF::MONTH)
+ return;
+
double fee = tariff->GetFee() / DaysInCurrentMonth();
if (fee == 0.0)
if (tariff == NULL)
return;
+if (tariff->GetPeriod() != TARIFF::MONTH)
+ return;
+
double passiveTimePart = 1.0;
if (!settings->GetFullFee())
{
}
}
//-----------------------------------------------------------------------------
+void USER_IMPL::ProcessDailyFee()
+{
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+
+if (passive.ConstData() || tariff == NULL)
+ return;
+
+if (tariff->GetPeriod() != TARIFF::DAY)
+ return;
+
+double fee = tariff->GetFee();
+
+if (fee == 0.0)
+ return;
+
+double c = cash;
+switch (settings->GetFeeChargeType())
+ {
+ case 0:
+ property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge");
+ break;
+ case 1:
+ if (c + credit >= 0)
+ property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge");
+ break;
+ case 2:
+ if (c + credit >= fee)
+ property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge");
+ break;
+ }
+ResetPassiveTime();
+}
+//-----------------------------------------------------------------------------
void USER_IMPL::SetPrepaidTraff()
{
if (tariff != NULL)
void ProcessDayFee();
void ProcessDayFeeSpread();
void ProcessNewMonth();
+ void ProcessDailyFee();
bool IsInetable();
std::string GetEnabledDirs();
}
}
+std::for_each(users.begin(), users.end(), std::mem_fun_ref(&USER_IMPL::ProcessDailyFee));
+
if (settings->GetDayFeeIsLastDay())
{
printfd(__FILE__, "DayResetTraff - 2 -\n");