// Used in mediation, primaryMandatory marks whether missing field out of request represents error or can be ignored func (cdr *CDR) ForkCdr(runId string, RequestTypeFld, directionFld, tenantFld, categFld, accountFld, subjectFld, destFld, setupTimeFld, PDDFld, answerTimeFld, durationFld, supplierFld, disconnectCauseFld, ratedFld, costFld *utils.RSRField, extraFlds []*utils.RSRField, primaryMandatory bool, timezone string) (*CDR, error) { if RequestTypeFld == nil { RequestTypeFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if RequestTypeFld.Id == utils.META_DEFAULT { RequestTypeFld.Id = utils.REQTYPE } if directionFld == nil { directionFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if directionFld.Id == utils.META_DEFAULT { directionFld.Id = utils.DIRECTION } if tenantFld == nil { tenantFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if tenantFld.Id == utils.META_DEFAULT { tenantFld.Id = utils.TENANT } if categFld == nil { categFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if categFld.Id == utils.META_DEFAULT { categFld.Id = utils.CATEGORY } if accountFld == nil { accountFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if accountFld.Id == utils.META_DEFAULT { accountFld.Id = utils.ACCOUNT } if subjectFld == nil { subjectFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if subjectFld.Id == utils.META_DEFAULT { subjectFld.Id = utils.SUBJECT } if destFld == nil { destFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if destFld.Id == utils.META_DEFAULT { destFld.Id = utils.DESTINATION } if setupTimeFld == nil { setupTimeFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if setupTimeFld.Id == utils.META_DEFAULT { setupTimeFld.Id = utils.SETUP_TIME } if answerTimeFld == nil { answerTimeFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if answerTimeFld.Id == utils.META_DEFAULT { answerTimeFld.Id = utils.ANSWER_TIME } if durationFld == nil { durationFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if durationFld.Id == utils.META_DEFAULT { durationFld.Id = utils.USAGE } if PDDFld == nil { PDDFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if PDDFld.Id == utils.META_DEFAULT { PDDFld.Id = utils.PDD } if supplierFld == nil { supplierFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if supplierFld.Id == utils.META_DEFAULT { supplierFld.Id = utils.SUPPLIER } if disconnectCauseFld == nil { disconnectCauseFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if disconnectCauseFld.Id == utils.META_DEFAULT { disconnectCauseFld.Id = utils.DISCONNECT_CAUSE } if ratedFld == nil { ratedFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if ratedFld.Id == utils.META_DEFAULT { ratedFld.Id = utils.RATED_FLD } if costFld == nil { costFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if costFld.Id == utils.META_DEFAULT { costFld.Id = utils.COST } var err error frkStorCdr := new(CDR) frkStorCdr.CGRID = cdr.CGRID frkStorCdr.ToR = cdr.ToR frkStorCdr.RunID = runId frkStorCdr.Cost = -1.0 // Default for non-rated CDR frkStorCdr.OriginID = cdr.OriginID frkStorCdr.OriginHost = cdr.OriginHost frkStorCdr.Source = cdr.Source frkStorCdr.RequestType = cdr.FieldAsString(RequestTypeFld) if primaryMandatory && len(frkStorCdr.RequestType) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.REQTYPE, RequestTypeFld.Id) } frkStorCdr.Direction = cdr.FieldAsString(directionFld) if primaryMandatory && len(frkStorCdr.Direction) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.DIRECTION, directionFld.Id) } frkStorCdr.Tenant = cdr.FieldAsString(tenantFld) if primaryMandatory && len(frkStorCdr.Tenant) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.TENANT, tenantFld.Id) } frkStorCdr.Category = cdr.FieldAsString(categFld) if primaryMandatory && len(frkStorCdr.Category) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.CATEGORY, categFld.Id) } frkStorCdr.Account = cdr.FieldAsString(accountFld) if primaryMandatory && len(frkStorCdr.Account) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.ACCOUNT, accountFld.Id) } frkStorCdr.Subject = cdr.FieldAsString(subjectFld) if primaryMandatory && len(frkStorCdr.Subject) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.SUBJECT, subjectFld.Id) } frkStorCdr.Destination = cdr.FieldAsString(destFld) if primaryMandatory && len(frkStorCdr.Destination) == 0 && frkStorCdr.ToR == utils.VOICE { return nil, utils.NewErrMandatoryIeMissing(utils.DESTINATION, destFld.Id) } sTimeStr := cdr.FieldAsString(setupTimeFld) if primaryMandatory && len(sTimeStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.SETUP_TIME, setupTimeFld.Id) } else if frkStorCdr.SetupTime, err = utils.ParseTimeDetectLayout(sTimeStr, timezone); err != nil { return nil, err } aTimeStr := cdr.FieldAsString(answerTimeFld) if primaryMandatory && len(aTimeStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.ANSWER_TIME, answerTimeFld.Id) } else if frkStorCdr.AnswerTime, err = utils.ParseTimeDetectLayout(aTimeStr, timezone); err != nil { return nil, err } durStr := cdr.FieldAsString(durationFld) if primaryMandatory && len(durStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.USAGE, durationFld.Id) } else if frkStorCdr.Usage, err = utils.ParseDurationWithSecs(durStr); err != nil { return nil, err } PDDStr := cdr.FieldAsString(PDDFld) if primaryMandatory && len(PDDStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.PDD, PDDFld.Id) } else if frkStorCdr.PDD, err = utils.ParseDurationWithSecs(PDDStr); err != nil { return nil, err } frkStorCdr.Supplier = cdr.FieldAsString(supplierFld) frkStorCdr.DisconnectCause = cdr.FieldAsString(disconnectCauseFld) ratedStr := cdr.FieldAsString(ratedFld) if primaryMandatory && len(ratedStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.RATED_FLD, ratedFld.Id) } else if frkStorCdr.Rated, err = strconv.ParseBool(ratedStr); err != nil { return nil, err } costStr := cdr.FieldAsString(costFld) if primaryMandatory && len(costStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.COST, costFld.Id) } else if frkStorCdr.Cost, err = strconv.ParseFloat(costStr, 64); err != nil { return nil, err } frkStorCdr.ExtraFields = make(map[string]string, len(extraFlds)) for _, fld := range extraFlds { frkStorCdr.ExtraFields[fld.Id] = cdr.FieldAsString(fld) } return frkStorCdr, nil }
// Used in mediation, primaryMandatory marks whether missing field out of request represents error or can be ignored func (storedCdr *StoredCdr) ForkCdr(runId string, reqTypeFld, directionFld, tenantFld, categFld, accountFld, subjectFld, destFld, setupTimeFld, pddFld, answerTimeFld, durationFld, supplierFld, disconnectCauseFld *utils.RSRField, extraFlds []*utils.RSRField, primaryMandatory bool, timezone string) (*StoredCdr, error) { if reqTypeFld == nil { reqTypeFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if reqTypeFld.Id == utils.META_DEFAULT { reqTypeFld.Id = utils.REQTYPE } if directionFld == nil { directionFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if directionFld.Id == utils.META_DEFAULT { directionFld.Id = utils.DIRECTION } if tenantFld == nil { tenantFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if tenantFld.Id == utils.META_DEFAULT { tenantFld.Id = utils.TENANT } if categFld == nil { categFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if categFld.Id == utils.META_DEFAULT { categFld.Id = utils.CATEGORY } if accountFld == nil { accountFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if accountFld.Id == utils.META_DEFAULT { accountFld.Id = utils.ACCOUNT } if subjectFld == nil { subjectFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if subjectFld.Id == utils.META_DEFAULT { subjectFld.Id = utils.SUBJECT } if destFld == nil { destFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if destFld.Id == utils.META_DEFAULT { destFld.Id = utils.DESTINATION } if setupTimeFld == nil { setupTimeFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if setupTimeFld.Id == utils.META_DEFAULT { setupTimeFld.Id = utils.SETUP_TIME } if answerTimeFld == nil { answerTimeFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if answerTimeFld.Id == utils.META_DEFAULT { answerTimeFld.Id = utils.ANSWER_TIME } if durationFld == nil { durationFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if durationFld.Id == utils.META_DEFAULT { durationFld.Id = utils.USAGE } if pddFld == nil { pddFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if pddFld.Id == utils.META_DEFAULT { pddFld.Id = utils.PDD } if supplierFld == nil { supplierFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if supplierFld.Id == utils.META_DEFAULT { supplierFld.Id = utils.SUPPLIER } if disconnectCauseFld == nil { disconnectCauseFld, _ = utils.NewRSRField(utils.META_DEFAULT) } if disconnectCauseFld.Id == utils.META_DEFAULT { disconnectCauseFld.Id = utils.DISCONNECT_CAUSE } var err error frkStorCdr := new(StoredCdr) frkStorCdr.CgrId = storedCdr.CgrId frkStorCdr.TOR = storedCdr.TOR frkStorCdr.MediationRunId = runId frkStorCdr.Cost = -1.0 // Default for non-rated CDR frkStorCdr.AccId = storedCdr.AccId frkStorCdr.CdrHost = storedCdr.CdrHost frkStorCdr.CdrSource = storedCdr.CdrSource frkStorCdr.ReqType = storedCdr.FieldAsString(reqTypeFld) if primaryMandatory && len(frkStorCdr.ReqType) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.REQTYPE, reqTypeFld.Id) } frkStorCdr.Direction = storedCdr.FieldAsString(directionFld) if primaryMandatory && len(frkStorCdr.Direction) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.DIRECTION, directionFld.Id) } frkStorCdr.Tenant = storedCdr.FieldAsString(tenantFld) if primaryMandatory && len(frkStorCdr.Tenant) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.TENANT, tenantFld.Id) } frkStorCdr.Category = storedCdr.FieldAsString(categFld) if primaryMandatory && len(frkStorCdr.Category) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.CATEGORY, categFld.Id) } frkStorCdr.Account = storedCdr.FieldAsString(accountFld) if primaryMandatory && len(frkStorCdr.Account) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.ACCOUNT, accountFld.Id) } frkStorCdr.Subject = storedCdr.FieldAsString(subjectFld) if primaryMandatory && len(frkStorCdr.Subject) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.SUBJECT, subjectFld.Id) } frkStorCdr.Destination = storedCdr.FieldAsString(destFld) if primaryMandatory && len(frkStorCdr.Destination) == 0 && frkStorCdr.TOR == utils.VOICE { return nil, utils.NewErrMandatoryIeMissing(utils.DESTINATION, destFld.Id) } sTimeStr := storedCdr.FieldAsString(setupTimeFld) if primaryMandatory && len(sTimeStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.SETUP_TIME, setupTimeFld.Id) } else if frkStorCdr.SetupTime, err = utils.ParseTimeDetectLayout(sTimeStr, timezone); err != nil { return nil, err } aTimeStr := storedCdr.FieldAsString(answerTimeFld) if primaryMandatory && len(aTimeStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.ANSWER_TIME, answerTimeFld.Id) } else if frkStorCdr.AnswerTime, err = utils.ParseTimeDetectLayout(aTimeStr, timezone); err != nil { return nil, err } durStr := storedCdr.FieldAsString(durationFld) if primaryMandatory && len(durStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.USAGE, durationFld.Id) } else if frkStorCdr.Usage, err = utils.ParseDurationWithSecs(durStr); err != nil { return nil, err } pddStr := storedCdr.FieldAsString(pddFld) if primaryMandatory && len(pddStr) == 0 { return nil, utils.NewErrMandatoryIeMissing(utils.PDD, pddFld.Id) } else if frkStorCdr.Pdd, err = utils.ParseDurationWithSecs(pddStr); err != nil { return nil, err } frkStorCdr.Supplier = storedCdr.FieldAsString(supplierFld) frkStorCdr.DisconnectCause = storedCdr.FieldAsString(disconnectCauseFld) frkStorCdr.ExtraFields = make(map[string]string, len(extraFlds)) for _, fld := range extraFlds { frkStorCdr.ExtraFields[fld.Id] = storedCdr.FieldAsString(fld) } return frkStorCdr, nil }