package main import ( log "github.com/sirupsen/logrus" "regexp" "strings" "time" ) type PepperRow struct { // Common InvoiceDate time.Time // Shared Fields for both upfront and Trailer LoanNumber string Customer string PrimaryIntroducer string NextGenNumber string Settlement time.Time NetAmount float64 GST float64 GrossAmount float64 //Trailer Only Period time.Time Balance float64 SettlementAmount float64 TrailerMargin float64 // Upfront only UpfrontRate float64 // Derived IncomeType string IncomeAmount float64 } func (m *AiDecodeIncome) isPepperXls(raw string) bool { keyword := "ABN86092110079" lines := strings.Split(raw, "\n") for i := 0; i < len(lines); i++ { lines[i] = strings.ReplaceAll(lines[i], " ", "") // remove space lines[i] = strings.ReplaceAll(lines[i], ",", "") // remove , lines[i] = strings.ReplaceAll(lines[i], ":", "") // remove : } return m.isKeywordExist(keyword, lines) } func (m *AiDecodeIncome) decodePepperXls(raw []byte) (e error) { m.Pepper = make([]PepperRow, 0, 30) if m.decodePepperIsUpfront(string(raw)) { e = m.decodePepperXlsUpfront(raw) } else { e = m.decodePepperXlsTrailer(raw) } return } func (m *AiDecodeIncome) decodePepperIsUpfront(raw string) bool { keyword := "upfrontcommissions" lines := strings.Split(raw, "\n") for i := 0; i < len(lines); i++ { lines[i] = strings.ReplaceAll(lines[i], " ", "") //remove space lines[i] = strings.ReplaceAll(lines[i], ",", "") //remove , lines[i] = strings.ToLower(lines[i]) //to lower case } return m.isKeywordExist(keyword, lines) } func (m *AiDecodeIncome) decodePepperXlsTrailer(raw []byte) (e error) { patternTrailer := `,([0-9]+),([ A-Za-z]+)[ ,]([ A-Za-z]+),(\d+),((?:(?:[12][0-9]|0[1-9])[/.-]02|(?:30|[12][0-9]|0[1-9])[/.-](?:0[469]|11)|(?:3[01]|[12][0-9]|0[1-9])[/.-](?:0[13578]|1[02]))[/.-][0-9]{4}),(\d+(?:\.\d{1,2})?),(\d+(?:\.\d{1,2})?),(\d+(?:\.\d{1,2})?),(\d+(?:\.\d{1,2})?),\d+\.?\d{1,2},\d+(?:\.\d{1,2})?,(\d+(?:\.\d{1,2})?),\d+(?:\.\d{1,2})?,(\d+(?:\.\d{1,2})?),\d+(?:\.\d{1,2})?,\d+(?:\.\d{1,2})?,\d+(?:\.\d{1,2})?` IncomeType := "Trail" InvoiceDate := m.decodePepperXlsGetInvoiceDate(raw) CurrentPeriod := m.decodePepperXlsGetTrailerPeriod(raw) validLine, e := regexp.Compile(patternTrailer) // error if regexp invalid if e != nil { return } matches := validLine.FindAllSubmatch(raw, -1) if matches == nil { log.Warn("pepper decode trailer found nothing no matches", IncomeType, string(raw)) return } for _, v := range matches { pp := PepperRow{Period: CurrentPeriod, IncomeType: IncomeType} pp.LoanNumber = string(v[1]) pp.Customer = string(v[2]) pp.PrimaryIntroducer = string(v[3]) pp.NextGenNumber = string(v[4]) pp.Settlement, _ = time.Parse("02/01/2006", string(v[5])) pp.Balance = m.currencyToFloat64(string(v[6])) pp.SettlementAmount = m.currencyToFloat64(string(v[7])) pp.TrailerMargin = m.currencyToFloat64(string(v[8])) pp.NetAmount = m.currencyToFloat64(string(v[9])) pp.GST = m.currencyToFloat64(string(v[10])) pp.GrossAmount = m.currencyToFloat64(string(v[11])) pp.IncomeAmount = pp.NetAmount pp.InvoiceDate = InvoiceDate m.Pepper = append(m.Pepper, pp) } return } func (m *AiDecodeIncome) decodePepperXlsUpfront(raw []byte) (e error) { patternUpfront := `,(\d+),([ A-Za-z]+),([ A-Za-z]+),(\d+),((?:02[/.-](?:[12][0-9]|0[1-9])|(?:0[469]|11)[/.-](?:30|[12][0-9]|0[1-9])|(?:0[13578]|1[02])[/.-](?:3[01]|[12][0-9]|0[1-9]))[/.-][0-9]{4}),"(\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?)",(\d+(?:\.\d{1,2})?),-?\d+(?:\.\d{1,2})?,(-?\d+(?:\.\d{1,2})?),-?\d+(?:\.\d{1,2})?,(-?\d+(?:\.\d{1,2})?),-?\d+(?:\.\d{1,2})?,(-?\d+(?:\.\d{1,2})?)` IncomeType := "Upfront" InvoiceDate := m.decodePepperXlsGetInvoiceDate(raw) validLine, e := regexp.Compile(patternUpfront) // error if regexp invalid if e != nil { return } matches := validLine.FindAllSubmatch(raw, -1) if matches == nil { log.Warn("pepper decode upfront found nothing no matches", IncomeType, string(raw)) return } for _, v := range matches { pp := PepperRow{IncomeType: IncomeType} pp.LoanNumber = string(v[1]) pp.Customer = string(v[2]) pp.PrimaryIntroducer = string(v[3]) pp.NextGenNumber = string(v[4]) pp.Settlement, _ = time.Parse("01/02/2006", string(v[5])) pp.Balance = m.currencyToFloat64(string(v[6])) pp.UpfrontRate = m.currencyToFloat64(string(v[7])) pp.NetAmount = m.currencyToFloat64(string(v[8])) pp.GST = m.currencyToFloat64(string(v[9])) pp.GrossAmount = m.currencyToFloat64(string(v[10])) pp.IncomeAmount = pp.NetAmount pp.InvoiceDate = InvoiceDate m.Pepper = append(m.Pepper, pp) } return } func (m *AiDecodeIncome) decodePepperXlsGetInvoiceDate(raw []byte) (ret time.Time) { invoiceDatePattern := `(?i)Date *:+ *((?:(?:[12][0-9]|0?[1-9])[/.-]0?2|(?:30|[12][0-9]|0?[1-9])[/.-](?:0?[469]|11)|(?:3[01]|[12][0-9]|0?[1-9])[/.-](?:0?[13578]|1[02]))[/.-][0-9]{4}|(?:(?:[12][0-9]|0?[1-9])-(?:Jan|January|Feb|February|Mar|March|Apr|April|May|May|Jun|June|Jul|July|Aug|August|Sep|September|Oct|October|Nov|November|Dec|December)|(?:30|[12][0-9]|0?[1-9])-(?:Jan|January|Feb|February|Mar|March|Apr|April|May|May|Jun|June|Jul|July|Aug|August|Sep|September|Oct|October|Nov|November|Dec|December)|(?:3[01]|[12][0-9]|0?[1-9])-(?:Jan|January|Feb|February|Mar|March|Apr|April|May|May|Jun|June|Jul|July|Aug|August|Sep|September|Oct|October|Nov|November|Dec|December))-[0-9]{4})` invoiceDateLine, e := regexp.Compile(invoiceDatePattern) if e != nil { return } matches := invoiceDateLine.FindSubmatch(raw) ret, _ = time.Parse("02-Jan-2006", string(matches[1])) return } func (m *AiDecodeIncome) decodePepperXlsGetTrailerPeriod(raw []byte) (ret time.Time) { period := `(?i)Trailer *Commissions[ ,]+Trail +((?:Jan|January|Feb|February|Mar|March|Apr|April|May|May|Jun|June|Jul|July|Aug|August|Sep|September|Oct|October|Nov|November|Dec|December)[\t ]+[0-9]{4})` periodLine, e := regexp.Compile(period) if e != nil { return } periods := periodLine.FindSubmatch(raw) if periods == nil { log.Error("pepper Trailer cannot find Period", string(raw), m) return } ret, _ = time.Parse("January 2006", string(periods[1])) return } var sample_pepper_trailer = ` FORMAT XLONE REPORT,DefnSheetName=_defntmp_,,,,,,,,,,,,,,,,,,,, SET,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,RECIPIENT CREATED TAX INVOICE,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,Date: 15-Jul-2020,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,Pepper Homeloans Pty Limited ,,,,,,,,,,,,,,,, *,,,,,ABN: 86 092 110 079,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,To:,Super Finance Markets,,,,,,,,,,,,,,, *,,,,,,ABN: 68 620 533 333,,,,,,,,,,,,,,, *,,,,,,"International Tower One, Suite 2304, Level 23 100 Barangaroo Avenue, ",,,,,,,,,,,,,,, *,,,,,,Barangaroo NSW 2000,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,Trailer Commissions,TRAIL JUNE 2020,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,Account Number,Email Address,Description,UploadDate,Loan Number,Customer,Primary Introducer,Franchisee \ Next Gen Number \ Notes,Settlement Date,Balance as at end of month,Settlement Amount,Trailer Comm Margin,Net Amount,Net Amount,GST,GST*,Gross Amount,Gross Amount,,, h.*,,,,,,,,,,,,,,,,,,,,, h.REPEAT,,,,,,,,,,,,,,,,,,,,, h.COLUMNS,,,,,,,,,,,,,,,,,,,,, h.REPEAT,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1239633,Benny Youbin He,LAW ANDREW,720478,25/07/2019,1497907.3,1500000,0.25,307.79,307.79,30.78,30.78,307.79,338.57,1497907.3,1500000,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1244928,Yingjiao Zhang,LAW ANDREW,729657,05/02/2020,636177.21,739200,0.25,130.72,130.72,13.07,13.07,130.72,143.79,636177.21,739200,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1245619,Darren Julian Cantrill,LAW ANDREW,730570,03/03/2020,650690.27,656900,0.25,133.7,133.7,13.37,13.37,133.7,147.07,650690.27,656900,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1246270,Khanh Huyen Nguyen Cung,LAW ANDREW,731134,30/03/2020,344808.41,423000,0.25,70.85,70.85,7.09,7.09,70.85,77.94,344808.41,423000,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1247301,Phuong Moc Luu,LAW ANDREW,731481,07/05/2020,1198547.28,1200000,0.25,246.28,246.28,24.63,24.63,246.28,270.91,1198547.28,1200000,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1246232,Monica Cao,LAW ANDREW,731538,25/03/2020,647250.56,650000,0.25,133,133,13.3,13.3,133,146.3,647250.56,650000,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1245878,Teresa Thach Thao Le Nguyen,LAW ANDREW,731751,06/03/2020,256162.15,260000,0.25,52.64,52.64,5.26,5.26,52.64,57.9,256162.15,260000,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1245983,Nuam Thiha,LAW ANDREW,731906,13/03/2020,597299.23,600000,0.25,122.73,122.73,12.27,12.27,122.73,135,597299.23,600000,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1247828,Diep Thi Ngoc Truong,LAW ANDREW,731951,16/06/2020,520000,520000,0.25,106.85,106.85,10.69,10.69,106.85,117.54,520000,520000,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1246826,Thi Kim Lan Vo,CHEN LIN,732745,05/05/2020,449125.63,450000,0.25,92.29,92.29,9.23,9.23,92.29,101.52,449125.63,450000,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1247293,Vu Thuy Dung Phan,CHEN LIN,733940,04/05/2020,487267.77,488000,0.25,100.12,100.12,10.01,10.01,100.12,110.13,487267.77,488000,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1247314,Ngoc Dung Tran,CHEN LIN,734192,08/05/2020,612228.65,613000,0.25,125.8,125.8,12.58,12.58,125.8,138.38,612228.65,613000,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1247541,Trung Thuy Bui,CHEN LIN,734279,18/05/2020,361345.39,624000,0.25,74.25,74.25,7.43,7.43,74.25,81.68,361345.39,624000,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1247774,Kim Son Dang,CHEN LIN,734307,03/06/2020,364000,364000,0.25,74.79,74.79,7.48,7.48,74.79,82.27,364000,364000,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1247775,Kim Son Dang,CHEN LIN,734308,03/06/2020,616000,616000,0.25,126.57,126.57,12.66,12.66,126.57,139.23,616000,616000,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1247677,Helen Nguyen,CHEN LIN,734315,26/05/2020,417034.11,417506.4,0.25,85.69,85.69,8.57,8.57,85.69,94.26,417034.11,417506.4,0.25 LIST,1002621011000000000000,,PHL Trail Commissio LenLMOgGG NA Not Applicable Cost of Sales,07/15/2020,1247977,Trieu Hong Nhung Nguyen,CHEN LIN,734403,23/06/2020,416000,416000,0.25,85.48,85.48,8.55,8.55,85.48,94.03,416000,416000,0.25 *,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, h.REPEAT END,,,,,,,,,,,,,,,,,,,,, h.*,,,,,,,,,,,,,,,,,,,,, h.*,,,,,,,,,,,,,,,,,,,,, h.REPEAT END,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,2069.55,2069.55,206.97,206.97,2069.55,2276.52,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,* The GST shown above is payable by the Supplier,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,Remittance Advice:,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,Payment has been directly credited to your bank account as follows:,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,Account Name:,Super Finance Markets,,,,,,,,,,,,,,, *,,,,,Bank:,&COLUMNDEFN1.F1CHA_BANKNAME,,,,,,,,,,,,,,, *,,,,,BSB:,082-401,,,,,,,,,,,,,,, *,,,,,Account Number:,267602721,,,,,,,,,,,,,,, *,,,,,Amount:,2276.52,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,,,,, ` var sample_pepper_upfront = ` FORMAT XLONE REPORT,DefnSheetName=_defntmp_,,,,,,,,,,,,,,,, SET,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,RECIPIENT CREATED TAX INVOICE *,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,,Date: 30-Jun-2020 *,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,,,,,Pepper Homeloans Pty Limited,,,,,,,,,,,, *,,,,,ABN: 86 092 110 079,,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,,,,,To:,Super Finance Markets,,,,,,,,,,, *,,,,,,ABN: 68 620 533 333,,,,,,,,,,, *,,,,,,"International Tower One, Suite 2304, Level 23 100 Barangaroo Avenue, ",,,,,,,,,,, *,,,,,,Barangaroo NSW 2000,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,,,,,Upfront Commissions,,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,Account Number,Email,Description,UploadDate,Loan Number,Customer,Primary Introducer,Notes\Next Gen Number,Settlement Date,Settlement Amount less Offset & Redraw,Upfront Rate,Net Amount,Net Amount,GST,GST*,Gross Amount,Gross Amount *,,,,,,,,,,,,,,,,, LIST,SUFMARCOM,andrew@supercredit.com.au,Super Finance Markets,06/30/2020,1247977,Trieu Hong Nhung Nguyen,CHEN LIN,734403,06/22/2020,"416,000.00",1.00,-4160,4160,-416,416,-4576,4576 *,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,-4160,4160,-416,416,-4576,4576 *,,,,,,,,,,,,,,,,, *,,,,,* The GST shown above is payable by the Supplier,,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,,,,,Remittance Advice:,,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,,,,,Payment has been directly credited to your bank account as follows:,,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,,,,,Account Name:,Super Finance Markets,,,,,,,,,,, *,,,,,BSB:,082-401,,,,,,,,,,, *,,,,,Account Number:,267602721,,,,,,,,,,, *,,,,,Amount:,4576,,,,,,,,,,, *,,,,,,,,,,,,,,,,, *,,,,,,,,,,,,,,,,, `