diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml
index bd622275d6..3c5ad071dc 100644
--- a/.github/workflows/backport.yml
+++ b/.github/workflows/backport.yml
@@ -21,6 +21,6 @@ jobs:
- name: Run backport
uses: ./actions/backport
with:
- token: ${{secrets.BACKPORT_BOT_TOKEN}}
+ token: ${{secrets.RELEASE_TOKEN}}
labelsToAdd: "backport"
title: "{{originalTitle}}"
diff --git a/.github/workflows/initiate_release.yml b/.github/workflows/initiate_release.yml
index e51c1943fd..321d6f5b40 100644
--- a/.github/workflows/initiate_release.yml
+++ b/.github/workflows/initiate_release.yml
@@ -15,7 +15,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- version: ["13", "14", "15"]
+ version: ["14", "15"]
steps:
- uses: octokit/request-action@v2.x
diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml
new file mode 100644
index 0000000000..e990228185
--- /dev/null
+++ b/.github/workflows/lock.yml
@@ -0,0 +1,21 @@
+name: 'Lock threads'
+
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+
+permissions:
+ issues: write
+ pull-requests: write
+
+
+jobs:
+ lock:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: dessant/lock-threads@v5
+ with:
+ github-token: ${{ github.token }}
+ issue-inactive-days: 14
+ pr-inactive-days: 14
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 30be903ae8..6ea121f298 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -5,7 +5,7 @@ fail_fast: false
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.0.1
+ rev: v4.3.0
hooks:
- id: trailing-whitespace
files: "erpnext.*"
@@ -15,6 +15,10 @@ repos:
args: ['--branch', 'develop']
- id: check-merge-conflict
- id: check-ast
+ - id: check-json
+ - id: check-toml
+ - id: check-yaml
+ - id: debug-statements
- repo: https://github.com/pre-commit/mirrors-eslint
rev: v8.44.0
diff --git a/erpnext/accounts/deferred_revenue.py b/erpnext/accounts/deferred_revenue.py
index 367b017969..6282e9a560 100644
--- a/erpnext/accounts/deferred_revenue.py
+++ b/erpnext/accounts/deferred_revenue.py
@@ -358,9 +358,11 @@ def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
account_currency = get_account_currency(item.expense_account or item.income_account)
if doc.doctype == "Sales Invoice":
+ against_type = "Customer"
against, project = doc.customer, doc.project
credit_account, debit_account = item.income_account, item.deferred_revenue_account
else:
+ against_type = "Supplier"
against, project = doc.supplier, item.project
credit_account, debit_account = item.deferred_expense_account, item.expense_account
@@ -413,6 +415,7 @@ def book_deferred_income_or_expense(doc, deferred_process, posting_date=None):
doc,
credit_account,
debit_account,
+ against_type,
against,
amount,
base_amount,
@@ -494,6 +497,7 @@ def make_gl_entries(
doc,
credit_account,
debit_account,
+ against_type,
against,
amount,
base_amount,
@@ -515,7 +519,9 @@ def make_gl_entries(
doc.get_gl_dict(
{
"account": credit_account,
+ "against_type": against_type,
"against": against,
+ "against_link": against,
"credit": base_amount,
"credit_in_account_currency": amount,
"cost_center": cost_center,
@@ -534,7 +540,9 @@ def make_gl_entries(
doc.get_gl_dict(
{
"account": debit_account,
+ "against_type": against_type,
"against": against,
+ "against_link": against,
"debit": base_amount,
"debit_in_account_currency": amount,
"cost_center": cost_center,
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index 82af85d702..651599dafd 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -91,8 +91,8 @@ class Account(NestedSet):
super(Account, self).on_update()
def onload(self):
- frozen_accounts_modifier = frappe.db.get_value(
- "Accounts Settings", "Accounts Settings", "frozen_accounts_modifier"
+ frozen_accounts_modifier = frappe.db.get_single_value(
+ "Accounts Settings", "frozen_accounts_modifier"
)
if not frozen_accounts_modifier or frozen_accounts_modifier in frappe.get_roles():
self.set_onload("can_freeze_account", True)
diff --git a/erpnext/accounts/doctype/account/account_tree.js b/erpnext/accounts/doctype/account/account_tree.js
index f240aa6e95..0b29769293 100644
--- a/erpnext/accounts/doctype/account/account_tree.js
+++ b/erpnext/accounts/doctype/account/account_tree.js
@@ -77,7 +77,7 @@ frappe.treeview_settings["Account"] = {
// show Dr if positive since balance is calculated as debit - credit else show Cr
const balance = account.balance_in_account_currency || account.balance;
- const dr_or_cr = balance > 0 ? "Dr": "Cr";
+ const dr_or_cr = balance > 0 ? __("Dr"): __("Cr");
const format = (value, currency) => format_currency(Math.abs(value), currency);
if (account.balance!==undefined) {
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py b/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py
index 9e67c4cf0d..05ff2a178a 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/chart_of_accounts.py
@@ -74,7 +74,7 @@ def create_charts(
# after all accounts are already inserted.
frappe.local.flags.ignore_update_nsm = True
_import_accounts(chart, None, None, root_account=True)
- rebuild_tree("Account", "parent_account")
+ rebuild_tree("Account")
frappe.local.flags.ignore_update_nsm = False
@@ -231,6 +231,8 @@ def build_account_tree(tree, parent, all_accounts):
tree[child.account_name]["account_type"] = child.account_type
if child.tax_rate:
tree[child.account_name]["tax_rate"] = child.tax_rate
+ if child.account_currency:
+ tree[child.account_name]["account_currency"] = child.account_currency
if not parent:
tree[child.account_name]["root_type"] = child.root_type
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/unverified/at_austria_chart_template.json b/erpnext/accounts/doctype/account/chart_of_accounts/unverified/at_austria_chart_template.json
index 58d67beb67..bd7228ec41 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/unverified/at_austria_chart_template.json
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/unverified/at_austria_chart_template.json
@@ -26,7 +26,7 @@
"0360 Bauliche Investitionen in fremden (gepachteten) Betriebs- und Geschäftsgebäuden": {"account_type": "Fixed Asset"},
"0370 Bauliche Investitionen in fremden (gepachteten) Wohn- und Sozialgebäuden": {"account_type": "Fixed Asset"},
"0390 Kumulierte Abschreibungen zu Grundstücken ": {"account_type": "Fixed Asset"},
- "0400 Maschinen und Geräte ": {"account_type": "Fixed Asset"},
+ "0400 Maschinen und Geräte ": {"account_type": "Fixed Asset"},
"0500 Maschinenwerkzeuge ": {"account_type": "Fixed Asset"},
"0510 Allgemeine Werkzeuge und Handwerkzeuge ": {"account_type": "Fixed Asset"},
"0520 Prototypen, Formen, Modelle ": {"account_type": "Fixed Asset"},
@@ -65,42 +65,41 @@
"0980 Geleistete Anzahlungen auf Finanzanlagen ": {"account_type": "Fixed Asset"},
"0990 Kumulierte Abschreibungen zu Finanzanlagen ": {"account_type": "Fixed Asset"},
"root_type": "Asset"
- },
+ },
"Klasse 1 Aktiva: Vorr\u00e4te": {
"1000 Bezugsverrechnung": {"account_type": "Stock"},
"1100 Rohstoffe": {"account_type": "Stock"},
"1200 Bezogene Teile": {"account_type": "Stock"},
"1300 Hilfsstoffe": {"account_type": "Stock"},
"1350 Betriebsstoffe": {"account_type": "Stock"},
- "1360 Vorrat Energietraeger": {"account_type": "Stock"},
+ "1360 Vorrat Energietraeger": {"account_type": "Stock"},
"1400 Unfertige Erzeugnisse": {"account_type": "Stock"},
"1500 Fertige Erzeugnisse": {"account_type": "Stock"},
"1600 Handelswarenvorrat": {"account_type": "Stock Received But Not Billed"},
"1700 Noch nicht abrechenbare Leistungen": {"account_type": "Stock"},
- "1900 Wertberichtigungen": {"account_type": "Stock"},
"1800 Geleistete Anzahlungen": {"account_type": "Stock"},
"1900 Wertberichtigungen": {"account_type": "Stock"},
"root_type": "Asset"
- },
+ },
"Klasse 3 Passiva: Verbindlichkeiten": {
"3000 Allgemeine Verbindlichkeiten (Schuld)": {"account_type": "Payable"},
"3010 R\u00fcckstellungen f\u00fcr Pensionen": {"account_type": "Payable"},
"3020 Steuerr\u00fcckstellungen": {"account_type": "Tax"},
- "3041 Sonstige R\u00fcckstellungen": {"account_type": "Payable"},
+ "3041 Sonstige R\u00fcckstellungen": {"account_type": "Payable"},
"3110 Verbindlichkeiten gegen\u00fcber Bank": {"account_type": "Payable"},
"3150 Verbindlichkeiten Darlehen": {"account_type": "Payable"},
- "3185 Verbindlichkeiten Kreditkarte": {"account_type": "Payable"},
+ "3185 Verbindlichkeiten Kreditkarte": {"account_type": "Payable"},
"3380 Verbindlichkeiten aus der Annahme gezogener Wechsel u. d. Ausstellungen eigener Wechsel": {
"account_type": "Payable"
},
"3400 Verbindlichkeiten gegen\u00fc. verb. Untern., Verbindl. gegen\u00fc. Untern., mit denen eine Beteiligungsverh\u00e4lnis besteht": {},
"3460 Verbindlichkeiten gegenueber Gesellschaftern": {"account_type": "Payable"},
"3470 Einlagen stiller Gesellschafter": {"account_type": "Payable"},
- "3585 Verbindlichkeiten Lohnsteuer": {"account_type": "Tax"},
- "3590 Verbindlichkeiten Kommunalabgaben": {"account_type": "Tax"},
- "3595 Verbindlichkeiten Dienstgeberbeitrag": {"account_type": "Tax"},
+ "3585 Verbindlichkeiten Lohnsteuer": {"account_type": "Tax"},
+ "3590 Verbindlichkeiten Kommunalabgaben": {"account_type": "Tax"},
+ "3595 Verbindlichkeiten Dienstgeberbeitrag": {"account_type": "Tax"},
"3600 Verbindlichkeiten Sozialversicherung": {"account_type": "Payable"},
- "3640 Verbindlichkeiten Loehne und Gehaelter": {"account_type": "Payable"},
+ "3640 Verbindlichkeiten Loehne und Gehaelter": {"account_type": "Payable"},
"3700 Sonstige Verbindlichkeiten": {"account_type": "Payable"},
"3900 Passive Rechnungsabgrenzungsposten": {"account_type": "Payable"},
"3100 Anleihen (einschlie\u00dflich konvertibler)": {"account_type": "Payable"},
@@ -119,13 +118,13 @@
},
"3515 Umsatzsteuer Inland 10%": {
"account_type": "Tax"
- },
+ },
"3520 Umsatzsteuer aus i.g. Erwerb 20%": {
"account_type": "Tax"
},
"3525 Umsatzsteuer aus i.g. Erwerb 10%": {
"account_type": "Tax"
- },
+ },
"3560 Umsatzsteuer-Evidenzkonto f\u00fcr erhaltene Anzahlungen auf Bestellungen": {},
"3360 Verbindlichkeiten aus Lieferungen u. Leistungen EU": {
"account_type": "Payable"
@@ -141,7 +140,7 @@
"account_type": "Tax"
},
"root_type": "Liability"
- },
+ },
"Klasse 2 Aktiva: Umlaufverm\u00f6gen, Rechnungsabgrenzungen": {
"2030 Forderungen aus Lieferungen und Leistungen Inland (0% USt, umsatzsteuerfrei)": {
"account_type": "Receivable"
@@ -154,7 +153,7 @@
},
"2040 Forderungen aus Lieferungen und Leistungen Inland (sonstiger USt-Satz)": {
"account_type": "Receivable"
- },
+ },
"2100 Forderungen aus Lieferungen und Leistungen EU": {
"account_type": "Receivable"
},
@@ -192,7 +191,7 @@
"account_type": "Receivable"
},
"2570 Einfuhrumsatzsteuer (bezahlt)": {"account_type": "Tax"},
-
+
"2460 Eingeforderte aber noch nicht eingezahlte Einlagen": {
"account_type": "Receivable"
},
@@ -243,10 +242,10 @@
},
"2800 Guthaben bei Bank": {
"account_type": "Bank"
- },
+ },
"2801 Guthaben bei Bank - Sparkonto": {
"account_type": "Bank"
- },
+ },
"2810 Guthaben bei Paypal": {
"account_type": "Bank"
},
@@ -264,19 +263,19 @@
},
"2895 Schwebende Geldbewegugen": {
"account_type": "Bank"
- },
+ },
"2513 Vorsteuer Inland 5%": {
"account_type": "Tax"
},
"2515 Vorsteuer Inland 20%": {
"account_type": "Tax"
- },
+ },
"2520 Vorsteuer aus innergemeinschaftlichem Erwerb 10%": {
"account_type": "Tax"
},
"2525 Vorsteuer aus innergemeinschaftlichem Erwerb 20%": {
"account_type": "Tax"
- },
+ },
"2530 Vorsteuer \u00a719/Art 19 ( reverse charge ) ": {
"account_type": "Tax"
},
@@ -286,16 +285,16 @@
"root_type": "Asset"
},
"Klasse 4: Betriebliche Erträge": {
- "4000 Erlöse 20 %": {"account_type": "Income Account"},
- "4020 Erl\u00f6se 0 % steuerbefreit": {"account_type": "Income Account"},
+ "4000 Erlöse 20 %": {"account_type": "Income Account"},
+ "4020 Erl\u00f6se 0 % steuerbefreit": {"account_type": "Income Account"},
"4010 Erl\u00f6se 10 %": {"account_type": "Income Account"},
- "4030 Erl\u00f6se 13 %": {"account_type": "Income Account"},
- "4040 Erl\u00f6se 0 % innergemeinschaftliche Lieferungen": {"account_type": "Income Account"},
- "4400 Erl\u00f6sreduktion 0 % steuerbefreit": {"account_type": "Expense Account"},
+ "4030 Erl\u00f6se 13 %": {"account_type": "Income Account"},
+ "4040 Erl\u00f6se 0 % innergemeinschaftliche Lieferungen": {"account_type": "Income Account"},
+ "4400 Erl\u00f6sreduktion 0 % steuerbefreit": {"account_type": "Expense Account"},
"4410 Erl\u00f6sreduktion 10 %": {"account_type": "Expense Account"},
"4420 Erl\u00f6sreduktion 20 %": {"account_type": "Expense Account"},
- "4430 Erl\u00f6sreduktion 13 %": {"account_type": "Expense Account"},
- "4440 Erl\u00f6sreduktion 0 % innergemeinschaftliche Lieferungen": {"account_type": "Expense Account"},
+ "4430 Erl\u00f6sreduktion 13 %": {"account_type": "Expense Account"},
+ "4440 Erl\u00f6sreduktion 0 % innergemeinschaftliche Lieferungen": {"account_type": "Expense Account"},
"4500 Ver\u00e4nderungen des Bestandes an fertigen und unfertigen Erzeugn. sowie an noch nicht abrechenbaren Leistungen": {"account_type": "Income Account"},
"4580 Aktivierte Eigenleistungen": {"account_type": "Income Account"},
"4600 Erl\u00f6se aus dem Abgang vom Anlageverm\u00f6gen, ausgen. Finanzanlagen": {"account_type": "Income Account"},
@@ -304,15 +303,15 @@
"4700 Ertr\u00e4ge aus der Aufl\u00f6sung von R\u00fcckstellungen": {"account_type": "Income Account"},
"4800 \u00dcbrige betriebliche Ertr\u00e4ge": {"account_type": "Income Account"},
"root_type": "Income"
- },
+ },
"Klasse 5: Aufwand f\u00fcr Material und Leistungen": {
- "5000 Einkauf Partnerleistungen": {"account_type": "Cost of Goods Sold"},
+ "5000 Einkauf Partnerleistungen": {"account_type": "Cost of Goods Sold"},
"5100 Verbrauch an Rohstoffen": {"account_type": "Cost of Goods Sold"},
"5200 Verbrauch von bezogenen Fertig- und Einzelteilen": {"account_type": "Cost of Goods Sold"},
"5300 Verbrauch von Hilfsstoffen": {"account_type": "Cost of Goods Sold"},
"5340 Verbrauch Verpackungsmaterial": {"account_type": "Cost of Goods Sold"},
"5470 Verbrauch von Kleinmaterial": {"account_type": "Cost of Goods Sold"},
- "5450 Verbrauch von Reinigungsmaterial": {"account_type": "Cost of Goods Sold"},
+ "5450 Verbrauch von Reinigungsmaterial": {"account_type": "Cost of Goods Sold"},
"5400 Verbrauch von Betriebsstoffen": {"account_type": "Cost of Goods Sold"},
"5500 Verbrauch von Werkzeugen und anderen Erzeugungshilfsmittel": {"account_type": "Cost of Goods Sold"},
"5600 Verbrauch von Brenn- und Treibstoffen, Energie und Wasser": {"account_type": "Cost of Goods Sold"},
@@ -340,7 +339,7 @@
"6700 Sonstige Sozialaufwendungen": {"account_type": "Payable"},
"6900 Aufwandsstellenrechnung Personal": {"account_type": "Payable"},
"root_type": "Expense"
- },
+ },
"Klasse 7: Abschreibungen und sonstige betriebliche Aufwendungen": {
"7010 Abschreibungen auf das Anlageverm\u00f6gen (ausgenommen Finanzanlagen)": {"account_type": "Depreciation"},
"7100 Sonstige Steuern und Geb\u00fchren": {"account_type": "Tax"},
@@ -349,7 +348,7 @@
"7310 Fahrrad - Aufwand": {"account_type": "Expense Account"},
"7320 Kfz - Aufwand": {"account_type": "Expense Account"},
"7330 LKW - Aufwand": {"account_type": "Expense Account"},
- "7340 Lastenrad - Aufwand": {"account_type": "Expense Account"},
+ "7340 Lastenrad - Aufwand": {"account_type": "Expense Account"},
"7350 Reise- und Fahraufwand": {"account_type": "Expense Account"},
"7360 Tag- und N\u00e4chtigungsgelder": {"account_type": "Expense Account"},
"7380 Nachrichtenaufwand": {"account_type": "Expense Account"},
@@ -409,7 +408,7 @@
"8990 Gewinnabfuhr bzw. Verlust\u00fcberrechnung aus Ergebnisabf\u00fchrungsvertr\u00e4gen": {"account_type": "Expense Account"},
"8350 nicht ausgenutzte Lieferantenskonti": {"account_type": "Expense Account"},
"root_type": "Income"
- },
+ },
"Klasse 9 Passiva: Eigenkapital, R\u00fccklagen, stille Einlagen, Abschlusskonten": {
"9000 Gezeichnetes bzw. gewidmetes Kapital": {
"account_type": "Equity"
@@ -435,5 +434,5 @@
},
"root_type": "Equity"
}
- }
+ }
}
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/ca_plan_comptable_pour_les_provinces_francophones.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/ca_plan_comptable_pour_les_provinces_francophones.json
index 2811fc5fb6..2a30cbcbc9 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/ca_plan_comptable_pour_les_provinces_francophones.json
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/ca_plan_comptable_pour_les_provinces_francophones.json
@@ -33,7 +33,9 @@
},
"Stocks": {
"Mati\u00e8res premi\u00e8res": {},
- "Stock de produits fini": {},
+ "Stock de produits fini": {
+ "account_type": "Stock"
+ },
"Stock exp\u00e9di\u00e9 non-factur\u00e9": {},
"Travaux en cours": {},
"account_type": "Stock"
@@ -395,9 +397,11 @@
},
"Produits": {
"Revenus de ventes": {
- " Escomptes de volume sur ventes": {},
+ "Escomptes de volume sur ventes": {},
"Autres produits d'exploitation": {},
- "Ventes": {},
+ "Ventes": {
+ "account_type": "Income Account"
+ },
"Ventes avec des provinces harmonis\u00e9es": {},
"Ventes avec des provinces non-harmonis\u00e9es": {},
"Ventes \u00e0 l'\u00e9tranger": {}
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR03_gnucash.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR03.json
similarity index 96%
rename from erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR03_gnucash.json
rename to erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR03.json
index 741d4283e2..daf2e21d78 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR03_gnucash.json
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR03.json
@@ -53,8 +53,13 @@
},
"II. Forderungen und sonstige Vermögensgegenstände": {
"is_group": 1,
- "Ford. a. Lieferungen und Leistungen": {
+ "Forderungen aus Lieferungen und Leistungen mit Kontokorrent": {
"account_number": "1400",
+ "account_type": "Receivable",
+ "is_group": 1
+ },
+ "Forderungen aus Lieferungen und Leistungen ohne Kontokorrent": {
+ "account_number": "1410",
"account_type": "Receivable"
},
"Durchlaufende Posten": {
@@ -180,8 +185,13 @@
},
"IV. Verbindlichkeiten aus Lieferungen und Leistungen": {
"is_group": 1,
- "Verbindlichkeiten aus Lieferungen u. Leistungen": {
+ "Verbindlichkeiten aus Lieferungen und Leistungen mit Kontokorrent": {
"account_number": "1600",
+ "account_type": "Payable",
+ "is_group": 1
+ },
+ "Verbindlichkeiten aus Lieferungen und Leistungen ohne Kontokorrent": {
+ "account_number": "1610",
"account_type": "Payable"
}
},
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR04.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR04.json
index 57e8bdd9dc..2bf55cfcd0 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR04.json
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR04.json
@@ -1,1711 +1,3667 @@
{
- "country_code": "de",
- "name": "SKR04 ohne Kontonummern",
+ "country_code": "de",
+ "name": "SKR04 mit Kontonummern",
"tree": {
- "Bilanz - Aktiva": {
- "Anlageverm\u00f6gen": {
- "Anlageverm\u00f6gen Immaterielle Verm\u00f6gensgegenst\u00e4nde": {
- "Geleistete Anzahlungen 1": {
- "Anzahlungen auf Gesch\u00e4fts- oder Firmenwert": {},
- "Geleistete Anzahlungen auf immaterielle Verm\u00f6gensgegenst\u00e4nde": {}
- },
- "Gesch\u00e4fts- oder Firmenwert": {
- "Gesch\u00e4fts- oder Firmenwert 1": {}
- },
- "Konzessionen- gewerbliche Schutzrechte und \u00e4hnliche Rechte und Werte sowie Lizenzen an solchen Rechten und Werten": {
- "Konzessionen- gewerbliche Schutzrechte und \u00e4hnliche Rechte und Werte sowie Lizenzen an solchen Rechten und Werten 1": {
- "EDV-Software": {},
- "Gewerbliche Schutzrechte": {},
- "Konzessionen ": {},
- "Lizenzen an gewerblichen Schutzrechten und \u00e4hnlichen Rechten und Werten ": {},
- "\u00e4hnliche Rechte und Werte ": {}
+ "Aktiva": {
+ "root_type": "Asset",
+ "A - Anlageverm\u00f6gen": {
+ "account_type": "Fixed Asset",
+ "is_group": 1,
+ "I - Immaterielle VG": {
+ "is_group": 1,
+ "1 - Selbst geschaffene gewerbliche Schutzrechte und \u00e4hnliche Rechte und Werte": {
+ "is_group": 1
+ },
+ "2 - entgeltlich erworbene Konzessionen, gewerbl. Schutzrechte und \u00e4hnl. Rechte und Werte sowie Lizenzen an solchen": {
+ "is_group": 1,
+ "Entgeltlich erworbene Konzessionen, gewerbl. Schutzrechte und \u00e4hnl. Rechte und Werte sowie Lizenzen an solchen": {
+ "account_number": "0100"
+ },
+ "Konzessionen ": {
+ "account_number": "0110"
+ },
+ "Gewerbliche Schutzrechte ": {
+ "account_number": "0120"
+ },
+ "\u00c4hnliche Rechte und Werte": {
+ "account_number": "0130"
+ },
+ "EDV-Software": {
+ "account_number": "0135"
+ },
+ "Lizenzen an gewerblichen Schutzrechten und \u00e4hnl. Rechten und Werten": {
+ "account_number": "0140"
+ },
+ "Selbst geschaffene immaterielle VG": {
+ "account_number": "0143",
+ "account_type": "Fixed Asset"
+ },
+ "Lizenzen und Franchisevertr\u00e4ge": {
+ "account_number": "0145"
+ },
+ "Konzessionen und gewerbliche Schutzrechte": {
+ "account_number": "0146"
+ },
+ "Rezepte, Verfahren, Prototypen": {
+ "account_number": "0147"
+ },
+ "Immaterielle VG in Entwicklung": {
+ "account_number": "0148"
+ },
+ "Geleistete Anz. auf immaterielle VG": {
+ "account_number": "0170"
}
- },
- "Verschmelzungsmehrwert": {
- "Verschmelzungsmehrwert 1": {}
- }
- },
- "Aufwendungen f\u00fcr die Ingangsetzung und Erweiterung des Gesch\u00e4ftsbetriebs": {
- "Aufwendungen f\u00fcr die Ingangsetzung und Erweiterung des Gesch\u00e4ftsbetriebs 1": {
- "Aufwendungen f\u00fcr die Ingangsetzung und Erweiterung des Gesch\u00e4ftsbetriebs 2": {}
- },
- "Aufwendungen f\u00fcr die W\u00e4hrungsumstellung auf den Euro": {
- "Aufwendungen f\u00fcr die W\u00e4hrungsumstellung auf den Euro 1": {}
- }
- },
- "Ausstehende Einlagen auf das gezeichnete Kapital": {
- "Ausstehende Einlagen auf das gezeichnete Kapital 1": {
- "Ausstehende Einlagen auf das gezeichnete Kapital- eingefordert (Aktivausweis)": {},
- "Ausstehende Einlagen auf das gezeichnete Kapital- nichteingefordert (Aktivausweis)": {}
- },
- "Sonstige Aktiva oder sonstige Passiva": {
- "Ausstehende Einlagen auf das Kommandit-Kapital- eingefordert": {},
- "Ausstehende Einlagen auf das Kommandit-Kapital- nicht eingefordert": {},
- "Ausstehende Einlagen auf das Komplement\u00e4r-Kapital- eingefordert": {},
- "Ausstehende Einlagen auf das Komplement\u00e4r-Kapital- nicht eingefordert": {}
- }
- },
- "Finanzanlagen": {
- "Anteile an verbundenen Unternehmen 1": {
- "Anteile an herrschender oder mit Mehrheit beteiligter Gesellschaft 1": {},
- "Anteile an verbundenen Unternehmen 2": {}
- },
- "Ausleihungen an Unternehmen- mit denen ein Beteiligungsverh\u00e4ltnis besteht": {
- "Ausleihungen an Unternehmen- mit denen ein Beteiligungsverh\u00e4ltnis besteht 1": {}
- },
- "Ausleihungen an verbundene Unternehmen": {
- "Ausleihungen an verbundene Unternehmen 1": {}
- },
- "Beteiligungen": {
- "Beteiligungen 1": {
- "Andere Beteilgungen an Personengesellschaften": {},
- "Andere Beteiligungen an Kapitalgesellschaften": {},
- "Atypisch stille Beteiligungen": {},
- "Beteiligungen einer GmbH Co. KG an einer Komplement\u00e4r GmbH": {},
- "Typisch stille Beteiligungen": {}
+ },
+ "3 - Gesch\u00e4fts- oder Firmenwert": {
+ "is_group": 1,
+ "Gesch\u00e4fts- oder Firmenwert ": {
+ "account_number": "0150"
+ },
+ "Anz. auf Gesch\u00e4fts- oder Firmenwert": {
+ "account_number": "0179"
}
- },
- "Genossenschaftsanteile": {
- "Genossenschaftsanteile zum langfristigen Verbleib": {}
- },
- "R\u00fcckdeckungsanspr\u00fcche aus Lebensversicherungen": {
- "R\u00fcckdeckungsanspr\u00fcche aus Lebensversicherungen zum langfristigen Verbleib": {}
- },
- "Sonstige Ausleihungen": {
- "Sonstige Ausleihungen 1": {
- "Ausleihungen an Gesellschafter": {},
- "Ausleihungen an nahe stehende Personen": {},
- "Darlehen 1": {}
- }
- },
- "Wertpapiere des Anlageverm\u00f6gens": {
- "Wertpapiere des Anlageverm\u00f6gens 1": {
- "Festverzinsliche Wertpapiere": {},
- "Wertpapiere mit Gewinnbeteiligungsanspr\u00fcchen- die dem Halbeink\u00fcnfteverfahren unterliegen": {}
+ },
+ "4 - geleistete Anz.": {
+ "is_group": 1,
+ "Geleistete Anz. auf Vorr\u00e4te": {
+ "account_number": "1180"
+ },
+ "Geleistete Anz., 7 % Vorsteuer": {
+ "account_number": "1181"
+ },
+ "Geleistete Anz., 16 % Vorsteuer": {
+ "account_number": "1184"
+ },
+ "Geleistete Anz., 15 % Vorsteuer": {
+ "account_number": "1185"
+ },
+ "Geleistete Anz., 19 % Vorsteuer": {
+ "account_number": "1186"
}
}
- },
- "Sachanlagen": {
- "Andere Anlagen- Betriebs- und Gesch\u00e4ftsaustattung": {
- "Andere Anlagen- Betriebs- und Gesch\u00e4ftsaustattung 1": {
- "Andere Anlagen ": {
- "account_type": "Fixed Asset"
- },
- "B\u00fcroeinrichtungen": {},
- "Einbauten in fremde Grundst\u00fccke": {},
- "Geringwertige Wirtschaftsg\u00fcter bis 410 Euro": {},
- "Ger\u00fcst- und Schalungsmaterial": {},
- "Ladeneinrichtungen": {},
- "Lkw": {},
- "Pkw": {},
- "Sonstige Betriebs- und Gesch\u00e4ftsausstattung": {},
- "Sonstige Transportmittel": {},
- "Werkzeuge": {}
+ },
+ "II - Sachanlagen": {
+ "1 - Grundst\u00fccke, grundst\u00fccksgleiche Rechte und Bauten einschl. der Bauten auf fremden Grundst\u00fccken": {
+ "is_group": 1,
+ "Grundst\u00fccke, grundst\u00fccksgleiche Rechte und Bauten einschl. der Bauten auf fremden Grundst\u00fccken": {
+ "account_number": "0200",
+ "account_type": "Fixed Asset"
+ },
+ "Grundst\u00fccksgleiche Rechte ohne Bauten": {
+ "account_number": "0210"
+ },
+ "Unbebaute Grundst\u00fccke": {
+ "account_number": "0215"
+ },
+ "Grundst\u00fccksgleiche Rechte (Erbbaurecht, Dauerwohnrecht)": {
+ "account_number": "0220"
+ },
+ "Grundst\u00fccke mit Substanzverzehr": {
+ "account_number": "0225"
+ },
+ "Grundst\u00fccksanteil h\u00e4usliches Arbeitszimmer": {
+ "account_number": "0229"
+ },
+ "Bauten auf eigenen Grundst\u00fccken und grundst\u00fccksgleichen Rechten": {
+ "account_number": "0230"
+ },
+ "Grundst\u00fcckswerte eigener bebauter Grundst\u00fccke": {
+ "account_number": "0235"
+ },
+ "Gesch\u00e4ftsbauten": {
+ "account_number": "0240"
+ },
+ "Fabrikbauten ": {
+ "account_number": "0250"
+ },
+ "Andere Bauten": {
+ "account_number": "0260"
+ },
+ "Garagen": {
+ "account_number": "0270"
+ },
+ "Au\u00dfenanlagen f. Gesch\u00e4fts-, Fabrik- und andere Bauten": {
+ "account_number": "0280"
+ },
+ "Hof- und Wegebefestigungen": {
+ "account_number": "0285"
+ },
+ "Einrichtungen f. Gesch\u00e4fts-, Fabrik- und andere Bauten": {
+ "account_number": "0290"
+ },
+ "Wohnbauten ": {
+ "account_number": "0300"
+ },
+ "Au\u00dfenanlagen ": {
+ "account_number": "0310"
+ },
+ "Einrichtungen f. Wohnbauten ": {
+ "account_number": "0320"
+ },
+ "Geb\u00e4udeanteil h\u00e4usliches Arbeitszimmer": {
+ "account_number": "0329"
+ },
+ "Bauten auf fremden Grundst\u00fccken": {
+ "account_number": "0330"
+ },
+ "Einrichtungen f. Gesch\u00e4fts-, Fabrik-, Wohn- und andere Bauten": {
+ "account_number": "0398"
}
- },
- "Geleistete Anzahlungen und Anlagen im Bau": {
- "Geleistete Anzahlungen und Anlagen im Bau 1": {
- "Andere Anlagen- Betriebs- und Gesch\u00e4ftsaustattung im Bau": {},
- "Anzahlungen auf Gesch\u00e4fts- Fabrik- und andere Bauten auf fremden Grundst\u00fccken": {},
- "Anzahlungen auf Gesch\u00e4fts- Fabrik-und andere Bauten auf eigenen Grundst\u00fccken und grundst\u00fccksgleichen Rechten ": {},
- "Anzahlungen auf Grundst\u00fccke und grundst\u00fccksgleiche Rechte ohne Bauten": {},
- "Anzahlungen auf Wohnbauten auf eigenen Grundst\u00fccken und grundst\u00fccksgleichen Rechten": {},
- "Anzahlungen auf Wohnbauten auf fremden Grundst\u00fccken ": {},
- "Anzahlungen auf andere Anlagen- Betriebs und Gesch\u00e4ftsausstattung": {},
- "Anzahlungen auf technische Anlagen und Maschinen": {},
- "Gesch\u00e4fts- Fabrik- und andere Bauten im Bau auf eingenen Grundst\u00fccken": {},
- "Gesch\u00e4fts- Fabrik- und andere Bauten im Bau auf fremden Grundst\u00fccken": {},
- "Technische Anlagen und Maschinen im Bau ": {},
- "Wohnbauten im Bau": {}
+ },
+ "2 - technische Anlagen und Maschinen": {
+ "is_group": 1,
+ "Technische Anlagen und Maschinen": {
+ "account_number": "0400",
+ "account_type": "Fixed Asset"
+ },
+ "Technische Anlagen": {
+ "account_number": "0420"
+ },
+ "Maschinen": {
+ "account_number": "0440"
+ },
+ "Transportanlagen und \u00c4hnliches ": {
+ "account_number": "0450"
+ },
+ "Betriebsvorrichtungen": {
+ "account_number": "0470"
+ },
+ "Wertberichtigung Technische Anlagen und Maschinen": {
+ "account_number": "0409",
+ "account_type": "Accumulated Depreciation"
}
- },
- "Grundst\u00fccke- grundst\u00fccksgleiche Rechte und Bauten einschlie\u00dflich der Bauten auf fremden Grundst\u00fccken": {
- "Grundst\u00fccke- grundst\u00fccksgleiche Rechte und Bauten einschlie\u00dflich der Bauten auf fremden Grundst\u00fccken 1": {
- "Andere Bauten": {},
- "Au\u00dfenanlagen ": {},
- "Au\u00dfenanlagen 1": {},
- "Au\u00dfenanlagen f\u00fcr Gesch\u00e4fts- Fabrik- und andere Bauten ": {},
- "Bauten auf eigenen Grundst\u00fccken und grundst\u00fccksgleichen Rechten": {},
- "Bauten auf fremden Grundst\u00fccken": {},
- "Einrichtungen f\u00fcr Gesch\u00e4fts-Fabrik und andere Bauten": {},
- "Einrichtungen f\u00fcr Wohnbauten": {},
- "Fabrikbauten": {
- "account_type": "Fixed Asset"
- },
- "Garagen": {},
- "Geb\u00e4udeteile des h\u00e4uslischen Arbeitszimmers": {},
- "Gesch\u00e4ftsbauten": {},
- "Grundst\u00fccke mit Substanzverzehr": {},
- "Grundst\u00fccke und grundst\u00fccksgleiche Rechte ohne Bauten": {},
- "Grundst\u00fccksanteil des h\u00e4uslichen Arbeitszimmers": {},
- "Grundst\u00fccksgleiche Rechte (Erbbaurecht- Dauerwohnrecht)": {},
- "Grundst\u00fcckswerte eigener bebauter Grundst\u00fccke": {},
- "Hof- und Wegebefestigungen": {},
- "Unbebaute Grundst\u00fccke": {},
- "Wohnbauten": {}
+ },
+ "3 - andere Anlagen, Betriebs- und Gesch\u00e4ftsausstattung": {
+ "is_group": 1,
+ "Andere Anlagen, Betriebs- und Gesch\u00e4ftsausstattung": {
+ "account_number": "0500",
+ "account_type": "Fixed Asset"
+ },
+ "Andere Anlagen": {
+ "account_number": "0510"
+ },
+ "Pkw": {
+ "account_number": "0520"
+ },
+ "Lkw": {
+ "account_number": "0540"
+ },
+ "Sonstige Transportmittel": {
+ "account_number": "0560"
+ },
+ "Werkzeuge": {
+ "account_number": "0620"
+ },
+ "Betriebsausstattung": {
+ "account_number": "0630"
+ },
+ "Gesch\u00e4ftsausstattung": {
+ "account_number": "0635"
+ },
+ "Ladeneinrichtung": {
+ "account_number": "0640"
+ },
+ "B\u00fcroeinrichtung": {
+ "account_number": "0650"
+ },
+ "Ger\u00fcst- und Schalungsmaterial": {
+ "account_number": "0660"
+ },
+ "Geringwertige Wirtschaftsg\u00fcter": {
+ "account_number": "0670"
+ },
+ "Wirtschaftsg\u00fcter gr\u00f6\u00dfer 150 bis 1000 Euro (Sammelposten)": {
+ "account_number": "0675"
+ },
+ "Einbauten in fremde Grundst\u00fccke": {
+ "account_number": "0680"
+ },
+ "Sonstige Betriebs- und Gesch\u00e4ftsausstattung": {
+ "account_number": "0690"
}
- },
- "Technische Anlagen und Maschinen": {
- "Technische Anlagen und Maschinen 1": {
- "Betriebsvorrichtungen": {},
- "Maschinen": {
- "account_type": "Fixed Asset"
- },
- "Maschinen gebundene Werkzeuge": {},
- "Technische Anlagen ": {}
+ },
+ "4 - geleistete Anz. und Anlagen im Bau": {
+ "is_group": 1,
+ "Geleistete Anz. und Anlagen im Bau": {
+ "account_number": "0700",
+ "account_type": "Capital Work in Progress"
+ },
+ "Anz. auf Grundst\u00fcckeund grundst\u00fccksgleiche Rechte ohne Bauten ": {
+ "account_number": "0705"
+ },
+ "Gesch\u00e4fts-, Fabrik- und andere Bauten im Bau auf eigenen Grundst\u00fccken": {
+ "account_number": "0710"
+ },
+ "Anz. auf Gesch\u00e4fts-, Fabrik- und andere Bauten auf eigenen Grundst. und grundst\u00fccksgleichen Rechten ": {
+ "account_number": "0720"
+ },
+ "Wohnbauten im Bau": {
+ "account_number": "0725"
+ },
+ "Anz. auf Wohnbauten auf eigenen Grundst\u00fccken und grundst\u00fccksgleichen Rechten": {
+ "account_number": "0735"
+ },
+ "Gesch\u00e4fts-, Fabrik- und andere Bauten im Bau auf fremden Grundst\u00fccken": {
+ "account_number": "0740"
+ },
+ "Anz. auf Gesch\u00e4fts-, Fabrik- und andere Bauten auf fremden Grundst\u00fccken ": {
+ "account_number": "0750"
+ },
+ "Anz. auf Wohnbauten auf fremden Grundst\u00fccken": {
+ "account_number": "0765"
+ },
+ "Technische Anlagen und Maschinen im Bau": {
+ "account_number": "0770"
+ },
+ "Anz. auf technische Anlagen und Maschinen": {
+ "account_number": "0780"
+ },
+ "Andere Anlagen, Betriebs- und Gesch\u00e4ftsausstattung im Bau": {
+ "account_number": "0785"
+ },
+ "Andere Anlagen, Betriebs- und Gesch\u00e4ftsausstattung": {
+ "account_number": "0795"
}
- }
- },
- "account_type": "Fixed Asset"
- },
- "Umlaufverm\u00f6gen": {
- "Abgrenzungsposten": {
- "Abgrenzung latenter Steuern": {
- "Abgrenzung aktive latente Steuern ": {}
- },
- "Rechnungsabgrenzungsposten": {
- "Aktive Rechnungsabgrenzung": {
- "Als Aufwand ber\u00fccksichtigte Umstazsteuer auf Anzahlungen": {},
- "Als Aufwand ber\u00fccksichtigte Z\u00f6lle und Verbrauchsteuern auf Vorr\u00e4te": {},
- "Damnum/Disagio": {}
+ },
+ "is_group": 1
+ },
+ "III - Finanzanlagen": {
+ "1 - Anteile an verbundenen Unternehmen": {
+ "is_group": 1,
+ "Anteile an verbundenen Unternehmen": {
+ "account_number": "0800"
+ },
+ "Anteile an verbundenen Unternehmen, Personengesellschaften": {
+ "account_number": "0803"
+ },
+ "Anteile an verbundenen Unternehmen, Kapitalgesellschaften": {
+ "account_number": "0804"
+ },
+ "Anteile an herrschender oder mehrheitlich beteiligter Gesellschaft, Personengesellschaft": {
+ "account_number": "0805"
+ },
+ "Anteile an herrschender oder mehrheitlich beteiligter Gesellschaft, Kapitalgesellschaften": {
+ "account_number": "0808"
+ },
+ "Anteile an herrschender oder mit Mehrheit beteiligter Gesellschaft": {
+ "account_number": "0809"
}
- }
- },
- "Forderungen und sonstige Verm\u00f6gensgegenst\u00e4nde": {
- "Eingeforderte Nachsch\u00fcsse": {
- "Eingeforderte Nachsch\u00fcsse (gegenkonto 2929)": {}
- },
- "Eingeforderte- noch ausstehende Kapitaleinlagen": {
- "Ausstehende Einlagen auf das gezeichnete Kapital- eingefordert": {}
- },
- "Forderungen aus Lieferungen und Leistungen H-Saldo": {
- "Einzelwertberechtigungen zu Forderungen mit einer Restlaufzeit bis zu 1 Jahr": {},
- "Einzelwertberechtigungen zu Forderungen mit einer Restlaufzeit von mehr als 1 Jahr": {},
- "Gegenkonto zu sonstigen Verm\u00f6gensgegenst\u00e4nden bei Buchungen \u00fcber Debitorenkonto": {},
- "Pauschalwertberichtigung zu Forderung mit einer Restlaufzeit bis zu 1 Jahr": {},
- "Pauschalwertberichtigung zu Forderung mit einer Restlaufzeit von mehr als 1 Jahr": {}
- },
- "Forderungen aus Lieferungen und Leistungen H-Saldo oder sonstige Verbindlichkeiten S-Saldo": {
- "Gegenkonto 1221-1229- 1240-1245- 1250-1257- 1270-1279- 1290-1297 bei Aufteilung Debitorenkonto": {}
- },
- "Forderungen aus Lieferungen und Leistungen oder sonstige Verbindlichkeiten": {
- "Forderungen aus Lieferungen und Leistungen ": {
- "Forderungen aus Dienstleistungen": {
- "account_type": "Receivable"
- },
- "Forderungen aus Lieferungen und Leistungen nach Durchschnittss\u00e4tzen gem\u00e4\u00df \u00a724 UStG (E\u00fcR)": {
- "account_type": "Receivable"
- },
- "Forderungen aus Lieferungen und Leistungen ohne Kontokorent": {},
- "Forderungen aus Lieferungen und Leistungen ohne Kontokorent - Restlaufzeit bis 1 Jahr": {},
- "Forderungen aus Lieferungen und Leistungen ohne Kontokorent - Restlaufzeit gr\u00f6\u00dfer 1 Jahr.": {},
- "Forderungen aus Lieferungen und Leistungen zum allgemeinen Umsatzsteuersatz oder eines Kleinunternehmers (E\u00fcR)": {
- "account_type": "Receivable"
- },
- "Forderungen aus Lieferungen und Leistungen zum erm\u00e4\u00dfigten Umsatzsteuersatz (E\u00fcR)": {
- "account_type": "Receivable"
- },
- "Forderungen aus steuerfreien oder nicht steuerbaren Lieferungen und Leistungen (E\u00fcR)": {
- "account_type": "Receivable"
- },
- "Forderungen nach \u00a711 Abs. 1 Satz 2 EStG f\u00fcr \u00a7 4/3 EStG": {
- "account_type": "Receivable"
- },
- "Gegenkonto 1215-1218 bei Aufteilung der Forderungen nach Steuers\u00e4tzen (E\u00fcR)": {
- "account_type": "Receivable"
- },
- "Wechsel aus Lieferungen und Leistungen": {},
- "Wechsel aus Lieferungen und Leistungen Restlaufzeit bis 1 Jahr": {},
- "Wechsel aus Lieferungen und Leistungen Restlaufzeit gr\u00f6\u00dfer 1 Jahr": {},
- "Wechsel aus Lieferungen und Leistungen- bundesbankf\u00e4hig.": {},
- "Zweifelhafte Forderungen": {},
- "Zweifelhafte Forderungen - Restlaufzeit bis 1 Jahr": {},
- "Zweifelhafte Forderungen - Restlaufzeit gr\u00f6\u00dfer 1 Jahr": {}
- },
- "Forderungen aus Lieferungen und Leistungen gegen Gesellschafter": {
+ },
+ "2 - Ausleihungen an verb. Unternehmen": {
+ "is_group": 1,
+ "Ausleihungen an verb. Unternehmen": {
+ "account_number": "0880"
+ },
+ "Ausleihungen an Unternehmen, mit denen ein Beteiligungsverh. besteht, Personengesellschaften": {
+ "account_number": "0883"
+ },
+ "Ausleihungen an Unternehmen, mit denen ein Beteiligungsverh. besteht, Kapitalgesellschaften": {
+ "account_number": "0885"
+ }
+ },
+ "3 - Beteiligungen": {
+ "is_group": 1,
+ "Beteiligungen": {
+ "account_number": "0820"
+ },
+ "Typisch stille Beteiligungen": {
+ "account_number": "0830"
+ },
+ "Atypisch stille Beteiligungen": {
+ "account_number": "0840"
+ },
+ "Beteiligungen an Kapitalgesellschaften": {
+ "account_number": "0850"
+ },
+ "Beteiligungen an Personengesellschaften": {
+ "account_number": "0860"
+ }
+ },
+ "4 - Ausleihungen an Unternehmen, mit denen ein Beteiligungsverh. besteht": {
+ "is_group": 1
+ },
+ "5 - Wertpapiere des Anlageverm\u00f6gens": {
+ "is_group": 1,
+ "Wertpapiere des Anlageverm\u00f6gens": {
+ "account_number": "0900"
+ },
+ "Wertpapiere mit Gewinnbeteiligungsanspr\u00fcchen, die dem Teileink\u00fcnfteverfahren unterliegen": {
+ "account_number": "0910"
+ },
+ "Festverzinsliche Wertpapiere": {
+ "account_number": "0920"
+ },
+ "Genossenschaftsanteile zum langfristigen Verbleib": {
+ "account_number": "0980"
+ },
+ "R\u00fcckdeckungsanspr\u00fcche aus Lebensversicherungen zum langfristigen Verbleib": {
+ "account_number": "0990"
+ }
+ },
+ "6 - sonstige Ausleihungen": {
+ "is_group": 1,
+ "Sonstige Ausleihungen": {
+ "account_number": "0930"
+ },
+ "Darlehen": {
+ "account_number": "0940"
+ },
+ "Ausleihungen an stille Gesellschafter": {
+ "account_number": "0964"
+ }
+ },
+ "is_group": 1
+ }
+ },
+ "B - Umlaufverm\u00f6gen": {
+ "I - Vorr\u00e4te": {
+ "1 - Roh-, Hilfs- und Betriebsstoffe": {
+ "is_group": 1,
+ "Roh-, Hilfs- und Betriebsstoffe (Bestand)": {
+ "account_number": "1000",
+ "account_type": "Stock"
+ }
+ },
+ "2 - unfertige Erzeugnisse, unfertige Leistungen": {
+ "is_group": 1,
+ "Unfertige Erzeugnisse, unfertige Leistungen (Bestand)": {
+ "account_number": "1040",
+ "account_type": "Stock"
+ },
+ "Unfertige Erzeugnisse (Bestand)": {
+ "account_number": "1050"
+ },
+ "Unfertige Leistungen": {
+ "account_number": "1080"
+ },
+ "In Ausf\u00fchrung befindliche Bauauftr\u00e4ge": {
+ "account_number": "1090"
+ },
+ "In Arbeit befindliche Auftr\u00e4ge": {
+ "account_number": "1095"
+ }
+ },
+ "3 - fertige Erzeugnisse und Waren": {
+ "is_group": 1,
+ "Fertige Erzeugnisse und Waren (Bestand)": {
+ "account_number": "1100",
+ "account_type": "Stock"
+ },
+ "Fertige Erzeugnisse (Bestand)": {
+ "account_number": "1110"
+ },
+ "Waren (Bestand)": {
+ "account_number": "1140"
+ },
+ "Erhaltene Anz. auf Bestellungen (von Vorr\u00e4ten offen abgesetzt)": {
+ "account_number": "1190"
+ }
+ },
+ "is_group": 1
+ },
+ "II - Forderungen und sonstige VG": {
+ "account_type": "Receivable",
+ "1 - Forderungen aus Lieferungen und Leistungen": {
+ "account_type": "Receivable",
+ "is_group": 1,
+ "Bewertungskorrektur zu Forderungen aus Lieferungen und Leistungen": {
+ "account_number": "9960"
+ },
+ "Debitoren": {
+ "is_group": 1,
+ "account_number": "10000"
+ },
+ "Forderungen aus Lieferungen und Leistungen": {
+ "account_number": "1200",
"account_type": "Receivable"
- },
- "Forderungen aus Lieferungen und Leistungen gegen Gesellschafter - Restlaufzeit bis 1 Jahr": {},
- "Forderungen aus Lieferungen und Leistungen gegen Gesellschafter - Restlaufzeit gr\u00f6\u00dfer 1 Jahr": {}
- },
- "Forderungen gegen Unternehmen- mit denen ein Beteiligungsverh\u00e4ltnis besteht H-Saldo": {
- "is_group": 1
- },
- "Forderungen gegen verbundene Unternehmen H-Saldo": {
- "Wertberichtigungen zu Forderungen mit einer Restlaufzeit bis zu 1 Jahr gegen verbundene Unternehmen": {},
- "Wertberichtigungen zu Forderungen mit einer Restlaufzeit von mehr als 1 Jahr gegen verbundene Unternehmen": {}
- },
- "Forderungen gegen verbundene Unternehmen oder Verbindlichkeiten gegen\u00fcber verbundenen Unternehmen": {
- "Forderungen gegen verbundene Unternehmen ": {
- "Besitzwechsel gegen verbundene Unternehmen": {},
- "Besitzwechsel gegen verbundene Unternehmen - Restlaufzeit bis 1 Jahr": {},
- "Besitzwechsel gegen verbundene Unternehmen - Restlaufzeit gr\u00f6\u00dfer Jahr": {},
- "Besitzwechsel gegen verbundene Unternehmen- bundesbankf\u00e4hig": {},
- "Forderungen aus Lieferungen und Leistungen gegen verbundenen Unternehmen": {
- "account_type": "Receivable"
- },
- "Forderungen aus Lieferungen und Leistungen gegen verbundenen Unternehmen - Restlaufzeit bis 1 Jahr": {},
- "Forderungen aus Lieferungen und Leistungen gegen verbundenen Unternehmen - Restlaufzeit gr\u00f6\u00dfer 1 Jahr": {},
- "Forderungen gegen verbundene Unternehmen - Restlaufzeit bis 1 Jahr. ": {},
- "Forderungen gegen verbundene Unternehmen - Restlaufzeit gr\u00f6\u00dfer 1 Jahr. ": {}
- }
- },
- "Sonstige Verbindlichkeiten S-Saldo": {
- "Verrechnungskonto erhaltene Anzahlungen bei Buchungen \u00fcber Debitorenkonto": {}
- },
- "Sonstige Verm\u00f6gensgegenst\u00e4nde": {
- "Agenturwarenabrechnung": {},
- "Anspr\u00fcche aus R\u00fcckdeckungsversicherungen": {},
- "Forderungen an das Finanzamt aus abgef\u00fchrtem Bauabzugsbetrag": {},
- "Forderungen aus einrichteten Verbrauchsteuern": {},
- "Genossenschaftsanteile zum kurzfristigen Verbleib": {},
- "GmbH-Anteile zum kurzfristigen Verbleib": {},
- "K\u00f6rperschaftsteuerguthaben nach \u00a7 37 KStG - Restlaufzeit bis 1 Jahr": {},
- "K\u00f6rperschaftsteuerguthaben nach \u00a7 37 KStG - Restlaufzeit gr\u00f6\u00dfer 1 Jahr": {},
- "K\u00f6rperschaftsteuerr\u00fcckforderung": {},
- "Sonstige Verm\u00f6gensgegenst\u00e4nde 1": {
- "Darlehen": {},
- "Darlehen - Restlaufzeit bis 1 jahr": {},
- "Darlehen - Restlaufzeit gr\u00f6\u00dfer 1 jahr": {},
- "Forderung gegen Aufsichtsrats- und Beirats- Mitglieder": {},
- "Forderung gegen Aufsichtsrats- und Beirats- Mitglieder - Restlaufzeit bis 1 Jahr": {},
- "Forderung gegen Aufsichtsrats- und Beirats- Mitglieder - Restlaufzeit gr\u00f6\u00dfer 1 Jahr": {},
- "Forderungen gegen Gesellschafter": {},
- "Forderungen gegen Gesellschafter - Restlaufzeit bis 1 Jahr": {},
- "Forderungen gegen Gesellschafter - Restlaufzeit gr\u00f6\u00dfer 1 Jahr": {},
- "Forderungen gegen Personal aus Lohn- und Gehaltsabrechnung": {},
- "Forderungen gegen Personal aus Lohn- und Gehaltsabrechnung - Restlaufzeit bis 1 Jahr": {},
- "Forderungen gegen Personal aus Lohn- und Gehaltsabrechnung - Restlaufzeit gr\u00f6\u00dfer 1 Jahr": {},
- "Forderungen gegen Vorstandsmitglieder und Gesch\u00e4ftsf\u00fchrer": {},
- "Forderungen gegen Vorstandsmitglieder und Gesch\u00e4ftsf\u00fchrer - Restlaufzeit bis 1 Jahr": {},
- "Forderungen gegen Vorstandsmitglieder und Gesch\u00e4ftsf\u00fchrer - Restlaufzeit gr\u00f6\u00dfer 1 Jahr": {},
- "Kautionen ": {},
- "Kautionen - Restlaufzeit bis 1 Jahr": {},
- "Kautionen - Restlaufzeit gr\u00f6\u00dfer 1 Jar": {},
- "Sonstige Verm\u00f6gensgegenst\u00e4nde - Restlaufzeit bis 1 Jahr": {},
- "Sonstige Verm\u00f6gensgegenst\u00e4nde - Restlaufzeit gr\u00f6\u00dfer 1 Jahr": {}
- },
- "Steuererstattungsanspruch gegen\u00fcber andere EG-L\u00e4ndern": {},
- "Steuer\u00fcberzahlungen": {},
- "Umsatzsteuerforderung": {},
- "Umsatzsteuerforderungen Vorjahr": {},
- "Umsatzsteuerforderungen fr\u00fchere Jahre": {}
- },
- "Sonstige Verm\u00f6gensgegenst\u00e4nde oder sonstige Verbindlichkeiten": {
- "Abziehbare Vorsteuer": {
- "account_type": "Tax",
- "is_group": 1,
- "Abziehbare Vorsteuer 16%": {},
- "Abziehbare Vorsteuer 19%": {},
- "Abziehbare Vorsteuer 7%": {},
- "Abziehbare Vorsteuer aus der Auslagerung von Gegenst\u00e4nden aus einem Unsatzsteuerlager": {},
- "Abziehbare Vorsteuer aus innergemeinschaftlichem Erwerb": {},
- "Abziehbare Vorsteuer aus innergemeinschaftlichem Erwerb 16%": {},
- "Abziehbare Vorsteuer aus innergemeinschaftlichem Erwerb 19%": {},
- "Abziehbare Vorsteuer aus innergemeinschaftlichem Erwerb von Neufahrzeugen von Lieferanten ohne Ust-Identifikationsnummer": {},
- "Abziehbare Vorsteuer nach \u00a7 13b UStG ": {},
- "Abziehbare Vorsteuer nach \u00a7 13b UStG 16%": {},
- "Abziehbare Vorsteuer nach \u00a7 13b UStG 19%": {}
},
- "Aufl\u00f6sung Vorsteuer aus Vorjahr \u00a7 4/3 EStG": {},
- "Aufzuteilende Vorsteuer": {},
- "Aufzuteilende Vorsteuer 16%": {},
- "Aufzuteilende Vorsteuer 19%": {},
- "Aufzuteilende Vorsteuer 7%": {},
- "Aufzuteilende Vorsteuer aus innergemeinschaftlichem Erwerb": {},
- "Aufzuteilende Vorsteuer aus innergemeinschaftlichem Erwerb 19%": {},
- "Aufzuteilende Vorsteuer nach \u00a7\u00a7 13a/13b UStG": {},
- "Aufzuteilende Vorsteuer nach \u00a7\u00a7 13a/13b UStG 16%": {},
- "Aufzuteilende Vorsteuer nach \u00a7\u00a7 13a/13b UStG 19%": {},
- "Bezahlte Einfuhrumsatzsteuer": {},
- "Durchlaufende Posten": {},
- "Fremdgeld": {},
- "Gegenkonto Vorsteuer \u00a7 4/3 EStG": {},
- "Gegenkonto f\u00fcr Vorsteuer nach Durchschnittss\u00e4tzen f\u00fcr \u00a7 4 Abs. 3 EStG": {},
- "Geldtransit": {},
- "Nachtr\u00e4glich abziehbare Vorsteuer- \u00a7 15a Abs. 1 UStG- bewegliche Wirtschaftsg\u00fcter": {},
- "Nachtr\u00e4glich abziehbare Vorsteuer- \u00a7 15a Abs. 2 UStG": {},
- "Nat\u00fcrlich abziehbare Vorsteuer- \u00a7 15a Abs. 1 UStG- unbewegliche Wirtschaftsg\u00fcter": {},
- "Umsatzsteuerforderungen laufendes Jahr": {},
- "Verrechnungskonto Gewinnermittlung \u00a7 4/3 EStG- ergebniswirksam": {},
- "Verrechnungskonto Gewinnermittlung \u00a7 4/3 EStG- nicht ergebniswirksam": {},
- "Verrechnungskonto Ist-Versteuerung": {},
- "Vorsteuer aus Investitionen \u00a7 4/3 EStG": {},
- "Vorsteuer im Folgejahr abziehbar": {},
- "Vorsteuer nach allgemeinen Durchschnittss\u00e4tzen UStVA Kz. 63": {},
- "Wirtschaftsg\u00fcter des Umlaufverm\u00f6gens gem\u00e4\u00df \u00a74 Abs. 3 Satz 4 EStG": {},
- "Zur\u00fcckzahlende Vorsteuer- \u00a7 15a Abs. 1 UStG- unbewegliche Wirtschaftsg\u00fcter": {},
- "Zur\u00fcckzuzahlende Vorsteuer- \u00a7 15a Abs. 1 UStG- bewegliche Wirtschaftsg\u00fcter": {},
- "Zur\u00fcckzuzahlende Vorsteuer- \u00a7 15a Abs. 2 UStG": {},
- "\u00fcberleitungskonto Kostenstellen": {}
- }
- },
- "Kassenbestand- Bundesbankguthaben- Guthaben bei Kreditinstituten und Schecks": {
- "Kassenbestand - Bundesbankguthaben - Guthaben b. Kreditinstit. u. Schecks o. Verbindlichk. geg. Kreditinstituten": {
- "Bank": {},
- "Bank 1": {},
- "Bank 2": {},
- "Bank 3": {},
- "Bank 4": {},
- "Bank 5": {},
- "Bundesbankguthaben": {},
- "Finanzmittelanlagen im Rahmen der Kurzfristigen Finanzdisposition": {},
- "LZB-Guthaben": {},
- "Postbank": {},
- "Postbank 1": {},
- "Postbank 2": {},
- "Postbank 3": {},
- "Verbindlichkeiten gegen\u00fcber Kreditinstituten (nicht im Finanzmittelfonds enthalten)": {},
- "account_type": "Bank"
- },
- "Kassenbestand- Bundesbankguthaben- Guthaben bei Kreditinstituten und Schecks 1": {
- "Kasse ": {
- "Nebenkasse 1": {},
- "Nebenkasse 2": {},
- "account_type": "Cash"
- },
- "Schecks": {}
- }
- },
- "Vorr\u00e4te": {
- "Erhaltene Anzahlungen auf Bestellungen": {
- "Erhaltene Anzahlungen auf Bestellungen (": {}
- },
- "Fertige Erzeugnisse und Waren": {
- "* Lager Bestand Zwischenkonto": {
- "account_type": "Stock Adjustment"
- },
- "* Lager Bestandswert Korrektur": {
- "account_type": "Expenses Included In Valuation"
- },
- "* Lager Differenzkorrektur Gewinn / Verlust": {},
- "* Lager Differenzkorrektur Marktwert": {},
- "Fertige Erzeugnisse (Bestand)": {},
- "Fertige Erzeugnisse und Waren (Bestand)": {},
- "Waren (Bestand)": {}
- },
- "Geleistete Anzahlungen ": {
- "Geleistete Anzahlungen auf Vorr\u00e4te": {
- "Geleistete Anzahlungen 15% Vorsteuer": {},
- "Geleistete Anzahlungen 16% Vorsteuer": {},
- "Geleistete Anzahlungen 19% Vorsteuer": {},
- "Geleistete Anzahlungen 7% Vorsteuer": {}
- }
- },
- "In Arbeit befindliche Auftr\u00e4ge ": {
- "In Arbeit befindliche Auftr\u00e4ge 1": {}
- },
- "In Ausf\u00fchrung befindliche Bauauftr\u00e4ge": {
- "In Ausf\u00fchrung befindliche Bauauftr\u00e4ge 1": {}
- },
- "Roh- Hilfs- und Betriebsstoffe": {
- "Roh- Hilfs- und Betriebsstoffe (Bestand)": {
- "account_type": "Cost of Goods Sold"
- }
- },
- "Unfertige Erzeugnisse- unfertige Leistungen": {
- "Unfertige Erzeugnisse": {},
- "Unfertige Erzeugnisse- unfertige Leistungen (Bestand)": {},
- "Unfertige Leistungen": {}
- },
- "account_type": "Stock"
- },
- "Wertpapiere": {
- "Anteile an verbundenen Unternehmen": {
- "Anteile an herrschender oder mit Mehrheit beteiligter Gesellschaft": {},
- "Anteile an verbundenen Unternehmen (Umlaufverm\u00f6gen)": {}
- },
- "Eigene Anteile ": {
- "Eigene Anteile 1": {}
- },
- "Sonstige Wertpapiere": {
- "Sonstige Wertpapiere 1": {
- "Andere Wertpapiere mit unwesentlichen Wertschwankungen im Sinne Textziffer 18 DRS 2": {},
- "Finanzwechsel": {},
- "Wertpapieranlagen im Rahmen der Kurzfristigen Finanzdisposition ": {}
- }
- }
- }
- },
- "root_type": "Asset"
- },
- "Bilanz - Passiva": {
- "Eigenkapital": {
- "Gewinnr\u00fccklagen": {
- "Andere Gewinnr\u00fccklagen": {
- "Andere Gewinnr\u00fccklagen 1": {
- "Eigenkapitalanteil von Wertaufholungen": {}
- }
- },
- "Gesetzliche R\u00fccklagen": {
- "Gesetzliche R\u00fccklagen 1": {}
- },
- "R\u00fccklage f\u00fcr Eigene Anteile": {
- "R\u00fccklage f\u00fcr Eigene Anteile 1": {}
- },
- "Satzungsm\u00e4\u00dfige R\u00fccklagen": {
- "Satzungsm\u00e4\u00dfige R\u00fccklagen 1": {}
- }
- },
- "Gewinnvortrag / Verlustvortrag vor Verwendung": {
- "Gewinnvortrag / Verlustvortrag": {
- "Gewinnvortrag vor Verwendung": {},
- "Verlustvortrag vor Verwendung": {}
- },
- "Vortrag auf neue Rechnung ": {
- "Vortrag auf neue Rechnung (Bilanz)": {}
- }
- },
- "Gezeichnetes Kapital": {
- "Gezeichnetes Kapital 1": {
- "Gezeichnetes Kapital 2": {}
- },
- "Nicht eingeforderte ausstehende Einlagen": {
- "is_group": 1
- }
- },
- "Kapital Teilhaber": {
- "(zur freien Verf\u00fcgung ) 1": {},
- "Gesellschafter-Darlehen 3": {},
- "Kommandit-Kapital": {},
- "Verlustausgleichskonto": {}
- },
- "Kapital Vollhafter / Einzelunternehmer": {
- "(zur freien Verf\u00fcgung )": {},
- "Festkapital": {},
- "Gesellschafter-Darlehen 2": {},
- "Variables Kapital": {}
- },
- "Kapitalr\u00fccklage": {
- "Kapitalr\u00fccklage 1": {
- "Kapitalr\u00fccklage 2": {
- "Andere Zuzahlungen in das Eigenkapital ": {},
- "Eingefordertes Nachschusskapital (Gegenkonto 1299)": {},
- "Kapitalr\u00fccklage durch Ausgabe von Anteilen \u00fcber Nennbetrag": {},
- "Kapitalr\u00fccklage durch Ausgabe von Schuldverschreibungen f\u00fcr Wandlungsrechte und Optionsrechte zum Erwerb von Anteilen": {},
- "Kapitalr\u00fccklage durch Zuzahlungen gegen Gew\u00e4hrung eines Vorzugs f\u00fcr Anteile": {}
- }
- }
- },
- "Privat Teilhafter": {
- "Ausgew\u00f6hnliche Belastungen": {},
- "Grundst\u00fccksaufwand 1": {},
- "Grundst\u00fccksertrag 1": {},
- "Privateinlagen 1": {},
- "Privatentnahmen allgemein 1": {},
- "Privatsteuern 1": {},
- "Sonderausgaben beschr\u00e4nkt abzugsf\u00e4hig 1": {},
- "Sonderausgaben unbeschr\u00e4nkt abzugsf\u00e4hig 1": {},
- "Unentgeltliche Wertabgaben 1": {},
- "Zuwendungen- Spenden 1": {}
- },
- "Privat Vollhafter/ Einzelunternehmer": {
- "Ausgew\u00f6hnliche Belastungen 1": {},
- "Grundst\u00fccksaufwand (Umsatzsteuerschl\u00fcssel m\u00f6glich)": {},
- "Grundst\u00fccksaufwand 2": {},
- "Grundst\u00fccksertrag ( Umsatzsteuerschl\u00fcssel m\u00f6glich)": {},
- "Grundst\u00fccksertrag 2": {},
- "Privateinlagen 2": {},
- "Privatentnahmen allgemein 2": {},
- "Privatsteuern 2": {},
- "Sonderausgaben beschr\u00e4nkt abzugsf\u00e4hig 2": {},
- "Sonderausgaben unbeschr\u00e4nkt abzugsf\u00e4hig 2": {},
- "Unentgeltliche Wertabgaben 2": {},
- "Zuwendungen- Spenden 2": {}
- },
- "Sonderposten mit R\u00fccklageanteil": {
- "Sonderposten aus der W\u00e4hrungsumstellung auf den Euro": {
- "Sonderposten aus der W\u00e4hrungsumstellung auf den Euro 1": {}
- },
- "Sonderposten f\u00fcr Zusch\u00fcsse und Zulagen": {
- "Sonderposten f\u00fcr Zusch\u00fcsse und Zulagen 1": {}
- },
- "Sonderposten mit R\u00fccklageanteil 1": {
- "Sonderposten mit R\u00fccklageanteil f\u00fcr F\u00f6rderung nach \u00a7 3 ZonenRFG / \u00a74-6 F\u00f6rdergebietsG": {},
- "Sonderposten mit R\u00fccklageanteil nach Abschnitt 35 EStG": {},
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 1 EntwLStG": {},
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 14 BerlinFG": {},
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 4d EStG": {},
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 52 Abs. 16 EStG": {},
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 6b EStG": {},
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 6d EStG": {},
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 79 EStDV": {},
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 7d EStG": {},
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 7g Abs. 1 EStG": {},
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 7g Abs. 3 u. 7 EStG": {},
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 80 EStDV": {},
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 82a EStDV": {},
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 82d EStDV": {},
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 82e EStDV": {},
- "Sonderposten mit R\u00fccklageanteil steuerfreie R\u00fccklagen": {},
- "Sonderposten mit R\u00fccklageanteil- Sonderabschreibung": {}
- }
- }
- },
- "Fremdkapital": {
- "Rechnungsabgrenzungsposten 1": {
- "Rechnungsabgrenzungsposten 2": {
- "Passive Rechnungsabgrenzung 1": {}
- },
- "Sonstige Passiva oder sontige Aktiva": {
- "Abgrenzungen zur unterj\u00e4hrigen Kostenverrechnung f\u00fcr BWA": {}
- }
- },
- "R\u00fcckstellungen ": {
- "R\u00fcckstellungen f\u00fcr Pensionen und \u00e4hnliche Verpflichtungen": {
- "R\u00fcckstellungen f\u00fcr Pensionen und \u00e4hnliche Verpflichtungen 1": {
- "Pensionsr\u00fcckstellungen": {},
- "R\u00fcckstellungen f\u00fcr Pensions\u00e4hnliche Verpflichtungen": {}
- }
- },
- "Sonstige R\u00fcckstellungen": {
- "Sonstige R\u00fcckstellungen 1": {
- "Aufwandsr\u00fcckstellungen gem\u00e4\u00df \u00a7 249 Abs. 2 HGB": {},
- "R\u00fcckstellungen f\u00fcr Abraum- und Abfallbeseitigung": {},
- "R\u00fcckstellungen f\u00fcr Abschluss- und Pr\u00fcfungskosten": {},
- "R\u00fcckstellungen f\u00fcr Gew\u00e4hrleistungen (Gegenkonto 6790)": {},
- "R\u00fcckstellungen f\u00fcr Personelkosten": {},
- "R\u00fcckstellungen f\u00fcr Umweltschutz": {},
- "R\u00fcckstellungen f\u00fcr drohende Verluste aus schwebenden Gesch\u00e4ften": {},
- "R\u00fcckstellungen f\u00fcr unterlassene Aufwendungenn f\u00fcr Instandhaltung- Nachholung in den ersten drei Monaten": {},
- "R\u00fcckstellungen f\u00fcr unterlassene Aufwendungenn f\u00fcr Instandhaltung- Nachholung innerhalb des 4. bis 12. Monats": {},
- "R\u00fcckstellungen zur Erf\u00fcllung der Aufbewahrungspflichten": {}
- }
- },
- "Steuerr\u00fcckstellungen": {
- "Steuerr\u00fcckstellungen 1": {
- "Gewerbesteuerr\u00fcckstellung": {},
- "K\u00f6rperschaftsteuerr\u00fcckstellung": {},
- "R\u00fcckstellung f\u00fcr latente Steuern ": {}
- }
- }
- },
- "Verbindlichkeiten ": {
- "Anleihen": {
- "Anleihen- nicht konvertibel": {
- "Anleihen- konvertibel": {},
- "Anleihen- konvertibel Restlaufzeit 1 bis 5 Jahre": {},
- "Anleihen- konvertibel Restlaufzeit bis 1 Jahr": {},
- "Anleihen- konvertibel Restlaufzeit gr\u00f6\u00dfer 5 Jahr": {},
- "Anleihen- nicht konvertibel Restlaufzeit 1 bis 5 Jahre": {},
- "Anleihen- nicht konvertibel Restlaufzeit bis 1 Jahr": {},
- "Anleihen- nicht konvertibel Restlaufzeit gr\u00f6\u00dfer 5 Jahre ": {}
- }
- },
- "Erhaltene Anzahlungen auf Bestellungen 1": {
- "Erhaltene Anzahlungen auf Bestellungen 2": {
- "Erhaltene Anzahlungen 15% USt": {},
- "Erhaltene Anzahlungen 16% USt": {},
- "Erhaltene Anzahlungen 7% USt": {},
- "Erhaltene Anzahlungen Restlaufzeit 1 bis 5 Jahre": {},
- "Erhaltene Anzahlungen Restlaufzeit bis 1 Jahr": {},
- "Erhaltene Anzahlungen Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {},
- "Erhaltene- versteuerte Anzahlungen 19% Ust (Verbindlichkeiten)": {}
- }
- },
- "Sonstige Verbindlichkeiten ": {
- "Sonstige Verbindlichkeiten 1": {
- "(frei- in Bilanz kein Restlaufzeit vermerkt)": {},
- "Agenturwarenabrechnungen": {},
- "Darlehen - Restlaufzeit 1 bis 5 jahre": {},
- "Darlehen - Restlaufzeit bis 1 jahr 1": {},
- "Darlehen - Restlaufzeit gr\u00f6\u00dfer 5 jahre": {},
- "Darlehen 2": {},
- "Darlehen atypisch stiller Gesellschaftler ": {},
- "Darlehen atypisch stiller Gesellschaftler - Restlaufzeit 1 bis 5 Jahre": {},
- "Darlehen atypisch stiller Gesellschaftler - Restlaufzeit bis 1 Jahr": {},
- "Darlehen atypisch stiller Gesellschaftler - Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {},
- "Darlehen typisch stiller Gesellschaftler": {},
- "Darlehen typisch stiller Gesellschaftler - Restlaufzeit 1 bis 5 Jahre": {},
- "Darlehen typisch stiller Gesellschaftler - Restlaufzeit bis 1 Jahr": {},
- "Darlehen typisch stiller Gesellschaftler - Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {},
- "Erhaltene Kautionen": {},
- "Erhaltene Kautionen - Restlaufzeit 1 bis 5 Jahre": {},
- "Erhaltene Kautionen - Restlaufzeit bis 1 Jahr": {},
- "Erhaltene Kautionen - Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {},
- "Gegenkonto 3500-3569 bei Aufteilung der Konten 3570-3598": {},
- "Kreditkartenabrechnung": {},
- "Partiarische Darlehen": {},
- "Partiarische Darlehen - Restlaufzeit 1 bis 5 Jahre": {},
- "Partiarische Darlehen - Restlaufzeit bis 1 Jahr": {},
- "Partiarische Darlehen - Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {},
- "Sonstige Verbindlichkeiten - Restlaufzeit 1 bis 5 Jahre": {},
- "Sonstige Verbindlichkeiten - Restlaufzeit bis 1 Jahr": {},
- "Sonstige Verbindlichkeiten - Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {},
- "Sonstige Verbindlichkeiten z.B. nach \u00a7 11 Abs. 2 Satz 2 EStG f\u00fcr \u00a7 4/3 EStG": {},
- "Verbindlichkeiten gegen\u00fcber Gesellschaftern ": {},
- "Verbindlichkeiten gegen\u00fcber Gesellschaftern - Restlaufzeit 1 bis 5 Jahre": {},
- "Verbindlichkeiten gegen\u00fcber Gesellschaftern - Restlaufzeit bis 1 Jahr": {},
- "Verbindlichkeiten gegen\u00fcber Gesellschaftern - Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {},
- "Verbindlichkeiten gegen\u00fcber Gesellschaftern f\u00fcr offene Aussch\u00fcttungen": {}
- },
- "Steuerzahlungen an andere EG-L\u00e4nder": {},
- "Umsatzsteuer aus im anderen EG-Land steuerpflichtigen Lieferungen": {},
- "Umsatzsteuer aus im anderen EG-Land steuerpflichtigen sonstigen Leistungen/Werlieferungen": {},
- "Verbindlichkeiten an das Finanzamt aus abzuf\u00fchrendem Bauabzugsbetrag": {},
- "Verbindlichkeiten aus Betriebssteuern und -abgaben": {},
- "Verbindlichkeiten aus Betriebssteuern und -abgaben - Restlaufzeit 1 bis 5 Jahre": {},
- "Verbindlichkeiten aus Betriebssteuern und -abgaben - Restlaufzeit bis 1 Jahr": {},
- "Verbindlichkeiten aus Betriebssteuern und -abgaben - Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {},
- "Verbindlichkeiten aus Einbehaltungen (KapESt und Solz auf KapESt)": {},
- "Verbindlichkeiten aus Lohn und Gehalt": {},
- "Verbindlichkeiten aus Verm\u00f6gensbildung ": {},
- "Verbindlichkeiten aus Verm\u00f6gensbildung - Restlaufzeit 1 bis 5 Jahre": {},
- "Verbindlichkeiten aus Verm\u00f6gensbildung - Restlaufzeit bis 1 Jahr": {},
- "Verbindlichkeiten aus Verm\u00f6gensbildung - Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {},
- "Verbindlichkeiten f\u00fcr Einbehaltungen von Arbeitnehmern": {},
- "Verbindlichkeiten f\u00fcr Verbrauchsteuern": {},
- "Verbindlichkeiten im Rahmen der sozialen Sicherheit": {},
- "Verbindlichkeiten im Rahmen der sozialen Sicherheit (f\u00fcr \u00a7 4/3 EStG)": {},
- "Verbindlichkeiten im Rahmen der sozialen Sicherheit - Restlaufzeit 1 bis 5 Jahre": {},
- "Verbindlichkeiten im Rahmen der sozialen Sicherheit - Restlaufzeit bis 1 Jahr": {},
- "Verbindlichkeiten im Rahmen der sozialen Sicherheit - Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {},
- "Voraussichtliche Beitragsschuld gegen\u00fcber den Sozialversicherungstr\u00e4gern": {}
- },
- "Sonstige Verm\u00f6gensgegenst\u00e4nde H-Saldo": {
- "Verrechnungskonto geleistete Anzahlungen bei Buchung \u00fcber Kreditorenkonto": {}
- },
- "Sonstige Verm\u00f6gensgegenst\u00e4nde oder sonstige Verbindlichkeiten 1": {
- "Einfuhrumsatzsteuer aufgeschoben bis": {},
- "Gewinnverf\u00fcgungskonto stille Gesellschafter": {},
- "In Rechnung unrichtig oder unberechtigt ausgewiesene Steuerbetr\u00e4ge- UStVA Kz. 69": {},
- "Lohn- und Gehaltsverrechnungskonto": {
- "Lohn- und Gehaltsverrechnung \u00a7 11 Abs. 2 EStG f\u00fcr \u00a7 a Abs. 3 EStG": {}
- },
- "Nachsteuer- UStVA Kz. 65": {},
- "Sonstige Verrechnungskonten (Interimskonto)": {
- "account_type": "Stock Received But Not Billed"
- },
- "Umsatzsteuer": {
- "account_type": "Tax",
- "is_group": 1,
- "Umsatzsteuer 16%": {},
- "Umsatzsteuer 19%": {},
- "Umsatzsteuer 7%": {},
- "Umsatzsteuer Vorjahr": {},
- "Umsatzsteuer aus der Auslagerung von Gegenst\u00e4nden aus einem Umsatzsteuerlager": {},
- "Umsatzsteuer aus im Inland steuerpflichtigen EG-Lieferungen": {},
- "Umsatzsteuer aus im Inland steuerpflichtigen EG-Lieferungen 19%": {},
- "Umsatzsteuer aus innergemeinschaftlichem Erwerb ": {},
- "Umsatzsteuer aus innergemeinschaftlichem Erwerb 16%": {},
- "Umsatzsteuer aus innergemeinschaftlichem Erwerb 19%": {},
- "Umsatzsteuer aus innergemeinschaftlichem Erwerb ohne Vorsteuerabzug": {},
- "Umsatzsteuer fr\u00fchere Jahre": {},
- "Umsatzsteuer laufendes Jahr": {},
- "Umsatzsteuer nach \u00a713b UStG": {},
- "Umsatzsteuer nach \u00a713b UStG 16%": {},
- "Umsatzsteuer nach \u00a713b UStG 19%": {}
+ "Forderungen aus Lieferungen und Leistungen ohne Kontokorrent": {
+ "account_number": "1210"
},
- "Umsatzsteuer- Vorauszahlungen": {},
- "Umsatzsteuer- Vorauszahlungen 1/11": {},
- "Verbindlichkeiten aus Lohn- und Kirchensteuer": {}
- },
- "Steuerr\u00fcckstellungen oder sonstige Verm\u00f6gensgegenst\u00e4nde ": {
- "Umsatzsteuer nicht f\u00e4llig": {},
- "Umsatzsteuer nicht f\u00e4llig 16%": {},
- "Umsatzsteuer nicht f\u00e4llig 19%": {},
- "Umsatzsteuer nicht f\u00e4llig 7%": {},
- "Umsatzsteuer nicht f\u00e4llig aus im Inland steuerpflichtigen EG-Lieferungen": {},
- "Umsatzsteuer nicht f\u00e4llig aus im Inland steuerpflichtigen EG-Lieferungen 16%": {},
- "Umsatzsteuer nicht f\u00e4llig aus im Inland steuerpflichtigen EG-Lieferungen 19%": {}
- },
- "Verbindlichkeiten aus Lieferungen und Leistungen S-Saldo oder sonstige Verm\u00f6gensgegenst\u00e4nde H-Saldo": {
- "Gegenkonto 3335-3348- 3420-3449- 3470-3499 bei Aufteilung Kreditorenkonto": {}
- },
- "Verbindlichkeiten aus Lieferungen und Leistungen oder sonstige Verm\u00f6gensgegenst\u00e4nde": {
- "Verbindlichkeiten aus Lieferungen und Leistungen ": {
- "Gegenkonto 3305-3307 bei Aufteilung der Verbindlichkeiten nach Steuers\u00e4tzen (E\u00fcR)": {},
- "Lieferanten Verbindlichkeiten Dienstleistungen": {
- "account_type": "Payable"
- },
- "Verbindlichkeiten aus Lieferungen und Leistungen f\u00fcr Investitionen f\u00fcr \u00a7 4/3 EStG": {
- "account_type": "Payable"
- },
- "Verbindlichkeiten aus Lieferungen und Leistungen gegen\u00fcber Gesellschaftern ": {
- "account_type": "Payable"
- },
- "Verbindlichkeiten aus Lieferungen und Leistungen gegen\u00fcber Gesellschaftern Restlaufzeit 1 bis 5 Jahre": {},
- "Verbindlichkeiten aus Lieferungen und Leistungen gegen\u00fcber Gesellschaftern Restlaufzeit bis 1 Jahr": {},
- "Verbindlichkeiten aus Lieferungen und Leistungen gegen\u00fcber Gesellschaftern Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {},
- "Verbindlichkeiten aus Lieferungen und Leistungen ohne Kontokorrent ": {},
- "Verbindlichkeiten aus Lieferungen und Leistungen ohne Kontokorrent Restlaufzeit 1 bis 5 Jahre": {},
- "Verbindlichkeiten aus Lieferungen und Leistungen ohne Kontokorrent Restlaufzeit bis 1 Jahr": {},
- "Verbindlichkeiten aus Lieferungen und Leistungen ohne Kontokorrent Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {},
- "Verbindlichkeiten aus Lieferungen und Leistungen ohne Vorsteuer (E\u00fcR)": {
- "account_type": "Payable"
- },
- "Verbindlichkeiten aus Lieferungen und Leistungen zum allgemeinen Umsatzsteuersatz (E\u00fcR)": {
- "account_type": "Payable"
- },
- "Verbindlichkeiten aus Lieferungen und Leistungen zum erm\u00e4\u00dfigten Umsatzsteuersatz (E\u00fcR)": {
- "account_type": "Payable"
+ "Forderungen aus Lieferungen und Leistungen ohne Kontokorrent(b. 1 J.)": {
+ "account_number": "1221"
+ },
+ "Forderungen aus Lieferungen und Leistungen ohne Kontokorrent (gr\u00f6\u00dfer 1 J.)": {
+ "account_number": "1225"
+ },
+ "Wechsel aus Lieferungen und Leistungen, bundesbankf\u00e4hig": {
+ "account_number": "1235"
+ },
+ "Zweifelhafte Forderungen (Gruppe)": {
+ "is_group": 1,
+ "Zweifelhafte Forderungen": {
+ "account_number": "1240"
+ },
+ "Zweifelhafte Forderungen (b. 1 J.)": {
+ "account_number": "1241"
+ },
+ "Zweifelhafte Forderungen (gr\u00f6\u00dfer 1 J.)": {
+ "account_number": "1245"
+ },
+ "Einzelwertberichtigungen auf Forderungen mit einer (b. 1 J.)": {
+ "account_number": "1248"
+ },
+ "Einzelwertberichtigung auf Forderungen mit einer (mehr als 1 J.)": {
+ "account_number": "1247"
+ },
+ "Pauschalwertberichtigung auf Forderungen mit einer (mehr als 1 J.)": {
+ "account_number": "1249"
+ }
+ },
+ "Gegenkonto zu sonstigen VGn bei Buchung \u00fcber Debitorenkonto": {
+ "account_number": "1258"
+ },
+ "Gegenkonto 1221-1229,1240-1245,1250-1257, 1270-1279, 1290-1297 bei Aufteilung Debitorenkonto": {
+ "account_number": "1259"
+ }
+ },
+ "2 - Forderungen gg. verb. Unternehmen": {
+ "account_type": "Receivable",
+ "is_group": 1,
+ "Forderungen gg. verb. Unternehmen": {
+ "account_number": "1260"
+ },
+ "Forderungen gg. verb. Unternehmen (b. 1 J.)": {
+ "account_number": "1261"
+ },
+ "Forderungen gg. verb. Unternehmen (gr\u00f6\u00dfer 1 J.)": {
+ "account_number": "1265"
+ },
+ "Besitzwechsel gg. verb. Unternehmen": {
+ "account_number": "1266"
+ },
+ "Besitzwechsel gg. verb. Unternehmen (b. 1 J.)": {
+ "account_number": "1267"
+ },
+ "Besitzwechsel gg. verb. Unternehmen (gr\u00f6\u00dfer 1 J.)": {
+ "account_number": "1268"
+ },
+ "Besitzwechsel gg. verb. Unternehmen, bundesbankf\u00e4hig": {
+ "account_number": "1269"
+ },
+ "Forderungen aus Lieferungen und Leistungen gg. verb. Unternehmen (Gruppe)": {
+ "is_group": 1,
+ "Forderungen aus Lieferungen und Leistungen gg. verb. Unternehmen": {
+ "account_number": "1270"
+ },
+ "Forderungen aus Lieferungen und Leistungen gg. verb. Unternehmen (b. 1 J.)": {
+ "account_number": "1271"
+ },
+ "Forderungen aus Lieferungen und Leistungen gg. verb. Unternehmen (gr\u00f6\u00dfer 1 J.)": {
+ "account_number": "1275"
+ },
+ "Wertberichtigungen auf Forderungen mit einer (b. 1 J.) gg. verb. Unternehmen": {
+ "account_number": "1276"
+ },
+ "Wertberichtigungen auf Forderungen mit einer (mehr als 1 J.) gg. verbundene Unternehmen": {
+ "account_number": "1277"
}
}
- },
- "Verbindlichkeiten aus der Annahme gezogener Wechsel und aus der Ausstellung eigener Wechsel": {
- "Verbindlichkeiten aus der Annahme gezogener Wechsel und aus der Ausstellung eigener Wechsel 1": {
- "Verbindlichkeiten aus der Annahme gezogener Wechsel und aus der Ausstellung eigener Wechsel Restlaufzeit 1 bis 5 Jahre": {},
- "Verbindlichkeiten aus der Annahme gezogener Wechsel und aus der Ausstellung eigener Wechsel Restlaufzeit bis 1 Jahr": {},
- "Verbindlichkeiten aus der Annahme gezogener Wechsel und aus der Ausstellung eigener Wechsel Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {}
+ },
+ "3 - Forderungen gg. Unt., mit denen ein Beteiligungsverh. besteht": {
+ "account_type": "Receivable",
+ "is_group": 1,
+ "Forderungen gg. Unt., mit denen ein Beteiligungsverh. besteht": {
+ "account_number": "1280"
+ },
+ "Forderungen gg. Unt., mit denen ein Beteiligungsverh. besteht (b. 1 J.)": {
+ "account_number": "1281"
+ },
+ "Forderungen gg. Unt., mit denen ein Beteiligungsverh. besteht (gr\u00f6\u00dfer 1 J.)": {
+ "account_number": "1285"
+ },
+ "Besitzwechsel gg. Unt., mit denen ein Beteiligungsverh. besteht": {
+ "account_number": "1286"
+ },
+ "Besitzwechsel gg. Unt., mit denen ein Beteiligungsverh. besteht (b. 1 J.)": {
+ "account_number": "1287"
+ },
+ "Besitzwechsel gg. Unt., mit denen ein Beteiligungsverh. besteht (gr\u00f6\u00dfer 1 J.)": {
+ "account_number": "1288"
+ },
+ "Besitzwechsel gg. Unt., mit denen ein Beteiligungsverh. besteht, bundesbankf\u00e4hig": {
+ "account_number": "1289"
+ },
+ "Forderungen aus LuL gg. Unt., mit denen ein Beteiligungsverh. besteht": {
+ "account_number": "1290"
+ },
+ "Forderungen aus LuL gg. Unt., mit denen ein Beteiligungsverh. besteht (b. 1 J.)": {
+ "account_number": "1291"
+ },
+ "Forderungen aus LuL gg. Unt., mit denen ein Beteiligungsverh. besteht (gr\u00f6\u00dfer 1 J.)": {
+ "account_number": "1295"
+ },
+ "Wertberichtigungen auf Ford. (b. 1 J.) gg. Unt., mit denen ein Beteiligungsverh. besteht": {
+ "account_number": "1296"
+ },
+ "Wertberichtigungen auf Ford. (mehr als 1 J.) gg. Unt., mit denen ein Beteiligungsverh. besteht": {
+ "account_number": "1297"
}
- },
- "Verbindlichkeiten gegen\u00fcber Kreditinstituten ": {
- "Gegenkonto 3159-3209 bei Aufteilung der Konten 3210-3248": {}
- },
- "Verbindlichkeiten gegen\u00fcber Kreditinstituten - Bundesbankguthaben- Guthaben bei Kreditinstituten und Schecks": {
- "Verbindlichkeiten gegen\u00fcber Kreditinstituten 1": {
- "(frei- in Bilanz kein Restlaufzeit vermerkt) 1": {},
- "Verbindlichkeiten gegen\u00fcber Kreditinstituten Restlaufzeit 1 bis 5 Jahre": {},
- "Verbindlichkeiten gegen\u00fcber Kreditinstituten Restlaufzeit bis 1 Jahr": {},
- "Verbindlichkeiten gegen\u00fcber Kreditinstituten Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {},
- "Verbindlichkeiten gegen\u00fcber Kreditinstituten aus Teilzahlungsvertr\u00e4gen": {},
- "Verbindlichkeiten gegen\u00fcber Kreditinstituten aus Teilzahlungsvertr\u00e4gen Restlaufzeit 1 bis 5 Jahre": {},
- "Verbindlichkeiten gegen\u00fcber Kreditinstituten aus Teilzahlungsvertr\u00e4gen Restlaufzeit bis 1 Jahr": {},
- "Verbindlichkeiten gegen\u00fcber Kreditinstituten aus Teilzahlungsvertr\u00e4gen Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {}
+ },
+ "4 - sonstige VG": {
+ "account_type": "Receivable",
+ "is_group": 1,
+ "Bewertungskorrektur zu sonstigen VGn": {
+ "account_number": "9965"
+ },
+ "Verrechnungskonto geleistete Anz. bei Buchung \u00fcber Kreditorenkonto": {
+ "account_number": "3695"
+ },
+ "Sonstige VG": {
+ "account_number": "1300"
+ },
+ "Sonstige VG (b. 1 J.)": {
+ "account_number": "1301"
+ },
+ "Sonstige VG (gr\u00f6\u00dfer 1 J.)": {
+ "account_number": "1305"
+ },
+ "Forderungen gg. typisch stille Gesellschafter": {
+ "account_number": "1337"
+ },
+ "Forderungen gg. typisch stille Gesellschafter - Restlaufzeit bis1 Jahr": {
+ "account_number": "1338"
+ },
+ "Forderungen gg. typisch stille Gesellschafter (gr\u00f6\u00dfer 1 J.)": {
+ "account_number": "1339"
+ },
+ "Forderungen gg. Personal aus Lohn- und Gehaltsabrechnung (Gruppe)": {
+ "is_group": 1,
+ "Forderungen gg. Personal aus Lohn- und Gehaltsabrechnung": {
+ "account_number": "1340"
+ },
+ "Forderungen gg. Personal aus Lohn- und Gehaltsabrechnung (b. 1 J.)": {
+ "account_number": "1341"
+ },
+ "Forderungen gg. Personal aus Lohn- und Gehaltsabrechnung (gr\u00f6\u00dfer 1 J.)": {
+ "account_number": "1345"
+ }
+ },
+ "Kautionen (Gruppe)": {
+ "is_group": 1,
+ "Kautionen": {
+ "account_number": "1350"
+ },
+ "Kautionen (b. 1 J.)": {
+ "account_number": "1351"
+ },
+ "Kautionen (gr\u00f6\u00dfer 1 J.)": {
+ "account_number": "1355"
+ }
+ },
+ "Darlehen (Gruppe)": {
+ "Darlehen": {
+ "account_number": "1360"
+ },
+ "Darlehen (b. 1 J.)": {
+ "account_number": "1361"
+ },
+ "Darlehen (gr\u00f6\u00dfer 1 J.)": {
+ "account_number": "1365"
+ }
+ },
+ "Forderungen gg. Krankenkassen aus Aufwendungsausgleichsgesetz": {
+ "account_number": "1369"
+ },
+ "Durchlaufende Posten": {
+ "account_number": "1370"
+ },
+ "Fremdgeld": {
+ "account_number": "1374"
+ },
+ "Agenturwarenabrechnung": {
+ "account_number": "1375"
+ },
+ "Nachtr\u00e4glich abziehbare Vorsteuer, \u00a7 15a Abs. 2 UStG": {
+ "account_number": "1376"
+ },
+ "Zur\u00fcckzuzahlende Vorsteuer, \u00a7 15a Abs. 2 UStG": {
+ "account_number": "1377"
+ },
+ "Anspr\u00fcche aus R\u00fcckdeckungsversicherungen": {
+ "account_number": "1378"
+ },
+ "Verm\u00f6gensgegenst. zur Saldierung mit Pensionsr\u00fcckst. und \u00e4hnl. Verplicht. zum langfristigen Verbleib": {
+ "account_number": "1381"
+ },
+ "Verm\u00f6gensgegenst. zur Erf\u00fcllung von mit der Altersvers. vergleichb. langfristigen Verplicht.": {
+ "account_number": "1382"
+ },
+ "Verm\u00f6gensgegenst. zur Saldierung mit der Altersvers. vergleichb. langfristigen Verplicht.": {
+ "account_number": "1383"
+ },
+ "GmbH-Anteile zum kurzfr. Verbleib": {
+ "account_number": "1390"
+ },
+ "Forderungen gg. Arbeitsgemeinschaften": {
+ "account_number": "1391"
+ },
+ "Genussrechte": {
+ "account_number": "1393"
+ },
+ "Einzahlungsanspr\u00fcche zu Nebenleistungen oder Zuzahlungen": {
+ "account_number": "1394"
+ },
+ "Genossenschaftsanteile zum kurzfr. Verbleib": {
+ "account_number": "1395"
+ },
+ "Nachtr\u00e4glich abziehbare Vorsteuer, \u00a7 15a Abs. 1 UStG, bewegliche Wirtschaftsg\u00fcter": {
+ "account_number": "1396"
+ },
+ "Zur\u00fcckzuzahlende Vorsteuer, \u00a7 15a Abs. 1 UStG, bewegliche Wirtschaftsg\u00fcter": {
+ "account_number": "1397"
+ },
+ "Nachtr\u00e4glich abziehbare Vorsteuer gem. \u00a7 15a Abs. 1 UStG, unbewegliche Wirtschaftsg\u00fcter": {
+ "account_number": "1398"
+ },
+ "Zur\u00fcckzuzahlende Vorsteuer gem. \u00a7 15a Abs. 1 UStG, unbewegliche Wirtschaftsg\u00fcter": {
+ "account_number": "1399"
+ },
+ "Abziehbare Vorsteuer (Gruppe)": {
+ "is_group": 1,
+ "account_type": "Tax",
+ "Abziehbare Vorsteuer": {
+ "account_number": "1400"
+ },
+ "Abziehbare Vorsteuer 7 %": {
+ "account_number": "1401",
+ "account_type": "Tax",
+ "tax_rate": 7.0
+ },
+ "Abziehbare Vorsteuer aus innergem. Erwerb": {
+ "account_number": "1402"
+ },
+ "Abziehbare Vorsteuer aus innergem. Erwerb 19%": {
+ "account_number": "1404",
+ "account_type": "Tax",
+ "tax_rate": 19.0
+ },
+ "Abziehbare Vorsteuer 19 %": {
+ "account_number": "1406",
+ "account_type": "Tax",
+ "tax_rate": 19.0
+ },
+ "Abziehbare Vorsteuer nach \u00a7 13b UStG 19 %": {
+ "account_number": "1407"
+ },
+ "Abziehbare Vorsteuer nach \u00a7 13b UStG": {
+ "account_number": "1408"
+ },
+ "Abziehbare Vorsteuer aus der Auslagerung von Gegenst\u00e4nden aus dem Umsatzsteuerlager": {
+ "account_number": "1431"
+ },
+ "Abziehbare Vorsteuer aus innergem. Erwerb von Neufahrzeugen von Lieferanten ohne Ust-ID": {
+ "account_number": "1432"
+ }
+ },
+ "Aufzuteilende Vorsteuer (Gruppe)": {
+ "is_group": 1,
+ "Aufzuteilende Vorsteuer": {
+ "account_number": "1410"
+ },
+ "Aufzuteilende Vorsteuer 7 %": {
+ "account_number": "1411"
+ },
+ "Aufzuteilende Vorsteuer aus innergem. Erwerb": {
+ "account_number": "1412"
+ },
+ "Aufzuteilende Vorsteuer aus innergem. Erwerb 19 %": {
+ "account_number": "1413"
+ },
+ "Aufzuteilende Vorsteuer 19 %": {
+ "account_number": "1416"
+ },
+ "Aufzuteilende Vorsteuer nach \u00a7\u00a7 13a/13b UStG": {
+ "account_number": "1417"
+ },
+ "Aufzuteilende Vorsteuer nach \u00a7\u00a7 13a/13b UStG 19 %": {
+ "account_number": "1419"
+ }
+ },
+ "Umsatzsteuerforderungen (Gruppe)": {
+ "is_group": 1,
+ "Umsatzsteuerforderungen": {
+ "account_number": "1420"
+ },
+ "Umsatzsteuerforderungen laufendes Jahr": {
+ "account_number": "1421"
+ },
+ "Umsatzsteuerforderungen Vorjahr": {
+ "account_number": "1422"
+ },
+ "Umsatzsteuerforderungen fr\u00fchere Jahre": {
+ "account_number": "1425"
+ },
+ "Forderungen aus entrichteten Verbrauchsteuern": {
+ "account_number": "1427"
+ }
+ },
+ "Bezahlte Einfuhrumsatzsteuer": {
+ "account_number": "1433"
+ },
+ "Vorsteuer im Folgejahr abziehbar": {
+ "account_number": "1434"
+ },
+ "Forderungen aus Gewerbesteuer\u00fcberzahlungen": {
+ "account_number": "1435"
+ },
+ "Vorsteuer aus Erwerb als letzter Abnehmer innerh. eines Dreiecksgesch.s": {
+ "account_number": "1436"
+ },
+ "Steuererstattungsanspr\u00fcche gg. anderen L\u00e4ndern": {
+ "account_number": "1440"
+ },
+ "Forderungen an das Finanzamt aus abgef\u00fchrtem Bauabzugsbetrag": {
+ "account_number": "1456"
+ },
+ "Forderungen gg. Bundesagentur f. Arbeit": {
+ "account_number": "1457"
+ },
+ "Geldtransit": {
+ "account_number": "1460"
+ },
+ "Vorsteuer nach allgemeinen Durchschnittss\u00e4tzen UStVA Kz. 63": {
+ "account_number": "1484"
+ },
+ "Verrechnungskonto Ist-Versteuerung": {
+ "account_number": "1490"
+ },
+ "Verrechnungskonto erhaltene Anz. bei Buchung \u00fcber Debitorenkonto": {
+ "account_number": "1495"
+ },
+ "\u00dcberleitungskonto Kostenstellen": {
+ "account_number": "1498"
}
- },
- "Verbindlichkeiten gegen\u00fcber verbundenen Unternehmen oder Forderungen gegen verbundene Unternehmen": {
- "Verbindlichkeiten gegen\u00fcber verbundenen Unternehmen": {
- "Verbindlichkeiten aus Lieferungen und Leistungen gegen\u00fcber verbundenen Unternehmen": {
- "account_type": "Payable"
- },
- "Verbindlichkeiten aus Lieferungen und Leistungen gegen\u00fcber verbundenen Unternehmen Restlaufzeit 1 bis 5 Jahre": {},
- "Verbindlichkeiten aus Lieferungen und Leistungen gegen\u00fcber verbundenen Unternehmen Restlaufzeit bis 1 Jahr": {},
- "Verbindlichkeiten aus Lieferungen und Leistungen gegen\u00fcber verbundenen Unternehmen Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {},
- "Verbindlichkeiten gegen\u00fcber verbundenen Unternehmen Restlaufzeit 1 bis 5 Jahre": {},
- "Verbindlichkeiten gegen\u00fcber verbundenen Unternehmen Restlaufzeit bis 1 Jahr": {},
- "Verbindlichkeiten gegen\u00fcber verbundenen Unternehmen Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {}
+ },
+ "is_group": 1
+ },
+ "III - Wertpapiere": {
+ "is_group": 1,
+ "2 - sonstige Wertpapiere": {
+ "is_group": 1,
+ "Sonstige Wertpapiere": {
+ "account_number": "1510"
+ }
+ },
+ "Finanzwechsel": {
+ "account_number": "1520"
+ },
+ "Andere Wertpapiere mit unwesentlichen Wertschwankungen im Sinne Textziffer 18 DRS 2": {
+ "account_number": "1525"
+ },
+ "Wertpapieranlagen i. R. d. kurzfr. Finanzdisposition": {
+ "account_number": "1530"
+ },
+ "Schecks": {
+ "account_number": "1550"
+ },
+ "Anteile an verbundenen Unternehmen (Umlaufverm\u00f6gen)": {
+ "account_number": "1500"
+ }
+ },
+ "IV - Kassenbestand, Bundesbankguthaben, Guthaben bei Kreditinstituten und Schecks": {
+ "is_group": 1,
+ "Bewertungskorrektur zu Guthaben bei Kreditinstituten": {
+ "account_number": "9962"
+ },
+ "Kasse (Gruppe)": {
+ "is_group": 1,
+ "account_type": "Cash",
+ "Kasse": {
+ "account_number": "1600",
+ "account_type": "Cash"
+ },
+ "Nebenkasse 1": {
+ "account_number": "1610",
+ "account_type": "Cash"
+ },
+ "Nebenkasse 2": {
+ "account_number": "1620",
+ "account_type": "Cash"
+ }
+ },
+ "Postbank (Gruppe)": {
+ "is_group": 1,
+ "Postbank": {
+ "account_number": "1700"
+ },
+ "Postbank 1 (Gruppe)": {
+ "is_group": 1,
+ "Postbank 1": {
+ "account_number": "1710"
+ }
+ },
+ "Postbank 2 (Gruppe)": {
+ "is_group": 1,
+ "Postbank 2": {
+ "account_number": "1720"
+ }
+ },
+ "Postbank 3 (Gruppe)": {
+ "is_group": 1,
+ "Postbank 3": {
+ "account_number": "1730"
+ }
+ }
+ },
+ "LZB-Guthaben": {
+ "account_number": "1780"
+ },
+ "Bundesbankguthaben": {
+ "account_number": "1790"
+ },
+ "Bank (Gruppe)": {
+ "is_group": 1,
+ "account_type": "Bank",
+ "Bank": {
+ "account_number": "1800",
+ "account_type": "Bank"
+ },
+ "Bank 1": {
+ "account_number": "1810",
+ "account_type": "Bank"
+ },
+ "Bank 2": {
+ "account_number": "1820",
+ "account_type": "Bank"
+ },
+ "Bank 3": {
+ "account_number": "1830"
+ },
+ "Bank 4": {
+ "account_number": "1840"
+ },
+ "Bank 5": {
+ "account_number": "1850"
+ },
+ "Finanzmittelanlagen i. R. d. kurzfr. Finanzdisposition (nicht im Finanzmittelfonds enthalten)": {
+ "account_number": "1890"
+ },
+ "Verb. gg. Kreditinstituten (nicht im Finanzmittelfonds enthalten)": {
+ "account_number": "1895"
+ }
+ }
+ },
+ "is_group": 1
+ },
+ "C - Rechnungsabgrenzungsposten": {
+ "is_group": 1,
+ "Aktive Rechnungsabgrenzung": {
+ "account_number": "1900"
+ },
+ "Als Aufwand ber\u00fccksichtigte Z\u00f6lle und Verbrauchsteuern auf Vorr\u00e4te": {
+ "account_number": "1920"
+ },
+ "Als Aufwand ber\u00fccksichtigte Umsatzsteuer auf Anz.": {
+ "account_number": "1930"
+ },
+ "Damnum/Disagio": {
+ "account_number": "1940"
+ }
+ },
+ "D - Aktive latente Steuern": {
+ "is_group": 1,
+ "Aktive latente Steuern": {
+ "account_type": "Tax",
+ "account_number": "1950"
+ }
+ },
+ "E - Aktiver Unterschiedsbetrag aus der Verm\u00f6gensverrechnung": {
+ "is_group": 1
+ },
+ "is_group": 1
+ },
+ "Passiva - Verbindlichkeiten": {
+ "root_type": "Liability",
+ "B - R\u00fcckstellungen": {
+ "is_group": 1,
+ "1 - R\u00fcckstellungen f. Pensionen und \u00e4hnliche Verplicht.": {
+ "is_group": 1,
+ "R\u00fcckstellungen f. Pensionen und \u00e4hnliche Verplicht.": {
+ "account_number": "3000"
+ },
+ "R\u00fcckstellungen f. Pensionen und \u00e4hnliche Verplicht. (Saldierung mit langfristigen VG)": {
+ "account_number": "3009"
+ },
+ "R\u00fcckstellungen f. Direktzusagen": {
+ "account_number": "3010"
+ },
+ "R\u00fcckstellungen f. ZuschussVerplicht. f. Pensionskassen und Lebensversicherungen": {
+ "account_number": "3011"
+ }
+ },
+ "2 - Steuerr\u00fcckstellungen": {
+ "is_group": 1,
+ "Steuerr\u00fcckstellungen": {
+ "account_number": "3020"
+ },
+ "Gewerbesteuerr\u00fcckstellung": {
+ "account_number": "3030"
+ },
+ "Gewerbesteuerr\u00fcckstellung, \u00a7 4 Abs. 5b EStG": {
+ "account_number": "3035"
+ },
+ "R\u00fcckstellung f. latente Steuern": {
+ "account_number": "3060"
+ },
+ "Sonstige R\u00fcckstellungen": {
+ "account_number": "3070"
+ },
+ "R\u00fcckstellungen f. Personalkosten": {
+ "account_number": "3074"
+ },
+ "R\u00fcckstellungen f. unterlassene Aufwendungen f. Instandhaltung, Nachholung in den ersten drei Monaten": {
+ "account_number": "3075"
+ },
+ "R\u00fcckstellungen f. mit der Altersvers. vergleichb. langfr. Verplicht. zum langfr. Verbleib": {
+ "account_number": "3076"
+ },
+ "R\u00fcckst. f. mit der Altersvers. vergleichb. langfr. Verplicht. (Saldierung mit langfristigen VG)": {
+ "account_number": "3077"
+ }
+ },
+ "3 - sonstige R\u00fcckstellungen": {
+ "is_group": 1,
+ "Sonderposten mit R\u00fccklageanteil, steuerfreie R\u00fccklagen (Gruppe)": {
+ "is_group": 1,
+ "Sonderposten mit R\u00fccklageanteil, steuerfreie R\u00fccklagen": {
+ "account_number": "2980"
+ },
+ "Sonderposten mit R\u00fccklageanteil nach \u00a7 6b EStG": {
+ "account_number": "2981"
+ },
+ "Sonderposten mit R\u00fccklageanteil nach EStR R 6.6": {
+ "account_number": "2982"
+ },
+ "R\u00fccklage f. Zusch\u00fcsse": {
+ "account_number": "2988"
+ },
+ "Sonderposten mit R\u00fccklageanteil nach \u00a7 52 Abs.16 EStG": {
+ "account_number": "2989"
+ },
+ "Sonderposten mit R\u00fccklageanteil, Sonderabschreibungen": {
+ "account_number": "2990"
+ },
+ "Sonderposten mit R\u00fccklageanteil nach \u00a7 7g Abs. 2 EStG n. F.": {
+ "account_number": "2993"
+ },
+ "Ausgleichsposten bei Entnahmen \u00a7 4g EStG": {
+ "account_number": "2995"
+ },
+ "Sonderposten mit R\u00fccklageanteil nach \u00a7 7g Abs. 1 EStG a. F. / \u00a7 7g Abs. 5 EStG n. F.": {
+ "account_number": "2997"
+ },
+ "Sonderposten mit R\u00fccklageanteil nach \u00a7 7g Abs. 3 und 7 EStG a. F.": {
+ "account_number": "2998"
+ },
+ "Sonderposten f. Zusch\u00fcsse und Zulagen": {
+ "account_number": "2999"
+ },
+ "R\u00fcckstellungen f. Abraum- und Abfallbeseitigung": {
+ "account_number": "3085"
+ },
+ "R\u00fcckstellungen f. Gew\u00e4hrleistungen": {
+ "account_number": "3090"
+ },
+ "R\u00fcckstellungen f. drohende Verluste aus schwebenden Gesch\u00e4ften": {
+ "account_number": "3092"
+ },
+ "R\u00fcckstellungen f. Abschluss- und Pr\u00fcfungskosten": {
+ "account_number": "3095"
+ },
+ "R\u00fcckstellungen zur Erf\u00fcllung der Aufbewahrungspflichten": {
+ "account_number": "3096"
+ },
+ "Aufwandsr\u00fcckstellungen gem\u00e4\u00df \u00a7 249 Abs. 2 HGB a. F.": {
+ "account_number": "3098"
+ },
+ "R\u00fcckstellungen f. Umweltschutz": {
+ "account_number": "3099"
}
}
}
- },
- "root_type": "Liability"
- },
- "Gewinn u. Verlust - Aufwendungen": {
- "Betriebliche Aufwendungen": {
- "Abschreibungen a. Verm\u00f6gensgeg. d. Umlaufverm\u00f6gens- soweit diese die in der Abschreibungen \u00fcberschreiten": {
- "Abschreibungen a. Verm\u00f6gensgeg. d. Umlaufverm\u00f6gens- soweit diese die in der Abschreibungen \u00fcberschreiten": {
- "Abschreibungen auf Umlaufverm\u00f6gen- steuerrechtlich bedingt (soweit un\u00fcblich hoch)": {},
- "Abschreibungen auf Verm\u00f6gensgegenst\u00e4nde des Umlaufverm\u00f6gens (soweit un\u00fcblich hoch)": {},
- "Forderungsverluste (soweit un\u00fcblich hoch)": {},
- "Forderungsverluste 15% USt (soweit un\u00fcblich hoch)": {},
- "Forderungsverluste 16% USt (soweit un\u00fcblich hoch)": {},
- "Forderungsverluste 19% USt (soweit un\u00fcblich hoch)": {},
- "Forderungsverluste 7% USt (soweit un\u00fcblich hoch)": {},
- "Vorwegnahme k\u00fcnftiger Wertschwankungen im Umlaufverm\u00f6gen (soweit un\u00fcblich hoch)": {}
- }
- },
- "Kalkulatorische Kosten": {
- "Sonstige betriebliche Aufwendungen 2": {
- "Kalkulatorische Abschreibungen": {},
- "Kalkulatorische Miete/Pacht": {},
- "Kalkulatorische Wagnisse": {},
- "Kalkulatorische Zinsen": {},
- "Kalkulatorischer Lohn f\u00fcr unentgeltliche Mitarbeiter": {},
- "Kalkulatorischer Unternehmerlohn": {},
- "Verrechnete kalkulatorische Abschreibungen": {},
- "Verrechnete kalkulatorische Miete/Pacht": {},
- "Verrechnete kalkulatorische Wagnisse": {},
- "Verrechnete kalkulatorische Zinsen": {},
- "Verrechneter kalkulatorischer Lohn f\u00fcr unentgeltliche Mitarbeiter": {},
- "Verrechneter kalkulatorischer Unternehmerlohn": {}
- }
- },
- "Kosten bei Anwendung des Umsatzkostenverfahrens": {
- "Sonstige betriebliche Aufwendungen 1": {
- "Gegenkonto 6990-6998": {},
- "Herstellungskosten": {},
- "Vertriebskosten": {},
- "Verwaltungskosten": {}
- }
- },
- "Personalaufwand": {
- "L\u00f6hne und Geh\u00e4lter": {
- "Aushilfsl\u00f6hne": {},
- "Bedienungsgelder": {},
- "Ehegattengehalt": {},
- "Fahrkostenerstattung Wohnung/Arbeitsst\u00e4tte": {},
- "Freiwillige soziale Aufwendungen- lohnsteuerpflichtig": {},
- "Geh\u00e4lter": {},
- "Gesch\u00e4ftsf\u00fchrergeh\u00e4lter ": {},
- "Gesch\u00e4ftsf\u00fchrergeh\u00e4lter der GmbH-Gesellschafter": {},
- "Krankengeldzusch\u00fcsse": {},
- "L\u00f6hne ": {},
- "L\u00f6hne und Geh\u00e4lter 1": {},
- "Pauschale Steuer auf sonstige Bez\u00fcge (z.B. Fahrkosten Zusch\u00fcsse)": {},
- "Pauschale Steuer f\u00fcr Aushilfen": {},
- "Tantiemen": {},
- "Verg\u00fctungen an angestellte Mitunternehmer \u00a7 15 EStG": {},
- "Verm\u00f6genswirksame Leistungen": {},
- "Zusch\u00fcsse der Agenturen f\u00fcr Arbeit (Haben)": {}
- },
- "Soziale Abgaben und Aufwendungen f\u00fcr Altersversorgung und f\u00fcr Unterst\u00fctzung": {
- "Soziale Abgaben und Aufwendungen f\u00fcr Altersversorgung und f\u00fcr Unterst\u00fctzung 1": {
- "Aufwendungen f\u00fcr Altersversorgung": {},
- "Aufwendungen f\u00fcr Altersversorgung f\u00fcr Mitunternehmer \u00a7 15 EStG": {},
- "Aufwendungen f\u00fcr Unterst\u00fctzung": {},
- "Beitr\u00e4ge zur Berufsgenossenschaft": {},
- "Freiwillige soziale Aufwendungen- lohnsteuerfrei": {},
- "Gesetzliche soziale Aufwendungen": {},
- "Gesetzliche soziale Aufwendungen f\u00fcr Mitunternehmer \u00a7 15 EStG": {},
- "Pauschale Steuer auf sonstige Bez\u00fcge (z.B. Direktversicherungen)": {},
- "Sonstige soziale Abgaben": {},
- "Versorgungskassen": {}
+ },
+ "C - Verbindlichkeiten": {
+ "account_type": "Payable",
+ "1 - Anleihen": {
+ "is_group": 1,
+ "account_type": "Payable",
+ "davon konvertibel": {
+ "account_type": "Payable",
+ "is_group": 1,
+ "Anleihen, konvertibel": {
+ "account_number": "3120"
+ },
+ "Anleihen, konvertibel (b. 1 J.)": {
+ "account_number": "3121"
+ },
+ "Anleihen, konvertibel (1-5 J.)": {
+ "account_number": "3125"
+ },
+ "Anleihen, konvertibel (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3130"
+ }
+ },
+ "Anleihen, nicht konvertibel": {
+ "account_number": "3100"
+ },
+ "Anleihen, nicht konvertibel (b. 1 J.)": {
+ "account_number": "3101"
+ },
+ "Anleihen, nicht konvertibel (1-5 J.)": {
+ "account_number": "3105"
+ },
+ "Anleihen, nicht konvertibel (gr\u00f6\u00dfer 5 J.) (Gruppe)": {
+ "is_group": 1,
+ "Anleihen, nicht konvertibel (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3110"
}
}
- },
- "Sonstige betriebliche Aufwendungen 3": {
- "Sonstige betriebliche Aufwendungen 4": {
- "Abgaben f\u00fcr betrieblich genutzten Grundbesitz": {},
- "Abgang von Wirtschaftsg\u00fctern des Umlaufverm\u00f6gens 100% / 50% nicht abzugsf\u00e4hig (inlandische Kap. Ges.) nach": {},
- "Abgang von Wirtschaftsg\u00fctern des Umlaufverm\u00f6gens nach \u00a7 4 Abs. 3 Satz 4 EStG": {},
- "Abschluss- und Pr\u00fcfungskosten": {},
- "Abschreibung auf Umlaufverm\u00f6gen au\u00dfer Vorr\u00e4te und Wertpapieren des UV (\u00fcbliche H\u00f6he)": {},
- "Abschreibung auf Umlaufverm\u00f6gen au\u00dfer Vorr\u00e4te und Wertpapieren des UV- steuerlich bedingt (\u00fcbliche H\u00f6he)": {},
- "Abziehbare Aufsichtsratsverg\u00fctungen": {},
- "Anlagenabg\u00e4nge Finanzanlagen (Restbuchwert bei Buchverlust)": {},
- "Anlagenabg\u00e4nge Finanzanlagen 100% / 50% steuerfrei (inl\u00e4ndische Kap. Ges.)(Restbuchwert bei Buchverlust)": {},
- "Anlagenabg\u00e4nge Sachanlagen (Restbuchwert bei Buchverlust)": {},
- "Anlagenabg\u00e4nge immaterielle Verm\u00f6gensgegenst\u00e4nde (Restbuchwert bei Buchverlust)": {},
- "Aufmerksamkeiten": {},
- "Aufwand f\u00fcr Gew\u00e4hrleistung": {},
- "Aufwendungen aus Anteilen an Kapitalgesellschaften 100% / 50% nicht abzugsf\u00e4hig (inlandische Kap. Ges.)": {},
- "Aufwendungen aus Bewertung Finanzmittelfonds": {},
- "Aufwendungen aus Kursdifferenzen": {},
- "Aufwendungen aus der Ver\u00e4u\u00dferung von Anteilen an Kapitalgesellschaften 100% / 50% nicht abzugsf\u00e4hig": {},
- "Aufwendungen aus der Zuschreibung von steuertlich niedriger bewerteten R\u00fcckstellungen": {},
- "Aufwendungen aus der Zuschreibung von steuertlich niedriger bewerteten Verbindlichkeiten": {},
- "Aufwendungen f\u00fcr Abraum- und Abfallbeseitigung": {},
- "Aufwendungen f\u00fcr ein h\u00e4usliches Arbeitszimmer (abziehbarer Anteil)": {},
- "Aufwendungen f\u00fcr ein h\u00e4usliches Arbeitszimmer (nicht abziehbarer Anteil)": {},
- "Ausgangsfrachten": {},
- "Ausgleichsabgabe i. S. d. Schwerbehindertengesetzes": {},
- "Beitr\u00e4ge ": {},
- "Bewirtungskosten": {},
- "Buchf\u00fchrungskosten": {},
- "B\u00fcrobedarf": {},
- "Einstellungen in Sonderposten mit R\u00fccklageanteil (Ansparabschreibungen)": {},
- "Einstellungen in Sonderposten mit R\u00fccklageanteil (Existenzgr\u00fcnderr\u00fccklage)": {},
- "Einstellungen in Sonderposten mit R\u00fccklageanteil (Sonderabschreibungen)": {},
- "Einstellungen in Sonderposten mit R\u00fccklageanteil (Steuerfreie R\u00fccklagen)": {},
- "Einstellungen in Sonderposten mit R\u00fccklageanteil (\u00a7 52 Abs. 16 EStG)": {},
- "Einstellungen in die Einzelwertberichtigung zu Forderungen": {},
- "Einstellungen in die Pauschalwertberichtigung zu Forderungen": {},
- "Erl\u00f6se aus Verk\u00e4ufen Finanzanlagen (bei Buchverlust)": {},
- "Erl\u00f6se aus Verk\u00e4ufen Finanzanlagen 100% / 50% steuerfrei (inlandische Kap.Ges.)(bei Buchverlust)": {},
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen (bei Buchverlust)": {},
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen 16% USt (bei Buchverlust)": {},
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen 19% USt (bei Buchverlust)": {},
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen steuerfrei \u00a7 4 Nr. 1a UStG (bei Buchverlust)": {},
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen steuerfrei \u00a7 4 Nr. 1b UStG (bei Buchverlust)": {},
- "Erl\u00f6se aus Verk\u00e4ufen immaterieller Verm\u00f6gensgegenst\u00e4nde (bei Buchverlust)": {},
- "Fahrten zwischen Wohnung und Arbeitsst\u00e4tte (Haben)": {},
- "Fahrten zwischen Wohnung und Arbeitsst\u00e4tte (abziehbarer Anteil)": {},
- "Fahrten zwischen Wohnung und Arbeitsst\u00e4tte (nicht abziehbarer Anteil)": {},
- "Fahrzeugkosten": {},
- "Forderungsverluste (\u00fcbliche H\u00f6he)": {},
- "Forderungsverluste 15% USt (\u00fcbliche H\u00f6he)": {},
- "Forderungsverluste 16% USt (\u00fcbliche H\u00f6he)": {},
- "Forderungsverluste 19% USt (\u00fcbliche H\u00f6he)": {},
- "Forderungsverluste 7 % USt (\u00fcbliche H\u00f6he)": {},
- "Forderungsverluste aus im Inland steuerpflichtigen EG-Lieferungen 15% USt (\u00fcbliche H\u00f6he)": {},
- "Forderungsverluste aus im Inland steuerpflichtigen EG-Lieferungen 16% USt (\u00fcbliche H\u00f6he)": {},
- "Forderungsverluste aus im Inland steuerpflichtigen EG-Lieferungen 19% USt (\u00fcbliche H\u00f6he)": {},
- "Forderungsverluste aus im Inland steuerpflichtigen EG-Lieferungen 7% USt (\u00fcbliche H\u00f6he)": {},
- "Forderungsverluste aus steuerfreien EG-Lieferungen (\u00fcbliche H\u00f6he)": {},
- "Fortbildungskosten": {},
- "Freiwillige Sozialleistungen": {},
- "Fremdarbeiten (Vertrieb)": {},
- "Fremdfahrzeugkosten": {},
- "Fremdleistungen / Fremdarbeiten": {},
- "Garagenmiete": {},
- "Gas- Strom- Wasser": {},
- "Geschenke abzugsf\u00e4hig": {},
- "Geschenke ausschlie\u00dflich betrieblich genutzt": {},
- "Geschenke nicht abzugsf\u00e4hig": {},
- "Gewerbesteuerlich zu ber\u00fccksichtigende Miete f\u00fcr Einrichtungen \u00a7 8 GewStG": {},
- "Gewerbesteuerlich zu ber\u00fccksichtigende Miete \u00a7 8 GewStG": {},
- "Gewerbesteuerlich zu ber\u00fccksichtigende Pacht \u00a7 8 GewStG": {},
- "Gewerbesteuerlich zu ber\u00fccksichtigendes Mietleasing \u00a7 8 GewStG": {},
- "Grundst\u00fcckaufwendungen- betrieblich": {},
- "Grundst\u00fcckaufwendungen- sonstige neutrale": {},
- "Haftungsverg\u00fctung an Mitunternehmer \u00a7 15 EStG": {},
- "Heizung": {},
- "Instandhaltung betrieblicher R\u00e4ume": {},
- "Kfz-Kosten f\u00fcr betrieblich genutzte zum Privatverm\u00f6gen geh\u00f6rende Kraftfahrzeuge": {},
- "Kfz-Versicherungen": {},
- "Kilometergelderstattung Arbeitnehmer": {},
- "Kosten der Warenabgabe": {},
- "Laufende Kfz-Betriebskosten": {},
- "Leasingfahrzeugkosten": {},
- "Mautgeb\u00fchren": {},
- "Mietekosten": {},
- "Mieten f\u00fcr Einrichtungen": {},
- "Mietleasing": {},
- "Nebenkosten des Geldverkehrs": {},
- "Netto-Pr\u00e4mie f\u00fcr R\u00fcckdeckung k\u00fcnftiger Versorgungsleistungen": {},
- "Nicht Abzugsf\u00e4hige Betriebsausgaben aus Werbe- und Repr\u00e4sentationskosten (nicht abziehbarer Anteil)": {},
- "Nicht Abzugsf\u00e4hige Bewirtungskosten": {},
- "Nicht abziehbare H\u00e4lfte der Aufsichtsratsverg\u00fctungen": {},
- "Nicht abziehbare Vorsteuer": {},
- "Nicht abziehbare Vorsteuer 16% ": {},
- "Nicht abziehbare Vorsteuer 19% ": {},
- "Nicht abziehbare Vorsteuer 7% ": {},
- "Pacht": {},
- "Periodenfremde Aufwendungen soweit nicht au\u00dferordentlich": {},
- "Porto": {},
- "Raumkosten": {},
- "Rechts- und Beratungskosten": {},
- "Reinigung": {},
- "Reisekosten Arbeitnehmer": {},
- "Reisekosten Arbeitnehmer (nicht abziehbarer Anteil)": {},
- "Reisekosten Arbeitnehmer Fahrkosten": {},
- "Reisekosten Arbeitnehmer Verpflegungsmehraufwand": {},
- "Reisekosten Arbeitnehmer \u00fcbernachtungsaufwand": {},
- "Reisekosten Unternehmer": {},
- "Reisekosten Unternehmer (nicht abziehbarer anteil)": {},
- "Reisekosten Unternehmer Fahrkosten": {},
- "Reisekosten Unternehmer Verpflegungsmehraufwand": {},
- "Reisekosten Unternehmer \u00fcbernachtungsaufwand": {},
- "Reparaturen und Instandhaltung von Bauten": {},
- "Reparaturen und Instandhaltung von Betriebs- und Gesch\u00e4ftsausstattung": {},
- "Reparaturen und Instandhaltung von anderen Anlagen": {},
- "Reparaturen und Instandhaltung von technischen Anlagen und Maschinen": {},
- "Repr\u00e4sentationskosten": {},
- "Sonstige Abgaben": {},
- "Sonstige Aufwendungen betrieblich und Regelm\u00e4\u00dfig 1": {},
- "Sonstige Aufwendungen betrieblich und regelm\u00e4\u00dfig": {},
- "Sonstige Aufwendungen unregelm\u00e4\u00dfig": {},
- "Sonstige Kfz-kosten": {},
- "Sonstige Raumkosten": {},
- "Sonstige Reparaturen und Instandhaltung ": {},
- "Sonstige betriebliche Aufwendungen 5": {},
- "Sonstige eingeschr\u00e4nkt abziehbare Betriebsausgaben (abziehbarer Anteil)": {},
- "Sonstige eingeschr\u00e4nkt abziehbare Betriebsausgaben (nicht abziehbarer Anteil)": {},
- "Sonstiger Betriebsbedarf": {},
- "Steuerlich abzugsf\u00e4hige Versp\u00e4tungszuschl\u00e4ge und Zwangsgelder": {},
- "Telefax und Internetkosten": {},
- "Telefon": {},
- "Transportversicherungen": {},
- "Verg\u00fctungen an Mitunternehmer f\u00fcr die Pachtweise \u00fcberlassung ihrer Wirtschaftsg\u00fcter \u00a7 15 EStG": {},
- "Verg\u00fctungen an Mitunternehmer f\u00fcr die mietweise \u00fcberlassung ihrer Wirtschaftsg\u00fcter \u00a7 15 EStG": {},
- "Verg\u00fctungen an Mitunternehmer \u00a7 15 EStG": {},
- "Verkaufsprovisionen": {},
- "Verluste aus dem Abgang von Gegenst\u00e4nden des Anlageverm\u00f6gens": {},
- "Verluste aus dem Abgang von Gegenst\u00e4nden des Umlaufverm\u00f6gens (au\u00dfer Vorr\u00e4te) 100%/50% nicht anzugsf\u00e4hig": {},
- "Verluste aus dem Abgang von Gegenst\u00e4nden des Umlaufverm\u00f6gens au\u00dfer Vorr\u00e4te": {},
- "Verluste aus der Ver\u00e4u\u00dferung von Anteilen an Kapitalgesellschaften 100% / 50% nicht abzugsf\u00e4hig": {},
- "Verpackungsmaterial": {},
- "Versicherungen": {},
- "Versicherungen f\u00fcr Geb\u00e4ude": {},
- "Vorwegnahme k\u00fcnftiger Wertschwankungen im Umlaufverm\u00f6gen au\u00dfer Vorr\u00e4te und Wertpapiere": {},
- "Wartungskosten f\u00fcr Hard- und Software": {},
- "Werbekosten": {},
- "Werkzeuge und Kleinger\u00e4te": {},
- "Zeitschriften und B\u00fccher": {},
- "Zuwendungen- Spenden an Stiftungen f\u00fcr Kirchliche- religi\u00f6se und gemeinn\u00fctzige Zwecke": {},
- "Zuwendungen- Spenden an Stiftungen f\u00fcr gemeinn\u00fctzige Zwecke i. S. d. \u00a7 52 Abs. 2 Nr. 1-3 AO": {},
- "Zuwendungen- Spenden an Stiftungen f\u00fcr gemeinn\u00fctzige Zwecke i. S. d. \u00a7 52 Abs. 2 Nr. 4 AO": {},
- "Zuwendungen- Spenden an Stiftungen f\u00fcr wissenschaftliche- mitdt\u00e4tige- kulturelle Zwecke": {},
- "Zuwendungen- Spenden an politische Parteien": {},
- "Zuwendungen- Spenden f\u00fcr kirchliche- religi\u00f6se und gemeinn\u00fctzige Zwecke": {},
- "Zuwendungen- Spenden f\u00fcr mildt\u00e4tige Zwecke": {},
- "Zuwendungen- Spenden f\u00fcr wissenschaftliche und kulturelle Zwecke": {},
- "Zuwendungen- Spenden- steuerlich nicht abziehbar": {},
- "kfz-Reparaturen": {},
- "steuerlich nicht abzugsf\u00e4hige Versp\u00e4tungszuschl\u00e4ge und Zwangsgelder": {}
+ },
+ "2 - Verb. gg. Kreditinstituten": {
+ "account_type": "Payable",
+ "is_group": 1,
+ "Bewertungskorrektur zu Verb. gg. Kreditinstituten": {
+ "account_number": "9963"
+ },
+ "Verb. gg. Kreditinstituten (Gruppe)": {
+ "is_group": 1,
+ "Verb. gg. Kreditinstituten": {
+ "account_number": "3150"
+ },
+ "Verb. gg. Kreditinstituten (b. 1 J.)": {
+ "account_number": "3151"
+ },
+ "Verb. gg. Kreditinstituten (1-5 J.)": {
+ "account_number": "3160"
+ },
+ "Verb. gg. Kreditinstituten (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3170"
+ }
+ },
+ "Verb. gg. Kreditinstituten aus Teilzahlungsvertr\u00e4gen (Gruppe)": {
+ "is_group": 1,
+ "Verb. gg. Kreditinstituten aus Teilzahlungsvertr\u00e4gen": {
+ "account_number": "3180"
+ },
+ "Verb. gg. Kreditinstituten aus Teilzahlungsvertr\u00e4gen (b. 1 J.)": {
+ "account_number": "3181"
+ },
+ "Verb. gg. Kreditinstituten aus Teilzahlungsvertr\u00e4gen (1-5 J.)": {
+ "account_number": "3190"
+ },
+ "Verb. gg. Kreditinstituten aus Teilzahlungsvertr\u00e4gen (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3200"
+ }
}
+ },
+ "3 - erhaltene Anz. auf Bestellungen": {
+ "account_type": "Payable",
+ "is_group": 1,
+ "Erhaltene, versteuerte Anz. 7 % USt (Verb.)": {
+ "account_number": "3260",
+ "account_type": "Receivable"
+ },
+ "Erhaltene, versteuerte Anz. 16 % USt (Verb.)": {
+ "account_number": "3270"
+ },
+ "Erhaltene, versteuerte Anz. 15 % USt (Verb.)": {
+ "account_number": "3271"
+ },
+ "Erhaltene, versteuerte Anz. 19 % USt (Verb.)": {
+ "account_number": "3272",
+ "account_type": "Receivable"
+ },
+ "Erhaltene Anz. (Gruppe)": {
+ "is_group": 1,
+ "Erhaltene Anz. (b. 1 J.)": {
+ "account_number": "3280",
+ "account_type": "Receivable"
+ },
+ "Erhaltene Anz. (1-5 J.)": {
+ "account_number": "3284",
+ "account_type": "Receivable"
+ },
+ "Erhaltene Anz. (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3285",
+ "account_type": "Receivable"
+ }
+ },
+ "Erhaltene Anz. auf Bestellungen (Verb.)": {
+ "account_number": "3250",
+ "account_type": "Receivable"
+ }
+ },
+ "4 - Verb. aus Lieferungen und Leistungen": {
+ "account_type": "Payable",
+ "is_group": 1,
+ "Bewertungskorrektur zu Verb. aus Lieferungen und Leistungen": {
+ "account_number": "9964"
+ },
+ "Kreditoren": {
+ "account_number": "70000",
+ "is_group": 1,
+ "Wareneingangs-Verrechnungskonto" : {
+ "account_number": "70001",
+ "account_type": "Stock Received But Not Billed"
+ }
+ },
+ "Verb. aus Lieferungen und Leistungen": {
+ "account_number": "3300",
+ "account_type": "Payable"
+ },
+ "Verb. aus Lieferungen und Leistungen ohne Kontokorrent": {
+ "account_number": "3310"
+ },
+ "Verb. aus Lieferungen und Leistungen ohne Kontokorrent (b. 1 J.)": {
+ "account_number": "3335"
+ },
+ "Verb. aus Lieferungen und Leistungen ohne Kontokorrent (1-5 J.)": {
+ "account_number": "3337"
+ },
+ "Verb. aus Lieferungen und Leistungen ohne Kontokorrent (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3338"
+ }
+ },
+ "5 - Verb. aus der Annahme gezogener Wechsel und der Ausstellung eigener Wechsel": {
+ "account_type": "Payable",
+ "is_group": 1,
+ "Verb. aus der Annahme gezogener Wechsel und aus der Ausstellung eigener Wechsel": {
+ "account_number": "3350"
+ },
+ "Verb. aus der Annahme gezogener Wechsel und aus der Ausstellung eigener Wechsel (b. 1 J.)": {
+ "account_number": "3351"
+ },
+ "Verb. aus der Annahme gezogener Wechsel und aus der Ausstellung eigner Wechsel (1-5 J.)": {
+ "account_number": "3380"
+ },
+ "Verb. aus der Annahme gezogener Wechsel und der Ausstellung eigener Wechsel (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3390"
+ }
+ },
+ "6 - Verb. gg. verbundenen Unternehmen": {
+ "account_type": "Payable",
+ "is_group": 1,
+ "Verb. gg. verbundenen Unternehmen": {
+ "account_number": "3400"
+ },
+ "Verb. gg. verbundenen Unternehmen (b. 1 J.)": {
+ "account_number": "3401"
+ },
+ "Verb. gg. verbundenen Unternehmen (1-5 J.)": {
+ "account_number": "3405"
+ },
+ "Verb. gg. verbundenen Unternehmen (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3410"
+ },
+ "Verb. aus LuL gg. verbundenen Unternehmen": {
+ "account_number": "3420"
+ },
+ "Verb. aus LuL gg. verbundenen Unternehmen (b. 1 J.)": {
+ "account_number": "3421"
+ },
+ "Verb. aus LuL gg. verbundenen Unternehmen (1-5 J.)": {
+ "account_number": "3425"
+ },
+ "Verb. aus LuL gg. verbundenen Unternehmen (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3430"
+ }
+ },
+ "7 - Verb. gg. Unternehmen, mit denen ein Beteiligungsverh. besteht": {
+ "account_type": "Payable",
+ "is_group": 1,
+ "Verb. gg. Unternehmen, mit denen ein Beteiligungsverh. besteht": {
+ "account_number": "3450"
+ },
+ "Verb. gg. Unternehmen, mit denen ein Beteiligungsverh. besteht (b. 1 J.)": {
+ "account_number": "3451"
+ },
+ "Verb. gg. Unternehmen, mit denen ein Beteiligungsverh. besteht (1-5 J.)": {
+ "account_number": "3455"
+ },
+ "Verb. gg. Unternehmen, mit denen ein Beteiligungsverh. besteht (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3460"
+ },
+ "Verb. aus LuL gg. Unternehmen, mit denen ein Beteiligungsverh. besteht": {
+ "account_number": "3470"
+ },
+ "Verb. aus LuL gg. Unternehmen, mit denen ein Beteiligungsverh. besteht (b. 1 J.)": {
+ "account_number": "3471"
+ },
+ "Verb. aus LuL gg. Unternehmen, mit denen ein Beteiligungsverh. besteht (1-5 J.)": {
+ "account_number": "3475"
+ },
+ "Verb. aus LuL gg. Unternehmen, mit denen ein Beteiligungsverh. besteht (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3480"
+ }
+ },
+ "8 - sonstige Verb.": {
+ "account_type": "Payable",
+ "is_group": 1,
+ "davon aus Steuern": {
+ "account_type": "Payable",
+ "is_group": 1,
+ "Verb. aus Steuern und Abgaben": {
+ "account_number": "3700",
+ "account_type": "Payable"
+ },
+ "Verb. aus Steuern und Abgaben (b. 1 J.)": {
+ "account_number": "3701"
+ },
+ "Verb. aus Steuern und Abgaben (1-5 J.)": {
+ "account_number": "3710"
+ },
+ "Verb. aus Steuern und Abgaben (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3715"
+ },
+ "Verb. aus Lohn- und Kirchensteuer": {
+ "account_number": "3730"
+ },
+ "Verb. aus Einbehaltungen (KapESt und Solz auf KapESt) f. offene Aussch\u00fcttungen": {
+ "account_number": "3760"
+ },
+ "Verb. f. Verbrauchsteuern": {
+ "account_number": "3761"
+ }
+ },
+ "Gewinnverf\u00fcgungskonto stille Gesellschafter": {
+ "account_number": "3620"
+ },
+ "Sonstige Verrechnungskonten (Interimskonten)": {
+ "account_number": "3630"
+ },
+ "Kreditkartenabrechnung": {
+ "account_number": "3610"
+ },
+ "Verb. gg. Arbeitsgemeinschaften": {
+ "account_number": "3611"
+ },
+ "Bewertungskorrektur zu sonstigen Verb.": {
+ "account_number": "9961"
+ },
+ "Verb. gg. stillen Gesellschaftern": {
+ "account_number": "3655"
+ },
+ "Verb. gg. stillen Gesellschaftern (b. 1 J.)": {
+ "account_number": "3656"
+ },
+ "Verb. gg. stillen Gesellschaftern (1-5 J.)": {
+ "account_number": "3657"
+ },
+ "Verb. gg. stillen Gesellschaftern (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3658"
+ },
+ "davon i. R. d. sozialen Sicherheit": {
+ "account_type": "Payable",
+ "is_group": 1,
+ "Verb. i. R. d. sozialen Sicherheit": {
+ "account_number": "3740"
+ },
+ "Verb. i. R. d. sozialen Sicherheit (b. 1 J.)": {
+ "account_number": "3741"
+ },
+ "Verb. i. R. d. sozialen Sicherheit (1-5 J.)": {
+ "account_number": "3750"
+ },
+ "Verb. i. R. d. sozialen Sicherheit (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3755"
+ },
+ "Voraussichtliche Beitragsschuld gg. den Sozialversicherungstr\u00e4gern": {
+ "account_number": "3759"
+ }
+ },
+ "Verb. aus Lohn und Gehalt (Gruppe)": {
+ "is_group": 1,
+ "Verb. aus Lohn und Gehalt": {
+ "account_number": "3720"
+ },
+ "Verb. f. Einbehaltungen von Arbeitnehmern": {
+ "account_number": "3725"
+ },
+ "Verb. an das Finanzamt aus abzuf\u00fchrendem Bauabzugsbetrag": {
+ "account_number": "3726"
+ }
+ },
+ "Verb. aus Verm\u00f6gensbildung": {
+ "account_number": "3770"
+ },
+ "Verb. aus Verm\u00f6gensbildung (b. 1 J.)": {
+ "account_number": "3771"
+ },
+ "Verb. aus Verm\u00f6gensbildung (1-5 J.)": {
+ "account_number": "3780"
+ },
+ "Verb. aus Verm\u00f6gensbildung (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3785"
+ },
+ "Ausgegebene Geschenkgutscheine": {
+ "account_number": "3786"
+ },
+ "Sonstige Verb.": {
+ "account_number": "3500",
+ "account_type": "Payable"
+ },
+ "Sonstige Verb. (b. 1 J.)": {
+ "account_number": "3501"
+ },
+ "Sonstige Verb. (1-5 J.)": {
+ "account_number": "3504"
+ },
+ "Sonstige Verb. (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3507"
+ },
+ "Darlehen typisch stiller Gesellschafter (Gruppe)": {
+ "is_group": 1,
+ "Darlehen typisch stiller Gesellschafter": {
+ "account_number": "3520"
+ },
+ "Darlehen typisch stiller Gesellschafter (b. 1 J.)": {
+ "account_number": "3521"
+ },
+ "Darlehen typisch stiller Gesellschafter (1-5 J.)": {
+ "account_number": "3524"
+ },
+ "Darlehen typisch stiller Gesellschafter (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3527"
+ }
+ },
+ "Darlehen atypisch stiller Gesellschafter (Gruppe)": {
+ "is_group": 1,
+ "Darlehen atypisch stiller Gesellschafter": {
+ "account_number": "3530"
+ },
+ "Darlehen atypisch stiller Gesellschafter (b. 1 J.)": {
+ "account_number": "3531"
+ },
+ "Darlehen atypisch stiller Gesellschafter (1-5 J.)": {
+ "account_number": "3534"
+ },
+ "Darlehen atypisch stiller Gesellschafter (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3537"
+ }
+ },
+ "Partiarische Darlehen (Gruppe)": {
+ "is_group": 1,
+ "Partiarische Darlehen": {
+ "account_number": "3540"
+ },
+ "Partiarische Darlehen (b. 1 J.)": {
+ "account_number": "3541"
+ },
+ "Partiarische Darlehen (1-5 J.)": {
+ "account_number": "3544"
+ },
+ "Partiarische Darlehen (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3547"
+ }
+ },
+ "Erhaltene Kautionen (Gruppe)": {
+ "is_group": 1,
+ "Erhaltene Kautionen": {
+ "account_number": "3550"
+ },
+ "Erhaltene Kautionen (b. 1 J.)": {
+ "account_number": "3551"
+ },
+ "Erhaltene Kautionen (1-5 J.)": {
+ "account_number": "3554"
+ },
+ "Erhaltene Kautionen (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3557"
+ }
+ },
+ "Darlehen (1-5 J.)": {
+ "account_number": "3564"
+ },
+ "Darlehen (gr\u00f6\u00dfer 5 J.)": {
+ "account_number": "3567"
+ },
+ "Lohn- und Gehaltsverrechnungskonto": {
+ "account_number": "3790"
+ },
+ "Umsatzsteuer (Gruppe)": {
+ "account_type": "Tax",
+ "is_group": 1,
+ "Umsatzsteuer": {
+ "account_number": "3800",
+ "account_type": "Tax"
+ },
+ "Umsatzsteuer 7 %": {
+ "account_number": "3801",
+ "account_type": "Tax",
+ "tax_rate": 7.0
+ },
+ "Umsatzsteuer aus innergem. Erwerb": {
+ "account_number": "3802"
+ },
+ "Umsatzsteuer aus innergem. Erwerb 19 %": {
+ "account_number": "3804",
+ "account_type": "Tax",
+ "tax_rate": 19.0
+ },
+ "Umsatzsteuer 19 %": {
+ "account_number": "3806",
+ "account_type": "Tax",
+ "tax_rate": 19.0
+ },
+ "Umsatzsteuer aus im Inland steuerpfl. EU-Lieferungen": {
+ "account_number": "3807"
+ },
+ "Umsatzsteuer aus im Inland steuerpfl. EU-Lieferungen 19 %": {
+ "account_number": "3808"
+ },
+ "Umsatzsteuer aus innergem. Erwerb ohne Vorsteuerabzug": {
+ "account_number": "3809"
+ },
+ "Umsatzsteuer nicht f\u00e4llig (Gruppe)": {
+ "is_group": 1,
+ "Umsatzsteuer nicht f\u00e4llig": {
+ "account_number": "3810"
+ },
+ "Umsatzsteuer nicht f\u00e4llig 7 %": {
+ "account_number": "3811"
+ },
+ "Umsatzsteuer nicht f\u00e4llig aus im Inland steuerpfl. EU-Lieferungen": {
+ "account_number": "3812"
+ },
+ "Umsatzsteuer nicht f\u00e4llig aus im Inland steuerpfl. EU-Lieferungen 19 %": {
+ "account_number": "3814"
+ },
+ "Umsatzsteuer nicht f\u00e4llig 19 %": {
+ "account_number": "3816"
+ },
+ "Umsatzsteuer aus im anderen EU-Land steuerpfl. Lieferungen": {
+ "account_number": "3817"
+ },
+ "Umsatzsteuer aus im anderen EU-Land steuerpfl. sonstigen Leistungen/Werklieferungen": {
+ "account_number": "3818"
+ },
+ "Umsatzsteuer aus Erwerb als letzter Abnehmer innerh. eines Dreiecksgesch.s": {
+ "account_number": "3819"
+ }
+ },
+ "Umsatzsteuer-Vorauszahlungen": {
+ "account_number": "3820",
+ "account_type": "Tax"
+ },
+ "Umsatzsteuer-Vorauszahlung 1/11": {
+ "account_number": "3830"
+ },
+ "Nachsteuer, UStVA Kz. 65": {
+ "account_number": "3832"
+ },
+ "Umsatzsteuer aus innergem. Erwerb von Neufahrzeugen von Lieferanten ohne Ust-ID": {
+ "account_number": "3834"
+ },
+ "Umsatzsteuer nach \u00a7 13b UStG": {
+ "account_number": "3835"
+ },
+ "Umsatzsteuer nach \u00a7 13b UStG 19 %": {
+ "account_number": "3837"
+ },
+ "Umsatzsteuer aus der Auslagerung von Gegenst\u00e4nden aus einem Umsatzsteuerlager": {
+ "account_number": "3839"
+ },
+ "Einfuhrumsatzsteuer aufgeschoben bis": {
+ "account_number": "3850"
+ },
+ "In Rechnung unrichtig oder unberechtigtausgewiesene Steuerbetr\u00e4ge, UStVA Kz. 69": {
+ "account_number": "3852"
+ },
+ "Steuerzahlungen an andere L\u00e4nder": {
+ "account_number": "3854"
+ }
+ }
+ },
+ "is_group": 1
+ },
+ "E - Passive latente Steuern": {
+ "is_group": 1,
+ "Passive latente Steuern": {
+ "account_number": "3065"
}
- },
- "Weitere Aufwendungen": {
- "Abschreibungen auf Finanzanlagen und auf Wertpapiere des Umlaufverm\u00f6gens": {
- "Abschreibungen auf Finanzanlagen und auf Wertpapiere des Umlaufverm\u00f6gens 1": {
- "Abschreibungen auf Finanzanlagen ": {
- "account_type": "Depreciation"
- },
- "Abschreibungen auf Finanzanlagen 100% / 50% nicht abzugsf\u00e4hig (inl\u00e4ndische Kap. Ges.)": {},
- "Abschreibungen auf Finanzanlagen auf Grund steuerlicher Sondervorschriften": {},
- "Abschreibungen auf Finanzanlagen auf Grund steuerlicher Sondervorschriften 100% / 50% nicht abzugsf\u00e4hig": {},
- "Abschreibungen auf Grund von Verlustanteilen an Mitunternehmerschaften \u00a7 8 GewStG": {},
- "Abschreibungen auf Wertpapiere des Umlaufverm\u00f6gens": {},
- "Abschreibungen auf Wertpapiere des Umlaufverm\u00f6gens 100% / 50% nicht abzugsf\u00e4hig": {},
- "Vorwegnahme k\u00fcnftiger Wertschwankungen bei Wertpapieren des Umlaufverm\u00f6gens": {}
- },
- "account_type": "Depreciation"
- },
- "Au\u00dferordentliche Aufwendungen": {
- "Au\u00dferordentliche Aufwendungen 1": {
- "Au\u00dferordentliche Aufwendungen 2": {},
- "Au\u00dferordentliche Aufwendungen finanzwirksam": {},
- "Au\u00dferordentliche Aufwendungen nicht finanzwirksam": {}
- }
- },
- "Einstellung in Gewinnr\u00fccklagen ": {
- "Aussch\u00fcttung": {
- "Vorabaussch\u00fcttung": {}
- },
- "Einstellung in Gewinnr\u00fccklagen in andere Gewinnr\u00fccklagen ": {
- "Einstellung in andere Gewinnr\u00fccklagen ": {}
- },
- "Einstellung in Gewinnr\u00fccklagen in die R\u00fccklage f\u00fcr eigene Anteile": {
- "Einstellung in die R\u00fccklage f\u00fcr eigene Anteile": {}
- },
- "Einstellung in Gewinnr\u00fccklagen in die gesetzliche R\u00fccklage ": {
- "Einstellung in die gesetzliche R\u00fccklage ": {}
- },
- "Einstellung in Gewinnr\u00fccklagen in satzungm\u00e4\u00dfige R\u00fccklage ": {
- "Einstellung in satzungm\u00e4\u00dfige R\u00fccklage ": {}
- },
- "Sonstige betriebliche Aufwendungen": {
- "(zu freien Verf\u00fcgung)": {}
- },
- "Sonstige betriebliche Ertr\u00e4ge oder sonstige betriebliche Aufwendungen": {
- "Aufwendungen/Ertr\u00e4ge aus Umrechnungsdifferenzen": {}
- },
- "Vortrag auf neue Rechnung 1": {
- "Vortrag auf neue Rechnung (GuV)": {}
- }
- },
- "Steuern vom Einkommen und Ertrag": {
- "Steuern vom Einkommen und Ertrag 1": {
- "Anrechenbarer Solidarit\u00e4tszuschlag auf Kapitalertragsteuer 20%": {},
- "Anrechenbarer Solidarit\u00e4tszuschlag auf Kapitalertragsteuer 25%": {},
- "Anrechenbarer Solidarit\u00e4tszuschlag auf Zinsabschlagsteuer": {},
- "Anzurechnende ausl\u00e4ndische Quellensteuer": {},
- "Ertr\u00e4ge aus der Aufl\u00f6sung von R\u00fcckstellungen f\u00fcr Steuern vom Einkommen und Ertrag": {},
- "Gewerbesteuer ": {},
- "Kapitalertragsteuer 20%": {},
- "Kapitalertragsteuer 25%": {},
- "K\u00f6rperschaftssteuer": {},
- "K\u00f6rperschaftssteuer f\u00fcr Vorjahr": {},
- "K\u00f6rperschaftssteuererstattung f\u00fcr Vorjahre nach \u00a737 KStG": {},
- "K\u00f6rperschaftssteuererstattungen f\u00fcr Vorjahre": {},
- "Solidarit\u00e4tszuschlag": {},
- "Solidarit\u00e4tszuschlag f\u00fcr Vorjahre": {},
- "Solidarit\u00e4tszuschlagerstattungen f\u00fcr Vorjahre": {},
- "Steuererstattungen Vorjahre f\u00fcr Steuern vom Einkommen und Ertrag": {},
- "Steuernachzahlungen Vorjahre f\u00fcr Steuern vom Einkommen und Ertrag": {},
- "Zinsabschlagsteuer": {}
- }
- },
- "Verlustvortrag": {
- "Verlustvortrag nach Verwendung": {}
- },
- "Zinsen und \u00e4hnliche Aufwendungen": {
- "Zinsen und \u00e4hnliche Aufwendungen 1": {
- "Diskontaufwendungen": {},
- "Diskontaufwendungen an verbundene Unternehmen": {},
- "In Dauerschuldzinsen unqualifizierte Zinsen auf kurzfristige Verbindlichkeiten": {},
- "Nicht abzugsf\u00e4hige Schuldzinsen gem\u00e4\u00df \u00a7 4 Abs. 4a EStG (Hinzurechnungsbetrag)": {},
- "Renten und dauernde Lasten aus Gr\u00fcndung/Erwerb \u00a78 GewStG": {},
- "Steuerlich abzugsf\u00e4hige- andere Nebenleistungen zu steuern ": {},
- "Steuerlich nicht abzugsf\u00e4hige- andere Nebenleistungen zu steuern ": {},
- "Zinsaufwendungen an Mitunternehmer f\u00fcr die Hingabe von Kapital \u00a7 15 EStG": {},
- "Zinsaufwendungen f\u00fcr Geb\u00e4ude- die zum Betriebsverm\u00f6gen geh\u00f6ren": {},
- "Zinsaufwendungen f\u00fcr kurzfristige Verbindlichkeiten": {},
- "Zinsaufwendungen f\u00fcr kurzfristige Verbindlichkeiten an verbundene Unternehmen": {},
- "Zinsaufwendungen f\u00fcr langfristige Verbindlichkeiten": {},
- "Zinsaufwendungen f\u00fcr langfristige Verbindlichkeiten an verbundene Unternehmen": {},
- "Zinsaufwendungen \u00a7\u00a7 233a AO betriebliche Steuern": {},
- "Zinsaufwendungen \u00a7\u00a7 233a bis 237 AO Personensteuern": {},
- "Zinsen und \u00e4hnliche Aufwendungen 100% / 50% nicht abzugsf\u00e4hig (inl\u00e4ndische Kap. Ges.)": {},
- "Zinsen und \u00e4hnliche Aufwendungen 2": {},
- "Zinsen und \u00e4hnliche Aufwendungen an verbundene Unternehmen": {},
- "Zinsen und \u00e4hnliche Aufwendungen an verbundene Unternehmen 100% / 50% nicht abzugsf\u00e4hig (inl\u00e4ndische Kap. Ges.)": {},
- "Zinsen zur Finanzierung des Anlageverm\u00f6gens": {},
- "Zins\u00e4hnliche Aufwendungen": {},
- "Zins\u00e4hnliche Aufwendungen an verbundene Unternehmen": {}
- }
+ },
+ "D - Rechnungsabgrenzungsposten": {
+ "is_group": 1,
+ "Passive Rechnungsabgrenzung": {
+ "account_number": "3900"
}
- },
- "root_type": "Expense"
- },
- "Gewinn u. Verlust - Ertr\u00e4ge": {
- "Betriebliche Ertr\u00e4ge": {
- "Andere aktivierte Eigenleistungen": {
- "Andere aktivierte Eigenleistungen 1": {
- "Andere aktivierte Eigenleistungen 2": {}
+ },
+ "is_group": 1
+ },
+ "Passiva - Eigenkapital": {
+ "root_type": "Equity",
+ "A - Eigenkapital": {
+ "account_type": "Equity",
+ "is_group": 1,
+ "I - Gezeichnetes Kapital": {
+ "account_type": "Equity",
+ "is_group": 1,
+ "Gezeichnetes Kapital": {
+ "account_number": "2900",
+ "account_type": "Equity"
+ },
+ "Gesch\u00e4ftsguthaben der verbleibenden Mitglieder": {
+ "account_number": "2901"
+ },
+ "Gesch\u00e4ftsguthaben der ausscheidenden Mitglieder": {
+ "account_number": "2902"
+ },
+ "Gesch\u00e4ftsguthaben aus gek\u00fcndigten Gesch\u00e4ftsanteilen": {
+ "account_number": "2903"
+ },
+ "R\u00fcckst\u00e4ndige f\u00e4llige Einzahlungen auf Gesch\u00e4ftsanteile, vermerkt": {
+ "account_number": "2906"
+ },
+ "Gegenkonto R\u00fcckst\u00e4ndige f\u00e4llige Einzahlungen auf Gesch\u00e4ftsanteile, vermerkt": {
+ "account_number": "2907"
+ },
+ "Kapitalerh\u00f6hung aus Gesellschaftsmitteln": {
+ "account_number": "2908"
+ },
+ "Ausstehende Einlagen auf das gezeichnete Kapital, nicht eingefordert": {
+ "account_number": "2910"
}
- },
- "Erh\u00f6hung oder Verminderung des Bestands an fertigen und unfertige Erzeugnissen": {
- "Erh\u00f6hung / Verminderung des Bestands an fertigen und unfertigen Erzeugnissen": {
- "Bestandsver\u00e4nderungen - fertige Erzeugnisse": {},
- "Bestandsver\u00e4nderungen - unfertige Erzeugnisse": {},
- "Bestandsver\u00e4nderungen - unfertige Leistungen": {}
- },
- "Erh\u00f6hung / Verminderung des Bestands in Arbeit befindlicher Auftr\u00e4ge": {
- "Bestandsver\u00e4nderungen in Arbeit befindlicher Auftr\u00e4ge": {}
- },
- "Erh\u00f6hung / Verminderung des Bestands in Ausf\u00fchrung befindlicher Bauaftr\u00e4ge": {
- "Bestandsver\u00e4nderungen in Ausf\u00fchrung befindliche Bauauftr\u00e4ge": {}
+ },
+ "II - Kapitalr\u00fccklage": {
+ "account_type": "Equity",
+ "is_group": 1,
+ "Kapitalr\u00fccklage": {
+ "account_number": "2920"
+ },
+ "Kapitalr\u00fccklage durch Ausgabe von Anteilen \u00fcber Nennbetrag": {
+ "account_number": "2925"
+ },
+ "Kapitalr\u00fccklage durch Ausgabe von Schuldverschreibungen": {
+ "account_number": "2926"
+ },
+ "Kapitalr\u00fccklage durch Zuzahlungen gegen Gew\u00e4hrung eines Vorzugs": {
+ "account_number": "2927"
+ },
+ "Kapitalr\u00fccklage durch Zuzahlungen in das Eigenkapital": {
+ "account_number": "2928"
+ },
+ "Nachschusskapital (Gegenkonto 1299)": {
+ "account_number": "2929"
}
- },
- "Sonstige betriebliche Ertr\u00e4ge 1": {
- "Sonstige betriebliche Ertr\u00e4ge 2": {
- "Anlagenabg\u00e4nge Finanzanlagen (Restbuchwert bei Buchgewinn)": {},
- "Anlagenabg\u00e4nge Finanzanlagen 100% / 50% steuerfrei (inl\u00e4ndische Kap. Ges.)(Restbuchwert bei Buchgewinn)": {},
- "Anlagenabg\u00e4nge Sachanlagen (Restbuchwert bei Buchgewinn)": {},
- "Anlagenabg\u00e4nge immaterielle Verm\u00f6gensgegenst\u00e4nde (Restbuchwert bei Buchgewinn)": {},
- "Bank Bewertungsertrag": {},
- "Bank Waehrungsverlust (Konto)": {},
- "Erl\u00f6se aus Verkauf immaterieller Verm\u00f6gensgegenst\u00e4nde (bei Buchgewinn)": {},
- "Erl\u00f6se aus Verk\u00e4ufen Finanzanlagen (bei Buchgewinn)": {},
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen (bei Buchgewinn)": {},
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen 16% USt (bei Buchgewinn)": {},
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen 19% USt (bei Buchgewinn)": {},
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen steuerfrei \u00a7 4 Nr. 1a UStG (bei Buchgewinn)": {},
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen steuerfrei \u00a7 4 Nr. 1b UStG (bei Buchgewinn)": {},
- "Ertraege a. Waehrungsumstellung auf Euro": {},
- "Ertr\u00e4ge aus Bewertung Finanzmittelfonds": {},
- "Ertr\u00e4ge aus Kursdifferenzen": {},
- "Ertr\u00e4ge aus Zuschreibungen des Finanzanlageverm\u00f6gens": {},
- "Ertr\u00e4ge aus Zuschreibungen des Finanzanlageverm\u00f6gens 100% / 50% steuerfrei (inl\u00e4ndische Kap. Ges.)": {},
- "Ertr\u00e4ge aus Zuschreibungen des Sachanlageverm\u00f6gens": {},
- "Ertr\u00e4ge aus Zuschreibungen des Umlaufverm\u00f6gens 100% / 50% steuerfrei (inlandische Kap. Ges.)": {},
- "Ertr\u00e4ge aus Zuschreibungen des Umlaufverm\u00f6gens au\u00dfer Vorr\u00e4ten": {},
- "Ertr\u00e4ge aus Zuschreibungen des anderen Anlageverm\u00f6gens 100% / 50% steuerfrei (inl\u00e4ndische Kap. Ges.)": {},
- "Ertr\u00e4ge aus Zuschreibungen des immateriellen Anlageverm\u00f6gens": {},
- "Ertr\u00e4ge aus abgeschriebenen Forderungen": {},
- "Ertr\u00e4ge aus dem Abgang von Gegenst\u00e4nden des Anlageverm\u00f6gens": {},
- "Ertr\u00e4ge aus dem abgang von Gegenst\u00e4nden des Umlaufverm\u00f6gens (au\u00dfer Vorr\u00e4te) 100% / 50%steuerfrei (inlandische Kap.Ges.)": {},
- "Ertr\u00e4ge aus dem abgang von Gegenst\u00e4nden des Umlaufverm\u00f6gens au\u00dfer Vorr\u00e4te": {},
- "Ertr\u00e4ge aus der Aufl\u00f6sung von R\u00fcckstellungen": {},
- "Ertr\u00e4ge aus der Aufl\u00f6sung von Sonderposten mit R\u00fccklageanteil (Ansparabschreibungen)": {},
- "Ertr\u00e4ge aus der Aufl\u00f6sung von Sonderposten mit R\u00fccklageanteil (Existenzgr\u00fcnderr\u00fccklage)": {},
- "Ertr\u00e4ge aus der Aufl\u00f6sung von Sonderposten mit R\u00fccklageanteil (Sonderabschreibungen)": {},
- "Ertr\u00e4ge aus der Aufl\u00f6sung von Sonderposten mit R\u00fccklageanteil (aus der W\u00e4hrungsumstellung auf den Euro)": {},
- "Ertr\u00e4ge aus der Aufl\u00f6sung von Sonderposten mit R\u00fccklageanteil (steuerfreie R\u00fccklage)": {},
- "Ertr\u00e4ge aus der Aufl\u00f6sung von Sonderposten mit R\u00fccklageanteil nach \u00a7 52 Abs. 16 EStG": {},
- "Ertr\u00e4ge aus der Herabsetzung der Einzelwertberichtigung zu Forderungen": {},
- "Ertr\u00e4ge aus der Herabsetzung der Pauschalwertberichtigung zu Forderungen": {},
- "Ertr\u00e4ge aus der Ver\u00e4u\u00dferung vo Anteilen an Kapitalgesellschaften 100% / 50% steuerfrei (inlandische Kap. Ges.)": {},
- "Ertr\u00e4ge aus der steuerlich niedrigeren Bewertung von R\u00fcckstellungen": {},
- "Ertr\u00e4ge aus der steuerlich niedrigeren Bewertung von Verbindlichkeiten": {},
- "Grundst\u00fccksertr\u00e4ge": {},
- "Investitionszulagen (steuerfrei)": {},
- "Investitionszusch\u00fcsse (steuerpflichtig)": {},
- "Kassendifferenzen": {},
- "Nicht realisierbare Waehrungsdifferenzen": {},
- "Periodenfremde Ertr\u00e4ge (soweit nicht au\u00dferordentlich)": {},
- "Produkt Rechnung Preisdifferenz": {},
- "Realisierte Waehrungsdifferenzen": {},
- "Rundungsdifferenzen": {},
- "Sachbez\u00fcge 16% USt (Waren)": {},
- "Sachbez\u00fcge 19% USt (Waren)": {},
- "Sachbez\u00fcge 7% USt (Waren)": {},
- "Sonstige Ertr\u00e4ge betrieblich und regelm\u00e4\u00dfig ": {},
- "Sonstige Ertr\u00e4ge betrieblich und regelm\u00e4\u00dfig 16% USt": {},
- "Sonstige Ertr\u00e4ge betrieblich und regelm\u00e4\u00dfig 19% USt ": {},
- "Sonstige Ertr\u00e4ge betriebsfremd und regelm\u00e4\u00dfig": {},
- "Sonstige Ertr\u00e4ge unregelm\u00dfig": {},
- "Sonstige betriebliche Ertr\u00e4ge 3": {},
- "Sonstige steuerfreie Betriebseinnahmen": {},
- "Verrechnete sonstige Sachbez\u00fcge ": {},
- "Verrechnete sonstige Sachbez\u00fcge (keine Waren)": {},
- "Verrechnete sonstige Sachbez\u00fcge 16 % USt ( z.B. Kfz-Gestellung)": {},
- "Verrechnete sonstige Sachbez\u00fcge 19 % USt ( z.B. Kfz-Gestellung)": {},
- "Verrechnete sonstige Sachbez\u00fcge ohne Umsatzsteuer": {},
- "Versicherungsentsch\u00e4digungen": {},
- "Waehrungsdifferenz zum Kontenausgleich": {},
- "steuerfreie Ertr\u00e4ge aus der Aufl\u00f6sung von Sonderposten mit R\u00fccklageanteil": {}
+ },
+ "III - Gewinnr\u00fccklagen": {
+ "account_type": "Equity",
+ "1 - gesetzliche R\u00fccklage": {
+ "account_type": "Equity",
+ "is_group": 1,
+ "Gesetzliche R\u00fccklage": {
+ "account_number": "2930"
+ }
+ },
+ "2 - R\u00fccklage f. Anteile an einem herrschenden oder mehrheitlich beteiligten Unternehmen": {
+ "account_type": "Equity",
+ "is_group": 1,
+ "R\u00fccklage f. Anteile an einem herrschenden oder mehrheitlich beteiligten Unternehmen": {
+ "account_number": "2935"
+ }
+ },
+ "3 - satzungsm\u00e4\u00dfige R\u00fccklagen": {
+ "account_type": "Equity",
+ "is_group": 1,
+ "Satzungsm\u00e4\u00dfige R\u00fccklagen": {
+ "account_number": "2950"
+ }
+ },
+ "4 - andere Gewinnr\u00fccklagen": {
+ "account_type": "Equity",
+ "is_group": 1,
+ "Andere Gewinnr\u00fccklagen": {
+ "account_number": "2960"
+ },
+ "Andere Gewinnr\u00fccklagen aus dem Erwerb eigener Anteile": {
+ "account_number": "2961"
+ },
+ "Eigenkapitalanteil von Wertaufholungen": {
+ "account_number": "2962"
+ },
+ "Gewinnr\u00fccklagen aus den \u00dcbergangsvorschriften BilMoG": {
+ "is_group": 1,
+ "Gewinnr\u00fccklagen (BilMoG)": {
+ "account_number": "2963"
+ },
+ "Gewinnr\u00fccklagen aus Zuschreibung Sachanlageverm\u00f6gen (BilMoG)": {
+ "account_number": "2964"
+ },
+ "Gewinnr\u00fccklagen aus Zuschreibung Finanzanlageverm\u00f6gen (BilMoG)": {
+ "account_number": "2965"
+ },
+ "Gewinnr\u00fccklagen aus Aufl\u00f6sung der Sonderposten mit R\u00fccklageanteil (BilMoG)": {
+ "account_number": "2966"
+ }
+ },
+ "Latente Steuern (Gewinnr\u00fccklage Haben) aus erfolgsneutralen Verrechnungen": {
+ "account_number": "2967"
+ },
+ "Latente Steuern (Gewinnr\u00fccklage Soll) aus erfolgsneutralen Verrechnungen": {
+ "account_number": "2968"
+ },
+ "Rechnungsabgrenzungsposten (Gewinnr\u00fccklage Soll) aus erfolgsneutralen Verrechnungen": {
+ "account_number": "2969"
+ }
+ },
+ "is_group": 1
+ },
+ "IV - Gewinnvortrag/Verlustvortrag": {
+ "account_type": "Equity",
+ "is_group": 1,
+ "Gewinnvortrag vor Verwendung": {
+ "account_number": "2970"
+ },
+ "Verlustvortrag vor Verwendung": {
+ "account_number": "2978"
}
- },
- "Statistische Konten E\u00fcR": {
- "Sonstige betriebliche Ertr\u00e4ge": {
- "Unentgeltliche Erbringung einer sonstigen Leistung 7% USt": {},
- "Unentgeltliche Erbringung einer sostigen Leistung 16% USt": {},
- "Unentgeltliche Erbringung einer sostigen Leistung 19% USt": {},
- "Unentgeltliche Erbringung einer sostigen Leistung ohne USt": {},
- "Unentgeltliche Zuwendung von Gegenst\u00e4nden 16% USt": {},
- "Unentgeltliche Zuwendung von Gegenst\u00e4nden 19% USt": {},
- "Unentgeltliche Zuwendung von Gegenst\u00e4nden ohne USt": {},
- "Verwendung von Gegenst\u00e4nden f\u00fcr Zwecke au\u00dferhalb des Unternehmens 16% USt": {},
- "Verwendung von Gegenst\u00e4nden f\u00fcr Zwecke au\u00dferhalb des Unternehmens 16% USt (Kfz-Nutzung)": {},
- "Verwendung von Gegenst\u00e4nden f\u00fcr Zwecke au\u00dferhalb des Unternehmens 16% USt (Telefon-Nutzung)": {},
- "Verwendung von Gegenst\u00e4nden f\u00fcr Zwecke au\u00dferhalb des Unternehmens 19% USt": {},
- "Verwendung von Gegenst\u00e4nden f\u00fcr Zwecke au\u00dferhalb des Unternehmens 19% USt (Kfz-Nutzung)": {},
- "Verwendung von Gegenst\u00e4nden f\u00fcr Zwecke au\u00dferhalb des Unternehmens 19% USt (Telefon-Nutzung)": {},
- "Verwendung von Gegenst\u00e4nden f\u00fcr Zwecke au\u00dferhalb des Unternehmens 7% USt": {},
- "Verwendung von Gegenst\u00e4nden f\u00fcr Zwecke au\u00dferhalb des Unternehmens ohne USt": {},
- "Verwendung von Gegenst\u00e4nden f\u00fcr Zwecke au\u00dferhalb des Unternehmens ohne USt (Kfz-Nutzung)": {},
- "Verwendung von Gegenst\u00e4nden f\u00fcr Zwecke au\u00dferhalb des Unternehmens ohne USt (Telefon-Nutzung)": {}
- },
- "Umsatzerl\u00f6se": {
- "Entnahme durch Unternehmer f\u00fcr Zwecke au\u00dferhalb des Unternehmens (Waren) ohne USt": {},
- "Entnahme durch den Unternehmer f\u00fcr Zwecke au\u00dferhalb des Unternehmens (Waren) 16% USt": {},
- "Entnahme durch den Unternehmer f\u00fcr Zwecke au\u00dferhalb des Unternehmens (Waren) 19% USt": {},
- "Entnahme durh Unternehmer f\u00fcr Zwecke au\u00dferhalb des Unternehmens (Waren) 7% USt": {},
- "Entnahme von Gegens\u00e4nden ohne USt": {},
- "Erl\u00f6sschm\u00e4lerung aus im Inland steuerpflichtigen EG-lieferungen 16% USt": {},
- "Erl\u00f6sschm\u00e4lerung aus im Inland steuerpflichtigen EG-lieferungen 19% USt": {},
- "Erl\u00f6sschm\u00e4lerung aus im Inland steuerpflichtigen EG-lieferungen 7 % USt": {},
- "Erl\u00f6sschm\u00e4lerung aus im anderen EG-lieferungen steuerpflichtigen Lieferungen": {},
- "Erl\u00f6sschm\u00e4lerungen": {},
- "Erl\u00f6sschm\u00e4lerungen 16 % USt": {},
- "Erl\u00f6sschm\u00e4lerungen 19 % USt": {},
- "Erl\u00f6sschm\u00e4lerungen 7 % USt": {},
- "Erl\u00f6sschm\u00e4lerungen aus steuerfreien Ums\u00e4tzen \u00a7 4 Nr. 1a UStG": {},
- "Erl\u00f6sschm\u00e4lerungen aus steuerfreien innergemeinschaftlichen Lieferungen": {},
- "Gegenkonto 4580-4582 bei Aufteilung der Erl\u00f6se nach Steuers\u00e4tzen (E\u00fcR)": {},
- "Gew\u00e4hrte Boni ": {},
- "Gew\u00e4hrte Boni 16 % USt": {},
- "Gew\u00e4hrte Boni 19 % USt": {},
- "Gew\u00e4hrte Boni 7 % USt": {},
- "Gew\u00e4hrte Rabatte": {},
- "Gew\u00e4hrte Rabatte 16 % USt": {},
- "Gew\u00e4hrte Rabatte 19 % USt": {},
- "Gew\u00e4hrte Rabatte 7 % USt": {},
- "Gew\u00e4hrte Skonti": {},
- "Gew\u00e4hrte Skonti 16 % USt": {},
- "Gew\u00e4hrte Skonti 19 % USt": {},
- "Gew\u00e4hrte Skonti 7 % USt": {},
- "Gew\u00e4hrte Skonti aus Leistungen- f\u00fcr die der Leistungsempf\u00e4nger die umsatzsteuer nach \u00a7 13b UStG schuldet": {},
- "Gew\u00e4hrte Skonti aus im Inland steuerpflichtigen EG-Lieferungen": {},
- "Gew\u00e4hrte Skonti aus im Inland steuerpflichtigen EG-Lieferungen 16 % USt": {},
- "Gew\u00e4hrte Skonti aus im Inland steuerpflichtigen EG-Lieferungen 19 % USt": {},
- "Gew\u00e4hrte Skonti aus im Inland steuerpflichtigen EG-Lieferungen 7 % USt": {},
- "Gew\u00e4hrte Skonti aus steuerfreien innergemeinschaftlichen Lieferungen \u00a7 4 Nr. 1b UStG": {},
- "Nicht steuerbare ums\u00e4tze (Innenums\u00e4tze)": {},
- "Statistisches Konto Erl\u00f6se zum allgemeinen Umsatzsteuersatz (E\u00fcR)": {},
- "Statistisches Konto Erl\u00f6se zum erm\u00e4\u00dfigten Umsatzsteuersatz (E\u00fcR)": {},
- "Statistisches konto Erl\u00f6se steuerfrei und nicht steuerbar (E\u00fcR)": {},
- "Umsatzsteuerverg\u00fctung": {},
- "Unentgeltliche Wertabgaben 3": {},
- "Unentgeltliche Zuwendung von Waren 16% USt": {},
- "Unentgeltliche Zuwendung von Waren 19% USt": {},
- "Unentgeltliche Zuwendung von Waren 7% USt": {},
- "Unentgeltliche Zuwendung von Waren ohne USt": {}
- }
- },
- "Umsatzerl\u00f6se 1": {
- "Sotige betriebliche Ertr\u00e4ge": {
- "Provision- sonstige Ertr\u00e4ge": {},
- "Provision- sonstige Ertr\u00e4ge 16% USt": {},
- "Provision- sonstige Ertr\u00e4ge 19% USt": {},
- "Provision- sonstige Ertr\u00e4ge 7% USt": {},
- "Provision- sonstige Ertr\u00e4ge steuerfrei (\u00a7 4 Nr. 5 UStG)": {},
- "Provision- sonstige Ertr\u00e4ge steuerfrei (\u00a7 4 Nr. 8 ff. UStG)": {}
- },
- "Umsatzerl\u00f6se 2": {
- "* Konto Kasse Ertrag": {},
- "* Sonstige Einnahmen": {},
- "* Vorausberechnete Einnahmen": {},
- "Erl\u00f6se": {},
- "Erl\u00f6se 16% USt": {},
- "Erl\u00f6se 19% USt": {},
- "Erl\u00f6se 7% USt": {},
- "Erl\u00f6se Abfallverwertung": {},
- "Erl\u00f6se Leergut": {},
- "Erl\u00f6se als Kleinunternehmer i.S.d. \u00a7 19 Abs. 1 UStG": {},
- "Erl\u00f6se aus Geldspielautomaten 16% USt": {},
- "Erl\u00f6se aus Geldspielautomaten 19% USt": {},
- "Erl\u00f6se aus Leistungen- f\u00fcr die der Leistungsempf\u00e4nger die Umsatzsteuer nach \u00a7 13b UStG schuldet": {},
- "Erl\u00f6se aus im Drittland steuerbaren Leistungen- im Inland ncht steuerbare Ums\u00e4tze": {},
- "Erl\u00f6se aus im Inland steuerpflichtigen EG-Lieferungen 16% USt": {},
- "Erl\u00f6se aus im Inland steuerpflichtigen EG-Lieferungen 19% USt": {},
- "Erl\u00f6se aus im Inland steuerpflichtigen EG-Lieferungen 7% USt": {},
- "Erl\u00f6se aus im anderen EG-Land steuerbaren Leistungen- im Inland nicht steuerbare Ums\u00e4tze": {},
- "Erl\u00f6se aus im anderen EG-Land steuerpflichtigen Lieferungen": {},
- "Erl\u00f6se. Die mit den Durchschnittss\u00e4tzen des \u00a7 24 UStG versteuert werden": {},
- "Lieferungen des ersten Abnehmers bei innergemeinschaftlichen Dreiecksgesch\u00e4ften \u00a7 25b abs. UStG": {},
- "Nicht abgerechnete Einnahmen": {},
- "Provisionsums\u00e4tze": {},
- "Provisionsums\u00e4tze 16% USt": {},
- "Provisionsums\u00e4tze 19% USt": {},
- "Provisionsums\u00e4tze 7% USt": {},
- "Provisionsums\u00e4tze- steuerfrei (\u00a74 Nr. 5 UStG)": {},
- "Provisionsums\u00e4tze- steuerfrei (\u00a74 Nr. 8 ff. UStG)": {},
- "Sonstige steuerfreie Ums\u00e4tze (z.B. \u00a7 4 Nr. 2-7 UStG)": {},
- "Sonstige steuerfreie Ums\u00e4tze Inland": {},
- "Steuerfreie Ums\u00e4tze nach \u00a7 4 Nr. 12 UStG (Vermietung und Verpackung)": {},
- "Steuerfreie Ums\u00e4tze offshore etc.": {},
- "Steuerfreie Ums\u00e4tze ohne Vorsteuerabzug zum Gesamtumsatz geh\u00f6rend": {},
- "Steuerfreie Ums\u00e4tze \u00a74 Nr. 1a UStG": {},
- "Steuerfreie Ums\u00e4tze \u00a74 Nr. 8 ff. UStG": {},
- "Steuerfreie innergemeinschaftliche Lieferungen von Neufahrzeugen an Abnehmer ohne Umsatzsteuer-Identifikationsnummer": {},
- "Steuerfreie innergemeinschaftliche Lieferungen \u00a74 Nr. 1b UStG": {},
- "Umsatzerl\u00f6se (zur fr. Verf\u00fcgung)": {}
- }
- }
- },
- "Weitere Ertr\u00e4ge": {
- "Au\u00dferordentliche Ertr\u00e4ge": {
- "Au\u00dferordentliche Ertr\u00e4ge 1": {
- "Au\u00dferordentliche Ertr\u00e4ge 2": {},
- "Au\u00dferordentliche Ertr\u00e4ge finanzwirksam": {},
- "Au\u00dferordentliche Ertr\u00e4ge nicht finanzwirksam": {}
- }
- },
- "Entnahme aus Gewinnr\u00fccklagen": {
- "Einstellungen in die Kapitalr\u00fccklage nach den Vorschriften \u00fcber die Vereinfachte Kapitalherabsetzung": {
- "Einstellungen in die Kapitalr\u00fccklage nach den Vorschriften \u00fcber die Vereinfachte Kapitalherabsetzung 1": {}
- },
- "Entnahme aus Gewinnr\u00fccklagen aus anderen Gewinnr\u00fccklagen": {
- "Entnahme aus Gewinnr\u00fccklagen aus anderen Gewinnr\u00fccklagen 1": {}
- },
- "Entnahme aus Gewinnr\u00fccklagen aus der R\u00fccklage f\u00fcr eigene Anteile ": {
- "Entnahme aus Gewinnr\u00fccklagen aus der R\u00fccklage f\u00fcr eigene Anteile 1": {}
- },
- "Entnahme aus Gewinnr\u00fccklagen aus der gesetzlichen R\u00fccklage": {
- "Entnahme aus Gewinnr\u00fccklagen aus der gesetzlichen R\u00fccklage 1": {}
- },
- "Entnahme aus Gewinnr\u00fccklagen aus satzungsm\u00e4\u00dfigen R\u00fccklage ": {
- "Entnahme aus Gewinnr\u00fccklagen aus satzungsm\u00e4\u00dfigen R\u00fccklage 1": {}
- },
- "Ertr\u00e4ge aus Kapitalherabsetzung": {
- "Ertr\u00e4ge aus Kapitalherabsetzung 1": {}
- }
- },
- "Entnahme aus der Kapitalr\u00fccklage": {
- "Entnahme aus der Kapitalr\u00fccklage 1": {}
- },
- "Ertr\u00e4ge aus Beteiligungen": {
- "Ertr\u00e4ge aus Beteiligungen 1": {
- "Ertr\u00e4ge aus Beteiligungen 2": {},
- "Ertr\u00e4ge aus Beteiligungen an verbundenen Unternehmen": {},
- "Gewinnanteile aus Mitunternehmerschaften \u00a7 9 GewStG": {},
- "Gewinne aus Anteilen an nicht steuerbefreiten inl\u00e4ndischen Kapitalgesellschaften \u00a7 9 Nr. 2a GewStG": {}
- }
- },
- "Ertr\u00e4ge aus anderen Wertpapieren und Ausleihungen des Finanzanlageverm\u00f6gens": {
- "Ertr\u00e4ge aus anderen Wertpapieren und Ausleihungen des Finanzanlageverm\u00f6gens 1": {}
- },
- "Gewinnvortrag": {
- "Gewinnvortrag nach Verwendung": {}
- },
- "Sonstige Steuern ": {
- "Sonstige Steuern 1": {
- "Ertr\u00e4ge aus der Aufl\u00f6sung von R\u00fcckstellungen f\u00fcr sonstige Steuern": {},
- "Grundsteuer": {},
- "Kfz-Steuer": {},
- "Sonstige Steuern 2": {},
- "Steuererstattungen Vorjahre f\u00fcr sonstige Steuern ": {},
- "Steuernachzahkungen Vorjahre f\u00fcr sonstige Steuern ": {},
- "Verbrauchsteuer": {},
- "\u00f6kosteuer": {}
- }
- },
- "Sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge": {
- "Sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge 1": {
- "Diskontertr\u00e4ge": {},
- "Diskontertr\u00e4ge aus verbundenen Unternehmen": {},
- "Laufende Ertr\u00e4ge aus Anteilen an Kapitalgesellschaften 100% / 50% steuerfrei": {},
- "Sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge 2": {},
- "Sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge aus verbundenen Unternehmen": {},
- "Sonstige Zinsertr\u00e4ge": {},
- "Sonstige Zinsertr\u00e4ge aus verbundenen Unternehmen": {},
- "Steuerfreie Aufzinsung des K\u00f6rperschaftsteuerguthabens nach \u00a737 KStG": {},
- "Zinsertr\u00e4ge \u00a7 233a AO": {},
- "Zinsertr\u00e4ge \u00a7 233a AO Sonderfall anlage A KSt": {},
- "Zins\u00e4hnliche Ertr\u00e4ge": {},
- "Zins\u00e4hnliche Ertr\u00e4ge aus verbundenen Unternehmen": {}
- }
- }
- },
- "root_type": "Income"
- },
- "Vortrags- Kapital- und Statistische Konten": {
- "Aufgliederung der R\u00fcckstellungen": {
- "Gegenkonto zu Konto 9260 - 9268": {},
- "Kurzfristige R\u00fcckstellungen": {},
- "Langfristige R\u00fcckstellungen- au\u00dfer Pensionen": {},
- "Mittelfristige R\u00fcckstellungen": {}
- },
- "Ausgleichsposten f\u00fcr aktivierte eigene Anteile und Bilanzierungshilfen": {
- "Ausgleichsposten f\u00fcr aktivierte Bilanzierungshilfen": {},
- "Ausgleichsposten f\u00fcr aktivierte eigene Anteile ": {}
- },
- "Eigenkapitalersetzende Gesellschafterdarlehen ": {
- "Eigenkapitalersetzende Gesellschafterdarlehen 1": {},
- "Gegenkonto zu 9250 und 9255": {},
- "Ungesicherte Gesellschafterdarlehen mit Restlaufzeit gr\u00f6\u00dfer 5 Jahre": {}
- },
- "Einzahlungsverpflichtungen im Bereich der Forderungen": {
- "Einzahlungsverpflichtungen Kommanditisten": {},
- "Einzahlungsverpflichtungen pers\u00f6nlich haftender Gesellschafter": {}
- },
- "Kapital Personenhandelsgesellschaft Teilhafter": {
- "Gesellschafter-Darlehen 1": {},
- "Verrechnungskonto f\u00fcr Einzahlungsverpflichtungen 1": {}
- },
- "Kapital Personenhandelsgesellschaft Vollhafter": {
- "Gesellschafter-Darlehen": {},
- "Verlust-/ Vortragskonto": {},
- "Verrechnungskonto f\u00fcr Einzahlungsverpflichtungen": {}
- },
- "Nicht durch Verm\u00f6genseinlagen gedeckte Entnahmen": {
- "Nicht durch Verm\u00f6genseinlagen gedeckte Entnahmen Kommanditisten": {},
- "Nicht durch Verm\u00f6genseinlagen gedeckte Entnahmen pers\u00f6nlich haftender Gesellschafter": {}
- },
- "Passive Rechnungsabgrenzung": {
- "Baukostenzusch\u00fcsse": {},
- "Forderungen aus Sachanlagenverk\u00e4ufen bei sonstigen Verm\u00f6gensgegenst\u00e4nden": {},
- "Forderungen aus Verk\u00e4ufen immaterielle Verm\u00f6gensgegenst\u00e4nde bei sonstigen Verm\u00f6gensgegenst\u00e4nden": {},
- "Forderungen aus Verk\u00e4ufen von Finanzanlagen bei sonstigen Verm\u00f6gensgegenst\u00e4nden": {},
- "Gegenkonto zu Konten 9230- 9238": {},
- "Gegenkonto zu Konto 9240-43": {},
- "Gegenkonto zu Konto 9245-47": {},
- "Investitionsverbindlichkeiten aus K\u00e4ufen von Finanzanlagen bei Leistungsverbindlichkeiten": {},
- "Investitionsverbindlichkeiten aus K\u00e4ufen von immateriellen Verm\u00f6gensgegenst\u00e4nden bei Leistungsverbindlichkeiten": {},
- "Investitionsverbindlichkeiten aus Sachanlagenk\u00e4ufen bei Leistungsverbindlichkeiten": {},
- "Investitionsverbindlichkeiten bei den Leistungsverbindlichkeiten": {},
- "Investitionszulagen ": {},
- "Investitionszusch\u00fcsse ": {}
- },
- "Privat Teilhafter (f\u00fcr Verrechnung Gesellschafterdarlehen mit Eigenkapitalcharakter- Konto 9840-9849)": {
- "Au\u00dfergew\u00f6hnliche Belastungen": {},
- "Grundst\u00fccksaufwand": {},
- "Grundst\u00fccksertrag": {},
- "Privateinlagen": {},
- "Privatentnahmen allgemein": {},
- "Privatsteuern": {},
- "Sonderausgaben beschr\u00e4nkt abzugsf\u00e4hig": {},
- "Sonderausgaben unbeschr\u00e4nkt abzugsf\u00e4hig": {},
- "Unentgeltliche Wertabgaben": {},
- "Zuwendungen- Spenden": {}
- },
- "Statistische Konten f\u00fcr 4 Abs. 3 EStG": {
+ },
+ "V - Jahres\u00fcberschu\u00df/Jahresfehlbetrag": {
+ "account_type": "Equity",
+ "is_group": 1
+ },
"Einlagen stiller Gesellschafter": {
- "Einlagen stiller Gesellschafter 1": {}
- },
- "Gegenkonto zu 9287 und 9288": {},
- "Gegenkonto zu 9290": {},
- "Gegenkonto zu 9292": {},
- "Mahngeb\u00fchren bei Buchungen \u00fcber Debitoren bei \u00a7 4 Abs. 3 EStG": {},
- "Statistisches Konto Fremdgeld": {},
- "Statistisches Konto steuerfreie Auslagen": {},
- "Steuerrechtlicher Ausgleichsposten": {
- "Steuerrechtlicher Ausgleichsposten 1": {}
- },
- "Zinsen bei Buchungen \u00fcber Debitoren bei \u00a7 4 Abs. 3 EStG": {}
- },
- "Statistische Konten f\u00fcr Betriebswirtschaftliche Auswertungen (BWA)": {
- "Anzahl Kreditkunden aufgelaufen": {},
- "Anzahl Kreditkunden monatlich": {},
- "Anzahl Rechnungen": {},
- "Anzahl der Barkunden": {},
- "Auftragsbestand": {},
- "Auftragseingang im Gesch\u00e4ftsjahr": {},
- "Besch\u00e4ftigte Personen 1": {},
- "Erweiterungsinvestitionen": {},
- "Gegenkonto f\u00fcr statistische Mengeneinheiten Konten 9101-9107 und Konten 9116-9118": {},
- "Gegenkonto zu Konten 9120- 9135-9140": {},
- "Gesch\u00e4ftsraum m2": {},
- "Unbezahlte Personen": {},
- "Verkaufskr\u00e4fte": {},
- "Verkaufsraum m2": {},
- "Verkaufstage": {}
- },
- "Statistische Konten f\u00fcr Gewinnzuschlag": {
- "Statistische Konten f\u00fcr den Gewinnzuschlag nach \u00a7\u00a7 6b- 6c und 7g EStG (Haben-Buchung)": {},
- "Statistische Konten f\u00fcr den Gewinnzuschlag- Gegenkonto zu 9890": {}
- },
- "Statistische Konten f\u00fcr den Kennziffernteil der Bilanz": {
- "Besch\u00e4ftigte Personen": {},
- "Gegenkonto zu 9200": {},
- "Gegenkonto zu 9210": {},
- "Produktive L\u00f6hne": {}
- },
- "Statistische Konten f\u00fcr die Kapitalkontenentwicklung": {
- "Anteil f\u00fcr Konto 9840-49 Teilhafter": {},
- "Anteil f\u00fcr Konto Teilhafter 0080 ": {},
- "Anteil f\u00fcr Konto Teilhafter 0081": {},
- "Anteil f\u00fcr Konto Teilhafter 0082": {},
- "Anteil f\u00fcr Konto Teilhafter 0083": {},
- "Anteil f\u00fcr Konto Teilhafter 0084": {},
- "Anteil f\u00fcr Konto Teilhafter 0085": {},
- "Anteil f\u00fcr Konto Teilhafter 0086": {},
- "Anteil f\u00fcr Konto Teilhafter 0087": {},
- "Anteil f\u00fcr Konto Teilhafter 0088": {},
- "Anteil f\u00fcr Konto Teilhafter 0089": {},
- "Anteil f\u00fcr Konto Teilhafter 2050": {},
- "Anteil f\u00fcr Konto Teilhafter 2051": {},
- "Anteil f\u00fcr Konto Teilhafter 2052": {},
- "Anteil f\u00fcr Konto Teilhafter 2053": {},
- "Anteil f\u00fcr Konto Teilhafter 2054": {},
- "Anteil f\u00fcr Konto Teilhafter 2055": {},
- "Anteil f\u00fcr Konto Teilhafter 2056": {},
- "Anteil f\u00fcr Konto Teilhafter 2057": {},
- "Anteil f\u00fcr Konto Teilhafter 2058": {},
- "Anteil f\u00fcr Konto Teilhafter 2059": {},
- "Anteil f\u00fcr Konto Teilhafter 2060": {},
- "Anteil f\u00fcr Konto Teilhafter 2061": {},
- "Anteil f\u00fcr Konto Teilhafter 2062": {},
- "Anteil f\u00fcr Konto Teilhafter 2063": {},
- "Anteil f\u00fcr Konto Teilhafter 2064": {},
- "Anteil f\u00fcr Konto Teilhafter 2065": {},
- "Anteil f\u00fcr Konto Teilhafter 2066": {},
- "Anteil f\u00fcr Konto Teilhafter 2067": {},
- "Anteil f\u00fcr Konto Teilhafter 2068": {},
- "Anteil f\u00fcr Konto Teilhafter 2069": {},
- "Anteil f\u00fcr Konto Teilhafter 2070 ": {},
- "Anteil f\u00fcr Konto Teilhafter 2071": {},
- "Anteil f\u00fcr Konto Teilhafter 2072": {},
- "Anteil f\u00fcr Konto Teilhafter 2073": {},
- "Anteil f\u00fcr Konto Teilhafter 2074": {},
- "Anteil f\u00fcr Konto Teilhafter 2075": {},
- "Anteil f\u00fcr Konto Teilhafter 2076": {},
- "Anteil f\u00fcr Konto Teilhafter 2077": {},
- "Anteil f\u00fcr Konto Teilhafter 2078": {},
- "Anteil f\u00fcr Konto Teilhafter 2079": {},
- "Anteil f\u00fcr Konto Vollhafter 0060": {},
- "Anteil f\u00fcr Konto Vollhafter 0061": {},
- "Anteil f\u00fcr Konto Vollhafter 0062": {},
- "Anteil f\u00fcr Konto Vollhafter 0063": {},
- "Anteil f\u00fcr Konto Vollhafter 0064": {},
- "Anteil f\u00fcr Konto Vollhafter 0065": {},
- "Anteil f\u00fcr Konto Vollhafter 0066": {},
- "Anteil f\u00fcr Konto Vollhafter 0067": {},
- "Anteil f\u00fcr Konto Vollhafter 0068": {},
- "Anteil f\u00fcr Konto Vollhafter 0069": {},
- "Anteil f\u00fcr Konto Vollhafter 2000": {},
- "Anteil f\u00fcr Konto Vollhafter 2001": {},
- "Anteil f\u00fcr Konto Vollhafter 2002": {},
- "Anteil f\u00fcr Konto Vollhafter 2003": {},
- "Anteil f\u00fcr Konto Vollhafter 2004": {},
- "Anteil f\u00fcr Konto Vollhafter 2005": {},
- "Anteil f\u00fcr Konto Vollhafter 2006": {},
- "Anteil f\u00fcr Konto Vollhafter 2007": {},
- "Anteil f\u00fcr Konto Vollhafter 2008": {},
- "Anteil f\u00fcr Konto Vollhafter 2009": {},
- "Anteil f\u00fcr Konto Vollhafter 2010": {},
- "Anteil f\u00fcr Konto Vollhafter 2011": {},
- "Anteil f\u00fcr Konto Vollhafter 2012": {},
- "Anteil f\u00fcr Konto Vollhafter 2013": {},
- "Anteil f\u00fcr Konto Vollhafter 2014": {},
- "Anteil f\u00fcr Konto Vollhafter 2015": {},
- "Anteil f\u00fcr Konto Vollhafter 2016": {},
- "Anteil f\u00fcr Konto Vollhafter 2017": {},
- "Anteil f\u00fcr Konto Vollhafter 2018": {},
- "Anteil f\u00fcr Konto Vollhafter 2019": {},
- "Anteil f\u00fcr Konto Vollhafter 2020": {},
- "Anteil f\u00fcr Konto Vollhafter 2021": {},
- "Anteil f\u00fcr Konto Vollhafter 2022": {},
- "Anteil f\u00fcr Konto Vollhafter 2023": {},
- "Anteil f\u00fcr Konto Vollhafter 2024": {},
- "Anteil f\u00fcr Konto Vollhafter 2025": {},
- "Anteil f\u00fcr Konto Vollhafter 2026": {},
- "Anteil f\u00fcr Konto Vollhafter 2027": {},
- "Anteil f\u00fcr Konto Vollhafter 2028": {},
- "Anteil f\u00fcr Konto Vollhafter 2029": {},
- "Anteil f\u00fcr Konto Vollhafter 9810": {},
- "Anteil f\u00fcr Konto Vollhafter 9811": {},
- "Anteil f\u00fcr Konto Vollhafter 9812": {},
- "Anteil f\u00fcr Konto Vollhafter 9813": {},
- "Anteil f\u00fcr Konto Vollhafter 9814": {},
- "Anteil f\u00fcr Konto Vollhafter 9815": {},
- "Anteil f\u00fcr Konto Vollhafter 9816": {},
- "Anteil f\u00fcr Konto Vollhafter 9817": {},
- "Anteil f\u00fcr Konto Vollhafter 9818": {},
- "Anteil f\u00fcr Konto Vollhafter 9819": {},
- "Anteil f\u00fcr Konto Vollhafter 9820 ": {},
- "Anteil f\u00fcr Konto Vollhafter 9821": {},
- "Anteil f\u00fcr Konto Vollhafter 9822": {},
- "Anteil f\u00fcr Konto Vollhafter 9823": {},
- "Anteil f\u00fcr Konto Vollhafter 9824": {},
- "Anteil f\u00fcr Konto Vollhafter 9825": {},
- "Anteil f\u00fcr Konto Vollhafter 9826": {},
- "Anteil f\u00fcr Konto Vollhafter 9827": {},
- "Anteil f\u00fcr Konto Vollhafter 9828": {},
- "Anteil f\u00fcr Konto Vollhafter 9829": {},
- "Darlehensverzinsung Teillhafter": {},
- "Darlehensverzinsung Vollhafter": {},
- "Gebrauchs\u00fcberlassung Teillhafter": {},
- "Gebrauchs\u00fcberlassung Vollhafter": {},
- "L\u00f6sch- und Korrekturschl\u00fcssel": {},
- "Name des Gesellschafters Teillhafter": {},
- "Name des Gesellschafters Vollhafter": {},
- "Restanteil Teillhafter": {},
- "Restanteil Vollhafter": {},
- "Sonstige Verg\u00fctungen Teillhafter": {},
- "Sonstige Verg\u00fctungen Vollhafter": {},
- "Tantieme Teillhafter": {},
- "Tantieme Vollhafter": {},
- "T\u00e4tigkeitsverg\u00fctung Teillhafter": {},
- "T\u00e4tigkeitsverg\u00fctung Vollhafter": {}
- },
- "Statistische Konten f\u00fcr die im Anhang anzugebenden sonstigen finanziellen Verpflichtungen": {
- "Andere Verpflichtungen gem\u00e4\u00df \u00a7 285 Nr. 3 HGB": {},
- "Andere Verpflichtungen gem\u00e4\u00df \u00a7 285 Nr. 3 HGB gegen\u00fcber verbundenen Unternehmen": {},
- "Gegenkonto zu 9281-9284": {},
- "Verpflichtungen aus Miet- und Leasingsvertr\u00e4gen": {},
- "Verpflichtungen aus Miet- und Leasingsvertr\u00e4gen gegen\u00fcber verbundenen Unternehmen": {}
- },
- "Statistische Konten f\u00fcr in der Bilanz auszuweisende Haftungsverh\u00e4ltnisse": {
- "Gegenkonto zu 9271 - 9279 (Soll-Buchung)": {},
- "Haftung aus der Bestellung von Sicherheiten f\u00fcr fremde Verbindlichkeiten": {},
- "Haftung aus der Bestellung von Sicherheiten f\u00fcr fremde Verbindlichkeiten gegen\u00fcber verbundenen Unternehmen": {},
- "Verbindlichkeiten aus B\u00fcrgschaften- Wechsel- und Scheckb\u00fcrgschaften": {},
- "Verbindlichkeiten aus B\u00fcrgschaften- Wechsel- und Scheckb\u00fcrgschaften gegen\u00fcber verbundenen Unternehmen": {},
- "Verbindlichkeiten aus Gew\u00e4hrleistungsvertr\u00e4gen": {},
- "Verbindlichkeiten aus Gew\u00e4hrleistungsvertr\u00e4gen gegen\u00fcber verbundenen Unternehmen": {},
- "Verbindlichkeiten aus der Begebung und \u00fcbertragung von Wechseln": {},
- "Verpflichtungen aus Treuhandverm\u00f6gen": {}
- },
- "Statistische Konten zu \u00a7 4 (4a) EStG": {
- "Erh\u00f6hung der Entnahmen \u00a74 (4a) EStG": {},
- "Gegenkonto zur Erh\u00f6hung der Entnahmen \u00a74 (4a) EStG (Haben)": {},
- "Gegenkonto zur Minderung der Entnahmen \u00a74 (4a) EStG": {},
- "Minderung der Entnahmen \u00a74 (4a) EStG (Haben)": {}
- },
- "Statistische Konten zur informativen Angabe des gezeichneten Kapitals in anderer W\u00e4hrung": {
- "Gezeichnetes Kapital in DM": {
- "Gezeichnetes Kapital in DM (Art. 42 Abs. 3 S. 1 EGHGB)": {}
- },
- "Gezeichnetes Kapital in Euro": {
- "Gegenkonto zu 9220-9221": {},
- "Gezeichnetes Kapital in Euro (Art. 42 Abs. 3 S. 2 EGHGB)": {}
+ "account_number": "9295"
}
- },
- "Statistische konten f\u00fcr Kinderbetreuungskosten": {
- "Gegenkonto zu 9918 (Haben)": {},
- "Kinderbetreuungskosten (wie Betriebsausgaben steuerlich anzusetzender Betrag)": {}
- },
- "Steueraufwand der Gesellschafter": {
- "Gegenkonto zu 9887": {},
- "Steueraufwand der Gesellschafter 1": {}
- },
- "Verrechnungskonto f\u00fcr nicht durch Verm\u00f6genseinlagen gedeckte Entnahmen": {
- "Verrechnungskonto f\u00fcr nicht durch Verm\u00f6genseinlagen gedeckte Entnahmen Kommanditisten": {},
- "Verrechnungskonto f\u00fcr nicht durch Verm\u00f6genseinlagen gedeckte Entnahmen pers\u00f6nlich haftender Gesellschafter": {}
- },
- "Vorsteuer-/Umsatzsteuerkonten zur Korrektur der Forderungen/ Verbindlichkeiten (E\u00fcR)": {
- "Gegenkonto 9893-9894 f\u00fcr die Aufteilung der Umsatzsteuersatz (E\u00fcR)": {},
- "Gegenkonto 9896-9897 f\u00fcr die Aufteilung der Vorsteuer (E\u00fcR)": {},
- "SO Commitment": {},
- "Umsatzsteuer in den Forderungen zum allgemeinen Umsatzsteuersatz (E\u00fcR)": {},
- "Umsatzsteuer in den Forderungen zum erm\u00e4\u00dfigten Umsatzsteuersatz (E\u00fcR)": {},
- "Vorsteuer in den Verbindlichkeiten zum allgemeinen Umsatzsteuersatz (E\u00fcR)": {},
- "Vorsteuer in den Verbindlichkeiten zum erm\u00e4\u00dfigten Umsatzsteuersatz (E\u00fcR)": {}
- },
- "Vortragskonten": {
- "Offene Posten aus 1990": {},
- "Offene Posten aus 1991": {},
- "Offene Posten aus 1992": {},
- "Offene Posten aus 1993": {},
- "Offene Posten aus 1994": {},
- "Offene Posten aus 1995": {},
- "Offene Posten aus 1996": {},
- "Offene Posten aus 1997": {},
- "Offene Posten aus 1998": {},
- "Offene Posten aus 1999": {},
- "Offene Posten aus 2000": {},
- "Offene Posten aus 2001": {},
- "Offene Posten aus 2002": {},
- "Offene Posten aus 2003": {},
- "Offene Posten aus 2004": {},
- "Offene Posten aus 2005": {},
- "Offene Posten aus 2006": {},
- "Offene Posten aus 2007": {},
- "Offene Posten aus 2008": {},
- "Offene Posten aus 2009": {},
- "Saldenvortr\u00e4ge": {},
- "Saldenvortr\u00e4ge Debitoren": {},
- "Saldenvortr\u00e4ge Kreditoren": {},
- "Saldenvortr\u00e4ge- Sachkonten": {},
- "Summenvortragskonto": {}
- },
- "root_type": "Asset"
+ }
+ },
+ "1 - Umsatzerl\u00f6se": {
+ "root_type": "Income",
+ "is_group": 1,
+ "Steuerfreie Ums\u00e4tze \u00a7 4 Nr. 8 ff UStG (Gruppe)": {
+ "is_group": 1,
+ "Steuerfreie Ums\u00e4tze \u00a7 4 Nr. 8 ff UStG": {
+ "account_number": "4100"
+ },
+ "Steuerfreie Ums\u00e4tze nach \u00a7 4 Nr. 12 UStG (Vermietung und Verpachtung)": {
+ "account_number": "4105"
+ },
+ "Sonstige steuerfreie Ums\u00e4tze Inland": {
+ "account_number": "4110"
+ },
+ "Steuerfreie Ums\u00e4tze \u00a7 4 Nr. 1a UStG (Gruppe)": {
+ "is_group": 1,
+ "Steuerfreie Ums\u00e4tze \u00a7 4 Nr. 1a UStG": {
+ "account_number": "4120"
+ },
+ "Steuerfreie Innergemeinschaftliche Lieferungen \u00a7 4 Nr. 1b UStG": {
+ "account_number": "4125"
+ }
+ },
+ "Lieferungen des ersten Abnehmers bei innergem. Dreiecksgesch.en \u00a7 25b Abs. 2 UStG (Gruppe)": {
+ "is_group": 1,
+ "Lieferungen des ersten Abnehmers bei innergem. Dreiecksgesch.en \u00a7 25b Abs. 2 UStG": {
+ "account_number": "4130"
+ },
+ "Steuerfreie innergem. Lieferungen von Neufahrzeugen an Abnehmer ohne Ust-ID": {
+ "account_number": "4135"
+ },
+ "Umsatzerl\u00f6se nach \u00a7\u00a7 25 und 25a UStG 19% USt": {
+ "account_number": "4136"
+ },
+ "Umsatzerl\u00f6se nach \u00a7\u00a7 25 und 25a UStG ohne USt": {
+ "account_number": "4138"
+ },
+ "Umsatzerl\u00f6se aus Reiseleistungen \u00a7 25 Abs. 2 UStG, steuerfrei": {
+ "account_number": "4139"
+ }
+ },
+ "Steuerfreie Ums\u00e4tze Offshore usw.": {
+ "account_number": "4140"
+ },
+ "Sonstige steuerfreie Ums\u00e4tze (z. B. \u00a7 4 Nr. 2-7 UStG)": {
+ "account_number": "4150"
+ },
+ "Steuerfreie Ums\u00e4tze ohne Vorsteuerabzug zum Gesamtumsatz geh\u00f6rend": {
+ "account_number": "4160"
+ },
+ "Erl\u00f6se, die mit den Durchschnittss\u00e4tzen des \u00a7 24 UStG versteuert werden": {
+ "account_number": "4180"
+ },
+ "Erl\u00f6se aus Kleinunternehmer i. S. d. \u00a7 19 Abs. 1 UStG": {
+ "account_number": "4185",
+ "account_type": "Income Account"
+ },
+ "Erl\u00f6se aus Geldspielautomaten 19 % USt": {
+ "account_number": "4186"
+ }
+ },
+ "Erl\u00f6se": {
+ "account_number": "4200",
+ "account_type": "Income Account"
+ },
+ "Erl\u00f6se 7 % USt": {
+ "account_number": "4300",
+ "account_type": "Income Account"
+ },
+ "Erl\u00f6se 16 % USt": {
+ "account_number": "4340",
+ "account_type": "Income Account"
+ },
+ "Erl\u00f6se 19 % USt": {
+ "account_number": "4400",
+ "account_type": "Income Account"
+ },
+ "Erl\u00f6se aus im Inland steuerpfl. EU-Lieferungen 7 % USt": {
+ "account_number": "4310"
+ },
+ "Erl\u00f6se aus im Inland steuerpfl. EU-Lieferungen 19 % USt": {
+ "account_number": "4315"
+ },
+ "Erl\u00f6se aus im anderen EU-Land steuerpfl. Lieferungen": {
+ "account_number": "4320"
+ },
+ "Erl\u00f6se aus im Inland steuerpfl. EU-Lieferungen 16 % USt": {
+ "account_number": "4330"
+ },
+ "Erl\u00f6se aus Lieferungen von Mobilfunkger./Schaltkr., f. die der Leistungsempf. die Ust. schuldet": {
+ "account_number": "4335"
+ },
+ "Erl\u00f6se aus im anderen EU-Land steuerpfl. sonst. Leistungen, f. die der Leistungsempf. die Ust. schuldet": {
+ "account_number": "4336"
+ },
+ "Erl\u00f6se aus Leistungen, f. die der Leistungsempf. die Ust. nach \u00a7 13b UStG schuldet": {
+ "account_number": "4337"
+ },
+ "Erl\u00f6se aus im Drittland steuerbaren Leistungen, im Inland nicht steuerbare Ums\u00e4tze": {
+ "account_number": "4338"
+ },
+ "Erl\u00f6se aus im anderen EU-Land steuerbaren Leistungen, im Inland nicht steuerbare Ums\u00e4tze": {
+ "account_number": "4339"
+ },
+ "Grundst\u00fccksertr\u00e4ge (Gruppe)": {
+ "is_group": 1,
+ "Grundst\u00fccksertr\u00e4ge": {
+ "account_number": "4860"
+ },
+ "Erl\u00f6se aus Vermietung und Verpachtung, umsatzsteuerfrei \u00a7 4 Nr. 12 UStG": {
+ "account_number": "4861"
+ },
+ "Erl\u00f6se aus Vermietung und Verpachtung 19% USt": {
+ "account_number": "4862"
+ }
+ },
+ "Sonstige Ertr\u00e4ge aus Provisionen, Lizenzen und Patenten (Gruppe)": {
+ "is_group": 1,
+ "Sonstige Ertr\u00e4ge aus Provisionen, Lizenzen und Patenten": {
+ "account_number": "4570"
+ },
+ "Sonstige Ertr\u00e4ge aus Provisionen, Lizenzen und Patenten, steuerfrei \u00a7 4 Nr. 8ff UStG": {
+ "account_number": "4574"
+ },
+ "Sonstige Ertr\u00e4ge aus Provisionen, Lizenzen und Patenten, steuerfrei \u00a7 4 Nr. 5 UStG": {
+ "account_number": "4575"
+ },
+ "Sonstige Ertr\u00e4ge aus Provisionen, Lizenzen und Patenten 7% USt": {
+ "account_number": "4576"
+ },
+ "Sonstige Ertr\u00e4ge aus Provisionen, Lizenzen und Patenten 19% USt": {
+ "account_number": "4579"
+ }
+ },
+ "Provisionsums\u00e4tze (Gruppe)": {
+ "is_group": 1,
+ "Provisionsums\u00e4tze": {
+ "account_number": "4560"
+ },
+ "Provisionsums\u00e4tze, steuerfrei \u00a7 4Nr. 8ff UStG": {
+ "account_number": "4564"
+ },
+ "Provisionsums\u00e4tze, steuerfrei \u00a7 4 Nr. 5 UStG": {
+ "account_number": "4565"
+ },
+ "Provisionsums\u00e4tze 7% USt": {
+ "account_number": "4566"
+ },
+ "Provisionsums\u00e4tze 19 % Ust": {
+ "account_number": "4569"
+ }
+ },
+ "Erl\u00f6se Abfallverwertung": {
+ "account_number": "4510"
+ },
+ "Erl\u00f6se Leergut": {
+ "account_number": "4520"
+ }
+ },
+ "2 - Herstellungskosten der zur Erzielung der Umsatzerl\u00f6se erbrachten Leistungen": {
+ "root_type": "Expense",
+ "is_group": 1,
+ "Herstellungskosten": {
+ "account_number": "6990",
+ "account_type": "Cost of Goods Sold"
+ },
+ "Herstellungskosten: Schwund": {
+ "account_type": "Stock Adjustment"
+ },
+ "Aufwendungen f. Roh-, Hilfs- und Betriebsstoffe und f. bezogene Waren": {
+ "account_number": "5000",
+ "account_type": "Expense Account"
+ },
+ "Einkauf Roh-, Hilfs- und Betriebsstoffe (Gruppe)": {
+ "is_group": 1,
+ "Einkauf Roh-, Hilfs- und Betriebsstoffe": {
+ "account_number": "5100",
+ "account_type": "Expense Account"
+ },
+ "Einkauf Roh-, Hilfs- und Betriebsstoffe 7% Vorsteuer": {
+ "account_number": "5110"
+ },
+ "Einkauf Roh-, Hilfs- und Betriebsstoffe 19% Vorsteuer": {
+ "account_number": "5130"
+ },
+ "Einkauf Roh-, Hilfs- und Betriebsstoffe, innergem. Erwerb 7% Vorst. u. 7% Ust.": {
+ "account_number": "5160"
+ },
+ "Einkauf Roh-, Hilfs- und Betriebsstoffe, innergem. Erwerb 19% Vorst. u. 19% Ust.": {
+ "account_number": "5162"
+ },
+ "Einkauf Roh-, Hilfs- und Betriebsstoffe, innergem. Erwerb ohne Vorsteuer und 7% Umsatzsteuer": {
+ "account_number": "5166"
+ },
+ "Einkauf Roh-, Hilfs- und Betriebsstoffe, innergem. Erwerb ohne Vorsteuer und 19% Umsatzsteuer": {
+ "account_number": "5167"
+ },
+ "Einkauf Roh-, Hilfs- und Betriebsstoffe 5,5% Vorsteuer": {
+ "account_number": "5170"
+ },
+ "Einkauf Roh-, Hilfs- und Betriebsstoffe 10,7% Vorsteuer": {
+ "account_number": "5171"
+ },
+ "Einkauf Roh-, Hilfs- und Betriebsstoffe aus einem USt-Lager \u00a7 13a UStG 7% Vorst. und 7% Ust.": {
+ "account_number": "5175"
+ },
+ "Einkauf Roh-, Hilfs- und Betriebsstoffe aus einem USt-Lager \u00a7 13a UStG 19% Vorst. und 19% Ust.": {
+ "account_number": "5176"
+ },
+ "Erwerb Roh-, Hilfs- und Betriebsstoffe als letzter Abnehmer innerh. Dreiecksgesch. 19% Vorst. und 19% Ust.": {
+ "account_number": "5189"
+ },
+ "Energiestoffe (Fertigung) (Gruppe)": {
+ "is_group": 1,
+ "Energiestoffe (Fertigung)": {
+ "account_number": "5190"
+ },
+ "Energiestoffe (Fertigung) 7% Vorsteuer": {
+ "account_number": "5191"
+ },
+ "Energiestoffe (Fertigung) 19% Vorsteuer": {
+ "account_number": "5192"
+ }
+ }
+ },
+ "Wareneingang (Gruppe)": {
+ "is_group": 1,
+ "Wareneingang": {
+ "account_number": "5200"
+ },
+ "Wareneingang 7 % Vorsteuer": {
+ "account_number": "5300"
+ },
+ "Wareneingang 19 % Vorsteuer": {
+ "account_number": "5400"
+ },
+ "Wareneingang 5,5 % Vorsteuer": {
+ "account_number": "5505"
+ },
+ "Wareneingang 10,7 % Vorsteuer": {
+ "account_number": "5540"
+ },
+ "Steuerfreier innergem. Erwerb": {
+ "account_number": "5550"
+ },
+ "Wareneingang im Drittland steuerbar": {
+ "account_number": "5551"
+ },
+ "Erwerb 1. Abnehmer innerh. eines Dreieckgesch\u00e4ftes": {
+ "account_number": "5552"
+ },
+ "Erwerb Waren als letzter Abnehmer innerh. Dreiecksgesch. 19% Vorst. u. 19% Ust.": {
+ "account_number": "5553"
+ },
+ "Wareneingang im anderen EU-Land steuerbar": {
+ "account_number": "5558"
+ },
+ "Steuerfreie Einfuhren": {
+ "account_number": "5559"
+ },
+ "Waren aus einem Umsatzsteuerlager, \u00a7 13a UStG 7% Vorst. u. 7% Ust.": {
+ "account_number": "5560"
+ },
+ "Waren aus einem Umsatzsteuerlager, \u00a7 13a UStG 19% Vorst. u. 19% Ust.": {
+ "account_number": "5565"
+ }
+ },
+ "innergem. Erwerb 7% Vorst. u. 7% Ust.": {
+ "account_number": "5420"
+ },
+ "innergem. Erwerb 19 % Vorsteuer 19 % Umsatzsteuer": {
+ "account_number": "5425"
+ },
+ "innergem. Erwerb ohne Vorst. und 7% Ust.": {
+ "account_number": "5430"
+ },
+ "innergem. Erwerb ohne Vorsteuer und 19 % Umsatzsteuer": {
+ "account_number": "5435"
+ },
+ "innergem. Erwerb von Neufahrzeugen von Lieferanten ohne Ust-ID 19 % Vorst. und 19 % Ust.": {
+ "account_number": "5440"
+ },
+ "Nicht abziehbare Vorsteuer (Gruppe)": {
+ "is_group": 1,
+ "Nicht abziehbare Vorsteuer": {
+ "account_number": "5600"
+ },
+ "Nicht abziehbare Vorsteuer 7 % (Gruppe)": {
+ "is_group": 1,
+ "Nicht abziehbare Vorsteuer 7 %": {
+ "account_number": "5610"
+ }
+ },
+ "Nicht abziehbare Vorsteuer 19 % (Gruppe)": {
+ "is_group": 1,
+ "Nicht abziehbare Vorsteuer 19 %": {
+ "account_number": "5660"
+ }
+ }
+ },
+ "Nachl\u00e4sse (Gruppe)": {
+ "is_group": 1,
+ "Nachl\u00e4sse": {
+ "account_number": "5700"
+ },
+ "Nachl\u00e4sse aus Einkauf Roh-, Hilfs- und Betriebsstoffe": {
+ "account_number": "5701"
+ },
+ "Nachl\u00e4sse 7 % Vorsteuer": {
+ "account_number": "5710"
+ },
+ "Nachl\u00e4sse aus Einkauf Roh-, Hilfs- und Betriebsstoffe 7% Vorsteuer": {
+ "account_number": "5714"
+ },
+ "Nachl\u00e4sse aus Einkauf Roh-, Hilfs- und Betriebsstoffe 19% Vorsteuer": {
+ "account_number": "5715"
+ },
+ "Nachl\u00e4sse aus Einkauf Roh-, Hilfs- und Betriebsstoffe, innergem. Erwerb 7% Vorst. u. 7% Ust.": {
+ "account_number": "5717"
+ },
+ "Nachl\u00e4sse aus Einkauf Roh-, Hilfs- und Betriebsstoffe, innergem. Erwerb 19% Vorst. u. 19% Ust.": {
+ "account_number": "5718"
+ },
+ "Nachl\u00e4sse 19 % Vorsteuer": {
+ "account_number": "5720"
+ },
+ "Nachl\u00e4sse 16 % Vorsteuer": {
+ "account_number": "5722"
+ },
+ "Nachl\u00e4sse 15 % Vorsteuer": {
+ "account_number": "5723"
+ },
+ "Nachl\u00e4sse aus innergem. Erwerb 7% Vorst. u. 7% Ust.": {
+ "account_number": "5724"
+ },
+ "Nachl\u00e4sse aus innergem. Erwerb 19% Vorst. u. 19% Ust.": {
+ "account_number": "5725"
+ },
+ "Nachl\u00e4sse aus innergem. Erwerb 16 % Vorsteuer und 16 % Umsatzsteuer": {
+ "account_number": "5726"
+ },
+ "Nachl\u00e4sse aus innergem. Erwerb 15 % Vorsteuer und 15 % Umsatzsteuer": {
+ "account_number": "5727"
+ }
+ },
+ "Erhaltene Skonti (Gruppe)": {
+ "is_group": 1,
+ "Erh. Skonti": {
+ "account_number": "5730"
+ },
+ "Erh. Skonti 7 % Vorsteuer": {
+ "account_number": "5731"
+ },
+ "Erh. Skonti aus Einkauf Roh-, Hilfs- und Betriebsstoffe": {
+ "account_number": "5733"
+ },
+ "Erh. Skonti aus Einkauf Roh-, Hilfs- und Betriebsstoffe 7% Vorsteuer": {
+ "account_number": "5734"
+ },
+ "Erh. Skonti 19 % Vorsteuer": {
+ "account_number": "5736"
+ },
+ "Erh. Skonti aus Einkauf Roh-, Hilfs- und Betriebsstoffe 19% Vorsteuer": {
+ "account_number": "5738"
+ },
+ "Erh. Skonti aus Einkauf Roh-, Hilfs- und Betriebsstoffe aus steuerpfl. innergem. Erwerb 19% Vorst. u. 19% Ust.": {
+ "account_number": "5741"
+ },
+ "Erh. Skonti aus Einkauf Roh-, Hilfs- und Betriebsstoffe aus steuerpfl. innergem. Erwerb 7% Vorst. u. 7% Ust.": {
+ "account_number": "5743"
+ },
+ "Erh. Skonti aus steuerpflichtigem innergem. Erwerb": {
+ "account_number": "5745"
+ },
+ "Erh. Skonti aus steuerpflichtigem innergem. Erwerb 7% Vorst. u. 7% Ust.": {
+ "account_number": "5746"
+ },
+ "Erh. Skonti aus steuerpflichtigem innergem. Erwerb 19% Vorst. u. 19% Ust.": {
+ "account_number": "5748"
+ },
+ "Erh. Skonti aus Erwerb Roh-,Hilfs-,Betriebsstoff letzter Abn.innerh.Dreiecksg. 19% Vorst. und 19% Ust.": {
+ "account_number": "5792"
+ },
+ "Erh. Skonti aus Erwerb Waren als letzter Abnehmer innerh. Dreiecksgesch. 19% Vorst. u. 19% Ust.": {
+ "account_number": "5793"
+ }
+ },
+ "Bezugsnebenkosten (Gruppe)": {
+ "is_group": 1,
+ "Bezugsnebenkosten": {
+ "account_number": "5800"
+ },
+ "Leergut": {
+ "account_number": "5820"
+ },
+ "Z\u00f6lle und Einfuhrabgaben": {
+ "account_number": "5840"
+ },
+ "Verrechnete Stoffkosten (Gegenkonto 5000-99) oder (4000-99)": {
+ "account_number": "5860"
+ }
+ },
+ "Fremdleistungen (Gruppe)": {
+ "is_group": 1,
+ "Fremdleistungen": {
+ "account_number": "5900",
+ "account_type": "Expense Account"
+ },
+ "Fremdleistungen 19% Vorsteuer": {
+ "account_number": "5906"
+ },
+ "Fremdleistungen ohne Vorsteuer": {
+ "account_number": "5909"
+ },
+ "Bauleistungen eines im Inland ans\u00e4ssigen Unternehmers 7% Vorst. u. 7% Ust.": {
+ "account_number": "5910"
+ },
+ "Sonstige Leistungen eines im anderen EU-Land ans\u00e4ssigen Unternehmers 7% Vorst. u. 7% Ust.": {
+ "account_number": "5913"
+ },
+ "Leistungen eines im Ausland ans\u00e4ssigen Unternehmers 7% Vorst. u. 7% Ust.": {
+ "account_number": "5915"
+ },
+ "Bauleistungen eines im Inland ans\u00e4ssigen Unternehmers 19% Vorst. u. 19% Ust.": {
+ "account_number": "5920"
+ },
+ "Sonstige Leistungen eines im anderen EU-Land ans\u00e4ssigen Unternehmers 19% Vorst. u. 19% Ust.": {
+ "account_number": "5923"
+ },
+ "Leistungen eines im Ausland ans\u00e4ssigen Unternehmers 19% Vorst. u. 19% Ust.": {
+ "account_number": "5925"
+ },
+ "Bauleistungen eines im Inland ans\u00e4ssigen Unternehmers ohne Vorst. und 7% Ust.": {
+ "account_number": "5930"
+ },
+ "Sonstige Leistungen eines im anderen EU-Land ans\u00e4ssigen Unternehmers ohne Vorst. und 7% Ust.": {
+ "account_number": "5933"
+ },
+ "Leistungen eines im Ausland ans\u00e4ssigen Unternehmers ohne Vorst. und 7% Ust.": {
+ "account_number": "5935"
+ },
+ "Bauleistungen eines im Inland ans\u00e4ssigen Unternehmers ohne Vorsteuer und 19 % Umsatzsteuer": {
+ "account_number": "5940"
+ },
+ "Sonstige Leistungen eines im anderen EU-Land ans\u00e4ssigen Unternehmers ohne Vorsteuer und 19 % Umsatzsteuer": {
+ "account_number": "5943"
+ },
+ "Leistungen eines im Ausland ans\u00e4ssigen Unternehmers ohne Vorsteuer und 19 % Umsatzsteuer": {
+ "account_number": "5945"
+ },
+ "Erhaltene Skonti aus Leistungen, f. die als Leistungsempf. die Steuer geschuldet wird (Gruppe)": {
+ "is_group": 1,
+ "Erh. Skonti aus Leistungen, f. die als Leistungsempf. die Steuer nach \u00a7 13b UStG geschuldet wird": {
+ "account_number": "5950"
+ },
+ "Erh. Skonti aus Leistungen,f. die als Leistungsempf. die Steuer geschuldet wird 19 % Vorst. und 19 % Ust.": {
+ "account_number": "5951"
+ },
+ "Erh. Skonti aus Leistungen, f. die als Leistungsempf. die Steuer geschuldet wird ohne Vorst. aber mit Uts.": {
+ "account_number": "5953"
+ },
+ "Erh. Skonti aus Leistungen, f. die als Leistungsempf. die Steuer geschuldet wird ohne Vorst., mit 19 % Ust.": {
+ "account_number": "5954"
+ }
+ },
+ "Leistungen nach \u00a7 13b UStG mit Vorsteuerabzug": {
+ "account_number": "5960"
+ },
+ "Leistungen nach \u00a7 13b UStG ohne Vorsteuerabzug": {
+ "account_number": "5965"
+ }
+ },
+ "L\u00f6hne und Geh\u00e4lter (Gruppe)": {
+ "is_group": 1,
+ "L\u00f6hne und Geh\u00e4lter": {
+ "account_number": "6000",
+ "account_type": "Expense Account"
+ },
+ "L\u00f6hne": {
+ "account_number": "6010"
+ },
+ "Geh\u00e4lter": {
+ "account_number": "6020"
+ },
+ "Tantiemen": {
+ "account_number": "6026"
+ },
+ "Aushilfsl\u00f6hne": {
+ "account_number": "6030"
+ },
+ "L\u00f6hne f. Minijobs": {
+ "account_number": "6035"
+ },
+ "Pauschale Steuern und Abgaben f. Sachzuwendungen und Dienstleistungen an Arbeitnehmer": {
+ "account_number": "6039"
+ },
+ "Pauschale Steuer f. Aushilfen": {
+ "account_number": "6040"
+ },
+ "Bedienungsgelder": {
+ "account_number": "6045"
+ },
+ "Ehegattengehalt": {
+ "account_number": "6050"
+ },
+ "Freiwillige soziale Aufwendungen lohnsteuerpflichtig": {
+ "account_number": "6060"
+ },
+ "Pauschale Steuer auf sonstige Bez\u00fcge (z. B. Fahrtkostenzusch\u00fcsse)": {
+ "account_number": "6069"
+ },
+ "Krankengeldzusch\u00fcsse": {
+ "account_number": "6070"
+ },
+ "Sachzuwendungen und Dienstleistungen an Arbeitnehmer": {
+ "account_number": "6072"
+ },
+ "Zusch\u00fcsse der Agenturen f. Arbeit (Haben)": {
+ "account_number": "6075"
+ },
+ "Verm\u00f6genswirksame Leistungen": {
+ "account_number": "6080"
+ },
+ "Fahrtkostenerstattung - Wohnung/Arbeitsst\u00e4tte": {
+ "account_number": "6090"
+ }
+ },
+ "Soziale Abgaben und Aufwendungen f. Altersvers. und f. Unterst\u00fctzung (Gruppe)": {
+ "is_group": 1,
+ "Soziale Abgaben und Aufwendungen f. Altersvers. und f. Unterst\u00fctzung": {
+ "account_number": "6100",
+ "account_type": "Expense Account"
+ },
+ "Gesetzliche soziale Aufwendungen": {
+ "account_number": "6110",
+ "account_type": "Expense Account"
+ },
+ "Beitr\u00e4ge zur Berufsgenossenschaft": {
+ "account_number": "6120",
+ "account_type": "Expense Account"
+ },
+ "Freiwillige soziale Aufwendungen lohnsteuerfrei": {
+ "account_number": "6130"
+ },
+ "Aufwendungen f. Altersvers.": {
+ "account_number": "6150"
+ },
+ "Aufwendungen f. Unterst\u00fctzung": {
+ "account_number": "6160"
+ },
+ "Sonstige soziale Abgaben": {
+ "account_number": "6170"
+ }
+ },
+ "Abschreibungen auf Sachanlagen (Gruppe)": {
+ "is_group": 1,
+ "Abschreibungen auf Sachanlagen (ohne AfA auf Kfz und Geb\u00e4ude)": {
+ "account_number": "6220",
+ "account_type": "Depreciation"
+ },
+ "Abschreibungen auf Geb\u00e4ude": {
+ "account_number": "6221",
+ "account_type": "Depreciation"
+ },
+ "Abschreibungen auf Kfz": {
+ "account_number": "6222",
+ "account_type": "Depreciation"
+ },
+ "Abschreibungen auf Geb\u00e4udeanteil des h\u00e4uslichen Arbeitszimmers": {
+ "account_number": "6223"
+ }
+ },
+ "Au\u00dferplanm\u00e4\u00dfige Abschreibungen auf Sachanlagen (Gruppe)": {
+ "is_group": 1,
+ "Au\u00dferplanm\u00e4\u00dfige Abschreibungen auf Sachanlagen": {
+ "account_number": "6230"
+ },
+ "Absetzung f. au\u00dfergew\u00f6hnliche technische und wirtschaftliche Abnutzung der Geb\u00e4ude": {
+ "account_number": "6231"
+ },
+ "Absetzung f. au\u00dfergew\u00f6hnliche technische und wirtschaftliche Abnutzung des Kfz": {
+ "account_number": "6232"
+ },
+ "Absetzung f. au\u00dfergew\u00f6hnliche technische und wirtschaftliche Abnutzung sonstiger Wirtschaftsg\u00fcter": {
+ "account_number": "6233"
+ }
+ },
+ "Abschreibungen auf Sachanlagen auf Grund steuerlicher Sondervorschriften (Gruppe)": {
+ "is_group": 1,
+ "Abschreibungen auf Sachanlagen auf Grund steuerlicher Sondervorschriften": {
+ "account_number": "6240"
+ },
+ "Sonderabschreibungen nach \u00a7 7g Abs. 1 und 2 EStG a. F./\u00a7 7g Abs. 5 EStG n. F.(ohne Kfz)": {
+ "account_number": "6241"
+ },
+ "Sonderabschreibungen nach \u00a7 7g Abs. 1 und 2 EStG a. F./\u00a7 7g Abs. 5 EStG n. F.(f. Kfz)": {
+ "account_number": "6242"
+ },
+ "K\u00fcrzung der Anschaffungs- oder Herstellungskosten gem\u00e4\u00df \u00a7 7g Abs. 2 EStG n.F. (ohne Kfz)": {
+ "account_number": "6243"
+ },
+ "K\u00fcrzung der Anschaffungs- oder Herstellungskosten gem\u00e4\u00df \u00a7 7g Abs. 2 EStG n.F. (f. Kfz)": {
+ "account_number": "6244"
+ }
+ },
+ "Kaufleasing": {
+ "account_number": "6250"
+ },
+ "Sofortabschreibung geringwertiger Wirtschaftsg\u00fcter": {
+ "account_number": "6260",
+ "account_type": "Depreciation"
+ },
+ "Abschreibungen auf aktivierte, geringwertige Wirtschaftsg\u00fcter": {
+ "account_number": "6262"
+ },
+ "Abschreibungen auf den Sammelposten Wirtschaftsg\u00fcter": {
+ "account_number": "6264"
+ },
+ "Au\u00dferplanm\u00e4\u00dfige Abschreibungen auf aktivierte, geringwertige Wirtschaftsg\u00fcter": {
+ "account_number": "6266"
+ },
+ "Abschreibungen auf Aufwendungen f. die Ingangsetzung und Erweiterung des Gesch\u00e4ftsbetriebs": {
+ "account_number": "6268"
+ },
+ "Abschreibungen auf immaterielle VG (Gruppe)": {
+ "is_group": 1,
+ "Abschreibungen auf immaterielle VG": {
+ "account_number": "6200",
+ "account_type": "Depreciation"
+ },
+ "Abschreibungen auf selbst geschaffene immaterielle VG": {
+ "account_number": "6201"
+ },
+ "Abschreibungen auf den Gesch\u00e4fts- oder Firmenwert": {
+ "account_number": "6205"
+ },
+ "Au\u00dferplanm\u00e4\u00dfige Abschreibungen auf den Gesch\u00e4fts- oder Firmenwert": {
+ "account_number": "6209"
+ },
+ "Au\u00dferplanm\u00e4\u00dfige Abschreibungen auf immaterielle VG": {
+ "account_number": "6210"
+ },
+ "Au\u00dferplanm\u00e4\u00dfige Abschreibungen auf selbst geschaffene immaterielle VG": {
+ "account_number": "6211"
+ },
+ "Abschreibungen auf Forderungen gg. Kapitalges., an denen eine Beteiligung besteht (soweit un\u00fcblich hoch)": {
+ "account_number": "6290"
+ }
+ },
+ "Abschreibungen auf sonstige VG des Umlaufverm. (soweit un\u00fcbliche H\u00f6he) (Gruppe)": {
+ "is_group": 1,
+ "Abschreibungen auf sonstige VG des Umlaufverm. (soweit un\u00fcbliche H\u00f6he)": {
+ "account_number": "6270"
+ },
+ "Abschreibungen auf Umlaufverm\u00f6gen, steuerrechtlich bedingt (soweit un\u00fcbliche H\u00f6he)": {
+ "account_number": "6272"
+ },
+ "Abschreibungen auf Roh-, Hilfs- und Betriebsstoffe/Waren (soweit un\u00fcblich hoch)": {
+ "account_number": "6278"
+ },
+ "Abschreibungen auf fertige und unfertige Erzeugnisse (soweit un\u00fcblich hoch)": {
+ "account_number": "6279"
+ },
+ "Forderungsverluste, un\u00fcblich hoch (Gruppe)": {
+ "is_group": 1,
+ "Forderungsverluste, un\u00fcblich hoch": {
+ "account_number": "6280"
+ },
+ "Forderungsverluste 7% USt (soweit un\u00fcblich hoch)": {
+ "account_number": "6281"
+ },
+ "Forderungsverluste 16% USt (soweit un\u00fcblich hoch)": {
+ "account_number": "6285"
+ },
+ "Forderungsverluste 19% USt (soweit un\u00fcblich hoch)": {
+ "account_number": "6286"
+ },
+ "Forderungsverluste 15% USt (soweit un\u00fcblich hoch)": {
+ "account_number": "6287"
+ }
+ }
+ }
+ },
+ "4 - Vertriebskosten": {
+ "root_type": "Expense",
+ "is_group": 1,
+ "Personalaufwand (Vertrieb)": {
+ "is_group": 1
+ }
+ },
+ "5 - allgemeine Verwaltungskosten": {
+ "root_type": "Expense",
+ "is_group": 1,
+ "Verwaltungskosten": {
+ "account_number": "6992",
+ "account_type": "Expenses Included In Valuation"
+ },
+ "Personalaufwand (Verwaltung)": {
+ "is_group": 1
+ }
+ },
+ "6 - sonstige betriebliche Ertr\u00e4ge": {
+ "root_type": "Income",
+ "is_group": 1,
+ "Erhaltene Boni (Gruppe)": {
+ "is_group": 1,
+ "Erhaltene Boni 7 % Vorsteuer": {
+ "account_number": "5750"
+ },
+ "Erhaltene Boni aus Einkauf Roh-, Hilfs- und Betriebsstoffe": {
+ "account_number": "5753"
+ },
+ "Erhaltene Boni aus Einkauf Roh-, Hilfs- und Betriebsstoffe 7% Vorsteuer": {
+ "account_number": "5754"
+ },
+ "Erhaltene Boni aus Einkauf Roh-, Hilfs- und Betriebsstoffe 19% Vorsteuer": {
+ "account_number": "5755"
+ },
+ "Erhaltene Boni 19 % Vorsteuer": {
+ "account_number": "5760"
+ },
+ "Erhaltene Boni": {
+ "account_number": "5769"
+ }
+ },
+ "Erhaltene Rabatte (Gruppe)": {
+ "is_group": 1,
+ "Erhaltene Rabatte": {
+ "account_number": "5770"
+ },
+ "Erhaltene Rabatte 7 % Vorsteuer": {
+ "account_number": "5780"
+ },
+ "Erhaltene Rabatte aus Einkauf Roh-, Hilfs- und Betriebsstoffe": {
+ "account_number": "5783"
+ },
+ "Erhaltene Rabatte aus Einkauf Roh-, Hilfs- und Betriebsstoffe 7% Vorsteuer": {
+ "account_number": "5784"
+ },
+ "Erhaltene Rabatte aus Einkauf Roh-, Hilfs- und Betriebsstoffe 19% Vorsteuer": {
+ "account_number": "5785"
+ },
+ "Erhaltene Rabatte 19 % Vorsteuer": {
+ "account_number": "5790"
+ }
+ },
+ "Andere aktivierte Eigenleistungen": {
+ "account_number": "4820"
+ },
+ "Aktivierte Eigenleistungen zur Erstellung von selbst geschaffenen immateriellen VGn": {
+ "account_number": "4825"
+ },
+ "Sonstige betriebliche Ertr\u00e4ge": {
+ "account_number": "4830"
+ },
+ "Sonstige betriebliche Ertr\u00e4ge von verbundenen Unternehmen": {
+ "account_number": "4832"
+ },
+ "Andere Nebenerl\u00f6se": {
+ "account_number": "4833"
+ },
+ "Sonstige Ertr\u00e4ge betrieblich und regelm\u00e4\u00dfig 16 % USt": {
+ "account_number": "4834"
+ },
+ "Sonstige Ertr\u00e4ge betrieblich und regelm\u00e4\u00dfig": {
+ "account_number": "4835"
+ },
+ "Sonstige Ertr\u00e4ge betrieblich und regelm\u00e4\u00dfig 19 % USt": {
+ "account_number": "4836"
+ },
+ "Sonstige Ertr\u00e4ge betriebsfremd und regelm\u00e4\u00dfig": {
+ "account_number": "4837"
+ },
+ "Erstattete Vorsteuer anderer L\u00e4nder": {
+ "account_number": "4838"
+ },
+ "Sonstige Ertr\u00e4ge unregelm\u00e4\u00dfig": {
+ "account_number": "4839"
+ },
+ "Ertr\u00e4ge aus Abgang von Gegenst\u00e4nden des Anlageverm\u00f6gens": {
+ "account_number": "4900"
+ },
+ "Ertr\u00e4ge aus der Ver\u00e4u\u00dferung von Anteilen an Kap.Ges. (Finanzanlageverm., inl\u00e4nd. Kap.Ges.)": {
+ "account_number": "4901"
+ },
+ "Ertr\u00e4ge aus Abgang von Gegenst\u00e4nden des Umlaufverm. (au\u00dfer Vorr\u00e4te)": {
+ "account_number": "4905"
+ },
+ "Ertr\u00e4ge aus Abgang von Gegenst\u00e4nden des Umlaufverm. (au\u00dfer Vorr\u00e4te, inl\u00e4nd. Kap.Ges.)": {
+ "account_number": "4906"
+ },
+ "Ertr\u00e4ge aus der W\u00e4hrungsumrechnung": {
+ "account_number": "4840"
+ },
+ "Sonstige Erl\u00f6se betrieblich und regelm\u00e4\u00dfig, steuerfrei \u00a7 4 Nr. 8 ff UStG": {
+ "account_number": "4841"
+ },
+ "Sonstige Erl\u00f6se betrieblich und regelm\u00e4\u00dfig, steuerfrei z. B. \u00a7 4 Nr. 2-7 UStG": {
+ "account_number": "4842"
+ },
+ "Ertr\u00e4ge aus Bewertung Finanzmittelfonds": {
+ "account_number": "4843"
+ },
+ "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen steuerfrei \u00a7 4 Nr. 1a UStG (bei Buchgewinn)": {
+ "account_number": "4844"
+ },
+ "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen 19 % USt (bei Buchgewinn)": {
+ "account_number": "4845"
+ },
+ "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen steuerfrei \u00a7 4 Nr. 1b UStG (bei Buchgewinn)": {
+ "account_number": "4848"
+ },
+ "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen (bei Buchgewinn)": {
+ "account_number": "4849"
+ },
+ "Erl\u00f6se aus Verk\u00e4ufen immaterieller VG (bei Buchgewinn)": {
+ "account_number": "4850"
+ },
+ "Erl\u00f6se aus Verk\u00e4ufen Finanzanlagen (bei Buchgewinn)": {
+ "account_number": "4851"
+ },
+ "Erl\u00f6se aus Verk\u00e4ufen Finanzanlagen (inl\u00e4ndische Kap.Ges., bei Buchgewinn)": {
+ "account_number": "4852"
+ },
+ "Anlagenabg\u00e4nge Sachanlagen (Restbuchwert bei Buchvergewinn)": {
+ "account_number": "4855"
+ },
+ "Anlagenabg\u00e4nge immaterielle VG (Restbuchwert bei Buchgewinn)": {
+ "account_number": "4856"
+ },
+ "Anlagenabg\u00e4nge Finanzanlagen (Restbuchwert bei Buchgewinn)": {
+ "account_number": "4857"
+ },
+ "Anlagenabg\u00e4nge Finanzanlagen (inl\u00e4ndische Kap.Ges., Restbuchwert bei Buchgewinn)": {
+ "account_number": "4858"
+ },
+ "Ertr\u00e4ge aus Zuschreibungen des Sachanlageverm\u00f6gens": {
+ "account_number": "4910",
+ "account_type": "Round Off"
+ },
+ "Ertr\u00e4ge aus Zuschreibungen des immateriellen Anlageverm\u00f6gens": {
+ "account_number": "4911"
+ },
+ "Ertr\u00e4ge aus Zuschreibungen des Finanzanlageverm\u00f6gens": {
+ "account_number": "4912"
+ },
+ "Ertr\u00e4ge aus Zuschreibungen des Finanzanlageverm\u00f6gens (inl\u00e4ndische Kap.Ges.)": {
+ "account_number": "4913"
+ },
+ "Ertr\u00e4ge aus Zuschreibungen \u00a7 3 Nr. 40 EStG/\u00a7 8b Abs. 2 KStG (inl\u00e4ndische Kap.Ges.)": {
+ "account_number": "4914"
+ },
+ "Ertr\u00e4ge aus Zuschreibungen des Umlaufverm. au\u00dfer Vorr\u00e4te": {
+ "account_number": "4915"
+ },
+ "Ertr\u00e4ge aus Zuschreibungen des Umlaufverm. (inl\u00e4ndische Kap.Ges.)": {
+ "account_number": "4916"
+ },
+ "Ertr\u00e4ge aus Herabsetzung der Pauschalwertberichtigung auf Forderungen": {
+ "account_number": "4920"
+ },
+ "Ertr\u00e4ge aus Herabsetzung der Einzelwertberichtigung auf Forderungen": {
+ "account_number": "4923"
+ },
+ "Ertr\u00e4ge aus abgeschriebenen Forderungen": {
+ "account_number": "4925"
+ },
+ "Ertr\u00e4ge aus der Aufl\u00f6sung einer steuerlichen R\u00fccklage nach \u00a7 6b Abs. 3 EStG": {
+ "account_number": "4927"
+ },
+ "Ertr\u00e4ge aus der Aufl\u00f6sung einer steuerlichen R\u00fccklage nach \u00a7 6b Abs. 10 EStG": {
+ "account_number": "4928"
+ },
+ "Ertr\u00e4ge aus der Aufl\u00f6sung der R\u00fccklage f. Ersatzbeschaffung R 6.6 EStR": {
+ "account_number": "4929"
+ },
+ "Ertr\u00e4ge aus der Aufl\u00f6sung von R\u00fcckstellungen": {
+ "account_number": "4930"
+ },
+ "Ertr\u00e4ge aus der Aufl\u00f6sung einer steuerlichen R\u00fccklage (Existenzgr\u00fcnderr\u00fccklage)": {
+ "account_number": "4934"
+ },
+ "Ertr\u00e4ge aus der Aufl\u00f6sung einer steuerlichen R\u00fccklage": {
+ "account_number": "4935"
+ },
+ "Ertr\u00e4ge aus der Aufl\u00f6sung von steuerlichen R\u00fccklagen (Ansparabschreibungen)": {
+ "account_number": "4936"
+ },
+ "Ertr\u00e4ge aus der Aufl\u00f6sung steuerrechtlicher Sonderabschreibungen": {
+ "account_number": "4937"
+ },
+ "Ertr\u00e4ge aus der Aufl\u00f6sung einer steuerlichen R\u00fccklage nach \u00a7 4g EStG": {
+ "account_number": "4938"
+ },
+ "Ertr\u00e4ge aus der Aufl\u00f6sung von steuerlichen R\u00fccklagen nach \u00a7 52 Abs. 16 EStG": {
+ "account_number": "4939"
+ },
+ "Verrechnete sonstige Sachbez\u00fcge (Gruppe)": {
+ "is_group": 1,
+ "Verrechnete sonstige Sachbez\u00fcge (keine Waren)": {
+ "account_number": "4940"
+ },
+ "Sachbez\u00fcge 7 % USt (Waren)": {
+ "account_number": "4941"
+ },
+ "Sachbez\u00fcge 19 % USt (Waren)": {
+ "account_number": "4945"
+ },
+ "Verrechnete sonstige Sachbez\u00fcge": {
+ "account_number": "4946"
+ },
+ "Verrechnete sonstige Sachbez\u00fcge aus Kfz-Gestellung 19% USt": {
+ "account_number": "4947"
+ },
+ "Verrechnete sonstige Sachbez\u00fcge 19% USt": {
+ "account_number": "4948"
+ },
+ "Verrechnete sonstige Sachbez\u00fcge ohne Umsatzsteuer": {
+ "account_number": "4949"
+ }
+ },
+ "Periodenfremde Ertr\u00e4ge (soweit nicht au\u00dferordentlich)": {
+ "account_number": "4960"
+ },
+ "Versicherungsentsch\u00e4digungen und Schadenersatzleistungen": {
+ "account_number": "4970"
+ },
+ "Erstattungen Aufwendungsausgleichsgesetz": {
+ "account_number": "4972"
+ },
+ "Investitionszusch\u00fcsse (steuerpflichtig)": {
+ "account_number": "4975"
+ },
+ "Investitionszulagen (steuerfrei)": {
+ "account_number": "4980"
+ },
+ "Steuerfreie Ertr\u00e4ge aus der Aufl\u00f6sung von steuerlichen R\u00fccklagen": {
+ "account_number": "4981"
+ },
+ "Sonstige steuerfreie Betriebseinnahmen": {
+ "account_number": "4982"
+ },
+ "Ertr\u00e4ge aus der Aktivierung unentgeltlich erworbener VG": {
+ "account_number": "4987"
+ },
+ "Kostenerstattungen, R\u00fcckverg\u00fctungen und Gutschriften f. fr\u00fchere Jahre": {
+ "account_number": "4989"
+ },
+ "Ertr\u00e4ge aus Verwaltungskostenumlagen": {
+ "account_number": "4992"
+ },
+ "Unentgeltliche Wertabgaben": {
+ "account_number": "4600"
+ },
+ "Entnahme von Gegenst\u00e4nden ohne USt": {
+ "account_number": "4605"
+ },
+ "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternehmens 7 % USt": {
+ "account_number": "4630"
+ },
+ "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternehmens ohne USt": {
+ "account_number": "4637"
+ },
+ "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternnehmens ohne USt (Telefon-Nutzung)": {
+ "account_number": "4638"
+ },
+ "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternehmens ohne USt (Kfz-Nutzung)": {
+ "account_number": "4639"
+ },
+ "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternehmens 19 % USt (Gruppe)": {
+ "is_group": 1,
+ "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternehmens 19 % USt": {
+ "account_number": "4640"
+ },
+ "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternehmens 19 % USt (Kfz-Nutzung)": {
+ "account_number": "4645"
+ },
+ "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternehmens 19 % USt (Telefon-Nutzung)": {
+ "account_number": "4646"
+ }
+ },
+ "Unentgeltliche Erbringung einer sonstigen Leistung 7 % USt": {
+ "account_number": "4650"
+ },
+ "Unentgeltliche Erbringung einer sonstigen Leistung ohne USt": {
+ "account_number": "4659"
+ },
+ "Unentgeltliche Erbringung einer sonstigen Leistung 19 % USt": {
+ "account_number": "4660"
+ },
+ "Unentgeltliche Zuwendung von Waren 7 % USt": {
+ "account_number": "4670"
+ },
+ "Unentgeltliche Zuwendung von Waren ohne USt": {
+ "account_number": "4679"
+ },
+ "Unentgeltliche Zuwendung von Waren 19 % USt": {
+ "account_number": "4680"
+ },
+ "Unentgeltliche Zuwendung von Gegenst\u00e4nden 19 % USt": {
+ "account_number": "4686"
+ },
+ "Unentgeltliche Zuwendung von Gegenst\u00e4nden ohne USt": {
+ "account_number": "4689"
+ },
+ "Nicht steuerbare Ums\u00e4tze (Innenums\u00e4tze)": {
+ "account_number": "4690"
+ },
+ "Umsatzsteuerverg\u00fctungen, z.B. nach \u00a7 24 UStG": {
+ "account_number": "4695"
+ },
+ "Au\u00dferordentliche Ertr\u00e4ge (Gruppe)": {
+ "is_group": 1,
+ "Au\u00dferordentliche Ertr\u00e4ge": {
+ "account_number": "7400"
+ },
+ "Au\u00dferordentliche Ertr\u00e4ge finanzwirksam": {
+ "account_number": "7401"
+ },
+ "Au\u00dferordentliche Ertr\u00e4ge nicht finanzwirksam": {
+ "account_number": "7450"
+ },
+ "Ertr\u00e4ge durch Verschmelzung und Umwandlung": {
+ "account_number": "7451"
+ },
+ "Ertr\u00e4ge durch den Verkauf von bedeutenden Beteiligungen": {
+ "account_number": "7452"
+ },
+ "Ert\u00e4ge durch den Verkauf von bedeutenden Grundst\u00fccken": {
+ "account_number": "7453"
+ },
+ "Gewinn aus der Ver\u00e4u\u00dferung oder der Aufgabe von Gesch\u00e4ftsaktivit\u00e4ten nach Steuern": {
+ "account_number": "7454"
+ },
+ "Au\u00dferordentliche Ertr\u00e4ge aus der Anwendung von \u00dcbergangsvorschriften": {
+ "account_number": "7460"
+ },
+ "Au\u00dferordentliche Ertr\u00e4ge: Zuschreibung f. Sachanlageverm\u00f6gen": {
+ "account_number": "7461"
+ },
+ "Au\u00dferordentliche Ertr\u00e4ge: Zuschreibung f. Finanzanlageverm\u00f6gen": {
+ "account_number": "7462"
+ },
+ "Au\u00dferordentliche Ertr\u00e4ge: Wertpapiere im Umlaufverm\u00f6gen": {
+ "account_number": "7463"
+ },
+ "Au\u00dferordentliche Ertr\u00e4ge: latente Steuern": {
+ "account_number": "7464"
+ }
+ }
+ },
+ "7 - sonstige betriebliche Aufwendungen": {
+ "root_type": "Expense",
+ "is_group": 1,
+ "Erl\u00f6sschm\u00e4lerungen (Gruppe)": {
+ "is_group": 1,
+ "Erl\u00f6sschm\u00e4lerungen": {
+ "account_number": "4700"
+ },
+ "Erl\u00f6sschm\u00e4lerungen aus steuerfreien Ums\u00e4tzen \u00a7 4 Nr. 1a UStG": {
+ "account_number": "4705"
+ },
+ "Erl\u00f6sschm\u00e4lerungen 7 % USt": {
+ "account_number": "4710"
+ },
+ "Erl\u00f6sschm\u00e4lerungen 19 % USt": {
+ "account_number": "4720"
+ },
+ "Erl\u00f6sschm\u00e4lerungen 16 % USt": {
+ "account_number": "4723"
+ },
+ "Erl\u00f6sschm\u00e4lerungen aus steuerfreien innergem. Lieferungen": {
+ "account_number": "4724"
+ },
+ "Erl\u00f6sschm\u00e4lerungen aus im Inland steuerpfl. EU-Lieferungen 7 % USt": {
+ "account_number": "4725"
+ },
+ "Erl\u00f6sschm\u00e4lerungen aus im Inland steuerpfl. EU-Lieferungen 19 % USt": {
+ "account_number": "4726"
+ },
+ "Erl\u00f6sschm\u00e4lerungen aus im anderen EU-Land steuerpfl. Lieferungen": {
+ "account_number": "4727"
+ },
+ "Erl\u00f6sschm\u00e4lerungen aus im Inland steuerpfl. EU-Lieferungen 16 % USt": {
+ "account_number": "4729"
+ }
+ },
+ "Gew\u00e4hrte Skonti (Gruppe)": {
+ "is_group": 1,
+ "Gew. Skonti": {
+ "account_number": "4730"
+ },
+ "Gew. Skonti 7 % USt": {
+ "account_number": "4731"
+ },
+ "Gew. Skonti 19 % USt": {
+ "account_number": "4736"
+ },
+ "Gew. Skonti aus Lieferungen von Mobilfunkger./Schaltkr., f. die der Leistungsempf. die Ust. schuldet": {
+ "account_number": "4738"
+ },
+ "Gew. Skonti aus Leistungen, f. die der Leistungsempf. die Umsatzsteuer nach \u00a7 13b UStG schuldet": {
+ "account_number": "4741"
+ },
+ "Gew. Skonti aus Erl\u00f6sen aus im anderen EU-Land steuerpfl. Leistungen, f. die der Leistungsempf. die Ust. schuldet": {
+ "account_number": "4742"
+ },
+ "Gew. Skonti aus steuerfreien innergem. Lieferungen \u00a7 4 Nr. 1b UStG": {
+ "account_number": "4743"
+ },
+ "Gew. Skonti aus im Inland steuerpfl. EU-Lieferungen": {
+ "account_number": "4745"
+ },
+ "Gew. Skonti aus im Inland steuerpfl. EU-Lieferungen 7% USt": {
+ "account_number": "4746"
+ },
+ "Gew. Skonti aus im Inland steuerpfl. EU-Lieferungen 19% USt": {
+ "account_number": "4748"
+ }
+ },
+ "Gew\u00e4hrte Boni (Gruppe)": {
+ "is_group": 1,
+ "Gew\u00e4hrte Boni 7 % USt": {
+ "account_number": "4750"
+ },
+ "Gew\u00e4hrte Boni 19 % USt": {
+ "account_number": "4760"
+ },
+ "Gew\u00e4hrte Boni": {
+ "account_number": "4769"
+ },
+ "Gew\u00e4hrte Rabatte": {
+ "account_number": "4770"
+ },
+ "Gew\u00e4hrte Rabatte 7 % USt": {
+ "account_number": "4780"
+ },
+ "Gew\u00e4hrte Rabatte 19 % USt": {
+ "account_number": "4790"
+ }
+ },
+ "Sonstige betriebliche Aufwendungen": {
+ "account_number": "6300"
+ },
+ "Interimskonto f. Aufw. in einem anderen Land (Vorst.verg. m\u00f6glich)": {
+ "account_number": "6302"
+ },
+ "Fremdleistungen/Fremdarbeiten": {
+ "account_number": "6303"
+ },
+ "Sonstige Aufwendungen betrieblich und regelm\u00e4\u00dfig": {
+ "account_number": "6304"
+ },
+ "Raumkosten": {
+ "account_number": "6305"
+ },
+ "Miete (unbewegliche Wirtschaftsg\u00fcter)": {
+ "account_number": "6310"
+ },
+ "Miete/Aufwendungen f. doppelte Haushaltsf\u00fchrung": {
+ "account_number": "6312"
+ },
+ "Pacht (unbewegliche Wirtschaftsg\u00fcter)": {
+ "account_number": "6315"
+ },
+ "Leasing (unbewegliche Wirtschaftsg\u00fcter)": {
+ "account_number": "6316"
+ },
+ "Aufwendungen f. gemietete oder gepachtete unbewegliche Wirtschaftsg., die GewSt hinzuzurechnen sind": {
+ "account_number": "6317"
+ },
+ "Miet- und Pachtnebenkosten (GewSt nicht zu ber\u00fccksichtigen)": {
+ "account_number": "6318"
+ },
+ "Heizung": {
+ "account_number": "6320"
+ },
+ "Gas, Strom, Wasser": {
+ "account_number": "6325"
+ },
+ "Reinigung": {
+ "account_number": "6330"
+ },
+ "Instandhaltung betrieblicher R\u00e4ume": {
+ "account_number": "6335"
+ },
+ "Abgaben f. betrieblich genutzten Grundbesitz": {
+ "account_number": "6340"
+ },
+ "Sonstige Raumkosten": {
+ "account_number": "6345"
+ },
+ "Aufwendungen f. ein h\u00e4usliches Arbeitszimmer (abziehbarer Anteil)": {
+ "account_number": "6348"
+ },
+ "Aufwendungen f. ein h\u00e4usliches Arbeitszimmer (nicht abziehbarer Anteil)": {
+ "account_number": "6349"
+ },
+ "Grundst\u00fccksaufwendungen betrieblich": {
+ "account_number": "6350"
+ },
+ "Grundst\u00fccksaufwendungen neutral": {
+ "account_number": "6352"
+ },
+ "Zuwendungen, Spenden (Gruppe)": {
+ "is_group": 1,
+ "Zuwendungen, Spenden, steuerlich nicht abziehbar": {
+ "account_number": "6390"
+ },
+ "Zuwendungen, Spenden f. wissenschaftliche und kulturelle Zwecke": {
+ "account_number": "6391"
+ },
+ "Zuwendungen, Spenden f. mildt\u00e4tige Zwecke": {
+ "account_number": "6392"
+ },
+ "Zuwendungen, Spenden f. kirchliche, religi\u00f6se und gemeinn\u00fctzige Zwecke": {
+ "account_number": "6393"
+ },
+ "Zuwendungen, Spenden an politische Parteien": {
+ "account_number": "6394"
+ },
+ "Zuwendungen, Spenden an Stiftungen f. gemeinn\u00fctzige Zwecke i. S. d. \u00a7 52 Abs. 2 Nr. 1-3 AO": {
+ "account_number": "6395"
+ },
+ "Zuwendungen, Spenden an Stiftungen f. gemeinn\u00fctzige Zwecke i. S. d. \u00a7 52 Abs. 2 Nr. 4 AO": {
+ "account_number": "6396"
+ },
+ "Zuwendungen, Spenden an Stiftungen f. kirchliche, religi\u00f6se und gemeinn\u00fctzige Zwecke": {
+ "account_number": "6397"
+ },
+ "Zuwendungen, Spenden an Stiftungen f.wissenschaftliche, mildt\u00e4tige und kulturelle Zwecke": {
+ "account_number": "6398"
+ }
+ },
+ "Versicherungen": {
+ "account_number": "6400"
+ },
+ "Versicherungen f. Geb\u00e4ude, die zum Betriebsverm\u00f6gen geh\u00f6ren": {
+ "account_number": "6405"
+ },
+ "Netto-Pr\u00e4mie f. R\u00fcckdeckung k\u00fcnftiger Versorgungsleistungen": {
+ "account_number": "6410"
+ },
+ "Beitr\u00e4ge": {
+ "account_number": "6420"
+ },
+ "Sonstige Abgaben": {
+ "account_number": "6430"
+ },
+ "Steuerlich abzugsf\u00e4hige Versp\u00e4tungszuschl\u00e4ge und Zwangsgelder": {
+ "account_number": "6436"
+ },
+ "Steuerlich nicht abzugsf\u00e4hige Versp\u00e4tungszuschl\u00e4ge und Zwangsgelder": {
+ "account_number": "6437"
+ },
+ "Ausgleichsabgabe i. S. d. Schwerbehindertengesetzes": {
+ "account_number": "6440"
+ },
+ "Reparaturen und Instandhaltung von Bauten": {
+ "account_number": "6450"
+ },
+ "Reparaturen und Instandhaltung von technischenAnlagen und Maschinen": {
+ "account_number": "6460"
+ },
+ "Reparaturen und Instandhaltung von anderen Anlagen und Betriebs- und Gesch\u00e4ftsausstattung": {
+ "account_number": "6470"
+ },
+ "Zuf\u00fchrung zu Aufwandsr\u00fcckstellungen": {
+ "account_number": "6475"
+ },
+ "Reparaturen und Instandhaltung von anderen Anlagen": {
+ "account_number": "6485"
+ },
+ "Sonstige Reparaturen und Instandhaltungen": {
+ "account_number": "6490"
+ },
+ "Wartungskosten f. Hard- und Software": {
+ "account_number": "6495"
+ },
+ "Mietleasing (bewegliche Wirtschaftsg\u00fcter)": {
+ "account_number": "6498"
+ },
+ "Fahrzeugkosten (Gruppe)": {
+ "is_group": 1,
+ "Fahrzeugkosten": {
+ "account_number": "6500"
+ },
+ "Kfz-Versicherungen": {
+ "account_number": "6520"
+ },
+ "Laufende Kfz-Betriebskosten": {
+ "account_number": "6530"
+ },
+ "Kfz-Reparaturen": {
+ "account_number": "6540"
+ },
+ "Garagenmiete": {
+ "account_number": "6550"
+ },
+ "Mietleasing Kfz": {
+ "account_number": "6560"
+ },
+ "Sonstige Kfz-Kosten": {
+ "account_number": "6570"
+ },
+ "Mautgeb\u00fchren": {
+ "account_number": "6580"
+ },
+ "Kfz-Kosten f. betrieblich genutzte zum Privatverm\u00f6gen geh\u00f6rende Kraftfahrzeuge": {
+ "account_number": "6590"
+ },
+ "Fremdfahrzeugkosten": {
+ "account_number": "6595"
+ }
+ },
+ "Werbekosten (Gruppe)": {
+ "is_group": 1,
+ "Werbekosten": {
+ "account_number": "6600"
+ },
+ "Streuartikel": {
+ "account_number": "6605"
+ },
+ "Geschenke abzugsf\u00e4hig ohne \u00a7 37b EStG": {
+ "account_number": "6610"
+ },
+ "Geschenke abzugsf\u00e4hig mit \u00a7 37b EStG": {
+ "account_number": "6611"
+ },
+ "Pauschale Steuern f. Geschenke und Zugaben abzugsf\u00e4hig": {
+ "account_number": "6612"
+ },
+ "Geschenke nicht abzugsf\u00e4hig ohne \u00a7 37b EStG": {
+ "account_number": "6620"
+ },
+ "Geschenke nicht abzugsf\u00e4hig mit \u00a7 37b EStG": {
+ "account_number": "6621"
+ },
+ "Pauschale Steuern f. Geschenke und Zuwendungen nicht abzugsf\u00e4hig": {
+ "account_number": "6622"
+ },
+ "Geschenke ausschlie\u00dflich betrieblich genutzt": {
+ "account_number": "6625"
+ },
+ "Zugaben mit \u00a7 37b EStG": {
+ "account_number": "6629"
+ },
+ "Repr\u00e4sentationskosten": {
+ "account_number": "6630"
+ },
+ "Bewirtungskosten": {
+ "account_number": "6640"
+ },
+ "Sonstige eingeschr\u00e4nkt abziehbare Betriebsausgaben (abziehbarer Anteil)": {
+ "account_number": "6641"
+ },
+ "Sonstige eingeschr\u00e4nkt abziehbare Betriebsausgaben (nicht abziehbarer Anteil)": {
+ "account_number": "6642"
+ },
+ "Aufmerksamkeiten": {
+ "account_number": "6643"
+ },
+ "Nicht abzugsf\u00e4hige Bewirtungskosten": {
+ "account_number": "6644"
+ },
+ "Nicht abzugsf\u00e4hige Betriebsausgaben aus Werbe- und Repr\u00e4sentationskosten": {
+ "account_number": "6645"
+ },
+ "Reisekosten Arbeitnehmer (Gruppe)": {
+ "is_group": 1,
+ "Reisekosten Arbeitnehmer": {
+ "account_number": "6650"
+ },
+ "Reisekosten Arbeitnehmer \u00dcbernachtungsaufwand": {
+ "account_number": "6660"
+ },
+ "Reisekosten Arbeitnehmer Fahrtkosten": {
+ "account_number": "6663"
+ },
+ "Reisekosten Arbeitnehmer Verpflegungsmehraufwand": {
+ "account_number": "6664"
+ },
+ "Kilometergelderstattung Arbeitnehmer": {
+ "account_number": "6668"
+ }
+ },
+ "Reisekosten Unternehmer (Gruppe)": {
+ "is_group": 1,
+ "Reisekosten Unternehmer": {
+ "account_number": "6670"
+ },
+ "Reisekosten Unternehmer (nicht abziehbarer Anteil)": {
+ "account_number": "6672"
+ },
+ "Reisekosten Unternehmer Fahrtkosten": {
+ "account_number": "6673"
+ },
+ "Reisekosten Unternehmer Verpflegungsmehraufwand": {
+ "account_number": "6674"
+ },
+ "Reisekosten Unternehmer \u00dcbernachtungsaufwand": {
+ "account_number": "6680"
+ }
+ },
+ "Fahrten zwischen Wohnung und Betriebsst\u00e4tte und Familienheimfahrten (abziehbarer Anteil)": {
+ "account_number": "6688"
+ },
+ "Fahrten zwischen Wohnung und Betriebsst\u00e4tte und Familienheimfahrten (nicht abziehbarer Anteil)": {
+ "account_number": "6689"
+ },
+ "Fahrten zwischen Wohnung und Betriebsst\u00e4tte und Familienheimfahrten (Haben)": {
+ "account_number": "6690"
+ },
+ "Verpflegungsmehraufwendungen i. R. d. doppelten Haushaltsf\u00fchrung (abziehbarer Anteil)": {
+ "account_number": "6691"
+ }
+ },
+ "Kosten Warenabgabe (Gruppe)": {
+ "is_group": 1,
+ "Kosten Warenabgabe": {
+ "account_number": "6700"
+ },
+ "Verpackungsmaterial": {
+ "account_number": "6710"
+ },
+ "Ausgangsfrachten": {
+ "account_number": "6740"
+ },
+ "Transportversicherungen": {
+ "account_number": "6760"
+ },
+ "Verkaufsprovisionen": {
+ "account_number": "6770"
+ },
+ "Fremdarbeiten (Vertrieb)": {
+ "account_number": "6780"
+ },
+ "Aufwand f. Gew\u00e4hrleistungen": {
+ "account_number": "6790"
+ }
+ },
+ "Porto": {
+ "account_number": "6800"
+ },
+ "Telefon": {
+ "account_number": "6805"
+ },
+ "Telefax und Internetkosten": {
+ "account_number": "6810"
+ },
+ "B\u00fcrobedarf": {
+ "account_number": "6815"
+ },
+ "Zeitschriften, B\u00fccher": {
+ "account_number": "6820"
+ },
+ "Fortbildungskosten": {
+ "account_number": "6821"
+ },
+ "Freiwillige Sozialleistungen": {
+ "account_number": "6822"
+ },
+ "Rechts- und Beratungskosten": {
+ "account_number": "6825"
+ },
+ "Abschluss- und Pr\u00fcfungskosten": {
+ "account_number": "6827"
+ },
+ "Buchf\u00fchrungskosten": {
+ "account_number": "6830"
+ },
+ "Mieten f. Einrichtungen (bewegliche Wirtschaftsg\u00fcter)": {
+ "account_number": "6835"
+ },
+ "Pacht (bewegliche Wirtschaftsg\u00fcter)": {
+ "account_number": "6836"
+ },
+ "Aufwendungen f. die zeitlich befristete \u00dcberlassung von Rechten (Lizenzen, Konzessionen)": {
+ "account_number": "6837"
+ },
+ "Aufwendungen f. gemietete oder gepachtete bewegliche Wirtschaftsg., die gewerbest. hinzuzurechnen sind": {
+ "account_number": "6838"
+ },
+ "Werkzeuge und Kleinger\u00e4te": {
+ "account_number": "6845"
+ },
+ "Betriebsbedarf": {
+ "account_number": "6850"
+ },
+ "Nebenkosten des Geldverkehrs": {
+ "account_number": "6855"
+ },
+ "Aufwendungen aus Anteilen an inl\u00e4ndischen Kap.Ges.": {
+ "account_number": "6856"
+ },
+ "Ver\u00e4u\u00dferungskosten \u00a7 3 Nr. 40 EStG/\u00a7 8b Abs. 2 KStG (inl. Kap.Ges.)": {
+ "account_number": "6857"
+ },
+ "Aufwendungen f. Abraum- und Abfallbeseitigung": {
+ "account_number": "6859"
+ },
+ "Nicht abziehbare Vorsteuer 19 %": {
+ "account_number": "6871"
+ },
+ "Aufwendungen aus der W\u00e4hrungsumrechnung": {
+ "account_number": "6880"
+ },
+ "Aufwendungen aus Bewertung Finanzmittelfonds": {
+ "account_number": "6883"
+ },
+ "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen steuerfrei \u00a7 4 Nr. 1a UStG (bei Buchverlust)": {
+ "account_number": "6884"
+ },
+ "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen 19 % USt (bei Buchverlust)": {
+ "account_number": "6885"
+ },
+ "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen steuerfrei \u00a7 4 Nr. 1b UStG (bei Buchverlust)": {
+ "account_number": "6888"
+ },
+ "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen (bei Buchverlust)": {
+ "account_number": "6889"
+ },
+ "Erl\u00f6se aus Verk\u00e4ufen immaterieller VG (bei Buchverlust)": {
+ "account_number": "6890"
+ },
+ "Erl\u00f6se aus Verk\u00e4ufen Finanzanlagen (bei Buchverlust)": {
+ "account_number": "6891"
+ },
+ "Erl\u00f6se aus Verk\u00e4ufen Finanzanlagen (inl. Kap.Ges., bei Buchverlust)": {
+ "account_number": "6892"
+ },
+ "Anlagenabg\u00e4nge Sachanlagen (Restbuchwert bei Buchverlust)": {
+ "account_number": "6895"
+ },
+ "Anlagenabg\u00e4nge immaterielle VG (Restbuchwert bei Buchverlust)": {
+ "account_number": "6896"
+ },
+ "Anlagenabg\u00e4nge Finanzanlagen (Restbuchwert bei Buchverlust)": {
+ "account_number": "6897"
+ },
+ "Anlagenabg\u00e4nge Finanzanlagen (inl. Kap.Ges., Restbuchwert bei Buchverlust)": {
+ "account_number": "6898"
+ },
+ "Verluste aus dem Abgang von Gegenst\u00e4nden des Anlageverm\u00f6gens": {
+ "account_number": "6900"
+ },
+ "Verluste aus der Ver\u00e4u\u00dferung von Anteilen an Kap.Ges. (Finanzanlageverm\u00f6gen, inl. Kap.Ges.)": {
+ "account_number": "6903"
+ },
+ "Verluste aus dem Abgang von Ggenst\u00e4nden des Umlaufverm. (au\u00dfer Vorr\u00e4te)": {
+ "account_number": "6905"
+ },
+ "Verluste aus dem Abgang von Gegenst\u00e4nden des Umlaufverm. (au\u00dfer Vorr\u00e4te, inl. Kap.Ges.)": {
+ "account_number": "6906"
+ },
+ "Abschreibungen auf Umlaufverm\u00f6gen au\u00dfer Vorr\u00e4te und Wertpapiere (\u00fcbliche H\u00f6he)": {
+ "account_number": "6910",
+ "account_type": "Round Off"
+ },
+ "Abschreibungen auf Umlaufverm\u00f6gen, steuerrechtlich bedingt (\u00fcbliche H\u00f6he)": {
+ "account_number": "6912"
+ },
+ "Einstellung in die Pauschalwertberichtigung auf Forderungen": {
+ "account_number": "6920"
+ },
+ "Einstellungen in die steuerliche R\u00fccklage nach \u00a7 6b Abs. 3 EStG": {
+ "account_number": "6922"
+ },
+ "Einstellung in die Einzelwertberichtigung auf Forderungen": {
+ "account_number": "6923"
+ },
+ "Einstellungen in die steuerliche R\u00fccklage nach \u00a7 6b Abs. 10 EStG": {
+ "account_number": "6924"
+ },
+ "Einstellungen in steuerliche R\u00fccklagen": {
+ "account_number": "6927"
+ },
+ "Einstellungen in die R\u00fccklage f. Ersatzbeschaffung nach R 6.6 EStR": {
+ "account_number": "6928"
+ },
+ "Einstellungen in die steuerliche R\u00fccklage nach \u00a7 4g EStG": {
+ "account_number": "6929"
+ },
+ "Forderungsverluste (\u00fcbliche H\u00f6he) (Gruppe)": {
+ "is_group": 1,
+ "Forderungsverluste (\u00fcbliche H\u00f6he)": {
+ "account_number": "6930"
+ },
+ "Forderungsverluste 7 % USt (\u00fcbliche H\u00f6he)": {
+ "account_number": "6931"
+ },
+ "Forderungsverluste aus steuerfreien EU-Lieferungen (\u00fcbliche H\u00f6he)": {
+ "account_number": "6932"
+ },
+ "Forderungsverluste aus im Inland steuerpfl. EU-Lieferungen 7 % USt (\u00fcbliche H\u00f6he)": {
+ "account_number": "6933"
+ },
+ "Forderungsverluste aus im Inland steuerpfl. EU-Lieferungen 16 % USt (\u00fcbliche H\u00f6he)": {
+ "account_number": "6934"
+ },
+ "Forderungsverluste 16% USt (\u00fcbliche H\u00f6he)": {
+ "account_number": "6935"
+ },
+ "Forderungsverluste 19 % USt (\u00fcbliche H\u00f6he)": {
+ "account_number": "6936"
+ },
+ "Forderungsverluste 15% USt (\u00fcbliche H\u00f6he)": {
+ "account_number": "6937"
+ },
+ "Forderungsverluste aus im Inland steuerpfl. EU-Lieferungen 19 % USt (\u00fcbliche H\u00f6he)": {
+ "account_number": "6938"
+ },
+ "Forderungsverluste aus im Inland steuerpfl. EU-Lieferungen 15% USt (\u00fcbliche H\u00f6he)": {
+ "account_number": "6939"
+ }
+ },
+ "Periodenfremde Aufwendungen (soweit nicht au\u00dferordentlich)": {
+ "account_number": "6960"
+ },
+ "Sonstige Aufwendungen betriebsfremd und regelm\u00e4\u00dfig": {
+ "account_number": "6967"
+ },
+ "Sonstige Aufwendungen unregelm\u00e4\u00dfig": {
+ "account_number": "6969"
+ },
+ "Au\u00dferordentliche Aufwendungen (Gruppe)": {
+ "is_group": 1,
+ "Au\u00dferordentliche Aufwendungen": {
+ "account_number": "7500"
+ },
+ "Au\u00dferordentliche Aufwendungen finanzwirksam": {
+ "account_number": "7501"
+ },
+ "Au\u00dferordentliche Aufwendungen nicht finanzwirksam": {
+ "account_number": "7550"
+ },
+ "Verluste durch Verschmelzung und Umwandlung": {
+ "account_number": "7551"
+ },
+ "Verluste durch au\u00dfergew\u00f6hnliche Schadensf\u00e4lle": {
+ "account_number": "7552"
+ },
+ "Aufwendungen f. Restrukturierungs- und Sanierungsma\u00dfnahmen": {
+ "account_number": "7553"
+ },
+ "Verluste aus Gesch\u00e4ftsaufgabe oder -ver\u00e4u\u00dferung nach Steuern": {
+ "account_number": "7554"
+ },
+ "Au\u00dferordentliche Aufwendungen aus der Anwendung von \u00dcbergangsvorschriften (Gruppe)": {
+ "is_group": 1,
+ "Au\u00dferordentliche Aufwendungen aus der Anwendung von \u00dcbergangsvorschriften": {
+ "account_number": "7560"
+ },
+ "Au\u00dferordentliche Aufwendungen aus der Anwendung von \u00dcbergangsvorschriften (Pensionsr\u00fcckst.)": {
+ "account_number": "7561"
+ },
+ "Au\u00dferordentliche Aufwendungen aus der Anwendung von \u00dcbergangsvorschriften (Bilanzierungshilfen)": {
+ "account_number": "7562"
+ },
+ "Au\u00dferordentliche Aufwendungen aus der Anwendung von \u00dcbergangsvorschriften (Latente Steuern)": {
+ "account_number": "7563"
+ }
+ }
+ }
+ },
+ "8 - Ertr\u00e4ge aus Beteiligungen": {
+ "root_type": "Income",
+ "is_group": 1,
+ "Ertr\u00e4ge aus Beteiligungen": {
+ "account_number": "7000",
+ "account_type": "Income Account"
+ },
+ "Ertr\u00e4ge aus Beteiligungen an Personengesellschaften (verb. Unternehmen), \u00a7 9 GewStG": {
+ "account_number": "7004"
+ },
+ "Ertr\u00e4ge aus Anteilen an Kap.Ges. (inl\u00e4ndische Beteiligung)": {
+ "account_number": "7005"
+ },
+ "Ertr\u00e4ge aus Anteilen an Kap.Ges. (inl\u00e4ndische verb. Unternehmen)": {
+ "account_number": "7006"
+ },
+ "Sonstige GewSt-freie Gewinne aus Anteilen an einer Kap.Ges. (K\u00fcrzung gem. \u00a7 9 Nr. 2a GewStG)": {
+ "account_number": "7007"
+ },
+ "Gewinnanteile aus Mitunternehmerschaften \u00a7 9 GewStG": {
+ "account_number": "7008"
+ },
+ "Ertr\u00e4ge aus Beteiligungen an verbundenen Unternehmen": {
+ "account_number": "7009"
+ },
+ "Zins- und Dividendenertr\u00e4ge": {
+ "account_number": "7020"
+ },
+ "Erhaltene Ausgleichszahlungen (als au\u00dfenstehender Aktion\u00e4r)": {
+ "account_number": "7030"
+ }
+ },
+ "9 - Ertr\u00e4ge aus anderen Wertpapieren und Ausleihungen des Finanzanlageverm\u00f6gens": {
+ "root_type": "Income",
+ "is_group": 1,
+ "Ertr\u00e4ge aus anderen Wertpapieren und Ausleihungen des Finanzanlageverm\u00f6gens": {
+ "account_number": "7010",
+ "account_type": "Income Account"
+ },
+ "Ertr\u00e4ge aus Ausleihungen des Finanzanlageverm\u00f6gens": {
+ "account_number": "7011"
+ },
+ "Ertr\u00e4ge aus Ausleihungen des Finanzanlageverm\u00f6gens an verbundenen Unternehmen": {
+ "account_number": "7012"
+ },
+ "Ertr\u00e4ge aus Anteilen an Personengesellschaften (Finanzanlageverm\u00f6gen)": {
+ "account_number": "7013"
+ },
+ "Ertr\u00e4ge aus Anteilen an Kap.Ges. (Finanzanlageverm\u00f6gen, inl\u00e4ndische Kap.Ges.)": {
+ "account_number": "7014"
+ },
+ "Ertr\u00e4ge aus Anteilen an Personengesellschaften (verb. Unternehmen)": {
+ "account_number": "7016"
+ },
+ "Ertr\u00e4ge aus anderen Wertpapieren des Finanzanlageverm. an Kap.Ges. (verb. Unternehmen)": {
+ "account_number": "7017"
+ },
+ "Ertr\u00e4ge aus anderen Wertpapieren des Finanzanlageverm. an Pers.Ges. (verb. Unternehmen)": {
+ "account_number": "7018"
+ },
+ "Ertr\u00e4ge aus anderen Wertpapieren und Ausleihungen des Finanzanlageverm. aus verbundenen Unternehmen": {
+ "account_number": "7019"
+ }
+ },
+ "10 - sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge": {
+ "root_type": "Income",
+ "is_group": 1,
+ "davon aus verbundenen Unternehmen": {
+ "is_group": 1,
+ "Diskontertr\u00e4ge aus verbundenen Unternehmen": {
+ "account_number": "7139"
+ },
+ "Sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge aus verbundenen Unternehmen": {
+ "account_number": "7109"
+ },
+ "Sonstige Zinsertr\u00e4ge aus verbundenen Unternehmen": {
+ "account_number": "7119",
+ "account_type": "Income Account"
+ },
+ "Zins\u00e4hnliche Ertr\u00e4ge aus verbundenen Unternehmen": {
+ "account_number": "7129"
+ }
+ },
+ "Sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge": {
+ "account_number": "7100",
+ "account_type": "Income Account"
+ },
+ "Ertr\u00e4ge aus Anteilen an Kap.Ges. (Umlaufverm\u00f6gen, inl\u00e4ndische Kap.Ges.)": {
+ "account_number": "7103"
+ },
+ "Zinsertr\u00e4ge \u00a7 233a AO steuerpflichtig": {
+ "account_number": "7105"
+ },
+ "Zinsertr\u00e4ge \u00a7 233a AO, \u00a7 4 Abs. 5b EStG, steuerfrei": {
+ "account_number": "7107"
+ },
+ "Sonstige Zinsertr\u00e4ge": {
+ "account_number": "7110"
+ },
+ "Ertr\u00e4ge aus anderen Wertpapieren und Ausleihungen des Umlaufverm.": {
+ "account_number": "7115"
+ },
+ "Zins\u00e4hnliche Ertr\u00e4ge": {
+ "account_number": "7120"
+ },
+ "Diskontertr\u00e4ge": {
+ "account_number": "7130"
+ },
+ "Zinsertr\u00e4ge aus der Abzinsung von Verb.": {
+ "account_number": "7141"
+ },
+ "Zinsertr\u00e4ge aus der Abzinsung von R\u00fcckstellungen": {
+ "account_number": "7142"
+ },
+ "Zinsertr\u00e4ge aus der Abzinsung von Pensionsr\u00fcckst. und \u00e4hnl./vergleichb. Verplicht.": {
+ "account_number": "7143"
+ },
+ "Zinsertr\u00e4ge aus der Abzinsung von Pensionsr\u00fcckst. und \u00e4hnl. Verplicht. zur Verrechnung": {
+ "account_number": "7144"
+ },
+ "Erhaltene Gewinne auf Grund einer Gewinngemeinschaft": {
+ "account_number": "7192"
+ },
+ "Erhaltene Gewinne auf Grund einer Gewinn- oder Teilgewinnabf\u00fchrungsvertrags": {
+ "account_number": "7194"
+ }
+ },
+ "11 - Abschreibungen auf Finanzanlagen und auf Wertpapiere des Umlaufverm.": {
+ "root_type": "Expense",
+ "is_group": 1,
+ "Abschreibungen auf Finanzanlagen (dauerhaft)": {
+ "account_number": "7200",
+ "account_type": "Depreciation"
+ },
+ "Abschreibungen auf Finanzanlagen (nicht dauerhaft)": {
+ "account_number": "7201"
+ },
+ "Abschreibungen auf Finanzanlagen \u00a7 3 Nr. 40 EStG / \u00a7 8b Abs. 3 KStG (inl. Kap.Ges., dauerh.)": {
+ "account_number": "7204"
+ },
+ "Abschreibungen auf Finanzanlagen - verb. Unternehmen": {
+ "account_number": "7207"
+ },
+ "Aufwendungen auf Grund von Verlustanteilen an Mitunternehmerschaften \u00a7 8 GewStG": {
+ "account_number": "7208"
+ },
+ "Abschreibungen auf Wertpapiere des Umlaufverm. (Gruppe)": {
+ "is_group": 1,
+ "Abschreibungen auf Wertpapiere des Umlaufverm.": {
+ "account_number": "7210"
+ },
+ "Abschreibungen auf Wertpapiere des Umlaufverm. \u00a73Nr.40EStG/\u00a78bAbs.3KStG (inl. Kap.Ges.)": {
+ "account_number": "7214"
+ },
+ "Abschreibungen auf Wertpapiere des Umlaufverm. - verb. Unternehmen": {
+ "account_number": "7217"
+ }
+ },
+ "Abschreibungen auf Finanzanlagen auf Grund \u00a7 6b EStG-R\u00fccklage": {
+ "account_number": "7250"
+ },
+ "Abschreibungen auf Finanzanlagen auf Grund \u00a7 3Nr.40EStG/\u00a78bAbs.3KStG (inl. Kap.Ges.)": {
+ "account_number": "7255"
+ }
+ },
+ "12- Zinsen und \u00e4hnliche Aufwendungen": {
+ "root_type": "Expense",
+ "is_group": 1,
+ "davon an verb. Unternehmen": {
+ "is_group": 1,
+ "Zinsen und \u00e4hnliche Aufwendungen an verb. Unternehmen (inl. Kap.Ges.)": {
+ "account_number": "7351"
+ },
+ "Zinsen und \u00e4hnliche Aufwendungen an verb. Unternehmen": {
+ "account_number": "7309"
+ },
+ "Zinsaufwendungen f. kurzfistige Verb. an verb. Unternehmen": {
+ "account_number": "7319"
+ },
+ "Zinsaufwendungen f. langfristigeVerb. an verb. Unternehmen": {
+ "account_number": "7329"
+ },
+ "Diskontaufwendungen an verb. Unternehmen": {
+ "account_number": "7349"
+ }
+ },
+ "Zinsen und \u00e4hnliche Aufwendungen": {
+ "account_number": "7300"
+ },
+ "Steuerlich nicht abzugsf\u00e4hige andere Nebenleistungen zu Steuern \u00a7 4 Abs. 5b EStG": {
+ "account_number": "7302"
+ },
+ "Steuerlich abzugsf\u00e4hige, andere Nebenleistungen zu Steuern": {
+ "account_number": "7303"
+ },
+ "Steuerlich nicht abzugsf\u00e4hige, andere Nebenleistungen zu Steuern": {
+ "account_number": "7304"
+ },
+ "Zinsaufwendungen \u00a7 233a AO betriebliche Steuern": {
+ "account_number": "7305"
+ },
+ "Zinsaufwendungen \u00a7\u00a7 233a bis 237 AO Personensteuern": {
+ "account_number": "7306"
+ },
+ "Zinsaufwendungen \u00a7 233a AO, \u00a7 4 Abs. 5b EStG": {
+ "account_number": "7308"
+ },
+ "Zinsaufwendungen f. kurzfristige Verb.": {
+ "account_number": "7310"
+ },
+ "Nicht abzugsf\u00e4hige Schuldzinsen gem\u00e4\u00df \u00a7 4 Abs. 4a EStG (Hinzurechnungsbetrag)": {
+ "account_number": "7313"
+ },
+ "Zinsen auf Kontokorrentkonten": {
+ "account_number": "7318"
+ },
+ "Zinsaufwendungen f. langfristige Verb.": {
+ "account_number": "7320"
+ },
+ "Abschreibungen auf Disagio/Damnum zur Finanzierung": {
+ "account_number": "7323"
+ },
+ "Abschreibungen auf Disagio/Damnum zur Finanzierung des Anlageverm\u00f6gens": {
+ "account_number": "7324"
+ },
+ "Zinsaufwendungen f. Geb\u00e4ude, die zum Betriebsverm\u00f6gen geh\u00f6ren": {
+ "account_number": "7325"
+ },
+ "Zinsen zur Finanzierung des Anlageverm\u00f6gens": {
+ "account_number": "7326"
+ },
+ "Renten und dauernde Lasten": {
+ "account_number": "7327"
+ },
+ "Zins\u00e4hnliche Aufwendungen": {
+ "account_number": "7330"
+ },
+ "Diskontaufwendungen": {
+ "account_number": "7340"
+ },
+ "Zinsen und \u00e4hnl. Aufwendungen \u00a7\u00a73Nr.40,3cEStG/\u00a78bAbs.1KStG (inl. Kap.Ges.)": {
+ "account_number": "7350"
+ },
+ "Kreditprovisionen und Verwaltungskostenbeitr\u00e4ge": {
+ "account_number": "7355"
+ },
+ "Zinsanteil der Zuf\u00fchrungen zu Pensionsr\u00fcckst.": {
+ "account_number": "7360"
+ },
+ "Zinsaufwendungen aus der Abzinsung von Verb.": {
+ "account_number": "7361"
+ },
+ "Zinsaufwendungen aus der Abzinsung von R\u00fcckstellungen": {
+ "account_number": "7362"
+ },
+ "Zinsaufwendungen aus der Abzinsung von Pensionsr\u00fcckst. und \u00e4hnl. Verplicht.": {
+ "account_number": "7363"
+ },
+ "Zinsaufwendungen aus der Abzinsung von Pensionsr\u00fcckst. und \u00e4hnl. Verplicht. zur Verrechnung": {
+ "account_number": "7364"
+ },
+ "Aufwendungen aus Verlust\u00fcbernahme": {
+ "account_number": "7390"
+ }
+ },
+ "13 - Steuern vom Einkommen und vom Ertrag": {
+ "root_type": "Expense",
+ "is_group": 1,
+ "K\u00f6rperschaftsteuer": {
+ "account_number": "7600",
+ "account_type": "Tax"
+ },
+ "Gewerbesteuer": {
+ "account_number": "7610",
+ "account_type": "Tax"
+ },
+ "Kapitalertragsteuer 25 %": {
+ "account_number": "7630"
+ },
+ "Anrechenbarer Solidarit\u00e4tszuschlag auf Kapitalertragsteuer 25 %": {
+ "account_number": "7633"
+ },
+ "Anzurechnende ausl\u00e4ndische Quellensteuer": {
+ "account_number": "7639"
+ },
+ "Gewerbesteuernachzahlungen Vorjahre": {
+ "account_number": "7640"
+ },
+ "Gewerbesteuernachzahlungen und Gewerbesteuererstattungen f. Vorjahre, \u00a7 4 Abs. 5b EStG": {
+ "account_number": "7641"
+ },
+ "Gewerbesteuererstattungen Vorjahre": {
+ "account_number": "7642"
+ },
+ "Ertr\u00e4ge aus der Aufl\u00f6sung von Gewerbesteuerr\u00fcckstellungen, \u00a7 4 Abs. 5b EStG": {
+ "account_number": "7643"
+ },
+ "Ertr\u00e4ge aus der Aufl\u00f6sung von Gewerbesteuerr\u00fcckstellungen": {
+ "account_number": "7644"
+ },
+ "Aufwendungen aus der Zuf\u00fchrung und Aufl\u00f6sung von latenten Steuern": {
+ "account_number": "7645"
+ },
+ "Ertr\u00e4ge aus der Zuf\u00fchrung und Aufl\u00f6sung von latenten Steuern": {
+ "account_number": "7649"
+ }
+ },
+ "15 - sonstige Steuern": {
+ "root_type": "Expense",
+ "is_group": 1,
+ "Verbrauchsteuer": {
+ "account_number": "7675"
+ },
+ "\u00d6kosteuer": {
+ "account_number": "7678"
+ },
+ "Grundsteuer": {
+ "account_number": "7680"
+ },
+ "Kfz-Steuer": {
+ "account_number": "7685"
+ },
+ "Steuernachzahlungen Vorjahre f. sonstige Steuern": {
+ "account_number": "7690"
+ },
+ "Steuererstattungen Vorjahre f. sonstige Steuern": {
+ "account_number": "7692"
+ },
+ "Ertr\u00e4ge aus der Aufl\u00f6sung von R\u00fcckstellungen f. sonstige Steuern": {
+ "account_number": "7694"
+ }
}
}
}
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR04_with_account_number.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR04_with_account_number.json
deleted file mode 100644
index 2bf55cfcd0..0000000000
--- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/de_kontenplan_SKR04_with_account_number.json
+++ /dev/null
@@ -1,3667 +0,0 @@
-{
- "country_code": "de",
- "name": "SKR04 mit Kontonummern",
- "tree": {
- "Aktiva": {
- "root_type": "Asset",
- "A - Anlageverm\u00f6gen": {
- "account_type": "Fixed Asset",
- "is_group": 1,
- "I - Immaterielle VG": {
- "is_group": 1,
- "1 - Selbst geschaffene gewerbliche Schutzrechte und \u00e4hnliche Rechte und Werte": {
- "is_group": 1
- },
- "2 - entgeltlich erworbene Konzessionen, gewerbl. Schutzrechte und \u00e4hnl. Rechte und Werte sowie Lizenzen an solchen": {
- "is_group": 1,
- "Entgeltlich erworbene Konzessionen, gewerbl. Schutzrechte und \u00e4hnl. Rechte und Werte sowie Lizenzen an solchen": {
- "account_number": "0100"
- },
- "Konzessionen ": {
- "account_number": "0110"
- },
- "Gewerbliche Schutzrechte ": {
- "account_number": "0120"
- },
- "\u00c4hnliche Rechte und Werte": {
- "account_number": "0130"
- },
- "EDV-Software": {
- "account_number": "0135"
- },
- "Lizenzen an gewerblichen Schutzrechten und \u00e4hnl. Rechten und Werten": {
- "account_number": "0140"
- },
- "Selbst geschaffene immaterielle VG": {
- "account_number": "0143",
- "account_type": "Fixed Asset"
- },
- "Lizenzen und Franchisevertr\u00e4ge": {
- "account_number": "0145"
- },
- "Konzessionen und gewerbliche Schutzrechte": {
- "account_number": "0146"
- },
- "Rezepte, Verfahren, Prototypen": {
- "account_number": "0147"
- },
- "Immaterielle VG in Entwicklung": {
- "account_number": "0148"
- },
- "Geleistete Anz. auf immaterielle VG": {
- "account_number": "0170"
- }
- },
- "3 - Gesch\u00e4fts- oder Firmenwert": {
- "is_group": 1,
- "Gesch\u00e4fts- oder Firmenwert ": {
- "account_number": "0150"
- },
- "Anz. auf Gesch\u00e4fts- oder Firmenwert": {
- "account_number": "0179"
- }
- },
- "4 - geleistete Anz.": {
- "is_group": 1,
- "Geleistete Anz. auf Vorr\u00e4te": {
- "account_number": "1180"
- },
- "Geleistete Anz., 7 % Vorsteuer": {
- "account_number": "1181"
- },
- "Geleistete Anz., 16 % Vorsteuer": {
- "account_number": "1184"
- },
- "Geleistete Anz., 15 % Vorsteuer": {
- "account_number": "1185"
- },
- "Geleistete Anz., 19 % Vorsteuer": {
- "account_number": "1186"
- }
- }
- },
- "II - Sachanlagen": {
- "1 - Grundst\u00fccke, grundst\u00fccksgleiche Rechte und Bauten einschl. der Bauten auf fremden Grundst\u00fccken": {
- "is_group": 1,
- "Grundst\u00fccke, grundst\u00fccksgleiche Rechte und Bauten einschl. der Bauten auf fremden Grundst\u00fccken": {
- "account_number": "0200",
- "account_type": "Fixed Asset"
- },
- "Grundst\u00fccksgleiche Rechte ohne Bauten": {
- "account_number": "0210"
- },
- "Unbebaute Grundst\u00fccke": {
- "account_number": "0215"
- },
- "Grundst\u00fccksgleiche Rechte (Erbbaurecht, Dauerwohnrecht)": {
- "account_number": "0220"
- },
- "Grundst\u00fccke mit Substanzverzehr": {
- "account_number": "0225"
- },
- "Grundst\u00fccksanteil h\u00e4usliches Arbeitszimmer": {
- "account_number": "0229"
- },
- "Bauten auf eigenen Grundst\u00fccken und grundst\u00fccksgleichen Rechten": {
- "account_number": "0230"
- },
- "Grundst\u00fcckswerte eigener bebauter Grundst\u00fccke": {
- "account_number": "0235"
- },
- "Gesch\u00e4ftsbauten": {
- "account_number": "0240"
- },
- "Fabrikbauten ": {
- "account_number": "0250"
- },
- "Andere Bauten": {
- "account_number": "0260"
- },
- "Garagen": {
- "account_number": "0270"
- },
- "Au\u00dfenanlagen f. Gesch\u00e4fts-, Fabrik- und andere Bauten": {
- "account_number": "0280"
- },
- "Hof- und Wegebefestigungen": {
- "account_number": "0285"
- },
- "Einrichtungen f. Gesch\u00e4fts-, Fabrik- und andere Bauten": {
- "account_number": "0290"
- },
- "Wohnbauten ": {
- "account_number": "0300"
- },
- "Au\u00dfenanlagen ": {
- "account_number": "0310"
- },
- "Einrichtungen f. Wohnbauten ": {
- "account_number": "0320"
- },
- "Geb\u00e4udeanteil h\u00e4usliches Arbeitszimmer": {
- "account_number": "0329"
- },
- "Bauten auf fremden Grundst\u00fccken": {
- "account_number": "0330"
- },
- "Einrichtungen f. Gesch\u00e4fts-, Fabrik-, Wohn- und andere Bauten": {
- "account_number": "0398"
- }
- },
- "2 - technische Anlagen und Maschinen": {
- "is_group": 1,
- "Technische Anlagen und Maschinen": {
- "account_number": "0400",
- "account_type": "Fixed Asset"
- },
- "Technische Anlagen": {
- "account_number": "0420"
- },
- "Maschinen": {
- "account_number": "0440"
- },
- "Transportanlagen und \u00c4hnliches ": {
- "account_number": "0450"
- },
- "Betriebsvorrichtungen": {
- "account_number": "0470"
- },
- "Wertberichtigung Technische Anlagen und Maschinen": {
- "account_number": "0409",
- "account_type": "Accumulated Depreciation"
- }
- },
- "3 - andere Anlagen, Betriebs- und Gesch\u00e4ftsausstattung": {
- "is_group": 1,
- "Andere Anlagen, Betriebs- und Gesch\u00e4ftsausstattung": {
- "account_number": "0500",
- "account_type": "Fixed Asset"
- },
- "Andere Anlagen": {
- "account_number": "0510"
- },
- "Pkw": {
- "account_number": "0520"
- },
- "Lkw": {
- "account_number": "0540"
- },
- "Sonstige Transportmittel": {
- "account_number": "0560"
- },
- "Werkzeuge": {
- "account_number": "0620"
- },
- "Betriebsausstattung": {
- "account_number": "0630"
- },
- "Gesch\u00e4ftsausstattung": {
- "account_number": "0635"
- },
- "Ladeneinrichtung": {
- "account_number": "0640"
- },
- "B\u00fcroeinrichtung": {
- "account_number": "0650"
- },
- "Ger\u00fcst- und Schalungsmaterial": {
- "account_number": "0660"
- },
- "Geringwertige Wirtschaftsg\u00fcter": {
- "account_number": "0670"
- },
- "Wirtschaftsg\u00fcter gr\u00f6\u00dfer 150 bis 1000 Euro (Sammelposten)": {
- "account_number": "0675"
- },
- "Einbauten in fremde Grundst\u00fccke": {
- "account_number": "0680"
- },
- "Sonstige Betriebs- und Gesch\u00e4ftsausstattung": {
- "account_number": "0690"
- }
- },
- "4 - geleistete Anz. und Anlagen im Bau": {
- "is_group": 1,
- "Geleistete Anz. und Anlagen im Bau": {
- "account_number": "0700",
- "account_type": "Capital Work in Progress"
- },
- "Anz. auf Grundst\u00fcckeund grundst\u00fccksgleiche Rechte ohne Bauten ": {
- "account_number": "0705"
- },
- "Gesch\u00e4fts-, Fabrik- und andere Bauten im Bau auf eigenen Grundst\u00fccken": {
- "account_number": "0710"
- },
- "Anz. auf Gesch\u00e4fts-, Fabrik- und andere Bauten auf eigenen Grundst. und grundst\u00fccksgleichen Rechten ": {
- "account_number": "0720"
- },
- "Wohnbauten im Bau": {
- "account_number": "0725"
- },
- "Anz. auf Wohnbauten auf eigenen Grundst\u00fccken und grundst\u00fccksgleichen Rechten": {
- "account_number": "0735"
- },
- "Gesch\u00e4fts-, Fabrik- und andere Bauten im Bau auf fremden Grundst\u00fccken": {
- "account_number": "0740"
- },
- "Anz. auf Gesch\u00e4fts-, Fabrik- und andere Bauten auf fremden Grundst\u00fccken ": {
- "account_number": "0750"
- },
- "Anz. auf Wohnbauten auf fremden Grundst\u00fccken": {
- "account_number": "0765"
- },
- "Technische Anlagen und Maschinen im Bau": {
- "account_number": "0770"
- },
- "Anz. auf technische Anlagen und Maschinen": {
- "account_number": "0780"
- },
- "Andere Anlagen, Betriebs- und Gesch\u00e4ftsausstattung im Bau": {
- "account_number": "0785"
- },
- "Andere Anlagen, Betriebs- und Gesch\u00e4ftsausstattung": {
- "account_number": "0795"
- }
- },
- "is_group": 1
- },
- "III - Finanzanlagen": {
- "1 - Anteile an verbundenen Unternehmen": {
- "is_group": 1,
- "Anteile an verbundenen Unternehmen": {
- "account_number": "0800"
- },
- "Anteile an verbundenen Unternehmen, Personengesellschaften": {
- "account_number": "0803"
- },
- "Anteile an verbundenen Unternehmen, Kapitalgesellschaften": {
- "account_number": "0804"
- },
- "Anteile an herrschender oder mehrheitlich beteiligter Gesellschaft, Personengesellschaft": {
- "account_number": "0805"
- },
- "Anteile an herrschender oder mehrheitlich beteiligter Gesellschaft, Kapitalgesellschaften": {
- "account_number": "0808"
- },
- "Anteile an herrschender oder mit Mehrheit beteiligter Gesellschaft": {
- "account_number": "0809"
- }
- },
- "2 - Ausleihungen an verb. Unternehmen": {
- "is_group": 1,
- "Ausleihungen an verb. Unternehmen": {
- "account_number": "0880"
- },
- "Ausleihungen an Unternehmen, mit denen ein Beteiligungsverh. besteht, Personengesellschaften": {
- "account_number": "0883"
- },
- "Ausleihungen an Unternehmen, mit denen ein Beteiligungsverh. besteht, Kapitalgesellschaften": {
- "account_number": "0885"
- }
- },
- "3 - Beteiligungen": {
- "is_group": 1,
- "Beteiligungen": {
- "account_number": "0820"
- },
- "Typisch stille Beteiligungen": {
- "account_number": "0830"
- },
- "Atypisch stille Beteiligungen": {
- "account_number": "0840"
- },
- "Beteiligungen an Kapitalgesellschaften": {
- "account_number": "0850"
- },
- "Beteiligungen an Personengesellschaften": {
- "account_number": "0860"
- }
- },
- "4 - Ausleihungen an Unternehmen, mit denen ein Beteiligungsverh. besteht": {
- "is_group": 1
- },
- "5 - Wertpapiere des Anlageverm\u00f6gens": {
- "is_group": 1,
- "Wertpapiere des Anlageverm\u00f6gens": {
- "account_number": "0900"
- },
- "Wertpapiere mit Gewinnbeteiligungsanspr\u00fcchen, die dem Teileink\u00fcnfteverfahren unterliegen": {
- "account_number": "0910"
- },
- "Festverzinsliche Wertpapiere": {
- "account_number": "0920"
- },
- "Genossenschaftsanteile zum langfristigen Verbleib": {
- "account_number": "0980"
- },
- "R\u00fcckdeckungsanspr\u00fcche aus Lebensversicherungen zum langfristigen Verbleib": {
- "account_number": "0990"
- }
- },
- "6 - sonstige Ausleihungen": {
- "is_group": 1,
- "Sonstige Ausleihungen": {
- "account_number": "0930"
- },
- "Darlehen": {
- "account_number": "0940"
- },
- "Ausleihungen an stille Gesellschafter": {
- "account_number": "0964"
- }
- },
- "is_group": 1
- }
- },
- "B - Umlaufverm\u00f6gen": {
- "I - Vorr\u00e4te": {
- "1 - Roh-, Hilfs- und Betriebsstoffe": {
- "is_group": 1,
- "Roh-, Hilfs- und Betriebsstoffe (Bestand)": {
- "account_number": "1000",
- "account_type": "Stock"
- }
- },
- "2 - unfertige Erzeugnisse, unfertige Leistungen": {
- "is_group": 1,
- "Unfertige Erzeugnisse, unfertige Leistungen (Bestand)": {
- "account_number": "1040",
- "account_type": "Stock"
- },
- "Unfertige Erzeugnisse (Bestand)": {
- "account_number": "1050"
- },
- "Unfertige Leistungen": {
- "account_number": "1080"
- },
- "In Ausf\u00fchrung befindliche Bauauftr\u00e4ge": {
- "account_number": "1090"
- },
- "In Arbeit befindliche Auftr\u00e4ge": {
- "account_number": "1095"
- }
- },
- "3 - fertige Erzeugnisse und Waren": {
- "is_group": 1,
- "Fertige Erzeugnisse und Waren (Bestand)": {
- "account_number": "1100",
- "account_type": "Stock"
- },
- "Fertige Erzeugnisse (Bestand)": {
- "account_number": "1110"
- },
- "Waren (Bestand)": {
- "account_number": "1140"
- },
- "Erhaltene Anz. auf Bestellungen (von Vorr\u00e4ten offen abgesetzt)": {
- "account_number": "1190"
- }
- },
- "is_group": 1
- },
- "II - Forderungen und sonstige VG": {
- "account_type": "Receivable",
- "1 - Forderungen aus Lieferungen und Leistungen": {
- "account_type": "Receivable",
- "is_group": 1,
- "Bewertungskorrektur zu Forderungen aus Lieferungen und Leistungen": {
- "account_number": "9960"
- },
- "Debitoren": {
- "is_group": 1,
- "account_number": "10000"
- },
- "Forderungen aus Lieferungen und Leistungen": {
- "account_number": "1200",
- "account_type": "Receivable"
- },
- "Forderungen aus Lieferungen und Leistungen ohne Kontokorrent": {
- "account_number": "1210"
- },
- "Forderungen aus Lieferungen und Leistungen ohne Kontokorrent(b. 1 J.)": {
- "account_number": "1221"
- },
- "Forderungen aus Lieferungen und Leistungen ohne Kontokorrent (gr\u00f6\u00dfer 1 J.)": {
- "account_number": "1225"
- },
- "Wechsel aus Lieferungen und Leistungen, bundesbankf\u00e4hig": {
- "account_number": "1235"
- },
- "Zweifelhafte Forderungen (Gruppe)": {
- "is_group": 1,
- "Zweifelhafte Forderungen": {
- "account_number": "1240"
- },
- "Zweifelhafte Forderungen (b. 1 J.)": {
- "account_number": "1241"
- },
- "Zweifelhafte Forderungen (gr\u00f6\u00dfer 1 J.)": {
- "account_number": "1245"
- },
- "Einzelwertberichtigungen auf Forderungen mit einer (b. 1 J.)": {
- "account_number": "1248"
- },
- "Einzelwertberichtigung auf Forderungen mit einer (mehr als 1 J.)": {
- "account_number": "1247"
- },
- "Pauschalwertberichtigung auf Forderungen mit einer (mehr als 1 J.)": {
- "account_number": "1249"
- }
- },
- "Gegenkonto zu sonstigen VGn bei Buchung \u00fcber Debitorenkonto": {
- "account_number": "1258"
- },
- "Gegenkonto 1221-1229,1240-1245,1250-1257, 1270-1279, 1290-1297 bei Aufteilung Debitorenkonto": {
- "account_number": "1259"
- }
- },
- "2 - Forderungen gg. verb. Unternehmen": {
- "account_type": "Receivable",
- "is_group": 1,
- "Forderungen gg. verb. Unternehmen": {
- "account_number": "1260"
- },
- "Forderungen gg. verb. Unternehmen (b. 1 J.)": {
- "account_number": "1261"
- },
- "Forderungen gg. verb. Unternehmen (gr\u00f6\u00dfer 1 J.)": {
- "account_number": "1265"
- },
- "Besitzwechsel gg. verb. Unternehmen": {
- "account_number": "1266"
- },
- "Besitzwechsel gg. verb. Unternehmen (b. 1 J.)": {
- "account_number": "1267"
- },
- "Besitzwechsel gg. verb. Unternehmen (gr\u00f6\u00dfer 1 J.)": {
- "account_number": "1268"
- },
- "Besitzwechsel gg. verb. Unternehmen, bundesbankf\u00e4hig": {
- "account_number": "1269"
- },
- "Forderungen aus Lieferungen und Leistungen gg. verb. Unternehmen (Gruppe)": {
- "is_group": 1,
- "Forderungen aus Lieferungen und Leistungen gg. verb. Unternehmen": {
- "account_number": "1270"
- },
- "Forderungen aus Lieferungen und Leistungen gg. verb. Unternehmen (b. 1 J.)": {
- "account_number": "1271"
- },
- "Forderungen aus Lieferungen und Leistungen gg. verb. Unternehmen (gr\u00f6\u00dfer 1 J.)": {
- "account_number": "1275"
- },
- "Wertberichtigungen auf Forderungen mit einer (b. 1 J.) gg. verb. Unternehmen": {
- "account_number": "1276"
- },
- "Wertberichtigungen auf Forderungen mit einer (mehr als 1 J.) gg. verbundene Unternehmen": {
- "account_number": "1277"
- }
- }
- },
- "3 - Forderungen gg. Unt., mit denen ein Beteiligungsverh. besteht": {
- "account_type": "Receivable",
- "is_group": 1,
- "Forderungen gg. Unt., mit denen ein Beteiligungsverh. besteht": {
- "account_number": "1280"
- },
- "Forderungen gg. Unt., mit denen ein Beteiligungsverh. besteht (b. 1 J.)": {
- "account_number": "1281"
- },
- "Forderungen gg. Unt., mit denen ein Beteiligungsverh. besteht (gr\u00f6\u00dfer 1 J.)": {
- "account_number": "1285"
- },
- "Besitzwechsel gg. Unt., mit denen ein Beteiligungsverh. besteht": {
- "account_number": "1286"
- },
- "Besitzwechsel gg. Unt., mit denen ein Beteiligungsverh. besteht (b. 1 J.)": {
- "account_number": "1287"
- },
- "Besitzwechsel gg. Unt., mit denen ein Beteiligungsverh. besteht (gr\u00f6\u00dfer 1 J.)": {
- "account_number": "1288"
- },
- "Besitzwechsel gg. Unt., mit denen ein Beteiligungsverh. besteht, bundesbankf\u00e4hig": {
- "account_number": "1289"
- },
- "Forderungen aus LuL gg. Unt., mit denen ein Beteiligungsverh. besteht": {
- "account_number": "1290"
- },
- "Forderungen aus LuL gg. Unt., mit denen ein Beteiligungsverh. besteht (b. 1 J.)": {
- "account_number": "1291"
- },
- "Forderungen aus LuL gg. Unt., mit denen ein Beteiligungsverh. besteht (gr\u00f6\u00dfer 1 J.)": {
- "account_number": "1295"
- },
- "Wertberichtigungen auf Ford. (b. 1 J.) gg. Unt., mit denen ein Beteiligungsverh. besteht": {
- "account_number": "1296"
- },
- "Wertberichtigungen auf Ford. (mehr als 1 J.) gg. Unt., mit denen ein Beteiligungsverh. besteht": {
- "account_number": "1297"
- }
- },
- "4 - sonstige VG": {
- "account_type": "Receivable",
- "is_group": 1,
- "Bewertungskorrektur zu sonstigen VGn": {
- "account_number": "9965"
- },
- "Verrechnungskonto geleistete Anz. bei Buchung \u00fcber Kreditorenkonto": {
- "account_number": "3695"
- },
- "Sonstige VG": {
- "account_number": "1300"
- },
- "Sonstige VG (b. 1 J.)": {
- "account_number": "1301"
- },
- "Sonstige VG (gr\u00f6\u00dfer 1 J.)": {
- "account_number": "1305"
- },
- "Forderungen gg. typisch stille Gesellschafter": {
- "account_number": "1337"
- },
- "Forderungen gg. typisch stille Gesellschafter - Restlaufzeit bis1 Jahr": {
- "account_number": "1338"
- },
- "Forderungen gg. typisch stille Gesellschafter (gr\u00f6\u00dfer 1 J.)": {
- "account_number": "1339"
- },
- "Forderungen gg. Personal aus Lohn- und Gehaltsabrechnung (Gruppe)": {
- "is_group": 1,
- "Forderungen gg. Personal aus Lohn- und Gehaltsabrechnung": {
- "account_number": "1340"
- },
- "Forderungen gg. Personal aus Lohn- und Gehaltsabrechnung (b. 1 J.)": {
- "account_number": "1341"
- },
- "Forderungen gg. Personal aus Lohn- und Gehaltsabrechnung (gr\u00f6\u00dfer 1 J.)": {
- "account_number": "1345"
- }
- },
- "Kautionen (Gruppe)": {
- "is_group": 1,
- "Kautionen": {
- "account_number": "1350"
- },
- "Kautionen (b. 1 J.)": {
- "account_number": "1351"
- },
- "Kautionen (gr\u00f6\u00dfer 1 J.)": {
- "account_number": "1355"
- }
- },
- "Darlehen (Gruppe)": {
- "Darlehen": {
- "account_number": "1360"
- },
- "Darlehen (b. 1 J.)": {
- "account_number": "1361"
- },
- "Darlehen (gr\u00f6\u00dfer 1 J.)": {
- "account_number": "1365"
- }
- },
- "Forderungen gg. Krankenkassen aus Aufwendungsausgleichsgesetz": {
- "account_number": "1369"
- },
- "Durchlaufende Posten": {
- "account_number": "1370"
- },
- "Fremdgeld": {
- "account_number": "1374"
- },
- "Agenturwarenabrechnung": {
- "account_number": "1375"
- },
- "Nachtr\u00e4glich abziehbare Vorsteuer, \u00a7 15a Abs. 2 UStG": {
- "account_number": "1376"
- },
- "Zur\u00fcckzuzahlende Vorsteuer, \u00a7 15a Abs. 2 UStG": {
- "account_number": "1377"
- },
- "Anspr\u00fcche aus R\u00fcckdeckungsversicherungen": {
- "account_number": "1378"
- },
- "Verm\u00f6gensgegenst. zur Saldierung mit Pensionsr\u00fcckst. und \u00e4hnl. Verplicht. zum langfristigen Verbleib": {
- "account_number": "1381"
- },
- "Verm\u00f6gensgegenst. zur Erf\u00fcllung von mit der Altersvers. vergleichb. langfristigen Verplicht.": {
- "account_number": "1382"
- },
- "Verm\u00f6gensgegenst. zur Saldierung mit der Altersvers. vergleichb. langfristigen Verplicht.": {
- "account_number": "1383"
- },
- "GmbH-Anteile zum kurzfr. Verbleib": {
- "account_number": "1390"
- },
- "Forderungen gg. Arbeitsgemeinschaften": {
- "account_number": "1391"
- },
- "Genussrechte": {
- "account_number": "1393"
- },
- "Einzahlungsanspr\u00fcche zu Nebenleistungen oder Zuzahlungen": {
- "account_number": "1394"
- },
- "Genossenschaftsanteile zum kurzfr. Verbleib": {
- "account_number": "1395"
- },
- "Nachtr\u00e4glich abziehbare Vorsteuer, \u00a7 15a Abs. 1 UStG, bewegliche Wirtschaftsg\u00fcter": {
- "account_number": "1396"
- },
- "Zur\u00fcckzuzahlende Vorsteuer, \u00a7 15a Abs. 1 UStG, bewegliche Wirtschaftsg\u00fcter": {
- "account_number": "1397"
- },
- "Nachtr\u00e4glich abziehbare Vorsteuer gem. \u00a7 15a Abs. 1 UStG, unbewegliche Wirtschaftsg\u00fcter": {
- "account_number": "1398"
- },
- "Zur\u00fcckzuzahlende Vorsteuer gem. \u00a7 15a Abs. 1 UStG, unbewegliche Wirtschaftsg\u00fcter": {
- "account_number": "1399"
- },
- "Abziehbare Vorsteuer (Gruppe)": {
- "is_group": 1,
- "account_type": "Tax",
- "Abziehbare Vorsteuer": {
- "account_number": "1400"
- },
- "Abziehbare Vorsteuer 7 %": {
- "account_number": "1401",
- "account_type": "Tax",
- "tax_rate": 7.0
- },
- "Abziehbare Vorsteuer aus innergem. Erwerb": {
- "account_number": "1402"
- },
- "Abziehbare Vorsteuer aus innergem. Erwerb 19%": {
- "account_number": "1404",
- "account_type": "Tax",
- "tax_rate": 19.0
- },
- "Abziehbare Vorsteuer 19 %": {
- "account_number": "1406",
- "account_type": "Tax",
- "tax_rate": 19.0
- },
- "Abziehbare Vorsteuer nach \u00a7 13b UStG 19 %": {
- "account_number": "1407"
- },
- "Abziehbare Vorsteuer nach \u00a7 13b UStG": {
- "account_number": "1408"
- },
- "Abziehbare Vorsteuer aus der Auslagerung von Gegenst\u00e4nden aus dem Umsatzsteuerlager": {
- "account_number": "1431"
- },
- "Abziehbare Vorsteuer aus innergem. Erwerb von Neufahrzeugen von Lieferanten ohne Ust-ID": {
- "account_number": "1432"
- }
- },
- "Aufzuteilende Vorsteuer (Gruppe)": {
- "is_group": 1,
- "Aufzuteilende Vorsteuer": {
- "account_number": "1410"
- },
- "Aufzuteilende Vorsteuer 7 %": {
- "account_number": "1411"
- },
- "Aufzuteilende Vorsteuer aus innergem. Erwerb": {
- "account_number": "1412"
- },
- "Aufzuteilende Vorsteuer aus innergem. Erwerb 19 %": {
- "account_number": "1413"
- },
- "Aufzuteilende Vorsteuer 19 %": {
- "account_number": "1416"
- },
- "Aufzuteilende Vorsteuer nach \u00a7\u00a7 13a/13b UStG": {
- "account_number": "1417"
- },
- "Aufzuteilende Vorsteuer nach \u00a7\u00a7 13a/13b UStG 19 %": {
- "account_number": "1419"
- }
- },
- "Umsatzsteuerforderungen (Gruppe)": {
- "is_group": 1,
- "Umsatzsteuerforderungen": {
- "account_number": "1420"
- },
- "Umsatzsteuerforderungen laufendes Jahr": {
- "account_number": "1421"
- },
- "Umsatzsteuerforderungen Vorjahr": {
- "account_number": "1422"
- },
- "Umsatzsteuerforderungen fr\u00fchere Jahre": {
- "account_number": "1425"
- },
- "Forderungen aus entrichteten Verbrauchsteuern": {
- "account_number": "1427"
- }
- },
- "Bezahlte Einfuhrumsatzsteuer": {
- "account_number": "1433"
- },
- "Vorsteuer im Folgejahr abziehbar": {
- "account_number": "1434"
- },
- "Forderungen aus Gewerbesteuer\u00fcberzahlungen": {
- "account_number": "1435"
- },
- "Vorsteuer aus Erwerb als letzter Abnehmer innerh. eines Dreiecksgesch.s": {
- "account_number": "1436"
- },
- "Steuererstattungsanspr\u00fcche gg. anderen L\u00e4ndern": {
- "account_number": "1440"
- },
- "Forderungen an das Finanzamt aus abgef\u00fchrtem Bauabzugsbetrag": {
- "account_number": "1456"
- },
- "Forderungen gg. Bundesagentur f. Arbeit": {
- "account_number": "1457"
- },
- "Geldtransit": {
- "account_number": "1460"
- },
- "Vorsteuer nach allgemeinen Durchschnittss\u00e4tzen UStVA Kz. 63": {
- "account_number": "1484"
- },
- "Verrechnungskonto Ist-Versteuerung": {
- "account_number": "1490"
- },
- "Verrechnungskonto erhaltene Anz. bei Buchung \u00fcber Debitorenkonto": {
- "account_number": "1495"
- },
- "\u00dcberleitungskonto Kostenstellen": {
- "account_number": "1498"
- }
- },
- "is_group": 1
- },
- "III - Wertpapiere": {
- "is_group": 1,
- "2 - sonstige Wertpapiere": {
- "is_group": 1,
- "Sonstige Wertpapiere": {
- "account_number": "1510"
- }
- },
- "Finanzwechsel": {
- "account_number": "1520"
- },
- "Andere Wertpapiere mit unwesentlichen Wertschwankungen im Sinne Textziffer 18 DRS 2": {
- "account_number": "1525"
- },
- "Wertpapieranlagen i. R. d. kurzfr. Finanzdisposition": {
- "account_number": "1530"
- },
- "Schecks": {
- "account_number": "1550"
- },
- "Anteile an verbundenen Unternehmen (Umlaufverm\u00f6gen)": {
- "account_number": "1500"
- }
- },
- "IV - Kassenbestand, Bundesbankguthaben, Guthaben bei Kreditinstituten und Schecks": {
- "is_group": 1,
- "Bewertungskorrektur zu Guthaben bei Kreditinstituten": {
- "account_number": "9962"
- },
- "Kasse (Gruppe)": {
- "is_group": 1,
- "account_type": "Cash",
- "Kasse": {
- "account_number": "1600",
- "account_type": "Cash"
- },
- "Nebenkasse 1": {
- "account_number": "1610",
- "account_type": "Cash"
- },
- "Nebenkasse 2": {
- "account_number": "1620",
- "account_type": "Cash"
- }
- },
- "Postbank (Gruppe)": {
- "is_group": 1,
- "Postbank": {
- "account_number": "1700"
- },
- "Postbank 1 (Gruppe)": {
- "is_group": 1,
- "Postbank 1": {
- "account_number": "1710"
- }
- },
- "Postbank 2 (Gruppe)": {
- "is_group": 1,
- "Postbank 2": {
- "account_number": "1720"
- }
- },
- "Postbank 3 (Gruppe)": {
- "is_group": 1,
- "Postbank 3": {
- "account_number": "1730"
- }
- }
- },
- "LZB-Guthaben": {
- "account_number": "1780"
- },
- "Bundesbankguthaben": {
- "account_number": "1790"
- },
- "Bank (Gruppe)": {
- "is_group": 1,
- "account_type": "Bank",
- "Bank": {
- "account_number": "1800",
- "account_type": "Bank"
- },
- "Bank 1": {
- "account_number": "1810",
- "account_type": "Bank"
- },
- "Bank 2": {
- "account_number": "1820",
- "account_type": "Bank"
- },
- "Bank 3": {
- "account_number": "1830"
- },
- "Bank 4": {
- "account_number": "1840"
- },
- "Bank 5": {
- "account_number": "1850"
- },
- "Finanzmittelanlagen i. R. d. kurzfr. Finanzdisposition (nicht im Finanzmittelfonds enthalten)": {
- "account_number": "1890"
- },
- "Verb. gg. Kreditinstituten (nicht im Finanzmittelfonds enthalten)": {
- "account_number": "1895"
- }
- }
- },
- "is_group": 1
- },
- "C - Rechnungsabgrenzungsposten": {
- "is_group": 1,
- "Aktive Rechnungsabgrenzung": {
- "account_number": "1900"
- },
- "Als Aufwand ber\u00fccksichtigte Z\u00f6lle und Verbrauchsteuern auf Vorr\u00e4te": {
- "account_number": "1920"
- },
- "Als Aufwand ber\u00fccksichtigte Umsatzsteuer auf Anz.": {
- "account_number": "1930"
- },
- "Damnum/Disagio": {
- "account_number": "1940"
- }
- },
- "D - Aktive latente Steuern": {
- "is_group": 1,
- "Aktive latente Steuern": {
- "account_type": "Tax",
- "account_number": "1950"
- }
- },
- "E - Aktiver Unterschiedsbetrag aus der Verm\u00f6gensverrechnung": {
- "is_group": 1
- },
- "is_group": 1
- },
- "Passiva - Verbindlichkeiten": {
- "root_type": "Liability",
- "B - R\u00fcckstellungen": {
- "is_group": 1,
- "1 - R\u00fcckstellungen f. Pensionen und \u00e4hnliche Verplicht.": {
- "is_group": 1,
- "R\u00fcckstellungen f. Pensionen und \u00e4hnliche Verplicht.": {
- "account_number": "3000"
- },
- "R\u00fcckstellungen f. Pensionen und \u00e4hnliche Verplicht. (Saldierung mit langfristigen VG)": {
- "account_number": "3009"
- },
- "R\u00fcckstellungen f. Direktzusagen": {
- "account_number": "3010"
- },
- "R\u00fcckstellungen f. ZuschussVerplicht. f. Pensionskassen und Lebensversicherungen": {
- "account_number": "3011"
- }
- },
- "2 - Steuerr\u00fcckstellungen": {
- "is_group": 1,
- "Steuerr\u00fcckstellungen": {
- "account_number": "3020"
- },
- "Gewerbesteuerr\u00fcckstellung": {
- "account_number": "3030"
- },
- "Gewerbesteuerr\u00fcckstellung, \u00a7 4 Abs. 5b EStG": {
- "account_number": "3035"
- },
- "R\u00fcckstellung f. latente Steuern": {
- "account_number": "3060"
- },
- "Sonstige R\u00fcckstellungen": {
- "account_number": "3070"
- },
- "R\u00fcckstellungen f. Personalkosten": {
- "account_number": "3074"
- },
- "R\u00fcckstellungen f. unterlassene Aufwendungen f. Instandhaltung, Nachholung in den ersten drei Monaten": {
- "account_number": "3075"
- },
- "R\u00fcckstellungen f. mit der Altersvers. vergleichb. langfr. Verplicht. zum langfr. Verbleib": {
- "account_number": "3076"
- },
- "R\u00fcckst. f. mit der Altersvers. vergleichb. langfr. Verplicht. (Saldierung mit langfristigen VG)": {
- "account_number": "3077"
- }
- },
- "3 - sonstige R\u00fcckstellungen": {
- "is_group": 1,
- "Sonderposten mit R\u00fccklageanteil, steuerfreie R\u00fccklagen (Gruppe)": {
- "is_group": 1,
- "Sonderposten mit R\u00fccklageanteil, steuerfreie R\u00fccklagen": {
- "account_number": "2980"
- },
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 6b EStG": {
- "account_number": "2981"
- },
- "Sonderposten mit R\u00fccklageanteil nach EStR R 6.6": {
- "account_number": "2982"
- },
- "R\u00fccklage f. Zusch\u00fcsse": {
- "account_number": "2988"
- },
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 52 Abs.16 EStG": {
- "account_number": "2989"
- },
- "Sonderposten mit R\u00fccklageanteil, Sonderabschreibungen": {
- "account_number": "2990"
- },
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 7g Abs. 2 EStG n. F.": {
- "account_number": "2993"
- },
- "Ausgleichsposten bei Entnahmen \u00a7 4g EStG": {
- "account_number": "2995"
- },
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 7g Abs. 1 EStG a. F. / \u00a7 7g Abs. 5 EStG n. F.": {
- "account_number": "2997"
- },
- "Sonderposten mit R\u00fccklageanteil nach \u00a7 7g Abs. 3 und 7 EStG a. F.": {
- "account_number": "2998"
- },
- "Sonderposten f. Zusch\u00fcsse und Zulagen": {
- "account_number": "2999"
- },
- "R\u00fcckstellungen f. Abraum- und Abfallbeseitigung": {
- "account_number": "3085"
- },
- "R\u00fcckstellungen f. Gew\u00e4hrleistungen": {
- "account_number": "3090"
- },
- "R\u00fcckstellungen f. drohende Verluste aus schwebenden Gesch\u00e4ften": {
- "account_number": "3092"
- },
- "R\u00fcckstellungen f. Abschluss- und Pr\u00fcfungskosten": {
- "account_number": "3095"
- },
- "R\u00fcckstellungen zur Erf\u00fcllung der Aufbewahrungspflichten": {
- "account_number": "3096"
- },
- "Aufwandsr\u00fcckstellungen gem\u00e4\u00df \u00a7 249 Abs. 2 HGB a. F.": {
- "account_number": "3098"
- },
- "R\u00fcckstellungen f. Umweltschutz": {
- "account_number": "3099"
- }
- }
- }
- },
- "C - Verbindlichkeiten": {
- "account_type": "Payable",
- "1 - Anleihen": {
- "is_group": 1,
- "account_type": "Payable",
- "davon konvertibel": {
- "account_type": "Payable",
- "is_group": 1,
- "Anleihen, konvertibel": {
- "account_number": "3120"
- },
- "Anleihen, konvertibel (b. 1 J.)": {
- "account_number": "3121"
- },
- "Anleihen, konvertibel (1-5 J.)": {
- "account_number": "3125"
- },
- "Anleihen, konvertibel (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3130"
- }
- },
- "Anleihen, nicht konvertibel": {
- "account_number": "3100"
- },
- "Anleihen, nicht konvertibel (b. 1 J.)": {
- "account_number": "3101"
- },
- "Anleihen, nicht konvertibel (1-5 J.)": {
- "account_number": "3105"
- },
- "Anleihen, nicht konvertibel (gr\u00f6\u00dfer 5 J.) (Gruppe)": {
- "is_group": 1,
- "Anleihen, nicht konvertibel (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3110"
- }
- }
- },
- "2 - Verb. gg. Kreditinstituten": {
- "account_type": "Payable",
- "is_group": 1,
- "Bewertungskorrektur zu Verb. gg. Kreditinstituten": {
- "account_number": "9963"
- },
- "Verb. gg. Kreditinstituten (Gruppe)": {
- "is_group": 1,
- "Verb. gg. Kreditinstituten": {
- "account_number": "3150"
- },
- "Verb. gg. Kreditinstituten (b. 1 J.)": {
- "account_number": "3151"
- },
- "Verb. gg. Kreditinstituten (1-5 J.)": {
- "account_number": "3160"
- },
- "Verb. gg. Kreditinstituten (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3170"
- }
- },
- "Verb. gg. Kreditinstituten aus Teilzahlungsvertr\u00e4gen (Gruppe)": {
- "is_group": 1,
- "Verb. gg. Kreditinstituten aus Teilzahlungsvertr\u00e4gen": {
- "account_number": "3180"
- },
- "Verb. gg. Kreditinstituten aus Teilzahlungsvertr\u00e4gen (b. 1 J.)": {
- "account_number": "3181"
- },
- "Verb. gg. Kreditinstituten aus Teilzahlungsvertr\u00e4gen (1-5 J.)": {
- "account_number": "3190"
- },
- "Verb. gg. Kreditinstituten aus Teilzahlungsvertr\u00e4gen (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3200"
- }
- }
- },
- "3 - erhaltene Anz. auf Bestellungen": {
- "account_type": "Payable",
- "is_group": 1,
- "Erhaltene, versteuerte Anz. 7 % USt (Verb.)": {
- "account_number": "3260",
- "account_type": "Receivable"
- },
- "Erhaltene, versteuerte Anz. 16 % USt (Verb.)": {
- "account_number": "3270"
- },
- "Erhaltene, versteuerte Anz. 15 % USt (Verb.)": {
- "account_number": "3271"
- },
- "Erhaltene, versteuerte Anz. 19 % USt (Verb.)": {
- "account_number": "3272",
- "account_type": "Receivable"
- },
- "Erhaltene Anz. (Gruppe)": {
- "is_group": 1,
- "Erhaltene Anz. (b. 1 J.)": {
- "account_number": "3280",
- "account_type": "Receivable"
- },
- "Erhaltene Anz. (1-5 J.)": {
- "account_number": "3284",
- "account_type": "Receivable"
- },
- "Erhaltene Anz. (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3285",
- "account_type": "Receivable"
- }
- },
- "Erhaltene Anz. auf Bestellungen (Verb.)": {
- "account_number": "3250",
- "account_type": "Receivable"
- }
- },
- "4 - Verb. aus Lieferungen und Leistungen": {
- "account_type": "Payable",
- "is_group": 1,
- "Bewertungskorrektur zu Verb. aus Lieferungen und Leistungen": {
- "account_number": "9964"
- },
- "Kreditoren": {
- "account_number": "70000",
- "is_group": 1,
- "Wareneingangs-Verrechnungskonto" : {
- "account_number": "70001",
- "account_type": "Stock Received But Not Billed"
- }
- },
- "Verb. aus Lieferungen und Leistungen": {
- "account_number": "3300",
- "account_type": "Payable"
- },
- "Verb. aus Lieferungen und Leistungen ohne Kontokorrent": {
- "account_number": "3310"
- },
- "Verb. aus Lieferungen und Leistungen ohne Kontokorrent (b. 1 J.)": {
- "account_number": "3335"
- },
- "Verb. aus Lieferungen und Leistungen ohne Kontokorrent (1-5 J.)": {
- "account_number": "3337"
- },
- "Verb. aus Lieferungen und Leistungen ohne Kontokorrent (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3338"
- }
- },
- "5 - Verb. aus der Annahme gezogener Wechsel und der Ausstellung eigener Wechsel": {
- "account_type": "Payable",
- "is_group": 1,
- "Verb. aus der Annahme gezogener Wechsel und aus der Ausstellung eigener Wechsel": {
- "account_number": "3350"
- },
- "Verb. aus der Annahme gezogener Wechsel und aus der Ausstellung eigener Wechsel (b. 1 J.)": {
- "account_number": "3351"
- },
- "Verb. aus der Annahme gezogener Wechsel und aus der Ausstellung eigner Wechsel (1-5 J.)": {
- "account_number": "3380"
- },
- "Verb. aus der Annahme gezogener Wechsel und der Ausstellung eigener Wechsel (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3390"
- }
- },
- "6 - Verb. gg. verbundenen Unternehmen": {
- "account_type": "Payable",
- "is_group": 1,
- "Verb. gg. verbundenen Unternehmen": {
- "account_number": "3400"
- },
- "Verb. gg. verbundenen Unternehmen (b. 1 J.)": {
- "account_number": "3401"
- },
- "Verb. gg. verbundenen Unternehmen (1-5 J.)": {
- "account_number": "3405"
- },
- "Verb. gg. verbundenen Unternehmen (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3410"
- },
- "Verb. aus LuL gg. verbundenen Unternehmen": {
- "account_number": "3420"
- },
- "Verb. aus LuL gg. verbundenen Unternehmen (b. 1 J.)": {
- "account_number": "3421"
- },
- "Verb. aus LuL gg. verbundenen Unternehmen (1-5 J.)": {
- "account_number": "3425"
- },
- "Verb. aus LuL gg. verbundenen Unternehmen (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3430"
- }
- },
- "7 - Verb. gg. Unternehmen, mit denen ein Beteiligungsverh. besteht": {
- "account_type": "Payable",
- "is_group": 1,
- "Verb. gg. Unternehmen, mit denen ein Beteiligungsverh. besteht": {
- "account_number": "3450"
- },
- "Verb. gg. Unternehmen, mit denen ein Beteiligungsverh. besteht (b. 1 J.)": {
- "account_number": "3451"
- },
- "Verb. gg. Unternehmen, mit denen ein Beteiligungsverh. besteht (1-5 J.)": {
- "account_number": "3455"
- },
- "Verb. gg. Unternehmen, mit denen ein Beteiligungsverh. besteht (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3460"
- },
- "Verb. aus LuL gg. Unternehmen, mit denen ein Beteiligungsverh. besteht": {
- "account_number": "3470"
- },
- "Verb. aus LuL gg. Unternehmen, mit denen ein Beteiligungsverh. besteht (b. 1 J.)": {
- "account_number": "3471"
- },
- "Verb. aus LuL gg. Unternehmen, mit denen ein Beteiligungsverh. besteht (1-5 J.)": {
- "account_number": "3475"
- },
- "Verb. aus LuL gg. Unternehmen, mit denen ein Beteiligungsverh. besteht (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3480"
- }
- },
- "8 - sonstige Verb.": {
- "account_type": "Payable",
- "is_group": 1,
- "davon aus Steuern": {
- "account_type": "Payable",
- "is_group": 1,
- "Verb. aus Steuern und Abgaben": {
- "account_number": "3700",
- "account_type": "Payable"
- },
- "Verb. aus Steuern und Abgaben (b. 1 J.)": {
- "account_number": "3701"
- },
- "Verb. aus Steuern und Abgaben (1-5 J.)": {
- "account_number": "3710"
- },
- "Verb. aus Steuern und Abgaben (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3715"
- },
- "Verb. aus Lohn- und Kirchensteuer": {
- "account_number": "3730"
- },
- "Verb. aus Einbehaltungen (KapESt und Solz auf KapESt) f. offene Aussch\u00fcttungen": {
- "account_number": "3760"
- },
- "Verb. f. Verbrauchsteuern": {
- "account_number": "3761"
- }
- },
- "Gewinnverf\u00fcgungskonto stille Gesellschafter": {
- "account_number": "3620"
- },
- "Sonstige Verrechnungskonten (Interimskonten)": {
- "account_number": "3630"
- },
- "Kreditkartenabrechnung": {
- "account_number": "3610"
- },
- "Verb. gg. Arbeitsgemeinschaften": {
- "account_number": "3611"
- },
- "Bewertungskorrektur zu sonstigen Verb.": {
- "account_number": "9961"
- },
- "Verb. gg. stillen Gesellschaftern": {
- "account_number": "3655"
- },
- "Verb. gg. stillen Gesellschaftern (b. 1 J.)": {
- "account_number": "3656"
- },
- "Verb. gg. stillen Gesellschaftern (1-5 J.)": {
- "account_number": "3657"
- },
- "Verb. gg. stillen Gesellschaftern (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3658"
- },
- "davon i. R. d. sozialen Sicherheit": {
- "account_type": "Payable",
- "is_group": 1,
- "Verb. i. R. d. sozialen Sicherheit": {
- "account_number": "3740"
- },
- "Verb. i. R. d. sozialen Sicherheit (b. 1 J.)": {
- "account_number": "3741"
- },
- "Verb. i. R. d. sozialen Sicherheit (1-5 J.)": {
- "account_number": "3750"
- },
- "Verb. i. R. d. sozialen Sicherheit (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3755"
- },
- "Voraussichtliche Beitragsschuld gg. den Sozialversicherungstr\u00e4gern": {
- "account_number": "3759"
- }
- },
- "Verb. aus Lohn und Gehalt (Gruppe)": {
- "is_group": 1,
- "Verb. aus Lohn und Gehalt": {
- "account_number": "3720"
- },
- "Verb. f. Einbehaltungen von Arbeitnehmern": {
- "account_number": "3725"
- },
- "Verb. an das Finanzamt aus abzuf\u00fchrendem Bauabzugsbetrag": {
- "account_number": "3726"
- }
- },
- "Verb. aus Verm\u00f6gensbildung": {
- "account_number": "3770"
- },
- "Verb. aus Verm\u00f6gensbildung (b. 1 J.)": {
- "account_number": "3771"
- },
- "Verb. aus Verm\u00f6gensbildung (1-5 J.)": {
- "account_number": "3780"
- },
- "Verb. aus Verm\u00f6gensbildung (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3785"
- },
- "Ausgegebene Geschenkgutscheine": {
- "account_number": "3786"
- },
- "Sonstige Verb.": {
- "account_number": "3500",
- "account_type": "Payable"
- },
- "Sonstige Verb. (b. 1 J.)": {
- "account_number": "3501"
- },
- "Sonstige Verb. (1-5 J.)": {
- "account_number": "3504"
- },
- "Sonstige Verb. (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3507"
- },
- "Darlehen typisch stiller Gesellschafter (Gruppe)": {
- "is_group": 1,
- "Darlehen typisch stiller Gesellschafter": {
- "account_number": "3520"
- },
- "Darlehen typisch stiller Gesellschafter (b. 1 J.)": {
- "account_number": "3521"
- },
- "Darlehen typisch stiller Gesellschafter (1-5 J.)": {
- "account_number": "3524"
- },
- "Darlehen typisch stiller Gesellschafter (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3527"
- }
- },
- "Darlehen atypisch stiller Gesellschafter (Gruppe)": {
- "is_group": 1,
- "Darlehen atypisch stiller Gesellschafter": {
- "account_number": "3530"
- },
- "Darlehen atypisch stiller Gesellschafter (b. 1 J.)": {
- "account_number": "3531"
- },
- "Darlehen atypisch stiller Gesellschafter (1-5 J.)": {
- "account_number": "3534"
- },
- "Darlehen atypisch stiller Gesellschafter (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3537"
- }
- },
- "Partiarische Darlehen (Gruppe)": {
- "is_group": 1,
- "Partiarische Darlehen": {
- "account_number": "3540"
- },
- "Partiarische Darlehen (b. 1 J.)": {
- "account_number": "3541"
- },
- "Partiarische Darlehen (1-5 J.)": {
- "account_number": "3544"
- },
- "Partiarische Darlehen (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3547"
- }
- },
- "Erhaltene Kautionen (Gruppe)": {
- "is_group": 1,
- "Erhaltene Kautionen": {
- "account_number": "3550"
- },
- "Erhaltene Kautionen (b. 1 J.)": {
- "account_number": "3551"
- },
- "Erhaltene Kautionen (1-5 J.)": {
- "account_number": "3554"
- },
- "Erhaltene Kautionen (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3557"
- }
- },
- "Darlehen (1-5 J.)": {
- "account_number": "3564"
- },
- "Darlehen (gr\u00f6\u00dfer 5 J.)": {
- "account_number": "3567"
- },
- "Lohn- und Gehaltsverrechnungskonto": {
- "account_number": "3790"
- },
- "Umsatzsteuer (Gruppe)": {
- "account_type": "Tax",
- "is_group": 1,
- "Umsatzsteuer": {
- "account_number": "3800",
- "account_type": "Tax"
- },
- "Umsatzsteuer 7 %": {
- "account_number": "3801",
- "account_type": "Tax",
- "tax_rate": 7.0
- },
- "Umsatzsteuer aus innergem. Erwerb": {
- "account_number": "3802"
- },
- "Umsatzsteuer aus innergem. Erwerb 19 %": {
- "account_number": "3804",
- "account_type": "Tax",
- "tax_rate": 19.0
- },
- "Umsatzsteuer 19 %": {
- "account_number": "3806",
- "account_type": "Tax",
- "tax_rate": 19.0
- },
- "Umsatzsteuer aus im Inland steuerpfl. EU-Lieferungen": {
- "account_number": "3807"
- },
- "Umsatzsteuer aus im Inland steuerpfl. EU-Lieferungen 19 %": {
- "account_number": "3808"
- },
- "Umsatzsteuer aus innergem. Erwerb ohne Vorsteuerabzug": {
- "account_number": "3809"
- },
- "Umsatzsteuer nicht f\u00e4llig (Gruppe)": {
- "is_group": 1,
- "Umsatzsteuer nicht f\u00e4llig": {
- "account_number": "3810"
- },
- "Umsatzsteuer nicht f\u00e4llig 7 %": {
- "account_number": "3811"
- },
- "Umsatzsteuer nicht f\u00e4llig aus im Inland steuerpfl. EU-Lieferungen": {
- "account_number": "3812"
- },
- "Umsatzsteuer nicht f\u00e4llig aus im Inland steuerpfl. EU-Lieferungen 19 %": {
- "account_number": "3814"
- },
- "Umsatzsteuer nicht f\u00e4llig 19 %": {
- "account_number": "3816"
- },
- "Umsatzsteuer aus im anderen EU-Land steuerpfl. Lieferungen": {
- "account_number": "3817"
- },
- "Umsatzsteuer aus im anderen EU-Land steuerpfl. sonstigen Leistungen/Werklieferungen": {
- "account_number": "3818"
- },
- "Umsatzsteuer aus Erwerb als letzter Abnehmer innerh. eines Dreiecksgesch.s": {
- "account_number": "3819"
- }
- },
- "Umsatzsteuer-Vorauszahlungen": {
- "account_number": "3820",
- "account_type": "Tax"
- },
- "Umsatzsteuer-Vorauszahlung 1/11": {
- "account_number": "3830"
- },
- "Nachsteuer, UStVA Kz. 65": {
- "account_number": "3832"
- },
- "Umsatzsteuer aus innergem. Erwerb von Neufahrzeugen von Lieferanten ohne Ust-ID": {
- "account_number": "3834"
- },
- "Umsatzsteuer nach \u00a7 13b UStG": {
- "account_number": "3835"
- },
- "Umsatzsteuer nach \u00a7 13b UStG 19 %": {
- "account_number": "3837"
- },
- "Umsatzsteuer aus der Auslagerung von Gegenst\u00e4nden aus einem Umsatzsteuerlager": {
- "account_number": "3839"
- },
- "Einfuhrumsatzsteuer aufgeschoben bis": {
- "account_number": "3850"
- },
- "In Rechnung unrichtig oder unberechtigtausgewiesene Steuerbetr\u00e4ge, UStVA Kz. 69": {
- "account_number": "3852"
- },
- "Steuerzahlungen an andere L\u00e4nder": {
- "account_number": "3854"
- }
- }
- },
- "is_group": 1
- },
- "E - Passive latente Steuern": {
- "is_group": 1,
- "Passive latente Steuern": {
- "account_number": "3065"
- }
- },
- "D - Rechnungsabgrenzungsposten": {
- "is_group": 1,
- "Passive Rechnungsabgrenzung": {
- "account_number": "3900"
- }
- },
- "is_group": 1
- },
- "Passiva - Eigenkapital": {
- "root_type": "Equity",
- "A - Eigenkapital": {
- "account_type": "Equity",
- "is_group": 1,
- "I - Gezeichnetes Kapital": {
- "account_type": "Equity",
- "is_group": 1,
- "Gezeichnetes Kapital": {
- "account_number": "2900",
- "account_type": "Equity"
- },
- "Gesch\u00e4ftsguthaben der verbleibenden Mitglieder": {
- "account_number": "2901"
- },
- "Gesch\u00e4ftsguthaben der ausscheidenden Mitglieder": {
- "account_number": "2902"
- },
- "Gesch\u00e4ftsguthaben aus gek\u00fcndigten Gesch\u00e4ftsanteilen": {
- "account_number": "2903"
- },
- "R\u00fcckst\u00e4ndige f\u00e4llige Einzahlungen auf Gesch\u00e4ftsanteile, vermerkt": {
- "account_number": "2906"
- },
- "Gegenkonto R\u00fcckst\u00e4ndige f\u00e4llige Einzahlungen auf Gesch\u00e4ftsanteile, vermerkt": {
- "account_number": "2907"
- },
- "Kapitalerh\u00f6hung aus Gesellschaftsmitteln": {
- "account_number": "2908"
- },
- "Ausstehende Einlagen auf das gezeichnete Kapital, nicht eingefordert": {
- "account_number": "2910"
- }
- },
- "II - Kapitalr\u00fccklage": {
- "account_type": "Equity",
- "is_group": 1,
- "Kapitalr\u00fccklage": {
- "account_number": "2920"
- },
- "Kapitalr\u00fccklage durch Ausgabe von Anteilen \u00fcber Nennbetrag": {
- "account_number": "2925"
- },
- "Kapitalr\u00fccklage durch Ausgabe von Schuldverschreibungen": {
- "account_number": "2926"
- },
- "Kapitalr\u00fccklage durch Zuzahlungen gegen Gew\u00e4hrung eines Vorzugs": {
- "account_number": "2927"
- },
- "Kapitalr\u00fccklage durch Zuzahlungen in das Eigenkapital": {
- "account_number": "2928"
- },
- "Nachschusskapital (Gegenkonto 1299)": {
- "account_number": "2929"
- }
- },
- "III - Gewinnr\u00fccklagen": {
- "account_type": "Equity",
- "1 - gesetzliche R\u00fccklage": {
- "account_type": "Equity",
- "is_group": 1,
- "Gesetzliche R\u00fccklage": {
- "account_number": "2930"
- }
- },
- "2 - R\u00fccklage f. Anteile an einem herrschenden oder mehrheitlich beteiligten Unternehmen": {
- "account_type": "Equity",
- "is_group": 1,
- "R\u00fccklage f. Anteile an einem herrschenden oder mehrheitlich beteiligten Unternehmen": {
- "account_number": "2935"
- }
- },
- "3 - satzungsm\u00e4\u00dfige R\u00fccklagen": {
- "account_type": "Equity",
- "is_group": 1,
- "Satzungsm\u00e4\u00dfige R\u00fccklagen": {
- "account_number": "2950"
- }
- },
- "4 - andere Gewinnr\u00fccklagen": {
- "account_type": "Equity",
- "is_group": 1,
- "Andere Gewinnr\u00fccklagen": {
- "account_number": "2960"
- },
- "Andere Gewinnr\u00fccklagen aus dem Erwerb eigener Anteile": {
- "account_number": "2961"
- },
- "Eigenkapitalanteil von Wertaufholungen": {
- "account_number": "2962"
- },
- "Gewinnr\u00fccklagen aus den \u00dcbergangsvorschriften BilMoG": {
- "is_group": 1,
- "Gewinnr\u00fccklagen (BilMoG)": {
- "account_number": "2963"
- },
- "Gewinnr\u00fccklagen aus Zuschreibung Sachanlageverm\u00f6gen (BilMoG)": {
- "account_number": "2964"
- },
- "Gewinnr\u00fccklagen aus Zuschreibung Finanzanlageverm\u00f6gen (BilMoG)": {
- "account_number": "2965"
- },
- "Gewinnr\u00fccklagen aus Aufl\u00f6sung der Sonderposten mit R\u00fccklageanteil (BilMoG)": {
- "account_number": "2966"
- }
- },
- "Latente Steuern (Gewinnr\u00fccklage Haben) aus erfolgsneutralen Verrechnungen": {
- "account_number": "2967"
- },
- "Latente Steuern (Gewinnr\u00fccklage Soll) aus erfolgsneutralen Verrechnungen": {
- "account_number": "2968"
- },
- "Rechnungsabgrenzungsposten (Gewinnr\u00fccklage Soll) aus erfolgsneutralen Verrechnungen": {
- "account_number": "2969"
- }
- },
- "is_group": 1
- },
- "IV - Gewinnvortrag/Verlustvortrag": {
- "account_type": "Equity",
- "is_group": 1,
- "Gewinnvortrag vor Verwendung": {
- "account_number": "2970"
- },
- "Verlustvortrag vor Verwendung": {
- "account_number": "2978"
- }
- },
- "V - Jahres\u00fcberschu\u00df/Jahresfehlbetrag": {
- "account_type": "Equity",
- "is_group": 1
- },
- "Einlagen stiller Gesellschafter": {
- "account_number": "9295"
- }
- }
- },
- "1 - Umsatzerl\u00f6se": {
- "root_type": "Income",
- "is_group": 1,
- "Steuerfreie Ums\u00e4tze \u00a7 4 Nr. 8 ff UStG (Gruppe)": {
- "is_group": 1,
- "Steuerfreie Ums\u00e4tze \u00a7 4 Nr. 8 ff UStG": {
- "account_number": "4100"
- },
- "Steuerfreie Ums\u00e4tze nach \u00a7 4 Nr. 12 UStG (Vermietung und Verpachtung)": {
- "account_number": "4105"
- },
- "Sonstige steuerfreie Ums\u00e4tze Inland": {
- "account_number": "4110"
- },
- "Steuerfreie Ums\u00e4tze \u00a7 4 Nr. 1a UStG (Gruppe)": {
- "is_group": 1,
- "Steuerfreie Ums\u00e4tze \u00a7 4 Nr. 1a UStG": {
- "account_number": "4120"
- },
- "Steuerfreie Innergemeinschaftliche Lieferungen \u00a7 4 Nr. 1b UStG": {
- "account_number": "4125"
- }
- },
- "Lieferungen des ersten Abnehmers bei innergem. Dreiecksgesch.en \u00a7 25b Abs. 2 UStG (Gruppe)": {
- "is_group": 1,
- "Lieferungen des ersten Abnehmers bei innergem. Dreiecksgesch.en \u00a7 25b Abs. 2 UStG": {
- "account_number": "4130"
- },
- "Steuerfreie innergem. Lieferungen von Neufahrzeugen an Abnehmer ohne Ust-ID": {
- "account_number": "4135"
- },
- "Umsatzerl\u00f6se nach \u00a7\u00a7 25 und 25a UStG 19% USt": {
- "account_number": "4136"
- },
- "Umsatzerl\u00f6se nach \u00a7\u00a7 25 und 25a UStG ohne USt": {
- "account_number": "4138"
- },
- "Umsatzerl\u00f6se aus Reiseleistungen \u00a7 25 Abs. 2 UStG, steuerfrei": {
- "account_number": "4139"
- }
- },
- "Steuerfreie Ums\u00e4tze Offshore usw.": {
- "account_number": "4140"
- },
- "Sonstige steuerfreie Ums\u00e4tze (z. B. \u00a7 4 Nr. 2-7 UStG)": {
- "account_number": "4150"
- },
- "Steuerfreie Ums\u00e4tze ohne Vorsteuerabzug zum Gesamtumsatz geh\u00f6rend": {
- "account_number": "4160"
- },
- "Erl\u00f6se, die mit den Durchschnittss\u00e4tzen des \u00a7 24 UStG versteuert werden": {
- "account_number": "4180"
- },
- "Erl\u00f6se aus Kleinunternehmer i. S. d. \u00a7 19 Abs. 1 UStG": {
- "account_number": "4185",
- "account_type": "Income Account"
- },
- "Erl\u00f6se aus Geldspielautomaten 19 % USt": {
- "account_number": "4186"
- }
- },
- "Erl\u00f6se": {
- "account_number": "4200",
- "account_type": "Income Account"
- },
- "Erl\u00f6se 7 % USt": {
- "account_number": "4300",
- "account_type": "Income Account"
- },
- "Erl\u00f6se 16 % USt": {
- "account_number": "4340",
- "account_type": "Income Account"
- },
- "Erl\u00f6se 19 % USt": {
- "account_number": "4400",
- "account_type": "Income Account"
- },
- "Erl\u00f6se aus im Inland steuerpfl. EU-Lieferungen 7 % USt": {
- "account_number": "4310"
- },
- "Erl\u00f6se aus im Inland steuerpfl. EU-Lieferungen 19 % USt": {
- "account_number": "4315"
- },
- "Erl\u00f6se aus im anderen EU-Land steuerpfl. Lieferungen": {
- "account_number": "4320"
- },
- "Erl\u00f6se aus im Inland steuerpfl. EU-Lieferungen 16 % USt": {
- "account_number": "4330"
- },
- "Erl\u00f6se aus Lieferungen von Mobilfunkger./Schaltkr., f. die der Leistungsempf. die Ust. schuldet": {
- "account_number": "4335"
- },
- "Erl\u00f6se aus im anderen EU-Land steuerpfl. sonst. Leistungen, f. die der Leistungsempf. die Ust. schuldet": {
- "account_number": "4336"
- },
- "Erl\u00f6se aus Leistungen, f. die der Leistungsempf. die Ust. nach \u00a7 13b UStG schuldet": {
- "account_number": "4337"
- },
- "Erl\u00f6se aus im Drittland steuerbaren Leistungen, im Inland nicht steuerbare Ums\u00e4tze": {
- "account_number": "4338"
- },
- "Erl\u00f6se aus im anderen EU-Land steuerbaren Leistungen, im Inland nicht steuerbare Ums\u00e4tze": {
- "account_number": "4339"
- },
- "Grundst\u00fccksertr\u00e4ge (Gruppe)": {
- "is_group": 1,
- "Grundst\u00fccksertr\u00e4ge": {
- "account_number": "4860"
- },
- "Erl\u00f6se aus Vermietung und Verpachtung, umsatzsteuerfrei \u00a7 4 Nr. 12 UStG": {
- "account_number": "4861"
- },
- "Erl\u00f6se aus Vermietung und Verpachtung 19% USt": {
- "account_number": "4862"
- }
- },
- "Sonstige Ertr\u00e4ge aus Provisionen, Lizenzen und Patenten (Gruppe)": {
- "is_group": 1,
- "Sonstige Ertr\u00e4ge aus Provisionen, Lizenzen und Patenten": {
- "account_number": "4570"
- },
- "Sonstige Ertr\u00e4ge aus Provisionen, Lizenzen und Patenten, steuerfrei \u00a7 4 Nr. 8ff UStG": {
- "account_number": "4574"
- },
- "Sonstige Ertr\u00e4ge aus Provisionen, Lizenzen und Patenten, steuerfrei \u00a7 4 Nr. 5 UStG": {
- "account_number": "4575"
- },
- "Sonstige Ertr\u00e4ge aus Provisionen, Lizenzen und Patenten 7% USt": {
- "account_number": "4576"
- },
- "Sonstige Ertr\u00e4ge aus Provisionen, Lizenzen und Patenten 19% USt": {
- "account_number": "4579"
- }
- },
- "Provisionsums\u00e4tze (Gruppe)": {
- "is_group": 1,
- "Provisionsums\u00e4tze": {
- "account_number": "4560"
- },
- "Provisionsums\u00e4tze, steuerfrei \u00a7 4Nr. 8ff UStG": {
- "account_number": "4564"
- },
- "Provisionsums\u00e4tze, steuerfrei \u00a7 4 Nr. 5 UStG": {
- "account_number": "4565"
- },
- "Provisionsums\u00e4tze 7% USt": {
- "account_number": "4566"
- },
- "Provisionsums\u00e4tze 19 % Ust": {
- "account_number": "4569"
- }
- },
- "Erl\u00f6se Abfallverwertung": {
- "account_number": "4510"
- },
- "Erl\u00f6se Leergut": {
- "account_number": "4520"
- }
- },
- "2 - Herstellungskosten der zur Erzielung der Umsatzerl\u00f6se erbrachten Leistungen": {
- "root_type": "Expense",
- "is_group": 1,
- "Herstellungskosten": {
- "account_number": "6990",
- "account_type": "Cost of Goods Sold"
- },
- "Herstellungskosten: Schwund": {
- "account_type": "Stock Adjustment"
- },
- "Aufwendungen f. Roh-, Hilfs- und Betriebsstoffe und f. bezogene Waren": {
- "account_number": "5000",
- "account_type": "Expense Account"
- },
- "Einkauf Roh-, Hilfs- und Betriebsstoffe (Gruppe)": {
- "is_group": 1,
- "Einkauf Roh-, Hilfs- und Betriebsstoffe": {
- "account_number": "5100",
- "account_type": "Expense Account"
- },
- "Einkauf Roh-, Hilfs- und Betriebsstoffe 7% Vorsteuer": {
- "account_number": "5110"
- },
- "Einkauf Roh-, Hilfs- und Betriebsstoffe 19% Vorsteuer": {
- "account_number": "5130"
- },
- "Einkauf Roh-, Hilfs- und Betriebsstoffe, innergem. Erwerb 7% Vorst. u. 7% Ust.": {
- "account_number": "5160"
- },
- "Einkauf Roh-, Hilfs- und Betriebsstoffe, innergem. Erwerb 19% Vorst. u. 19% Ust.": {
- "account_number": "5162"
- },
- "Einkauf Roh-, Hilfs- und Betriebsstoffe, innergem. Erwerb ohne Vorsteuer und 7% Umsatzsteuer": {
- "account_number": "5166"
- },
- "Einkauf Roh-, Hilfs- und Betriebsstoffe, innergem. Erwerb ohne Vorsteuer und 19% Umsatzsteuer": {
- "account_number": "5167"
- },
- "Einkauf Roh-, Hilfs- und Betriebsstoffe 5,5% Vorsteuer": {
- "account_number": "5170"
- },
- "Einkauf Roh-, Hilfs- und Betriebsstoffe 10,7% Vorsteuer": {
- "account_number": "5171"
- },
- "Einkauf Roh-, Hilfs- und Betriebsstoffe aus einem USt-Lager \u00a7 13a UStG 7% Vorst. und 7% Ust.": {
- "account_number": "5175"
- },
- "Einkauf Roh-, Hilfs- und Betriebsstoffe aus einem USt-Lager \u00a7 13a UStG 19% Vorst. und 19% Ust.": {
- "account_number": "5176"
- },
- "Erwerb Roh-, Hilfs- und Betriebsstoffe als letzter Abnehmer innerh. Dreiecksgesch. 19% Vorst. und 19% Ust.": {
- "account_number": "5189"
- },
- "Energiestoffe (Fertigung) (Gruppe)": {
- "is_group": 1,
- "Energiestoffe (Fertigung)": {
- "account_number": "5190"
- },
- "Energiestoffe (Fertigung) 7% Vorsteuer": {
- "account_number": "5191"
- },
- "Energiestoffe (Fertigung) 19% Vorsteuer": {
- "account_number": "5192"
- }
- }
- },
- "Wareneingang (Gruppe)": {
- "is_group": 1,
- "Wareneingang": {
- "account_number": "5200"
- },
- "Wareneingang 7 % Vorsteuer": {
- "account_number": "5300"
- },
- "Wareneingang 19 % Vorsteuer": {
- "account_number": "5400"
- },
- "Wareneingang 5,5 % Vorsteuer": {
- "account_number": "5505"
- },
- "Wareneingang 10,7 % Vorsteuer": {
- "account_number": "5540"
- },
- "Steuerfreier innergem. Erwerb": {
- "account_number": "5550"
- },
- "Wareneingang im Drittland steuerbar": {
- "account_number": "5551"
- },
- "Erwerb 1. Abnehmer innerh. eines Dreieckgesch\u00e4ftes": {
- "account_number": "5552"
- },
- "Erwerb Waren als letzter Abnehmer innerh. Dreiecksgesch. 19% Vorst. u. 19% Ust.": {
- "account_number": "5553"
- },
- "Wareneingang im anderen EU-Land steuerbar": {
- "account_number": "5558"
- },
- "Steuerfreie Einfuhren": {
- "account_number": "5559"
- },
- "Waren aus einem Umsatzsteuerlager, \u00a7 13a UStG 7% Vorst. u. 7% Ust.": {
- "account_number": "5560"
- },
- "Waren aus einem Umsatzsteuerlager, \u00a7 13a UStG 19% Vorst. u. 19% Ust.": {
- "account_number": "5565"
- }
- },
- "innergem. Erwerb 7% Vorst. u. 7% Ust.": {
- "account_number": "5420"
- },
- "innergem. Erwerb 19 % Vorsteuer 19 % Umsatzsteuer": {
- "account_number": "5425"
- },
- "innergem. Erwerb ohne Vorst. und 7% Ust.": {
- "account_number": "5430"
- },
- "innergem. Erwerb ohne Vorsteuer und 19 % Umsatzsteuer": {
- "account_number": "5435"
- },
- "innergem. Erwerb von Neufahrzeugen von Lieferanten ohne Ust-ID 19 % Vorst. und 19 % Ust.": {
- "account_number": "5440"
- },
- "Nicht abziehbare Vorsteuer (Gruppe)": {
- "is_group": 1,
- "Nicht abziehbare Vorsteuer": {
- "account_number": "5600"
- },
- "Nicht abziehbare Vorsteuer 7 % (Gruppe)": {
- "is_group": 1,
- "Nicht abziehbare Vorsteuer 7 %": {
- "account_number": "5610"
- }
- },
- "Nicht abziehbare Vorsteuer 19 % (Gruppe)": {
- "is_group": 1,
- "Nicht abziehbare Vorsteuer 19 %": {
- "account_number": "5660"
- }
- }
- },
- "Nachl\u00e4sse (Gruppe)": {
- "is_group": 1,
- "Nachl\u00e4sse": {
- "account_number": "5700"
- },
- "Nachl\u00e4sse aus Einkauf Roh-, Hilfs- und Betriebsstoffe": {
- "account_number": "5701"
- },
- "Nachl\u00e4sse 7 % Vorsteuer": {
- "account_number": "5710"
- },
- "Nachl\u00e4sse aus Einkauf Roh-, Hilfs- und Betriebsstoffe 7% Vorsteuer": {
- "account_number": "5714"
- },
- "Nachl\u00e4sse aus Einkauf Roh-, Hilfs- und Betriebsstoffe 19% Vorsteuer": {
- "account_number": "5715"
- },
- "Nachl\u00e4sse aus Einkauf Roh-, Hilfs- und Betriebsstoffe, innergem. Erwerb 7% Vorst. u. 7% Ust.": {
- "account_number": "5717"
- },
- "Nachl\u00e4sse aus Einkauf Roh-, Hilfs- und Betriebsstoffe, innergem. Erwerb 19% Vorst. u. 19% Ust.": {
- "account_number": "5718"
- },
- "Nachl\u00e4sse 19 % Vorsteuer": {
- "account_number": "5720"
- },
- "Nachl\u00e4sse 16 % Vorsteuer": {
- "account_number": "5722"
- },
- "Nachl\u00e4sse 15 % Vorsteuer": {
- "account_number": "5723"
- },
- "Nachl\u00e4sse aus innergem. Erwerb 7% Vorst. u. 7% Ust.": {
- "account_number": "5724"
- },
- "Nachl\u00e4sse aus innergem. Erwerb 19% Vorst. u. 19% Ust.": {
- "account_number": "5725"
- },
- "Nachl\u00e4sse aus innergem. Erwerb 16 % Vorsteuer und 16 % Umsatzsteuer": {
- "account_number": "5726"
- },
- "Nachl\u00e4sse aus innergem. Erwerb 15 % Vorsteuer und 15 % Umsatzsteuer": {
- "account_number": "5727"
- }
- },
- "Erhaltene Skonti (Gruppe)": {
- "is_group": 1,
- "Erh. Skonti": {
- "account_number": "5730"
- },
- "Erh. Skonti 7 % Vorsteuer": {
- "account_number": "5731"
- },
- "Erh. Skonti aus Einkauf Roh-, Hilfs- und Betriebsstoffe": {
- "account_number": "5733"
- },
- "Erh. Skonti aus Einkauf Roh-, Hilfs- und Betriebsstoffe 7% Vorsteuer": {
- "account_number": "5734"
- },
- "Erh. Skonti 19 % Vorsteuer": {
- "account_number": "5736"
- },
- "Erh. Skonti aus Einkauf Roh-, Hilfs- und Betriebsstoffe 19% Vorsteuer": {
- "account_number": "5738"
- },
- "Erh. Skonti aus Einkauf Roh-, Hilfs- und Betriebsstoffe aus steuerpfl. innergem. Erwerb 19% Vorst. u. 19% Ust.": {
- "account_number": "5741"
- },
- "Erh. Skonti aus Einkauf Roh-, Hilfs- und Betriebsstoffe aus steuerpfl. innergem. Erwerb 7% Vorst. u. 7% Ust.": {
- "account_number": "5743"
- },
- "Erh. Skonti aus steuerpflichtigem innergem. Erwerb": {
- "account_number": "5745"
- },
- "Erh. Skonti aus steuerpflichtigem innergem. Erwerb 7% Vorst. u. 7% Ust.": {
- "account_number": "5746"
- },
- "Erh. Skonti aus steuerpflichtigem innergem. Erwerb 19% Vorst. u. 19% Ust.": {
- "account_number": "5748"
- },
- "Erh. Skonti aus Erwerb Roh-,Hilfs-,Betriebsstoff letzter Abn.innerh.Dreiecksg. 19% Vorst. und 19% Ust.": {
- "account_number": "5792"
- },
- "Erh. Skonti aus Erwerb Waren als letzter Abnehmer innerh. Dreiecksgesch. 19% Vorst. u. 19% Ust.": {
- "account_number": "5793"
- }
- },
- "Bezugsnebenkosten (Gruppe)": {
- "is_group": 1,
- "Bezugsnebenkosten": {
- "account_number": "5800"
- },
- "Leergut": {
- "account_number": "5820"
- },
- "Z\u00f6lle und Einfuhrabgaben": {
- "account_number": "5840"
- },
- "Verrechnete Stoffkosten (Gegenkonto 5000-99) oder (4000-99)": {
- "account_number": "5860"
- }
- },
- "Fremdleistungen (Gruppe)": {
- "is_group": 1,
- "Fremdleistungen": {
- "account_number": "5900",
- "account_type": "Expense Account"
- },
- "Fremdleistungen 19% Vorsteuer": {
- "account_number": "5906"
- },
- "Fremdleistungen ohne Vorsteuer": {
- "account_number": "5909"
- },
- "Bauleistungen eines im Inland ans\u00e4ssigen Unternehmers 7% Vorst. u. 7% Ust.": {
- "account_number": "5910"
- },
- "Sonstige Leistungen eines im anderen EU-Land ans\u00e4ssigen Unternehmers 7% Vorst. u. 7% Ust.": {
- "account_number": "5913"
- },
- "Leistungen eines im Ausland ans\u00e4ssigen Unternehmers 7% Vorst. u. 7% Ust.": {
- "account_number": "5915"
- },
- "Bauleistungen eines im Inland ans\u00e4ssigen Unternehmers 19% Vorst. u. 19% Ust.": {
- "account_number": "5920"
- },
- "Sonstige Leistungen eines im anderen EU-Land ans\u00e4ssigen Unternehmers 19% Vorst. u. 19% Ust.": {
- "account_number": "5923"
- },
- "Leistungen eines im Ausland ans\u00e4ssigen Unternehmers 19% Vorst. u. 19% Ust.": {
- "account_number": "5925"
- },
- "Bauleistungen eines im Inland ans\u00e4ssigen Unternehmers ohne Vorst. und 7% Ust.": {
- "account_number": "5930"
- },
- "Sonstige Leistungen eines im anderen EU-Land ans\u00e4ssigen Unternehmers ohne Vorst. und 7% Ust.": {
- "account_number": "5933"
- },
- "Leistungen eines im Ausland ans\u00e4ssigen Unternehmers ohne Vorst. und 7% Ust.": {
- "account_number": "5935"
- },
- "Bauleistungen eines im Inland ans\u00e4ssigen Unternehmers ohne Vorsteuer und 19 % Umsatzsteuer": {
- "account_number": "5940"
- },
- "Sonstige Leistungen eines im anderen EU-Land ans\u00e4ssigen Unternehmers ohne Vorsteuer und 19 % Umsatzsteuer": {
- "account_number": "5943"
- },
- "Leistungen eines im Ausland ans\u00e4ssigen Unternehmers ohne Vorsteuer und 19 % Umsatzsteuer": {
- "account_number": "5945"
- },
- "Erhaltene Skonti aus Leistungen, f. die als Leistungsempf. die Steuer geschuldet wird (Gruppe)": {
- "is_group": 1,
- "Erh. Skonti aus Leistungen, f. die als Leistungsempf. die Steuer nach \u00a7 13b UStG geschuldet wird": {
- "account_number": "5950"
- },
- "Erh. Skonti aus Leistungen,f. die als Leistungsempf. die Steuer geschuldet wird 19 % Vorst. und 19 % Ust.": {
- "account_number": "5951"
- },
- "Erh. Skonti aus Leistungen, f. die als Leistungsempf. die Steuer geschuldet wird ohne Vorst. aber mit Uts.": {
- "account_number": "5953"
- },
- "Erh. Skonti aus Leistungen, f. die als Leistungsempf. die Steuer geschuldet wird ohne Vorst., mit 19 % Ust.": {
- "account_number": "5954"
- }
- },
- "Leistungen nach \u00a7 13b UStG mit Vorsteuerabzug": {
- "account_number": "5960"
- },
- "Leistungen nach \u00a7 13b UStG ohne Vorsteuerabzug": {
- "account_number": "5965"
- }
- },
- "L\u00f6hne und Geh\u00e4lter (Gruppe)": {
- "is_group": 1,
- "L\u00f6hne und Geh\u00e4lter": {
- "account_number": "6000",
- "account_type": "Expense Account"
- },
- "L\u00f6hne": {
- "account_number": "6010"
- },
- "Geh\u00e4lter": {
- "account_number": "6020"
- },
- "Tantiemen": {
- "account_number": "6026"
- },
- "Aushilfsl\u00f6hne": {
- "account_number": "6030"
- },
- "L\u00f6hne f. Minijobs": {
- "account_number": "6035"
- },
- "Pauschale Steuern und Abgaben f. Sachzuwendungen und Dienstleistungen an Arbeitnehmer": {
- "account_number": "6039"
- },
- "Pauschale Steuer f. Aushilfen": {
- "account_number": "6040"
- },
- "Bedienungsgelder": {
- "account_number": "6045"
- },
- "Ehegattengehalt": {
- "account_number": "6050"
- },
- "Freiwillige soziale Aufwendungen lohnsteuerpflichtig": {
- "account_number": "6060"
- },
- "Pauschale Steuer auf sonstige Bez\u00fcge (z. B. Fahrtkostenzusch\u00fcsse)": {
- "account_number": "6069"
- },
- "Krankengeldzusch\u00fcsse": {
- "account_number": "6070"
- },
- "Sachzuwendungen und Dienstleistungen an Arbeitnehmer": {
- "account_number": "6072"
- },
- "Zusch\u00fcsse der Agenturen f. Arbeit (Haben)": {
- "account_number": "6075"
- },
- "Verm\u00f6genswirksame Leistungen": {
- "account_number": "6080"
- },
- "Fahrtkostenerstattung - Wohnung/Arbeitsst\u00e4tte": {
- "account_number": "6090"
- }
- },
- "Soziale Abgaben und Aufwendungen f. Altersvers. und f. Unterst\u00fctzung (Gruppe)": {
- "is_group": 1,
- "Soziale Abgaben und Aufwendungen f. Altersvers. und f. Unterst\u00fctzung": {
- "account_number": "6100",
- "account_type": "Expense Account"
- },
- "Gesetzliche soziale Aufwendungen": {
- "account_number": "6110",
- "account_type": "Expense Account"
- },
- "Beitr\u00e4ge zur Berufsgenossenschaft": {
- "account_number": "6120",
- "account_type": "Expense Account"
- },
- "Freiwillige soziale Aufwendungen lohnsteuerfrei": {
- "account_number": "6130"
- },
- "Aufwendungen f. Altersvers.": {
- "account_number": "6150"
- },
- "Aufwendungen f. Unterst\u00fctzung": {
- "account_number": "6160"
- },
- "Sonstige soziale Abgaben": {
- "account_number": "6170"
- }
- },
- "Abschreibungen auf Sachanlagen (Gruppe)": {
- "is_group": 1,
- "Abschreibungen auf Sachanlagen (ohne AfA auf Kfz und Geb\u00e4ude)": {
- "account_number": "6220",
- "account_type": "Depreciation"
- },
- "Abschreibungen auf Geb\u00e4ude": {
- "account_number": "6221",
- "account_type": "Depreciation"
- },
- "Abschreibungen auf Kfz": {
- "account_number": "6222",
- "account_type": "Depreciation"
- },
- "Abschreibungen auf Geb\u00e4udeanteil des h\u00e4uslichen Arbeitszimmers": {
- "account_number": "6223"
- }
- },
- "Au\u00dferplanm\u00e4\u00dfige Abschreibungen auf Sachanlagen (Gruppe)": {
- "is_group": 1,
- "Au\u00dferplanm\u00e4\u00dfige Abschreibungen auf Sachanlagen": {
- "account_number": "6230"
- },
- "Absetzung f. au\u00dfergew\u00f6hnliche technische und wirtschaftliche Abnutzung der Geb\u00e4ude": {
- "account_number": "6231"
- },
- "Absetzung f. au\u00dfergew\u00f6hnliche technische und wirtschaftliche Abnutzung des Kfz": {
- "account_number": "6232"
- },
- "Absetzung f. au\u00dfergew\u00f6hnliche technische und wirtschaftliche Abnutzung sonstiger Wirtschaftsg\u00fcter": {
- "account_number": "6233"
- }
- },
- "Abschreibungen auf Sachanlagen auf Grund steuerlicher Sondervorschriften (Gruppe)": {
- "is_group": 1,
- "Abschreibungen auf Sachanlagen auf Grund steuerlicher Sondervorschriften": {
- "account_number": "6240"
- },
- "Sonderabschreibungen nach \u00a7 7g Abs. 1 und 2 EStG a. F./\u00a7 7g Abs. 5 EStG n. F.(ohne Kfz)": {
- "account_number": "6241"
- },
- "Sonderabschreibungen nach \u00a7 7g Abs. 1 und 2 EStG a. F./\u00a7 7g Abs. 5 EStG n. F.(f. Kfz)": {
- "account_number": "6242"
- },
- "K\u00fcrzung der Anschaffungs- oder Herstellungskosten gem\u00e4\u00df \u00a7 7g Abs. 2 EStG n.F. (ohne Kfz)": {
- "account_number": "6243"
- },
- "K\u00fcrzung der Anschaffungs- oder Herstellungskosten gem\u00e4\u00df \u00a7 7g Abs. 2 EStG n.F. (f. Kfz)": {
- "account_number": "6244"
- }
- },
- "Kaufleasing": {
- "account_number": "6250"
- },
- "Sofortabschreibung geringwertiger Wirtschaftsg\u00fcter": {
- "account_number": "6260",
- "account_type": "Depreciation"
- },
- "Abschreibungen auf aktivierte, geringwertige Wirtschaftsg\u00fcter": {
- "account_number": "6262"
- },
- "Abschreibungen auf den Sammelposten Wirtschaftsg\u00fcter": {
- "account_number": "6264"
- },
- "Au\u00dferplanm\u00e4\u00dfige Abschreibungen auf aktivierte, geringwertige Wirtschaftsg\u00fcter": {
- "account_number": "6266"
- },
- "Abschreibungen auf Aufwendungen f. die Ingangsetzung und Erweiterung des Gesch\u00e4ftsbetriebs": {
- "account_number": "6268"
- },
- "Abschreibungen auf immaterielle VG (Gruppe)": {
- "is_group": 1,
- "Abschreibungen auf immaterielle VG": {
- "account_number": "6200",
- "account_type": "Depreciation"
- },
- "Abschreibungen auf selbst geschaffene immaterielle VG": {
- "account_number": "6201"
- },
- "Abschreibungen auf den Gesch\u00e4fts- oder Firmenwert": {
- "account_number": "6205"
- },
- "Au\u00dferplanm\u00e4\u00dfige Abschreibungen auf den Gesch\u00e4fts- oder Firmenwert": {
- "account_number": "6209"
- },
- "Au\u00dferplanm\u00e4\u00dfige Abschreibungen auf immaterielle VG": {
- "account_number": "6210"
- },
- "Au\u00dferplanm\u00e4\u00dfige Abschreibungen auf selbst geschaffene immaterielle VG": {
- "account_number": "6211"
- },
- "Abschreibungen auf Forderungen gg. Kapitalges., an denen eine Beteiligung besteht (soweit un\u00fcblich hoch)": {
- "account_number": "6290"
- }
- },
- "Abschreibungen auf sonstige VG des Umlaufverm. (soweit un\u00fcbliche H\u00f6he) (Gruppe)": {
- "is_group": 1,
- "Abschreibungen auf sonstige VG des Umlaufverm. (soweit un\u00fcbliche H\u00f6he)": {
- "account_number": "6270"
- },
- "Abschreibungen auf Umlaufverm\u00f6gen, steuerrechtlich bedingt (soweit un\u00fcbliche H\u00f6he)": {
- "account_number": "6272"
- },
- "Abschreibungen auf Roh-, Hilfs- und Betriebsstoffe/Waren (soweit un\u00fcblich hoch)": {
- "account_number": "6278"
- },
- "Abschreibungen auf fertige und unfertige Erzeugnisse (soweit un\u00fcblich hoch)": {
- "account_number": "6279"
- },
- "Forderungsverluste, un\u00fcblich hoch (Gruppe)": {
- "is_group": 1,
- "Forderungsverluste, un\u00fcblich hoch": {
- "account_number": "6280"
- },
- "Forderungsverluste 7% USt (soweit un\u00fcblich hoch)": {
- "account_number": "6281"
- },
- "Forderungsverluste 16% USt (soweit un\u00fcblich hoch)": {
- "account_number": "6285"
- },
- "Forderungsverluste 19% USt (soweit un\u00fcblich hoch)": {
- "account_number": "6286"
- },
- "Forderungsverluste 15% USt (soweit un\u00fcblich hoch)": {
- "account_number": "6287"
- }
- }
- }
- },
- "4 - Vertriebskosten": {
- "root_type": "Expense",
- "is_group": 1,
- "Personalaufwand (Vertrieb)": {
- "is_group": 1
- }
- },
- "5 - allgemeine Verwaltungskosten": {
- "root_type": "Expense",
- "is_group": 1,
- "Verwaltungskosten": {
- "account_number": "6992",
- "account_type": "Expenses Included In Valuation"
- },
- "Personalaufwand (Verwaltung)": {
- "is_group": 1
- }
- },
- "6 - sonstige betriebliche Ertr\u00e4ge": {
- "root_type": "Income",
- "is_group": 1,
- "Erhaltene Boni (Gruppe)": {
- "is_group": 1,
- "Erhaltene Boni 7 % Vorsteuer": {
- "account_number": "5750"
- },
- "Erhaltene Boni aus Einkauf Roh-, Hilfs- und Betriebsstoffe": {
- "account_number": "5753"
- },
- "Erhaltene Boni aus Einkauf Roh-, Hilfs- und Betriebsstoffe 7% Vorsteuer": {
- "account_number": "5754"
- },
- "Erhaltene Boni aus Einkauf Roh-, Hilfs- und Betriebsstoffe 19% Vorsteuer": {
- "account_number": "5755"
- },
- "Erhaltene Boni 19 % Vorsteuer": {
- "account_number": "5760"
- },
- "Erhaltene Boni": {
- "account_number": "5769"
- }
- },
- "Erhaltene Rabatte (Gruppe)": {
- "is_group": 1,
- "Erhaltene Rabatte": {
- "account_number": "5770"
- },
- "Erhaltene Rabatte 7 % Vorsteuer": {
- "account_number": "5780"
- },
- "Erhaltene Rabatte aus Einkauf Roh-, Hilfs- und Betriebsstoffe": {
- "account_number": "5783"
- },
- "Erhaltene Rabatte aus Einkauf Roh-, Hilfs- und Betriebsstoffe 7% Vorsteuer": {
- "account_number": "5784"
- },
- "Erhaltene Rabatte aus Einkauf Roh-, Hilfs- und Betriebsstoffe 19% Vorsteuer": {
- "account_number": "5785"
- },
- "Erhaltene Rabatte 19 % Vorsteuer": {
- "account_number": "5790"
- }
- },
- "Andere aktivierte Eigenleistungen": {
- "account_number": "4820"
- },
- "Aktivierte Eigenleistungen zur Erstellung von selbst geschaffenen immateriellen VGn": {
- "account_number": "4825"
- },
- "Sonstige betriebliche Ertr\u00e4ge": {
- "account_number": "4830"
- },
- "Sonstige betriebliche Ertr\u00e4ge von verbundenen Unternehmen": {
- "account_number": "4832"
- },
- "Andere Nebenerl\u00f6se": {
- "account_number": "4833"
- },
- "Sonstige Ertr\u00e4ge betrieblich und regelm\u00e4\u00dfig 16 % USt": {
- "account_number": "4834"
- },
- "Sonstige Ertr\u00e4ge betrieblich und regelm\u00e4\u00dfig": {
- "account_number": "4835"
- },
- "Sonstige Ertr\u00e4ge betrieblich und regelm\u00e4\u00dfig 19 % USt": {
- "account_number": "4836"
- },
- "Sonstige Ertr\u00e4ge betriebsfremd und regelm\u00e4\u00dfig": {
- "account_number": "4837"
- },
- "Erstattete Vorsteuer anderer L\u00e4nder": {
- "account_number": "4838"
- },
- "Sonstige Ertr\u00e4ge unregelm\u00e4\u00dfig": {
- "account_number": "4839"
- },
- "Ertr\u00e4ge aus Abgang von Gegenst\u00e4nden des Anlageverm\u00f6gens": {
- "account_number": "4900"
- },
- "Ertr\u00e4ge aus der Ver\u00e4u\u00dferung von Anteilen an Kap.Ges. (Finanzanlageverm., inl\u00e4nd. Kap.Ges.)": {
- "account_number": "4901"
- },
- "Ertr\u00e4ge aus Abgang von Gegenst\u00e4nden des Umlaufverm. (au\u00dfer Vorr\u00e4te)": {
- "account_number": "4905"
- },
- "Ertr\u00e4ge aus Abgang von Gegenst\u00e4nden des Umlaufverm. (au\u00dfer Vorr\u00e4te, inl\u00e4nd. Kap.Ges.)": {
- "account_number": "4906"
- },
- "Ertr\u00e4ge aus der W\u00e4hrungsumrechnung": {
- "account_number": "4840"
- },
- "Sonstige Erl\u00f6se betrieblich und regelm\u00e4\u00dfig, steuerfrei \u00a7 4 Nr. 8 ff UStG": {
- "account_number": "4841"
- },
- "Sonstige Erl\u00f6se betrieblich und regelm\u00e4\u00dfig, steuerfrei z. B. \u00a7 4 Nr. 2-7 UStG": {
- "account_number": "4842"
- },
- "Ertr\u00e4ge aus Bewertung Finanzmittelfonds": {
- "account_number": "4843"
- },
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen steuerfrei \u00a7 4 Nr. 1a UStG (bei Buchgewinn)": {
- "account_number": "4844"
- },
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen 19 % USt (bei Buchgewinn)": {
- "account_number": "4845"
- },
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen steuerfrei \u00a7 4 Nr. 1b UStG (bei Buchgewinn)": {
- "account_number": "4848"
- },
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen (bei Buchgewinn)": {
- "account_number": "4849"
- },
- "Erl\u00f6se aus Verk\u00e4ufen immaterieller VG (bei Buchgewinn)": {
- "account_number": "4850"
- },
- "Erl\u00f6se aus Verk\u00e4ufen Finanzanlagen (bei Buchgewinn)": {
- "account_number": "4851"
- },
- "Erl\u00f6se aus Verk\u00e4ufen Finanzanlagen (inl\u00e4ndische Kap.Ges., bei Buchgewinn)": {
- "account_number": "4852"
- },
- "Anlagenabg\u00e4nge Sachanlagen (Restbuchwert bei Buchvergewinn)": {
- "account_number": "4855"
- },
- "Anlagenabg\u00e4nge immaterielle VG (Restbuchwert bei Buchgewinn)": {
- "account_number": "4856"
- },
- "Anlagenabg\u00e4nge Finanzanlagen (Restbuchwert bei Buchgewinn)": {
- "account_number": "4857"
- },
- "Anlagenabg\u00e4nge Finanzanlagen (inl\u00e4ndische Kap.Ges., Restbuchwert bei Buchgewinn)": {
- "account_number": "4858"
- },
- "Ertr\u00e4ge aus Zuschreibungen des Sachanlageverm\u00f6gens": {
- "account_number": "4910",
- "account_type": "Round Off"
- },
- "Ertr\u00e4ge aus Zuschreibungen des immateriellen Anlageverm\u00f6gens": {
- "account_number": "4911"
- },
- "Ertr\u00e4ge aus Zuschreibungen des Finanzanlageverm\u00f6gens": {
- "account_number": "4912"
- },
- "Ertr\u00e4ge aus Zuschreibungen des Finanzanlageverm\u00f6gens (inl\u00e4ndische Kap.Ges.)": {
- "account_number": "4913"
- },
- "Ertr\u00e4ge aus Zuschreibungen \u00a7 3 Nr. 40 EStG/\u00a7 8b Abs. 2 KStG (inl\u00e4ndische Kap.Ges.)": {
- "account_number": "4914"
- },
- "Ertr\u00e4ge aus Zuschreibungen des Umlaufverm. au\u00dfer Vorr\u00e4te": {
- "account_number": "4915"
- },
- "Ertr\u00e4ge aus Zuschreibungen des Umlaufverm. (inl\u00e4ndische Kap.Ges.)": {
- "account_number": "4916"
- },
- "Ertr\u00e4ge aus Herabsetzung der Pauschalwertberichtigung auf Forderungen": {
- "account_number": "4920"
- },
- "Ertr\u00e4ge aus Herabsetzung der Einzelwertberichtigung auf Forderungen": {
- "account_number": "4923"
- },
- "Ertr\u00e4ge aus abgeschriebenen Forderungen": {
- "account_number": "4925"
- },
- "Ertr\u00e4ge aus der Aufl\u00f6sung einer steuerlichen R\u00fccklage nach \u00a7 6b Abs. 3 EStG": {
- "account_number": "4927"
- },
- "Ertr\u00e4ge aus der Aufl\u00f6sung einer steuerlichen R\u00fccklage nach \u00a7 6b Abs. 10 EStG": {
- "account_number": "4928"
- },
- "Ertr\u00e4ge aus der Aufl\u00f6sung der R\u00fccklage f. Ersatzbeschaffung R 6.6 EStR": {
- "account_number": "4929"
- },
- "Ertr\u00e4ge aus der Aufl\u00f6sung von R\u00fcckstellungen": {
- "account_number": "4930"
- },
- "Ertr\u00e4ge aus der Aufl\u00f6sung einer steuerlichen R\u00fccklage (Existenzgr\u00fcnderr\u00fccklage)": {
- "account_number": "4934"
- },
- "Ertr\u00e4ge aus der Aufl\u00f6sung einer steuerlichen R\u00fccklage": {
- "account_number": "4935"
- },
- "Ertr\u00e4ge aus der Aufl\u00f6sung von steuerlichen R\u00fccklagen (Ansparabschreibungen)": {
- "account_number": "4936"
- },
- "Ertr\u00e4ge aus der Aufl\u00f6sung steuerrechtlicher Sonderabschreibungen": {
- "account_number": "4937"
- },
- "Ertr\u00e4ge aus der Aufl\u00f6sung einer steuerlichen R\u00fccklage nach \u00a7 4g EStG": {
- "account_number": "4938"
- },
- "Ertr\u00e4ge aus der Aufl\u00f6sung von steuerlichen R\u00fccklagen nach \u00a7 52 Abs. 16 EStG": {
- "account_number": "4939"
- },
- "Verrechnete sonstige Sachbez\u00fcge (Gruppe)": {
- "is_group": 1,
- "Verrechnete sonstige Sachbez\u00fcge (keine Waren)": {
- "account_number": "4940"
- },
- "Sachbez\u00fcge 7 % USt (Waren)": {
- "account_number": "4941"
- },
- "Sachbez\u00fcge 19 % USt (Waren)": {
- "account_number": "4945"
- },
- "Verrechnete sonstige Sachbez\u00fcge": {
- "account_number": "4946"
- },
- "Verrechnete sonstige Sachbez\u00fcge aus Kfz-Gestellung 19% USt": {
- "account_number": "4947"
- },
- "Verrechnete sonstige Sachbez\u00fcge 19% USt": {
- "account_number": "4948"
- },
- "Verrechnete sonstige Sachbez\u00fcge ohne Umsatzsteuer": {
- "account_number": "4949"
- }
- },
- "Periodenfremde Ertr\u00e4ge (soweit nicht au\u00dferordentlich)": {
- "account_number": "4960"
- },
- "Versicherungsentsch\u00e4digungen und Schadenersatzleistungen": {
- "account_number": "4970"
- },
- "Erstattungen Aufwendungsausgleichsgesetz": {
- "account_number": "4972"
- },
- "Investitionszusch\u00fcsse (steuerpflichtig)": {
- "account_number": "4975"
- },
- "Investitionszulagen (steuerfrei)": {
- "account_number": "4980"
- },
- "Steuerfreie Ertr\u00e4ge aus der Aufl\u00f6sung von steuerlichen R\u00fccklagen": {
- "account_number": "4981"
- },
- "Sonstige steuerfreie Betriebseinnahmen": {
- "account_number": "4982"
- },
- "Ertr\u00e4ge aus der Aktivierung unentgeltlich erworbener VG": {
- "account_number": "4987"
- },
- "Kostenerstattungen, R\u00fcckverg\u00fctungen und Gutschriften f. fr\u00fchere Jahre": {
- "account_number": "4989"
- },
- "Ertr\u00e4ge aus Verwaltungskostenumlagen": {
- "account_number": "4992"
- },
- "Unentgeltliche Wertabgaben": {
- "account_number": "4600"
- },
- "Entnahme von Gegenst\u00e4nden ohne USt": {
- "account_number": "4605"
- },
- "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternehmens 7 % USt": {
- "account_number": "4630"
- },
- "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternehmens ohne USt": {
- "account_number": "4637"
- },
- "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternnehmens ohne USt (Telefon-Nutzung)": {
- "account_number": "4638"
- },
- "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternehmens ohne USt (Kfz-Nutzung)": {
- "account_number": "4639"
- },
- "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternehmens 19 % USt (Gruppe)": {
- "is_group": 1,
- "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternehmens 19 % USt": {
- "account_number": "4640"
- },
- "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternehmens 19 % USt (Kfz-Nutzung)": {
- "account_number": "4645"
- },
- "Verwendung von Gegenst\u00e4nden f. Zwecke au\u00dferhalb des Unternehmens 19 % USt (Telefon-Nutzung)": {
- "account_number": "4646"
- }
- },
- "Unentgeltliche Erbringung einer sonstigen Leistung 7 % USt": {
- "account_number": "4650"
- },
- "Unentgeltliche Erbringung einer sonstigen Leistung ohne USt": {
- "account_number": "4659"
- },
- "Unentgeltliche Erbringung einer sonstigen Leistung 19 % USt": {
- "account_number": "4660"
- },
- "Unentgeltliche Zuwendung von Waren 7 % USt": {
- "account_number": "4670"
- },
- "Unentgeltliche Zuwendung von Waren ohne USt": {
- "account_number": "4679"
- },
- "Unentgeltliche Zuwendung von Waren 19 % USt": {
- "account_number": "4680"
- },
- "Unentgeltliche Zuwendung von Gegenst\u00e4nden 19 % USt": {
- "account_number": "4686"
- },
- "Unentgeltliche Zuwendung von Gegenst\u00e4nden ohne USt": {
- "account_number": "4689"
- },
- "Nicht steuerbare Ums\u00e4tze (Innenums\u00e4tze)": {
- "account_number": "4690"
- },
- "Umsatzsteuerverg\u00fctungen, z.B. nach \u00a7 24 UStG": {
- "account_number": "4695"
- },
- "Au\u00dferordentliche Ertr\u00e4ge (Gruppe)": {
- "is_group": 1,
- "Au\u00dferordentliche Ertr\u00e4ge": {
- "account_number": "7400"
- },
- "Au\u00dferordentliche Ertr\u00e4ge finanzwirksam": {
- "account_number": "7401"
- },
- "Au\u00dferordentliche Ertr\u00e4ge nicht finanzwirksam": {
- "account_number": "7450"
- },
- "Ertr\u00e4ge durch Verschmelzung und Umwandlung": {
- "account_number": "7451"
- },
- "Ertr\u00e4ge durch den Verkauf von bedeutenden Beteiligungen": {
- "account_number": "7452"
- },
- "Ert\u00e4ge durch den Verkauf von bedeutenden Grundst\u00fccken": {
- "account_number": "7453"
- },
- "Gewinn aus der Ver\u00e4u\u00dferung oder der Aufgabe von Gesch\u00e4ftsaktivit\u00e4ten nach Steuern": {
- "account_number": "7454"
- },
- "Au\u00dferordentliche Ertr\u00e4ge aus der Anwendung von \u00dcbergangsvorschriften": {
- "account_number": "7460"
- },
- "Au\u00dferordentliche Ertr\u00e4ge: Zuschreibung f. Sachanlageverm\u00f6gen": {
- "account_number": "7461"
- },
- "Au\u00dferordentliche Ertr\u00e4ge: Zuschreibung f. Finanzanlageverm\u00f6gen": {
- "account_number": "7462"
- },
- "Au\u00dferordentliche Ertr\u00e4ge: Wertpapiere im Umlaufverm\u00f6gen": {
- "account_number": "7463"
- },
- "Au\u00dferordentliche Ertr\u00e4ge: latente Steuern": {
- "account_number": "7464"
- }
- }
- },
- "7 - sonstige betriebliche Aufwendungen": {
- "root_type": "Expense",
- "is_group": 1,
- "Erl\u00f6sschm\u00e4lerungen (Gruppe)": {
- "is_group": 1,
- "Erl\u00f6sschm\u00e4lerungen": {
- "account_number": "4700"
- },
- "Erl\u00f6sschm\u00e4lerungen aus steuerfreien Ums\u00e4tzen \u00a7 4 Nr. 1a UStG": {
- "account_number": "4705"
- },
- "Erl\u00f6sschm\u00e4lerungen 7 % USt": {
- "account_number": "4710"
- },
- "Erl\u00f6sschm\u00e4lerungen 19 % USt": {
- "account_number": "4720"
- },
- "Erl\u00f6sschm\u00e4lerungen 16 % USt": {
- "account_number": "4723"
- },
- "Erl\u00f6sschm\u00e4lerungen aus steuerfreien innergem. Lieferungen": {
- "account_number": "4724"
- },
- "Erl\u00f6sschm\u00e4lerungen aus im Inland steuerpfl. EU-Lieferungen 7 % USt": {
- "account_number": "4725"
- },
- "Erl\u00f6sschm\u00e4lerungen aus im Inland steuerpfl. EU-Lieferungen 19 % USt": {
- "account_number": "4726"
- },
- "Erl\u00f6sschm\u00e4lerungen aus im anderen EU-Land steuerpfl. Lieferungen": {
- "account_number": "4727"
- },
- "Erl\u00f6sschm\u00e4lerungen aus im Inland steuerpfl. EU-Lieferungen 16 % USt": {
- "account_number": "4729"
- }
- },
- "Gew\u00e4hrte Skonti (Gruppe)": {
- "is_group": 1,
- "Gew. Skonti": {
- "account_number": "4730"
- },
- "Gew. Skonti 7 % USt": {
- "account_number": "4731"
- },
- "Gew. Skonti 19 % USt": {
- "account_number": "4736"
- },
- "Gew. Skonti aus Lieferungen von Mobilfunkger./Schaltkr., f. die der Leistungsempf. die Ust. schuldet": {
- "account_number": "4738"
- },
- "Gew. Skonti aus Leistungen, f. die der Leistungsempf. die Umsatzsteuer nach \u00a7 13b UStG schuldet": {
- "account_number": "4741"
- },
- "Gew. Skonti aus Erl\u00f6sen aus im anderen EU-Land steuerpfl. Leistungen, f. die der Leistungsempf. die Ust. schuldet": {
- "account_number": "4742"
- },
- "Gew. Skonti aus steuerfreien innergem. Lieferungen \u00a7 4 Nr. 1b UStG": {
- "account_number": "4743"
- },
- "Gew. Skonti aus im Inland steuerpfl. EU-Lieferungen": {
- "account_number": "4745"
- },
- "Gew. Skonti aus im Inland steuerpfl. EU-Lieferungen 7% USt": {
- "account_number": "4746"
- },
- "Gew. Skonti aus im Inland steuerpfl. EU-Lieferungen 19% USt": {
- "account_number": "4748"
- }
- },
- "Gew\u00e4hrte Boni (Gruppe)": {
- "is_group": 1,
- "Gew\u00e4hrte Boni 7 % USt": {
- "account_number": "4750"
- },
- "Gew\u00e4hrte Boni 19 % USt": {
- "account_number": "4760"
- },
- "Gew\u00e4hrte Boni": {
- "account_number": "4769"
- },
- "Gew\u00e4hrte Rabatte": {
- "account_number": "4770"
- },
- "Gew\u00e4hrte Rabatte 7 % USt": {
- "account_number": "4780"
- },
- "Gew\u00e4hrte Rabatte 19 % USt": {
- "account_number": "4790"
- }
- },
- "Sonstige betriebliche Aufwendungen": {
- "account_number": "6300"
- },
- "Interimskonto f. Aufw. in einem anderen Land (Vorst.verg. m\u00f6glich)": {
- "account_number": "6302"
- },
- "Fremdleistungen/Fremdarbeiten": {
- "account_number": "6303"
- },
- "Sonstige Aufwendungen betrieblich und regelm\u00e4\u00dfig": {
- "account_number": "6304"
- },
- "Raumkosten": {
- "account_number": "6305"
- },
- "Miete (unbewegliche Wirtschaftsg\u00fcter)": {
- "account_number": "6310"
- },
- "Miete/Aufwendungen f. doppelte Haushaltsf\u00fchrung": {
- "account_number": "6312"
- },
- "Pacht (unbewegliche Wirtschaftsg\u00fcter)": {
- "account_number": "6315"
- },
- "Leasing (unbewegliche Wirtschaftsg\u00fcter)": {
- "account_number": "6316"
- },
- "Aufwendungen f. gemietete oder gepachtete unbewegliche Wirtschaftsg., die GewSt hinzuzurechnen sind": {
- "account_number": "6317"
- },
- "Miet- und Pachtnebenkosten (GewSt nicht zu ber\u00fccksichtigen)": {
- "account_number": "6318"
- },
- "Heizung": {
- "account_number": "6320"
- },
- "Gas, Strom, Wasser": {
- "account_number": "6325"
- },
- "Reinigung": {
- "account_number": "6330"
- },
- "Instandhaltung betrieblicher R\u00e4ume": {
- "account_number": "6335"
- },
- "Abgaben f. betrieblich genutzten Grundbesitz": {
- "account_number": "6340"
- },
- "Sonstige Raumkosten": {
- "account_number": "6345"
- },
- "Aufwendungen f. ein h\u00e4usliches Arbeitszimmer (abziehbarer Anteil)": {
- "account_number": "6348"
- },
- "Aufwendungen f. ein h\u00e4usliches Arbeitszimmer (nicht abziehbarer Anteil)": {
- "account_number": "6349"
- },
- "Grundst\u00fccksaufwendungen betrieblich": {
- "account_number": "6350"
- },
- "Grundst\u00fccksaufwendungen neutral": {
- "account_number": "6352"
- },
- "Zuwendungen, Spenden (Gruppe)": {
- "is_group": 1,
- "Zuwendungen, Spenden, steuerlich nicht abziehbar": {
- "account_number": "6390"
- },
- "Zuwendungen, Spenden f. wissenschaftliche und kulturelle Zwecke": {
- "account_number": "6391"
- },
- "Zuwendungen, Spenden f. mildt\u00e4tige Zwecke": {
- "account_number": "6392"
- },
- "Zuwendungen, Spenden f. kirchliche, religi\u00f6se und gemeinn\u00fctzige Zwecke": {
- "account_number": "6393"
- },
- "Zuwendungen, Spenden an politische Parteien": {
- "account_number": "6394"
- },
- "Zuwendungen, Spenden an Stiftungen f. gemeinn\u00fctzige Zwecke i. S. d. \u00a7 52 Abs. 2 Nr. 1-3 AO": {
- "account_number": "6395"
- },
- "Zuwendungen, Spenden an Stiftungen f. gemeinn\u00fctzige Zwecke i. S. d. \u00a7 52 Abs. 2 Nr. 4 AO": {
- "account_number": "6396"
- },
- "Zuwendungen, Spenden an Stiftungen f. kirchliche, religi\u00f6se und gemeinn\u00fctzige Zwecke": {
- "account_number": "6397"
- },
- "Zuwendungen, Spenden an Stiftungen f.wissenschaftliche, mildt\u00e4tige und kulturelle Zwecke": {
- "account_number": "6398"
- }
- },
- "Versicherungen": {
- "account_number": "6400"
- },
- "Versicherungen f. Geb\u00e4ude, die zum Betriebsverm\u00f6gen geh\u00f6ren": {
- "account_number": "6405"
- },
- "Netto-Pr\u00e4mie f. R\u00fcckdeckung k\u00fcnftiger Versorgungsleistungen": {
- "account_number": "6410"
- },
- "Beitr\u00e4ge": {
- "account_number": "6420"
- },
- "Sonstige Abgaben": {
- "account_number": "6430"
- },
- "Steuerlich abzugsf\u00e4hige Versp\u00e4tungszuschl\u00e4ge und Zwangsgelder": {
- "account_number": "6436"
- },
- "Steuerlich nicht abzugsf\u00e4hige Versp\u00e4tungszuschl\u00e4ge und Zwangsgelder": {
- "account_number": "6437"
- },
- "Ausgleichsabgabe i. S. d. Schwerbehindertengesetzes": {
- "account_number": "6440"
- },
- "Reparaturen und Instandhaltung von Bauten": {
- "account_number": "6450"
- },
- "Reparaturen und Instandhaltung von technischenAnlagen und Maschinen": {
- "account_number": "6460"
- },
- "Reparaturen und Instandhaltung von anderen Anlagen und Betriebs- und Gesch\u00e4ftsausstattung": {
- "account_number": "6470"
- },
- "Zuf\u00fchrung zu Aufwandsr\u00fcckstellungen": {
- "account_number": "6475"
- },
- "Reparaturen und Instandhaltung von anderen Anlagen": {
- "account_number": "6485"
- },
- "Sonstige Reparaturen und Instandhaltungen": {
- "account_number": "6490"
- },
- "Wartungskosten f. Hard- und Software": {
- "account_number": "6495"
- },
- "Mietleasing (bewegliche Wirtschaftsg\u00fcter)": {
- "account_number": "6498"
- },
- "Fahrzeugkosten (Gruppe)": {
- "is_group": 1,
- "Fahrzeugkosten": {
- "account_number": "6500"
- },
- "Kfz-Versicherungen": {
- "account_number": "6520"
- },
- "Laufende Kfz-Betriebskosten": {
- "account_number": "6530"
- },
- "Kfz-Reparaturen": {
- "account_number": "6540"
- },
- "Garagenmiete": {
- "account_number": "6550"
- },
- "Mietleasing Kfz": {
- "account_number": "6560"
- },
- "Sonstige Kfz-Kosten": {
- "account_number": "6570"
- },
- "Mautgeb\u00fchren": {
- "account_number": "6580"
- },
- "Kfz-Kosten f. betrieblich genutzte zum Privatverm\u00f6gen geh\u00f6rende Kraftfahrzeuge": {
- "account_number": "6590"
- },
- "Fremdfahrzeugkosten": {
- "account_number": "6595"
- }
- },
- "Werbekosten (Gruppe)": {
- "is_group": 1,
- "Werbekosten": {
- "account_number": "6600"
- },
- "Streuartikel": {
- "account_number": "6605"
- },
- "Geschenke abzugsf\u00e4hig ohne \u00a7 37b EStG": {
- "account_number": "6610"
- },
- "Geschenke abzugsf\u00e4hig mit \u00a7 37b EStG": {
- "account_number": "6611"
- },
- "Pauschale Steuern f. Geschenke und Zugaben abzugsf\u00e4hig": {
- "account_number": "6612"
- },
- "Geschenke nicht abzugsf\u00e4hig ohne \u00a7 37b EStG": {
- "account_number": "6620"
- },
- "Geschenke nicht abzugsf\u00e4hig mit \u00a7 37b EStG": {
- "account_number": "6621"
- },
- "Pauschale Steuern f. Geschenke und Zuwendungen nicht abzugsf\u00e4hig": {
- "account_number": "6622"
- },
- "Geschenke ausschlie\u00dflich betrieblich genutzt": {
- "account_number": "6625"
- },
- "Zugaben mit \u00a7 37b EStG": {
- "account_number": "6629"
- },
- "Repr\u00e4sentationskosten": {
- "account_number": "6630"
- },
- "Bewirtungskosten": {
- "account_number": "6640"
- },
- "Sonstige eingeschr\u00e4nkt abziehbare Betriebsausgaben (abziehbarer Anteil)": {
- "account_number": "6641"
- },
- "Sonstige eingeschr\u00e4nkt abziehbare Betriebsausgaben (nicht abziehbarer Anteil)": {
- "account_number": "6642"
- },
- "Aufmerksamkeiten": {
- "account_number": "6643"
- },
- "Nicht abzugsf\u00e4hige Bewirtungskosten": {
- "account_number": "6644"
- },
- "Nicht abzugsf\u00e4hige Betriebsausgaben aus Werbe- und Repr\u00e4sentationskosten": {
- "account_number": "6645"
- },
- "Reisekosten Arbeitnehmer (Gruppe)": {
- "is_group": 1,
- "Reisekosten Arbeitnehmer": {
- "account_number": "6650"
- },
- "Reisekosten Arbeitnehmer \u00dcbernachtungsaufwand": {
- "account_number": "6660"
- },
- "Reisekosten Arbeitnehmer Fahrtkosten": {
- "account_number": "6663"
- },
- "Reisekosten Arbeitnehmer Verpflegungsmehraufwand": {
- "account_number": "6664"
- },
- "Kilometergelderstattung Arbeitnehmer": {
- "account_number": "6668"
- }
- },
- "Reisekosten Unternehmer (Gruppe)": {
- "is_group": 1,
- "Reisekosten Unternehmer": {
- "account_number": "6670"
- },
- "Reisekosten Unternehmer (nicht abziehbarer Anteil)": {
- "account_number": "6672"
- },
- "Reisekosten Unternehmer Fahrtkosten": {
- "account_number": "6673"
- },
- "Reisekosten Unternehmer Verpflegungsmehraufwand": {
- "account_number": "6674"
- },
- "Reisekosten Unternehmer \u00dcbernachtungsaufwand": {
- "account_number": "6680"
- }
- },
- "Fahrten zwischen Wohnung und Betriebsst\u00e4tte und Familienheimfahrten (abziehbarer Anteil)": {
- "account_number": "6688"
- },
- "Fahrten zwischen Wohnung und Betriebsst\u00e4tte und Familienheimfahrten (nicht abziehbarer Anteil)": {
- "account_number": "6689"
- },
- "Fahrten zwischen Wohnung und Betriebsst\u00e4tte und Familienheimfahrten (Haben)": {
- "account_number": "6690"
- },
- "Verpflegungsmehraufwendungen i. R. d. doppelten Haushaltsf\u00fchrung (abziehbarer Anteil)": {
- "account_number": "6691"
- }
- },
- "Kosten Warenabgabe (Gruppe)": {
- "is_group": 1,
- "Kosten Warenabgabe": {
- "account_number": "6700"
- },
- "Verpackungsmaterial": {
- "account_number": "6710"
- },
- "Ausgangsfrachten": {
- "account_number": "6740"
- },
- "Transportversicherungen": {
- "account_number": "6760"
- },
- "Verkaufsprovisionen": {
- "account_number": "6770"
- },
- "Fremdarbeiten (Vertrieb)": {
- "account_number": "6780"
- },
- "Aufwand f. Gew\u00e4hrleistungen": {
- "account_number": "6790"
- }
- },
- "Porto": {
- "account_number": "6800"
- },
- "Telefon": {
- "account_number": "6805"
- },
- "Telefax und Internetkosten": {
- "account_number": "6810"
- },
- "B\u00fcrobedarf": {
- "account_number": "6815"
- },
- "Zeitschriften, B\u00fccher": {
- "account_number": "6820"
- },
- "Fortbildungskosten": {
- "account_number": "6821"
- },
- "Freiwillige Sozialleistungen": {
- "account_number": "6822"
- },
- "Rechts- und Beratungskosten": {
- "account_number": "6825"
- },
- "Abschluss- und Pr\u00fcfungskosten": {
- "account_number": "6827"
- },
- "Buchf\u00fchrungskosten": {
- "account_number": "6830"
- },
- "Mieten f. Einrichtungen (bewegliche Wirtschaftsg\u00fcter)": {
- "account_number": "6835"
- },
- "Pacht (bewegliche Wirtschaftsg\u00fcter)": {
- "account_number": "6836"
- },
- "Aufwendungen f. die zeitlich befristete \u00dcberlassung von Rechten (Lizenzen, Konzessionen)": {
- "account_number": "6837"
- },
- "Aufwendungen f. gemietete oder gepachtete bewegliche Wirtschaftsg., die gewerbest. hinzuzurechnen sind": {
- "account_number": "6838"
- },
- "Werkzeuge und Kleinger\u00e4te": {
- "account_number": "6845"
- },
- "Betriebsbedarf": {
- "account_number": "6850"
- },
- "Nebenkosten des Geldverkehrs": {
- "account_number": "6855"
- },
- "Aufwendungen aus Anteilen an inl\u00e4ndischen Kap.Ges.": {
- "account_number": "6856"
- },
- "Ver\u00e4u\u00dferungskosten \u00a7 3 Nr. 40 EStG/\u00a7 8b Abs. 2 KStG (inl. Kap.Ges.)": {
- "account_number": "6857"
- },
- "Aufwendungen f. Abraum- und Abfallbeseitigung": {
- "account_number": "6859"
- },
- "Nicht abziehbare Vorsteuer 19 %": {
- "account_number": "6871"
- },
- "Aufwendungen aus der W\u00e4hrungsumrechnung": {
- "account_number": "6880"
- },
- "Aufwendungen aus Bewertung Finanzmittelfonds": {
- "account_number": "6883"
- },
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen steuerfrei \u00a7 4 Nr. 1a UStG (bei Buchverlust)": {
- "account_number": "6884"
- },
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen 19 % USt (bei Buchverlust)": {
- "account_number": "6885"
- },
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen steuerfrei \u00a7 4 Nr. 1b UStG (bei Buchverlust)": {
- "account_number": "6888"
- },
- "Erl\u00f6se aus Verk\u00e4ufen Sachanlageverm\u00f6gen (bei Buchverlust)": {
- "account_number": "6889"
- },
- "Erl\u00f6se aus Verk\u00e4ufen immaterieller VG (bei Buchverlust)": {
- "account_number": "6890"
- },
- "Erl\u00f6se aus Verk\u00e4ufen Finanzanlagen (bei Buchverlust)": {
- "account_number": "6891"
- },
- "Erl\u00f6se aus Verk\u00e4ufen Finanzanlagen (inl. Kap.Ges., bei Buchverlust)": {
- "account_number": "6892"
- },
- "Anlagenabg\u00e4nge Sachanlagen (Restbuchwert bei Buchverlust)": {
- "account_number": "6895"
- },
- "Anlagenabg\u00e4nge immaterielle VG (Restbuchwert bei Buchverlust)": {
- "account_number": "6896"
- },
- "Anlagenabg\u00e4nge Finanzanlagen (Restbuchwert bei Buchverlust)": {
- "account_number": "6897"
- },
- "Anlagenabg\u00e4nge Finanzanlagen (inl. Kap.Ges., Restbuchwert bei Buchverlust)": {
- "account_number": "6898"
- },
- "Verluste aus dem Abgang von Gegenst\u00e4nden des Anlageverm\u00f6gens": {
- "account_number": "6900"
- },
- "Verluste aus der Ver\u00e4u\u00dferung von Anteilen an Kap.Ges. (Finanzanlageverm\u00f6gen, inl. Kap.Ges.)": {
- "account_number": "6903"
- },
- "Verluste aus dem Abgang von Ggenst\u00e4nden des Umlaufverm. (au\u00dfer Vorr\u00e4te)": {
- "account_number": "6905"
- },
- "Verluste aus dem Abgang von Gegenst\u00e4nden des Umlaufverm. (au\u00dfer Vorr\u00e4te, inl. Kap.Ges.)": {
- "account_number": "6906"
- },
- "Abschreibungen auf Umlaufverm\u00f6gen au\u00dfer Vorr\u00e4te und Wertpapiere (\u00fcbliche H\u00f6he)": {
- "account_number": "6910",
- "account_type": "Round Off"
- },
- "Abschreibungen auf Umlaufverm\u00f6gen, steuerrechtlich bedingt (\u00fcbliche H\u00f6he)": {
- "account_number": "6912"
- },
- "Einstellung in die Pauschalwertberichtigung auf Forderungen": {
- "account_number": "6920"
- },
- "Einstellungen in die steuerliche R\u00fccklage nach \u00a7 6b Abs. 3 EStG": {
- "account_number": "6922"
- },
- "Einstellung in die Einzelwertberichtigung auf Forderungen": {
- "account_number": "6923"
- },
- "Einstellungen in die steuerliche R\u00fccklage nach \u00a7 6b Abs. 10 EStG": {
- "account_number": "6924"
- },
- "Einstellungen in steuerliche R\u00fccklagen": {
- "account_number": "6927"
- },
- "Einstellungen in die R\u00fccklage f. Ersatzbeschaffung nach R 6.6 EStR": {
- "account_number": "6928"
- },
- "Einstellungen in die steuerliche R\u00fccklage nach \u00a7 4g EStG": {
- "account_number": "6929"
- },
- "Forderungsverluste (\u00fcbliche H\u00f6he) (Gruppe)": {
- "is_group": 1,
- "Forderungsverluste (\u00fcbliche H\u00f6he)": {
- "account_number": "6930"
- },
- "Forderungsverluste 7 % USt (\u00fcbliche H\u00f6he)": {
- "account_number": "6931"
- },
- "Forderungsverluste aus steuerfreien EU-Lieferungen (\u00fcbliche H\u00f6he)": {
- "account_number": "6932"
- },
- "Forderungsverluste aus im Inland steuerpfl. EU-Lieferungen 7 % USt (\u00fcbliche H\u00f6he)": {
- "account_number": "6933"
- },
- "Forderungsverluste aus im Inland steuerpfl. EU-Lieferungen 16 % USt (\u00fcbliche H\u00f6he)": {
- "account_number": "6934"
- },
- "Forderungsverluste 16% USt (\u00fcbliche H\u00f6he)": {
- "account_number": "6935"
- },
- "Forderungsverluste 19 % USt (\u00fcbliche H\u00f6he)": {
- "account_number": "6936"
- },
- "Forderungsverluste 15% USt (\u00fcbliche H\u00f6he)": {
- "account_number": "6937"
- },
- "Forderungsverluste aus im Inland steuerpfl. EU-Lieferungen 19 % USt (\u00fcbliche H\u00f6he)": {
- "account_number": "6938"
- },
- "Forderungsverluste aus im Inland steuerpfl. EU-Lieferungen 15% USt (\u00fcbliche H\u00f6he)": {
- "account_number": "6939"
- }
- },
- "Periodenfremde Aufwendungen (soweit nicht au\u00dferordentlich)": {
- "account_number": "6960"
- },
- "Sonstige Aufwendungen betriebsfremd und regelm\u00e4\u00dfig": {
- "account_number": "6967"
- },
- "Sonstige Aufwendungen unregelm\u00e4\u00dfig": {
- "account_number": "6969"
- },
- "Au\u00dferordentliche Aufwendungen (Gruppe)": {
- "is_group": 1,
- "Au\u00dferordentliche Aufwendungen": {
- "account_number": "7500"
- },
- "Au\u00dferordentliche Aufwendungen finanzwirksam": {
- "account_number": "7501"
- },
- "Au\u00dferordentliche Aufwendungen nicht finanzwirksam": {
- "account_number": "7550"
- },
- "Verluste durch Verschmelzung und Umwandlung": {
- "account_number": "7551"
- },
- "Verluste durch au\u00dfergew\u00f6hnliche Schadensf\u00e4lle": {
- "account_number": "7552"
- },
- "Aufwendungen f. Restrukturierungs- und Sanierungsma\u00dfnahmen": {
- "account_number": "7553"
- },
- "Verluste aus Gesch\u00e4ftsaufgabe oder -ver\u00e4u\u00dferung nach Steuern": {
- "account_number": "7554"
- },
- "Au\u00dferordentliche Aufwendungen aus der Anwendung von \u00dcbergangsvorschriften (Gruppe)": {
- "is_group": 1,
- "Au\u00dferordentliche Aufwendungen aus der Anwendung von \u00dcbergangsvorschriften": {
- "account_number": "7560"
- },
- "Au\u00dferordentliche Aufwendungen aus der Anwendung von \u00dcbergangsvorschriften (Pensionsr\u00fcckst.)": {
- "account_number": "7561"
- },
- "Au\u00dferordentliche Aufwendungen aus der Anwendung von \u00dcbergangsvorschriften (Bilanzierungshilfen)": {
- "account_number": "7562"
- },
- "Au\u00dferordentliche Aufwendungen aus der Anwendung von \u00dcbergangsvorschriften (Latente Steuern)": {
- "account_number": "7563"
- }
- }
- }
- },
- "8 - Ertr\u00e4ge aus Beteiligungen": {
- "root_type": "Income",
- "is_group": 1,
- "Ertr\u00e4ge aus Beteiligungen": {
- "account_number": "7000",
- "account_type": "Income Account"
- },
- "Ertr\u00e4ge aus Beteiligungen an Personengesellschaften (verb. Unternehmen), \u00a7 9 GewStG": {
- "account_number": "7004"
- },
- "Ertr\u00e4ge aus Anteilen an Kap.Ges. (inl\u00e4ndische Beteiligung)": {
- "account_number": "7005"
- },
- "Ertr\u00e4ge aus Anteilen an Kap.Ges. (inl\u00e4ndische verb. Unternehmen)": {
- "account_number": "7006"
- },
- "Sonstige GewSt-freie Gewinne aus Anteilen an einer Kap.Ges. (K\u00fcrzung gem. \u00a7 9 Nr. 2a GewStG)": {
- "account_number": "7007"
- },
- "Gewinnanteile aus Mitunternehmerschaften \u00a7 9 GewStG": {
- "account_number": "7008"
- },
- "Ertr\u00e4ge aus Beteiligungen an verbundenen Unternehmen": {
- "account_number": "7009"
- },
- "Zins- und Dividendenertr\u00e4ge": {
- "account_number": "7020"
- },
- "Erhaltene Ausgleichszahlungen (als au\u00dfenstehender Aktion\u00e4r)": {
- "account_number": "7030"
- }
- },
- "9 - Ertr\u00e4ge aus anderen Wertpapieren und Ausleihungen des Finanzanlageverm\u00f6gens": {
- "root_type": "Income",
- "is_group": 1,
- "Ertr\u00e4ge aus anderen Wertpapieren und Ausleihungen des Finanzanlageverm\u00f6gens": {
- "account_number": "7010",
- "account_type": "Income Account"
- },
- "Ertr\u00e4ge aus Ausleihungen des Finanzanlageverm\u00f6gens": {
- "account_number": "7011"
- },
- "Ertr\u00e4ge aus Ausleihungen des Finanzanlageverm\u00f6gens an verbundenen Unternehmen": {
- "account_number": "7012"
- },
- "Ertr\u00e4ge aus Anteilen an Personengesellschaften (Finanzanlageverm\u00f6gen)": {
- "account_number": "7013"
- },
- "Ertr\u00e4ge aus Anteilen an Kap.Ges. (Finanzanlageverm\u00f6gen, inl\u00e4ndische Kap.Ges.)": {
- "account_number": "7014"
- },
- "Ertr\u00e4ge aus Anteilen an Personengesellschaften (verb. Unternehmen)": {
- "account_number": "7016"
- },
- "Ertr\u00e4ge aus anderen Wertpapieren des Finanzanlageverm. an Kap.Ges. (verb. Unternehmen)": {
- "account_number": "7017"
- },
- "Ertr\u00e4ge aus anderen Wertpapieren des Finanzanlageverm. an Pers.Ges. (verb. Unternehmen)": {
- "account_number": "7018"
- },
- "Ertr\u00e4ge aus anderen Wertpapieren und Ausleihungen des Finanzanlageverm. aus verbundenen Unternehmen": {
- "account_number": "7019"
- }
- },
- "10 - sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge": {
- "root_type": "Income",
- "is_group": 1,
- "davon aus verbundenen Unternehmen": {
- "is_group": 1,
- "Diskontertr\u00e4ge aus verbundenen Unternehmen": {
- "account_number": "7139"
- },
- "Sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge aus verbundenen Unternehmen": {
- "account_number": "7109"
- },
- "Sonstige Zinsertr\u00e4ge aus verbundenen Unternehmen": {
- "account_number": "7119",
- "account_type": "Income Account"
- },
- "Zins\u00e4hnliche Ertr\u00e4ge aus verbundenen Unternehmen": {
- "account_number": "7129"
- }
- },
- "Sonstige Zinsen und \u00e4hnliche Ertr\u00e4ge": {
- "account_number": "7100",
- "account_type": "Income Account"
- },
- "Ertr\u00e4ge aus Anteilen an Kap.Ges. (Umlaufverm\u00f6gen, inl\u00e4ndische Kap.Ges.)": {
- "account_number": "7103"
- },
- "Zinsertr\u00e4ge \u00a7 233a AO steuerpflichtig": {
- "account_number": "7105"
- },
- "Zinsertr\u00e4ge \u00a7 233a AO, \u00a7 4 Abs. 5b EStG, steuerfrei": {
- "account_number": "7107"
- },
- "Sonstige Zinsertr\u00e4ge": {
- "account_number": "7110"
- },
- "Ertr\u00e4ge aus anderen Wertpapieren und Ausleihungen des Umlaufverm.": {
- "account_number": "7115"
- },
- "Zins\u00e4hnliche Ertr\u00e4ge": {
- "account_number": "7120"
- },
- "Diskontertr\u00e4ge": {
- "account_number": "7130"
- },
- "Zinsertr\u00e4ge aus der Abzinsung von Verb.": {
- "account_number": "7141"
- },
- "Zinsertr\u00e4ge aus der Abzinsung von R\u00fcckstellungen": {
- "account_number": "7142"
- },
- "Zinsertr\u00e4ge aus der Abzinsung von Pensionsr\u00fcckst. und \u00e4hnl./vergleichb. Verplicht.": {
- "account_number": "7143"
- },
- "Zinsertr\u00e4ge aus der Abzinsung von Pensionsr\u00fcckst. und \u00e4hnl. Verplicht. zur Verrechnung": {
- "account_number": "7144"
- },
- "Erhaltene Gewinne auf Grund einer Gewinngemeinschaft": {
- "account_number": "7192"
- },
- "Erhaltene Gewinne auf Grund einer Gewinn- oder Teilgewinnabf\u00fchrungsvertrags": {
- "account_number": "7194"
- }
- },
- "11 - Abschreibungen auf Finanzanlagen und auf Wertpapiere des Umlaufverm.": {
- "root_type": "Expense",
- "is_group": 1,
- "Abschreibungen auf Finanzanlagen (dauerhaft)": {
- "account_number": "7200",
- "account_type": "Depreciation"
- },
- "Abschreibungen auf Finanzanlagen (nicht dauerhaft)": {
- "account_number": "7201"
- },
- "Abschreibungen auf Finanzanlagen \u00a7 3 Nr. 40 EStG / \u00a7 8b Abs. 3 KStG (inl. Kap.Ges., dauerh.)": {
- "account_number": "7204"
- },
- "Abschreibungen auf Finanzanlagen - verb. Unternehmen": {
- "account_number": "7207"
- },
- "Aufwendungen auf Grund von Verlustanteilen an Mitunternehmerschaften \u00a7 8 GewStG": {
- "account_number": "7208"
- },
- "Abschreibungen auf Wertpapiere des Umlaufverm. (Gruppe)": {
- "is_group": 1,
- "Abschreibungen auf Wertpapiere des Umlaufverm.": {
- "account_number": "7210"
- },
- "Abschreibungen auf Wertpapiere des Umlaufverm. \u00a73Nr.40EStG/\u00a78bAbs.3KStG (inl. Kap.Ges.)": {
- "account_number": "7214"
- },
- "Abschreibungen auf Wertpapiere des Umlaufverm. - verb. Unternehmen": {
- "account_number": "7217"
- }
- },
- "Abschreibungen auf Finanzanlagen auf Grund \u00a7 6b EStG-R\u00fccklage": {
- "account_number": "7250"
- },
- "Abschreibungen auf Finanzanlagen auf Grund \u00a7 3Nr.40EStG/\u00a78bAbs.3KStG (inl. Kap.Ges.)": {
- "account_number": "7255"
- }
- },
- "12- Zinsen und \u00e4hnliche Aufwendungen": {
- "root_type": "Expense",
- "is_group": 1,
- "davon an verb. Unternehmen": {
- "is_group": 1,
- "Zinsen und \u00e4hnliche Aufwendungen an verb. Unternehmen (inl. Kap.Ges.)": {
- "account_number": "7351"
- },
- "Zinsen und \u00e4hnliche Aufwendungen an verb. Unternehmen": {
- "account_number": "7309"
- },
- "Zinsaufwendungen f. kurzfistige Verb. an verb. Unternehmen": {
- "account_number": "7319"
- },
- "Zinsaufwendungen f. langfristigeVerb. an verb. Unternehmen": {
- "account_number": "7329"
- },
- "Diskontaufwendungen an verb. Unternehmen": {
- "account_number": "7349"
- }
- },
- "Zinsen und \u00e4hnliche Aufwendungen": {
- "account_number": "7300"
- },
- "Steuerlich nicht abzugsf\u00e4hige andere Nebenleistungen zu Steuern \u00a7 4 Abs. 5b EStG": {
- "account_number": "7302"
- },
- "Steuerlich abzugsf\u00e4hige, andere Nebenleistungen zu Steuern": {
- "account_number": "7303"
- },
- "Steuerlich nicht abzugsf\u00e4hige, andere Nebenleistungen zu Steuern": {
- "account_number": "7304"
- },
- "Zinsaufwendungen \u00a7 233a AO betriebliche Steuern": {
- "account_number": "7305"
- },
- "Zinsaufwendungen \u00a7\u00a7 233a bis 237 AO Personensteuern": {
- "account_number": "7306"
- },
- "Zinsaufwendungen \u00a7 233a AO, \u00a7 4 Abs. 5b EStG": {
- "account_number": "7308"
- },
- "Zinsaufwendungen f. kurzfristige Verb.": {
- "account_number": "7310"
- },
- "Nicht abzugsf\u00e4hige Schuldzinsen gem\u00e4\u00df \u00a7 4 Abs. 4a EStG (Hinzurechnungsbetrag)": {
- "account_number": "7313"
- },
- "Zinsen auf Kontokorrentkonten": {
- "account_number": "7318"
- },
- "Zinsaufwendungen f. langfristige Verb.": {
- "account_number": "7320"
- },
- "Abschreibungen auf Disagio/Damnum zur Finanzierung": {
- "account_number": "7323"
- },
- "Abschreibungen auf Disagio/Damnum zur Finanzierung des Anlageverm\u00f6gens": {
- "account_number": "7324"
- },
- "Zinsaufwendungen f. Geb\u00e4ude, die zum Betriebsverm\u00f6gen geh\u00f6ren": {
- "account_number": "7325"
- },
- "Zinsen zur Finanzierung des Anlageverm\u00f6gens": {
- "account_number": "7326"
- },
- "Renten und dauernde Lasten": {
- "account_number": "7327"
- },
- "Zins\u00e4hnliche Aufwendungen": {
- "account_number": "7330"
- },
- "Diskontaufwendungen": {
- "account_number": "7340"
- },
- "Zinsen und \u00e4hnl. Aufwendungen \u00a7\u00a73Nr.40,3cEStG/\u00a78bAbs.1KStG (inl. Kap.Ges.)": {
- "account_number": "7350"
- },
- "Kreditprovisionen und Verwaltungskostenbeitr\u00e4ge": {
- "account_number": "7355"
- },
- "Zinsanteil der Zuf\u00fchrungen zu Pensionsr\u00fcckst.": {
- "account_number": "7360"
- },
- "Zinsaufwendungen aus der Abzinsung von Verb.": {
- "account_number": "7361"
- },
- "Zinsaufwendungen aus der Abzinsung von R\u00fcckstellungen": {
- "account_number": "7362"
- },
- "Zinsaufwendungen aus der Abzinsung von Pensionsr\u00fcckst. und \u00e4hnl. Verplicht.": {
- "account_number": "7363"
- },
- "Zinsaufwendungen aus der Abzinsung von Pensionsr\u00fcckst. und \u00e4hnl. Verplicht. zur Verrechnung": {
- "account_number": "7364"
- },
- "Aufwendungen aus Verlust\u00fcbernahme": {
- "account_number": "7390"
- }
- },
- "13 - Steuern vom Einkommen und vom Ertrag": {
- "root_type": "Expense",
- "is_group": 1,
- "K\u00f6rperschaftsteuer": {
- "account_number": "7600",
- "account_type": "Tax"
- },
- "Gewerbesteuer": {
- "account_number": "7610",
- "account_type": "Tax"
- },
- "Kapitalertragsteuer 25 %": {
- "account_number": "7630"
- },
- "Anrechenbarer Solidarit\u00e4tszuschlag auf Kapitalertragsteuer 25 %": {
- "account_number": "7633"
- },
- "Anzurechnende ausl\u00e4ndische Quellensteuer": {
- "account_number": "7639"
- },
- "Gewerbesteuernachzahlungen Vorjahre": {
- "account_number": "7640"
- },
- "Gewerbesteuernachzahlungen und Gewerbesteuererstattungen f. Vorjahre, \u00a7 4 Abs. 5b EStG": {
- "account_number": "7641"
- },
- "Gewerbesteuererstattungen Vorjahre": {
- "account_number": "7642"
- },
- "Ertr\u00e4ge aus der Aufl\u00f6sung von Gewerbesteuerr\u00fcckstellungen, \u00a7 4 Abs. 5b EStG": {
- "account_number": "7643"
- },
- "Ertr\u00e4ge aus der Aufl\u00f6sung von Gewerbesteuerr\u00fcckstellungen": {
- "account_number": "7644"
- },
- "Aufwendungen aus der Zuf\u00fchrung und Aufl\u00f6sung von latenten Steuern": {
- "account_number": "7645"
- },
- "Ertr\u00e4ge aus der Zuf\u00fchrung und Aufl\u00f6sung von latenten Steuern": {
- "account_number": "7649"
- }
- },
- "15 - sonstige Steuern": {
- "root_type": "Expense",
- "is_group": 1,
- "Verbrauchsteuer": {
- "account_number": "7675"
- },
- "\u00d6kosteuer": {
- "account_number": "7678"
- },
- "Grundsteuer": {
- "account_number": "7680"
- },
- "Kfz-Steuer": {
- "account_number": "7685"
- },
- "Steuernachzahlungen Vorjahre f. sonstige Steuern": {
- "account_number": "7690"
- },
- "Steuererstattungen Vorjahre f. sonstige Steuern": {
- "account_number": "7692"
- },
- "Ertr\u00e4ge aus der Aufl\u00f6sung von R\u00fcckstellungen f. sonstige Steuern": {
- "account_number": "7694"
- }
- }
- }
-}
diff --git a/erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.json b/erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.json
index e3f2d59c06..234ffc8a87 100644
--- a/erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.json
+++ b/erpnext/accounts/doctype/allowed_to_transact_with/allowed_to_transact_with.json
@@ -11,6 +11,7 @@
{
"fieldname": "company",
"fieldtype": "Link",
+ "ignore_user_permissions": 1,
"in_list_view": 1,
"label": "Company",
"options": "Company",
@@ -19,7 +20,7 @@
],
"istable": 1,
"links": [],
- "modified": "2020-05-01 12:32:34.044911",
+ "modified": "2024-01-03 11:13:02.669632",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Allowed To Transact With",
@@ -28,5 +29,6 @@
"quick_entry": 1,
"sort_field": "modified",
"sort_order": "DESC",
+ "states": [],
"track_changes": 1
}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.js b/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.js
index d961ead642..1f2d6ce59a 100644
--- a/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.js
+++ b/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.js
@@ -137,7 +137,7 @@ frappe.ui.form.on("Bank Reconciliation Tool", {
"erpnext.accounts.doctype.bank_reconciliation_tool.bank_reconciliation_tool.get_account_balance",
args: {
bank_account: frm.doc.bank_account,
- till_date: frm.doc.bank_statement_from_date,
+ till_date: frappe.datetime.add_days(frm.doc.bank_statement_from_date, -1)
},
callback: (response) => {
frm.set_value("account_opening_balance", response.message);
diff --git a/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py b/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py
index 0779a09e2f..9e6b51d2c1 100644
--- a/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py
+++ b/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.py
@@ -444,6 +444,10 @@ def reconcile_vouchers(bank_transaction_name, vouchers):
vouchers = json.loads(vouchers)
transaction = frappe.get_doc("Bank Transaction", bank_transaction_name)
transaction.add_payment_entries(vouchers)
+ transaction.validate_duplicate_references()
+ transaction.allocate_payment_entries()
+ transaction.update_allocated_amount()
+ transaction.set_status()
transaction.save()
return transaction
diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py
index 372f7a1823..c38d27355f 100644
--- a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py
+++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py
@@ -4,12 +4,11 @@
import frappe
from frappe import _
from frappe.model.docstatus import DocStatus
+from frappe.model.document import Document
from frappe.utils import flt
-from erpnext.controllers.status_updater import StatusUpdater
-
-class BankTransaction(StatusUpdater):
+class BankTransaction(Document):
# begin: auto-generated types
# This code is auto-generated. Do not modify anything in this block.
@@ -51,6 +50,15 @@ class BankTransaction(StatusUpdater):
def validate(self):
self.validate_duplicate_references()
+ def set_status(self):
+ if self.docstatus == 2:
+ self.db_set("status", "Cancelled")
+ elif self.docstatus == 1:
+ if self.unallocated_amount > 0:
+ self.db_set("status", "Unreconciled")
+ elif self.unallocated_amount <= 0:
+ self.db_set("status", "Reconciled")
+
def validate_duplicate_references(self):
"""Make sure the same voucher is not allocated twice within the same Bank Transaction"""
if not self.payment_entries:
@@ -84,12 +92,13 @@ class BankTransaction(StatusUpdater):
self.validate_duplicate_references()
self.allocate_payment_entries()
self.update_allocated_amount()
+ self.set_status()
def on_cancel(self):
for payment_entry in self.payment_entries:
self.clear_linked_payment_entry(payment_entry, for_cancel=True)
- self.set_status(update=True)
+ self.set_status()
def add_payment_entries(self, vouchers):
"Add the vouchers with zero allocation. Save() will perform the allocations and clearance"
@@ -367,15 +376,17 @@ def set_voucher_clearance(doctype, docname, clearance_date, self):
and len(get_reconciled_bank_transactions(doctype, docname)) < 2
):
return
- frappe.db.set_value(doctype, docname, "clearance_date", clearance_date)
- elif doctype == "Sales Invoice":
- frappe.db.set_value(
- "Sales Invoice Payment",
- dict(parenttype=doctype, parent=docname),
- "clearance_date",
- clearance_date,
- )
+ if doctype == "Sales Invoice":
+ frappe.db.set_value(
+ "Sales Invoice Payment",
+ dict(parenttype=doctype, parent=docname),
+ "clearance_date",
+ clearance_date,
+ )
+ return
+
+ frappe.db.set_value(doctype, docname, "clearance_date", clearance_date)
elif doctype == "Bank Transaction":
# For when a second bank transaction has fixed another, e.g. refund
diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/__init__.py b/erpnext/accounts/doctype/bisect_accounting_statements/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js
new file mode 100644
index 0000000000..ece0fb33e5
--- /dev/null
+++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.js
@@ -0,0 +1,100 @@
+// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on("Bisect Accounting Statements", {
+ onload(frm) {
+ frm.trigger("render_heatmap");
+ },
+ refresh(frm) {
+ frm.add_custom_button(__('Bisect Left'), () => {
+ frm.trigger("bisect_left");
+ });
+
+ frm.add_custom_button(__('Bisect Right'), () => {
+ frm.trigger("bisect_right");
+ });
+
+ frm.add_custom_button(__('Up'), () => {
+ frm.trigger("move_up");
+ });
+ frm.add_custom_button(__('Build Tree'), () => {
+ frm.trigger("build_tree");
+ });
+ },
+ render_heatmap(frm) {
+ let bisect_heatmap = frm.get_field("bisect_heatmap").$wrapper;
+ bisect_heatmap.addClass("bisect_heatmap_location");
+
+ // milliseconds in a day
+ let msiad=24*60*60*1000;
+ let datapoints = {};
+ let fr_dt = new Date(frm.doc.from_date).getTime();
+ let to_dt = new Date(frm.doc.to_date).getTime();
+ let bisect_start = new Date(frm.doc.current_from_date).getTime();
+ let bisect_end = new Date(frm.doc.current_to_date).getTime();
+
+ for(let x=fr_dt; x <= to_dt; x+=msiad){
+ let epoch_in_seconds = x/1000;
+ if ((bisect_start <= x) && (x <= bisect_end )) {
+ datapoints[epoch_in_seconds] = 1.0;
+ } else {
+ datapoints[epoch_in_seconds] = 0.0;
+ }
+ }
+
+ new frappe.Chart(".bisect_heatmap_location", {
+ type: "heatmap",
+ data: {
+ dataPoints: datapoints,
+ start: new Date(frm.doc.from_date),
+ end: new Date(frm.doc.to_date),
+ },
+ countLabel: 'Bisecting',
+ discreteDomains: 1,
+ });
+ },
+ bisect_left(frm) {
+ frm.call({
+ doc: frm.doc,
+ method: 'bisect_left',
+ freeze: true,
+ freeze_message: __("Bisecting Left ..."),
+ callback: (r) => {
+ frm.trigger("render_heatmap");
+ }
+ });
+ },
+ bisect_right(frm) {
+ frm.call({
+ doc: frm.doc,
+ freeze: true,
+ freeze_message: __("Bisecting Right ..."),
+ method: 'bisect_right',
+ callback: (r) => {
+ frm.trigger("render_heatmap");
+ }
+ });
+ },
+ move_up(frm) {
+ frm.call({
+ doc: frm.doc,
+ freeze: true,
+ freeze_message: __("Moving up in tree ..."),
+ method: 'move_up',
+ callback: (r) => {
+ frm.trigger("render_heatmap");
+ }
+ });
+ },
+ build_tree(frm) {
+ frm.call({
+ doc: frm.doc,
+ freeze: true,
+ freeze_message: __("Rebuilding BTree for period ..."),
+ method: 'build_tree',
+ callback: (r) => {
+ frm.trigger("render_heatmap");
+ }
+ });
+ },
+});
diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json
new file mode 100644
index 0000000000..e129fa60c2
--- /dev/null
+++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.json
@@ -0,0 +1,194 @@
+{
+ "actions": [],
+ "allow_rename": 1,
+ "creation": "2023-09-15 21:28:28.054773",
+ "default_view": "List",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "section_break_cvfg",
+ "company",
+ "column_break_hcam",
+ "from_date",
+ "column_break_qxbi",
+ "to_date",
+ "column_break_iwny",
+ "algorithm",
+ "section_break_8ph9",
+ "current_node",
+ "section_break_ngid",
+ "bisect_heatmap",
+ "section_break_hmsy",
+ "bisecting_from",
+ "current_from_date",
+ "column_break_uqyd",
+ "bisecting_to",
+ "current_to_date",
+ "section_break_hbyo",
+ "heading_cppb",
+ "p_l_summary",
+ "column_break_aivo",
+ "balance_sheet_summary",
+ "b_s_summary",
+ "column_break_gvwx",
+ "difference_heading",
+ "difference"
+ ],
+ "fields": [
+ {
+ "fieldname": "column_break_qxbi",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "from_date",
+ "fieldtype": "Datetime",
+ "label": "From Date"
+ },
+ {
+ "fieldname": "to_date",
+ "fieldtype": "Datetime",
+ "label": "To Date"
+ },
+ {
+ "default": "BFS",
+ "fieldname": "algorithm",
+ "fieldtype": "Select",
+ "label": "Algorithm",
+ "options": "BFS\nDFS"
+ },
+ {
+ "fieldname": "column_break_iwny",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "current_node",
+ "fieldtype": "Link",
+ "label": "Current Node",
+ "options": "Bisect Nodes"
+ },
+ {
+ "fieldname": "section_break_hmsy",
+ "fieldtype": "Section Break"
+ },
+ {
+ "fieldname": "current_from_date",
+ "fieldtype": "Datetime",
+ "read_only": 1
+ },
+ {
+ "fieldname": "current_to_date",
+ "fieldtype": "Datetime",
+ "read_only": 1
+ },
+ {
+ "fieldname": "column_break_uqyd",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "section_break_hbyo",
+ "fieldtype": "Section Break"
+ },
+ {
+ "fieldname": "p_l_summary",
+ "fieldtype": "Float",
+ "read_only": 1
+ },
+ {
+ "fieldname": "b_s_summary",
+ "fieldtype": "Float",
+ "read_only": 1
+ },
+ {
+ "fieldname": "difference",
+ "fieldtype": "Float",
+ "read_only": 1
+ },
+ {
+ "fieldname": "column_break_aivo",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "column_break_gvwx",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "company",
+ "fieldtype": "Link",
+ "label": "Company",
+ "options": "Company"
+ },
+ {
+ "fieldname": "column_break_hcam",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "section_break_ngid",
+ "fieldtype": "Section Break"
+ },
+ {
+ "fieldname": "section_break_8ph9",
+ "fieldtype": "Section Break",
+ "hidden": 1
+ },
+ {
+ "fieldname": "bisect_heatmap",
+ "fieldtype": "HTML",
+ "label": "Heatmap"
+ },
+ {
+ "fieldname": "heading_cppb",
+ "fieldtype": "Heading",
+ "label": "Profit and Loss Summary"
+ },
+ {
+ "fieldname": "balance_sheet_summary",
+ "fieldtype": "Heading",
+ "label": "Balance Sheet Summary"
+ },
+ {
+ "fieldname": "difference_heading",
+ "fieldtype": "Heading",
+ "label": "Difference"
+ },
+ {
+ "fieldname": "bisecting_from",
+ "fieldtype": "Heading",
+ "label": "Bisecting From"
+ },
+ {
+ "fieldname": "bisecting_to",
+ "fieldtype": "Heading",
+ "label": "Bisecting To"
+ },
+ {
+ "fieldname": "section_break_cvfg",
+ "fieldtype": "Section Break"
+ }
+ ],
+ "hide_toolbar": 1,
+ "index_web_pages_for_search": 1,
+ "issingle": 1,
+ "links": [],
+ "modified": "2023-12-01 16:49:54.073890",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Bisect Accounting Statements",
+ "owner": "Administrator",
+ "permissions": [
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "print": 1,
+ "read": 1,
+ "role": "Administrator",
+ "share": 1,
+ "write": 1
+ }
+ ],
+ "read_only": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "states": []
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py
new file mode 100644
index 0000000000..da273b9f89
--- /dev/null
+++ b/erpnext/accounts/doctype/bisect_accounting_statements/bisect_accounting_statements.py
@@ -0,0 +1,226 @@
+# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+import datetime
+from collections import deque
+from math import floor
+
+import frappe
+from dateutil.relativedelta import relativedelta
+from frappe import _
+from frappe.model.document import Document
+from frappe.utils import getdate
+from frappe.utils.data import guess_date_format
+
+
+class BisectAccountingStatements(Document):
+ # begin: auto-generated types
+ # This code is auto-generated. Do not modify anything in this block.
+
+ from typing import TYPE_CHECKING
+
+ if TYPE_CHECKING:
+ from frappe.types import DF
+
+ algorithm: DF.Literal["BFS", "DFS"]
+ b_s_summary: DF.Float
+ company: DF.Link | None
+ current_from_date: DF.Datetime | None
+ current_node: DF.Link | None
+ current_to_date: DF.Datetime | None
+ difference: DF.Float
+ from_date: DF.Datetime | None
+ p_l_summary: DF.Float
+ to_date: DF.Datetime | None
+ # end: auto-generated types
+
+ def validate(self):
+ self.validate_dates()
+
+ def validate_dates(self):
+ if getdate(self.from_date) > getdate(self.to_date):
+ frappe.throw(
+ _("From Date: {0} cannot be greater than To date: {1}").format(
+ frappe.bold(self.from_date), frappe.bold(self.to_date)
+ )
+ )
+
+ def bfs(self, from_date: datetime, to_date: datetime):
+ # Make Root node
+ node = frappe.new_doc("Bisect Nodes")
+ node.root = None
+ node.period_from_date = from_date
+ node.period_to_date = to_date
+ node.insert()
+
+ period_queue = deque([node])
+ while period_queue:
+ cur_node = period_queue.popleft()
+ delta = cur_node.period_to_date - cur_node.period_from_date
+ if delta.days == 0:
+ continue
+ else:
+ cur_floor = floor(delta.days / 2)
+ next_to_date = cur_node.period_from_date + relativedelta(days=+cur_floor)
+ left_node = frappe.new_doc("Bisect Nodes")
+ left_node.period_from_date = cur_node.period_from_date
+ left_node.period_to_date = next_to_date
+ left_node.root = cur_node.name
+ left_node.generated = False
+ left_node.insert()
+ cur_node.left_child = left_node.name
+ period_queue.append(left_node)
+
+ next_from_date = cur_node.period_from_date + relativedelta(days=+(cur_floor + 1))
+ right_node = frappe.new_doc("Bisect Nodes")
+ right_node.period_from_date = next_from_date
+ right_node.period_to_date = cur_node.period_to_date
+ right_node.root = cur_node.name
+ right_node.generated = False
+ right_node.insert()
+ cur_node.right_child = right_node.name
+ period_queue.append(right_node)
+
+ cur_node.save()
+
+ def dfs(self, from_date: datetime, to_date: datetime):
+ # Make Root node
+ node = frappe.new_doc("Bisect Nodes")
+ node.root = None
+ node.period_from_date = from_date
+ node.period_to_date = to_date
+ node.insert()
+
+ period_stack = [node]
+ while period_stack:
+ cur_node = period_stack.pop()
+ delta = cur_node.period_to_date - cur_node.period_from_date
+ if delta.days == 0:
+ continue
+ else:
+ cur_floor = floor(delta.days / 2)
+ next_to_date = cur_node.period_from_date + relativedelta(days=+cur_floor)
+ left_node = frappe.new_doc("Bisect Nodes")
+ left_node.period_from_date = cur_node.period_from_date
+ left_node.period_to_date = next_to_date
+ left_node.root = cur_node.name
+ left_node.generated = False
+ left_node.insert()
+ cur_node.left_child = left_node.name
+ period_stack.append(left_node)
+
+ next_from_date = cur_node.period_from_date + relativedelta(days=+(cur_floor + 1))
+ right_node = frappe.new_doc("Bisect Nodes")
+ right_node.period_from_date = next_from_date
+ right_node.period_to_date = cur_node.period_to_date
+ right_node.root = cur_node.name
+ right_node.generated = False
+ right_node.insert()
+ cur_node.right_child = right_node.name
+ period_stack.append(right_node)
+
+ cur_node.save()
+
+ @frappe.whitelist()
+ def build_tree(self):
+ frappe.db.delete("Bisect Nodes")
+
+ # Convert str to datetime format
+ dt_format = guess_date_format(self.from_date)
+ from_date = datetime.datetime.strptime(self.from_date, dt_format)
+ to_date = datetime.datetime.strptime(self.to_date, dt_format)
+
+ if self.algorithm == "BFS":
+ self.bfs(from_date, to_date)
+
+ if self.algorithm == "DFS":
+ self.dfs(from_date, to_date)
+
+ # set root as current node
+ root = frappe.db.get_all("Bisect Nodes", filters={"root": ["is", "not set"]})[0]
+ self.get_report_summary()
+ self.current_node = root.name
+ self.current_from_date = self.from_date
+ self.current_to_date = self.to_date
+ self.save()
+
+ def get_report_summary(self):
+ filters = {
+ "company": self.company,
+ "filter_based_on": "Date Range",
+ "period_start_date": self.current_from_date,
+ "period_end_date": self.current_to_date,
+ "periodicity": "Yearly",
+ }
+ pl_summary = frappe.get_doc("Report", "Profit and Loss Statement")
+ self.p_l_summary = pl_summary.execute_script_report(filters=filters)[5]
+ bs_summary = frappe.get_doc("Report", "Balance Sheet")
+ self.b_s_summary = bs_summary.execute_script_report(filters=filters)[5]
+ self.difference = abs(self.p_l_summary - self.b_s_summary)
+
+ def update_node(self):
+ current_node = frappe.get_doc("Bisect Nodes", self.current_node)
+ current_node.balance_sheet_summary = self.b_s_summary
+ current_node.profit_loss_summary = self.p_l_summary
+ current_node.difference = self.difference
+ current_node.generated = True
+ current_node.save()
+
+ def current_node_has_summary_info(self):
+ "Assertion method"
+ return frappe.db.get_value("Bisect Nodes", self.current_node, "generated")
+
+ def fetch_summary_info_from_current_node(self):
+ current_node = frappe.get_doc("Bisect Nodes", self.current_node)
+ self.p_l_summary = current_node.balance_sheet_summary
+ self.b_s_summary = current_node.profit_loss_summary
+ self.difference = abs(self.p_l_summary - self.b_s_summary)
+
+ def fetch_or_calculate(self):
+ if self.current_node_has_summary_info():
+ self.fetch_summary_info_from_current_node()
+ else:
+ self.get_report_summary()
+ self.update_node()
+
+ @frappe.whitelist()
+ def bisect_left(self):
+ if self.current_node is not None:
+ cur_node = frappe.get_doc("Bisect Nodes", self.current_node)
+ if cur_node.left_child is not None:
+ lft_node = frappe.get_doc("Bisect Nodes", cur_node.left_child)
+ self.current_node = cur_node.left_child
+ self.current_from_date = lft_node.period_from_date
+ self.current_to_date = lft_node.period_to_date
+ self.fetch_or_calculate()
+ self.save()
+ else:
+ frappe.msgprint(_("No more children on Left"))
+
+ @frappe.whitelist()
+ def bisect_right(self):
+ if self.current_node is not None:
+ cur_node = frappe.get_doc("Bisect Nodes", self.current_node)
+ if cur_node.right_child is not None:
+ rgt_node = frappe.get_doc("Bisect Nodes", cur_node.right_child)
+ self.current_node = cur_node.right_child
+ self.current_from_date = rgt_node.period_from_date
+ self.current_to_date = rgt_node.period_to_date
+ self.fetch_or_calculate()
+ self.save()
+ else:
+ frappe.msgprint(_("No more children on Right"))
+
+ @frappe.whitelist()
+ def move_up(self):
+ if self.current_node is not None:
+ cur_node = frappe.get_doc("Bisect Nodes", self.current_node)
+ if cur_node.root is not None:
+ root = frappe.get_doc("Bisect Nodes", cur_node.root)
+ self.current_node = cur_node.root
+ self.current_from_date = root.period_from_date
+ self.current_to_date = root.period_to_date
+ self.fetch_or_calculate()
+ self.save()
+ else:
+ frappe.msgprint(_("Reached Root"))
diff --git a/erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py b/erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py
new file mode 100644
index 0000000000..56ecc94a18
--- /dev/null
+++ b/erpnext/accounts/doctype/bisect_accounting_statements/test_bisect_accounting_statements.py
@@ -0,0 +1,9 @@
+# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+
+# import frappe
+from frappe.tests.utils import FrappeTestCase
+
+
+class TestBisectAccountingStatements(FrappeTestCase):
+ pass
diff --git a/erpnext/accounts/doctype/bisect_nodes/__init__.py b/erpnext/accounts/doctype/bisect_nodes/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.js b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.js
new file mode 100644
index 0000000000..6dea25fc92
--- /dev/null
+++ b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.js
@@ -0,0 +1,8 @@
+// Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+// frappe.ui.form.on("Bisect Nodes", {
+// refresh(frm) {
+
+// },
+// });
diff --git a/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json
new file mode 100644
index 0000000000..03fad261c3
--- /dev/null
+++ b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.json
@@ -0,0 +1,97 @@
+{
+ "actions": [],
+ "autoname": "autoincrement",
+ "creation": "2023-09-27 14:56:38.112462",
+ "default_view": "List",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "root",
+ "left_child",
+ "right_child",
+ "period_from_date",
+ "period_to_date",
+ "difference",
+ "balance_sheet_summary",
+ "profit_loss_summary",
+ "generated"
+ ],
+ "fields": [
+ {
+ "fieldname": "root",
+ "fieldtype": "Link",
+ "label": "Root",
+ "options": "Bisect Nodes"
+ },
+ {
+ "fieldname": "left_child",
+ "fieldtype": "Link",
+ "label": "Left Child",
+ "options": "Bisect Nodes"
+ },
+ {
+ "fieldname": "right_child",
+ "fieldtype": "Link",
+ "label": "Right Child",
+ "options": "Bisect Nodes"
+ },
+ {
+ "fieldname": "period_from_date",
+ "fieldtype": "Datetime",
+ "label": "Period_from_date"
+ },
+ {
+ "fieldname": "period_to_date",
+ "fieldtype": "Datetime",
+ "label": "Period To Date"
+ },
+ {
+ "fieldname": "difference",
+ "fieldtype": "Float",
+ "label": "Difference"
+ },
+ {
+ "fieldname": "balance_sheet_summary",
+ "fieldtype": "Float",
+ "label": "Balance Sheet Summary"
+ },
+ {
+ "fieldname": "profit_loss_summary",
+ "fieldtype": "Float",
+ "label": "Profit and Loss Summary"
+ },
+ {
+ "default": "0",
+ "fieldname": "generated",
+ "fieldtype": "Check",
+ "label": "Generated"
+ }
+ ],
+ "index_web_pages_for_search": 1,
+ "links": [],
+ "modified": "2023-12-01 17:46:12.437996",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Bisect Nodes",
+ "naming_rule": "Autoincrement",
+ "owner": "Administrator",
+ "permissions": [
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export": 1,
+ "print": 1,
+ "read": 1,
+ "report": 1,
+ "role": "Administrator",
+ "share": 1,
+ "write": 1
+ }
+ ],
+ "read_only": 1,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "states": []
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py
new file mode 100644
index 0000000000..f50776641d
--- /dev/null
+++ b/erpnext/accounts/doctype/bisect_nodes/bisect_nodes.py
@@ -0,0 +1,29 @@
+# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+# import frappe
+from frappe.model.document import Document
+
+
+class BisectNodes(Document):
+ # begin: auto-generated types
+ # This code is auto-generated. Do not modify anything in this block.
+
+ from typing import TYPE_CHECKING
+
+ if TYPE_CHECKING:
+ from frappe.types import DF
+
+ balance_sheet_summary: DF.Float
+ difference: DF.Float
+ generated: DF.Check
+ left_child: DF.Link | None
+ name: DF.Int | None
+ period_from_date: DF.Datetime | None
+ period_to_date: DF.Datetime | None
+ profit_loss_summary: DF.Float
+ right_child: DF.Link | None
+ root: DF.Link | None
+ # end: auto-generated types
+
+ pass
diff --git a/erpnext/accounts/doctype/bisect_nodes/test_bisect_nodes.py b/erpnext/accounts/doctype/bisect_nodes/test_bisect_nodes.py
new file mode 100644
index 0000000000..5399df139f
--- /dev/null
+++ b/erpnext/accounts/doctype/bisect_nodes/test_bisect_nodes.py
@@ -0,0 +1,9 @@
+# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+
+# import frappe
+from frappe.tests.utils import FrappeTestCase
+
+
+class TestBisectNodes(FrappeTestCase):
+ pass
diff --git a/erpnext/accounts/doctype/cashier_closing/cashier_closing.json b/erpnext/accounts/doctype/cashier_closing/cashier_closing.json
index 1b38f0d36d..051b44b586 100644
--- a/erpnext/accounts/doctype/cashier_closing/cashier_closing.json
+++ b/erpnext/accounts/doctype/cashier_closing/cashier_closing.json
@@ -1,457 +1,152 @@
{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
+ "actions": [],
"autoname": "naming_series:",
- "beta": 0,
"creation": "2018-06-18 16:51:49.994750",
- "custom": 0,
- "docstatus": 0,
"doctype": "DocType",
- "document_type": "",
"editable_grid": 1,
"engine": "InnoDB",
+ "field_order": [
+ "naming_series",
+ "user",
+ "date",
+ "from_time",
+ "time",
+ "expense",
+ "custody",
+ "returns",
+ "outstanding_amount",
+ "payments",
+ "net_amount",
+ "amended_from"
+ ],
"fields": [
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
"default": "POS-CLO-",
"fieldname": "naming_series",
"fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
"in_filter": 1,
"in_global_search": 1,
- "in_list_view": 0,
"in_standard_filter": 1,
"label": "Series",
- "length": 0,
- "no_copy": 0,
"options": "POS-CLO-",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
+ "read_only": 1
},
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
"fieldname": "user",
"fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
"in_filter": 1,
- "in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "User",
- "length": 0,
- "no_copy": 0,
"options": "User",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
"read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
+ "reqd": 1
},
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
"default": "Today",
"fieldname": "date",
"fieldtype": "Date",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
"in_filter": 1,
- "in_global_search": 0,
- "in_list_view": 0,
"in_standard_filter": 1,
"label": "Date",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
+ "read_only": 1
},
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
"fieldname": "from_time",
"fieldtype": "Time",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
"in_filter": 1,
- "in_global_search": 0,
- "in_list_view": 0,
"in_standard_filter": 1,
"label": "From Time",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
+ "reqd": 1
},
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "",
"fieldname": "time",
"fieldtype": "Time",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
"in_filter": 1,
- "in_global_search": 0,
- "in_list_view": 0,
"in_standard_filter": 1,
"label": "To Time",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
+ "reqd": 1
},
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
"default": "0.00",
"fieldname": "expense",
"fieldtype": "Float",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
"in_filter": 1,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Expense",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
+ "label": "Expense"
},
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
"default": "0.00",
"fieldname": "custody",
"fieldtype": "Float",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
"in_filter": 1,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Custody",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
+ "label": "Custody"
},
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
"default": "0.00",
"fieldname": "returns",
"fieldtype": "Float",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
"in_filter": 1,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
"label": "Returns",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "2",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
+ "precision": "2"
},
{
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
"default": "0.00",
"fieldname": "outstanding_amount",
"fieldtype": "Float",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
"label": "Outstanding Amount",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
+ "read_only": 1
},
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "0.0",
"fieldname": "payments",
"fieldtype": "Table",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
"in_filter": 1,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
"label": "Payments",
- "length": 0,
- "no_copy": 0,
- "options": "Cashier Closing Payments",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
+ "options": "Cashier Closing Payments"
},
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
"fieldname": "net_amount",
"fieldtype": "Float",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
"in_filter": 1,
- "in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 1,
"label": "Net Amount",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
+ "read_only": 1
},
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
"fieldname": "amended_from",
"fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
"label": "Amended From",
- "length": 0,
"no_copy": 1,
"options": "Cashier Closing",
- "permlevel": 0,
"print_hide": 1,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
+ "read_only": 1
}
],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
"is_submittable": 1,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2019-02-19 08:35:24.157327",
+ "links": [],
+ "modified": "2023-12-28 13:15:46.858427",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Cashier Closing",
- "name_case": "",
+ "naming_rule": "By \"Naming Series\" field",
"owner": "Administrator",
"permissions": [
{
- "amend": 0,
- "cancel": 0,
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
- "set_user_permissions": 0,
"share": 1,
"submit": 1,
"write": 1
}
],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
"sort_field": "modified",
"sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
+ "states": [],
+ "track_changes": 1
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.json b/erpnext/accounts/doctype/gl_entry/gl_entry.json
index 5063ec6076..09912e9896 100644
--- a/erpnext/accounts/doctype/gl_entry/gl_entry.json
+++ b/erpnext/accounts/doctype/gl_entry/gl_entry.json
@@ -17,10 +17,13 @@
"account_currency",
"debit_in_account_currency",
"credit_in_account_currency",
+ "against_type",
"against",
+ "against_link",
"against_voucher_type",
"against_voucher",
"voucher_type",
+ "voucher_subtype",
"voucher_no",
"voucher_detail_no",
"project",
@@ -128,6 +131,13 @@
"label": "Credit Amount in Account Currency",
"options": "account_currency"
},
+ {
+ "fieldname": "against_type",
+ "fieldtype": "Link",
+ "in_filter": 1,
+ "label": "Against Type",
+ "options": "DocType"
+ },
{
"fieldname": "against",
"fieldtype": "Text",
@@ -136,14 +146,20 @@
"oldfieldname": "against",
"oldfieldtype": "Text"
},
+ {
+ "fieldname": "against_link",
+ "fieldtype": "Dynamic Link",
+ "in_filter": 1,
+ "label": "Against",
+ "options": "against_type"
+ },
{
"fieldname": "against_voucher_type",
"fieldtype": "Link",
"label": "Against Voucher Type",
"oldfieldname": "against_voucher_type",
"oldfieldtype": "Data",
- "options": "DocType",
- "search_index": 1
+ "options": "DocType"
},
{
"fieldname": "against_voucher",
@@ -162,8 +178,7 @@
"label": "Voucher Type",
"oldfieldname": "voucher_type",
"oldfieldtype": "Select",
- "options": "DocType",
- "search_index": 1
+ "options": "DocType"
},
{
"fieldname": "voucher_no",
@@ -280,13 +295,18 @@
"fieldtype": "Currency",
"label": "Credit Amount in Transaction Currency",
"options": "transaction_currency"
+ },
+ {
+ "fieldname": "voucher_subtype",
+ "fieldtype": "Small Text",
+ "label": "Voucher Subtype"
}
],
"icon": "fa fa-list",
"idx": 1,
"in_create": 1,
"links": [],
- "modified": "2023-08-16 21:38:44.072267",
+ "modified": "2023-12-18 15:38:14.006208",
"modified_by": "Administrator",
"module": "Accounts",
"name": "GL Entry",
@@ -321,4 +341,4 @@
"sort_field": "modified",
"sort_order": "DESC",
"states": []
-}
\ No newline at end of file
+}
diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py
index f7dd29ab1c..777a5bb91c 100644
--- a/erpnext/accounts/doctype/gl_entry/gl_entry.py
+++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py
@@ -39,6 +39,8 @@ class GLEntry(Document):
account: DF.Link | None
account_currency: DF.Link | None
against: DF.Text | None
+ against_link: DF.DynamicLink | None
+ against_type: DF.Link | None
against_voucher: DF.DynamicLink | None
against_voucher_type: DF.Link | None
company: DF.Link | None
@@ -66,6 +68,7 @@ class GLEntry(Document):
transaction_exchange_rate: DF.Float
voucher_detail_no: DF.Data | None
voucher_no: DF.DynamicLink | None
+ voucher_subtype: DF.SmallText | None
voucher_type: DF.Link | None
# end: auto-generated types
@@ -432,8 +435,8 @@ def update_outstanding_amt(
def validate_frozen_account(account, adv_adj=None):
frozen_account = frappe.get_cached_value("Account", account, "freeze_account")
if frozen_account == "Yes" and not adv_adj:
- frozen_accounts_modifier = frappe.db.get_value(
- "Accounts Settings", None, "frozen_accounts_modifier"
+ frozen_accounts_modifier = frappe.db.get_single_value(
+ "Accounts Settings", "frozen_accounts_modifier"
)
if not frozen_accounts_modifier:
diff --git a/erpnext/accounts/doctype/invoice_discounting/invoice_discounting.py b/erpnext/accounts/doctype/invoice_discounting/invoice_discounting.py
index 76f4dadf87..69b0860a30 100644
--- a/erpnext/accounts/doctype/invoice_discounting/invoice_discounting.py
+++ b/erpnext/accounts/doctype/invoice_discounting/invoice_discounting.py
@@ -153,7 +153,9 @@ class InvoiceDiscounting(AccountsController):
"account": inv.debit_to,
"party_type": "Customer",
"party": d.customer,
+ "against_type": "Account",
"against": self.accounts_receivable_credit,
+ "against_link": self.accounts_receivable_credit,
"credit": outstanding_in_company_currency,
"credit_in_account_currency": outstanding_in_company_currency
if inv.party_account_currency == company_currency
@@ -173,7 +175,9 @@ class InvoiceDiscounting(AccountsController):
"account": self.accounts_receivable_credit,
"party_type": "Customer",
"party": d.customer,
+ "against_type": "Account",
"against": inv.debit_to,
+ "against_link": inv.debit_to,
"debit": outstanding_in_company_currency,
"debit_in_account_currency": outstanding_in_company_currency
if ar_credit_account_currency == company_currency
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js
index 07fb5e857c..abf8781d8f 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.js
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js
@@ -220,6 +220,16 @@ erpnext.accounts.JournalEntry = class JournalEntry extends frappe.ui.form.Contro
return erpnext.journal_entry.account_query(me.frm);
});
+ me.frm.set_query("against_account_link", "accounts", function(doc, cdt, cdn) {
+ return erpnext.journal_entry.against_account_query(me.frm);
+ });
+
+ me.frm.set_query("against_type", "accounts", function(){
+ return {
+ query: "erpnext.accounts.doctype.journal_entry.journal_entry.get_against_type",
+ }
+ })
+
me.frm.set_query("party_type", "accounts", function(doc, cdt, cdn) {
const row = locals[cdt][cdn];
@@ -591,6 +601,21 @@ $.extend(erpnext.journal_entry, {
return { filters: filters };
},
+ against_account_query: function(frm) {
+ if (frm.doc.against_type != "Account"){
+ return { filters: {} };
+ }
+ else {
+ let filters = { company: frm.doc.company, is_group: 0 };
+ if(!frm.doc.multi_currency) {
+ $.extend(filters, {
+ account_currency: ['in', [frappe.get_doc(":Company", frm.doc.company).default_currency, null]]
+ });
+ }
+ return { filters: filters };
+ }
+ },
+
reverse_journal_entry: function() {
frappe.model.open_mapped_doc({
method: "erpnext.accounts.doctype.journal_entry.journal_entry.make_reverse_journal_entry",
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index 40d552bc88..ddf6460842 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -304,6 +304,7 @@ class JournalEntry(AccountsController):
"account": tax_withholding_details.get("account_head"),
rev_debit_or_credit: tax_withholding_details.get("tax_amount"),
"against_account": parties[0],
+ "against_account_link": parties[0],
},
)
@@ -750,27 +751,90 @@ class JournalEntry(AccountsController):
)
def set_against_account(self):
- accounts_debited, accounts_credited = [], []
if self.voucher_type in ("Deferred Revenue", "Deferred Expense"):
for d in self.get("accounts"):
if d.reference_type == "Sales Invoice":
- field = "customer"
+ against_type = "Customer"
else:
- field = "supplier"
+ against_type = "Supplier"
- d.against_account = frappe.db.get_value(d.reference_type, d.reference_name, field)
+ against_account = frappe.db.get_value(d.reference_type, d.reference_name, against_type.lower())
+ d.against_type = against_type
+ d.against_account_link = against_account
else:
- for d in self.get("accounts"):
- if flt(d.debit) > 0:
- accounts_debited.append(d.party or d.account)
- if flt(d.credit) > 0:
- accounts_credited.append(d.party or d.account)
+ self.get_debited_credited_accounts()
+ if len(self.accounts_credited) > 1 and len(self.accounts_debited) > 1:
+ self.auto_set_against_accounts()
+ return
+ self.get_against_accounts()
- for d in self.get("accounts"):
- if flt(d.debit) > 0:
- d.against_account = ", ".join(list(set(accounts_credited)))
- if flt(d.credit) > 0:
- d.against_account = ", ".join(list(set(accounts_debited)))
+ def auto_set_against_accounts(self):
+ for i in range(0, len(self.accounts), 2):
+ acc = self.accounts[i]
+ against_acc = self.accounts[i + 1]
+ if acc.debit_in_account_currency > 0:
+ current_val = acc.debit_in_account_currency * flt(acc.exchange_rate)
+ against_val = against_acc.credit_in_account_currency * flt(against_acc.exchange_rate)
+ else:
+ current_val = acc.credit_in_account_currency * flt(acc.exchange_rate)
+ against_val = against_acc.debit_in_account_currency * flt(against_acc.exchange_rate)
+
+ if current_val == against_val:
+ acc.against_type = against_acc.party_type or "Account"
+ against_acc.against_type = acc.party_type or "Account"
+
+ acc.against_account_link = against_acc.party or against_acc.account
+ against_acc.against_account_link = acc.party or acc.account
+ else:
+ frappe.msgprint(
+ _(
+ "Unable to automatically determine {0} accounts. Set them up in the {1} table if needed."
+ ).format(frappe.bold("against"), frappe.bold("Accounting Entries")),
+ alert=True,
+ )
+ break
+
+ def get_against_accounts(self):
+ self.against_accounts = []
+ self.split_account = {}
+ self.get_debited_credited_accounts()
+
+ if self.separate_against_account_entries:
+ no_of_credited_acc, no_of_debited_acc = len(self.accounts_credited), len(self.accounts_debited)
+ if no_of_credited_acc <= 1 and no_of_debited_acc <= 1:
+ self.set_against_accounts_for_single_dr_cr()
+ self.separate_against_account_entries = 0
+ elif no_of_credited_acc == 1:
+ self.against_accounts = self.accounts_debited
+ self.split_account = self.accounts_credited[0]
+ elif no_of_debited_acc == 1:
+ self.against_accounts = self.accounts_credited
+ self.split_account = self.accounts_debited[0]
+
+ def get_debited_credited_accounts(self):
+ self.accounts_debited, self.accounts_credited = [], []
+ self.separate_against_account_entries = 1
+ for d in self.get("accounts"):
+ if flt(d.debit) > 0:
+ self.accounts_debited.append(d)
+ elif flt(d.credit) > 0:
+ self.accounts_credited.append(d)
+
+ if d.against_account_link:
+ self.separate_against_account_entries = 0
+ break
+
+ def set_against_accounts_for_single_dr_cr(self):
+ against_account = None
+ for d in self.accounts:
+ if flt(d.debit) > 0:
+ against_account = self.accounts_credited[0]
+ elif flt(d.credit) > 0:
+ against_account = self.accounts_debited[0]
+ if against_account:
+ d.against_type = against_account.party_type or "Account"
+ d.against_account = against_account.party or against_account.account
+ d.against_account_link = against_account.party or against_account.account
def validate_debit_credit_amount(self):
if not (self.voucher_type == "Exchange Gain Or Loss" and self.multi_currency):
@@ -967,42 +1031,108 @@ class JournalEntry(AccountsController):
def build_gl_map(self):
gl_map = []
+ conversion_rate_map = self.get_conversion_rate_map()
+ transaction_currency_map = self.get_transaction_currency_map()
+ company_currency = erpnext.get_company_currency(self.company)
+
+ self.get_against_accounts()
for d in self.get("accounts"):
if d.debit or d.credit or (self.voucher_type == "Exchange Gain Or Loss"):
r = [d.user_remark, self.remark]
r = [x for x in r if x]
remarks = "\n".join(r)
- gl_map.append(
- self.get_gl_dict(
- {
- "account": d.account,
- "party_type": d.party_type,
- "due_date": self.due_date,
- "party": d.party,
- "against": d.against_account,
- "debit": flt(d.debit, d.precision("debit")),
- "credit": flt(d.credit, d.precision("credit")),
- "account_currency": d.account_currency,
- "debit_in_account_currency": flt(
- d.debit_in_account_currency, d.precision("debit_in_account_currency")
- ),
- "credit_in_account_currency": flt(
- d.credit_in_account_currency, d.precision("credit_in_account_currency")
- ),
- "against_voucher_type": d.reference_type,
- "against_voucher": d.reference_name,
- "remarks": remarks,
- "voucher_detail_no": d.reference_detail_no,
- "cost_center": d.cost_center,
- "project": d.project,
- "finance_book": self.finance_book,
- },
- item=d,
- )
+ gl_dict = self.get_gl_dict(
+ {
+ "account": d.account,
+ "party_type": d.party_type,
+ "due_date": self.due_date,
+ "party": d.party,
+ "debit": flt(d.debit, d.precision("debit")),
+ "credit": flt(d.credit, d.precision("credit")),
+ "account_currency": d.account_currency,
+ "debit_in_account_currency": flt(
+ d.debit_in_account_currency, d.precision("debit_in_account_currency")
+ ),
+ "credit_in_account_currency": flt(
+ d.credit_in_account_currency, d.precision("credit_in_account_currency")
+ ),
+ "against_voucher_type": d.reference_type,
+ "against_voucher": d.reference_name,
+ "remarks": remarks,
+ "voucher_detail_no": d.reference_detail_no,
+ "cost_center": d.cost_center,
+ "project": d.project,
+ "finance_book": self.finance_book,
+ "conversion_rate": conversion_rate_map.get(d.against_account_link, 1)
+ if d.account_currency == company_currency
+ else 1,
+ "currency": transaction_currency_map.get(d.against_account_link, d.account_currency)
+ if d.account_currency == company_currency
+ else d.account_currency,
+ },
+ item=d,
)
+
+ if not self.separate_against_account_entries:
+ gl_dict.update(
+ {
+ "against_type": d.against_type,
+ "against_link": d.against_account_link,
+ }
+ )
+ gl_map.append(gl_dict)
+
+ elif d in self.against_accounts:
+ gl_dict.update(
+ {
+ "against_type": self.split_account.get("party_type") or "Account",
+ "against": self.split_account.get("party") or self.split_account.get("account"),
+ "against_link": self.split_account.get("party") or self.split_account.get("account"),
+ }
+ )
+ gl_map.append(gl_dict)
+
+ else:
+ for against_account in self.against_accounts:
+ against_account = against_account.as_dict()
+ debit = against_account.credit or against_account.credit_in_account_currency
+ credit = against_account.debit or against_account.debit_in_account_currency
+ gl_dict = gl_dict.copy()
+ gl_dict.update(
+ {
+ "against_type": against_account.party_type or "Account",
+ "against": against_account.party or against_account.account,
+ "against_link": against_account.party or against_account.account,
+ "debit": flt(debit, d.precision("debit")),
+ "credit": flt(credit, d.precision("credit")),
+ "account_currency": d.account_currency,
+ "debit_in_account_currency": flt(
+ debit / d.exchange_rate, d.precision("debit_in_account_currency")
+ ),
+ "credit_in_account_currency": flt(
+ credit / d.exchange_rate, d.precision("credit_in_account_currency")
+ ),
+ }
+ )
+ gl_map.append(gl_dict)
+
return gl_map
+ def get_transaction_currency_map(self):
+ transaction_currency_map = {}
+ for account in self.get("accounts"):
+ transaction_currency_map.setdefault(account.party or account.account, account.account_currency)
+
+ return transaction_currency_map
+
+ def get_conversion_rate_map(self):
+ conversion_rate_map = {}
+ for account in self.get("accounts"):
+ conversion_rate_map.setdefault(account.party or account.account, account.exchange_rate)
+
+ return conversion_rate_map
+
def make_gl_entries(self, cancel=0, adv_adj=0):
from erpnext.accounts.general_ledger import make_gl_entries
@@ -1625,3 +1755,10 @@ def make_reverse_journal_entry(source_name, target_doc=None):
)
return doclist
+
+
+@frappe.whitelist()
+def get_against_type(doctype, txt, searchfield, start, page_len, filters):
+ against_types = frappe.db.get_list("Party Type", pluck="name") + ["Account"]
+ doctype = frappe.qb.DocType("DocType")
+ return frappe.qb.from_(doctype).select(doctype.name).where(doctype.name.isin(against_types)).run()
diff --git a/erpnext/accounts/doctype/journal_entry/test_records.json b/erpnext/accounts/doctype/journal_entry/test_records.json
index dafcf56abd..717c579c7a 100644
--- a/erpnext/accounts/doctype/journal_entry/test_records.json
+++ b/erpnext/accounts/doctype/journal_entry/test_records.json
@@ -1,97 +1,94 @@
[
- {
- "cheque_date": "2013-03-14",
- "cheque_no": "33",
- "company": "_Test Company",
- "doctype": "Journal Entry",
- "accounts": [
- {
- "account": "Debtors - _TC",
- "party_type": "Customer",
- "party": "_Test Customer",
- "credit_in_account_currency": 400.0,
- "debit_in_account_currency": 0.0,
- "doctype": "Journal Entry Account",
- "parentfield": "accounts",
- "cost_center": "_Test Cost Center - _TC"
- },
- {
- "account": "_Test Bank - _TC",
- "credit_in_account_currency": 0.0,
- "debit_in_account_currency": 400.0,
- "doctype": "Journal Entry Account",
- "parentfield": "accounts",
- "cost_center": "_Test Cost Center - _TC"
- }
- ],
- "naming_series": "_T-Journal Entry-",
- "posting_date": "2013-02-14",
- "user_remark": "test",
- "voucher_type": "Bank Entry"
- },
-
-
- {
- "cheque_date": "2013-02-14",
- "cheque_no": "33",
- "company": "_Test Company",
- "doctype": "Journal Entry",
- "accounts": [
- {
- "account": "_Test Payable - _TC",
- "party_type": "Supplier",
- "party": "_Test Supplier",
- "credit_in_account_currency": 0.0,
- "debit_in_account_currency": 400.0,
- "doctype": "Journal Entry Account",
- "parentfield": "accounts",
- "cost_center": "_Test Cost Center - _TC"
- },
- {
- "account": "_Test Bank - _TC",
- "credit_in_account_currency": 400.0,
- "debit_in_account_currency": 0.0,
- "doctype": "Journal Entry Account",
- "parentfield": "accounts",
- "cost_center": "_Test Cost Center - _TC"
- }
- ],
- "naming_series": "_T-Journal Entry-",
- "posting_date": "2013-02-14",
- "user_remark": "test",
- "voucher_type": "Bank Entry"
- },
-
-
- {
- "cheque_date": "2013-02-14",
- "cheque_no": "33",
- "company": "_Test Company",
- "doctype": "Journal Entry",
- "accounts": [
- {
- "account": "Debtors - _TC",
- "party_type": "Customer",
- "party": "_Test Customer",
- "credit_in_account_currency": 0.0,
- "debit_in_account_currency": 400.0,
- "doctype": "Journal Entry Account",
- "parentfield": "accounts",
- "cost_center": "_Test Cost Center - _TC"
- },
- {
- "account": "Sales - _TC",
- "cost_center": "_Test Cost Center - _TC",
- "credit_in_account_currency": 400.0,
- "debit_in_account_currency": 0.0,
- "doctype": "Journal Entry Account",
- "parentfield": "accounts",
- "cost_center": "_Test Cost Center - _TC"
- }
- ],
- "naming_series": "_T-Journal Entry-",
- "posting_date": "2013-02-14",
- "user_remark": "test",
- "voucher_type": "Bank Entry"
- }
+ {
+ "cheque_date": "2013-03-14",
+ "cheque_no": "33",
+ "company": "_Test Company",
+ "doctype": "Journal Entry",
+ "accounts": [
+ {
+ "account": "Debtors - _TC",
+ "party_type": "Customer",
+ "party": "_Test Customer",
+ "credit_in_account_currency": 400.0,
+ "debit_in_account_currency": 0.0,
+ "doctype": "Journal Entry Account",
+ "parentfield": "accounts",
+ "cost_center": "_Test Cost Center - _TC"
+ },
+ {
+ "account": "_Test Bank - _TC",
+ "credit_in_account_currency": 0.0,
+ "debit_in_account_currency": 400.0,
+ "doctype": "Journal Entry Account",
+ "parentfield": "accounts",
+ "cost_center": "_Test Cost Center - _TC"
+ }
+ ],
+ "naming_series": "_T-Journal Entry-",
+ "posting_date": "2013-02-14",
+ "user_remark": "test",
+ "voucher_type": "Bank Entry"
+ },
+
+ {
+ "cheque_date": "2013-02-14",
+ "cheque_no": "33",
+ "company": "_Test Company",
+ "doctype": "Journal Entry",
+ "accounts": [
+ {
+ "account": "_Test Payable - _TC",
+ "party_type": "Supplier",
+ "party": "_Test Supplier",
+ "credit_in_account_currency": 0.0,
+ "debit_in_account_currency": 400.0,
+ "doctype": "Journal Entry Account",
+ "parentfield": "accounts",
+ "cost_center": "_Test Cost Center - _TC"
+ },
+ {
+ "account": "_Test Bank - _TC",
+ "credit_in_account_currency": 400.0,
+ "debit_in_account_currency": 0.0,
+ "doctype": "Journal Entry Account",
+ "parentfield": "accounts",
+ "cost_center": "_Test Cost Center - _TC"
+ }
+ ],
+ "naming_series": "_T-Journal Entry-",
+ "posting_date": "2013-02-14",
+ "user_remark": "test",
+ "voucher_type": "Bank Entry"
+ },
+
+ {
+ "cheque_date": "2013-02-14",
+ "cheque_no": "33",
+ "company": "_Test Company",
+ "doctype": "Journal Entry",
+ "accounts": [
+ {
+ "account": "Debtors - _TC",
+ "party_type": "Customer",
+ "party": "_Test Customer",
+ "credit_in_account_currency": 0.0,
+ "debit_in_account_currency": 400.0,
+ "doctype": "Journal Entry Account",
+ "parentfield": "accounts",
+ "cost_center": "_Test Cost Center - _TC"
+ },
+ {
+ "account": "Sales - _TC",
+ "credit_in_account_currency": 400.0,
+ "debit_in_account_currency": 0.0,
+ "doctype": "Journal Entry Account",
+ "parentfield": "accounts",
+ "cost_center": "_Test Cost Center - _TC"
+ }
+ ],
+ "naming_series": "_T-Journal Entry-",
+ "posting_date": "2013-02-14",
+ "user_remark": "test",
+ "voucher_type": "Bank Entry"
+ }
]
diff --git a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
index 3132fe9b12..01006bd3db 100644
--- a/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
+++ b/erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
@@ -37,7 +37,9 @@
"col_break3",
"is_advance",
"user_remark",
- "against_account"
+ "against_type",
+ "against_account",
+ "against_account_link"
],
"fields": [
{
@@ -250,14 +252,21 @@
"print_hide": 1
},
{
- "fieldname": "against_account",
- "fieldtype": "Text",
- "hidden": 1,
+ "fieldname": "against_account",
+ "fieldtype": "Text",
+ "hidden": 1,
+ "label": "Against Account",
+ "no_copy": 1,
+ "oldfieldname": "against_account",
+ "oldfieldtype": "Text",
+ "print_hide": 1
+ },
+ {
+ "fieldname": "against_account_link",
+ "fieldtype": "Dynamic Link",
"label": "Against Account",
"no_copy": 1,
- "oldfieldname": "against_account",
- "oldfieldtype": "Text",
- "print_hide": 1
+ "options": "against_type"
},
{
"collapsible": 1,
@@ -280,14 +289,19 @@
"fieldtype": "Data",
"hidden": 1,
"label": "Reference Detail No",
- "no_copy": 1,
- "search_index": 1
+ "no_copy": 1
+ },
+ {
+ "fieldname": "against_type",
+ "fieldtype": "Link",
+ "label": "Against Type",
+ "options": "DocType"
}
],
"idx": 1,
"istable": 1,
"links": [],
- "modified": "2023-11-23 11:44:25.841187",
+ "modified": "2023-12-02 23:21:22.205409",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Journal Entry Account",
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js
index 04719a1b0d..9402e3da09 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.js
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js
@@ -747,6 +747,10 @@ frappe.ui.form.on('Payment Entry', {
args["get_orders_to_be_billed"] = true;
}
+ if (frm.doc.book_advance_payments_in_separate_party_account) {
+ args["book_advance_payments_in_separate_party_account"] = true;
+ }
+
frappe.flags.allocate_payment_amount = filters['allocate_payment_amount'];
return frappe.call({
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json
index aa181564b0..3a1e1ea9ad 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.json
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json
@@ -223,6 +223,7 @@
"fieldname": "party_balance",
"fieldtype": "Currency",
"label": "Party Balance",
+ "no_copy": 1,
"print_hide": 1,
"read_only": 1
},
@@ -759,7 +760,7 @@
"table_fieldname": "payment_entries"
}
],
- "modified": "2023-11-23 12:07:20.887885",
+ "modified": "2024-01-08 13:17:15.744754",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Entry",
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index a6ddce5223..37bd8e6fcd 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -50,6 +50,88 @@ class InvalidPaymentEntry(ValidationError):
class PaymentEntry(AccountsController):
+ # begin: auto-generated types
+ # This code is auto-generated. Do not modify anything in this block.
+
+ from typing import TYPE_CHECKING
+
+ if TYPE_CHECKING:
+ from frappe.types import DF
+
+ from erpnext.accounts.doctype.advance_taxes_and_charges.advance_taxes_and_charges import (
+ AdvanceTaxesandCharges,
+ )
+ from erpnext.accounts.doctype.payment_entry_deduction.payment_entry_deduction import (
+ PaymentEntryDeduction,
+ )
+ from erpnext.accounts.doctype.payment_entry_reference.payment_entry_reference import (
+ PaymentEntryReference,
+ )
+
+ amended_from: DF.Link | None
+ apply_tax_withholding_amount: DF.Check
+ auto_repeat: DF.Link | None
+ bank: DF.ReadOnly | None
+ bank_account: DF.Link | None
+ bank_account_no: DF.ReadOnly | None
+ base_paid_amount: DF.Currency
+ base_paid_amount_after_tax: DF.Currency
+ base_received_amount: DF.Currency
+ base_received_amount_after_tax: DF.Currency
+ base_total_allocated_amount: DF.Currency
+ base_total_taxes_and_charges: DF.Currency
+ book_advance_payments_in_separate_party_account: DF.Check
+ clearance_date: DF.Date | None
+ company: DF.Link
+ contact_email: DF.Data | None
+ contact_person: DF.Link | None
+ cost_center: DF.Link | None
+ custom_remarks: DF.Check
+ deductions: DF.Table[PaymentEntryDeduction]
+ difference_amount: DF.Currency
+ letter_head: DF.Link | None
+ mode_of_payment: DF.Link | None
+ naming_series: DF.Literal["ACC-PAY-.YYYY.-"]
+ paid_amount: DF.Currency
+ paid_amount_after_tax: DF.Currency
+ paid_from: DF.Link
+ paid_from_account_balance: DF.Currency
+ paid_from_account_currency: DF.Link
+ paid_from_account_type: DF.Data | None
+ paid_to: DF.Link
+ paid_to_account_balance: DF.Currency
+ paid_to_account_currency: DF.Link
+ paid_to_account_type: DF.Data | None
+ party: DF.DynamicLink | None
+ party_balance: DF.Currency
+ party_bank_account: DF.Link | None
+ party_name: DF.Data | None
+ party_type: DF.Link | None
+ payment_order: DF.Link | None
+ payment_order_status: DF.Literal["Initiated", "Payment Ordered"]
+ payment_type: DF.Literal["Receive", "Pay", "Internal Transfer"]
+ posting_date: DF.Date
+ print_heading: DF.Link | None
+ project: DF.Link | None
+ purchase_taxes_and_charges_template: DF.Link | None
+ received_amount: DF.Currency
+ received_amount_after_tax: DF.Currency
+ reference_date: DF.Date | None
+ reference_no: DF.Data | None
+ references: DF.Table[PaymentEntryReference]
+ remarks: DF.SmallText | None
+ sales_taxes_and_charges_template: DF.Link | None
+ source_exchange_rate: DF.Float
+ status: DF.Literal["", "Draft", "Submitted", "Cancelled"]
+ target_exchange_rate: DF.Float
+ tax_withholding_category: DF.Link | None
+ taxes: DF.Table[AdvanceTaxesandCharges]
+ title: DF.Data | None
+ total_allocated_amount: DF.Currency
+ total_taxes_and_charges: DF.Currency
+ unallocated_amount: DF.Currency
+ # end: auto-generated types
+
def __init__(self, *args, **kwargs):
super(PaymentEntry, self).__init__(*args, **kwargs)
if not self.is_new():
@@ -256,6 +338,7 @@ class PaymentEntry(AccountsController):
"get_outstanding_invoices": True,
"get_orders_to_be_billed": True,
"vouchers": vouchers,
+ "book_advance_payments_in_separate_party_account": self.book_advance_payments_in_separate_party_account,
},
validate=True,
)
@@ -1061,7 +1144,9 @@ class PaymentEntry(AccountsController):
"account": self.party_account,
"party_type": self.party_type,
"party": self.party,
+ "against_type": "Account",
"against": against_account,
+ "against_link": against_account,
"account_currency": self.party_account_currency,
"cost_center": self.cost_center,
},
@@ -1226,7 +1311,9 @@ class PaymentEntry(AccountsController):
{
"account": self.paid_from,
"account_currency": self.paid_from_account_currency,
+ "against_type": self.party_type if self.payment_type == "Pay" else "Account",
"against": self.party if self.payment_type == "Pay" else self.paid_to,
+ "against_link": self.party if self.payment_type == "Pay" else self.paid_to,
"credit_in_account_currency": self.paid_amount,
"credit": self.base_paid_amount,
"cost_center": self.cost_center,
@@ -1241,7 +1328,9 @@ class PaymentEntry(AccountsController):
{
"account": self.paid_to,
"account_currency": self.paid_to_account_currency,
+ "against_type": self.party_type if self.payment_type == "Receive" else "Account",
"against": self.party if self.payment_type == "Receive" else self.paid_from,
+ "against_link": self.party if self.payment_type == "Receive" else self.paid_from,
"debit_in_account_currency": self.received_amount,
"debit": self.base_received_amount,
"cost_center": self.cost_center,
@@ -1265,6 +1354,7 @@ class PaymentEntry(AccountsController):
rev_dr_or_cr = "credit" if dr_or_cr == "debit" else "debit"
against = self.party or self.paid_to
+ against_type = self.party_type or "Account"
payment_account = self.get_party_account_for_taxes()
tax_amount = d.tax_amount
base_tax_amount = d.base_tax_amount
@@ -1273,7 +1363,9 @@ class PaymentEntry(AccountsController):
self.get_gl_dict(
{
"account": d.account_head,
+ "against_type": against_type,
"against": against,
+ "against_link": against,
dr_or_cr: tax_amount,
dr_or_cr + "_in_account_currency": base_tax_amount
if account_currency == self.company_currency
@@ -1298,7 +1390,9 @@ class PaymentEntry(AccountsController):
self.get_gl_dict(
{
"account": payment_account,
+ "against_type": against_type,
"against": against,
+ "against_link": against,
rev_dr_or_cr: tax_amount,
rev_dr_or_cr + "_in_account_currency": base_tax_amount
if account_currency == self.company_currency
@@ -1323,7 +1417,9 @@ class PaymentEntry(AccountsController):
{
"account": d.account,
"account_currency": account_currency,
+ "against_type": self.party_type or "Account",
"against": self.party or self.paid_from,
+ "against_link": self.party or self.paid_from,
"debit_in_account_currency": d.amount,
"debit": d.amount,
"cost_center": d.cost_center,
@@ -1615,11 +1711,16 @@ def get_outstanding_reference_documents(args, validate=False):
outstanding_invoices = []
negative_outstanding_invoices = []
+ if args.get("book_advance_payments_in_separate_party_account"):
+ party_account = get_party_account(args.get("party_type"), args.get("party"), args.get("company"))
+ else:
+ party_account = args.get("party_account")
+
if args.get("get_outstanding_invoices"):
outstanding_invoices = get_outstanding_invoices(
args.get("party_type"),
args.get("party"),
- get_party_account(args.get("party_type"), args.get("party"), args.get("company")),
+ party_account,
common_filter=common_filter,
posting_date=posting_and_due_date,
min_outstanding=args.get("outstanding_amt_greater_than"),
diff --git a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
index bfb51da58b..e542d3cc63 100644
--- a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
+++ b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
@@ -765,7 +765,7 @@ def get_pos_reserved_qty(item_code, warehouse):
reserved_qty = (
frappe.qb.from_(p_inv)
.from_(p_item)
- .select(Sum(p_item.qty).as_("qty"))
+ .select(Sum(p_item.stock_qty).as_("stock_qty"))
.where(
(p_inv.name == p_item.parent)
& (IfNull(p_inv.consolidated_invoice, "") == "")
@@ -775,7 +775,7 @@ def get_pos_reserved_qty(item_code, warehouse):
)
).run(as_dict=True)
- return reserved_qty[0].qty or 0 if reserved_qty else 0
+ return flt(reserved_qty[0].stock_qty) if reserved_qty else 0
@frappe.whitelist()
diff --git a/erpnext/accounts/doctype/pricing_rule/utils.py b/erpnext/accounts/doctype/pricing_rule/utils.py
index 18aa6820a3..17293adb95 100644
--- a/erpnext/accounts/doctype/pricing_rule/utils.py
+++ b/erpnext/accounts/doctype/pricing_rule/utils.py
@@ -527,7 +527,7 @@ def get_qty_amount_data_for_cumulative(pr_doc, doc, items=None):
values.extend(warehouses)
if items:
- condition = " and `tab{child_doc}`.{apply_on} in ({items})".format(
+ condition += " and `tab{child_doc}`.{apply_on} in ({items})".format(
child_doc=child_doctype, apply_on=apply_on, items=",".join(["%s"] * len(items))
)
diff --git a/erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.py b/erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.py
index f44b14caed..761c2bc1e3 100644
--- a/erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.py
+++ b/erpnext/accounts/doctype/process_payment_reconciliation/process_payment_reconciliation.py
@@ -440,7 +440,7 @@ def reconcile(doc: None | str = None) -> None:
# Update the parent doc about the exception
frappe.db.rollback()
- traceback = frappe.get_traceback()
+ traceback = frappe.get_traceback(with_context=True)
if traceback:
message = "Traceback:
" + traceback
frappe.db.set_value("Process Payment Reconciliation Log", log, "error_log", message)
diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json
index a3a953f910..ae6059c005 100644
--- a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json
+++ b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.json
@@ -15,6 +15,7 @@
"group_by",
"cost_center",
"territory",
+ "ignore_exchange_rate_revaluation_journals",
"column_break_14",
"to_date",
"finance_book",
@@ -376,10 +377,16 @@
"fieldname": "pdf_name",
"fieldtype": "Data",
"label": "PDF Name"
+ },
+ {
+ "default": "0",
+ "fieldname": "ignore_exchange_rate_revaluation_journals",
+ "fieldtype": "Check",
+ "label": "Ignore Exchange Rate Revaluation Journals"
}
],
"links": [],
- "modified": "2023-08-28 12:59:53.071334",
+ "modified": "2023-12-18 12:20:08.965120",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Process Statement Of Accounts",
diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py
index 9ad25483e3..c03b18a871 100644
--- a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py
+++ b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py
@@ -56,6 +56,7 @@ class ProcessStatementOfAccounts(Document):
frequency: DF.Literal["Weekly", "Monthly", "Quarterly"]
from_date: DF.Date | None
group_by: DF.Literal["", "Group by Voucher", "Group by Voucher (Consolidated)"]
+ ignore_exchange_rate_revaluation_journals: DF.Check
include_ageing: DF.Check
include_break: DF.Check
letter_head: DF.Link | None
@@ -119,6 +120,18 @@ def get_statement_dict(doc, get_statement_dict=False):
statement_dict = {}
ageing = ""
+ err_journals = None
+ if doc.report == "General Ledger" and doc.ignore_exchange_rate_revaluation_journals:
+ err_journals = frappe.db.get_all(
+ "Journal Entry",
+ filters={
+ "company": doc.company,
+ "docstatus": 1,
+ "voucher_type": ("in", ["Exchange Rate Revaluation", "Exchange Gain Or Loss"]),
+ },
+ as_list=True,
+ )
+
for entry in doc.customers:
if doc.include_ageing:
ageing = set_ageing(doc, entry)
@@ -131,6 +144,8 @@ def get_statement_dict(doc, get_statement_dict=False):
)
filters = get_common_filters(doc)
+ if err_journals:
+ filters.update({"voucher_no_not_in": [x[0] for x in err_journals]})
if doc.report == "General Ledger":
filters.update(get_gl_filters(doc, entry, tax_id, presentation_currency))
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
index 1f8f26db20..8f0df3ec93 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
@@ -35,7 +35,7 @@ erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying.
super.onload();
// Ignore linked advances
- this.frm.ignore_doctypes_on_cancel_all = ['Journal Entry', 'Payment Entry', 'Purchase Invoice', "Repost Payment Ledger", "Repost Accounting Ledger", "Unreconcile Payment", "Unreconcile Payment Entries", "Bank Transaction"];
+ this.frm.ignore_doctypes_on_cancel_all = ['Journal Entry', 'Payment Entry', 'Purchase Invoice', "Repost Payment Ledger", "Repost Accounting Ledger", "Unreconcile Payment", "Unreconcile Payment Entries", "Serial and Batch Bundle", "Bank Transaction"];
if(!this.frm.doc.__islocal) {
// show credit_to in print format
@@ -163,6 +163,18 @@ erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying.
}
})
}, __("Get Items From"));
+
+ if (!this.frm.doc.is_return) {
+ frappe.db.get_single_value("Buying Settings", "maintain_same_rate").then((value) => {
+ if (value) {
+ this.frm.doc.items.forEach((item) => {
+ this.frm.fields_dict.items.grid.update_docfield_property(
+ "rate", "read_only", (item.purchase_receipt && item.pr_detail)
+ );
+ });
+ }
+ });
+ }
}
this.frm.toggle_reqd("supplier_warehouse", this.frm.doc.is_subcontracted);
@@ -396,6 +408,8 @@ erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying.
}
on_submit() {
+ super.on_submit();
+
$.each(this.frm.doc["items"] || [], function(i, row) {
if(row.purchase_receipt) frappe.model.clear_doc("Purchase Receipt", row.purchase_receipt)
})
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index ae377ebafd..7f145c569e 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -552,7 +552,7 @@ class PurchaseInvoice(BuyingController):
self.against_expense_account = ",".join(against_accounts)
def po_required(self):
- if frappe.db.get_value("Buying Settings", None, "po_required") == "Yes":
+ if frappe.db.get_single_value("Buying Settings", "po_required") == "Yes":
if frappe.get_value(
"Supplier", self.supplier, "allow_purchase_invoice_creation_without_purchase_order"
@@ -572,7 +572,7 @@ class PurchaseInvoice(BuyingController):
def pr_required(self):
stock_items = self.get_stock_items()
- if frappe.db.get_value("Buying Settings", None, "pr_required") == "Yes":
+ if frappe.db.get_single_value("Buying Settings", "pr_required") == "Yes":
if frappe.get_value(
"Supplier", self.supplier, "allow_purchase_invoice_creation_without_purchase_receipt"
@@ -815,7 +815,9 @@ class PurchaseInvoice(BuyingController):
"party_type": "Supplier",
"party": self.supplier,
"due_date": self.due_date,
+ "against_type": "Account",
"against": self.against_expense_account,
+ "against_link": self.against_expense_account,
"credit": base_grand_total,
"credit_in_account_currency": base_grand_total
if self.party_account_currency == self.company_currency
@@ -888,7 +890,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": warehouse_account[item.warehouse]["account"],
+ "against_type": "Account",
"against": warehouse_account[item.from_warehouse]["account"],
+ "against_link": warehouse_account[item.from_warehouse]["account"],
"cost_center": item.cost_center,
"project": item.project or self.project,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
@@ -908,7 +912,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": warehouse_account[item.from_warehouse]["account"],
+ "against_type": "Account",
"against": warehouse_account[item.warehouse]["account"],
+ "against_link": warehouse_account[item.warehouse]["account"],
"cost_center": item.cost_center,
"project": item.project or self.project,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
@@ -925,7 +931,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": item.expense_account,
+ "against_type": "Supplier",
"against": self.supplier,
+ "against_link": self.supplier,
"debit": flt(item.base_net_amount, item.precision("base_net_amount")),
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"cost_center": item.cost_center,
@@ -942,7 +950,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": item.expense_account,
+ "against_type": "Supplier",
"against": self.supplier,
+ "against_link": self.supplier,
"debit": warehouse_debit_amount,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"cost_center": item.cost_center,
@@ -961,7 +971,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": account,
+ "against_type": "Account",
"against": item.expense_account,
+ "against_link": item.expense_account,
"cost_center": item.cost_center,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"credit": flt(amount["base_amount"]),
@@ -981,7 +993,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": supplier_warehouse_account,
+ "against_type": "Account",
"against": item.expense_account,
+ "against_link": item.expense_account,
"cost_center": item.cost_center,
"project": item.project or self.project,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
@@ -1036,7 +1050,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": expense_account,
+ "against_type": "Supplier",
"against": self.supplier,
+ "against_link": self.supplier,
"debit": amount,
"cost_center": item.cost_center,
"project": item.project or self.project,
@@ -1062,7 +1078,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": expense_account,
+ "against_type": "Supplier",
"against": self.supplier,
+ "against_link": self.supplier,
"debit": discrepancy_caused_by_exchange_rate_difference,
"cost_center": item.cost_center,
"project": item.project or self.project,
@@ -1075,7 +1093,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": self.get_company_default("exchange_gain_loss_account"),
+ "against_type": "Supplier",
"against": self.supplier,
+ "against_link": self.supplier,
"credit": discrepancy_caused_by_exchange_rate_difference,
"cost_center": item.cost_center,
"project": item.project or self.project,
@@ -1120,7 +1140,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": stock_rbnb,
+ "against_type": "Supplier",
"against": self.supplier,
+ "against_link": self.supplier,
"debit": flt(item.item_tax_amount, item.precision("item_tax_amount")),
"remarks": self.remarks or _("Accounting Entry for Stock"),
"cost_center": self.cost_center,
@@ -1135,11 +1157,17 @@ class PurchaseInvoice(BuyingController):
)
assets = frappe.db.get_all(
- "Asset", filters={"purchase_invoice": self.name, "item_code": item.item_code}
+ "Asset",
+ filters={"purchase_invoice": self.name, "item_code": item.item_code},
+ fields=["name", "asset_quantity"],
)
for asset in assets:
- frappe.db.set_value("Asset", asset.name, "gross_purchase_amount", flt(item.valuation_rate))
- frappe.db.set_value("Asset", asset.name, "purchase_receipt_amount", flt(item.valuation_rate))
+ frappe.db.set_value(
+ "Asset", asset.name, "gross_purchase_amount", flt(item.valuation_rate) * asset.asset_quantity
+ )
+ frappe.db.set_value(
+ "Asset", asset.name, "purchase_receipt_amount", flt(item.valuation_rate) * asset.asset_quantity
+ )
def make_stock_adjustment_entry(
self, gl_entries, item, voucher_wise_stock_value, account_currency
@@ -1168,7 +1196,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": cost_of_goods_sold_account,
+ "against_type": "Account",
"against": item.expense_account,
+ "against_link": item.expense_account,
"debit": stock_adjustment_amt,
"remarks": self.get("remarks") or _("Stock Adjustment"),
"cost_center": item.cost_center,
@@ -1198,7 +1228,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": tax.account_head,
+ "against_type": "Supplier",
"against": self.supplier,
+ "against_link": self.supplier,
dr_or_cr: base_amount,
dr_or_cr + "_in_account_currency": base_amount
if account_currency == self.company_currency
@@ -1246,8 +1278,10 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": tax.account_head,
+ "against_type": "Supplier",
"cost_center": tax.cost_center,
"against": self.supplier,
+ "against_link": self.supplier,
"credit": applicable_amount,
"remarks": self.remarks or _("Accounting Entry for Stock"),
},
@@ -1265,7 +1299,9 @@ class PurchaseInvoice(BuyingController):
{
"account": tax.account_head,
"cost_center": tax.cost_center,
+ "against_type": "Supplier",
"against": self.supplier,
+ "against_link": self.supplier,
"credit": valuation_tax[tax.name],
"remarks": self.remarks or _("Accounting Entry for Stock"),
},
@@ -1280,7 +1316,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": self.unrealized_profit_loss_account,
+ "against_type": "Supplier",
"against": self.supplier,
+ "against_link": self.supplier,
"credit": flt(self.total_taxes_and_charges),
"credit_in_account_currency": flt(self.base_total_taxes_and_charges),
"cost_center": self.cost_center,
@@ -1301,7 +1339,9 @@ class PurchaseInvoice(BuyingController):
"account": self.credit_to,
"party_type": "Supplier",
"party": self.supplier,
+ "against_type": "Account",
"against": self.cash_bank_account,
+ "against_link": self.cash_bank_account,
"debit": self.base_paid_amount,
"debit_in_account_currency": self.base_paid_amount
if self.party_account_currency == self.company_currency
@@ -1322,7 +1362,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": self.cash_bank_account,
+ "against_type": "Supplier",
"against": self.supplier,
+ "against_link": self.supplier,
"credit": self.base_paid_amount,
"credit_in_account_currency": self.base_paid_amount
if bank_account_currency == self.company_currency
@@ -1346,7 +1388,9 @@ class PurchaseInvoice(BuyingController):
"account": self.credit_to,
"party_type": "Supplier",
"party": self.supplier,
+ "against_type": "Account",
"against": self.write_off_account,
+ "against_link": self.write_off_account,
"debit": self.base_write_off_amount,
"debit_in_account_currency": self.base_write_off_amount
if self.party_account_currency == self.company_currency
@@ -1366,7 +1410,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": self.write_off_account,
+ "against_type": "Supplier",
"against": self.supplier,
+ "against_link": self.supplier,
"credit": flt(self.base_write_off_amount),
"credit_in_account_currency": self.base_write_off_amount
if write_off_account_currency == self.company_currency
@@ -1393,7 +1439,9 @@ class PurchaseInvoice(BuyingController):
self.get_gl_dict(
{
"account": round_off_account,
+ "against_type": "Supplier",
"against": self.supplier,
+ "against_link": self.supplier,
"debit_in_account_currency": self.rounding_adjustment,
"debit": self.base_rounding_adjustment,
"cost_center": round_off_cost_center
@@ -1816,10 +1864,6 @@ def make_inter_company_sales_invoice(source_name, target_doc=None):
return make_inter_company_transaction("Purchase Invoice", source_name, target_doc)
-def on_doctype_update():
- frappe.db.add_index("Purchase Invoice", ["supplier", "is_return", "return_against"])
-
-
@frappe.whitelist()
def make_purchase_receipt(source_name, target_doc=None):
def update_item(obj, target, source_parent):
diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
index e43ea6ecbe..5acd8b074b 100644
--- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -14,7 +14,7 @@ from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_ent
from erpnext.buying.doctype.purchase_order.purchase_order import get_mapped_purchase_invoice
from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order
from erpnext.buying.doctype.supplier.test_supplier import create_supplier
-from erpnext.controllers.accounts_controller import get_payment_terms
+from erpnext.controllers.accounts_controller import InvalidQtyError, get_payment_terms
from erpnext.controllers.buying_controller import QtyMismatchError
from erpnext.exceptions import InvalidCurrency
from erpnext.projects.doctype.project.test_project import make_project
@@ -51,6 +51,16 @@ class TestPurchaseInvoice(FrappeTestCase, StockTestMixin):
def tearDown(self):
frappe.db.rollback()
+ def test_purchase_invoice_qty(self):
+ pi = make_purchase_invoice(qty=0, do_not_save=True)
+ with self.assertRaises(InvalidQtyError):
+ pi.save()
+
+ # No error with qty=1
+ pi.items[0].qty = 1
+ pi.save()
+ self.assertEqual(pi.items[0].qty, 1)
+
def test_purchase_invoice_received_qty(self):
"""
1. Test if received qty is validated against accepted + rejected
@@ -1227,8 +1237,8 @@ class TestPurchaseInvoice(FrappeTestCase, StockTestMixin):
@change_settings("Accounts Settings", {"unlink_payment_on_cancellation_of_invoice": 1})
def test_gain_loss_with_advance_entry(self):
- unlink_enabled = frappe.db.get_value(
- "Accounts Settings", "Accounts Settings", "unlink_payment_on_cancel_of_invoice"
+ unlink_enabled = frappe.db.get_single_value(
+ "Accounts Settings", "unlink_payment_on_cancel_of_invoice"
)
frappe.db.set_single_value("Accounts Settings", "unlink_payment_on_cancel_of_invoice", 1)
@@ -1985,6 +1995,26 @@ class TestPurchaseInvoice(FrappeTestCase, StockTestMixin):
self.assertEqual(pi.items[0].cost_center, "_Test Cost Center Buying - _TC")
+ def test_debit_note_without_item(self):
+ pi = make_purchase_invoice(item_name="_Test Item", qty=10, do_not_submit=True)
+ pi.items[0].item_code = ""
+ pi.save()
+
+ self.assertFalse(pi.items[0].item_code)
+ pi.submit()
+
+ return_pi = make_purchase_invoice(
+ item_name="_Test Item",
+ is_return=1,
+ return_against=pi.name,
+ qty=-10,
+ do_not_save=True,
+ )
+ return_pi.items[0].item_code = ""
+ return_pi.save()
+ return_pi.submit()
+ self.assertEqual(return_pi.docstatus, 1)
+
def set_advance_flag(company, flag, default_account):
frappe.db.set_value(
@@ -2094,7 +2124,7 @@ def make_purchase_invoice(**args):
bundle_id = None
if args.get("batch_no") or args.get("serial_no"):
batches = {}
- qty = args.qty or 5
+ qty = args.qty if args.qty is not None else 5
item_code = args.item or args.item_code or "_Test Item"
if args.get("batch_no"):
batches = frappe._dict({args.batch_no: qty})
@@ -2121,8 +2151,9 @@ def make_purchase_invoice(**args):
"items",
{
"item_code": args.item or args.item_code or "_Test Item",
+ "item_name": args.item_name,
"warehouse": args.warehouse or "_Test Warehouse - _TC",
- "qty": args.qty or 5,
+ "qty": args.qty if args.qty is not None else 5,
"received_qty": args.received_qty or 0,
"rejected_qty": args.rejected_qty or 0,
"rate": args.rate or 50,
diff --git a/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json b/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
index 7cad3ae1c0..9cf4e4fd7c 100644
--- a/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
+++ b/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
@@ -288,7 +288,6 @@
"oldfieldname": "import_rate",
"oldfieldtype": "Currency",
"options": "currency",
- "read_only_depends_on": "eval: (!parent.is_return && doc.purchase_receipt && doc.pr_detail)",
"reqd": 1
},
{
@@ -919,7 +918,7 @@
"idx": 1,
"istable": 1,
"links": [],
- "modified": "2023-11-30 16:26:05.629780",
+ "modified": "2023-12-25 22:00:28.043555",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Purchase Invoice Item",
diff --git a/erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.py b/erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.py
index 38bc1a6fb8..2d10f7c762 100644
--- a/erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.py
+++ b/erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.py
@@ -43,7 +43,7 @@ def start_payment_ledger_repost(docname=None):
except Exception as e:
frappe.db.rollback()
- traceback = frappe.get_traceback()
+ traceback = frappe.get_traceback(with_context=True)
if traceback:
message = "Traceback:
" + traceback
frappe.db.set_value(repost_doc.doctype, repost_doc.name, "repost_error_log", message)
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index 5cd708ad02..8a402aa1d4 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -37,7 +37,8 @@ erpnext.accounts.SalesInvoiceController = class SalesInvoiceController extends e
super.onload();
this.frm.ignore_doctypes_on_cancel_all = ['POS Invoice', 'Timesheet', 'POS Invoice Merge Log',
- 'POS Closing Entry', 'Journal Entry', 'Payment Entry', "Repost Payment Ledger", "Repost Accounting Ledger", "Unreconcile Payment", "Unreconcile Payment Entries", "Bank Transaction"];
+ 'POS Closing Entry', 'Journal Entry', 'Payment Entry', "Repost Payment Ledger", "Repost Accounting Ledger", "Unreconcile Payment", "Unreconcile Payment Entries", "Serial and Batch Bundle", "Bank Transaction",
+ ];
if(!this.frm.doc.__islocal && !this.frm.doc.customer && this.frm.doc.debit_to) {
// show debit_to in print format
@@ -197,6 +198,7 @@ erpnext.accounts.SalesInvoiceController = class SalesInvoiceController extends e
on_submit(doc, dt, dn) {
var me = this;
+ super.on_submit();
if (frappe.get_route()[0] != 'Form') {
return
}
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
index f2094874e0..5e2187e91f 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
@@ -138,6 +138,7 @@
"loyalty_amount",
"column_break_77",
"loyalty_program",
+ "dont_create_loyalty_points",
"loyalty_redemption_account",
"loyalty_redemption_cost_center",
"contact_and_address_tab",
@@ -1041,8 +1042,7 @@
"label": "Loyalty Program",
"no_copy": 1,
"options": "Loyalty Program",
- "print_hide": 1,
- "read_only": 1
+ "print_hide": 1
},
{
"allow_on_submit": 1,
@@ -2162,6 +2162,14 @@
"fieldname": "update_billed_amount_in_delivery_note",
"fieldtype": "Check",
"label": "Update Billed Amount in Delivery Note"
+ },
+ {
+ "default": "0",
+ "depends_on": "loyalty_program",
+ "fieldname": "dont_create_loyalty_points",
+ "fieldtype": "Check",
+ "label": "Don't Create Loyalty Points",
+ "no_copy": 1
}
],
"icon": "fa fa-file-text",
@@ -2174,7 +2182,7 @@
"link_fieldname": "consolidated_invoice"
}
],
- "modified": "2023-11-23 16:56:29.679499",
+ "modified": "2024-01-02 17:25:46.027523",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice",
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index f2f4dda817..8da45054c2 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -7,7 +7,7 @@ from frappe import _, msgprint, throw
from frappe.contacts.doctype.address.address import get_address_display
from frappe.model.mapper import get_mapped_doc
from frappe.model.utils import get_fetch_values
-from frappe.utils import add_days, cint, cstr, flt, formatdate, get_link_to_form, getdate, nowdate
+from frappe.utils import add_days, cint, flt, formatdate, get_link_to_form, getdate, nowdate
import erpnext
from erpnext.accounts.deferred_revenue import validate_service_stop_date
@@ -117,6 +117,7 @@ class SalesInvoice(SellingController):
discount_amount: DF.Currency
dispatch_address: DF.SmallText | None
dispatch_address_name: DF.Link | None
+ dont_create_loyalty_points: DF.Check
due_date: DF.Date | None
from_date: DF.Date | None
grand_total: DF.Currency
@@ -471,7 +472,12 @@ class SalesInvoice(SellingController):
update_linked_doc(self.doctype, self.name, self.inter_company_invoice_reference)
# create the loyalty point ledger entry if the customer is enrolled in any loyalty program
- if not self.is_return and not self.is_consolidated and self.loyalty_program:
+ if (
+ not self.is_return
+ and not self.is_consolidated
+ and self.loyalty_program
+ and not self.dont_create_loyalty_points
+ ):
self.make_loyalty_point_entry()
elif (
self.is_return and self.return_against and not self.is_consolidated and self.loyalty_program
@@ -586,6 +592,8 @@ class SalesInvoice(SellingController):
"Serial and Batch Bundle",
)
+ self.delete_auto_created_batches()
+
def update_status_updater_args(self):
if cint(self.update_stock):
self.status_updater.append(
@@ -1225,7 +1233,9 @@ class SalesInvoice(SellingController):
"party_type": "Customer",
"party": self.customer,
"due_date": self.due_date,
+ "against_type": "Account",
"against": self.against_income_account,
+ "against_link": self.against_income_account,
"debit": base_grand_total,
"debit_in_account_currency": base_grand_total
if self.party_account_currency == self.company_currency
@@ -1254,7 +1264,9 @@ class SalesInvoice(SellingController):
self.get_gl_dict(
{
"account": tax.account_head,
+ "against_type": "Customer",
"against": self.customer,
+ "against_link": self.customer,
"credit": flt(base_amount, tax.precision("tax_amount_after_discount_amount")),
"credit_in_account_currency": (
flt(base_amount, tax.precision("base_tax_amount_after_discount_amount"))
@@ -1275,7 +1287,9 @@ class SalesInvoice(SellingController):
self.get_gl_dict(
{
"account": self.unrealized_profit_loss_account,
+ "against_type": "Customer",
"against": self.customer,
+ "against_link": self.customer,
"debit": flt(self.total_taxes_and_charges),
"debit_in_account_currency": flt(self.base_total_taxes_and_charges),
"cost_center": self.cost_center,
@@ -1343,7 +1357,9 @@ class SalesInvoice(SellingController):
add_asset_activity(asset.name, _("Asset sold"))
for gle in fixed_asset_gl_entries:
+ gle["against_type"] = "Customer"
gle["against"] = self.customer
+ gle["against_link"] = self.customer
gl_entries.append(self.get_gl_dict(gle, item=item))
self.set_asset_status(asset)
@@ -1364,7 +1380,9 @@ class SalesInvoice(SellingController):
self.get_gl_dict(
{
"account": income_account,
+ "against_type": "Customer",
"against": self.customer,
+ "against_link": self.customer,
"credit": flt(base_amount, item.precision("base_net_amount")),
"credit_in_account_currency": (
flt(base_amount, item.precision("base_net_amount"))
@@ -1418,9 +1436,9 @@ class SalesInvoice(SellingController):
"account": self.debit_to,
"party_type": "Customer",
"party": self.customer,
- "against": "Expense account - "
- + cstr(self.loyalty_redemption_account)
- + " for the Loyalty Program",
+ "against_type": "Account",
+ "against": self.loyalty_redemption_account,
+ "against_link": self.loyalty_redemption_account,
"credit": self.loyalty_amount,
"against_voucher": self.return_against if cint(self.is_return) else self.name,
"against_voucher_type": self.doctype,
@@ -1434,7 +1452,9 @@ class SalesInvoice(SellingController):
{
"account": self.loyalty_redemption_account,
"cost_center": self.cost_center or self.loyalty_redemption_cost_center,
+ "against_type": "Customer",
"against": self.customer,
+ "against_link": self.customer,
"debit": self.loyalty_amount,
"remark": "Loyalty Points redeemed by the customer",
},
@@ -1461,7 +1481,9 @@ class SalesInvoice(SellingController):
"account": self.debit_to,
"party_type": "Customer",
"party": self.customer,
+ "against_type": "Account",
"against": payment_mode.account,
+ "against_link": payment_mode.account,
"credit": payment_mode.base_amount,
"credit_in_account_currency": payment_mode.base_amount
if self.party_account_currency == self.company_currency
@@ -1482,7 +1504,9 @@ class SalesInvoice(SellingController):
self.get_gl_dict(
{
"account": payment_mode.account,
+ "against_type": "Customer",
"against": self.customer,
+ "against_link": self.customer,
"debit": payment_mode.base_amount,
"debit_in_account_currency": payment_mode.base_amount
if payment_mode_account_currency == self.company_currency
@@ -1506,7 +1530,9 @@ class SalesInvoice(SellingController):
"account": self.debit_to,
"party_type": "Customer",
"party": self.customer,
+ "against_type": "Account",
"against": self.account_for_change_amount,
+ "against_link": self.account_for_change_amount,
"debit": flt(self.base_change_amount),
"debit_in_account_currency": flt(self.base_change_amount)
if self.party_account_currency == self.company_currency
@@ -1527,7 +1553,9 @@ class SalesInvoice(SellingController):
self.get_gl_dict(
{
"account": self.account_for_change_amount,
+ "against_type": "Customer",
"against": self.customer,
+ "against_link": self.customer,
"credit": self.base_change_amount,
"cost_center": self.cost_center,
},
@@ -1553,7 +1581,9 @@ class SalesInvoice(SellingController):
"account": self.debit_to,
"party_type": "Customer",
"party": self.customer,
+ "against_type": "Account",
"against": self.write_off_account,
+ "against_link": self.write_off_account,
"credit": flt(self.base_write_off_amount, self.precision("base_write_off_amount")),
"credit_in_account_currency": (
flt(self.base_write_off_amount, self.precision("base_write_off_amount"))
@@ -1573,7 +1603,9 @@ class SalesInvoice(SellingController):
self.get_gl_dict(
{
"account": self.write_off_account,
+ "against_type": "Customer",
"against": self.customer,
+ "against_link": self.customer,
"debit": flt(self.base_write_off_amount, self.precision("base_write_off_amount")),
"debit_in_account_currency": (
flt(self.base_write_off_amount, self.precision("base_write_off_amount"))
@@ -1601,7 +1633,9 @@ class SalesInvoice(SellingController):
self.get_gl_dict(
{
"account": round_off_account,
+ "against_type": "Customer",
"against": self.customer,
+ "against_link": self.customer,
"credit_in_account_currency": flt(
self.rounding_adjustment, self.precision("rounding_adjustment")
),
@@ -2356,9 +2390,18 @@ def make_inter_company_transaction(doctype, source_name, target_doc=None):
def get_received_items(reference_name, doctype, reference_fieldname):
+ reference_field = "inter_company_invoice_reference"
+ if doctype == "Purchase Order":
+ reference_field = "inter_company_order_reference"
+
+ filters = {
+ reference_field: reference_name,
+ "docstatus": 1,
+ }
+
target_doctypes = frappe.get_all(
doctype,
- filters={"inter_company_invoice_reference": reference_name, "docstatus": 1},
+ filters=filters,
as_list=True,
)
@@ -2540,10 +2583,6 @@ def get_loyalty_programs(customer):
return lp_details
-def on_doctype_update():
- frappe.db.add_index("Sales Invoice", ["customer", "is_return", "return_against"])
-
-
@frappe.whitelist()
def create_invoice_discounting(source_name, target_doc=None):
invoice = frappe.get_doc("Sales Invoice", source_name)
diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
index 6163749c4f..cb4b2fc914 100644
--- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -23,7 +23,7 @@ from erpnext.assets.doctype.asset.test_asset import create_asset, create_asset_d
from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import (
get_depr_schedule,
)
-from erpnext.controllers.accounts_controller import update_invoice_status
+from erpnext.controllers.accounts_controller import InvalidQtyError, update_invoice_status
from erpnext.controllers.taxes_and_totals import get_itemised_tax_breakup_data
from erpnext.exceptions import InvalidAccountCurrency, InvalidCurrency
from erpnext.selling.doctype.customer.test_customer import get_customer_dict
@@ -72,6 +72,16 @@ class TestSalesInvoice(FrappeTestCase):
def tearDownClass(self):
unlink_payment_on_cancel_of_invoice(0)
+ def test_sales_invoice_qty(self):
+ si = create_sales_invoice(qty=0, do_not_save=True)
+ with self.assertRaises(InvalidQtyError):
+ si.save()
+
+ # No error with qty=1
+ si.items[0].qty = 1
+ si.save()
+ self.assertEqual(si.items[0].qty, 1)
+
def test_timestamp_change(self):
w = frappe.copy_doc(test_records[0])
w.docstatus = 0
@@ -1414,10 +1424,11 @@ class TestSalesInvoice(FrappeTestCase):
def test_serialized_cancel(self):
si = self.test_serialized()
- si.cancel()
-
+ si.reload()
serial_nos = get_serial_nos_from_bundle(si.get("items")[0].serial_and_batch_bundle)
+ si.cancel()
+
self.assertEqual(
frappe.db.get_value("Serial No", serial_nos[0], "warehouse"), "_Test Warehouse - _TC"
)
@@ -3635,7 +3646,7 @@ def create_sales_invoice(**args):
bundle_id = None
if si.update_stock and (args.get("batch_no") or args.get("serial_no")):
batches = {}
- qty = args.qty or 1
+ qty = args.qty if args.qty is not None else 1
item_code = args.item or args.item_code or "_Test Item"
if args.get("batch_no"):
batches = frappe._dict({args.batch_no: qty})
@@ -3667,7 +3678,7 @@ def create_sales_invoice(**args):
"description": args.description or "_Test Item",
"warehouse": args.warehouse or "_Test Warehouse - _TC",
"target_warehouse": args.target_warehouse,
- "qty": args.qty or 1,
+ "qty": args.qty if args.qty is not None else 1,
"uom": args.uom or "Nos",
"stock_uom": args.uom or "Nos",
"rate": args.rate if args.get("rate") is not None else 100,
diff --git a/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json b/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
index a403b14c54..ec9e792d7d 100644
--- a/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
+++ b/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
@@ -81,6 +81,7 @@
"warehouse",
"target_warehouse",
"quality_inspection",
+ "pick_serial_and_batch",
"serial_and_batch_bundle",
"batch_no",
"incoming_rate",
@@ -897,12 +898,18 @@
"options": "Serial and Batch Bundle",
"print_hide": 1,
"search_index": 1
+ },
+ {
+ "depends_on": "eval:parent.update_stock === 1",
+ "fieldname": "pick_serial_and_batch",
+ "fieldtype": "Button",
+ "label": "Pick Serial / Batch No"
}
],
"idx": 1,
"istable": 1,
"links": [],
- "modified": "2023-11-14 18:34:10.479329",
+ "modified": "2023-12-29 13:03:14.121298",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Sales Invoice Item",
diff --git a/erpnext/accounts/doctype/subscription/subscription.json b/erpnext/accounts/doctype/subscription/subscription.json
index 187b7abce1..97fd4d040f 100644
--- a/erpnext/accounts/doctype/subscription/subscription.json
+++ b/erpnext/accounts/doctype/subscription/subscription.json
@@ -148,13 +148,13 @@
{
"fieldname": "additional_discount_percentage",
"fieldtype": "Percent",
- "label": "Additional DIscount Percentage"
+ "label": "Additional Discount Percentage"
},
{
"collapsible": 1,
"fieldname": "additional_discount_amount",
"fieldtype": "Currency",
- "label": "Additional DIscount Amount"
+ "label": "Additional Discount Amount"
},
{
"collapsible": 1,
@@ -267,7 +267,7 @@
"link_fieldname": "subscription"
}
],
- "modified": "2023-09-18 17:48:21.900252",
+ "modified": "2023-12-28 17:20:42.687789",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Subscription",
diff --git a/erpnext/accounts/doctype/subscription/subscription.py b/erpnext/accounts/doctype/subscription/subscription.py
index aba1b64930..72e574c299 100644
--- a/erpnext/accounts/doctype/subscription/subscription.py
+++ b/erpnext/accounts/doctype/subscription/subscription.py
@@ -356,18 +356,20 @@ class Subscription(Document):
self,
from_date: Optional[Union[str, datetime.date]] = None,
to_date: Optional[Union[str, datetime.date]] = None,
+ posting_date: Optional[Union[str, datetime.date]] = None,
) -> Document:
"""
Creates a `Invoice` for the `Subscription`, updates `self.invoices` and
saves the `Subscription`.
Backwards compatibility
"""
- return self.create_invoice(from_date=from_date, to_date=to_date)
+ return self.create_invoice(from_date=from_date, to_date=to_date, posting_date=posting_date)
def create_invoice(
self,
from_date: Optional[Union[str, datetime.date]] = None,
to_date: Optional[Union[str, datetime.date]] = None,
+ posting_date: Optional[Union[str, datetime.date]] = None,
) -> Document:
"""
Creates a `Invoice`, submits it and returns it
@@ -385,11 +387,13 @@ class Subscription(Document):
invoice = frappe.new_doc(self.invoice_document_type)
invoice.company = company
invoice.set_posting_time = 1
- invoice.posting_date = (
- self.current_invoice_start
- if self.generate_invoice_at == "Beginning of the current subscription period"
- else self.current_invoice_end
- )
+
+ if self.generate_invoice_at == "Beginning of the current subscription period":
+ invoice.posting_date = self.current_invoice_start
+ elif self.generate_invoice_at == "Days before the current subscription period":
+ invoice.posting_date = posting_date or self.current_invoice_start
+ else:
+ invoice.posting_date = self.current_invoice_end
invoice.cost_center = self.cost_center
@@ -413,6 +417,7 @@ class Subscription(Document):
# Subscription is better suited for service items. I won't update `update_stock`
# for that reason
items_list = self.get_items_from_plans(self.plans, is_prorate())
+
for item in items_list:
item["cost_center"] = self.cost_center
invoice.append("items", item)
@@ -556,7 +561,7 @@ class Subscription(Document):
if not self.is_current_invoice_generated(
self.current_invoice_start, self.current_invoice_end
) and self.can_generate_new_invoice(posting_date):
- self.generate_invoice()
+ self.generate_invoice(posting_date=posting_date)
self.update_subscription_period(add_days(self.current_invoice_end, 1))
if self.cancel_at_period_end and (
diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py
index 030a41e5cd..b48a8e6115 100644
--- a/erpnext/accounts/general_ledger.py
+++ b/erpnext/accounts/general_ledger.py
@@ -280,6 +280,7 @@ def check_if_in_list(gle, gl_map, dimensions=None):
"project",
"finance_book",
"voucher_no",
+ "against_link",
]
if dimensions:
@@ -653,10 +654,10 @@ def check_freezing_date(posting_date, adv_adj=False):
Hence stop admin to bypass if accounts are freezed
"""
if not adv_adj:
- acc_frozen_upto = frappe.db.get_value("Accounts Settings", None, "acc_frozen_upto")
+ acc_frozen_upto = frappe.db.get_single_value("Accounts Settings", "acc_frozen_upto")
if acc_frozen_upto:
- frozen_accounts_modifier = frappe.db.get_value(
- "Accounts Settings", None, "frozen_accounts_modifier"
+ frozen_accounts_modifier = frappe.db.get_single_value(
+ "Accounts Settings", "frozen_accounts_modifier"
)
if getdate(posting_date) <= getdate(acc_frozen_upto) and (
frozen_accounts_modifier not in frappe.get_roles() or frappe.session.user == "Administrator"
diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py
index 008614e6d3..fc9034b2ee 100644
--- a/erpnext/accounts/party.py
+++ b/erpnext/accounts/party.py
@@ -114,14 +114,12 @@ def _get_party_details(
set_account_and_due_date(party, account, party_type, company, posting_date, bill_date, doctype)
)
party = party_details[party_type.lower()]
-
- if not ignore_permissions and not (
- frappe.has_permission(party_type, "read", party)
- or frappe.has_permission(party_type, "select", party)
- ):
- frappe.throw(_("Not permitted for {0}").format(party), frappe.PermissionError)
-
party = frappe.get_doc(party_type, party)
+
+ if not ignore_permissions:
+ ptype = "select" if frappe.only_has_select_perm(party_type) else "read"
+ frappe.has_permission(party_type, ptype, party, throw=True)
+
currency = party.get("default_currency") or currency or get_company_currency(company)
party_address, shipping_address = set_address_details(
@@ -637,9 +635,7 @@ def get_due_date_from_template(template_name, posting_date, bill_date):
return due_date
-def validate_due_date(
- posting_date, due_date, party_type, party, company=None, bill_date=None, template_name=None
-):
+def validate_due_date(posting_date, due_date, bill_date=None, template_name=None):
if getdate(due_date) < getdate(posting_date):
frappe.throw(_("Due Date cannot be before Posting / Supplier Invoice Date"))
else:
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
index 50d5eae407..3a70afc3f0 100644
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py
@@ -55,8 +55,8 @@ class ReceivablePayableReport(object):
def run(self, args):
self.filters.update(args)
self.set_defaults()
- self.party_naming_by = frappe.db.get_value(
- args.get("naming_by")[0], None, args.get("naming_by")[1]
+ self.party_naming_by = frappe.db.get_single_value(
+ args.get("naming_by")[0], args.get("naming_by")[1]
)
self.get_columns()
self.get_data()
@@ -225,7 +225,7 @@ class ReceivablePayableReport(object):
if not row:
return
- if self.filters.get("in_party_currency"):
+ if self.filters.get("in_party_currency") or self.filters.get("party_account"):
amount = ple.amount_in_account_currency
else:
amount = ple.amount
@@ -244,8 +244,12 @@ class ReceivablePayableReport(object):
row.invoiced_in_account_currency += amount_in_account_currency
else:
if self.is_invoice(ple):
- row.credit_note -= amount
- row.credit_note_in_account_currency -= amount_in_account_currency
+ if row.voucher_no == ple.voucher_no == ple.against_voucher_no:
+ row.paid -= amount
+ row.paid_in_account_currency -= amount_in_account_currency
+ else:
+ row.credit_note -= amount
+ row.credit_note_in_account_currency -= amount_in_account_currency
else:
row.paid -= amount
row.paid_in_account_currency -= amount_in_account_currency
@@ -451,7 +455,7 @@ class ReceivablePayableReport(object):
party_details = self.get_party_details(row.party) or {}
row.update(party_details)
- if self.filters.get("in_party_currency"):
+ if self.filters.get("in_party_currency") or self.filters.get("party_account"):
row.currency = row.account_currency
else:
row.currency = self.company_currency
diff --git a/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py
index dd0842df04..976935b99f 100644
--- a/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py
+++ b/erpnext/accounts/report/accounts_receivable/test_accounts_receivable.py
@@ -76,6 +76,41 @@ class TestAccountsReceivable(AccountsTestMixin, FrappeTestCase):
return credit_note
+ def test_pos_receivable(self):
+ filters = {
+ "company": self.company,
+ "party_type": "Customer",
+ "party": [self.customer],
+ "report_date": add_days(today(), 2),
+ "based_on_payment_terms": 0,
+ "range1": 30,
+ "range2": 60,
+ "range3": 90,
+ "range4": 120,
+ "show_remarks": False,
+ }
+
+ pos_inv = self.create_sales_invoice(no_payment_schedule=True, do_not_submit=True)
+ pos_inv.posting_date = add_days(today(), 2)
+ pos_inv.is_pos = 1
+ pos_inv.append(
+ "payments",
+ frappe._dict(
+ mode_of_payment="Cash",
+ amount=flt(pos_inv.grand_total / 2),
+ ),
+ )
+ pos_inv.disable_rounded_total = 1
+ pos_inv.save()
+ pos_inv.submit()
+
+ report = execute(filters)
+ expected_data = [[pos_inv.grand_total, pos_inv.paid_amount, 0]]
+
+ row = report[1][-1]
+ self.assertEqual(expected_data[0], [row.invoiced, row.paid, row.credit_note])
+ pos_inv.cancel()
+
def test_accounts_receivable(self):
filters = {
"company": self.company,
@@ -544,7 +579,7 @@ class TestAccountsReceivable(AccountsTestMixin, FrappeTestCase):
filters.update({"party_account": self.debtors_usd})
report = execute(filters)[1]
self.assertEqual(len(report), 1)
- expected_data = [8000.0, 8000.0, self.debtors_usd, si2.currency]
+ expected_data = [100.0, 100.0, self.debtors_usd, si2.currency]
row = report[0]
self.assertEqual(
expected_data, [row.invoiced, row.outstanding, row.party_account, row.account_currency]
diff --git a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
index 22b5c6ba76..0947cffc9f 100644
--- a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
+++ b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
@@ -24,8 +24,8 @@ class AccountsReceivableSummary(ReceivablePayableReport):
def run(self, args):
self.account_type = args.get("account_type")
self.party_type = get_party_types_from_account_type(self.account_type)
- self.party_naming_by = frappe.db.get_value(
- args.get("naming_by")[0], None, args.get("naming_by")[1]
+ self.party_naming_by = frappe.db.get_single_value(
+ args.get("naming_by")[0], args.get("naming_by")[1]
)
self.get_columns()
self.get_data(args)
diff --git a/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.js b/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.js
index 5f78b77934..06fa9f3175 100644
--- a/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.js
+++ b/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.js
@@ -25,11 +25,26 @@ frappe.query_reports["Asset Depreciations and Balances"] = {
"default": erpnext.utils.get_fiscal_year(frappe.datetime.get_today(), true)[2],
"reqd": 1
},
+ {
+ "fieldname":"group_by",
+ "label": __("Group By"),
+ "fieldtype": "Select",
+ "options": ["Asset Category", "Asset"],
+ "default": "Asset Category",
+ },
{
"fieldname":"asset_category",
"label": __("Asset Category"),
"fieldtype": "Link",
- "options": "Asset Category"
- }
+ "options": "Asset Category",
+ "depends_on": "eval: doc.group_by == 'Asset Category'",
+ },
+ {
+ "fieldname":"asset",
+ "label": __("Asset"),
+ "fieldtype": "Link",
+ "options": "Asset",
+ "depends_on": "eval: doc.group_by == 'Asset'",
+ },
]
}
diff --git a/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py b/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py
index bdc8d8504f..48da17ab62 100644
--- a/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py
+++ b/erpnext/accounts/report/asset_depreciations_and_balances/asset_depreciations_and_balances.py
@@ -14,10 +14,17 @@ def execute(filters=None):
def get_data(filters):
+ if filters.get("group_by") == "Asset Category":
+ return get_group_by_asset_category_data(filters)
+ elif filters.get("group_by") == "Asset":
+ return get_group_by_asset_data(filters)
+
+
+def get_group_by_asset_category_data(filters):
data = []
- asset_categories = get_asset_categories(filters)
- assets = get_assets(filters)
+ asset_categories = get_asset_categories_for_grouped_by_category(filters)
+ assets = get_assets_for_grouped_by_category(filters)
for asset_category in asset_categories:
row = frappe._dict()
@@ -38,6 +45,7 @@ def get_data(filters):
if asset["asset_category"] == asset_category.get("asset_category", "")
)
)
+
row.accumulated_depreciation_as_on_to_date = (
flt(row.accumulated_depreciation_as_on_from_date)
+ flt(row.depreciation_amount_during_the_period)
@@ -57,7 +65,7 @@ def get_data(filters):
return data
-def get_asset_categories(filters):
+def get_asset_categories_for_grouped_by_category(filters):
condition = ""
if filters.get("asset_category"):
condition += " and asset_category = %(asset_category)s"
@@ -116,7 +124,105 @@ def get_asset_categories(filters):
)
-def get_assets(filters):
+def get_asset_details_for_grouped_by_category(filters):
+ condition = ""
+ if filters.get("asset"):
+ condition += " and name = %(asset)s"
+ return frappe.db.sql(
+ """
+ SELECT name,
+ ifnull(sum(case when purchase_date < %(from_date)s then
+ case when ifnull(disposal_date, 0) = 0 or disposal_date >= %(from_date)s then
+ gross_purchase_amount
+ else
+ 0
+ end
+ else
+ 0
+ end), 0) as cost_as_on_from_date,
+ ifnull(sum(case when purchase_date >= %(from_date)s then
+ gross_purchase_amount
+ else
+ 0
+ end), 0) as cost_of_new_purchase,
+ ifnull(sum(case when ifnull(disposal_date, 0) != 0
+ and disposal_date >= %(from_date)s
+ and disposal_date <= %(to_date)s then
+ case when status = "Sold" then
+ gross_purchase_amount
+ else
+ 0
+ end
+ else
+ 0
+ end), 0) as cost_of_sold_asset,
+ ifnull(sum(case when ifnull(disposal_date, 0) != 0
+ and disposal_date >= %(from_date)s
+ and disposal_date <= %(to_date)s then
+ case when status = "Scrapped" then
+ gross_purchase_amount
+ else
+ 0
+ end
+ else
+ 0
+ end), 0) as cost_of_scrapped_asset
+ from `tabAsset`
+ where docstatus=1 and company=%(company)s and purchase_date <= %(to_date)s {}
+ group by name
+ """.format(
+ condition
+ ),
+ {
+ "to_date": filters.to_date,
+ "from_date": filters.from_date,
+ "company": filters.company,
+ "asset": filters.get("asset"),
+ },
+ as_dict=1,
+ )
+
+
+def get_group_by_asset_data(filters):
+ data = []
+
+ asset_details = get_asset_details_for_grouped_by_category(filters)
+ assets = get_assets_for_grouped_by_asset(filters)
+
+ for asset_detail in asset_details:
+ row = frappe._dict()
+ # row.asset_category = asset_category
+ row.update(asset_detail)
+
+ row.cost_as_on_to_date = (
+ flt(row.cost_as_on_from_date)
+ + flt(row.cost_of_new_purchase)
+ - flt(row.cost_of_sold_asset)
+ - flt(row.cost_of_scrapped_asset)
+ )
+
+ row.update(next(asset for asset in assets if asset["asset"] == asset_detail.get("name", "")))
+
+ row.accumulated_depreciation_as_on_to_date = (
+ flt(row.accumulated_depreciation_as_on_from_date)
+ + flt(row.depreciation_amount_during_the_period)
+ - flt(row.depreciation_eliminated_during_the_period)
+ )
+
+ row.net_asset_value_as_on_from_date = flt(row.cost_as_on_from_date) - flt(
+ row.accumulated_depreciation_as_on_from_date
+ )
+
+ row.net_asset_value_as_on_to_date = flt(row.cost_as_on_to_date) - flt(
+ row.accumulated_depreciation_as_on_to_date
+ )
+
+ data.append(row)
+
+ return data
+
+
+def get_assets_for_grouped_by_category(filters):
condition = ""
if filters.get("asset_category"):
condition = " and a.asset_category = '{}'".format(filters.get("asset_category"))
@@ -178,15 +284,93 @@ def get_assets(filters):
)
+def get_assets_for_grouped_by_asset(filters):
+ condition = ""
+ if filters.get("asset"):
+ condition = " and a.name = '{}'".format(filters.get("asset"))
+ return frappe.db.sql(
+ """
+ SELECT results.name as asset,
+ sum(results.accumulated_depreciation_as_on_from_date) as accumulated_depreciation_as_on_from_date,
+ sum(results.depreciation_eliminated_during_the_period) as depreciation_eliminated_during_the_period,
+ sum(results.depreciation_amount_during_the_period) as depreciation_amount_during_the_period
+ from (SELECT a.name as name,
+ ifnull(sum(case when gle.posting_date < %(from_date)s and (ifnull(a.disposal_date, 0) = 0 or a.disposal_date >= %(from_date)s) then
+ gle.debit
+ else
+ 0
+ end), 0) as accumulated_depreciation_as_on_from_date,
+ ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 and a.disposal_date >= %(from_date)s
+ and a.disposal_date <= %(to_date)s and gle.posting_date <= a.disposal_date then
+ gle.debit
+ else
+ 0
+ end), 0) as depreciation_eliminated_during_the_period,
+ ifnull(sum(case when gle.posting_date >= %(from_date)s and gle.posting_date <= %(to_date)s
+ and (ifnull(a.disposal_date, 0) = 0 or gle.posting_date <= a.disposal_date) then
+ gle.debit
+ else
+ 0
+ end), 0) as depreciation_amount_during_the_period
+ from `tabGL Entry` gle
+ join `tabAsset` a on
+ gle.against_voucher = a.name
+ join `tabAsset Category Account` aca on
+ aca.parent = a.asset_category and aca.company_name = %(company)s
+ join `tabCompany` company on
+ company.name = %(company)s
+ where a.docstatus=1 and a.company=%(company)s and a.purchase_date <= %(to_date)s and gle.debit != 0 and gle.is_cancelled = 0 and gle.account = ifnull(aca.depreciation_expense_account, company.depreciation_expense_account) {0}
+ group by a.name
+ union
+ SELECT a.name as name,
+ ifnull(sum(case when ifnull(a.disposal_date, 0) != 0 and (a.disposal_date < %(from_date)s or a.disposal_date > %(to_date)s) then
+ 0
+ else
+ a.opening_accumulated_depreciation
+ end), 0) as accumulated_depreciation_as_on_from_date,
+ ifnull(sum(case when a.disposal_date >= %(from_date)s and a.disposal_date <= %(to_date)s then
+ a.opening_accumulated_depreciation
+ else
+ 0
+ end), 0) as depreciation_eliminated_during_the_period,
+ 0 as depreciation_amount_during_the_period
+ from `tabAsset` a
+ where a.docstatus=1 and a.company=%(company)s and a.purchase_date <= %(to_date)s {0}
+ group by a.name) as results
+ group by results.name
+ """.format(
+ condition
+ ),
+ {"to_date": filters.to_date, "from_date": filters.from_date, "company": filters.company},
+ as_dict=1,
+ )
+
+
def get_columns(filters):
- return [
- {
- "label": _("Asset Category"),
- "fieldname": "asset_category",
- "fieldtype": "Link",
- "options": "Asset Category",
- "width": 120,
- },
+ columns = []
+
+ if filters.get("group_by") == "Asset Category":
+ columns.append(
+ {
+ "label": _("Asset Category"),
+ "fieldname": "asset_category",
+ "fieldtype": "Link",
+ "options": "Asset Category",
+ "width": 120,
+ }
+ )
+ elif filters.get("group_by") == "Asset":
+ columns.append(
+ {
+ "label": _("Asset"),
+ "fieldname": "asset",
+ "fieldtype": "Link",
+ "options": "Asset",
+ "width": 120,
+ }
+ )
+
+ columns += [
{
"label": _("Cost as on") + " " + formatdate(filters.day_before_from_date),
"fieldname": "cost_as_on_from_date",
@@ -254,3 +438,5 @@ def get_columns(filters):
"width": 200,
},
]
+
+ return columns
diff --git a/erpnext/accounts/report/balance_sheet/balance_sheet.py b/erpnext/accounts/report/balance_sheet/balance_sheet.py
index b225aac7b5..5d6ca23a6b 100644
--- a/erpnext/accounts/report/balance_sheet/balance_sheet.py
+++ b/erpnext/accounts/report/balance_sheet/balance_sheet.py
@@ -97,11 +97,11 @@ def execute(filters=None):
chart = get_chart_data(filters, columns, asset, liability, equity)
- report_summary = get_report_summary(
+ report_summary, primitive_summary = get_report_summary(
period_list, asset, liability, equity, provisional_profit_loss, currency, filters
)
- return columns, data, message, chart, report_summary
+ return columns, data, message, chart, report_summary, primitive_summary
def get_provisional_profit_loss(
@@ -217,7 +217,7 @@ def get_report_summary(
"datatype": "Currency",
"currency": currency,
},
- ]
+ ], (net_asset - net_liability + net_equity)
def get_chart_data(filters, columns, asset, liability, equity):
diff --git a/erpnext/accounts/report/budget_variance_report/budget_variance_report.js b/erpnext/accounts/report/budget_variance_report/budget_variance_report.js
index 15aa265b56..9c356bf28e 100644
--- a/erpnext/accounts/report/budget_variance_report/budget_variance_report.js
+++ b/erpnext/accounts/report/budget_variance_report/budget_variance_report.js
@@ -2,7 +2,44 @@
// License: GNU General Public License v3. See license.txt
frappe.query_reports["Budget Variance Report"] = {
- "filters": [
+ "filters": get_filters(),
+ "formatter": function (value, row, column, data, default_formatter) {
+ value = default_formatter(value, row, column, data);
+
+ if (column.fieldname.includes(__("variance"))) {
+
+ if (data[column.fieldname] < 0) {
+ value = "" + value + "";
+ }
+ else if (data[column.fieldname] > 0) {
+ value = "" + value + "";
+ }
+ }
+
+ return value;
+ }
+}
+function get_filters() {
+ function get_dimensions() {
+ let result = [];
+ frappe.call({
+ method: "erpnext.accounts.doctype.accounting_dimension.accounting_dimension.get_dimensions",
+ args: {
+ 'with_cost_center_and_project': true
+ },
+ async: false,
+ callback: function(r) {
+ if(!r.exc) {
+ result = r.message[0].map(elem => elem.document_type);
+ }
+ }
+ });
+ return result;
+ }
+
+ let budget_against_options = get_dimensions();
+
+ let filters = [
{
fieldname: "from_fiscal_year",
label: __("From Fiscal Year"),
@@ -44,9 +81,13 @@ frappe.query_reports["Budget Variance Report"] = {
fieldname: "budget_against",
label: __("Budget Against"),
fieldtype: "Select",
- options: ["Cost Center", "Project"],
+ options: budget_against_options,
default: "Cost Center",
reqd: 1,
+ get_data: function() {
+ console.log(this.options);
+ return ["Emacs", "Rocks"];
+ },
on_change: function() {
frappe.query_report.set_filter_value("budget_against_filter", []);
frappe.query_report.refresh();
@@ -71,24 +112,8 @@ frappe.query_reports["Budget Variance Report"] = {
fieldtype: "Check",
default: 0,
},
- ],
- "formatter": function (value, row, column, data, default_formatter) {
- value = default_formatter(value, row, column, data);
+ ]
- if (column.fieldname.includes(__("variance"))) {
-
- if (data[column.fieldname] < 0) {
- value = "" + value + "";
- }
- else if (data[column.fieldname] > 0) {
- value = "" + value + "";
- }
- }
-
- return value;
- }
+ return filters;
}
-erpnext.dimension_filters.forEach((dimension) => {
- frappe.query_reports["Budget Variance Report"].filters[4].options.push(dimension["document_type"]);
-});
diff --git a/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py b/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py
index 4765e3b318..a2c0f86f6c 100644
--- a/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py
+++ b/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py
@@ -3,7 +3,7 @@
import frappe
-from frappe import _, scrub
+from frappe import _, qb, scrub
from frappe.utils import getdate, nowdate
@@ -21,8 +21,8 @@ class PartyLedgerSummaryReport(object):
frappe.throw(_("From Date must be before To Date"))
self.filters.party_type = args.get("party_type")
- self.party_naming_by = frappe.db.get_value(
- args.get("naming_by")[0], None, args.get("naming_by")[1]
+ self.party_naming_by = frappe.db.get_single_value(
+ args.get("naming_by")[0], args.get("naming_by")[1]
)
self.get_gl_entries()
@@ -38,7 +38,6 @@ class PartyLedgerSummaryReport(object):
"""
Additional Columns for 'User Permission' based access control
"""
- from frappe import qb
if self.filters.party_type == "Customer":
self.territories = frappe._dict({})
@@ -365,13 +364,29 @@ class PartyLedgerSummaryReport(object):
def get_party_adjustment_amounts(self):
conditions = self.prepare_conditions()
- income_or_expense = (
- "Expense Account" if self.filters.party_type == "Customer" else "Income Account"
+ account_type = "Expense Account" if self.filters.party_type == "Customer" else "Income Account"
+ income_or_expense_accounts = frappe.db.get_all(
+ "Account", filters={"account_type": account_type, "company": self.filters.company}, pluck="name"
)
invoice_dr_or_cr = "debit" if self.filters.party_type == "Customer" else "credit"
reverse_dr_or_cr = "credit" if self.filters.party_type == "Customer" else "debit"
round_off_account = frappe.get_cached_value("Company", self.filters.company, "round_off_account")
+ gl = qb.DocType("GL Entry")
+ if not income_or_expense_accounts:
+ # prevent empty 'in' condition
+ income_or_expense_accounts.append("")
+
+ accounts_query = (
+ qb.from_(gl)
+ .select(gl.voucher_type, gl.voucher_no)
+ .where(
+ (gl.account.isin(income_or_expense_accounts))
+ & (gl.posting_date.gte(self.filters.from_date))
+ & (gl.posting_date.lte(self.filters.to_date))
+ )
+ )
+
gl_entries = frappe.db.sql(
"""
select
@@ -381,16 +396,15 @@ class PartyLedgerSummaryReport(object):
where
docstatus < 2 and is_cancelled = 0
and (voucher_type, voucher_no) in (
- select voucher_type, voucher_no from `tabGL Entry` gle, `tabAccount` acc
- where acc.name = gle.account and acc.account_type = '{income_or_expense}'
- and gle.posting_date between %(from_date)s and %(to_date)s and gle.docstatus < 2
+ {accounts_query}
) and (voucher_type, voucher_no) in (
select voucher_type, voucher_no from `tabGL Entry` gle
where gle.party_type=%(party_type)s and ifnull(party, '') != ''
and gle.posting_date between %(from_date)s and %(to_date)s and gle.docstatus < 2 {conditions}
)
- """.format(
- conditions=conditions, income_or_expense=income_or_expense
+ """.format(
+ accounts_query=accounts_query,
+ conditions=conditions,
),
self.filters,
as_dict=True,
@@ -414,7 +428,7 @@ class PartyLedgerSummaryReport(object):
elif gle.party:
parties.setdefault(gle.party, 0)
parties[gle.party] += gle.get(reverse_dr_or_cr) - gle.get(invoice_dr_or_cr)
- elif frappe.get_cached_value("Account", gle.account, "account_type") == income_or_expense:
+ elif frappe.get_cached_value("Account", gle.account, "account_type") == account_type:
accounts.setdefault(gle.account, 0)
accounts[gle.account] += gle.get(invoice_dr_or_cr) - gle.get(reverse_dr_or_cr)
else:
diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py
index 7355c4b8a1..004a9299ea 100644
--- a/erpnext/accounts/report/financial_statements.py
+++ b/erpnext/accounts/report/financial_statements.py
@@ -211,7 +211,13 @@ def get_data(
ignore_accumulated_values_for_fy,
)
accumulate_values_into_parents(accounts, accounts_by_name, period_list)
- out = prepare_data(accounts, balance_must_be, period_list, company_currency)
+ out = prepare_data(
+ accounts,
+ balance_must_be,
+ period_list,
+ company_currency,
+ accumulated_values=filters.accumulated_values,
+ )
out = filter_out_zero_value_rows(out, parent_children_map)
if out and total:
@@ -270,7 +276,7 @@ def accumulate_values_into_parents(accounts, accounts_by_name, period_list):
) + d.get("opening_balance", 0.0)
-def prepare_data(accounts, balance_must_be, period_list, company_currency):
+def prepare_data(accounts, balance_must_be, period_list, company_currency, accumulated_values):
data = []
year_start_date = period_list[0]["year_start_date"].strftime("%Y-%m-%d")
year_end_date = period_list[-1]["year_end_date"].strftime("%Y-%m-%d")
@@ -310,8 +316,14 @@ def prepare_data(accounts, balance_must_be, period_list, company_currency):
has_value = True
total += flt(row[period.key])
- row["has_value"] = has_value
- row["total"] = total
+ if accumulated_values:
+ # when 'accumulated_values' is enabled, periods have running balance.
+ # so, last period will have the net amount.
+ row["has_value"] = has_value
+ row["total"] = flt(d.get(period_list[-1].key, 0.0), 3)
+ else:
+ row["has_value"] = has_value
+ row["total"] = total
data.append(row)
return data
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.js b/erpnext/accounts/report/general_ledger/general_ledger.js
index 4cb443cf92..79b5e4d9ec 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.js
+++ b/erpnext/accounts/report/general_ledger/general_ledger.js
@@ -52,6 +52,11 @@ frappe.query_reports["General Ledger"] = {
frappe.query_report.set_filter_value('group_by', "Group by Voucher (Consolidated)");
}
},
+ {
+ "fieldname":"against_voucher_no",
+ "label": __("Against Voucher No"),
+ "fieldtype": "Data",
+ },
{
"fieldtype": "Break",
},
diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py
index ac06a1227e..6636b8e042 100644
--- a/erpnext/accounts/report/general_ledger/general_ledger.py
+++ b/erpnext/accounts/report/general_ledger/general_ledger.py
@@ -200,10 +200,10 @@ def get_gl_entries(filters, accounting_dimensions):
"""
select
name as gl_entry, posting_date, account, party_type, party,
- voucher_type, voucher_no, {dimension_fields}
+ voucher_type, voucher_subtype, voucher_no, {dimension_fields}
cost_center, project, {transaction_currency_fields}
against_voucher_type, against_voucher, account_currency,
- against, is_opening, creation {select_fields}
+ against_link, against, is_opening, creation {select_fields}
from `tabGL Entry`
where company=%(company)s {conditions}
{order_by_statement}
@@ -238,6 +238,12 @@ def get_conditions(filters):
if filters.get("voucher_no"):
conditions.append("voucher_no=%(voucher_no)s")
+ if filters.get("against_voucher_no"):
+ conditions.append("against_voucher=%(against_voucher_no)s")
+
+ if filters.get("voucher_no_not_in"):
+ conditions.append("voucher_no not in %(voucher_no_not_in)s")
+
if filters.get("group_by") == "Group by Party" and not filters.get("party_type"):
conditions.append("party_type in ('Customer', 'Supplier')")
@@ -392,6 +398,7 @@ def initialize_gle_map(gl_entries, filters):
group_by = group_by_field(filters.get("group_by"))
for gle in gl_entries:
+ gle.against = gle.get("against_link") or gle.get("against")
gle_map.setdefault(gle.get(group_by), _dict(totals=get_totals_dict(), entries=[]))
return gle_map
@@ -605,6 +612,12 @@ def get_columns(filters):
columns += [
{"label": _("Voucher Type"), "fieldname": "voucher_type", "width": 120},
+ {
+ "label": _("Voucher Subtype"),
+ "fieldname": "voucher_subtype",
+ "fieldtype": "Data",
+ "width": 180,
+ },
{
"label": _("Voucher No"),
"fieldname": "voucher_no",
diff --git a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py
index 66353358a0..12a855457e 100644
--- a/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py
+++ b/erpnext/accounts/report/profit_and_loss_statement/profit_and_loss_statement.py
@@ -66,11 +66,11 @@ def execute(filters=None):
currency = filters.presentation_currency or frappe.get_cached_value(
"Company", filters.company, "default_currency"
)
- report_summary = get_report_summary(
+ report_summary, primitive_summary = get_report_summary(
period_list, filters.periodicity, income, expense, net_profit_loss, currency, filters
)
- return columns, data, None, chart, report_summary
+ return columns, data, None, chart, report_summary, primitive_summary
def get_report_summary(
@@ -82,14 +82,25 @@ def get_report_summary(
if filters.get("accumulated_in_group_company"):
period_list = get_filtered_list_for_consolidated_report(filters, period_list)
- for period in period_list:
- key = period if consolidated else period.key
+ if filters.accumulated_values:
+ # when 'accumulated_values' is enabled, periods have running balance.
+ # so, last period will have the net amount.
+ key = period_list[-1].key
if income:
- net_income += income[-2].get(key)
+ net_income = income[-2].get(key)
if expense:
- net_expense += expense[-2].get(key)
+ net_expense = expense[-2].get(key)
if net_profit_loss:
- net_profit += net_profit_loss.get(key)
+ net_profit = net_profit_loss.get(key)
+ else:
+ for period in period_list:
+ key = period if consolidated else period.key
+ if income:
+ net_income += income[-2].get(key)
+ if expense:
+ net_expense += expense[-2].get(key)
+ if net_profit_loss:
+ net_profit += net_profit_loss.get(key)
if len(period_list) == 1 and periodicity == "Yearly":
profit_label = _("Profit This Year")
@@ -112,7 +123,7 @@ def get_report_summary(
"datatype": "Currency",
"currency": currency,
},
- ]
+ ], net_profit
def get_net_profit_loss(income, expense, period_list, company, currency=None, consolidated=False):
diff --git a/erpnext/accounts/report/profit_and_loss_statement/test_profit_and_loss_statement.py b/erpnext/accounts/report/profit_and_loss_statement/test_profit_and_loss_statement.py
new file mode 100644
index 0000000000..b4423abc7f
--- /dev/null
+++ b/erpnext/accounts/report/profit_and_loss_statement/test_profit_and_loss_statement.py
@@ -0,0 +1,94 @@
+# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors
+# MIT License. See license.txt
+
+import frappe
+from frappe.tests.utils import FrappeTestCase
+from frappe.utils import add_days, getdate, today
+
+from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
+from erpnext.accounts.report.financial_statements import get_period_list
+from erpnext.accounts.report.profit_and_loss_statement.profit_and_loss_statement import execute
+from erpnext.accounts.test.accounts_mixin import AccountsTestMixin
+
+
+class TestProfitAndLossStatement(AccountsTestMixin, FrappeTestCase):
+ def setUp(self):
+ self.create_company()
+ self.create_customer()
+ self.create_item()
+
+ def tearDown(self):
+ frappe.db.rollback()
+
+ def create_sales_invoice(self, qty=1, rate=150, no_payment_schedule=False, do_not_submit=False):
+ frappe.set_user("Administrator")
+ si = create_sales_invoice(
+ item=self.item,
+ company=self.company,
+ customer=self.customer,
+ debit_to=self.debit_to,
+ posting_date=today(),
+ parent_cost_center=self.cost_center,
+ cost_center=self.cost_center,
+ rate=rate,
+ price_list_rate=rate,
+ qty=qty,
+ do_not_save=1,
+ )
+ si = si.save()
+ if not do_not_submit:
+ si = si.submit()
+ return si
+
+ def get_fiscal_year(self):
+ active_fy = frappe.db.get_all(
+ "Fiscal Year",
+ filters={"disabled": 0, "year_start_date": ("<=", today()), "year_end_date": (">=", today())},
+ )[0]
+ return frappe.get_doc("Fiscal Year", active_fy.name)
+
+ def get_report_filters(self):
+ fy = self.get_fiscal_year()
+ return frappe._dict(
+ company=self.company,
+ from_fiscal_year=fy.name,
+ to_fiscal_year=fy.name,
+ period_start_date=fy.year_start_date,
+ period_end_date=fy.year_end_date,
+ filter_based_on="Fiscal Year",
+ periodicity="Monthly",
+ accumulated_vallues=True,
+ )
+
+ def test_profit_and_loss_output_and_summary(self):
+ si = self.create_sales_invoice(qty=1, rate=150)
+
+ filters = self.get_report_filters()
+ period_list = get_period_list(
+ filters.from_fiscal_year,
+ filters.to_fiscal_year,
+ filters.period_start_date,
+ filters.period_end_date,
+ filters.filter_based_on,
+ filters.periodicity,
+ company=filters.company,
+ )
+
+ result = execute(filters)[1]
+ current_period = [x for x in period_list if x.from_date <= getdate() and x.to_date >= getdate()][
+ 0
+ ]
+ current_period_key = current_period.key
+ without_current_period = [x for x in period_list if x.key != current_period.key]
+ # all period except current period(whence invoice was posted), should be '0'
+ for acc in result:
+ if acc:
+ with self.subTest(acc=acc):
+ for period in without_current_period:
+ self.assertEqual(acc[period.key], 0)
+
+ for acc in result:
+ if acc:
+ with self.subTest(current_period_key=current_period_key):
+ self.assertEqual(acc[current_period_key], 150)
+ self.assertEqual(acc["total"], 150)
diff --git a/erpnext/accounts/report/profitability_analysis/profitability_analysis.js b/erpnext/accounts/report/profitability_analysis/profitability_analysis.js
index b6bbd979ed..5dd3617a92 100644
--- a/erpnext/accounts/report/profitability_analysis/profitability_analysis.js
+++ b/erpnext/accounts/report/profitability_analysis/profitability_analysis.js
@@ -117,8 +117,3 @@ frappe.query_reports["Profitability Analysis"] = {
"parent_field": "parent_account",
"initial_depth": 3
}
-
-erpnext.dimension_filters.forEach((dimension) => {
- frappe.query_reports["Profitability Analysis"].filters[1].options.push(dimension["document_type"]);
-});
-
diff --git a/erpnext/accounts/report/utils.py b/erpnext/accounts/report/utils.py
index 9f96449ba7..0912c7270d 100644
--- a/erpnext/accounts/report/utils.py
+++ b/erpnext/accounts/report/utils.py
@@ -251,6 +251,7 @@ def get_journal_entries(filters, args):
)
.where(
(je.voucher_type == "Journal Entry")
+ & (je.docstatus == 1)
& (journal_account.party == filters.get(args.party))
& (journal_account.account.isin(args.party_account))
)
@@ -281,7 +282,9 @@ def get_payment_entries(filters, args):
pe.cost_center,
)
.where(
- (pe.party == filters.get(args.party)) & (pe[args.account_fieldname].isin(args.party_account))
+ (pe.docstatus == 1)
+ & (pe.party == filters.get(args.party))
+ & (pe[args.account_fieldname].isin(args.party_account))
)
.orderby(pe.posting_date, pe.name, order=Order.desc)
)
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index 0f21c864b0..25fbe170b8 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -642,6 +642,7 @@ def update_reference_in_journal_entry(d, journal_entry, do_not_save=False):
new_row.set("reference_name", d["against_voucher"])
new_row.against_account = cstr(jv_detail.against_account)
+ new_row.against_account_link = cstr(jv_detail.against_account)
new_row.is_advance = cstr(jv_detail.is_advance)
new_row.docstatus = 1
@@ -1115,12 +1116,16 @@ def get_companies():
@frappe.whitelist()
-def get_children(doctype, parent, company, is_root=False):
+def get_children(doctype, parent, company, is_root=False, include_disabled=False):
+ if isinstance(include_disabled, str):
+ include_disabled = frappe.json.loads(include_disabled)
from erpnext.accounts.report.financial_statements import sort_accounts
parent_fieldname = "parent_" + doctype.lower().replace(" ", "_")
fields = ["name as value", "is_group as expandable"]
filters = [["docstatus", "<", 2]]
+ if frappe.db.has_column(doctype, "disabled") and not include_disabled:
+ filters.append(["disabled", "=", False])
filters.append(['ifnull(`{0}`,"")'.format(parent_fieldname), "=", "" if is_root else parent])
@@ -1275,7 +1280,7 @@ def parse_naming_series_variable(doc, variable):
else:
date = getdate()
company = None
- return get_fiscal_year(date=date, company=company)[0]
+ return get_fiscal_year(date=date, company=company).name
@frappe.whitelist()
diff --git a/erpnext/accounts/workspace/accounting/accounting.json b/erpnext/accounts/workspace/accounting/accounting.json
index dfdae1dec6..f4aced2f9d 100644
--- a/erpnext/accounts/workspace/accounting/accounting.json
+++ b/erpnext/accounts/workspace/accounting/accounting.json
@@ -5,7 +5,7 @@
"label": "Profit and Loss"
}
],
- "content": "[{\"id\":\"MmUf9abwxg\",\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Accounts\",\"col\":12}},{\"id\":\"VVvJ1lUcfc\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Outgoing Bills\",\"col\":3}},{\"id\":\"Vlj2FZtlHV\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Incoming Bills\",\"col\":3}},{\"id\":\"VVVjQVAhPf\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Incoming Payment\",\"col\":3}},{\"id\":\"DySNdlysIW\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Outgoing Payment\",\"col\":3}},{\"id\":\"i0EtSjDAXq\",\"type\":\"chart\",\"data\":{\"chart_name\":\"Profit and Loss\",\"col\":12}},{\"id\":\"X78jcbq1u3\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"vikWSkNm6_\",\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"id\":\"pMywM0nhlj\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Chart of Accounts\",\"col\":3}},{\"id\":\"_pRdD6kqUG\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Invoice\",\"col\":3}},{\"id\":\"G984SgVRJN\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Purchase Invoice\",\"col\":3}},{\"id\":\"1ArNvt9qhz\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Journal Entry\",\"col\":3}},{\"id\":\"F9f4I1viNr\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Payment Entry\",\"col\":3}},{\"id\":\"4IBBOIxfqW\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Accounts Receivable\",\"col\":3}},{\"id\":\"El2anpPaFY\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"General Ledger\",\"col\":3}},{\"id\":\"1nwcM9upJo\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Trial Balance\",\"col\":3}},{\"id\":\"OF9WOi1Ppc\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"id\":\"iAwpe-Chra\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Learn Accounting\",\"col\":3}},{\"id\":\"B7-uxs8tkU\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"tHb3yxthkR\",\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"id\":\"DnNtsmxpty\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounting Masters\",\"col\":4}},{\"id\":\"nKKr6fjgjb\",\"type\":\"card\",\"data\":{\"card_name\":\"General Ledger\",\"col\":4}},{\"id\":\"xOHTyD8b5l\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounts Receivable\",\"col\":4}},{\"id\":\"_Cb7C8XdJJ\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounts Payable\",\"col\":4}},{\"id\":\"p7NY6MHe2Y\",\"type\":\"card\",\"data\":{\"card_name\":\"Financial Statements\",\"col\":4}},{\"id\":\"KlqilF5R_V\",\"type\":\"card\",\"data\":{\"card_name\":\"Taxes\",\"col\":4}},{\"id\":\"jTUy8LB0uw\",\"type\":\"card\",\"data\":{\"card_name\":\"Cost Center and Budgeting\",\"col\":4}},{\"id\":\"Wn2lhs7WLn\",\"type\":\"card\",\"data\":{\"card_name\":\"Multi Currency\",\"col\":4}},{\"id\":\"PAQMqqNkBM\",\"type\":\"card\",\"data\":{\"card_name\":\"Bank Statement\",\"col\":4}},{\"id\":\"Q_hBCnSeJY\",\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"id\":\"3AK1Zf0oew\",\"type\":\"card\",\"data\":{\"card_name\":\"Profitability\",\"col\":4}},{\"id\":\"kxhoaiqdLq\",\"type\":\"card\",\"data\":{\"card_name\":\"Opening and Closing\",\"col\":4}},{\"id\":\"q0MAlU2j_Z\",\"type\":\"card\",\"data\":{\"card_name\":\"Subscription Management\",\"col\":4}},{\"id\":\"ptm7T6Hwu-\",\"type\":\"card\",\"data\":{\"card_name\":\"Share Management\",\"col\":4}},{\"id\":\"OX7lZHbiTr\",\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}}]",
+ "content": "[{\"id\":\"MmUf9abwxg\",\"type\":\"onboarding\",\"data\":{\"onboarding_name\":\"Accounts\",\"col\":12}},{\"id\":\"VVvJ1lUcfc\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Outgoing Bills\",\"col\":3}},{\"id\":\"Vlj2FZtlHV\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Incoming Bills\",\"col\":3}},{\"id\":\"VVVjQVAhPf\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Incoming Payment\",\"col\":3}},{\"id\":\"DySNdlysIW\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Outgoing Payment\",\"col\":3}},{\"id\":\"i0EtSjDAXq\",\"type\":\"chart\",\"data\":{\"chart_name\":\"Profit and Loss\",\"col\":12}},{\"id\":\"X78jcbq1u3\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"vikWSkNm6_\",\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\",\"col\":12}},{\"id\":\"pMywM0nhlj\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Chart of Accounts\",\"col\":3}},{\"id\":\"_pRdD6kqUG\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Invoice\",\"col\":3}},{\"id\":\"G984SgVRJN\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Purchase Invoice\",\"col\":3}},{\"id\":\"1ArNvt9qhz\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Journal Entry\",\"col\":3}},{\"id\":\"F9f4I1viNr\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Payment Entry\",\"col\":3}},{\"id\":\"4IBBOIxfqW\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Accounts Receivable\",\"col\":3}},{\"id\":\"El2anpPaFY\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"General Ledger\",\"col\":3}},{\"id\":\"1nwcM9upJo\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Trial Balance\",\"col\":3}},{\"id\":\"OF9WOi1Ppc\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"id\":\"iAwpe-Chra\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Learn Accounting\",\"col\":3}},{\"id\":\"B7-uxs8tkU\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"tHb3yxthkR\",\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"id\":\"DnNtsmxpty\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounting Masters\",\"col\":4}},{\"id\":\"nKKr6fjgjb\",\"type\":\"card\",\"data\":{\"card_name\":\"General Ledger\",\"col\":4}},{\"id\":\"xOHTyD8b5l\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounts Receivable\",\"col\":4}},{\"id\":\"_Cb7C8XdJJ\",\"type\":\"card\",\"data\":{\"card_name\":\"Accounts Payable\",\"col\":4}},{\"id\":\"p7NY6MHe2Y\",\"type\":\"card\",\"data\":{\"card_name\":\"Financial Statements\",\"col\":4}},{\"id\":\"KlqilF5R_V\",\"type\":\"card\",\"data\":{\"card_name\":\"Taxes\",\"col\":4}},{\"id\":\"jTUy8LB0uw\",\"type\":\"card\",\"data\":{\"card_name\":\"Cost Center and Budgeting\",\"col\":4}},{\"id\":\"Wn2lhs7WLn\",\"type\":\"card\",\"data\":{\"card_name\":\"Multi Currency\",\"col\":4}},{\"id\":\"PAQMqqNkBM\",\"type\":\"card\",\"data\":{\"card_name\":\"Banking\",\"col\":4}},{\"id\":\"Q_hBCnSeJY\",\"type\":\"card\",\"data\":{\"card_name\":\"Reports\",\"col\":4}},{\"id\":\"3AK1Zf0oew\",\"type\":\"card\",\"data\":{\"card_name\":\"Profitability\",\"col\":4}},{\"id\":\"kxhoaiqdLq\",\"type\":\"card\",\"data\":{\"card_name\":\"Opening and Closing\",\"col\":4}},{\"id\":\"q0MAlU2j_Z\",\"type\":\"card\",\"data\":{\"card_name\":\"Subscription Management\",\"col\":4}},{\"id\":\"ptm7T6Hwu-\",\"type\":\"card\",\"data\":{\"card_name\":\"Share Management\",\"col\":4}},{\"id\":\"OX7lZHbiTr\",\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}}]",
"creation": "2020-03-02 15:41:59.515192",
"custom_blocks": [],
"docstatus": 0,
@@ -652,14 +652,6 @@
"onboard": 0,
"type": "Link"
},
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Bank Statement",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
{
"dependencies": "",
"hidden": 0,
@@ -1059,9 +1051,83 @@
"link_type": "Report",
"onboard": 0,
"type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Banking",
+ "link_count": 6,
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Card Break"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Bank",
+ "link_count": 0,
+ "link_to": "Bank",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Bank Account",
+ "link_count": 0,
+ "link_to": "Bank Account",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Bank Clearance",
+ "link_count": 0,
+ "link_to": "Bank Clearance",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Bank Reconciliation Tool",
+ "link_count": 0,
+ "link_to": "Bank Reconciliation Tool",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "GL Entry",
+ "hidden": 0,
+ "is_query_report": 1,
+ "label": "Bank Reconciliation Statement",
+ "link_count": 0,
+ "link_to": "Bank Reconciliation Statement",
+ "link_type": "Report",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Plaid Settings",
+ "link_count": 0,
+ "link_to": "Plaid Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
}
],
- "modified": "2023-08-10 17:41:14.059005",
+ "modified": "2024-01-02 15:21:09.895531",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounting",
diff --git a/erpnext/assets/doctype/asset/asset.json b/erpnext/assets/doctype/asset/asset.json
index 540a4f5549..d0c9350d77 100644
--- a/erpnext/assets/doctype/asset/asset.json
+++ b/erpnext/assets/doctype/asset/asset.json
@@ -35,6 +35,8 @@
"purchase_receipt",
"purchase_invoice",
"available_for_use_date",
+ "total_asset_cost",
+ "additional_asset_cost",
"column_break_23",
"gross_purchase_amount",
"asset_quantity",
@@ -200,9 +202,9 @@
"fieldname": "purchase_date",
"fieldtype": "Date",
"label": "Purchase Date",
+ "mandatory_depends_on": "eval:!doc.is_existing_asset",
"read_only": 1,
- "read_only_depends_on": "eval:!doc.is_existing_asset && !doc.is_composite_asset",
- "reqd": 1
+ "read_only_depends_on": "eval:!doc.is_existing_asset && !doc.is_composite_asset"
},
{
"fieldname": "disposal_date",
@@ -225,15 +227,15 @@
"fieldname": "gross_purchase_amount",
"fieldtype": "Currency",
"label": "Gross Purchase Amount",
+ "mandatory_depends_on": "eval:(!doc.is_composite_asset || doc.docstatus==1)",
"options": "Company:company:default_currency",
- "read_only_depends_on": "eval:!doc.is_existing_asset",
- "reqd": 1
+ "read_only_depends_on": "eval:!doc.is_existing_asset"
},
{
"fieldname": "available_for_use_date",
"fieldtype": "Date",
"label": "Available-for-use Date",
- "reqd": 1
+ "mandatory_depends_on": "eval:(!doc.is_composite_asset || doc.docstatus==1)"
},
{
"default": "0",
@@ -529,6 +531,22 @@
"label": "Capitalized In",
"options": "Asset Capitalization",
"read_only": 1
+ },
+ {
+ "depends_on": "eval:doc.docstatus > 0",
+ "fieldname": "total_asset_cost",
+ "fieldtype": "Currency",
+ "label": "Total Asset Cost",
+ "options": "Company:company:default_currency",
+ "read_only": 1
+ },
+ {
+ "depends_on": "eval:doc.docstatus > 0",
+ "fieldname": "additional_asset_cost",
+ "fieldtype": "Currency",
+ "label": "Additional Asset Cost",
+ "options": "Company:company:default_currency",
+ "read_only": 1
}
],
"idx": 72,
@@ -572,7 +590,7 @@
"link_fieldname": "target_asset"
}
],
- "modified": "2023-11-20 20:57:37.010467",
+ "modified": "2024-01-05 17:36:53.131512",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset",
diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py
index 707ce199c3..5f448987a5 100644
--- a/erpnext/assets/doctype/asset/asset.py
+++ b/erpnext/assets/doctype/asset/asset.py
@@ -50,13 +50,14 @@ class Asset(AccountsController):
from erpnext.assets.doctype.asset_finance_book.asset_finance_book import AssetFinanceBook
+ additional_asset_cost: DF.Currency
amended_from: DF.Link | None
asset_category: DF.Link | None
asset_name: DF.Data
asset_owner: DF.Literal["", "Company", "Supplier", "Customer"]
asset_owner_company: DF.Link | None
asset_quantity: DF.Int
- available_for_use_date: DF.Date
+ available_for_use_date: DF.Date | None
booked_fixed_asset: DF.Check
calculate_depreciation: DF.Check
capitalized_in: DF.Link | None
@@ -91,7 +92,7 @@ class Asset(AccountsController):
number_of_depreciations_booked: DF.Int
opening_accumulated_depreciation: DF.Currency
policy_number: DF.Data | None
- purchase_date: DF.Date
+ purchase_date: DF.Date | None
purchase_invoice: DF.Link | None
purchase_receipt: DF.Link | None
purchase_receipt_amount: DF.Currency
@@ -111,6 +112,7 @@ class Asset(AccountsController):
"Decapitalized",
]
supplier: DF.Link | None
+ total_asset_cost: DF.Currency
total_number_of_depreciations: DF.Int
value_after_depreciation: DF.Currency
# end: auto-generated types
@@ -144,6 +146,7 @@ class Asset(AccountsController):
).format(asset_depr_schedules_links)
)
+ self.total_asset_cost = self.gross_purchase_amount
self.status = self.get_status()
def on_submit(self):
@@ -313,7 +316,12 @@ class Asset(AccountsController):
frappe.throw(_("Gross Purchase Amount is mandatory"), frappe.MandatoryError)
if is_cwip_accounting_enabled(self.asset_category):
- if not self.is_existing_asset and not self.purchase_receipt and not self.purchase_invoice:
+ if (
+ not self.is_existing_asset
+ and not self.is_composite_asset
+ and not self.purchase_receipt
+ and not self.purchase_invoice
+ ):
frappe.throw(
_("Please create purchase receipt or purchase invoice for the item {0}").format(
self.item_code
@@ -326,7 +334,7 @@ class Asset(AccountsController):
and not frappe.db.get_value("Purchase Invoice", self.purchase_invoice, "update_stock")
):
frappe.throw(
- _("Update stock must be enable for the purchase invoice {0}").format(self.purchase_invoice)
+ _("Update stock must be enabled for the purchase invoice {0}").format(self.purchase_invoice)
)
if not self.calculate_depreciation:
@@ -689,7 +697,9 @@ class Asset(AccountsController):
self.get_gl_dict(
{
"account": cwip_account,
+ "against_type": "Account",
"against": fixed_asset_account,
+ "against_link": fixed_asset_account,
"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
"posting_date": self.available_for_use_date,
"credit": self.purchase_receipt_amount,
@@ -704,7 +714,9 @@ class Asset(AccountsController):
self.get_gl_dict(
{
"account": fixed_asset_account,
+ "against_type": "Account",
"against": cwip_account,
+ "against_link": cwip_account,
"remarks": self.get("remarks") or _("Accounting Entry for Asset"),
"posting_date": self.available_for_use_date,
"debit": self.purchase_receipt_amount,
diff --git a/erpnext/assets/doctype/asset/depreciation.py b/erpnext/assets/doctype/asset/depreciation.py
index 66930c0e7c..017df90d41 100644
--- a/erpnext/assets/doctype/asset/depreciation.py
+++ b/erpnext/assets/doctype/asset/depreciation.py
@@ -35,7 +35,7 @@ from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_sched
def post_depreciation_entries(date=None):
# Return if automatic booking of asset depreciation is disabled
if not cint(
- frappe.db.get_value("Accounts Settings", None, "book_asset_depreciation_entry_automatically")
+ frappe.db.get_single_value("Accounts Settings", "book_asset_depreciation_entry_automatically")
):
return
diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py
index dc80aa5c5c..0773698420 100644
--- a/erpnext/assets/doctype/asset/test_asset.py
+++ b/erpnext/assets/doctype/asset/test_asset.py
@@ -251,7 +251,16 @@ class TestAsset(AssetSetup):
flt(18000.0 + pro_rata_amount, asset.precision("gross_purchase_amount")),
0.0,
),
- ("_Test Fixed Asset - _TC", 0.0, 100000.0),
+ (
+ "_Test Fixed Asset - _TC",
+ 0.0,
+ flt(18000.0 + pro_rata_amount, asset.precision("gross_purchase_amount")),
+ ),
+ (
+ "_Test Fixed Asset - _TC",
+ 0.0,
+ flt(82000.0 - pro_rata_amount, asset.precision("gross_purchase_amount")),
+ ),
(
"_Test Gain/Loss on Asset Disposal - _TC",
flt(82000.0 - pro_rata_amount, asset.precision("gross_purchase_amount")),
diff --git a/erpnext/assets/doctype/asset_activity/asset_activity.py b/erpnext/assets/doctype/asset_activity/asset_activity.py
index a64cb1aba3..7177223b4f 100644
--- a/erpnext/assets/doctype/asset_activity/asset_activity.py
+++ b/erpnext/assets/doctype/asset_activity/asset_activity.py
@@ -3,6 +3,7 @@
import frappe
from frappe.model.document import Document
+from frappe.utils import now_datetime
class AssetActivity(Document):
@@ -30,5 +31,6 @@ def add_asset_activity(asset, subject):
"asset": asset,
"subject": subject,
"user": frappe.session.user,
+ "date": now_datetime(),
}
).insert(ignore_permissions=True, ignore_links=True)
diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py
index 66997ca59c..de758419e0 100644
--- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py
+++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.py
@@ -485,7 +485,9 @@ class AssetCapitalization(StockController):
self.get_gl_dict(
{
"account": account,
+ "against_type": "Account",
"against": target_account,
+ "against_link": target_account,
"cost_center": item_row.cost_center,
"project": item_row.get("project") or self.get("project"),
"remarks": self.get("remarks") or "Accounting Entry for Stock",
@@ -526,7 +528,9 @@ class AssetCapitalization(StockController):
self.set_consumed_asset_status(asset)
for gle in fixed_asset_gl_entries:
+ gle["against_type"] = "Account"
gle["against"] = target_account
+ gle["against_link"] = target_account
gl_entries.append(self.get_gl_dict(gle, item=item))
target_against.add(gle["account"])
@@ -542,7 +546,9 @@ class AssetCapitalization(StockController):
self.get_gl_dict(
{
"account": item_row.expense_account,
+ "against_type": "Account",
"against": target_account,
+ "against_link": target_account,
"cost_center": item_row.cost_center,
"project": item_row.get("project") or self.get("project"),
"remarks": self.get("remarks") or "Accounting Entry for Stock",
@@ -553,41 +559,46 @@ class AssetCapitalization(StockController):
)
def get_gl_entries_for_target_item(self, gl_entries, target_against, precision):
- if self.target_is_fixed_asset:
- # Capitalization
- gl_entries.append(
- self.get_gl_dict(
- {
- "account": self.target_fixed_asset_account,
- "against": ", ".join(target_against),
- "remarks": self.get("remarks") or _("Accounting Entry for Asset"),
- "debit": flt(self.total_value, precision),
- "cost_center": self.get("cost_center"),
- },
- item=self,
- )
- )
- else:
- # Target Stock Item
- sle_list = self.sle_map.get(self.name)
- for sle in sle_list:
- stock_value_difference = flt(sle.stock_value_difference, precision)
- account = self.warehouse_account[sle.warehouse]["account"]
-
+ for target_account in target_against:
+ if self.target_is_fixed_asset:
+ # Capitalization
gl_entries.append(
self.get_gl_dict(
{
- "account": account,
- "against": ", ".join(target_against),
- "cost_center": self.cost_center,
- "project": self.get("project"),
- "remarks": self.get("remarks") or "Accounting Entry for Stock",
- "debit": stock_value_difference,
+ "account": self.target_fixed_asset_account,
+ "against_type": "Account",
+ "against": target_account,
+ "against_link": target_account,
+ "remarks": self.get("remarks") or _("Accounting Entry for Asset"),
+ "debit": flt(self.total_value, precision) / len(target_against),
+ "cost_center": self.get("cost_center"),
},
- self.warehouse_account[sle.warehouse]["account_currency"],
item=self,
)
)
+ else:
+ # Target Stock Item
+ sle_list = self.sle_map.get(self.name)
+ for sle in sle_list:
+ stock_value_difference = flt(sle.stock_value_difference, precision)
+ account = self.warehouse_account[sle.warehouse]["account"]
+
+ gl_entries.append(
+ self.get_gl_dict(
+ {
+ "account": account,
+ "against_type": "Account",
+ "against": target_account,
+ "against_link": target_account,
+ "cost_center": self.cost_center,
+ "project": self.get("project"),
+ "remarks": self.get("remarks") or "Accounting Entry for Stock",
+ "debit": stock_value_difference / len(target_against),
+ },
+ self.warehouse_account[sle.warehouse]["account_currency"],
+ item=self,
+ )
+ )
def create_target_asset(self):
if (
diff --git a/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py b/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py
index ac7c90d9e6..7a7a10de20 100644
--- a/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py
+++ b/erpnext/assets/doctype/asset_capitalization/test_asset_capitalization.py
@@ -98,12 +98,12 @@ class TestAssetCapitalization(unittest.TestCase):
# Test General Ledger Entries
expected_gle = {
- "_Test Fixed Asset - TCP1": 3000,
+ "_Test Fixed Asset - TCP1": 2999.99,
"Expenses Included In Asset Valuation - TCP1": -1000,
"_Test Warehouse - TCP1": -2000,
+ "Round Off - TCP1": 0.01,
}
actual_gle = get_actual_gle_dict(asset_capitalization.name)
-
self.assertEqual(actual_gle, expected_gle)
# Test Stock Ledger Entries
@@ -189,9 +189,10 @@ class TestAssetCapitalization(unittest.TestCase):
# Test General Ledger Entries
default_expense_account = frappe.db.get_value("Company", company, "default_expense_account")
expected_gle = {
- "_Test Fixed Asset - _TC": 3000,
+ "_Test Fixed Asset - _TC": 2999.99,
"Expenses Included In Asset Valuation - _TC": -1000,
default_expense_account: -2000,
+ "Round Off - _TC": 0.01,
}
actual_gle = get_actual_gle_dict(asset_capitalization.name)
@@ -376,9 +377,10 @@ class TestAssetCapitalization(unittest.TestCase):
# Test General Ledger Entries
expected_gle = {
- "_Test Warehouse - TCP1": consumed_asset_value_before_disposal,
"_Test Accumulated Depreciations - TCP1": accumulated_depreciation,
"_Test Fixed Asset - TCP1": -consumed_asset_purchase_value,
+ "_Test Warehouse - TCP1": consumed_asset_value_before_disposal - 0.01,
+ "Round Off - TCP1": 0.01,
}
actual_gle = get_actual_gle_dict(asset_capitalization.name)
self.assertEqual(actual_gle, expected_gle)
diff --git a/erpnext/assets/doctype/asset_category/asset_category.py b/erpnext/assets/doctype/asset_category/asset_category.py
index 034ec555dc..d401b81c2e 100644
--- a/erpnext/assets/doctype/asset_category/asset_category.py
+++ b/erpnext/assets/doctype/asset_category/asset_category.py
@@ -86,12 +86,12 @@ class AssetCategory(Document):
if selected_key_type not in expected_key_types:
frappe.throw(
_(
- "Row #{}: {} of {} should be {}. Please modify the account or select a different account."
+ "Row #{0}: {1} of {2} should be {3}. Please update the {1} or select a different account."
).format(
d.idx,
frappe.unscrub(key_to_match),
frappe.bold(selected_account),
- frappe.bold(expected_key_types),
+ frappe.bold(" or ".join(expected_key_types)),
),
title=_("Invalid Account"),
)
diff --git a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json
index be35914251..73838163d3 100644
--- a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json
+++ b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json
@@ -9,6 +9,7 @@
"field_order": [
"asset",
"naming_series",
+ "company",
"column_break_2",
"gross_purchase_amount",
"opening_accumulated_depreciation",
@@ -193,12 +194,20 @@
"fieldtype": "Check",
"label": "Depreciate based on shifts",
"read_only": 1
+ },
+ {
+ "fetch_from": "asset.company",
+ "fieldname": "company",
+ "fieldtype": "Link",
+ "label": "Company",
+ "options": "Company",
+ "read_only": 1
}
],
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2023-11-29 00:57:00.461998",
+ "modified": "2024-01-08 16:31:04.533928",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Depreciation Schedule",
diff --git a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py
index 67234ccd84..4c94be5320 100644
--- a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py
+++ b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py
@@ -35,6 +35,7 @@ class AssetDepreciationSchedule(Document):
amended_from: DF.Link | None
asset: DF.Link
+ company: DF.Link | None
daily_prorata_based: DF.Check
depreciation_method: DF.Literal[
"", "Straight Line", "Double Declining Balance", "Written Down Value", "Manual"
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.py b/erpnext/assets/doctype/asset_repair/asset_repair.py
index c0fb3c2923..bb627d408c 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.py
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.py
@@ -93,6 +93,10 @@ class AssetRepair(AccountsController):
self.increase_asset_value()
+ if self.capitalize_repair_cost:
+ self.asset_doc.total_asset_cost += self.repair_cost
+ self.asset_doc.additional_asset_cost += self.repair_cost
+
if self.get("stock_consumption"):
self.check_for_stock_items_and_warehouse()
self.decrease_stock_quantity()
@@ -128,6 +132,10 @@ class AssetRepair(AccountsController):
self.decrease_asset_value()
+ if self.capitalize_repair_cost:
+ self.asset_doc.total_asset_cost -= self.repair_cost
+ self.asset_doc.additional_asset_cost -= self.repair_cost
+
if self.get("stock_consumption"):
self.increase_stock_quantity()
if self.get("capitalize_repair_cost"):
@@ -277,7 +285,9 @@ class AssetRepair(AccountsController):
"account": fixed_asset_account,
"debit": self.repair_cost,
"debit_in_account_currency": self.repair_cost,
+ "against_type": "Account",
"against": pi_expense_account,
+ "against_link": pi_expense_account,
"voucher_type": self.doctype,
"voucher_no": self.name,
"cost_center": self.cost_center,
@@ -296,7 +306,9 @@ class AssetRepair(AccountsController):
"account": pi_expense_account,
"credit": self.repair_cost,
"credit_in_account_currency": self.repair_cost,
+ "against_type": "Account",
"against": fixed_asset_account,
+ "against_link": fixed_asset_account,
"voucher_type": self.doctype,
"voucher_no": self.name,
"cost_center": self.cost_center,
@@ -330,7 +342,9 @@ class AssetRepair(AccountsController):
"account": item.expense_account or default_expense_account,
"credit": item.amount,
"credit_in_account_currency": item.amount,
+ "against_type": "Account",
"against": fixed_asset_account,
+ "against_link": fixed_asset_account,
"voucher_type": self.doctype,
"voucher_no": self.name,
"cost_center": self.cost_center,
@@ -347,7 +361,9 @@ class AssetRepair(AccountsController):
"account": fixed_asset_account,
"debit": item.amount,
"debit_in_account_currency": item.amount,
+ "against_type": "Account",
"against": item.expense_account or default_expense_account,
+ "against_link": item.expense_account or default_expense_account,
"voucher_type": self.doctype,
"voucher_no": self.name,
"cost_center": self.cost_center,
diff --git a/erpnext/buying/doctype/buying_settings/buying_settings.json b/erpnext/buying/doctype/buying_settings/buying_settings.json
index 3f8559e63f..b05de7d0b2 100644
--- a/erpnext/buying/doctype/buying_settings/buying_settings.json
+++ b/erpnext/buying/doctype/buying_settings/buying_settings.json
@@ -214,7 +214,7 @@
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
- "modified": "2023-11-28 13:01:18.403492",
+ "modified": "2024-01-05 15:26:02.320942",
"modified_by": "Administrator",
"module": "Buying",
"name": "Buying Settings",
@@ -238,6 +238,41 @@
"role": "Purchase Manager",
"share": 1,
"write": 1
+ },
+ {
+ "email": 1,
+ "print": 1,
+ "read": 1,
+ "role": "Accounts User",
+ "share": 1
+ },
+ {
+ "email": 1,
+ "print": 1,
+ "read": 1,
+ "role": "Accounts Manager",
+ "share": 1
+ },
+ {
+ "email": 1,
+ "print": 1,
+ "read": 1,
+ "role": "Stock Manager",
+ "share": 1
+ },
+ {
+ "email": 1,
+ "print": 1,
+ "read": 1,
+ "role": "Stock User",
+ "share": 1
+ },
+ {
+ "email": 1,
+ "print": 1,
+ "read": 1,
+ "role": "Purchase User",
+ "share": 1
}
],
"sort_field": "modified",
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js
index 88faeee982..3b671bb239 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.js
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.js
@@ -214,7 +214,7 @@ frappe.ui.form.on("Purchase Order Item", {
}
},
- fg_item_qty: async function(frm, cdt, cdn) {
+ qty: async function (frm, cdt, cdn) {
if (frm.doc.is_subcontracted && !frm.doc.is_old_subcontracting_flow) {
var row = locals[cdt][cdn];
@@ -222,7 +222,7 @@ frappe.ui.form.on("Purchase Order Item", {
var result = await frm.events.get_subcontracting_boms_for_finished_goods(row.fg_item)
if (result.message && row.item_code == result.message.service_item && row.uom == result.message.service_item_uom) {
- frappe.model.set_value(cdt, cdn, "qty", flt(row.fg_item_qty) * flt(result.message.conversion_factor));
+ frappe.model.set_value(cdt, cdn, "fg_item_qty", flt(row.qty) / flt(result.message.conversion_factor));
}
}
}
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index 2efb46e9d3..b830e7d204 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -452,6 +452,7 @@ class PurchaseOrder(BuyingController):
self.update_requested_qty()
self.update_ordered_qty()
self.update_reserved_qty_for_subcontract()
+ self.update_subcontracting_order_status()
self.notify_update()
clear_doctype_notifications(self)
@@ -627,6 +628,17 @@ class PurchaseOrder(BuyingController):
if frappe.db.get_single_value("Buying Settings", "auto_create_subcontracting_order"):
make_subcontracting_order(self.name, save=True, notify=True)
+ def update_subcontracting_order_status(self):
+ from erpnext.subcontracting.doctype.subcontracting_order.subcontracting_order import (
+ update_subcontracting_order_status as update_sco_status,
+ )
+
+ if self.is_subcontracted and not self.is_old_subcontracting_flow:
+ sco = frappe.db.get_value("Subcontracting Order", {"purchase_order": self.name, "docstatus": 1})
+
+ if sco:
+ update_sco_status(sco, "Closed" if self.status == "Closed" else None)
+
def item_last_purchase_rate(name, conversion_rate, item_code, conversion_factor=1.0):
"""get last purchase rate for an item"""
diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py
index f80a00a95f..9b382bbd7e 100644
--- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py
@@ -29,6 +29,8 @@ from erpnext.stock.doctype.purchase_receipt.purchase_receipt import (
class TestPurchaseOrder(FrappeTestCase):
def test_purchase_order_qty(self):
po = create_purchase_order(qty=1, do_not_save=True)
+
+ # NonNegativeError with qty=-1
po.append(
"items",
{
@@ -39,9 +41,15 @@ class TestPurchaseOrder(FrappeTestCase):
)
self.assertRaises(frappe.NonNegativeError, po.save)
+ # InvalidQtyError with qty=0
po.items[1].qty = 0
self.assertRaises(InvalidQtyError, po.save)
+ # No error with qty=1
+ po.items[1].qty = 1
+ po.save()
+ self.assertEqual(po.items[1].qty, 1)
+
def test_make_purchase_receipt(self):
po = create_purchase_order(do_not_submit=True)
self.assertRaises(frappe.ValidationError, make_purchase_receipt, po.name)
@@ -1108,7 +1116,7 @@ def create_purchase_order(**args):
"item_code": args.item or args.item_code or "_Test Item",
"warehouse": args.warehouse or "_Test Warehouse - _TC",
"from_warehouse": args.from_warehouse,
- "qty": args.qty or 10,
+ "qty": args.qty if args.qty is not None else 10,
"rate": args.rate or 500,
"schedule_date": add_days(nowdate(), 1),
"include_exploded_items": args.get("include_exploded_items", 1),
diff --git a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
index 98c1b388c1..5a24cc2e92 100644
--- a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
+++ b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
@@ -123,8 +123,7 @@
"oldfieldname": "item_code",
"oldfieldtype": "Link",
"options": "Item",
- "reqd": 1,
- "search_index": 1
+ "reqd": 1
},
{
"fieldname": "supplier_part_no",
diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py
index 5b8be44296..eec996c6a9 100644
--- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py
+++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py
@@ -65,6 +65,7 @@ class RequestforQuotation(BuyingController):
def validate(self):
self.validate_duplicate_supplier()
self.validate_supplier_list()
+ super(RequestforQuotation, self).validate_qty_is_not_zero()
validate_for_items(self)
super(RequestforQuotation, self).set_qty_as_per_stock_uom()
self.update_email_id()
@@ -357,8 +358,8 @@ def make_supplier_quotation_from_rfq(source_name, target_doc=None, for_supplier=
target_doc.currency = args.currency or get_party_account_currency(
"Supplier", for_supplier, source.company
)
- target_doc.buying_price_list = args.buying_price_list or frappe.db.get_value(
- "Buying Settings", None, "buying_price_list"
+ target_doc.buying_price_list = args.buying_price_list or frappe.db.get_single_value(
+ "Buying Settings", "buying_price_list"
)
set_missing_values(source, target_doc)
@@ -398,7 +399,7 @@ def create_supplier_quotation(doc):
"currency": doc.get("currency")
or get_party_account_currency("Supplier", doc.get("supplier"), doc.get("company")),
"buying_price_list": doc.get("buying_price_list")
- or frappe.db.get_value("Buying Settings", None, "buying_price_list"),
+ or frappe.db.get_single_value("Buying Settings", "buying_price_list"),
}
)
add_items(sq_doc, doc.get("supplier"), doc.get("items"))
diff --git a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py
index 42fa1d923e..05a604f0cc 100644
--- a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py
+++ b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py
@@ -14,6 +14,7 @@ from erpnext.buying.doctype.request_for_quotation.request_for_quotation import (
get_pdf,
make_supplier_quotation_from_rfq,
)
+from erpnext.controllers.accounts_controller import InvalidQtyError
from erpnext.crm.doctype.opportunity.opportunity import make_request_for_quotation as make_rfq
from erpnext.crm.doctype.opportunity.test_opportunity import make_opportunity
from erpnext.stock.doctype.item.test_item import make_item
@@ -21,6 +22,16 @@ from erpnext.templates.pages.rfq import check_supplier_has_docname_access
class TestRequestforQuotation(FrappeTestCase):
+ def test_rfq_qty(self):
+ rfq = make_request_for_quotation(qty=0, do_not_save=True)
+ with self.assertRaises(InvalidQtyError):
+ rfq.save()
+
+ # No error with qty=1
+ rfq.items[0].qty = 1
+ rfq.save()
+ self.assertEqual(rfq.items[0].qty, 1)
+
def test_quote_status(self):
rfq = make_request_for_quotation()
@@ -161,14 +172,17 @@ def make_request_for_quotation(**args) -> "RequestforQuotation":
"description": "_Test Item",
"uom": args.uom or "_Test UOM",
"stock_uom": args.stock_uom or "_Test UOM",
- "qty": args.qty or 5,
+ "qty": args.qty if args.qty is not None else 5,
"conversion_factor": args.conversion_factor or 1.0,
"warehouse": args.warehouse or "_Test Warehouse - _TC",
"schedule_date": nowdate(),
},
)
- rfq.submit()
+ if not args.do_not_save:
+ rfq.insert()
+ if not args.do_not_submit:
+ rfq.submit()
return rfq
diff --git a/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py b/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py
index 13c851c735..33465700f4 100644
--- a/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py
+++ b/erpnext/buying/doctype/supplier_quotation/test_supplier_quotation.py
@@ -5,8 +5,21 @@
import frappe
from frappe.tests.utils import FrappeTestCase
+from erpnext.controllers.accounts_controller import InvalidQtyError
+
class TestPurchaseOrder(FrappeTestCase):
+ def test_supplier_quotation_qty(self):
+ sq = frappe.copy_doc(test_records[0])
+ sq.items[0].qty = 0
+ with self.assertRaises(InvalidQtyError):
+ sq.save()
+
+ # No error with qty=1
+ sq.items[0].qty = 1
+ sq.save()
+ self.assertEqual(sq.items[0].qty, 1)
+
def test_make_purchase_order(self):
from erpnext.buying.doctype.supplier_quotation.supplier_quotation import make_purchase_order
diff --git a/erpnext/buying/utils.py b/erpnext/buying/utils.py
index e904af0dce..61e5e6a1c7 100644
--- a/erpnext/buying/utils.py
+++ b/erpnext/buying/utils.py
@@ -44,11 +44,6 @@ def update_last_purchase_rate(doc, is_submit) -> None:
def validate_for_items(doc) -> None:
items = []
for d in doc.get("items"):
- if not d.qty:
- if doc.doctype == "Purchase Receipt" and d.rejected_qty:
- continue
- frappe.throw(_("Please enter quantity for Item {0}").format(d.item_code))
-
set_stock_levels(row=d) # update with latest quantities
item = validate_item_and_get_basic_data(row=d)
validate_stock_item_warehouse(row=d, item=item)
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index e8b62af883..b01abcb1ae 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -129,6 +129,17 @@ class AccountsController(TransactionBase):
if self.doctype in relevant_docs:
self.set_payment_schedule()
+ def remove_bundle_for_non_stock_invoices(self):
+ has_sabb = False
+ if self.doctype in ("Sales Invoice", "Purchase Invoice") and not self.update_stock:
+ for item in self.get("items"):
+ if item.serial_and_batch_bundle:
+ item.serial_and_batch_bundle = None
+ has_sabb = True
+
+ if has_sabb:
+ self.remove_serial_and_batch_bundle()
+
def ensure_supplier_is_not_blocked(self):
is_supplier_payment = self.doctype == "Payment Entry" and self.party_type == "Supplier"
is_buying_invoice = self.doctype in ["Purchase Invoice", "Purchase Order"]
@@ -156,6 +167,9 @@ class AccountsController(TransactionBase):
if self.get("_action") and self._action != "update_after_submit":
self.set_missing_values(for_validate=True)
+ if self.get("_action") == "submit":
+ self.remove_bundle_for_non_stock_invoices()
+
self.ensure_supplier_is_not_blocked()
self.validate_date_with_fiscal_year()
@@ -225,6 +239,11 @@ class AccountsController(TransactionBase):
apply_pricing_rule_on_transaction(self)
self.set_total_in_words()
+ self.set_default_letter_head()
+
+ def set_default_letter_head(self):
+ if hasattr(self, "letter_head") and not self.letter_head:
+ self.letter_head = frappe.db.get_value("Company", self.company, "default_letter_head")
def init_internal_values(self):
# init all the internal values as 0 on sa
@@ -556,18 +575,12 @@ class AccountsController(TransactionBase):
validate_due_date(
self.posting_date,
self.due_date,
- "Customer",
- self.customer,
- self.company,
self.payment_terms_template,
)
elif self.doctype == "Purchase Invoice":
validate_due_date(
self.bill_date or self.posting_date,
self.due_date,
- "Supplier",
- self.supplier,
- self.company,
self.bill_date,
self.payment_terms_template,
)
@@ -874,6 +887,7 @@ class AccountsController(TransactionBase):
"project": self.get("project"),
"post_net_value": args.get("post_net_value"),
"voucher_detail_no": args.get("voucher_detail_no"),
+ "voucher_subtype": self.get_voucher_subtype(),
}
)
@@ -916,7 +930,7 @@ class AccountsController(TransactionBase):
# Update details in transaction currency
gl_dict.update(
{
- "transaction_currency": self.get("currency") or self.company_currency,
+ "transaction_currency": args.get("currency") or self.get("currency") or self.company_currency,
"transaction_exchange_rate": self.get("conversion_rate", 1),
"debit_in_transaction_currency": self.get_value_in_transaction_currency(
account_currency, args, "debit"
@@ -927,22 +941,49 @@ class AccountsController(TransactionBase):
}
)
+ if not args.get("against_voucher_type") and self.get("against_voucher_type"):
+ gl_dict.update({"against_voucher_type": self.get("against_voucher_type")})
+
+ if not args.get("against_voucher") and self.get("against_voucher"):
+ gl_dict.update({"against_voucher": self.get("against_voucher")})
+
return gl_dict
+ def get_voucher_subtype(self):
+ voucher_subtypes = {
+ "Journal Entry": "voucher_type",
+ "Payment Entry": "payment_type",
+ "Stock Entry": "stock_entry_type",
+ "Asset Capitalization": "entry_type",
+ }
+ if self.doctype in voucher_subtypes:
+ return self.get(voucher_subtypes[self.doctype])
+ elif self.doctype == "Purchase Receipt" and self.is_return:
+ return "Purchase Return"
+ elif self.doctype == "Delivery Note" and self.is_return:
+ return "Sales Return"
+ elif (self.doctype == "Sales Invoice" and self.is_return) or self.doctype == "Purchase Invoice":
+ return "Credit Note"
+ elif (self.doctype == "Purchase Invoice" and self.is_return) or self.doctype == "Sales Invoice":
+ return "Debit Note"
+ return self.doctype
+
def get_value_in_transaction_currency(self, account_currency, args, field):
- if account_currency == self.get("currency"):
+ if account_currency == args.get("currency") or self.get("currency"):
return args.get(field + "_in_account_currency")
else:
- return flt(args.get(field, 0) / self.get("conversion_rate", 1))
+ return flt(args.get(field, 0) / (args.get("conversion_rate") or self.get("conversion_rate", 1)))
def validate_qty_is_not_zero(self):
- if self.doctype == "Purchase Receipt":
- return
-
for item in self.items:
+ if self.doctype == "Purchase Receipt" and item.rejected_qty:
+ continue
+
if not flt(item.qty):
frappe.throw(
- msg=_("Row #{0}: Item quantity cannot be zero").format(item.idx),
+ msg=_("Row #{0}: Quantity for Item {1} cannot be zero.").format(
+ item.idx, frappe.bold(item.item_code)
+ ),
title=_("Invalid Quantity"),
exc=InvalidQtyError,
)
@@ -1120,6 +1161,7 @@ class AccountsController(TransactionBase):
)
credit_or_debit = "credit" if self.doctype == "Purchase Invoice" else "debit"
+ against_type = "Supplier" if self.doctype == "Purchase Invoice" else "Customer"
against = self.supplier if self.doctype == "Purchase Invoice" else self.customer
if precision_loss:
@@ -1127,7 +1169,9 @@ class AccountsController(TransactionBase):
self.get_gl_dict(
{
"account": round_off_account,
+ "against_type": against_type,
"against": against,
+ "against_link": against,
credit_or_debit: precision_loss,
"cost_center": round_off_cost_center
if self.use_company_roundoff_cost_center
@@ -1481,11 +1525,13 @@ class AccountsController(TransactionBase):
if self.doctype == "Purchase Invoice":
dr_or_cr = "credit"
rev_dr_cr = "debit"
+ against_type = "Supplier"
supplier_or_customer = self.supplier
else:
dr_or_cr = "debit"
rev_dr_cr = "credit"
+ against_type = "Customer"
supplier_or_customer = self.customer
if enable_discount_accounting:
@@ -1510,7 +1556,9 @@ class AccountsController(TransactionBase):
self.get_gl_dict(
{
"account": item.discount_account,
+ "against_type": against_type,
"against": supplier_or_customer,
+ "against_link": supplier_or_customer,
dr_or_cr: flt(
discount_amount * self.get("conversion_rate"), item.precision("discount_amount")
),
@@ -1528,7 +1576,9 @@ class AccountsController(TransactionBase):
self.get_gl_dict(
{
"account": income_or_expense_account,
+ "against_type": against_type,
"against": supplier_or_customer,
+ "against_link": supplier_or_customer,
rev_dr_cr: flt(
discount_amount * self.get("conversion_rate"), item.precision("discount_amount")
),
@@ -1551,7 +1601,9 @@ class AccountsController(TransactionBase):
self.get_gl_dict(
{
"account": self.additional_discount_account,
+ "against_type": against_type,
"against": supplier_or_customer,
+ "against_link": supplier_or_customer,
dr_or_cr: self.base_discount_amount,
"cost_center": self.cost_center or erpnext.get_default_cost_center(self.company),
},
@@ -2400,6 +2452,7 @@ def validate_taxes_and_charges(tax):
def validate_account_head(idx, account, company, context=""):
account_company = frappe.get_cached_value("Account", account, "company")
+ is_group = frappe.get_cached_value("Account", account, "is_group")
if account_company != company:
frappe.throw(
@@ -2409,6 +2462,12 @@ def validate_account_head(idx, account, company, context=""):
title=_("Invalid Account"),
)
+ if is_group:
+ frappe.throw(
+ _("Row {0}: Account {1} is a Group Account").format(idx, frappe.bold(account)),
+ title=_("Invalid Account"),
+ )
+
def validate_cost_center(tax, doc):
if not tax.cost_center:
@@ -3045,7 +3104,7 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil
def validate_quantity(child_item, new_data):
if not flt(new_data.get("qty")):
frappe.throw(
- _("Row # {0}: Quantity for Item {1} cannot be zero").format(
+ _("Row #{0}: Quantity for Item {1} cannot be zero.").format(
new_data.get("idx"), frappe.bold(new_data.get("item_code"))
),
title=_("Invalid Qty"),
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index 3d863e9b87..572fa519e1 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -381,7 +381,11 @@ class BuyingController(SubcontractingController):
rate = flt(outgoing_rate * (d.conversion_factor or 1), d.precision("rate"))
else:
- field = "incoming_rate" if self.get("is_internal_supplier") else "rate"
+ field = (
+ "incoming_rate"
+ if self.get("is_internal_supplier") and not self.doctype == "Purchase Order"
+ else "rate"
+ )
rate = flt(
frappe.db.get_value(ref_doctype, d.get(frappe.scrub(ref_doctype)), field)
* (d.conversion_factor or 1),
diff --git a/erpnext/controllers/item_variant.py b/erpnext/controllers/item_variant.py
index c8785a5a72..ea7fb23cb6 100644
--- a/erpnext/controllers/item_variant.py
+++ b/erpnext/controllers/item_variant.py
@@ -56,10 +56,24 @@ def make_variant_based_on_manufacturer(template, manufacturer, manufacturer_part
copy_attributes_to_variant(template, variant)
- variant.manufacturer = manufacturer
- variant.manufacturer_part_no = manufacturer_part_no
-
variant.item_code = append_number_if_name_exists("Item", template.name)
+ variant.flags.ignore_mandatory = True
+ variant.save()
+
+ if not frappe.db.exists(
+ "Item Manufacturer", {"item_code": variant.name, "manufacturer": manufacturer}
+ ):
+ manufacturer_doc = frappe.new_doc("Item Manufacturer")
+ manufacturer_doc.update(
+ {
+ "item_code": variant.name,
+ "manufacturer": manufacturer,
+ "manufacturer_part_no": manufacturer_part_no,
+ }
+ )
+
+ manufacturer_doc.flags.ignore_mandatory = True
+ manufacturer_doc.save(ignore_permissions=True)
return variant
diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py
index 63dca630c7..2650753275 100644
--- a/erpnext/controllers/queries.py
+++ b/erpnext/controllers/queries.py
@@ -896,3 +896,31 @@ def get_payment_terms_for_references(doctype, txt, searchfield, start, page_len,
as_list=1,
)
return terms
+
+
+@frappe.whitelist()
+@frappe.validate_and_sanitize_search_inputs
+def get_filtered_child_rows(doctype, txt, searchfield, start, page_len, filters) -> list:
+ table = frappe.qb.DocType(doctype)
+ query = (
+ frappe.qb.from_(table)
+ .select(
+ table.name,
+ Concat("#", table.idx, ", ", table.item_code),
+ )
+ .orderby(table.idx)
+ .offset(start)
+ .limit(page_len)
+ )
+
+ if filters:
+ for field, value in filters.items():
+ query = query.where(table[field] == value)
+
+ if txt:
+ txt += "%"
+ query = query.where(
+ ((table.idx.like(txt.replace("#", ""))) | (table.item_code.like(txt))) | (table.name.like(txt))
+ )
+
+ return query.run(as_dict=False)
diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py
index 81e71e3aa2..6e50279d04 100644
--- a/erpnext/controllers/sales_and_purchase_return.py
+++ b/erpnext/controllers/sales_and_purchase_return.py
@@ -8,7 +8,9 @@ from frappe.model.meta import get_field_precision
from frappe.utils import flt, format_datetime, get_datetime
import erpnext
-from erpnext.stock.utils import get_incoming_rate
+from erpnext.stock.serial_batch_bundle import get_batches_from_bundle
+from erpnext.stock.serial_batch_bundle import get_serial_nos as get_serial_nos_from_bundle
+from erpnext.stock.utils import get_incoming_rate, get_valuation_method
class StockOverReturnError(frappe.ValidationError):
@@ -69,8 +71,6 @@ def validate_return_against(doc):
def validate_returned_items(doc):
- from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
-
valid_items = frappe._dict()
select_fields = "item_code, qty, stock_qty, rate, parenttype, conversion_factor"
@@ -116,33 +116,18 @@ def validate_returned_items(doc):
ref = valid_items.get(d.item_code, frappe._dict())
validate_quantity(doc, d, ref, valid_items, already_returned_items)
- if ref.rate and doc.doctype in ("Delivery Note", "Sales Invoice") and flt(d.rate) > ref.rate:
+ if (
+ ref.rate
+ and flt(d.rate) > ref.rate
+ and doc.doctype in ("Delivery Note", "Sales Invoice")
+ and get_valuation_method(ref.item_code) != "Moving Average"
+ ):
frappe.throw(
_("Row # {0}: Rate cannot be greater than the rate used in {1} {2}").format(
d.idx, doc.doctype, doc.return_against
)
)
- elif ref.batch_no and d.batch_no not in ref.batch_no:
- frappe.throw(
- _("Row # {0}: Batch No must be same as {1} {2}").format(
- d.idx, doc.doctype, doc.return_against
- )
- )
-
- elif ref.serial_no:
- if d.qty and not d.serial_no:
- frappe.throw(_("Row # {0}: Serial No is mandatory").format(d.idx))
- else:
- serial_nos = get_serial_nos(d.serial_no)
- for s in serial_nos:
- if s not in ref.serial_no:
- frappe.throw(
- _("Row # {0}: Serial No {1} does not match with {2} {3}").format(
- d.idx, s, doc.doctype, doc.return_against
- )
- )
-
if (
warehouse_mandatory
and not d.get("warehouse")
@@ -397,71 +382,92 @@ def make_return_doc(
else:
doc.run_method("calculate_taxes_and_totals")
- def update_item(source_doc, target_doc, source_parent):
+ def update_serial_batch_no(source_doc, target_doc, source_parent, item_details, qty_field):
+ from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
from erpnext.stock.serial_batch_bundle import SerialBatchCreation
- target_doc.qty = -1 * source_doc.qty
- item_details = frappe.get_cached_value(
- "Item", source_doc.item_code, ["has_batch_no", "has_serial_no"], as_dict=1
- )
-
returned_serial_nos = []
- if source_doc.get("serial_and_batch_bundle"):
- if item_details.has_serial_no:
- returned_serial_nos = get_returned_serial_nos(source_doc, source_parent)
+ returned_batches = frappe._dict()
+ serial_and_batch_field = (
+ "serial_and_batch_bundle" if qty_field == "stock_qty" else "rejected_serial_and_batch_bundle"
+ )
+ old_serial_no_field = "serial_no" if qty_field == "stock_qty" else "rejected_serial_no"
+ old_batch_no_field = "batch_no"
- type_of_transaction = "Inward"
- if (
- frappe.db.get_value(
- "Serial and Batch Bundle", source_doc.serial_and_batch_bundle, "type_of_transaction"
- )
- == "Inward"
- ):
- type_of_transaction = "Outward"
-
- cls_obj = SerialBatchCreation(
- {
- "type_of_transaction": type_of_transaction,
- "serial_and_batch_bundle": source_doc.serial_and_batch_bundle,
- "returned_against": source_doc.name,
- "item_code": source_doc.item_code,
- "returned_serial_nos": returned_serial_nos,
- }
- )
-
- cls_obj.duplicate_package()
- if cls_obj.serial_and_batch_bundle:
- target_doc.serial_and_batch_bundle = cls_obj.serial_and_batch_bundle
-
- if source_doc.get("rejected_serial_and_batch_bundle"):
+ if (
+ source_doc.get(serial_and_batch_field)
+ or source_doc.get(old_serial_no_field)
+ or source_doc.get(old_batch_no_field)
+ ):
if item_details.has_serial_no:
returned_serial_nos = get_returned_serial_nos(
- source_doc, source_parent, serial_no_field="rejected_serial_and_batch_bundle"
+ source_doc, source_parent, serial_no_field=serial_and_batch_field
+ )
+ else:
+ returned_batches = get_returned_batches(
+ source_doc, source_parent, batch_no_field=serial_and_batch_field
)
type_of_transaction = "Inward"
- if (
+ if source_doc.get(serial_and_batch_field) and (
frappe.db.get_value(
- "Serial and Batch Bundle", source_doc.rejected_serial_and_batch_bundle, "type_of_transaction"
+ "Serial and Batch Bundle", source_doc.get(serial_and_batch_field), "type_of_transaction"
)
== "Inward"
):
type_of_transaction = "Outward"
+ elif source_parent.doctype in [
+ "Purchase Invoice",
+ "Purchase Receipt",
+ "Subcontracting Receipt",
+ ]:
+ type_of_transaction = "Outward"
cls_obj = SerialBatchCreation(
{
"type_of_transaction": type_of_transaction,
- "serial_and_batch_bundle": source_doc.rejected_serial_and_batch_bundle,
+ "serial_and_batch_bundle": source_doc.get(serial_and_batch_field),
"returned_against": source_doc.name,
"item_code": source_doc.item_code,
"returned_serial_nos": returned_serial_nos,
+ "voucher_type": source_parent.doctype,
+ "do_not_submit": True,
+ "warehouse": source_doc.warehouse,
+ "has_serial_no": item_details.has_serial_no,
+ "has_batch_no": item_details.has_batch_no,
}
)
- cls_obj.duplicate_package()
- if cls_obj.serial_and_batch_bundle:
- target_doc.serial_and_batch_bundle = cls_obj.serial_and_batch_bundle
+ serial_nos = []
+ batches = frappe._dict()
+ if source_doc.get(old_batch_no_field):
+ batches = frappe._dict({source_doc.batch_no: source_doc.get(qty_field)})
+ elif source_doc.get(old_serial_no_field):
+ serial_nos = get_serial_nos(source_doc.get(old_serial_no_field))
+ elif source_doc.get(serial_and_batch_field):
+ if item_details.has_serial_no:
+ serial_nos = get_serial_nos_from_bundle(source_doc.get(serial_and_batch_field))
+ else:
+ batches = get_batches_from_bundle(source_doc.get(serial_and_batch_field))
+ if serial_nos:
+ cls_obj.serial_nos = sorted(list(set(serial_nos) - set(returned_serial_nos)))
+ elif batches:
+ for batch in batches:
+ if batch in returned_batches:
+ batches[batch] -= flt(returned_batches.get(batch))
+
+ cls_obj.batches = batches
+
+ if source_doc.get(serial_and_batch_field):
+ cls_obj.duplicate_package()
+ if cls_obj.serial_and_batch_bundle:
+ target_doc.set(serial_and_batch_field, cls_obj.serial_and_batch_bundle)
+ else:
+ target_doc.set(serial_and_batch_field, cls_obj.make_serial_and_batch_bundle().name)
+
+ def update_item(source_doc, target_doc, source_parent):
+ target_doc.qty = -1 * source_doc.qty
if doctype in ["Purchase Receipt", "Subcontracting Receipt"]:
returned_qty_map = get_returned_qty_map_for_row(
source_parent.name, source_parent.supplier, source_doc.name, doctype
@@ -561,6 +567,18 @@ def make_return_doc(
if default_warehouse_for_sales_return:
target_doc.warehouse = default_warehouse_for_sales_return
+ if source_doc.item_code:
+ item_details = frappe.get_cached_value(
+ "Item", source_doc.item_code, ["has_batch_no", "has_serial_no"], as_dict=1
+ )
+
+ if not item_details.has_batch_no and not item_details.has_serial_no:
+ return
+
+ for qty_field in ["stock_qty", "rejected_qty"]:
+ if target_doc.get(qty_field):
+ update_serial_batch_no(source_doc, target_doc, source_parent, item_details, qty_field)
+
def update_terms(source_doc, target_doc, source_parent):
target_doc.payment_amount = -source_doc.payment_amount
@@ -716,6 +734,9 @@ def get_returned_serial_nos(
[parent_doc.doctype, "docstatus", "=", 1],
]
+ if serial_no_field == "rejected_serial_and_batch_bundle":
+ filters.append([child_doc.doctype, "rejected_qty", ">", 0])
+
# Required for POS Invoice
if ignore_voucher_detail_no:
filters.append([child_doc.doctype, "name", "!=", ignore_voucher_detail_no])
@@ -723,9 +744,57 @@ def get_returned_serial_nos(
ids = []
for row in frappe.get_all(parent_doc.doctype, fields=fields, filters=filters):
ids.append(row.get("serial_and_batch_bundle"))
- if row.get(old_field):
+ if row.get(old_field) and not row.get(serial_no_field):
serial_nos.extend(get_serial_nos_from_serial_no(row.get(old_field)))
- serial_nos.extend(get_serial_nos(ids))
+ if ids:
+ serial_nos.extend(get_serial_nos(ids))
return serial_nos
+
+
+def get_returned_batches(
+ child_doc, parent_doc, batch_no_field=None, ignore_voucher_detail_no=None
+):
+ from erpnext.stock.serial_batch_bundle import get_batches_from_bundle
+
+ batches = frappe._dict()
+
+ old_field = "batch_no"
+ if not batch_no_field:
+ batch_no_field = "serial_and_batch_bundle"
+
+ return_ref_field = frappe.scrub(child_doc.doctype)
+ if child_doc.doctype == "Delivery Note Item":
+ return_ref_field = "dn_detail"
+
+ fields = [
+ f"`{'tab' + child_doc.doctype}`.`{batch_no_field}`",
+ f"`{'tab' + child_doc.doctype}`.`batch_no`",
+ f"`{'tab' + child_doc.doctype}`.`stock_qty`",
+ ]
+
+ filters = [
+ [parent_doc.doctype, "return_against", "=", parent_doc.name],
+ [parent_doc.doctype, "is_return", "=", 1],
+ [child_doc.doctype, return_ref_field, "=", child_doc.name],
+ [parent_doc.doctype, "docstatus", "=", 1],
+ ]
+
+ if batch_no_field == "rejected_serial_and_batch_bundle":
+ filters.append([child_doc.doctype, "rejected_qty", ">", 0])
+
+ # Required for POS Invoice
+ if ignore_voucher_detail_no:
+ filters.append([child_doc.doctype, "name", "!=", ignore_voucher_detail_no])
+
+ ids = []
+ for row in frappe.get_all(parent_doc.doctype, fields=fields, filters=filters):
+ ids.append(row.get("serial_and_batch_bundle"))
+ if row.get(old_field) and not row.get(batch_no_field):
+ batches.setdefault(row.get(old_field), row.get("stock_qty"))
+
+ if ids:
+ batches.update(get_batches_from_bundle(ids))
+
+ return batches
diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py
index fdadb30e93..8c438420ad 100644
--- a/erpnext/controllers/selling_controller.py
+++ b/erpnext/controllers/selling_controller.py
@@ -12,7 +12,7 @@ from erpnext.controllers.sales_and_purchase_return import get_rate_for_return
from erpnext.controllers.stock_controller import StockController
from erpnext.stock.doctype.item.item import set_item_default
from erpnext.stock.get_item_details import get_bin_details, get_conversion_factor
-from erpnext.stock.utils import get_incoming_rate
+from erpnext.stock.utils import get_incoming_rate, get_valuation_method
class SellingController(StockController):
@@ -295,9 +295,6 @@ class SellingController(StockController):
def get_item_list(self):
il = []
for d in self.get("items"):
- if d.qty is None:
- frappe.throw(_("Row {0}: Qty is mandatory").format(d.idx))
-
if self.has_product_bundle(d.item_code):
for p in self.get("packed_items"):
if p.parent_detail_docname == d.name and p.parent_item == d.item_code:
@@ -308,6 +305,8 @@ class SellingController(StockController):
"warehouse": p.warehouse or d.warehouse,
"item_code": p.item_code,
"qty": flt(p.qty),
+ "serial_no": p.serial_no if self.docstatus == 2 else None,
+ "batch_no": p.batch_no if self.docstatus == 2 else None,
"uom": p.uom,
"serial_and_batch_bundle": p.serial_and_batch_bundle
or get_serial_and_batch_bundle(p, self),
@@ -330,6 +329,8 @@ class SellingController(StockController):
"warehouse": d.warehouse,
"item_code": d.item_code,
"qty": d.stock_qty,
+ "serial_no": d.serial_no if self.docstatus == 2 else None,
+ "batch_no": d.batch_no if self.docstatus == 2 else None,
"uom": d.uom,
"stock_uom": d.stock_uom,
"conversion_factor": d.conversion_factor,
@@ -428,11 +429,18 @@ class SellingController(StockController):
items = self.get("items") + (self.get("packed_items") or [])
for d in items:
- if not self.get("return_against"):
+ if not frappe.get_cached_value("Item", d.item_code, "is_stock_item"):
+ continue
+
+ if not self.get("return_against") or (
+ get_valuation_method(d.item_code) == "Moving Average" and self.get("is_return")
+ ):
# Get incoming rate based on original item cost based on valuation method
qty = flt(d.get("stock_qty") or d.get("actual_qty"))
- if not (self.get("is_return") and d.incoming_rate):
+ if not d.incoming_rate or (
+ get_valuation_method(d.item_code) == "Moving Average" and self.get("is_return")
+ ):
d.incoming_rate = get_incoming_rate(
{
"item_code": d.item_code,
diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py
index d09001c8fc..297f8c26be 100644
--- a/erpnext/controllers/status_updater.py
+++ b/erpnext/controllers/status_updater.py
@@ -131,11 +131,6 @@ status_map = {
"eval:self.status != 'Stopped' and self.per_ordered == 100 and self.docstatus == 1 and self.material_request_type == 'Manufacture'",
],
],
- "Bank Transaction": [
- ["Unreconciled", "eval:self.docstatus == 1 and self.unallocated_amount>0"],
- ["Reconciled", "eval:self.docstatus == 1 and self.unallocated_amount<=0"],
- ["Cancelled", "eval:self.docstatus == 2"],
- ],
"POS Opening Entry": [
["Draft", None],
["Open", "eval:self.docstatus == 1 and not self.pos_closing_entry"],
diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py
index 2fda9ccd6e..671d2fb7a5 100644
--- a/erpnext/controllers/stock_controller.py
+++ b/erpnext/controllers/stock_controller.py
@@ -162,7 +162,9 @@ class StockController(AccountsController):
self.get_gl_dict(
{
"account": warehouse_account[sle.warehouse]["account"],
+ "against_type": "Account",
"against": expense_account,
+ "against_link": expense_account,
"cost_center": item_row.cost_center,
"project": item_row.project or self.get("project"),
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
@@ -178,7 +180,9 @@ class StockController(AccountsController):
self.get_gl_dict(
{
"account": expense_account,
+ "against_type": "Account",
"against": warehouse_account[sle.warehouse]["account"],
+ "against_link": warehouse_account[sle.warehouse]["account"],
"cost_center": item_row.cost_center,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"debit": -1 * flt(sle.stock_value_difference, precision),
@@ -210,7 +214,9 @@ class StockController(AccountsController):
self.get_gl_dict(
{
"account": expense_account,
+ "against_type": "Account",
"against": warehouse_asset_account,
+ "against_link": warehouse_asset_account,
"cost_center": item_row.cost_center,
"project": item_row.project or self.get("project"),
"remarks": _("Rounding gain/loss Entry for Stock Transfer"),
@@ -226,7 +232,9 @@ class StockController(AccountsController):
self.get_gl_dict(
{
"account": warehouse_asset_account,
+ "against_type": "Account",
"against": expense_account,
+ "against_link": expense_account,
"cost_center": item_row.cost_center,
"remarks": _("Rounding gain/loss Entry for Stock Transfer"),
"credit": sle_rounding_diff,
@@ -455,6 +463,12 @@ class StockController(AccountsController):
sl_dict.update(args)
self.update_inventory_dimensions(d, sl_dict)
+ if self.docstatus == 2:
+ # To handle denormalized serial no records, will br deprecated in v16
+ for field in ["serial_no", "batch_no"]:
+ if d.get(field):
+ sl_dict[field] = d.get(field)
+
return sl_dict
def update_inventory_dimensions(self, row, sl_dict) -> None:
@@ -826,6 +840,7 @@ class StockController(AccountsController):
credit,
remarks,
against_account,
+ against_type="Account",
debit_in_account_currency=None,
credit_in_account_currency=None,
account_currency=None,
@@ -840,7 +855,9 @@ class StockController(AccountsController):
"cost_center": cost_center,
"debit": debit,
"credit": credit,
+ "against_type": against_type,
"against": against_account,
+ "against_link": against_account,
"remarks": remarks,
}
diff --git a/erpnext/crm/doctype/appointment/appointment.py b/erpnext/crm/doctype/appointment/appointment.py
index a735510d7d..541f77b1ba 100644
--- a/erpnext/crm/doctype/appointment/appointment.py
+++ b/erpnext/crm/doctype/appointment/appointment.py
@@ -76,7 +76,7 @@ class Appointment(Document):
self.create_calendar_event()
else:
# Set status to unverified
- self.status = "Unverified"
+ self.db_set("status", "Unverified")
# Send email to confirm
self.send_confirmation_email()
diff --git a/erpnext/erpnext_integrations/doctype/tally_migration/tally_migration.py b/erpnext/erpnext_integrations/doctype/tally_migration/tally_migration.py
index 8ebca549a0..ba1fae925e 100644
--- a/erpnext/erpnext_integrations/doctype/tally_migration/tally_migration.py
+++ b/erpnext/erpnext_integrations/doctype/tally_migration/tally_migration.py
@@ -129,9 +129,7 @@ class TallyMigration(Document):
self.default_cost_center, self.default_round_off_account = frappe.db.get_value(
"Company", self.erpnext_company, ["cost_center", "round_off_account"]
)
- self.default_warehouse = frappe.db.get_value(
- "Stock Settings", "Stock Settings", "default_warehouse"
- )
+ self.default_warehouse = frappe.db.get_single_value("Stock Settings", "default_warehouse")
def _process_master_data(self):
def get_company_name(collection):
diff --git a/erpnext/erpnext_integrations/workspace/erpnext_integrations/erpnext_integrations.json b/erpnext/erpnext_integrations/workspace/erpnext_integrations/erpnext_integrations.json
deleted file mode 100644
index dfef223c43..0000000000
--- a/erpnext/erpnext_integrations/workspace/erpnext_integrations/erpnext_integrations.json
+++ /dev/null
@@ -1,228 +0,0 @@
-{
- "charts": [],
- "content": "[{\"id\":\"e88ADOJ7WC\",\"type\":\"header\",\"data\":{\"text\":\"Integrations\",\"col\":12}},{\"id\":\"pZEYOOCdB0\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Browse Apps\",\"col\":3}},{\"id\":\"St7AHbhVOr\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"nu4oSjH5Rd\",\"type\":\"card\",\"data\":{\"card_name\":\"Authentication\",\"col\":4}},{\"id\":\"G0tyx9WOfm\",\"type\":\"card\",\"data\":{\"card_name\":\"Backup\",\"col\":4}},{\"id\":\"nG8cdkpzoc\",\"type\":\"card\",\"data\":{\"card_name\":\"Google Services\",\"col\":4}},{\"id\":\"4hwuQn6E95\",\"type\":\"card\",\"data\":{\"card_name\":\"Communication Channels\",\"col\":4}},{\"id\":\"sEGAzTJRmq\",\"type\":\"card\",\"data\":{\"card_name\":\"Payments\",\"col\":4}}]",
- "creation": "2020-08-20 19:30:48.138801",
- "custom_blocks": [],
- "docstatus": 0,
- "doctype": "Workspace",
- "for_user": "",
- "hide_custom": 0,
- "icon": "integration",
- "idx": 0,
- "is_hidden": 0,
- "label": "ERPNext Integrations",
- "links": [
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Backup",
- "link_count": 3,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Dropbox Settings",
- "link_count": 0,
- "link_to": "Dropbox Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "S3 Backup Settings",
- "link_count": 0,
- "link_to": "S3 Backup Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Google Drive",
- "link_count": 0,
- "link_to": "Google Drive",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Authentication",
- "link_count": 4,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Social Login",
- "link_count": 0,
- "link_to": "Social Login Key",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "LDAP Settings",
- "link_count": 0,
- "link_to": "LDAP Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "OAuth Client",
- "link_count": 0,
- "link_to": "OAuth Client",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "OAuth Provider Settings",
- "link_count": 0,
- "link_to": "OAuth Provider Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Communication Channels",
- "link_count": 3,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Webhook",
- "link_count": 0,
- "link_to": "Webhook",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "SMS Settings",
- "link_count": 0,
- "link_to": "SMS Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Slack Webhook URL",
- "link_count": 0,
- "link_to": "Slack Webhook URL",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Google Services",
- "link_count": 4,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Google Settings",
- "link_count": 0,
- "link_to": "Google Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Google Contacts",
- "link_count": 0,
- "link_to": "Google Contacts",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Google Calendar",
- "link_count": 0,
- "link_to": "Google Calendar",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Google Drive",
- "link_count": 0,
- "link_to": "Google Drive",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Payments",
- "link_count": 3,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Plaid Settings",
- "link_count": 0,
- "link_to": "Plaid Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- }
- ],
- "modified": "2023-10-31 19:57:32.748726",
- "modified_by": "Administrator",
- "module": "ERPNext Integrations",
- "name": "ERPNext Integrations",
- "number_cards": [],
- "owner": "Administrator",
- "parent_page": "",
- "public": 1,
- "quick_lists": [],
- "restrict_to_domain": "",
- "roles": [],
- "sequence_id": 21.0,
- "shortcuts": [
- {
- "color": "Grey",
- "doc_view": "List",
- "label": "Browse Apps",
- "type": "URL",
- "url": "https://frappecloud.com/marketplace"
- }
- ],
- "title": "ERPNext Integrations"
-}
\ No newline at end of file
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index f6b6802d58..6efb893e63 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -37,6 +37,7 @@ welcome_email = "erpnext.setup.utils.welcome_email"
# setup wizard
setup_wizard_requires = "assets/erpnext/js/setup_wizard.js"
setup_wizard_stages = "erpnext.setup.setup_wizard.setup_wizard.get_setup_stages"
+setup_wizard_complete = "erpnext.setup.setup_wizard.setup_wizard.setup_demo"
setup_wizard_test = "erpnext.setup.setup_wizard.test_setup_wizard.run_setup_wizard_test"
before_install = [
@@ -257,11 +258,6 @@ standard_portal_menu_items = [
{"title": "Appointment Booking", "route": "/book_appointment"},
]
-default_roles = [
- {"role": "Customer", "doctype": "Contact", "email_field": "email_id"},
- {"role": "Supplier", "doctype": "Contact", "email_field": "email_id"},
-]
-
sounds = [
{"name": "incoming-call", "src": "/assets/erpnext/sounds/incoming-call.mp3", "volume": 0.2},
{"name": "call-disconnect", "src": "/assets/erpnext/sounds/call-disconnect.mp3", "volume": 0.2},
@@ -493,6 +489,7 @@ bank_reconciliation_doctypes = [
"Payment Entry",
"Journal Entry",
"Purchase Invoice",
+ "Sales Invoice",
]
accounting_dimension_doctypes = [
diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
index 6100756a6a..ceb4406170 100644
--- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
+++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
@@ -117,7 +117,7 @@ class MaintenanceSchedule(TransactionBase):
self.update_amc_date(serial_nos, d.end_date)
no_email_sp = []
- if d.sales_person not in email_map:
+ if d.sales_person and d.sales_person not in email_map:
sp = frappe.get_doc("Sales Person", d.sales_person)
try:
email_map[d.sales_person] = sp.get_email_id()
@@ -131,12 +131,11 @@ class MaintenanceSchedule(TransactionBase):
).format(self.owner, "
" + "
".join(no_email_sp))
)
- scheduled_date = frappe.db.sql(
- """select scheduled_date from
- `tabMaintenance Schedule Detail` where sales_person=%s and item_code=%s and
- parent=%s""",
- (d.sales_person, d.item_code, self.name),
- as_dict=1,
+ scheduled_date = frappe.db.get_all(
+ "Maintenance Schedule Detail",
+ {"parent": self.name, "item_code": d.item_code},
+ ["scheduled_date"],
+ as_list=False,
)
for key in scheduled_date:
@@ -232,8 +231,6 @@ class MaintenanceSchedule(TransactionBase):
throw(_("Please select Start Date and End Date for Item {0}").format(d.item_code))
elif not d.no_of_visits:
throw(_("Please mention no of visits required"))
- elif not d.sales_person:
- throw(_("Please select a Sales Person for item: {0}").format(d.item_name))
if getdate(d.start_date) >= getdate(d.end_date):
throw(_("Start date should be less than end date for Item {0}").format(d.item_code))
@@ -452,20 +449,28 @@ def get_serial_nos_from_schedule(item_code, schedule=None):
def make_maintenance_visit(source_name, target_doc=None, item_name=None, s_id=None):
from frappe.model.mapper import get_mapped_doc
+ def condition(doc):
+ if s_id:
+ return doc.name == s_id
+ elif item_name:
+ return doc.item_name == item_name
+
+ return True
+
def update_status_and_detail(source, target, parent):
target.maintenance_type = "Scheduled"
- target.maintenance_schedule_detail = s_id
def update_serial(source, target, parent):
- if source.serial_and_batch_bundle:
- serial_nos = frappe.get_doc(
- "Serial and Batch Bundle", source.serial_and_batch_bundle
- ).get_serial_nos()
+ if source.item_reference:
+ if sbb := frappe.db.get_value(
+ "Maintenance Schedule Item", source.item_reference, "serial_and_batch_bundle"
+ ):
+ serial_nos = frappe.get_doc("Serial and Batch Bundle", sbb).get_serial_nos()
- if len(serial_nos) == 1:
- target.serial_no = serial_nos[0]
- else:
- target.serial_no = ""
+ if len(serial_nos) == 1:
+ target.serial_no = serial_nos[0]
+ else:
+ target.serial_no = ""
doclist = get_mapped_doc(
"Maintenance Schedule",
@@ -477,10 +482,13 @@ def make_maintenance_visit(source_name, target_doc=None, item_name=None, s_id=No
"validation": {"docstatus": ["=", 1]},
"postprocess": update_status_and_detail,
},
- "Maintenance Schedule Item": {
+ "Maintenance Schedule Detail": {
"doctype": "Maintenance Visit Purpose",
- "condition": lambda doc: doc.item_name == item_name if item_name else True,
- "field_map": {"sales_person": "service_person"},
+ "condition": condition,
+ "field_map": {
+ "sales_person": "service_person",
+ "name": "maintenance_schedule_detail",
+ },
"postprocess": update_serial,
},
},
diff --git a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
index e7df4847dd..d2511b8cbc 100644
--- a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
+++ b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
@@ -56,20 +56,39 @@ class MaintenanceVisit(TransactionBase):
frappe.throw(_("Add Items in the Purpose Table"), title=_("Purposes Required"))
def validate_maintenance_date(self):
- if self.maintenance_type == "Scheduled" and self.maintenance_schedule_detail:
- item_ref = frappe.db.get_value(
- "Maintenance Schedule Detail", self.maintenance_schedule_detail, "item_reference"
- )
- if item_ref:
- start_date, end_date = frappe.db.get_value(
- "Maintenance Schedule Item", item_ref, ["start_date", "end_date"]
+ if self.maintenance_type == "Scheduled":
+ if self.maintenance_schedule_detail:
+ item_ref = frappe.db.get_value(
+ "Maintenance Schedule Detail", self.maintenance_schedule_detail, "item_reference"
)
- if get_datetime(self.mntc_date) < get_datetime(start_date) or get_datetime(
- self.mntc_date
- ) > get_datetime(end_date):
- frappe.throw(
- _("Date must be between {0} and {1}").format(format_date(start_date), format_date(end_date))
+ if item_ref:
+ start_date, end_date = frappe.db.get_value(
+ "Maintenance Schedule Item", item_ref, ["start_date", "end_date"]
)
+ if get_datetime(self.mntc_date) < get_datetime(start_date) or get_datetime(
+ self.mntc_date
+ ) > get_datetime(end_date):
+ frappe.throw(
+ _("Date must be between {0} and {1}").format(format_date(start_date), format_date(end_date))
+ )
+ else:
+ for purpose in self.purposes:
+ if purpose.maintenance_schedule_detail:
+ item_ref = frappe.db.get_value(
+ "Maintenance Schedule Detail", purpose.maintenance_schedule_detail, "item_reference"
+ )
+ if item_ref:
+ start_date, end_date = frappe.db.get_value(
+ "Maintenance Schedule Item", item_ref, ["start_date", "end_date"]
+ )
+ if get_datetime(self.mntc_date) < get_datetime(start_date) or get_datetime(
+ self.mntc_date
+ ) > get_datetime(end_date):
+ frappe.throw(
+ _("Date must be between {0} and {1}").format(
+ format_date(start_date), format_date(end_date)
+ )
+ )
def validate(self):
self.validate_serial_no()
@@ -82,6 +101,7 @@ class MaintenanceVisit(TransactionBase):
if not cancel:
status = self.completion_status
actual_date = self.mntc_date
+
if self.maintenance_schedule_detail:
frappe.db.set_value(
"Maintenance Schedule Detail", self.maintenance_schedule_detail, "completion_status", status
@@ -89,6 +109,21 @@ class MaintenanceVisit(TransactionBase):
frappe.db.set_value(
"Maintenance Schedule Detail", self.maintenance_schedule_detail, "actual_date", actual_date
)
+ else:
+ for purpose in self.purposes:
+ if purpose.maintenance_schedule_detail:
+ frappe.db.set_value(
+ "Maintenance Schedule Detail",
+ purpose.maintenance_schedule_detail,
+ "completion_status",
+ status,
+ )
+ frappe.db.set_value(
+ "Maintenance Schedule Detail",
+ purpose.maintenance_schedule_detail,
+ "actual_date",
+ actual_date,
+ )
def update_customer_issue(self, flag):
if not self.maintenance_schedule:
diff --git a/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json b/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json
index ba05355553..a5a63c4c4d 100644
--- a/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json
+++ b/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json
@@ -17,7 +17,8 @@
"work_details",
"work_done",
"prevdoc_doctype",
- "prevdoc_docname"
+ "prevdoc_docname",
+ "maintenance_schedule_detail"
],
"fields": [
{
@@ -49,6 +50,8 @@
"options": "Serial No"
},
{
+ "fetch_from": "item_code.description",
+ "fetch_if_empty": 1,
"fieldname": "description",
"fieldtype": "Text Editor",
"in_list_view": 1,
@@ -56,7 +59,6 @@
"oldfieldname": "description",
"oldfieldtype": "Small Text",
"print_width": "300px",
- "reqd": 1,
"width": "300px"
},
{
@@ -103,12 +105,19 @@
{
"fieldname": "section_break_6",
"fieldtype": "Section Break"
+ },
+ {
+ "fieldname": "maintenance_schedule_detail",
+ "fieldtype": "Data",
+ "hidden": 1,
+ "label": "Maintenance Schedule Detail",
+ "options": "Maintenance Schedule Detail"
}
],
"idx": 1,
"istable": 1,
"links": [],
- "modified": "2023-02-27 11:09:33.114458",
+ "modified": "2024-01-05 21:46:53.239830",
"modified_by": "Administrator",
"module": "Maintenance",
"name": "Maintenance Visit Purpose",
diff --git a/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.py b/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.py
index 3686941c64..1d4dab2873 100644
--- a/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.py
+++ b/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.py
@@ -14,9 +14,10 @@ class MaintenanceVisitPurpose(Document):
if TYPE_CHECKING:
from frappe.types import DF
- description: DF.TextEditor
+ description: DF.TextEditor | None
item_code: DF.Link | None
item_name: DF.Data | None
+ maintenance_schedule_detail: DF.Data | None
parent: DF.Data
parentfield: DF.Data
parenttype: DF.Data
diff --git a/erpnext/manufacturing/doctype/bom/bom.json b/erpnext/manufacturing/doctype/bom/bom.json
index e8d3542835..5083873681 100644
--- a/erpnext/manufacturing/doctype/bom/bom.json
+++ b/erpnext/manufacturing/doctype/bom/bom.json
@@ -218,6 +218,7 @@
"options": "\nWork Order\nJob Card"
},
{
+ "default": "1",
"fieldname": "conversion_rate",
"fieldtype": "Float",
"label": "Conversion Rate",
@@ -636,7 +637,7 @@
"image_field": "image",
"is_submittable": 1,
"links": [],
- "modified": "2023-08-07 11:38:08.152294",
+ "modified": "2023-12-26 19:34:08.159312",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "BOM",
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index f0381d2cef..f034ed2b1a 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -744,6 +744,9 @@ class BOM(WebsiteGenerator):
base_total_rm_cost = 0
for d in self.get("items"):
+ if not d.is_stock_item and self.rm_cost_as_per == "Valuation Rate":
+ continue
+
old_rate = d.rate
if self.rm_cost_as_per != "Manual":
d.rate = self.get_rm_rate(
@@ -1017,6 +1020,8 @@ def get_bom_item_rate(args, bom_doc):
item_doc = frappe.get_cached_doc("Item", args.get("item_code"))
price_list_data = get_price_list_rate(bom_args, item_doc)
rate = price_list_data.price_list_rate
+ elif bom_doc.rm_cost_as_per == "Manual":
+ return
return flt(rate)
@@ -1486,3 +1491,47 @@ def make_variant_bom(source_name, bom_no, item, variant_items, target_doc=None):
)
return doc
+
+
+def get_op_cost_from_sub_assemblies(bom_no, op_cost=0):
+ # Get operating cost from sub-assemblies
+
+ bom_items = frappe.get_all(
+ "BOM Item", filters={"parent": bom_no, "docstatus": 1}, fields=["bom_no"], order_by="idx asc"
+ )
+
+ for row in bom_items:
+ if not row.bom_no:
+ continue
+
+ if cost := frappe.get_cached_value("BOM", row.bom_no, "operating_cost_per_bom_quantity"):
+ op_cost += flt(cost)
+ get_op_cost_from_sub_assemblies(row.bom_no, op_cost)
+
+ return op_cost
+
+
+def get_scrap_items_from_sub_assemblies(bom_no, company, qty, scrap_items=None):
+ if not scrap_items:
+ scrap_items = {}
+
+ bom_items = frappe.get_all(
+ "BOM Item",
+ filters={"parent": bom_no, "docstatus": 1},
+ fields=["bom_no", "qty"],
+ order_by="idx asc",
+ )
+
+ for row in bom_items:
+ if not row.bom_no:
+ continue
+
+ qty = flt(row.qty) * flt(qty)
+ items = get_bom_items_as_dict(
+ row.bom_no, company, qty=qty, fetch_exploded=0, fetch_scrap_items=1
+ )
+ scrap_items.update(items)
+
+ get_scrap_items_from_sub_assemblies(row.bom_no, company, qty, scrap_items)
+
+ return scrap_items
diff --git a/erpnext/manufacturing/doctype/bom/test_bom.py b/erpnext/manufacturing/doctype/bom/test_bom.py
index 051b475bcc..4cd0530e34 100644
--- a/erpnext/manufacturing/doctype/bom/test_bom.py
+++ b/erpnext/manufacturing/doctype/bom/test_bom.py
@@ -27,6 +27,28 @@ test_dependencies = ["Item", "Quality Inspection Template"]
class TestBOM(FrappeTestCase):
+ @timeout
+ def test_bom_qty(self):
+ from erpnext.stock.doctype.item.test_item import make_item
+
+ # No error.
+ bom = frappe.new_doc("BOM")
+ item = make_item(properties={"is_stock_item": 1})
+ bom.item = fg_item.item_code
+ bom.quantity = 1
+ bom.append(
+ "items",
+ {
+ "item_code": bom_item.item_code,
+ "qty": 0,
+ "uom": bom_item.stock_uom,
+ "stock_uom": bom_item.stock_uom,
+ "rate": 100.0,
+ },
+ )
+ bom.save()
+ self.assertEqual(bom.items[0].qty, 0)
+
@timeout
def test_get_items(self):
from erpnext.manufacturing.doctype.bom.bom import get_bom_items_as_dict
@@ -698,6 +720,35 @@ class TestBOM(FrappeTestCase):
bom.update_cost()
self.assertFalse(bom.flags.cost_updated)
+ def test_bom_with_service_item_cost(self):
+ from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
+
+ rm_item = make_item(properties={"is_stock_item": 1, "valuation_rate": 1000.0}).name
+
+ service_item = make_item(properties={"is_stock_item": 0}).name
+
+ fg_item = make_item(properties={"is_stock_item": 1}).name
+
+ from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom
+
+ bom = make_bom(item=fg_item, raw_materials=[rm_item, service_item], do_not_save=True)
+ bom.rm_cost_as_per = "Valuation Rate"
+
+ for row in bom.items:
+ if row.item_code == service_item:
+ row.rate = 566.00
+ else:
+ row.rate = 800.00
+
+ bom.save()
+
+ for row in bom.items:
+ if row.item_code == service_item:
+ self.assertEqual(row.is_stock_item, 0)
+ self.assertEqual(row.rate, 566.00)
+ else:
+ self.assertEqual(row.is_stock_item, 1)
+
def test_do_not_include_manufacturing_and_fixed_items(self):
from erpnext.manufacturing.doctype.bom.bom import item_query
diff --git a/erpnext/manufacturing/doctype/bom_creator/bom_creator.py b/erpnext/manufacturing/doctype/bom_creator/bom_creator.py
index bd010d9f9a..1709a1f71a 100644
--- a/erpnext/manufacturing/doctype/bom_creator/bom_creator.py
+++ b/erpnext/manufacturing/doctype/bom_creator/bom_creator.py
@@ -251,7 +251,7 @@ class BOMCreator(Document):
frappe.msgprint(_("BOMs created successfully"))
except Exception:
- traceback = frappe.get_traceback()
+ traceback = frappe.get_traceback(with_context=True)
self.db_set(
{
"status": "Failed",
diff --git a/erpnext/manufacturing/doctype/bom_explosion_item/bom_explosion_item.json b/erpnext/manufacturing/doctype/bom_explosion_item/bom_explosion_item.json
index c75ac32cd1..27ecd57b87 100644
--- a/erpnext/manufacturing/doctype/bom_explosion_item/bom_explosion_item.json
+++ b/erpnext/manufacturing/doctype/bom_explosion_item/bom_explosion_item.json
@@ -37,7 +37,8 @@
"oldfieldname": "item_code",
"oldfieldtype": "Link",
"options": "Item",
- "read_only": 1
+ "read_only": 1,
+ "search_index": 1
},
{
"fieldname": "item_name",
@@ -170,7 +171,7 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
- "modified": "2023-11-14 18:35:40.856895",
+ "modified": "2024-01-02 13:49:36.211586",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "BOM Explosion Item",
diff --git a/erpnext/manufacturing/doctype/bom_item/bom_item.json b/erpnext/manufacturing/doctype/bom_item/bom_item.json
index cb58af1f29..dfd6612098 100644
--- a/erpnext/manufacturing/doctype/bom_item/bom_item.json
+++ b/erpnext/manufacturing/doctype/bom_item/bom_item.json
@@ -14,6 +14,7 @@
"bom_no",
"source_warehouse",
"allow_alternative_item",
+ "is_stock_item",
"section_break_5",
"description",
"col_break1",
@@ -185,7 +186,7 @@
"in_list_view": 1,
"label": "Rate",
"options": "currency",
- "read_only": 1,
+ "read_only_depends_on": "eval:doc.is_stock_item == 1",
"reqd": 1
},
{
@@ -284,13 +285,21 @@
"fieldname": "do_not_explode",
"fieldtype": "Check",
"label": "Do Not Explode"
+ },
+ {
+ "default": "0",
+ "fetch_from": "item_code.is_stock_item",
+ "fieldname": "is_stock_item",
+ "fieldtype": "Check",
+ "label": "Is Stock Item",
+ "read_only": 1
}
],
"idx": 1,
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
- "modified": "2023-11-14 18:35:51.378513",
+ "modified": "2023-12-20 16:21:55.477883",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "BOM Item",
diff --git a/erpnext/manufacturing/doctype/bom_update_log/bom_updation_utils.py b/erpnext/manufacturing/doctype/bom_update_log/bom_updation_utils.py
index a2919b79b8..f013b88e94 100644
--- a/erpnext/manufacturing/doctype/bom_update_log/bom_updation_utils.py
+++ b/erpnext/manufacturing/doctype/bom_update_log/bom_updation_utils.py
@@ -86,10 +86,12 @@ def get_ancestor_boms(new_bom: str, bom_list: Optional[List] = None) -> List:
if new_bom == d.parent:
frappe.throw(_("BOM recursion: {0} cannot be child of {1}").format(new_bom, d.parent))
- bom_list.append(d.parent)
+ if d.parent not in tuple(bom_list):
+ bom_list.append(d.parent)
+
get_ancestor_boms(d.parent, bom_list)
- return list(set(bom_list))
+ return bom_list
def update_new_bom_in_bom_items(unit_cost: float, current_bom: str, new_bom: str) -> None:
diff --git a/erpnext/manufacturing/doctype/bom_update_log/test_bom_update_log.py b/erpnext/manufacturing/doctype/bom_update_log/test_bom_update_log.py
index b38fc8976b..30e6f5e209 100644
--- a/erpnext/manufacturing/doctype/bom_update_log/test_bom_update_log.py
+++ b/erpnext/manufacturing/doctype/bom_update_log/test_bom_update_log.py
@@ -57,6 +57,68 @@ class TestBOMUpdateLog(FrappeTestCase):
log.reload()
self.assertEqual(log.status, "Completed")
+ def test_bom_replace_for_root_bom(self):
+ """
+ - B-Item A (Root Item)
+ - B-Item B
+ - B-Item C
+ - B-Item D
+ - B-Item E
+ - B-Item F
+
+ Create New BOM for B-Item E with B-Item G and replace it in the above BOM.
+ """
+
+ from erpnext.manufacturing.doctype.bom.test_bom import create_nested_bom
+ from erpnext.stock.doctype.item.test_item import make_item
+
+ items = ["B-Item A", "B-Item B", "B-Item C", "B-Item D", "B-Item E", "B-Item F", "B-Item G"]
+
+ for item_code in items:
+ if not frappe.db.exists("Item", item_code):
+ make_item(item_code)
+
+ for item_code in items:
+ remove_bom(item_code)
+
+ bom_tree = {
+ "B-Item A": {"B-Item B": {"B-Item C": {}}, "B-Item D": {"B-Item E": {"B-Item F": {}}}}
+ }
+
+ root_bom = create_nested_bom(bom_tree, prefix="")
+
+ exploded_items = frappe.get_all(
+ "BOM Explosion Item", filters={"parent": root_bom.name}, fields=["item_code"]
+ )
+
+ exploded_items = [item.item_code for item in exploded_items]
+ expected_exploded_items = ["B-Item C", "B-Item F"]
+ self.assertEqual(sorted(exploded_items), sorted(expected_exploded_items))
+
+ old_bom = frappe.db.get_value("BOM", {"item": "B-Item E"}, "name")
+ bom_tree = {"B-Item E": {"B-Item G": {}}}
+
+ new_bom = create_nested_bom(bom_tree, prefix="")
+ enqueue_replace_bom(boms=frappe._dict(current_bom=old_bom, new_bom=new_bom.name))
+
+ exploded_items = frappe.get_all(
+ "BOM Explosion Item", filters={"parent": root_bom.name}, fields=["item_code"]
+ )
+
+ exploded_items = [item.item_code for item in exploded_items]
+ expected_exploded_items = ["B-Item C", "B-Item G"]
+ self.assertEqual(sorted(exploded_items), sorted(expected_exploded_items))
+
+
+def remove_bom(item_code):
+ boms = frappe.get_all("BOM", fields=["docstatus", "name"], filters={"item": item_code})
+
+ for row in boms:
+ if row.docstatus == 1:
+ frappe.get_doc("BOM", row.name).cancel()
+
+ frappe.delete_doc("BOM", row.name)
+
def update_cost_in_all_boms_in_test():
"""
diff --git a/erpnext/manufacturing/doctype/job_card/job_card.py b/erpnext/manufacturing/doctype/job_card/job_card.py
index d696cc4082..23650b6873 100644
--- a/erpnext/manufacturing/doctype/job_card/job_card.py
+++ b/erpnext/manufacturing/doctype/job_card/job_card.py
@@ -273,35 +273,39 @@ class JobCard(Document):
def has_overlap(self, production_capacity, time_logs):
overlap = False
- if production_capacity == 1 and len(time_logs) > 0:
+ if production_capacity == 1 and len(time_logs) >= 1:
return True
+ if not len(time_logs):
+ return False
- # Check overlap exists or not between the overlapping time logs with the current Job Card
- for row in time_logs:
- count = 1
- for next_row in time_logs:
- if row.name == next_row.name:
- continue
-
- if (
- (
- get_datetime(next_row.from_time) >= get_datetime(row.from_time)
- and get_datetime(next_row.from_time) <= get_datetime(row.to_time)
- )
- or (
- get_datetime(next_row.to_time) >= get_datetime(row.from_time)
- and get_datetime(next_row.to_time) <= get_datetime(row.to_time)
- )
- or (
- get_datetime(next_row.from_time) <= get_datetime(row.from_time)
- and get_datetime(next_row.to_time) >= get_datetime(row.to_time)
- )
- ):
- count += 1
-
- if count > production_capacity:
- return True
-
+ # sorting overlapping job cards as per from_time
+ time_logs = sorted(time_logs, key=lambda x: x.get("from_time"))
+ # alloted_capacity has key number starting from 1. Key number will increment by 1 if non sequential job card found
+ # if key number reaches/crosses to production_capacity means capacity is full and overlap error generated
+ # this will store last to_time of sequential job cards
+ alloted_capacity = {1: time_logs[0]["to_time"]}
+ # flag for sequential Job card found
+ sequential_job_card_found = False
+ for i in range(1, len(time_logs)):
+ # scanning for all Existing keys
+ for key in alloted_capacity.keys():
+ # if current Job Card from time is greater than last to_time in that key means these job card are sequential
+ if alloted_capacity[key] <= time_logs[i]["from_time"]:
+ # So update key's value with last to_time
+ alloted_capacity[key] = time_logs[i]["to_time"]
+ # flag is true as we get sequential Job Card for that key
+ sequential_job_card_found = True
+ # Immediately break so that job card to time is not added with any other key except this
+ break
+ # if sequential job card not found above means it is overlapping so increment key number to alloted_capacity
+ if not sequential_job_card_found:
+ # increment key number
+ key = key + 1
+ # for that key last to time is assigned.
+ alloted_capacity[key] = time_logs[i]["to_time"]
+ if len(alloted_capacity) >= production_capacity:
+ # if number of keys greater or equal to production caoacity means full capacity is utilized and we should throw overlap error
+ return True
return overlap
def get_time_logs(self, args, doctype, check_next_available_slot=False):
diff --git a/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json b/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json
index 01647d56c9..d3ad51f723 100644
--- a/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json
+++ b/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.json
@@ -31,6 +31,7 @@
"job_card_excess_transfer",
"other_settings_section",
"update_bom_costs_automatically",
+ "set_op_cost_and_scrape_from_sub_assemblies",
"column_break_23",
"make_serial_no_batch_from_work_order"
],
@@ -194,13 +195,20 @@
"fieldname": "job_card_excess_transfer",
"fieldtype": "Check",
"label": "Allow Excess Material Transfer"
+ },
+ {
+ "default": "0",
+ "description": "In the case of 'Use Multi-Level BOM' in a work order, if the user wishes to add sub-assembly costs to Finished Goods items without using a job card as well the scrap items, then this option needs to be enable.",
+ "fieldname": "set_op_cost_and_scrape_from_sub_assemblies",
+ "fieldtype": "Check",
+ "label": "Set Operating Cost / Scrape Items From Sub-assemblies"
}
],
"icon": "icon-wrench",
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
- "modified": "2021-09-13 22:09:09.401559",
+ "modified": "2023-12-28 16:37:44.874096",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Manufacturing Settings",
@@ -216,5 +224,6 @@
],
"sort_field": "modified",
"sort_order": "DESC",
+ "states": [],
"track_changes": 1
}
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.py b/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.py
index bfc8f4e915..463ba9fe4b 100644
--- a/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.py
+++ b/erpnext/manufacturing/doctype/manufacturing_settings/manufacturing_settings.py
@@ -32,6 +32,7 @@ class ManufacturingSettings(Document):
mins_between_operations: DF.Int
overproduction_percentage_for_sales_order: DF.Percent
overproduction_percentage_for_work_order: DF.Percent
+ set_op_cost_and_scrape_from_sub_assemblies: DF.Check
update_bom_costs_automatically: DF.Check
# end: auto-generated types
diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.js b/erpnext/manufacturing/doctype/production_plan/production_plan.js
index dd102b0fae..cd92263543 100644
--- a/erpnext/manufacturing/doctype/production_plan/production_plan.js
+++ b/erpnext/manufacturing/doctype/production_plan/production_plan.js
@@ -305,6 +305,8 @@ frappe.ui.form.on('Production Plan', {
frappe.throw(__("Select the Warehouse"));
}
+ frm.set_value("consider_minimum_order_qty", 0);
+
if (frm.doc.ignore_existing_ordered_qty) {
frm.events.get_items_for_material_requests(frm);
} else {
diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.json b/erpnext/manufacturing/doctype/production_plan/production_plan.json
index 49386c4ebc..257b60c486 100644
--- a/erpnext/manufacturing/doctype/production_plan/production_plan.json
+++ b/erpnext/manufacturing/doctype/production_plan/production_plan.json
@@ -48,6 +48,7 @@
"material_request_planning",
"include_non_stock_items",
"include_subcontracted_items",
+ "consider_minimum_order_qty",
"include_safety_stock",
"ignore_existing_ordered_qty",
"column_break_25",
@@ -423,13 +424,19 @@
"fieldtype": "Link",
"label": "Sub Assembly Warehouse",
"options": "Warehouse"
+ },
+ {
+ "default": "0",
+ "fieldname": "consider_minimum_order_qty",
+ "fieldtype": "Check",
+ "label": "Consider Minimum Order Qty"
}
],
"icon": "fa fa-calendar",
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2023-11-03 14:08:11.928027",
+ "modified": "2023-12-26 16:31:13.740777",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Production Plan",
diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.py b/erpnext/manufacturing/doctype/production_plan/production_plan.py
index c201c4f7be..f64af50188 100644
--- a/erpnext/manufacturing/doctype/production_plan/production_plan.py
+++ b/erpnext/manufacturing/doctype/production_plan/production_plan.py
@@ -67,6 +67,7 @@ class ProductionPlan(Document):
combine_items: DF.Check
combine_sub_items: DF.Check
company: DF.Link
+ consider_minimum_order_qty: DF.Check
customer: DF.Link | None
for_warehouse: DF.Link | None
from_date: DF.Date | None
@@ -583,6 +584,7 @@ class ProductionPlan(Document):
if close:
self.db_set("status", "Closed")
+ self.update_bin_qty()
return
if self.total_produced_qty > 0:
@@ -597,6 +599,9 @@ class ProductionPlan(Document):
if close is not None:
self.db_set("status", self.status)
+ if self.docstatus == 1 and self.status != "Completed":
+ self.update_bin_qty()
+
def update_ordered_status(self):
update_status = False
for d in self.po_items:
@@ -641,6 +646,10 @@ class ProductionPlan(Document):
"project": self.project,
}
+ key = (d.item_code, d.sales_order, d.warehouse)
+ if not d.sales_order:
+ key = (d.name, d.item_code, d.warehouse)
+
if not item_details["project"] and d.sales_order:
item_details["project"] = frappe.get_cached_value("Sales Order", d.sales_order, "project")
@@ -649,12 +658,9 @@ class ProductionPlan(Document):
item_dict[(d.item_code, d.material_request_item, d.warehouse)] = item_details
else:
item_details.update(
- {
- "qty": flt(item_dict.get((d.item_code, d.sales_order, d.warehouse), {}).get("qty"))
- + (flt(d.planned_qty) - flt(d.ordered_qty))
- }
+ {"qty": flt(item_dict.get(key, {}).get("qty")) + (flt(d.planned_qty) - flt(d.ordered_qty))}
)
- item_dict[(d.item_code, d.sales_order, d.warehouse)] = item_details
+ item_dict[key] = item_details
return item_dict
@@ -1207,7 +1213,14 @@ def get_subitems(
def get_material_request_items(
- row, sales_order, company, ignore_existing_ordered_qty, include_safety_stock, warehouse, bin_dict
+ doc,
+ row,
+ sales_order,
+ company,
+ ignore_existing_ordered_qty,
+ include_safety_stock,
+ warehouse,
+ bin_dict,
):
total_qty = row["qty"]
@@ -1216,8 +1229,14 @@ def get_material_request_items(
required_qty = total_qty
elif total_qty > bin_dict.get("projected_qty", 0):
required_qty = total_qty - bin_dict.get("projected_qty", 0)
- if required_qty > 0 and required_qty < row["min_order_qty"]:
+
+ if (
+ doc.get("consider_minimum_order_qty")
+ and required_qty > 0
+ and required_qty < row["min_order_qty"]
+ ):
required_qty = row["min_order_qty"]
+
item_group_defaults = get_item_group_defaults(row.item_code, company)
if not row["purchase_uom"]:
@@ -1555,6 +1574,7 @@ def get_items_for_material_requests(doc, warehouses=None, get_parent_warehouse_d
if details.qty > 0:
items = get_material_request_items(
+ doc,
details,
sales_order,
company,
diff --git a/erpnext/manufacturing/doctype/production_plan/test_production_plan.py b/erpnext/manufacturing/doctype/production_plan/test_production_plan.py
index cc9d9a0311..fedeb7a477 100644
--- a/erpnext/manufacturing/doctype/production_plan/test_production_plan.py
+++ b/erpnext/manufacturing/doctype/production_plan/test_production_plan.py
@@ -672,7 +672,7 @@ class TestProductionPlan(FrappeTestCase):
items_data = pln.get_production_items()
# Update qty
- items_data[(item, None, None)]["qty"] = qty
+ items_data[(pln.po_items[0].name, item, None)]["qty"] = qty
# Create and Submit Work Order for each item in items_data
for key, item in items_data.items():
@@ -1458,6 +1458,109 @@ class TestProductionPlan(FrappeTestCase):
self.assertEqual(row.get("uom"), "Nos")
self.assertEqual(row.get("conversion_factor"), 10.0)
+ def test_unreserve_qty_on_closing_of_pp(self):
+ from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
+ from erpnext.stock.utils import get_or_make_bin
+
+ fg_item = make_item(properties={"is_stock_item": 1, "stock_uom": "_Test UOM 1"}).name
+ rm_item = make_item(properties={"is_stock_item": 1, "stock_uom": "_Test UOM 1"}).name
+
+ store_warehouse = create_warehouse("Store Warehouse", company="_Test Company")
+ rm_warehouse = create_warehouse("RM Warehouse", company="_Test Company")
+
+ make_bom(item=fg_item, raw_materials=[rm_item], source_warehouse="_Test Warehouse - _TC")
+
+ pln = create_production_plan(
+ item_code=fg_item, planned_qty=10, stock_uom="_Test UOM 1", do_not_submit=1
+ )
+
+ pln.for_warehouse = rm_warehouse
+ mr_items = get_items_for_material_requests(pln.as_dict())
+ for d in mr_items:
+ pln.append("mr_items", d)
+
+ pln.save()
+ pln.submit()
+
+ bin_name = get_or_make_bin(rm_item, rm_warehouse)
+ before_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
+
+ pln.reload()
+ pln.set_status(close=True)
+
+ bin_name = get_or_make_bin(rm_item, rm_warehouse)
+ after_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
+ self.assertAlmostEqual(after_qty, before_qty - 10)
+
+ pln.reload()
+ pln.set_status(close=False)
+
+ bin_name = get_or_make_bin(rm_item, rm_warehouse)
+ after_qty = flt(frappe.db.get_value("Bin", bin_name, "reserved_qty_for_production_plan"))
+ self.assertAlmostEqual(after_qty, before_qty)
+
+ def test_min_order_qty_in_pp(self):
+ from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
+ from erpnext.stock.utils import get_or_make_bin
+
+ fg_item = make_item(properties={"is_stock_item": 1}).name
+ rm_item = make_item(properties={"is_stock_item": 1, "min_order_qty": 1000}).name
+
+ rm_warehouse = create_warehouse("RM Warehouse", company="_Test Company")
+
+ make_bom(item=fg_item, raw_materials=[rm_item], source_warehouse="_Test Warehouse - _TC")
+
+ pln = create_production_plan(item_code=fg_item, planned_qty=10, do_not_submit=1)
+
+ pln.for_warehouse = rm_warehouse
+ mr_items = get_items_for_material_requests(pln.as_dict())
+ for d in mr_items:
+ self.assertEqual(d.get("quantity"), 10.0)
+
+ pln.consider_minimum_order_qty = 1
+ mr_items = get_items_for_material_requests(pln.as_dict())
+ for d in mr_items:
+ self.assertEqual(d.get("quantity"), 1000.0)
+
+ def test_fg_item_quantity(self):
+ from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
+ from erpnext.stock.utils import get_or_make_bin
+
+ fg_item = make_item(properties={"is_stock_item": 1}).name
+ rm_item = make_item(properties={"is_stock_item": 1}).name
+
+ make_bom(item=fg_item, raw_materials=[rm_item], source_warehouse="_Test Warehouse - _TC")
+
+ pln = create_production_plan(item_code=fg_item, planned_qty=10, do_not_submit=1)
+
+ pln.append(
+ "po_items",
+ {
+ "item_code": rm_item,
+ "planned_qty": 20,
+ "bom_no": pln.po_items[0].bom_no,
+ "warehouse": pln.po_items[0].warehouse,
+ "planned_start_date": add_to_date(nowdate(), days=1),
+ },
+ )
+ pln.submit()
+ wo_qty = {}
+
+ for row in pln.po_items:
+ wo_qty[row.name] = row.planned_qty
+
+ pln.make_work_order()
+
+ work_orders = frappe.get_all(
+ "Work Order",
+ fields=["qty", "production_plan_item as name"],
+ filters={"production_plan": pln.name},
+ )
+ self.assertEqual(len(work_orders), 2)
+
+ for row in work_orders:
+ self.assertEqual(row.qty, wo_qty[row.name])
+
def create_production_plan(**args):
"""
@@ -1538,6 +1641,10 @@ def make_bom(**args):
}
)
+ if args.operating_cost_per_bom_quantity:
+ bom.fg_based_operating_cost = 1
+ bom.operating_cost_per_bom_quantity = args.operating_cost_per_bom_quantity
+
for item in args.raw_materials:
item_doc = frappe.get_doc("Item", item)
bom.append(
diff --git a/erpnext/manufacturing/doctype/work_order/test_work_order.py b/erpnext/manufacturing/doctype/work_order/test_work_order.py
index e2c8f07980..aa5db57fa8 100644
--- a/erpnext/manufacturing/doctype/work_order/test_work_order.py
+++ b/erpnext/manufacturing/doctype/work_order/test_work_order.py
@@ -921,11 +921,9 @@ class TestWorkOrder(FrappeTestCase):
"Test RM Item 2 for Scrap Item Test",
]
- from_time = add_days(now(), -1)
job_cards = frappe.get_all(
"Job Card Time Log",
fields=["distinct parent as name", "docstatus"],
- filters={"from_time": (">", from_time)},
order_by="creation asc",
)
@@ -1732,6 +1730,93 @@ class TestWorkOrder(FrappeTestCase):
job_card2.time_logs = []
job_card2.save()
+ def test_op_cost_and_scrap_based_on_sub_assemblies(self):
+ # Make Sub Assembly BOM 1
+
+ frappe.db.set_single_value(
+ "Manufacturing Settings", "set_op_cost_and_scrape_from_sub_assemblies", 1
+ )
+
+ items = {
+ "Test Final FG Item": 0,
+ "Test Final SF Item 1": 0,
+ "Test Final SF Item 2": 0,
+ "Test Final RM Item 1": 100,
+ "Test Final RM Item 2": 200,
+ "Test Final Scrap Item 1": 50,
+ "Test Final Scrap Item 2": 60,
+ }
+
+ for item in items:
+ if not frappe.db.exists("Item", item):
+ item_properties = {"is_stock_item": 1, "valuation_rate": items[item]}
+
+ make_item(item_code=item, properties=item_properties),
+
+ prepare_boms_for_sub_assembly_test()
+
+ wo_order = make_wo_order_test_record(
+ production_item="Test Final FG Item",
+ qty=10,
+ use_multi_level_bom=1,
+ skip_transfer=1,
+ from_wip_warehouse=1,
+ )
+
+ se_doc = frappe.get_doc(make_stock_entry(wo_order.name, "Manufacture", 10))
+ se_doc.save()
+
+ self.assertTrue(se_doc.additional_costs)
+ scrap_items = []
+ for item in se_doc.items:
+ if item.is_scrap_item:
+ scrap_items.append(item.item_code)
+
+ self.assertEqual(
+ sorted(scrap_items), sorted(["Test Final Scrap Item 1", "Test Final Scrap Item 2"])
+ )
+ for row in se_doc.additional_costs:
+ self.assertEqual(row.amount, 3000)
+
+ frappe.db.set_single_value(
+ "Manufacturing Settings", "set_op_cost_and_scrape_from_sub_assemblies", 0
+ )
+
+
+def prepare_boms_for_sub_assembly_test():
+ if not frappe.db.exists("BOM", {"item": "Test Final SF Item 1"}):
+ bom = make_bom(
+ item="Test Final SF Item 1",
+ source_warehouse="Stores - _TC",
+ raw_materials=["Test Final RM Item 1"],
+ operating_cost_per_bom_quantity=100,
+ do_not_submit=True,
+ )
+
+ bom.append("scrap_items", {"item_code": "Test Final Scrap Item 1", "qty": 1})
+
+ bom.submit()
+
+ if not frappe.db.exists("BOM", {"item": "Test Final SF Item 2"}):
+ bom = make_bom(
+ item="Test Final SF Item 2",
+ source_warehouse="Stores - _TC",
+ raw_materials=["Test Final RM Item 2"],
+ operating_cost_per_bom_quantity=200,
+ do_not_submit=True,
+ )
+
+ bom.append("scrap_items", {"item_code": "Test Final Scrap Item 2", "qty": 1})
+
+ bom.submit()
+
+ if not frappe.db.exists("BOM", {"item": "Test Final FG Item"}):
+ bom = make_bom(
+ item="Test Final FG Item",
+ source_warehouse="Stores - _TC",
+ raw_materials=["Test Final SF Item 1", "Test Final SF Item 2"],
+ )
+
def prepare_data_for_workstation_type_check():
from erpnext.manufacturing.doctype.operation.test_operation import make_operation
@@ -1978,6 +2063,7 @@ def make_wo_order_test_record(**args):
wo_order.sales_order = args.sales_order or None
wo_order.planned_start_date = args.planned_start_date or now()
wo_order.transfer_material_against = args.transfer_material_against or "Work Order"
+ wo_order.from_wip_warehouse = args.from_wip_warehouse or 0
if args.source_warehouse:
for item in wo_order.get("required_items"):
diff --git a/erpnext/manufacturing/doctype/workstation/workstation.py b/erpnext/manufacturing/doctype/workstation/workstation.py
index 0a247fc431..0f05eaac00 100644
--- a/erpnext/manufacturing/doctype/workstation/workstation.py
+++ b/erpnext/manufacturing/doctype/workstation/workstation.py
@@ -156,7 +156,7 @@ def check_if_within_operating_hours(workstation, operation, from_datetime, to_da
if not frappe.db.get_single_value("Manufacturing Settings", "allow_production_on_holidays"):
check_workstation_for_holiday(workstation, from_datetime, to_datetime)
- if not cint(frappe.db.get_value("Manufacturing Settings", None, "allow_overtime")):
+ if not cint(frappe.db.get_single_value("Manufacturing Settings", "allow_overtime")):
is_within_operating_hours(workstation, operation, from_datetime, to_datetime)
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 9b070bdaf7..7ade21df60 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -352,5 +352,8 @@ erpnext.patches.v14_0.create_accounting_dimensions_in_supplier_quotation
erpnext.patches.v14_0.update_zero_asset_quantity_field
execute:frappe.db.set_single_value("Buying Settings", "project_update_frequency", "Each Transaction")
execute:frappe.db.set_default("date_format", frappe.db.get_single_value("System Settings", "date_format"))
+erpnext.patches.v14_0.update_total_asset_cost_field
# below migration patch should always run last
erpnext.patches.v14_0.migrate_gl_to_payment_ledger
+erpnext.stock.doctype.delivery_note.patches.drop_unused_return_against_index # 2023-12-20
+erpnext.patches.v14_0.set_maintain_stock_for_bom_item
diff --git a/erpnext/patches/v11_0/create_department_records_for_each_company.py b/erpnext/patches/v11_0/create_department_records_for_each_company.py
index 84be2bee9d..7a0641d7c8 100644
--- a/erpnext/patches/v11_0/create_department_records_for_each_company.py
+++ b/erpnext/patches/v11_0/create_department_records_for_each_company.py
@@ -35,7 +35,7 @@ def execute():
# append list of new department for each company
comp_dict[company.name][department.name] = copy_doc.name
- rebuild_tree("Department", "parent_department")
+ rebuild_tree("Department")
doctypes = ["Asset", "Employee", "Payroll Entry", "Staffing Plan", "Job Opening"]
for d in doctypes:
diff --git a/erpnext/patches/v11_0/make_location_from_warehouse.py b/erpnext/patches/v11_0/make_location_from_warehouse.py
index c863bb7ecf..8d9c8d8ef6 100644
--- a/erpnext/patches/v11_0/make_location_from_warehouse.py
+++ b/erpnext/patches/v11_0/make_location_from_warehouse.py
@@ -27,7 +27,7 @@ def execute():
except frappe.DuplicateEntryError:
continue
- rebuild_tree("Location", "parent_location")
+ rebuild_tree("Location")
def get_parent_warehouse_name(warehouse):
diff --git a/erpnext/patches/v11_0/rebuild_tree_for_company.py b/erpnext/patches/v11_0/rebuild_tree_for_company.py
index fc06c5d30d..a9b23445e9 100644
--- a/erpnext/patches/v11_0/rebuild_tree_for_company.py
+++ b/erpnext/patches/v11_0/rebuild_tree_for_company.py
@@ -4,4 +4,4 @@ from frappe.utils.nestedset import rebuild_tree
def execute():
frappe.reload_doc("setup", "doctype", "company")
- rebuild_tree("Company", "parent_company")
+ rebuild_tree("Company")
diff --git a/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py b/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py
index 96daba7d36..67eb915902 100644
--- a/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py
+++ b/erpnext/patches/v11_0/rename_supplier_type_to_supplier_group.py
@@ -41,4 +41,4 @@ def build_tree():
}
).insert(ignore_permissions=True)
- rebuild_tree("Supplier Group", "parent_supplier_group")
+ rebuild_tree("Supplier Group")
diff --git a/erpnext/patches/v11_0/update_department_lft_rgt.py b/erpnext/patches/v11_0/update_department_lft_rgt.py
index 778392ec5f..380ca4d47a 100644
--- a/erpnext/patches/v11_0/update_department_lft_rgt.py
+++ b/erpnext/patches/v11_0/update_department_lft_rgt.py
@@ -18,4 +18,4 @@ def execute():
)
)
- rebuild_tree("Department", "parent_department")
+ rebuild_tree("Department")
diff --git a/erpnext/patches/v13_0/modify_invalid_gain_loss_gl_entries.py b/erpnext/patches/v13_0/modify_invalid_gain_loss_gl_entries.py
index 0f77afda78..8e58d79b92 100644
--- a/erpnext/patches/v13_0/modify_invalid_gain_loss_gl_entries.py
+++ b/erpnext/patches/v13_0/modify_invalid_gain_loss_gl_entries.py
@@ -45,7 +45,7 @@ def execute():
message=json.dumps(purchase_invoices + sales_invoices, indent=2),
)
- acc_frozen_upto = frappe.db.get_value("Accounts Settings", None, "acc_frozen_upto")
+ acc_frozen_upto = frappe.db.get_single_value("Accounts Settings", "acc_frozen_upto")
if acc_frozen_upto:
frappe.db.set_single_value("Accounts Settings", "acc_frozen_upto", None)
diff --git a/erpnext/patches/v14_0/migrate_crm_settings.py b/erpnext/patches/v14_0/migrate_crm_settings.py
index 24772553d9..d093bc386e 100644
--- a/erpnext/patches/v14_0/migrate_crm_settings.py
+++ b/erpnext/patches/v14_0/migrate_crm_settings.py
@@ -2,8 +2,7 @@ import frappe
def execute():
- settings = frappe.db.get_value(
- "Selling Settings",
+ settings = frappe.db.get_single_value(
"Selling Settings",
["campaign_naming_by", "close_opportunity_after_days", "default_valid_till"],
as_dict=True,
diff --git a/erpnext/patches/v14_0/set_maintain_stock_for_bom_item.py b/erpnext/patches/v14_0/set_maintain_stock_for_bom_item.py
new file mode 100644
index 0000000000..f0b618f32d
--- /dev/null
+++ b/erpnext/patches/v14_0/set_maintain_stock_for_bom_item.py
@@ -0,0 +1,19 @@
+import frappe
+
+
+def execute():
+ if not frappe.db.exists("BOM", {"docstatus": 1}):
+ return
+
+ # Added is_stock_item to handle Read Only based on condition for the rate field
+ frappe.db.sql(
+ """
+ UPDATE
+ `tabBOM Item` boi,
+ `tabItem` i
+ SET
+ boi.is_stock_item = i.is_stock_item
+ WHERE
+ boi.item_code = i.name
+ """
+ )
diff --git a/erpnext/patches/v14_0/update_invoicing_period_in_subscription.py b/erpnext/patches/v14_0/update_invoicing_period_in_subscription.py
index 2879e57e1a..b70548ccb7 100644
--- a/erpnext/patches/v14_0/update_invoicing_period_in_subscription.py
+++ b/erpnext/patches/v14_0/update_invoicing_period_in_subscription.py
@@ -4,5 +4,5 @@ import frappe
def execute():
subscription = frappe.qb.DocType("Subscription")
frappe.qb.update(subscription).set(
- subscription.generate_invoice_at, "Beginning of the currency subscription period"
+ subscription.generate_invoice_at, "Beginning of the current subscription period"
).where(subscription.generate_invoice_at_period_start == 1).run()
diff --git a/erpnext/patches/v14_0/update_total_asset_cost_field.py b/erpnext/patches/v14_0/update_total_asset_cost_field.py
new file mode 100644
index 0000000000..57cf71b613
--- /dev/null
+++ b/erpnext/patches/v14_0/update_total_asset_cost_field.py
@@ -0,0 +1,17 @@
+import frappe
+
+
+def execute():
+ asset = frappe.qb.DocType("Asset")
+ frappe.qb.update(asset).set(asset.total_asset_cost, asset.gross_purchase_amount).run()
+
+ asset_repair_list = frappe.db.get_all(
+ "Asset Repair",
+ filters={"docstatus": 1, "repair_status": "Completed", "capitalize_repair_cost": 1},
+ fields=["asset", "repair_cost"],
+ )
+
+ for asset_repair in asset_repair_list:
+ frappe.qb.update(asset).set(
+ asset.total_asset_cost, asset.total_asset_cost + asset_repair.repair_cost
+ ).where(asset.name == asset_repair.asset).run()
diff --git a/erpnext/projects/doctype/project/project.json b/erpnext/projects/doctype/project/project.json
index 715b09c64b..5917e9b5d2 100644
--- a/erpnext/projects/doctype/project/project.json
+++ b/erpnext/projects/doctype/project/project.json
@@ -131,6 +131,7 @@
"set_only_once": 1
},
{
+ "bold": 1,
"fieldname": "expected_start_date",
"fieldtype": "Date",
"label": "Expected Start Date",
@@ -453,7 +454,7 @@
"index_web_pages_for_search": 1,
"links": [],
"max_attachments": 4,
- "modified": "2023-08-28 22:27:28.370849",
+ "modified": "2024-01-08 16:01:34.598258",
"modified_by": "Administrator",
"module": "Projects",
"name": "Project",
diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py
index 751dcbd06a..d17d21cf27 100644
--- a/erpnext/projects/doctype/project/project.py
+++ b/erpnext/projects/doctype/project/project.py
@@ -19,6 +19,62 @@ from erpnext.setup.doctype.holiday_list.holiday_list import is_holiday
class Project(Document):
+ # begin: auto-generated types
+ # This code is auto-generated. Do not modify anything in this block.
+
+ from typing import TYPE_CHECKING
+
+ if TYPE_CHECKING:
+ from frappe.types import DF
+
+ from erpnext.projects.doctype.project_user.project_user import ProjectUser
+
+ actual_end_date: DF.Date | None
+ actual_start_date: DF.Date | None
+ actual_time: DF.Float
+ collect_progress: DF.Check
+ company: DF.Link
+ copied_from: DF.Data | None
+ cost_center: DF.Link | None
+ customer: DF.Link | None
+ daily_time_to_send: DF.Time | None
+ day_to_send: DF.Literal[
+ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
+ ]
+ department: DF.Link | None
+ estimated_costing: DF.Currency
+ expected_end_date: DF.Date | None
+ expected_start_date: DF.Date | None
+ first_email: DF.Time | None
+ frequency: DF.Literal["Hourly", "Twice Daily", "Daily", "Weekly"]
+ from_time: DF.Time | None
+ gross_margin: DF.Currency
+ holiday_list: DF.Link | None
+ is_active: DF.Literal["Yes", "No"]
+ message: DF.Text | None
+ naming_series: DF.Literal["PROJ-.####"]
+ notes: DF.TextEditor | None
+ per_gross_margin: DF.Percent
+ percent_complete: DF.Percent
+ percent_complete_method: DF.Literal["Manual", "Task Completion", "Task Progress", "Task Weight"]
+ priority: DF.Literal["Medium", "Low", "High"]
+ project_name: DF.Data
+ project_template: DF.Link | None
+ project_type: DF.Link | None
+ sales_order: DF.Link | None
+ second_email: DF.Time | None
+ status: DF.Literal["Open", "Completed", "Cancelled"]
+ to_time: DF.Time | None
+ total_billable_amount: DF.Currency
+ total_billed_amount: DF.Currency
+ total_consumed_material_cost: DF.Currency
+ total_costing_amount: DF.Currency
+ total_purchase_cost: DF.Currency
+ total_sales_amount: DF.Currency
+ users: DF.Table[ProjectUser]
+ weekly_time_to_send: DF.Time | None
+ # end: auto-generated types
+
def onload(self):
self.set_onload(
"activity_summary",
diff --git a/erpnext/projects/doctype/task/task.json b/erpnext/projects/doctype/task/task.json
index 4d2d225242..cc9832b584 100644
--- a/erpnext/projects/doctype/task/task.json
+++ b/erpnext/projects/doctype/task/task.json
@@ -153,6 +153,7 @@
"label": "Timeline"
},
{
+ "bold": 1,
"fieldname": "exp_start_date",
"fieldtype": "Date",
"label": "Expected Start Date",
@@ -398,7 +399,7 @@
"is_tree": 1,
"links": [],
"max_attachments": 5,
- "modified": "2023-11-20 11:42:41.884069",
+ "modified": "2024-01-08 16:00:41.296203",
"modified_by": "Administrator",
"module": "Projects",
"name": "Task",
diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js
index 3ed7fc75cf..77ecf75e0c 100644
--- a/erpnext/public/js/controllers/buying.js
+++ b/erpnext/public/js/controllers/buying.js
@@ -361,9 +361,14 @@ erpnext.buying = {
new erpnext.SerialBatchPackageSelector(
me.frm, item, (r) => {
if (r) {
+ let qty = Math.abs(r.total_qty);
+ if (doc.is_return) {
+ qty = qty * -1;
+ }
+
let update_values = {
"serial_and_batch_bundle": r.name,
- "qty": Math.abs(r.total_qty)
+ "qty": qty
}
if (r.warehouse) {
@@ -396,9 +401,14 @@ erpnext.buying = {
new erpnext.SerialBatchPackageSelector(
me.frm, item, (r) => {
if (r) {
+ let qty = Math.abs(r.total_qty);
+ if (doc.is_return) {
+ qty = qty * -1;
+ }
+
let update_values = {
"serial_and_batch_bundle": r.name,
- "rejected_qty": Math.abs(r.total_qty)
+ "rejected_qty": qty
}
if (r.warehouse) {
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index 39357834ed..4d8f6839b4 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -454,7 +454,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
item.weight_uom = '';
item.conversion_factor = 0;
- if(['Sales Invoice'].includes(this.frm.doc.doctype)) {
+ if(['Sales Invoice', 'Purchase Invoice'].includes(this.frm.doc.doctype)) {
update_stock = cint(me.frm.doc.update_stock);
show_batch_dialog = update_stock;
@@ -545,7 +545,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
},
() => me.toggle_conversion_factor(item),
() => {
- if (show_batch_dialog)
+ if (show_batch_dialog && !frappe.flags.trigger_from_barcode_scanner)
return frappe.db.get_value("Item", item.item_code, ["has_batch_no", "has_serial_no"])
.then((r) => {
if (r.message &&
@@ -715,6 +715,11 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
}
on_submit() {
+ if (in_list(["Purchase Invoice", "Sales Invoice"], this.frm.doc.doctype)
+ && !this.frm.doc.update_stock) {
+ return;
+ }
+
this.refresh_serial_batch_bundle_field();
}
@@ -1234,6 +1239,20 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
}
}
+ sync_bundle_data() {
+ let doctypes = ["Sales Invoice", "Purchase Invoice", "Delivery Note", "Purchase Receipt"];
+
+ if (this.frm.is_new() && doctypes.includes(this.frm.doc.doctype)) {
+ const barcode_scanner = new erpnext.utils.BarcodeScanner({frm:this.frm});
+ barcode_scanner.sync_bundle_data();
+ barcode_scanner.remove_item_from_localstorage();
+ }
+ }
+
+ before_save(doc) {
+ this.sync_bundle_data();
+ }
+
service_start_date(frm, cdt, cdn) {
var child = locals[cdt][cdn];
@@ -1571,6 +1590,18 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
return item_list;
}
+ items_delete() {
+ this.update_localstorage_scanned_data();
+ }
+
+ update_localstorage_scanned_data() {
+ let doctypes = ["Sales Invoice", "Purchase Invoice", "Delivery Note", "Purchase Receipt"];
+ if (this.frm.is_new() && doctypes.includes(this.frm.doc.doctype)) {
+ const barcode_scanner = new erpnext.utils.BarcodeScanner({frm:this.frm});
+ barcode_scanner.update_localstorage_scanned_data();
+ }
+ }
+
_set_values_for_item_list(children) {
const items_rule_dict = {};
diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js
index b0ea56833b..598167b337 100755
--- a/erpnext/public/js/utils.js
+++ b/erpnext/public/js/utils.js
@@ -843,7 +843,7 @@ erpnext.utils.map_current_doc = function(opts) {
freeze_message: __("Mapping {0} ...", [opts.source_doctype]),
callback: function(r) {
if(!r.exc) {
- var doc = frappe.model.sync(r.message);
+ frappe.model.sync(r.message);
cur_frm.dirty();
cur_frm.refresh();
}
@@ -865,11 +865,20 @@ erpnext.utils.map_current_doc = function(opts) {
}
if (opts.source_doctype) {
+ let data_fields = [];
+ if(opts.source_doctype == "Purchase Receipt") {
+ data_fields.push({
+ fieldname: 'merge_taxes',
+ fieldtype: 'Check',
+ label: __('Merge taxes from multiple documents'),
+ });
+ }
const d = new frappe.ui.form.MultiSelectDialog({
doctype: opts.source_doctype,
target: opts.target,
date_field: opts.date_field || undefined,
setters: opts.setters,
+ data_fields: data_fields,
get_query: opts.get_query,
add_filters_group: 1,
allow_child_item_selection: opts.allow_child_item_selection,
@@ -883,7 +892,7 @@ erpnext.utils.map_current_doc = function(opts) {
return;
}
opts.source_name = values;
- if (opts.allow_child_item_selection) {
+ if (opts.allow_child_item_selection || opts.source_doctype == "Purchase Receipt") {
// args contains filtered child docnames
opts.args = args;
}
diff --git a/erpnext/public/js/utils/barcode_scanner.js b/erpnext/public/js/utils/barcode_scanner.js
index a1ebfe9aa4..cf7fab89ff 100644
--- a/erpnext/public/js/utils/barcode_scanner.js
+++ b/erpnext/public/js/utils/barcode_scanner.js
@@ -7,8 +7,6 @@ erpnext.utils.BarcodeScanner = class BarcodeScanner {
this.scan_barcode_field = this.frm.fields_dict[this.scan_field_name];
this.barcode_field = opts.barcode_field || "barcode";
- this.serial_no_field = opts.serial_no_field || "serial_no";
- this.batch_no_field = opts.batch_no_field || "batch_no";
this.uom_field = opts.uom_field || "uom";
this.qty_field = opts.qty_field || "qty";
// field name on row which defines max quantity to be scanned e.g. picklist
@@ -84,6 +82,7 @@ erpnext.utils.BarcodeScanner = class BarcodeScanner {
update_table(data) {
return new Promise((resolve, reject) => {
let cur_grid = this.frm.fields_dict[this.items_table_name].grid;
+ frappe.flags.trigger_from_barcode_scanner = true;
const {item_code, barcode, batch_no, serial_no, uom} = data;
@@ -106,50 +105,38 @@ erpnext.utils.BarcodeScanner = class BarcodeScanner {
this.frm.has_items = false;
}
- if (this.is_duplicate_serial_no(row, serial_no)) {
+ if (serial_no && this.is_duplicate_serial_no(row, item_code, serial_no)) {
this.clean_up();
reject();
return;
}
frappe.run_serially([
- () => this.set_selector_trigger_flag(data),
- () => this.set_serial_no(row, serial_no),
- () => this.set_batch_no(row, batch_no),
+ () => this.set_serial_and_batch(row, item_code, serial_no, batch_no),
() => this.set_barcode(row, barcode),
() => this.set_item(row, item_code, barcode, batch_no, serial_no).then(qty => {
this.show_scan_message(row.idx, row.item_code, qty);
}),
() => this.set_barcode_uom(row, uom),
() => this.clean_up(),
- () => this.revert_selector_flag(),
- () => resolve(row)
+ () => resolve(row),
+ () => {
+ if (row.serial_and_batch_bundle && !this.frm.is_new()) {
+ this.frm.save();
+ }
+
+ frappe.flags.trigger_from_barcode_scanner = false;
+ }
]);
});
}
- // batch and serial selector is reduandant when all info can be added by scan
- // this flag on item row is used by transaction.js to avoid triggering selector
- set_selector_trigger_flag(data) {
- const {has_batch_no, has_serial_no} = data;
-
- const require_selecting_batch = has_batch_no;
- const require_selecting_serial = has_serial_no;
-
- if (!(require_selecting_batch || require_selecting_serial)) {
- frappe.flags.hide_serial_batch_dialog = true;
- }
- }
-
- revert_selector_flag() {
- frappe.flags.hide_serial_batch_dialog = false;
- }
-
set_item(row, item_code, barcode, batch_no, serial_no) {
return new Promise(resolve => {
const increment = async (value = 1) => {
const item_data = {item_code: item_code};
item_data[this.qty_field] = Number((row[this.qty_field] || 0)) + Number(value);
+ frappe.flags.trigger_from_barcode_scanner = true;
await frappe.model.set_value(row.doctype, row.name, item_data);
return value;
};
@@ -158,8 +145,6 @@ erpnext.utils.BarcodeScanner = class BarcodeScanner {
frappe.prompt(__("Please enter quantity for item {0}", [item_code]), ({value}) => {
increment(value).then((value) => resolve(value));
});
- } else if (this.frm.has_items) {
- this.prepare_item_for_scan(row, item_code, barcode, batch_no, serial_no);
} else {
increment().then((value) => resolve(value));
}
@@ -182,9 +167,8 @@ erpnext.utils.BarcodeScanner = class BarcodeScanner {
frappe.model.set_value(row.doctype, row.name, item_data);
frappe.run_serially([
- () => this.set_batch_no(row, this.dialog.get_value("batch_no")),
() => this.set_barcode(row, this.dialog.get_value("barcode")),
- () => this.set_serial_no(row, this.dialog.get_value("serial_no")),
+ () => this.set_serial_and_batch(row, item_code, this.dialog.get_value("serial_no"), this.dialog.get_value("batch_no")),
() => this.add_child_for_remaining_qty(row),
() => this.clean_up()
]);
@@ -338,32 +322,144 @@ erpnext.utils.BarcodeScanner = class BarcodeScanner {
}
}
- async set_serial_no(row, serial_no) {
- if (serial_no && frappe.meta.has_field(row.doctype, this.serial_no_field)) {
- const existing_serial_nos = row[this.serial_no_field];
- let new_serial_nos = "";
-
- if (!!existing_serial_nos) {
- new_serial_nos = existing_serial_nos + "\n" + serial_no;
- } else {
- new_serial_nos = serial_no;
- }
- await frappe.model.set_value(row.doctype, row.name, this.serial_no_field, new_serial_nos);
+ async set_serial_and_batch(row, item_code, serial_no, batch_no) {
+ if (this.frm.is_new() || !row.serial_and_batch_bundle) {
+ this.set_bundle_in_localstorage(row, item_code, serial_no, batch_no);
+ } else if(row.serial_and_batch_bundle) {
+ frappe.call({
+ method: "erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle.update_serial_or_batch",
+ args: {
+ bundle_id: row.serial_and_batch_bundle,
+ serial_no: serial_no,
+ batch_no: batch_no,
+ },
+ })
}
}
+ get_key_for_localstorage() {
+ let parts = this.frm.doc.name.split("-");
+ return parts[parts.length - 1] + this.frm.doc.doctype;
+ }
+
+ update_localstorage_scanned_data() {
+ let docname = this.frm.doc.name
+ if (localStorage[docname]) {
+ let items = JSON.parse(localStorage[docname]);
+ let existing_items = this.frm.doc.items.map(d => d.item_code);
+ if (!existing_items.length) {
+ localStorage.removeItem(docname);
+ return;
+ }
+
+ for (let item_code in items) {
+ if (!existing_items.includes(item_code)) {
+ delete items[item_code];
+ }
+ }
+
+ localStorage[docname] = JSON.stringify(items);
+ }
+ }
+
+ async set_bundle_in_localstorage(row, item_code, serial_no, batch_no) {
+ let docname = this.frm.doc.name
+
+ let entries = JSON.parse(localStorage.getItem(docname));
+ if (!entries) {
+ entries = {};
+ }
+
+ let key = item_code;
+ if (!entries[key]) {
+ entries[key] = [];
+ }
+
+ let existing_row = [];
+ if (!serial_no && batch_no) {
+ existing_row = entries[key].filter((e) => e.batch_no === batch_no);
+ if (existing_row.length) {
+ existing_row[0].qty += 1;
+ }
+ } else if (serial_no) {
+ existing_row = entries[key].filter((e) => e.serial_no === serial_no);
+ if (existing_row.length) {
+ frappe.throw(__("Serial No {0} has already scanned.", [serial_no]));
+ }
+ }
+
+ if (!existing_row.length) {
+ entries[key].push({
+ "serial_no": serial_no,
+ "batch_no": batch_no,
+ "qty": 1
+ });
+ }
+
+ localStorage.setItem(docname, JSON.stringify(entries));
+
+ // Auto remove from localstorage after 1 hour
+ setTimeout(() => {
+ localStorage.removeItem(docname);
+ }, 3600000)
+ }
+
+ remove_item_from_localstorage() {
+ let docname = this.frm.doc.name;
+ if (localStorage[docname]) {
+ localStorage.removeItem(docname);
+ }
+ }
+
+ async sync_bundle_data() {
+ let docname = this.frm.doc.name;
+
+ if (localStorage[docname]) {
+ let entries = JSON.parse(localStorage[docname]);
+ if (entries) {
+ for (let entry in entries) {
+ let row = this.frm.doc.items.filter((item) => {
+ if (item.item_code === entry) {
+ return true;
+ }
+ })[0];
+
+ if (row) {
+ this.create_serial_and_batch_bundle(row, entries, entry)
+ .then(() => {
+ if (!entries) {
+ localStorage.removeItem(docname);
+ }
+ });
+ }
+ }
+ }
+ }
+ }
+
+ async create_serial_and_batch_bundle(row, entries, key) {
+ frappe.call({
+ method: "erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle.add_serial_batch_ledgers",
+ args: {
+ entries: entries[key],
+ child_row: row,
+ doc: this.frm.doc,
+ warehouse: row.warehouse,
+ do_not_save: 1
+ },
+ callback: function(r) {
+ row.serial_and_batch_bundle = r.message.name;
+ delete entries[key];
+ }
+ })
+ }
+
async set_barcode_uom(row, uom) {
if (uom && frappe.meta.has_field(row.doctype, this.uom_field)) {
await frappe.model.set_value(row.doctype, row.name, this.uom_field, uom);
}
}
- async set_batch_no(row, batch_no) {
- if (batch_no && frappe.meta.has_field(row.doctype, this.batch_no_field)) {
- await frappe.model.set_value(row.doctype, row.name, this.batch_no_field, batch_no);
- }
- }
-
async set_barcode(row, barcode) {
if (barcode && frappe.meta.has_field(row.doctype, this.barcode_field)) {
await frappe.model.set_value(row.doctype, row.name, this.barcode_field, barcode);
@@ -379,13 +475,52 @@ erpnext.utils.BarcodeScanner = class BarcodeScanner {
}
}
- is_duplicate_serial_no(row, serial_no) {
- const is_duplicate = row[this.serial_no_field]?.includes(serial_no);
+ is_duplicate_serial_no(row, item_code, serial_no) {
+ if (this.frm.is_new() || !row.serial_and_batch_bundle) {
+ let is_duplicate = this.check_duplicate_serial_no_in_localstorage(item_code, serial_no);
+ if (is_duplicate) {
+ this.show_alert(__("Serial No {0} is already added", [serial_no]), "orange");
+ }
- if (is_duplicate) {
- this.show_alert(__("Serial No {0} is already added", [serial_no]), "orange");
+ return is_duplicate;
+ } else if (row.serial_and_batch_bundle) {
+ this.check_duplicate_serial_no_in_db(row, serial_no, (r) => {
+ if (r.message) {
+ this.show_alert(__("Serial No {0} is already added", [serial_no]), "orange");
+ }
+
+ return r.message;
+ })
}
- return is_duplicate;
+ }
+
+ async check_duplicate_serial_no_in_db(row, serial_no, response) {
+ frappe.call({
+ method: "erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle.is_duplicate_serial_no",
+ args: {
+ serial_no: serial_no,
+ bundle_id: row.serial_and_batch_bundle
+ },
+ callback(r) {
+ response(r);
+ }
+ })
+ }
+
+ check_duplicate_serial_no_in_localstorage(item_code, serial_no) {
+ let docname = this.frm.doc.name
+ let entries = JSON.parse(localStorage.getItem(docname));
+
+ if (!entries) {
+ return false;
+ }
+
+ let existing_row = [];
+ if (entries[item_code]) {
+ existing_row = entries[item_code].filter((e) => e.serial_no === serial_no);
+ }
+
+ return existing_row.length;
}
get_row_to_modify_on_scan(item_code, batch_no, uom, barcode) {
diff --git a/erpnext/public/js/utils/dimension_tree_filter.js b/erpnext/public/js/utils/dimension_tree_filter.js
index bb23f1512b..3f70c09f66 100644
--- a/erpnext/public/js/utils/dimension_tree_filter.js
+++ b/erpnext/public/js/utils/dimension_tree_filter.js
@@ -16,6 +16,8 @@ erpnext.accounts.dimensions = {
},
callback: function(r) {
me.accounting_dimensions = r.message[0];
+ // Ignoring "Project" as it is already handled specifically in Sales Order and Delivery Note
+ me.accounting_dimensions = me.accounting_dimensions.filter(x=>{return x.document_type != "Project"});
me.default_dimensions = r.message[1];
me.setup_filters(frm, doctype);
}
diff --git a/erpnext/public/js/utils/sales_common.js b/erpnext/public/js/utils/sales_common.js
index 5514963c96..b92b02e826 100644
--- a/erpnext/public/js/utils/sales_common.js
+++ b/erpnext/public/js/utils/sales_common.js
@@ -184,6 +184,12 @@ erpnext.sales_common = {
refresh_field("incentives",row.name,row.parentfield);
}
+ warehouse(doc, cdt, cdn) {
+ if (doc.docstatus === 0 && doc.is_return && !doc.return_against) {
+ frappe.model.set_value(cdt, cdn, "incoming_rate", 0.0);
+ }
+ }
+
toggle_editable_price_list_rate() {
var df = frappe.meta.get_docfield(this.frm.doc.doctype + " Item", "price_list_rate", this.frm.doc.name);
var editable_price_list_rate = cint(frappe.defaults.get_default("editable_price_list_rate"));
@@ -317,9 +323,14 @@ erpnext.sales_common = {
new erpnext.SerialBatchPackageSelector(
me.frm, item, (r) => {
if (r) {
+ let qty = Math.abs(r.total_qty);
+ if (doc.is_return) {
+ qty = qty * -1;
+ }
+
frappe.model.set_value(item.doctype, item.name, {
"serial_and_batch_bundle": r.name,
- "qty": Math.abs(r.total_qty)
+ "qty": qty
});
}
}
diff --git a/erpnext/public/js/utils/serial_no_batch_selector.js b/erpnext/public/js/utils/serial_no_batch_selector.js
index 7b9cdfef2a..bf362e338e 100644
--- a/erpnext/public/js/utils/serial_no_batch_selector.js
+++ b/erpnext/public/js/utils/serial_no_batch_selector.js
@@ -32,22 +32,39 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate {
});
this.dialog.show();
-
- let qty = this.item.stock_qty || this.item.transfer_qty || this.item.qty;
- this.dialog.set_value("qty", qty).then(() => {
- if (this.item.serial_no) {
- this.dialog.set_value("scan_serial_no", this.item.serial_no);
- frappe.model.set_value(this.item.doctype, this.item.name, 'serial_no', '');
- } else if (this.item.batch_no) {
- this.dialog.set_value("scan_batch_no", this.item.batch_no);
- frappe.model.set_value(this.item.doctype, this.item.name, 'batch_no', '');
- }
-
- this.dialog.fields_dict.entries.grid.refresh();
- });
-
this.$scan_btn = this.dialog.$wrapper.find(".link-btn");
this.$scan_btn.css("display", "inline");
+
+ let qty = this.item.stock_qty || this.item.transfer_qty || this.item.qty;
+
+ if (this.item?.is_rejected) {
+ qty = this.item.rejected_qty;
+ }
+
+ qty = Math.abs(qty);
+ if (qty > 0) {
+ this.dialog.set_value("qty", qty).then(() => {
+ if (this.item.serial_no && !this.item.serial_and_batch_bundle) {
+ let serial_nos = this.item.serial_no.split('\n');
+ if (serial_nos.length > 1) {
+ serial_nos.forEach(serial_no => {
+ this.dialog.fields_dict.entries.df.data.push({
+ serial_no: serial_no,
+ batch_no: this.item.batch_no
+ });
+ });
+ } else {
+ this.dialog.set_value("scan_serial_no", this.item.serial_no);
+ }
+ frappe.model.set_value(this.item.doctype, this.item.name, 'serial_no', '');
+ } else if (this.item.batch_no && !this.item.serial_and_batch_bundle) {
+ this.dialog.set_value("scan_batch_no", this.item.batch_no);
+ frappe.model.set_value(this.item.doctype, this.item.name, 'batch_no', '');
+ }
+
+ this.dialog.fields_dict.entries.grid.refresh();
+ });
+ }
}
get_serial_no_filters() {
@@ -320,16 +337,18 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate {
}
get_auto_data() {
+ let { qty, based_on } = this.dialog.get_values();
+
if (this.item.serial_and_batch_bundle || this.item.rejected_serial_and_batch_bundle) {
- return;
+ if (qty === this.qty) {
+ return;
+ }
}
if (this.item.serial_no || this.item.batch_no) {
return;
}
- let { qty, based_on } = this.dialog.get_values();
-
if (!based_on) {
based_on = 'FIFO';
}
@@ -467,13 +486,13 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate {
}
render_data() {
- if (!this.frm.is_new() && this.bundle) {
+ if (this.bundle) {
frappe.call({
method: 'erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle.get_serial_batch_ledgers',
args: {
item_code: this.item.item_code,
name: this.bundle,
- voucher_no: this.item.parent,
+ voucher_no: !this.frm.is_new() ? this.item.parent : "",
}
}).then(r => {
if (r.message) {
@@ -485,6 +504,7 @@ erpnext.SerialBatchPackageSelector = class SerialNoBatchBundleUpdate {
set_data(data) {
data.forEach(d => {
+ d.qty = Math.abs(d.qty);
this.dialog.fields_dict.entries.df.data.push(d);
});
diff --git a/erpnext/regional/united_arab_emirates/utils.py b/erpnext/regional/united_arab_emirates/utils.py
index efeaeed324..3e9f76132c 100644
--- a/erpnext/regional/united_arab_emirates/utils.py
+++ b/erpnext/regional/united_arab_emirates/utils.py
@@ -25,7 +25,7 @@ def update_itemised_tax_data(doc):
# dont even bother checking in item tax template as it contains both input and output accounts - double the tax rate
item_code = row.item_code or row.item_name
if itemised_tax.get(item_code):
- for tax in itemised_tax.get(row.item_code).values():
+ for tax in itemised_tax.get(item_code).values():
_tax_rate = flt(tax.get("tax_rate", 0), row.precision("tax_rate"))
tax_amount += flt((row.net_amount * _tax_rate) / 100, row.precision("tax_amount"))
tax_rate += _tax_rate
@@ -153,7 +153,9 @@ def make_gl_entry(tax, gl_entries, doc, tax_accounts):
"account": tax.account_head,
"cost_center": tax.cost_center,
"posting_date": doc.posting_date,
+ "against_type": "Supplier",
"against": doc.supplier,
+ "against_link": doc.supplier,
dr_or_cr: tax.base_tax_amount_after_discount_amount,
dr_or_cr + "_in_account_currency": tax.base_tax_amount_after_discount_amount
if account_currency == doc.company_currency
diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json
index 31bbbcf51b..db712d96b5 100644
--- a/erpnext/selling/doctype/customer/customer.json
+++ b/erpnext/selling/doctype/customer/customer.json
@@ -448,7 +448,6 @@
"report_hide": 1
},
{
- "default": "0",
"fieldname": "credit_limits",
"fieldtype": "Table",
"label": "Credit Limit",
@@ -584,7 +583,7 @@
"link_fieldname": "party"
}
],
- "modified": "2023-10-19 16:56:27.327035",
+ "modified": "2023-12-28 13:15:36.298369",
"modified_by": "Administrator",
"module": "Selling",
"name": "Customer",
diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py
index 00b79e3aad..ab74f7f738 100644
--- a/erpnext/selling/doctype/quotation/quotation.py
+++ b/erpnext/selling/doctype/quotation/quotation.py
@@ -370,15 +370,16 @@ def _make_sales_order(source_name, target_doc=None, customer_group=None, ignore_
)
# sales team
- for d in customer.get("sales_team") or []:
- target.append(
- "sales_team",
- {
- "sales_person": d.sales_person,
- "allocated_percentage": d.allocated_percentage or None,
- "commission_rate": d.commission_rate,
- },
- )
+ if not target.get("sales_team"):
+ for d in customer.get("sales_team") or []:
+ target.append(
+ "sales_team",
+ {
+ "sales_person": d.sales_person,
+ "allocated_percentage": d.allocated_percentage or None,
+ "commission_rate": d.commission_rate,
+ },
+ )
target.flags.ignore_permissions = ignore_permissions
target.delivery_date = nowdate()
diff --git a/erpnext/selling/doctype/quotation/test_quotation.py b/erpnext/selling/doctype/quotation/test_quotation.py
index 590cd3d0cf..ecb7d097b8 100644
--- a/erpnext/selling/doctype/quotation/test_quotation.py
+++ b/erpnext/selling/doctype/quotation/test_quotation.py
@@ -5,10 +5,22 @@ import frappe
from frappe.tests.utils import FrappeTestCase
from frappe.utils import add_days, add_months, flt, getdate, nowdate
+from erpnext.controllers.accounts_controller import InvalidQtyError
+
test_dependencies = ["Product Bundle"]
class TestQuotation(FrappeTestCase):
+ def test_quotation_qty(self):
+ qo = make_quotation(qty=0, do_not_save=True)
+ with self.assertRaises(InvalidQtyError):
+ qo.save()
+
+ # No error with qty=1
+ qo.items[0].qty = 1
+ qo.save()
+ self.assertEqual(qo.items[0].qty, 1)
+
def test_make_quotation_without_terms(self):
quotation = make_quotation(do_not_save=1)
self.assertFalse(quotation.get("payment_schedule"))
@@ -629,7 +641,7 @@ def make_quotation(**args):
{
"item_code": args.item or args.item_code or "_Test Item",
"warehouse": args.warehouse,
- "qty": args.qty or 10,
+ "qty": args.qty if args.qty is not None else 10,
"uom": args.uom or None,
"rate": args.rate or 100,
},
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index 97b214e33e..b206e3fe33 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -182,7 +182,7 @@ frappe.ui.form.on("Sales Order", {
create_stock_reservation_entries(frm) {
const dialog = new frappe.ui.Dialog({
title: __("Stock Reservation"),
- size: "large",
+ size: "extra-large",
fields: [
{
fieldname: "set_warehouse",
@@ -207,6 +207,50 @@ frappe.ui.form.on("Sales Order", {
},
},
{fieldtype: "Column Break"},
+ {
+ fieldname: "add_item",
+ fieldtype: "Link",
+ label: __("Add Item"),
+ options: "Sales Order Item",
+ get_query: () => {
+ return {
+ query: "erpnext.controllers.queries.get_filtered_child_rows",
+ filters: {
+ "parenttype": frm.doc.doctype,
+ "parent": frm.doc.name,
+ "reserve_stock": 1,
+ }
+ }
+ },
+ onchange: () => {
+ let sales_order_item = dialog.get_value("add_item");
+
+ if (sales_order_item) {
+ frm.doc.items.forEach(item => {
+ if (item.name === sales_order_item) {
+ let unreserved_qty = (flt(item.stock_qty) - (item.stock_reserved_qty ? flt(item.stock_reserved_qty) : (flt(item.delivered_qty) * flt(item.conversion_factor)))) / flt(item.conversion_factor);
+
+ if (unreserved_qty > 0) {
+ dialog.fields_dict.items.df.data.forEach((row) => {
+ if (row.sales_order_item === sales_order_item) {
+ unreserved_qty -= row.qty_to_reserve;
+ }
+ });
+ }
+
+ dialog.fields_dict.items.df.data.push({
+ 'sales_order_item': item.name,
+ 'item_code': item.item_code,
+ 'warehouse': dialog.get_value("set_warehouse") || item.warehouse,
+ 'qty_to_reserve': Math.max(unreserved_qty, 0)
+ });
+ dialog.fields_dict.items.grid.refresh();
+ dialog.set_value("add_item", undefined);
+ }
+ });
+ }
+ },
+ },
{fieldtype: "Section Break"},
{
fieldname: "items",
@@ -218,10 +262,34 @@ frappe.ui.form.on("Sales Order", {
fields: [
{
fieldname: "sales_order_item",
- fieldtype: "Data",
+ fieldtype: "Link",
label: __("Sales Order Item"),
+ options: "Sales Order Item",
reqd: 1,
- read_only: 1,
+ in_list_view: 1,
+ get_query: () => {
+ return {
+ query: "erpnext.controllers.queries.get_filtered_child_rows",
+ filters: {
+ "parenttype": frm.doc.doctype,
+ "parent": frm.doc.name,
+ "reserve_stock": 1,
+ }
+ }
+ },
+ onchange: (event) => {
+ if (event) {
+ let name = $(event.currentTarget).closest(".grid-row").attr("data-name");
+ let item_row = dialog.fields_dict.items.grid.grid_rows_by_docname[name].doc;
+
+ frm.doc.items.forEach(item => {
+ if (item.name === item_row.sales_order_item) {
+ item_row.item_code = item.item_code;
+ }
+ });
+ dialog.fields_dict.items.grid.refresh();
+ }
+ }
},
{
fieldname: "item_code",
@@ -284,14 +352,14 @@ frappe.ui.form.on("Sales Order", {
frm.doc.items.forEach(item => {
if (item.reserve_stock) {
- let unreserved_qty = (flt(item.stock_qty) - (item.stock_reserved_qty ? flt(item.stock_reserved_qty) : (flt(item.delivered_qty) * flt(item.conversion_factor))))
+ let unreserved_qty = (flt(item.stock_qty) - (item.stock_reserved_qty ? flt(item.stock_reserved_qty) : (flt(item.delivered_qty) * flt(item.conversion_factor)))) / flt(item.conversion_factor);
if (unreserved_qty > 0) {
dialog.fields_dict.items.df.data.push({
'sales_order_item': item.name,
'item_code': item.item_code,
'warehouse': item.warehouse,
- 'qty_to_reserve': (unreserved_qty / flt(item.conversion_factor))
+ 'qty_to_reserve': unreserved_qty
});
}
}
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index 09941eaa82..95423612c8 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -582,17 +582,17 @@ class SalesOrder(SellingController):
def set_indicator(self):
"""Set indicator for portal"""
- if self.per_billed < 100 and self.per_delivered < 100:
- self.indicator_color = "orange"
- self.indicator_title = _("Not Paid and Not Delivered")
+ self.indicator_color = {
+ "Draft": "red",
+ "On Hold": "orange",
+ "To Deliver and Bill": "orange",
+ "To Bill": "orange",
+ "To Deliver": "orange",
+ "Completed": "green",
+ "Cancelled": "red",
+ }.get(self.status, "blue")
- elif self.per_billed == 100 and self.per_delivered < 100:
- self.indicator_color = "orange"
- self.indicator_title = _("Paid and Not Delivered")
-
- else:
- self.indicator_color = "green"
- self.indicator_title = _("Paid")
+ self.indicator_title = _(self.status)
def on_recurring(self, reference_doc, auto_repeat_doc):
def _get_delivery_date(ref_doc_delivery_date, red_doc_transaction_date, transaction_date):
diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py
index a518597aa6..ac7fdb1b45 100644
--- a/erpnext/selling/doctype/sales_order/test_sales_order.py
+++ b/erpnext/selling/doctype/sales_order/test_sales_order.py
@@ -9,7 +9,7 @@ from frappe.core.doctype.user_permission.test_user_permission import create_user
from frappe.tests.utils import FrappeTestCase, change_settings
from frappe.utils import add_days, flt, getdate, nowdate, today
-from erpnext.controllers.accounts_controller import update_child_qty_rate
+from erpnext.controllers.accounts_controller import InvalidQtyError, update_child_qty_rate
from erpnext.maintenance.doctype.maintenance_schedule.test_maintenance_schedule import (
make_maintenance_schedule,
)
@@ -35,8 +35,8 @@ class TestSalesOrder(FrappeTestCase):
def setUpClass(cls):
super().setUpClass()
cls.unlink_setting = int(
- frappe.db.get_value(
- "Accounts Settings", "Accounts Settings", "unlink_advance_payment_on_cancelation_of_order"
+ frappe.db.get_single_value(
+ "Accounts Settings", "unlink_advance_payment_on_cancelation_of_order"
)
)
@@ -80,6 +80,29 @@ class TestSalesOrder(FrappeTestCase):
)
update_child_qty_rate("Sales Order", trans_item, so.name)
+ def test_sales_order_qty(self):
+ so = make_sales_order(qty=1, do_not_save=True)
+
+ # NonNegativeError with qty=-1
+ so.append(
+ "items",
+ {
+ "item_code": "_Test Item",
+ "qty": -1,
+ "rate": 10,
+ },
+ )
+ self.assertRaises(frappe.NonNegativeError, so.save)
+
+ # InvalidQtyError with qty=0
+ so.items[1].qty = 0
+ self.assertRaises(InvalidQtyError, so.save)
+
+ # No error with qty=1
+ so.items[1].qty = 1
+ so.save()
+ self.assertEqual(so.items[0].qty, 1)
+
def test_make_material_request(self):
so = make_sales_order(do_not_submit=True)
@@ -2015,7 +2038,7 @@ def make_sales_order(**args):
{
"item_code": args.item or args.item_code or "_Test Item",
"warehouse": args.warehouse,
- "qty": args.qty or 10,
+ "qty": args.qty if args.qty is not None else 10,
"uom": args.uom or None,
"price_list_rate": args.price_list_rate or None,
"discount_percentage": args.discount_percentage or None,
diff --git a/erpnext/selling/page/point_of_sale/pos_item_cart.js b/erpnext/selling/page/point_of_sale/pos_item_cart.js
index 193048f676..bd8579203c 100644
--- a/erpnext/selling/page/point_of_sale/pos_item_cart.js
+++ b/erpnext/selling/page/point_of_sale/pos_item_cart.js
@@ -520,7 +520,7 @@ erpnext.PointOfSale.ItemCart = class {
}
render_taxes(taxes) {
- if (taxes.length) {
+ if (taxes && taxes.length) {
const currency = this.events.get_frm().doc.currency;
const taxes_html = taxes.map(t => {
if (t.tax_amount_after_discount_amount == 0.0) return;
diff --git a/erpnext/selling/report/customer_credit_balance/customer_credit_balance.py b/erpnext/selling/report/customer_credit_balance/customer_credit_balance.py
index 98633cb719..a584d3ae53 100644
--- a/erpnext/selling/report/customer_credit_balance/customer_credit_balance.py
+++ b/erpnext/selling/report/customer_credit_balance/customer_credit_balance.py
@@ -13,7 +13,7 @@ def execute(filters=None):
if not filters:
filters = {}
# Check if customer id is according to naming series or customer name
- customer_naming_type = frappe.db.get_value("Selling Settings", None, "cust_master_name")
+ customer_naming_type = frappe.db.get_single_value("Selling Settings", "cust_master_name")
columns = get_columns(customer_naming_type)
data = []
diff --git a/erpnext/selling/report/customer_wise_item_price/customer_wise_item_price.py b/erpnext/selling/report/customer_wise_item_price/customer_wise_item_price.py
index a58f40362b..40aa9acc3c 100644
--- a/erpnext/selling/report/customer_wise_item_price/customer_wise_item_price.py
+++ b/erpnext/selling/report/customer_wise_item_price/customer_wise_item_price.py
@@ -3,11 +3,11 @@
import frappe
-from frappe import _
+from frappe import _, qb
+from frappe.query_builder import Criterion
from erpnext import get_default_company
from erpnext.accounts.party import get_party_details
-from erpnext.stock.get_item_details import get_price_list_rate_for
def execute(filters=None):
@@ -50,6 +50,42 @@ def get_columns(filters=None):
]
+def fetch_item_prices(
+ customer: str = None, price_list: str = None, selling_price_list: str = None, items: list = None
+):
+ price_list_map = frappe._dict()
+ ip = qb.DocType("Item Price")
+ and_conditions = []
+ or_conditions = []
+ if items:
+ and_conditions.append(ip.item_code.isin([x.item_code for x in items]))
+ and_conditions.append(ip.selling == True)
+
+ or_conditions.append(ip.customer == None)
+ or_conditions.append(ip.price_list == None)
+
+ if customer:
+ or_conditions.append(ip.customer == customer)
+
+ if price_list:
+ or_conditions.append(ip.price_list == price_list)
+
+ if selling_price_list:
+ or_conditions.append(ip.price_list == selling_price_list)
+
+ res = (
+ qb.from_(ip)
+ .select(ip.item_code, ip.price_list, ip.price_list_rate)
+ .where(Criterion.all(and_conditions))
+ .where(Criterion.any(or_conditions))
+ .run(as_dict=True)
+ )
+ for x in res:
+ price_list_map.update({(x.item_code, x.price_list): x.price_list_rate})
+
+ return price_list_map
+
+
def get_data(filters=None):
data = []
customer_details = get_customer_details(filters)
@@ -59,9 +95,17 @@ def get_data(filters=None):
"Bin", fields=["item_code", "sum(actual_qty) AS available"], group_by="item_code"
)
item_stock_map = {item.item_code: item.available for item in item_stock_map}
+ price_list_map = fetch_item_prices(
+ customer_details.customer,
+ customer_details.price_list,
+ customer_details.selling_price_list,
+ items,
+ )
for item in items:
- price_list_rate = get_price_list_rate_for(customer_details, item.item_code) or 0.0
+ price_list_rate = price_list_map.get(
+ (item.item_code, customer_details.price_list or customer_details.selling_price_list), 0.0
+ )
available_stock = item_stock_map.get(item.item_code)
data.append(
diff --git a/erpnext/setup/demo.py b/erpnext/setup/demo.py
index 926283ff1c..df2c49b2b6 100644
--- a/erpnext/setup/demo.py
+++ b/erpnext/setup/demo.py
@@ -112,9 +112,9 @@ def create_transaction(doctype, company, start_date):
warehouse = get_warehouse(company)
if document_type == "Purchase Order":
- posting_date = get_random_date(start_date, 1, 30)
+ posting_date = get_random_date(start_date, 1, 25)
else:
- posting_date = get_random_date(start_date, 31, 364)
+ posting_date = get_random_date(start_date, 31, 350)
doctype.update(
{
@@ -149,6 +149,11 @@ def convert_order_to_invoices():
invoice.set_posting_time = 1
invoice.posting_date = order.transaction_date
invoice.due_date = order.transaction_date
+ invoice.bill_date = order.transaction_date
+
+ if invoice.get("payment_schedule"):
+ invoice.payment_schedule[0].due_date = order.transaction_date
+
invoice.update_stock = 1
invoice.submit()
diff --git a/erpnext/setup/demo_data/journal_entry.json b/erpnext/setup/demo_data/journal_entry.json
index b751c7cf24..a681be4f5b 100644
--- a/erpnext/setup/demo_data/journal_entry.json
+++ b/erpnext/setup/demo_data/journal_entry.json
@@ -4,22 +4,22 @@
"cheque_no": "33",
"doctype": "Journal Entry",
"accounts": [
- {
- "party_type": "Customer",
- "party": "ABC Enterprises",
- "credit_in_account_currency": 40000.0,
- "debit_in_account_currency": 0.0,
- "doctype": "Journal Entry Account",
- "parentfield": "accounts",
- },
- {
- "credit_in_account_currency": 0.0,
- "debit_in_account_currency": 40000.0,
- "doctype": "Journal Entry Account",
- "parentfield": "accounts",
- }
+ {
+ "party_type": "Customer",
+ "party": "ABC Enterprises",
+ "credit_in_account_currency": 40000.0,
+ "debit_in_account_currency": 0.0,
+ "doctype": "Journal Entry Account",
+ "parentfield": "accounts"
+ },
+ {
+ "credit_in_account_currency": 0.0,
+ "debit_in_account_currency": 40000.0,
+ "doctype": "Journal Entry Account",
+ "parentfield": "accounts"
+ }
],
"user_remark": "test",
"voucher_type": "Bank Entry"
}
-]
\ No newline at end of file
+]
diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py
index 0e8ee2dda4..ec953b885e 100644
--- a/erpnext/setup/doctype/company/company.py
+++ b/erpnext/setup/doctype/company/company.py
@@ -249,7 +249,7 @@ class Company(NestedSet):
if frappe.flags.parent_company_changed:
from frappe.utils.nestedset import rebuild_tree
- rebuild_tree("Company", "parent_company")
+ rebuild_tree("Company")
frappe.clear_cache()
@@ -274,7 +274,7 @@ class Company(NestedSet):
"parent_warehouse": "{0} - {1}".format(_("All Warehouses"), self.abbr)
if not wh_detail["is_group"]
else "",
- "warehouse_type": wh_detail["warehouse_type"] if "warehouse_type" in wh_detail else None,
+ "warehouse_type": wh_detail.get("warehouse_type"),
}
)
warehouse.flags.ignore_permissions = True
@@ -397,7 +397,7 @@ class Company(NestedSet):
frappe.local.flags.ignore_update_nsm = True
make_records(records)
frappe.local.flags.ignore_update_nsm = False
- rebuild_tree("Department", "parent_department")
+ rebuild_tree("Department")
def validate_coa_input(self):
if self.create_chart_of_accounts_based_on == "Existing Company":
diff --git a/erpnext/setup/doctype/customer_group/customer_group.js b/erpnext/setup/doctype/customer_group/customer_group.js
index 3c81b0283c..e3528189dc 100644
--- a/erpnext/setup/doctype/customer_group/customer_group.js
+++ b/erpnext/setup/doctype/customer_group/customer_group.js
@@ -1,21 +1,6 @@
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
-
-cur_frm.cscript.refresh = function(doc, cdt, cdn) {
- cur_frm.cscript.set_root_readonly(doc);
-}
-
-cur_frm.cscript.set_root_readonly = function(doc) {
- // read-only for root customer group
- if(!doc.parent_customer_group && !doc.__islocal) {
- cur_frm.set_read_only();
- cur_frm.set_intro(__("This is a root customer group and cannot be edited."));
- } else {
- cur_frm.set_intro(null);
- }
-}
-
frappe.ui.form.on("Customer Group", {
setup: function(frm){
frm.set_query('parent_customer_group', function (doc) {
@@ -48,5 +33,17 @@ frappe.ui.form.on("Customer Group", {
}
}
});
- }
+ },
+ refresh: function(frm) {
+ frm.trigger("set_root_readonly");
+ },
+ set_root_readonly: function(frm) {
+ // read-only for root customer group
+ if(!frm.doc.parent_customer_group && !frm.doc.__islocal) {
+ frm.set_read_only();
+ frm.set_intro(__("This is a root customer group and cannot be edited."));
+ } else {
+ frm.set_intro(null);
+ }
+ },
});
diff --git a/erpnext/setup/doctype/department/department.py b/erpnext/setup/doctype/department/department.py
index 16f6fbfba4..b36f032d4c 100644
--- a/erpnext/setup/doctype/department/department.py
+++ b/erpnext/setup/doctype/department/department.py
@@ -69,7 +69,9 @@ def get_abbreviated_name(name, company):
@frappe.whitelist()
-def get_children(doctype, parent=None, company=None, is_root=False):
+def get_children(doctype, parent=None, company=None, is_root=False, include_disabled=False):
+ if isinstance(include_disabled, str):
+ include_disabled = frappe.json.loads(include_disabled)
fields = ["name as value", "is_group as expandable"]
filters = {}
@@ -81,6 +83,9 @@ def get_children(doctype, parent=None, company=None, is_root=False):
else:
filters["parent_department"] = parent
+ if frappe.db.has_column(doctype, "disabled") and not include_disabled:
+ filters["disabled"] = False
+
return frappe.get_all("Department", fields=fields, filters=filters, order_by="name")
diff --git a/erpnext/setup/doctype/employee/employee.json b/erpnext/setup/doctype/employee/employee.json
index 1143ccb7b1..daf2df5a59 100644
--- a/erpnext/setup/doctype/employee/employee.json
+++ b/erpnext/setup/doctype/employee/employee.json
@@ -616,8 +616,8 @@
"fieldname": "relieving_date",
"fieldtype": "Date",
"label": "Relieving Date",
- "no_copy": 1,
"mandatory_depends_on": "eval:doc.status == \"Left\"",
+ "no_copy": 1,
"oldfieldname": "relieving_date",
"oldfieldtype": "Date"
},
@@ -822,12 +822,14 @@
"icon": "fa fa-user",
"idx": 24,
"image_field": "image",
+ "is_tree": 1,
"links": [],
- "modified": "2023-10-04 10:57:05.174592",
+ "modified": "2024-01-03 17:36:20.984421",
"modified_by": "Administrator",
"module": "Setup",
"name": "Employee",
"naming_rule": "By \"Naming Series\" field",
+ "nsm_parent_field": "reports_to",
"owner": "Administrator",
"permissions": [
{
@@ -860,7 +862,6 @@
"read": 1,
"report": 1,
"role": "HR Manager",
- "set_user_permissions": 1,
"share": 1,
"write": 1
}
@@ -871,4 +872,4 @@
"sort_order": "DESC",
"states": [],
"title_field": "employee_name"
-}
+}
\ No newline at end of file
diff --git a/erpnext/setup/doctype/item_group/test_item_group.py b/erpnext/setup/doctype/item_group/test_item_group.py
index 11bc9b92c1..d95199d151 100644
--- a/erpnext/setup/doctype/item_group/test_item_group.py
+++ b/erpnext/setup/doctype/item_group/test_item_group.py
@@ -79,7 +79,7 @@ class TestItem(unittest.TestCase):
group_b.save()
def test_rebuild_tree(self):
- rebuild_tree("Item Group", "parent_item_group")
+ rebuild_tree("Item Group")
self.test_basic_tree()
def move_it_back(self):
diff --git a/erpnext/setup/doctype/sales_person/sales_person.js b/erpnext/setup/doctype/sales_person/sales_person.js
index d86a8f3d98..f0d9aa87bc 100644
--- a/erpnext/setup/doctype/sales_person/sales_person.js
+++ b/erpnext/setup/doctype/sales_person/sales_person.js
@@ -11,6 +11,7 @@ frappe.ui.form.on('Sales Person', {
frm.dashboard.add_indicator(__('Total Contribution Amount Against Invoices: {0}',
[format_currency(info.allocated_amount_against_invoice, info.currency)]), 'blue');
}
+ frm.trigger("set_root_readonly");
},
setup: function(frm) {
@@ -27,22 +28,18 @@ frappe.ui.form.on('Sales Person', {
'Sales Order': () => frappe.new_doc("Sales Order")
.then(() => frm.add_child("sales_team", {"sales_person": frm.doc.name}))
}
+ },
+ set_root_readonly: function(frm) {
+ // read-only for root
+ if(!frm.doc.parent_sales_person && !frm.doc.__islocal) {
+ frm.set_read_only();
+ frm.set_intro(__("This is a root sales person and cannot be edited."));
+ } else {
+ frm.set_intro(null);
+ }
}
});
-cur_frm.cscript.refresh = function(doc, cdt, cdn) {
- cur_frm.cscript.set_root_readonly(doc);
-}
-
-cur_frm.cscript.set_root_readonly = function(doc) {
- // read-only for root
- if(!doc.parent_sales_person && !doc.__islocal) {
- cur_frm.set_read_only();
- cur_frm.set_intro(__("This is a root sales person and cannot be edited."));
- } else {
- cur_frm.set_intro(null);
- }
-}
//get query select sales person
cur_frm.fields_dict['parent_sales_person'].get_query = function(doc, cdt, cdn) {
diff --git a/erpnext/setup/doctype/supplier_group/supplier_group.js b/erpnext/setup/doctype/supplier_group/supplier_group.js
index 33629297ff..c697a99cb4 100644
--- a/erpnext/setup/doctype/supplier_group/supplier_group.js
+++ b/erpnext/setup/doctype/supplier_group/supplier_group.js
@@ -1,21 +1,6 @@
// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
// For license information, please see license.txt
-cur_frm.cscript.refresh = function(doc) {
- cur_frm.set_intro(doc.__islocal ? "" : __("There is nothing to edit."));
- cur_frm.cscript.set_root_readonly(doc);
-};
-
-cur_frm.cscript.set_root_readonly = function(doc) {
- // read-only for root customer group
- if(!doc.parent_supplier_group && !doc.__islocal) {
- cur_frm.set_read_only();
- cur_frm.set_intro(__("This is a root supplier group and cannot be edited."));
- } else {
- cur_frm.set_intro(null);
- }
-};
-
frappe.ui.form.on("Supplier Group", {
setup: function(frm){
frm.set_query('parent_supplier_group', function (doc) {
@@ -48,5 +33,17 @@ frappe.ui.form.on("Supplier Group", {
}
}
});
+ },
+ refresh: function(frm) {
+ frm.set_intro(frm.doc.__islocal ? "" : __("There is nothing to edit."));
+ frm.trigger("set_root_readonly");
+ },
+ set_root_readonly: function(frm) {
+ if(!frm.doc.parent_supplier_group && !frm.doc.__islocal) {
+ frm.trigger("set_read_only");
+ frm.set_intro(__("This is a root supplier group and cannot be edited."));
+ } else {
+ frm.set_intro(null);
+ }
}
});
diff --git a/erpnext/setup/doctype/territory/territory.js b/erpnext/setup/doctype/territory/territory.js
index 3caf814c90..e11d20b7bf 100644
--- a/erpnext/setup/doctype/territory/territory.js
+++ b/erpnext/setup/doctype/territory/territory.js
@@ -11,23 +11,22 @@ frappe.ui.form.on("Territory", {
}
}
};
+ },
+ refresh: function(frm) {
+ frm.trigger("set_root_readonly");
+ },
+ set_root_readonly: function(frm) {
+ // read-only for root territory
+ if(!frm.doc.parent_territory && !frm.doc.__islocal) {
+ frm.set_read_only();
+ frm.set_intro(__("This is a root territory and cannot be edited."));
+ } else {
+ frm.set_intro(null);
+ }
}
+
});
-cur_frm.cscript.refresh = function(doc, cdt, cdn) {
- cur_frm.cscript.set_root_readonly(doc);
-}
-
-cur_frm.cscript.set_root_readonly = function(doc) {
- // read-only for root territory
- if(!doc.parent_territory && !doc.__islocal) {
- cur_frm.set_read_only();
- cur_frm.set_intro(__("This is a root territory and cannot be edited."));
- } else {
- cur_frm.set_intro(null);
- }
-}
-
//get query select territory
cur_frm.fields_dict['parent_territory'].get_query = function(doc,cdt,cdn) {
return{
diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py
index 7a1d5e284e..6239864c23 100644
--- a/erpnext/setup/install.py
+++ b/erpnext/setup/install.py
@@ -31,7 +31,6 @@ def after_install():
add_company_to_session_defaults()
add_standard_navbar_items()
add_app_name()
- hide_workspaces()
update_roles()
frappe.db.commit()
@@ -218,11 +217,6 @@ def add_app_name():
frappe.db.set_single_value("System Settings", "app_name", "ERPNext")
-def hide_workspaces():
- for ws in ["Integration", "Settings"]:
- frappe.db.set_value("Workspace", ws, "public", 0)
-
-
def update_roles():
website_user_roles = ("Customer", "Supplier")
for role in website_user_roles:
diff --git a/erpnext/setup/setup_wizard/setup_wizard.py b/erpnext/setup/setup_wizard/setup_wizard.py
index 2da107e4e9..9a49af2b10 100644
--- a/erpnext/setup/setup_wizard/setup_wizard.py
+++ b/erpnext/setup/setup_wizard/setup_wizard.py
@@ -37,11 +37,6 @@ def get_setup_stages(args=None):
{"fn": setup_defaults, "args": args, "fail_msg": _("Failed to setup defaults")},
],
},
- {
- "status": _("Setting up demo data"),
- "fail_msg": _("Failed to setup demo data"),
- "tasks": [{"fn": setup_demo, "args": args, "fail_msg": _("Failed to setup demo data")}],
- },
{
"status": _("Wrapping up"),
"fail_msg": _("Failed to login"),
diff --git a/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json b/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json
deleted file mode 100644
index 2f9cec40b0..0000000000
--- a/erpnext/setup/workspace/erpnext_settings/erpnext_settings.json
+++ /dev/null
@@ -1,500 +0,0 @@
-{
- "charts": [],
- "content": "[{\"id\":\"NO5yYHJopc\",\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\",\"col\":12}},{\"id\":\"CDxIM-WuZ9\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"System Settings\",\"col\":3}},{\"id\":\"-Uh7DKJNJX\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Accounts Settings\",\"col\":3}},{\"id\":\"K9ST9xcDXh\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Stock Settings\",\"col\":3}},{\"id\":\"27IdVHVQMb\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Selling Settings\",\"col\":3}},{\"id\":\"Rwp5zff88b\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Buying Settings\",\"col\":3}},{\"id\":\"hkfnQ2sevf\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Global Defaults\",\"col\":3}},{\"id\":\"jjxI_PDawD\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Print Settings\",\"col\":3}},{\"id\":\"R3CoYYFXye\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"yynbm1J_VO\",\"type\":\"header\",\"data\":{\"text\":\"Settings\",\"col\":12}},{\"id\":\"KDCv2MvSg3\",\"type\":\"card\",\"data\":{\"card_name\":\"Module Settings\",\"col\":4}},{\"id\":\"Q0_bqT7cxQ\",\"type\":\"card\",\"data\":{\"card_name\":\"Email / Notifications\",\"col\":4}},{\"id\":\"UnqK5haBnh\",\"type\":\"card\",\"data\":{\"card_name\":\"Website\",\"col\":4}},{\"id\":\"kp7u1H5hCd\",\"type\":\"card\",\"data\":{\"card_name\":\"Core\",\"col\":4}},{\"id\":\"Ufc3jycgy9\",\"type\":\"card\",\"data\":{\"card_name\":\"Printing\",\"col\":4}},{\"id\":\"89bSNzv3Yh\",\"type\":\"card\",\"data\":{\"card_name\":\"Workflow\",\"col\":4}}]",
- "creation": "2022-01-27 13:14:47.349433",
- "custom_blocks": [],
- "docstatus": 0,
- "doctype": "Workspace",
- "for_user": "",
- "hide_custom": 0,
- "icon": "setting",
- "idx": 0,
- "is_hidden": 0,
- "label": "ERPNext Settings",
- "links": [
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Import Data",
- "link_count": 0,
- "link_to": "Data Import",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Export Data",
- "link_count": 0,
- "link_to": "Data Export",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Bulk Update",
- "link_count": 0,
- "link_to": "Bulk Update",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Download Backups",
- "link_count": 0,
- "link_to": "backups",
- "link_type": "Page",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Deleted Documents",
- "link_count": 0,
- "link_to": "Deleted Document",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Email / Notifications",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Email Account",
- "link_count": 0,
- "link_to": "Email Account",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Email Domain",
- "link_count": 0,
- "link_to": "Email Domain",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Notification",
- "link_count": 0,
- "link_to": "Notification",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Email Template",
- "link_count": 0,
- "link_to": "Email Template",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Auto Email Report",
- "link_count": 0,
- "link_to": "Auto Email Report",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Newsletter",
- "link_count": 0,
- "link_to": "Newsletter",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Notification Settings",
- "link_count": 0,
- "link_to": "Notification Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Website",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Website Settings",
- "link_count": 0,
- "link_to": "Website Settings",
- "link_type": "DocType",
- "onboard": 1,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Website Theme",
- "link_count": 0,
- "link_to": "Website Theme",
- "link_type": "DocType",
- "onboard": 1,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Website Script",
- "link_count": 0,
- "link_to": "Website Script",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "About Us Settings",
- "link_count": 0,
- "link_to": "About Us Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Contact Us Settings",
- "link_count": 0,
- "link_to": "Contact Us Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Printing",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Print Format Builder",
- "link_count": 0,
- "link_to": "print-format-builder",
- "link_type": "Page",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Print Settings",
- "link_count": 0,
- "link_to": "Print Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Print Format",
- "link_count": 0,
- "link_to": "Print Format",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Print Style",
- "link_count": 0,
- "link_to": "Print Style",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Workflow",
- "link_count": 0,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Workflow",
- "link_count": 0,
- "link_to": "Workflow",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Workflow State",
- "link_count": 0,
- "link_to": "Workflow State",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Workflow Action",
- "link_count": 0,
- "link_to": "Workflow Action",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Core",
- "link_count": 3,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "System Settings",
- "link_count": 0,
- "link_to": "System Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "dependencies": "",
- "hidden": 0,
- "is_query_report": 0,
- "label": "Domain Settings",
- "link_count": 0,
- "link_to": "Domain Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Global Defaults",
- "link_count": 0,
- "link_to": "Global Defaults",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Module Settings",
- "link_count": 8,
- "onboard": 0,
- "type": "Card Break"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Accounts Settings",
- "link_count": 0,
- "link_to": "Accounts Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Stock Settings",
- "link_count": 0,
- "link_to": "Stock Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Selling Settings",
- "link_count": 0,
- "link_to": "Selling Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Buying Settings",
- "link_count": 0,
- "link_to": "Buying Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Manufacturing Settings",
- "link_count": 0,
- "link_to": "Manufacturing Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "CRM Settings",
- "link_count": 0,
- "link_to": "CRM Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Projects Settings",
- "link_count": 0,
- "link_to": "Projects Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- },
- {
- "hidden": 0,
- "is_query_report": 0,
- "label": "Support Settings",
- "link_count": 0,
- "link_to": "Support Settings",
- "link_type": "DocType",
- "onboard": 0,
- "type": "Link"
- }
- ],
- "modified": "2023-05-24 14:47:25.356531",
- "modified_by": "Administrator",
- "module": "Setup",
- "name": "ERPNext Settings",
- "number_cards": [],
- "owner": "Administrator",
- "parent_page": "",
- "public": 1,
- "quick_lists": [],
- "restrict_to_domain": "",
- "roles": [],
- "sequence_id": 19.0,
- "shortcuts": [
- {
- "color": "Grey",
- "doc_view": "List",
- "label": "Print Settings",
- "link_to": "Print Settings",
- "type": "DocType"
- },
- {
- "color": "Grey",
- "doc_view": "List",
- "label": "System Settings",
- "link_to": "System Settings",
- "type": "DocType"
- },
- {
- "icon": "accounting",
- "label": "Accounts Settings",
- "link_to": "Accounts Settings",
- "type": "DocType"
- },
- {
- "color": "Grey",
- "doc_view": "List",
- "label": "Global Defaults",
- "link_to": "Global Defaults",
- "type": "DocType"
- },
- {
- "icon": "stock",
- "label": "Stock Settings",
- "link_to": "Stock Settings",
- "type": "DocType"
- },
- {
- "icon": "sell",
- "label": "Selling Settings",
- "link_to": "Selling Settings",
- "type": "DocType"
- },
- {
- "icon": "buying",
- "label": "Buying Settings",
- "link_to": "Buying Settings",
- "type": "DocType"
- }
- ],
- "title": "ERPNext Settings"
- }
\ No newline at end of file
diff --git a/erpnext/setup/workspace/settings/settings.json b/erpnext/setup/workspace/settings/settings.json
new file mode 100644
index 0000000000..5d95ee5efb
--- /dev/null
+++ b/erpnext/setup/workspace/settings/settings.json
@@ -0,0 +1,500 @@
+{
+ "charts": [],
+ "content": "[{\"id\":\"NO5yYHJopc\",\"type\":\"header\",\"data\":{\"text\":\"Your Shortcuts\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\\n\\t\\t\\t\\n\\t\\t\",\"col\":12}},{\"id\":\"CDxIM-WuZ9\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"System Settings\",\"col\":3}},{\"id\":\"-Uh7DKJNJX\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Accounts Settings\",\"col\":3}},{\"id\":\"K9ST9xcDXh\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Stock Settings\",\"col\":3}},{\"id\":\"27IdVHVQMb\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Selling Settings\",\"col\":3}},{\"id\":\"Rwp5zff88b\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Buying Settings\",\"col\":3}},{\"id\":\"hkfnQ2sevf\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Global Defaults\",\"col\":3}},{\"id\":\"jjxI_PDawD\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Print Settings\",\"col\":3}},{\"id\":\"R3CoYYFXye\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"yynbm1J_VO\",\"type\":\"header\",\"data\":{\"text\":\"Settings\",\"col\":12}},{\"id\":\"KDCv2MvSg3\",\"type\":\"card\",\"data\":{\"card_name\":\"Module Settings\",\"col\":4}},{\"id\":\"Q0_bqT7cxQ\",\"type\":\"card\",\"data\":{\"card_name\":\"Email / Notifications\",\"col\":4}},{\"id\":\"UnqK5haBnh\",\"type\":\"card\",\"data\":{\"card_name\":\"Website\",\"col\":4}},{\"id\":\"kp7u1H5hCd\",\"type\":\"card\",\"data\":{\"card_name\":\"Core\",\"col\":4}},{\"id\":\"Ufc3jycgy9\",\"type\":\"card\",\"data\":{\"card_name\":\"Printing\",\"col\":4}},{\"id\":\"89bSNzv3Yh\",\"type\":\"card\",\"data\":{\"card_name\":\"Workflow\",\"col\":4}}]",
+ "creation": "2022-01-27 13:14:47.349433",
+ "custom_blocks": [],
+ "docstatus": 0,
+ "doctype": "Workspace",
+ "for_user": "",
+ "hide_custom": 0,
+ "icon": "setting",
+ "idx": 0,
+ "is_hidden": 0,
+ "label": "Settings",
+ "links": [
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Import Data",
+ "link_count": 0,
+ "link_to": "Data Import",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Export Data",
+ "link_count": 0,
+ "link_to": "Data Export",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Bulk Update",
+ "link_count": 0,
+ "link_to": "Bulk Update",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Download Backups",
+ "link_count": 0,
+ "link_to": "backups",
+ "link_type": "Page",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Deleted Documents",
+ "link_count": 0,
+ "link_to": "Deleted Document",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Email / Notifications",
+ "link_count": 0,
+ "onboard": 0,
+ "type": "Card Break"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Email Account",
+ "link_count": 0,
+ "link_to": "Email Account",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Email Domain",
+ "link_count": 0,
+ "link_to": "Email Domain",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Notification",
+ "link_count": 0,
+ "link_to": "Notification",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Email Template",
+ "link_count": 0,
+ "link_to": "Email Template",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Auto Email Report",
+ "link_count": 0,
+ "link_to": "Auto Email Report",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Newsletter",
+ "link_count": 0,
+ "link_to": "Newsletter",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Notification Settings",
+ "link_count": 0,
+ "link_to": "Notification Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Website",
+ "link_count": 0,
+ "onboard": 0,
+ "type": "Card Break"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Website Settings",
+ "link_count": 0,
+ "link_to": "Website Settings",
+ "link_type": "DocType",
+ "onboard": 1,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Website Theme",
+ "link_count": 0,
+ "link_to": "Website Theme",
+ "link_type": "DocType",
+ "onboard": 1,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Website Script",
+ "link_count": 0,
+ "link_to": "Website Script",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "About Us Settings",
+ "link_count": 0,
+ "link_to": "About Us Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Contact Us Settings",
+ "link_count": 0,
+ "link_to": "Contact Us Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Printing",
+ "link_count": 0,
+ "onboard": 0,
+ "type": "Card Break"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Print Format Builder",
+ "link_count": 0,
+ "link_to": "print-format-builder",
+ "link_type": "Page",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Print Settings",
+ "link_count": 0,
+ "link_to": "Print Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Print Format",
+ "link_count": 0,
+ "link_to": "Print Format",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Print Style",
+ "link_count": 0,
+ "link_to": "Print Style",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Workflow",
+ "link_count": 0,
+ "onboard": 0,
+ "type": "Card Break"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Workflow",
+ "link_count": 0,
+ "link_to": "Workflow",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Workflow State",
+ "link_count": 0,
+ "link_to": "Workflow State",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Workflow Action",
+ "link_count": 0,
+ "link_to": "Workflow Action",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Core",
+ "link_count": 3,
+ "onboard": 0,
+ "type": "Card Break"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "System Settings",
+ "link_count": 0,
+ "link_to": "System Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "dependencies": "",
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Domain Settings",
+ "link_count": 0,
+ "link_to": "Domain Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Global Defaults",
+ "link_count": 0,
+ "link_to": "Global Defaults",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Module Settings",
+ "link_count": 8,
+ "onboard": 0,
+ "type": "Card Break"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Accounts Settings",
+ "link_count": 0,
+ "link_to": "Accounts Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Stock Settings",
+ "link_count": 0,
+ "link_to": "Stock Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Selling Settings",
+ "link_count": 0,
+ "link_to": "Selling Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Buying Settings",
+ "link_count": 0,
+ "link_to": "Buying Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Manufacturing Settings",
+ "link_count": 0,
+ "link_to": "Manufacturing Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "CRM Settings",
+ "link_count": 0,
+ "link_to": "CRM Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Projects Settings",
+ "link_count": 0,
+ "link_to": "Projects Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ },
+ {
+ "hidden": 0,
+ "is_query_report": 0,
+ "label": "Support Settings",
+ "link_count": 0,
+ "link_to": "Support Settings",
+ "link_type": "DocType",
+ "onboard": 0,
+ "type": "Link"
+ }
+ ],
+ "modified": "2024-01-02 15:17:30.421357",
+ "modified_by": "Administrator",
+ "module": "Setup",
+ "name": "Settings",
+ "number_cards": [],
+ "owner": "Administrator",
+ "parent_page": "",
+ "public": 1,
+ "quick_lists": [],
+ "restrict_to_domain": "",
+ "roles": [],
+ "sequence_id": 19.0,
+ "shortcuts": [
+ {
+ "color": "Grey",
+ "doc_view": "List",
+ "label": "Print Settings",
+ "link_to": "Print Settings",
+ "type": "DocType"
+ },
+ {
+ "color": "Grey",
+ "doc_view": "List",
+ "label": "System Settings",
+ "link_to": "System Settings",
+ "type": "DocType"
+ },
+ {
+ "icon": "accounting",
+ "label": "Accounts Settings",
+ "link_to": "Accounts Settings",
+ "type": "DocType"
+ },
+ {
+ "color": "Grey",
+ "doc_view": "List",
+ "label": "Global Defaults",
+ "link_to": "Global Defaults",
+ "type": "DocType"
+ },
+ {
+ "icon": "stock",
+ "label": "Stock Settings",
+ "link_to": "Stock Settings",
+ "type": "DocType"
+ },
+ {
+ "icon": "sell",
+ "label": "Selling Settings",
+ "link_to": "Selling Settings",
+ "type": "DocType"
+ },
+ {
+ "icon": "buying",
+ "label": "Buying Settings",
+ "link_to": "Buying Settings",
+ "type": "DocType"
+ }
+ ],
+ "title": "Settings"
+}
\ No newline at end of file
diff --git a/erpnext/startup/boot.py b/erpnext/startup/boot.py
index 4b4d14f89e..d2be1a0242 100644
--- a/erpnext/startup/boot.py
+++ b/erpnext/startup/boot.py
@@ -9,8 +9,6 @@ from frappe.utils import cint
def boot_session(bootinfo):
"""boot session - send website info if guest"""
- bootinfo.custom_css = frappe.db.get_value("Style Settings", None, "custom_css") or ""
-
if frappe.session["user"] != "Guest":
update_page_info(bootinfo)
diff --git a/erpnext/stock/__init__.py b/erpnext/stock/__init__.py
index 45bf012be8..bd16d69df7 100644
--- a/erpnext/stock/__init__.py
+++ b/erpnext/stock/__init__.py
@@ -59,7 +59,7 @@ def get_warehouse_account(warehouse, warehouse_account=None):
else:
from frappe.utils.nestedset import rebuild_tree
- rebuild_tree("Warehouse", "parent_warehouse")
+ rebuild_tree("Warehouse")
else:
account = frappe.db.sql(
"""
diff --git a/erpnext/stock/doctype/bin/bin.json b/erpnext/stock/doctype/bin/bin.json
index 312470d50e..10d9511357 100644
--- a/erpnext/stock/doctype/bin/bin.json
+++ b/erpnext/stock/doctype/bin/bin.json
@@ -52,8 +52,7 @@
"oldfieldtype": "Link",
"options": "Item",
"read_only": 1,
- "reqd": 1,
- "search_index": 1
+ "reqd": 1
},
{
"default": "0.00",
diff --git a/erpnext/stock/doctype/closing_stock_balance/closing_stock_balance.py b/erpnext/stock/doctype/closing_stock_balance/closing_stock_balance.py
index 7db8522f63..1c7018366a 100644
--- a/erpnext/stock/doctype/closing_stock_balance/closing_stock_balance.py
+++ b/erpnext/stock/doctype/closing_stock_balance/closing_stock_balance.py
@@ -65,7 +65,7 @@ class ClosingStockBalance(Document):
& (
(table.from_date.between(self.from_date, self.to_date))
| (table.to_date.between(self.from_date, self.to_date))
- | (table.from_date >= self.from_date and table.to_date <= self.to_date)
+ | (table.from_date >= self.from_date and table.to_date >= self.to_date)
)
)
)
@@ -149,6 +149,4 @@ def prepare_closing_stock_balance(name):
doc.db_set("status", "Completed")
except Exception as e:
doc.db_set("status", "Failed")
- traceback = frappe.get_traceback()
-
- frappe.log_error("Closing Stock Balance Failed", traceback, doc.doctype, doc.name)
+ doc.log_error(title="Closing Stock Balance Failed")
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json
index b85f296d0b..7873d3e6de 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.json
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.json
@@ -301,7 +301,8 @@
"no_copy": 1,
"options": "Delivery Note",
"print_hide": 1,
- "read_only": 1
+ "read_only": 1,
+ "search_index": 1
},
{
"collapsible": 1,
@@ -1401,7 +1402,7 @@
"idx": 146,
"is_submittable": 1,
"links": [],
- "modified": "2023-09-04 14:15:28.363184",
+ "modified": "2023-12-18 17:19:39.368239",
"modified_by": "Administrator",
"module": "Stock",
"name": "Delivery Note",
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index a101bdf244..7d7b0cd476 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -311,11 +311,13 @@ class DeliveryNote(SellingController):
)
def set_serial_and_batch_bundle_from_pick_list(self):
+ from erpnext.stock.serial_batch_bundle import SerialBatchCreation
+
if not self.pick_list:
return
for item in self.items:
- if item.pick_list_item:
+ if item.pick_list_item and not item.serial_and_batch_bundle:
filters = {
"item_code": item.item_code,
"voucher_type": "Pick List",
@@ -326,7 +328,17 @@ class DeliveryNote(SellingController):
bundle_id = frappe.db.get_value("Serial and Batch Bundle", filters, "name")
if bundle_id:
- item.serial_and_batch_bundle = bundle_id
+ cls_obj = SerialBatchCreation(
+ {
+ "type_of_transaction": "Outward",
+ "serial_and_batch_bundle": bundle_id,
+ "item_code": item.get("item_code"),
+ }
+ )
+
+ cls_obj.duplicate_package()
+
+ item.serial_and_batch_bundle = cls_obj.serial_and_batch_bundle
def validate_proj_cust(self):
"""check for does customer belong to same project as entered.."""
@@ -408,6 +420,7 @@ class DeliveryNote(SellingController):
self.update_stock_ledger()
self.cancel_packing_slips()
+ self.update_pick_list_status()
self.make_gl_entries_on_cancel()
self.repost_future_sle_and_gle()
@@ -418,6 +431,8 @@ class DeliveryNote(SellingController):
"Serial and Batch Bundle",
)
+ self.delete_auto_created_batches()
+
def update_stock_reservation_entries(self) -> None:
"""Updates Delivered Qty in Stock Reservation Entries."""
@@ -1294,7 +1309,3 @@ def make_inter_company_transaction(doctype, source_name, target_doc=None):
)
return doclist
-
-
-def on_doctype_update():
- frappe.db.add_index("Delivery Note", ["customer", "is_return", "return_against"])
diff --git a/erpnext/stock/doctype/delivery_note/patches/__init__.py b/erpnext/stock/doctype/delivery_note/patches/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/erpnext/stock/doctype/delivery_note/patches/drop_unused_return_against_index.py b/erpnext/stock/doctype/delivery_note/patches/drop_unused_return_against_index.py
new file mode 100644
index 0000000000..cc29e67fa7
--- /dev/null
+++ b/erpnext/stock/doctype/delivery_note/patches/drop_unused_return_against_index.py
@@ -0,0 +1,27 @@
+import click
+import frappe
+
+UNUSED_INDEXES = [
+ ("Delivery Note", ["customer", "is_return", "return_against"]),
+ ("Sales Invoice", ["customer", "is_return", "return_against"]),
+ ("Purchase Invoice", ["supplier", "is_return", "return_against"]),
+ ("Purchase Receipt", ["supplier", "is_return", "return_against"]),
+]
+
+
+def execute():
+ for doctype, index_fields in UNUSED_INDEXES:
+ table = f"tab{doctype}"
+ index_name = frappe.db.get_index_name(index_fields)
+ drop_index_if_exists(table, index_name)
+
+
+def drop_index_if_exists(table: str, index: str):
+ if not frappe.db.has_index(table, index):
+ return
+
+ try:
+ frappe.db.sql_ddl(f"ALTER TABLE `{table}` DROP INDEX `{index}`")
+ click.echo(f"✓ dropped {index} index from {table}")
+ except Exception:
+ frappe.log_error("Failed to drop index")
diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
index 94655747e4..3fdda2cc49 100644
--- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
@@ -10,6 +10,7 @@ from frappe.utils import add_days, cstr, flt, nowdate, nowtime, today
from erpnext.accounts.doctype.account.test_account import get_inventory_account
from erpnext.accounts.utils import get_balance_on
+from erpnext.controllers.accounts_controller import InvalidQtyError
from erpnext.selling.doctype.product_bundle.test_product_bundle import make_product_bundle
from erpnext.selling.doctype.sales_order.test_sales_order import (
automatically_fetch_payment_terms,
@@ -42,6 +43,16 @@ from erpnext.stock.stock_ledger import get_previous_sle
class TestDeliveryNote(FrappeTestCase):
+ def test_delivery_note_qty(self):
+ dn = create_delivery_note(qty=0, do_not_save=True)
+ with self.assertRaises(InvalidQtyError):
+ dn.save()
+
+ # No error with qty=1
+ dn.items[0].qty = 1
+ dn.save()
+ self.assertEqual(dn.items[0].qty, 1)
+
def test_over_billing_against_dn(self):
frappe.db.set_single_value("Stock Settings", "allow_negative_stock", 1)
@@ -174,6 +185,115 @@ class TestDeliveryNote(FrappeTestCase):
for field, value in field_values.items():
self.assertEqual(cstr(serial_no.get(field)), value)
+ def test_delivery_note_return_against_denormalized_serial_no(self):
+ from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_return
+ from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
+
+ frappe.flags.ignore_serial_batch_bundle_validation = True
+ sn_item = "Old Serial NO Item Return Test - 1"
+ make_item(
+ sn_item,
+ {
+ "has_serial_no": 1,
+ "serial_no_series": "OSN-.####",
+ "is_stock_item": 1,
+ },
+ )
+
+ frappe.flags.ignore_serial_batch_bundle_validation = True
+ serial_nos = [
+ "OSN-1",
+ "OSN-2",
+ "OSN-3",
+ "OSN-4",
+ "OSN-5",
+ "OSN-6",
+ "OSN-7",
+ "OSN-8",
+ "OSN-9",
+ "OSN-10",
+ "OSN-11",
+ "OSN-12",
+ ]
+
+ for sn in serial_nos:
+ if not frappe.db.exists("Serial No", sn):
+ sn_doc = frappe.get_doc(
+ {
+ "doctype": "Serial No",
+ "item_code": sn_item,
+ "serial_no": sn,
+ }
+ )
+ sn_doc.insert()
+
+ warehouse = "_Test Warehouse - _TC"
+ company = frappe.db.get_value("Warehouse", warehouse, "company")
+ se_doc = make_stock_entry(
+ item_code=sn_item,
+ company=company,
+ target="_Test Warehouse - _TC",
+ qty=12,
+ basic_rate=100,
+ do_not_submit=1,
+ )
+
+ se_doc.items[0].serial_no = "\n".join(serial_nos)
+ se_doc.submit()
+
+ self.assertEqual(sorted(get_serial_nos(se_doc.items[0].serial_no)), sorted(serial_nos))
+
+ dn = create_delivery_note(
+ item_code=sn_item,
+ qty=12,
+ rate=500,
+ warehouse=warehouse,
+ company=company,
+ expense_account="Cost of Goods Sold - _TC",
+ cost_center="Main - _TC",
+ do_not_submit=1,
+ )
+
+ dn.items[0].serial_no = "\n".join(serial_nos)
+ dn.submit()
+ dn.reload()
+
+ self.assertTrue(dn.items[0].serial_no)
+
+ frappe.flags.ignore_serial_batch_bundle_validation = False
+
+ # return entry
+ dn1 = make_sales_return(dn.name)
+
+ dn1.items[0].qty = -2
+
+ bundle_doc = frappe.get_doc("Serial and Batch Bundle", dn1.items[0].serial_and_batch_bundle)
+ bundle_doc.set("entries", bundle_doc.entries[:2])
+ bundle_doc.save()
+
+ dn1.save()
+ dn1.submit()
+
+ returned_serial_nos1 = get_serial_nos_from_bundle(dn1.items[0].serial_and_batch_bundle)
+ for serial_no in returned_serial_nos1:
+ self.assertTrue(serial_no in serial_nos)
+
+ dn2 = make_sales_return(dn.name)
+
+ dn2.items[0].qty = -2
+
+ bundle_doc = frappe.get_doc("Serial and Batch Bundle", dn2.items[0].serial_and_batch_bundle)
+ bundle_doc.set("entries", bundle_doc.entries[:2])
+ bundle_doc.save()
+
+ dn2.save()
+ dn2.submit()
+
+ returned_serial_nos2 = get_serial_nos_from_bundle(dn2.items[0].serial_and_batch_bundle)
+ for serial_no in returned_serial_nos2:
+ self.assertTrue(serial_no in serial_nos)
+ self.assertFalse(serial_no in returned_serial_nos1)
+
def test_sales_return_for_non_bundled_items_partial(self):
company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
@@ -1266,6 +1386,168 @@ class TestDeliveryNote(FrappeTestCase):
dn.reload()
self.assertEqual(frappe.db.get_value("Serial No", serial_no, "status"), "Delivered")
+ def test_sales_return_valuation_for_moving_average(self):
+ item_code = make_item(
+ "_Test Item Sales Return with MA", {"is_stock_item": 1, "valuation_method": "Moving Average"}
+ ).name
+
+ make_stock_entry(
+ item_code=item_code,
+ target="_Test Warehouse - _TC",
+ qty=5,
+ basic_rate=100.0,
+ posting_date=add_days(nowdate(), -5),
+ )
+ dn = create_delivery_note(
+ item_code=item_code, qty=5, rate=500, posting_date=add_days(nowdate(), -4)
+ )
+ self.assertEqual(dn.items[0].incoming_rate, 100.0)
+
+ make_stock_entry(
+ item_code=item_code,
+ target="_Test Warehouse - _TC",
+ qty=5,
+ basic_rate=200.0,
+ posting_date=add_days(nowdate(), -3),
+ )
+ make_stock_entry(
+ item_code=item_code,
+ target="_Test Warehouse - _TC",
+ qty=5,
+ basic_rate=300.0,
+ posting_date=add_days(nowdate(), -2),
+ )
+
+ dn1 = create_delivery_note(
+ is_return=1,
+ item_code=item_code,
+ return_against=dn.name,
+ qty=-5,
+ rate=500,
+ company=dn.company,
+ expense_account="Cost of Goods Sold - _TC",
+ cost_center="Main - _TC",
+ do_not_submit=1,
+ posting_date=add_days(nowdate(), -1),
+ )
+
+ # (300 * 5) + (200 * 5) = 2500
+ # 2500 / 10 = 250
+
+ self.assertAlmostEqual(dn1.items[0].incoming_rate, 250.0)
+
+ def test_sales_return_valuation_for_moving_average_case2(self):
+ # Make DN return
+ # Make Bakcdated Purchase Receipt and check DN return valuation rate
+ # The rate should be recalculate based on the backdated purchase receipt
+ frappe.flags.print_debug_messages = False
+ item_code = make_item(
+ "_Test Item Sales Return with MA Case2",
+ {"is_stock_item": 1, "valuation_method": "Moving Average", "stock_uom": "Nos"},
+ ).name
+
+ make_stock_entry(
+ item_code=item_code,
+ target="_Test Warehouse - _TC",
+ qty=5,
+ basic_rate=100.0,
+ posting_date=add_days(nowdate(), -5),
+ )
+
+ dn = create_delivery_note(
+ item_code=item_code,
+ warehouse="_Test Warehouse - _TC",
+ qty=5,
+ rate=500,
+ posting_date=add_days(nowdate(), -4),
+ )
+
+ returned_dn = create_delivery_note(
+ is_return=1,
+ item_code=item_code,
+ return_against=dn.name,
+ qty=-5,
+ rate=500,
+ company=dn.company,
+ warehouse="_Test Warehouse - _TC",
+ expense_account="Cost of Goods Sold - _TC",
+ cost_center="Main - _TC",
+ posting_date=add_days(nowdate(), -1),
+ )
+
+ self.assertAlmostEqual(returned_dn.items[0].incoming_rate, 100.0)
+
+ # Make backdated purchase receipt
+ make_stock_entry(
+ item_code=item_code,
+ target="_Test Warehouse - _TC",
+ qty=5,
+ basic_rate=200.0,
+ posting_date=add_days(nowdate(), -3),
+ )
+
+ returned_dn.reload()
+ self.assertAlmostEqual(returned_dn.items[0].incoming_rate, 200.0)
+
+ def test_batch_with_non_stock_uom(self):
+ frappe.db.set_single_value(
+ "Stock Settings", "auto_create_serial_and_batch_bundle_for_outward", 1
+ )
+
+ item = make_item(
+ properties={
+ "has_batch_no": 1,
+ "create_new_batch": 1,
+ "batch_number_series": "TESTBATCH.#####",
+ "stock_uom": "Nos",
+ }
+ )
+ if not frappe.db.exists("UOM Conversion Detail", {"parent": item.name, "uom": "Kg"}):
+ item.append("uoms", {"uom": "Kg", "conversion_factor": 5.0})
+ item.save()
+
+ item_code = item.name
+
+ make_stock_entry(item_code=item_code, target="_Test Warehouse - _TC", qty=5, basic_rate=100.0)
+ dn = create_delivery_note(
+ item_code=item_code, qty=1, rate=500, warehouse="_Test Warehouse - _TC", do_not_save=True
+ )
+ dn.items[0].uom = "Kg"
+ dn.items[0].conversion_factor = 5.0
+
+ dn.save()
+ dn.submit()
+
+ self.assertEqual(dn.items[0].stock_qty, 5.0)
+ voucher_detail_no = dn.items[0].name
+ delivered_batch_qty = frappe.db.get_value(
+ "Serial and Batch Bundle", {"voucher_detail_no": voucher_detail_no}, "total_qty"
+ )
+ self.assertEqual(abs(delivered_batch_qty), 5.0)
+
+ frappe.db.set_single_value(
+ "Stock Settings", "auto_create_serial_and_batch_bundle_for_outward", 0
+ )
+
+ def test_internal_transfer_for_non_stock_item(self):
+ from erpnext.selling.doctype.customer.test_customer import create_internal_customer
+ from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note
+
+ item = make_item(properties={"is_stock_item": 0}).name
+ warehouse = "_Test Warehouse - _TC"
+ target = "Stores - _TC"
+ company = "_Test Company"
+ customer = create_internal_customer(represents_company=company)
+ rate = 100
+
+ so = make_sales_order(item_code=item, qty=1, rate=rate, customer=customer, warehouse=warehouse)
+ dn = make_delivery_note(so.name)
+ dn.items[0].target_warehouse = target
+ dn.save().submit()
+
+ self.assertEqual(so.items[0].rate, rate)
+ self.assertEqual(dn.items[0].rate, so.items[0].rate)
+
def create_delivery_note(**args):
dn = frappe.new_doc("Delivery Note")
@@ -1287,7 +1569,7 @@ def create_delivery_note(**args):
if dn.is_return:
type_of_transaction = "Inward"
- qty = args.get("qty") or 1
+ qty = args.qty if args.get("qty") is not None else 1
qty *= -1 if type_of_transaction == "Outward" else 1
batches = {}
if args.get("batch_no"):
@@ -1315,7 +1597,7 @@ def create_delivery_note(**args):
{
"item_code": args.item or args.item_code or "_Test Item",
"warehouse": args.warehouse or "_Test Warehouse - _TC",
- "qty": args.qty or 1,
+ "qty": args.qty if args.get("qty") is not None else 1,
"rate": args.rate if args.get("rate") is not None else 100,
"conversion_factor": 1.0,
"serial_and_batch_bundle": bundle_id,
diff --git a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py
index 60624d4164..d5eef5ad22 100644
--- a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py
+++ b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.py
@@ -305,7 +305,7 @@ def get_evaluated_inventory_dimension(doc, sl_dict, parent_doc=None):
dimensions = get_document_wise_inventory_dimensions(doc.doctype)
filter_dimensions = []
for row in dimensions:
- if row.type_of_transaction:
+ if row.type_of_transaction and row.type_of_transaction != "Both":
if (
row.type_of_transaction == "Inward"
if doc.docstatus == 1
diff --git a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py
index 33394e5a11..361c2f8cd9 100644
--- a/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py
+++ b/erpnext/stock/doctype/inventory_dimension/test_inventory_dimension.py
@@ -429,6 +429,14 @@ class TestInventoryDimension(FrappeTestCase):
)
warehouse = create_warehouse("Negative Stock Warehouse")
+
+ doc = make_stock_entry(item_code=item_code, source=warehouse, qty=10, do_not_submit=True)
+ doc.items[0].inv_site = "Site 1"
+ self.assertRaises(frappe.ValidationError, doc.submit)
+ doc.reload()
+ if doc.docstatus == 1:
+ doc.cancel()
+
doc = make_stock_entry(item_code=item_code, target=warehouse, qty=10, do_not_submit=True)
doc.items[0].to_inv_site = "Site 1"
diff --git a/erpnext/stock/doctype/item/item.json b/erpnext/stock/doctype/item/item.json
index 13f3be8c36..6529bb2806 100644
--- a/erpnext/stock/doctype/item/item.json
+++ b/erpnext/stock/doctype/item/item.json
@@ -202,6 +202,7 @@
"label": "Allow Alternative Item"
},
{
+ "allow_in_quick_entry": 1,
"bold": 1,
"default": "1",
"depends_on": "eval:!doc.is_fixed_asset",
@@ -239,6 +240,7 @@
"label": "Standard Selling Rate"
},
{
+ "allow_in_quick_entry": 1,
"default": "0",
"fieldname": "is_fixed_asset",
"fieldtype": "Check",
@@ -246,6 +248,7 @@
"set_only_once": 1
},
{
+ "allow_in_quick_entry": 1,
"depends_on": "is_fixed_asset",
"fieldname": "asset_category",
"fieldtype": "Link",
@@ -888,7 +891,7 @@
"index_web_pages_for_search": 1,
"links": [],
"make_attachments_public": 1,
- "modified": "2023-09-18 15:41:32.688051",
+ "modified": "2024-01-08 18:09:30.225085",
"modified_by": "Administrator",
"module": "Stock",
"name": "Item",
@@ -961,4 +964,4 @@
"states": [],
"title_field": "item_name",
"track_changes": 1
-}
+}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 2d9e11ab84..feb4583436 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -635,8 +635,8 @@ class Item(Document):
def recalculate_bin_qty(self, new_name):
from erpnext.stock.stock_balance import repost_stock
- existing_allow_negative_stock = frappe.db.get_value(
- "Stock Settings", None, "allow_negative_stock"
+ existing_allow_negative_stock = frappe.db.get_single_value(
+ "Stock Settings", "allow_negative_stock"
)
frappe.db.set_single_value("Stock Settings", "allow_negative_stock", 1)
diff --git a/erpnext/stock/doctype/item/item_list.js b/erpnext/stock/doctype/item/item_list.js
index 22d38e8893..1b57102d71 100644
--- a/erpnext/stock/doctype/item/item_list.js
+++ b/erpnext/stock/doctype/item/item_list.js
@@ -1,6 +1,6 @@
frappe.listview_settings['Item'] = {
add_fields: ["item_name", "stock_uom", "item_group", "image",
- "has_variants", "end_of_life", "disabled"],
+ "has_variants", "end_of_life", "disabled", "variant_of"],
filters: [["disabled", "=", "0"]],
get_indicator: function(doc) {
diff --git a/erpnext/stock/doctype/item/test_item.py b/erpnext/stock/doctype/item/test_item.py
index a942f58bd6..b237f73026 100644
--- a/erpnext/stock/doctype/item/test_item.py
+++ b/erpnext/stock/doctype/item/test_item.py
@@ -522,39 +522,25 @@ class TestItem(FrappeTestCase):
self.assertEqual(factor, 1.0)
def test_item_variant_by_manufacturer(self):
- fields = [{"field_name": "description"}, {"field_name": "variant_based_on"}]
- set_item_variant_settings(fields)
+ template = make_item(
+ "_Test Item Variant By Manufacturer", {"has_variants": 1, "variant_based_on": "Manufacturer"}
+ ).name
- if frappe.db.exists("Item", "_Test Variant Mfg"):
- frappe.delete_doc("Item", "_Test Variant Mfg")
- if frappe.db.exists("Item", "_Test Variant Mfg-1"):
- frappe.delete_doc("Item", "_Test Variant Mfg-1")
- if frappe.db.exists("Manufacturer", "MSG1"):
- frappe.delete_doc("Manufacturer", "MSG1")
+ for manufacturer in ["DFSS", "DASA", "ASAAS"]:
+ if not frappe.db.exists("Manufacturer", manufacturer):
+ m_doc = frappe.new_doc("Manufacturer")
+ m_doc.short_name = manufacturer
+ m_doc.insert()
- template = frappe.get_doc(
- dict(
- doctype="Item",
- item_code="_Test Variant Mfg",
- has_variant=1,
- item_group="Products",
- variant_based_on="Manufacturer",
- )
- ).insert()
+ self.assertFalse(frappe.db.exists("Item Manufacturer", {"manufacturer": "DFSS"}))
+ variant = get_variant(template, manufacturer="DFSS", manufacturer_part_no="DFSS-123")
- manufacturer = frappe.get_doc(dict(doctype="Manufacturer", short_name="MSG1")).insert()
+ item_manufacturer = frappe.db.exists(
+ "Item Manufacturer", {"manufacturer": "DFSS", "item_code": variant.name}
+ )
+ self.assertTrue(item_manufacturer)
- variant = get_variant(template.name, manufacturer=manufacturer.name)
- self.assertEqual(variant.item_code, "_Test Variant Mfg-1")
- self.assertEqual(variant.description, "_Test Variant Mfg")
- self.assertEqual(variant.manufacturer, "MSG1")
- variant.insert()
-
- variant = get_variant(template.name, manufacturer=manufacturer.name, manufacturer_part_no="007")
- self.assertEqual(variant.item_code, "_Test Variant Mfg-2")
- self.assertEqual(variant.description, "_Test Variant Mfg")
- self.assertEqual(variant.manufacturer, "MSG1")
- self.assertEqual(variant.manufacturer_part_no, "007")
+ frappe.delete_doc("Item Manufacturer", item_manufacturer)
def test_stock_exists_against_template_item(self):
stock_item = frappe.get_all("Stock Ledger Entry", fields=["item_code"], limit=1)
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index 3e90ed5a3b..ad9b34c9ac 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -169,7 +169,9 @@ class MaterialRequest(BuyingController):
def on_submit(self):
self.update_requested_qty_in_production_plan()
self.update_requested_qty()
- if self.material_request_type == "Purchase":
+ if self.material_request_type == "Purchase" and frappe.db.exists(
+ "Budget", {"applicable_on_material_request": 1, "docstatus": 1}
+ ):
self.validate_budget()
def before_save(self):
diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py
index e5aff38c52..3e440497f0 100644
--- a/erpnext/stock/doctype/material_request/test_material_request.py
+++ b/erpnext/stock/doctype/material_request/test_material_request.py
@@ -9,6 +9,7 @@ import frappe
from frappe.tests.utils import FrappeTestCase
from frappe.utils import flt, today
+from erpnext.controllers.accounts_controller import InvalidQtyError
from erpnext.stock.doctype.item.test_item import create_item
from erpnext.stock.doctype.material_request.material_request import (
make_in_transit_stock_entry,
@@ -20,6 +21,17 @@ from erpnext.stock.doctype.material_request.material_request import (
class TestMaterialRequest(FrappeTestCase):
+ def test_material_request_qty(self):
+ mr = frappe.copy_doc(test_records[0])
+ mr.items[0].qty = 0
+ with self.assertRaises(InvalidQtyError):
+ mr.insert()
+
+ # No error with qty=1
+ mr.items[0].qty = 1
+ mr.save()
+ self.assertEqual(mr.items[0].qty, 1)
+
def test_make_purchase_order(self):
mr = frappe.copy_doc(test_records[0]).insert()
diff --git a/erpnext/stock/doctype/pick_list/pick_list.js b/erpnext/stock/doctype/pick_list/pick_list.js
index 7cd171ea92..afd6ce8138 100644
--- a/erpnext/stock/doctype/pick_list/pick_list.js
+++ b/erpnext/stock/doctype/pick_list/pick_list.js
@@ -283,6 +283,7 @@ frappe.ui.form.on('Pick List Item', {
});
}
},
+
uom: (frm, cdt, cdn) => {
let row = frappe.get_doc(cdt, cdn);
if (row.uom) {
@@ -291,13 +292,50 @@ frappe.ui.form.on('Pick List Item', {
});
}
},
+
qty: (frm, cdt, cdn) => {
let row = frappe.get_doc(cdt, cdn);
frappe.model.set_value(cdt, cdn, 'stock_qty', row.qty * row.conversion_factor);
},
+
conversion_factor: (frm, cdt, cdn) => {
let row = frappe.get_doc(cdt, cdn);
frappe.model.set_value(cdt, cdn, 'stock_qty', row.qty * row.conversion_factor);
+ },
+
+ pick_serial_and_batch(frm, cdt, cdn) {
+ let item = locals[cdt][cdn];
+ let path = "assets/erpnext/js/utils/serial_no_batch_selector.js";
+
+ frappe.db.get_value("Item", item.item_code, ["has_batch_no", "has_serial_no"])
+ .then((r) => {
+ if (r.message && (r.message.has_batch_no || r.message.has_serial_no)) {
+ item.has_serial_no = r.message.has_serial_no;
+ item.has_batch_no = r.message.has_batch_no;
+ item.type_of_transaction = item.qty > 0 ? "Outward":"Inward";
+
+ item.title = item.has_serial_no ?
+ __("Select Serial No") : __("Select Batch No");
+
+ if (item.has_serial_no && item.has_batch_no) {
+ item.title = __("Select Serial and Batch");
+ }
+
+ frappe.require(path, function() {
+ new erpnext.SerialBatchPackageSelector(
+ frm, item, (r) => {
+ if (r) {
+ let qty = Math.abs(r.total_qty);
+ frappe.model.set_value(item.doctype, item.name, {
+ "serial_and_batch_bundle": r.name,
+ "qty": qty
+ });
+ }
+ }
+ );
+ });
+ }
+ });
}
});
diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py
index 545e45f3d8..758448af79 100644
--- a/erpnext/stock/doctype/pick_list/pick_list.py
+++ b/erpnext/stock/doctype/pick_list/pick_list.py
@@ -21,6 +21,7 @@ from erpnext.selling.doctype.sales_order.sales_order import (
)
from erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle import (
get_auto_batch_nos,
+ get_picked_serial_nos,
)
from erpnext.stock.get_item_details import get_conversion_factor
from erpnext.stock.serial_batch_bundle import SerialBatchCreation
@@ -167,6 +168,9 @@ class PickList(Document):
"Serial and Batch Bundle", row.serial_and_batch_bundle
).set_serial_and_batch_values(self, row)
+ def on_trash(self):
+ self.remove_serial_and_batch_bundle()
+
def remove_serial_and_batch_bundle(self):
for row in self.locations:
if row.serial_and_batch_bundle:
@@ -723,13 +727,14 @@ def get_available_item_locations(
def get_available_item_locations_for_serialized_item(
item_code, from_warehouses, required_qty, company, total_picked_qty=0
):
+ picked_serial_nos = get_picked_serial_nos(item_code, from_warehouses)
+
sn = frappe.qb.DocType("Serial No")
query = (
frappe.qb.from_(sn)
.select(sn.name, sn.warehouse)
.where((sn.item_code == item_code) & (sn.company == company))
.orderby(sn.creation)
- .limit(cint(required_qty + total_picked_qty))
)
if from_warehouses:
@@ -742,6 +747,9 @@ def get_available_item_locations_for_serialized_item(
warehouse_serial_nos_map = frappe._dict()
picked_qty = required_qty
for serial_no, warehouse in serial_nos:
+ if serial_no in picked_serial_nos:
+ continue
+
if picked_qty <= 0:
break
@@ -786,7 +794,8 @@ def get_available_item_locations_for_batched_item(
{
"item_code": item_code,
"warehouse": from_warehouses,
- "qty": required_qty + total_picked_qty,
+ "qty": required_qty,
+ "is_pick_list": True,
}
)
)
@@ -1050,7 +1059,7 @@ def get_pending_work_orders(doctype, txt, searchfield, start, page_length, filte
@frappe.whitelist()
def target_document_exists(pick_list_name, purpose):
if purpose == "Delivery":
- return frappe.db.exists("Delivery Note", {"pick_list": pick_list_name})
+ return frappe.db.exists("Delivery Note", {"pick_list": pick_list_name, "docstatus": 1})
return stock_entry_exists(pick_list_name)
diff --git a/erpnext/stock/doctype/pick_list/test_pick_list.py b/erpnext/stock/doctype/pick_list/test_pick_list.py
index 56c44bfd25..322b0b46ba 100644
--- a/erpnext/stock/doctype/pick_list/test_pick_list.py
+++ b/erpnext/stock/doctype/pick_list/test_pick_list.py
@@ -644,6 +644,122 @@ class TestPickList(FrappeTestCase):
so.reload()
self.assertEqual(so.per_picked, 50)
+ def test_picklist_for_batch_item(self):
+ warehouse = "_Test Warehouse - _TC"
+ item = make_item(
+ properties={"is_stock_item": 1, "has_batch_no": 1, "batch_no_series": "PICKLT-.######"}
+ ).name
+
+ # create batch
+ for batch_id in ["PICKLT-000001", "PICKLT-000002"]:
+ if not frappe.db.exists("Batch", batch_id):
+ frappe.get_doc(
+ {
+ "doctype": "Batch",
+ "batch_id": batch_id,
+ "item": item,
+ }
+ ).insert()
+
+ make_stock_entry(
+ item=item,
+ to_warehouse=warehouse,
+ qty=50,
+ basic_rate=100,
+ batches=frappe._dict({"PICKLT-000001": 30, "PICKLT-000002": 20}),
+ )
+
+ so = make_sales_order(item_code=item, qty=25.0, rate=100)
+ pl = create_pick_list(so.name)
+ # pick half the qty
+ for loc in pl.locations:
+ self.assertEqual(loc.qty, 25.0)
+ self.assertTrue(loc.serial_and_batch_bundle)
+
+ data = frappe.get_all(
+ "Serial and Batch Entry",
+ fields=["qty", "batch_no"],
+ filters={"parent": loc.serial_and_batch_bundle},
+ )
+
+ for d in data:
+ self.assertEqual(d.batch_no, "PICKLT-000001")
+ self.assertEqual(d.qty, 25.0 * -1)
+
+ pl.save()
+ pl.submit()
+
+ so1 = make_sales_order(item_code=item, qty=10.0, rate=100)
+ pl = create_pick_list(so1.name)
+ # pick half the qty
+ for loc in pl.locations:
+ self.assertEqual(loc.qty, 10.0)
+ self.assertTrue(loc.serial_and_batch_bundle)
+
+ data = frappe.get_all(
+ "Serial and Batch Entry",
+ fields=["qty", "batch_no"],
+ filters={"parent": loc.serial_and_batch_bundle},
+ )
+
+ for d in data:
+ self.assertTrue(d.batch_no in ["PICKLT-000001", "PICKLT-000002"])
+ if d.batch_no == "PICKLT-000001":
+ self.assertEqual(d.qty, 5.0 * -1)
+ elif d.batch_no == "PICKLT-000002":
+ self.assertEqual(d.qty, 5.0 * -1)
+
+ pl.save()
+ pl.submit()
+ pl.cancel()
+
+ def test_picklist_for_serial_item(self):
+ warehouse = "_Test Warehouse - _TC"
+ item = make_item(
+ properties={"is_stock_item": 1, "has_serial_no": 1, "serial_no_series": "SN-PICKLT-.######"}
+ ).name
+
+ make_stock_entry(item=item, to_warehouse=warehouse, qty=50, basic_rate=100)
+
+ so = make_sales_order(item_code=item, qty=25.0, rate=100)
+ pl = create_pick_list(so.name)
+ picked_serial_nos = []
+ # pick half the qty
+ for loc in pl.locations:
+ self.assertEqual(loc.qty, 25.0)
+ self.assertTrue(loc.serial_and_batch_bundle)
+
+ data = frappe.get_all(
+ "Serial and Batch Entry", fields=["serial_no"], filters={"parent": loc.serial_and_batch_bundle}
+ )
+
+ picked_serial_nos = [d.serial_no for d in data]
+ self.assertEqual(len(picked_serial_nos), 25)
+
+ pl.save()
+ pl.submit()
+
+ so1 = make_sales_order(item_code=item, qty=10.0, rate=100)
+ pl = create_pick_list(so1.name)
+ # pick half the qty
+ for loc in pl.locations:
+ self.assertEqual(loc.qty, 10.0)
+ self.assertTrue(loc.serial_and_batch_bundle)
+
+ data = frappe.get_all(
+ "Serial and Batch Entry",
+ fields=["qty", "batch_no"],
+ filters={"parent": loc.serial_and_batch_bundle},
+ )
+
+ self.assertEqual(len(data), 10)
+ for d in data:
+ self.assertTrue(d.serial_no not in picked_serial_nos)
+
+ pl.save()
+ pl.submit()
+ pl.cancel()
+
def test_picklist_with_bundles(self):
warehouse = "_Test Warehouse - _TC"
@@ -732,7 +848,7 @@ class TestPickList(FrappeTestCase):
dn.cancel()
pl.reload()
- self.assertEqual(pl.status, "Completed")
+ self.assertEqual(pl.status, "Open")
pl.cancel()
pl.reload()
diff --git a/erpnext/stock/doctype/price_list/price_list.py b/erpnext/stock/doctype/price_list/price_list.py
index 580c7c00b1..882c3f5c9c 100644
--- a/erpnext/stock/doctype/price_list/price_list.py
+++ b/erpnext/stock/doctype/price_list/price_list.py
@@ -39,11 +39,11 @@ class PriceList(Document):
def set_default_if_missing(self):
if cint(self.selling):
- if not frappe.db.get_value("Selling Settings", None, "selling_price_list"):
+ if not frappe.db.get_single_value("Selling Settings", "selling_price_list"):
frappe.set_value("Selling Settings", "Selling Settings", "selling_price_list", self.name)
elif cint(self.buying):
- if not frappe.db.get_value("Buying Settings", None, "buying_price_list"):
+ if not frappe.db.get_single_value("Buying Settings", "buying_price_list"):
frappe.set_value("Buying Settings", "Buying Settings", "buying_price_list", self.name)
def update_item_price(self):
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
index 6c9d3392e3..2cbccb0774 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
@@ -88,6 +88,20 @@ frappe.ui.form.on("Purchase Receipt", {
}, __('Create'));
}
+ if (frm.doc.docstatus === 0) {
+ if (!frm.doc.is_return) {
+ frappe.db.get_single_value("Buying Settings", "maintain_same_rate").then((value) => {
+ if (value) {
+ frm.doc.items.forEach((item) => {
+ frm.fields_dict.items.grid.update_docfield_property(
+ "rate", "read_only", (item.purchase_order && item.purchase_order_item)
+ );
+ });
+ }
+ });
+ }
+ }
+
frm.events.add_custom_buttons(frm);
},
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
index c7ad660497..a181022121 100755
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
@@ -289,7 +289,8 @@
"no_copy": 1,
"options": "Purchase Receipt",
"print_hide": 1,
- "read_only": 1
+ "read_only": 1,
+ "search_index": 1
},
{
"fieldname": "section_addresses",
@@ -1251,7 +1252,7 @@
"idx": 261,
"is_submittable": 1,
"links": [],
- "modified": "2023-11-28 13:14:15.243474",
+ "modified": "2023-12-18 17:26:41.279663",
"modified_by": "Administrator",
"module": "Stock",
"name": "Purchase Receipt",
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index ab0727163e..5cfa739242 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -302,7 +302,7 @@ class PurchaseReceipt(BuyingController):
)
def po_required(self):
- if frappe.db.get_value("Buying Settings", None, "po_required") == "Yes":
+ if frappe.db.get_single_value("Buying Settings", "po_required") == "Yes":
for d in self.get("items"):
if not d.purchase_order:
frappe.throw(_("Purchase Order number required for Item {0}").format(d.item_code))
@@ -518,6 +518,7 @@ class PurchaseReceipt(BuyingController):
debit=0.0,
credit=discrepancy_caused_by_exchange_rate_difference,
remarks=remarks,
+ against_type="Supplier",
against_account=self.supplier,
debit_in_account_currency=-1 * discrepancy_caused_by_exchange_rate_difference,
account_currency=account_currency,
@@ -531,6 +532,7 @@ class PurchaseReceipt(BuyingController):
debit=discrepancy_caused_by_exchange_rate_difference,
credit=0.0,
remarks=remarks,
+ against_type="Supplier",
against_account=self.supplier,
debit_in_account_currency=-1 * discrepancy_caused_by_exchange_rate_difference,
account_currency=account_currency,
@@ -796,7 +798,7 @@ class PurchaseReceipt(BuyingController):
# Backward compatibility:
# and charges added via Landed Cost Voucher,
# post valuation related charges on "Stock Received But Not Billed"
- against_account = ", ".join([d.account for d in gl_entries if flt(d.debit) > 0])
+ against_accounts = [d.account for d in gl_entries if flt(d.debit) > 0]
total_valuation_amount = sum(valuation_tax.values())
amount_including_divisional_loss = negative_expense_to_be_booked
stock_rbnb = (
@@ -828,16 +830,17 @@ class PurchaseReceipt(BuyingController):
)
amount_including_divisional_loss -= applicable_amount
- self.add_gl_entry(
- gl_entries=gl_entries,
- account=account,
- cost_center=tax.cost_center,
- debit=0.0,
- credit=applicable_amount,
- remarks=self.remarks or _("Accounting Entry for Stock"),
- against_account=against_account,
- item=tax,
- )
+ for against in against_accounts:
+ self.add_gl_entry(
+ gl_entries=gl_entries,
+ account=account,
+ cost_center=tax.cost_center,
+ debit=0.0,
+ credit=flt(applicable_amount) / len(against_accounts),
+ remarks=self.remarks or _("Accounting Entry for Stock"),
+ against_account=against,
+ item=tax,
+ )
i += 1
@@ -1121,8 +1124,39 @@ def get_item_wise_returned_qty(pr_doc):
)
+def merge_taxes(source_taxes, target_doc):
+ from erpnext.accounts.doctype.pos_invoice_merge_log.pos_invoice_merge_log import (
+ update_item_wise_tax_detail,
+ )
+
+ existing_taxes = target_doc.get("taxes") or []
+ idx = 1
+ for tax in source_taxes:
+ found = False
+ for t in existing_taxes:
+ if t.account_head == tax.account_head and t.cost_center == tax.cost_center:
+ t.tax_amount = flt(t.tax_amount) + flt(tax.tax_amount_after_discount_amount)
+ t.base_tax_amount = flt(t.base_tax_amount) + flt(tax.base_tax_amount_after_discount_amount)
+ update_item_wise_tax_detail(t, tax)
+ found = True
+
+ if not found:
+ tax.charge_type = "Actual"
+ tax.idx = idx
+ idx += 1
+ tax.included_in_print_rate = 0
+ tax.dont_recompute_tax = 1
+ tax.row_id = ""
+ tax.tax_amount = tax.tax_amount_after_discount_amount
+ tax.base_tax_amount = tax.base_tax_amount_after_discount_amount
+ tax.item_wise_tax_detail = tax.item_wise_tax_detail
+ existing_taxes.append(tax)
+
+ target_doc.set("taxes", existing_taxes)
+
+
@frappe.whitelist()
-def make_purchase_invoice(source_name, target_doc=None):
+def make_purchase_invoice(source_name, target_doc=None, args=None):
from erpnext.accounts.party import get_payment_terms_template
doc = frappe.get_doc("Purchase Receipt", source_name)
@@ -1139,6 +1173,10 @@ def make_purchase_invoice(source_name, target_doc=None):
)
doc.run_method("onload")
doc.run_method("set_missing_values")
+
+ if args and args.get("merge_taxes"):
+ merge_taxes(source.get("taxes") or [], doc)
+
doc.run_method("calculate_taxes_and_totals")
doc.set_payment_schedule()
@@ -1202,7 +1240,11 @@ def make_purchase_invoice(source_name, target_doc=None):
if not doc.get("is_return")
else get_pending_qty(d)[0] > 0,
},
- "Purchase Taxes and Charges": {"doctype": "Purchase Taxes and Charges", "add_if_empty": True},
+ "Purchase Taxes and Charges": {
+ "doctype": "Purchase Taxes and Charges",
+ "add_if_empty": True,
+ "ignore": args.get("merge_taxes") if args else 0,
+ },
},
target_doc,
set_missing_values,
@@ -1357,10 +1399,6 @@ def get_item_account_wise_additional_cost(purchase_document):
return item_account_wise_cost
-def on_doctype_update():
- frappe.db.add_index("Purchase Receipt", ["supplier", "is_return", "return_against"])
-
-
@erpnext.allow_regional
def update_regional_gl_entries(gl_list, doc):
return
diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
index 146cbff1aa..497530f0dc 100644
--- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
@@ -4,10 +4,12 @@
import frappe
from frappe.tests.utils import FrappeTestCase, change_settings
from frappe.utils import add_days, cint, cstr, flt, nowtime, today
+from pypika import Order
from pypika import functions as fn
import erpnext
from erpnext.accounts.doctype.account.test_account import get_inventory_account
+from erpnext.controllers.accounts_controller import InvalidQtyError
from erpnext.controllers.buying_controller import QtyMismatchError
from erpnext.stock.doctype.item.test_item import create_item, make_item
from erpnext.stock.doctype.purchase_receipt.purchase_receipt import make_purchase_invoice
@@ -29,6 +31,23 @@ class TestPurchaseReceipt(FrappeTestCase):
def setUp(self):
frappe.db.set_single_value("Buying Settings", "allow_multiple_items", 1)
+ def test_purchase_receipt_qty(self):
+ pr = make_purchase_receipt(qty=0, rejected_qty=0, do_not_save=True)
+ with self.assertRaises(InvalidQtyError):
+ pr.save()
+
+ # No error with qty=1
+ pr.items[0].qty = 1
+ pr.save()
+ self.assertEqual(pr.items[0].qty, 1)
+
+ # No error with rejected_qty=1
+ pr.items[0].rejected_warehouse = "_Test Rejected Warehouse - _TC"
+ pr.items[0].rejected_qty = 1
+ pr.items[0].qty = 0
+ pr.save()
+ self.assertEqual(pr.items[0].rejected_qty, 1)
+
def test_purchase_receipt_received_qty(self):
"""
1. Test if received qty is validated against accepted + rejected
@@ -990,7 +1009,7 @@ class TestPurchaseReceipt(FrappeTestCase):
gl_entries = get_gl_entries("Purchase Receipt", pr.name)
sl_entries = get_sl_entries("Purchase Receipt", pr.name)
- self.assertFalse(gl_entries)
+ self.assertEqual(len(gl_entries), 2)
expected_sle = {"Work In Progress - TCP1": -5, "Stores - TCP1": 5}
@@ -2235,13 +2254,13 @@ def get_sl_entries(voucher_type, voucher_no):
def get_gl_entries(voucher_type, voucher_no):
- return frappe.db.sql(
- """select account, debit, credit, cost_center, is_cancelled
- from `tabGL Entry` where voucher_type=%s and voucher_no=%s
- order by account desc""",
- (voucher_type, voucher_no),
- as_dict=1,
- )
+ gle = frappe.qb.DocType("GL Entry")
+ return (
+ frappe.qb.from_(gle)
+ .select(gle.account, gle.debit, gle.credit, gle.cost_center, gle.is_cancelled)
+ .where((gle.voucher_type == voucher_type) & (gle.voucher_no == voucher_no))
+ .orderby(gle.account, gle.debit, order=Order.desc)
+ ).run(as_dict=True)
def get_taxes(**args):
@@ -2348,7 +2367,8 @@ def make_purchase_receipt(**args):
pr.is_return = args.is_return
pr.return_against = args.return_against
pr.apply_putaway_rule = args.apply_putaway_rule
- qty = args.qty or 5
+
+ qty = args.qty if args.qty is not None else 5
rejected_qty = args.rejected_qty or 0
received_qty = args.received_qty or flt(rejected_qty) + flt(qty)
diff --git a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
index 7344d2a599..9bd692ad61 100644
--- a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
+++ b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
@@ -359,7 +359,6 @@
"oldfieldtype": "Currency",
"options": "currency",
"print_width": "100px",
- "read_only_depends_on": "eval: (!parent.is_return && doc.purchase_order && doc.purchase_order_item)",
"width": "100px"
},
{
@@ -1104,7 +1103,7 @@
"idx": 1,
"istable": 1,
"links": [],
- "modified": "2023-11-30 16:12:02.364608",
+ "modified": "2023-12-25 22:32:09.801965",
"modified_by": "Administrator",
"module": "Stock",
"name": "Purchase Receipt Item",
diff --git a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
index 97ada06e1d..909aa36710 100644
--- a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
+++ b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
@@ -140,11 +140,8 @@ class RepostItemValuation(Document):
return query[0][0] if query else None
def validate_accounts_freeze(self):
- acc_settings = frappe.db.get_value(
- "Accounts Settings",
- "Accounts Settings",
- ["acc_frozen_upto", "frozen_accounts_modifier"],
- as_dict=1,
+ acc_settings = frappe.db.get_single_value(
+ "Accounts Settings", ["acc_frozen_upto", "frozen_accounts_modifier"], as_dict=1
)
if not acc_settings.acc_frozen_upto:
return
@@ -294,7 +291,7 @@ def repost(doc):
raise
frappe.db.rollback()
- traceback = frappe.get_traceback()
+ traceback = frappe.get_traceback(with_context=True)
doc.log_error("Unable to repost item valuation")
message = frappe.message_log.pop() if frappe.message_log else ""
diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py
index ecb9314fbb..620b9606a7 100644
--- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py
+++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py
@@ -23,7 +23,11 @@ from frappe.utils import (
)
from frappe.utils.csvutils import build_csv_response
-from erpnext.stock.serial_batch_bundle import BatchNoValuation, SerialNoValuation
+from erpnext.stock.serial_batch_bundle import (
+ BatchNoValuation,
+ SerialNoValuation,
+ get_batches_from_bundle,
+)
from erpnext.stock.serial_batch_bundle import get_serial_nos as get_serial_nos_from_bundle
@@ -81,6 +85,8 @@ class SerialandBatchBundle(Document):
# end: auto-generated types
def validate(self):
+ self.reset_serial_batch_bundle()
+ self.set_batch_no()
self.validate_serial_and_batch_no()
self.validate_duplicate_serial_and_batch_no()
self.validate_voucher_no()
@@ -95,6 +101,35 @@ class SerialandBatchBundle(Document):
self.set_incoming_rate()
self.calculate_qty_and_amount()
+ def reset_serial_batch_bundle(self):
+ if self.is_new() and self.amended_from:
+ for field in ["is_cancelled", "is_rejected"]:
+ if self.get(field):
+ self.set(field, 0)
+
+ if self.voucher_detail_no:
+ self.voucher_detail_no = None
+
+ def set_batch_no(self):
+ if self.has_serial_no and self.has_batch_no:
+ serial_nos = [d.serial_no for d in self.entries if d.serial_no]
+ has_no_batch = any(not d.batch_no for d in self.entries)
+ if not has_no_batch:
+ return
+
+ serial_no_batch = frappe._dict(
+ frappe.get_all(
+ "Serial No",
+ filters={"name": ("in", serial_nos)},
+ fields=["name", "batch_no"],
+ as_list=True,
+ )
+ )
+
+ for row in self.entries:
+ if not row.batch_no:
+ row.batch_no = serial_no_batch.get(row.serial_no)
+
def validate_serial_nos_inventory(self):
if not (self.has_serial_no and self.type_of_transaction == "Outward"):
return
@@ -123,6 +158,11 @@ class SerialandBatchBundle(Document):
)
def validate_serial_nos_duplicate(self):
+ # Don't inward same serial number multiple times
+
+ if not self.warehouse:
+ return
+
if self.voucher_type in ["Stock Reconciliation", "Stock Entry"] and self.docstatus != 1:
return
@@ -146,7 +186,6 @@ class SerialandBatchBundle(Document):
kwargs["voucher_no"] = self.voucher_no
available_serial_nos = get_available_serial_nos(kwargs)
-
for data in available_serial_nos:
if data.serial_no in serial_nos:
self.throw_error_message(
@@ -327,6 +366,19 @@ class SerialandBatchBundle(Document):
):
values_to_set["posting_time"] = parent.posting_time
+ if parent.doctype in [
+ "Delivery Note",
+ "Purchase Receipt",
+ "Purchase Invoice",
+ "Sales Invoice",
+ ] and parent.get("is_return"):
+ return_ref_field = frappe.scrub(parent.doctype) + "_item"
+ if parent.doctype == "Delivery Note":
+ return_ref_field = "dn_detail"
+
+ if row.get(return_ref_field):
+ values_to_set["returned_against"] = row.get(return_ref_field)
+
if values_to_set:
self.db_set(values_to_set)
@@ -438,10 +490,14 @@ class SerialandBatchBundle(Document):
qty_field = "qty"
precision = row.precision
- if self.voucher_type in ["Subcontracting Receipt"]:
+ if row.get("doctype") in ["Subcontracting Receipt Supplied Item"]:
qty_field = "consumed_qty"
- if abs(abs(flt(self.total_qty, precision)) - abs(flt(row.get(qty_field), precision))) > 0.01:
+ qty = row.get(qty_field)
+ if qty_field == "qty" and row.get("stock_qty"):
+ qty = row.get("stock_qty")
+
+ if abs(abs(flt(self.total_qty, precision)) - abs(flt(qty, precision))) > 0.01:
self.throw_error_message(
f"Total quantity {abs(flt(self.total_qty))} in the Serial and Batch Bundle {bold(self.name)} does not match with the quantity {abs(flt(row.get(qty_field)))} for the Item {bold(self.item_code)} in the {self.voucher_type} # {self.voucher_no}"
)
@@ -509,7 +565,6 @@ class SerialandBatchBundle(Document):
batch_nos = []
serial_batches = {}
-
for row in self.entries:
if self.has_serial_no and not row.serial_no:
frappe.throw(
@@ -590,6 +645,67 @@ class SerialandBatchBundle(Document):
f"Batch Nos {bold(incorrect_batch_nos)} does not belong to Item {bold(self.item_code)}"
)
+ def validate_serial_and_batch_no_for_returned(self):
+ from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
+
+ if not self.returned_against:
+ return
+
+ if self.voucher_type not in [
+ "Purchase Receipt",
+ "Purchase Invoice",
+ "Sales Invoice",
+ "Delivery Note",
+ ]:
+ return
+
+ data = self.get_orignal_document_data()
+ if not data:
+ return
+
+ serial_nos, batches = [], []
+ current_serial_nos = [d.serial_no for d in self.entries if d.serial_no]
+ current_batches = [d.batch_no for d in self.entries if d.batch_no]
+
+ for d in data:
+ if self.has_serial_no:
+ if d.serial_and_batch_bundle:
+ serial_nos = get_serial_nos_from_bundle(d.serial_and_batch_bundle)
+ else:
+ serial_nos = get_serial_nos(d.serial_no)
+
+ elif self.has_batch_no:
+ if d.serial_and_batch_bundle:
+ batches = get_batches_from_bundle(d.serial_and_batch_bundle)
+ else:
+ batches = frappe._dict({d.batch_no: d.stock_qty})
+
+ if batches:
+ batches = [d for d in batches if batches[d] > 0]
+
+ if serial_nos:
+ if not set(current_serial_nos).issubset(set(serial_nos)):
+ self.throw_error_message(
+ f"Serial Nos {bold(', '.join(serial_nos))} are not part of the original document."
+ )
+
+ if batches:
+ if not set(current_batches).issubset(set(batches)):
+ self.throw_error_message(
+ f"Batch Nos {bold(', '.join(batches))} are not part of the original document."
+ )
+
+ def get_orignal_document_data(self):
+ fields = ["serial_and_batch_bundle", "stock_qty"]
+ if self.has_serial_no:
+ fields.append("serial_no")
+
+ elif self.has_batch_no:
+ fields.append("batch_no")
+
+ child_doc = self.voucher_type + " Item"
+ return frappe.get_all(child_doc, fields=fields, filters={"name": self.returned_against})
+
def validate_duplicate_serial_and_batch_no(self):
serial_nos = []
batch_nos = []
@@ -613,19 +729,13 @@ class SerialandBatchBundle(Document):
def before_cancel(self):
self.delink_serial_and_batch_bundle()
- self.clear_table()
def delink_serial_and_batch_bundle(self):
- self.voucher_no = None
-
sles = frappe.get_all("Stock Ledger Entry", filters={"serial_and_batch_bundle": self.name})
for sle in sles:
frappe.db.set_value("Stock Ledger Entry", sle.name, "serial_and_batch_bundle", None)
- def clear_table(self):
- self.set("entries", [])
-
@property
def child_table(self):
if self.voucher_type == "Job Card":
@@ -688,9 +798,29 @@ class SerialandBatchBundle(Document):
for batch in batches:
frappe.db.set_value("Batch", batch.name, {"reference_name": None, "reference_doctype": None})
+ def before_submit(self):
+ self.validate_serial_and_batch_no_for_returned()
+ self.set_purchase_document_no()
+
def on_submit(self):
self.validate_serial_nos_inventory()
+ def set_purchase_document_no(self):
+ if not self.has_serial_no:
+ return
+
+ if self.total_qty > 0:
+ serial_nos = [d.serial_no for d in self.entries if d.serial_no]
+ sn_table = frappe.qb.DocType("Serial No")
+ (
+ frappe.qb.update(sn_table)
+ .set(
+ sn_table.purchase_document_no,
+ self.voucher_no if not sn_table.purchase_document_no else self.voucher_no,
+ )
+ .where(sn_table.name.isin(serial_nos))
+ ).run()
+
def validate_serial_and_batch_inventory(self):
self.check_future_entries_exists()
self.validate_batch_inventory()
@@ -740,7 +870,6 @@ class SerialandBatchBundle(Document):
self.validate_voucher_no_docstatus()
self.delink_refernce_from_voucher()
self.delink_reference_from_batch()
- self.clear_table()
@frappe.whitelist()
def add_serial_batch(self, data):
@@ -788,7 +917,11 @@ def upload_csv_file(item_code, file_path):
def get_serial_batch_from_csv(item_code, file_path):
- file_path = frappe.get_site_path() + file_path
+ if "private" in file_path:
+ file_path = frappe.get_site_path() + file_path
+ else:
+ file_path = frappe.get_site_path() + "/public" + file_path
+
serial_nos = []
batch_nos = []
@@ -814,7 +947,7 @@ def parse_csv_file_to_get_serial_batch(reader):
if index == 0:
has_serial_no = row[0] == "Serial No"
has_batch_no = row[0] == "Batch No"
- if not has_batch_no:
+ if not has_batch_no and len(row) > 1:
has_batch_no = row[1] == "Batch No"
continue
@@ -871,13 +1004,17 @@ def make_serial_nos(item_code, serial_nos):
item = frappe.get_cached_value("Item", item_code, ["description", "item_code"], as_dict=1)
serial_nos = [d.get("serial_no") for d in serial_nos if d.get("serial_no")]
+ existing_serial_nos = frappe.get_all("Serial No", filters={"name": ("in", serial_nos)})
+
+ existing_serial_nos = [d.get("name") for d in existing_serial_nos if d.get("name")]
+ serial_nos = list(set(serial_nos) - set(existing_serial_nos))
+
+ if not serial_nos:
+ return
serial_nos_details = []
user = frappe.session.user
for serial_no in serial_nos:
- if frappe.db.exists("Serial No", serial_no):
- continue
-
serial_nos_details.append(
(
serial_no,
@@ -913,9 +1050,16 @@ def make_serial_nos(item_code, serial_nos):
def make_batch_nos(item_code, batch_nos):
item = frappe.get_cached_value("Item", item_code, ["description", "item_code"], as_dict=1)
-
batch_nos = [d.get("batch_no") for d in batch_nos if d.get("batch_no")]
+ existing_batches = frappe.get_all("Batch", filters={"name": ("in", batch_nos)})
+
+ existing_batches = [d.get("name") for d in existing_batches if d.get("name")]
+
+ batch_nos = list(set(batch_nos) - set(existing_batches))
+ if not batch_nos:
+ return
+
batch_nos_details = []
user = frappe.session.user
for batch_no in batch_nos:
@@ -1016,33 +1160,37 @@ def get_filters_for_bundle(item_code=None, docstatus=None, voucher_no=None, name
@frappe.whitelist()
-def add_serial_batch_ledgers(entries, child_row, doc, warehouse) -> object:
+def add_serial_batch_ledgers(entries, child_row, doc, warehouse, do_not_save=False) -> object:
if isinstance(child_row, str):
child_row = frappe._dict(parse_json(child_row))
if isinstance(entries, str):
entries = parse_json(entries)
- if doc and isinstance(doc, str):
- parent_doc = parse_json(doc)
+ parent_doc = doc
+ if parent_doc and isinstance(parent_doc, str):
+ parent_doc = parse_json(parent_doc)
if frappe.db.exists("Serial and Batch Bundle", child_row.serial_and_batch_bundle):
- doc = update_serial_batch_no_ledgers(entries, child_row, parent_doc, warehouse)
+ sb_doc = update_serial_batch_no_ledgers(entries, child_row, parent_doc, warehouse)
else:
- doc = create_serial_batch_no_ledgers(entries, child_row, parent_doc, warehouse)
+ sb_doc = create_serial_batch_no_ledgers(
+ entries, child_row, parent_doc, warehouse, do_not_save=do_not_save
+ )
- return doc
+ return sb_doc
-def create_serial_batch_no_ledgers(entries, child_row, parent_doc, warehouse=None) -> object:
+def create_serial_batch_no_ledgers(
+ entries, child_row, parent_doc, warehouse=None, do_not_save=False
+) -> object:
warehouse = warehouse or (
child_row.rejected_warehouse if child_row.is_rejected else child_row.warehouse
)
- type_of_transaction = child_row.type_of_transaction
+ type_of_transaction = get_type_of_transaction(parent_doc, child_row)
if parent_doc.get("doctype") == "Stock Entry":
- type_of_transaction = "Outward" if child_row.s_warehouse else "Inward"
warehouse = warehouse or child_row.s_warehouse or child_row.t_warehouse
doc = frappe.get_doc(
@@ -1055,6 +1203,7 @@ def create_serial_batch_no_ledgers(entries, child_row, parent_doc, warehouse=Non
"type_of_transaction": type_of_transaction,
"posting_date": parent_doc.get("posting_date"),
"posting_time": parent_doc.get("posting_time"),
+ "company": parent_doc.get("company"),
}
)
@@ -1063,7 +1212,7 @@ def create_serial_batch_no_ledgers(entries, child_row, parent_doc, warehouse=Non
doc.append(
"entries",
{
- "qty": (row.qty or 1.0) * (1 if type_of_transaction == "Inward" else -1),
+ "qty": (flt(row.qty) or 1.0) * (1 if type_of_transaction == "Inward" else -1),
"warehouse": warehouse,
"batch_no": row.batch_no,
"serial_no": row.serial_no,
@@ -1072,13 +1221,30 @@ def create_serial_batch_no_ledgers(entries, child_row, parent_doc, warehouse=Non
doc.save()
- frappe.db.set_value(child_row.doctype, child_row.name, "serial_and_batch_bundle", doc.name)
+ if do_not_save:
+ frappe.db.set_value(child_row.doctype, child_row.name, "serial_and_batch_bundle", doc.name)
frappe.msgprint(_("Serial and Batch Bundle created"), alert=True)
return doc
+def get_type_of_transaction(parent_doc, child_row):
+ type_of_transaction = child_row.type_of_transaction
+ if parent_doc.get("doctype") == "Stock Entry":
+ type_of_transaction = "Outward" if child_row.s_warehouse else "Inward"
+
+ if not type_of_transaction:
+ type_of_transaction = "Outward"
+ if parent_doc.get("doctype") in ["Purchase Receipt", "Purchase Invoice"]:
+ type_of_transaction = "Inward"
+
+ if parent_doc.get("is_return"):
+ type_of_transaction = "Inward" if type_of_transaction == "Outward" else "Outward"
+
+ return type_of_transaction
+
+
def update_serial_batch_no_ledgers(entries, child_row, parent_doc, warehouse=None) -> object:
doc = frappe.get_doc("Serial and Batch Bundle", child_row.serial_and_batch_bundle)
doc.voucher_detail_no = child_row.name
@@ -1091,7 +1257,7 @@ def update_serial_batch_no_ledgers(entries, child_row, parent_doc, warehouse=Non
doc.append(
"entries",
{
- "qty": (d.get("qty") or 1.0) * (1 if doc.type_of_transaction == "Inward" else -1),
+ "qty": (flt(d.get("qty")) or 1.0) * (1 if doc.type_of_transaction == "Inward" else -1),
"warehouse": warehouse or d.get("warehouse"),
"batch_no": d.get("batch_no"),
"serial_no": d.get("serial_no"),
@@ -1105,6 +1271,25 @@ def update_serial_batch_no_ledgers(entries, child_row, parent_doc, warehouse=Non
return doc
+@frappe.whitelist()
+def update_serial_or_batch(bundle_id, serial_no=None, batch_no=None):
+ if batch_no and not serial_no:
+ if qty := frappe.db.get_value(
+ "Serial and Batch Entry", {"parent": bundle_id, "batch_no": batch_no}, "qty"
+ ):
+ frappe.db.set_value(
+ "Serial and Batch Entry", {"parent": bundle_id, "batch_no": batch_no}, "qty", qty + 1
+ )
+ return
+
+ doc = frappe.get_cached_doc("Serial and Batch Bundle", bundle_id)
+ if not serial_no and not batch_no:
+ return
+
+ doc.append("entries", {"serial_no": serial_no, "batch_no": batch_no, "qty": 1})
+ doc.save(ignore_permissions=True)
+
+
def get_serial_and_batch_ledger(**kwargs):
kwargs = frappe._dict(kwargs)
@@ -1489,10 +1674,17 @@ def get_auto_batch_nos(kwargs):
stock_ledgers_batches = get_stock_ledgers_batches(kwargs)
pos_invoice_batches = get_reserved_batches_for_pos(kwargs)
sre_reserved_batches = get_reserved_batches_for_sre(kwargs)
+ picked_batches = frappe._dict()
+ if kwargs.get("is_pick_list"):
+ picked_batches = get_picked_batches(kwargs)
- if stock_ledgers_batches or pos_invoice_batches or sre_reserved_batches:
+ if stock_ledgers_batches or pos_invoice_batches or sre_reserved_batches or picked_batches:
update_available_batches(
- available_batches, stock_ledgers_batches, pos_invoice_batches, sre_reserved_batches
+ available_batches,
+ stock_ledgers_batches,
+ pos_invoice_batches,
+ sre_reserved_batches,
+ picked_batches,
)
if not kwargs.consider_negative_batches:
@@ -1649,6 +1841,102 @@ def get_voucher_wise_serial_batch_from_bundle(**kwargs) -> Dict[str, Dict]:
return group_by_voucher
+def get_picked_batches(kwargs) -> dict[str, dict]:
+ picked_batches = frappe._dict()
+
+ table = frappe.qb.DocType("Serial and Batch Bundle")
+ child_table = frappe.qb.DocType("Serial and Batch Entry")
+ pick_list_table = frappe.qb.DocType("Pick List")
+
+ query = (
+ frappe.qb.from_(table)
+ .inner_join(child_table)
+ .on(table.name == child_table.parent)
+ .inner_join(pick_list_table)
+ .on(table.voucher_no == pick_list_table.name)
+ .select(
+ child_table.batch_no,
+ child_table.warehouse,
+ Sum(child_table.qty).as_("qty"),
+ )
+ .where(
+ (table.docstatus != 2)
+ & (pick_list_table.status != "Completed")
+ & (table.type_of_transaction == "Outward")
+ & (table.is_cancelled == 0)
+ & (table.voucher_type == "Pick List")
+ & (table.voucher_no.isnotnull())
+ )
+ )
+
+ if kwargs.get("item_code"):
+ query = query.where(table.item_code == kwargs.get("item_code"))
+
+ if kwargs.get("warehouse"):
+ if isinstance(kwargs.warehouse, list):
+ query = query.where(table.warehouse.isin(kwargs.warehouse))
+ else:
+ query = query.where(table.warehouse == kwargs.get("warehouse"))
+
+ data = query.run(as_dict=True)
+ for row in data:
+ if not row.qty:
+ continue
+
+ key = (row.batch_no, row.warehouse)
+ if key not in picked_batches:
+ picked_batches[key] = frappe._dict(
+ {
+ "qty": row.qty,
+ "warehouse": row.warehouse,
+ }
+ )
+ else:
+ picked_batches[key].qty += row.qty
+
+ return picked_batches
+
+
+def get_picked_serial_nos(item_code, warehouse=None) -> list[str]:
+ table = frappe.qb.DocType("Serial and Batch Bundle")
+ child_table = frappe.qb.DocType("Serial and Batch Entry")
+ pick_list_table = frappe.qb.DocType("Pick List")
+
+ query = (
+ frappe.qb.from_(table)
+ .inner_join(child_table)
+ .on(table.name == child_table.parent)
+ .inner_join(pick_list_table)
+ .on(table.voucher_no == pick_list_table.name)
+ .select(
+ child_table.serial_no,
+ )
+ .where(
+ (table.docstatus != 2)
+ & (pick_list_table.status != "Completed")
+ & (table.type_of_transaction == "Outward")
+ & (table.is_cancelled == 0)
+ & (table.voucher_type == "Pick List")
+ & (table.voucher_no.isnotnull())
+ )
+ )
+
+ if item_code:
+ query = query.where(table.item_code == item_code)
+
+ if warehouse:
+ if isinstance(warehouse, list):
+ query = query.where(table.warehouse.isin(warehouse))
+ else:
+ query = query.where(table.warehouse == warehouse)
+
+ data = query.run(as_dict=True)
+ if not data:
+ return []
+
+ return [row.serial_no for row in data if row.serial_no]
+
+
def get_ledgers_from_serial_batch_bundle(**kwargs) -> List[frappe._dict]:
bundle_table = frappe.qb.DocType("Serial and Batch Bundle")
serial_batch_table = frappe.qb.DocType("Serial and Batch Entry")
@@ -1787,3 +2075,8 @@ def get_stock_ledgers_batches(kwargs):
@frappe.whitelist()
def get_batch_no_from_serial_no(serial_no):
return frappe.get_cached_value("Serial No", serial_no, "batch_no")
+
+
+@frappe.whitelist()
+def is_duplicate_serial_no(bundle_id, serial_no):
+ return frappe.db.exists("Serial and Batch Entry", {"parent": bundle_id, "serial_no": serial_no})
diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py
index d74d657f38..0d453fb841 100644
--- a/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py
+++ b/erpnext/stock/doctype/serial_and_batch_bundle/test_serial_and_batch_bundle.py
@@ -8,6 +8,11 @@ from frappe.tests.utils import FrappeTestCase
from frappe.utils import add_days, add_to_date, flt, nowdate, nowtime, today
from erpnext.stock.doctype.item.test_item import make_item
+from erpnext.stock.doctype.serial_and_batch_bundle.serial_and_batch_bundle import (
+ add_serial_batch_ledgers,
+ make_batch_nos,
+ make_serial_nos,
+)
from erpnext.stock.doctype.stock_entry.stock_entry_utils import make_stock_entry
@@ -420,6 +425,96 @@ class TestSerialandBatchBundle(FrappeTestCase):
ste.delete()
self.assertFalse(frappe.db.exists("Serial and Batch Bundle", bundle_doc.name))
+ def test_serial_and_batch_bundle_company(self):
+ from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
+
+ item = make_item(
+ "Test Serial and Batch Bundle Company Item",
+ properties={
+ "has_serial_no": 1,
+ "serial_no_series": "TT-SER-VAL-.#####",
+ },
+ ).name
+
+ pr = make_purchase_receipt(
+ item_code=item,
+ warehouse="_Test Warehouse - _TC",
+ qty=3,
+ rate=500,
+ do_not_submit=True,
+ )
+
+ entries = []
+ for serial_no in ["TT-SER-VAL-00001", "TT-SER-VAL-00002", "TT-SER-VAL-00003"]:
+ entries.append(frappe._dict({"serial_no": serial_no, "qty": 1}))
+
+ if not frappe.db.exists("Serial No", serial_no):
+ frappe.get_doc(
+ {
+ "doctype": "Serial No",
+ "serial_no": serial_no,
+ "item_code": item,
+ }
+ ).insert(ignore_permissions=True)
+
+ item_row = pr.items[0]
+ item_row.type_of_transaction = "Inward"
+ item_row.is_rejected = 0
+ sn_doc = add_serial_batch_ledgers(entries, item_row, pr, "_Test Warehouse - _TC")
+ self.assertEqual(sn_doc.company, "_Test Company")
+
+ def test_auto_cancel_serial_and_batch(self):
+ item_code = make_item(
+ properties={"has_serial_no": 1, "serial_no_series": "ATC-TT-SER-VAL-.#####"}
+ ).name
+
+ se = make_stock_entry(
+ item_code=item_code,
+ target="_Test Warehouse - _TC",
+ qty=5,
+ rate=500,
+ )
+
+ bundle = se.items[0].serial_and_batch_bundle
+ docstatus = frappe.db.get_value("Serial and Batch Bundle", bundle, "docstatus")
+ self.assertEqual(docstatus, 1)
+
+ se.cancel()
+ docstatus = frappe.db.get_value("Serial and Batch Bundle", bundle, "docstatus")
+ self.assertEqual(docstatus, 2)
+
+ def test_batch_duplicate_entry(self):
+ item_code = make_item(properties={"has_batch_no": 1}).name
+
+ batch_id = "TEST-BATTCCH-VAL-00001"
+ batch_nos = [{"batch_no": batch_id, "qty": 1}]
+
+ make_batch_nos(item_code, batch_nos)
+ self.assertTrue(frappe.db.exists("Batch", batch_id))
+
+ batch_id = "TEST-BATTCCH-VAL-00001"
+ batch_nos = [{"batch_no": batch_id, "qty": 1}]
+
+ # Shouldn't throw duplicate entry error
+ make_batch_nos(item_code, batch_nos)
+ self.assertTrue(frappe.db.exists("Batch", batch_id))
+
+ def test_serial_no_duplicate_entry(self):
+ item_code = make_item(properties={"has_serial_no": 1}).name
+
+ serial_no_id = "TEST-SNID-VAL-00001"
+ serial_nos = [{"serial_no": serial_no_id, "qty": 1}]
+
+ make_serial_nos(item_code, serial_nos)
+ self.assertTrue(frappe.db.exists("Serial No", serial_no_id))
+
+ serial_no_id = "TEST-SNID-VAL-00001"
+ serial_nos = [{"batch_no": serial_no_id, "qty": 1}]
+
+ # Shouldn't throw duplicate entry error
+ make_serial_nos(item_code, serial_nos)
+ self.assertTrue(frappe.db.exists("Serial No", serial_no_id))
+
def get_batch_from_bundle(bundle):
from erpnext.stock.serial_batch_bundle import get_batch_nos
diff --git a/erpnext/stock/doctype/serial_no/serial_no.json b/erpnext/stock/doctype/serial_no/serial_no.json
index b4ece00fe6..2d7fcac89a 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.json
+++ b/erpnext/stock/doctype/serial_no/serial_no.json
@@ -27,8 +27,6 @@
"column_break_24",
"location",
"employee",
- "delivery_details",
- "delivery_document_type",
"warranty_amc_details",
"column_break6",
"warranty_expiry_date",
@@ -39,7 +37,8 @@
"more_info",
"company",
"column_break_2cmm",
- "work_order"
+ "work_order",
+ "purchase_document_no"
],
"fields": [
{
@@ -153,20 +152,6 @@
"options": "Employee",
"read_only": 1
},
- {
- "fieldname": "delivery_details",
- "fieldtype": "Section Break",
- "label": "Delivery Details",
- "oldfieldtype": "Column Break"
- },
- {
- "fieldname": "delivery_document_type",
- "fieldtype": "Link",
- "label": "Delivery Document Type",
- "no_copy": 1,
- "options": "DocType",
- "read_only": 1
- },
{
"fieldname": "warranty_amc_details",
"fieldtype": "Section Break",
@@ -275,12 +260,19 @@
{
"fieldname": "column_break_2cmm",
"fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "purchase_document_no",
+ "fieldtype": "Data",
+ "label": "Creation Document No",
+ "no_copy": 1,
+ "read_only": 1
}
],
"icon": "fa fa-barcode",
"idx": 1,
"links": [],
- "modified": "2023-11-28 15:37:59.489945",
+ "modified": "2023-12-17 10:52:55.767839",
"modified_by": "Administrator",
"module": "Stock",
"name": "Serial No",
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index d562560da1..122664c2dd 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -41,7 +41,6 @@ class SerialNo(StockController):
batch_no: DF.Link | None
brand: DF.Link | None
company: DF.Link
- delivery_document_type: DF.Link | None
description: DF.Text | None
employee: DF.Link | None
item_code: DF.Link
@@ -51,6 +50,7 @@ class SerialNo(StockController):
maintenance_status: DF.Literal[
"", "Under Warranty", "Out of Warranty", "Under AMC", "Out of AMC"
]
+ purchase_document_no: DF.Data | None
purchase_rate: DF.Float
serial_no: DF.Data
status: DF.Literal["", "Active", "Inactive", "Delivered", "Expired"]
@@ -231,26 +231,6 @@ def auto_fetch_serial_number(
return sorted([d.get("name") for d in serial_numbers])
-def get_delivered_serial_nos(serial_nos):
- """
- Returns serial numbers that delivered from the list of serial numbers
- """
- from frappe.query_builder.functions import Coalesce
-
- SerialNo = frappe.qb.DocType("Serial No")
- serial_nos = get_serial_nos(serial_nos)
- query = (
- frappe.qb.select(SerialNo.name)
- .from_(SerialNo)
- .where((SerialNo.name.isin(serial_nos)) & (Coalesce(SerialNo.delivery_document_type, "") != ""))
- )
-
- result = query.run()
- if result and len(result) > 0:
- delivered_serial_nos = [row[0] for row in result]
- return delivered_serial_nos
-
-
@frappe.whitelist()
def get_pos_reserved_serial_nos(filters):
if isinstance(filters, str):
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index 7af5d1aa37..8da3e8fdd0 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -512,7 +512,12 @@ frappe.ui.form.on('Stock Entry', {
},
callback: function(r) {
if (!r.exc) {
- ["actual_qty", "basic_rate"].forEach((field) => {
+ let fields = ["actual_qty", "basic_rate"];
+ if (frm.doc.purpose == "Material Receipt") {
+ fields = ["actual_qty"];
+ }
+
+ fields.forEach((field) => {
frappe.model.set_value(cdt, cdn, field, (r.message[field] || 0.0));
});
frm.events.calculate_basic_amount(frm, child);
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 84e99c5155..bc5f428951 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -24,8 +24,14 @@ from frappe.utils import (
import erpnext
from erpnext.accounts.general_ledger import process_gl_map
+from erpnext.buying.utils import check_on_hold_or_closed_status
from erpnext.controllers.taxes_and_totals import init_landed_taxes_and_totals
-from erpnext.manufacturing.doctype.bom.bom import add_additional_cost, validate_bom_no
+from erpnext.manufacturing.doctype.bom.bom import (
+ add_additional_cost,
+ get_op_cost_from_sub_assemblies,
+ get_scrap_items_from_sub_assemblies,
+ validate_bom_no,
+)
from erpnext.setup.doctype.brand.brand import get_brand_defaults
from erpnext.setup.doctype.item_group.item_group import get_item_group_defaults
from erpnext.stock.doctype.batch.batch import get_batch_qty
@@ -203,7 +209,6 @@ class StockEntry(StockController):
self.validate_bom()
self.set_process_loss_qty()
self.validate_purchase_order()
- self.validate_subcontracting_order()
if self.purpose in ("Manufacture", "Repack"):
self.mark_finished_and_scrap_items()
@@ -269,6 +274,7 @@ class StockEntry(StockController):
return False
def on_submit(self):
+ self.validate_closed_subcontracting_order()
self.update_stock_ledger()
self.update_work_order()
self.validate_subcontract_order()
@@ -289,6 +295,7 @@ class StockEntry(StockController):
self.set_material_request_transfer_status("Completed")
def on_cancel(self):
+ self.validate_closed_subcontracting_order()
self.update_subcontract_order_supplied_items()
self.update_subcontracting_order_status()
@@ -388,9 +395,8 @@ class StockEntry(StockController):
frappe.delete_doc("Stock Entry", d.name)
def set_transfer_qty(self):
+ self.validate_qty_is_not_zero()
for item in self.get("items"):
- if not flt(item.qty):
- frappe.throw(_("Row {0}: Qty is mandatory").format(item.idx), title=_("Zero quantity"))
if not flt(item.conversion_factor):
frappe.throw(_("Row {0}: UOM Conversion Factor is mandatory").format(item.idx))
item.transfer_qty = flt(
@@ -1198,19 +1204,9 @@ class StockEntry(StockController):
)
)
- def validate_subcontracting_order(self):
- if self.get("subcontracting_order") and self.purpose in [
- "Send to Subcontractor",
- "Material Transfer",
- ]:
- sco_status = frappe.db.get_value("Subcontracting Order", self.subcontracting_order, "status")
-
- if sco_status == "Closed":
- frappe.throw(
- _("Cannot create Stock Entry against a closed Subcontracting Order {0}.").format(
- self.subcontracting_order
- )
- )
+ def validate_closed_subcontracting_order(self):
+ if self.get("subcontracting_order"):
+ check_on_hold_or_closed_status("Subcontracting Order", self.subcontracting_order)
def mark_finished_and_scrap_items(self):
if self.purpose != "Repack" and any(
@@ -1463,7 +1459,9 @@ class StockEntry(StockController):
self.get_gl_dict(
{
"account": account,
+ "against_type": "Account",
"against": d.expense_account,
+ "against_link": d.expense_account,
"cost_center": d.cost_center,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"credit_in_account_currency": flt(amount["amount"]),
@@ -1477,7 +1475,9 @@ class StockEntry(StockController):
self.get_gl_dict(
{
"account": d.expense_account,
+ "against_type": "Account",
"against": account,
+ "against_link": account,
"cost_center": d.cost_center,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"credit": -1
@@ -1904,11 +1904,22 @@ class StockEntry(StockController):
def get_bom_scrap_material(self, qty):
from erpnext.manufacturing.doctype.bom.bom import get_bom_items_as_dict
- # item dict = { item_code: {qty, description, stock_uom} }
- item_dict = (
- get_bom_items_as_dict(self.bom_no, self.company, qty=qty, fetch_exploded=0, fetch_scrap_items=1)
- or {}
- )
+ if (
+ frappe.db.get_single_value(
+ "Manufacturing Settings", "set_op_cost_and_scrape_from_sub_assemblies"
+ )
+ and self.work_order
+ and frappe.get_cached_value("Work Order", self.work_order, "use_multi_level_bom")
+ ):
+ item_dict = get_scrap_items_from_sub_assemblies(self.bom_no, self.company, qty)
+ else:
+ # item dict = { item_code: {qty, description, stock_uom} }
+ item_dict = (
+ get_bom_items_as_dict(
+ self.bom_no, self.company, qty=qty, fetch_exploded=0, fetch_scrap_items=1
+ )
+ or {}
+ )
for item in item_dict.values():
item.from_warehouse = ""
@@ -2659,6 +2670,15 @@ def get_work_order_details(work_order, company):
def get_operating_cost_per_unit(work_order=None, bom_no=None):
operating_cost_per_unit = 0
if work_order:
+ if (
+ bom_no
+ and frappe.db.get_single_value(
+ "Manufacturing Settings", "set_op_cost_and_scrape_from_sub_assemblies"
+ )
+ and frappe.get_cached_value("Work Order", work_order, "use_multi_level_bom")
+ ):
+ return get_op_cost_from_sub_assemblies(bom_no)
+
if not bom_no:
bom_no = work_order.bom_no
diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
index e0e364f397..085d215e75 100644
--- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py
@@ -8,6 +8,7 @@ from frappe.tests.utils import FrappeTestCase, change_settings
from frappe.utils import add_days, add_to_date, flt, nowdate, nowtime, today
from erpnext.accounts.doctype.account.test_account import get_inventory_account
+from erpnext.controllers.accounts_controller import InvalidQtyError
from erpnext.stock.doctype.item.test_item import (
create_item,
make_item,
@@ -54,6 +55,18 @@ class TestStockEntry(FrappeTestCase):
frappe.db.rollback()
frappe.set_user("Administrator")
+ def test_stock_entry_qty(self):
+ item_code = "_Test Item 2"
+ warehouse = "_Test Warehouse - _TC"
+ se = make_stock_entry(item_code=item_code, target=warehouse, qty=0, do_not_save=True)
+ with self.assertRaises(InvalidQtyError):
+ se.save()
+
+ # No error with qty=1
+ se.items[0].qty = 1
+ se.save()
+ self.assertEqual(se.items[0].qty, 1)
+
def test_fifo(self):
frappe.db.set_single_value("Stock Settings", "allow_negative_stock", 1)
item_code = "_Test Item 2"
@@ -504,7 +517,14 @@ class TestStockEntry(FrappeTestCase):
self.check_gl_entries(
"Stock Entry",
repack.name,
- sorted([[stock_in_hand_account, 1200, 0.0], ["Cost of Goods Sold - TCP1", 0.0, 1200.0]]),
+ sorted(
+ [
+ ["Cost of Goods Sold - TCP1", 0.0, 1200.0],
+ ["Stock Adjustment - TCP1", 0.0, 1200.0],
+ ["Stock Adjustment - TCP1", 1200.0, 0.0],
+ [stock_in_hand_account, 1200.0, 0.0],
+ ]
+ ),
)
def check_stock_ledger_entries(self, voucher_type, voucher_no, expected_sle):
diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index 23788cf46b..277ca01320 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -111,16 +111,20 @@ class StockLedgerEntry(Document):
"posting_date": self.posting_date,
"posting_time": self.posting_time,
"company": self.company,
+ "sle": self.name,
}
)
sle = get_previous_sle(kwargs, extra_cond=extra_cond)
+ qty_after_transaction = 0.0
+ flt_precision = cint(frappe.db.get_default("float_precision")) or 2
if sle:
- flt_precision = cint(frappe.db.get_default("float_precision")) or 2
- diff = sle.qty_after_transaction + flt(self.actual_qty)
- diff = flt(diff, flt_precision)
- if diff < 0 and abs(diff) > 0.0001:
- self.throw_validation_error(diff, dimensions)
+ qty_after_transaction = sle.qty_after_transaction
+
+ diff = qty_after_transaction + flt(self.actual_qty)
+ diff = flt(diff, flt_precision)
+ if diff < 0 and abs(diff) > 0.0001:
+ self.throw_validation_error(diff, dimensions)
def throw_validation_error(self, diff, dimensions):
dimension_msg = _(", with the inventory {0}: {1}").format(
@@ -181,6 +185,9 @@ class StockLedgerEntry(Document):
frappe.throw(_("Actual Qty is mandatory"))
def validate_serial_batch_no_bundle(self):
+ if self.is_cancelled == 1:
+ return
+
item_detail = frappe.get_cached_value(
"Item",
self.item_code,
diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
index e8d652e2b2..6819968394 100644
--- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -171,7 +171,7 @@ class StockReconciliation(StockController):
},
)
- if item_details.has_batch_no:
+ elif item_details.has_batch_no:
batch_nos_details = get_available_batches(
frappe._dict(
{
@@ -228,6 +228,9 @@ class StockReconciliation(StockController):
def set_new_serial_and_batch_bundle(self):
for item in self.items:
+ if not item.qty:
+ continue
+
if item.current_serial_and_batch_bundle and not item.serial_and_batch_bundle:
current_doc = frappe.get_doc("Serial and Batch Bundle", item.current_serial_and_batch_bundle)
diff --git a/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
index 1ec99bf9a5..70e9fb2205 100644
--- a/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
+++ b/erpnext/stock/doctype/stock_reconciliation/test_stock_reconciliation.py
@@ -865,6 +865,66 @@ class TestStockReconciliation(FrappeTestCase, StockTestMixin):
sr1.load_from_db()
self.assertEqual(sr1.difference_amount, 10000)
+ def test_make_stock_zero_for_serial_batch_item(self):
+ from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
+
+ serial_item = self.make_item(
+ properties={"is_stock_item": 1, "has_serial_no": 1, "serial_no_series": "DJJ.####"}
+ ).name
+ batch_item = self.make_item(
+ properties={
+ "is_stock_item": 1,
+ "has_batch_no": 1,
+ "batch_number_series": "BDJJ.####",
+ "create_new_batch": 1,
+ }
+ ).name
+
+ serial_batch_item = self.make_item(
+ properties={
+ "is_stock_item": 1,
+ "has_batch_no": 1,
+ "batch_number_series": "ADJJ.####",
+ "create_new_batch": 1,
+ "has_serial_no": 1,
+ "serial_no_series": "SN-ADJJ.####",
+ }
+ ).name
+
+ warehouse = "_Test Warehouse - _TC"
+
+ for item_code in [serial_item, batch_item, serial_batch_item]:
+ make_stock_entry(
+ item_code=item_code,
+ target=warehouse,
+ qty=10,
+ basic_rate=100,
+ )
+
+ _reco = create_stock_reconciliation(
+ item_code=item_code,
+ warehouse=warehouse,
+ qty=0.0,
+ )
+
+ serial_batch_bundle = frappe.get_all(
+ "Stock Ledger Entry",
+ {"item_code": item_code, "warehouse": warehouse, "is_cancelled": 0, "voucher_no": _reco.name},
+ "serial_and_batch_bundle",
+ )
+
+ self.assertEqual(len(serial_batch_bundle), 1)
+
+ _reco.cancel()
+
+ serial_batch_bundle = frappe.get_all(
+ "Stock Ledger Entry",
+ {"item_code": item_code, "warehouse": warehouse, "is_cancelled": 0, "voucher_no": _reco.name},
+ "serial_and_batch_bundle",
+ )
+
+ self.assertEqual(len(serial_batch_bundle), 0)
+
def create_batch_item_with_batch(item_name, batch_id):
batch_item_doc = create_item(item_name, is_stock_item=1)
diff --git a/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py b/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
index 24650fde5f..7e03ac3357 100644
--- a/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
+++ b/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
@@ -9,7 +9,7 @@ from frappe.model.document import Document
from frappe.query_builder.functions import Sum
from frappe.utils import cint, flt
-from erpnext.stock.utils import get_or_make_bin
+from erpnext.stock.utils import get_or_make_bin, get_stock_balance
class StockReservationEntry(Document):
@@ -151,7 +151,7 @@ class StockReservationEntry(Document):
"""Validates `Reserved Qty` when `Reservation Based On` is `Qty`."""
if self.reservation_based_on == "Qty":
- self.validate_with_max_reserved_qty(self.reserved_qty)
+ self.validate_with_allowed_qty(self.reserved_qty)
def auto_reserve_serial_and_batch(self, based_on: str = None) -> None:
"""Auto pick Serial and Batch Nos to reserve when `Reservation Based On` is `Serial and Batch`."""
@@ -324,7 +324,7 @@ class StockReservationEntry(Document):
frappe.throw(msg)
# Should be called after validating Serial and Batch Nos.
- self.validate_with_max_reserved_qty(qty_to_be_reserved)
+ self.validate_with_allowed_qty(qty_to_be_reserved)
self.db_set("reserved_qty", qty_to_be_reserved)
def update_reserved_qty_in_voucher(
@@ -429,7 +429,7 @@ class StockReservationEntry(Document):
msg = _("Stock Reservation Entry cannot be updated as it has been delivered.")
frappe.throw(msg)
- def validate_with_max_reserved_qty(self, qty_to_be_reserved: float) -> None:
+ def validate_with_allowed_qty(self, qty_to_be_reserved: float) -> None:
"""Validates `Reserved Qty` with `Max Reserved Qty`."""
self.db_set(
@@ -448,12 +448,12 @@ class StockReservationEntry(Document):
)
voucher_delivered_qty = flt(delivered_qty) * flt(conversion_factor)
- max_reserved_qty = min(
+ allowed_qty = min(
self.available_qty, (self.voucher_qty - voucher_delivered_qty - total_reserved_qty)
)
- if max_reserved_qty <= 0 and self.voucher_type == "Sales Order":
- msg = _("Item {0} is already delivered for Sales Order {1}.").format(
+ if self.get("_action") != "submit" and self.voucher_type == "Sales Order" and allowed_qty <= 0:
+ msg = _("Item {0} is already reserved/delivered against Sales Order {1}.").format(
frappe.bold(self.item_code), frappe.bold(self.voucher_no)
)
@@ -463,19 +463,33 @@ class StockReservationEntry(Document):
else:
frappe.throw(msg)
- if qty_to_be_reserved > max_reserved_qty:
+ if qty_to_be_reserved > allowed_qty:
+ actual_qty = get_stock_balance(self.item_code, self.warehouse)
msg = """
- Cannot reserve more than Max Reserved Qty {0} {1}.
- The Max Reserved Qty is calculated as follows:
+ Cannot reserve more than Allowed Qty {0} {1} for Item {2} against {3} {4}.
+ The Allowed Qty is calculated as follows: