Loading poolpay/fints/__init__.py 0 → 100644 +3 −0 Changes for poolpay/fints/__init__.py: 3 added lines, 0 removed lines. Original line number Diff line number Diff line """ Connect to a bank account using FinTS """ poolpay/fints/__main__.py 0 → 100644 +41 −0 Changes for poolpay/fints/__main__.py: 41 added lines, 0 removed lines. Original line number Diff line number Diff line import getpass from pathlib import Path from typing import Annotated import typer from poolpay import db, paths from poolpay.model.BankAccount import BankAccount app = typer.Typer() def _guess_db_path() -> Path: # By default, we use a dedicated path for the database containing FinTS data, as in the common deployment, # we run two separate instances of the software for that fints_db_path = paths.instance_dir / "poolpay.fints.db" # Only if that doesn't exist, we fall back to the generic database location return fints_db_path if fints_db_path.exists() else paths.db_file @app.command() def sync( db_path: Annotated[ Path | None, typer.Option(help="Path to the database file (guessed by default)") ] = None, ) -> None: """ Download transactions for all nw bank accounts and store them in the database. """ try: db.open(db_path or _guess_db_path()) for bank_account in BankAccount.get_all(): password = getpass.getpass(f"Password for {bank_account.user}: ") bank_account.sync(password) finally: db.close() if __name__ == "__main__": app() pyproject.toml +1 −0 Changes for pyproject.toml: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ dependencies = [ "schwifty>=2026.3.0", "sqlalchemy~=2.0.38", "textual~=3.1.0", "typer>=0.26.7", ] [tool.ruff.lint] Loading uv.lock +44 −0 Changes for uv.lock: 44 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -2,6 +2,15 @@ version = 1 revision = 3 requires-python = ">=3.12" [[package]] name = "annotated-doc" version = "0.0.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, ] [[package]] name = "babel" version = "2.17.0" Loading Loading @@ -105,6 +114,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] [[package]] name = "elementpath" version = "5.1.2" Loading Loading @@ -417,6 +435,7 @@ dependencies = [ { name = "schwifty" }, { name = "sqlalchemy" }, { name = "textual" }, { name = "typer" }, ] [package.metadata] Loading @@ -431,6 +450,7 @@ requires-dist = [ { name = "schwifty", specifier = ">=2026.3.0" }, { name = "sqlalchemy", specifier = "~=2.0.38" }, { name = "textual", specifier = "~=3.1.0" }, { name = "typer", specifier = ">=0.26.7" }, ] [[package]] Loading Loading @@ -554,6 +574,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1d/06/7128b1dee5d616587b5e83597d1e6a651c56668820c3b8f2d7e870c1ae76/sepaxml-2.7.0-py3-none-any.whl", hash = "sha256:6644f695c66c2bf8f49065d4d7b0814da42140d03292131ec08e09798ad07b5d", size = 60537, upload-time = "2025-09-02T12:28:14.702Z" }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, ] [[package]] name = "spidev" version = "3.8" Loading Loading @@ -625,6 +654,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8d/a7/802690234cdbdf99020c7c55512b5cea8344b6578a40b19f2f863c659867/textual-3.1.1-py3-none-any.whl", hash = "sha256:623fa18be75f8acba6c8d5aca019ff894a9614de8c456574ba53a728c6c44dad", size = 683838, upload-time = "2025-04-22T11:32:46.784Z" }, ] [[package]] name = "typer" version = "0.26.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "rich" }, { name = "shellingham" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5e/ed/ef06584ccdd5c410df0837951ecd7e15d9a6144ea1bd4c73cecab1a89891/typer-0.26.7.tar.gz", hash = "sha256:e314a34c617e419c091b2830dda3ea1f257134ff593061a8f5b9717ab8dddb3a", size = 201709, upload-time = "2026-06-03T07:18:06.843Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/24/25/2201973529af2c954de0bb725323c3aaed6d7f0ceee8f550dec9185df013/typer-0.26.7-py3-none-any.whl", hash = "sha256:5c87cfbc5d34491c5346ebf49c23e18d56ccb863268d3a8d592b26087c2f5e58", size = 122456, upload-time = "2026-06-03T07:18:05.732Z" }, ] [[package]] name = "typing-extensions" version = "4.15.0" Loading Loading
poolpay/fints/__init__.py 0 → 100644 +3 −0 Changes for poolpay/fints/__init__.py: 3 added lines, 0 removed lines. Original line number Diff line number Diff line """ Connect to a bank account using FinTS """
poolpay/fints/__main__.py 0 → 100644 +41 −0 Changes for poolpay/fints/__main__.py: 41 added lines, 0 removed lines. Original line number Diff line number Diff line import getpass from pathlib import Path from typing import Annotated import typer from poolpay import db, paths from poolpay.model.BankAccount import BankAccount app = typer.Typer() def _guess_db_path() -> Path: # By default, we use a dedicated path for the database containing FinTS data, as in the common deployment, # we run two separate instances of the software for that fints_db_path = paths.instance_dir / "poolpay.fints.db" # Only if that doesn't exist, we fall back to the generic database location return fints_db_path if fints_db_path.exists() else paths.db_file @app.command() def sync( db_path: Annotated[ Path | None, typer.Option(help="Path to the database file (guessed by default)") ] = None, ) -> None: """ Download transactions for all nw bank accounts and store them in the database. """ try: db.open(db_path or _guess_db_path()) for bank_account in BankAccount.get_all(): password = getpass.getpass(f"Password for {bank_account.user}: ") bank_account.sync(password) finally: db.close() if __name__ == "__main__": app()
pyproject.toml +1 −0 Changes for pyproject.toml: 1 added line, 0 removed lines. Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ dependencies = [ "schwifty>=2026.3.0", "sqlalchemy~=2.0.38", "textual~=3.1.0", "typer>=0.26.7", ] [tool.ruff.lint] Loading
uv.lock +44 −0 Changes for uv.lock: 44 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -2,6 +2,15 @@ version = 1 revision = 3 requires-python = ">=3.12" [[package]] name = "annotated-doc" version = "0.0.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, ] [[package]] name = "babel" version = "2.17.0" Loading Loading @@ -105,6 +114,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] [[package]] name = "elementpath" version = "5.1.2" Loading Loading @@ -417,6 +435,7 @@ dependencies = [ { name = "schwifty" }, { name = "sqlalchemy" }, { name = "textual" }, { name = "typer" }, ] [package.metadata] Loading @@ -431,6 +450,7 @@ requires-dist = [ { name = "schwifty", specifier = ">=2026.3.0" }, { name = "sqlalchemy", specifier = "~=2.0.38" }, { name = "textual", specifier = "~=3.1.0" }, { name = "typer", specifier = ">=0.26.7" }, ] [[package]] Loading Loading @@ -554,6 +574,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1d/06/7128b1dee5d616587b5e83597d1e6a651c56668820c3b8f2d7e870c1ae76/sepaxml-2.7.0-py3-none-any.whl", hash = "sha256:6644f695c66c2bf8f49065d4d7b0814da42140d03292131ec08e09798ad07b5d", size = 60537, upload-time = "2025-09-02T12:28:14.702Z" }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, ] [[package]] name = "spidev" version = "3.8" Loading Loading @@ -625,6 +654,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8d/a7/802690234cdbdf99020c7c55512b5cea8344b6578a40b19f2f863c659867/textual-3.1.1-py3-none-any.whl", hash = "sha256:623fa18be75f8acba6c8d5aca019ff894a9614de8c456574ba53a728c6c44dad", size = 683838, upload-time = "2025-04-22T11:32:46.784Z" }, ] [[package]] name = "typer" version = "0.26.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "rich" }, { name = "shellingham" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5e/ed/ef06584ccdd5c410df0837951ecd7e15d9a6144ea1bd4c73cecab1a89891/typer-0.26.7.tar.gz", hash = "sha256:e314a34c617e419c091b2830dda3ea1f257134ff593061a8f5b9717ab8dddb3a", size = 201709, upload-time = "2026-06-03T07:18:06.843Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/24/25/2201973529af2c954de0bb725323c3aaed6d7f0ceee8f550dec9185df013/typer-0.26.7-py3-none-any.whl", hash = "sha256:5c87cfbc5d34491c5346ebf49c23e18d56ccb863268d3a8d592b26087c2f5e58", size = 122456, upload-time = "2026-06-03T07:18:05.732Z" }, ] [[package]] name = "typing-extensions" version = "4.15.0" Loading