diff --git a/cmd/cgr-loader/cgr-loader.go b/cmd/cgr-loader/cgr-loader.go index 74fdafc1f..84427940d 100644 --- a/cmd/cgr-loader/cgr-loader.go +++ b/cmd/cgr-loader/cgr-loader.go @@ -19,33 +19,213 @@ package main import ( "flag" - // "github.com/rif/cgrates/timespans" + "github.com/rif/cgrates/timespans" "log" "os" + "strconv" "encoding/csv" + "time" ) var ( - separator = flag.String("separator", ";", "Default field separator") - redisserver = flag.String("redisserver", "tcp:127.0.0.1:6379", "redis server address (tcp:127.0.0.1:6379)") - redisdb = flag.Int("rdb", 10, "redis database number (10)") - redispass = flag.String("pass", "", "redis database password") - months = flag.String("month", "Months.csv", "Months file") + separator = flag.String("separator", ",", "Default field separator") + redisserver = flag.String("redisserver", "tcp:127.0.0.1:6379", "redis server address (tcp:127.0.0.1:6379)") + redisdb = flag.Int("rdb", 10, "redis database number (10)") + redispass = flag.String("pass", "", "redis database password") + monthsFn = flag.String("month", "Months.csv", "Months file") + monthdaysFn = flag.String("monthdays", "MonthDays.csv", "Month days file") + weekdaysFn = flag.String("weekdays", "WeekDays.csv", "Week days file") + destinationsFn = flag.String("destinations", "Destinations.csv", "Destinations file") + ratesFn = flag.String("rates", "Rates.csv", "Rates file") + ratingprofilesFn = flag.String("ratingprofiles", "RatingProfiles.csv", "Rating profiles file") ) -func main() { - flag.Parse() - fp, err := os.Open(*months) +var ( + months = make(map[string][]time.Month) + monthdays = make(map[string][]int) + weekdays = make(map[string][]time.Weekday) + destinations = make(map[string][]string) + rates = make(map[string][]*timespans.Interval) + ratingProfiles = make(map[string][]*timespans.ActivationPeriod) +) + +func loadDataSeries() { + // MONTHS + fp, err := os.Open(*monthsFn) if err != nil { log.Printf("Could not open months file: %v", err) } - csv := csv.NewReader(fp) - csv.Comma = rune(*separator) - for record, err := csv.Read(); err == nil; record, err = csv.Read() { - if record[0] == "Tag" { + csvReader := csv.NewReader(fp) + sep := []rune(*separator)[0] + csvReader.Comma = sep + for record, err := csvReader.Read(); err == nil; record, err = csvReader.Read() { + tag := record[0] + if tag == "Tag" { // skip header line continue } - log.Print(record) + for i, m := range record[1:] { + if m == "1" { + months[tag] = append(months[tag], time.Month(i+1)) + } + } + log.Print(tag, months[tag]) + } + fp.Close() + + // MONTH DAYS + fp, err = os.Open(*monthdaysFn) + if err != nil { + log.Printf("Could not open month days file: %v", err) + } + csvReader = csv.NewReader(fp) + csvReader.Comma = sep + for record, err := csvReader.Read(); err == nil; record, err = csvReader.Read() { + tag := record[0] + if tag == "Tag" { + // skip header line + continue + } + for i, m := range record[1:] { + if m == "1" { + monthdays[tag] = append(monthdays[tag], i+1) + } + } + log.Print(tag, monthdays[tag]) + } + fp.Close() + + // WEEK DAYS + fp, err = os.Open(*weekdaysFn) + if err != nil { + log.Printf("Could not open week days file: %v", err) + } + csvReader = csv.NewReader(fp) + csvReader.Comma = sep + for record, err := csvReader.Read(); err == nil; record, err = csvReader.Read() { + tag := record[0] + if tag == "Tag" { + // skip header line + continue + } + for i, m := range record[1:] { + if m == "1" { + weekdays[tag] = append(weekdays[tag], time.Weekday(((i + 1) % 7))) + } + } + log.Print(tag, weekdays[tag]) + } + fp.Close() +} + +func loadDestinations() { + fp, err := os.Open(*destinationsFn) + defer fp.Close() + if err != nil { + log.Printf("Could not open destinations file: %v", err) + return + } + csvReader := csv.NewReader(fp) + sep := []rune(*separator)[0] + csvReader.Comma = sep + for record, err := csvReader.Read(); err == nil; record, err = csvReader.Read() { + tag := record[0] + if tag == "Tag" { + // skip header line + continue + } + for _, m := range record[1:] { + destinations[tag] = append(destinations[tag], m) + } + log.Print(tag, destinations[tag]) } } + +func loadRates() { + fp, err := os.Open(*ratesFn) + defer fp.Close() + if err != nil { + log.Printf("Could not open rates file: %v", err) + return + } + csvReader := csv.NewReader(fp) + sep := []rune(*separator)[0] + csvReader.Comma = sep + for record, err := csvReader.Read(); err == nil; record, err = csvReader.Read() { + tag := record[0] + if tag == "Tag" { + // skip header line + continue + } + if len(record) < 9 { + log.Printf("Malformed rates record: %v", record) + continue + } + cf, err := strconv.ParseFloat(record[5], 64) + if err != nil { + log.Printf("Error parsing connect fee from: %v", record) + continue + } + p, err := strconv.ParseFloat(record[6], 64) + if err != nil { + log.Printf("Error parsing price from: %v", record) + continue + } + bu, err := strconv.ParseFloat(record[7], 64) + if err != nil { + log.Printf("Error parsing billing unit from: %v", record) + continue + } + w, err := strconv.ParseFloat(record[8], 64) + if err != nil { + log.Printf("Error parsing weight from: %v", record) + continue + } + i := ×pans.Interval{ + Months: timespans.Months(months[record[1]]), + MonthDays: timespans.MonthDays(monthdays[record[2]]), + WeekDays: timespans.WeekDays(weekdays[record[3]]), + StartTime: record[4], + ConnectFee: cf, + Price: p, + BillingUnit: bu, + Weight: w, + } + rates[tag] = append(rates[tag], i) + + log.Print(tag) + for _, i := range rates[tag] { + log.Print(i) + } + } +} + +func loadRatingProfiles() { + fp, err := os.Open(*destinationsFn) + defer fp.Close() + if err != nil { + log.Printf("Could not open destinations file: %v", err) + return + } + csvReader := csv.NewReader(fp) + sep := []rune(*separator)[0] + csvReader.Comma = sep + for record, err := csvReader.Read(); err == nil; record, err = csvReader.Read() { + tag := record[0] + if tag == "Tag" { + // skip header line + continue + } + for _, m := range record[1:] { + destinations[tag] = append(destinations[tag], m) + } + log.Print(tag, destinations[tag]) + } +} + +func main() { + flag.Parse() + loadDataSeries() + loadDestinations() + loadRates() +} diff --git a/data/BalanceProfiles.csv b/data/BalanceProfiles.csv index 09cc0f357..ca6f0934e 100644 --- a/data/BalanceProfiles.csv +++ b/data/BalanceProfiles.csv @@ -1,3 +1,3 @@ -Account;AccountType;MonetaryBalance;SMSBalance;TrafficBalance;MonthsTag;MonthDaysTag;WeekDaysTag;StartTime;RecurrentTopupTag;RecurrentClears -rif;postpaid;10;50;100;ALL;20th;ALL;00:00:00;STARTER_PACK;1 -danb;prepaid;10;50;500;ALL;20th;ALL;00:00:00;STARTER_PACK;1 +Account,AccountType,MonetaryBalance,SMSBalance,TrafficBalance,RecurrentTopupsTag,RecurrentMonthsTag,RecurrentMonthDaysTag,RecurrentWeekDaysTag,RecurrentStartTime,RecurrentClears +rif,postpaid,10,50,100,STARTER_PACK,ALL,20th,ALL,00:00:00,1 +danb,prepaid,10,50,500,STARTER_PACK,ALL,20th,ALL,00:00:00,1 diff --git a/data/Destinations.csv b/data/Destinations.csv index e134bbd1b..7fbe8a88e 100644 --- a/data/Destinations.csv +++ b/data/Destinations.csv @@ -1,3 +1,6 @@ -Tag;Prefix -GERMANY;49 -GERMANY_MOBILE_O2;49176 +Tag,Prefix +GERMANY,49 +GERMANY_MOBILE_O2,49176 +ALL,49 +ALL,41 +ALL,43 diff --git a/data/InboundBonuses.csv b/data/InboundBonuses.csv index c1ec154d4..dc9060fb3 100644 --- a/data/InboundBonuses.csv +++ b/data/InboundBonuses.csv @@ -1,3 +1,3 @@ -Tag;TOR;InboundUnits;MonetaryUnits;SMSUnits;TrafficUnits -STARTER_BONUSES;0;60;0.01;0;0 -STARTER_BONUSES;100;1;0.01;0;0 +Tag,TOR,InboundUnits,MonetaryUnits,SMSUnits,TrafficUnits +STARTER_BONUSES,0,60,0.01,0,0 +STARTER_BONUSES,100,1,0.01,0,0 diff --git a/data/MonthDays.csv b/data/MonthDays.csv index 15e732272..3c53507eb 100644 --- a/data/MonthDays.csv +++ b/data/MonthDays.csv @@ -1,6 +1,6 @@ -Tag;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31 -ALL;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1 -CHRISTMAS_DAY;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0 -VALENTINES_DAY;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 -20th;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0 -FIRST;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0 +Tag,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 +ALL,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +CHRISTMAS_DAY,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0 +VALENTINES_DAY,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +20th,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +FIRST,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/data/Months.csv b/data/Months.csv index eb177064b..347a4ee8b 100644 --- a/data/Months.csv +++ b/data/Months.csv @@ -1,7 +1,7 @@ -Tag;January;February;March;April;May;June;Jully;August;September;October;November;December -ALL;1;1;1;1;1;1;1;1;1;1;1;1 -WINTER;1;1;0;0;0;0;0;0;0;0;0;1 -SPRING;0;0;1;1;1;0;0;0;0;0;0;0 -SUMMER;0;0;0;0;0;1;1;1;0;0;0;0 -AUTUMN;0;0;0;0;0;0;0;0;1;1;1;0 -JANUARY;1;0;0;0;0;0;0;0;0;0;0;0 +Tag,January,February,March,April,May,June,Jully,August,September,October,November,December +ALL,1,1,1,1,1,1,1,1,1,1,1,1 +WINTER,1,1,0,0,0,0,0,0,0,0,0,1 +SPRING,0,0,1,1,1,0,0,0,0,0,0,0 +SUMMER,0,0,0,0,0,1,1,1,0,0,0,0 +AUTUMN,0,0,0,0,0,0,0,0,1,1,1,0 +JANUARY,1,0,0,0,0,0,0,0,0,0,0,0 diff --git a/data/OutboundBonuses.csv b/data/OutboundBonuses.csv index 067a92c7c..039a68d2d 100644 --- a/data/OutboundBonuses.csv +++ b/data/OutboundBonuses.csv @@ -1,3 +1,3 @@ -Tag;TOR;OutboundUnits;DestinationsTag;MonetaryUnits;SMSUnits;TrafficUnits -STARTER_BONUSES;0;60;GERMANY;0.01;0;0 -STARTER_BONUSES;100;1;GERMANY;0.01;0;0 +Tag,TOR,OutboundUnits,DestinationsTag,MonetaryUnits,SMSUnits,TrafficUnits +STARTER_BONUSES,0,60,GERMANY,0.01,0,0 +STARTER_BONUSES,100,1,GERMANY,0.01,0,0 diff --git a/data/Rates.csv b/data/Rates.csv index bf42eaa5b..ffdab1b88 100644 --- a/data/Rates.csv +++ b/data/Rates.csv @@ -1,4 +1,5 @@ -Tag;MonthsTag;MonthDaysTag;WeekDaysTag;StartTime;ConnectFee;Price;BillingUnit;Weight -STANDARD;ALL;ALL;WORKDAYS;00:00:00;0;0.2;1;10 -STANDARD;ALL;ALL;WORKDAYS;18:00:00;0;0.1;1;10 -STANDARD;ALL;ALL;WEEKENDS;00:00:00;0;0.1;1;10 +Tag,DestinationsTag,MonthsTag,MonthDaysTag,WeekDaysTag,StartTime,ConnectFee,Price,BillingUnit,Weight +STANDARD,GERMANY,ALL,ALL,WORKDAYS,00:00:00,0,0.2,1,10 +STANDARD,GERMANY_O2,ALL,ALL,WORKDAYS,18:00:00,0,0.1,1,10 +STANDARD,GERMANY_PREMIUM,ALL,ALL,WEEKENDS,00:00:00,0,0.1,1,10 +DEFAULT,ALL,ALL,ALL,ALL,00:00:00,0,0.1,1,10 diff --git a/data/RatingProfiles.csv b/data/RatingProfiles.csv index 2aad9e464..d41570108 100644 --- a/data/RatingProfiles.csv +++ b/data/RatingProfiles.csv @@ -1,3 +1,4 @@ -Tenant;Subject;TOR;DestinationsTag;RatesTag;ActivationTime -CUSTOMER_1;rif;0;GERMANY;STANDARD;2012-01-01T00:00:00:00.00000 -CUSTOMER_2;danb;0;GERMANY_O2;STANDARD;2012-01-01T00:00:00:00.00000 +Tenant,Subject,TOR,RatesTag,FallbackRatesTag,ActivationTime +CUSTOMER_1,rif,0,STANDARD,DEFAULT,2012-01-01T00:00:00:00.00000 +CUSTOMER_2,danb,0,STANDARD,DEFAULT,2012-01-01T00:00:00:00.00000 +CUSTOMER_1,danb,0,PREMIUM,,2012-01-01T00:00:00:00.00000 diff --git a/data/RecurrentDebits.csv b/data/RecurrentDebits.csv index 9b2561b3b..668206f4d 100644 --- a/data/RecurrentDebits.csv +++ b/data/RecurrentDebits.csv @@ -1,2 +1,2 @@ -Tag;MonetaryUnits;SMSUnits;TrafficUnits -DEBIT_5;5;0;0 +Tag,MonetaryUnits,SMSUnits,TrafficUnits +DEBIT_5,5,0,0 diff --git a/data/RecurrentTopups.csv b/data/RecurrentTopups.csv index 8971b3178..5b4ba50ba 100644 --- a/data/RecurrentTopups.csv +++ b/data/RecurrentTopups.csv @@ -1,2 +1,2 @@ -Tag;RecurrentDebitsTag;MonetaryBalance;SMSBalance;TrafficBalance;VolumeRatesTag;VolumeDiscountsTag;InboundBonusesTag;OutboundBonusesTag -STARTER_PACK;DEBIT_5;2;50;100;GERMANY_100_LANDLINE_MINUTES;UPTO_2000_GERMANY_10PERC;STARTER_BONUSES;STARTER_BONUSES +Tag,RecurrentDebitsTag,MonetaryBalance,SMSBalance,TrafficBalance,VolumeRatesTag,VolumeDiscountsTag,InboundBonusesTag,OutboundBonusesTag +STARTER_PACK,DEBIT_5,2,50,100,GERMANY_100_LANDLINE_MINUTES,UPTO_2000_GERMANY_10PERC,STARTER_BONUSES,STARTER_BONUSES diff --git a/data/VolumeDiscounts.csv b/data/VolumeDiscounts.csv index de575fbf8..25d8b011f 100644 --- a/data/VolumeDiscounts.csv +++ b/data/VolumeDiscounts.csv @@ -1,2 +1,2 @@ -Tag;TOR;DestinationsTag;VolumeUnits;Discount;Weight -UPTO_2000_GERMANY_10PERC;0;GERMANY;2000;10;10 +Tag,TOR,DestinationsTag,VolumeUnits,Discount,Weight +UPTO_2000_GERMANY_10PERC,0,GERMANY,2000,10,10 diff --git a/data/VolumeRates.csv b/data/VolumeRates.csv index a68a72c31..179045e1d 100644 --- a/data/VolumeRates.csv +++ b/data/VolumeRates.csv @@ -1,2 +1,2 @@ -Tag;TOR;DestinationsTag;VolumeUnits;Price;Weight -GERMANY_100_LANDLINE_MINUTES;0;GERMANY;100;0;10 +Tag,TOR,DestinationsTag,VolumeUnits,Price,Weight +GERMANY_100_LANDLINE_MINUTES,0,GERMANY,100,0,10 diff --git a/data/WeekDays.csv b/data/WeekDays.csv index 90959f732..d9cf86a4e 100644 --- a/data/WeekDays.csv +++ b/data/WeekDays.csv @@ -1,4 +1,4 @@ -Tag;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday;Sunday -ALL;1;1;1;1;1;1;1 -WORKDAYS;1;1;1;1;1;0;0 -WEEKENDS;0;0;0;0;0;1;1 +Tag,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday +ALL,1,1,1,1,1,1,1 +WORKDAYS,1,1,1,1,1,0,0 +WEEKENDS,0,0,0,0,0,1,1 diff --git a/timespans/activationperiod.go b/timespans/activationperiod.go index f2cedcb62..df66ca933 100644 --- a/timespans/activationperiod.go +++ b/timespans/activationperiod.go @@ -54,7 +54,7 @@ func (ap *ActivationPeriod) store() (result string) { is += i.WeekDays.store() + "|" is += i.StartTime + "|" is += i.EndTime + "|" - is += strconv.FormatFloat(i.Ponder, 'f', -1, 64) + "|" + is += strconv.FormatFloat(i.Weight, 'f', -1, 64) + "|" is += strconv.FormatFloat(i.ConnectFee, 'f', -1, 64) + "|" is += strconv.FormatFloat(i.Price, 'f', -1, 64) + "|" is += strconv.FormatFloat(i.BillingUnit, 'f', -1, 64) @@ -79,7 +79,7 @@ func (ap *ActivationPeriod) restore(input string) { i.WeekDays.restore(ise[2]) i.StartTime = ise[3] i.EndTime = ise[4] - i.Ponder, _ = strconv.ParseFloat(ise[5], 64) + i.Weight, _ = strconv.ParseFloat(ise[5], 64) i.ConnectFee, _ = strconv.ParseFloat(ise[6], 64) i.Price, _ = strconv.ParseFloat(ise[7], 64) i.BillingUnit, _ = strconv.ParseFloat(ise[8], 64) diff --git a/timespans/interval.go b/timespans/interval.go index 73a77a0ba..d826c9899 100644 --- a/timespans/interval.go +++ b/timespans/interval.go @@ -22,6 +22,7 @@ import ( "strconv" "strings" "time" + "fmt" //"log" ) @@ -33,7 +34,7 @@ type Interval struct { MonthDays MonthDays WeekDays WeekDays StartTime, EndTime string // ##:##:## format - Ponder, ConnectFee, Price, BillingUnit float64 + Weight, ConnectFee, Price, BillingUnit float64 } /* @@ -124,3 +125,7 @@ func (i *Interval) getLeftMargin(t time.Time) (rigthtTime time.Time) { } return time.Date(year, month, day, hour, min, sec, nsec, loc) } + +func (i *Interval) String() string { + return fmt.Sprintf("%v %v %v %v %v", i.Months, i.MonthDays, i.WeekDays, i.StartTime, i.EndTime) +} diff --git a/timespans/timespans.go b/timespans/timespans.go index 08fa774a0..b4152ed8d 100644 --- a/timespans/timespans.go +++ b/timespans/timespans.go @@ -83,14 +83,14 @@ func (ts *TimeSpan) Contains(t time.Time) bool { } /* -Will set the interval as spans's interval if new ponder is greater then span's interval ponder -or if the ponders are equal and new price is lower then spans's interval price +Will set the interval as spans's interval if new Weight is greater then span's interval Weight +or if the Weights are equal and new price is lower then spans's interval price */ func (ts *TimeSpan) SetInterval(i *Interval) { - if ts.Interval == nil || ts.Interval.Ponder < i.Ponder { + if ts.Interval == nil || ts.Interval.Weight < i.Weight { ts.Interval = i } - if ts.Interval.Ponder == i.Ponder && i.Price < ts.Interval.Price { + if ts.Interval.Weight == i.Weight && i.Price < ts.Interval.Price { ts.Interval = i } }