diff --git a/README.md b/README.md index 093f6ef..e1d1c42 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # csvToCamt Convert CSV correction files to CAMT format -Get binaries from [release page](https://github.com/krishnaprasadmg/csvToCamt/releases/tag/v0.1.0) +Get binaries from [release page](https://github.com/krishnaprasadmg/csvToCamt/releases/tag/v0.1.1) # Example diff --git a/main.go b/main.go index 6a2560f..c1683bd 100644 --- a/main.go +++ b/main.go @@ -2,8 +2,8 @@ package main import ( "flag" - - "log" + "fmt" + "os" "github.com/sunspikes/csvToCamt/utils" ) @@ -15,23 +15,29 @@ type Investor struct { } func main() { - configFile := flag.String("c", "", "Config file to use") - flag.Parse() + var configFile string - if *configFile == "" { - log.Fatal("You must supply a config file, use -h for usage") + flag.Usage = func() { + fmt.Printf("Usage of %s:\n", os.Args[0]) + fmt.Printf("%s -c config.yaml file1.csv file2.csv...\n", os.Args[0]) + flag.PrintDefaults() } - if len(flag.Args()) == 0 { - log.Fatal("You must supply path to CSV files") + flag.StringVar(&configFile, "c", "", "Config file to use, see config.yaml for example") + flag.Parse() + + if configFile == "" || len(flag.Args()) == 0 { + flag.Usage() + fmt.Fprintln(os.Stderr, "\nInsufficient arguments!") + os.Exit(1) } - config := utils.GetConfig(*configFile) + utils.ParseConfigFile(configFile) investorData := utils.LoadInvestors(flag.Args()) transactionData, totalAmount := utils.BuildTransactions(investorData) - camtDoc := utils.NewCamtDocument(config) + camtDoc := utils.NewCamtDocument() camtDoc.AddHeaders(totalAmount, len(transactionData)) camtDoc.AddTransactionData(transactionData) camtDoc.PrintDocument() diff --git a/utils/camt.go b/utils/camt.go index 38107fb..7558408 100644 --- a/utils/camt.go +++ b/utils/camt.go @@ -7,16 +7,14 @@ import ( "time" "github.com/beevik/etree" - "github.com/spf13/viper" ) type CamtDocument struct { - config *viper.Viper camtDoc *etree.Document cstmrCdtTrfInitn *etree.Element } -func NewCamtDocument(config *viper.Viper) *CamtDocument { +func NewCamtDocument() *CamtDocument { camtDoc := etree.NewDocument() document := camtDoc.CreateElement("Document") document.CreateAttr("xmlns", "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03") @@ -25,7 +23,7 @@ func NewCamtDocument(config *viper.Viper) *CamtDocument { cstmrCdtTrfInitn := document.CreateElement("CstmrCdtTrfInitn") - return &CamtDocument{config, camtDoc, cstmrCdtTrfInitn} + return &CamtDocument{camtDoc, cstmrCdtTrfInitn} } func (c *CamtDocument) AddHeaders(totalAmount float64, nOfTxs int) { @@ -47,15 +45,15 @@ func (c *CamtDocument) AddHeaders(totalAmount float64, nOfTxs int) { InitgPty := GrpHdr.CreateElement("InitgPty") Nm := InitgPty.CreateElement("Nm") - Nm.CreateCharData(c.config.GetString("camt.company")) + Nm.CreateCharData(config.GetString("camt.company")) PmtInf := c.cstmrCdtTrfInitn.CreateElement("PmtInf") PmtInfId := PmtInf.CreateElement("PmtInfId") - PmtInfId.CreateCharData(c.config.GetString("camt.CamtPmtInfId")) + PmtInfId.CreateCharData(config.GetString("camt.CamtPmtInfId")) PmtMtd := PmtInf.CreateElement("PmtMtd") - PmtMtd.CreateCharData(c.config.GetString("camt.CamtPmtMtd")) + PmtMtd.CreateCharData(config.GetString("camt.CamtPmtMtd")) PmtInf.AddChild(NbOfTxs.Copy()) PmtInf.AddChild(CtrlSum.Copy()) @@ -63,7 +61,7 @@ func (c *CamtDocument) AddHeaders(totalAmount float64, nOfTxs int) { PmtTpInf := PmtInf.CreateElement("PmtTpInf") SvcLvl := PmtTpInf.CreateElement("SvcLvl") Cd := SvcLvl.CreateElement("Cd") - Cd.CreateCharData(c.config.GetString("camt.sepa")) + Cd.CreateCharData(config.GetString("camt.sepa")) ReqdExctnDt := PmtInf.CreateElement("ReqdExctnDt") ReqdExctnDt.CreateCharData(tm.Format("2006-01-02")) @@ -74,15 +72,15 @@ func (c *CamtDocument) AddHeaders(totalAmount float64, nOfTxs int) { DbtrAcct := PmtInf.CreateElement("DbtrAcct") Id := DbtrAcct.CreateElement("Id") IBAN := Id.CreateElement("IBAN") - IBAN.CreateCharData(c.config.GetString("camt.iban")) + IBAN.CreateCharData(config.GetString("camt.iban")) DbtrAgt := PmtInf.CreateElement("DbtrAgt") FinInstnId := DbtrAgt.CreateElement("FinInstnId") BIC := FinInstnId.CreateElement("BIC") - BIC.CreateCharData(c.config.GetString("camt.bic")) + BIC.CreateCharData(config.GetString("camt.bic")) ChrgBr := PmtInf.CreateElement("ChrgBr") - ChrgBr.CreateCharData(c.config.GetString("camt.CamtChrgBr")) + ChrgBr.CreateCharData(config.GetString("camt.CamtChrgBr")) } func (c *CamtDocument) AddTransactionData(transactionData map[string]*Transaction) { @@ -90,7 +88,7 @@ func (c *CamtDocument) AddTransactionData(transactionData map[string]*Transactio CdtTrfTxInf := c.cstmrCdtTrfInitn.CreateElement("CdtTrfTxInf") PmtId := CdtTrfTxInf.CreateElement("PmtId") EndToEndId := PmtId.CreateElement("PmtId") - EndToEndId.CreateCharData(c.config.GetString("camt.CamtEndToEnd") + data.endToEnd) + EndToEndId.CreateCharData(config.GetString("camt.CamtEndToEnd") + data.endToEnd) Amt := c.cstmrCdtTrfInitn.CreateElement("Amt") InstdAmt := Amt.CreateElement("InstdAmt") @@ -113,11 +111,11 @@ func (c *CamtDocument) AddTransactionData(transactionData map[string]*Transactio Purp := c.cstmrCdtTrfInitn.CreateElement("Purp") Cd := Purp.CreateElement("Purp") - Cd.CreateCharData(c.config.GetString("camt.CamtCd")) + Cd.CreateCharData(config.GetString("camt.CamtCd")) RmtInf := c.cstmrCdtTrfInitn.CreateElement("RmtInf") Ustrd := RmtInf.CreateElement("Ustrd") - Ustrd.CreateCharData(c.config.GetString("camt.CamtRef")) + Ustrd.CreateCharData(config.GetString("camt.CamtRef")) } } diff --git a/utils/iban.go b/utils/iban.go index f540c5e..38243b0 100644 --- a/utils/iban.go +++ b/utils/iban.go @@ -12,7 +12,6 @@ import ( ) const ( - IBANCachePath = "./iban" IBANLookupURL = "https://openiban.com/validate/%s?getBIC=true" ) @@ -36,12 +35,14 @@ func Lookup(ibans ...string) map[string]IBAN { var ibanData = make(map[string]IBAN) var body []byte - if _, err := os.Stat(IBANCachePath); os.IsNotExist(err) { - os.Mkdir(IBANCachePath, os.ModePerm) + cacheDirPath := config.GetString("iban.cachePath") + + if _, err := os.Stat(cacheDirPath); os.IsNotExist(err) { + os.Mkdir(cacheDirPath, os.ModePerm) } for _, iban := range ibans { - fileName := IBANCachePath + "/" + iban + ".txt" + fileName := cacheDirPath + "/" + iban + ".txt" if _, err := os.Stat(fileName); os.IsNotExist(err) { res, err := http.Get(fmt.Sprintf(IBANLookupURL, iban)) diff --git a/utils/utils.go b/utils/utils.go index 2d126fb..8ad12de 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -6,17 +6,17 @@ import ( "github.com/spf13/viper" ) +var config *viper.Viper + func PanicOnError(err error) { if err != nil { log.Fatal(err) } } -func GetConfig(file string) *viper.Viper { - config := viper.New() +func ParseConfigFile(file string) { + config = viper.New() config.SetConfigFile(file) config.SetConfigType("yaml") PanicOnError(config.ReadInConfig()) - - return config }