refactor: make compatibility exports ruff clean

This commit is contained in:
Jarca
2026-07-07 23:27:19 +09:00
parent 2ccfc9c064
commit 7c420e498f
38 changed files with 641 additions and 234 deletions
+4 -1
View File
@@ -1 +1,4 @@
from .server import main, mcp
from .server import main as main
from .server import mcp as mcp
__all__ = ["main", "mcp"]
+117 -56
View File
@@ -1,60 +1,121 @@
from __future__ import annotations
from ...service import (
apply_categorization_rules,
close_asset_snapshot,
create_category_rule,
create_ledger_account,
create_ledger_backup,
create_ledger_budget,
create_ledger_category,
create_ledger_transaction,
create_manual_asset,
deactivate_manual_asset,
delete_category_rule,
delete_ledger_category,
delete_ledger_transaction,
get_asset_liquidity_report,
get_asset_snapshot_report,
get_balance_reconciliation_report,
get_budget_vs_actual_report,
get_category_spending_report,
get_fixed_cost_report,
get_investable_cashflow_report,
get_ledger_backup_status,
get_ledger_db_status,
get_monthly_cashflow_report,
get_net_worth_timeseries,
health_check,
import_kb_bank_pdf,
import_seoulpay_xlsx,
import_toss_bank_pdf,
import_toss_securities_pdf,
list_category_rules,
list_cross_transfer_review_queue,
list_ledger_accounts,
list_ledger_backups,
list_ledger_budgets,
list_ledger_categories,
list_ledger_import_batches,
list_ledger_transactions,
list_manual_assets,
list_uncategorized_transactions,
preview_asset_snapshot_close,
preview_categorization,
preview_cross_account_transfers,
preview_kb_bank_pdf_import,
preview_ledger_csv_import,
preview_seoulpay_xlsx_import,
preview_toss_bank_pdf_import,
preview_toss_securities_pdf_import,
rollback_ledger_import_batch,
run_cross_account_transfer_match,
seed_default_category_rules,
seed_default_ledger_categories,
update_category_rule,
update_ledger_account,
update_ledger_transaction,
update_manual_asset,
get_uncategorized_merchant_summary,
annotations as annotations,
apply_categorization_rules as apply_categorization_rules,
close_asset_snapshot as close_asset_snapshot,
create_category_rule as create_category_rule,
create_ledger_account as create_ledger_account,
create_ledger_backup as create_ledger_backup,
create_ledger_budget as create_ledger_budget,
create_ledger_category as create_ledger_category,
create_ledger_transaction as create_ledger_transaction,
create_manual_asset as create_manual_asset,
deactivate_manual_asset as deactivate_manual_asset,
delete_category_rule as delete_category_rule,
delete_ledger_category as delete_ledger_category,
delete_ledger_transaction as delete_ledger_transaction,
get_asset_liquidity_report as get_asset_liquidity_report,
get_asset_snapshot_report as get_asset_snapshot_report,
get_balance_reconciliation_report as get_balance_reconciliation_report,
get_budget_vs_actual_report as get_budget_vs_actual_report,
get_category_spending_report as get_category_spending_report,
get_fixed_cost_report as get_fixed_cost_report,
get_investable_cashflow_report as get_investable_cashflow_report,
get_ledger_backup_status as get_ledger_backup_status,
get_ledger_db_status as get_ledger_db_status,
get_monthly_cashflow_report as get_monthly_cashflow_report,
get_net_worth_timeseries as get_net_worth_timeseries,
get_uncategorized_merchant_summary as get_uncategorized_merchant_summary,
health_check as health_check,
import_kb_bank_pdf as import_kb_bank_pdf,
import_seoulpay_xlsx as import_seoulpay_xlsx,
import_toss_bank_pdf as import_toss_bank_pdf,
import_toss_securities_pdf as import_toss_securities_pdf,
list_category_rules as list_category_rules,
list_cross_transfer_review_queue as list_cross_transfer_review_queue,
list_ledger_accounts as list_ledger_accounts,
list_ledger_backups as list_ledger_backups,
list_ledger_budgets as list_ledger_budgets,
list_ledger_categories as list_ledger_categories,
list_ledger_import_batches as list_ledger_import_batches,
list_ledger_transactions as list_ledger_transactions,
list_manual_assets as list_manual_assets,
list_uncategorized_transactions as list_uncategorized_transactions,
preview_asset_snapshot_close as preview_asset_snapshot_close,
preview_categorization as preview_categorization,
preview_cross_account_transfers as preview_cross_account_transfers,
preview_kb_bank_pdf_import as preview_kb_bank_pdf_import,
preview_ledger_csv_import as preview_ledger_csv_import,
preview_seoulpay_xlsx_import as preview_seoulpay_xlsx_import,
preview_toss_bank_pdf_import as preview_toss_bank_pdf_import,
preview_toss_securities_pdf_import as preview_toss_securities_pdf_import,
rollback_ledger_import_batch as rollback_ledger_import_batch,
run_cross_account_transfer_match as run_cross_account_transfer_match,
seed_default_category_rules as seed_default_category_rules,
seed_default_ledger_categories as seed_default_ledger_categories,
update_category_rule as update_category_rule,
update_ledger_account as update_ledger_account,
update_ledger_transaction as update_ledger_transaction,
update_manual_asset as update_manual_asset,
)
__all__ = [
"annotations",
"apply_categorization_rules",
"close_asset_snapshot",
"create_category_rule",
"create_ledger_account",
"create_ledger_backup",
"create_ledger_budget",
"create_ledger_category",
"create_ledger_transaction",
"create_manual_asset",
"deactivate_manual_asset",
"delete_category_rule",
"delete_ledger_category",
"delete_ledger_transaction",
"get_asset_liquidity_report",
"get_asset_snapshot_report",
"get_balance_reconciliation_report",
"get_budget_vs_actual_report",
"get_category_spending_report",
"get_fixed_cost_report",
"get_investable_cashflow_report",
"get_ledger_backup_status",
"get_ledger_db_status",
"get_monthly_cashflow_report",
"get_net_worth_timeseries",
"get_uncategorized_merchant_summary",
"health_check",
"import_kb_bank_pdf",
"import_seoulpay_xlsx",
"import_toss_bank_pdf",
"import_toss_securities_pdf",
"list_category_rules",
"list_cross_transfer_review_queue",
"list_ledger_accounts",
"list_ledger_backups",
"list_ledger_budgets",
"list_ledger_categories",
"list_ledger_import_batches",
"list_ledger_transactions",
"list_manual_assets",
"list_uncategorized_transactions",
"preview_asset_snapshot_close",
"preview_categorization",
"preview_cross_account_transfers",
"preview_kb_bank_pdf_import",
"preview_ledger_csv_import",
"preview_seoulpay_xlsx_import",
"preview_toss_bank_pdf_import",
"preview_toss_securities_pdf_import",
"rollback_ledger_import_batch",
"run_cross_account_transfer_match",
"seed_default_category_rules",
"seed_default_ledger_categories",
"update_category_rule",
"update_ledger_account",
"update_ledger_transaction",
"update_manual_asset",
]
+21 -11
View File
@@ -1,11 +1,21 @@
from . import (
accounts_gateway,
assets_gateway,
categorization_gateway,
imports_gateway,
overview_gateway,
reconciliation_gateway,
service_gateway,
transactions_gateway,
transfers_gateway,
)
from . import accounts_gateway as accounts_gateway
from . import assets_gateway as assets_gateway
from . import categorization_gateway as categorization_gateway
from . import imports_gateway as imports_gateway
from . import overview_gateway as overview_gateway
from . import reconciliation_gateway as reconciliation_gateway
from . import service_gateway as service_gateway
from . import transactions_gateway as transactions_gateway
from . import transfers_gateway as transfers_gateway
__all__ = [
"accounts_gateway",
"assets_gateway",
"categorization_gateway",
"imports_gateway",
"overview_gateway",
"reconciliation_gateway",
"service_gateway",
"transactions_gateway",
"transfers_gateway",
]
@@ -1,6 +1,11 @@
from __future__ import annotations
from ...service import (
list_ledger_accounts,
update_ledger_account,
list_ledger_accounts as list_ledger_accounts,
update_ledger_account as update_ledger_account,
)
__all__ = [
"list_ledger_accounts",
"update_ledger_account",
]
@@ -1,10 +1,19 @@
from __future__ import annotations
from ...service import (
close_asset_snapshot,
create_manual_asset,
deactivate_manual_asset,
list_manual_assets,
preview_asset_snapshot_close,
update_manual_asset,
close_asset_snapshot as close_asset_snapshot,
create_manual_asset as create_manual_asset,
deactivate_manual_asset as deactivate_manual_asset,
list_manual_assets as list_manual_assets,
preview_asset_snapshot_close as preview_asset_snapshot_close,
update_manual_asset as update_manual_asset,
)
__all__ = [
"close_asset_snapshot",
"create_manual_asset",
"deactivate_manual_asset",
"list_manual_assets",
"preview_asset_snapshot_close",
"update_manual_asset",
]
@@ -1,20 +1,39 @@
from __future__ import annotations
from ...service import (
apply_categorization_rules,
apply_category_rule,
apply_uncategorized_group_recommendation,
apply_uncategorized_recommendation,
create_category_rule,
create_ledger_category,
delete_ledger_category,
get_uncategorized_merchant_summary,
get_uncategorized_workbench,
list_category_rules,
list_ledger_categories,
list_uncategorized_transactions,
preview_categorization,
preview_category_rule_matches,
seed_default_category_rules,
seed_default_ledger_categories,
apply_categorization_rules as apply_categorization_rules,
apply_category_rule as apply_category_rule,
apply_uncategorized_group_recommendation as apply_uncategorized_group_recommendation,
apply_uncategorized_recommendation as apply_uncategorized_recommendation,
create_category_rule as create_category_rule,
create_ledger_category as create_ledger_category,
delete_ledger_category as delete_ledger_category,
get_uncategorized_merchant_summary as get_uncategorized_merchant_summary,
get_uncategorized_workbench as get_uncategorized_workbench,
list_category_rules as list_category_rules,
list_ledger_categories as list_ledger_categories,
list_uncategorized_transactions as list_uncategorized_transactions,
preview_categorization as preview_categorization,
preview_category_rule_matches as preview_category_rule_matches,
seed_default_category_rules as seed_default_category_rules,
seed_default_ledger_categories as seed_default_ledger_categories,
)
__all__ = [
"apply_categorization_rules",
"apply_category_rule",
"apply_uncategorized_group_recommendation",
"apply_uncategorized_recommendation",
"create_category_rule",
"create_ledger_category",
"delete_ledger_category",
"get_uncategorized_merchant_summary",
"get_uncategorized_workbench",
"list_category_rules",
"list_ledger_categories",
"list_uncategorized_transactions",
"preview_categorization",
"preview_category_rule_matches",
"seed_default_category_rules",
"seed_default_ledger_categories",
]
@@ -1,10 +1,19 @@
from __future__ import annotations
from ...service import (
import_toss_bank_pdf,
import_toss_securities_pdf,
list_ledger_import_batches,
preview_toss_bank_pdf_import,
preview_toss_securities_pdf_import,
rollback_ledger_import_batch,
import_toss_bank_pdf as import_toss_bank_pdf,
import_toss_securities_pdf as import_toss_securities_pdf,
list_ledger_import_batches as list_ledger_import_batches,
preview_toss_bank_pdf_import as preview_toss_bank_pdf_import,
preview_toss_securities_pdf_import as preview_toss_securities_pdf_import,
rollback_ledger_import_batch as rollback_ledger_import_batch,
)
__all__ = [
"import_toss_bank_pdf",
"import_toss_securities_pdf",
"list_ledger_import_batches",
"preview_toss_bank_pdf_import",
"preview_toss_securities_pdf_import",
"rollback_ledger_import_batch",
]
@@ -1,13 +1,25 @@
from __future__ import annotations
from ...service import (
get_asset_liquidity_report,
get_balance_reconciliation_report,
get_budget_vs_actual_report,
get_monthly_cashflow_report,
health_check,
list_cross_transfer_review_queue,
list_ledger_backups,
list_ledger_import_batches,
list_uncategorized_transactions,
get_asset_liquidity_report as get_asset_liquidity_report,
get_balance_reconciliation_report as get_balance_reconciliation_report,
get_budget_vs_actual_report as get_budget_vs_actual_report,
get_monthly_cashflow_report as get_monthly_cashflow_report,
health_check as health_check,
list_cross_transfer_review_queue as list_cross_transfer_review_queue,
list_ledger_backups as list_ledger_backups,
list_ledger_import_batches as list_ledger_import_batches,
list_uncategorized_transactions as list_uncategorized_transactions,
)
__all__ = [
"get_asset_liquidity_report",
"get_balance_reconciliation_report",
"get_budget_vs_actual_report",
"get_monthly_cashflow_report",
"health_check",
"list_cross_transfer_review_queue",
"list_ledger_backups",
"list_ledger_import_batches",
"list_uncategorized_transactions",
]
@@ -1,3 +1,7 @@
from __future__ import annotations
from ...service import get_balance_reconciliation_report
from ...service import get_balance_reconciliation_report as get_balance_reconciliation_report
__all__ = [
"get_balance_reconciliation_report",
]
@@ -1,10 +1,28 @@
from __future__ import annotations
from .accounts_gateway import *
from .assets_gateway import *
from .categorization_gateway import *
from .imports_gateway import *
from .overview_gateway import *
from .reconciliation_gateway import *
from .transactions_gateway import *
from .transfers_gateway import *
from . import accounts_gateway as _accounts_gateway
from . import assets_gateway as _assets_gateway
from . import categorization_gateway as _categorization_gateway
from . import imports_gateway as _imports_gateway
from . import overview_gateway as _overview_gateway
from . import reconciliation_gateway as _reconciliation_gateway
from . import transactions_gateway as _transactions_gateway
from . import transfers_gateway as _transfers_gateway
_GATEWAY_MODULES = (
_accounts_gateway,
_assets_gateway,
_categorization_gateway,
_imports_gateway,
_overview_gateway,
_reconciliation_gateway,
_transactions_gateway,
_transfers_gateway,
)
__all__: list[str] = []
for _module in _GATEWAY_MODULES:
for _name in getattr(_module, "__all__", []):
globals().setdefault(_name, getattr(_module, _name))
if _name not in __all__:
__all__.append(_name)
@@ -1,3 +1,7 @@
from __future__ import annotations
from ...service import update_ledger_transaction
from ...service import update_ledger_transaction as update_ledger_transaction
__all__ = [
"update_ledger_transaction",
]
@@ -1,11 +1,21 @@
from __future__ import annotations
from ...service import (
find_cancel_original_candidates,
find_self_transfer_candidates,
link_cancel_to_original,
link_self_transfer_pair,
list_cross_transfer_review_queue,
preview_cross_account_transfers,
run_cross_account_transfer_match,
find_cancel_original_candidates as find_cancel_original_candidates,
find_self_transfer_candidates as find_self_transfer_candidates,
link_cancel_to_original as link_cancel_to_original,
link_self_transfer_pair as link_self_transfer_pair,
list_cross_transfer_review_queue as list_cross_transfer_review_queue,
preview_cross_account_transfers as preview_cross_account_transfers,
run_cross_account_transfer_match as run_cross_account_transfer_match,
)
__all__ = [
"find_cancel_original_candidates",
"find_self_transfer_candidates",
"link_cancel_to_original",
"link_self_transfer_pair",
"list_cross_transfer_review_queue",
"preview_cross_account_transfers",
"run_cross_account_transfer_match",
]
+44 -15
View File
@@ -1,15 +1,44 @@
from . import shared
from .accounts_write_services import *
from .asset_account_services import *
from .assets_service import *
from .budgets_write_services import *
from .category_rules_write_services import *
from .categorization_services import *
from .cross_transfer_service import *
from .imports_service import *
from .import_transfer_services import *
from .reconciliation_service import *
from .system_services import *
from .transactions_write_services import *
from .transaction_report_services import *
from .uncategorized_workbench_service import *
from __future__ import annotations
from . import accounts_write_services as _accounts_write_services
from . import asset_account_services as _asset_account_services
from . import assets_service as _assets_service
from . import budgets_write_services as _budgets_write_services
from . import category_rules_write_services as _category_rules_write_services
from . import categorization_services as _categorization_services
from . import cross_transfer_service as _cross_transfer_service
from . import imports_service as _imports_service
from . import import_transfer_services as _import_transfer_services
from . import reconciliation_service as _reconciliation_service
from . import shared as shared
from . import system_services as _system_services
from . import transactions_write_services as _transactions_write_services
from . import transaction_report_services as _transaction_report_services
from . import uncategorized_workbench_service as _uncategorized_workbench_service
_EXPORT_MODULES = (
shared,
_accounts_write_services,
_asset_account_services,
_assets_service,
_budgets_write_services,
_category_rules_write_services,
_categorization_services,
_cross_transfer_service,
_imports_service,
_import_transfer_services,
_reconciliation_service,
_system_services,
_transactions_write_services,
_transaction_report_services,
_uncategorized_workbench_service,
)
__all__: list[str] = ["shared"]
for _module in _EXPORT_MODULES:
for _name in dir(_module):
if _name.startswith("_"):
continue
globals().setdefault(_name, getattr(_module, _name))
if _name not in __all__:
__all__.append(_name)
@@ -1,6 +1,17 @@
from __future__ import annotations
from .shared import *
from .shared import (
Any,
VALID_ACCOUNT_TYPES,
db,
fail,
new_id,
normalize_liquidity_bucket,
normalize_statement_status,
now_iso,
ok,
row_to_dict,
)
def create_ledger_account(name: str, type: str = "bank", institution: str = "", currency: str = "KRW", active: bool = True, memo: str = "", account_number_masked: str = "", holder_name: str = "", last_balance: int | None = None, last_synced_at: str = "", statement_status: str = "unknown", liquidity_bucket: str = "other", db_path: str | None = None) -> dict[str, Any]:
@@ -1,15 +1,15 @@
from __future__ import annotations
from .assets_service import (
close_asset_snapshot,
create_asset_snapshot,
create_manual_asset,
deactivate_manual_asset,
get_asset_liquidity_report,
get_asset_snapshot_report,
get_net_worth_timeseries,
list_manual_assets,
preview_asset_snapshot_close,
update_manual_asset,
close_asset_snapshot as close_asset_snapshot,
create_asset_snapshot as create_asset_snapshot,
create_manual_asset as create_manual_asset,
deactivate_manual_asset as deactivate_manual_asset,
get_asset_liquidity_report as get_asset_liquidity_report,
get_asset_snapshot_report as get_asset_snapshot_report,
get_net_worth_timeseries as get_net_worth_timeseries,
list_manual_assets as list_manual_assets,
preview_asset_snapshot_close as preview_asset_snapshot_close,
update_manual_asset as update_manual_asset,
)
from .accounts_write_services import update_ledger_account
from .accounts_write_services import update_ledger_account as update_ledger_account
+17 -1
View File
@@ -1,6 +1,22 @@
from __future__ import annotations
from .shared import *
from .shared import (
ASSET_BUCKETS,
ASSET_BUCKET_ORDER,
Any,
LIABILITY_BUCKETS,
current_kst_date,
date,
db,
fail,
new_id,
normalize_date,
normalize_liquidity_bucket,
now_iso,
ok,
row_to_dict,
sqlite3,
)
def _valuation_policy() -> dict[str, Any]:
return {
@@ -1,6 +1,15 @@
from __future__ import annotations
from .shared import *
from .shared import (
Any,
db,
fail,
new_id,
normalize_month,
now_iso,
ok,
row_to_dict,
)
def create_ledger_budget(month: str, category: str, amount: int | float, subcategory: str = "", person: str = "", currency: str = "KRW", memo: str = "", db_path: str | None = None) -> dict[str, Any]:
@@ -1,6 +1,15 @@
from __future__ import annotations
from .shared import *
from .shared import (
Any,
datetime,
db,
fail,
now_iso,
ok,
re,
row_to_dict,
)
RULE_FIELDS = {"merchant", "counterparty", "description", "payment_method", "raw_summary", "branch", "memo"}
RULE_MATCH_TYPES = {"contains", "equals", "regex", "starts_with", "ends_with"}
@@ -68,11 +77,11 @@ def _rule_matches(rule: dict[str, Any], tx: dict[str, Any]) -> bool:
from .category_rules_write_services import (
create_category_rule,
create_ledger_category,
delete_category_rule,
delete_ledger_category,
update_category_rule,
create_category_rule as create_category_rule,
create_ledger_category as create_ledger_category,
delete_category_rule as delete_category_rule,
delete_ledger_category as delete_ledger_category,
update_category_rule as update_category_rule,
)
@@ -275,11 +284,11 @@ def apply_categorization_rules(limit: int = 1000, only_uncategorized: bool = Tru
return ok(applied_count=applied, preview=preview)
from .uncategorized_workbench_service import (
apply_uncategorized_group_recommendation,
apply_uncategorized_recommendation,
get_uncategorized_merchant_summary,
get_uncategorized_workbench,
list_uncategorized_transactions,
apply_uncategorized_group_recommendation as apply_uncategorized_group_recommendation,
apply_uncategorized_recommendation as apply_uncategorized_recommendation,
get_uncategorized_merchant_summary as get_uncategorized_merchant_summary,
get_uncategorized_workbench as get_uncategorized_workbench,
list_uncategorized_transactions as list_uncategorized_transactions,
)
DEFAULT_LEDGER_CATEGORIES: list[dict[str, Any]] = [
@@ -1,6 +1,16 @@
from __future__ import annotations
from .shared import *
from .shared import (
Any,
VALID_CASHFLOW_KINDS,
VALID_TRANSACTION_TYPES,
db,
fail,
new_id,
now_iso,
ok,
row_to_dict,
)
RULE_FIELDS = {"merchant", "counterparty", "description", "payment_method", "raw_summary", "branch", "memo"}
RULE_MATCH_TYPES = {"contains", "equals", "regex", "starts_with", "ends_with"}
@@ -1,7 +1,24 @@
from __future__ import annotations
from .shared import *
from .shared import _append_memo_tag, _memo_has_tag, _normalize_counterparty_for_match, _party_match_score
from .shared import (
Any,
CROSS_TRANSFER_MATCH_TAG,
CROSS_TRANSFER_REVIEW_TAG,
_append_memo_tag,
_memo_has_tag,
_normalize_counterparty_for_match,
_party_match_score,
current_kst_date,
date,
datetime,
db,
fail,
normalize_date,
now_iso,
ok,
re,
row_to_dict,
)
def _build_cross_transfer_index(transactions: list[dict[str, Any]]) -> dict[tuple[str, int, str], list[dict[str, Any]]]:
index: dict[tuple[str, int, str], list[dict[str, Any]]] = {}
@@ -1,27 +1,25 @@
from __future__ import annotations
from .shared import *
from .shared import _append_memo_tag, _memo_has_tag, _normalize_counterparty_for_match, _party_match_score
from .imports_service import (
import_kb_bank_pdf,
import_seoulpay_xlsx,
import_toss_bank_pdf,
import_toss_securities_pdf,
list_ledger_import_batches,
preview_kb_bank_pdf_import,
preview_ledger_csv_import,
preview_seoulpay_xlsx_import,
preview_toss_bank_pdf_import,
preview_toss_securities_pdf_import,
rollback_ledger_import_batch,
import_kb_bank_pdf as import_kb_bank_pdf,
import_seoulpay_xlsx as import_seoulpay_xlsx,
import_toss_bank_pdf as import_toss_bank_pdf,
import_toss_securities_pdf as import_toss_securities_pdf,
list_ledger_import_batches as list_ledger_import_batches,
preview_kb_bank_pdf_import as preview_kb_bank_pdf_import,
preview_ledger_csv_import as preview_ledger_csv_import,
preview_seoulpay_xlsx_import as preview_seoulpay_xlsx_import,
preview_toss_bank_pdf_import as preview_toss_bank_pdf_import,
preview_toss_securities_pdf_import as preview_toss_securities_pdf_import,
rollback_ledger_import_batch as rollback_ledger_import_batch,
)
from .cross_transfer_service import (
find_cancel_original_candidates,
find_self_transfer_candidates,
link_cancel_to_original,
link_self_transfer_pair,
list_cross_transfer_review_queue,
preview_cross_account_transfers,
run_cross_account_transfer_match,
find_cancel_original_candidates as find_cancel_original_candidates,
find_self_transfer_candidates as find_self_transfer_candidates,
link_cancel_to_original as link_cancel_to_original,
link_self_transfer_pair as link_self_transfer_pair,
list_cross_transfer_review_queue as list_cross_transfer_review_queue,
preview_cross_account_transfers as preview_cross_account_transfers,
run_cross_account_transfer_match as run_cross_account_transfer_match,
)
@@ -1,7 +1,27 @@
from __future__ import annotations
from .shared import *
from .shared import _append_memo_tag, _memo_has_tag, _normalize_counterparty_for_match, _party_match_score
from .shared import (
Any,
Path,
csv,
db,
fail,
json,
make_dedupe_key,
new_id,
normalize_tags,
now_iso,
ok,
parse_kb_bank_pdf,
parse_seoulpay_xlsx,
parse_toss_bank_pdf,
parse_toss_securities_pdf,
row_to_dict,
seoulpay_transaction_preview,
toss_bank_transaction_preview,
toss_transaction_preview,
transaction_preview,
)
def preview_ledger_csv_import(file_path: str, source: str = "generic", db_path: str | None = None) -> dict[str, Any]:
path=Path(file_path).expanduser()
@@ -1,6 +1,18 @@
from __future__ import annotations
from .shared import *
from .shared import (
Any,
BALANCE_RECONCILIATION_REFERENCE_RATIO,
BALANCE_RECONCILIATION_TOLERANCE_KRW,
RECONCILIATION_TARGET_STATUSES,
db,
fail,
normalize_date,
normalize_snapshot_at,
now_iso,
ok,
sqlite3,
)
def _transaction_signed_amount(tx_type: str, amount: int) -> int:
+13 -11
View File
@@ -1,10 +1,10 @@
from __future__ import annotations
import csv
import csv as csv
import sqlite3 as sqlite3
import hashlib
import json
import re
import sqlite3
from datetime import date, datetime, timedelta
from pathlib import Path
from typing import Any
@@ -12,16 +12,18 @@ from uuid import uuid4
from zoneinfo import ZoneInfo
from ..infrastructure.parsers import (
parse_kb_bank_pdf,
parse_seoulpay_xlsx,
parse_toss_bank_pdf,
parse_toss_securities_pdf,
seoulpay_transaction_preview,
toss_bank_transaction_preview,
toss_transaction_preview,
transaction_preview,
parse_kb_bank_pdf as parse_kb_bank_pdf,
parse_seoulpay_xlsx as parse_seoulpay_xlsx,
parse_toss_bank_pdf as parse_toss_bank_pdf,
parse_toss_securities_pdf as parse_toss_securities_pdf,
seoulpay_transaction_preview as seoulpay_transaction_preview,
toss_bank_transaction_preview as toss_bank_transaction_preview,
toss_transaction_preview as toss_transaction_preview,
transaction_preview as transaction_preview,
)
from ..infrastructure.sqlite import db, init_db, resolve_db_path
from ..infrastructure.sqlite import db as db
from ..infrastructure.sqlite import init_db as init_db
from ..infrastructure.sqlite import resolve_db_path as resolve_db_path
VALID_TRANSACTION_TYPES = {"income", "expense", "transfer", "refund", "adjustment"}
VALID_ACCOUNT_TYPES = {"bank", "card", "cash", "investment", "loan", "other"}
@@ -1,6 +1,24 @@
from __future__ import annotations
from .shared import *
from .shared import (
Any,
BACKUP_RESTORE_POLICY,
CASHFLOW_KIND_SQL,
DEFAULT_LEDGER_BACKUP_DIR,
KST,
Path,
current_kst_month,
datetime,
db,
fail,
hashlib,
init_db,
ok,
resolve_db_path,
row_to_dict,
sqlite3,
timedelta,
)
from .shared import _current_kst_datetime, _month_range
def health_check(db_path: str | None = None) -> dict[str, Any]:
@@ -166,7 +184,7 @@ def get_ledger_backup_status(file_path: str, include_hash: bool = True, include_
return fail("not_found", f"backup file not found: {path}", path=str(path), exists=False)
return ok(backup=_ledger_db_status_for_path(path, include_hash=include_hash, include_integrity=include_integrity), restore_policy=BACKUP_RESTORE_POLICY)
from .accounts_write_services import create_ledger_account
from .accounts_write_services import create_ledger_account as create_ledger_account
def list_ledger_accounts(active_only: bool = True, db_path: str | None = None) -> dict[str, Any]:
sql = "SELECT * FROM accounts" + (" WHERE active=1" if active_only else "") + " ORDER BY name"
@@ -1,9 +1,20 @@
from __future__ import annotations
from .shared import *
from .shared import (
Any,
CASHFLOW_KIND_SQL,
date,
db,
normalize_date,
normalize_month,
ok,
row_to_dict,
)
from .budgets_write_services import create_ledger_budget
from .transactions_write_services import create_ledger_transaction, delete_ledger_transaction, update_ledger_transaction
from .budgets_write_services import create_ledger_budget as create_ledger_budget
from .transactions_write_services import create_ledger_transaction as create_ledger_transaction
from .transactions_write_services import delete_ledger_transaction as delete_ledger_transaction
from .transactions_write_services import update_ledger_transaction as update_ledger_transaction
def list_ledger_transactions(start_date: str = "", end_date: str = "", type: str = "", category: str = "", person: str = "", account_id: str = "", include_deleted: bool = False, limit: int = 100, db_path: str | None = None) -> dict[str, Any]:
clauses=[]; params=[]
@@ -23,7 +34,7 @@ def list_ledger_transactions(start_date: str = "", end_date: str = "", type: str
rows = conn.execute(sql, params).fetchall()
return ok(transactions=[row_to_dict(r) for r in rows], count=len(rows))
from .reconciliation_service import get_balance_reconciliation_report
from .reconciliation_service import get_balance_reconciliation_report as get_balance_reconciliation_report
def list_ledger_budgets(month: str = "", db_path: str | None = None) -> dict[str, Any]:
clauses=[]; params=[]
@@ -1,6 +1,18 @@
from __future__ import annotations
from .shared import *
from .shared import (
Any,
VALID_TRANSACTION_TYPES,
db,
fail,
make_dedupe_key,
new_id,
normalize_date,
normalize_tags,
now_iso,
ok,
row_to_dict,
)
def create_ledger_transaction(transaction_date: str = "", type: str = "expense", amount: int | float = 0, category: str = "", subcategory: str = "", merchant: str = "", description: str = "", account_id: str = "", payment_method: str = "", person: str = "", project: str = "", tags: Any = None, is_fixed: bool = False, currency: str = "KRW", posted_date: str = "", source: str = "manual", external_id: str = "", memo: str = "", dedupe: bool = True, transaction_datetime: str = "", counterparty: str = "", balance_after: int | None = None, branch: str = "", raw_summary: str = "", raw_payload: str = "", db_path: str | None = None) -> dict[str, Any]:
@@ -1,6 +1,15 @@
from __future__ import annotations
from .shared import *
from .shared import (
Any,
datetime,
db,
fail,
now_iso,
ok,
re,
row_to_dict,
)
def _rule_matches(rule: dict[str, Any], tx: dict[str, Any]) -> bool:
if rule.get("transaction_type") and rule.get("transaction_type") != tx.get("type", ""):
+8 -1
View File
@@ -1,3 +1,10 @@
from __future__ import annotations
from .infrastructure.sqlite import *
from .infrastructure.sqlite import DEFAULT_DB_PATH as DEFAULT_DB_PATH
from .infrastructure.sqlite import connect as connect
from .infrastructure.sqlite import db as db
from .infrastructure.sqlite import init_db as init_db
from .infrastructure.sqlite import migrate_db as migrate_db
from .infrastructure.sqlite import resolve_db_path as resolve_db_path
__all__ = ["DEFAULT_DB_PATH", "connect", "db", "init_db", "migrate_db", "resolve_db_path"]
@@ -1,4 +1,19 @@
from .kb_bank_pdf import parse_kb_bank_pdf, transaction_preview
from .toss_bank_pdf import parse_toss_bank_pdf, transaction_preview as toss_bank_transaction_preview
from .toss_securities_pdf import parse_toss_securities_pdf, transaction_preview as toss_transaction_preview
from .seoulpay_xlsx import parse_seoulpay_xlsx, transaction_preview as seoulpay_transaction_preview
from .kb_bank_pdf import parse_kb_bank_pdf as parse_kb_bank_pdf
from .kb_bank_pdf import transaction_preview as transaction_preview
from .seoulpay_xlsx import parse_seoulpay_xlsx as parse_seoulpay_xlsx
from .seoulpay_xlsx import transaction_preview as seoulpay_transaction_preview
from .toss_bank_pdf import parse_toss_bank_pdf as parse_toss_bank_pdf
from .toss_bank_pdf import transaction_preview as toss_bank_transaction_preview
from .toss_securities_pdf import parse_toss_securities_pdf as parse_toss_securities_pdf
from .toss_securities_pdf import transaction_preview as toss_transaction_preview
__all__ = [
"parse_kb_bank_pdf",
"parse_seoulpay_xlsx",
"parse_toss_bank_pdf",
"parse_toss_securities_pdf",
"seoulpay_transaction_preview",
"toss_bank_transaction_preview",
"toss_transaction_preview",
"transaction_preview",
]
@@ -1 +1,4 @@
from ...kb_bank_pdf import parse_kb_bank_pdf, transaction_preview
from ...kb_bank_pdf import parse_kb_bank_pdf as parse_kb_bank_pdf
from ...kb_bank_pdf import transaction_preview as transaction_preview
__all__ = ["parse_kb_bank_pdf", "transaction_preview"]
@@ -1 +1,4 @@
from ...seoulpay_xlsx import parse_seoulpay_xlsx, transaction_preview
from ...seoulpay_xlsx import parse_seoulpay_xlsx as parse_seoulpay_xlsx
from ...seoulpay_xlsx import transaction_preview as transaction_preview
__all__ = ["parse_seoulpay_xlsx", "transaction_preview"]
@@ -1 +1,4 @@
from ...toss_bank_pdf import parse_toss_bank_pdf, transaction_preview
from ...toss_bank_pdf import parse_toss_bank_pdf as parse_toss_bank_pdf
from ...toss_bank_pdf import transaction_preview as transaction_preview
__all__ = ["parse_toss_bank_pdf", "transaction_preview"]
@@ -1 +1,4 @@
from ...toss_securities_pdf import parse_toss_securities_pdf, transaction_preview
from ...toss_securities_pdf import parse_toss_securities_pdf as parse_toss_securities_pdf
from ...toss_securities_pdf import transaction_preview as transaction_preview
__all__ = ["parse_toss_securities_pdf", "transaction_preview"]
@@ -1,3 +1,23 @@
from .connection import DEFAULT_DB_PATH, connect, db, resolve_db_path
from .migrations import init_db, migrate_db
from .schema import ACCOUNT_ADDITIVE_COLUMNS, SCHEMA_SQL, SCHEMA_VERSION, TRANSACTION_ADDITIVE_COLUMNS
from .connection import DEFAULT_DB_PATH as DEFAULT_DB_PATH
from .connection import connect as connect
from .connection import db as db
from .connection import resolve_db_path as resolve_db_path
from .migrations import init_db as init_db
from .migrations import migrate_db as migrate_db
from .schema import ACCOUNT_ADDITIVE_COLUMNS as ACCOUNT_ADDITIVE_COLUMNS
from .schema import SCHEMA_SQL as SCHEMA_SQL
from .schema import SCHEMA_VERSION as SCHEMA_VERSION
from .schema import TRANSACTION_ADDITIVE_COLUMNS as TRANSACTION_ADDITIVE_COLUMNS
__all__ = [
"ACCOUNT_ADDITIVE_COLUMNS",
"DEFAULT_DB_PATH",
"SCHEMA_SQL",
"SCHEMA_VERSION",
"TRANSACTION_ADDITIVE_COLUMNS",
"connect",
"db",
"init_db",
"migrate_db",
"resolve_db_path",
]
@@ -1,7 +1,6 @@
from __future__ import annotations
import sqlite3
from pathlib import Path
from .connection import connect, resolve_db_path
from .schema import ACCOUNT_ADDITIVE_COLUMNS, SCHEMA_SQL, SCHEMA_VERSION, TRANSACTION_ADDITIVE_COLUMNS
+4 -1
View File
@@ -1,6 +1,9 @@
from __future__ import annotations
from .adapters.mcp.server import main, mcp
from .adapters.mcp.server import main as main
from .adapters.mcp.server import mcp as mcp
__all__ = ["main", "mcp"]
if __name__ == "__main__":
main()
+15 -11
View File
@@ -18,17 +18,6 @@ from .application import system_services as _system_services
from .application import transactions_write_services as _transactions_write_services
from .application import transaction_report_services as _transaction_report_services
from .application import uncategorized_workbench_service as _uncategorized_workbench_service
from .application.asset_account_services import *
from .application.assets_service import *
from .application.categorization_services import *
from .application.cross_transfer_service import *
from .application.imports_service import *
from .application.import_transfer_services import *
from .application.reconciliation_service import *
from .application.shared import *
from .application.system_services import *
from .application.transaction_report_services import *
from .application.uncategorized_workbench_service import *
# Keep compatibility for tests/monkeypatches that reach into service internals.
_current_kst_datetime = _shared._current_kst_datetime
@@ -52,6 +41,21 @@ _PROXY_MODULES = (
)
def _export_public_names() -> list[str]:
exported: set[str] = set()
module_globals = globals()
for module in _PROXY_MODULES:
for name in dir(module):
if name.startswith("_"):
continue
module_globals.setdefault(name, getattr(module, name))
exported.add(name)
return sorted(exported)
__all__ = _export_public_names()
class _ServiceModule(ModuleType):
def __setattr__(self, name: str, value) -> None:
super().__setattr__(name, value)