mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-18 08:44:25 +08:00
code refactor
This commit is contained in:
@@ -15,21 +15,21 @@ const ezbookkeepingLineSeparator = "\n"
|
||||
const ezbookkeepingGeoLocationSeparator = " "
|
||||
const ezbookkeepingTagSeparator = ";"
|
||||
|
||||
var ezbookkeepingDataColumnNameMapping = map[datatable.DataTableColumn]string{
|
||||
datatable.DATA_TABLE_TRANSACTION_TIME: "Time",
|
||||
datatable.DATA_TABLE_TRANSACTION_TIMEZONE: "Timezone",
|
||||
datatable.DATA_TABLE_TRANSACTION_TYPE: "Type",
|
||||
datatable.DATA_TABLE_CATEGORY: "Category",
|
||||
datatable.DATA_TABLE_SUB_CATEGORY: "Sub Category",
|
||||
datatable.DATA_TABLE_ACCOUNT_NAME: "Account",
|
||||
datatable.DATA_TABLE_ACCOUNT_CURRENCY: "Account Currency",
|
||||
datatable.DATA_TABLE_AMOUNT: "Amount",
|
||||
datatable.DATA_TABLE_RELATED_ACCOUNT_NAME: "Account2",
|
||||
datatable.DATA_TABLE_RELATED_ACCOUNT_CURRENCY: "Account2 Currency",
|
||||
datatable.DATA_TABLE_RELATED_AMOUNT: "Account2 Amount",
|
||||
datatable.DATA_TABLE_GEOGRAPHIC_LOCATION: "Geographic Location",
|
||||
datatable.DATA_TABLE_TAGS: "Tags",
|
||||
datatable.DATA_TABLE_DESCRIPTION: "Description",
|
||||
var ezbookkeepingDataColumnNameMapping = map[datatable.TransactionDataTableColumn]string{
|
||||
datatable.TRANSACTION_DATA_TABLE_TRANSACTION_TIME: "Time",
|
||||
datatable.TRANSACTION_DATA_TABLE_TRANSACTION_TIMEZONE: "Timezone",
|
||||
datatable.TRANSACTION_DATA_TABLE_TRANSACTION_TYPE: "Type",
|
||||
datatable.TRANSACTION_DATA_TABLE_CATEGORY: "Category",
|
||||
datatable.TRANSACTION_DATA_TABLE_SUB_CATEGORY: "Sub Category",
|
||||
datatable.TRANSACTION_DATA_TABLE_ACCOUNT_NAME: "Account",
|
||||
datatable.TRANSACTION_DATA_TABLE_ACCOUNT_CURRENCY: "Account Currency",
|
||||
datatable.TRANSACTION_DATA_TABLE_AMOUNT: "Amount",
|
||||
datatable.TRANSACTION_DATA_TABLE_RELATED_ACCOUNT_NAME: "Account2",
|
||||
datatable.TRANSACTION_DATA_TABLE_RELATED_ACCOUNT_CURRENCY: "Account2 Currency",
|
||||
datatable.TRANSACTION_DATA_TABLE_RELATED_AMOUNT: "Account2 Amount",
|
||||
datatable.TRANSACTION_DATA_TABLE_GEOGRAPHIC_LOCATION: "Geographic Location",
|
||||
datatable.TRANSACTION_DATA_TABLE_TAGS: "Tags",
|
||||
datatable.TRANSACTION_DATA_TABLE_DESCRIPTION: "Description",
|
||||
}
|
||||
|
||||
var ezbookkeepingTransactionTypeNameMapping = map[models.TransactionType]string{
|
||||
@@ -39,21 +39,21 @@ var ezbookkeepingTransactionTypeNameMapping = map[models.TransactionType]string{
|
||||
models.TRANSACTION_TYPE_TRANSFER: "Transfer",
|
||||
}
|
||||
|
||||
var ezbookkeepingDataColumns = []datatable.DataTableColumn{
|
||||
datatable.DATA_TABLE_TRANSACTION_TIME,
|
||||
datatable.DATA_TABLE_TRANSACTION_TIMEZONE,
|
||||
datatable.DATA_TABLE_TRANSACTION_TYPE,
|
||||
datatable.DATA_TABLE_CATEGORY,
|
||||
datatable.DATA_TABLE_SUB_CATEGORY,
|
||||
datatable.DATA_TABLE_ACCOUNT_NAME,
|
||||
datatable.DATA_TABLE_ACCOUNT_CURRENCY,
|
||||
datatable.DATA_TABLE_AMOUNT,
|
||||
datatable.DATA_TABLE_RELATED_ACCOUNT_NAME,
|
||||
datatable.DATA_TABLE_RELATED_ACCOUNT_CURRENCY,
|
||||
datatable.DATA_TABLE_RELATED_AMOUNT,
|
||||
datatable.DATA_TABLE_GEOGRAPHIC_LOCATION,
|
||||
datatable.DATA_TABLE_TAGS,
|
||||
datatable.DATA_TABLE_DESCRIPTION,
|
||||
var ezbookkeepingDataColumns = []datatable.TransactionDataTableColumn{
|
||||
datatable.TRANSACTION_DATA_TABLE_TRANSACTION_TIME,
|
||||
datatable.TRANSACTION_DATA_TABLE_TRANSACTION_TIMEZONE,
|
||||
datatable.TRANSACTION_DATA_TABLE_TRANSACTION_TYPE,
|
||||
datatable.TRANSACTION_DATA_TABLE_CATEGORY,
|
||||
datatable.TRANSACTION_DATA_TABLE_SUB_CATEGORY,
|
||||
datatable.TRANSACTION_DATA_TABLE_ACCOUNT_NAME,
|
||||
datatable.TRANSACTION_DATA_TABLE_ACCOUNT_CURRENCY,
|
||||
datatable.TRANSACTION_DATA_TABLE_AMOUNT,
|
||||
datatable.TRANSACTION_DATA_TABLE_RELATED_ACCOUNT_NAME,
|
||||
datatable.TRANSACTION_DATA_TABLE_RELATED_ACCOUNT_CURRENCY,
|
||||
datatable.TRANSACTION_DATA_TABLE_RELATED_AMOUNT,
|
||||
datatable.TRANSACTION_DATA_TABLE_GEOGRAPHIC_LOCATION,
|
||||
datatable.TRANSACTION_DATA_TABLE_TAGS,
|
||||
datatable.TRANSACTION_DATA_TABLE_DESCRIPTION,
|
||||
}
|
||||
|
||||
// ToExportedContent returns the exported transaction plain text data
|
||||
@@ -67,7 +67,6 @@ func (c *ezBookKeepingTransactionDataPlainTextConverter) ToExportedContent(ctx c
|
||||
)
|
||||
|
||||
dataTableExporter := datatable.CreateNewExporter(
|
||||
ezbookkeepingDataColumnNameMapping,
|
||||
ezbookkeepingTransactionTypeNameMapping,
|
||||
ezbookkeepingGeoLocationSeparator,
|
||||
ezbookkeepingTagSeparator,
|
||||
@@ -84,7 +83,7 @@ func (c *ezBookKeepingTransactionDataPlainTextConverter) ToExportedContent(ctx c
|
||||
|
||||
// ParseImportedData returns the imported data by parsing the transaction plain text data
|
||||
func (c *ezBookKeepingTransactionDataPlainTextConverter) ParseImportedData(ctx core.Context, user *models.User, data []byte, defaultTimezoneOffset int16, accountMap map[string]*models.Account, expenseCategoryMap map[string]*models.TransactionCategory, incomeCategoryMap map[string]*models.TransactionCategory, transferCategoryMap map[string]*models.TransactionCategory, tagMap map[string]*models.TransactionTag) (models.ImportedTransactionSlice, []*models.Account, []*models.TransactionCategory, []*models.TransactionCategory, []*models.TransactionCategory, []*models.TransactionTag, error) {
|
||||
dataTable, err := createNewezbookkeepingTransactionPlainTextDataTable(
|
||||
dataTable, err := createNewezbookkeepingPlainTextDataTable(
|
||||
string(data),
|
||||
c.columnSeparator,
|
||||
ezbookkeepingLineSeparator,
|
||||
@@ -94,12 +93,13 @@ func (c *ezBookKeepingTransactionDataPlainTextConverter) ParseImportedData(ctx c
|
||||
return nil, nil, nil, nil, nil, nil, err
|
||||
}
|
||||
|
||||
transactionDataTable := datatable.CreateImportedTransactionDataTable(dataTable, ezbookkeepingDataColumnNameMapping)
|
||||
|
||||
dataTableImporter := datatable.CreateNewImporter(
|
||||
ezbookkeepingDataColumnNameMapping,
|
||||
ezbookkeepingTransactionTypeNameMapping,
|
||||
ezbookkeepingGeoLocationSeparator,
|
||||
ezbookkeepingTagSeparator,
|
||||
)
|
||||
|
||||
return dataTableImporter.ParseImportedData(ctx, user, dataTable, defaultTimezoneOffset, accountMap, expenseCategoryMap, incomeCategoryMap, transferCategoryMap, tagMap)
|
||||
return dataTableImporter.ParseImportedData(ctx, user, transactionDataTable, defaultTimezoneOffset, accountMap, expenseCategoryMap, incomeCategoryMap, transferCategoryMap, tagMap)
|
||||
}
|
||||
|
||||
@@ -238,10 +238,22 @@ func TestEzBookKeepingPlainFileConverterParseImportedData_ParseValidTimezone(t *
|
||||
}
|
||||
|
||||
allNewTransactions, _, _, _, _, _, err := converter.ParseImportedData(context, user, []byte("Time,Timezone,Type,Sub Category,Account,Amount,Account2,Account2 Amount\n"+
|
||||
"2024-09-01 12:34:56,+08:00,Expense,Test Category,Test Account,123.45,,"), 0, nil, nil, nil, nil, nil)
|
||||
"2024-09-01 12:34:56,-10:00,Expense,Test Category,Test Account,123.45,,"), 0, nil, nil, nil, nil, nil)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, 1, len(allNewTransactions))
|
||||
assert.Equal(t, int64(1725165296), utils.GetUnixTimeFromTransactionTime(allNewTransactions[0].TransactionTime))
|
||||
assert.Equal(t, int64(1725230096), utils.GetUnixTimeFromTransactionTime(allNewTransactions[0].TransactionTime))
|
||||
|
||||
allNewTransactions, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte("Time,Timezone,Type,Sub Category,Account,Amount,Account2,Account2 Amount\n"+
|
||||
"2024-09-01 12:34:56,+00:00,Expense,Test Category,Test Account,123.45,,"), 0, nil, nil, nil, nil, nil)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, 1, len(allNewTransactions))
|
||||
assert.Equal(t, int64(1725194096), utils.GetUnixTimeFromTransactionTime(allNewTransactions[0].TransactionTime))
|
||||
|
||||
allNewTransactions, _, _, _, _, _, err = converter.ParseImportedData(context, user, []byte("Time,Timezone,Type,Sub Category,Account,Amount,Account2,Account2 Amount\n"+
|
||||
"2024-09-01 12:34:56,+12:45,Expense,Test Category,Test Account,123.45,,"), 0, nil, nil, nil, nil, nil)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, 1, len(allNewTransactions))
|
||||
assert.Equal(t, int64(1725148196), utils.GetUnixTimeFromTransactionTime(allNewTransactions[0].TransactionTime))
|
||||
}
|
||||
|
||||
func TestEzBookKeepingPlainFileConverterParseImportedData_ParseInvalidTimezone(t *testing.T) {
|
||||
|
||||
@@ -3,31 +3,27 @@ package _default
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/mayswind/ezbookkeeping/pkg/converters/datatable"
|
||||
"github.com/mayswind/ezbookkeeping/pkg/core"
|
||||
"github.com/mayswind/ezbookkeeping/pkg/errs"
|
||||
"github.com/mayswind/ezbookkeeping/pkg/models"
|
||||
"github.com/mayswind/ezbookkeeping/pkg/utils"
|
||||
)
|
||||
|
||||
// ezBookKeepingTransactionPlainTextDataTable defines the structure of ezbookkeeping transaction plain text data table
|
||||
type ezBookKeepingTransactionPlainTextDataTable struct {
|
||||
// ezBookKeepingPlainTextDataTable defines the structure of ezbookkeeping plain text data table
|
||||
type ezBookKeepingPlainTextDataTable struct {
|
||||
columnSeparator string
|
||||
lineSeparator string
|
||||
allLines []string
|
||||
headerLineColumnNames []string
|
||||
}
|
||||
|
||||
// ezBookKeepingTransactionPlainTextDataRow defines the structure of ezbookkeeping transaction plain text data row
|
||||
type ezBookKeepingTransactionPlainTextDataRow struct {
|
||||
// ezBookKeepingPlainTextDataRow defines the structure of ezbookkeeping plain text data row
|
||||
type ezBookKeepingPlainTextDataRow struct {
|
||||
allItems []string
|
||||
}
|
||||
|
||||
// ezBookKeepingTransactionPlainTextDataRowIterator defines the structure of ezbookkeeping transaction plain text data row iterator
|
||||
type ezBookKeepingTransactionPlainTextDataRowIterator struct {
|
||||
dataTable *ezBookKeepingTransactionPlainTextDataTable
|
||||
// ezBookKeepingPlainTextDataRowIterator defines the structure of ezbookkeeping plain text data row iterator
|
||||
type ezBookKeepingPlainTextDataRowIterator struct {
|
||||
dataTable *ezBookKeepingPlainTextDataTable
|
||||
currentIndex int
|
||||
}
|
||||
|
||||
@@ -35,14 +31,14 @@ type ezBookKeepingTransactionPlainTextDataRowIterator struct {
|
||||
type ezBookKeepingTransactionPlainTextDataTableBuilder struct {
|
||||
columnSeparator string
|
||||
lineSeparator string
|
||||
columns []datatable.DataTableColumn
|
||||
dataColumnNameMapping map[datatable.DataTableColumn]string
|
||||
columns []datatable.TransactionDataTableColumn
|
||||
dataColumnNameMapping map[datatable.TransactionDataTableColumn]string
|
||||
dataLineFormat string
|
||||
builder *strings.Builder
|
||||
}
|
||||
|
||||
// DataRowCount returns the total count of data row
|
||||
func (t *ezBookKeepingTransactionPlainTextDataTable) DataRowCount() int {
|
||||
func (t *ezBookKeepingPlainTextDataTable) DataRowCount() int {
|
||||
if len(t.allLines) < 1 {
|
||||
return 0
|
||||
}
|
||||
@@ -50,31 +46,26 @@ func (t *ezBookKeepingTransactionPlainTextDataTable) DataRowCount() int {
|
||||
return len(t.allLines) - 1
|
||||
}
|
||||
|
||||
// HeaderLineColumnNames returns the header column name list
|
||||
func (t *ezBookKeepingTransactionPlainTextDataTable) HeaderLineColumnNames() []string {
|
||||
// HeaderColumnNames returns the header column name list
|
||||
func (t *ezBookKeepingPlainTextDataTable) HeaderColumnNames() []string {
|
||||
return t.headerLineColumnNames
|
||||
}
|
||||
|
||||
// DataRowIterator returns the iterator of data row
|
||||
func (t *ezBookKeepingTransactionPlainTextDataTable) DataRowIterator() datatable.ImportedDataRowIterator {
|
||||
return &ezBookKeepingTransactionPlainTextDataRowIterator{
|
||||
func (t *ezBookKeepingPlainTextDataTable) DataRowIterator() datatable.ImportedDataRowIterator {
|
||||
return &ezBookKeepingPlainTextDataRowIterator{
|
||||
dataTable: t,
|
||||
currentIndex: 0,
|
||||
}
|
||||
}
|
||||
|
||||
// IsValid returns whether this row contains valid data for importing
|
||||
func (r *ezBookKeepingTransactionPlainTextDataRow) IsValid() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// ColumnCount returns the total count of column in this data row
|
||||
func (r *ezBookKeepingTransactionPlainTextDataRow) ColumnCount() int {
|
||||
func (r *ezBookKeepingPlainTextDataRow) ColumnCount() int {
|
||||
return len(r.allItems)
|
||||
}
|
||||
|
||||
// GetData returns the data in the specified column index
|
||||
func (r *ezBookKeepingTransactionPlainTextDataRow) GetData(columnIndex int) string {
|
||||
func (r *ezBookKeepingPlainTextDataRow) GetData(columnIndex int) string {
|
||||
if columnIndex >= len(r.allItems) {
|
||||
return ""
|
||||
}
|
||||
@@ -82,23 +73,13 @@ func (r *ezBookKeepingTransactionPlainTextDataRow) GetData(columnIndex int) stri
|
||||
return r.allItems[columnIndex]
|
||||
}
|
||||
|
||||
// GetTime returns the time in the specified column index
|
||||
func (r *ezBookKeepingTransactionPlainTextDataRow) GetTime(columnIndex int, timezoneOffset int16) (time.Time, error) {
|
||||
return utils.ParseFromLongDateTime(r.GetData(columnIndex), timezoneOffset)
|
||||
}
|
||||
|
||||
// GetTimezoneOffset returns the time zone offset in the specified column index
|
||||
func (r *ezBookKeepingTransactionPlainTextDataRow) GetTimezoneOffset(columnIndex int) (*time.Location, error) {
|
||||
return utils.ParseFromTimezoneOffset(r.GetData(columnIndex))
|
||||
}
|
||||
|
||||
// HasNext returns whether the iterator does not reach the end
|
||||
func (t *ezBookKeepingTransactionPlainTextDataRowIterator) HasNext() bool {
|
||||
func (t *ezBookKeepingPlainTextDataRowIterator) HasNext() bool {
|
||||
return t.currentIndex+1 < len(t.dataTable.allLines)
|
||||
}
|
||||
|
||||
// Next returns the next imported data row
|
||||
func (t *ezBookKeepingTransactionPlainTextDataRowIterator) Next(ctx core.Context, user *models.User) datatable.ImportedDataRow {
|
||||
func (t *ezBookKeepingPlainTextDataRowIterator) Next() datatable.ImportedDataRow {
|
||||
if t.currentIndex+1 >= len(t.dataTable.allLines) {
|
||||
return nil
|
||||
}
|
||||
@@ -108,13 +89,13 @@ func (t *ezBookKeepingTransactionPlainTextDataRowIterator) Next(ctx core.Context
|
||||
rowContent := t.dataTable.allLines[t.currentIndex]
|
||||
rowItems := strings.Split(rowContent, t.dataTable.columnSeparator)
|
||||
|
||||
return &ezBookKeepingTransactionPlainTextDataRow{
|
||||
return &ezBookKeepingPlainTextDataRow{
|
||||
allItems: rowItems,
|
||||
}
|
||||
}
|
||||
|
||||
// AppendTransaction appends the specified transaction to data builder
|
||||
func (b *ezBookKeepingTransactionPlainTextDataTableBuilder) AppendTransaction(data map[datatable.DataTableColumn]string) {
|
||||
func (b *ezBookKeepingTransactionPlainTextDataTableBuilder) AppendTransaction(data map[datatable.TransactionDataTableColumn]string) {
|
||||
dataRowParams := make([]any, len(b.columns))
|
||||
|
||||
for i := 0; i < len(b.columns); i++ {
|
||||
@@ -175,7 +156,7 @@ func (b *ezBookKeepingTransactionPlainTextDataTableBuilder) generateDataLineForm
|
||||
return ret.String()
|
||||
}
|
||||
|
||||
func createNewezbookkeepingTransactionPlainTextDataTable(content string, columnSeparator string, lineSeparator string) (*ezBookKeepingTransactionPlainTextDataTable, error) {
|
||||
func createNewezbookkeepingPlainTextDataTable(content string, columnSeparator string, lineSeparator string) (*ezBookKeepingPlainTextDataTable, error) {
|
||||
allLines := strings.Split(content, lineSeparator)
|
||||
|
||||
if len(allLines) < 2 {
|
||||
@@ -186,7 +167,7 @@ func createNewezbookkeepingTransactionPlainTextDataTable(content string, columnS
|
||||
headerLine = strings.ReplaceAll(headerLine, "\r", "")
|
||||
headerLineItems := strings.Split(headerLine, columnSeparator)
|
||||
|
||||
return &ezBookKeepingTransactionPlainTextDataTable{
|
||||
return &ezBookKeepingPlainTextDataTable{
|
||||
columnSeparator: columnSeparator,
|
||||
lineSeparator: lineSeparator,
|
||||
allLines: allLines,
|
||||
@@ -194,7 +175,7 @@ func createNewezbookkeepingTransactionPlainTextDataTable(content string, columnS
|
||||
}, nil
|
||||
}
|
||||
|
||||
func createNewezbookkeepingTransactionPlainTextDataTableBuilder(transactionCount int, columns []datatable.DataTableColumn, dataColumnNameMapping map[datatable.DataTableColumn]string, columnSeparator string, lineSeparator string) *ezBookKeepingTransactionPlainTextDataTableBuilder {
|
||||
func createNewezbookkeepingTransactionPlainTextDataTableBuilder(transactionCount int, columns []datatable.TransactionDataTableColumn, dataColumnNameMapping map[datatable.TransactionDataTableColumn]string, columnSeparator string, lineSeparator string) *ezBookKeepingTransactionPlainTextDataTableBuilder {
|
||||
var builder strings.Builder
|
||||
builder.Grow(transactionCount * 100)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user