diff --git a/pkg/converters/camt/camt_data.go b/pkg/converters/camt/camt_data.go index 805d2a73..6ab57fc7 100644 --- a/pkg/converters/camt/camt_data.go +++ b/pkg/converters/camt/camt_data.go @@ -9,11 +9,20 @@ const ( CAMT_INDICATOR_DEBIT camtCreditDebitIndicator = "DBIT" ) +type camt052File struct { + XMLName xml.Name `xml:"Document"` + BankToCustomerAccountReport *camtBankToCustomerAccountReport `xml:"BkToCstmrAcctRpt"` +} + type camt053File struct { XMLName xml.Name `xml:"Document"` BankToCustomerStatement *camtBankToCustomerStatement `xml:"BkToCstmrStmt"` } +type camtBankToCustomerAccountReport struct { + Statements []*camtStatement `xml:"Rpt"` +} + type camtBankToCustomerStatement struct { Statements []*camtStatement `xml:"Stmt"` } diff --git a/pkg/converters/camt/camt_data_reader.go b/pkg/converters/camt/camt_data_reader.go index afbd9d27..6748a682 100644 --- a/pkg/converters/camt/camt_data_reader.go +++ b/pkg/converters/camt/camt_data_reader.go @@ -10,11 +10,30 @@ import ( "github.com/mayswind/ezbookkeeping/pkg/errs" ) +// camt052FileReader defines the structure of camt.052 file reader +type camt052FileReader struct { + xmlDecoder *xml.Decoder +} + // camt053FileReader defines the structure of camt.053 file reader type camt053FileReader struct { xmlDecoder *xml.Decoder } +// read returns the imported camt.052 data +// Reference: https://www.iso20022.org/message-set/1196/download +func (r *camt052FileReader) read(ctx core.Context) (*camt052File, error) { + file := &camt052File{} + + err := r.xmlDecoder.Decode(&file) + + if err != nil { + return nil, err + } + + return file, nil +} + // read returns the imported camt.053 data // Reference: https://www.iso20022.org/message-set/1196/download func (r *camt053FileReader) read(ctx core.Context) (*camt053File, error) { @@ -29,6 +48,19 @@ func (r *camt053FileReader) read(ctx core.Context) (*camt053File, error) { return file, nil } +func createNewCamt052FileReader(data []byte) (*camt052FileReader, error) { + if len(data) > 5 && data[0] == 0x3C && data[1] == 0x3F && data[2] == 0x78 && data[3] == 0x6D && data[4] == 0x6C { // 5 && data[0] == 0x3C && data[1] == 0x3F && data[2] == 0x78 && data[3] == 0x6D && data[4] == 0x6C { // + + + + + + 123 + + CNY + + + + 2024-09-01T01:23:45+08:00 + + CRDT + 123.45 + + + + 2024-09-01T12:34:56+08:00 + + DBIT + 0.12 + + + + + + + 456 + + + USD + + + + 2024-09-01T23:59:59+08:00 + + CRDT + 1.23 + + + + `), time.UTC, converter.DefaultImporterOptions, nil, nil, nil, nil, nil) + + assert.Nil(t, err) + + assert.Equal(t, 3, len(allNewTransactions)) + assert.Equal(t, 2, len(allNewAccounts)) + assert.Equal(t, 1, len(allNewSubExpenseCategories)) + assert.Equal(t, 1, len(allNewSubIncomeCategories)) + assert.Equal(t, 0, len(allNewSubTransferCategories)) + assert.Equal(t, 0, len(allNewTags)) + + assert.Equal(t, int64(1234567890), allNewTransactions[0].Uid) + assert.Equal(t, models.TRANSACTION_DB_TYPE_INCOME, allNewTransactions[0].Type) + assert.Equal(t, int64(1725125025), utils.GetUnixTimeFromTransactionTime(allNewTransactions[0].TransactionTime)) + assert.Equal(t, int64(12345), allNewTransactions[0].Amount) + assert.Equal(t, "123", allNewTransactions[0].OriginalSourceAccountName) + assert.Equal(t, "CNY", allNewTransactions[0].OriginalSourceAccountCurrency) + assert.Equal(t, "", allNewTransactions[0].OriginalCategoryName) + + assert.Equal(t, int64(1234567890), allNewTransactions[1].Uid) + assert.Equal(t, models.TRANSACTION_DB_TYPE_EXPENSE, allNewTransactions[1].Type) + assert.Equal(t, int64(1725165296), utils.GetUnixTimeFromTransactionTime(allNewTransactions[1].TransactionTime)) + assert.Equal(t, int64(12), allNewTransactions[1].Amount) + assert.Equal(t, "123", allNewTransactions[1].OriginalSourceAccountName) + assert.Equal(t, "CNY", allNewTransactions[1].OriginalSourceAccountCurrency) + assert.Equal(t, "", allNewTransactions[1].OriginalCategoryName) + + assert.Equal(t, int64(1234567890), allNewTransactions[2].Uid) + assert.Equal(t, models.TRANSACTION_DB_TYPE_INCOME, allNewTransactions[2].Type) + assert.Equal(t, int64(1725206399), utils.GetUnixTimeFromTransactionTime(allNewTransactions[2].TransactionTime)) + assert.Equal(t, int64(123), allNewTransactions[2].Amount) + assert.Equal(t, "456", allNewTransactions[2].OriginalSourceAccountName) + assert.Equal(t, "USD", allNewTransactions[2].OriginalSourceAccountCurrency) + assert.Equal(t, "", allNewTransactions[2].OriginalCategoryName) + + assert.Equal(t, int64(1234567890), allNewAccounts[0].Uid) + assert.Equal(t, "123", allNewAccounts[0].Name) + assert.Equal(t, "CNY", allNewAccounts[0].Currency) + + assert.Equal(t, int64(1234567890), allNewAccounts[1].Uid) + assert.Equal(t, "456", allNewAccounts[1].Name) + assert.Equal(t, "USD", allNewAccounts[1].Currency) + + assert.Equal(t, int64(1234567890), allNewSubExpenseCategories[0].Uid) + assert.Equal(t, "", allNewSubExpenseCategories[0].Name) + + assert.Equal(t, int64(1234567890), allNewSubIncomeCategories[0].Uid) + assert.Equal(t, "", allNewSubIncomeCategories[0].Name) +} + func TestCamt053TransactionDataFileParseImportedData_MinimumValidData(t *testing.T) { importer := Camt053TransactionDataImporter context := core.NewNullContext() diff --git a/pkg/converters/transaction_data_converters.go b/pkg/converters/transaction_data_converters.go index 003e4dc3..e4addbc4 100644 --- a/pkg/converters/transaction_data_converters.go +++ b/pkg/converters/transaction_data_converters.go @@ -52,6 +52,8 @@ func GetTransactionDataImporter(fileType string) (converter.TransactionDataImpor return qif.QifDayMonthYearTransactionDataImporter, nil } else if fileType == "iif" { return iif.IifTransactionDataFileImporter, nil + } else if fileType == "camt052" { + return camt.Camt052TransactionDataImporter, nil } else if fileType == "camt053" { return camt.Camt053TransactionDataImporter, nil } else if fileType == "mt940" { diff --git a/src/consts/file.ts b/src/consts/file.ts index dbf2d6cb..60735a3d 100644 --- a/src/consts/file.ts +++ b/src/consts/file.ts @@ -229,6 +229,11 @@ export const SUPPORTED_IMPORT_FILE_CATEGORY_AND_TYPES: ImportFileCategoryAndType { categoryName: 'General Bank Statement Format', fileTypes: [ + { + type: 'camt052', + name: 'Camt.052 Bank to Customer Statement File', + extensions: '.xml' + }, { type: 'camt053', name: 'Camt.053 Bank to Customer Statement File', diff --git a/src/locales/de.json b/src/locales/de.json index a4d948e6..9e08fb8d 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "Monat-Tag-Jahr-Format", "Day-month-year format": "Tag-Monat-Jahr-Format", "Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF)-Datei", + "Camt.052 Bank to Customer Statement File": "Camt.052 Bank to Customer Statement File", "Camt.053 Bank to Customer Statement File": "Camt.053 Bank to Customer Statement File", "MT940 Consumer Statement Message File": "MT940 Consumer Statement Message File", "Delimiter-separated Values (DSV) File": "Delimiter-separated Values (DSV) File", diff --git a/src/locales/en.json b/src/locales/en.json index da47787e..965439fc 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "Month-day-year format", "Day-month-year format": "Day-month-year format", "Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) File", + "Camt.052 Bank to Customer Statement File": "Camt.052 Bank to Customer Statement File", "Camt.053 Bank to Customer Statement File": "Camt.053 Bank to Customer Statement File", "MT940 Consumer Statement Message File": "MT940 Consumer Statement Message File", "Delimiter-separated Values (DSV) File": "Delimiter-separated Values (DSV) File", diff --git a/src/locales/es.json b/src/locales/es.json index 775ca455..713b951f 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "Formato mes-día-año", "Day-month-year format": "Formato día-mes-año", "Intuit Interchange Format (IIF) File": "Archivo IIF (Intuit Interchange Format)", + "Camt.052 Bank to Customer Statement File": "Extracto Camt.052 (Extracto de cuenta del cliente)", "Camt.053 Bank to Customer Statement File": "Extracto Camt.053 (Extracto de cuenta del cliente)", "MT940 Consumer Statement Message File": "Extracto MT940 (Extracto de cuenta del cliente)", "Delimiter-separated Values (DSV) File": "Archivo DSV (valores separados por delimirtadores)", diff --git a/src/locales/fr.json b/src/locales/fr.json index 2efe1b24..228149f2 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "Format mois-jour-année", "Day-month-year format": "Format jour-mois-année", "Intuit Interchange Format (IIF) File": "Fichier Intuit Interchange Format (IIF)", + "Camt.052 Bank to Customer Statement File": "Fichier de relevé bancaire Camt.052", "Camt.053 Bank to Customer Statement File": "Fichier de relevé bancaire Camt.053", "MT940 Consumer Statement Message File": "Fichier de message de relevé consommateur MT940", "Delimiter-separated Values (DSV) File": "Fichier de valeurs séparées par délimiteur (DSV)", diff --git a/src/locales/it.json b/src/locales/it.json index 2c9b41f6..1d577d59 100644 --- a/src/locales/it.json +++ b/src/locales/it.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "Formato mese-giorno-anno", "Day-month-year format": "Formato giorno-mese-anno", "Intuit Interchange Format (IIF) File": "File Intuit Interchange Format (IIF)", + "Camt.052 Bank to Customer Statement File": "Camt.052 Bank to Customer Statement File", "Camt.053 Bank to Customer Statement File": "Camt.053 Bank to Customer Statement File", "MT940 Consumer Statement Message File": "MT940 Consumer Statement Message File", "Delimiter-separated Values (DSV) File": "File valori separati da delimitatore (DSV)", diff --git a/src/locales/ja.json b/src/locales/ja.json index 02531480..18d77033 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "月-日-年 形式", "Day-month-year format": "日-月-年 形式", "Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) ファイル", + "Camt.052 Bank to Customer Statement File": "Camt.052 Bank to Customer Statement File", "Camt.053 Bank to Customer Statement File": "Camt.053 Bank to Customer Statement File", "MT940 Consumer Statement Message File": "MT940 Consumer Statement Message File", "Delimiter-separated Values (DSV) File": "Delimiter-separated Values (DSV) ファイル", diff --git a/src/locales/kn.json b/src/locales/kn.json index 7f8a293a..d2b146bb 100644 --- a/src/locales/kn.json +++ b/src/locales/kn.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "ತಿಂಗಳು-ದಿನ-ವರ್ಷ ರೂಪ", "Day-month-year format": "ದಿನ-ತಿಂಗಳು-ವರ್ಷ ರೂಪ", "Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) ಫೈಲ್", + "Camt.052 Bank to Customer Statement File": "Camt.052 ಬ್ಯಾಂಕ್ ಸ್ಟೇಟ್ಮೆಂಟ್ ಫೈಲ್", "Camt.053 Bank to Customer Statement File": "Camt.053 ಬ್ಯಾಂಕ್ ಸ್ಟೇಟ್ಮೆಂಟ್ ಫೈಲ್", "MT940 Consumer Statement Message File": "MT940 ಗ್ರಾಹಕ ಸ್ಟೇಟ್ಮೆಂಟ್ ಫೈಲ್", "Delimiter-separated Values (DSV) File": "Delimiter-separated Values (DSV) ಫೈಲ್", diff --git a/src/locales/ko.json b/src/locales/ko.json index 124c346e..e07e9d53 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "월-일-연 형식", "Day-month-year format": "일-월-연 형식", "Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) 파일", + "Camt.052 Bank to Customer Statement File": "Camt.052 은행 고객 명세서 파일", "Camt.053 Bank to Customer Statement File": "Camt.053 은행 고객 명세서 파일", "MT940 Consumer Statement Message File": "MT940 소비자 명세서 메시지 파일", "Delimiter-separated Values (DSV) File": "구분 기호로 구분된 값 (DSV) 파일", diff --git a/src/locales/nl.json b/src/locales/nl.json index 5cc3e809..93579f62 100644 --- a/src/locales/nl.json +++ b/src/locales/nl.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "Maand-dag-jaar-formaat", "Day-month-year format": "Dag-maand-jaar-formaat", "Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF)-bestand", + "Camt.052 Bank to Customer Statement File": "Camt.052 Bank-naar-klant afschriftbestand", "Camt.053 Bank to Customer Statement File": "Camt.053 Bank-naar-klant afschriftbestand", "MT940 Consumer Statement Message File": "MT940 Rekeningafschriftbestand", "Delimiter-separated Values (DSV) File": "Delimiter-gescheiden waarden (DSV)-bestand", diff --git a/src/locales/pt_BR.json b/src/locales/pt_BR.json index c8ee0ca7..11b36682 100644 --- a/src/locales/pt_BR.json +++ b/src/locales/pt_BR.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "Formato mês-dia-ano", "Day-month-year format": "Formato dia-mês-ano", "Intuit Interchange Format (IIF) File": "Arquivo Intuit Interchange Format (IIF)", + "Camt.052 Bank to Customer Statement File": "Arquivo, de Extrato Bancário Camt.052", "Camt.053 Bank to Customer Statement File": "Arquivo, de Extrato Bancário Camt.053", "MT940 Consumer Statement Message File": "Arquivo de Mensagem de Extrato Consumidor MT940", "Delimiter-separated Values (DSV) File": "Arquivo de Valores Separados por Delimitador (DSV)", diff --git a/src/locales/ru.json b/src/locales/ru.json index 730b761d..3c93070f 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "Формат месяц-день-год", "Day-month-year format": "Формат день-месяц-год", "Intuit Interchange Format (IIF) File": "Файл Intuit Interchange Format (IIF)", + "Camt.052 Bank to Customer Statement File": "Camt.052 Bank to Customer Statement File", "Camt.053 Bank to Customer Statement File": "Camt.053 Bank to Customer Statement File", "MT940 Consumer Statement Message File": "MT940 Consumer Statement Message File", "Delimiter-separated Values (DSV) File": "Delimiter-separated Values (DSV) File", diff --git a/src/locales/sl.json b/src/locales/sl.json index b91b2801..d723326b 100644 --- a/src/locales/sl.json +++ b/src/locales/sl.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "Format mesec-dan-leto", "Day-month-year format": "Format dan-mesec-leto", "Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) datoteka", + "Camt.052 Bank to Customer Statement File": "Camt.052 bančni izpisek", "Camt.053 Bank to Customer Statement File": "Camt.053 bančni izpisek", "MT940 Consumer Statement Message File": "MT940 bančni izpisek", "Delimiter-separated Values (DSV) File": "Datoteka z vrednostmi ločenimi z ločilom (DSV)", diff --git a/src/locales/ta.json b/src/locales/ta.json index bf20132f..46f1aa13 100644 --- a/src/locales/ta.json +++ b/src/locales/ta.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "மாதம்-நாள்-ஆண்டு வடிவம்", "Day-month-year format": "நாள்-மாதம்-ஆண்டு வடிவம்", "Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) கோப்பு", + "Camt.052 Bank to Customer Statement File": "Camt.052 வங்கி அறிக்கை கோப்பு", "Camt.053 Bank to Customer Statement File": "Camt.053 வங்கி அறிக்கை கோப்பு", "MT940 Consumer Statement Message File": "MT940 வாடிக்கையாளர் அறிக்கை கோப்பு", "Delimiter-separated Values (DSV) File": "Delimiter-separated Values (DSV) கோப்பு", diff --git a/src/locales/th.json b/src/locales/th.json index f0e06b76..cd134e3d 100644 --- a/src/locales/th.json +++ b/src/locales/th.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "รูปแบบ เดือน-วัน-ปี", "Day-month-year format": "รูปแบบ วัน-เดือน-ปี", "Intuit Interchange Format (IIF) File": "ไฟล์ Intuit Interchange Format (IIF)", + "Camt.052 Bank to Customer Statement File": "ไฟล์ Camt.052 รายงานธนาคารถึงลูกค้า", "Camt.053 Bank to Customer Statement File": "ไฟล์ Camt.053 รายงานธนาคารถึงลูกค้า", "MT940 Consumer Statement Message File": "ไฟล์ MT940 ข้อความรายการลูกค้า", "Delimiter-separated Values (DSV) File": "ไฟล์ DSV (ค่าแยกด้วยตัวคั่น)", diff --git a/src/locales/tr.json b/src/locales/tr.json index 6aff2baf..61631726 100644 --- a/src/locales/tr.json +++ b/src/locales/tr.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "Ay-gün-yıl formatı", "Day-month-year format": "Gün-ay-yıl formatı", "Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) Dosyası", + "Camt.052 Bank to Customer Statement File": "Camt.052 Banka Müşteri Ekstresi Dosyası", "Camt.053 Bank to Customer Statement File": "Camt.053 Banka Müşteri Ekstresi Dosyası", "MT940 Consumer Statement Message File": "MT940 Müşteri Ekstre Mesajı Dosyası", "Delimiter-separated Values (DSV) File": "Ayırıcı ile Ayrılmış Değerler (DSV) Dosyası", diff --git a/src/locales/uk.json b/src/locales/uk.json index c90dbbc3..b9238000 100644 --- a/src/locales/uk.json +++ b/src/locales/uk.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "Формат місяць-день-рік", "Day-month-year format": "Формат день-місяць-рік", "Intuit Interchange Format (IIF) File": "Файл Intuit Interchange Format (IIF)", + "Camt.052 Bank to Customer Statement File": "Camt.052 Bank to Customer Statement File", "Camt.053 Bank to Customer Statement File": "Camt.053 Bank to Customer Statement File", "MT940 Consumer Statement Message File": "MT940 Consumer Statement Message File", "Delimiter-separated Values (DSV) File": "Файл із розділювачами значень (DSV)", diff --git a/src/locales/vi.json b/src/locales/vi.json index 86ae61a6..63a1043e 100644 --- a/src/locales/vi.json +++ b/src/locales/vi.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "Định dạng tháng-ngày-năm", "Day-month-year format": "Định dạng ngày-tháng-năm", "Intuit Interchange Format (IIF) File": "Tệp Intuit Interchange Format (IIF)", + "Camt.052 Bank to Customer Statement File": "Camt.052 Bank to Customer Statement File", "Camt.053 Bank to Customer Statement File": "Camt.053 Bank to Customer Statement File", "MT940 Consumer Statement Message File": "MT940 Consumer Statement Message File", "Delimiter-separated Values (DSV) File": "Delimiter-separated Values (DSV) File", diff --git a/src/locales/zh_Hans.json b/src/locales/zh_Hans.json index 469a23bc..4802ccb0 100644 --- a/src/locales/zh_Hans.json +++ b/src/locales/zh_Hans.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "月-日-年 格式", "Day-month-year format": "日-月-年 格式", "Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) 文件", + "Camt.052 Bank to Customer Statement File": "Camt.052 银行对账单文件", "Camt.053 Bank to Customer Statement File": "Camt.053 银行对账单文件", "MT940 Consumer Statement Message File": "MT940 客户对账消息文件", "Delimiter-separated Values (DSV) File": "分隔符分隔值 (DSV) 文件", diff --git a/src/locales/zh_Hant.json b/src/locales/zh_Hant.json index fa1ae12c..869df0c6 100644 --- a/src/locales/zh_Hant.json +++ b/src/locales/zh_Hant.json @@ -1981,6 +1981,7 @@ "Month-day-year format": "月-日-年 格式", "Day-month-year format": "日-月-年 格式", "Intuit Interchange Format (IIF) File": "Intuit Interchange Format (IIF) 檔案", + "Camt.052 Bank to Customer Statement File": "Camt.052 銀行對帳單檔案", "Camt.053 Bank to Customer Statement File": "Camt.053 銀行對帳單檔案", "MT940 Consumer Statement Message File": "MT940 客戶對帳訊息檔案", "Delimiter-separated Values (DSV) File": "分隔符分隔值 (DSV) 檔案",