lambda-erp 0.1.30__tar.gz → 0.1.31__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 (69) hide show
  1. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/PKG-INFO +1 -1
  2. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/chat.py +1 -0
  3. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/remarks_md.py +6 -0
  4. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/templates/document.html +1 -0
  5. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/pyproject.toml +1 -1
  6. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/.gitignore +0 -0
  7. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/LICENSE +0 -0
  8. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/README.md +0 -0
  9. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/__init__.py +0 -0
  10. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/attachments.py +0 -0
  11. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/auth.py +0 -0
  12. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/bootstrap.py +0 -0
  13. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/demo_limits.py +0 -0
  14. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/deps.py +0 -0
  15. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/errors.py +0 -0
  16. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/main.py +0 -0
  17. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/pdf.py +0 -0
  18. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/providers.py +0 -0
  19. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/__init__.py +0 -0
  20. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/accounting.py +0 -0
  21. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/admin.py +0 -0
  22. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/analytics.py +0 -0
  23. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/bank_reconciliation.py +0 -0
  24. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/documents.py +0 -0
  25. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/masters.py +0 -0
  26. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/proposals.py +0 -0
  27. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/reports.py +0 -0
  28. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/setup.py +0 -0
  29. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/services.py +0 -0
  30. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/templates/proposal.html +0 -0
  31. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/docs/agents/README.md +0 -0
  32. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/frontend/README.md +0 -0
  33. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/frontend/src/api/client.ts +0 -0
  34. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/__init__.py +0 -0
  35. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/__init__.py +0 -0
  36. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/bank_transaction.py +0 -0
  37. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/budget.py +0 -0
  38. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/chart_of_accounts.py +0 -0
  39. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/general_ledger.py +0 -0
  40. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/journal_entry.py +0 -0
  41. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/payment_entry.py +0 -0
  42. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/pos_invoice.py +0 -0
  43. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/purchase_invoice.py +0 -0
  44. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/revaluation.py +0 -0
  45. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/sales_invoice.py +0 -0
  46. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/subscription.py +0 -0
  47. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/buying/__init__.py +0 -0
  48. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/buying/purchase_order.py +0 -0
  49. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/controllers/__init__.py +0 -0
  50. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/controllers/currency.py +0 -0
  51. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/controllers/defaults.py +0 -0
  52. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/controllers/pricing_rule.py +0 -0
  53. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/controllers/taxes_and_totals.py +0 -0
  54. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/database.py +0 -0
  55. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/exceptions.py +0 -0
  56. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/hooks.py +0 -0
  57. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/model.py +0 -0
  58. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/selling/__init__.py +0 -0
  59. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/selling/proposal.py +0 -0
  60. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/selling/quotation.py +0 -0
  61. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/selling/sales_order.py +0 -0
  62. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/simulation.py +0 -0
  63. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/stock/__init__.py +0 -0
  64. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/stock/delivery_note.py +0 -0
  65. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/stock/purchase_receipt.py +0 -0
  66. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/stock/stock_entry.py +0 -0
  67. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/stock/stock_ledger.py +0 -0
  68. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/utils.py +0 -0
  69. {lambda_erp-0.1.30 → lambda_erp-0.1.31}/terraform/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lambda-erp
3
- Version: 0.1.30
3
+ Version: 0.1.31
4
4
  Summary: Core ERP logic - accounting, sales, purchasing, inventory
5
5
  Author: TORUS INVESTMENTS AG
6
6
  License-Expression: MIT
@@ -1720,6 +1720,7 @@ Use the line `frequency` for a recurring item that is genuinely part of the quot
1720
1720
  The `remarks` (Notes / Terms) field on quotations, sales orders, and invoices renders on the PDF with a small markup vocabulary, so when a user dictates offer notes, conditions, recurring services, or a sign-off you can compose a polished closing block instead of a flat paragraph. Put this ONLY in `remarks` (never in item descriptions):
1721
1721
  - `# Heading` at the start of a line -> bold heading
1722
1722
  - `*italic*` or `_italic_` -> italic; `**bold**` -> bold
1723
+ - `---` (a line of 3+ dashes) -> a full-width thin horizontal rule (divider)
1723
1724
  - A line starting with `>>` is a price line, split by the FIRST `|` pipe: the text BEFORE the pipe goes in the left (frequency) column, the text AFTER it in the right (amount) column — both placed literally as you write them, NOT interpreted (it does not know "Monatlich" is a frequency or that "CHF 380" is a number). Omit the pipe to put everything in the amount column. The two columns line up with the line-items table's frequency/amount columns, so use it for a separately- or recurring-billed item, e.g. `>> Monatlich | CHF 380.—`.
1724
1725
  - Separate blocks with a blank line; a single newline is just a line break.
1725
1726
  Plain text (no special characters) still renders fine, so only reach for the markup when it improves a customer-facing note.
@@ -16,6 +16,7 @@ Syntax (authored in the same textarea, also what the chat assistant emits):
16
16
  **bold** -> bold
17
17
  >> Monatlich | CHF 380.— -> right-aligned price box (period over amount),
18
18
  floated beside the block's heading/description
19
+ --- (3+ dashes) -> a full-width horizontal rule
19
20
  Everything is HTML-escaped first, so user text can't inject markup.
20
21
  """
21
22
  import html
@@ -64,6 +65,7 @@ def _block(lines):
64
65
 
65
66
  for raw in lines:
66
67
  stripped = raw.lstrip()
68
+ s = raw.strip()
67
69
  if stripped.startswith(">>"):
68
70
  flush_para()
69
71
  price_html += _price(raw)
@@ -71,6 +73,10 @@ def _block(lines):
71
73
  flush_para()
72
74
  heading = stripped.lstrip("#").strip()
73
75
  body += f'<div class="rm-h">{_inline(heading)}</div>'
76
+ elif len(s) >= 3 and set(s) == {"-"}:
77
+ # A line of 3+ dashes -> a full-width horizontal rule.
78
+ flush_para()
79
+ body += '<div class="rm-hr"></div>'
74
80
  else:
75
81
  para.append(raw)
76
82
  flush_para()
@@ -55,6 +55,7 @@
55
55
  .remarks .rm-h + .rm-p, .remarks .rm-p + .rm-p { margin-top: 2px; }
56
56
  .remarks .rm-amt { float: right; text-align: right; margin: 0 0 4px 16px; }
57
57
  .remarks .rm-amt-val { white-space: nowrap; }
58
+ .remarks .rm-hr { border-top: 1px solid #d1d5db; margin: 6px 0; }
58
59
  .remarks em { font-style: italic; }
59
60
  .remarks strong { font-weight: 700; }
60
61
  </style>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "lambda-erp"
3
- version = "0.1.30"
3
+ version = "0.1.31"
4
4
  description = "Core ERP logic - accounting, sales, purchasing, inventory"
5
5
  readme = "README.md"
6
6
  license = "MIT"
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