Adding API support for rounding functions at rate level

This commit is contained in:
DanB
2013-07-12 16:09:41 +02:00
parent 526b50ed12
commit 2be2bc97a0
4 changed files with 49 additions and 32 deletions

View File

@@ -39,15 +39,17 @@ CREATE TABLE `tp_rates` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tpid` char(40) NOT NULL,
`tag` varchar(24) NOT NULL,
`connect_fee` DECIMAL(5,4) NOT NULL,
`rate` DECIMAL(5,4) NOT NULL,
`rated_units` INT(11) NOT NULL,
`rate_increments` INT(11) NOT NULL,
`weight` DECIMAL(5,2) NOT NULL,
`connect_fee` decimal(5,4) NOT NULL,
`rate` decimal(5,4) NOT NULL,
`rated_units` int(11) NOT NULL,
`rate_increments` int(11) NOT NULL,
`rounding_method` varchar(255) NOT NULL,
`rounding_decimals` tinyint(4) NOT NULL,
`weight` decimal(5,2) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `tpid_tag_rate_weight` (`tpid`,`tag`,`weight`),
KEY `tpid` (`tpid`),
KEY `tpid_tag` (`tpid`,`tag`),
UNIQUE KEY `tpid_tag_rate_weight` (`tpid`,`tag`,`weight`)
KEY `tpid_tag` (`tpid`,`tag`)
);
--

View File

@@ -19,6 +19,8 @@ Creates a new rate within a tariff plan.
Rate float64 // Rate applied
RatedUnits int // Number of billing units this rate applies to
RateIncrements int // This rate will apply in increments of duration
RoundingMethod string // Use this method to round the cost
RoundingDecimals int // Round the cost number of decimals
Weight float64 // Rate's priority when dealing with grouped rates
}
@@ -28,25 +30,29 @@ Creates a new rate within a tariff plan.
::
{
"id": 0,
"id": 1,
"method": "Apier.SetTPRate",
"params": [
{
"RateId": "SAMPLE_RATE_4",
"RateId": "SAMPLE_RATE_2",
"RateSlots": [
{
"ConnectFee": 0,
"Rate": 1.2,
"ConnectFee": 0.2,
"Rate": 2,
"RateIncrements": 1,
"RatedUnits": 60,
"Weight": 10
"RatedUnits": 1,
"RoundingDecimals": 2,
"RoundingMethod": "*up",
"Weight": 10.0
},
{
"ConnectFee": 0,
"Rate": 2.2,
"ConnectFee": 0.2,
"Rate": 2.1,
"RateIncrements": 1,
"RatedUnits": 60,
"Weight": 20
"RatedUnits": 1,
"RoundingDecimals": 2,
"RoundingMethod": "*up",
"Weight": 20.0
}
],
"TPid": "SAMPLE_TP"
@@ -129,6 +135,8 @@ Queries specific rate on tariff plan.
Rate float64 // Rate applied
RatedUnits int // Number of billing units this rate applies to
RateIncrements int // This rate will apply in increments of duration
RoundingMethod string // Use this method to round the cost
RoundingDecimals int // Round the cost number of decimals
Weight float64 // Rate's priority when dealing with grouped rates
}
@@ -137,22 +145,26 @@ Queries specific rate on tariff plan.
{
"error": null,
"id": 1,
"id": 2,
"result": {
"RateId": "SAMPLE_RATE_4",
"RateId": "SAMPLE_RATE_2",
"RateSlots": [
{
"ConnectFee": 0,
"Rate": 1.2,
"ConnectFee": 0.2,
"Rate": 2,
"RateIncrements": 1,
"RatedUnits": 60,
"RatedUnits": 1,
"RoundingDecimals": 2,
"RoundingMethod": "*up",
"Weight": 10
},
{
"ConnectFee": 0,
"Rate": 2.2,
"ConnectFee": 0.2,
"Rate": 2.1,
"RateIncrements": 1,
"RatedUnits": 60,
"RatedUnits": 1,
"RoundingDecimals": 2,
"RoundingMethod": "*up",
"Weight": 20
}
],

View File

@@ -210,9 +210,9 @@ func (self *SQLStorage) ExistsTPRate(tpid, rtId string) (bool, error) {
func (self *SQLStorage) SetTPRate(rt *utils.TPRate) error {
for _, rtSlot := range rt.RateSlots {
if _, err := self.Db.Exec(fmt.Sprintf("INSERT INTO %s (tpid, tag, connect_fee, rate, rated_units, rate_increments, weight) VALUES ('%s', '%s', %f, %f, %d, %d, %f)",
utils.TBL_TP_RATES, rt.TPid, rt.RateId, rtSlot.ConnectFee, rtSlot.Rate, rtSlot.RatedUnits, rtSlot.RateIncrements,
rtSlot.Weight)); err != nil {
if _, err := self.Db.Exec(fmt.Sprintf("INSERT INTO %s (tpid, tag, connect_fee, rate, rated_units, rate_increments, rounding_method, rounding_decimals, weight) VALUES ('%s', '%s', %f, %f, %d, %d,'%s', %d, %f)",
utils.TBL_TP_RATES, rt.TPid, rt.RateId, rtSlot.ConnectFee, rtSlot.Rate, rtSlot.RatedUnits, rtSlot.RateIncrements,
rtSlot.RoundingMethod, rtSlot.RoundingDecimals, rtSlot.Weight)); err != nil {
return err
}
}
@@ -220,7 +220,7 @@ func (self *SQLStorage) SetTPRate(rt *utils.TPRate) error {
}
func (self *SQLStorage) GetTPRate(tpid, rtId string) (*utils.TPRate, error) {
rows, err := self.Db.Query(fmt.Sprintf("SELECT connect_fee, rate, rated_units, rate_increments, weight FROM %s WHERE tpid='%s' AND tag='%s'", utils.TBL_TP_RATES, tpid, rtId))
rows, err := self.Db.Query(fmt.Sprintf("SELECT connect_fee, rate, rated_units, rate_increments, rounding_method, rounding_decimals, weight FROM %s WHERE tpid='%s' AND tag='%s'", utils.TBL_TP_RATES, tpid, rtId))
if err != nil {
return nil, err
}
@@ -230,12 +230,13 @@ func (self *SQLStorage) GetTPRate(tpid, rtId string) (*utils.TPRate, error) {
for rows.Next() {
i++ //Keep here a reference so we know we got at least one prefix
var connectFee, rate, weight float64
var ratedUnits, rateIncrements int
err = rows.Scan(&connectFee, &rate, &ratedUnits, &rateIncrements, &weight)
var ratedUnits, rateIncrements, roundingDecimals int
var roundingMethod string
err = rows.Scan(&connectFee, &rate, &ratedUnits, &rateIncrements, &roundingMethod, &roundingDecimals, &weight)
if err != nil {
return nil, err
}
rt.RateSlots = append(rt.RateSlots, utils.RateSlot{connectFee, rate, ratedUnits, rateIncrements, weight})
rt.RateSlots = append(rt.RateSlots, utils.RateSlot{connectFee, rate, ratedUnits, rateIncrements, roundingMethod, roundingDecimals, weight})
}
if i == 0 {
return nil, nil

View File

@@ -31,6 +31,8 @@ type RateSlot struct {
Rate float64 // Rate applied
RatedUnits int // Number of billing units this rate applies to
RateIncrements int // This rate will apply in increments of duration
RoundingMethod string // Use this method to round the cost
RoundingDecimals int // Round the cost number of decimals
Weight float64 // Rate's priority when dealing with grouped rates
}