From 673b10a40c96c13bca5c11508125a8b81a91e2f3 Mon Sep 17 00:00:00 2001 From: TeoV Date: Fri, 31 May 2019 17:20:40 +0300 Subject: [PATCH] Update Suretax to use RSRParsers and remove unused method from cdr --- config/config_defaults.go | 32 +++++++++---------- config/config_json_test.go | 20 ++++++------ config/config_test.go | 30 +++++++++--------- config/suretaxcfg.go | 64 +++++++++++++++++++------------------- engine/cdr.go | 14 --------- engine/suretax.go | 34 ++++++++++---------- 6 files changed, 90 insertions(+), 104 deletions(-) diff --git a/config/config_defaults.go b/config/config_defaults.go index 1013834a9..94b12ff05 100755 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -708,22 +708,22 @@ const CGRATES_CFG_JSON = ` "response_group": "03", // determines how taxes are grouped for the response <03|13> "response_type": "D4", // determines the granularity of taxes and (optionally) the decimal precision for the tax calculations and amounts in the response "regulatory_code": "03", // provider type - "client_tracking": "CGRID", // template extracting client information out of StoredCdr; <$RSRFields> - "customer_number": "Subject", // template extracting customer number out of StoredCdr; <$RSRFields> - "orig_number": "Subject", // template extracting origination number out of StoredCdr; <$RSRFields> - "term_number": "Destination", // template extracting termination number out of StoredCdr; <$RSRFields> - "bill_to_number": "", // template extracting billed to number out of StoredCdr; <$RSRFields> - "zipcode": "", // template extracting billing zip code out of StoredCdr; <$RSRFields> - "plus4": "", // template extracting billing zip code extension out of StoredCdr; <$RSRFields> - "p2pzipcode": "", // template extracting secondary zip code out of StoredCdr; <$RSRFields> - "p2pplus4": "", // template extracting secondary zip code extension out of StoredCdr; <$RSRFields> - "units": "^1", // template extracting number of “lines” or unique charges contained within the revenue out of StoredCdr; <$RSRFields> - "unit_type": "^00", // template extracting number of unique access lines out of StoredCdr; <$RSRFields> - "tax_included": "^0", // template extracting tax included in revenue out of StoredCdr; <$RSRFields> - "tax_situs_rule": "^04", // template extracting tax situs rule out of StoredCdr; <$RSRFields> - "trans_type_code": "^010101", // template extracting transaction type indicator out of StoredCdr; <$RSRFields> - "sales_type_code": "^R", // template extracting sales type code out of StoredCdr; <$RSRFields> - "tax_exemption_code_list": "", // template extracting tax exemption code list out of StoredCdr; <$RSRFields> + "client_tracking": "~CGRID", // template extracting client information out of StoredCdr; + "customer_number": "~Subject", // template extracting customer number out of StoredCdr; + "orig_number": "~Subject", // template extracting origination number out of StoredCdr; + "term_number": "~Destination", // template extracting termination number out of StoredCdr; + "bill_to_number": "", // template extracting billed to number out of StoredCdr; + "zipcode": "", // template extracting billing zip code out of StoredCdr; + "plus4": "", // template extracting billing zip code extension out of StoredCdr; + "p2pzipcode": "", // template extracting secondary zip code out of StoredCdr; + "p2pplus4": "", // template extracting secondary zip code extension out of StoredCdr; + "units": "1", // template extracting number of “lines” or unique charges contained within the revenue out of StoredCdr; + "unit_type": "00", // template extracting number of unique access lines out of StoredCdr; + "tax_included": "0", // template extracting tax included in revenue out of StoredCdr; + "tax_situs_rule": "04", // template extracting tax situs rule out of StoredCdr; + "trans_type_code": "010101", // template extracting transaction type indicator out of StoredCdr; + "sales_type_code": "R", // template extracting sales type code out of StoredCdr; + "tax_exemption_code_list": "", // template extracting tax exemption code list out of StoredCdr; }, diff --git a/config/config_json_test.go b/config/config_json_test.go index 0f60d2aea..4ff501a0e 100755 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -1356,21 +1356,21 @@ func TestDfSureTaxJsonCfg(t *testing.T) { Response_group: utils.StringPointer("03"), Response_type: utils.StringPointer("D4"), Regulatory_code: utils.StringPointer("03"), - Client_tracking: utils.StringPointer(utils.CGRID), - Customer_number: utils.StringPointer("Subject"), - Orig_number: utils.StringPointer("Subject"), - Term_number: utils.StringPointer("Destination"), + Client_tracking: utils.StringPointer(utils.DynamicDataPrefix + utils.CGRID), + Customer_number: utils.StringPointer("~Subject"), + Orig_number: utils.StringPointer("~Subject"), + Term_number: utils.StringPointer("~Destination"), Bill_to_number: utils.StringPointer(""), Zipcode: utils.StringPointer(""), Plus4: utils.StringPointer(""), P2PZipcode: utils.StringPointer(""), P2PPlus4: utils.StringPointer(""), - Units: utils.StringPointer("^1"), - Unit_type: utils.StringPointer("^00"), - Tax_included: utils.StringPointer("^0"), - Tax_situs_rule: utils.StringPointer("^04"), - Trans_type_code: utils.StringPointer("^010101"), - Sales_type_code: utils.StringPointer("^R"), + Units: utils.StringPointer("1"), + Unit_type: utils.StringPointer("00"), + Tax_included: utils.StringPointer("0"), + Tax_situs_rule: utils.StringPointer("04"), + Trans_type_code: utils.StringPointer("010101"), + Sales_type_code: utils.StringPointer("R"), Tax_exemption_code_list: utils.StringPointer(""), } if cfg, err := dfCgrJsonCfg.SureTaxJsonCfg(); err != nil { diff --git a/config/config_test.go b/config/config_test.go index fe7011d71..2422039f2 100755 --- a/config/config_test.go +++ b/config/config_test.go @@ -943,21 +943,21 @@ func TestCgrCfgJSONDefaultsSureTax(t *testing.T) { ResponseGroup: "03", ResponseType: "D4", RegulatoryCode: "03", - ClientTracking: utils.ParseRSRFieldsMustCompile("CGRID", utils.INFIELD_SEP), - CustomerNumber: utils.ParseRSRFieldsMustCompile("Subject", utils.INFIELD_SEP), - OrigNumber: utils.ParseRSRFieldsMustCompile("Subject", utils.INFIELD_SEP), - TermNumber: utils.ParseRSRFieldsMustCompile("Destination", utils.INFIELD_SEP), - BillToNumber: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), - Zipcode: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), - P2PZipcode: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), - P2PPlus4: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), - Units: utils.ParseRSRFieldsMustCompile("^1", utils.INFIELD_SEP), - UnitType: utils.ParseRSRFieldsMustCompile("^00", utils.INFIELD_SEP), - TaxIncluded: utils.ParseRSRFieldsMustCompile("^0", utils.INFIELD_SEP), - TaxSitusRule: utils.ParseRSRFieldsMustCompile("^04", utils.INFIELD_SEP), - TransTypeCode: utils.ParseRSRFieldsMustCompile("^010101", utils.INFIELD_SEP), - SalesTypeCode: utils.ParseRSRFieldsMustCompile("^R", utils.INFIELD_SEP), - TaxExemptionCodeList: utils.ParseRSRFieldsMustCompile("", utils.INFIELD_SEP), + ClientTracking: NewRSRParsersMustCompile("~CGRID", true, utils.INFIELD_SEP), + CustomerNumber: NewRSRParsersMustCompile("~Subject", true, utils.INFIELD_SEP), + OrigNumber: NewRSRParsersMustCompile("~Subject", true, utils.INFIELD_SEP), + TermNumber: NewRSRParsersMustCompile("~Destination", true, utils.INFIELD_SEP), + BillToNumber: NewRSRParsersMustCompile("", true, utils.INFIELD_SEP), + Zipcode: NewRSRParsersMustCompile("", true, utils.INFIELD_SEP), + P2PZipcode: NewRSRParsersMustCompile("", true, utils.INFIELD_SEP), + P2PPlus4: NewRSRParsersMustCompile("", true, utils.INFIELD_SEP), + Units: NewRSRParsersMustCompile("1", true, utils.INFIELD_SEP), + UnitType: NewRSRParsersMustCompile("00", true, utils.INFIELD_SEP), + TaxIncluded: NewRSRParsersMustCompile("0", true, utils.INFIELD_SEP), + TaxSitusRule: NewRSRParsersMustCompile("04", true, utils.INFIELD_SEP), + TransTypeCode: NewRSRParsersMustCompile("010101", true, utils.INFIELD_SEP), + SalesTypeCode: NewRSRParsersMustCompile("R", true, utils.INFIELD_SEP), + TaxExemptionCodeList: NewRSRParsersMustCompile("", true, utils.INFIELD_SEP), } if !reflect.DeepEqual(cgrCfg.sureTaxCfg, eSureTaxCfg) { diff --git a/config/suretaxcfg.go b/config/suretaxcfg.go index dcbe4ff9c..fc02d64df 100644 --- a/config/suretaxcfg.go +++ b/config/suretaxcfg.go @@ -36,22 +36,22 @@ type SureTaxCfg struct { ResponseGroup string ResponseType string RegulatoryCode string - ClientTracking utils.RSRFields // Concatenate all of them to get value - CustomerNumber utils.RSRFields - OrigNumber utils.RSRFields - TermNumber utils.RSRFields - BillToNumber utils.RSRFields - Zipcode utils.RSRFields - Plus4 utils.RSRFields - P2PZipcode utils.RSRFields - P2PPlus4 utils.RSRFields - Units utils.RSRFields - UnitType utils.RSRFields - TaxIncluded utils.RSRFields - TaxSitusRule utils.RSRFields - TransTypeCode utils.RSRFields - SalesTypeCode utils.RSRFields - TaxExemptionCodeList utils.RSRFields + ClientTracking RSRParsers // Concatenate all of them to get value + CustomerNumber RSRParsers + OrigNumber RSRParsers + TermNumber RSRParsers + BillToNumber RSRParsers + Zipcode RSRParsers + Plus4 RSRParsers + P2PZipcode RSRParsers + P2PPlus4 RSRParsers + Units RSRParsers + UnitType RSRParsers + TaxIncluded RSRParsers + TaxSitusRule RSRParsers + TransTypeCode RSRParsers + SalesTypeCode RSRParsers + TaxExemptionCodeList RSRParsers } // Loads/re-loads data from json config object @@ -92,82 +92,82 @@ func (self *SureTaxCfg) loadFromJsonCfg(jsnCfg *SureTaxJsonCfg) (err error) { self.RegulatoryCode = *jsnCfg.Regulatory_code } if jsnCfg.Client_tracking != nil { - if self.ClientTracking, err = utils.ParseRSRFields(*jsnCfg.Client_tracking, utils.INFIELD_SEP); err != nil { + if self.ClientTracking, err = NewRSRParsers(*jsnCfg.Client_tracking, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.Customer_number != nil { - if self.CustomerNumber, err = utils.ParseRSRFields(*jsnCfg.Customer_number, utils.INFIELD_SEP); err != nil { + if self.CustomerNumber, err = NewRSRParsers(*jsnCfg.Customer_number, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.Orig_number != nil { - if self.OrigNumber, err = utils.ParseRSRFields(*jsnCfg.Orig_number, utils.INFIELD_SEP); err != nil { + if self.OrigNumber, err = NewRSRParsers(*jsnCfg.Orig_number, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.Term_number != nil { - if self.TermNumber, err = utils.ParseRSRFields(*jsnCfg.Term_number, utils.INFIELD_SEP); err != nil { + if self.TermNumber, err = NewRSRParsers(*jsnCfg.Term_number, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.Bill_to_number != nil { - if self.BillToNumber, err = utils.ParseRSRFields(*jsnCfg.Bill_to_number, utils.INFIELD_SEP); err != nil { + if self.BillToNumber, err = NewRSRParsers(*jsnCfg.Bill_to_number, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.Zipcode != nil { - if self.Zipcode, err = utils.ParseRSRFields(*jsnCfg.Zipcode, utils.INFIELD_SEP); err != nil { + if self.Zipcode, err = NewRSRParsers(*jsnCfg.Zipcode, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.Plus4 != nil { - if self.Plus4, err = utils.ParseRSRFields(*jsnCfg.Plus4, utils.INFIELD_SEP); err != nil { + if self.Plus4, err = NewRSRParsers(*jsnCfg.Plus4, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.P2PZipcode != nil { - if self.P2PZipcode, err = utils.ParseRSRFields(*jsnCfg.P2PZipcode, utils.INFIELD_SEP); err != nil { + if self.P2PZipcode, err = NewRSRParsers(*jsnCfg.P2PZipcode, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.P2PPlus4 != nil { - if self.P2PPlus4, err = utils.ParseRSRFields(*jsnCfg.P2PPlus4, utils.INFIELD_SEP); err != nil { + if self.P2PPlus4, err = NewRSRParsers(*jsnCfg.P2PPlus4, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.Units != nil { - if self.Units, err = utils.ParseRSRFields(*jsnCfg.Units, utils.INFIELD_SEP); err != nil { + if self.Units, err = NewRSRParsers(*jsnCfg.Units, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.Unit_type != nil { - if self.UnitType, err = utils.ParseRSRFields(*jsnCfg.Unit_type, utils.INFIELD_SEP); err != nil { + if self.UnitType, err = NewRSRParsers(*jsnCfg.Unit_type, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.Tax_included != nil { - if self.TaxIncluded, err = utils.ParseRSRFields(*jsnCfg.Tax_included, utils.INFIELD_SEP); err != nil { + if self.TaxIncluded, err = NewRSRParsers(*jsnCfg.Tax_included, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.Tax_situs_rule != nil { - if self.TaxSitusRule, err = utils.ParseRSRFields(*jsnCfg.Tax_situs_rule, utils.INFIELD_SEP); err != nil { + if self.TaxSitusRule, err = NewRSRParsers(*jsnCfg.Tax_situs_rule, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.Trans_type_code != nil { - if self.TransTypeCode, err = utils.ParseRSRFields(*jsnCfg.Trans_type_code, utils.INFIELD_SEP); err != nil { + if self.TransTypeCode, err = NewRSRParsers(*jsnCfg.Trans_type_code, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.Sales_type_code != nil { - if self.SalesTypeCode, err = utils.ParseRSRFields(*jsnCfg.Sales_type_code, utils.INFIELD_SEP); err != nil { + if self.SalesTypeCode, err = NewRSRParsers(*jsnCfg.Sales_type_code, true, utils.INFIELD_SEP); err != nil { return err } } if jsnCfg.Tax_exemption_code_list != nil { - if self.TaxExemptionCodeList, err = utils.ParseRSRFields(*jsnCfg.Tax_exemption_code_list, utils.INFIELD_SEP); err != nil { + if self.TaxExemptionCodeList, err = NewRSRParsers(*jsnCfg.Tax_exemption_code_list, true, utils.INFIELD_SEP); err != nil { return err } } diff --git a/engine/cdr.go b/engine/cdr.go index 64c830389..83870124a 100644 --- a/engine/cdr.go +++ b/engine/cdr.go @@ -180,20 +180,6 @@ func (cdr *CDR) FieldAsStringWithRSRField(rsrFld *utils.RSRField) (parsed string return rsrFld.Parse(fldIface) } -// concatenates values of multiple fields defined in template, used eg in CDR templates -func (cdr *CDR) FieldsAsStringWithRSRFields(rsrFlds utils.RSRFields) (fldVal string) { - for _, rsrFld := range rsrFlds { - if fldStr, err := cdr.FieldAsStringWithRSRField(rsrFld); err != nil { - utils.Logger.Warning( - fmt.Sprintf("<%s> error: %s processing field with template: %+v", - utils.CDR, err.Error(), rsrFld)) - } else { - fldVal += fldStr - } - } - return -} - // Populates the field with id from value; strings are appended to original one func (cdr *CDR) ParseFieldValue(fieldId, fieldVal, timezone string) error { var err error diff --git a/engine/suretax.go b/engine/suretax.go index 1245c7b05..66974d3ad 100644 --- a/engine/suretax.go +++ b/engine/suretax.go @@ -42,14 +42,14 @@ func NewSureTaxRequest(cdr *CDR, stCfg *config.SureTaxCfg) (*SureTaxRequest, err } aTimeLoc := cdr.AnswerTime.In(stCfg.Timezone) revenue := utils.Round(cdr.Cost, 4, utils.ROUNDING_MIDDLE) - unts, err := strconv.ParseInt(cdr.FieldsAsStringWithRSRFields(stCfg.Units), 10, 64) + unts, err := strconv.ParseInt(cdr.FieldsAsString(stCfg.Units), 10, 64) if err != nil { return nil, err } taxExempt := []string{} - definedTaxExtempt := cdr.FieldsAsStringWithRSRFields(stCfg.TaxExemptionCodeList) + definedTaxExtempt := cdr.FieldsAsString(stCfg.TaxExemptionCodeList) if len(definedTaxExtempt) != 0 { - taxExempt = strings.Split(cdr.FieldsAsStringWithRSRFields(stCfg.TaxExemptionCodeList), ",") + taxExempt = strings.Split(cdr.FieldsAsString(stCfg.TaxExemptionCodeList), ",") } stReq := new(STRequest) stReq.ClientNumber = stCfg.ClientNumber @@ -59,28 +59,28 @@ func NewSureTaxRequest(cdr *CDR, stCfg *config.SureTaxCfg) (*SureTaxRequest, err stReq.DataMonth = strconv.Itoa(int(aTimeLoc.Month())) stReq.TotalRevenue = revenue stReq.ReturnFileCode = stCfg.ReturnFileCode - stReq.ClientTracking = cdr.FieldsAsStringWithRSRFields(stCfg.ClientTracking) + stReq.ClientTracking = cdr.FieldsAsString(stCfg.ClientTracking) stReq.ResponseGroup = stCfg.ResponseGroup stReq.ResponseType = stCfg.ResponseType stReq.ItemList = []*STRequestItem{ { - CustomerNumber: cdr.FieldsAsStringWithRSRFields(stCfg.CustomerNumber), - OrigNumber: cdr.FieldsAsStringWithRSRFields(stCfg.OrigNumber), - TermNumber: cdr.FieldsAsStringWithRSRFields(stCfg.TermNumber), - BillToNumber: cdr.FieldsAsStringWithRSRFields(stCfg.BillToNumber), - Zipcode: cdr.FieldsAsStringWithRSRFields(stCfg.Zipcode), - Plus4: cdr.FieldsAsStringWithRSRFields(stCfg.Plus4), - P2PZipcode: cdr.FieldsAsStringWithRSRFields(stCfg.P2PZipcode), - P2PPlus4: cdr.FieldsAsStringWithRSRFields(stCfg.P2PPlus4), + CustomerNumber: cdr.FieldsAsString(stCfg.CustomerNumber), + OrigNumber: cdr.FieldsAsString(stCfg.OrigNumber), + TermNumber: cdr.FieldsAsString(stCfg.TermNumber), + BillToNumber: cdr.FieldsAsString(stCfg.BillToNumber), + Zipcode: cdr.FieldsAsString(stCfg.Zipcode), + Plus4: cdr.FieldsAsString(stCfg.Plus4), + P2PZipcode: cdr.FieldsAsString(stCfg.P2PZipcode), + P2PPlus4: cdr.FieldsAsString(stCfg.P2PPlus4), TransDate: aTimeLoc.Format("2006-01-02T15:04:05"), Revenue: revenue, Units: unts, - UnitType: cdr.FieldsAsStringWithRSRFields(stCfg.UnitType), + UnitType: cdr.FieldsAsString(stCfg.UnitType), Seconds: int64(cdr.Usage.Seconds()), - TaxIncludedCode: cdr.FieldsAsStringWithRSRFields(stCfg.TaxIncluded), - TaxSitusRule: cdr.FieldsAsStringWithRSRFields(stCfg.TaxSitusRule), - TransTypeCode: cdr.FieldsAsStringWithRSRFields(stCfg.TransTypeCode), - SalesTypeCode: cdr.FieldsAsStringWithRSRFields(stCfg.SalesTypeCode), + TaxIncludedCode: cdr.FieldsAsString(stCfg.TaxIncluded), + TaxSitusRule: cdr.FieldsAsString(stCfg.TaxSitusRule), + TransTypeCode: cdr.FieldsAsString(stCfg.TransTypeCode), + SalesTypeCode: cdr.FieldsAsString(stCfg.SalesTypeCode), RegulatoryCode: stCfg.RegulatoryCode, TaxExemptionCodeList: taxExempt, },