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.
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/PKG-INFO +1 -1
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/chat.py +1 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/remarks_md.py +6 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/templates/document.html +1 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/pyproject.toml +1 -1
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/.gitignore +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/LICENSE +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/README.md +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/__init__.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/attachments.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/auth.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/bootstrap.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/demo_limits.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/deps.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/errors.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/main.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/pdf.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/providers.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/__init__.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/accounting.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/admin.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/analytics.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/bank_reconciliation.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/documents.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/masters.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/proposals.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/reports.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/routers/setup.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/services.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/api/templates/proposal.html +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/docs/agents/README.md +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/frontend/README.md +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/frontend/src/api/client.ts +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/__init__.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/__init__.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/bank_transaction.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/budget.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/chart_of_accounts.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/general_ledger.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/journal_entry.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/payment_entry.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/pos_invoice.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/purchase_invoice.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/revaluation.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/sales_invoice.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/accounting/subscription.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/buying/__init__.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/buying/purchase_order.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/controllers/__init__.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/controllers/currency.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/controllers/defaults.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/controllers/pricing_rule.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/controllers/taxes_and_totals.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/database.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/exceptions.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/hooks.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/model.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/selling/__init__.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/selling/proposal.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/selling/quotation.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/selling/sales_order.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/simulation.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/stock/__init__.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/stock/delivery_note.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/stock/purchase_receipt.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/stock/stock_entry.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/stock/stock_ledger.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/lambda_erp/utils.py +0 -0
- {lambda_erp-0.1.30 → lambda_erp-0.1.31}/terraform/README.md +0 -0
|
@@ -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>
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|