You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
4.2 KiB
165 lines
4.2 KiB
package main
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"sort"
|
|
|
|
"src.wolkict.net/cdr"
|
|
)
|
|
|
|
var (
|
|
csvFile = flag.String("csv", "", "use this call detail record CSV file")
|
|
pricesFile = flag.String("prices", "", "use this pricing CSV file")
|
|
priceExec = flag.Bool("execute", false, "price each CDR according to the prices file")
|
|
debugImport = flag.Bool("debugImport", false, "show extra debugging info for import")
|
|
debug = flag.Bool("debug", false, "show extra debugging info")
|
|
export = flag.String("export", "", "export priced calls to this csv")
|
|
)
|
|
|
|
func usage() {
|
|
fmt.Println("Usage: cdrtool -csv <file.csv> [-prices <file.csv>] [-debug] [-execute]")
|
|
flag.PrintDefaults()
|
|
}
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
cdr.SetDebug(*debug)
|
|
|
|
if *csvFile == "" {
|
|
usage()
|
|
log.Fatalf("mandatory -csv not set")
|
|
}
|
|
|
|
if _, err := os.Open(*csvFile); err != nil {
|
|
log.Fatalf("cannot access CSV %q: %v", *csvFile, err)
|
|
}
|
|
if _, err := os.Open(*pricesFile); err != nil {
|
|
log.Printf("[warning] cannot access prices file %q", *pricesFile)
|
|
}
|
|
|
|
imported, err := cdr.ImportCSV(*csvFile)
|
|
if err != nil {
|
|
log.Fatalf("importing CSV failed: %v", err)
|
|
}
|
|
if *debug {
|
|
log.Printf("importing CDR CSV %q succeeded", *csvFile)
|
|
}
|
|
|
|
importedPrices, err := cdr.ImportPricesFile(*pricesFile)
|
|
if err != nil && *priceExec {
|
|
log.Fatalf("importing prices CSV %q failed: %v", *pricesFile, err)
|
|
}
|
|
if *debugImport {
|
|
if err != nil {
|
|
log.Printf("[warning] importing prices CSV %q failed: %v", *pricesFile, err)
|
|
} else {
|
|
log.Printf("importing prices CSV %q succeeded", *pricesFile)
|
|
}
|
|
}
|
|
|
|
if *debugImport {
|
|
for _, i := range imported {
|
|
fmt.Printf("l: %+v\n", i)
|
|
}
|
|
|
|
for _, i := range importedPrices {
|
|
fmt.Printf("p: %+v\n", i)
|
|
}
|
|
}
|
|
|
|
if *priceExec {
|
|
texts, err := cdr.CombineTextCDRs(imported, importedPrices)
|
|
if err != nil {
|
|
log.Fatalf("combining text CDRs with prices failed: %v", err)
|
|
}
|
|
|
|
data, err := cdr.CombineDataCDRs(imported, importedPrices)
|
|
if err != nil {
|
|
log.Fatalf("combining data CDRs with prices failed: %v", err)
|
|
}
|
|
|
|
calls, err := cdr.CombineCallCDRs(imported, importedPrices)
|
|
if err != nil {
|
|
log.Fatalf("combining call CDRs with prices failed: %v", err)
|
|
}
|
|
|
|
if *debug {
|
|
for _, t := range texts {
|
|
fmt.Printf("t: %+v\n", t)
|
|
}
|
|
for _, d := range data {
|
|
fmt.Printf("d: %+v\n", d)
|
|
}
|
|
|
|
for _, c := range calls {
|
|
fmt.Printf("c: %+v\n", c)
|
|
}
|
|
}
|
|
if *export != "" {
|
|
toExport := make([][]string, 0)
|
|
toExport = append(toExport, cdr.ExportLineHeader)
|
|
|
|
sc := cdr.NewSortableCalls(calls)
|
|
sort.Sort(sc)
|
|
callCost := 0
|
|
callPrice := 0
|
|
for _, c := range sc.Calls {
|
|
if *debug {
|
|
fmt.Printf("%s\n", c.String())
|
|
}
|
|
callCost += c.Cost
|
|
callPrice += c.Price
|
|
toExport = append(toExport, cdr.ExportCall(c))
|
|
}
|
|
|
|
st := cdr.NewSortableTexts(texts)
|
|
sort.Sort(st)
|
|
textCost := 0
|
|
textPrice := 0
|
|
for _, t := range st.Texts {
|
|
if *debug {
|
|
fmt.Printf("%s\n", t.String())
|
|
}
|
|
textCost += t.PricedLine.Cost
|
|
textPrice += t.PricedLine.Price
|
|
toExport = append(toExport, cdr.ExportText(t))
|
|
}
|
|
|
|
sd := cdr.NewSortableData(data)
|
|
sort.Sort(sd)
|
|
dataCost := 0
|
|
dataPrice := 0
|
|
for _, d := range sd.Data {
|
|
if *debug {
|
|
fmt.Printf("%s\n", d.String())
|
|
}
|
|
dataCost += d.PricedLine.Cost
|
|
dataPrice += d.PricedLine.Price
|
|
toExport = append(toExport, cdr.ExportData(d))
|
|
}
|
|
|
|
fmt.Printf("callCost: %.4f, callPrice: %.4f\n", float64(callCost)/10000.0, float64(callPrice)/10000.0)
|
|
fmt.Printf("textCost: %.4f, textPrice: %.4f\n", float64(textCost)/10000.0, float64(textPrice)/10000.0)
|
|
fmt.Printf("dataCost: %.4f, dataPrice: %.4f\n", float64(dataCost)/10000.0, float64(dataPrice)/10000.0)
|
|
|
|
_, err = os.Stat(*export)
|
|
if !os.IsNotExist(err) {
|
|
log.Fatalf("refusing to write to existing file %q for exporting", *export)
|
|
}
|
|
csvExportFile, err := os.Create(*export)
|
|
if err != nil {
|
|
log.Fatalf("cannot create export file %q: %v", *export, err)
|
|
}
|
|
csvWriter := csv.NewWriter(csvExportFile)
|
|
err = csvWriter.WriteAll(toExport)
|
|
if err != nil {
|
|
log.Fatalf("cannot export csv to %q: %v", *export, err)
|
|
}
|
|
log.Printf("exported priced CDRs to %q", *export)
|
|
}
|
|
}
|
|
}
|
|
|