support the latest format of alipay statement file

This commit is contained in:
MaysWind
2025-10-09 19:40:36 +08:00
parent 697f69d5d7
commit 94cd5dc21a
6 changed files with 30 additions and 5 deletions
@@ -10,7 +10,7 @@ var (
AlipayAppTransactionDataCsvFileImporter = &alipayAppTransactionDataCsvFileImporter{
alipayTransactionDataCsvFileImporter{
fileHeaderLine: "------------------------------------------------------------------------------------",
dataHeaderStartContent: "支付宝(中国)网络技术有限公司 电子客户回单",
dataHeaderStartContent: []string{"支付宝(中国)网络技术有限公司 电子客户回单", "支付宝支付科技有限公司 电子客户回单"},
originalColumnNames: alipayTransactionColumnNames{
timeColumnName: "交易时间",
categoryColumnName: "交易分类",
@@ -47,7 +47,7 @@ type alipayTransactionColumnNames struct {
// alipayTransactionDataCsvFileImporter defines the structure of alipay csv importer for transaction data
type alipayTransactionDataCsvFileImporter struct {
fileHeaderLine string
dataHeaderStartContent string
dataHeaderStartContent []string
dataBottomEndLineRune rune
originalColumnNames alipayTransactionColumnNames
}
@@ -11,7 +11,7 @@ import (
"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()
allOriginalLines := make([][]string, 0)
hasFileHeader := false
@@ -35,7 +35,7 @@ func createNewAlipayTransactionBasicDataTable(ctx core.Context, originalDataTabl
if !foundContentBeforeDataHeaderLine {
if row.ColumnCount() <= 0 {
continue
} else if strings.Index(row.GetData(0), dataHeaderStartContent) >= 0 {
} else if utils.ContainsAnyString(row.GetData(0), dataHeaderStartContent) {
foundContentBeforeDataHeaderLine = true
continue
} else {
@@ -10,7 +10,7 @@ var (
AlipayWebTransactionDataCsvFileImporter = &alipayWebTransactionDataCsvFileImporter{
alipayTransactionDataCsvFileImporter{
fileHeaderLine: "支付宝交易记录明细查询",
dataHeaderStartContent: "交易记录明细列表",
dataHeaderStartContent: []string{"交易记录明细列表"},
dataBottomEndLineRune: '-',
originalColumnNames: alipayTransactionColumnNames{
timeColumnName: "交易创建时间",
+11
View File
@@ -60,6 +60,17 @@ func SubString(str string, start int, length int) string {
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
func GetFirstLowerCharString(s string) string {
if s == "" {
+14
View File
@@ -72,6 +72,20 @@ func TestSubString_OverBoundary(t *testing.T) {
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) {
expectedValue := "fooBar"
actualValue := GetFirstLowerCharString("fooBar")