|
|
|
@ -140,7 +140,7 @@ func CombineCallCDRs(cdrLines []Line, prices []Price) ([]Call, error) { |
|
|
|
|
|
|
|
} |
|
|
|
if !matched { |
|
|
|
fmt.Printf("[debug] non-matched price for destination %q\n", l.Destination) |
|
|
|
fmt.Printf("[debug] non-matched price for destination %q (from line: %+v)\n", l.Destination, l) |
|
|
|
nonMatchedDestinations[l.Destination] = struct{}{} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -175,8 +175,12 @@ func CombineCallCDRs(cdrLines []Line, prices []Price) ([]Call, error) { |
|
|
|
*/ |
|
|
|
callCost := 0.0 |
|
|
|
callPrice := 0.0 |
|
|
|
for _, leg := range v { |
|
|
|
pricedLegs := make([]PricedLine, len(v)) |
|
|
|
for i, leg := range v { |
|
|
|
legPrice := Price{} |
|
|
|
pricedLeg := PricedLine{} |
|
|
|
// TODO: observation: first check the number of legs, if we have multiple, assume it's a HS->PBX->Destination (outgoing) call.
|
|
|
|
// Source->PBX->Handset ends up as one leg
|
|
|
|
if leg.CLI == leg.From { |
|
|
|
switch { |
|
|
|
case leg.Source == CALL_FROM_HANDSET_SOURCE && leg.Destination == CALL_FROM_HANDSET_DESTINATION: |
|
|
|
@ -219,28 +223,52 @@ func CombineCallCDRs(cdrLines []Line, prices []Price) ([]Call, error) { |
|
|
|
leg.Id, leg.Time.Format(DateTimeFormat), leg.CLI, leg.From, leg.To, leg.Source, leg.Destination, leg.Reason, mapOk) |
|
|
|
} else { |
|
|
|
// RawCount is in seconds. Buy/SellUnit is in cents*100, per minute
|
|
|
|
callCost += float64(legPrice.BuyEach) + float64(leg.RawCount)*(float64(legPrice.BuyUnit)/60.0) |
|
|
|
callPrice += float64(legPrice.SellEach) + float64(leg.RawCount)*(float64(legPrice.SellUnit)/60.0) |
|
|
|
fmt.Printf("(%12s->%12s) leg %d, callCost: %.4f, callPrice: %.4f (dst: %q)\n", leg.CLI, leg.To, leg.Leg, callCost, callPrice, legPrice.OurRef) |
|
|
|
thisLegCost := float64(legPrice.BuyEach) + float64(leg.RawCount)*(float64(legPrice.BuyUnit)/60.0) |
|
|
|
thisLegPrice := float64(legPrice.SellEach) + float64(leg.RawCount)*(float64(legPrice.SellUnit)/60.0) |
|
|
|
|
|
|
|
pricedLeg.Line = leg |
|
|
|
pricedLeg.Cost = int(math.Round(thisLegCost)) |
|
|
|
pricedLeg.Price = int(math.Round(thisLegPrice)) |
|
|
|
pricedLegs[i] = pricedLeg |
|
|
|
|
|
|
|
callCost += thisLegCost |
|
|
|
callPrice += thisLegPrice |
|
|
|
fmt.Printf("(%12s( %12s)->%12s) leg %d, callCost: %.4f, callPrice: %.4f (dst: %q)\n", leg.CLI, leg.From, leg.To, leg.Leg, callCost, callPrice, legPrice.OurRef) |
|
|
|
} |
|
|
|
// Source -> HS (non-roaming) (i.e. incoming calls) does not exist in the CSV
|
|
|
|
//fmt.Printf("(%12s->%12s) leg %d, price: %+v\n", leg.CLI, leg.To, leg.Leg, legPrice)
|
|
|
|
} |
|
|
|
callDuration, _ := time.ParseDuration(fmt.Sprintf("%ds", v[0].RawCount)) |
|
|
|
var callFrom, callTo string |
|
|
|
|
|
|
|
ret[i] = Call{ |
|
|
|
Duration: callDuration, |
|
|
|
Time: v[0].Time, |
|
|
|
Cost: int(math.Round(callCost)), |
|
|
|
Price: int(math.Round(callPrice)), |
|
|
|
Legs: pricedLegs, |
|
|
|
} |
|
|
|
if len(v) == 1 { |
|
|
|
callDuration, _ := time.ParseDuration(fmt.Sprintf("%ds", v[0].RawCount)) |
|
|
|
// CLI == From, then this leg's CLI is our "From" field, and this leg's "To" likewise
|
|
|
|
ret[i] = Call{ |
|
|
|
From: v[0].CLI, |
|
|
|
To: v[0].To, |
|
|
|
Duration: callDuration, |
|
|
|
Time: v[0].Time, |
|
|
|
Cost: int(math.Round(callCost)), |
|
|
|
Price: int(math.Round(callPrice)), |
|
|
|
} |
|
|
|
callFrom = v[0].CLI |
|
|
|
callTo = v[0].To |
|
|
|
} else { |
|
|
|
|
|
|
|
// We capture the "To" from the leg that has no source, we capture the "From" from the leg that has both source and destination
|
|
|
|
for _, leg := range v { |
|
|
|
if leg.Source == "" && leg.Destination != "" { |
|
|
|
callTo = leg.To |
|
|
|
} else if leg.Source != "" && leg.Destination != "" { |
|
|
|
callFrom = leg.From |
|
|
|
} else { |
|
|
|
// We should not reach this
|
|
|
|
return nil, fmt.Errorf("failed to combine these legs into one call: %+v", v) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
fmt.Printf("==> %+v\n", ret[i]) |
|
|
|
ret[i].From = callFrom |
|
|
|
ret[i].To = callTo |
|
|
|
|
|
|
|
fmt.Printf(" ==> %+v\n\n", ret[i]) |
|
|
|
//ret[i].Legs = make([]PricedLine, len(v))
|
|
|
|
//for j, leg := range v {
|
|
|
|
//ret[i].Legs[j] = leg
|
|
|
|
|