support the latest format of alipay statement file
This commit is contained in:
@@ -10,7 +10,7 @@ var (
|
|||||||
AlipayAppTransactionDataCsvFileImporter = &alipayAppTransactionDataCsvFileImporter{
|
AlipayAppTransactionDataCsvFileImporter = &alipayAppTransactionDataCsvFileImporter{
|
||||||
alipayTransactionDataCsvFileImporter{
|
alipayTransactionDataCsvFileImporter{
|
||||||
fileHeaderLine: "------------------------------------------------------------------------------------",
|
fileHeaderLine: "------------------------------------------------------------------------------------",
|
||||||
dataHeaderStartContent: "支付宝(中国)网络技术有限公司 电子客户回单",
|
dataHeaderStartContent: []string{"支付宝(中国)网络技术有限公司 电子客户回单", "支付宝支付科技有限公司 电子客户回单"},
|
||||||
originalColumnNames: alipayTransactionColumnNames{
|
originalColumnNames: alipayTransactionColumnNames{
|
||||||
timeColumnName: "交易时间",
|
timeColumnName: "交易时间",
|
||||||
categoryColumnName: "交易分类",
|
categoryColumnName: "交易分类",
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ type alipayTransactionColumnNames struct {
|
|||||||
// alipayTransactionDataCsvFileImporter defines the structure of alipay csv importer for transaction data
|
// alipayTransactionDataCsvFileImporter defines the structure of alipay csv importer for transaction data
|
||||||
type alipayTransactionDataCsvFileImporter struct {
|
type alipayTransactionDataCsvFileImporter struct {
|
||||||
fileHeaderLine string
|
fileHeaderLine string
|
||||||
dataHeaderStartContent string
|
dataHeaderStartContent []string
|
||||||
dataBottomEndLineRune rune
|
dataBottomEndLineRune rune
|
||||||
originalColumnNames alipayTransactionColumnNames
|
originalColumnNames alipayTransactionColumnNames
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import (
|
|||||||
"github.com/mayswind/ezbookkeeping/pkg/utils"
|
"github.com/mayswind/ezbookkeeping/pkg/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
func createNewAlipayTransactionBasicDataTable(ctx core.Context, originalDataTable datatable.BasicDataTable, fileHeaderLine string, dataHeaderStartContent string, dataBottomEndLineRune rune) (datatable.BasicDataTable, error) {
|
func createNewAlipayTransactionBasicDataTable(ctx core.Context, originalDataTable datatable.BasicDataTable, fileHeaderLine string, dataHeaderStartContent []string, dataBottomEndLineRune rune) (datatable.BasicDataTable, error) {
|
||||||
iterator := originalDataTable.DataRowIterator()
|
iterator := originalDataTable.DataRowIterator()
|
||||||
allOriginalLines := make([][]string, 0)
|
allOriginalLines := make([][]string, 0)
|
||||||
hasFileHeader := false
|
hasFileHeader := false
|
||||||
@@ -35,7 +35,7 @@ func createNewAlipayTransactionBasicDataTable(ctx core.Context, originalDataTabl
|
|||||||
if !foundContentBeforeDataHeaderLine {
|
if !foundContentBeforeDataHeaderLine {
|
||||||
if row.ColumnCount() <= 0 {
|
if row.ColumnCount() <= 0 {
|
||||||
continue
|
continue
|
||||||
} else if strings.Index(row.GetData(0), dataHeaderStartContent) >= 0 {
|
} else if utils.ContainsAnyString(row.GetData(0), dataHeaderStartContent) {
|
||||||
foundContentBeforeDataHeaderLine = true
|
foundContentBeforeDataHeaderLine = true
|
||||||
continue
|
continue
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ var (
|
|||||||
AlipayWebTransactionDataCsvFileImporter = &alipayWebTransactionDataCsvFileImporter{
|
AlipayWebTransactionDataCsvFileImporter = &alipayWebTransactionDataCsvFileImporter{
|
||||||
alipayTransactionDataCsvFileImporter{
|
alipayTransactionDataCsvFileImporter{
|
||||||
fileHeaderLine: "支付宝交易记录明细查询",
|
fileHeaderLine: "支付宝交易记录明细查询",
|
||||||
dataHeaderStartContent: "交易记录明细列表",
|
dataHeaderStartContent: []string{"交易记录明细列表"},
|
||||||
dataBottomEndLineRune: '-',
|
dataBottomEndLineRune: '-',
|
||||||
originalColumnNames: alipayTransactionColumnNames{
|
originalColumnNames: alipayTransactionColumnNames{
|
||||||
timeColumnName: "交易创建时间",
|
timeColumnName: "交易创建时间",
|
||||||
|
|||||||
@@ -60,6 +60,17 @@ func SubString(str string, start int, length int) string {
|
|||||||
return string(chars[start:end])
|
return string(chars[start:end])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ContainsAnyString returns whether the specified string contains any string of sub string slice
|
||||||
|
func ContainsAnyString(s string, substrs []string) bool {
|
||||||
|
for i := 0; i < len(substrs); i++ {
|
||||||
|
if strings.Index(s, substrs[i]) >= 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// GetFirstLowerCharString returns the source string parameter, but makes the first character lower case
|
// GetFirstLowerCharString returns the source string parameter, but makes the first character lower case
|
||||||
func GetFirstLowerCharString(s string) string {
|
func GetFirstLowerCharString(s string) string {
|
||||||
if s == "" {
|
if s == "" {
|
||||||
|
|||||||
@@ -72,6 +72,20 @@ func TestSubString_OverBoundary(t *testing.T) {
|
|||||||
assert.Equal(t, expectedValue, actualValue)
|
assert.Equal(t, expectedValue, actualValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestContainsAnyString(t *testing.T) {
|
||||||
|
actualValue := ContainsAnyString("test", []string{"test"})
|
||||||
|
assert.Equal(t, true, actualValue)
|
||||||
|
|
||||||
|
actualValue = ContainsAnyString("test", []string{"st"})
|
||||||
|
assert.Equal(t, true, actualValue)
|
||||||
|
|
||||||
|
actualValue = ContainsAnyString("test", []string{"tt", "tet", "tst", "est"})
|
||||||
|
assert.Equal(t, true, actualValue)
|
||||||
|
|
||||||
|
actualValue = ContainsAnyString("test", []string{"tt", "tet", "tst"})
|
||||||
|
assert.Equal(t, false, actualValue)
|
||||||
|
}
|
||||||
|
|
||||||
func TestGetFirstLowerCharString(t *testing.T) {
|
func TestGetFirstLowerCharString(t *testing.T) {
|
||||||
expectedValue := "fooBar"
|
expectedValue := "fooBar"
|
||||||
actualValue := GetFirstLowerCharString("fooBar")
|
actualValue := GetFirstLowerCharString("fooBar")
|
||||||
|
|||||||
Reference in New Issue
Block a user