lambda-erp 0.2.0__tar.gz → 0.2.1__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.2.0 → lambda_erp-0.2.1}/PKG-INFO +1 -1
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/setup/engine.py +31 -7
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/setup/pack.py +4 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/setup/packs/ch.py +1 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/setup/profiles.py +86 -41
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/pyproject.toml +1 -1
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/.gitignore +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/LICENSE +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/README.md +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/__init__.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/attachments.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/auth.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/bootstrap.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/chat.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/demo_limits.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/deps.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/errors.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/main.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/oauth.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/pdf.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/providers.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/remarks_md.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/routers/__init__.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/routers/accounting.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/routers/admin.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/routers/analytics.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/routers/bank_reconciliation.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/routers/chat_api.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/routers/documents.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/routers/masters.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/routers/proposals.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/routers/reports.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/routers/setup.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/services.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/templates/document.html +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/api/templates/proposal.html +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/docs/agents/README.md +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/frontend/README.md +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/frontend/src/api/client.ts +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/__init__.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/__init__.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/bank_transaction.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/budget.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/chart_of_accounts.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/general_ledger.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/journal_entry.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/payment_entry.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/pos_invoice.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/purchase_invoice.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/revaluation.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/sales_invoice.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/setup/__init__.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/setup/packs/__init__.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/setup/packs/generic.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/setup/spine.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/accounting/subscription.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/buying/__init__.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/buying/purchase_order.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/controllers/__init__.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/controllers/currency.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/controllers/defaults.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/controllers/pricing_rule.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/controllers/taxes_and_totals.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/database.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/exceptions.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/hooks.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/model.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/selling/__init__.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/selling/proposal.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/selling/quotation.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/selling/sales_order.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/simulation.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/stock/__init__.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/stock/delivery_note.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/stock/purchase_receipt.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/stock/stock_entry.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/stock/stock_ledger.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/lambda_erp/utils.py +0 -0
- {lambda_erp-0.2.0 → lambda_erp-0.2.1}/terraform/README.md +0 -0
|
@@ -66,12 +66,27 @@ def _attach(tree: dict, parent_name: str, overlay_acct: dict) -> bool:
|
|
|
66
66
|
return True
|
|
67
67
|
|
|
68
68
|
|
|
69
|
+
def _localize_name(acct: dict, language: str) -> str:
|
|
70
|
+
"""The overlay account's name in the pack's language, English otherwise.
|
|
71
|
+
|
|
72
|
+
Profiles carry a jurisdiction-neutral English ``name`` plus an ``i18n`` map
|
|
73
|
+
({lang: name}); on a German (Swiss) chart the German name is used so the
|
|
74
|
+
overlay reads in the same language as the base chart.
|
|
75
|
+
"""
|
|
76
|
+
if language and language != "en":
|
|
77
|
+
localized = (acct.get("i18n") or {}).get(language)
|
|
78
|
+
if localized:
|
|
79
|
+
return localized
|
|
80
|
+
return acct["name"]
|
|
81
|
+
|
|
82
|
+
|
|
69
83
|
def _merge(pack: LocalizationPack, profile: Optional[SectorProfile]):
|
|
70
84
|
"""Return ``(merged_tree, merged_defaults, added_names, skipped)``.
|
|
71
85
|
|
|
72
|
-
``added_names`` are the overlay accounts actually attached
|
|
73
|
-
overlay accounts whose anchor was unmapped or
|
|
74
|
-
so a mis-wired profile/pack pairing is visible
|
|
86
|
+
``added_names`` are the overlay accounts actually attached (in the pack's
|
|
87
|
+
language); ``skipped`` are overlay accounts whose anchor was unmapped or
|
|
88
|
+
whose name collided — surfaced so a mis-wired profile/pack pairing is visible
|
|
89
|
+
rather than silent.
|
|
75
90
|
"""
|
|
76
91
|
tree = copy.deepcopy(pack.base_chart)
|
|
77
92
|
defaults = dict(pack.defaults)
|
|
@@ -79,17 +94,26 @@ def _merge(pack: LocalizationPack, profile: Optional[SectorProfile]):
|
|
|
79
94
|
skipped: list[dict] = []
|
|
80
95
|
|
|
81
96
|
if profile is not None:
|
|
97
|
+
# Map each profile account's neutral English name -> the localized name
|
|
98
|
+
# actually created, so profile.defaults (which reference the English
|
|
99
|
+
# name) resolve to the localized account on this pack.
|
|
100
|
+
name_map: dict[str, str] = {}
|
|
82
101
|
for acct in profile.accounts:
|
|
83
102
|
parent_name = pack.anchor_account(acct["anchor"])
|
|
84
103
|
if parent_name is None:
|
|
85
104
|
skipped.append({**acct, "reason": "anchor not mapped in pack"})
|
|
86
105
|
continue
|
|
87
|
-
|
|
88
|
-
|
|
106
|
+
display = _localize_name(acct, pack.language)
|
|
107
|
+
localized = {**acct, "name": display}
|
|
108
|
+
if _attach(tree, parent_name, localized):
|
|
109
|
+
added.append(display)
|
|
110
|
+
name_map[acct["name"]] = display
|
|
89
111
|
else:
|
|
90
112
|
skipped.append({**acct, "reason": "parent missing or name collision"})
|
|
91
|
-
# Sector default overrides layer on top of the pack's base defaults
|
|
92
|
-
|
|
113
|
+
# Sector default overrides layer on top of the pack's base defaults,
|
|
114
|
+
# remapped to the localized account names created above.
|
|
115
|
+
for field, val in profile.defaults.items():
|
|
116
|
+
defaults[field] = name_map.get(val, val)
|
|
93
117
|
|
|
94
118
|
return tree, defaults, added, skipped
|
|
95
119
|
|
|
@@ -58,6 +58,10 @@ class LocalizationPack:
|
|
|
58
58
|
defaults: dict
|
|
59
59
|
variant: Optional[str] = None
|
|
60
60
|
currency: str = "USD"
|
|
61
|
+
# Primary language of the chart's account names (ISO 639-1). Sector-profile
|
|
62
|
+
# overlay accounts are rendered in this language so they match the base
|
|
63
|
+
# chart — "en" for the generic pack, "de" for the Swiss KMU pack, etc.
|
|
64
|
+
language: str = "en"
|
|
61
65
|
setup_tax: Optional[Callable[[str, str], list]] = None
|
|
62
66
|
notes: str = ""
|
|
63
67
|
|
|
@@ -64,8 +64,12 @@ class SectorProfile:
|
|
|
64
64
|
)
|
|
65
65
|
|
|
66
66
|
|
|
67
|
-
def _acct(anchor, name, account_type=""):
|
|
68
|
-
|
|
67
|
+
def _acct(anchor, name, account_type="", **i18n):
|
|
68
|
+
"""One overlay account. ``name`` is the jurisdiction-neutral English name;
|
|
69
|
+
``i18n`` holds localized names keyed by ISO 639-1 (e.g. ``de=..., fr=...``)
|
|
70
|
+
used when the active pack's language matches, so overlay accounts read in the
|
|
71
|
+
same language as the base chart."""
|
|
72
|
+
return {"anchor": anchor, "name": name, "account_type": account_type, "i18n": i18n}
|
|
69
73
|
|
|
70
74
|
|
|
71
75
|
# ---------------------------------------------------------------------------
|
|
@@ -86,13 +90,21 @@ SERVICES = SectorProfile(
|
|
|
86
90
|
"tracked separately so they can be re-billed at cost."
|
|
87
91
|
),
|
|
88
92
|
accounts=[
|
|
89
|
-
_acct(spine.CURRENT_ASSETS, "Unbilled Revenue / WIP", ""
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
_acct(spine.
|
|
93
|
-
|
|
93
|
+
_acct(spine.CURRENT_ASSETS, "Unbilled Revenue / WIP", "",
|
|
94
|
+
de="Nicht fakturierte Leistungen / Angefangene Arbeiten",
|
|
95
|
+
fr="Travaux en cours non facturés"),
|
|
96
|
+
_acct(spine.CURRENT_LIABILITIES, "Deferred Revenue", "",
|
|
97
|
+
de="Erhaltene Anzahlungen (passive Abgrenzung)",
|
|
98
|
+
fr="Produits différés"),
|
|
99
|
+
_acct(spine.INCOME, "Consulting Revenue", "Income Account",
|
|
100
|
+
de="Beratungserlöse", fr="Produits de conseil"),
|
|
101
|
+
_acct(spine.OPERATING_EXPENSES, "Subcontractor Costs", "",
|
|
102
|
+
de="Aufwand für Fremdleistungen", fr="Charges de sous-traitance"),
|
|
103
|
+
_acct(spine.OPERATING_EXPENSES, "Reimbursable Client Expenses", "",
|
|
104
|
+
de="Weiterverrechenbare Kundenauslagen",
|
|
105
|
+
fr="Débours refacturables aux clients"),
|
|
94
106
|
],
|
|
95
|
-
defaults={"default_income_account": "
|
|
107
|
+
defaults={"default_income_account": "Consulting Revenue"},
|
|
96
108
|
big_decisions=[
|
|
97
109
|
"Recognise revenue over time (unbilled WIP + deferred revenue) rather "
|
|
98
110
|
"than only at invoice? Recommended for retainers and long engagements.",
|
|
@@ -113,11 +125,16 @@ RETAIL_POS = SectorProfile(
|
|
|
113
125
|
"miscounts) is a normal recurring expense reconciled at stock-take."
|
|
114
126
|
),
|
|
115
127
|
accounts=[
|
|
116
|
-
_acct(spine.CURRENT_ASSETS, "Cash Register / Till", "Cash"
|
|
117
|
-
|
|
118
|
-
_acct(spine.
|
|
119
|
-
|
|
120
|
-
_acct(spine.
|
|
128
|
+
_acct(spine.CURRENT_ASSETS, "Cash Register / Till", "Cash",
|
|
129
|
+
de="Ladenkasse", fr="Caisse (point de vente)"),
|
|
130
|
+
_acct(spine.CURRENT_ASSETS, "Merchant Card Clearing", "",
|
|
131
|
+
de="Kartenzahlungen (Durchlaufkonto)", fr="Compte d'attente cartes"),
|
|
132
|
+
_acct(spine.CURRENT_LIABILITIES, "Sales Tax Payable", "Tax",
|
|
133
|
+
de="Geschuldete Umsatzsteuer (MWST)", fr="TVA due sur les ventes"),
|
|
134
|
+
_acct(spine.INCOME, "Retail Sales", "Income Account",
|
|
135
|
+
de="Detailhandelserlöse", fr="Produits de la vente au détail"),
|
|
136
|
+
_acct(spine.OPERATING_EXPENSES, "Inventory Shrinkage", "Stock Adjustment",
|
|
137
|
+
de="Inventurdifferenzen (Schwund)", fr="Démarque inconnue"),
|
|
121
138
|
],
|
|
122
139
|
defaults={"default_income_account": "Retail Sales"},
|
|
123
140
|
big_decisions=[
|
|
@@ -139,12 +156,18 @@ HOSPITALITY = SectorProfile(
|
|
|
139
156
|
"and spoilage are expected and tracked."
|
|
140
157
|
),
|
|
141
158
|
accounts=[
|
|
142
|
-
_acct(spine.INCOME, "Food Sales", "Income Account"
|
|
143
|
-
|
|
144
|
-
_acct(spine.
|
|
145
|
-
|
|
146
|
-
_acct(spine.
|
|
147
|
-
|
|
159
|
+
_acct(spine.INCOME, "Food Sales", "Income Account",
|
|
160
|
+
de="Küchenumsatz (Speisen)", fr="Ventes de nourriture"),
|
|
161
|
+
_acct(spine.INCOME, "Beverage Sales", "Income Account",
|
|
162
|
+
de="Getränkeumsatz", fr="Ventes de boissons"),
|
|
163
|
+
_acct(spine.DIRECT_COSTS, "Food Cost", "Cost of Goods Sold",
|
|
164
|
+
de="Warenaufwand Küche (Speisen)", fr="Coût des denrées"),
|
|
165
|
+
_acct(spine.DIRECT_COSTS, "Beverage Cost", "Cost of Goods Sold",
|
|
166
|
+
de="Warenaufwand Getränke", fr="Coût des boissons"),
|
|
167
|
+
_acct(spine.CURRENT_LIABILITIES, "Tips Payable", "",
|
|
168
|
+
de="Trinkgelder (durchlaufend)", fr="Pourboires à reverser"),
|
|
169
|
+
_acct(spine.OPERATING_EXPENSES, "Spoilage & Waste", "Stock Adjustment",
|
|
170
|
+
de="Verderb und Abfall", fr="Pertes et gaspillage"),
|
|
148
171
|
],
|
|
149
172
|
defaults={"default_income_account": "Food Sales"},
|
|
150
173
|
big_decisions=[
|
|
@@ -166,11 +189,16 @@ DISTRIBUTION = SectorProfile(
|
|
|
166
189
|
"liability and reduce net revenue rather than being an expense."
|
|
167
190
|
),
|
|
168
191
|
accounts=[
|
|
169
|
-
_acct(spine.CURRENT_ASSETS, "Inventory - Finished Goods", "Stock"
|
|
170
|
-
|
|
171
|
-
_acct(spine.
|
|
172
|
-
|
|
173
|
-
_acct(spine.
|
|
192
|
+
_acct(spine.CURRENT_ASSETS, "Inventory - Finished Goods", "Stock",
|
|
193
|
+
de="Vorräte Fertigwaren", fr="Stock de produits finis"),
|
|
194
|
+
_acct(spine.CURRENT_ASSETS, "Goods in Transit", "Stock",
|
|
195
|
+
de="Waren unterwegs", fr="Marchandises en transit"),
|
|
196
|
+
_acct(spine.INCOME, "Wholesale Revenue", "Income Account",
|
|
197
|
+
de="Grosshandelserlöse", fr="Produits de gros"),
|
|
198
|
+
_acct(spine.OPERATING_EXPENSES, "Freight Out / Delivery", "",
|
|
199
|
+
de="Ausgangsfrachten / Versandkosten", fr="Frais de livraison"),
|
|
200
|
+
_acct(spine.CURRENT_LIABILITIES, "Customer Rebates Payable", "",
|
|
201
|
+
de="Kundenrückvergütungen (Rückstellung)", fr="Ristournes clients à payer"),
|
|
174
202
|
],
|
|
175
203
|
defaults={"default_income_account": "Wholesale Revenue"},
|
|
176
204
|
big_decisions=[
|
|
@@ -195,11 +223,16 @@ IMPORT_EXPORT = SectorProfile(
|
|
|
195
223
|
"Gain/Loss accounts already cover these)."
|
|
196
224
|
),
|
|
197
225
|
accounts=[
|
|
198
|
-
_acct(spine.CURRENT_ASSETS, "Goods in Transit (Imports)", "Stock"
|
|
199
|
-
|
|
200
|
-
_acct(spine.DIRECT_COSTS, "
|
|
201
|
-
|
|
202
|
-
_acct(spine.
|
|
226
|
+
_acct(spine.CURRENT_ASSETS, "Goods in Transit (Imports)", "Stock",
|
|
227
|
+
de="Importwaren unterwegs", fr="Marchandises importées en transit"),
|
|
228
|
+
_acct(spine.DIRECT_COSTS, "Customs Duties & Import Taxes", "Chargeable",
|
|
229
|
+
de="Zölle und Einfuhrabgaben", fr="Droits de douane et taxes à l'importation"),
|
|
230
|
+
_acct(spine.DIRECT_COSTS, "Inbound Freight & Insurance", "Chargeable",
|
|
231
|
+
de="Eingangsfrachten und Versicherung", fr="Fret et assurance à l'import"),
|
|
232
|
+
_acct(spine.CURRENT_LIABILITIES, "Import VAT / GST Payable", "Tax",
|
|
233
|
+
de="Einfuhrsteuer (MWST) geschuldet", fr="TVA à l'importation due"),
|
|
234
|
+
_acct(spine.INCOME, "Export Sales", "Income Account",
|
|
235
|
+
de="Exporterlöse", fr="Produits d'exportation"),
|
|
203
236
|
],
|
|
204
237
|
defaults={
|
|
205
238
|
"default_income_account": "Export Sales",
|
|
@@ -225,11 +258,16 @@ MANUFACTURING = SectorProfile(
|
|
|
225
258
|
"when the product is sold, not when it is made."
|
|
226
259
|
),
|
|
227
260
|
accounts=[
|
|
228
|
-
_acct(spine.CURRENT_ASSETS, "Raw Materials", "Stock"
|
|
229
|
-
|
|
230
|
-
_acct(spine.CURRENT_ASSETS, "
|
|
231
|
-
|
|
232
|
-
_acct(spine.
|
|
261
|
+
_acct(spine.CURRENT_ASSETS, "Raw Materials", "Stock",
|
|
262
|
+
de="Rohstoffe", fr="Matières premières"),
|
|
263
|
+
_acct(spine.CURRENT_ASSETS, "Work in Progress", "Stock",
|
|
264
|
+
de="Angefangene Arbeiten", fr="Travaux en cours"),
|
|
265
|
+
_acct(spine.CURRENT_ASSETS, "Finished Goods", "Stock",
|
|
266
|
+
de="Fertigerzeugnisse", fr="Produits finis"),
|
|
267
|
+
_acct(spine.DIRECT_COSTS, "Direct Labour", "",
|
|
268
|
+
de="Fertigungslöhne (Direktlohn)", fr="Main-d'œuvre directe"),
|
|
269
|
+
_acct(spine.DIRECT_COSTS, "Manufacturing Overhead Applied", "",
|
|
270
|
+
de="Verrechnete Fertigungsgemeinkosten", fr="Frais généraux de production imputés"),
|
|
233
271
|
],
|
|
234
272
|
defaults={},
|
|
235
273
|
big_decisions=[
|
|
@@ -254,13 +292,20 @@ CONSTRUCTION = SectorProfile(
|
|
|
254
292
|
"project."
|
|
255
293
|
),
|
|
256
294
|
accounts=[
|
|
257
|
-
_acct(spine.CURRENT_ASSETS, "Costs in Excess of Billings", ""
|
|
258
|
-
|
|
259
|
-
_acct(spine.
|
|
260
|
-
|
|
261
|
-
_acct(spine.
|
|
262
|
-
|
|
263
|
-
_acct(spine.
|
|
295
|
+
_acct(spine.CURRENT_ASSETS, "Costs in Excess of Billings", "",
|
|
296
|
+
de="Nicht fakturierte Projektleistungen", fr="Travaux en cours excédant la facturation"),
|
|
297
|
+
_acct(spine.CURRENT_ASSETS, "Retention Receivable", "Receivable",
|
|
298
|
+
de="Rückbehalte (Forderungen)", fr="Retenues de garantie à recevoir"),
|
|
299
|
+
_acct(spine.CURRENT_LIABILITIES, "Billings in Excess of Costs", "",
|
|
300
|
+
de="Fakturierte Leistungen über Baufortschritt", fr="Facturation excédant les travaux"),
|
|
301
|
+
_acct(spine.CURRENT_LIABILITIES, "Retention Payable", "",
|
|
302
|
+
de="Rückbehalte (Verbindlichkeiten)", fr="Retenues de garantie à payer"),
|
|
303
|
+
_acct(spine.INCOME, "Contract Revenue", "Income Account",
|
|
304
|
+
de="Projekterlöse (Werkverträge)", fr="Produits sur contrats"),
|
|
305
|
+
_acct(spine.DIRECT_COSTS, "Job Costs - Materials", "",
|
|
306
|
+
de="Projektkosten Material", fr="Coûts de chantier - matériaux"),
|
|
307
|
+
_acct(spine.DIRECT_COSTS, "Job Costs - Subcontractors", "",
|
|
308
|
+
de="Projektkosten Fremdleistungen", fr="Coûts de chantier - sous-traitance"),
|
|
264
309
|
],
|
|
265
310
|
defaults={"default_income_account": "Contract Revenue"},
|
|
266
311
|
big_decisions=[
|
|
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
|
|
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
|