Skip to content

Commit 14b140e

Browse files
authored
Merge pull request #625 from flow-mn/sadespresso/import-bulk-txns-20251228
Bulk import, Custom transaction entry flow
2 parents 50e0b90 + d89ed49 commit 14b140e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+2267
-766
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
# Changelog
22

3+
## Next
4+
5+
### New features
6+
7+
* Now you can configure transaction entry flows
8+
* Added more fields to programmable object.
9+
* Now you can import multiple transactions at once with [programmable URL](./README.md#adding-multiple-transactions)
10+
* Now there's a concept of primary accounts, closes [#624](https://github.com/flow-mn/flow/issues/624)
11+
312
## 0.16.6
413

514
### New features

README.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,63 @@ seamlessly across platforms.
3333
* Export CSV, PDFs
3434
* Periodic auto-backups to iCloud
3535
* Absolutely free ([please donate 🥺](#support-flow))
36+
* [URI-based automation](#uri-based-automation)
37+
38+
## URI-based automation
39+
40+
You can add one or more transactions using `flow-mn` schema uris.
41+
42+
Check out the supported [JSON Schema file in schemas folder](./schemas/programmable-object.json).
43+
44+
Currencies are based on the account, so there's no way to specify it at the moment.
45+
46+
### Adding single transaction
47+
48+
When adding single transactions, properties must be provided as query params.
49+
50+
```json
51+
{
52+
"title": "Tous les jours",
53+
"amount": 42000.00
54+
}
55+
```
56+
57+
turns into:
58+
59+
```plain
60+
flow-mn:///transaction/new?title=Tous+les+jours&amount=42000.00
61+
```
62+
63+
### Adding multiple transactions
64+
65+
When adding multiple transactions, you must provide stringified version of the following as "json" query param.
66+
67+
```json
68+
{
69+
"t": [
70+
{
71+
"title": "Fresh blueberry piece",
72+
"amount": "13000.00",
73+
"transactionDate": "2011-12-05",
74+
"category": "Food",
75+
"tags": "My fave cafe",
76+
"accountUuid": "faa6d523-277f-46af-9493-67768e5b48ab",
77+
},
78+
{
79+
"title": "Caffe Mocha ice",
80+
"amount": "10000.00",
81+
"transactionDate": "2011-12-05",
82+
"category": "Drinks"
83+
}
84+
]
85+
}
86+
```
87+
88+
turns into
89+
90+
```plain
91+
flow-mn:///transaction/new?json=%7B%22t%22%3A%5B%7B%22title%22%3A%22Fresh%20blueberry%20piece%22%2C%22amount%22%3A%2213000.00%22%2C%22transactionDate%22%3A%222011-12-05%22%2C%22category%22%3A%22Food%22%7D%2C%7B%22title%22%3A%22Caffe%20Mocha%20ice%22%2C%22amount%22%3A%2210000.00%22%2C%22transactionDate%22%3A%222011-12-05%22%2C%22category%22%3A%22Drinks%22%7D%5D%7D
92+
```
3693

3794
## Development
3895

assets/l10n/ar.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
"account.new": "إضافة حساب",
1717
"account.noAccounts": "ليس لديك أي حسابات!",
1818
"account.postTransactionBalance": "الرصيد بعد هذه المعاملة",
19+
"account.primaryAccount": "الحساب الأساسي",
20+
"account.primaryAccount.changeDescription": "يمكنك تعيين حساب آخر كحساب أساسي عبر الانتقال إلى صفحة تحرير ذلك الحساب.",
21+
"account.primaryAccount.description": "يُستخدم الحساب الأساسي كالحساب الافتراضي للمعاملات الجديدة والميزات الأخرى.",
22+
"account.primaryAccount.notPrimary": "ليس حسابًا أساسيًا",
23+
"account.primaryAccount.set": "تعيين كالحساب الأساسي",
1924
"account.thisMonth": "هذا الشهر",
2025
"account.transactions": "المعاملات",
2126
"account.transactions.title": "المعاملات لـ \"{account}\"",
@@ -134,6 +139,7 @@
134139
"enum.TransactionEntryAction@inputTitle": "أدخل العنوان",
135140
"enum.TransactionEntryAction@selectAccount": "اختر الحساب",
136141
"enum.TransactionEntryAction@selectCategoryOrTransferAccount": "اختر الفئة أو حساب التحويل",
142+
"enum.TransactionEntryAction@selectPrimaryAccount": "اختر الحساب الأساسي",
137143
"enum.TransactionEntryAction@selectTags": "اختر الوسوم",
138144
"enum.TransactionFilterRangePreset@allTime": "كل الوقت",
139145
"enum.TransactionFilterRangePreset@last30Days": "آخر 30 يومًا",
@@ -321,7 +327,9 @@
321327
"preferences.transactionEntryFlow.abandonUponCancelForm": "إيقاف سير العملية عند إلغاء أي نموذج",
322328
"preferences.transactionEntryFlow.actions": "قائمة الإجراءات",
323329
"preferences.transactionEntryFlow.actions.description": "يمكنك السحب لإعادة ترتيبها",
324-
"preferences.transactionEntryFlow.description": "لتوفير الوقت، يساعدك Flow على فتح بعض النماذج تلقائيًا عند إنشاء معاملة.",
330+
"preferences.transactionEntryFlow.actions.lastItem": "يجب أن يكون العنصر الأخير",
331+
"preferences.transactionEntryFlow.description": "لتوفير الوقت، يساعدك Flow بفتح بعض النماذج تلقائيًا عند إنشاء معاملة. يمكنك تعطيل كل هذه الإدخالات إذا فضّلت فتح كل نموذج يدويًا.",
332+
"preferences.transactionEntryFlow.skipSelectedFields": "تخطي الحقول المحددة بالفعل",
325333
"preferences.transactions": "المعاملات",
326334
"preferences.transactions.geo": "موقع المعاملة",
327335
"preferences.transactions.geo.auto.description": "إرفاق موقعك الحالي تلقائيًا مع المعاملات الجديدة. حتى لو قمت بإيقاف هذه الخاصية، يمكنك اختيار موقع على الخريطة لإرفاقه.",
@@ -662,6 +670,12 @@
662670
"transactionFilterPreset.saveAsNew.guide": "لحفظ إعداد جديد، قم بتغيير الفلاتر ثم عد إلى هنا",
663671
"transactionFilterPreset.saveAsNew.name": "اسم الإعداد",
664672
"transactions.all": "كل المعاملات",
673+
"transactions.batch.assignAccountForAll": "تعيين حساب لجميع المعاملات",
674+
"transactions.batch.assignAccountIndividually": "تعيين حساب لكل معاملة على حدة",
675+
"transactions.batch.import": "استيراد دفعي",
676+
"transactions.batch.import.success": "تم استيراد {n} من المعاملات بنجاح",
677+
"transactions.batch.importN": "استيراد {n} من المعاملات",
678+
"transactions.batch.review": "يرجى مراجعة المعاملات",
665679
"transactions.count": "{} معاملة",
666680
"transactions.pending": "المعاملات المعلقة",
667681
"transactions.query.clearAll": "مسح الفلاتر",

assets/l10n/cs_CZ.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
"account.new": "Nový účet",
1717
"account.noAccounts": "Nemáte žádné účty!",
1818
"account.postTransactionBalance": "Zůstatek po transakci",
19+
"account.primaryAccount": "Hlavní účet",
20+
"account.primaryAccount.changeDescription": "Jako hlavní účet můžete nastavit jiný účet na stránce úprav daného účtu.",
21+
"account.primaryAccount.description": "Hlavní účet se používá jako výchozí účet pro nové transakce a další funkce.",
22+
"account.primaryAccount.notPrimary": "Není hlavní účet",
23+
"account.primaryAccount.set": "Nastavit jako hlavní účet",
1924
"account.thisMonth": "Tento měsíc",
2025
"account.transactions": "Transakce",
2126
"account.transactions.title": "Transakce účtu \"{account}\"",
@@ -134,6 +139,7 @@
134139
"enum.TransactionEntryAction@inputTitle": "Zadat název",
135140
"enum.TransactionEntryAction@selectAccount": "Vybrat účet",
136141
"enum.TransactionEntryAction@selectCategoryOrTransferAccount": "Vybrat kategorii / účet pro převod",
142+
"enum.TransactionEntryAction@selectPrimaryAccount": "Vybrat primární účet",
137143
"enum.TransactionEntryAction@selectTags": "Vybrat štítky",
138144
"enum.TransactionFilterRangePreset@allTime": "Vše",
139145
"enum.TransactionFilterRangePreset@last30Days": "Posledních 30 dní",
@@ -321,7 +327,9 @@
321327
"preferences.transactionEntryFlow.abandonUponCancelForm": "Zrušit celý postup při zrušení jakéhokoli kroku",
322328
"preferences.transactionEntryFlow.actions": "Seznam akcí",
323329
"preferences.transactionEntryFlow.actions.description": "Pořadí můžete změnit přetažením.",
324-
"preferences.transactionEntryFlow.description": "Pro úsporu času vám Flow pomáhá automatickým otevíráním formulářů při vytváření transakce.",
330+
"preferences.transactionEntryFlow.actions.lastItem": "Musí být poslední",
331+
"preferences.transactionEntryFlow.description": "Pro úsporu času vám Flow pomáhá tím, že při vytváření transakce automaticky otevírá některé formuláře. Pokud dáváte přednost ručnímu otevírání každého formuláře, můžete všechna automatická otevření vypnout.",
332+
"preferences.transactionEntryFlow.skipSelectedFields": "Přeskočit již vybraná pole",
325333
"preferences.transactions": "Transakce",
326334
"preferences.transactions.geo": "Poloha transakce",
327335
"preferences.transactions.geo.auto.description": "Automaticky připojit vaši aktuální polohu k novým transakcím. I když je tato možnost vypnutá, stále můžete ručně vybrat místo na mapě.",
@@ -662,6 +670,12 @@
662670
"transactionFilterPreset.saveAsNew.guide": "Chcete-li uložit novou předvolbu, změňte filtry a vraťte se sem.",
663671
"transactionFilterPreset.saveAsNew.name": "Název předvolby",
664672
"transactions.all": "Všechny transakce",
673+
"transactions.batch.assignAccountForAll": "Přiřadit účet všem",
674+
"transactions.batch.assignAccountIndividually": "Přiřadit účty jednotlivě",
675+
"transactions.batch.import": "Hromadný import",
676+
"transactions.batch.import.success": "Úspěšně importováno {n} transakcí",
677+
"transactions.batch.importN": "Importovat {n} transakcí",
678+
"transactions.batch.review": "Prosím zkontrolujte transakce",
665679
"transactions.count": "{count} transakcí",
666680
"transactions.pending": "Čekající transakce",
667681
"transactions.query.clearAll": "Vymazat filtry",

assets/l10n/de_DE.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
"account.new": "Konto hinzufügen",
1717
"account.noAccounts": "Du hast keine Konten!",
1818
"account.postTransactionBalance": "Kontostand nach dieser Buchung",
19+
"account.primaryAccount": "Hauptkonto",
20+
"account.primaryAccount.changeDescription": "Sie können ein anderes Konto als Hauptkonto festlegen, indem Sie zur Bearbeitungsseite dieses Kontos gehen.",
21+
"account.primaryAccount.description": "Das Hauptkonto wird als Standardkonto für neue Transaktionen und andere Funktionen verwendet.",
22+
"account.primaryAccount.notPrimary": "Nicht primäres Konto",
23+
"account.primaryAccount.set": "Als Hauptkonto festlegen",
1924
"account.thisMonth": "Dieser Monat",
2025
"account.transactions": "Buchungen",
2126
"account.transactions.title": "Buchungen von „{account}“",
@@ -134,6 +139,7 @@
134139
"enum.TransactionEntryAction@inputTitle": "Titel eingeben",
135140
"enum.TransactionEntryAction@selectAccount": "Konto auswählen",
136141
"enum.TransactionEntryAction@selectCategoryOrTransferAccount": "Kategorie/Transferkonto auswählen",
142+
"enum.TransactionEntryAction@selectPrimaryAccount": "Primärkonto auswählen",
137143
"enum.TransactionEntryAction@selectTags": "Tags auswählen",
138144
"enum.TransactionFilterRangePreset@allTime": "Gesamter Zeitraum",
139145
"enum.TransactionFilterRangePreset@last30Days": "Letzte 30 Tage",
@@ -321,7 +327,9 @@
321327
"preferences.transactionEntryFlow.abandonUponCancelForm": "Ablauf beenden, wenn eines der Formulare abgebrochen wird",
322328
"preferences.transactionEntryFlow.actions": "Liste der Aktionen",
323329
"preferences.transactionEntryFlow.actions.description": "Du kannst sie durch Ziehen neu anordnen",
324-
"preferences.transactionEntryFlow.description": "Um Zeit zu sparen, öffnet Flow beim Erstellen einer Transaktion automatisch einige Formulare.",
330+
"preferences.transactionEntryFlow.actions.lastItem": "Muss das letzte Element sein",
331+
"preferences.transactionEntryFlow.description": "Um Zeit zu sparen öffnet Flow beim Erstellen einer Transaktion automatisch einige Formulare. Sie können alle automatischen Einträge deaktivieren, wenn Sie die Formulare lieber manuell öffnen möchten.",
332+
"preferences.transactionEntryFlow.skipSelectedFields": "Bereits ausgewählte Felder überspringen",
325333
"preferences.transactions": "Buchungen",
326334
"preferences.transactions.geo": "Standort der Buchung",
327335
"preferences.transactions.geo.auto.description": "Dein aktueller Standort wird automatisch zu neuen Buchungen hinzugefügt. Auch wenn das ausgeschaltet ist, kannst du immer noch einen Ort auf der Karte auswählen und hinzufügen.",
@@ -662,6 +670,12 @@
662670
"transactionFilterPreset.saveAsNew.guide": "Um eine neue Voreinstellung zu speichern, ändere die Filter und komm hierher zurück.",
663671
"transactionFilterPreset.saveAsNew.name": "Name der Voreinstellung",
664672
"transactions.all": "Alle Buchungen",
673+
"transactions.batch.assignAccountForAll": "Konten für alle zuweisen",
674+
"transactions.batch.assignAccountIndividually": "Konten einzeln zuweisen",
675+
"transactions.batch.import": "Stapelimport",
676+
"transactions.batch.import.success": "Erfolgreich {n} Transaktionen importiert",
677+
"transactions.batch.importN": "{n} Transaktionen importieren",
678+
"transactions.batch.review": "Bitte überprüfen Sie die Transaktionen",
665679
"transactions.count": "{} Buchungen",
666680
"transactions.pending": "Ausstehende Buchungen",
667681
"transactions.query.clearAll": "Filter löschen",

assets/l10n/en.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
"account.new": "Add an account",
1717
"account.noAccounts": "You don't have any accounts!",
1818
"account.postTransactionBalance": "Balance after this transaction",
19+
"account.primaryAccount": "Primary Account",
20+
"account.primaryAccount.changeDescription": "You can set another account as primary by going to that account's edit page.",
21+
"account.primaryAccount.description": "The primary account is used as the default account for new transactions and other features.",
22+
"account.primaryAccount.notPrimary": "Not Primary Account",
23+
"account.primaryAccount.set": "Set as Primary Account",
1924
"account.thisMonth": "This month",
2025
"account.transactions": "Transactions",
2126
"account.transactions.title": "\"{account}\" transactions",
@@ -134,6 +139,7 @@
134139
"enum.TransactionEntryAction@inputTitle": "Enter title",
135140
"enum.TransactionEntryAction@selectAccount": "Select account",
136141
"enum.TransactionEntryAction@selectCategoryOrTransferAccount": "Select category/transfer account",
142+
"enum.TransactionEntryAction@selectPrimaryAccount": "Select primary account",
137143
"enum.TransactionEntryAction@selectTags": "Select tags",
138144
"enum.TransactionFilterRangePreset@allTime": "All time",
139145
"enum.TransactionFilterRangePreset@last30Days": "Last 30 days",
@@ -321,7 +327,9 @@
321327
"preferences.transactionEntryFlow.abandonUponCancelForm": "Stop flow when any one of the forms is dismissed",
322328
"preferences.transactionEntryFlow.actions": "List of actions",
323329
"preferences.transactionEntryFlow.actions.description": "You can drag to reorder them",
324-
"preferences.transactionEntryFlow.description": "To save time, Flow helps you by automatically opening some of the forms when creating a transaction.",
330+
"preferences.transactionEntryFlow.actions.lastItem": "Must be last",
331+
"preferences.transactionEntryFlow.description": "To save time, Flow helps you by automatically opening some of the forms when creating a transaction. You can disable all of the entries if you prefer to manually open each form.",
332+
"preferences.transactionEntryFlow.skipSelectedFields": "Skip already selected fields",
325333
"preferences.transactions": "Transactions",
326334
"preferences.transactions.geo": "Transaction location",
327335
"preferences.transactions.geo.auto.description": "Automatically attach your current location to new transactions. Even if you have this turned off, you can still choose a location on a map to attach it.",
@@ -662,6 +670,12 @@
662670
"transactionFilterPreset.saveAsNew.guide": "To save a new preset, change the filters, and come back here",
663671
"transactionFilterPreset.saveAsNew.name": "Preset name",
664672
"transactions.all": "All transactions",
673+
"transactions.batch.assignAccountForAll": "Assign accounts for all",
674+
"transactions.batch.assignAccountIndividually": "Assign accounts individually",
675+
"transactions.batch.import": "Batch import",
676+
"transactions.batch.import.success": "Successfully imported {n} transactions",
677+
"transactions.batch.importN": "Import {n} transactions",
678+
"transactions.batch.review": "Please review the transactions",
665679
"transactions.count": "{} transactions",
666680
"transactions.pending": "Pending transactions",
667681
"transactions.query.clearAll": "Clear filters",

assets/l10n/es_ES.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
"account.new": "Añadir una cuenta",
1717
"account.noAccounts": "¡No tienes ninguna cuenta!",
1818
"account.postTransactionBalance": "Saldo después de esta transacción",
19+
"account.primaryAccount": "Cuenta principal",
20+
"account.primaryAccount.changeDescription": "Puedes establecer otra cuenta como principal yendo a la página de edición de esa cuenta.",
21+
"account.primaryAccount.description": "La cuenta principal se utiliza como cuenta predeterminada para nuevas transacciones y otras funciones.",
22+
"account.primaryAccount.notPrimary": "No es la cuenta principal",
23+
"account.primaryAccount.set": "Establecer como cuenta principal",
1924
"account.thisMonth": "Este mes",
2025
"account.transactions": "Transacciones",
2126
"account.transactions.title": "Transacciones de \"{account}\"",
@@ -134,6 +139,7 @@
134139
"enum.TransactionEntryAction@inputTitle": "Introducir título",
135140
"enum.TransactionEntryAction@selectAccount": "Seleccionar cuenta",
136141
"enum.TransactionEntryAction@selectCategoryOrTransferAccount": "Seleccionar categoría o cuenta de transferencia",
142+
"enum.TransactionEntryAction@selectPrimaryAccount": "Seleccionar cuenta principal",
137143
"enum.TransactionEntryAction@selectTags": "Seleccionar etiquetas",
138144
"enum.TransactionFilterRangePreset@allTime": "Desde siempre",
139145
"enum.TransactionFilterRangePreset@last30Days": "Últimos 30 días",
@@ -321,7 +327,9 @@
321327
"preferences.transactionEntryFlow.abandonUponCancelForm": "Detener el flujo si se cierra cualquiera de los formularios",
322328
"preferences.transactionEntryFlow.actions": "Lista de acciones",
323329
"preferences.transactionEntryFlow.actions.description": "Puedes arrastrarlas para reordenarlas",
324-
"preferences.transactionEntryFlow.description": "Para ahorrar tiempo, Flow te ayuda abriendo automáticamente algunos formularios al crear una transacción.",
330+
"preferences.transactionEntryFlow.actions.lastItem": "Debe ser el último",
331+
"preferences.transactionEntryFlow.description": "Para ahorrar tiempo, Flow te ayuda abriendo automáticamente algunos formularios al crear una transacción. Puedes desactivar todas las entradas si prefieres abrir manualmente cada formulario.",
332+
"preferences.transactionEntryFlow.skipSelectedFields": "Omitir campos ya seleccionados",
325333
"preferences.transactions": "Transacciones",
326334
"preferences.transactions.geo": "Ubicación de la transacción",
327335
"preferences.transactions.geo.auto.description": "Adjuntar automáticamente tu ubicación actual a nuevas transacciones. Incluso si lo tienes desactivado, puedes elegir una ubicación en un mapa para adjuntarla.",
@@ -662,6 +670,12 @@
662670
"transactionFilterPreset.saveAsNew.guide": "Para guardar un nuevo preajuste, cambia los filtros y vuelve aquí",
663671
"transactionFilterPreset.saveAsNew.name": "Nombre del preajuste",
664672
"transactions.all": "Todas las transacciones",
673+
"transactions.batch.assignAccountForAll": "Asignar cuentas para todas las transacciones",
674+
"transactions.batch.assignAccountIndividually": "Asignar cuentas individualmente",
675+
"transactions.batch.import": "Importación masiva",
676+
"transactions.batch.import.success": "Se han importado correctamente {n} transacciones",
677+
"transactions.batch.importN": "Importar {n} transacciones",
678+
"transactions.batch.review": "Por favor, revise las transacciones",
665679
"transactions.count": "{} transacciones",
666680
"transactions.pending": "Transacciones pendientes",
667681
"transactions.query.clearAll": "Borrar filtros",

0 commit comments

Comments
 (0)