lambda-erp 0.8.27__tar.gz → 0.8.28__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/PKG-INFO +1 -1
  2. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/chat.py +17 -20
  3. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/pyproject.toml +1 -1
  4. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/.gitignore +0 -0
  5. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/LICENSE +0 -0
  6. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/README.md +0 -0
  7. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/__init__.py +0 -0
  8. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/attachments.py +0 -0
  9. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/auth.py +0 -0
  10. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/bootstrap.py +0 -0
  11. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/demo_limits.py +0 -0
  12. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/deps.py +0 -0
  13. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/errors.py +0 -0
  14. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/list_values.py +0 -0
  15. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/main.py +0 -0
  16. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/oauth.py +0 -0
  17. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/pdf.py +0 -0
  18. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/providers.py +0 -0
  19. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/remarks_md.py +0 -0
  20. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/__init__.py +0 -0
  21. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/accounting.py +0 -0
  22. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/actions.py +0 -0
  23. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/admin.py +0 -0
  24. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/analytics.py +0 -0
  25. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/availability.py +0 -0
  26. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/bank_reconciliation.py +0 -0
  27. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/bank_statements.py +0 -0
  28. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/chat_api.py +0 -0
  29. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/documents.py +0 -0
  30. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/masters.py +0 -0
  31. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/mcp.py +0 -0
  32. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/proposals.py +0 -0
  33. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/reports.py +0 -0
  34. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/routers/setup.py +0 -0
  35. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/services.py +0 -0
  36. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/templates/document.html +0 -0
  37. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/api/templates/proposal.html +0 -0
  38. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/docs/agents/README.md +0 -0
  39. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/frontend/LICENSE +0 -0
  40. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/frontend/README.md +0 -0
  41. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/frontend/src/api/client.ts +0 -0
  42. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/__init__.py +0 -0
  43. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/__init__.py +0 -0
  44. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/bank_account.py +0 -0
  45. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/bank_reconciliation.py +0 -0
  46. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/bank_statement_import.py +0 -0
  47. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/bank_transaction.py +0 -0
  48. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/budget.py +0 -0
  49. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/camt.py +0 -0
  50. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/chart_of_accounts.py +0 -0
  51. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/general_ledger.py +0 -0
  52. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/journal_entry.py +0 -0
  53. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/payment_entry.py +0 -0
  54. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/pos_invoice.py +0 -0
  55. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/purchase_invoice.py +0 -0
  56. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/revaluation.py +0 -0
  57. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/sales_invoice.py +0 -0
  58. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/setup/__init__.py +0 -0
  59. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/setup/engine.py +0 -0
  60. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/setup/pack.py +0 -0
  61. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/setup/packs/__init__.py +0 -0
  62. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/setup/packs/ch.py +0 -0
  63. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/setup/packs/de_common.py +0 -0
  64. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/setup/packs/de_skr03.py +0 -0
  65. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/setup/packs/de_skr04.py +0 -0
  66. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/setup/packs/generic.py +0 -0
  67. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/setup/profiles.py +0 -0
  68. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/setup/spine.py +0 -0
  69. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/accounting/subscription.py +0 -0
  70. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/assets/__init__.py +0 -0
  71. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/assets/asset.py +0 -0
  72. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/assets/reservation.py +0 -0
  73. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/buying/__init__.py +0 -0
  74. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/buying/purchase_order.py +0 -0
  75. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/controllers/__init__.py +0 -0
  76. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/controllers/currency.py +0 -0
  77. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/controllers/defaults.py +0 -0
  78. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/controllers/pricing_rule.py +0 -0
  79. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/controllers/taxes_and_totals.py +0 -0
  80. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/database.py +0 -0
  81. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/exceptions.py +0 -0
  82. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/hooks.py +0 -0
  83. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/model.py +0 -0
  84. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/selling/__init__.py +0 -0
  85. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/selling/proposal.py +0 -0
  86. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/selling/quotation.py +0 -0
  87. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/selling/sales_order.py +0 -0
  88. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/simulation.py +0 -0
  89. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/stock/__init__.py +0 -0
  90. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/stock/delivery_note.py +0 -0
  91. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/stock/purchase_receipt.py +0 -0
  92. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/stock/stock_entry.py +0 -0
  93. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/stock/stock_ledger.py +0 -0
  94. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/lambda_erp/utils.py +0 -0
  95. {lambda_erp-0.8.27 → lambda_erp-0.8.28}/terraform/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: lambda-erp
3
- Version: 0.8.27
3
+ Version: 0.8.28
4
4
  Summary: Core ERP logic - accounting, sales, purchasing, inventory
5
5
  Author: TORUS INVESTMENTS AG
6
6
  License-Expression: Apache-2.0
@@ -899,17 +899,16 @@ TOOLS = [
899
899
  "type": "function",
900
900
  "function": {
901
901
  "name": "reconcile_bank_transaction",
902
- "description": "Reconcile imported bank transactions after explicit user confirmation. mode=invoice_payment creates and submits a Payment Entry allocated to one or more invoices; mode=existing_voucher links an already-submitted Payment Entry or Journal Entry with an exactly matching bank leg. If suggest_bank_reconciliation returns an existing_voucher_group, pass every exact bank transaction it lists in bank_transactions; the complete group is linked atomically. mode=journal creates and submits a two-sided Journal Entry against a non-bank, non-AR/AP account. This posts or links real accounting data. Never call in the same turn as the first proposal; confirmed must reflect a later explicit confirmation.",
902
+ "description": "Reconcile imported bank transactions after explicit user confirmation. Always pass bank_transactions: use a one-item list for an individual reconciliation and the complete list returned by an existing_voucher_group suggestion for a grouped reconciliation. mode=invoice_payment creates and submits a Payment Entry allocated to one or more invoices; mode=existing_voucher links an already-submitted Payment Entry or Journal Entry with an exactly matching bank leg, atomically for a group; mode=journal creates and submits a two-sided Journal Entry against a non-bank, non-AR/AP account. invoice_payment and journal accept exactly one bank transaction. This posts or links real accounting data. Never call in the same turn as the first proposal; confirmed must reflect a later explicit confirmation.",
903
903
  "parameters": {
904
904
  "type": "object",
905
905
  "properties": {
906
- "bank_transaction": {"type": "string"},
907
906
  "bank_transactions": {
908
907
  "type": "array",
909
908
  "items": {"type": "string"},
910
- "minItems": 2,
909
+ "minItems": 1,
911
910
  "maxItems": 100,
912
- "description": "For an existing_voucher_group only: all exact Bank Transaction names returned by the suggestion, including bank_transaction.",
911
+ "description": "Bank Transaction names to reconcile: exactly one for an individual match/payment/journal, or the complete exact group returned by the suggestion.",
913
912
  },
914
913
  "mode": {"type": "string", "enum": ["invoice_payment", "existing_voucher", "journal"]},
915
914
  "allocations": {
@@ -931,7 +930,7 @@ TOOLS = [
931
930
  "remarks": {"type": "string"},
932
931
  "confirmed": {"type": "boolean"},
933
932
  },
934
- "required": ["bank_transaction", "mode", "confirmed"],
933
+ "required": ["bank_transactions", "mode", "confirmed"],
935
934
  },
936
935
  },
937
936
  },
@@ -2083,35 +2082,32 @@ def _handle_reconcile_bank_transaction(args, user_info: dict | None = None):
2083
2082
  )
2084
2083
  }
2085
2084
  from lambda_erp.accounting.bank_reconciliation import (
2086
- reconcile_with_existing_voucher,
2087
2085
  reconcile_with_existing_voucher_group,
2088
2086
  reconcile_with_journal,
2089
2087
  reconcile_with_payment,
2090
2088
  )
2091
2089
  user = (user_info or {}).get("name")
2092
2090
  mode = args.get("mode")
2091
+ bank_transactions = args.get("bank_transactions")
2092
+ if not isinstance(bank_transactions, list) or not bank_transactions:
2093
+ return {"error": "bank_transactions must contain at least one Bank Transaction name"}
2094
+ if mode in {"invoice_payment", "journal"} and len(bank_transactions) != 1:
2095
+ return {"error": f"mode={mode} requires exactly one bank transaction"}
2096
+ bank_transaction = bank_transactions[0]
2093
2097
  try:
2094
2098
  if mode == "invoice_payment":
2095
2099
  return reconcile_with_payment(
2096
- args.get("bank_transaction"), args.get("allocations") or [],
2100
+ bank_transaction, args.get("allocations") or [],
2097
2101
  conversion_rate=args.get("conversion_rate"), user=user, confirmed=True,
2098
2102
  )
2099
2103
  if mode == "existing_voucher":
2100
- group = args.get("bank_transactions")
2101
- if group:
2102
- if args.get("bank_transaction") not in group:
2103
- return {"error": "bank_transactions must include bank_transaction"}
2104
- return reconcile_with_existing_voucher_group(
2105
- group, args.get("voucher_type"), args.get("voucher_no"),
2106
- user=user, confirmed=True,
2107
- )
2108
- return reconcile_with_existing_voucher(
2109
- args.get("bank_transaction"), args.get("voucher_type"), args.get("voucher_no"),
2104
+ return reconcile_with_existing_voucher_group(
2105
+ bank_transactions, args.get("voucher_type"), args.get("voucher_no"),
2110
2106
  user=user, confirmed=True,
2111
2107
  )
2112
2108
  if mode == "journal":
2113
2109
  return reconcile_with_journal(
2114
- args.get("bank_transaction"), args.get("counterparty_account"),
2110
+ bank_transaction, args.get("counterparty_account"),
2115
2111
  conversion_rate=args.get("conversion_rate"), remarks=args.get("remarks"),
2116
2112
  user=user, confirmed=True,
2117
2113
  )
@@ -2573,8 +2569,9 @@ one transaction or every transaction in an exact `existing_voucher_group`,
2573
2569
  voucher changes the GL and may change invoice outstanding amounts. Ask for explicit confirmation in
2574
2570
  a later user turn, then call `reconcile_bank_transaction` with `confirmed=true`. Clearly disclose any
2575
2571
  unallocated on-account remainder. Disclose all group members and their total before asking for
2576
- confirmation; for a group, copy the complete
2577
- `bank_transactions` list from the suggestion into the reconciliation call and never add or omit IDs.
2572
+ confirmation. Every reconciliation call uses `bank_transactions`: pass a one-item list for an
2573
+ individual reconciliation; for a group, copy the complete list from the suggestion and never add or
2574
+ omit IDs.
2578
2575
  Never match a Bank Transaction directly to an invoice because that
2579
2576
  would omit the cash posting. For reversals, first explain whether the voucher was created by the
2580
2577
  reconciliation (it will be cancelled and reversed) or merely linked (it will only be unlinked), and
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "lambda-erp"
3
- version = "0.8.27"
3
+ version = "0.8.28"
4
4
  description = "Core ERP logic - accounting, sales, purchasing, inventory"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes