Merge pull request #25752 from rohitwaghchaure/fixed-do-not-repost-if-scheduler-is-in-running

fix: the status of repost item valuation showing In Progress since long time
diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
new file mode 100644
index 0000000..c820d23
--- /dev/null
+++ b/.git-blame-ignore-revs
@@ -0,0 +1,12 @@
+# Since version 2.23 (released in August 2019), git-blame has a feature
+# to ignore or bypass certain commits.
+#
+# This file contains a list of commits that are not likely what you
+# are looking for in a blame, such as mass reformatting or renaming.
+# You can set this file as a default ignore file for blame by running
+# the following command.
+#
+# $ git config blame.ignoreRevsFile .git-blame-ignore-revs
+
+# Replace use of Class.extend with native JS class
+1fe891b287a1b3f225d29ee3d07e7b1824aba9e7
diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml
deleted file mode 100644
index 84ecfb1..0000000
--- a/.github/workflows/ci-tests.yml
+++ /dev/null
@@ -1,108 +0,0 @@
-name: CI
-
-on: [pull_request, workflow_dispatch, push]
-
-jobs:
-  test:
-    runs-on: ubuntu-18.04
-
-    strategy:
-      fail-fast: false
-
-      matrix:
-       include:
-        - TYPE: "server"
-          JOB_NAME: "Server"
-          RUN_COMMAND: cd ~/frappe-bench/ && bench --site test_site run-tests --app erpnext --coverage
-        - TYPE: "patch"
-          JOB_NAME: "Patch"
-          RUN_COMMAND: cd ~/frappe-bench/ && wget http://build.erpnext.com/20171108_190013_955977f8_database.sql.gz &&  bench --site test_site --force restore ~/frappe-bench/20171108_190013_955977f8_database.sql.gz && bench --site test_site migrate
-
-    name: ${{ matrix.JOB_NAME }}
-
-    services:
-      mysql:
-        image: mariadb:10.3
-        env:
-          MYSQL_ALLOW_EMPTY_PASSWORD: YES
-        ports:
-          - 3306:3306
-        options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3
-
-    steps:
-      - name: Clone
-        uses: actions/checkout@v2
-
-      - name: Setup Python
-        uses: actions/setup-python@v2
-        with:
-          python-version: 3.6
-
-      - name: Add to Hosts
-        run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
-
-      - name: Cache pip
-        uses: actions/cache@v2
-        with:
-          path: ~/.cache/pip
-          key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
-          restore-keys: |
-            ${{ runner.os }}-pip-
-            ${{ runner.os }}-
-      - name: Cache node modules
-        uses: actions/cache@v2
-        env:
-          cache-name: cache-node-modules
-        with:
-          path: ~/.npm
-          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
-          restore-keys: |
-            ${{ runner.os }}-build-${{ env.cache-name }}-
-            ${{ runner.os }}-build-
-            ${{ runner.os }}-
-      - name: Get yarn cache directory path
-        id: yarn-cache-dir-path
-        run: echo "::set-output name=dir::$(yarn cache dir)"
-
-      - uses: actions/cache@v2
-        id: yarn-cache
-        with:
-          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
-          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
-          restore-keys: |
-            ${{ runner.os }}-yarn-
-
-      - name: Install
-        run: bash ${GITHUB_WORKSPACE}/.github/helper/install.sh
-
-      - name: Run Tests
-        run: ${{ matrix.RUN_COMMAND }}
-        env:
-          TYPE: ${{ matrix.TYPE }}
-
-      - name: Coverage - Pull Request
-        if: matrix.TYPE == 'server' && github.event_name == 'pull_request'
-        run: |
-          cp ~/frappe-bench/sites/.coverage ${GITHUB_WORKSPACE}
-          cd ${GITHUB_WORKSPACE}
-          pip install coveralls==2.2.0
-          pip install coverage==4.5.4
-          coveralls --service=github
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_TOKEN }}
-          COVERALLS_SERVICE_NAME: github
-          
-      - name: Coverage - Push
-        if: matrix.TYPE == 'server' && github.event_name == 'push'
-        run: |
-          cp ~/frappe-bench/sites/.coverage ${GITHUB_WORKSPACE}
-          cd ${GITHUB_WORKSPACE}
-          pip install coveralls==2.2.0
-          pip install coverage==4.5.4
-          coveralls --service=github-actions
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-          COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_TOKEN }}
-          COVERALLS_SERVICE_NAME: github-actions
-
diff --git a/.github/workflows/patch.yml b/.github/workflows/patch.yml
new file mode 100644
index 0000000..7c9e027
--- /dev/null
+++ b/.github/workflows/patch.yml
@@ -0,0 +1,69 @@
+name: Patch
+
+on: [pull_request, workflow_dispatch]
+
+jobs:
+  test:
+    runs-on: ubuntu-18.04
+
+    name: Patch Test
+
+    services:
+      mysql:
+        image: mariadb:10.3
+        env:
+          MYSQL_ALLOW_EMPTY_PASSWORD: YES
+        ports:
+          - 3306:3306
+        options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3
+
+    steps:
+      - name: Clone
+        uses: actions/checkout@v2
+
+      - name: Setup Python
+        uses: actions/setup-python@v2
+        with:
+          python-version: 3.6
+
+      - name: Add to Hosts
+        run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
+
+      - name: Cache pip
+        uses: actions/cache@v2
+        with:
+          path: ~/.cache/pip
+          key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
+          restore-keys: |
+            ${{ runner.os }}-pip-
+            ${{ runner.os }}-
+
+      - name: Cache node modules
+        uses: actions/cache@v2
+        env:
+          cache-name: cache-node-modules
+        with:
+          path: ~/.npm
+          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
+          restore-keys: |
+            ${{ runner.os }}-build-${{ env.cache-name }}-
+            ${{ runner.os }}-build-
+            ${{ runner.os }}-
+
+      - name: Get yarn cache directory path
+        id: yarn-cache-dir-path
+        run: echo "::set-output name=dir::$(yarn cache dir)"
+
+      - uses: actions/cache@v2
+        id: yarn-cache
+        with:
+          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
+          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+          restore-keys: |
+            ${{ runner.os }}-yarn-
+
+      - name: Install
+        run: bash ${GITHUB_WORKSPACE}/.github/helper/install.sh
+
+      - name: Run Patch Tests
+        run: cd ~/frappe-bench/ && wget http://build.erpnext.com/20171108_190013_955977f8_database.sql.gz &&  bench --site test_site --force restore ~/frappe-bench/20171108_190013_955977f8_database.sql.gz && bench --site test_site migrate
diff --git a/.github/workflows/server-tests.yml b/.github/workflows/server-tests.yml
new file mode 100644
index 0000000..92685e2
--- /dev/null
+++ b/.github/workflows/server-tests.yml
@@ -0,0 +1,110 @@
+name: Server
+
+on: [pull_request, workflow_dispatch]
+
+jobs:
+  test:
+    runs-on: ubuntu-18.04
+
+    strategy:
+      fail-fast: false
+
+      matrix:
+        container: [1, 2, 3]
+
+    name: Python Unit Tests
+
+    services:
+      mysql:
+        image: mariadb:10.3
+        env:
+          MYSQL_ALLOW_EMPTY_PASSWORD: YES
+        ports:
+          - 3306:3306
+        options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3
+
+    steps:
+      - name: Clone
+        uses: actions/checkout@v2
+
+      - name: Setup Python
+        uses: actions/setup-python@v2
+        with:
+          python-version: 3.7
+
+      - name: Add to Hosts
+        run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts
+
+      - name: Cache pip
+        uses: actions/cache@v2
+        with:
+          path: ~/.cache/pip
+          key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
+          restore-keys: |
+            ${{ runner.os }}-pip-
+            ${{ runner.os }}-
+
+      - name: Cache node modules
+        uses: actions/cache@v2
+        env:
+          cache-name: cache-node-modules
+        with:
+          path: ~/.npm
+          key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
+          restore-keys: |
+            ${{ runner.os }}-build-${{ env.cache-name }}-
+            ${{ runner.os }}-build-
+            ${{ runner.os }}-
+
+      - name: Get yarn cache directory path
+        id: yarn-cache-dir-path
+        run: echo "::set-output name=dir::$(yarn cache dir)"
+
+      - uses: actions/cache@v2
+        id: yarn-cache
+        with:
+          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
+          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+          restore-keys: |
+            ${{ runner.os }}-yarn-
+
+      - name: Install
+        run: bash ${GITHUB_WORKSPACE}/.github/helper/install.sh
+
+      - name: Run Tests
+        run: cd ~/frappe-bench/ && bench --site test_site run-parallel-tests --app erpnext --use-orchestrator --with-coverage
+        env:
+          TYPE: server
+          CI_BUILD_ID: ${{ github.run_id }}
+          ORCHESTRATOR_URL: http://test-orchestrator.frappe.io
+
+      - name: Upload Coverage Data
+        run: |
+          cp ~/frappe-bench/sites/.coverage ${GITHUB_WORKSPACE}
+          cd ${GITHUB_WORKSPACE}
+          pip3 install coverage==5.5
+          pip3 install coveralls==3.0.1
+          coveralls
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          COVERALLS_FLAG_NAME: run-${{ matrix.container }}
+          COVERALLS_SERVICE_NAME: ${{ github.event_name == 'pull_request' && 'github' || 'github-actions' }}
+          COVERALLS_PARALLEL: true
+
+  coveralls:
+    name: Coverage Wrap Up
+    needs: test
+    container: python:3-slim
+    runs-on: ubuntu-18.04
+    steps:
+      - name: Clone
+        uses: actions/checkout@v2
+
+      - name: Coveralls Finished
+        run: |
+          cd ${GITHUB_WORKSPACE}
+          pip3 install coverage==5.5
+          pip3 install coveralls==3.0.1
+          coveralls --finish
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
index 652fbdc..63c51c4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,7 @@
 .wnf-lang-status
 *.egg-info
 dist/
+erpnext/public/dist
 erpnext/docs/current
 *.swp
 *.swo
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index 6775398..ad971e2 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -5,7 +5,7 @@
 from erpnext.hooks import regional_overrides
 from frappe.utils import getdate
 
-__version__ = '13.2.1'
+__version__ = '13.3.0'
 
 def get_default_company(user=None):
 	'''Get default company for user'''
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general.json
index da1d10d..d60c559 100644
--- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general.json
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general.json
@@ -1,1609 +1,1609 @@
 {
-    "country_code": "fr", 
-    "name": "France - Plan Comptable General", 
+    "country_code": "fr",
+    "name": "France - Plan Comptable General",
     "tree": {
         "1-Comptes de Capitaux": {
             "10-Capital et R\u00e9serves": {
                 "101-Capital": {
-                    "1011-Capital souscrit - non appel\u00e9": {}, 
-                    "1012-Capital souscrit - appel\u00e9, non vers\u00e9": {}, 
+                    "1011-Capital souscrit - non appel\u00e9": {},
+                    "1012-Capital souscrit - appel\u00e9, non vers\u00e9": {},
                     "1013-Capital souscrit - appel\u00e9, vers\u00e9": {
-                        "10131-Capital non amorti": {}, 
+                        "10131-Capital non amorti": {},
                         "10132-Capital amorti": {}
-                    }, 
+                    },
                     "1018-Capital souscrit soumis \u00e0 des r\u00e9glementations particuli\u00e8res": {}
-                }, 
-                "102-Fonds fiduciaires": {}, 
+                },
+                "102-Fonds fiduciaires": {},
                 "104-Primes li\u00e9es au capital social": {
-                    "1041-Primes d'\u00e9mission": {}, 
-                    "1042-Primes de fusion": {}, 
-                    "1043-Primes d'apport": {}, 
-                    "1044-Primes de conversion d'obligations en actions": {}, 
+                    "1041-Primes d'\u00e9mission": {},
+                    "1042-Primes de fusion": {},
+                    "1043-Primes d'apport": {},
+                    "1044-Primes de conversion d'obligations en actions": {},
                     "1045-Bons de souscription d'actions": {}
-                }, 
+                },
                 "105-Ecarts de r\u00e9\u00e9valuation": {
-                    "1051-R\u00e9serve sp\u00e9ciale de r\u00e9\u00e9valuation": {}, 
-                    "1052-Ecart de r\u00e9\u00e9valuation libre": {}, 
-                    "1053-R\u00e9serve de r\u00e9\u00e9valuation": {}, 
-                    "1055-Ecarts de r\u00e9\u00e9valuation (autres op\u00e9rations l\u00e9gales)": {}, 
-                    "1057-Autres \u00e9carts de r\u00e9\u00e9valuation en France": {}, 
+                    "1051-R\u00e9serve sp\u00e9ciale de r\u00e9\u00e9valuation": {},
+                    "1052-Ecart de r\u00e9\u00e9valuation libre": {},
+                    "1053-R\u00e9serve de r\u00e9\u00e9valuation": {},
+                    "1055-Ecarts de r\u00e9\u00e9valuation (autres op\u00e9rations l\u00e9gales)": {},
+                    "1057-Autres \u00e9carts de r\u00e9\u00e9valuation en France": {},
                     "1058-Autres \u00e9carts de r\u00e9\u00e9valuation \u00e0 l'\u00e9tranger": {}
-                }, 
+                },
                 "106-R\u00e9serves": {
                     "1061-R\u00e9serve l\u00e9gale": {
-                        "10611-R\u00e9serve l\u00e9gale proprement dite": {}, 
+                        "10611-R\u00e9serve l\u00e9gale proprement dite": {},
                         "10612-Plus-values nettes \u00e0 long terme": {}
-                    }, 
-                    "1062-R\u00e9serves indisponibles": {}, 
-                    "1063-R\u00e9serves statutaires ou contractuelles": {}, 
+                    },
+                    "1062-R\u00e9serves indisponibles": {},
+                    "1063-R\u00e9serves statutaires ou contractuelles": {},
                     "1064-R\u00e9serves r\u00e9glement\u00e9es": {
-                        "10641-Plus-values nettes \u00e0 long terme": {}, 
-                        "10643-R\u00e9serves cons\u00e9cutives \u00e0 l'octroi de subventions d'investissement": {}, 
+                        "10641-Plus-values nettes \u00e0 long terme": {},
+                        "10643-R\u00e9serves cons\u00e9cutives \u00e0 l'octroi de subventions d'investissement": {},
                         "10648-Autres r\u00e9serves r\u00e9glement\u00e9es": {}
-                    }, 
+                    },
                     "1068-Autres r\u00e9serves": {
-                        "10681-R\u00e9serve de propre assureur": {}, 
+                        "10681-R\u00e9serve de propre assureur": {},
                         "10688-R\u00e9serves diverses": {}
                     }
-                }, 
-                "107-Ecarts d'\u00e9quivalence": {}, 
-                "108-Compte de l'exploitant": {}, 
+                },
+                "107-Ecarts d'\u00e9quivalence": {},
+                "108-Compte de l'exploitant": {},
                 "109-Actionnaires: Capital souscrit - non appel\u00e9": {}
-            }, 
+            },
             "11-Report \u00e0 Nouveau": {
-                "110-Report \u00e0 nouveau (solde cr\u00e9diteur)": {}, 
+                "110-Report \u00e0 nouveau (solde cr\u00e9diteur)": {},
                 "119-Report \u00e0 nouveau (solde d\u00e9biteur)": {}
-            }, 
+            },
             "12-R\u00e9sultat de l'Exercice": {
-                "120-R\u00e9sultat de l'exercice (b\u00e9n\u00e9fice)": {}, 
+                "120-R\u00e9sultat de l'exercice (b\u00e9n\u00e9fice)": {},
                 "129-R\u00e9sultat de l'exercice (perte)": {}
-            }, 
+            },
             "13-Subventions d'Investissement": {
                 "131-Subventions d'\u00e9quipement": {
-                    "1311-Etat": {}, 
-                    "1312-R\u00e9gions": {}, 
-                    "1313-D\u00e9partements": {}, 
-                    "1314-Communes": {}, 
-                    "1315-Collectivit\u00e9s publiques": {}, 
-                    "1316-Entreprises publiques": {}, 
-                    "1317-Entreprises et organismes priv\u00e9s": {}, 
+                    "1311-Etat": {},
+                    "1312-R\u00e9gions": {},
+                    "1313-D\u00e9partements": {},
+                    "1314-Communes": {},
+                    "1315-Collectivit\u00e9s publiques": {},
+                    "1316-Entreprises publiques": {},
+                    "1317-Entreprises et organismes priv\u00e9s": {},
                     "1318-Autres": {}
-                }, 
-                "138-Autres subventions d'investissement (m\u00eame ventilation que celle du compte 131)": {}, 
+                },
+                "138-Autres subventions d'investissement (m\u00eame ventilation que celle du compte 131)": {},
                 "139-Subventions d'investissement inscrites au compte de r\u00e9sultat": {
                     "1391-Subventions d'\u00e9quipement": {
-                        "13911-Subventions d'\u00e9quipement": {
-                            "13911-Etat": {}, 
-                            "13912-R\u00e9gions": {}, 
-                            "13913-D\u00e9partements": {}, 
-                            "13914-Communes": {}, 
-                            "13915-Collectivit\u00e9s publiques": {}, 
-                            "13916-Entreprises publiques": {}, 
-                            "13917-Entreprises et organismes priv\u00e9s": {}, 
-                            "13918-Autres": {}
-                        }
-                    }, 
+                        "13911-Etat": {},
+                        "13912-R\u00e9gions": {},
+                        "13913-D\u00e9partements": {},
+                        "13914-Communes": {},
+                        "13915-Collectivit\u00e9s publiques": {},
+                        "13916-Entreprises publiques": {},
+                        "13917-Entreprises et organismes priv\u00e9s": {},
+                        "13918-Autres": {}
+                    },
                     "1398-Autres subventions d'investissement (m\u00eame ventilation que celle du compte 1391)": {}
                 }
-            }, 
+            },
             "14-Provisions R\u00e9glement\u00e9es": {
                 "142-Provisions r\u00e9glement\u00e9es relative aux immobilisations": {
-                    "1423-Provisions pour reconstitution des gisements miniers et p\u00e9troliers": {}, 
+                    "1423-Provisions pour reconstitution des gisements miniers et p\u00e9troliers": {},
                     "1424-Provisions pour investissement (participation des salari\u00e9s)": {}
-                }, 
+                },
                 "143-Provisions r\u00e9glement\u00e9es relatives aux stocks": {
-                    "1431-Hausse des prix": {}, 
+                    "1431-Hausse des prix": {},
                     "1432-Fluctuation des cours": {}
-                }, 
-                "144-Provisions r\u00e9glement\u00e9es relatives aux autres \u00e9l\u00e9ments de l'actif": {}, 
-                "145-Amortissements d\u00e9rogatoires": {}, 
-                "146-Provision sp\u00e9ciale de r\u00e9\u00e9valuation": {}, 
-                "147-Plus-values r\u00e9investies": {}, 
+                },
+                "144-Provisions r\u00e9glement\u00e9es relatives aux autres \u00e9l\u00e9ments de l'actif": {},
+                "145-Amortissements d\u00e9rogatoires": {},
+                "146-Provision sp\u00e9ciale de r\u00e9\u00e9valuation": {},
+                "147-Plus-values r\u00e9investies": {},
                 "148-Autres provisions r\u00e9glement\u00e9es": {}
-            }, 
+            },
             "15-Provisions": {
                 "151-Provisions pour risques": {
-                    "1511-Provisions pour litiges": {}, 
-                    "1512-Provisions pour garanties donn\u00e9es aux clients": {}, 
-                    "1513-Provisions pour pertes sur march\u00e9s \u00e0 terme": {}, 
-                    "1514-Provisions pour amendes et p\u00e9nalit\u00e9s": {}, 
-                    "1515-Provisions pour pertes de change": {}, 
-                    "1516-Provisions pour pertes sur contrats": {}, 
+                    "1511-Provisions pour litiges": {},
+                    "1512-Provisions pour garanties donn\u00e9es aux clients": {},
+                    "1513-Provisions pour pertes sur march\u00e9s \u00e0 terme": {},
+                    "1514-Provisions pour amendes et p\u00e9nalit\u00e9s": {},
+                    "1515-Provisions pour pertes de change": {},
+                    "1516-Provisions pour pertes sur contrats": {},
                     "1518-Autres provisions pour risques": {}
-                }, 
-                "153-Provisions pour pensions et obligations similaires": {}, 
-                "154-Provisions pour restructurations": {}, 
-                "155-Provisions pour imp\u00f4ts": {}, 
-                "156-Provisions pour renouvellement des immobilisations (entreprises concessionnaires) ": {}, 
+                },
+                "153-Provisions pour pensions et obligations similaires": {},
+                "154-Provisions pour restructurations": {},
+                "155-Provisions pour imp\u00f4ts": {},
+                "156-Provisions pour renouvellement des immobilisations (entreprises concessionnaires) ": {},
                 "157-Provisions pour charges \u00e0 r\u00e9partir sur plusieurs exercices": {
                     "1572-Provisions pour gros entretien ou grandes r\u00e9visions": {}
-                }, 
+                },
                 "158-Autres provisions pour charges": {
                     "1581-Provisions pour remises en \u00e9tat": {}
                 }
-            }, 
+            },
             "16-Emprunts et Dettes Assimil\u00e9es": {
-                "161-Emprunts obligataires convertibles": {}, 
-                "162-Obligations repr\u00e9sentatives de passifs nets remis en fiducie": {}, 
-                "163-Autres emprunts obligataires": {}, 
-                "164-Emprunts aupr\u00e8s des \u00e9tablissements de cr\u00e9dit": {}, 
+                "161-Emprunts obligataires convertibles": {},
+                "162-Obligations repr\u00e9sentatives de passifs nets remis en fiducie": {},
+                "163-Autres emprunts obligataires": {},
+                "164-Emprunts aupr\u00e8s des \u00e9tablissements de cr\u00e9dit": {},
                 "165-D\u00e9p\u00f4ts et cautionnements re\u00e7us": {
-                    "1651-D\u00e9p\u00f4ts": {}, 
+                    "1651-D\u00e9p\u00f4ts": {},
                     "1655-Cautionnements": {}
-                }, 
+                },
                 "166-Participation des salari\u00e9s aux r\u00e9sultats": {
-                    "1661-Comptes bloqu\u00e9s": {}, 
+                    "1661-Comptes bloqu\u00e9s": {},
                     "1662-Fonds de participation": {}
-                }, 
+                },
                 "167-Emprunts et dettes assortis de conditions particuli\u00e8res": {
-                    "1671-Emissions de titres participatifs": {}, 
-                    "1674-Avances conditionn\u00e9es de l'Etat": {}, 
+                    "1671-Emissions de titres participatifs": {},
+                    "1674-Avances conditionn\u00e9es de l'Etat": {},
                     "1675-Emprunts participatifs": {}
-                }, 
+                },
                 "168-Autres emprunts et dettes assimil\u00e9es": {
-                    "1681-Autres emprunts": {}, 
-                    "1685-Rentes viag\u00e8res capitalis\u00e9es": {}, 
-                    "1687-Autres dettes": {}, 
+                    "1681-Autres emprunts": {},
+                    "1685-Rentes viag\u00e8res capitalis\u00e9es": {},
+                    "1687-Autres dettes": {},
                     "1688-Int\u00e9r\u00eats courus": {
-                        "16881-Int\u00e9r\u00eats courus sur emprunts obligataires convertibles": {}, 
-                        "16883-Int\u00e9r\u00eats courus sur autres emprunts obligataires": {}, 
-                        "16884-Int\u00e9r\u00eats courus sur emprunts aupr\u00e8s des \u00e9tablissements de cr\u00e9dit": {}, 
-                        "16885-Int\u00e9r\u00eats courus sur d\u00e9p\u00f4ts et cautionnements re\u00e7us": {}, 
-                        "16886-Int\u00e9r\u00eats courus sur participation des salari\u00e9s aux r\u00e9sultats": {}, 
-                        "16887-Int\u00e9r\u00eats courus sur emprunts et dettes assortis de conditions particuli\u00e8res": {}, 
+                        "16881-Int\u00e9r\u00eats courus sur emprunts obligataires convertibles": {},
+                        "16883-Int\u00e9r\u00eats courus sur autres emprunts obligataires": {},
+                        "16884-Int\u00e9r\u00eats courus sur emprunts aupr\u00e8s des \u00e9tablissements de cr\u00e9dit": {},
+                        "16885-Int\u00e9r\u00eats courus sur d\u00e9p\u00f4ts et cautionnements re\u00e7us": {},
+                        "16886-Int\u00e9r\u00eats courus sur participation des salari\u00e9s aux r\u00e9sultats": {},
+                        "16887-Int\u00e9r\u00eats courus sur emprunts et dettes assortis de conditions particuli\u00e8res": {},
                         "16888-Int\u00e9r\u00eats courus sur autres emprunts et dettes assimil\u00e9es": {}
-                    }, 
+                    },
                     "169-Primes de remboursement des obligations": {}
                 }
-            }, 
+            },
             "17-Dettes Rattach\u00e9es \u00e0 des Participations": {
-                "171-Dettes rattach\u00e9es \u00e0 des participations (groupe)": {}, 
-                "174-Dettes rattach\u00e9es \u00e0 des participations (hors groupe)": {}, 
+                "171-Dettes rattach\u00e9es \u00e0 des participations (groupe)": {},
+                "174-Dettes rattach\u00e9es \u00e0 des participations (hors groupe)": {},
                 "178-Dettes rattach\u00e9es \u00e0 des soci\u00e9t\u00e9s en participation": {
-                    "1781-Principal": {}, 
+                    "1781-Principal": {},
                     "1788-Int\u00e9r\u00eats courus": {}
                 }
-            }, 
+            },
             "18-Comptes de liaison des \u00e9tablisssements et soci\u00e9t\u00e9s en participation": {
-                "181-Comptes de liaison des \u00e9tablissements": {}, 
-                "186-Biens et prestations de services \u00e9chang\u00e9s entre \u00e9tablissements (charges)": {}, 
-                "187-Biens et prestations de services \u00e9chang\u00e9s entre \u00e9tablissements (produits)": {}, 
+                "181-Comptes de liaison des \u00e9tablissements": {},
+                "186-Biens et prestations de services \u00e9chang\u00e9s entre \u00e9tablissements (charges)": {},
+                "187-Biens et prestations de services \u00e9chang\u00e9s entre \u00e9tablissements (produits)": {},
                 "188-Comptes de liaison des soci\u00e9t\u00e9s en participation": {}
-            }, 
+            },
             "root_type": "Equity"
-        }, 
+        },
         "2-Comptes d'Immobilisations": {
             "20-Immobilisations incorporelles": {
                 "201-Frais \u00e9tablissement": {
-                    "2011-Frais de constitution": {}, 
+                    "2011-Frais de constitution": {},
                     "2012-Frais de premier \u00e9tablissement": {
-                        "20121-Frais de prospection": {}, 
+                        "20121-Frais de prospection": {},
                         "20122-Frais de publicit\u00e9": {}
-                    }, 
+                    },
                     "2013-Frais d'augmentation de capital et d'op\u00e9rations diverses (fusions, scissions, transformations)": {}
-                }, 
-                "203-Frais de recherche et de d\u00e9veloppement": {}, 
-                "205-Concessions et droits similaires, brevets, licences, marques, proc\u00e9d\u00e9s, logiciels, droits et valeurs similaires": {}, 
-                "206-Droit au bail": {}, 
-                "207-Fonds commercial": {}, 
+                },
+                "203-Frais de recherche et de d\u00e9veloppement": {},
+                "205-Concessions et droits similaires, brevets, licences, marques, proc\u00e9d\u00e9s, logiciels, droits et valeurs similaires": {},
+                "206-Droit au bail": {},
+                "207-Fonds commercial": {},
                 "208-Autres immobilisations incorporelles": {
                     "2081-Mali de fusion sur actifs incorporels": {}
                 }
-            }, 
+            },
             "21-Immobilisations corporelles": {
                 "211-Terrains": {
                     "2111-Terrains nus": {
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2112-Terrains am\u00e9nag\u00e9s": {
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2113-Sous-sols et sur-sols": {
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2114-Terrains de carri\u00e8res (tr\u00e9fonds)": {
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2115-Terrains b\u00e2tis": {
                         "21151-Ensembles immobiliers industriels (A, B)": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "21155-Ensembles immobiliers administratifs et commerciaux (A, B)": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "21158-Autres ensembles immobiliers": {
                             "211581-Autres ensembles immobiliers affect\u00e9s aux op\u00e9rations professionnelles (A, B)": {
                                 "account_type": "Fixed Asset"
-                            }, 
+                            },
                             "211588-Autres ensembles immobiliers affect\u00e9s aux op\u00e9rations non professionnelles (A, B)": {
                                 "account_type": "Fixed Asset"
-                            }, 
+                            },
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "account_type": "Fixed Asset"
-                }, 
+                },
                 "212-Agencements et am\u00e9nagements de terrains (m\u00eame ventilation que celle du compte 211)": {
                     "account_type": "Fixed Asset"
-                }, 
+                },
                 "213-Constructions": {
                     "2131-B\u00e2timents": {
                         "21311-Ensembles immobiliers industriels (A, B)": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "21315-Ensembles immobiliers administratifs et commerciaux (A, B)": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "21318-Autres ensembles immobiliers": {
                             "213181-Autres ensembles immobiliers affect\u00e9s aux op\u00e9rations professionnelles (A, B)": {
                                 "account_type": "Fixed Asset"
-                            }, 
+                            },
                             "213188-Autres ensembles immobiliers affect\u00e9s aux op\u00e9rations non professionnelles (A, B)": {
                                 "account_type": "Fixed Asset"
-                            }, 
+                            },
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2135-Installations g\u00e9n\u00e9rales, agencements, am\u00e9nagements des constructions": {
                         "21351-Ensembles immobiliers industriels (A, B)": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "21355-Ensembles immobiliers administratifs et commerciaux (A, B)": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "21358-Autres ensembles immobiliers": {
                             "213581-Autres ensembles immobiliers affect\u00e9s aux op\u00e9rations professionnelles (A, B)": {
                                 "account_type": "Fixed Asset"
-                            }, 
+                            },
                             "213588-Autres ensembles immobiliers affect\u00e9s aux op\u00e9rations non professionnelles (A, B)": {
                                 "account_type": "Fixed Asset"
-                            }, 
+                            },
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2138-Ouvrages d'infrastructure": {
                         "21381-Voies de terre": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "21382-Voies de fer": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "21383-Voies d'eau": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "21384-Barrages": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "21385-Pistes d'a\u00e9rodromes": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "account_type": "Fixed Asset"
-                }, 
+                },
                 "214-Constructions sur sol d'autrui (m\u00eame ventilation que celle du compte 213)": {
                     "account_type": "Fixed Asset"
-                }, 
+                },
                 "215-Installations techniques, mat\u00e9riel et outillage industriels": {
                     "2151-Installations complexes sp\u00e9cialis\u00e9es": {
                         "21511-Installations complexes sp\u00e9cialis\u00e9es - sur sol propre": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "21514-Installations complexes sp\u00e9cialis\u00e9es - sur sol d'autrui": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2153-Installations \u00e0 caract\u00e8re sp\u00e9cifique": {
                         "21531-Installations \u00e0 caract\u00e8re sp\u00e9cifique - sur sol propre": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "21534-Installations \u00e0 caract\u00e8re sp\u00e9cifique - sur sol d'autrui": {
                             "account_type": "Fixed Asset"
-                        }, 
+                        },
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2154-Mat\u00e9riel industriel": {
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2155-Outillage industriel": {
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2157-Agencements et am\u00e9nagements du mat\u00e9riel et outillage industriel": {
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "account_type": "Fixed Asset"
-                }, 
+                },
                 "218-Autres immobilisations corporelles": {
                     "2181-Installations g\u00e9n\u00e9rales, agencements, am\u00e9nagements divers": {
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2182-Mat\u00e9riel de transport": {
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2183-Mat\u00e9riel de bureau et mat\u00e9riel informatique": {
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2184-Mobilier": {
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2185-Cheptel": {
                         "account_type": "Fixed Asset"
-                    }, 
+                    },
                     "2186-Emballages r\u00e9cup\u00e9rables": {
                         "account_type": "Fixed Asset"
-                    }, 
-                    "2187-Mali de fusion sur actifs corporels": {}, 
+                    },
+                    "2187-Mali de fusion sur actifs corporels": {},
                     "account_type": "Fixed Asset"
-                }, 
+                },
                 "account_type": "Fixed Asset"
-            }, 
-            "22-Immobilisations mises en concession": {}, 
+            },
+            "22-Immobilisations mises en concession": {},
             "23-Immobilisations en cours": {
                 "231-Immobilisations corporelles en cours": {
-                    "2312-Terrains": {}, 
-                    "2313-Constructions": {}, 
-                    "2315-Installations techniques, mat\u00e9riel et outillage industriels": {}, 
+                    "2312-Terrains": {},
+                    "2313-Constructions": {},
+                    "2315-Installations techniques, mat\u00e9riel et outillage industriels": {},
                     "2318-Autres immobilisations corporelles": {}
-                }, 
-                "232-Immobilisations incorporelles en cours": {}, 
-                "237-Avances et acomptes vers\u00e9s sur commandes d'immobilisations incorporelles": {}, 
+                },
+                "232-Immobilisations incorporelles en cours": {},
+                "237-Avances et acomptes vers\u00e9s sur commandes d'immobilisations incorporelles": {},
                 "238-Avances et acomptes vers\u00e9s sur commandes d'immobilisations corporelles": {
-                    "2382-Terrains": {}, 
-                    "2383-Constructions": {}, 
-                    "2385-Installations techniques, mat\u00e9riel et outillage industriels": {}, 
+                    "2382-Terrains": {},
+                    "2383-Constructions": {},
+                    "2385-Installations techniques, mat\u00e9riel et outillage industriels": {},
                     "2388-Autres immobilisations corporelles": {}
                 }
-            }, 
+            },
             "25-Parts dans des entreprises li\u00e9es et cr\u00e9ances sur des entreprises li\u00e9es": {
                 "is_group": 1
-            }, 
+            },
             "26-Participations et cr\u00e9ances rattach\u00e9es \u00e0 des participations": {
                 "261-Titres de participation": {
-                    "2611-Actions": {}, 
+                    "2611-Actions": {},
                     "2618-Autres titres": {}
-                }, 
+                },
                 "266-Autres formes de participation": {
                     "2661-Droit repr\u00e9sentatifs d'actifs nets remis en fiducie": {}
-                }, 
+                },
                 "267-Cr\u00e9ances rattach\u00e9es \u00e0 des participations": {
-                    "2671-Cr\u00e9ances rattach\u00e9es \u00e0 des participations (groupe)": {}, 
-                    "2674-Cr\u00e9ances rattach\u00e9es \u00e0 des participations (hors groupe)": {}, 
-                    "2675-Versements repr\u00e9sentatifs d'apports non capitalis\u00e9s (appel de fonds)": {}, 
-                    "2676-Avances consolidables": {}, 
-                    "2677-Autres cr\u00e9ances rattach\u00e9es \u00e0 des participations": {}, 
+                    "2671-Cr\u00e9ances rattach\u00e9es \u00e0 des participations (groupe)": {},
+                    "2674-Cr\u00e9ances rattach\u00e9es \u00e0 des participations (hors groupe)": {},
+                    "2675-Versements repr\u00e9sentatifs d'apports non capitalis\u00e9s (appel de fonds)": {},
+                    "2676-Avances consolidables": {},
+                    "2677-Autres cr\u00e9ances rattach\u00e9es \u00e0 des participations": {},
                     "2678-Int\u00e9r\u00eats courus": {}
-                }, 
+                },
                 "268-Cr\u00e9ances rattach\u00e9es \u00e0 des soci\u00e9t\u00e9s en participation": {
-                    "2681-Principal": {}, 
+                    "2681-Principal": {},
                     "2688-Int\u00e9r\u00eats courus": {}
-                }, 
+                },
                 "269-Versements restant \u00e0 effectuer sur titres de participation non lib\u00e9r\u00e9s": {}
-            }, 
+            },
             "27-Autres immobilisations financi\u00e8res": {
                 "271-Titres immobilis\u00e9s autres que les titres immobilis\u00e9s de l'activit\u00e9 de portefeuille (droit de propri\u00e9t\u00e9)": {
-                    "2711-Actions": {}, 
+                    "2711-Actions": {},
                     "2718-Autres titres": {}
-                }, 
+                },
                 "272-Titres immobilis\u00e9s (droit de cr\u00e9ance)": {
-                    "2721-Obligations": {}, 
+                    "2721-Obligations": {},
                     "2722-Bons": {}
-                }, 
-                "273-Titres immobilis\u00e9s de l'activit\u00e9 de portefeuille": {}, 
+                },
+                "273-Titres immobilis\u00e9s de l'activit\u00e9 de portefeuille": {},
                 "274-Pr\u00eats": {
-                    "2741-Pr\u00eats participatifs": {}, 
-                    "2742-Pr\u00eats aux associ\u00e9s": {}, 
-                    "2743-Pr\u00eats au personnel": {}, 
+                    "2741-Pr\u00eats participatifs": {},
+                    "2742-Pr\u00eats aux associ\u00e9s": {},
+                    "2743-Pr\u00eats au personnel": {},
                     "2748-Autres pr\u00eats": {}
-                }, 
+                },
                 "275-D\u00e9p\u00f4ts et cautionnements vers\u00e9s": {
-                    "2751-D\u00e9p\u00f4ts": {}, 
+                    "2751-D\u00e9p\u00f4ts": {},
                     "2755-Cautionnements": {}
-                }, 
+                },
                 "276-Autres cr\u00e9ances immobilis\u00e9es": {
-                    "2761-Cr\u00e9ances diverses": {}, 
+                    "2761-Cr\u00e9ances diverses": {},
                     "2768-Int\u00e9r\u00eats courus": {
-                        "27682-Int\u00e9r\u00eats courus sur titres immobilis\u00e9s (droit de cr\u00e9ance)": {}, 
-                        "27684-Int\u00e9r\u00eats courus sur pr\u00eats": {}, 
-                        "27685-Int\u00e9r\u00eats courus sur d\u00e9p\u00f4ts et cautionnements": {}, 
+                        "27682-Int\u00e9r\u00eats courus sur titres immobilis\u00e9s (droit de cr\u00e9ance)": {},
+                        "27684-Int\u00e9r\u00eats courus sur pr\u00eats": {},
+                        "27685-Int\u00e9r\u00eats courus sur d\u00e9p\u00f4ts et cautionnements": {},
                         "27688-Int\u00e9r\u00eats courus sur cr\u00e9ances diverses": {}
                     }
-                }, 
+                },
                 "277-(Actions propres ou parts propres)": {
-                    "2771-Actions propres ou parts propres": {}, 
+                    "2771-Actions propres ou parts propres": {},
                     "2772-Actions propres ou parts propres en voie d'annulation": {}
-                }, 
-                "278-Mali de fusion sur actifs financiers": {}, 
+                },
+                "278-Mali de fusion sur actifs financiers": {},
                 "279-Versements restant \u00e0 effectuer sur titres immobilis\u00e9s non lib\u00e9r\u00e9s": {}
-            }, 
+            },
             "28-Amortissements des immobilisations": {
                 "280-Amortissements des immobilisations incorporelles": {
                     "2801-Frais d'\u00e9tablissement (m\u00eame ventilation que celle du compte 212)": {
                         "account_type": "Accumulated Depreciation"
-                    }, 
+                    },
                     "2803-Frais de recherche et de d\u00e9veloppement": {
                         "account_type": "Accumulated Depreciation"
-                    }, 
+                    },
                     "2805-Concessions et droits similaires, brevets, licences, logiciels, droits et valeurs similaires": {
                         "account_type": "Accumulated Depreciation"
-                    }, 
+                    },
                     "2807-Fonds commercial": {
                         "account_type": "Accumulated Depreciation"
-                    }, 
+                    },
                     "2808-Autres immobilisations incorporelles": {
                         "28081-Mali de fusion sur actifs incorporels": {
                             "account_type": "Accumulated Depreciation"
-                        }, 
+                        },
                         "account_type": "Accumulated Depreciation"
-                    }, 
+                    },
                     "account_type": "Accumulated Depreciation"
-                }, 
+                },
                 "281-Amortissements des immobilisations corporelles": {
                     "2811-Terrains de gisement": {
                         "account_type": "Accumulated Depreciation"
-                    }, 
+                    },
                     "2812-Agencements, am\u00e9nagements de terrains (m\u00eame ventilation que celle du compte 212)": {
                         "account_type": "Accumulated Depreciation"
-                    }, 
+                    },
                     "2813-Constructions (m\u00eame ventilation que celle du compte 213)": {
                         "account_type": "Accumulated Depreciation"
-                    }, 
+                    },
                     "2814-Constructions sur sol d'autrui (m\u00eame ventilation que celle du compte du 214)": {
                         "account_type": "Accumulated Depreciation"
-                    }, 
+                    },
                     "2815-Installations techniques, mat\u00e9riel et outillage industriels (m\u00eame ventilation que celle du compte 218)": {
                         "account_type": "Accumulated Depreciation"
-                    }, 
+                    },
                     "2818-Autres immobilisations corporelles (m\u00eame ventilation que celle du compte 218)": {
                         "28187-Mali de fusion sur actifs corporels": {
                             "account_type": "Accumulated Depreciation"
-                        }, 
+                        },
                         "account_type": "Accumulated Depreciation"
-                    }, 
+                    },
                     "account_type": "Accumulated Depreciation"
-                }, 
-                "282-Amortissements des immobilisations mises en concession": {}, 
+                },
+                "282-Amortissements des immobilisations mises en concession": {},
                 "account_type": "Accumulated Depreciation"
-            }, 
+            },
             "29-D\u00e9pr\u00e9ciations des immobilisations": {
                 "290-D\u00e9pr\u00e9ciations des immobilisations incorporelles": {
-                    "2905-Marques,  proc\u00e9d\u00e9s, droits et valeurs similaires": {}, 
-                    "2906-Droit au bail": {}, 
-                    "2907-Fonds commercial": {}, 
+                    "2905-Marques,  proc\u00e9d\u00e9s, droits et valeurs similaires": {},
+                    "2906-Droit au bail": {},
+                    "2907-Fonds commercial": {},
                     "2908-Autres immobilisations incorporelles": {
                         "29081-Mali de fusion sur actifs incorporels": {}
                     }
-                }, 
+                },
                 "291-D\u00e9pr\u00e9ciations des immobilisations corporelles (m\u00eame ventilation que celle du compte 21)": {
                     "2911-Terrains (autres que terrains de gisement)": {
                         "29187-Mali de fusion sur actifs corporels": {}
                     }
-                }, 
-                "292-D\u00e9pr\u00e9ciations des immobilisations mises en concession": {}, 
+                },
+                "292-D\u00e9pr\u00e9ciations des immobilisations mises en concession": {},
                 "293-D\u00e9pr\u00e9ciations des immobilisations en cours": {
-                    "2931-Immobilisations corporelles en cours": {}, 
+                    "2931-Immobilisations corporelles en cours": {},
                     "2932-Immobilisations incorporelles en cours": {}
-                }, 
+                },
                 "296-D\u00e9pr\u00e9ciations des participations et cr\u00e9ances rattach\u00e9es \u00e0 des participations": {
-                    "2961-Titres de participation": {}, 
-                    "2966-Autres formes de participation": {}, 
-                    "2967-Cr\u00e9ances rattach\u00e9es \u00e0 des participations (m\u00eame ventilation que celle du compte 267)": {}, 
+                    "2961-Titres de participation": {},
+                    "2966-Autres formes de participation": {},
+                    "2967-Cr\u00e9ances rattach\u00e9es \u00e0 des participations (m\u00eame ventilation que celle du compte 267)": {},
                     "2968-Cr\u00e9ances rattach\u00e9es \u00e0 des soci\u00e9t\u00e9s en participation (m\u00eame ventilation que celle du compte 268)": {}
-                }, 
+                },
                 "297-D\u00e9pr\u00e9ciations des autres immobilisations financi\u00e8res": {
-                    "2971-Titres immobilis\u00e9s autres que les titres immobilis\u00e9s de l'activit\u00e9 de portefeuille - droit de propri\u00e9t\u00e9": {}, 
-                    "2972-Titres immobilis\u00e9s - droit de cr\u00e9ance (m\u00eame ventilation que celle du compte 272)": {}, 
-                    "2973- Titres immobilis\u00e9s de l'activit\u00e9 de portefuille": {}, 
-                    "2974-Pr\u00eats (m\u00eame ventilation que celle du compte 274)": {}, 
-                    "2975-D\u00e9p\u00f4ts et cautionnements vers\u00e9s (m\u00eame ventilation que celle du compte 275)": {}, 
+                    "2971-Titres immobilis\u00e9s autres que les titres immobilis\u00e9s de l'activit\u00e9 de portefeuille - droit de propri\u00e9t\u00e9": {},
+                    "2972-Titres immobilis\u00e9s - droit de cr\u00e9ance (m\u00eame ventilation que celle du compte 272)": {},
+                    "2973- Titres immobilis\u00e9s de l'activit\u00e9 de portefuille": {},
+                    "2974-Pr\u00eats (m\u00eame ventilation que celle du compte 274)": {},
+                    "2975-D\u00e9p\u00f4ts et cautionnements vers\u00e9s (m\u00eame ventilation que celle du compte 275)": {},
                     "2976-Autres cr\u00e9ances immobilis\u00e9es (m\u00eame ventilation que celle du compte 276)": {
                         "29787-Mali de fusion sur actifs financiers": {}
                     }
                 }
-            }, 
+            },
             "root_type": "Asset"
-        }, 
+        },
         "3-Comptes de Stocks et En-Cours": {
             "31-Mati\u00e8res premi\u00e8res (et fournitures)": {
-                "311-Mati\u00e8res (ou groupe) A": {}, 
-                "312-Mati\u00e8res (ou groupe) B": {}, 
+                "311-Mati\u00e8res (ou groupe) A": {},
+                "312-Mati\u00e8res (ou groupe) B": {},
                 "317-Fournitures A, B, C, ...": {}
-            }, 
+            },
             "32-Autres approvisionnements": {
                 "321-Mat\u00e8res consommables": {
-                    "3211-Mati\u00e8res (ou groupe) C": {}, 
+                    "3211-Mati\u00e8res (ou groupe) C": {},
                     "3212-Mati\u00e8res (ou groupe) D": {}
-                }, 
+                },
                 "322-Fournitures consommables": {
-                    "3221-Combustibles": {}, 
-                    "3222-Produits d'entretien": {}, 
-                    "3223-Fournitures d'atelier et d'usine": {}, 
-                    "3224-Fournitures de magasin": {}, 
+                    "3221-Combustibles": {},
+                    "3222-Produits d'entretien": {},
+                    "3223-Fournitures d'atelier et d'usine": {},
+                    "3224-Fournitures de magasin": {},
                     "3225-Fournitures de bureau": {}
-                }, 
+                },
                 "326-Emballages": {
-                    "3261-Emballages perdus": {}, 
-                    "3265-Emballages r\u00e9cup\u00e9rables non identifiables": {}, 
+                    "3261-Emballages perdus": {},
+                    "3265-Emballages r\u00e9cup\u00e9rables non identifiables": {},
                     "3267-Emballages \u00e0 usage mixte": {}
                 }
-            }, 
+            },
             "33-En-cours de production de biens": {
                 "331-Produits en cours": {
-                    "3311-Produits en cours P1": {}, 
+                    "3311-Produits en cours P1": {},
                     "3312-Produits en cours P2": {}
-                }, 
+                },
                 "335-Travaux en cours": {
-                    "Travaux en cours T1": {}, 
-                    "Travaux en cours T2": {}
+                    "3351-Travaux en cours T1": {},
+                    "3352-Travaux en cours T2": {}
                 }
-            }, 
+            },
             "34-En-cours de production de services": {
                 "341-Etudes en cours": {
-                    "3411-Etudes en cours E1": {}, 
+                    "3411-Etudes en cours E1": {},
                     "3412-Etudes en cours E2": {}
-                }, 
+                },
                 "345-Prestations de services en cours": {
-                    "3451-Prestations de services S1": {}, 
+                    "3451-Prestations de services S1": {},
                     "3452-Prestations de services S2": {}
                 }
-            }, 
+            },
             "35-Stocks de produits": {
                 "351-Produits interm\u00e9diaires": {
                     "3511-Produits interm\u00e9diaires (ou groupe) A": {
-                        "account_type": "Stock", 
+                        "account_type": "Stock",
                         "is_group": 1
-                    }, 
+                    },
                     "3512-Produits interm\u00e9diaires (ou groupe) B": {
-                        "account_type": "Stock", 
+                        "account_type": "Stock",
                         "is_group": 1
-                    }, 
+                    },
                     "account_type": "Stock"
-                }, 
+                },
                 "355-Produits finis": {
                     "3551-Produits finis (ou groupe) A": {
-                        "account_type": "Stock", 
+                        "account_type": "Stock",
                         "is_group": 1
-                    }, 
+                    },
                     "3552-Produits finis (ou groupe) B": {
-                        "account_type": "Stock", 
+                        "account_type": "Stock",
                         "is_group": 1
-                    }, 
+                    },
                     "account_type": "Stock"
-                }, 
+                },
                 "358-Produits r\u00e9siduels (ou mati\u00e8res de r\u00e9cup\u00e9ration)": {
                     "3581-D\u00e9chets": {
-                        "account_type": "Stock", 
+                        "account_type": "Stock",
                         "is_group": 1
-                    }, 
+                    },
                     "3585-Rebuts": {
-                        "account_type": "Stock", 
+                        "account_type": "Stock",
                         "is_group": 1
-                    }, 
+                    },
                     "3586-Mati\u00e8res de r\u00e9cup\u00e9ration": {
-                        "account_type": "Stock", 
+                        "account_type": "Stock",
                         "is_group": 1
-                    }, 
+                    },
                     "account_type": "Stock"
-                }, 
+                },
                 "account_type": "Stock"
-            }, 
-            "36-(Compte \u00e0 ouvrir, le cas \u00e9ch\u00e9ant, sous l'intitul\u00e9 \"stocks provenant d'immobilisations\")": {}, 
+            },
+            "36-(Compte \u00e0 ouvrir, le cas \u00e9ch\u00e9ant, sous l'intitul\u00e9 \"stocks provenant d'immobilisations\")": {},
             "37-Stocks de marchandises": {
-                "371-Marchandises (ou groupe) A": {}, 
+                "371-Marchandises (ou groupe) A": {},
                 "372-Marchandises (ou groupe) B": {}
-            }, 
-            "38-Stocks en voie d'acheminement, mis en d\u00e9p\u00f4t ou donn\u00e9s en consignation (en cas d'inventaire permanent en comptabilit\u00e9 g\u00e9n\u00e9rale)": {}, 
+            },
+            "38-Stocks en voie d'acheminement, mis en d\u00e9p\u00f4t ou donn\u00e9s en consignation (en cas d'inventaire permanent en comptabilit\u00e9 g\u00e9n\u00e9rale)": {
+                "account_type": "Stock"
+            },
             "39-D\u00e9pr\u00e9ciations des stocks et en-cours": {
                 "391-D\u00e9pr\u00e9ciations des mati\u00e8res premi\u00e8res (et fournitures)": {
-                    "3911-Mati\u00e8res (ou groupe) A": {}, 
-                    "3912-Mati\u00e8res (ou groupe) B": {}, 
+                    "3911-Mati\u00e8res (ou groupe) A": {},
+                    "3912-Mati\u00e8res (ou groupe) B": {},
                     "3917-Fournitures A, B, C, ...": {}
-                }, 
+                },
                 "392-D\u00e9pr\u00e9ciations des autres approvisionnements": {
-                    "3921-Mati\u00e8res consommables (m\u00eame ventilation que celle du compte 321)": {}, 
-                    "3922-Fournitures consommables (m\u00eame ventilation que celle du compte 322)": {}, 
+                    "3921-Mati\u00e8res consommables (m\u00eame ventilation que celle du compte 321)": {},
+                    "3922-Fournitures consommables (m\u00eame ventilation que celle du compte 322)": {},
                     "3926-Emballages (m\u00eame ventilation que celle du compte 326)": {}
-                }, 
+                },
                 "393-D\u00e9pr\u00e9ciations des en-cours de production de biens": {
-                    "3931-Etudes en cours (m\u00eame ventilation que celle du compte 341)": {}, 
+                    "3931-Etudes en cours (m\u00eame ventilation que celle du compte 341)": {},
                     "3935-Travaux en cours (m\u00eame ventilation que celle du compte 335)": {}
-                }, 
+                },
                 "394-D\u00e9pr\u00e9ciations des en-cours de production de services": {
-                    "3941-Etudes en cours (m\u00eame ventilation que celle du compte 341)": {}, 
+                    "3941-Etudes en cours (m\u00eame ventilation que celle du compte 341)": {},
                     "3945-Prestations de services en cours (m\u00eame ventilation que celle du compte 345)": {}
-                }, 
+                },
                 "395-D\u00e9pr\u00e9ciations des stocks de produits": {
-                    "3951-Produits interm\u00e9diaires (m\u00eame ventilation que celle du compte 351)": {}, 
+                    "3951-Produits interm\u00e9diaires (m\u00eame ventilation que celle du compte 351)": {},
                     "3955-Produits finis (m\u00eame ventilation que celle du compte 355)": {}
-                }, 
+                },
                 "397-D\u00e9pr\u00e9ciations des stocks de marchandises": {
-                    "3971-Marchandise (ou groupe) A": {}, 
+                    "3971-Marchandise (ou groupe) A": {},
                     "3972-Marchandise (ou groupe) B": {}
                 }
-            }, 
+            },
             "root_type": "Asset"
-        }, 
+        },
         "4-Comptes de Tiers (ACTIF)": {
             "40-Fournisseurs et Comptes Rattach\u00e9s (ACTIF)": {
                 "409-Fournisseurs d\u00e9biteurs": {
-                    "4091-Fournisseurs - Avances et acomptes vers\u00e9s sur commandes": {}, 
-                    "4096-Fournisseurs - Cr\u00e9ances pour emballages et mat\u00e9riel \u00e0 rendre": {}, 
+                    "4091-Fournisseurs - Avances et acomptes vers\u00e9s sur commandes": {},
+                    "4096-Fournisseurs - Cr\u00e9ances pour emballages et mat\u00e9riel \u00e0 rendre": {},
                     "4097-Fournisseurs - Autres avoirs": {
-                        "40971-Fournisseurs d'exploitation": {}, 
+                        "40971-Fournisseurs d'exploitation": {},
                         "40974-Fournisseurs d'immobilisation": {}
-                    }, 
+                    },
                     "4098-Rabais, remises, ristournes \u00e0 obtenir et autres avoirs non encore re\u00e7us": {}
                 }
-            }, 
+            },
             "41-Clients et comptes rattach\u00e9s (ACTIF)": {
                 "410-Clients et Comptes rattach\u00e9s": {
                     "account_type": "Receivable"
-                }, 
+                },
                 "411-Clients": {
                     "4111-Clients - Ventes de biens ou de prestations de services": {
                         "account_type": "Receivable"
-                    }, 
+                    },
                     "4117-Clients - Retenues de garantie": {
                         "account_type": "Receivable"
-                    }, 
+                    },
                     "account_type": "Receivable"
-                }, 
+                },
                 "413-Clients - Effets \u00e0 recevoir": {
                     "account_type": "Receivable"
-                }, 
+                },
                 "416-Clients douteux ou litigieux": {
                     "account_type": "Receivable"
-                }, 
+                },
                 "418-Clients - Produits non encore factur\u00e9s": {
                     "4181-Clients - Factures \u00e0 \u00e9tablir": {
                         "account_type": "Receivable"
-                    }, 
+                    },
                     "4188-Clients - Int\u00e9r\u00eats courus": {
                         "account_type": "Receivable"
-                    }, 
+                    },
                     "account_type": "Receivable"
-                }, 
+                },
                 "account_type": "Receivable"
-            }, 
+            },
             "42-Personnel et comptes rattach\u00e9s (ACTIF)": {
                 "425-Personnel - Avances et acomptes": {}
-            }, 
+            },
             "43-S\u00e9curit\u00e9 sociale et autres organismes sociaux (ACTIF)": {
-                "431-S\u00e9curit\u00e9 sociale": {}, 
-                "437-Autres organismes sociaux": {}, 
+                "431-S\u00e9curit\u00e9 sociale": {},
+                "437-Autres organismes sociaux": {},
                 "438-Organismes sociaux - Produits \u00e0 recevoir": {
                     "4387-Produits \u00e0 recevoir": {}
                 }
-            }, 
+            },
             "44-Etat et autres collectivit\u00e9s publiques (ACTIF)": {
                 "441-Etat - Subventions \u00e0 recevoir": {
-                    "4411-Subventions d'investissement": {}, 
-                    "4417-Subventions d'exploitation": {}, 
-                    "4418-Subventions d'\u00e9quilibre": {}, 
+                    "4411-Subventions d'investissement": {},
+                    "4417-Subventions d'exploitation": {},
+                    "4418-Subventions d'\u00e9quilibre": {},
                     "4419-Avances sur subventions": {}
-                }, 
+                },
                 "443-Op\u00e9rations particuli\u00e8res avec l'Etat, les collectivit\u00e9s publiques, les organismes internationaux": {
-                    "4431-Cr\u00e9ances sur l'Etat r\u00e9sultant de la suppression de la r\u00e8gle du d\u00e9calage d'un mois en mati\u00e8re de TVA": {}, 
+                    "4431-Cr\u00e9ances sur l'Etat r\u00e9sultant de la suppression de la r\u00e8gle du d\u00e9calage d'un mois en mati\u00e8re de TVA": {},
                     "4438-Int\u00e9r\u00eats courus sur cr\u00e9ances figurant au compte 4431": {}
-                }, 
+                },
                 "445-Etat - Taxes sur le chiffre d'affaires (ACTIF)": {
-                    "4452-TVA due intracommunautaire": {}, 
+                    "4452-TVA due intracommunautaire": {},
                     "4456-Taxes sur le chiffre d'affaires d\u00e9ductibles": {
-                        "44562-TVA sur immobilisations": {}, 
-                        "44563-TVA transf\u00e9r\u00e9e par d'autres entreprises": {}, 
+                        "44562-TVA sur immobilisations": {},
+                        "44563-TVA transf\u00e9r\u00e9e par d'autres entreprises": {},
                         "44566-TVA sur autres biens et services": {
                             "tax_rate": 20.0
-                        }, 
-                        "44567-Cr\u00e9dit de TVA \u00e0 reporter": {}, 
+                        },
+                        "44567-Cr\u00e9dit de TVA \u00e0 reporter": {},
                         "44568-Taxes assimil\u00e9es \u00e0 la TVA": {}
-                    }, 
+                    },
                     "4458-Taxes sur le chiffre d'affaires \u00e0 r\u00e9gulariser ou en attente (ACTIF)": {
-                        "44581-Acomptes - R\u00e9gime simplifi\u00e9 d'imposition": {}, 
-                        "44582-Acomptes - R\u00e9gime du forfait": {}, 
-                        "44583-Remboursement de taxes sur le chiffre d'affaires demand\u00e9": {}, 
+                        "44581-Acomptes - R\u00e9gime simplifi\u00e9 d'imposition": {},
+                        "44582-Acomptes - R\u00e9gime du forfait": {},
+                        "44583-Remboursement de taxes sur le chiffre d'affaires demand\u00e9": {},
                         "44586-Taxes sur le chiffre d'affaires sur factures non parvenues": {}
                     }
-                }, 
+                },
                 "448-Etat - Charges \u00e0 payer et produits \u00e0 recevoir": {
-                    "4482-Charges fiscales sur cong\u00e9s \u00e0 payer": {}, 
-                    "4486-Charges \u00e0 payer": {}, 
+                    "4482-Charges fiscales sur cong\u00e9s \u00e0 payer": {},
+                    "4486-Charges \u00e0 payer": {},
                     "4487-Produits \u00e0 recevoir": {}
                 }
-            }, 
+            },
             "45-Groupe et associ\u00e9s (ACTIF)": {
                 "456-Associ\u00e9s - Op\u00e9rations sur le capital (ACTIF)": {
                     "4562-Apporteurs - Capital appel\u00e9, non vers\u00e9": {
-                        "45621-Actionnaires - Capital souscrit et appel\u00e9, non vers\u00e9": {}, 
+                        "45621-Actionnaires - Capital souscrit et appel\u00e9, non vers\u00e9": {},
                         "45625-Associ\u00e9s - Capital appel\u00e9, non vers\u00e9": {}
                     }
                 }
-            }, 
+            },
             "46-D\u00e9biteurs divers et cr\u00e9diteurs divers (ACTIF)": {
-                "462-Cr\u00e9ances sur cessions d'immobilisations": {}, 
-                "465-Cr\u00e9ances sur cessions de valeurs mobili\u00e8res de placement": {}, 
-                "467-Autres comptes d\u00e9biteurs ou cr\u00e9diteurs (ACTIF)": {}, 
+                "462-Cr\u00e9ances sur cessions d'immobilisations": {},
+                "465-Cr\u00e9ances sur cessions de valeurs mobili\u00e8res de placement": {},
+                "467-Autres comptes d\u00e9biteurs ou cr\u00e9diteurs (ACTIF)": {},
                 "468-Divers - Charges \u00e0 payer et produits \u00e0 recevoir (ACTIF)": {
                     "4687-Produits \u00e0 recevoir": {}
                 }
-            }, 
+            },
             "47-Comptes transitoires ou d'attente (ACTIF)": {
                 "471-Comptes d'attente (ACTIF)": {
                     "account_type": "Temporary"
-                }, 
+                },
                 "476-Diff\u00e9rences de conversion (ACTIF)": {
-                    "4761-Diminution des cr\u00e9ances": {}, 
-                    "4762-Augmentation des dettes": {}, 
+                    "4761-Diminution des cr\u00e9ances": {},
+                    "4762-Augmentation des dettes": {},
                     "4768-Diff\u00e9rences compens\u00e9es par couverture de change": {}
-                }, 
+                },
                 "478-Autres comptes transitoires (ACTIF)": {
-                    "4781-Mali de fusion sur actif circulant": {}, 
+                    "4781-Mali de fusion sur actif circulant": {},
                     "4786-Diff\u00e9rences d'\u00e9valuation sur instruments de tr\u00e9sorerie (ACTIF)": {}
                 }
-            }, 
+            },
             "48-Comptes de r\u00e9gularisation (ACTIF)": {
                 "481-Charges \u00e0 r\u00e9partir sur plusieurs exercices": {
                     "4816-Frais d'\u00e9mission des emprunts": {}
-                }, 
-                "486-Charges constat\u00e9es d'avance": {}, 
+                },
+                "486-Charges constat\u00e9es d'avance": {},
                 "488-Comptes de r\u00e9partition p\u00e9riodique des charges et des produits (ACTIF)": {
                     "4886-Charges": {}
                 }
-            }, 
+            },
             "49-D\u00e9pr\u00e9ciation des comptes de tiers (ACTIF)": {
-                "491-D\u00e9pr\u00e9ciations des comptes clients": {}, 
+                "491-D\u00e9pr\u00e9ciations des comptes clients": {},
                 "495-D\u00e9pr\u00e9ciations des comptes du groupe et des associ\u00e9s": {
-                    "4951-Comptes du groupe": {}, 
-                    "4955-Comptes courants des associ\u00e9s": {}, 
+                    "4951-Comptes du groupe": {},
+                    "4955-Comptes courants des associ\u00e9s": {},
                     "4958-Op\u00e9rations faites en commun et en GIE": {}
-                }, 
+                },
                 "496-D\u00e9pr\u00e9ciations des comptes de d\u00e9biteurs divers": {
-                    "4962-Cr\u00e9ances sur cessions d'immobilisations": {}, 
-                    "4965-Cr\u00e9ances sur cessions de valeurs mobili\u00e8res de placement": {}, 
+                    "4962-Cr\u00e9ances sur cessions d'immobilisations": {},
+                    "4965-Cr\u00e9ances sur cessions de valeurs mobili\u00e8res de placement": {},
                     "4967-Autres comptes d\u00e9biteurs": {}
                 }
-            }, 
+            },
             "root_type": "Asset"
-        }, 
+        },
         "4-Comptes de Tiers (PASSIF)": {
             "40-Fournisseurs et Comptes Rattach\u00e9s (PASSIF)": {
                 "401-Fournisseurs": {
                     "4011-Fournisseurs - Achats de biens ou de prestations de services": {
                         "account_type": "Payable"
-                    }, 
+                    },
                     "4017-Fournisseurs - Retenues de garantie": {
                         "account_type": "Payable"
-                    }, 
+                    },
                     "account_type": "Payable"
-                }, 
+                },
                 "403-Fournisseurs - Effets \u00e0 payer": {
                     "account_type": "Payable"
-                }, 
+                },
                 "404-Fournisseurs d'immobilisations": {
                     "4041-Fournisseurs - Achats d'immobilisations": {
                         "account_type": "Payable"
-                    }, 
+                    },
                     "4047-Fournisseurs d'immobilisations - Retenues de garantie": {
                         "account_type": "Payable"
-                    }, 
+                    },
                     "account_type": "Payable"
-                }, 
+                },
                 "405-Fournisseurs d'immobilisations - Effets \u00e0 payer": {
                     "account_type": "Payable"
-                }, 
+                },
                 "408-Fournisseurs - Factures non parvenues": {
                     "4081-Fournisseurs": {
                         "account_type": "Stock Received But Not Billed"
-                    }, 
+                    },
                     "4084-Fournisseurs d'immobilisations": {
                         "account_type": "Stock Received But Not Billed"
-                    }, 
+                    },
                     "4088-Fournisseurs - Int\u00e9r\u00eats courus": {
                         "account_type": "Stock Received But Not Billed"
-                    }, 
+                    },
                     "account_type": "Stock Received But Not Billed"
-                }, 
+                },
                 "account_type": "Payable"
-            }, 
+            },
             "41-Clients et comptes rattach\u00e9s (PASSIF)": {
                 "419-Clients cr\u00e9diteurs": {
-                    "4191-Clients - Avances et acomptes re\u00e7us sur commandes": {}, 
-                    "4196-Clients - Dettes pour emballages et mat\u00e9riels consign\u00e9s": {}, 
-                    "4197-Clients - Autres avoirs": {}, 
+                    "4191-Clients - Avances et acomptes re\u00e7us sur commandes": {},
+                    "4196-Clients - Dettes pour emballages et mat\u00e9riels consign\u00e9s": {},
+                    "4197-Clients - Autres avoirs": {},
                     "4198-Rabais, remises, ristournes \u00e0 accorder et autres avoirs \u00e0 \u00e9tablir": {}
                 }
-            }, 
+            },
             "42-Personnel et comptes rattach\u00e9s (PASSIF)": {
-                "421-Personnel - R\u00e9mun\u00e9rations dues": {}, 
-                "422-Comit\u00e9s d'entreprises, d'\u00e9tablissement...": {}, 
+                "421-Personnel - R\u00e9mun\u00e9rations dues": {},
+                "422-Comit\u00e9s d'entreprises, d'\u00e9tablissement...": {},
                 "424-Participation des salari\u00e9s aux r\u00e9sultats": {
-                    "4246-R\u00e9serve sp\u00e9ciale": {}, 
+                    "4246-R\u00e9serve sp\u00e9ciale": {},
                     "4248-Comptes courants": {}
-                }, 
-                "426-Personnel - D\u00e9p\u00f4ts": {}, 
-                "427-Personnel - Oppositions": {}, 
+                },
+                "426-Personnel - D\u00e9p\u00f4ts": {},
+                "427-Personnel - Oppositions": {},
                 "428-Personnel - Charges \u00e0 payer et produits \u00e0 recevoir": {
-                    "4282-Dettes provisionn\u00e9es pour cong\u00e9s \u00e0 payer": {}, 
-                    "4284-Dettes provisionn\u00e9es pour participation des salari\u00e9s aux r\u00e9sultats": {}, 
-                    "4286-Autres charges \u00e0 payer": {}, 
+                    "4282-Dettes provisionn\u00e9es pour cong\u00e9s \u00e0 payer": {},
+                    "4284-Dettes provisionn\u00e9es pour participation des salari\u00e9s aux r\u00e9sultats": {},
+                    "4286-Autres charges \u00e0 payer": {},
                     "4287-Produits \u00e0 recevoir": {}
                 }
-            }, 
+            },
             "43-S\u00e9curit\u00e9 sociale et autres organismes sociaux (PASSIF)": {
                 "438-Organismes sociaux - Charges \u00e0 payer": {
-                    "4382-Charges sociales sur cong\u00e9s \u00e0 payer": {}, 
+                    "4382-Charges sociales sur cong\u00e9s \u00e0 payer": {},
                     "4386-Autres charges \u00e0 payer": {}
                 }
-            }, 
+            },
             "44-Etat et autres collectivit\u00e9s publiques (PASSIF)": {
                 "442-Etat - Imp\u00f4ts et taxes recouvrables sur des tiers": {
-                    "4424-Obligataires": {}, 
+                    "4424-Obligataires": {},
                     "4425-Associ\u00e9s": {}
-                }, 
-                "444-Etat - Imp\u00f4ts sur les b\u00e9n\u00e9fices": {}, 
+                },
+                "444-Etat - Imp\u00f4ts sur les b\u00e9n\u00e9fices": {},
                 "445-Etat - Taxes sur le chiffre d'affaires (PASSIF)": {
                     "4455-Taxes sur le chiffre d'affaires \u00e0 d\u00e9caisser": {
-                        "44551-TVA \u00e0 d\u00e9caisser": {}, 
+                        "44551-TVA \u00e0 d\u00e9caisser": {},
                         "44558-Taxes assimil\u00e9es \u00e0 la TVA": {}
-                    }, 
+                    },
                     "4457-Taxes sur le chiffre d'affaires collect\u00e9es par l'entreprise": {
                         "44571-TVA collect\u00e9e": {
-                            "account_type": "Tax", 
+                            "account_type": "Tax",
                             "is_group": 1
-                        }, 
+                        },
                         "44578-Taxes assimil\u00e9es \u00e0 la TVA": {}
-                    }, 
+                    },
                     "4458-Taxes sur le chiffre d'affaires \u00e0 r\u00e9gulariser ou en attente (PASSIF)": {
-                        "44584-TVA r\u00e9cup\u00e9r\u00e9e  d'avance": {}, 
+                        "44584-TVA r\u00e9cup\u00e9r\u00e9e  d'avance": {},
                         "44587-Taxes sur le chiffre d'affaires sur factures \u00e0 \u00e9tablir": {}
                     }
-                }, 
-                "446-Obligations cautionn\u00e9es": {}, 
-                "447-Autres imp\u00f4ts, taxes et versements assimil\u00e9s": {}, 
+                },
+                "446-Obligations cautionn\u00e9es": {},
+                "447-Autres imp\u00f4ts, taxes et versements assimil\u00e9s": {},
                 "449-Quotas d'\u00e9mission \u00e0 acqu\u00e9rir": {}
-            }, 
+            },
             "45-Groupe et associ\u00e9s (PASSIF)": {
-                "451-Groupe (PASSIF)": {}, 
+                "451-Groupe (PASSIF)": {},
                 "455-Associ\u00e9s - Comptes courants (PASSIF)": {
-                    "4551-Principal (PASSIF)": {}, 
+                    "4551-Principal (PASSIF)": {},
                     "4558-Int\u00e9r\u00eats courus (PASSIF)": {}
-                }, 
+                },
                 "456-Associ\u00e9s - Op\u00e9rations sur le capital (PASSIF)": {
                     "4561-Associ\u00e9s - Comptes d'apport en soci\u00e9t\u00e9": {
-                        "45611-Apports en nature": {}, 
+                        "45611-Apports en nature": {},
                         "45615-Apports en num\u00e9raire": {}
-                    }, 
-                    "4563-Associ\u00e9s - Versements re\u00e7us sur augmentation de capital": {}, 
-                    "4564-Associ\u00e9s - Versements anticip\u00e9s": {}, 
-                    "4566-Actionnaires d\u00e9faillants": {}, 
+                    },
+                    "4563-Associ\u00e9s - Versements re\u00e7us sur augmentation de capital": {},
+                    "4564-Associ\u00e9s - Versements anticip\u00e9s": {},
+                    "4566-Actionnaires d\u00e9faillants": {},
                     "4567-Associ\u00e9s - Capital \u00e0 rembourser": {}
-                }, 
-                "457-Associ\u00e9s - Dividendes \u00e0 payer": {}, 
+                },
+                "457-Associ\u00e9s - Dividendes \u00e0 payer": {},
                 "458-Associ\u00e9s - Op\u00e9rations faites en commun et en GIE": {
-                    "4581-Op\u00e9rations courantes": {}, 
+                    "4581-Op\u00e9rations courantes": {},
                     "4588-Int\u00e9r\u00eats courus": {}
                 }
-            }, 
+            },
             "46-D\u00e9biteurs divers et cr\u00e9diteurs divers (PASSIF)": {
-                "464-Dettes sur acquisitions de valeurs mobili\u00e8res de placement": {}, 
-                "467-Autres comptes d\u00e9biteurs ou cr\u00e9diteurs (PASSIF)": {}, 
+                "464-Dettes sur acquisitions de valeurs mobili\u00e8res de placement": {},
+                "467-Autres comptes d\u00e9biteurs ou cr\u00e9diteurs (PASSIF)": {},
                 "468-Divers - Charges \u00e0 payer et produits \u00e0 recevoir (PASSIF)": {
                     "4686-Charges \u00e0 payer": {}
                 }
-            }, 
+            },
             "47-Comptes transitoires ou d'attente (PASSIF)": {
                 "471-Comptes d'attente (PASSIF)": {
                     "account_type": "Temporary"
-                }, 
+                },
                 "477-Diff\u00e9rences de conversion (PASSIF)": {
-                    "4771-Augmentation des cr\u00e9ances": {}, 
-                    "4772-Diminution des dettes": {}, 
+                    "4771-Augmentation des cr\u00e9ances": {},
+                    "4772-Diminution des dettes": {},
                     "4778-Diff\u00e9rences compens\u00e9es par couverture de change": {}
-                }, 
+                },
                 "478-Autres comptes transitoires (PASSIF)": {
                     "4787-Diff\u00e9rences d'\u00e9valuation sur instruments de tr\u00e9sorerie (PASSIF)": {}
                 }
-            }, 
+            },
             "48-Comptes de r\u00e9gularisation (PASSIF)": {
-                "487-Produits constat\u00e9s d'avance": {}, 
+                "487-Produits constat\u00e9s d'avance": {},
                 "488-Comptes de r\u00e9partition p\u00e9riodique des charges et des produits (PASSIF)": {
                     "4887-Produits": {}
                 }
-            }, 
+            },
             "root_type": "Liability"
-        }, 
+        },
         "5-Comptes Financiers": {
             "50-Valeurs mobili\u00e8res de placement": {
-                "501-Parts dans des entreprises li\u00e9es": {}, 
+                "501-Parts dans des entreprises li\u00e9es": {},
                 "502-Actions propres": {
-                    "5021-Actions destin\u00e9es \u00e0 \u00eatre attribu\u00e9es aux employ\u00e9s et affect\u00e9es \u00e0 des plans d\u00e9termin\u00e9s": {}, 
+                    "5021-Actions destin\u00e9es \u00e0 \u00eatre attribu\u00e9es aux employ\u00e9s et affect\u00e9es \u00e0 des plans d\u00e9termin\u00e9s": {},
                     "5022-Actions disponibles pour \u00eatre attribu\u00e9es aux employ\u00e9s ou pour la r\u00e9gularisation des cours de bourse": {}
-                }, 
+                },
                 "503-Actions": {
-                    "5031-Titres cot\u00e9s": {}, 
+                    "5031-Titres cot\u00e9s": {},
                     "5035-Titres non cot\u00e9s": {}
-                }, 
-                "504-Autres titres conf\u00e9rant un droit de propri\u00e9t\u00e9": {}, 
-                "505-Obligations et bons \u00e9mis par la soci\u00e9t\u00e9 et rachet\u00e9s par elle": {}, 
+                },
+                "504-Autres titres conf\u00e9rant un droit de propri\u00e9t\u00e9": {},
+                "505-Obligations et bons \u00e9mis par la soci\u00e9t\u00e9 et rachet\u00e9s par elle": {},
                 "506-Obligations": {
-                    "5061-Titres cot\u00e9s": {}, 
+                    "5061-Titres cot\u00e9s": {},
                     "5065-Titres non cot\u00e9s": {}
-                }, 
-                "507-Bons du Tr\u00e9sor et bons de caisse \u00e0 court terme": {}, 
+                },
+                "507-Bons du Tr\u00e9sor et bons de caisse \u00e0 court terme": {},
                 "508-Autres valeurs mobili\u00e8res de placement et autres cr\u00e9ances assimil\u00e9es": {
-                    "5081-Autres valeurs mobili\u00e8res": {}, 
-                    "5082-Bons de souscription": {}, 
+                    "5081-Autres valeurs mobili\u00e8res": {},
+                    "5082-Bons de souscription": {},
                     "5088-Int\u00e9r\u00eats courus sur obligations, bons et valeurs assimil\u00e9es": {}
-                }, 
+                },
                 "509-Versements restant \u00e0 effectuer sur valeurs mobili\u00e8res de placement non lib\u00e9r\u00e9es": {}
-            }, 
+            },
             "51-Banques, \u00e9tablissements financiers et assimil\u00e9s": {
                 "511-Valeurs \u00e0 l'encaissement": {
-                    "5111-Coupons \u00e9chus \u00e0 l'encaissement": {}, 
-                    "5112-Ch\u00e8ques \u00e0 encaisser": {}, 
-                    "5113-Effets \u00e0 l'encaissement": {}, 
+                    "5111-Coupons \u00e9chus \u00e0 l'encaissement": {},
+                    "5112-Ch\u00e8ques \u00e0 encaisser": {},
+                    "5113-Effets \u00e0 l'encaissement": {},
                     "5114-Effets \u00e0 l'escompte": {}
-                }, 
+                },
                 "512-Banques": {
                     "5121-Comptes en monnaie nationale": {
                         "account_type": "Bank"
-                    }, 
+                    },
                     "5124-Comptes en devises": {
                         "account_type": "Bank"
-                    }, 
+                    },
                     "account_type": "Bank"
-                }, 
-                "514-Ch\u00e8ques postaux": {}, 
-                "515-\"Caisses\" du Tr\u00e9sor et des \u00e9tablissements publics": {}, 
-                "516-Soci\u00e9t\u00e9s de bourse": {}, 
-                "517-Autres organismes financiers": {}, 
+                },
+                "514-Ch\u00e8ques postaux": {},
+                "515-\"Caisses\" du Tr\u00e9sor et des \u00e9tablissements publics": {},
+                "516-Soci\u00e9t\u00e9s de bourse": {},
+                "517-Autres organismes financiers": {},
                 "518-Int\u00e9r\u00eats courus": {
-                    "5181-Int\u00e9r\u00eats courus \u00e0 payer": {}, 
+                    "5181-Int\u00e9r\u00eats courus \u00e0 payer": {},
                     "5188-Int\u00e9r\u00eats courus \u00e0 recevoir": {}
-                }, 
+                },
                 "519-Concours bancaires courants": {
-                    "5191-Cr\u00e9dit de mobilisation des cr\u00e9ances commerciales (CMCC)": {}, 
-                    "5193-Mobilisation de cr\u00e9ances n\u00e9es \u00e0 l'\u00e9tranger": {}, 
+                    "5191-Cr\u00e9dit de mobilisation des cr\u00e9ances commerciales (CMCC)": {},
+                    "5193-Mobilisation de cr\u00e9ances n\u00e9es \u00e0 l'\u00e9tranger": {},
                     "5198-Int\u00e9r\u00eats courus sur concours bancaires courants": {}
                 }
-            }, 
+            },
             "52-Instruments de tr\u00e9sorerie": {
                 "is_group": 1
-            }, 
+            },
             "53-Caisse": {
                 "531-Caisse si\u00e8ge social": {
                     "5311-Caisse en monnaie nationale": {
                         "account_type": "Cash"
-                    }, 
+                    },
                     "5314-Caisse en devises": {
                         "account_type": "Cash"
-                    }, 
+                    },
                     "account_type": "Cash"
-                }, 
+                },
                 "532-Caisse succursale (ou usine) A": {
                     "account_type": "Cash"
-                }, 
+                },
                 "533-Caisse succursale (ou usine) B": {
                     "account_type": "Cash"
-                }, 
+                },
                 "account_type": "Cash"
-            }, 
+            },
             "54-R\u00e9gies d'avance et accr\u00e9ditifs": {
                 "is_group": 1
-            }, 
+            },
             "58-Virements internes": {
                 "is_group": 1
-            }, 
+            },
             "59-D\u00e9pr\u00e9ciations des comptes financiers": {
                 "590-D\u00e9pr\u00e9ciations des valeurs mobili\u00e8res de placement": {
-                    "5903-Actions": {}, 
-                    "5904-Autres titres conf\u00e9rant un droit de propri\u00e9t\u00e9": {}, 
-                    "5906-Obligations": {}, 
+                    "5903-Actions": {},
+                    "5904-Autres titres conf\u00e9rant un droit de propri\u00e9t\u00e9": {},
+                    "5906-Obligations": {},
                     "5908-Autres valeurs mobili\u00e8res de placement et cr\u00e9ances assimil\u00e9es": {}
                 }
-            }, 
+            },
             "root_type": "Asset"
-        }, 
+        },
         "6-Comptes de Charges": {
             "60-Achats (sauf 603)": {
                 "601-Achats stock\u00e9s - Mati\u00e8res premi\u00e8res (et fournitures)": {
                     "6011-Mati\u00e8res (ou groupe) A": {
                         "account_type": "Cost of Goods Sold"
-                    }, 
+                    },
                     "6012-Mati\u00e8res (ou groupe) B": {
                         "account_type": "Cost of Goods Sold"
-                    }, 
+                    },
                     "6017-Fournitures A, B, C...": {
                         "account_type": "Cost of Goods Sold"
-                    }, 
+                    },
                     "account_type": "Cost of Goods Sold"
-                }, 
+                },
                 "602-Achats stock\u00e9s - Autres approvisionnements": {
                     "6021-Mati\u00e8res consommables": {
                         "60211-Mati\u00e8res (ou groupe) C": {
                             "account_type": "Cost of Goods Sold"
-                        }, 
+                        },
                         "60212-Mati\u00e8res (ou groupe) D": {
                             "account_type": "Cost of Goods Sold"
-                        }, 
+                        },
                         "account_type": "Cost of Goods Sold"
-                    }, 
+                    },
                     "6022-Fournitures consommables": {
                         "60221-Combustibles": {
                             "account_type": "Cost of Goods Sold"
-                        }, 
+                        },
                         "60222-Produits d'entretien": {
                             "account_type": "Cost of Goods Sold"
-                        }, 
+                        },
                         "60223-Fournitures d'atelier et d'usine": {
                             "account_type": "Cost of Goods Sold"
-                        }, 
+                        },
                         "60224-Fournitures de magasin": {
                             "account_type": "Cost of Goods Sold"
-                        }, 
+                        },
                         "60225-Fournitures de bureau": {
                             "account_type": "Cost of Goods Sold"
-                        }, 
+                        },
                         "account_type": "Cost of Goods Sold"
-                    }, 
+                    },
                     "6026-Emballages": {
                         "60261-Emballages perdus": {
                             "account_type": "Cost of Goods Sold"
-                        }, 
+                        },
                         "60265-Emballages r\u00e9cup\u00e9rables non identifiables": {
                             "account_type": "Cost of Goods Sold"
-                        }, 
+                        },
                         "60267-Emballages \u00e0 usage mixte": {
                             "account_type": "Cost of Goods Sold"
-                        }, 
+                        },
                         "account_type": "Cost of Goods Sold"
-                    }, 
+                    },
                     "account_type": "Cost of Goods Sold"
-                }, 
+                },
                 "603-Variations des stocks (approvisionnements et marchandises)": {
                     "6031-Variation des stocks de mati\u00e8res premi\u00e8res (et fournitures)": {
                         "account_type": "Stock Adjustment"
-                    }, 
+                    },
                     "6032-Variation des stocks des autres approvisionnements": {
                         "account_type": "Stock Adjustment"
-                    }, 
+                    },
                     "6037-Variation des stocks de marchandises": {
                         "account_type": "Stock Adjustment"
-                    }, 
+                    },
                     "account_type": "Stock Adjustment"
-                }, 
+                },
                 "604-Achats d'\u00e9tudes et prestations de service": {
                     "account_type": "Cost of Goods Sold"
-                }, 
+                },
                 "605-Achats de mat\u00e9riel, \u00e9quipements et travaux": {
                     "account_type": "Cost of Goods Sold"
-                }, 
+                },
                 "606-Achats non stock\u00e9s de mati\u00e8res et founitures": {
                     "6061-Fournitures non stockables (eau, \u00e9nergie...)": {
                         "account_type": "Cost of Goods Sold"
-                    }, 
+                    },
                     "6063-Fournitures d'entretien et de petit \u00e9quipement": {
                         "account_type": "Cost of Goods Sold"
-                    }, 
+                    },
                     "6064-Fournitures administratives": {
                         "account_type": "Cost of Goods Sold"
-                    }, 
+                    },
                     "6068-Autres mati\u00e8res et fournitures": {
                         "account_type": "Cost of Goods Sold"
-                    }, 
+                    },
                     "account_type": "Cost of Goods Sold"
-                }, 
+                },
                 "607-Achats de marchandises": {
                     "6071-Marchandises (ou groupe) A": {
                         "account_type": "Cost of Goods Sold"
-                    }, 
+                    },
                     "6072-Marchandises (ou groupe) B": {
                         "account_type": "Cost of Goods Sold"
-                    }, 
+                    },
                     "account_type": "Cost of Goods Sold"
-                }, 
+                },
                 "608-(Compte r\u00e9serv\u00e9, le cas \u00e9ch\u00e9ant, \u00e0 la recapitulation des Frais accessoires incorpor\u00e9s aux achats)": {
                     "account_type": "Expenses Included In Valuation"
-                }, 
+                },
                 "609-Rabais, remises et ristournes obtenus sur achats": {
-                    "6091-Rabais, remises et ristournes obtenus sur achats - de mati\u00e8res premi\u00e8res (et fournitures)": {}, 
-                    "6092-Rabais, remises et ristournes obtenus sur achats - d'autres approvisionnements stock\u00e9s": {}, 
-                    "6094-Rabais, remises et ristournes obtenus sur achats - d'\u00e9tudes et prestations de services": {}, 
-                    "6095-Rabais, remises et ristournes obtenus sur achats - de mat\u00e9riel, \u00e9quipements et travaux": {}, 
-                    "6096-Rabais, remises et ristournes obtenus sur achats - d'approvisionnements non stock\u00e9s": {}, 
-                    "6097-Rabais, remises et ristournes obtenus sur achats - de marchandises": {}, 
+                    "6091-Rabais, remises et ristournes obtenus sur achats - de mati\u00e8res premi\u00e8res (et fournitures)": {},
+                    "6092-Rabais, remises et ristournes obtenus sur achats - d'autres approvisionnements stock\u00e9s": {},
+                    "6094-Rabais, remises et ristournes obtenus sur achats - d'\u00e9tudes et prestations de services": {},
+                    "6095-Rabais, remises et ristournes obtenus sur achats - de mat\u00e9riel, \u00e9quipements et travaux": {},
+                    "6096-Rabais, remises et ristournes obtenus sur achats - d'approvisionnements non stock\u00e9s": {},
+                    "6097-Rabais, remises et ristournes obtenus sur achats - de marchandises": {},
                     "6098-Rabais, remises et ristournes non affect\u00e9s": {}
                 }
-            }, 
+            },
             "61-Services ext\u00e9rieurs": {
-                "611-Sous-traitance g\u00e9n\u00e9rale": {}, 
+                "611-Sous-traitance g\u00e9n\u00e9rale": {},
                 "612-Redevances de cr\u00e9dit-bail": {
-                    "6122-Cr\u00e9dit-bail mobilier": {}, 
+                    "6122-Cr\u00e9dit-bail mobilier": {},
                     "6125-Cr\u00e9dit-bail immobilier": {}
-                }, 
+                },
                 "613-Locations": {
-                    "6132-Locations immobili\u00e8res": {}, 
-                    "6135-Locations mobili\u00e8res": {}, 
+                    "6132-Locations immobili\u00e8res": {},
+                    "6135-Locations mobili\u00e8res": {},
                     "6136-Malis sur emballages": {}
-                }, 
-                "614-Charges locatives et de copropri\u00e9t\u00e9": {}, 
+                },
+                "614-Charges locatives et de copropri\u00e9t\u00e9": {},
                 "615-Entretiens et r\u00e9parations": {
-                    "6152-Entretiens et r\u00e9parations - sur biens immobiliers": {}, 
-                    "6155-Entretiens et r\u00e9parations - sur biens mobiliers": {}, 
+                    "6152-Entretiens et r\u00e9parations - sur biens immobiliers": {},
+                    "6155-Entretiens et r\u00e9parations - sur biens mobiliers": {},
                     "6156-Maintenance": {}
-                }, 
+                },
                 "616-Primes d'assurance": {
-                    "6161-Multirisques": {}, 
-                    "6162-Assurance obligatoire dommage construction": {}, 
+                    "6161-Multirisques": {},
+                    "6162-Assurance obligatoire dommage construction": {},
                     "6163-Assurance-transport": {
-                        "61636-Assurance-transport - sur achats": {}, 
-                        "61637-Assurance-transport - sur ventes": {}, 
+                        "61636-Assurance-transport - sur achats": {},
+                        "61637-Assurance-transport - sur ventes": {},
                         "61638-Assurance-transport - sur autres biens": {}
-                    }, 
-                    "6164-Risques d'exploitation": {}, 
+                    },
+                    "6164-Risques d'exploitation": {},
                     "6165-Insolvabilit\u00e9 clients": {}
-                }, 
-                "617-Etudes et recherches": {}, 
+                },
+                "617-Etudes et recherches": {},
                 "618-Divers": {
-                    "6181-Documentation g\u00e9n\u00e9rale": {}, 
-                    "6183-Documentation technique": {}, 
+                    "6181-Documentation g\u00e9n\u00e9rale": {},
+                    "6183-Documentation technique": {},
                     "6185-Frais de colloques, s\u00e9minaires, conf\u00e9rences": {}
-                }, 
+                },
                 "619-Rabais, remises et ristournes obtenus sur services ext\u00e9rieurs": {}
-            }, 
+            },
             "62-Autres services ext\u00e9rieurs": {
                 "621-Personnel ext\u00e9rieur \u00e0 l'entreprise": {
-                    "6211-Personnel int\u00e9rimaire": {}, 
+                    "6211-Personnel int\u00e9rimaire": {},
                     "6214-Personnel d\u00e9tach\u00e9 ou pr\u00eat\u00e9 \u00e0 l'entreprise": {}
-                }, 
+                },
                 "622-R\u00e9mun\u00e9rations d'interm\u00e9diaires et honoraires": {
-                    "6221-Commissions et courtages sur achats": {}, 
-                    "6222-Commissions et courtages sur ventes": {}, 
-                    "6224-R\u00e9mun\u00e9rations des transitaires": {}, 
-                    "6225-R\u00e9mun\u00e9rations d'affacturage": {}, 
-                    "6226-Honoraires": {}, 
-                    "6227-Frais d'actes et de contentieux": {}, 
+                    "6221-Commissions et courtages sur achats": {},
+                    "6222-Commissions et courtages sur ventes": {},
+                    "6224-R\u00e9mun\u00e9rations des transitaires": {},
+                    "6225-R\u00e9mun\u00e9rations d'affacturage": {},
+                    "6226-Honoraires": {},
+                    "6227-Frais d'actes et de contentieux": {},
                     "6228-Divers": {}
-                }, 
+                },
                 "623-Publicit\u00e9, publications, relations publiques": {
-                    "6231-Annonces et insertions": {}, 
-                    "6232-Echantillons": {}, 
-                    "6233-Foires et expositions": {}, 
-                    "6234-Cadeaux \u00e0 la client\u00e8le": {}, 
-                    "6235-Primes": {}, 
-                    "6236-Catalogues et imprim\u00e9s": {}, 
-                    "6237-Publications": {}, 
+                    "6231-Annonces et insertions": {},
+                    "6232-Echantillons": {},
+                    "6233-Foires et expositions": {},
+                    "6234-Cadeaux \u00e0 la client\u00e8le": {},
+                    "6235-Primes": {},
+                    "6236-Catalogues et imprim\u00e9s": {},
+                    "6237-Publications": {},
                     "6238-Divers (pourboires, dons courants...)": {}
-                }, 
+                },
                 "624-Transports de biens et transports collectifs du personnel": {
-                    "6241-Transports sur achats": {}, 
+                    "6241-Transports sur achats": {},
                     "6242-Transports sur ventes": {
                         "account_type": "Chargeable"
-                    }, 
-                    "6243-Transports entre \u00e9tablissements ou chantiers": {}, 
-                    "6244-Transports administratifs": {}, 
-                    "6247-Transports collectifs du personnel": {}, 
+                    },
+                    "6243-Transports entre \u00e9tablissements ou chantiers": {},
+                    "6244-Transports administratifs": {},
+                    "6247-Transports collectifs du personnel": {},
                     "6248-Divers": {}
-                }, 
+                },
                 "625-D\u00e9placements, missions et r\u00e9ceptions": {
-                    "6251-Voyages et d\u00e9placements": {}, 
-                    "6255-Frais de d\u00e9m\u00e9nagement": {}, 
-                    "6256-Missions": {}, 
+                    "6251-Voyages et d\u00e9placements": {},
+                    "6255-Frais de d\u00e9m\u00e9nagement": {},
+                    "6256-Missions": {},
                     "6257-R\u00e9ceptions": {}
-                }, 
-                "626-Frais postaux et de t\u00e9l\u00e9communications": {}, 
+                },
+                "626-Frais postaux et de t\u00e9l\u00e9communications": {},
                 "627-Services bancaires et assimil\u00e9s": {
-                    "6271-Frais sur titres (achat, vente, garde)": {}, 
-                    "6272-Commissions et frais sur \u00e9mission d'emprunts": {}, 
-                    "6275-Frais sur effets": {}, 
-                    "6276-Location de coffres": {}, 
+                    "6271-Frais sur titres (achat, vente, garde)": {},
+                    "6272-Commissions et frais sur \u00e9mission d'emprunts": {},
+                    "6275-Frais sur effets": {},
+                    "6276-Location de coffres": {},
                     "6278-Autres frais et commissions sur prestations de services": {}
-                }, 
+                },
                 "628-Divers": {
-                    "6281-Concours divers (cotisations...)": {}, 
+                    "6281-Concours divers (cotisations...)": {},
                     "6284-Frais de recrutement de personnel": {}
-                }, 
+                },
                 "629-Rabais, remises et ristournes obtenus sur autres services ext\u00e9rieurs": {}
-            }, 
+            },
             "63-Imp\u00f4ts, taxes et versements assimil\u00e9s": {
                 "631-Imp\u00f4ts, taxes et versements assimil\u00e9s sur r\u00e9mun\u00e9rations (administrations des imp\u00f4ts)": {
-                    "6311-Taxes sur les salaires": {}, 
-                    "6312-Taxe d'apprentissage": {}, 
-                    "6313-Participation des employeurs \u00e0 la formation professionnelle continue": {}, 
-                    "6314-Cotisation pour d\u00e9faut d'investissement obligatoire dans la construction": {}, 
+                    "6311-Taxes sur les salaires": {},
+                    "6312-Taxe d'apprentissage": {},
+                    "6313-Participation des employeurs \u00e0 la formation professionnelle continue": {},
+                    "6314-Cotisation pour d\u00e9faut d'investissement obligatoire dans la construction": {},
                     "6318-Autres": {}
-                }, 
+                },
                 "633-Imp\u00f4ts, taxes et versements assimil\u00e9s sur r\u00e9mun\u00e9rations (autres organismes)": {
-                    "6331-Versement de transport": {}, 
-                    "6332-Allocations logement": {}, 
-                    "6333-Participation des employeurs \u00e0 la formation professionnelle continue": {}, 
-                    "6334-Participation des employeurs \u00e0 l'effort de construction": {}, 
-                    "6335-Versements lib\u00e9ratoires ouvrant droit \u00e0 l'\u00e9xon\u00e9ration de la taxe d'apprentissage": {}, 
+                    "6331-Versement de transport": {},
+                    "6332-Allocations logement": {},
+                    "6333-Participation des employeurs \u00e0 la formation professionnelle continue": {},
+                    "6334-Participation des employeurs \u00e0 l'effort de construction": {},
+                    "6335-Versements lib\u00e9ratoires ouvrant droit \u00e0 l'\u00e9xon\u00e9ration de la taxe d'apprentissage": {},
                     "6338-Autres": {}
-                }, 
+                },
                 "635-Autres imp\u00f4ts, taxes et versements assimil\u00e9s (administrations des imp\u00f4ts)": {
                     "6351-Imp\u00f4ts directs (sauf imp\u00f4ts sur les b\u00e9n\u00e9fices)": {
-                        "63511-Contribution \u00e9conomique territoriale": {}, 
-                        "63512-Taxes fonci\u00e8res": {}, 
-                        "63513-Autres imp\u00f4ts locaux": {}, 
+                        "63511-Contribution \u00e9conomique territoriale": {},
+                        "63512-Taxes fonci\u00e8res": {},
+                        "63513-Autres imp\u00f4ts locaux": {},
                         "63514-Taxe sur les v\u00e9hicules des soci\u00e9t\u00e9s": {}
-                    }, 
-                    "6352-Taxes sur le chiffre d'affaires non r\u00e9cup\u00e9rables": {}, 
-                    "6353-Imp\u00f4ts indirects": {}, 
+                    },
+                    "6352-Taxes sur le chiffre d'affaires non r\u00e9cup\u00e9rables": {},
+                    "6353-Imp\u00f4ts indirects": {},
                     "6354-Droits d'enregistrement et de timbre": {
                         "63541-Droits de mutation": {}
-                    }, 
+                    },
                     "6358-Autres droits": {}
-                }, 
+                },
                 "637-Autres imp\u00f4ts, taxes et versements assimil\u00e9s (autres organismes)": {
-                    "6371-Contribution sociale de solidarit\u00e9 \u00e0 la charge des soci\u00e9t\u00e9s": {}, 
-                    "6372-Taxes per\u00e7ues par les organismes publics internationaux": {}, 
-                    "6374-Imp\u00f4ts et taxes exigibles \u00e0 l'\u00e9tranger": {}, 
+                    "6371-Contribution sociale de solidarit\u00e9 \u00e0 la charge des soci\u00e9t\u00e9s": {},
+                    "6372-Taxes per\u00e7ues par les organismes publics internationaux": {},
+                    "6374-Imp\u00f4ts et taxes exigibles \u00e0 l'\u00e9tranger": {},
                     "6378-Taxes diverses": {}
                 }
-            }, 
+            },
             "64-Charges de personnel": {
                 "641-R\u00e9mun\u00e9rations du personnel": {
-                    "6411-Salaires, appointements": {}, 
-                    "6412-Cong\u00e9s pay\u00e9s": {}, 
-                    "6413-Primes et gratifications": {}, 
-                    "6414-Indemnit\u00e9s et avantages divers": {}, 
+                    "6411-Salaires, appointements": {},
+                    "6412-Cong\u00e9s pay\u00e9s": {},
+                    "6413-Primes et gratifications": {},
+                    "6414-Indemnit\u00e9s et avantages divers": {},
                     "6415-Suppl\u00e9ment familial": {}
-                }, 
-                "644-R\u00e9mun\u00e9ration du travail de l'exploitant": {}, 
+                },
+                "644-R\u00e9mun\u00e9ration du travail de l'exploitant": {},
                 "645-Charges de s\u00e9curit\u00e9 sociale et de pr\u00e9voyance": {
-                    "6451-Cotisations \u00e0 l'URSSAF": {}, 
-                    "6452-Cotisations aux mutuelles": {}, 
-                    "6453-Cotisations aux caisses de retraites": {}, 
+                    "6451-Cotisations \u00e0 l'URSSAF": {},
+                    "6452-Cotisations aux mutuelles": {},
+                    "6453-Cotisations aux caisses de retraites": {},
                     "6454-Cotisations aux ASSEDIC": {}
-                }, 
-                "646-Cotisations sociales personnelles de l'exploitant": {}, 
+                },
+                "646-Cotisations sociales personnelles de l'exploitant": {},
                 "647-Autres charges sociales": {
                     "is_group": 1
-                }, 
+                },
                 "648-Autres charges de personnel": {}
-            }, 
+            },
             "65-Autres charges de gestion courante": {
                 "651-Redevances pour concessions, brevets, licences, marques, proc\u00e9d\u00e9s, logiciels, droits et valeurs similaires": {
-                    "6511-Redevances pour concessions, brevets, licences, marques, proc\u00e9d\u00e9s, logiciels": {}, 
-                    "6516-Droits d'auteur et de reproduction": {}, 
+                    "6511-Redevances pour concessions, brevets, licences, marques, proc\u00e9d\u00e9s, logiciels": {},
+                    "6516-Droits d'auteur et de reproduction": {},
                     "6518-Autres droits et valeurs similaires": {}
-                }, 
-                "653-Jetons de pr\u00e9sence": {}, 
+                },
+                "653-Jetons de pr\u00e9sence": {},
                 "654-Pertes sur cr\u00e9ances irr\u00e9couvrables": {
-                    "6541-Cr\u00e9ances de l'exercice": {}, 
+                    "6541-Cr\u00e9ances de l'exercice": {},
                     "6544-Cr\u00e9ances des exercices ant\u00e9rieurs": {}
-                }, 
+                },
                 "655-Quotes-parts de r\u00e9sultat sur op\u00e9rations faites en commun": {
-                    "6551-Quote-part de b\u00e9n\u00e9fice transf\u00e9r\u00e9e (comptabilit\u00e9 du g\u00e9rant)": {}, 
+                    "6551-Quote-part de b\u00e9n\u00e9fice transf\u00e9r\u00e9e (comptabilit\u00e9 du g\u00e9rant)": {},
                     "6555-Quote-part de perte support\u00e9e (comptabilit\u00e9 des associ\u00e9s non g\u00e9rants)": {}
-                }, 
-                "656-Pertes de change sur cr\u00e9ances et dettes commerciales": {}, 
+                },
+                "656-Pertes de change sur cr\u00e9ances et dettes commerciales": {},
                 "658-Charges diverses de gestion courante": {}
-            }, 
+            },
             "66-Charges financi\u00e8res": {
                 "661-Charges d'int\u00e9r\u00eats": {
                     "6611-Int\u00e9r\u00eats des emprunts et dettes": {
-                        "66116-Int\u00e9r\u00eats des emprunts et dettes - des emprunts et dettes assimil\u00e9es": {}, 
+                        "66116-Int\u00e9r\u00eats des emprunts et dettes - des emprunts et dettes assimil\u00e9es": {},
                         "66117-Int\u00e9r\u00eats des emprunts et dettes - des dettes rattach\u00e9es \u00e0 des participations": {}
-                    }, 
-                    "6612-Charges de la fiducie, r\u00e9sultat de la p\u00e9riode": {}, 
-                    "6615-Int\u00e9r\u00eats des comptes courants et des d\u00e9p\u00f4ts cr\u00e9diteurs": {}, 
-                    "6616-Int\u00e9r\u00eats bancaires et sur op\u00e9rations de financement (escompte...)": {}, 
-                    "6617-Int\u00e9r\u00eats des obligations cautionn\u00e9es": {}, 
+                    },
+                    "6612-Charges de la fiducie, r\u00e9sultat de la p\u00e9riode": {},
+                    "6615-Int\u00e9r\u00eats des comptes courants et des d\u00e9p\u00f4ts cr\u00e9diteurs": {},
+                    "6616-Int\u00e9r\u00eats bancaires et sur op\u00e9rations de financement (escompte...)": {},
+                    "6617-Int\u00e9r\u00eats des obligations cautionn\u00e9es": {},
                     "6618-Int\u00e9r\u00eats des autres dettes": {
-                        "66181-Int\u00e9r\u00eats des autres dettes - des dettes commerciales": {}, 
+                        "66181-Int\u00e9r\u00eats des autres dettes - des dettes commerciales": {},
                         "66188-Int\u00e9r\u00eats des autres dettes - des dettes diverses": {}
                     }
-                }, 
-                "664-Pertes sur cr\u00e9ances li\u00e9es \u00e0 des participations": {}, 
-                "665-Escomptes accord\u00e9s": {}, 
+                },
+                "664-Pertes sur cr\u00e9ances li\u00e9es \u00e0 des participations": {},
+                "665-Escomptes accord\u00e9s": {},
                 "666-Pertes de change financi\u00e8res": {
                     "account_type": "Round Off"
-                }, 
-                "667-Charges nettes sur cessions de valeurs mobili\u00e8res de placement": {}, 
+                },
+                "667-Charges nettes sur cessions de valeurs mobili\u00e8res de placement": {},
                 "668-Autres charges financi\u00e8res": {}
-            }, 
+            },
             "67-Charges exceptionnelles": {
                 "671-Charges exceptionnelles sur op\u00e9rations de gestion": {
-                    "6711-P\u00e9nalit\u00e9s sur march\u00e9s (et d\u00e9dits pay\u00e9s sur achats et ventes)": {}, 
-                    "6712-P\u00e9nalit\u00e9s, amendes fiscales et p\u00e9nales": {}, 
-                    "6713-Dons, lib\u00e9ralit\u00e9s": {}, 
-                    "6714-Cr\u00e9ances devenues irr\u00e9couvrables dans l'exercice": {}, 
-                    "6715-Subventions accord\u00e9es": {}, 
-                    "6717-Rappel d'imp\u00f4ts (autres qu'imp\u00f4ts sur les b\u00e9n\u00e9fices)": {}, 
+                    "6711-P\u00e9nalit\u00e9s sur march\u00e9s (et d\u00e9dits pay\u00e9s sur achats et ventes)": {},
+                    "6712-P\u00e9nalit\u00e9s, amendes fiscales et p\u00e9nales": {},
+                    "6713-Dons, lib\u00e9ralit\u00e9s": {},
+                    "6714-Cr\u00e9ances devenues irr\u00e9couvrables dans l'exercice": {},
+                    "6715-Subventions accord\u00e9es": {},
+                    "6717-Rappel d'imp\u00f4ts (autres qu'imp\u00f4ts sur les b\u00e9n\u00e9fices)": {},
                     "6718-Autres charges exceptionnelles sur op\u00e9rations de gestion": {}
-                }, 
-                "672-(Compte \u00e0 la disposition des entit\u00e9s pour enregistrer, en cours d'exercice, les charges sur exercices ant\u00e9rieurs)": {}, 
+                },
+                "672-(Compte \u00e0 la disposition des entit\u00e9s pour enregistrer, en cours d'exercice, les charges sur exercices ant\u00e9rieurs)": {},
                 "674-Op\u00e9rations de constitution ou liquidation des fiducies": {
-                    "6741-Op\u00e9rations li\u00e9es \u00e0 la constitution de la fiducie - transfert des \u00e9l\u00e9ments": {}, 
+                    "6741-Op\u00e9rations li\u00e9es \u00e0 la constitution de la fiducie - transfert des \u00e9l\u00e9ments": {},
                     "6742-Op\u00e9rations li\u00e9es \u00e0 la liquidation de la fiducie": {}
-                }, 
+                },
                 "675-Valeurs comptables des \u00e9l\u00e9ments d'actif c\u00e9d\u00e9s": {
-                    "6751-Immobilisations incorporelles": {}, 
-                    "6752-Immobilisations corporelles": {}, 
-                    "6756-Immobilisations financi\u00e8res": {}, 
+                    "6751-Immobilisations incorporelles": {},
+                    "6752-Immobilisations corporelles": {},
+                    "6756-Immobilisations financi\u00e8res": {},
                     "6758-Autres \u00e9l\u00e9ments d'actif": {}
-                }, 
+                },
                 "678-Autres charges exceptionnelles": {
-                    "6781-Mali provenant de clauses d'indexation": {}, 
-                    "6782-Lots": {}, 
-                    "6783-Malis provenant du rachat par l'entreprise d'actions et obligations \u00e9mises par elles-m\u00eame": {}, 
+                    "6781-Mali provenant de clauses d'indexation": {},
+                    "6782-Lots": {},
+                    "6783-Malis provenant du rachat par l'entreprise d'actions et obligations \u00e9mises par elles-m\u00eame": {},
                     "6788-Charges exceptionnelles diverses": {}
                 }
-            }, 
+            },
             "68-Dotations aux amortissements, d\u00e9pr\u00e9ciations et provisions": {
                 "681-Dotations aux amortissements, d\u00e9pr\u00e9ciations et provisions - Charges d'exploitation": {
                     "6811-Dotations aux amortissements sur immobilisations incorporelles et corporelles": {
                         "68111-Immobilisations incorporelles": {
                             "account_type": "Depreciation"
-                        }, 
+                        },
                         "68112-Immobilisations corporelles": {
                             "account_type": "Depreciation"
-                        }, 
+                        },
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "6812-Dotations aux amortissements des charges d'exploitation \u00e0 r\u00e9partir": {
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "6815-Dotations aux provisions d'exploitation": {
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "6816-Dotations aux d\u00e9pr\u00e9ciations des immobilisations incorporelles et corporelles": {
                         "68161-Immobilisations incorporelles": {
                             "account_type": "Depreciation"
-                        }, 
+                        },
                         "68162-Immobilisations corporelles": {
                             "account_type": "Depreciation"
-                        }, 
+                        },
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "6817-Dotations pour d\u00e9pr\u00e9ciations des actifs circulants": {
                         "68173-Stocks et en-cours": {
                             "account_type": "Depreciation"
-                        }, 
+                        },
                         "68174-Cr\u00e9ances": {
                             "account_type": "Depreciation"
-                        }, 
+                        },
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "account_type": "Depreciation"
-                }, 
+                },
                 "686-Dotations aux amortissements, d\u00e9pr\u00e9ciations et provisions - Charges financi\u00e8res": {
                     "6861-Dotations aux amortissements des primes de remboursement des obligations": {
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "6865-Dotations aux provisions financi\u00e8res": {
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "6866-Dotations aux d\u00e9pr\u00e9ciations des \u00e9l\u00e9ments financiers": {
                         "68662-Immobilisations financi\u00e8res": {
                             "account_type": "Depreciation"
-                        }, 
+                        },
                         "68665-Valeurs mobili\u00e8res de placement": {
                             "account_type": "Depreciation"
-                        }, 
+                        },
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "6868-Autres dotations": {
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "account_type": "Depreciation"
-                }, 
+                },
                 "687-Dotations aux amortissements, d\u00e9pr\u00e9ciations et provisions - Charges exceptionnelles": {
                     "6871-Dotations aux amortissements exceptionnels des immobilisations": {
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "6872-Dotations aux provisions r\u00e9glement\u00e9es (immobilisations)": {
                         "68725-Amortissements d\u00e9rogatoires": {
                             "account_type": "Depreciation"
-                        }, 
+                        },
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "6873-Dotations aux provisions r\u00e9glement\u00e9es (stocks)": {
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "6874-Dotations aux autres provisions r\u00e9glement\u00e9es": {
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "6875-Dotations aux provisions exceptionnelles": {
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "6876-Dotations aux d\u00e9pr\u00e9ciations exceptionnelles": {
                         "account_type": "Depreciation"
-                    }, 
+                    },
                     "account_type": "Depreciation"
-                }, 
+                },
                 "account_type": "Depreciation"
-            }, 
+            },
             "69-Participation des salari\u00e9s, imp\u00f4ts sur les b\u00e9n\u00e9fices et assimil\u00e9s": {
-                "691-Participation des salari\u00e9s aux r\u00e9sultats": {}, 
+                "691-Participation des salari\u00e9s aux r\u00e9sultats": {},
                 "695-Imp\u00f4ts sur les b\u00e9n\u00e9fices": {
-                    "6951-Imp\u00f4ts dus en France": {}, 
-                    "6952-Contribution additionnelle \u00e0 l'imp\u00f4t sur les b\u00e9n\u00e9fices": {}, 
+                    "6951-Imp\u00f4ts dus en France": {},
+                    "6952-Contribution additionnelle \u00e0 l'imp\u00f4t sur les b\u00e9n\u00e9fices": {},
                     "6954-Imp\u00f4ts dus \u00e0 l'\u00e9tranger": {}
-                }, 
-                "696-Suppl\u00e9ments d'imp\u00f4ts sur les soci\u00e9t\u00e9s, li\u00e9s aux distributions": {}, 
+                },
+                "696-Suppl\u00e9ments d'imp\u00f4ts sur les soci\u00e9t\u00e9s, li\u00e9s aux distributions": {},
                 "698-Int\u00e9gration fiscale": {
-                    "6981-Int\u00e9gration fiscale - Charges": {}, 
+                    "6981-Int\u00e9gration fiscale - Charges": {},
                     "6989-Int\u00e9gration fiscale - Produits": {}
-                }, 
+                },
                 "699-Produits - Report en arri\u00e8re des d\u00e9ficits": {}
-            }, 
+            },
             "root_type": "Expense"
-        }, 
+        },
         "7-Comptes de Produits": {
             "70-Ventes de produits fabriqu\u00e9s, prestations de services, marchandises": {
                 "701-Ventes de produits finis": {
-                    "7011-Produits finis (ou groupe) A": {}, 
+                    "7011-Produits finis (ou groupe) A": {},
                     "7012-Produits (ou groupe) B": {}
-                }, 
-                "702-Ventes de produits interm\u00e9diaires": {}, 
-                "703-Ventes de produits r\u00e9siduels": {}, 
+                },
+                "702-Ventes de produits interm\u00e9diaires": {},
+                "703-Ventes de produits r\u00e9siduels": {},
                 "704-Travaux": {
-                    "7041-Travaux de cat\u00e9gorie (ou activit\u00e9) A": {}, 
+                    "7041-Travaux de cat\u00e9gorie (ou activit\u00e9) A": {},
                     "7042-Travaux de cat\u00e9gorie (ou activit\u00e9) B": {}
-                }, 
-                "705-Etudes": {}, 
-                "706-Prestations de services": {}, 
+                },
+                "705-Etudes": {},
+                "706-Prestations de services": {},
                 "707-Ventes de marchandises": {
-                    "7071-Marchandises (ou groupe) A": {}, 
+                    "7071-Marchandises (ou groupe) A": {},
                     "7072-Marchandises (ou groupe) B": {}
-                }, 
+                },
                 "708-Produits des activit\u00e9s annexes": {
-                    "7081-Produits des services exploit\u00e9s dans l'int\u00e9r\u00eat du personnel": {}, 
-                    "7082-Commissions et courtages": {}, 
-                    "7083-Locations diverses": {}, 
-                    "7084-Mise \u00e0 disposition de personnel factur\u00e9e": {}, 
-                    "7085-Ports et frais accessoires factur\u00e9s": {}, 
-                    "7086-Bonis sur reprises d'emballages consign\u00e9s": {}, 
-                    "7087-Bonifications obtenues des clients et primes sur ventes": {}, 
+                    "7081-Produits des services exploit\u00e9s dans l'int\u00e9r\u00eat du personnel": {},
+                    "7082-Commissions et courtages": {},
+                    "7083-Locations diverses": {},
+                    "7084-Mise \u00e0 disposition de personnel factur\u00e9e": {},
+                    "7085-Ports et frais accessoires factur\u00e9s": {},
+                    "7086-Bonis sur reprises d'emballages consign\u00e9s": {},
+                    "7087-Bonifications obtenues des clients et primes sur ventes": {},
                     "7088-Autres produits d'activit\u00e9s annexes (cessions d'approvisionnements...)": {}
-                }, 
+                },
                 "709-Rabais, remises et ristournes accord\u00e9s par l'entreprise": {
-                    "7091-Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur ventes de produits finis": {}, 
-                    "7092-Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur ventes de produits interm\u00e9diaires": {}, 
-                    "7094-Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur travaux": {}, 
-                    "7095-Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur \u00e9tudes": {}, 
-                    "7096-Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur prestations de services": {}, 
-                    "7097-Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur ventes de marchandises": {}, 
+                    "7091-Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur ventes de produits finis": {},
+                    "7092-Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur ventes de produits interm\u00e9diaires": {},
+                    "7094-Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur travaux": {},
+                    "7095-Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur \u00e9tudes": {},
+                    "7096-Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur prestations de services": {},
+                    "7097-Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur ventes de marchandises": {},
                     "7098-Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur produits des activit\u00e9s annexes": {}
                 }
-            }, 
+            },
             "71-Production stock\u00e9e (ou d\u00e9stockage)": {
                 "713-Variation des stocks (en-cours de production, produits)": {
                     "7133-Variation des en-cours de production de biens": {
-                        "71331-Produits en cours": {}, 
+                        "71331-Produits en cours": {},
                         "71335-Travaux en cours": {}
-                    }, 
+                    },
                     "7134-Variation des en-cours de production de services": {
-                        "71341-Etudes en cours": {}, 
+                        "71341-Etudes en cours": {},
                         "71345-Prestations de services en cours": {}
-                    }, 
+                    },
                     "7135-Variation des stocks de produits": {
-                        "71351-Produits interm\u00e9diaires": {}, 
-                        "71355-Produits finis": {}, 
+                        "71351-Produits interm\u00e9diaires": {},
+                        "71355-Produits finis": {},
                         "71358-Produits r\u00e9siduels": {}
                     }
                 }
-            }, 
+            },
             "72-Production immobilis\u00e9e": {
-                "721-Immobilisations incorporelles": {}, 
+                "721-Immobilisations incorporelles": {},
                 "722-Immobilisations corporelles": {}
-            }, 
+            },
             "74-Subventions d'exploitation": {
                 "is_group": 1
-            }, 
+            },
             "75-Autres produits de gestion courante": {
                 "751-Redevances pour concessions, brevets, licences, marques, proc\u00e9d\u00e9s, logiciels, droits et valeurs similaires": {
-                    "7511-Redevances pour concessions, brevets, licences, marques, proc\u00e9d\u00e9s, logiciels": {}, 
-                    "7516-Droits d'auteur et de reproduction": {}, 
+                    "7511-Redevances pour concessions, brevets, licences, marques, proc\u00e9d\u00e9s, logiciels": {},
+                    "7516-Droits d'auteur et de reproduction": {},
                     "7518-Autres droits et valeurs similaires": {}
-                }, 
-                "752-Revenus des immeubles non affect\u00e9s aux activit\u00e9s professionnelles": {}, 
-                "753-Jetons de pr\u00e9sence et r\u00e9mun\u00e9rations d'administrateurs, g\u00e9rants...": {}, 
-                "754-Ristournes per\u00e7ues des coop\u00e9ratives (provenant des exc\u00e9dents)": {}, 
+                },
+                "752-Revenus des immeubles non affect\u00e9s aux activit\u00e9s professionnelles": {},
+                "753-Jetons de pr\u00e9sence et r\u00e9mun\u00e9rations d'administrateurs, g\u00e9rants...": {},
+                "754-Ristournes per\u00e7ues des coop\u00e9ratives (provenant des exc\u00e9dents)": {},
                 "755-Quotes-parts de r\u00e9sultats sur op\u00e9rations faites en commun": {
-                    "7551-Quote-part de perte transf\u00e9r\u00e9e (comptabilit\u00e9 du g\u00e9rant)": {}, 
+                    "7551-Quote-part de perte transf\u00e9r\u00e9e (comptabilit\u00e9 du g\u00e9rant)": {},
                     "7555-Quote-part de b\u00e9n\u00e9fice attribu\u00e9 (comptabilit\u00e9 des associ\u00e9s non g\u00e9rants)": {}
-                }, 
-                "756-Gains de change sur cr\u00e9ances et dettes commerciales": {}, 
+                },
+                "756-Gains de change sur cr\u00e9ances et dettes commerciales": {},
                 "758-Produits divers de gestion courante": {}
-            }, 
+            },
             "76-Produits financiers": {
                 "761-Produits de participations": {
-                    "7611-Revenus des titres de participation": {}, 
-                    "7612-Produits de la fiducie, r\u00e9sultat de la p\u00e9riode": {}, 
-                    "7616-Revenus sur autres formes de participation": {}, 
+                    "7611-Revenus des titres de participation": {},
+                    "7612-Produits de la fiducie, r\u00e9sultat de la p\u00e9riode": {},
+                    "7616-Revenus sur autres formes de participation": {},
                     "7617-Revenus des cr\u00e9ances rattach\u00e9es \u00e0 des participations": {}
-                }, 
+                },
                 "762-Produits des autres immobilisations financi\u00e8res": {
-                    "7621-Revenus des titres immobilis\u00e9s": {}, 
-                    "7626-Revenus des pr\u00eats": {}, 
+                    "7621-Revenus des titres immobilis\u00e9s": {},
+                    "7626-Revenus des pr\u00eats": {},
                     "7627-Revenus des cr\u00e9ances immobilis\u00e9es": {}
-                }, 
+                },
                 "763-Revenus des autres cr\u00e9ances": {
-                    "7631-Revenus des cr\u00e9ances commerciales": {}, 
+                    "7631-Revenus des cr\u00e9ances commerciales": {},
                     "7638-Revenus des cr\u00e9ances diverses": {}
-                }, 
-                "764-Revenus des valeurs mobili\u00e8res de placement": {}, 
-                "765-Escomptes obtenus": {}, 
+                },
+                "764-Revenus des valeurs mobili\u00e8res de placement": {},
+                "765-Escomptes obtenus": {},
                 "766-Gains de change financi\u00e8res": {
                     "account_type": "Round Off"
-                }, 
-                "767-Produits nets sur cessions de valeurs mobili\u00e8res de placement": {}, 
+                },
+                "767-Produits nets sur cessions de valeurs mobili\u00e8res de placement": {},
                 "768-Autres produits financiers": {}
-            }, 
+            },
             "77-Produits exceptionnels": {
                 "771-Produits exceptionnels sur op\u00e9rations de gestion": {
-                    "7711-D\u00e9dits et p\u00e9nalit\u00e9s per\u00e7us sur achats et sur ventes": {}, 
-                    "7713-Lib\u00e9ralit\u00e9s re\u00e7ues": {}, 
-                    "7714-Rentr\u00e9es sur cr\u00e9ances amorties": {}, 
-                    "7715-Subventions d'\u00e9quilibre": {}, 
-                    "7717-D\u00e9gr\u00e8vements d'imp\u00f4ts autres qu'imp\u00f4ts sur les b\u00e9n\u00e9fices": {}, 
+                    "7711-D\u00e9dits et p\u00e9nalit\u00e9s per\u00e7us sur achats et sur ventes": {},
+                    "7713-Lib\u00e9ralit\u00e9s re\u00e7ues": {},
+                    "7714-Rentr\u00e9es sur cr\u00e9ances amorties": {},
+                    "7715-Subventions d'\u00e9quilibre": {},
+                    "7717-D\u00e9gr\u00e8vements d'imp\u00f4ts autres qu'imp\u00f4ts sur les b\u00e9n\u00e9fices": {},
                     "7718-Autres produits exceptionnels sur op\u00e9rations de gestion": {}
-                }, 
-                "772-(Compte \u00e0 la disposition des entit\u00e9s pour enregistrer, en cours d'exercice, les Produits sur exercices ant\u00e9rieurs)": {}, 
+                },
+                "772-(Compte \u00e0 la disposition des entit\u00e9s pour enregistrer, en cours d'exercice, les Produits sur exercices ant\u00e9rieurs)": {},
                 "774-Op\u00e9rations de constitution ou liquidation des fiducies": {
-                    "7741-Op\u00e9rations li\u00e9es \u00e0 la constitution de la fiducie - transfert des \u00e9l\u00e9ments": {}, 
+                    "7741-Op\u00e9rations li\u00e9es \u00e0 la constitution de la fiducie - transfert des \u00e9l\u00e9ments": {},
                     "7742-Op\u00e9rations li\u00e9es \u00e0 la liquidation de la fiducie": {}
-                }, 
+                },
                 "775-Produits des cessions d'\u00e9l\u00e9ments d'actif": {
-                    "7751-Immobilisations incorporelles": {}, 
-                    "7752-Immobilisations corporelles": {}, 
-                    "7756-Immobilisations financi\u00e8res": {}, 
+                    "7751-Immobilisations incorporelles": {},
+                    "7752-Immobilisations corporelles": {},
+                    "7756-Immobilisations financi\u00e8res": {},
                     "7758-Autres \u00e9l\u00e9ments d'actif": {}
-                }, 
-                "777-Quote-part des subventions d'investissement vir\u00e9e au r\u00e9sultat de l'exercice": {}, 
+                },
+                "777-Quote-part des subventions d'investissement vir\u00e9e au r\u00e9sultat de l'exercice": {},
                 "778-Autres produits exceptionnels": {
-                    "7781-Bonis provenant de clauses d'indexation": {}, 
-                    "7782-Lots": {}, 
-                    "7783-Bonis provenant du rachat par l'entreprise d'actions et d'obligations \u00e9mises par elle-m\u00eame": {}, 
+                    "7781-Bonis provenant de clauses d'indexation": {},
+                    "7782-Lots": {},
+                    "7783-Bonis provenant du rachat par l'entreprise d'actions et d'obligations \u00e9mises par elle-m\u00eame": {},
                     "7788-Produits exceptionnels divers": {}
                 }
-            }, 
+            },
             "78-Reprises sur amortissements, d\u00e9pr\u00e9ciations et provisions": {
                 "781-Reprises sur amortissements, d\u00e9pr\u00e9ciations et provisions (\u00e0 inscrire dans les produits d'exploitation)": {
                     "7811-Reprises sur amortissements des immobilisations incorporelles et corporelles": {
-                        "78111-Immobilisations incorporelles": {}, 
+                        "78111-Immobilisations incorporelles": {},
                         "78112-Immobilisations corporelles": {}
-                    }, 
-                    "7815-Reprises sur provisions d'exploitation": {}, 
+                    },
+                    "7815-Reprises sur provisions d'exploitation": {},
                     "7816-Reprises sur d\u00e9pr\u00e9ciations des immobilisations corporelles et incorporelles": {
-                        "78161-Immobilisations incorporelles": {}, 
+                        "78161-Immobilisations incorporelles": {},
                         "78162-Immobilisations corporelles": {}
-                    }, 
+                    },
                     "7817-Reprises sur d\u00e9pr\u00e9ciations des actifs circulants": {
-                        "78173-Stocks et en-cours": {}, 
+                        "78173-Stocks et en-cours": {},
                         "78174-Cr\u00e9ances": {}
                     }
-                }, 
+                },
                 "786-Reprises sur d\u00e9pr\u00e9ciations et provisions (\u00e0 inscrire dans les produits financiers)": {
-                    "7865-Reprises sur provisions financi\u00e8res": {}, 
+                    "7865-Reprises sur provisions financi\u00e8res": {},
                     "7866-Reprises sur d\u00e9pr\u00e9ciations des \u00e9l\u00e9ments financiers": {
-                        "78662-Immobilisations financi\u00e8res": {}, 
+                        "78662-Immobilisations financi\u00e8res": {},
                         "78665-Valeurs mobili\u00e8res de placement": {}
                     }
-                }, 
+                },
                 "787-Reprises sur d\u00e9pr\u00e9ciations et provisions (\u00e0 inscrire dans les produits exceptionnels)": {
                     "7872-Reprises sur provisions r\u00e9glement\u00e9es (immobilisations)": {
-                        "78725-Amortissements d\u00e9rogatoires": {}, 
-                        "78726-Provision sp\u00e9ciale de r\u00e9\u00e9valuation": {}, 
+                        "78725-Amortissements d\u00e9rogatoires": {},
+                        "78726-Provision sp\u00e9ciale de r\u00e9\u00e9valuation": {},
                         "78727-Plus-values r\u00e9investies": {}
-                    }, 
-                    "7873-Reprises sur provisions r\u00e9glement\u00e9es (stocks)": {}, 
-                    "7874-Reprises sur autres provisions r\u00e9glement\u00e9es": {}, 
-                    "7875-Reprises sur provisions exceptionnelles": {}, 
+                    },
+                    "7873-Reprises sur provisions r\u00e9glement\u00e9es (stocks)": {},
+                    "7874-Reprises sur autres provisions r\u00e9glement\u00e9es": {},
+                    "7875-Reprises sur provisions exceptionnelles": {},
                     "7876-Reprises sur d\u00e9pr\u00e9ciations exceptionnelles": {}
                 }
-            }, 
+            },
             "79-Transferts de charges": {
-                "791-Transferts de charges d'exploitation": {}, 
-                "796-Transferts de charges financi\u00e8res": {}, 
+                "791-Transferts de charges d'exploitation": {},
+                "796-Transferts de charges financi\u00e8res": {},
                 "797-Transferts de charges exceptionnelles": {}
-            }, 
+            },
             "root_type": "Income"
         }
     }
diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general_avec_code.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general_avec_code.json
new file mode 100644
index 0000000..b667379
--- /dev/null
+++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/fr_plan_comptable_general_avec_code.json
@@ -0,0 +1,3144 @@
+{
+    "country_code": "fr",
+    "name": "France - Plan Comptable General avec code",
+    "tree": {
+        "Comptes de Capitaux": {
+            "root_type": "Equity",
+            "Capital et R\u00e9serves": {
+                "Capital": {
+                    "Capital souscrit - non appel\u00e9": {
+                        "account_number": "1011"
+                    },
+                    "Capital souscrit - appel\u00e9, non vers\u00e9": {
+                        "account_number": "1012"
+                    },
+                    "Capital souscrit - appel\u00e9, vers\u00e9": {
+                        "Capital non amorti": {
+                            "account_number": "10131"
+                        },
+                        "Capital amorti": {
+                            "account_number": "10132"
+                        },
+                        "account_number": "1013"
+                    },
+                    "Capital souscrit soumis \u00e0 des r\u00e9glementations particuli\u00e8res": {
+                        "account_number": "1018"
+                    },
+                    "account_number": "101"
+                },
+                "Fonds fiduciaires": {
+                    "account_number": "102"
+                },
+                "Primes li\u00e9es au capital social": {
+                    "Primes d'\u00e9mission": {
+                        "account_number": "1041"
+                    },
+                    "Primes de fusion": {
+                        "account_number": "1042"
+                    },
+                    "Primes d'apport": {
+                        "account_number": "1043"
+                    },
+                    "Primes de conversion d'obligations en actions": {
+                        "account_number": "1044"
+                    },
+                    "Bons de souscription d'actions": {
+                        "account_number": "1045"
+                    },
+                    "account_number": "104"
+                },
+                "Ecarts de r\u00e9\u00e9valuation": {
+                    "R\u00e9serve sp\u00e9ciale de r\u00e9\u00e9valuation": {
+                        "account_number": "1051"
+                    },
+                    "Ecart de r\u00e9\u00e9valuation libre": {
+                        "account_number": "1052"
+                    },
+                    "R\u00e9serve de r\u00e9\u00e9valuation": {
+                        "account_number": "1053"
+                    },
+                    "Ecarts de r\u00e9\u00e9valuation (autres op\u00e9rations l\u00e9gales)": {
+                        "account_number": "1055"
+                    },
+                    "Autres \u00e9carts de r\u00e9\u00e9valuation en France": {
+                        "account_number": "1057"
+                    },
+                    "Autres \u00e9carts de r\u00e9\u00e9valuation \u00e0 l'\u00e9tranger": {
+                        "account_number": "1058"
+                    },
+                    "account_number": "105"
+                },
+                "R\u00e9serves": {
+                    "R\u00e9serve l\u00e9gale": {
+                        "R\u00e9serve l\u00e9gale proprement dite": {
+                            "account_number": "10611"
+                        },
+                        "Plus-values nettes \u00e0 long terme": {
+                            "account_number": "10612"
+                        },
+                        "account_number": "1061"
+                    },
+                    "R\u00e9serves indisponibles": {
+                        "account_number": "1062"
+                    },
+                    "R\u00e9serves statutaires ou contractuelles": {
+                        "account_number": "1063"
+                    },
+                    "R\u00e9serves r\u00e9glement\u00e9es": {
+                        "Plus-values nettes \u00e0 long terme": {
+                            "account_number": "10641"
+                        },
+                        "R\u00e9serves cons\u00e9cutives \u00e0 l'octroi de subventions d'investissement": {
+                            "account_number": "10643"
+                        },
+                        "Autres r\u00e9serves r\u00e9glement\u00e9es": {
+                            "account_number": "10648"
+                        },
+                        "account_number": "1064"
+                    },
+                    "Autres r\u00e9serves": {
+                        "R\u00e9serve de propre assureur": {
+                            "account_number": "10681"
+                        },
+                        "R\u00e9serves diverses": {
+                            "account_number": "10688"
+                        },
+                        "account_number": "1068"
+                    },
+                    "account_number": "106"
+                },
+                "Ecarts d'\u00e9quivalence": {
+                    "account_number": "107"
+                },
+                "Compte de l'exploitant": {
+                    "account_number": "108"
+                },
+                "Actionnaires: Capital souscrit - non appel\u00e9": {
+                    "account_number": "109"
+                },
+                "account_number": "10"
+            },
+            "Report \u00e0 Nouveau": {
+                "Report \u00e0 nouveau (solde cr\u00e9diteur)": {
+                    "account_number": "110"
+                },
+                "Report \u00e0 nouveau (solde d\u00e9biteur)": {
+                    "account_number": "119"
+                },
+                "account_number": "11"
+            },
+            "R\u00e9sultat de l'Exercice": {
+                "R\u00e9sultat de l'exercice (b\u00e9n\u00e9fice)": {
+                    "account_number": "120"
+                },
+                "R\u00e9sultat de l'exercice (perte)": {
+                    "account_number": "129"
+                },
+                "account_number": "12"
+            },
+            "Subventions d'Investissement": {
+                "Subventions d'\u00e9quipement": {
+                    "Etat": {
+                        "account_number": "1311"
+                    },
+                    "R\u00e9gions": {
+                        "account_number": "1312"
+                    },
+                    "D\u00e9partements": {
+                        "account_number": "1313"
+                    },
+                    "Communes": {
+                        "account_number": "1314"
+                    },
+                    "Collectivit\u00e9s publiques": {
+                        "account_number": "1315"
+                    },
+                    "Entreprises publiques": {
+                        "account_number": "1316"
+                    },
+                    "Entreprises et organismes priv\u00e9s": {
+                        "account_number": "1317"
+                    },
+                    "Autres": {
+                        "account_number": "1318"
+                    },
+                    "account_number": "131"
+                },
+                "Autres subventions d'investissement (m\u00eame ventilation que celle du compte 131)": {
+                    "account_number": "138"
+                },
+                "Subventions d'investissement inscrites au compte de r\u00e9sultat": {
+                    "Subventions d'\u00e9quipement": {
+                        "Etat": {
+                            "account_number": "13911"
+                        },
+                        "R\u00e9gions": {
+                            "account_number": "13912"
+                        },
+                        "D\u00e9partements": {
+                            "account_number": "13913"
+                        },
+                        "Communes": {
+                            "account_number": "13914"
+                        },
+                        "Collectivit\u00e9s publiques": {
+                            "account_number": "13915"
+                        },
+                        "Entreprises publiques": {
+                            "account_number": "13916"
+                        },
+                        "Entreprises et organismes priv\u00e9s": {
+                            "account_number": "13917"
+                        },
+                        "Autres": {
+                            "account_number": "13918"
+                        },
+                        "account_number": "1391"
+                    },
+                    "Autres subventions d'investissement (m\u00eame ventilation que celle du compte 1391)": {
+                        "account_number": "1398"
+                    },
+                    "account_number": "139"
+                },
+                "account_number": "13"
+            },
+            "Provisions R\u00e9glement\u00e9es": {
+                "Provisions r\u00e9glement\u00e9es relative aux immobilisations": {
+                    "Provisions pour reconstitution des gisements miniers et p\u00e9troliers": {
+                        "account_number": "1423"
+                    },
+                    "Provisions pour investissement (participation des salari\u00e9s)": {
+                        "account_number": "1424"
+                    },
+                    "account_number": "142"
+                },
+                "Provisions r\u00e9glement\u00e9es relatives aux stocks": {
+                    "Hausse des prix": {
+                        "account_number": "1431"
+                    },
+                    "Fluctuation des cours": {
+                        "account_number": "1432"
+                    },
+                    "account_number": "143"
+                },
+                "Provisions r\u00e9glement\u00e9es relatives aux autres \u00e9l\u00e9ments de l'actif": {
+                    "account_number": "144"
+                },
+                "Amortissements d\u00e9rogatoires": {
+                    "account_number": "145"
+                },
+                "Provision sp\u00e9ciale de r\u00e9\u00e9valuation": {
+                    "account_number": "146"
+                },
+                "Plus-values r\u00e9investies": {
+                    "account_number": "147"
+                },
+                "Autres provisions r\u00e9glement\u00e9es": {
+                    "account_number": "148"
+                },
+                "account_number": "14"
+            },
+            "Provisions": {
+                "Provisions pour risques": {
+                    "Provisions pour litiges": {
+                        "account_number": "1511"
+                    },
+                    "Provisions pour garanties donn\u00e9es aux clients": {
+                        "account_number": "1512"
+                    },
+                    "Provisions pour pertes sur march\u00e9s \u00e0 terme": {
+                        "account_number": "1513"
+                    },
+                    "Provisions pour amendes et p\u00e9nalit\u00e9s": {
+                        "account_number": "1514"
+                    },
+                    "Provisions pour pertes de change": {
+                        "account_number": "1515"
+                    },
+                    "Provisions pour pertes sur contrats": {
+                        "account_number": "1516"
+                    },
+                    "Autres provisions pour risques": {
+                        "account_number": "1518"
+                    },
+                    "account_number": "151"
+                },
+                "Provisions pour pensions et obligations similaires": {
+                    "account_number": "153"
+                },
+                "Provisions pour restructurations": {
+                    "account_number": "154"
+                },
+                "Provisions pour imp\u00f4ts": {
+                    "account_number": "155"
+                },
+                "Provisions pour renouvellement des immobilisations (entreprises concessionnaires) ": {
+                    "account_number": "156"
+                },
+                "Provisions pour charges \u00e0 r\u00e9partir sur plusieurs exercices": {
+                    "Provisions pour gros entretien ou grandes r\u00e9visions": {
+                        "account_number": "1572"
+                    },
+                    "account_number": "157"
+                },
+                "Autres provisions pour charges": {
+                    "Provisions pour remises en \u00e9tat": {
+                        "account_number": "1581"
+                    },
+                    "account_number": "158"
+                },
+                "account_number": "15"
+            },
+            "Emprunts et Dettes Assimil\u00e9es": {
+                "Emprunts obligataires convertibles": {
+                    "account_number": "161"
+                },
+                "Obligations repr\u00e9sentatives de passifs nets remis en fiducie": {
+                    "account_number": "162"
+                },
+                "Autres emprunts obligataires": {
+                    "account_number": "163"
+                },
+                "Emprunts aupr\u00e8s des \u00e9tablissements de cr\u00e9dit": {
+                    "account_number": "164"
+                },
+                "D\u00e9p\u00f4ts et cautionnements re\u00e7us": {
+                    "D\u00e9p\u00f4ts": {
+                        "account_number": "1651"
+                    },
+                    "Cautionnements": {
+                        "account_number": "1655"
+                    },
+                    "account_number": "165"
+                },
+                "Participation des salari\u00e9s aux r\u00e9sultats": {
+                    "Comptes bloqu\u00e9s": {
+                        "account_number": "1661"
+                    },
+                    "Fonds de participation": {
+                        "account_number": "1662"
+                    },
+                    "account_number": "166"
+                },
+                "Emprunts et dettes assortis de conditions particuli\u00e8res": {
+                    "Emissions de titres participatifs": {
+                        "account_number": "1671"
+                    },
+                    "Avances conditionn\u00e9es de l'Etat": {
+                        "account_number": "1674"
+                    },
+                    "Emprunts participatifs": {
+                        "account_number": "1675"
+                    },
+                    "account_number": "167"
+                },
+                "Autres emprunts et dettes assimil\u00e9es": {
+                    "Autres emprunts": {
+                        "account_number": "1681"
+                    },
+                    "Rentes viag\u00e8res capitalis\u00e9es": {
+                        "account_number": "1685"
+                    },
+                    "Autres dettes": {
+                        "account_number": "1687"
+                    },
+                    "Int\u00e9r\u00eats courus": {
+                        "Int\u00e9r\u00eats courus sur emprunts obligataires convertibles": {
+                            "account_number": "16881"
+                        },
+                        "Int\u00e9r\u00eats courus sur autres emprunts obligataires": {
+                            "account_number": "16883"
+                        },
+                        "Int\u00e9r\u00eats courus sur emprunts aupr\u00e8s des \u00e9tablissements de cr\u00e9dit": {
+                            "account_number": "16884"
+                        },
+                        "Int\u00e9r\u00eats courus sur d\u00e9p\u00f4ts et cautionnements re\u00e7us": {
+                            "account_number": "16885"
+                        },
+                        "Int\u00e9r\u00eats courus sur participation des salari\u00e9s aux r\u00e9sultats": {
+                            "account_number": "16886"
+                        },
+                        "Int\u00e9r\u00eats courus sur emprunts et dettes assortis de conditions particuli\u00e8res": {
+                            "account_number": "16887"
+                        },
+                        "Int\u00e9r\u00eats courus sur autres emprunts et dettes assimil\u00e9es": {
+                            "account_number": "16888"
+                        },
+                        "account_number": "1688"
+                    },
+                    "Primes de remboursement des obligations": {
+                        "account_number": "169"
+                    },
+                    "account_number": "168"
+                },
+                "account_number": "16"
+            },
+            "Dettes Rattach\u00e9es \u00e0 des Participations": {
+                "Dettes rattach\u00e9es \u00e0 des participations (groupe)": {
+                    "account_number": "171"
+                },
+                "Dettes rattach\u00e9es \u00e0 des participations (hors groupe)": {
+                    "account_number": "174"
+                },
+                "Dettes rattach\u00e9es \u00e0 des soci\u00e9t\u00e9s en participation": {
+                    "Principal": {
+                        "account_number": "1781"
+                    },
+                    "Int\u00e9r\u00eats courus": {
+                        "account_number": "1788"
+                    },
+                    "account_number": "178"
+                },
+                "account_number": "17"
+            },
+            "Comptes de liaison des \u00e9tablisssements et soci\u00e9t\u00e9s en participation": {
+                "Comptes de liaison des \u00e9tablissements": {
+                    "account_number": "181"
+                },
+                "Biens et prestations de services \u00e9chang\u00e9s entre \u00e9tablissements (charges)": {
+                    "account_number": "186"
+                },
+                "Biens et prestations de services \u00e9chang\u00e9s entre \u00e9tablissements (produits)": {
+                    "account_number": "187"
+                },
+                "Comptes de liaison des soci\u00e9t\u00e9s en participation": {
+                    "account_number": "188"
+                },
+                "account_number": "18"
+            },
+            "account_number": "1"
+        },
+        "Comptes d'Immobilisations": {
+            "root_type": "Asset",
+            "Immobilisations incorporelles": {
+                "Frais \u00e9tablissement": {
+                    "Frais de constitution": {
+                        "account_number": "2011"
+                    },
+                    "Frais de premier \u00e9tablissement": {
+                        "Frais de prospection": {
+                            "account_number": "20121"
+                        },
+                        "Frais de publicit\u00e9": {
+                            "account_number": "20122"
+                        },
+                        "account_number": "2012"
+                    },
+                    "Frais d'augmentation de capital et d'op\u00e9rations diverses (fusions, scissions, transformations)": {
+                        "account_number": "2013"
+                    },
+                    "account_number": "201"
+                },
+                "Frais de recherche et de d\u00e9veloppement": {
+                    "account_number": "203"
+                },
+                "Concessions et droits similaires, brevets, licences, marques, proc\u00e9d\u00e9s, logiciels, droits et valeurs similaires": {
+                    "account_number": "205"
+                },
+                "Droit au bail": {
+                    "account_number": "206"
+                },
+                "Fonds commercial": {
+                    "account_number": "207"
+                },
+                "Autres immobilisations incorporelles": {
+                    "Mali de fusion sur actifs incorporels": {
+                        "account_number": "2081"
+                    },
+                    "account_number": "208"
+                },
+                "account_number": "20"
+            },
+            "Immobilisations corporelles": {
+                "account_type": "Fixed Asset",
+                "Terrains": {
+                    "account_type": "Fixed Asset",
+                    "Terrains nus": {
+                        "account_type": "Fixed Asset",
+                        "account_number": "2111"
+                    },
+                    "Terrains am\u00e9nag\u00e9s": {
+                        "account_type": "Fixed Asset",
+                        "account_number": "2112"
+                    },
+                    "Sous-sols et sur-sols": {
+                        "account_type": "Fixed Asset",
+                        "account_number": "2113"
+                    },
+                    "Terrains de carri\u00e8res (tr\u00e9fonds)": {
+                        "account_type": "Fixed Asset",
+                        "account_number": "2114"
+                    },
+                    "Terrains b\u00e2tis": {
+                        "account_type": "Fixed Asset",
+                        "Ensembles immobiliers industriels (A, B)": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21151"
+                        },
+                        "Ensembles immobiliers administratifs et commerciaux (A, B)": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21155"
+                        },
+                        "Autres ensembles immobiliers": {
+                            "account_type": "Fixed Asset",
+                            "Autres ensembles immobiliers affect\u00e9s aux op\u00e9rations professionnelles (A, B)": {
+                                "account_type": "Fixed Asset",
+                                "account_number": "211581"
+                            },
+                            "Autres ensembles immobiliers affect\u00e9s aux op\u00e9rations non professionnelles (A, B)": {
+                                "account_type": "Fixed Asset",
+                                "account_number": "211588"
+                            },
+                            "account_number": "21158"
+                        },
+                        "account_number": "2115"
+                    },
+                    "account_number": "211"
+                },
+                "Agencements et am\u00e9nagements de terrains (m\u00eame ventilation que celle du compte 211)": {
+                    "account_type": "Fixed Asset",
+                    "account_number": "212"
+                },
+                "Constructions": {
+                    "account_type": "Fixed Asset",
+                    "B\u00e2timents": {
+                        "account_type": "Fixed Asset",
+                        "Ensembles immobiliers industriels (A, B)": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21311"
+                        },
+                        "Ensembles immobiliers administratifs et commerciaux (A, B)": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21315"
+                        },
+                        "Autres ensembles immobiliers": {
+                            "account_type": "Fixed Asset",
+                            "Autres ensembles immobiliers affect\u00e9s aux op\u00e9rations professionnelles (A, B)": {
+                                "account_type": "Fixed Asset",
+                                "account_number": "213181"
+                            },
+                            "Autres ensembles immobiliers affect\u00e9s aux op\u00e9rations non professionnelles (A, B)": {
+                                "account_type": "Fixed Asset",
+                                "account_number": "213188"
+                            },
+                            "account_number": "21318"
+                        },
+                        "account_number": "2131"
+                    },
+                    "Installations g\u00e9n\u00e9rales, agencements, am\u00e9nagements des constructions": {
+                        "account_type": "Fixed Asset",
+                        "Ensembles immobiliers industriels (A, B)": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21351"
+                        },
+                        "Ensembles immobiliers administratifs et commerciaux (A, B)": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21355"
+                        },
+                        "Autres ensembles immobiliers": {
+                            "account_type": "Fixed Asset",
+                            "Autres ensembles immobiliers affect\u00e9s aux op\u00e9rations professionnelles (A, B)": {
+                                "account_type": "Fixed Asset",
+                                "account_number": "213581"
+                            },
+                            "Autres ensembles immobiliers affect\u00e9s aux op\u00e9rations non professionnelles (A, B)": {
+                                "account_type": "Fixed Asset",
+                                "account_number": "213588"
+                            },
+                            "account_number": "21358"
+                        },
+                        "account_number": "2135"
+                    },
+                    "Ouvrages d'infrastructure": {
+                        "account_type": "Fixed Asset",
+                        "Voies de terre": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21381"
+                        },
+                        "Voies de fer": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21382"
+                        },
+                        "Voies d'eau": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21383"
+                        },
+                        "Barrages": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21384"
+                        },
+                        "Pistes d'a\u00e9rodromes": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21385"
+                        },
+                        "account_number": "2138"
+                    },
+                    "account_number": "213"
+                },
+                "Constructions sur sol d'autrui (m\u00eame ventilation que celle du compte 213)": {
+                    "account_type": "Fixed Asset",
+                    "account_number": "214"
+                },
+                "Installations techniques, mat\u00e9riel et outillage industriels": {
+                    "account_type": "Fixed Asset",
+                    "Installations complexes sp\u00e9cialis\u00e9es": {
+                        "account_type": "Fixed Asset",
+                        "Installations complexes sp\u00e9cialis\u00e9es - sur sol propre": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21511"
+                        },
+                        "Installations complexes sp\u00e9cialis\u00e9es - sur sol d'autrui": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21514"
+                        },
+                        "account_number": "2151"
+                    },
+                    "Installations \u00e0 caract\u00e8re sp\u00e9cifique": {
+                        "account_type": "Fixed Asset",
+                        "Installations \u00e0 caract\u00e8re sp\u00e9cifique - sur sol propre": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21531"
+                        },
+                        "Installations \u00e0 caract\u00e8re sp\u00e9cifique - sur sol d'autrui": {
+                            "account_type": "Fixed Asset",
+                            "account_number": "21534"
+                        },
+                        "account_number": "2153"
+                    },
+                    "Mat\u00e9riel industriel": {
+                        "account_type": "Fixed Asset",
+                        "account_number": "2154"
+                    },
+                    "Outillage industriel": {
+                        "account_type": "Fixed Asset",
+                        "account_number": "2155"
+                    },
+                    "Agencements et am\u00e9nagements du mat\u00e9riel et outillage industriel": {
+                        "account_type": "Fixed Asset",
+                        "account_number": "2157"
+                    },
+                    "account_number": "215"
+                },
+                "Autres immobilisations corporelles": {
+                    "account_type": "Fixed Asset",
+                    "Installations g\u00e9n\u00e9rales, agencements, am\u00e9nagements divers": {
+                        "account_type": "Fixed Asset",
+                        "account_number": "2181"
+                    },
+                    "Mat\u00e9riel de transport": {
+                        "account_type": "Fixed Asset",
+                        "account_number": "2182"
+                    },
+                    "Mat\u00e9riel de bureau et mat\u00e9riel informatique": {
+                        "account_type": "Fixed Asset",
+                        "account_number": "2183"
+                    },
+                    "Mobilier": {
+                        "account_type": "Fixed Asset",
+                        "account_number": "2184"
+                    },
+                    "Cheptel": {
+                        "account_type": "Fixed Asset",
+                        "account_number": "2185"
+                    },
+                    "Emballages r\u00e9cup\u00e9rables": {
+                        "account_type": "Fixed Asset",
+                        "account_number": "2186"
+                    },
+                    "Mali de fusion sur actifs corporels": {
+                        "account_number": "2187"
+                    },
+                    "account_number": "218"
+                },
+                "account_number": "21"
+            },
+            "Immobilisations mises en concession": {
+                "account_number": "22"
+            },
+            "Immobilisations en cours": {
+                "Immobilisations corporelles en cours": {
+                    "Terrains": {
+                        "account_number": "2312"
+                    },
+                    "Constructions": {
+                        "account_number": "2313"
+                    },
+                    "Installations techniques, mat\u00e9riel et outillage industriels": {
+                        "account_number": "2315"
+                    },
+                    "Autres immobilisations corporelles": {
+                        "account_number": "2318"
+                    },
+                    "account_number": "231"
+                },
+                "Immobilisations incorporelles en cours": {
+                    "account_number": "232"
+                },
+                "Avances et acomptes vers\u00e9s sur commandes d'immobilisations incorporelles": {
+                    "account_number": "237"
+                },
+                "Avances et acomptes vers\u00e9s sur commandes d'immobilisations corporelles": {
+                    "Terrains": {
+                        "account_number": "2382"
+                    },
+                    "Constructions": {
+                        "account_number": "2383"
+                    },
+                    "Installations techniques, mat\u00e9riel et outillage industriels": {
+                        "account_number": "2385"
+                    },
+                    "Autres immobilisations corporelles": {
+                        "account_number": "2388"
+                    },
+                    "account_number": "238"
+                },
+                "account_number": "23"
+            },
+            "Parts dans des entreprises li\u00e9es et cr\u00e9ances sur des entreprises li\u00e9es": {
+                "is_group": 1,
+                "account_number": "25"
+            },
+            "Participations et cr\u00e9ances rattach\u00e9es \u00e0 des participations": {
+                "Titres de participation": {
+                    "Actions": {
+                        "account_number": "2611"
+                    },
+                    "Autres titres": {
+                        "account_number": "2618"
+                    },
+                    "account_number": "261"
+                },
+                "Autres formes de participation": {
+                    "Droit repr\u00e9sentatifs d'actifs nets remis en fiducie": {
+                        "account_number": "2661"
+                    },
+                    "account_number": "266"
+                },
+                "Cr\u00e9ances rattach\u00e9es \u00e0 des participations": {
+                    "Cr\u00e9ances rattach\u00e9es \u00e0 des participations (groupe)": {
+                        "account_number": "2671"
+                    },
+                    "Cr\u00e9ances rattach\u00e9es \u00e0 des participations (hors groupe)": {
+                        "account_number": "2674"
+                    },
+                    "Versements repr\u00e9sentatifs d'apports non capitalis\u00e9s (appel de fonds)": {
+                        "account_number": "2675"
+                    },
+                    "Avances consolidables": {
+                        "account_number": "2676"
+                    },
+                    "Autres cr\u00e9ances rattach\u00e9es \u00e0 des participations": {
+                        "account_number": "2677"
+                    },
+                    "Int\u00e9r\u00eats courus": {
+                        "account_number": "2678"
+                    },
+                    "account_number": "267"
+                },
+                "Cr\u00e9ances rattach\u00e9es \u00e0 des soci\u00e9t\u00e9s en participation": {
+                    "Principal": {
+                        "account_number": "2681"
+                    },
+                    "Int\u00e9r\u00eats courus": {
+                        "account_number": "2688"
+                    },
+                    "account_number": "268"
+                },
+                "Versements restant \u00e0 effectuer sur titres de participation non lib\u00e9r\u00e9s": {
+                    "account_number": "269"
+                },
+                "account_number": "26"
+            },
+            "Autres immobilisations financi\u00e8res": {
+                "Titres immobilis\u00e9s autres que les titres immobilis\u00e9s de l'activit\u00e9 de portefeuille (droit de propri\u00e9t\u00e9)": {
+                    "Actions": {
+                        "account_number": "2711"
+                    },
+                    "Autres titres": {
+                        "account_number": "2718"
+                    },
+                    "account_number": "271"
+                },
+                "Titres immobilis\u00e9s (droit de cr\u00e9ance)": {
+                    "Obligations": {
+                        "account_number": "2721"
+                    },
+                    "Bons": {
+                        "account_number": "2722"
+                    },
+                    "account_number": "272"
+                },
+                "Titres immobilis\u00e9s de l'activit\u00e9 de portefeuille": {
+                    "account_number": "273"
+                },
+                "Pr\u00eats": {
+                    "Pr\u00eats participatifs": {
+                        "account_number": "2741"
+                    },
+                    "Pr\u00eats aux associ\u00e9s": {
+                        "account_number": "2742"
+                    },
+                    "Pr\u00eats au personnel": {
+                        "account_number": "2743"
+                    },
+                    "Autres pr\u00eats": {
+                        "account_number": "2748"
+                    },
+                    "account_number": "274"
+                },
+                "D\u00e9p\u00f4ts et cautionnements vers\u00e9s": {
+                    "D\u00e9p\u00f4ts": {
+                        "account_number": "2751"
+                    },
+                    "Cautionnements": {
+                        "account_number": "2755"
+                    },
+                    "account_number": "275"
+                },
+                "Autres cr\u00e9ances immobilis\u00e9es": {
+                    "Cr\u00e9ances diverses": {
+                        "account_number": "2761"
+                    },
+                    "Int\u00e9r\u00eats courus": {
+                        "Int\u00e9r\u00eats courus sur titres immobilis\u00e9s (droit de cr\u00e9ance)": {
+                            "account_number": "27682"
+                        },
+                        "Int\u00e9r\u00eats courus sur pr\u00eats": {
+                            "account_number": "27684"
+                        },
+                        "Int\u00e9r\u00eats courus sur d\u00e9p\u00f4ts et cautionnements": {
+                            "account_number": "27685"
+                        },
+                        "Int\u00e9r\u00eats courus sur cr\u00e9ances diverses": {
+                            "account_number": "27688"
+                        },
+                        "account_number": "2768"
+                    },
+                    "account_number": "276"
+                },
+                "(Actions propres ou parts propres)": {
+                    "Actions propres ou parts propres": {
+                        "account_number": "2771"
+                    },
+                    "Actions propres ou parts propres en voie d'annulation": {
+                        "account_number": "2772"
+                    },
+                    "account_number": "277"
+                },
+                "Mali de fusion sur actifs financiers": {
+                    "account_number": "278"
+                },
+                "Versements restant \u00e0 effectuer sur titres immobilis\u00e9s non lib\u00e9r\u00e9s": {
+                    "account_number": "279"
+                },
+                "account_number": "27"
+            },
+            "Amortissements des immobilisations": {
+                "account_type": "Accumulated Depreciation",
+                "Amortissements des immobilisations incorporelles": {
+                    "account_type": "Accumulated Depreciation",
+                    "Frais d'\u00e9tablissement (m\u00eame ventilation que celle du compte 212)": {
+                        "account_type": "Accumulated Depreciation",
+                        "account_number": "2801"
+                    },
+                    "Frais de recherche et de d\u00e9veloppement": {
+                        "account_type": "Accumulated Depreciation",
+                        "account_number": "2803"
+                    },
+                    "Concessions et droits similaires, brevets, licences, logiciels, droits et valeurs similaires": {
+                        "account_type": "Accumulated Depreciation",
+                        "account_number": "2805"
+                    },
+                    "Fonds commercial": {
+                        "account_type": "Accumulated Depreciation",
+                        "account_number": "2807"
+                    },
+                    "Autres immobilisations incorporelles": {
+                        "account_type": "Accumulated Depreciation",
+                        "Mali de fusion sur actifs incorporels": {
+                            "account_type": "Accumulated Depreciation",
+                            "account_number": "28081"
+                        },
+                        "account_number": "2808"
+                    },
+                    "account_number": "280"
+                },
+                "Amortissements des immobilisations corporelles": {
+                    "account_type": "Accumulated Depreciation",
+                    "Terrains de gisement": {
+                        "account_type": "Accumulated Depreciation",
+                        "account_number": "2811"
+                    },
+                    "Agencements, am\u00e9nagements de terrains (m\u00eame ventilation que celle du compte 212)": {
+                        "account_type": "Accumulated Depreciation",
+                        "account_number": "2812"
+                    },
+                    "Constructions (m\u00eame ventilation que celle du compte 213)": {
+                        "account_type": "Accumulated Depreciation",
+                        "account_number": "2813"
+                    },
+                    "Constructions sur sol d'autrui (m\u00eame ventilation que celle du compte du 214)": {
+                        "account_type": "Accumulated Depreciation",
+                        "account_number": "2814"
+                    },
+                    "Installations techniques, mat\u00e9riel et outillage industriels (m\u00eame ventilation que celle du compte 218)": {
+                        "account_type": "Accumulated Depreciation",
+                        "account_number": "2815"
+                    },
+                    "Autres immobilisations corporelles (m\u00eame ventilation que celle du compte 218)": {
+                        "account_type": "Accumulated Depreciation",
+                        "Mali de fusion sur actifs corporels": {
+                            "account_type": "Accumulated Depreciation",
+                            "account_number": "28187"
+                        },
+                        "account_number": "2818"
+                    },
+                    "account_number": "281"
+                },
+                "Amortissements des immobilisations mises en concession": {
+                    "account_number": "282"
+                },
+                "account_number": "28"
+            },
+            "D\u00e9pr\u00e9ciations des immobilisations": {
+                "D\u00e9pr\u00e9ciations des immobilisations incorporelles": {
+                    "Marques,  proc\u00e9d\u00e9s, droits et valeurs similaires": {
+                        "account_number": "2905"
+                    },
+                    "Droit au bail": {
+                        "account_number": "2906"
+                    },
+                    "Fonds commercial": {
+                        "account_number": "2907"
+                    },
+                    "Autres immobilisations incorporelles": {
+                        "Mali de fusion sur actifs incorporels": {
+                            "account_number": "29081"
+                        },
+                        "account_number": "2908"
+                    },
+                    "account_number": "290"
+                },
+                "D\u00e9pr\u00e9ciations des immobilisations corporelles (m\u00eame ventilation que celle du compte 21)": {
+                    "Terrains (autres que terrains de gisement)": {
+                        "Mali de fusion sur actifs corporels": {
+                            "account_number": "29187"
+                        },
+                        "account_number": "2911"
+                    },
+                    "account_number": "291"
+                },
+                "D\u00e9pr\u00e9ciations des immobilisations mises en concession": {
+                    "account_number": "292"
+                },
+                "D\u00e9pr\u00e9ciations des immobilisations en cours": {
+                    "Immobilisations corporelles en cours": {
+                        "account_number": "2931"
+                    },
+                    "Immobilisations incorporelles en cours": {
+                        "account_number": "2932"
+                    },
+                    "account_number": "293"
+                },
+                "D\u00e9pr\u00e9ciations des participations et cr\u00e9ances rattach\u00e9es \u00e0 des participations": {
+                    "Titres de participation": {
+                        "account_number": "2961"
+                    },
+                    "Autres formes de participation": {
+                        "account_number": "2966"
+                    },
+                    "Cr\u00e9ances rattach\u00e9es \u00e0 des participations (m\u00eame ventilation que celle du compte 267)": {
+                        "account_number": "2967"
+                    },
+                    "Cr\u00e9ances rattach\u00e9es \u00e0 des soci\u00e9t\u00e9s en participation (m\u00eame ventilation que celle du compte 268)": {
+                        "account_number": "2968"
+                    },
+                    "account_number": "296"
+                },
+                "D\u00e9pr\u00e9ciations des autres immobilisations financi\u00e8res": {
+                    "Titres immobilis\u00e9s autres que les titres immobilis\u00e9s de l'activit\u00e9 de portefeuille - droit de propri\u00e9t\u00e9": {
+                        "account_number": "2971"
+                    },
+                    "Titres immobilis\u00e9s - droit de cr\u00e9ance (m\u00eame ventilation que celle du compte 272)": {
+                        "account_number": "2972"
+                    },
+                    " Titres immobilis\u00e9s de l'activit\u00e9 de portefuille": {
+                        "account_number": "2973"
+                    },
+                    "Pr\u00eats (m\u00eame ventilation que celle du compte 274)": {
+                        "account_number": "2974"
+                    },
+                    "D\u00e9p\u00f4ts et cautionnements vers\u00e9s (m\u00eame ventilation que celle du compte 275)": {
+                        "account_number": "2975"
+                    },
+                    "Autres cr\u00e9ances immobilis\u00e9es (m\u00eame ventilation que celle du compte 276)": {
+                        "Mali de fusion sur actifs financiers": {
+                            "account_number": "29787"
+                        },
+                        "account_number": "2976"
+                    },
+                    "account_number": "297"
+                },
+                "account_number": "29"
+            },
+            "account_number": "2"
+        },
+        "Comptes de Stocks et En-Cours": {
+            "root_type": "Asset",
+            "Mati\u00e8res premi\u00e8res (et fournitures)": {
+                "Mati\u00e8res (ou groupe) A": {
+                    "account_number": "311"
+                },
+                "Mati\u00e8res (ou groupe) B": {
+                    "account_number": "312"
+                },
+                "Fournitures A, B, C, ...": {
+                    "account_number": "317"
+                },
+                "account_number": "31"
+            },
+            "Autres approvisionnements": {
+                "Mat\u00e8res consommables": {
+                    "Mati\u00e8res (ou groupe) C": {
+                        "account_number": "3211"
+                    },
+                    "Mati\u00e8res (ou groupe) D": {
+                        "account_number": "3212"
+                    },
+                    "account_number": "321"
+                },
+                "Fournitures consommables": {
+                    "Combustibles": {
+                        "account_number": "3221"
+                    },
+                    "Produits d'entretien": {
+                        "account_number": "3222"
+                    },
+                    "Fournitures d'atelier et d'usine": {
+                        "account_number": "3223"
+                    },
+                    "Fournitures de magasin": {
+                        "account_number": "3224"
+                    },
+                    "Fournitures de bureau": {
+                        "account_number": "3225"
+                    },
+                    "account_number": "322"
+                },
+                "Emballages": {
+                    "Emballages perdus": {
+                        "account_number": "3261"
+                    },
+                    "Emballages r\u00e9cup\u00e9rables non identifiables": {
+                        "account_number": "3265"
+                    },
+                    "Emballages \u00e0 usage mixte": {
+                        "account_number": "3267"
+                    },
+                    "account_number": "326"
+                },
+                "account_number": "32"
+            },
+            "En-cours de production de biens": {
+                "Produits en cours": {
+                    "Produits en cours P1": {
+                        "account_number": "3311"
+                    },
+                    "Produits en cours P2": {
+                        "account_number": "3312"
+                    },
+                    "account_number": "331"
+                },
+                "Travaux en cours": {
+                    "Travaux en cours T1": {
+                        "account_number": "3351"
+                    },
+                    "Travaux en cours T2": {
+                        "account_number": "3352"
+                    },
+                    "account_number": "335"
+                },
+                "account_number": "33"
+            },
+            "En-cours de production de services": {
+                "Etudes en cours": {
+                    "Etudes en cours E1": {
+                        "account_number": "3411"
+                    },
+                    "Etudes en cours E2": {
+                        "account_number": "3412"
+                    },
+                    "account_number": "341"
+                },
+                "Prestations de services en cours": {
+                    "Prestations de services S1": {
+                        "account_number": "3451"
+                    },
+                    "Prestations de services S2": {
+                        "account_number": "3452"
+                    },
+                    "account_number": "345"
+                },
+                "account_number": "34"
+            },
+            "Stocks de produits": {
+                "account_type": "Stock",
+                "Produits interm\u00e9diaires": {
+                    "account_type": "Stock",
+                    "Produits interm\u00e9diaires (ou groupe) A": {
+                        "account_type": "Stock",
+                        "is_group": 1,
+                        "account_number": "3511"
+                    },
+                    "Produits interm\u00e9diaires (ou groupe) B": {
+                        "account_type": "Stock",
+                        "is_group": 1,
+                        "account_number": "3512"
+                    },
+                    "account_number": "351"
+                },
+                "Produits finis": {
+                    "account_type": "Stock",
+                    "Produits finis (ou groupe) A": {
+                        "account_type": "Stock",
+                        "is_group": 1,
+                        "account_number": "3551"
+                    },
+                    "Produits finis (ou groupe) B": {
+                        "account_type": "Stock",
+                        "is_group": 1,
+                        "account_number": "3552"
+                    },
+                    "account_number": "355"
+                },
+                "Produits r\u00e9siduels (ou mati\u00e8res de r\u00e9cup\u00e9ration)": {
+                    "account_type": "Stock",
+                    "D\u00e9chets": {
+                        "account_type": "Stock",
+                        "is_group": 1,
+                        "account_number": "3581"
+                    },
+                    "Rebuts": {
+                        "account_type": "Stock",
+                        "is_group": 1,
+                        "account_number": "3585"
+                    },
+                    "Mati\u00e8res de r\u00e9cup\u00e9ration": {
+                        "account_type": "Stock",
+                        "is_group": 1,
+                        "account_number": "3586"
+                    },
+                    "account_number": "358"
+                },
+                "account_number": "35"
+            },
+            "(Compte \u00e0 ouvrir, le cas \u00e9ch\u00e9ant, sous l'intitul\u00e9 \"stocks provenant d'immobilisations\")": {
+                "account_number": "36"
+            },
+            "Stocks de marchandises": {
+                "Marchandises (ou groupe) A": {
+                    "account_number": "371"
+                },
+                "Marchandises (ou groupe) B": {
+                    "account_number": "372"
+                },
+                "account_number": "37"
+            },
+            "Stocks en voie d'acheminement, mis en d\u00e9p\u00f4t ou donn\u00e9s en consignation (en cas d'inventaire permanent en comptabilit\u00e9 g\u00e9n\u00e9rale)": {
+                "account_type": "Stock",
+                "account_number": "38"
+            },
+            "D\u00e9pr\u00e9ciations des stocks et en-cours": {
+                "D\u00e9pr\u00e9ciations des mati\u00e8res premi\u00e8res (et fournitures)": {
+                    "Mati\u00e8res (ou groupe) A": {
+                        "account_number": "3911"
+                    },
+                    "Mati\u00e8res (ou groupe) B": {
+                        "account_number": "3912"
+                    },
+                    "Fournitures A, B, C, ...": {
+                        "account_number": "3917"
+                    },
+                    "account_number": "391"
+                },
+                "D\u00e9pr\u00e9ciations des autres approvisionnements": {
+                    "Mati\u00e8res consommables (m\u00eame ventilation que celle du compte 321)": {
+                        "account_number": "3921"
+                    },
+                    "Fournitures consommables (m\u00eame ventilation que celle du compte 322)": {
+                        "account_number": "3922"
+                    },
+                    "Emballages (m\u00eame ventilation que celle du compte 326)": {
+                        "account_number": "3926"
+                    },
+                    "account_number": "392"
+                },
+                "D\u00e9pr\u00e9ciations des en-cours de production de biens": {
+                    "Etudes en cours (m\u00eame ventilation que celle du compte 341)": {
+                        "account_number": "3931"
+                    },
+                    "Travaux en cours (m\u00eame ventilation que celle du compte 335)": {
+                        "account_number": "3935"
+                    },
+                    "account_number": "393"
+                },
+                "D\u00e9pr\u00e9ciations des en-cours de production de services": {
+                    "Etudes en cours (m\u00eame ventilation que celle du compte 341)": {
+                        "account_number": "3941"
+                    },
+                    "Prestations de services en cours (m\u00eame ventilation que celle du compte 345)": {
+                        "account_number": "3945"
+                    },
+                    "account_number": "394"
+                },
+                "D\u00e9pr\u00e9ciations des stocks de produits": {
+                    "Produits interm\u00e9diaires (m\u00eame ventilation que celle du compte 351)": {
+                        "account_number": "3951"
+                    },
+                    "Produits finis (m\u00eame ventilation que celle du compte 355)": {
+                        "account_number": "3955"
+                    },
+                    "account_number": "395"
+                },
+                "D\u00e9pr\u00e9ciations des stocks de marchandises": {
+                    "Marchandise (ou groupe) A": {
+                        "account_number": "3971"
+                    },
+                    "Marchandise (ou groupe) B": {
+                        "account_number": "3972"
+                    },
+                    "account_number": "397"
+                },
+                "account_number": "39"
+            },
+            "account_number": "3"
+        },
+        "4-Comptes de Tiers (ACTIF)": {
+            "root_type": "Asset",
+            "40-Fournisseurs et Comptes Rattach\u00e9s (ACTIF)": {
+                "Fournisseurs d\u00e9biteurs": {
+                    "Fournisseurs - Avances et acomptes vers\u00e9s sur commandes": {
+                        "account_number": "4091"
+                    },
+                    "Fournisseurs - Cr\u00e9ances pour emballages et mat\u00e9riel \u00e0 rendre": {
+                        "account_number": "4096"
+                    },
+                    "Fournisseurs - Autres avoirs": {
+                        "Fournisseurs d'exploitation": {
+                            "account_number": "40971"
+                        },
+                        "Fournisseurs d'immobilisation": {
+                            "account_number": "40974"
+                        },
+                        "account_number": "4097"
+                    },
+                    "Rabais, remises, ristournes \u00e0 obtenir et autres avoirs non encore re\u00e7us": {
+                        "account_number": "4098"
+                    },
+                    "account_number": "409"
+                }
+            },
+            "41-Clients et comptes rattach\u00e9s (ACTIF)": {
+                "account_type": "Receivable",
+                "Clients et Comptes rattach\u00e9s": {
+                    "account_type": "Receivable",
+                    "account_number": "410"
+                },
+                "Clients": {
+                    "account_type": "Receivable",
+                    "Clients - Ventes de biens ou de prestations de services": {
+                        "account_type": "Receivable",
+                        "account_number": "4111"
+                    },
+                    "Clients - Retenues de garantie": {
+                        "account_type": "Receivable",
+                        "account_number": "4117"
+                    },
+                    "account_number": "411"
+                },
+                "Clients - Effets \u00e0 recevoir": {
+                    "account_type": "Receivable",
+                    "account_number": "413"
+                },
+                "Clients douteux ou litigieux": {
+                    "account_type": "Receivable",
+                    "account_number": "416"
+                },
+                "Clients - Produits non encore factur\u00e9s": {
+                    "account_type": "Receivable",
+                    "Clients - Factures \u00e0 \u00e9tablir": {
+                        "account_type": "Receivable",
+                        "account_number": "4181"
+                    },
+                    "Clients - Int\u00e9r\u00eats courus": {
+                        "account_type": "Receivable",
+                        "account_number": "4188"
+                    },
+                    "account_number": "418"
+                }
+            },
+            "42-Personnel et comptes rattach\u00e9s (ACTIF)": {
+                "Personnel - Avances et acomptes": {
+                    "account_number": "425"
+                }
+            },
+            "43-S\u00e9curit\u00e9 sociale et autres organismes sociaux (ACTIF)": {
+                "S\u00e9curit\u00e9 sociale": {
+                    "account_number": "431"
+                },
+                "Autres organismes sociaux": {
+                    "account_number": "437"
+                },
+                "438-Organismes sociaux - Produits \u00e0 recevoir": {
+                    "Produits \u00e0 recevoir": {
+                        "account_number": "4387"
+                    }
+                }
+            },
+            "44-Etat et autres collectivit\u00e9s publiques (ACTIF)": {
+                "Etat - Subventions \u00e0 recevoir": {
+                    "Subventions d'investissement": {
+                        "account_number": "4411"
+                    },
+                    "Subventions d'exploitation": {
+                        "account_number": "4417"
+                    },
+                    "Subventions d'\u00e9quilibre": {
+                        "account_number": "4418"
+                    },
+                    "Avances sur subventions": {
+                        "account_number": "4419"
+                    },
+                    "account_number": "441"
+                },
+                "Op\u00e9rations particuli\u00e8res avec l'Etat, les collectivit\u00e9s publiques, les organismes internationaux": {
+                    "Cr\u00e9ances sur l'Etat r\u00e9sultant de la suppression de la r\u00e8gle du d\u00e9calage d'un mois en mati\u00e8re de TVA": {
+                        "account_number": "4431"
+                    },
+                    "Int\u00e9r\u00eats courus sur cr\u00e9ances figurant au compte 4431": {
+                        "account_number": "4438"
+                    },
+                    "account_number": "443"
+                },
+                "Etat - Taxes sur le chiffre d'affaires (ACTIF)": {
+                    "TVA due intracommunautaire": {
+                        "account_number": "4452"
+                    },
+                    "Taxes sur le chiffre d'affaires d\u00e9ductibles": {
+                        "TVA sur immobilisations": {
+                            "account_number": "44562"
+                        },
+                        "TVA transf\u00e9r\u00e9e par d'autres entreprises": {
+                            "account_number": "44563"
+                        },
+                        "TVA sur autres biens et services": {
+                            "tax_rate": 20,
+                            "account_number": "44566"
+                        },
+                        "Cr\u00e9dit de TVA \u00e0 reporter": {
+                            "account_number": "44567"
+                        },
+                        "Taxes assimil\u00e9es \u00e0 la TVA": {
+                            "account_number": "44568"
+                        },
+                        "account_number": "4456"
+                    },
+                    "4458-Taxes sur le chiffre d'affaires \u00e0 r\u00e9gulariser ou en attente (ACTIF)": {
+                        "Acomptes - R\u00e9gime simplifi\u00e9 d'imposition": {
+                            "account_number": "44581"
+                        },
+                        "Acomptes - R\u00e9gime du forfait": {
+                            "account_number": "44582"
+                        },
+                        "Remboursement de taxes sur le chiffre d'affaires demand\u00e9": {
+                            "account_number": "44583"
+                        },
+                        "Taxes sur le chiffre d'affaires sur factures non parvenues": {
+                            "account_number": "44586"
+                        }
+                    }
+                },
+                "Etat - Charges \u00e0 payer et produits \u00e0 recevoir": {
+                    "Charges fiscales sur cong\u00e9s \u00e0 payer": {
+                        "account_number": "4482"
+                    },
+                    "Charges \u00e0 payer": {
+                        "account_number": "4486"
+                    },
+                    "Produits \u00e0 recevoir": {
+                        "account_number": "4487"
+                    },
+                    "account_number": "448"
+                }
+            },
+            "45-Groupe et associ\u00e9s (ACTIF)": {
+                "Associ\u00e9s - Op\u00e9rations sur le capital (ACTIF)": {
+                    "456-Apporteurs - Capital appel\u00e9, non vers\u00e9": {
+                        "Actionnaires - Capital souscrit et appel\u00e9, non vers\u00e9": {
+                            "account_number": "45621"
+                        },
+                        "Associ\u00e9s - Capital appel\u00e9, non vers\u00e9": {
+                            "account_number": "45625"
+                        },
+                        "account_number": "4562"
+                    }
+                }
+            },
+            "46-D\u00e9biteurs divers et cr\u00e9diteurs divers (ACTIF)": {
+                "Cr\u00e9ances sur cessions d'immobilisations": {
+                    "account_number": "462"
+                },
+                "Cr\u00e9ances sur cessions de valeurs mobili\u00e8res de placement": {
+                    "account_number": "465"
+                },
+                "467-Autres comptes d\u00e9biteurs ou cr\u00e9diteurs (ACTIF)": {},
+                "468-Divers - Charges \u00e0 payer et produits \u00e0 recevoir (ACTIF)": {
+                    "Produits \u00e0 recevoir": {
+                        "account_number": "4687"
+                    }
+                }
+            },
+            "47-Comptes transitoires ou d'attente (ACTIF)": {
+                "471-Comptes d'attente (ACTIF)": {
+                    "account_type": "Temporary"
+                },
+                "Diff\u00e9rences de conversion (ACTIF)": {
+                    "Diminution des cr\u00e9ances": {
+                        "account_number": "4761"
+                    },
+                    "Augmentation des dettes": {
+                        "account_number": "4762"
+                    },
+                    "Diff\u00e9rences compens\u00e9es par couverture de change": {
+                        "account_number": "4768"
+                    },
+                    "account_number": "476"
+                },
+                "Autres comptes transitoires (ACTIF)": {
+                    "Mali de fusion sur actif circulant": {
+                        "account_number": "4781"
+                    },
+                    "478-Diff\u00e9rences d'\u00e9valuation sur instruments de tr\u00e9sorerie (ACTIF)": {
+                        "account_number": "4786"
+                    }
+                }
+            },
+            "48-Comptes de r\u00e9gularisation (ACTIF)": {
+                "Charges \u00e0 r\u00e9partir sur plusieurs exercices": {
+                    "Frais d'\u00e9mission des emprunts": {
+                        "account_number": "4816"
+                    },
+                    "account_number": "481"
+                },
+                "Charges constat\u00e9es d'avance": {
+                    "account_number": "486"
+                },
+                "488-Comptes de r\u00e9partition p\u00e9riodique des charges et des produits (ACTIF)": {
+                    "Charges": {
+                        "account_number": "4886"
+                    }
+                }
+            },
+            "49-D\u00e9pr\u00e9ciation des comptes de tiers (ACTIF)": {
+                "D\u00e9pr\u00e9ciations des comptes clients": {
+                    "account_number": "491"
+                },
+                "D\u00e9pr\u00e9ciations des comptes du groupe et des associ\u00e9s": {
+                    "Comptes du groupe": {
+                        "account_number": "4951"
+                    },
+                    "Comptes courants des associ\u00e9s": {
+                        "account_number": "4955"
+                    },
+                    "Op\u00e9rations faites en commun et en GIE": {
+                        "account_number": "4958"
+                    },
+                    "account_number": "495"
+                },
+                "D\u00e9pr\u00e9ciations des comptes de d\u00e9biteurs divers": {
+                    "Cr\u00e9ances sur cessions d'immobilisations": {
+                        "account_number": "4962"
+                    },
+                    "Cr\u00e9ances sur cessions de valeurs mobili\u00e8res de placement": {
+                        "account_number": "4965"
+                    },
+                    "Autres comptes d\u00e9biteurs": {
+                        "account_number": "4967"
+                    },
+                    "account_number": "496"
+                }
+            }
+        },
+        "4-Comptes de Tiers (PASSIF)": {
+            "root_type": "Liability",
+            "40-Fournisseurs et Comptes Rattach\u00e9s (PASSIF)": {
+                "account_type": "Payable",
+                "Fournisseurs": {
+                    "account_type": "Payable",
+                    "Fournisseurs - Achats de biens ou de prestations de services": {
+                        "account_type": "Payable",
+                        "account_number": "4011"
+                    },
+                    "Fournisseurs - Retenues de garantie": {
+                        "account_type": "Payable",
+                        "account_number": "4017"
+                    },
+                    "account_number": "401"
+                },
+                "Fournisseurs - Effets \u00e0 payer": {
+                    "account_type": "Payable",
+                    "account_number": "403"
+                },
+                "Fournisseurs d'immobilisations": {
+                    "account_type": "Payable",
+                    "Fournisseurs - Achats d'immobilisations": {
+                        "account_type": "Payable",
+                        "account_number": "4041"
+                    },
+                    "Fournisseurs d'immobilisations - Retenues de garantie": {
+                        "account_type": "Payable",
+                        "account_number": "4047"
+                    },
+                    "account_number": "404"
+                },
+                "Fournisseurs d'immobilisations - Effets \u00e0 payer": {
+                    "account_type": "Payable",
+                    "account_number": "405"
+                },
+                "Fournisseurs - Factures non parvenues": {
+                    "account_type": "Stock Received But Not Billed",
+                    "Fournisseurs": {
+                        "account_type": "Stock Received But Not Billed",
+                        "account_number": "4081"
+                    },
+                    "Fournisseurs d'immobilisations": {
+                        "account_type": "Stock Received But Not Billed",
+                        "account_number": "4084"
+                    },
+                    "Fournisseurs - Int\u00e9r\u00eats courus": {
+                        "account_type": "Stock Received But Not Billed",
+                        "account_number": "4088"
+                    },
+                    "account_number": "408"
+                }
+            },
+            "41-Clients et comptes rattach\u00e9s (PASSIF)": {
+                "Clients cr\u00e9diteurs": {
+                    "Clients - Avances et acomptes re\u00e7us sur commandes": {
+                        "account_number": "4191"
+                    },
+                    "Clients - Dettes pour emballages et mat\u00e9riels consign\u00e9s": {
+                        "account_number": "4196"
+                    },
+                    "Clients - Autres avoirs": {
+                        "account_number": "4197"
+                    },
+                    "Rabais, remises, ristournes \u00e0 accorder et autres avoirs \u00e0 \u00e9tablir": {
+                        "account_number": "4198"
+                    },
+                    "account_number": "419"
+                }
+            },
+            "42-Personnel et comptes rattach\u00e9s (PASSIF)": {
+                "Personnel - R\u00e9mun\u00e9rations dues": {
+                    "account_number": "421"
+                },
+                "Comit\u00e9s d'entreprises, d'\u00e9tablissement...": {
+                    "account_number": "422"
+                },
+                "Participation des salari\u00e9s aux r\u00e9sultats": {
+                    "R\u00e9serve sp\u00e9ciale": {
+                        "account_number": "4246"
+                    },
+                    "Comptes courants": {
+                        "account_number": "4248"
+                    },
+                    "account_number": "424"
+                },
+                "Personnel - D\u00e9p\u00f4ts": {
+                    "account_number": "426"
+                },
+                "Personnel - Oppositions": {
+                    "account_number": "427"
+                },
+                "Personnel - Charges \u00e0 payer et produits \u00e0 recevoir": {
+                    "Dettes provisionn\u00e9es pour cong\u00e9s \u00e0 payer": {
+                        "account_number": "4282"
+                    },
+                    "Dettes provisionn\u00e9es pour participation des salari\u00e9s aux r\u00e9sultats": {
+                        "account_number": "4284"
+                    },
+                    "Autres charges \u00e0 payer": {
+                        "account_number": "4286"
+                    },
+                    "Produits \u00e0 recevoir": {
+                        "account_number": "4287"
+                    },
+                    "account_number": "428"
+                }
+            },
+            "43-S\u00e9curit\u00e9 sociale et autres organismes sociaux (PASSIF)": {
+                "438-Organismes sociaux - Charges \u00e0 payer": {
+                    "Charges sociales sur cong\u00e9s \u00e0 payer": {
+                        "account_number": "4382"
+                    },
+                    "Autres charges \u00e0 payer": {
+                        "account_number": "4386"
+                    }
+                }
+            },
+            "44-Etat et autres collectivit\u00e9s publiques (PASSIF)": {
+                "Etat - Imp\u00f4ts et taxes recouvrables sur des tiers": {
+                    "Obligataires": {
+                        "account_number": "4424"
+                    },
+                    "Associ\u00e9s": {
+                        "account_number": "4425"
+                    },
+                    "account_number": "442"
+                },
+                "Etat - Imp\u00f4ts sur les b\u00e9n\u00e9fices": {
+                    "account_number": "444"
+                },
+                "Etat - Taxes sur le chiffre d'affaires (PASSIF)": {
+                    "Taxes sur le chiffre d'affaires \u00e0 d\u00e9caisser": {
+                        "TVA \u00e0 d\u00e9caisser": {
+                            "account_number": "44551"
+                        },
+                        "Taxes assimil\u00e9es \u00e0 la TVA": {
+                            "account_number": "44558"
+                        },
+                        "account_number": "4455"
+                    },
+                    "Taxes sur le chiffre d'affaires collect\u00e9es par l'entreprise": {
+                        "TVA collect\u00e9e": {
+                            "account_type": "Tax",
+                            "is_group": 1,
+                            "account_number": "44571"
+                        },
+                        "Taxes assimil\u00e9es \u00e0 la TVA": {
+                            "account_number": "44578"
+                        },
+                        "account_number": "4457"
+                    },
+                    "4458-Taxes sur le chiffre d'affaires \u00e0 r\u00e9gulariser ou en attente (PASSIF)": {
+                        "TVA r\u00e9cup\u00e9r\u00e9e  d'avance": {
+                            "account_number": "44584"
+                        },
+                        "Taxes sur le chiffre d'affaires sur factures \u00e0 \u00e9tablir": {
+                            "account_number": "44587"
+                        }
+                    }
+                },
+                "Obligations cautionn\u00e9es": {
+                    "account_number": "446"
+                },
+                "Autres imp\u00f4ts, taxes et versements assimil\u00e9s": {
+                    "account_number": "447"
+                },
+                "Quotas d'\u00e9mission \u00e0 acqu\u00e9rir": {
+                    "account_number": "449"
+                }
+            },
+            "45-Groupe et associ\u00e9s (PASSIF)": {
+                "Groupe (PASSIF)": {
+                    "account_number": "451"
+                },
+                "Associ\u00e9s - Comptes courants (PASSIF)": {
+                    "Principal (PASSIF)": {
+                        "account_number": "4551"
+                    },
+                    "Int\u00e9r\u00eats courus (PASSIF)": {
+                        "account_number": "4558"
+                    },
+                    "account_number": "455"
+                },
+                "Associ\u00e9s - Op\u00e9rations sur le capital (PASSIF)": {
+                    "456-Associ\u00e9s - Comptes d'apport en soci\u00e9t\u00e9": {
+                        "Apports en nature": {
+                            "account_number": "45611"
+                        },
+                        "Apports en num\u00e9raire": {
+                            "account_number": "45615"
+                        },
+                        "account_number": "4561"
+                    },
+                    "Associ\u00e9s - Versements re\u00e7us sur augmentation de capital": {
+                        "account_number": "4563"
+                    },
+                    "Associ\u00e9s - Versements anticip\u00e9s": {
+                        "account_number": "4564"
+                    },
+                    "Actionnaires d\u00e9faillants": {
+                        "account_number": "4566"
+                    },
+                    "Associ\u00e9s - Capital \u00e0 rembourser": {
+                        "account_number": "4567"
+                    }
+                },
+                "Associ\u00e9s - Dividendes \u00e0 payer": {
+                    "account_number": "457"
+                },
+                "Associ\u00e9s - Op\u00e9rations faites en commun et en GIE": {
+                    "Op\u00e9rations courantes": {
+                        "account_number": "4581"
+                    },
+                    "Int\u00e9r\u00eats courus": {
+                        "account_number": "4588"
+                    },
+                    "account_number": "458"
+                }
+            },
+            "46-D\u00e9biteurs divers et cr\u00e9diteurs divers (PASSIF)": {
+                "Dettes sur acquisitions de valeurs mobili\u00e8res de placement": {
+                    "account_number": "464"
+                },
+                "467-Autres comptes d\u00e9biteurs ou cr\u00e9diteurs (PASSIF)": {},
+                "468-Divers - Charges \u00e0 payer et produits \u00e0 recevoir (PASSIF)": {
+                    "Charges \u00e0 payer": {
+                        "account_number": "4686"
+                    }
+                }
+            },
+            "47-Comptes transitoires ou d'attente (PASSIF)": {
+                "471-Comptes d'attente (PASSIF)": {
+                    "account_type": "Temporary"
+                },
+                "Diff\u00e9rences de conversion (PASSIF)": {
+                    "Augmentation des cr\u00e9ances": {
+                        "account_number": "4771"
+                    },
+                    "Diminution des dettes": {
+                        "account_number": "4772"
+                    },
+                    "Diff\u00e9rences compens\u00e9es par couverture de change": {
+                        "account_number": "4778"
+                    },
+                    "account_number": "477"
+                },
+                "478-Autres comptes transitoires (PASSIF)": {
+                    "Diff\u00e9rences d'\u00e9valuation sur instruments de tr\u00e9sorerie (PASSIF)": {
+                        "account_number": "4787"
+                    }
+                }
+            },
+            "48-Comptes de r\u00e9gularisation (PASSIF)": {
+                "Produits constat\u00e9s d'avance": {
+                    "account_number": "487"
+                },
+                "448-Comptes de r\u00e9partition p\u00e9riodique des charges et des produits (PASSIF)": {
+                    "Produits": {
+                        "account_number": "4887"
+                    }
+                }
+            }
+        },
+        "Comptes Financiers": {
+            "root_type": "Asset",
+            "Valeurs mobili\u00e8res de placement": {
+                "Parts dans des entreprises li\u00e9es": {
+                    "account_number": "501"
+                },
+                "Actions propres": {
+                    "Actions destin\u00e9es \u00e0 \u00eatre attribu\u00e9es aux employ\u00e9s et affect\u00e9es \u00e0 des plans d\u00e9termin\u00e9s": {
+                        "account_number": "5021"
+                    },
+                    "Actions disponibles pour \u00eatre attribu\u00e9es aux employ\u00e9s ou pour la r\u00e9gularisation des cours de bourse": {
+                        "account_number": "5022"
+                    },
+                    "account_number": "502"
+                },
+                "Actions": {
+                    "Titres cot\u00e9s": {
+                        "account_number": "5031"
+                    },
+                    "Titres non cot\u00e9s": {
+                        "account_number": "5035"
+                    },
+                    "account_number": "503"
+                },
+                "Autres titres conf\u00e9rant un droit de propri\u00e9t\u00e9": {
+                    "account_number": "504"
+                },
+                "Obligations et bons \u00e9mis par la soci\u00e9t\u00e9 et rachet\u00e9s par elle": {
+                    "account_number": "505"
+                },
+                "Obligations": {
+                    "Titres cot\u00e9s": {
+                        "account_number": "5061"
+                    },
+                    "Titres non cot\u00e9s": {
+                        "account_number": "5065"
+                    },
+                    "account_number": "506"
+                },
+                "Bons du Tr\u00e9sor et bons de caisse \u00e0 court terme": {
+                    "account_number": "507"
+                },
+                "Autres valeurs mobili\u00e8res de placement et autres cr\u00e9ances assimil\u00e9es": {
+                    "Autres valeurs mobili\u00e8res": {
+                        "account_number": "5081"
+                    },
+                    "Bons de souscription": {
+                        "account_number": "5082"
+                    },
+                    "Int\u00e9r\u00eats courus sur obligations, bons et valeurs assimil\u00e9es": {
+                        "account_number": "5088"
+                    },
+                    "account_number": "508"
+                },
+                "Versements restant \u00e0 effectuer sur valeurs mobili\u00e8res de placement non lib\u00e9r\u00e9es": {
+                    "account_number": "509"
+                },
+                "account_number": "50"
+            },
+            "Banques, \u00e9tablissements financiers et assimil\u00e9s": {
+                "Valeurs \u00e0 l'encaissement": {
+                    "Coupons \u00e9chus \u00e0 l'encaissement": {
+                        "account_number": "5111"
+                    },
+                    "Ch\u00e8ques \u00e0 encaisser": {
+                        "account_number": "5112"
+                    },
+                    "Effets \u00e0 l'encaissement": {
+                        "account_number": "5113"
+                    },
+                    "Effets \u00e0 l'escompte": {
+                        "account_number": "5114"
+                    },
+                    "account_number": "511"
+                },
+                "Banques": {
+                    "account_type": "Bank",
+                    "Comptes en monnaie nationale": {
+                        "account_type": "Bank",
+                        "account_number": "5121"
+                    },
+                    "Comptes en devises": {
+                        "account_type": "Bank",
+                        "account_number": "5124"
+                    },
+                    "account_number": "512"
+                },
+                "Ch\u00e8ques postaux": {
+                    "account_number": "514"
+                },
+                "\"Caisses\" du Tr\u00e9sor et des \u00e9tablissements publics": {
+                    "account_number": "515"
+                },
+                "Soci\u00e9t\u00e9s de bourse": {
+                    "account_number": "516"
+                },
+                "Autres organismes financiers": {
+                    "account_number": "517"
+                },
+                "Int\u00e9r\u00eats courus": {
+                    "Int\u00e9r\u00eats courus \u00e0 payer": {
+                        "account_number": "5181"
+                    },
+                    "Int\u00e9r\u00eats courus \u00e0 recevoir": {
+                        "account_number": "5188"
+                    },
+                    "account_number": "518"
+                },
+                "Concours bancaires courants": {
+                    "Cr\u00e9dit de mobilisation des cr\u00e9ances commerciales (CMCC)": {
+                        "account_number": "5191"
+                    },
+                    "Mobilisation de cr\u00e9ances n\u00e9es \u00e0 l'\u00e9tranger": {
+                        "account_number": "5193"
+                    },
+                    "Int\u00e9r\u00eats courus sur concours bancaires courants": {
+                        "account_number": "5198"
+                    },
+                    "account_number": "519"
+                },
+                "account_number": "51"
+            },
+            "Instruments de tr\u00e9sorerie": {
+                "is_group": 1,
+                "account_number": "52"
+            },
+            "Caisse": {
+                "account_type": "Cash",
+                "Caisse si\u00e8ge social": {
+                    "account_type": "Cash",
+                    "Caisse en monnaie nationale": {
+                        "account_type": "Cash",
+                        "account_number": "5311"
+                    },
+                    "Caisse en devises": {
+                        "account_type": "Cash",
+                        "account_number": "5314"
+                    },
+                    "account_number": "531"
+                },
+                "Caisse succursale (ou usine) A": {
+                    "account_type": "Cash",
+                    "account_number": "532"
+                },
+                "Caisse succursale (ou usine) B": {
+                    "account_type": "Cash",
+                    "account_number": "533"
+                },
+                "account_number": "53"
+            },
+            "R\u00e9gies d'avance et accr\u00e9ditifs": {
+                "is_group": 1,
+                "account_number": "54"
+            },
+            "Virements internes": {
+                "is_group": 1,
+                "account_number": "58"
+            },
+            "D\u00e9pr\u00e9ciations des comptes financiers": {
+                "D\u00e9pr\u00e9ciations des valeurs mobili\u00e8res de placement": {
+                    "Actions": {
+                        "account_number": "5903"
+                    },
+                    "Autres titres conf\u00e9rant un droit de propri\u00e9t\u00e9": {
+                        "account_number": "5904"
+                    },
+                    "Obligations": {
+                        "account_number": "5906"
+                    },
+                    "Autres valeurs mobili\u00e8res de placement et cr\u00e9ances assimil\u00e9es": {
+                        "account_number": "5908"
+                    },
+                    "account_number": "590"
+                },
+                "account_number": "59"
+            },
+            "account_number": "5"
+        },
+        "Comptes de Charges": {
+            "root_type": "Expense",
+            "Achats (sauf 603)": {
+                "Achats stock\u00e9s - Mati\u00e8res premi\u00e8res (et fournitures)": {
+                    "account_type": "Cost of Goods Sold",
+                    "Mati\u00e8res (ou groupe) A": {
+                        "account_type": "Cost of Goods Sold",
+                        "account_number": "6011"
+                    },
+                    "Mati\u00e8res (ou groupe) B": {
+                        "account_type": "Cost of Goods Sold",
+                        "account_number": "6012"
+                    },
+                    "Fournitures A, B, C...": {
+                        "account_type": "Cost of Goods Sold",
+                        "account_number": "6017"
+                    },
+                    "account_number": "601"
+                },
+                "Achats stock\u00e9s - Autres approvisionnements": {
+                    "account_type": "Cost of Goods Sold",
+                    "Mati\u00e8res consommables": {
+                        "account_type": "Cost of Goods Sold",
+                        "Mati\u00e8res (ou groupe) C": {
+                            "account_type": "Cost of Goods Sold",
+                            "account_number": "60211"
+                        },
+                        "Mati\u00e8res (ou groupe) D": {
+                            "account_type": "Cost of Goods Sold",
+                            "account_number": "60212"
+                        },
+                        "account_number": "6021"
+                    },
+                    "Fournitures consommables": {
+                        "account_type": "Cost of Goods Sold",
+                        "Combustibles": {
+                            "account_type": "Cost of Goods Sold",
+                            "account_number": "60221"
+                        },
+                        "Produits d'entretien": {
+                            "account_type": "Cost of Goods Sold",
+                            "account_number": "60222"
+                        },
+                        "Fournitures d'atelier et d'usine": {
+                            "account_type": "Cost of Goods Sold",
+                            "account_number": "60223"
+                        },
+                        "Fournitures de magasin": {
+                            "account_type": "Cost of Goods Sold",
+                            "account_number": "60224"
+                        },
+                        "Fournitures de bureau": {
+                            "account_type": "Cost of Goods Sold",
+                            "account_number": "60225"
+                        },
+                        "account_number": "6022"
+                    },
+                    "Emballages": {
+                        "account_type": "Cost of Goods Sold",
+                        "Emballages perdus": {
+                            "account_type": "Cost of Goods Sold",
+                            "account_number": "60261"
+                        },
+                        "Emballages r\u00e9cup\u00e9rables non identifiables": {
+                            "account_type": "Cost of Goods Sold",
+                            "account_number": "60265"
+                        },
+                        "Emballages \u00e0 usage mixte": {
+                            "account_type": "Cost of Goods Sold",
+                            "account_number": "60267"
+                        },
+                        "account_number": "6026"
+                    },
+                    "account_number": "602"
+                },
+                "Variations des stocks (approvisionnements et marchandises)": {
+                    "account_type": "Stock Adjustment",
+                    "Variation des stocks de mati\u00e8res premi\u00e8res (et fournitures)": {
+                        "account_type": "Stock Adjustment",
+                        "account_number": "6031"
+                    },
+                    "Variation des stocks des autres approvisionnements": {
+                        "account_type": "Stock Adjustment",
+                        "account_number": "6032"
+                    },
+                    "Variation des stocks de marchandises": {
+                        "account_type": "Stock Adjustment",
+                        "account_number": "6037"
+                    },
+                    "account_number": "603"
+                },
+                "Achats d'\u00e9tudes et prestations de service": {
+                    "account_type": "Cost of Goods Sold",
+                    "account_number": "604"
+                },
+                "Achats de mat\u00e9riel, \u00e9quipements et travaux": {
+                    "account_type": "Cost of Goods Sold",
+                    "account_number": "605"
+                },
+                "Achats non stock\u00e9s de mati\u00e8res et founitures": {
+                    "account_type": "Cost of Goods Sold",
+                    "Fournitures non stockables (eau, \u00e9nergie...)": {
+                        "account_type": "Cost of Goods Sold",
+                        "account_number": "6061"
+                    },
+                    "Fournitures d'entretien et de petit \u00e9quipement": {
+                        "account_type": "Cost of Goods Sold",
+                        "account_number": "6063"
+                    },
+                    "Fournitures administratives": {
+                        "account_type": "Cost of Goods Sold",
+                        "account_number": "6064"
+                    },
+                    "Autres mati\u00e8res et fournitures": {
+                        "account_type": "Cost of Goods Sold",
+                        "account_number": "6068"
+                    },
+                    "account_number": "606"
+                },
+                "Achats de marchandises": {
+                    "account_type": "Cost of Goods Sold",
+                    "Marchandises (ou groupe) A": {
+                        "account_type": "Cost of Goods Sold",
+                        "account_number": "6071"
+                    },
+                    "Marchandises (ou groupe) B": {
+                        "account_type": "Cost of Goods Sold",
+                        "account_number": "6072"
+                    },
+                    "account_number": "607"
+                },
+                "(Compte r\u00e9serv\u00e9, le cas \u00e9ch\u00e9ant, \u00e0 la recapitulation des Frais accessoires incorpor\u00e9s aux achats)": {
+                    "account_type": "Expenses Included In Valuation",
+                    "account_number": "608"
+                },
+                "Rabais, remises et ristournes obtenus sur achats": {
+                    "Rabais, remises et ristournes obtenus sur achats - de mati\u00e8res premi\u00e8res (et fournitures)": {
+                        "account_number": "6091"
+                    },
+                    "Rabais, remises et ristournes obtenus sur achats - d'autres approvisionnements stock\u00e9s": {
+                        "account_number": "6092"
+                    },
+                    "Rabais, remises et ristournes obtenus sur achats - d'\u00e9tudes et prestations de services": {
+                        "account_number": "6094"
+                    },
+                    "Rabais, remises et ristournes obtenus sur achats - de mat\u00e9riel, \u00e9quipements et travaux": {
+                        "account_number": "6095"
+                    },
+                    "Rabais, remises et ristournes obtenus sur achats - d'approvisionnements non stock\u00e9s": {
+                        "account_number": "6096"
+                    },
+                    "Rabais, remises et ristournes obtenus sur achats - de marchandises": {
+                        "account_number": "6097"
+                    },
+                    "Rabais, remises et ristournes non affect\u00e9s": {
+                        "account_number": "6098"
+                    },
+                    "account_number": "609"
+                },
+                "account_number": "60"
+            },
+            "Services ext\u00e9rieurs": {
+                "Sous-traitance g\u00e9n\u00e9rale": {
+                    "account_number": "611"
+                },
+                "Redevances de cr\u00e9dit-bail": {
+                    "Cr\u00e9dit-bail mobilier": {
+                        "account_number": "6122"
+                    },
+                    "Cr\u00e9dit-bail immobilier": {
+                        "account_number": "6125"
+                    },
+                    "account_number": "612"
+                },
+                "Locations": {
+                    "Locations immobili\u00e8res": {
+                        "account_number": "6132"
+                    },
+                    "Locations mobili\u00e8res": {
+                        "account_number": "6135"
+                    },
+                    "Malis sur emballages": {
+                        "account_number": "6136"
+                    },
+                    "account_number": "613"
+                },
+                "Charges locatives et de copropri\u00e9t\u00e9": {
+                    "account_number": "614"
+                },
+                "Entretiens et r\u00e9parations": {
+                    "Entretiens et r\u00e9parations - sur biens immobiliers": {
+                        "account_number": "6152"
+                    },
+                    "Entretiens et r\u00e9parations - sur biens mobiliers": {
+                        "account_number": "6155"
+                    },
+                    "Maintenance": {
+                        "account_number": "6156"
+                    },
+                    "account_number": "615"
+                },
+                "Primes d'assurance": {
+                    "Multirisques": {
+                        "account_number": "6161"
+                    },
+                    "Assurance obligatoire dommage construction": {
+                        "account_number": "6162"
+                    },
+                    "Assurance-transport": {
+                        "Assurance-transport - sur achats": {
+                            "account_number": "61636"
+                        },
+                        "Assurance-transport - sur ventes": {
+                            "account_number": "61637"
+                        },
+                        "Assurance-transport - sur autres biens": {
+                            "account_number": "61638"
+                        },
+                        "account_number": "6163"
+                    },
+                    "Risques d'exploitation": {
+                        "account_number": "6164"
+                    },
+                    "Insolvabilit\u00e9 clients": {
+                        "account_number": "6165"
+                    },
+                    "account_number": "616"
+                },
+                "Etudes et recherches": {
+                    "account_number": "617"
+                },
+                "Divers": {
+                    "Documentation g\u00e9n\u00e9rale": {
+                        "account_number": "6181"
+                    },
+                    "Documentation technique": {
+                        "account_number": "6183"
+                    },
+                    "Frais de colloques, s\u00e9minaires, conf\u00e9rences": {
+                        "account_number": "6185"
+                    },
+                    "account_number": "618"
+                },
+                "Rabais, remises et ristournes obtenus sur services ext\u00e9rieurs": {
+                    "account_number": "619"
+                },
+                "account_number": "61"
+            },
+            "Autres services ext\u00e9rieurs": {
+                "Personnel ext\u00e9rieur \u00e0 l'entreprise": {
+                    "Personnel int\u00e9rimaire": {
+                        "account_number": "6211"
+                    },
+                    "Personnel d\u00e9tach\u00e9 ou pr\u00eat\u00e9 \u00e0 l'entreprise": {
+                        "account_number": "6214"
+                    },
+                    "account_number": "621"
+                },
+                "R\u00e9mun\u00e9rations d'interm\u00e9diaires et honoraires": {
+                    "Commissions et courtages sur achats": {
+                        "account_number": "6221"
+                    },
+                    "Commissions et courtages sur ventes": {
+                        "account_number": "6222"
+                    },
+                    "R\u00e9mun\u00e9rations des transitaires": {
+                        "account_number": "6224"
+                    },
+                    "R\u00e9mun\u00e9rations d'affacturage": {
+                        "account_number": "6225"
+                    },
+                    "Honoraires": {
+                        "account_number": "6226"
+                    },
+                    "Frais d'actes et de contentieux": {
+                        "account_number": "6227"
+                    },
+                    "Divers": {
+                        "account_number": "6228"
+                    },
+                    "account_number": "622"
+                },
+                "Publicit\u00e9, publications, relations publiques": {
+                    "Annonces et insertions": {
+                        "account_number": "6231"
+                    },
+                    "Echantillons": {
+                        "account_number": "6232"
+                    },
+                    "Foires et expositions": {
+                        "account_number": "6233"
+                    },
+                    "Cadeaux \u00e0 la client\u00e8le": {
+                        "account_number": "6234"
+                    },
+                    "Primes": {
+                        "account_number": "6235"
+                    },
+                    "Catalogues et imprim\u00e9s": {
+                        "account_number": "6236"
+                    },
+                    "Publications": {
+                        "account_number": "6237"
+                    },
+                    "Divers (pourboires, dons courants...)": {
+                        "account_number": "6238"
+                    },
+                    "account_number": "623"
+                },
+                "Transports de biens et transports collectifs du personnel": {
+                    "Transports sur achats": {
+                        "account_number": "6241"
+                    },
+                    "Transports sur ventes": {
+                        "account_type": "Chargeable",
+                        "account_number": "6242"
+                    },
+                    "Transports entre \u00e9tablissements ou chantiers": {
+                        "account_number": "6243"
+                    },
+                    "Transports administratifs": {
+                        "account_number": "6244"
+                    },
+                    "Transports collectifs du personnel": {
+                        "account_number": "6247"
+                    },
+                    "Divers": {
+                        "account_number": "6248"
+                    },
+                    "account_number": "624"
+                },
+                "D\u00e9placements, missions et r\u00e9ceptions": {
+                    "Voyages et d\u00e9placements": {
+                        "account_number": "6251"
+                    },
+                    "Frais de d\u00e9m\u00e9nagement": {
+                        "account_number": "6255"
+                    },
+                    "Missions": {
+                        "account_number": "6256"
+                    },
+                    "R\u00e9ceptions": {
+                        "account_number": "6257"
+                    },
+                    "account_number": "625"
+                },
+                "Frais postaux et de t\u00e9l\u00e9communications": {
+                    "account_number": "626"
+                },
+                "Services bancaires et assimil\u00e9s": {
+                    "Frais sur titres (achat, vente, garde)": {
+                        "account_number": "6271"
+                    },
+                    "Commissions et frais sur \u00e9mission d'emprunts": {
+                        "account_number": "6272"
+                    },
+                    "Frais sur effets": {
+                        "account_number": "6275"
+                    },
+                    "Location de coffres": {
+                        "account_number": "6276"
+                    },
+                    "Autres frais et commissions sur prestations de services": {
+                        "account_number": "6278"
+                    },
+                    "account_number": "627"
+                },
+                "Divers": {
+                    "Concours divers (cotisations...)": {
+                        "account_number": "6281"
+                    },
+                    "Frais de recrutement de personnel": {
+                        "account_number": "6284"
+                    },
+                    "account_number": "628"
+                },
+                "Rabais, remises et ristournes obtenus sur autres services ext\u00e9rieurs": {
+                    "account_number": "629"
+                },
+                "account_number": "62"
+            },
+            "Imp\u00f4ts, taxes et versements assimil\u00e9s": {
+                "Imp\u00f4ts, taxes et versements assimil\u00e9s sur r\u00e9mun\u00e9rations (administrations des imp\u00f4ts)": {
+                    "Taxes sur les salaires": {
+                        "account_number": "6311"
+                    },
+                    "Taxe d'apprentissage": {
+                        "account_number": "6312"
+                    },
+                    "Participation des employeurs \u00e0 la formation professionnelle continue": {
+                        "account_number": "6313"
+                    },
+                    "Cotisation pour d\u00e9faut d'investissement obligatoire dans la construction": {
+                        "account_number": "6314"
+                    },
+                    "Autres": {
+                        "account_number": "6318"
+                    },
+                    "account_number": "631"
+                },
+                "Imp\u00f4ts, taxes et versements assimil\u00e9s sur r\u00e9mun\u00e9rations (autres organismes)": {
+                    "Versement de transport": {
+                        "account_number": "6331"
+                    },
+                    "Allocations logement": {
+                        "account_number": "6332"
+                    },
+                    "Participation des employeurs \u00e0 la formation professionnelle continue": {
+                        "account_number": "6333"
+                    },
+                    "Participation des employeurs \u00e0 l'effort de construction": {
+                        "account_number": "6334"
+                    },
+                    "Versements lib\u00e9ratoires ouvrant droit \u00e0 l'\u00e9xon\u00e9ration de la taxe d'apprentissage": {
+                        "account_number": "6335"
+                    },
+                    "Autres": {
+                        "account_number": "6338"
+                    },
+                    "account_number": "633"
+                },
+                "Autres imp\u00f4ts, taxes et versements assimil\u00e9s (administrations des imp\u00f4ts)": {
+                    "Imp\u00f4ts directs (sauf imp\u00f4ts sur les b\u00e9n\u00e9fices)": {
+                        "Contribution \u00e9conomique territoriale": {
+                            "account_number": "63511"
+                        },
+                        "Taxes fonci\u00e8res": {
+                            "account_number": "63512"
+                        },
+                        "Autres imp\u00f4ts locaux": {
+                            "account_number": "63513"
+                        },
+                        "Taxe sur les v\u00e9hicules des soci\u00e9t\u00e9s": {
+                            "account_number": "63514"
+                        },
+                        "account_number": "6351"
+                    },
+                    "Taxes sur le chiffre d'affaires non r\u00e9cup\u00e9rables": {
+                        "account_number": "6352"
+                    },
+                    "Imp\u00f4ts indirects": {
+                        "account_number": "6353"
+                    },
+                    "Droits d'enregistrement et de timbre": {
+                        "Droits de mutation": {
+                            "account_number": "63541"
+                        },
+                        "account_number": "6354"
+                    },
+                    "Autres droits": {
+                        "account_number": "6358"
+                    },
+                    "account_number": "635"
+                },
+                "Autres imp\u00f4ts, taxes et versements assimil\u00e9s (autres organismes)": {
+                    "Contribution sociale de solidarit\u00e9 \u00e0 la charge des soci\u00e9t\u00e9s": {
+                        "account_number": "6371"
+                    },
+                    "Taxes per\u00e7ues par les organismes publics internationaux": {
+                        "account_number": "6372"
+                    },
+                    "Imp\u00f4ts et taxes exigibles \u00e0 l'\u00e9tranger": {
+                        "account_number": "6374"
+                    },
+                    "Taxes diverses": {
+                        "account_number": "6378"
+                    },
+                    "account_number": "637"
+                },
+                "account_number": "63"
+            },
+            "Charges de personnel": {
+                "R\u00e9mun\u00e9rations du personnel": {
+                    "Salaires, appointements": {
+                        "account_number": "6411"
+                    },
+                    "Cong\u00e9s pay\u00e9s": {
+                        "account_number": "6412"
+                    },
+                    "Primes et gratifications": {
+                        "account_number": "6413"
+                    },
+                    "Indemnit\u00e9s et avantages divers": {
+                        "account_number": "6414"
+                    },
+                    "Suppl\u00e9ment familial": {
+                        "account_number": "6415"
+                    },
+                    "account_number": "641"
+                },
+                "R\u00e9mun\u00e9ration du travail de l'exploitant": {
+                    "account_number": "644"
+                },
+                "Charges de s\u00e9curit\u00e9 sociale et de pr\u00e9voyance": {
+                    "Cotisations \u00e0 l'URSSAF": {
+                        "account_number": "6451"
+                    },
+                    "Cotisations aux mutuelles": {
+                        "account_number": "6452"
+                    },
+                    "Cotisations aux caisses de retraites": {
+                        "account_number": "6453"
+                    },
+                    "Cotisations aux ASSEDIC": {
+                        "account_number": "6454"
+                    },
+                    "account_number": "645"
+                },
+                "Cotisations sociales personnelles de l'exploitant": {
+                    "account_number": "646"
+                },
+                "Autres charges sociales": {
+                    "is_group": 1,
+                    "account_number": "647"
+                },
+                "Autres charges de personnel": {
+                    "account_number": "648"
+                },
+                "account_number": "64"
+            },
+            "Autres charges de gestion courante": {
+                "Redevances pour concessions, brevets, licences, marques, proc\u00e9d\u00e9s, logiciels, droits et valeurs similaires": {
+                    "Redevances pour concessions, brevets, licences, marques, proc\u00e9d\u00e9s, logiciels": {
+                        "account_number": "6511"
+                    },
+                    "Droits d'auteur et de reproduction": {
+                        "account_number": "6516"
+                    },
+                    "Autres droits et valeurs similaires": {
+                        "account_number": "6518"
+                    },
+                    "account_number": "651"
+                },
+                "Jetons de pr\u00e9sence": {
+                    "account_number": "653"
+                },
+                "Pertes sur cr\u00e9ances irr\u00e9couvrables": {
+                    "Cr\u00e9ances de l'exercice": {
+                        "account_number": "6541"
+                    },
+                    "Cr\u00e9ances des exercices ant\u00e9rieurs": {
+                        "account_number": "6544"
+                    },
+                    "account_number": "654"
+                },
+                "Quotes-parts de r\u00e9sultat sur op\u00e9rations faites en commun": {
+                    "Quote-part de b\u00e9n\u00e9fice transf\u00e9r\u00e9e (comptabilit\u00e9 du g\u00e9rant)": {
+                        "account_number": "6551"
+                    },
+                    "Quote-part de perte support\u00e9e (comptabilit\u00e9 des associ\u00e9s non g\u00e9rants)": {
+                        "account_number": "6555"
+                    },
+                    "account_number": "655"
+                },
+                "Pertes de change sur cr\u00e9ances et dettes commerciales": {
+                    "account_number": "656"
+                },
+                "Charges diverses de gestion courante": {
+                    "account_number": "658"
+                },
+                "account_number": "65"
+            },
+            "Charges financi\u00e8res": {
+                "Charges d'int\u00e9r\u00eats": {
+                    "Int\u00e9r\u00eats des emprunts et dettes": {
+                        "Int\u00e9r\u00eats des emprunts et dettes - des emprunts et dettes assimil\u00e9es": {
+                            "account_number": "66116"
+                        },
+                        "Int\u00e9r\u00eats des emprunts et dettes - des dettes rattach\u00e9es \u00e0 des participations": {
+                            "account_number": "66117"
+                        },
+                        "account_number": "6611"
+                    },
+                    "Charges de la fiducie, r\u00e9sultat de la p\u00e9riode": {
+                        "account_number": "6612"
+                    },
+                    "Int\u00e9r\u00eats des comptes courants et des d\u00e9p\u00f4ts cr\u00e9diteurs": {
+                        "account_number": "6615"
+                    },
+                    "Int\u00e9r\u00eats bancaires et sur op\u00e9rations de financement (escompte...)": {
+                        "account_number": "6616"
+                    },
+                    "Int\u00e9r\u00eats des obligations cautionn\u00e9es": {
+                        "account_number": "6617"
+                    },
+                    "Int\u00e9r\u00eats des autres dettes": {
+                        "Int\u00e9r\u00eats des autres dettes - des dettes commerciales": {
+                            "account_number": "66181"
+                        },
+                        "Int\u00e9r\u00eats des autres dettes - des dettes diverses": {
+                            "account_number": "66188"
+                        },
+                        "account_number": "6618"
+                    },
+                    "account_number": "661"
+                },
+                "Pertes sur cr\u00e9ances li\u00e9es \u00e0 des participations": {
+                    "account_number": "664"
+                },
+                "Escomptes accord\u00e9s": {
+                    "account_number": "665"
+                },
+                "Pertes de change financi\u00e8res": {
+                    "account_type": "Round Off",
+                    "account_number": "666"
+                },
+                "Charges nettes sur cessions de valeurs mobili\u00e8res de placement": {
+                    "account_number": "667"
+                },
+                "Autres charges financi\u00e8res": {
+                    "account_number": "668"
+                },
+                "account_number": "66"
+            },
+            "Charges exceptionnelles": {
+                "Charges exceptionnelles sur op\u00e9rations de gestion": {
+                    "P\u00e9nalit\u00e9s sur march\u00e9s (et d\u00e9dits pay\u00e9s sur achats et ventes)": {
+                        "account_number": "6711"
+                    },
+                    "P\u00e9nalit\u00e9s, amendes fiscales et p\u00e9nales": {
+                        "account_number": "6712"
+                    },
+                    "Dons, lib\u00e9ralit\u00e9s": {
+                        "account_number": "6713"
+                    },
+                    "Cr\u00e9ances devenues irr\u00e9couvrables dans l'exercice": {
+                        "account_number": "6714"
+                    },
+                    "Subventions accord\u00e9es": {
+                        "account_number": "6715"
+                    },
+                    "Rappel d'imp\u00f4ts (autres qu'imp\u00f4ts sur les b\u00e9n\u00e9fices)": {
+                        "account_number": "6717"
+                    },
+                    "Autres charges exceptionnelles sur op\u00e9rations de gestion": {
+                        "account_number": "6718"
+                    },
+                    "account_number": "671"
+                },
+                "(Compte \u00e0 la disposition des entit\u00e9s pour enregistrer, en cours d'exercice, les charges sur exercices ant\u00e9rieurs)": {
+                    "account_number": "672"
+                },
+                "Op\u00e9rations de constitution ou liquidation des fiducies": {
+                    "Op\u00e9rations li\u00e9es \u00e0 la constitution de la fiducie - transfert des \u00e9l\u00e9ments": {
+                        "account_number": "6741"
+                    },
+                    "Op\u00e9rations li\u00e9es \u00e0 la liquidation de la fiducie": {
+                        "account_number": "6742"
+                    },
+                    "account_number": "674"
+                },
+                "Valeurs comptables des \u00e9l\u00e9ments d'actif c\u00e9d\u00e9s": {
+                    "Immobilisations incorporelles": {
+                        "account_number": "6751"
+                    },
+                    "Immobilisations corporelles": {
+                        "account_number": "6752"
+                    },
+                    "Immobilisations financi\u00e8res": {
+                        "account_number": "6756"
+                    },
+                    "Autres \u00e9l\u00e9ments d'actif": {
+                        "account_number": "6758"
+                    },
+                    "account_number": "675"
+                },
+                "Autres charges exceptionnelles": {
+                    "Mali provenant de clauses d'indexation": {
+                        "account_number": "6781"
+                    },
+                    "Lots": {
+                        "account_number": "6782"
+                    },
+                    "Malis provenant du rachat par l'entreprise d'actions et obligations \u00e9mises par elles-m\u00eame": {
+                        "account_number": "6783"
+                    },
+                    "Charges exceptionnelles diverses": {
+                        "account_number": "6788"
+                    },
+                    "account_number": "678"
+                },
+                "account_number": "67"
+            },
+            "Dotations aux amortissements, d\u00e9pr\u00e9ciations et provisions": {
+                "account_type": "Depreciation",
+                "Dotations aux amortissements, d\u00e9pr\u00e9ciations et provisions - Charges d'exploitation": {
+                    "account_type": "Depreciation",
+                    "Dotations aux amortissements sur immobilisations incorporelles et corporelles": {
+                        "account_type": "Depreciation",
+                        "Immobilisations incorporelles": {
+                            "account_type": "Depreciation",
+                            "account_number": "68111"
+                        },
+                        "Immobilisations corporelles": {
+                            "account_type": "Depreciation",
+                            "account_number": "68112"
+                        },
+                        "account_number": "6811"
+                    },
+                    "Dotations aux amortissements des charges d'exploitation \u00e0 r\u00e9partir": {
+                        "account_type": "Depreciation",
+                        "account_number": "6812"
+                    },
+                    "Dotations aux provisions d'exploitation": {
+                        "account_type": "Depreciation",
+                        "account_number": "6815"
+                    },
+                    "Dotations aux d\u00e9pr\u00e9ciations des immobilisations incorporelles et corporelles": {
+                        "account_type": "Depreciation",
+                        "Immobilisations incorporelles": {
+                            "account_type": "Depreciation",
+                            "account_number": "68161"
+                        },
+                        "Immobilisations corporelles": {
+                            "account_type": "Depreciation",
+                            "account_number": "68162"
+                        },
+                        "account_number": "6816"
+                    },
+                    "Dotations pour d\u00e9pr\u00e9ciations des actifs circulants": {
+                        "account_type": "Depreciation",
+                        "Stocks et en-cours": {
+                            "account_type": "Depreciation",
+                            "account_number": "68173"
+                        },
+                        "Cr\u00e9ances": {
+                            "account_type": "Depreciation",
+                            "account_number": "68174"
+                        },
+                        "account_number": "6817"
+                    },
+                    "account_number": "681"
+                },
+                "Dotations aux amortissements, d\u00e9pr\u00e9ciations et provisions - Charges financi\u00e8res": {
+                    "account_type": "Depreciation",
+                    "Dotations aux amortissements des primes de remboursement des obligations": {
+                        "account_type": "Depreciation",
+                        "account_number": "6861"
+                    },
+                    "Dotations aux provisions financi\u00e8res": {
+                        "account_type": "Depreciation",
+                        "account_number": "6865"
+                    },
+                    "Dotations aux d\u00e9pr\u00e9ciations des \u00e9l\u00e9ments financiers": {
+                        "account_type": "Depreciation",
+                        "Immobilisations financi\u00e8res": {
+                            "account_type": "Depreciation",
+                            "account_number": "68662"
+                        },
+                        "Valeurs mobili\u00e8res de placement": {
+                            "account_type": "Depreciation",
+                            "account_number": "68665"
+                        },
+                        "account_number": "6866"
+                    },
+                    "Autres dotations": {
+                        "account_type": "Depreciation",
+                        "account_number": "6868"
+                    },
+                    "account_number": "686"
+                },
+                "Dotations aux amortissements, d\u00e9pr\u00e9ciations et provisions - Charges exceptionnelles": {
+                    "account_type": "Depreciation",
+                    "Dotations aux amortissements exceptionnels des immobilisations": {
+                        "account_type": "Depreciation",
+                        "account_number": "6871"
+                    },
+                    "Dotations aux provisions r\u00e9glement\u00e9es (immobilisations)": {
+                        "account_type": "Depreciation",
+                        "Amortissements d\u00e9rogatoires": {
+                            "account_type": "Depreciation",
+                            "account_number": "68725"
+                        },
+                        "account_number": "6872"
+                    },
+                    "Dotations aux provisions r\u00e9glement\u00e9es (stocks)": {
+                        "account_type": "Depreciation",
+                        "account_number": "6873"
+                    },
+                    "Dotations aux autres provisions r\u00e9glement\u00e9es": {
+                        "account_type": "Depreciation",
+                        "account_number": "6874"
+                    },
+                    "Dotations aux provisions exceptionnelles": {
+                        "account_type": "Depreciation",
+                        "account_number": "6875"
+                    },
+                    "Dotations aux d\u00e9pr\u00e9ciations exceptionnelles": {
+                        "account_type": "Depreciation",
+                        "account_number": "6876"
+                    },
+                    "account_number": "687"
+                },
+                "account_number": "68"
+            },
+            "Participation des salari\u00e9s, imp\u00f4ts sur les b\u00e9n\u00e9fices et assimil\u00e9s": {
+                "Participation des salari\u00e9s aux r\u00e9sultats": {
+                    "account_number": "691"
+                },
+                "Imp\u00f4ts sur les b\u00e9n\u00e9fices": {
+                    "Imp\u00f4ts dus en France": {
+                        "account_number": "6951"
+                    },
+                    "Contribution additionnelle \u00e0 l'imp\u00f4t sur les b\u00e9n\u00e9fices": {
+                        "account_number": "6952"
+                    },
+                    "Imp\u00f4ts dus \u00e0 l'\u00e9tranger": {
+                        "account_number": "6954"
+                    },
+                    "account_number": "695"
+                },
+                "Suppl\u00e9ments d'imp\u00f4ts sur les soci\u00e9t\u00e9s, li\u00e9s aux distributions": {
+                    "account_number": "696"
+                },
+                "Int\u00e9gration fiscale": {
+                    "Int\u00e9gration fiscale - Charges": {
+                        "account_number": "6981"
+                    },
+                    "Int\u00e9gration fiscale - Produits": {
+                        "account_number": "6989"
+                    },
+                    "account_number": "698"
+                },
+                "Produits - Report en arri\u00e8re des d\u00e9ficits": {
+                    "account_number": "699"
+                },
+                "account_number": "69"
+            },
+            "account_number": "6"
+        },
+        "Comptes de Produits": {
+            "root_type": "Income",
+            "Ventes de produits fabriqu\u00e9s, prestations de services, marchandises": {
+                "Ventes de produits finis": {
+                    "Produits finis (ou groupe) A": {
+                        "account_number": "7011"
+                    },
+                    "Produits (ou groupe) B": {
+                        "account_number": "7012"
+                    },
+                    "account_number": "701"
+                },
+                "Ventes de produits interm\u00e9diaires": {
+                    "account_number": "702"
+                },
+                "Ventes de produits r\u00e9siduels": {
+                    "account_number": "703"
+                },
+                "Travaux": {
+                    "Travaux de cat\u00e9gorie (ou activit\u00e9) A": {
+                        "account_number": "7041"
+                    },
+                    "Travaux de cat\u00e9gorie (ou activit\u00e9) B": {
+                        "account_number": "7042"
+                    },
+                    "account_number": "704"
+                },
+                "Etudes": {
+                    "account_number": "705"
+                },
+                "Prestations de services": {
+                    "account_number": "706"
+                },
+                "Ventes de marchandises": {
+                    "Marchandises (ou groupe) A": {
+                        "account_number": "7071"
+                    },
+                    "Marchandises (ou groupe) B": {
+                        "account_number": "7072"
+                    },
+                    "account_number": "707"
+                },
+                "Produits des activit\u00e9s annexes": {
+                    "Produits des services exploit\u00e9s dans l'int\u00e9r\u00eat du personnel": {
+                        "account_number": "7081"
+                    },
+                    "Commissions et courtages": {
+                        "account_number": "7082"
+                    },
+                    "Locations diverses": {
+                        "account_number": "7083"
+                    },
+                    "Mise \u00e0 disposition de personnel factur\u00e9e": {
+                        "account_number": "7084"
+                    },
+                    "Ports et frais accessoires factur\u00e9s": {
+                        "account_number": "7085"
+                    },
+                    "Bonis sur reprises d'emballages consign\u00e9s": {
+                        "account_number": "7086"
+                    },
+                    "Bonifications obtenues des clients et primes sur ventes": {
+                        "account_number": "7087"
+                    },
+                    "Autres produits d'activit\u00e9s annexes (cessions d'approvisionnements...)": {
+                        "account_number": "7088"
+                    },
+                    "account_number": "708"
+                },
+                "Rabais, remises et ristournes accord\u00e9s par l'entreprise": {
+                    "Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur ventes de produits finis": {
+                        "account_number": "7091"
+                    },
+                    "Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur ventes de produits interm\u00e9diaires": {
+                        "account_number": "7092"
+                    },
+                    "Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur travaux": {
+                        "account_number": "7094"
+                    },
+                    "Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur \u00e9tudes": {
+                        "account_number": "7095"
+                    },
+                    "Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur prestations de services": {
+                        "account_number": "7096"
+                    },
+                    "Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur ventes de marchandises": {
+                        "account_number": "7097"
+                    },
+                    "Rabais, remises et ristournes accord\u00e9s par l'entreprise - sur produits des activit\u00e9s annexes": {
+                        "account_number": "7098"
+                    },
+                    "account_number": "709"
+                },
+                "account_number": "70"
+            },
+            "Production stock\u00e9e (ou d\u00e9stockage)": {
+                "Variation des stocks (en-cours de production, produits)": {
+                    "Variation des en-cours de production de biens": {
+                        "Produits en cours": {
+                            "account_number": "71331"
+                        },
+                        "Travaux en cours": {
+                            "account_number": "71335"
+                        },
+                        "account_number": "7133"
+                    },
+                    "Variation des en-cours de production de services": {
+                        "Etudes en cours": {
+                            "account_number": "71341"
+                        },
+                        "Prestations de services en cours": {
+                            "account_number": "71345"
+                        },
+                        "account_number": "7134"
+                    },
+                    "Variation des stocks de produits": {
+                        "Produits interm\u00e9diaires": {
+                            "account_number": "71351"
+                        },
+                        "Produits finis": {
+                            "account_number": "71355"
+                        },
+                        "Produits r\u00e9siduels": {
+                            "account_number": "71358"
+                        },
+                        "account_number": "7135"
+                    },
+                    "account_number": "713"
+                },
+                "account_number": "71"
+            },
+            "Production immobilis\u00e9e": {
+                "Immobilisations incorporelles": {
+                    "account_number": "721"
+                },
+                "Immobilisations corporelles": {
+                    "account_number": "722"
+                },
+                "account_number": "72"
+            },
+            "Subventions d'exploitation": {
+                "is_group": 1,
+                "account_number": "74"
+            },
+            "Autres produits de gestion courante": {
+                "Redevances pour concessions, brevets, licences, marques, proc\u00e9d\u00e9s, logiciels, droits et valeurs similaires": {
+                    "Redevances pour concessions, brevets, licences, marques, proc\u00e9d\u00e9s, logiciels": {
+                        "account_number": "7511"
+                    },
+                    "Droits d'auteur et de reproduction": {
+                        "account_number": "7516"
+                    },
+                    "Autres droits et valeurs similaires": {
+                        "account_number": "7518"
+                    },
+                    "account_number": "751"
+                },
+                "Revenus des immeubles non affect\u00e9s aux activit\u00e9s professionnelles": {
+                    "account_number": "752"
+                },
+                "Jetons de pr\u00e9sence et r\u00e9mun\u00e9rations d'administrateurs, g\u00e9rants...": {
+                    "account_number": "753"
+                },
+                "Ristournes per\u00e7ues des coop\u00e9ratives (provenant des exc\u00e9dents)": {
+                    "account_number": "754"
+                },
+                "Quotes-parts de r\u00e9sultats sur op\u00e9rations faites en commun": {
+                    "Quote-part de perte transf\u00e9r\u00e9e (comptabilit\u00e9 du g\u00e9rant)": {
+                        "account_number": "7551"
+                    },
+                    "Quote-part de b\u00e9n\u00e9fice attribu\u00e9 (comptabilit\u00e9 des associ\u00e9s non g\u00e9rants)": {
+                        "account_number": "7555"
+                    },
+                    "account_number": "755"
+                },
+                "Gains de change sur cr\u00e9ances et dettes commerciales": {
+                    "account_number": "756"
+                },
+                "Produits divers de gestion courante": {
+                    "account_number": "758"
+                },
+                "account_number": "75"
+            },
+            "Produits financiers": {
+                "Produits de participations": {
+                    "Revenus des titres de participation": {
+                        "account_number": "7611"
+                    },
+                    "Produits de la fiducie, r\u00e9sultat de la p\u00e9riode": {
+                        "account_number": "7612"
+                    },
+                    "Revenus sur autres formes de participation": {
+                        "account_number": "7616"
+                    },
+                    "Revenus des cr\u00e9ances rattach\u00e9es \u00e0 des participations": {
+                        "account_number": "7617"
+                    },
+                    "account_number": "761"
+                },
+                "Produits des autres immobilisations financi\u00e8res": {
+                    "Revenus des titres immobilis\u00e9s": {
+                        "account_number": "7621"
+                    },
+                    "Revenus des pr\u00eats": {
+                        "account_number": "7626"
+                    },
+                    "Revenus des cr\u00e9ances immobilis\u00e9es": {
+                        "account_number": "7627"
+                    },
+                    "account_number": "762"
+                },
+                "Revenus des autres cr\u00e9ances": {
+                    "Revenus des cr\u00e9ances commerciales": {
+                        "account_number": "7631"
+                    },
+                    "Revenus des cr\u00e9ances diverses": {
+                        "account_number": "7638"
+                    },
+                    "account_number": "763"
+                },
+                "Revenus des valeurs mobili\u00e8res de placement": {
+                    "account_number": "764"
+                },
+                "Escomptes obtenus": {
+                    "account_number": "765"
+                },
+                "Gains de change financi\u00e8res": {
+                    "account_type": "Round Off",
+                    "account_number": "766"
+                },
+                "Produits nets sur cessions de valeurs mobili\u00e8res de placement": {
+                    "account_number": "767"
+                },
+                "Autres produits financiers": {
+                    "account_number": "768"
+                },
+                "account_number": "76"
+            },
+            "Produits exceptionnels": {
+                "Produits exceptionnels sur op\u00e9rations de gestion": {
+                    "D\u00e9dits et p\u00e9nalit\u00e9s per\u00e7us sur achats et sur ventes": {
+                        "account_number": "7711"
+                    },
+                    "Lib\u00e9ralit\u00e9s re\u00e7ues": {
+                        "account_number": "7713"
+                    },
+                    "Rentr\u00e9es sur cr\u00e9ances amorties": {
+                        "account_number": "7714"
+                    },
+                    "Subventions d'\u00e9quilibre": {
+                        "account_number": "7715"
+                    },
+                    "D\u00e9gr\u00e8vements d'imp\u00f4ts autres qu'imp\u00f4ts sur les b\u00e9n\u00e9fices": {
+                        "account_number": "7717"
+                    },
+                    "Autres produits exceptionnels sur op\u00e9rations de gestion": {
+                        "account_number": "7718"
+                    },
+                    "account_number": "771"
+                },
+                "(Compte \u00e0 la disposition des entit\u00e9s pour enregistrer, en cours d'exercice, les Produits sur exercices ant\u00e9rieurs)": {
+                    "account_number": "772"
+                },
+                "Op\u00e9rations de constitution ou liquidation des fiducies": {
+                    "Op\u00e9rations li\u00e9es \u00e0 la constitution de la fiducie - transfert des \u00e9l\u00e9ments": {
+                        "account_number": "7741"
+                    },
+                    "Op\u00e9rations li\u00e9es \u00e0 la liquidation de la fiducie": {
+                        "account_number": "7742"
+                    },
+                    "account_number": "774"
+                },
+                "Produits des cessions d'\u00e9l\u00e9ments d'actif": {
+                    "Immobilisations incorporelles": {
+                        "account_number": "7751"
+                    },
+                    "Immobilisations corporelles": {
+                        "account_number": "7752"
+                    },
+                    "Immobilisations financi\u00e8res": {
+                        "account_number": "7756"
+                    },
+                    "Autres \u00e9l\u00e9ments d'actif": {
+                        "account_number": "7758"
+                    },
+                    "account_number": "775"
+                },
+                "Quote-part des subventions d'investissement vir\u00e9e au r\u00e9sultat de l'exercice": {
+                    "account_number": "777"
+                },
+                "Autres produits exceptionnels": {
+                    "Bonis provenant de clauses d'indexation": {
+                        "account_number": "7781"
+                    },
+                    "Lots": {
+                        "account_number": "7782"
+                    },
+                    "Bonis provenant du rachat par l'entreprise d'actions et d'obligations \u00e9mises par elle-m\u00eame": {
+                        "account_number": "7783"
+                    },
+                    "Produits exceptionnels divers": {
+                        "account_number": "7788"
+                    },
+                    "account_number": "778"
+                },
+                "account_number": "77"
+            },
+            "Reprises sur amortissements, d\u00e9pr\u00e9ciations et provisions": {
+                "Reprises sur amortissements, d\u00e9pr\u00e9ciations et provisions (\u00e0 inscrire dans les produits d'exploitation)": {
+                    "Reprises sur amortissements des immobilisations incorporelles et corporelles": {
+                        "Immobilisations incorporelles": {
+                            "account_number": "78111"
+                        },
+                        "Immobilisations corporelles": {
+                            "account_number": "78112"
+                        },
+                        "account_number": "7811"
+                    },
+                    "Reprises sur provisions d'exploitation": {
+                        "account_number": "7815"
+                    },
+                    "Reprises sur d\u00e9pr\u00e9ciations des immobilisations corporelles et incorporelles": {
+                        "Immobilisations incorporelles": {
+                            "account_number": "78161"
+                        },
+                        "Immobilisations corporelles": {
+                            "account_number": "78162"
+                        },
+                        "account_number": "7816"
+                    },
+                    "Reprises sur d\u00e9pr\u00e9ciations des actifs circulants": {
+                        "Stocks et en-cours": {
+                            "account_number": "78173"
+                        },
+                        "Cr\u00e9ances": {
+                            "account_number": "78174"
+                        },
+                        "account_number": "7817"
+                    },
+                    "account_number": "781"
+                },
+                "Reprises sur d\u00e9pr\u00e9ciations et provisions (\u00e0 inscrire dans les produits financiers)": {
+                    "Reprises sur provisions financi\u00e8res": {
+                        "account_number": "7865"
+                    },
+                    "Reprises sur d\u00e9pr\u00e9ciations des \u00e9l\u00e9ments financiers": {
+                        "Immobilisations financi\u00e8res": {
+                            "account_number": "78662"
+                        },
+                        "Valeurs mobili\u00e8res de placement": {
+                            "account_number": "78665"
+                        },
+                        "account_number": "7866"
+                    },
+                    "account_number": "786"
+                },
+                "Reprises sur d\u00e9pr\u00e9ciations et provisions (\u00e0 inscrire dans les produits exceptionnels)": {
+                    "Reprises sur provisions r\u00e9glement\u00e9es (immobilisations)": {
+                        "Amortissements d\u00e9rogatoires": {
+                            "account_number": "78725"
+                        },
+                        "Provision sp\u00e9ciale de r\u00e9\u00e9valuation": {
+                            "account_number": "78726"
+                        },
+                        "Plus-values r\u00e9investies": {
+                            "account_number": "78727"
+                        },
+                        "account_number": "7872"
+                    },
+                    "Reprises sur provisions r\u00e9glement\u00e9es (stocks)": {
+                        "account_number": "7873"
+                    },
+                    "Reprises sur autres provisions r\u00e9glement\u00e9es": {
+                        "account_number": "7874"
+                    },
+                    "Reprises sur provisions exceptionnelles": {
+                        "account_number": "7875"
+                    },
+                    "Reprises sur d\u00e9pr\u00e9ciations exceptionnelles": {
+                        "account_number": "7876"
+                    },
+                    "account_number": "787"
+                },
+                "account_number": "78"
+            },
+            "Transferts de charges": {
+                "Transferts de charges d'exploitation": {
+                    "account_number": "791"
+                },
+                "Transferts de charges financi\u00e8res": {
+                    "account_number": "796"
+                },
+                "Transferts de charges exceptionnelles": {
+                    "account_number": "797"
+                },
+                "account_number": "79"
+            },
+            "account_number": "7"
+        }
+    }
+}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py
index fc1d7e3..e657a9a 100644
--- a/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py
+++ b/erpnext/accounts/doctype/accounting_dimension/test_accounting_dimension.py
@@ -7,7 +7,8 @@
 import unittest
 from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
 from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry
-from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import delete_accounting_dimension
+
+test_dependencies = ['Cost Center', 'Location', 'Warehouse', 'Department']
 
 class TestAccountingDimension(unittest.TestCase):
 	def setUp(self):
diff --git a/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py b/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py
index 7877abd..7f6254f 100644
--- a/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py
+++ b/erpnext/accounts/doctype/accounting_dimension_filter/test_accounting_dimension_filter.py
@@ -9,6 +9,8 @@
 from erpnext.accounts.doctype.accounting_dimension.test_accounting_dimension import create_dimension, disable_dimension
 from erpnext.exceptions import InvalidAccountDimensionError, MandatoryAccountDimensionError
 
+test_dependencies = ['Location', 'Cost Center', 'Department']
+
 class TestAccountingDimensionFilter(unittest.TestCase):
 	def setUp(self):
 		create_dimension()
diff --git a/erpnext/accounts/doctype/accounting_period/test_accounting_period.py b/erpnext/accounts/doctype/accounting_period/test_accounting_period.py
index 10cd939..dc472c7 100644
--- a/erpnext/accounts/doctype/accounting_period/test_accounting_period.py
+++ b/erpnext/accounts/doctype/accounting_period/test_accounting_period.py
@@ -10,6 +10,8 @@
 from erpnext.accounts.doctype.accounting_period.accounting_period import OverlapError
 from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
 
+test_dependencies = ['Item']
+
 class TestAccountingPeriod(unittest.TestCase):
 	def test_overlap(self):
 		ap1 = create_accounting_period(start_date = "2018-04-01",
@@ -38,7 +40,7 @@
 	accounting_period.start_date = args.start_date or nowdate()
 	accounting_period.end_date = args.end_date or add_months(nowdate(), 1)
 	accounting_period.company = args.company or "_Test Company"
-	accounting_period.period_name =args.period_name or  "_Test_Period_Name_1"
+	accounting_period.period_name = args.period_name or "_Test_Period_Name_1"
 	accounting_period.append("closed_documents", {
 		"document_type": 'Sales Invoice', "closed": 1
 	})
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 f7d471b..78e7ff6 100644
--- a/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.js
+++ b/erpnext/accounts/doctype/bank_reconciliation_tool/bank_reconciliation_tool.js
@@ -15,7 +15,7 @@
 	},
 
 	refresh: function (frm) {
-		frappe.require("assets/js/bank-reconciliation-tool.min.js", () =>
+		frappe.require("bank-reconciliation-tool.bundle.js", () =>
 			frm.trigger("make_reconciliation_tool")
 		);
 		frm.upload_statement_button = frm.page.set_secondary_action(
diff --git a/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.js b/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.js
index 016f29a..0a2e0bc 100644
--- a/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.js
+++ b/erpnext/accounts/doctype/bank_statement_import/bank_statement_import.js
@@ -320,7 +320,7 @@
 			return;
 		}
 
-		frappe.require("/assets/js/data_import_tools.min.js", () => {
+		frappe.require("data_import_tools.bundle.js", () => {
 			frm.import_preview = new frappe.data_import.ImportPreview({
 				wrapper: frm.get_field("import_preview").$wrapper,
 				doctype: frm.doc.reference_doctype,
diff --git a/erpnext/accounts/doctype/budget/test_budget.py b/erpnext/accounts/doctype/budget/test_budget.py
index c5ec23c..603e21e 100644
--- a/erpnext/accounts/doctype/budget/test_budget.py
+++ b/erpnext/accounts/doctype/budget/test_budget.py
@@ -11,6 +11,8 @@
 from erpnext.accounts.doctype.budget.budget import get_actual_expense, BudgetError
 from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry
 
+test_dependencies = ['Monthly Distribution']
+
 class TestBudget(unittest.TestCase):
 	def test_monthly_budget_crossed_ignore(self):
 		set_total_expense_zero(nowdate(), "cost_center")
diff --git a/erpnext/accounts/doctype/dunning/test_dunning.py b/erpnext/accounts/doctype/dunning/test_dunning.py
index c5ce514..e2d4d82 100644
--- a/erpnext/accounts/doctype/dunning/test_dunning.py
+++ b/erpnext/accounts/doctype/dunning/test_dunning.py
@@ -29,7 +29,7 @@
 		self.assertEqual(round(amounts.get('interest_amount'), 2), 0.44)
 		self.assertEqual(round(amounts.get('dunning_amount'), 2), 20.44)
 		self.assertEqual(round(amounts.get('grand_total'), 2), 120.44)
-	
+
 	def test_gl_entries(self):
 		dunning = create_dunning()
 		dunning.submit()
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.js b/erpnext/accounts/doctype/journal_entry/journal_entry.js
index d76641d..957a50f 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.js
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.js
@@ -194,19 +194,19 @@
 	refresh_field("accounts");
 }
 
-erpnext.accounts.JournalEntry = frappe.ui.form.Controller.extend({
-	onload: function() {
+erpnext.accounts.JournalEntry = class JournalEntry extends frappe.ui.form.Controller {
+	onload() {
 		this.load_defaults();
 		this.setup_queries();
 		this.setup_balance_formatter();
 		erpnext.accounts.dimensions.setup_dimension_filters(this.frm, this.frm.doctype);
-	},
+	}
 
-	onload_post_render: function() {
+	onload_post_render() {
 		cur_frm.get_field("accounts").grid.set_multiple_add("account");
-	},
+	}
 
-	load_defaults: function() {
+	load_defaults() {
 		//this.frm.show_print_first = true;
 		if(this.frm.doc.__islocal && this.frm.doc.company) {
 			frappe.model.set_default_values(this.frm.doc);
@@ -216,9 +216,9 @@
 			var posting_date = this.frm.doc.posting_date;
 			if(!this.frm.doc.amended_from) this.frm.set_value('posting_date', posting_date || frappe.datetime.get_today());
 		}
-	},
+	}
 
-	setup_queries: function() {
+	setup_queries() {
 		var me = this;
 
 		me.frm.set_query("account", "accounts", function(doc, cdt, cdn) {
@@ -324,9 +324,9 @@
 		});
 
 
-	},
+	}
 
-	setup_balance_formatter: function() {
+	setup_balance_formatter() {
 		const formatter = function(value, df, options, doc) {
 			var currency = frappe.meta.get_field_currency(df, doc);
 			var dr_or_cr = value ? ('<label>' + (value > 0.0 ? __("Dr") : __("Cr")) + '</label>') : "";
@@ -337,9 +337,9 @@
 		};
 		this.frm.fields_dict.accounts.grid.update_docfield_property('balance', 'formatter', formatter);
 		this.frm.fields_dict.accounts.grid.update_docfield_property('party_balance', 'formatter', formatter);
-	},
+	}
 
-	reference_name: function(doc, cdt, cdn) {
+	reference_name(doc, cdt, cdn) {
 		var d = frappe.get_doc(cdt, cdn);
 
 		if(d.reference_name) {
@@ -351,9 +351,9 @@
 				this.get_outstanding('Journal Entry', d.reference_name, doc.company, d);
 			}
 		}
-	},
+	}
 
-	get_outstanding: function(doctype, docname, company, child, due_date) {
+	get_outstanding(doctype, docname, company, child, due_date) {
 		var me = this;
 		var args = {
 			"doctype": doctype,
@@ -375,9 +375,9 @@
 				}
 			}
 		});
-	},
+	}
 
-	accounts_add: function(doc, cdt, cdn) {
+	accounts_add(doc, cdt, cdn) {
 		var row = frappe.get_doc(cdt, cdn);
 		$.each(doc.accounts, function(i, d) {
 			if(d.account && d.party && d.party_type) {
@@ -400,9 +400,9 @@
 		cur_frm.cscript.update_totals(doc);
 
 		erpnext.accounts.dimensions.copy_dimension_from_first_row(this.frm, cdt, cdn, 'accounts');
-	},
+	}
 
-});
+};
 
 cur_frm.script_manager.make(erpnext.accounts.JournalEntry);
 
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
index d1523cd..8dcd1aa 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js
@@ -34,8 +34,8 @@
 	}
 });
 
-erpnext.accounts.PaymentReconciliationController = frappe.ui.form.Controller.extend({
-	onload: function() {
+erpnext.accounts.PaymentReconciliationController = class PaymentReconciliationController extends frappe.ui.form.Controller {
+	onload() {
 		var me = this;
 
 		this.frm.set_query("party", function() {
@@ -84,18 +84,18 @@
 				frappe.throw({message: __("Please Select Both Company and Party Type First"), title: title});
 			}
 		};
-	},
+	}
 
-	refresh: function() {
+	refresh() {
 		this.frm.disable_save();
 		this.toggle_primary_action();
-	},
+	}
 
-	onload_post_render: function() {
+	onload_post_render() {
 		this.toggle_primary_action();
-	},
+	}
 
-	party: function() {
+	party() {
 		var me = this
 		if (!me.frm.doc.receivable_payable_account && me.frm.doc.party_type && me.frm.doc.party) {
 			return frappe.call({
@@ -112,9 +112,9 @@
 				}
 			});
 		}
-	},
+	}
 
-	get_unreconciled_entries: function() {
+	get_unreconciled_entries() {
 		var me = this;
 		return this.frm.call({
 			doc: me.frm.doc,
@@ -125,9 +125,9 @@
 			}
 		});
 
-	},
+	}
 
-	reconcile: function() {
+	reconcile() {
 		var me = this;
 		var show_dialog = me.frm.doc.payments.filter(d => d.difference_amount && !d.difference_account);
 
@@ -209,9 +209,9 @@
 		} else {
 			this.reconcile_payment_entries();
 		}
-	},
+	}
 
-	reconcile_payment_entries: function() {
+	reconcile_payment_entries() {
 		var me = this;
 
 		return this.frm.call({
@@ -222,9 +222,9 @@
 				me.toggle_primary_action();
 			}
 		});
-	},
+	}
 
-	set_invoice_options: function() {
+	set_invoice_options() {
 		var me = this;
 		var invoices = [];
 
@@ -244,9 +244,9 @@
 		}
 
 		refresh_field("payments");
-	},
+	}
 
-	toggle_primary_action: function() {
+	toggle_primary_action() {
 		if ((this.frm.doc.payments || []).length) {
 			this.frm.fields_dict.reconcile.$input
 				&& this.frm.fields_dict.reconcile.$input.addClass("btn-primary");
@@ -260,6 +260,6 @@
 		}
 	}
 
-});
+};
 
 $.extend(cur_frm.cscript, new erpnext.accounts.PaymentReconciliationController({frm: cur_frm}));
diff --git a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py
index a74fa06..fdb4f6f 100644
--- a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py
+++ b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py
@@ -102,14 +102,14 @@
 		make_gl_entries(gl_entries)
 
 	def get_pl_balances(self, dimension_fields):
-		"""Get balance for pl accounts"""
+		"""Get balance for Profit and Loss accounts, only including valid transactions (not cancelled)"""
 		return frappe.db.sql("""
 			select
 				t1.account, t2.account_currency, {dimension_fields},
 				sum(t1.debit_in_account_currency) - sum(t1.credit_in_account_currency) as balance_in_account_currency,
 				sum(t1.debit) - sum(t1.credit) as balance_in_company_currency
 			from `tabGL Entry` t1, `tabAccount` t2
-			where t1.account = t2.name and t2.report_type = 'Profit and Loss'
+			where t1.is_cancelled = 0 and t1.account = t2.name and t2.report_type = 'Profit and Loss'
 			and t2.docstatus < 2 and t2.company = %s
 			and t1.posting_date between %s and %s
 			group by t1.account, {dimension_fields}
diff --git a/erpnext/accounts/doctype/pos_invoice/pos_invoice.js b/erpnext/accounts/doctype/pos_invoice/pos_invoice.js
index 493bd44..72d587a 100644
--- a/erpnext/accounts/doctype/pos_invoice/pos_invoice.js
+++ b/erpnext/accounts/doctype/pos_invoice/pos_invoice.js
@@ -4,18 +4,18 @@
 {% include 'erpnext/selling/sales_common.js' %};
 frappe.provide("erpnext.accounts");
 
-erpnext.selling.POSInvoiceController = erpnext.selling.SellingController.extend({
+erpnext.selling.POSInvoiceController = class POSInvoiceController extends erpnext.selling.SellingController {
 	setup(doc) {
 		this.setup_posting_date_time_check();
-		this._super(doc);
-	},
+		super.setup(doc);
+	}
 
-	company: function() {
+	company() {
 		erpnext.accounts.dimensions.update_dimension(this.frm, this.frm.doctype);
-	},
+	}
 
 	onload(doc) {
-		this._super();
+		super.onload();
 		this.frm.ignore_doctypes_on_cancel_all = ['POS Invoice Merge Log'];
 		if(doc.__islocal && doc.is_pos && frappe.get_route_str() !== 'point-of-sale') {
 			this.frm.script_manager.trigger("is_pos");
@@ -23,10 +23,10 @@
 		}
 
 		erpnext.accounts.dimensions.setup_dimension_filters(this.frm, this.frm.doctype);
-	},
+	}
 
 	refresh(doc) {
-		this._super();
+		super.refresh();
 		if (doc.docstatus == 1 && !doc.is_return) {
 			this.frm.add_custom_button(__('Return'), this.make_sales_return, __('Create'));
 			this.frm.page.set_inner_btn_group_as_primary(__('Create'));
@@ -36,13 +36,13 @@
 			this.frm.return_print_format = "Sales Invoice Return";
 			this.frm.set_value('consolidated_invoice', '');
 		}
-	},
+	}
 
-	is_pos: function() {
+	is_pos() {
 		this.set_pos_data();
-	},
+	}
 
-	set_pos_data: async function() {
+	async set_pos_data() {
 		if(this.frm.doc.is_pos) {
 			this.frm.set_value("allocate_advances_automatically", 0);
 			if(!this.frm.doc.company) {
@@ -69,7 +69,7 @@
 				}
 			}
 		}
-	},
+	}
 
 	customer() {
 		if (!this.frm.doc.customer) return
@@ -86,13 +86,13 @@
 			}, () => {
 				this.apply_pricing_rule();
 			});
-	},
+	}
 
-	amount: function(){
+	amount(){
 		this.write_off_outstanding_amount_automatically()
-	},
+	}
 
-	change_amount: function(){
+	change_amount(){
 		if(this.frm.doc.paid_amount > this.frm.doc.grand_total){
 			this.calculate_write_off_amount();
 		}else {
@@ -101,16 +101,16 @@
 		}
 
 		this.frm.refresh_fields();
-	},
+	}
 
-	loyalty_amount: function(){
+	loyalty_amount(){
 		this.calculate_outstanding_amount();
 		this.frm.refresh_field("outstanding_amount");
 		this.frm.refresh_field("paid_amount");
 		this.frm.refresh_field("base_paid_amount");
-	},
+	}
 
-	write_off_outstanding_amount_automatically: function() {
+	write_off_outstanding_amount_automatically() {
 		if(cint(this.frm.doc.write_off_outstanding_amount_automatically)) {
 			frappe.model.round_floats_in(this.frm.doc, ["grand_total", "paid_amount"]);
 			// this will make outstanding amount 0
@@ -125,15 +125,15 @@
 
 		this.calculate_outstanding_amount(false);
 		this.frm.refresh_fields();
-	},
+	}
 
-	make_sales_return: function() {
+	make_sales_return() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.accounts.doctype.pos_invoice.pos_invoice.make_sales_return",
 			frm: cur_frm
 		})
-	},
-})
+	}
+}
 
 $.extend(cur_frm.cscript, new erpnext.selling.POSInvoiceController({ frm: cur_frm }))
 
diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
index aedf1c6..556f49d 100644
--- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
+++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
@@ -152,7 +152,7 @@
 			frappe.throw(_("Valid from date must be less than valid upto date"))
 
 	def validate_condition(self):
-		if self.condition and ("=" in self.condition) and re.match("""[\w\.:_]+\s*={1}\s*[\w\.@'"]+""", self.condition):
+		if self.condition and ("=" in self.condition) and re.match(r'[\w\.:_]+\s*={1}\s*[\w\.@\'"]+', self.condition):
 			frappe.throw(_("Invalid condition expression"))
 
 #--------------------------------------------------------------------------------
diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html
index f61aacb..db1fea1 100644
--- a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html
+++ b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.html
@@ -1,24 +1,43 @@
-<h1 class="text-center" style="page-break-before:always">{{ filters.party[0] }}</h1>
-<h3 class="text-center">{{ _("Statement of Accounts") }}</h3>
+<div class="page-break">
+	<div id="header-html" class="hidden-pdf">
+		{% if letter_head %}
+		<div class="letter-head text-center">{{ letter_head.content }}</div>
+		<hr style="height:2px;border-width:0;color:black;background-color:black;">
+		{% endif %}
+	</div>
+	<div id="footer-html" class="visible-pdf">
+		{% if letter_head.footer %}
+		<div class="letter-head-footer">
+			<hr style="border-width:0;color:black;background-color:black;padding-bottom:2px;">
+			{{ letter_head.footer }}
+		</div>
+		{% endif %}
+	</div>
 
-<h5 class="text-center">
-    {{ frappe.format(filters.from_date, 'Date')}}
-	{{ _("to") }}
-	{{ frappe.format(filters.to_date, 'Date')}}
-</h5>
+	<h2 class="text-center">{{ _("STATEMENTS OF ACCOUNTS") }}</h2>
+	<div>
+		<h5 style="float: left;">{{ _("Customer: ") }} <b>{{filters.party[0] }}</b></h5>
+		<h5 style="float: right;">
+			{{ _("Date: ") }}
+			<b>{{ frappe.format(filters.from_date, 'Date')}}
+			{{ _("to") }}
+			{{ frappe.format(filters.to_date, 'Date')}}</b>
+			</h5>
+	</div>
+	<br>
 
-<table class="table table-bordered">
-	<thead>
-		<tr>
-			<th style="width: 12%">{{ _("Date") }}</th>
-			<th style="width: 15%">{{ _("Ref") }}</th>
-			<th style="width: 25%">{{ _("Party") }}</th>
-			<th style="width: 15%">{{ _("Debit") }}</th>
-			<th style="width: 15%">{{ _("Credit") }}</th>
-			<th style="width: 18%">{{ _("Balance (Dr - Cr)") }}</th>
-		</tr>
-	</thead>
-	<tbody>
+	<table class="table table-bordered">
+		<thead>
+			<tr>
+				<th style="width: 12%">{{ _("Date") }}</th>
+				<th style="width: 15%">{{ _("Reference") }}</th>
+				<th style="width: 25%">{{ _("Remarks") }}</th>
+				<th style="width: 15%">{{ _("Debit") }}</th>
+				<th style="width: 15%">{{ _("Credit") }}</th>
+				<th style="width: 18%">{{ _("Balance (Dr - Cr)") }}</th>
+			</tr>
+		</thead>
+		<tbody>
 		{% for row in data %}
 			<tr>
 			{% if(row.posting_date) %}
@@ -58,32 +77,34 @@
 			</tr>
 		{% endfor %}
 		</tbody>
-</table>
-<br><br>
-{% if ageing %}
-<h3 class="text-center">{{ _("Ageing Report Based On ") }} {{ ageing.ageing_based_on }}</h3>
-<h5 class="text-center">
-	{{ _("Up to " ) }}  {{ frappe.format(filters.to_date, 'Date')}}
-</h5>
-<br>
-
-<table class="table table-bordered">
-	<thead>
-		<tr>
-			<th style="width: 12%">30 Days</th>
-			<th style="width: 15%">60 Days</th>
-			<th style="width: 25%">90 Days</th>
-			<th style="width: 15%">120 Days</th>
-		</tr>
-	</thead>
-	<tbody>
-		<tr>
-			<td>{{ frappe.utils.fmt_money(ageing.range1, currency=filters.presentation_currency) }}</td>
-			<td>{{ frappe.utils.fmt_money(ageing.range2, currency=filters.presentation_currency) }}</td>
-			<td>{{ frappe.utils.fmt_money(ageing.range3, currency=filters.presentation_currency) }}</td>
-			<td>{{ frappe.utils.fmt_money(ageing.range4, currency=filters.presentation_currency) }}</td>
-		</tr>
-	</tbody>
-</table>
-{% endif %}
-<p class="text-right text-muted">Printed On {{ frappe.format(frappe.utils.get_datetime(), 'Datetime') }}</p>
\ No newline at end of file
+	</table>
+	<br>
+	{% if ageing %}
+	<h4 class="text-center">{{ _("Ageing Report based on ") }} {{ ageing.ageing_based_on }}
+		{{ _("up to " ) }}  {{ frappe.format(filters.to_date, 'Date')}}
+	</h4>
+	<table class="table table-bordered">
+		<thead>
+			<tr>
+				<th style="width: 25%">30 Days</th>
+				<th style="width: 25%">60 Days</th>
+				<th style="width: 25%">90 Days</th>
+				<th style="width: 25%">120 Days</th>
+			</tr>
+		</thead>
+		<tbody>
+			<tr>
+				<td>{{ frappe.utils.fmt_money(ageing.range1, currency=filters.presentation_currency) }}</td>
+				<td>{{ frappe.utils.fmt_money(ageing.range2, currency=filters.presentation_currency) }}</td>
+				<td>{{ frappe.utils.fmt_money(ageing.range3, currency=filters.presentation_currency) }}</td>
+				<td>{{ frappe.utils.fmt_money(ageing.range4, currency=filters.presentation_currency) }}</td>
+			</tr>
+		</tbody>
+	</table>
+	{% endif %}
+	{% if terms_and_conditions %}
+	<div>
+		{{ terms_and_conditions }}
+	</div>
+	{% endif %}
+</div>
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 4be0e2e..922f636 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
@@ -1,6 +1,5 @@
 {
  "actions": [],
- "allow_workflow": 1,
  "autoname": "Prompt",
  "creation": "2020-05-22 16:46:18.712954",
  "doctype": "DocType",
@@ -28,9 +27,11 @@
   "customers",
   "preferences",
   "orientation",
-  "section_break_14",
   "include_ageing",
   "ageing_based_on",
+  "section_break_14",
+  "letter_head",
+  "terms_and_conditions",
   "section_break_1",
   "enable_auto_email",
   "section_break_18",
@@ -270,10 +271,22 @@
    "fieldname": "body",
    "fieldtype": "Text Editor",
    "label": "Body"
+  },
+  {
+   "fieldname": "letter_head",
+   "fieldtype": "Link",
+   "label": "Letter Head",
+   "options": "Letter Head"
+  },
+  {
+   "fieldname": "terms_and_conditions",
+   "fieldtype": "Link",
+   "label": "Terms and Conditions",
+   "options": "Terms and Conditions"
   }
  ],
  "links": [],
- "modified": "2020-08-08 08:47:09.185728",
+ "modified": "2021-05-13 12:44:19.574844",
  "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 a0dbff3..cf79c03 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
@@ -64,6 +64,9 @@
 		tax_id = frappe.get_doc('Customer', entry.customer).tax_id
 		presentation_currency = get_party_account_currency('Customer', entry.customer, doc.company) \
 				or doc.currency or get_company_currency(doc.company)
+		if doc.letter_head:
+			from frappe.www.printview import get_letter_head
+			letter_head = get_letter_head(doc, 0)
 
 		filters= frappe._dict({
 			'from_date': doc.from_date,
@@ -91,8 +94,10 @@
 			continue
 
 		html = frappe.render_template(template_path, \
-			{"filters": filters, "data": res, "ageing": ageing[0] if (doc.include_ageing and ageing) else None})
-
+			{"filters": filters, "data": res, "ageing": ageing[0] if doc.include_ageing else None,
+				"letter_head": letter_head if doc.letter_head else None,
+				"terms_and_conditions": frappe.db.get_value('Terms and Conditions', doc.terms_and_conditions, 'terms')
+					if doc.terms_and_conditions else None})
 		html = frappe.render_template(base_template_path, {"body": html, \
 			"css": get_print_style(), "title": "Statement For " + entry.customer})
 		statement_dict[entry.customer] = html
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
index f58c8f4..617b5b4 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
@@ -4,10 +4,10 @@
 frappe.provide("erpnext.accounts");
 {% include 'erpnext/public/js/controllers/buying.js' %};
 
-erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({
-	setup: function(doc) {
+erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying.BuyingController {
+	setup(doc) {
 		this.setup_posting_date_time_check();
-		this._super(doc);
+		super.setup(doc);
 
 		// formatter for purchase invoice item
 		if(this.frm.doc.update_stock) {
@@ -25,14 +25,14 @@
 				}
 			};
 		});
-	},
+	}
 
-	company: function() {
+	company() {
 		erpnext.accounts.dimensions.update_dimension(this.frm, this.frm.doctype);
-	},
+	}
 
-	onload: function() {
-		this._super();
+	onload() {
+		super.onload();
 
 		if(!this.frm.doc.__islocal) {
 			// show credit_to in print format
@@ -48,11 +48,11 @@
 		}
 
 		erpnext.accounts.dimensions.setup_dimension_filters(this.frm, this.frm.doctype);
-	},
+	}
 
-	refresh: function(doc) {
+	refresh(doc) {
 		const me = this;
-		this._super();
+		super.refresh();
 
 		hide_fields(this.frm.doc);
 		// Show / Hide button
@@ -161,26 +161,26 @@
 		}
 
 		this.frm.set_df_property("tax_withholding_category", "hidden", doc.apply_tds ? 0 : 1);
-	},
+	}
 
-	unblock_invoice: function() {
+	unblock_invoice() {
 		const me = this;
 		frappe.call({
 			'method': 'erpnext.accounts.doctype.purchase_invoice.purchase_invoice.unblock_invoice',
 			'args': {'name': me.frm.doc.name},
 			'callback': (r) => me.frm.reload_doc()
 		});
-	},
+	}
 
-	block_invoice: function() {
+	block_invoice() {
 		this.make_comment_dialog_and_block_invoice();
-	},
+	}
 
-	change_release_date: function() {
+	change_release_date() {
 		this.make_dialog_and_set_release_date();
-	},
+	}
 
-	can_change_release_date: function(date) {
+	can_change_release_date(date) {
 		const diff = frappe.datetime.get_diff(date, frappe.datetime.nowdate());
 		if (diff < 0) {
 			frappe.throw(__('New release date should be in the future'));
@@ -188,9 +188,9 @@
 		} else {
 			return true;
 		}
-	},
+	}
 
-	make_comment_dialog_and_block_invoice: function(){
+	make_comment_dialog_and_block_invoice(){
 		const me = this;
 
 		const title = __('Block Invoice');
@@ -232,9 +232,9 @@
 		});
 
 		this.dialog.show();
-	},
+	}
 
-	make_dialog_and_set_release_date: function() {
+	make_dialog_and_set_release_date() {
 		const me = this;
 
 		const title = __('Set New Release Date');
@@ -263,17 +263,17 @@
 		});
 
 		this.dialog.show();
-	},
+	}
 
-	set_release_date: function(data) {
+	set_release_date(data) {
 		return frappe.call({
 			'method': 'erpnext.accounts.doctype.purchase_invoice.purchase_invoice.change_release_date',
 			'args': data,
 			'callback': (r) => this.frm.reload_doc()
 		});
-	},
+	}
 
-	supplier: function() {
+	supplier() {
 		var me = this;
 
 		// Do not update if inter company reference is there as the details will already be updated
@@ -295,9 +295,9 @@
 				me.frm.set_df_property("apply_tds", "read_only", me.frm.supplier_tds ? 0 : 1);
 				me.frm.set_df_property("tax_withholding_category", "hidden", me.frm.supplier_tds ? 0 : 1);
 			})
-	},
+	}
 
-	apply_tds: function(frm) {
+	apply_tds(frm) {
 		var me = this;
 
 		if (!me.frm.doc.apply_tds) {
@@ -307,9 +307,9 @@
 			me.frm.set_value("tax_withholding_category", me.frm.supplier_tds);
 			me.frm.set_df_property("tax_withholding_category", "hidden", 0);
 		}
-	},
+	}
 
-	credit_to: function() {
+	credit_to() {
 		var me = this;
 		if(this.frm.doc.credit_to) {
 			me.frm.call({
@@ -327,16 +327,16 @@
 				}
 			});
 		}
-	},
+	}
 
-	make_inter_company_invoice: function(frm) {
+	make_inter_company_invoice(frm) {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.accounts.doctype.purchase_invoice.purchase_invoice.make_inter_company_sales_invoice",
 			frm: frm
 		});
-	},
+	}
 
-	is_paid: function() {
+	is_paid() {
 		hide_fields(this.frm.doc);
 		if(cint(this.frm.doc.is_paid)) {
 			this.frm.set_value("allocate_advances_automatically", 0);
@@ -347,44 +347,44 @@
 		}
 		this.calculate_outstanding_amount();
 		this.frm.refresh_fields();
-	},
+	}
 
-	write_off_amount: function() {
+	write_off_amount() {
 		this.set_in_company_currency(this.frm.doc, ["write_off_amount"]);
 		this.calculate_outstanding_amount();
 		this.frm.refresh_fields();
-	},
+	}
 
-	paid_amount: function() {
+	paid_amount() {
 		this.set_in_company_currency(this.frm.doc, ["paid_amount"]);
 		this.write_off_amount();
 		this.frm.refresh_fields();
-	},
+	}
 
-	allocated_amount: function() {
+	allocated_amount() {
 		this.calculate_total_advance();
 		this.frm.refresh_fields();
-	},
+	}
 
-	items_add: function(doc, cdt, cdn) {
+	items_add(doc, cdt, cdn) {
 		var row = frappe.get_doc(cdt, cdn);
 		this.frm.script_manager.copy_from_first_row("items", row,
 			["expense_account", "cost_center", "project"]);
-	},
+	}
 
-	on_submit: function() {
+	on_submit() {
 		$.each(this.frm.doc["items"] || [], function(i, row) {
 			if(row.purchase_receipt) frappe.model.clear_doc("Purchase Receipt", row.purchase_receipt)
 		})
-	},
+	}
 
-	make_debit_note: function() {
+	make_debit_note() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.accounts.doctype.purchase_invoice.purchase_invoice.make_debit_note",
 			frm: cur_frm
 		})
-	},
-});
+	}
+};
 
 cur_frm.script_manager.make(erpnext.accounts.PurchaseInvoice);
 
diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
index 66be11f..53db689 100644
--- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -636,8 +636,8 @@
 
 	def test_rejected_serial_no(self):
 		pi = make_purchase_invoice(item_code="_Test Serialized Item With Series", received_qty=2, qty=1,
-			rejected_qty=1, rate=500, update_stock=1,
-			rejected_warehouse = "_Test Rejected Warehouse - _TC")
+			rejected_qty=1, rate=500, update_stock=1, rejected_warehouse = "_Test Rejected Warehouse - _TC",
+			allow_zero_valuation_rate=1)
 
 		self.assertEqual(frappe.db.get_value("Serial No", pi.get("items")[0].serial_no, "warehouse"),
 			pi.get("items")[0].warehouse)
@@ -994,7 +994,8 @@
 		"project": args.project,
 		"rejected_warehouse": args.rejected_warehouse or "",
 		"rejected_serial_no": args.rejected_serial_no or "",
-		"asset_location": args.location or ""
+		"asset_location": args.location or "",
+		"allow_zero_valuation_rate": args.get("allow_zero_valuation_rate") or 0
 	})
 
 	if args.get_taxes_and_charges:
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index 7c73ad6..b48db24 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -5,17 +5,17 @@
 frappe.provide("erpnext.accounts");
 
 
-erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.extend({
-	setup: function(doc) {
+erpnext.accounts.SalesInvoiceController = class SalesInvoiceController extends erpnext.selling.SellingController {
+	setup(doc) {
 		this.setup_posting_date_time_check();
-		this._super(doc);
-	},
-	company: function() {
+		super.setup(doc);
+	}
+	company() {
 		erpnext.accounts.dimensions.update_dimension(this.frm, this.frm.doctype);
-	},
-	onload: function() {
+	}
+	onload() {
 		var me = this;
-		this._super();
+		super.onload();
 
 		this.frm.ignore_doctypes_on_cancel_all = ['POS Invoice'];
 		if(!this.frm.doc.__islocal && !this.frm.doc.customer && this.frm.doc.debit_to) {
@@ -35,11 +35,11 @@
 		}
 		erpnext.queries.setup_warehouse_query(this.frm);
 		erpnext.accounts.dimensions.setup_dimension_filters(this.frm, this.frm.doctype);
-	},
+	}
 
-	refresh: function(doc, dt, dn) {
+	refresh(doc, dt, dn) {
 		const me = this;
-		this._super();
+		super.refresh();
 		if(cur_frm.msgbox && cur_frm.msgbox.$wrapper.is(":visible")) {
 			// hide new msgbox
 			cur_frm.msgbox.hide();
@@ -138,16 +138,16 @@
 				}, __('Create'));
 			}
 		}
-	},
+	}
 
-	make_maintenance_schedule: function() {
+	make_maintenance_schedule() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.make_maintenance_schedule",
 			frm: cur_frm
 		})
-	},
+	}
 
-	on_submit: function(doc, dt, dn) {
+	on_submit(doc, dt, dn) {
 		var me = this;
 
 		if (frappe.get_route()[0] != 'Form') {
@@ -157,9 +157,9 @@
 		$.each(doc["items"], function(i, row) {
 			if(row.delivery_note) frappe.model.clear_doc("Delivery Note", row.delivery_note)
 		})
-	},
+	}
 
-	set_default_print_format: function() {
+	set_default_print_format() {
 		// set default print format to POS type or Credit Note
 		if(cur_frm.doc.is_pos) {
 			if(cur_frm.pos_print_format) {
@@ -180,9 +180,9 @@
 				cur_frm.meta._default_print_format = null;
 			}
 		}
-	},
+	}
 
-	sales_order_btn: function() {
+	sales_order_btn() {
 		var me = this;
 		this.$sales_order_btn = this.frm.add_custom_button(__('Sales Order'),
 			function() {
@@ -201,9 +201,9 @@
 					}
 				})
 			}, __("Get Items From"));
-	},
+	}
 
-	quotation_btn: function() {
+	quotation_btn() {
 		var me = this;
 		this.$quotation_btn = this.frm.add_custom_button(__('Quotation'),
 			function() {
@@ -225,9 +225,9 @@
 					}
 				})
 			}, __("Get Items From"));
-	},
+	}
 
-	delivery_note_btn: function() {
+	delivery_note_btn() {
 		var me = this;
 		this.$delivery_note_btn = this.frm.add_custom_button(__('Delivery Note'),
 			function() {
@@ -253,12 +253,12 @@
 					}
 				});
 			}, __("Get Items From"));
-	},
+	}
 
-	tc_name: function() {
+	tc_name() {
 		this.get_terms();
-	},
-	customer: function() {
+	}
+	customer() {
 		if (this.frm.doc.is_pos){
 			var pos_profile = this.frm.doc.pos_profile;
 		}
@@ -289,16 +289,16 @@
 				}
 			});
 		}
-	},
+	}
 
-	make_inter_company_invoice: function() {
+	make_inter_company_invoice() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.make_inter_company_purchase_invoice",
 			frm: me.frm
 		});
-	},
+	}
 
-	debit_to: function() {
+	debit_to() {
 		var me = this;
 		if(this.frm.doc.debit_to) {
 			me.frm.call({
@@ -316,14 +316,14 @@
 				}
 			});
 		}
-	},
+	}
 
-	allocated_amount: function() {
+	allocated_amount() {
 		this.calculate_total_advance();
 		this.frm.refresh_fields();
-	},
+	}
 
-	write_off_outstanding_amount_automatically: function() {
+	write_off_outstanding_amount_automatically() {
 		if(cint(this.frm.doc.write_off_outstanding_amount_automatically)) {
 			frappe.model.round_floats_in(this.frm.doc, ["grand_total", "paid_amount"]);
 			// this will make outstanding amount 0
@@ -338,39 +338,39 @@
 
 		this.calculate_outstanding_amount(false);
 		this.frm.refresh_fields();
-	},
+	}
 
-	write_off_amount: function() {
+	write_off_amount() {
 		this.set_in_company_currency(this.frm.doc, ["write_off_amount"]);
 		this.write_off_outstanding_amount_automatically();
-	},
+	}
 
-	items_add: function(doc, cdt, cdn) {
+	items_add(doc, cdt, cdn) {
 		var row = frappe.get_doc(cdt, cdn);
 		this.frm.script_manager.copy_from_first_row("items", row, ["income_account", "cost_center"]);
-	},
+	}
 
-	set_dynamic_labels: function() {
-		this._super();
+	set_dynamic_labels() {
+		super.set_dynamic_labels();
 		this.frm.events.hide_fields(this.frm)
-	},
+	}
 
-	items_on_form_rendered: function() {
+	items_on_form_rendered() {
 		erpnext.setup_serial_or_batch_no();
-	},
+	}
 
-	packed_items_on_form_rendered: function(doc, grid_row) {
+	packed_items_on_form_rendered(doc, grid_row) {
 		erpnext.setup_serial_or_batch_no();
-	},
+	}
 
-	make_sales_return: function() {
+	make_sales_return() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.make_sales_return",
 			frm: cur_frm
 		})
-	},
+	}
 
-	asset: function(frm, cdt, cdn) {
+	asset(frm, cdt, cdn) {
 		var row = locals[cdt][cdn];
 		if(row.asset) {
 			frappe.call({
@@ -384,18 +384,18 @@
 				}
 			})
 		}
-	},
+	}
 
-	is_pos: function(frm){
+	is_pos(frm){
 		this.set_pos_data();
-	},
+	}
 
-	pos_profile: function() {
+	pos_profile() {
 		this.frm.doc.taxes = []
 		this.set_pos_data();
-	},
+	}
 
-	set_pos_data: function() {
+	set_pos_data() {
 		if(this.frm.doc.is_pos) {
 			this.frm.set_value("allocate_advances_automatically", 0);
 			if(!this.frm.doc.company) {
@@ -425,13 +425,13 @@
 			}
 		}
 		else this.frm.trigger("refresh");
-	},
+	}
 
-	amount: function(){
+	amount(){
 		this.write_off_outstanding_amount_automatically()
-	},
+	}
 
-	change_amount: function(){
+	change_amount(){
 		if(this.frm.doc.paid_amount > this.frm.doc.grand_total){
 			this.calculate_write_off_amount();
 		}else {
@@ -440,15 +440,15 @@
 		}
 
 		this.frm.refresh_fields();
-	},
+	}
 
-	loyalty_amount: function(){
+	loyalty_amount(){
 		this.calculate_outstanding_amount();
 		this.frm.refresh_field("outstanding_amount");
 		this.frm.refresh_field("paid_amount");
 		this.frm.refresh_field("base_paid_amount");
 	}
-});
+};
 
 // for backward compatibility: combine new and previous states
 $.extend(cur_frm.cscript, new erpnext.accounts.SalesInvoiceController({frm: cur_frm}));
diff --git a/erpnext/accounts/report/tax_detail/__init__.py b/erpnext/accounts/report/tax_detail/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/report/tax_detail/__init__.py
diff --git a/erpnext/accounts/report/tax_detail/tax_detail.js b/erpnext/accounts/report/tax_detail/tax_detail.js
new file mode 100644
index 0000000..ed6fac4
--- /dev/null
+++ b/erpnext/accounts/report/tax_detail/tax_detail.js
@@ -0,0 +1,451 @@
+// Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+// Contributed by Case Solved and sponsored by Nulight Studios
+/* eslint-disable */
+
+frappe.provide('frappe.query_reports');
+
+frappe.query_reports["Tax Detail"] = {
+	filters: [
+		{
+			fieldname: "company",
+			label: __("Company"),
+			fieldtype: "Link",
+			options: "Company",
+			default: frappe.defaults.get_user_default("company"),
+			reqd: 1
+		},
+		{
+			fieldname: "from_date",
+			label: __("From Date"),
+			fieldtype: "Date",
+			default: frappe.datetime.month_start(frappe.datetime.get_today()),
+			reqd: 1,
+			width: "60px"
+		},
+		{
+			fieldname: "to_date",
+			label: __("To Date"),
+			fieldtype: "Date",
+			default: frappe.datetime.month_end(frappe.datetime.get_today()),
+			reqd: 1,
+			width: "60px"
+		},
+		{
+			fieldname: "report_name",
+			label: __("Report Name"),
+			fieldtype: "Read Only",
+			default: frappe.query_report.report_name,
+			hidden: 1,
+			reqd: 1
+		},
+		{
+			fieldname: "mode",
+			label: __("Mode"),
+			fieldtype: "Read Only",
+			default: "edit",
+			hidden: 1,
+			reqd: 1
+		}
+	],
+	onload: function onload(report) {
+		// Remove Add Column and Save from menu
+		report.page.add_inner_button(__("New Report"), () => new_report(), __("Custom Report"));
+		report.page.add_inner_button(__("Load Report"), () => load_report(), __("Custom Report"));
+		hide_filters(report);
+	}
+};
+
+function hide_filters(report) {
+	report.page.page_form[0].querySelectorAll('.form-group.frappe-control').forEach(function setHidden(field) {
+		if (field.dataset.fieldtype == "Read Only") {
+			field.classList.add("hidden");
+		}
+	});
+}
+
+erpnext.TaxDetail = class TaxDetail {
+	constructor() {
+		this.patch();
+		this.load_report();
+	}
+	// Monkey patch the QueryReport class
+	patch() {
+		this.qr = frappe.query_report;
+		this.super = {
+			refresh_report: this.qr.refresh_report,
+			show_footer_message: this.qr.show_footer_message
+		}
+		this.qr.refresh_report = () => this.refresh_report();
+		this.qr.show_footer_message = () => this.show_footer_message();
+	}
+	show_footer_message() {
+		// The last thing to run after datatable_render in refresh()
+		this.super.show_footer_message.apply(this.qr);
+		if (this.qr.report_name !== 'Tax Detail') {
+			this.show_help();
+			if (this.loading) {
+				this.set_section('');
+			} else {
+				this.reload_component('');
+			}
+		}
+		this.loading = false;
+	}
+	refresh_report() {
+		// Infrequent report build (onload), load filters & data
+		// super function runs a refresh() serially
+		// already run within frappe.run_serially
+		this.loading = true;
+		this.super.refresh_report.apply(this.qr);
+		if (this.qr.report_name !== 'Tax Detail') {
+			frappe.call({
+				method: 'erpnext.accounts.report.tax_detail.tax_detail.get_custom_reports',
+				args: {name: this.qr.report_name}
+			}).then((r) => {
+				const data = JSON.parse(r.message[this.qr.report_name]['json']);
+				this.create_controls();
+				this.sections = data.sections || {};
+				this.controls['show_detail'].set_input(data.show_detail);
+			});
+		}
+	}
+	load_report() {
+		// One-off report build like titles, menu, etc
+		// Run when this object is created which happens in qr.load_report
+		this.qr.menu_items = this.get_menu_items();
+	}
+	get_menu_items() {
+		// Replace Save action
+		let new_items = [];
+		const save = __('Save');
+
+		for (let item of this.qr.menu_items) {
+			if (item.label === save) {
+				new_items.push({
+					label: save,
+					action: () => this.save_report(),
+					standard: false
+				});
+			} else {
+				new_items.push(item);
+			}
+		}
+		return new_items;
+	}
+	save_report() {
+		this.check_datatable();
+		if (this.qr.report_name !== 'Tax Detail') {
+			frappe.call({
+				method:'erpnext.accounts.report.tax_detail.tax_detail.save_custom_report',
+				args: {
+					reference_report: 'Tax Detail',
+					report_name: this.qr.report_name,
+					data: {
+						columns: this.qr.get_visible_columns(),
+						sections: this.sections,
+						show_detail: this.controls['show_detail'].get_input_value()
+					}
+				},
+				freeze: true
+			}).then((r) => {
+				this.set_section('');
+			});
+		}
+	}
+	check_datatable() {
+		if (!this.qr.datatable) {
+			frappe.throw(__('Please change the date range to load data first'));
+		}
+	}
+	set_section(name) {
+		// Sets the given section name and then reloads the data
+		if (name && !this.sections[name]) {
+			this.sections[name] = {};
+		}
+		let options = Object.keys(this.sections);
+		options.unshift('');
+		this.controls['section_name'].$wrapper.find("select").empty().add_options(options);
+		const org_mode = this.qr.get_filter_value('mode');
+		let refresh = false;
+		if (name) {
+			this.controls['section_name'].set_input(name);
+			this.qr.set_filter_value('mode', 'edit');
+			if (org_mode === 'run') {
+				refresh = true;
+			}
+		} else {
+			this.controls['section_name'].set_input('');
+			this.qr.set_filter_value('mode', 'run');
+			if (org_mode === 'edit') {
+				refresh = true;
+			}
+		}
+		if (refresh) {
+			this.qr.refresh();
+		}
+		this.reload_component('');
+	}
+	reload_component(component_name) {
+		const section_name = this.controls['section_name'].get_input_value();
+		if (section_name) {
+			const section = this.sections[section_name];
+			const component_names = Object.keys(section);
+			component_names.unshift('');
+			this.controls['component'].$wrapper.find("select").empty().add_options(component_names);
+			this.controls['component'].set_input(component_name);
+			if (component_name) {
+				this.controls['component_type'].set_input(section[component_name].type);
+			}
+		} else {
+			this.controls['component'].$wrapper.find("select").empty();
+			this.controls['component'].set_input('');
+		}
+		this.set_table_filters();
+	}
+	set_table_filters() {
+		let filters = {};
+		const section_name = this.controls['section_name'].get_input_value();
+		const component_name = this.controls['component'].get_input_value();
+		if (section_name && component_name) {
+			const component_type = this.sections[section_name][component_name].type;
+			if (component_type === 'filter') {
+				filters = this.sections[section_name][component_name]['filters'];
+			}
+		}
+		this.setAppliedFilters(filters);
+	}
+	setAppliedFilters(filters) {
+		if (this.qr.datatable) {
+			Array.from(this.qr.datatable.header.querySelectorAll('.dt-filter')).map(function setFilters(input) {
+				let idx = input.dataset.colIndex;
+				if (filters[idx]) {
+					input.value = filters[idx];
+				} else {
+					input.value = null;
+				}
+			});
+			this.qr.datatable.columnmanager.applyFilter(filters);
+		}
+	}
+	delete(name, type) {
+		if (type === 'section') {
+			delete this.sections[name];
+			const new_section = Object.keys(this.sections)[0] || '';
+			this.set_section(new_section);
+		}
+		if (type === 'component') {
+			const cur_section = this.controls['section_name'].get_input_value();
+			delete this.sections[cur_section][name];
+			this.reload_component('');
+		}
+	}
+	create_controls() {
+		let controls = {};
+		// SELECT in data.js
+		controls['section_name'] = this.qr.page.add_field({
+			label: __('Section'),
+			fieldtype: 'Select',
+			fieldname: 'section_name',
+			change: (e) => {
+				this.set_section(this.controls['section_name'].get_input_value());
+			}
+		});
+		// BUTTON in button.js
+		controls['new_section'] = this.qr.page.add_field({
+			label: __('New Section'),
+			fieldtype: 'Button',
+			fieldname: 'new_section',
+			click: () => {
+				frappe.prompt({
+					label: __('Section Name'),
+					fieldname: 'name',
+					fieldtype: 'Data'
+				}, (values) => {
+					this.set_section(values.name);
+				});
+			}
+		});
+		controls['delete_section'] = this.qr.page.add_field({
+			label: __('Delete Section'),
+			fieldtype: 'Button',
+			fieldname: 'delete_section',
+			click: () => {
+				let cur_section = this.controls['section_name'].get_input_value();
+				if (cur_section) {
+					frappe.confirm(__('Are you sure you want to delete section') + ' ' + cur_section + '?',
+					() => {this.delete(cur_section, 'section')});
+				}
+			}
+		});
+		controls['component'] = this.qr.page.add_field({
+			label: __('Component'),
+			fieldtype: 'Select',
+			fieldname: 'component',
+			change: (e) => {
+				this.reload_component(this.controls['component'].get_input_value());
+			}
+		});
+		controls['component_type'] = this.qr.page.add_field({
+			label: __('Component Type'),
+			fieldtype: 'Select',
+			fieldname: 'component_type',
+			default: 'filter',
+			options: [
+				{label: __('Filtered Row Subtotal'), value: 'filter'},
+				{label: __('Section Subtotal'), value: 'section'}
+			]
+		});
+		controls['add_component'] = this.qr.page.add_field({
+			label: __('Add Component'),
+			fieldtype: 'Button',
+			fieldname: 'add_component',
+			click: () => {
+				this.check_datatable();
+				let section_name = this.controls['section_name'].get_input_value();
+				if (section_name) {
+					const component_type = this.controls['component_type'].get_input_value();
+					let idx = 0;
+					const names = Object.keys(this.sections[section_name]);
+					if (names.length > 0) {
+						const idxs = names.map((key) => parseInt(key.match(/\d+$/)) || 0);
+						idx = Math.max(...idxs) + 1;
+					}
+					const filters = this.qr.datatable.columnmanager.getAppliedFilters();
+					if (component_type === 'filter') {
+						const name = 'Filter' + idx.toString();
+						let data = {
+							type: component_type,
+							filters: filters
+						}
+						this.sections[section_name][name] = data;
+						this.reload_component(name);
+					} else if (component_type === 'section') {
+						if (filters && Object.keys(filters).length !== 0) {
+							frappe.show_alert({
+								message: __('Column filters ignored'),
+								indicator: 'yellow'
+							});
+						}
+						let data = {
+							type: component_type
+						}
+						frappe.prompt({
+							label: __('Section'),
+							fieldname: 'section',
+							fieldtype: 'Select',
+							options: Object.keys(this.sections)
+						}, (values) => {
+							this.sections[section_name][values.section] = data;
+							this.reload_component(values.section);
+						});
+					} else {
+						frappe.throw(__('Please select the Component Type first'));
+					}
+				} else {
+					frappe.throw(__('Please select the Section first'));
+				}
+			}
+		});
+		controls['delete_component'] = this.qr.page.add_field({
+			label: __('Delete Component'),
+			fieldtype: 'Button',
+			fieldname: 'delete_component',
+			click: () => {
+				const component = this.controls['component'].get_input_value();
+				if (component) {
+					frappe.confirm(__('Are you sure you want to delete component') + ' ' + component + '?',
+					() => {this.delete(component, 'component')});
+				}
+			}
+		});
+		controls['save'] = this.qr.page.add_field({
+			label: __('Save & Run'),
+			fieldtype: 'Button',
+			fieldname: 'save',
+			click: () => {
+				this.save_report();
+			}
+		});
+		controls['show_detail'] = this.qr.page.add_field({
+			label: __('Show Detail'),
+			fieldtype: 'Check',
+			fieldname: 'show_detail',
+			default: 1
+		});
+		this.controls = controls;
+	}
+	show_help() {
+		const help = __('Your custom report is built from General Ledger Entries within the date range. You can add multiple sections to the report using the New Section button. Each component added to a section adds a subset of the data into the specified section. Beware of duplicated data rows. The Filtered Row component type saves the datatable column filters to specify the added data. The Section component type refers to the data in a previously defined section, but it cannot refer to its parent section. The Amount column is summed to give the section subtotal. Use the Show Detail box to see the data rows included in each section in the final report. Once finished, hit Save & Run. Report contributed by');
+		this.qr.$report_footer.append('<div class="col-md-12"><strong>' + __('Help') + `: </strong>${help}<a href="https://www.casesolved.co.uk"> Case Solved</a></div>`);
+	}
+}
+
+if (!window.taxdetail) {
+	window.taxdetail = new erpnext.TaxDetail();
+}
+
+function get_reports(cb) {
+	frappe.call({
+		method: 'erpnext.accounts.report.tax_detail.tax_detail.get_custom_reports',
+		freeze: true
+	}).then((r) => {
+		cb(r.message);
+	})
+}
+
+function new_report() {
+	const dialog = new frappe.ui.Dialog({
+		title: __('New Report'),
+		fields: [
+			{
+				fieldname: 'report_name',
+				label: __('Report Name'),
+				fieldtype: 'Data',
+				default: 'VAT Return'
+			}
+		],
+		primary_action_label: __('Create'),
+		primary_action: function new_report_pa(values) {
+			frappe.call({
+				method:'erpnext.accounts.report.tax_detail.tax_detail.save_custom_report',
+				args: {
+					reference_report: 'Tax Detail',
+					report_name: values.report_name,
+					data: {
+						columns: [],
+						sections: {},
+						show_detail: 1
+					}
+				},
+				freeze: true
+			}).then((r) => {
+				frappe.set_route('query-report', values.report_name);
+			});
+			dialog.hide();
+		}
+	});
+	dialog.show();
+}
+
+function load_report() {
+	get_reports(function load_report_cb(reports) {
+		const dialog = new frappe.ui.Dialog({
+			title: __('Load Report'),
+			fields: [
+				{
+					fieldname: 'report_name',
+					label: __('Report Name'),
+					fieldtype: 'Select',
+					options: Object.keys(reports)
+				}
+			],
+			primary_action_label: __('Load'),
+			primary_action: function load_report_pa(values) {
+				dialog.hide();
+				frappe.set_route('query-report', values.report_name);
+			}
+		});
+		dialog.show();
+	});
+}
diff --git a/erpnext/accounts/report/tax_detail/tax_detail.json b/erpnext/accounts/report/tax_detail/tax_detail.json
new file mode 100644
index 0000000..d52ffd0
--- /dev/null
+++ b/erpnext/accounts/report/tax_detail/tax_detail.json
@@ -0,0 +1,32 @@
+{
+ "add_total_row": 0,
+ "columns": [],
+ "creation": "2021-02-19 16:44:21.175113",
+ "disable_prepared_report": 0,
+ "disabled": 0,
+ "docstatus": 0,
+ "doctype": "Report",
+ "filters": [],
+ "idx": 0,
+ "is_standard": "Yes",
+ "modified": "2021-02-19 16:44:21.175113",
+ "modified_by": "Administrator",
+ "module": "Accounts",
+ "name": "Tax Detail",
+ "owner": "Administrator",
+ "prepared_report": 0,
+ "ref_doctype": "GL Entry",
+ "report_name": "Tax Detail",
+ "report_type": "Script Report",
+ "roles": [
+  {
+   "role": "Accounts User"
+  },
+  {
+   "role": "Accounts Manager"
+  },
+  {
+   "role": "Auditor"
+  }
+ ]
+}
\ No newline at end of file
diff --git a/erpnext/accounts/report/tax_detail/tax_detail.py b/erpnext/accounts/report/tax_detail/tax_detail.py
new file mode 100644
index 0000000..18436de
--- /dev/null
+++ b/erpnext/accounts/report/tax_detail/tax_detail.py
@@ -0,0 +1,296 @@
+# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+# Contributed by Case Solved and sponsored by Nulight Studios
+
+from __future__ import unicode_literals
+import frappe
+import json
+from frappe import _
+
+# NOTE: Payroll is implemented using Journal Entries which are included as GL Entries
+
+# field lists in multiple doctypes will be coalesced
+required_sql_fields = {
+	("GL Entry", 1): ["posting_date"],
+	("Account",): ["root_type", "account_type"],
+	("GL Entry", 2): ["account", "voucher_type", "voucher_no", "debit", "credit"],
+	("Purchase Invoice Item", "Sales Invoice Item"): ["base_net_amount", "item_tax_rate", "item_tax_template", "item_group", "item_name"],
+	("Purchase Invoice", "Sales Invoice"): ["taxes_and_charges", "tax_category"],
+}
+
+
+def execute(filters=None):
+	if not filters:
+		return [], []
+
+	fieldlist = required_sql_fields
+	fieldstr = get_fieldstr(fieldlist)
+
+	gl_entries = frappe.db.sql("""
+		select {fieldstr}
+		from `tabGL Entry` ge
+		inner join `tabAccount` a on
+			ge.account=a.name and ge.company=a.company
+		left join `tabSales Invoice` si on
+			ge.company=si.company and ge.voucher_type='Sales Invoice' and ge.voucher_no=si.name
+		left join `tabSales Invoice Item` sii on
+			a.root_type='Income' and si.name=sii.parent
+		left join `tabPurchase Invoice` pi on
+			ge.company=pi.company and ge.voucher_type='Purchase Invoice' and ge.voucher_no=pi.name
+		left join `tabPurchase Invoice Item` pii on
+			a.root_type='Expense' and pi.name=pii.parent
+		where
+			ge.company=%(company)s and
+			ge.posting_date>=%(from_date)s and
+			ge.posting_date<=%(to_date)s
+		order by ge.posting_date, ge.voucher_no
+		""".format(fieldstr=fieldstr), filters, as_dict=1)
+
+	report_data = modify_report_data(gl_entries)
+	summary = None
+	if filters['mode'] == 'run' and filters['report_name'] != 'Tax Detail':
+		report_data, summary = run_report(filters['report_name'], report_data)
+
+	# return columns, data, message, chart, report_summary
+	return get_columns(fieldlist), report_data, None, None, summary
+
+def run_report(report_name, data):
+	"Applies the sections and filters saved in the custom report"
+	report_config = json.loads(frappe.get_doc('Report', report_name).json)
+	# Columns indexed from 1 wrt colno
+	columns = report_config.get('columns')
+	sections = report_config.get('sections', {})
+	show_detail = report_config.get('show_detail', 1)
+	report = {}
+	new_data = []
+	summary = []
+	for section_name, section in sections.items():
+		report[section_name] = {'rows': [], 'subtotal': 0.0}
+		for component_name, component in section.items():
+			if component['type'] == 'filter':
+				for row in data:
+					matched = True
+					for colno, filter_string in component['filters'].items():
+						filter_field = columns[int(colno) - 1]['fieldname']
+						if not filter_match(row[filter_field], filter_string):
+							matched = False
+							break
+					if matched:
+						report[section_name]['rows'] += [row]
+						report[section_name]['subtotal'] += row['amount']
+			if component['type'] == 'section':
+				if component_name == section_name:
+					frappe.throw(_("A report component cannot refer to its parent section") + ": " + section_name)
+				try:
+					report[section_name]['rows'] += report[component_name]['rows']
+					report[section_name]['subtotal'] += report[component_name]['subtotal']
+				except KeyError:
+					frappe.throw(_("A report component can only refer to an earlier section") + ": " + section_name)
+
+		if show_detail:
+			new_data += report[section_name]['rows']
+		new_data += [{'voucher_no': section_name, 'amount': report[section_name]['subtotal']}]
+		summary += [{'label': section_name, 'datatype': 'Currency', 'value': report[section_name]['subtotal']}]
+		if show_detail:
+			new_data += [{}]
+	return new_data or data, summary or None
+
+def filter_match(value, string):
+	"Approximation to datatable filters"
+	import datetime
+	if string == '':
+		return True
+	if value is None:
+		value = -999999999999999
+	elif isinstance(value, datetime.date):
+		return True
+
+	if isinstance(value, str):
+		value = value.lower()
+		string = string.lower()
+		if string[0] == '<':
+			return True if string[1:].strip() else False
+		elif string[0] == '>':
+			return False if string[1:].strip() else True
+		elif string[0] == '=':
+			return string[1:] in value if string[1:] else False
+		elif string[0:2] == '!=':
+			return string[2:] not in value
+		elif len(string.split(':')) == 2:
+			pre, post = string.split(':')
+			return (True if not pre.strip() and post.strip() in value else False)
+		else:
+			return string in value
+	else:
+		if string[0] in ['<', '>', '=']:
+			operator = string[0]
+			if operator == '=':
+				operator = '=='
+			string = string[1:].strip()
+		elif string[0:2] == '!=':
+			operator = '!='
+			string = string[2:].strip()
+		elif len(string.split(':')) == 2:
+			pre, post = string.split(':')
+			try:
+				return (True if float(pre) <= value and float(post) >= value else False)
+			except ValueError:
+				return (False if pre.strip() else True)
+		else:
+			return string in str(value)
+
+	try:
+		num = float(string) if string.strip() else 0
+		return frappe.safe_eval(f'{value} {operator} {num}')
+	except ValueError:
+		if operator == '<':
+			return True
+		return False
+
+
+def abbrev(dt):
+	return ''.join(l[0].lower() for l in dt.split(' ')) + '.'
+
+def doclist(dt, dfs):
+	return [abbrev(dt) + f for f in dfs]
+
+def as_split(fields):
+	for field in fields:
+		split = field.split(' as ')
+		yield (split[0], split[1] if len(split) > 1 else split[0])
+
+def coalesce(doctypes, fields):
+	coalesce = []
+	for name, new_name in as_split(fields):
+		sharedfields = ', '.join(abbrev(dt) + name for dt in doctypes)
+		coalesce += [f'coalesce({sharedfields}) as {new_name}']
+	return coalesce
+
+def get_fieldstr(fieldlist):
+	fields = []
+	for doctypes, docfields in fieldlist.items():
+		if len(doctypes) == 1 or isinstance(doctypes[1], int):
+			fields += doclist(doctypes[0], docfields)
+		else:
+			fields += coalesce(doctypes, docfields)
+	return ', '.join(fields)
+
+def get_columns(fieldlist):
+	columns = {}
+	for doctypes, docfields in fieldlist.items():
+		fieldmap = {name: new_name for name, new_name in as_split(docfields)}
+		for doctype in doctypes:
+			if isinstance(doctype, int):
+				break
+			meta = frappe.get_meta(doctype)
+			# get column field metadata from the db
+			fieldmeta = {}
+			for field in meta.get('fields'):
+				if field.fieldname in fieldmap.keys():
+					new_name = fieldmap[field.fieldname]
+					fieldmeta[new_name] = {
+						"label": _(field.label),
+						"fieldname": new_name,
+						"fieldtype": field.fieldtype,
+						"options": field.options
+					}
+			# edit the columns to match the modified data
+			for field in fieldmap.values():
+				col = modify_report_columns(doctype, field, fieldmeta[field])
+				if col:
+					columns[col["fieldname"]] = col
+	# use of a dict ensures duplicate columns are removed
+	return list(columns.values())
+
+def modify_report_columns(doctype, field, column):
+	"Because data is rearranged into other columns"
+	if doctype in ["Sales Invoice Item", "Purchase Invoice Item"]:
+		if field in ["item_tax_rate", "base_net_amount"]:
+			return None
+
+	if doctype == "GL Entry" and field in ["debit", "credit"]:
+		column.update({"label": _("Amount"), "fieldname": "amount"})
+
+	if field == "taxes_and_charges":
+		column.update({"label": _("Taxes and Charges Template")})
+	return column
+
+def modify_report_data(data):
+	import json
+	new_data = []
+	for line in data:
+		if line.debit:
+			line.amount = -line.debit
+		else:
+			line.amount = line.credit
+		# Remove Invoice GL Tax Entries and generate Tax entries from the invoice lines
+		if "Invoice" in line.voucher_type:
+			if line.account_type not in ("Tax", "Round Off"):
+				new_data += [line]
+				if line.item_tax_rate:
+					tax_rates = json.loads(line.item_tax_rate)
+					for account, rate in tax_rates.items():
+						tax_line = line.copy()
+						tax_line.account_type = "Tax"
+						tax_line.account = account
+						if line.voucher_type == "Sales Invoice":
+							line.amount = line.base_net_amount
+							tax_line.amount = line.base_net_amount * (rate / 100)
+						if line.voucher_type == "Purchase Invoice":
+							line.amount = -line.base_net_amount
+							tax_line.amount = -line.base_net_amount * (rate / 100)
+						new_data += [tax_line]
+		else:
+			new_data += [line]
+	return new_data
+
+
+# JS client utilities
+
+custom_report_dict = {
+	'ref_doctype': 'GL Entry',
+	'report_type': 'Custom Report',
+	'reference_report': 'Tax Detail'
+}
+
+@frappe.whitelist()
+def get_custom_reports(name=None):
+	filters = custom_report_dict.copy()
+	if name:
+		filters['name'] = name
+	reports = frappe.get_list('Report',
+		filters = filters,
+		fields = ['name', 'json'],
+		as_list=False
+	)
+	reports_dict = {rep.pop('name'): rep for rep in reports}
+	# Prevent custom reports with the same name
+	reports_dict['Tax Detail'] = {'json': None}
+	return reports_dict
+
+@frappe.whitelist()
+def save_custom_report(reference_report, report_name, data):
+	if reference_report != 'Tax Detail':
+		frappe.throw(_("The wrong report is referenced."))
+	if report_name == 'Tax Detail':
+		frappe.throw(_("The parent report cannot be overwritten."))
+
+	doc = {
+		'doctype': 'Report',
+		'report_name': report_name,
+		'is_standard': 'No',
+		'module': 'Accounts',
+		'json': data
+	}
+	doc.update(custom_report_dict)
+
+	try:
+		newdoc = frappe.get_doc(doc)
+		newdoc.insert()
+		frappe.msgprint(_("Report created successfully"))
+	except frappe.exceptions.DuplicateEntryError:
+		dbdoc = frappe.get_doc('Report', report_name)
+		dbdoc.update(doc)
+		dbdoc.save()
+		frappe.msgprint(_("Report updated successfully"))
+	return report_name
diff --git a/erpnext/accounts/report/tax_detail/test_tax_detail.json b/erpnext/accounts/report/tax_detail/test_tax_detail.json
new file mode 100644
index 0000000..3a4b175
--- /dev/null
+++ b/erpnext/accounts/report/tax_detail/test_tax_detail.json
@@ -0,0 +1,840 @@
+[
+ {
+  "account_manager": null,
+  "accounts": [],
+  "companies": [],
+  "credit_limits": [],
+  "customer_details": null,
+  "customer_group": "All Customer Groups",
+  "customer_name": "_Test Customer",
+  "customer_pos_id": null,
+  "customer_primary_address": null,
+  "customer_primary_contact": null,
+  "customer_type": "Company",
+  "default_bank_account": null,
+  "default_commission_rate": 0.0,
+  "default_currency": null,
+  "default_price_list": null,
+  "default_sales_partner": null,
+  "disabled": 0,
+  "dn_required": 0,
+  "docstatus": 0,
+  "doctype": "Customer",
+  "email_id": null,
+  "gender": null,
+  "image": null,
+  "industry": null,
+  "is_frozen": 0,
+  "is_internal_customer": 0,
+  "language": "en",
+  "lead_name": null,
+  "loyalty_program": null,
+  "loyalty_program_tier": null,
+  "market_segment": null,
+  "mobile_no": null,
+  "modified": "2021-02-15 05:18:03.624724",
+  "name": "_Test Customer",
+  "naming_series": "CUST-.YYYY.-",
+  "pan": null,
+  "parent": null,
+  "parentfield": null,
+  "parenttype": null,
+  "payment_terms": null,
+  "primary_address": null,
+  "represents_company": "",
+  "sales_team": [],
+  "salutation": null,
+  "so_required": 0,
+  "tax_category": null,
+  "tax_id": null,
+  "tax_withholding_category": null,
+  "territory": "All Territories",
+  "website": null
+ },{
+  "accounts": [],
+  "allow_purchase_invoice_creation_without_purchase_order": 0,
+  "allow_purchase_invoice_creation_without_purchase_receipt": 0,
+  "companies": [],
+  "country": "United Kingdom",
+  "default_bank_account": null,
+  "default_currency": null,
+  "default_price_list": null,
+  "disabled": 0,
+  "docstatus": 0,
+  "doctype": "Supplier",
+  "hold_type": "",
+  "image": null,
+  "is_frozen": 0,
+  "is_internal_supplier": 0,
+  "is_transporter": 0,
+  "language": "en",
+  "modified": "2021-03-31 16:47:10.109316",
+  "name": "_Test Supplier",
+  "naming_series": "SUP-.YYYY.-",
+  "on_hold": 0,
+  "pan": null,
+  "parent": null,
+  "parentfield": null,
+  "parenttype": null,
+  "payment_terms": null,
+  "prevent_pos": 0,
+  "prevent_rfqs": 0,
+  "release_date": null,
+  "represents_company": null,
+  "supplier_details": null,
+  "supplier_group": "Raw Material",
+  "supplier_name": "_Test Supplier",
+  "supplier_type": "Company",
+  "tax_category": null,
+  "tax_id": null,
+  "tax_withholding_category": null,
+  "warn_pos": 0,
+  "warn_rfqs": 0,
+  "website": null
+ },{
+  "account_currency": "GBP",
+  "account_name": "Debtors",
+  "account_number": "",
+  "account_type": "Receivable",
+  "balance_must_be": "",
+  "company": "_T",
+  "disabled": 0,
+  "docstatus": 0,
+  "doctype": "Account",
+  "freeze_account": "No",
+  "include_in_gross": 0,
+  "inter_company_account": 0,
+  "is_group": 0,
+  "lft": 58,
+  "modified": "2021-03-26 04:44:19.955468",
+  "name": "Debtors - _T",
+  "old_parent": null,
+  "parent": null,
+  "parent_account": "Application of Funds (Assets) - _T",
+  "parentfield": null,
+  "parenttype": null,
+  "report_type": "Balance Sheet",
+  "rgt": 59,
+  "root_type": "Asset",
+  "tax_rate": 0.0
+ },{
+  "account_currency": "GBP",
+  "account_name": "Sales",
+  "account_number": "",
+  "account_type": "Income Account",
+  "balance_must_be": "",
+  "company": "_T",
+  "disabled": 0,
+  "docstatus": 0,
+  "doctype": "Account",
+  "freeze_account": "No",
+  "include_in_gross": 0,
+  "inter_company_account": 0,
+  "is_group": 0,
+  "lft": 291,
+  "modified": "2021-03-26 04:50:21.697703",
+  "name": "Sales - _T",
+  "old_parent": null,
+  "parent": null,
+  "parent_account": "Income - _T",
+  "parentfield": null,
+  "parenttype": null,
+  "report_type": "Profit and Loss",
+  "rgt": 292,
+  "root_type": "Income",
+  "tax_rate": 0.0
+ },{
+  "account_currency": "GBP",
+  "account_name": "VAT on Sales",
+  "account_number": "",
+  "account_type": "Tax",
+  "balance_must_be": "",
+  "company": "_T",
+  "disabled": 0,
+  "docstatus": 0,
+  "doctype": "Account",
+  "freeze_account": "No",
+  "include_in_gross": 0,
+  "inter_company_account": 0,
+  "is_group": 0,
+  "lft": 317,
+  "modified": "2021-03-26 04:50:21.697703",
+  "name": "VAT on Sales - _T",
+  "old_parent": null,
+  "parent": null,
+  "parent_account": "Source of Funds (Liabilities) - _T",
+  "parentfield": null,
+  "parenttype": null,
+  "report_type": "Balance Sheet",
+  "rgt": 318,
+  "root_type": "Liability",
+  "tax_rate": 0.0
+ },{
+  "account_currency": "GBP",
+  "account_name": "Cost of Goods Sold",
+  "account_number": "",
+  "account_type": "Cost of Goods Sold",
+  "balance_must_be": "",
+  "company": "_T",
+  "disabled": 0,
+  "docstatus": 0,
+  "doctype": "Account",
+  "freeze_account": "No",
+  "include_in_gross": 0,
+  "inter_company_account": 0,
+  "is_group": 0,
+  "lft": 171,
+  "modified": "2021-03-26 04:44:19.994857",
+  "name": "Cost of Goods Sold - _T",
+  "old_parent": null,
+  "parent": null,
+  "parent_account": "Expenses - _T",
+  "parentfield": null,
+  "parenttype": null,
+  "report_type": "Profit and Loss",
+  "rgt": 172,
+  "root_type": "Expense",
+  "tax_rate": 0.0
+ },{
+  "account_currency": "GBP",
+  "account_name": "VAT on Purchases",
+  "account_number": "",
+  "account_type": "Tax",
+  "balance_must_be": "",
+  "company": "_T",
+  "disabled": 0,
+  "docstatus": 0,
+  "doctype": "Account",
+  "freeze_account": "No",
+  "include_in_gross": 0,
+  "inter_company_account": 0,
+  "is_group": 0,
+  "lft": 80,
+  "modified": "2021-03-26 04:44:19.961983",
+  "name": "VAT on Purchases - _T",
+  "old_parent": null,
+  "parent": null,
+  "parent_account": "Application of Funds (Assets) - _T",
+  "parentfield": null,
+  "parenttype": null,
+  "report_type": "Balance Sheet",
+  "rgt": 81,
+  "root_type": "Asset",
+  "tax_rate": 0.0
+ },{
+  "account_currency": "GBP",
+  "account_name": "Creditors",
+  "account_number": "",
+  "account_type": "Payable",
+  "balance_must_be": "",
+  "company": "_T",
+  "disabled": 0,
+  "docstatus": 0,
+  "doctype": "Account",
+  "freeze_account": "No",
+  "include_in_gross": 0,
+  "inter_company_account": 0,
+  "is_group": 0,
+  "lft": 302,
+  "modified": "2021-03-26 04:50:21.697703",
+  "name": "Creditors - _T",
+  "old_parent": null,
+  "parent": null,
+  "parent_account": "Source of Funds (Liabilities) - _T",
+  "parentfield": null,
+  "parenttype": null,
+  "report_type": "Balance Sheet",
+  "rgt": 303,
+  "root_type": "Liability",
+  "tax_rate": 0.0
+ },{
+  "additional_discount_percentage": 0.0,
+  "address_display": null,
+  "adjust_advance_taxes": 0,
+  "advances": [],
+  "against_expense_account": "Cost of Goods Sold - _T",
+  "allocate_advances_automatically": 0,
+  "amended_from": null,
+  "apply_discount_on": "Grand Total",
+  "apply_tds": 0,
+  "auto_repeat": null,
+  "base_discount_amount": 0.0,
+  "base_grand_total": 511.68,
+  "base_in_words": "GBP Five Hundred And Eleven and Sixty Eight Pence only.",
+  "base_net_total": 426.4,
+  "base_paid_amount": 0.0,
+  "base_rounded_total": 511.68,
+  "base_rounding_adjustment": 0.0,
+  "base_taxes_and_charges_added": 85.28,
+  "base_taxes_and_charges_deducted": 0.0,
+  "base_total": 426.4,
+  "base_total_taxes_and_charges": 85.28,
+  "base_write_off_amount": 0.0,
+  "bill_date": null,
+  "bill_no": null,
+  "billing_address": null,
+  "billing_address_display": null,
+  "buying_price_list": "Standard Buying",
+  "cash_bank_account": null,
+  "clearance_date": null,
+  "company": "_T",
+  "contact_display": null,
+  "contact_email": null,
+  "contact_mobile": null,
+  "contact_person": null,
+  "conversion_rate": 1.0,
+  "cost_center": null,
+  "credit_to": "Creditors - _T",
+  "currency": "GBP",
+  "disable_rounded_total": 0,
+  "discount_amount": 0.0,
+  "docstatus": 0,
+  "doctype": "Purchase Invoice",
+  "due_date": null,
+  "from_date": null,
+  "grand_total": 511.68,
+  "group_same_items": 0,
+  "hold_comment": null,
+  "ignore_pricing_rule": 0,
+  "in_words": "GBP Five Hundred And Eleven and Sixty Eight Pence only.",
+  "inter_company_invoice_reference": null,
+  "is_internal_supplier": 0,
+  "is_opening": "No",
+  "is_paid": 0,
+  "is_return": 0,
+  "is_subcontracted": "No",
+  "items": [
+   {
+    "allow_zero_valuation_rate": 0,
+    "amount": 426.4,
+    "asset_category": null,
+    "asset_location": null,
+    "base_amount": 426.4,
+    "base_net_amount": 426.4,
+    "base_net_rate": 5.33,
+    "base_price_list_rate": 5.33,
+    "base_rate": 5.33,
+    "base_rate_with_margin": 0.0,
+    "batch_no": null,
+    "bom": null,
+    "brand": null,
+    "conversion_factor": 0.0,
+    "cost_center": "Main - _T",
+    "deferred_expense_account": null,
+    "description": "<div class=\"ql-editor read-mode\"><p>Fluid to make widgets</p></div>",
+    "discount_amount": 0.0,
+    "discount_percentage": 0.0,
+    "enable_deferred_expense": 0,
+    "expense_account": "Cost of Goods Sold - _T",
+    "from_warehouse": null,
+    "image": null,
+    "include_exploded_items": 0,
+    "is_fixed_asset": 0,
+    "is_free_item": 0,
+    "item_code": null,
+    "item_group": null,
+    "item_name": "Widget Fluid 1Litre",
+    "item_tax_amount": 0.0,
+    "item_tax_rate": "{\"VAT on Purchases - _T\": 20.0}",
+    "item_tax_template": null,
+    "landed_cost_voucher_amount": 0.0,
+    "manufacturer": null,
+    "manufacturer_part_no": null,
+    "margin_rate_or_amount": 0.0,
+    "margin_type": "",
+    "net_amount": 426.4,
+    "net_rate": 5.33,
+    "page_break": 0,
+    "parent": null,
+    "parentfield": "items",
+    "parenttype": "Purchase Invoice",
+    "po_detail": null,
+    "pr_detail": null,
+    "price_list_rate": 5.33,
+    "pricing_rules": null,
+    "project": null,
+    "purchase_invoice_item": null,
+    "purchase_order": null,
+    "purchase_receipt": null,
+    "qty": 80.0,
+    "quality_inspection": null,
+    "rate": 5.33,
+    "rate_with_margin": 0.0,
+    "received_qty": 0.0,
+    "rejected_qty": 0.0,
+    "rejected_serial_no": null,
+    "rejected_warehouse": null,
+    "rm_supp_cost": 0.0,
+    "sales_invoice_item": null,
+    "serial_no": null,
+    "service_end_date": null,
+    "service_start_date": null,
+    "service_stop_date": null,
+    "stock_qty": 0.0,
+    "stock_uom": "Nos",
+    "stock_uom_rate": 0.0,
+    "total_weight": 0.0,
+    "uom": "Nos",
+    "valuation_rate": 0.0,
+    "warehouse": null,
+    "weight_per_unit": 0.0,
+    "weight_uom": null
+   }
+  ],
+  "language": "en",
+  "letter_head": null,
+  "mode_of_payment": null,
+  "modified": "2021-04-03 03:33:09.180453",
+  "name": null,
+  "naming_series": "ACC-PINV-.YYYY.-",
+  "net_total": 426.4,
+  "on_hold": 0,
+  "other_charges_calculation": "<div class=\"tax-break-up\" style=\"overflow-x: auto;\">\n\t<table class=\"table table-bordered table-hover\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t<th class=\"text-left\">Item</th>\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t<th class=\"text-right\">Taxable Amount</th>\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t<th class=\"text-right\">VAT on Purchases</th>\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t\n\t\t\t\t<tr>\n\t\t\t\t\t<td>Widget Fluid 1Litre</td>\n\t\t\t\t\t<td class='text-right'>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\u00a3 426.40\n\t\t\t\t\t\t\n\t\t\t\t\t</td>\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t<td class='text-right'>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t(20.0%)\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\u00a3 85.28\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t</tr>\n\t\t\t\n\t\t</tbody>\n\t</table>\n</div>",
+  "outstanding_amount": 511.68,
+  "paid_amount": 0.0,
+  "parent": null,
+  "parentfield": null,
+  "parenttype": null,
+  "party_account_currency": "GBP",
+  "payment_schedule": [],
+  "payment_terms_template": null,
+  "plc_conversion_rate": 1.0,
+  "posting_date": null,
+  "posting_time": "16:59:56.789522",
+  "price_list_currency": "GBP",
+  "pricing_rules": [],
+  "project": null,
+  "rejected_warehouse": null,
+  "release_date": null,
+  "remarks": "No Remarks",
+  "represents_company": null,
+  "return_against": null,
+  "rounded_total": 511.68,
+  "rounding_adjustment": 0.0,
+  "scan_barcode": null,
+  "select_print_heading": null,
+  "set_from_warehouse": null,
+  "set_posting_time": 0,
+  "set_warehouse": null,
+  "shipping_address": null,
+  "shipping_address_display": "",
+  "shipping_rule": null,
+  "status": "Unpaid",
+  "supplied_items": [],
+  "supplier": "_Test Supplier",
+  "supplier_address": null,
+  "supplier_name": "_Test Supplier",
+  "supplier_warehouse": "Stores - _T",
+  "tax_category": null,
+  "tax_id": null,
+  "tax_withholding_category": null,
+  "taxes": [
+   {
+    "account_head": "VAT on Purchases - _T",
+    "add_deduct_tax": "Add",
+    "base_tax_amount": 85.28,
+    "base_tax_amount_after_discount_amount": 85.28,
+    "base_total": 511.68,
+    "category": "Total",
+    "charge_type": "On Net Total",
+    "cost_center": "Main - _T",
+    "description": "VAT on Purchases",
+    "included_in_print_rate": 0,
+    "item_wise_tax_detail": "{\"Widget Fluid 1Litre\":[20.0,85.28]}",
+    "parent": null,
+    "parentfield": "taxes",
+    "parenttype": "Purchase Invoice",
+    "rate": 0.0,
+    "row_id": null,
+    "tax_amount": 85.28,
+    "tax_amount_after_discount_amount": 85.28,
+    "total": 511.68
+   }
+  ],
+  "taxes_and_charges": null,
+  "taxes_and_charges_added": 85.28,
+  "taxes_and_charges_deducted": 0.0,
+  "tc_name": null,
+  "terms": null,
+  "title": "_Purchase Invoice",
+  "to_date": null,
+  "total": 426.4,
+  "total_advance": 0.0,
+  "total_net_weight": 0.0,
+  "total_qty": 80.0,
+  "total_taxes_and_charges": 85.28,
+  "unrealized_profit_loss_account": null,
+  "update_stock": 0,
+  "write_off_account": null,
+  "write_off_amount": 0.0,
+  "write_off_cost_center": null
+ },{
+  "account_for_change_amount": null,
+  "additional_discount_percentage": 0.0,
+  "address_display": null,
+  "advances": [],
+  "against_income_account": "Sales - _T",
+  "allocate_advances_automatically": 0,
+  "amended_from": null,
+  "apply_discount_on": "Grand Total",
+  "auto_repeat": null,
+  "base_change_amount": 0.0,
+  "base_discount_amount": 0.0,
+  "base_grand_total": 868.25,
+  "base_in_words": "GBP Eight Hundred And Sixty Eight and Twenty Five Pence only.",
+  "base_net_total": 825.0,
+  "base_paid_amount": 0.0,
+  "base_rounded_total": 868.25,
+  "base_rounding_adjustment": 0.0,
+  "base_total": 825.0,
+  "base_total_taxes_and_charges": 43.25,
+  "base_write_off_amount": 0.0,
+  "c_form_applicable": "No",
+  "c_form_no": null,
+  "campaign": null,
+  "cash_bank_account": null,
+  "change_amount": 0.0,
+  "commission_rate": 0.0,
+  "company": "_T",
+  "company_address": null,
+  "company_address_display": null,
+  "company_tax_id": null,
+  "contact_display": null,
+  "contact_email": null,
+  "contact_mobile": null,
+  "contact_person": null,
+  "conversion_rate": 1.0,
+  "cost_center": null,
+  "currency": "GBP",
+  "customer": "_Test Customer",
+  "customer_address": null,
+  "customer_group": "All Customer Groups",
+  "customer_name": "_Test Customer",
+  "debit_to": "Debtors - _T",
+  "discount_amount": 0.0,
+  "docstatus": 0,
+  "doctype": "Sales Invoice",
+  "due_date": null,
+  "from_date": null,
+  "grand_total": 868.25,
+  "group_same_items": 0,
+  "ignore_pricing_rule": 0,
+  "in_words": "GBP Eight Hundred And Sixty Eight and Twenty Five Pence only.",
+  "inter_company_invoice_reference": null,
+  "is_consolidated": 0,
+  "is_discounted": 0,
+  "is_internal_customer": 0,
+  "is_opening": "No",
+  "is_pos": 0,
+  "is_return": 0,
+  "items": [
+   {
+    "actual_batch_qty": 0.0,
+    "actual_qty": 0.0,
+    "allow_zero_valuation_rate": 0,
+    "amount": 200.0,
+    "asset": null,
+    "barcode": null,
+    "base_amount": 200.0,
+    "base_net_amount": 200.0,
+    "base_net_rate": 50.0,
+    "base_price_list_rate": 0.0,
+    "base_rate": 50.0,
+    "base_rate_with_margin": 0.0,
+    "batch_no": null,
+    "brand": null,
+    "conversion_factor": 1.0,
+    "cost_center": "Main - _T",
+    "customer_item_code": null,
+    "deferred_revenue_account": null,
+    "delivered_by_supplier": 0,
+    "delivered_qty": 0.0,
+    "delivery_note": null,
+    "description": "<div class=\"ql-editor read-mode\"><p>Used</p></div>",
+    "discount_amount": 0.0,
+    "discount_percentage": 0.0,
+    "dn_detail": null,
+    "enable_deferred_revenue": 0,
+    "expense_account": null,
+    "finance_book": null,
+    "image": null,
+    "income_account": "Sales - _T",
+    "incoming_rate": 0.0,
+    "is_fixed_asset": 0,
+    "is_free_item": 0,
+    "item_code": null,
+    "item_group": null,
+    "item_name": "Dunlop tyres",
+    "item_tax_rate": "{\"VAT on Sales - _T\": 20.0}",
+    "item_tax_template": null,
+    "margin_rate_or_amount": 0.0,
+    "margin_type": "",
+    "net_amount": 200.0,
+    "net_rate": 50.0,
+    "page_break": 0,
+    "parent": null,
+    "parentfield": "items",
+    "parenttype": "Sales Invoice",
+    "price_list_rate": 0.0,
+    "pricing_rules": null,
+    "project": null,
+    "qty": 4.0,
+    "quality_inspection": null,
+    "rate": 50.0,
+    "rate_with_margin": 0.0,
+    "sales_invoice_item": null,
+    "sales_order": null,
+    "serial_no": null,
+    "service_end_date": null,
+    "service_start_date": null,
+    "service_stop_date": null,
+    "so_detail": null,
+    "stock_qty": 4.0,
+    "stock_uom": "Nos",
+    "stock_uom_rate": 50.0,
+    "target_warehouse": null,
+    "total_weight": 0.0,
+    "uom": "Nos",
+    "warehouse": null,
+    "weight_per_unit": 0.0,
+    "weight_uom": null
+   },
+   {
+    "actual_batch_qty": 0.0,
+    "actual_qty": 0.0,
+    "allow_zero_valuation_rate": 0,
+    "amount": 65.0,
+    "asset": null,
+    "barcode": null,
+    "base_amount": 65.0,
+    "base_net_amount": 65.0,
+    "base_net_rate": 65.0,
+    "base_price_list_rate": 0.0,
+    "base_rate": 65.0,
+    "base_rate_with_margin": 0.0,
+    "batch_no": null,
+    "brand": null,
+    "conversion_factor": 1.0,
+    "cost_center": "Main - _T",
+    "customer_item_code": null,
+    "deferred_revenue_account": null,
+    "delivered_by_supplier": 0,
+    "delivered_qty": 0.0,
+    "delivery_note": null,
+    "description": "<div class=\"ql-editor read-mode\"><p>Used</p></div>",
+    "discount_amount": 0.0,
+    "discount_percentage": 0.0,
+    "dn_detail": null,
+    "enable_deferred_revenue": 0,
+    "expense_account": null,
+    "finance_book": null,
+    "image": null,
+    "income_account": "Sales - _T",
+    "incoming_rate": 0.0,
+    "is_fixed_asset": 0,
+    "is_free_item": 0,
+    "item_code": "",
+    "item_group": null,
+    "item_name": "Continental tyres",
+    "item_tax_rate": "{\"VAT on Sales - _T\": 5.0}",
+    "item_tax_template": null,
+    "margin_rate_or_amount": 0.0,
+    "margin_type": "",
+    "net_amount": 65.0,
+    "net_rate": 65.0,
+    "page_break": 0,
+    "parent": null,
+    "parentfield": "items",
+    "parenttype": "Sales Invoice",
+    "price_list_rate": 0.0,
+    "pricing_rules": null,
+    "project": null,
+    "qty": 1.0,
+    "quality_inspection": null,
+    "rate": 65.0,
+    "rate_with_margin": 0.0,
+    "sales_invoice_item": null,
+    "sales_order": null,
+    "serial_no": null,
+    "service_end_date": null,
+    "service_start_date": null,
+    "service_stop_date": null,
+    "so_detail": null,
+    "stock_qty": 1.0,
+    "stock_uom": null,
+    "stock_uom_rate": 65.0,
+    "target_warehouse": null,
+    "total_weight": 0.0,
+    "uom": "Nos",
+    "warehouse": null,
+    "weight_per_unit": 0.0,
+    "weight_uom": null
+   },
+   {
+    "actual_batch_qty": 0.0,
+    "actual_qty": 0.0,
+    "allow_zero_valuation_rate": 0,
+    "amount": 560.0,
+    "asset": null,
+    "barcode": null,
+    "base_amount": 560.0,
+    "base_net_amount": 560.0,
+    "base_net_rate": 70.0,
+    "base_price_list_rate": 0.0,
+    "base_rate": 70.0,
+    "base_rate_with_margin": 0.0,
+    "batch_no": null,
+    "brand": null,
+    "conversion_factor": 1.0,
+    "cost_center": "Main - _T",
+    "customer_item_code": null,
+    "deferred_revenue_account": null,
+    "delivered_by_supplier": 0,
+    "delivered_qty": 0.0,
+    "delivery_note": null,
+    "description": "<div class=\"ql-editor read-mode\"><p>New</p></div>",
+    "discount_amount": 0.0,
+    "discount_percentage": 0.0,
+    "dn_detail": null,
+    "enable_deferred_revenue": 0,
+    "expense_account": null,
+    "finance_book": null,
+    "image": null,
+    "income_account": "Sales - _T",
+    "incoming_rate": 0.0,
+    "is_fixed_asset": 0,
+    "is_free_item": 0,
+    "item_code": null,
+    "item_group": null,
+    "item_name": "Toyo tyres",
+    "item_tax_rate": "{\"VAT on Sales - _T\": 0.0}",
+    "item_tax_template": null,
+    "margin_rate_or_amount": 0.0,
+    "margin_type": "",
+    "net_amount": 560.0,
+    "net_rate": 70.0,
+    "page_break": 0,
+    "parent": null,
+    "parentfield": "items",
+    "parenttype": "Sales Invoice",
+    "price_list_rate": 0.0,
+    "pricing_rules": null,
+    "project": null,
+    "qty": 8.0,
+    "quality_inspection": null,
+    "rate": 70.0,
+    "rate_with_margin": 0.0,
+    "sales_invoice_item": null,
+    "sales_order": null,
+    "serial_no": null,
+    "service_end_date": null,
+    "service_start_date": null,
+    "service_stop_date": null,
+    "so_detail": null,
+    "stock_qty": 8.0,
+    "stock_uom": null,
+    "stock_uom_rate": 70.0,
+    "target_warehouse": null,
+    "total_weight": 0.0,
+    "uom": "Nos",
+    "warehouse": null,
+    "weight_per_unit": 0.0,
+    "weight_uom": null
+   }
+  ],
+  "language": "en",
+  "letter_head": null,
+  "loyalty_amount": 0.0,
+  "loyalty_points": 0,
+  "loyalty_program": null,
+  "loyalty_redemption_account": null,
+  "loyalty_redemption_cost_center": null,
+  "modified": "2021-02-16 05:18:59.755144",
+  "name": null,
+  "naming_series": "ACC-SINV-.YYYY.-",
+  "net_total": 825.0,
+  "other_charges_calculation": "<div class=\"tax-break-up\" style=\"overflow-x: auto;\">\n\t<table class=\"table table-bordered table-hover\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t<th class=\"text-left\">Item</th>\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t<th class=\"text-right\">Taxable Amount</th>\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t<th class=\"text-right\">VAT on Sales</th>\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t\n\t\t\t\t<tr>\n\t\t\t\t\t<td>Dunlop tyres</td>\n\t\t\t\t\t<td class='text-right'>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\u00a3 200.00\n\t\t\t\t\t\t\n\t\t\t\t\t</td>\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t<td class='text-right'>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t(20.0%)\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\u00a3 40.00\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t</tr>\n\t\t\t\n\t\t\t\t<tr>\n\t\t\t\t\t<td>Continental tyres</td>\n\t\t\t\t\t<td class='text-right'>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\u00a3 65.00\n\t\t\t\t\t\t\n\t\t\t\t\t</td>\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t<td class='text-right'>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t(5.0%)\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\u00a3 3.25\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t</tr>\n\t\t\t\n\t\t\t\t<tr>\n\t\t\t\t\t<td>Toyo tyres</td>\n\t\t\t\t\t<td class='text-right'>\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\u00a3 560.00\n\t\t\t\t\t\t\n\t\t\t\t\t</td>\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t<td class='text-right'>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t(0.0%)\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\u00a3 0.00\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t</tr>\n\t\t\t\n\t\t</tbody>\n\t</table>\n</div>",
+  "outstanding_amount": 868.25,
+  "packed_items": [],
+  "paid_amount": 0.0,
+  "parent": null,
+  "parentfield": null,
+  "parenttype": null,
+  "party_account_currency": "GBP",
+  "payment_schedule": [],
+  "payment_terms_template": null,
+  "payments": [],
+  "plc_conversion_rate": 1.0,
+  "po_date": null,
+  "po_no": "",
+  "pos_profile": null,
+  "posting_date": null,
+  "posting_time": "5:19:02.994077",
+  "price_list_currency": "GBP",
+  "pricing_rules": [],
+  "project": null,
+  "redeem_loyalty_points": 0,
+  "remarks": "No Remarks",
+  "represents_company": "",
+  "return_against": null,
+  "rounded_total": 868.25,
+  "rounding_adjustment": 0.0,
+  "sales_partner": null,
+  "sales_team": [],
+  "scan_barcode": null,
+  "select_print_heading": null,
+  "selling_price_list": "Standard Selling",
+  "set_posting_time": 0,
+  "set_target_warehouse": null,
+  "set_warehouse": null,
+  "shipping_address": null,
+  "shipping_address_name": "",
+  "shipping_rule": null,
+  "source": null,
+  "status": "Overdue",
+  "tax_category": "",
+  "tax_id": null,
+  "taxes": [
+   {
+    "account_head": "VAT on Sales - _T",
+    "base_tax_amount": 43.25,
+    "base_tax_amount_after_discount_amount": 43.25,
+    "base_total": 868.25,
+    "charge_type": "On Net Total",
+    "cost_center": "Main - _T",
+    "description": "VAT on Sales",
+    "included_in_print_rate": 0,
+    "item_wise_tax_detail": "{\"Dunlop tyres\":[20.0,40.0],\"Continental tyres\":[5.0,3.25],\"Toyo tyres\":[0.0,0.0]}",
+    "parent": null,
+    "parentfield": "taxes",
+    "parenttype": "Sales Invoice",
+    "rate": 0.0,
+    "row_id": null,
+    "tax_amount": 43.25,
+    "tax_amount_after_discount_amount": 43.25,
+    "total": 868.25
+   }
+  ],
+  "taxes_and_charges": null,
+  "tc_name": null,
+  "terms": null,
+  "territory": "All Territories",
+  "timesheets": [],
+  "title": "_Sales Invoice",
+  "to_date": null,
+  "total": 825.0,
+  "total_advance": 0.0,
+  "total_billing_amount": 0.0,
+  "total_commission": 0.0,
+  "total_net_weight": 0.0,
+  "total_qty": 13.0,
+  "total_taxes_and_charges": 43.25,
+  "unrealized_profit_loss_account": null,
+  "update_billed_amount_in_sales_order": 0,
+  "update_stock": 0,
+  "write_off_account": null,
+  "write_off_amount": 0.0,
+  "write_off_cost_center": null,
+  "write_off_outstanding_amount_automatically": 0
+ }
+]
diff --git a/erpnext/accounts/report/tax_detail/test_tax_detail.py b/erpnext/accounts/report/tax_detail/test_tax_detail.py
new file mode 100644
index 0000000..d3b8de5
--- /dev/null
+++ b/erpnext/accounts/report/tax_detail/test_tax_detail.py
@@ -0,0 +1,178 @@
+from __future__ import unicode_literals
+
+import frappe
+import unittest
+import datetime
+import json
+import os
+from frappe.utils import getdate, add_to_date, get_first_day, get_last_day, get_year_start, get_year_ending
+from .tax_detail import filter_match, save_custom_report
+
+class TestTaxDetail(unittest.TestCase):
+	def load_testdocs(self):
+		from erpnext.accounts.utils import get_fiscal_year, FiscalYearError
+		datapath, _ = os.path.splitext(os.path.realpath(__file__))
+		with open(datapath + '.json', 'r') as fp:
+			docs = json.load(fp)
+
+		now = getdate()
+		self.from_date = get_first_day(now)
+		self.to_date = get_last_day(now)
+
+		try:
+			get_fiscal_year(now, company="_T")
+		except FiscalYearError:
+			docs = [{
+				"companies": [{
+					"company": "_T",
+					"parent": "_Test Fiscal",
+					"parentfield": "companies",
+					"parenttype": "Fiscal Year"
+				}],
+				"doctype": "Fiscal Year",
+				"year": "_Test Fiscal",
+				"year_end_date": get_year_ending(now),
+				"year_start_date": get_year_start(now)
+			}] + docs
+
+		docs = [{
+			"abbr": "_T",
+			"company_name": "_T",
+			"country": "United Kingdom",
+			"default_currency": "GBP",
+			"doctype": "Company",
+			"name": "_T"
+		}] + docs
+
+		for doc in docs:
+			try:
+				db_doc = frappe.get_doc(doc)
+				if 'Invoice' in db_doc.doctype:
+					db_doc.due_date = add_to_date(now, days=1)
+					db_doc.insert()
+					# Create GL Entries:
+					db_doc.submit()
+				else:
+					db_doc.insert()
+			except frappe.exceptions.DuplicateEntryError:
+				pass
+
+	def load_defcols(self):
+		self.company = frappe.get_doc('Company', '_T')
+		custom_report = frappe.get_doc('Report', 'Tax Detail')
+		self.default_columns, _ = custom_report.run_query_report(
+			filters={
+				'from_date': '2021-03-01',
+				'to_date': '2021-03-31',
+				'company': self.company.name,
+				'mode': 'run',
+				'report_name': 'Tax Detail'
+			}, user=frappe.session.user)
+
+	def rm_testdocs(self):
+		"Remove the Company and all data"
+		from erpnext.setup.doctype.company.delete_company_transactions import delete_company_transactions
+		delete_company_transactions(self.company.name)
+		self.company.delete()
+
+
+	def test_report(self):
+		self.load_testdocs()
+		self.load_defcols()
+		report_name = save_custom_report(
+			'Tax Detail',
+			'_Test Tax Detail',
+			json.dumps({
+				'columns': self.default_columns,
+				'sections': {
+					'Box1':{'Filter0':{'type':'filter','filters':{'4':'VAT on Sales'}}},
+					'Box2':{'Filter0':{'type':'filter','filters':{'4':'Acquisition'}}},
+					'Box3':{'Box1':{'type':'section'},'Box2':{'type':'section'}},
+					'Box4':{'Filter0':{'type':'filter','filters':{'4':'VAT on Purchases'}}},
+					'Box5':{'Box3':{'type':'section'},'Box4':{'type':'section'}},
+					'Box6':{'Filter0':{'type':'filter','filters':{'3':'!=Tax','4':'Sales'}}},
+					'Box7':{'Filter0':{'type':'filter','filters':{'2':'Expense','3':'!=Tax'}}},
+					'Box8':{'Filter0':{'type':'filter','filters':{'3':'!=Tax','4':'Sales','12':'EU'}}},
+					'Box9':{'Filter0':{'type':'filter','filters':{'2':'Expense','3':'!=Tax','12':'EU'}}}
+				},
+				'show_detail': 1
+			}))
+		data = frappe.desk.query_report.run(report_name,
+			filters={
+				'from_date': self.from_date,
+				'to_date': self.to_date,
+				'company': self.company.name,
+				'mode': 'run',
+				'report_name': report_name
+			}, user=frappe.session.user)
+
+		self.assertListEqual(data.get('columns'), self.default_columns)
+		expected = (('Box1', 43.25), ('Box2', 0.0), ('Box3', 43.25), ('Box4', -85.28), ('Box5', -42.03),
+			('Box6', 825.0), ('Box7', -426.40), ('Box8', 0.0), ('Box9', 0.0))
+		exrow = iter(expected)
+		for row in data.get('result'):
+			if row.get('voucher_no') and not row.get('posting_date'):
+				label, value = next(exrow)
+				self.assertDictEqual(row, {'voucher_no': label, 'amount': value})
+		self.assertListEqual(data.get('report_summary'),
+			[{'label': label, 'datatype': 'Currency', 'value': value} for label, value in expected])
+
+		self.rm_testdocs()
+
+	def test_filter_match(self):
+		# None - treated as -inf number except range
+		self.assertTrue(filter_match(None, '!='))
+		self.assertTrue(filter_match(None, '<'))
+		self.assertTrue(filter_match(None, '<jjj'))
+		self.assertTrue(filter_match(None, '  :  '))
+		self.assertTrue(filter_match(None, ':56'))
+		self.assertTrue(filter_match(None, ':de'))
+		self.assertFalse(filter_match(None, '3.4'))
+		self.assertFalse(filter_match(None, '='))
+		self.assertFalse(filter_match(None, '=3.4'))
+		self.assertFalse(filter_match(None, '>3.4'))
+		self.assertFalse(filter_match(None, '   <'))
+		self.assertFalse(filter_match(None, 'ew'))
+		self.assertFalse(filter_match(None, ' '))
+		self.assertFalse(filter_match(None, ' f :'))
+
+		# Numbers
+		self.assertTrue(filter_match(3.4, '3.4'))
+		self.assertTrue(filter_match(3.4, '.4'))
+		self.assertTrue(filter_match(3.4, '3'))
+		self.assertTrue(filter_match(-3.4, '< -3'))
+		self.assertTrue(filter_match(-3.4, '> -4'))
+		self.assertTrue(filter_match(3.4, '= 3.4 '))
+		self.assertTrue(filter_match(3.4, '!=4.5'))
+		self.assertTrue(filter_match(3.4, ' 3 : 4 '))
+		self.assertTrue(filter_match(0.0, '  :  '))
+		self.assertFalse(filter_match(3.4, '=4.5'))
+		self.assertFalse(filter_match(3.4, ' = 3.4 '))
+		self.assertFalse(filter_match(3.4, '!=3.4'))
+		self.assertFalse(filter_match(3.4, '>6'))
+		self.assertFalse(filter_match(3.4, '<-4.5'))
+		self.assertFalse(filter_match(3.4, '4.5'))
+		self.assertFalse(filter_match(3.4, '5:9'))
+
+		# Strings
+		self.assertTrue(filter_match('ACC-SINV-2021-00001', 'SINV'))
+		self.assertTrue(filter_match('ACC-SINV-2021-00001', 'sinv'))
+		self.assertTrue(filter_match('ACC-SINV-2021-00001', '-2021'))
+		self.assertTrue(filter_match(' ACC-SINV-2021-00001', ' acc'))
+		self.assertTrue(filter_match('ACC-SINV-2021-00001', '=2021'))
+		self.assertTrue(filter_match('ACC-SINV-2021-00001', '!=zz'))
+		self.assertTrue(filter_match('ACC-SINV-2021-00001', '<   zzz  '))
+		self.assertTrue(filter_match('ACC-SINV-2021-00001', '  :  sinv  '))
+		self.assertFalse(filter_match('ACC-SINV-2021-00001', '  sinv  :'))
+		self.assertFalse(filter_match('ACC-SINV-2021-00001', ' acc'))
+		self.assertFalse(filter_match('ACC-SINV-2021-00001', '= 2021 '))
+		self.assertFalse(filter_match('ACC-SINV-2021-00001', '!=sinv'))
+		self.assertFalse(filter_match('ACC-SINV-2021-00001', ' >'))
+		self.assertFalse(filter_match('ACC-SINV-2021-00001', '>aa'))
+		self.assertFalse(filter_match('ACC-SINV-2021-00001', ' <'))
+		self.assertFalse(filter_match('ACC-SINV-2021-00001', '<   '))
+		self.assertFalse(filter_match('ACC-SINV-2021-00001', ' ='))
+		self.assertFalse(filter_match('ACC-SINV-2021-00001', '='))
+
+		# Date - always match
+		self.assertTrue(filter_match(datetime.date(2021, 3, 19), ' kdsjkldfs '))
diff --git a/erpnext/accounts/workspace/accounting/accounting.json b/erpnext/accounts/workspace/accounting/accounting.json
index df68318..b04b03c 100644
--- a/erpnext/accounts/workspace/accounting/accounting.json
+++ b/erpnext/accounts/workspace/accounting/accounting.json
@@ -438,22 +438,34 @@
    "dependencies": "GL Entry",
    "hidden": 0,
    "is_query_report": 1,
-   "label": "DATEV Export",
-   "link_to": "DATEV",
+   "label": "Tax Detail",
+   "link_to": "Tax Detail",
    "link_type": "Report",
    "onboard": 0,
    "type": "Link"
   },
   {
-    "dependencies": "GL Entry",
-    "hidden": 0,
-    "is_query_report": 1,
-    "label": "UAE VAT 201",
-    "link_to": "UAE VAT 201",
-    "link_type": "Report",
-    "onboard": 0,
-    "type": "Link"
-   },
+   "dependencies": "GL Entry",
+   "hidden": 0,
+   "is_query_report": 1,
+   "label": "DATEV Export",
+   "link_to": "DATEV",
+   "link_type": "Report",
+   "onboard": 0,
+   "only_for": "Germany",
+   "type": "Link"
+  },
+  {
+   "dependencies": "GL Entry",
+   "hidden": 0,
+   "is_query_report": 1,
+   "label": "UAE VAT 201",
+   "link_to": "UAE VAT 201",
+   "link_type": "Report",
+   "onboard": 0,
+   "only_for": "United Arab Emirates",
+   "type": "Link"
+  },
   {
    "hidden": 0,
    "is_query_report": 0,
@@ -684,6 +696,7 @@
    "is_query_report": 0,
    "label": "Goods and Services Tax (GST India)",
    "onboard": 0,
+   "only_for": "India",
    "type": "Card Break"
   },
   {
@@ -1052,7 +1065,7 @@
    "type": "Link"
   }
  ],
- "modified": "2021-05-12 11:48:01.905144",
+ "modified": "2021-05-13 13:44:56.249888",
  "modified_by": "Administrator",
  "module": "Accounts",
  "name": "Accounting",
diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py
index 30a270c..3cd4b80 100644
--- a/erpnext/assets/doctype/asset/test_asset.py
+++ b/erpnext/assets/doctype/asset/test_asset.py
@@ -566,7 +566,7 @@
 		doc = make_invoice(pr.name)
 
 		self.assertEqual('Asset Received But Not Billed - _TC', doc.items[0].expense_account)
-	
+
 	def test_asset_cwip_toggling_cases(self):
 		cwip = frappe.db.get_value("Asset Category", "Computers", "enable_cwip_accounting")
 		name = frappe.db.get_value("Asset Category Account", filters={"parent": "Computers"}, fieldname=["name"])
diff --git a/erpnext/assets/doctype/asset_category/asset_category.js b/erpnext/assets/doctype/asset_category/asset_category.js
index 74963c2..51ce157 100644
--- a/erpnext/assets/doctype/asset_category/asset_category.js
+++ b/erpnext/assets/doctype/asset_category/asset_category.js
@@ -4,7 +4,7 @@
 frappe.ui.form.on('Asset Category', {
 	onload: function(frm) {
 		frm.add_fetch('company_name', 'accumulated_depreciation_account', 'accumulated_depreciation_account');
-		frm.add_fetch('company_name', 'depreciation_expense_account', 'accumulated_depreciation_account');
+		frm.add_fetch('company_name', 'depreciation_expense_account', 'depreciation_expense_account');
 
 		frm.set_query('fixed_asset_account', 'accounts', function(doc, cdt, cdn) {
 			var d  = locals[cdt][cdn];
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js
index dd0f065..c0e19e9 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.js
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.js
@@ -61,8 +61,8 @@
 	}
 });
 
-erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend({
-	setup: function() {
+erpnext.buying.PurchaseOrderController = class PurchaseOrderController extends erpnext.buying.BuyingController {
+	setup() {
 		this.frm.custom_make_buttons = {
 			'Purchase Receipt': 'Purchase Receipt',
 			'Purchase Invoice': 'Purchase Invoice',
@@ -70,13 +70,13 @@
 			'Payment Entry': 'Payment',
 		}
 
-		this._super();
+		super.setup();
 
-	},
+	}
 
-	refresh: function(doc, cdt, cdn) {
+	refresh(doc, cdt, cdn) {
 		var me = this;
-		this._super();
+		super.refresh();
 		var allow_receipt = false;
 		var is_drop_ship = false;
 
@@ -182,9 +182,9 @@
 		} else if(doc.docstatus===0) {
 			cur_frm.cscript.add_from_mappers();
 		}
-	},
+	}
 
-	get_items_from_open_material_requests: function() {
+	get_items_from_open_material_requests() {
 		erpnext.utils.map_current_doc({
 			method: "erpnext.stock.doctype.material_request.material_request.make_purchase_order_based_on_supplier",
 			args: {
@@ -202,17 +202,17 @@
 			},
 			get_query_method: "erpnext.stock.doctype.material_request.material_request.get_material_requests_based_on_supplier"
 		});
-	},
+	}
 
-	validate: function() {
+	validate() {
 		set_schedule_date(this.frm);
-	},
+	}
 
-	has_unsupplied_items: function() {
+	has_unsupplied_items() {
 		return this.frm.doc['supplied_items'].some(item => item.required_qty != item.supplied_qty)
-	},
+	}
 
-	make_stock_entry: function() {
+	make_stock_entry() {
 		var items = $.map(cur_frm.doc.items, function(d) { return d.bom ? d.item_code : false; });
 		var me = this;
 
@@ -326,9 +326,9 @@
 			me.dialog.hide();
 		});
 
-	},
+	}
 
-	_make_rm_stock_entry: function(rm_items) {
+	_make_rm_stock_entry(rm_items) {
 		frappe.call({
 			method:"erpnext.buying.doctype.purchase_order.purchase_order.make_rm_stock_entry",
 			args: {
@@ -341,31 +341,31 @@
 				frappe.set_route("Form", doclist[0].doctype, doclist[0].name);
 			}
 		});
-	},
+	}
 
-	make_inter_company_order: function(frm) {
+	make_inter_company_order(frm) {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.buying.doctype.purchase_order.purchase_order.make_inter_company_sales_order",
 			frm: frm
 		});
-	},
+	}
 
-	make_purchase_receipt: function() {
+	make_purchase_receipt() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.buying.doctype.purchase_order.purchase_order.make_purchase_receipt",
 			frm: cur_frm,
 			freeze_message: __("Creating Purchase Receipt ...")
 		})
-	},
+	}
 
-	make_purchase_invoice: function() {
+	make_purchase_invoice() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.buying.doctype.purchase_order.purchase_order.make_purchase_invoice",
 			frm: cur_frm
 		})
-	},
+	}
 
-	add_from_mappers: function() {
+	add_from_mappers() {
 		var me = this;
 		this.frm.add_custom_button(__('Material Request'),
 			function() {
@@ -471,13 +471,13 @@
 				}
 			});
 		}, __("Tools"));
-	},
+	}
 
-	tc_name: function() {
+	tc_name() {
 		this.get_terms();
-	},
+	}
 
-	items_add: function(doc, cdt, cdn) {
+	items_add(doc, cdt, cdn) {
 		var row = frappe.get_doc(cdt, cdn);
 		if(doc.schedule_date) {
 			row.schedule_date = doc.schedule_date;
@@ -485,13 +485,13 @@
 		} else {
 			this.frm.script_manager.copy_from_first_row("items", row, ["schedule_date"]);
 		}
-	},
+	}
 
-	unhold_purchase_order: function(){
+	unhold_purchase_order(){
 		cur_frm.cscript.update_status("Resume", "Draft")
-	},
+	}
 
-	hold_purchase_order: function(){
+	hold_purchase_order(){
 		var me = this;
 		var d = new frappe.ui.Dialog({
 			title: __('Reason for Hold'),
@@ -523,28 +523,28 @@
 			}
 		});
 		d.show();
-	},
+	}
 
-	unclose_purchase_order: function(){
+	unclose_purchase_order(){
 		cur_frm.cscript.update_status('Re-open', 'Submitted')
-	},
+	}
 
-	close_purchase_order: function(){
+	close_purchase_order(){
 		cur_frm.cscript.update_status('Close', 'Closed')
-	},
+	}
 
-	delivered_by_supplier: function(){
+	delivered_by_supplier(){
 		cur_frm.cscript.update_status('Deliver', 'Delivered')
-	},
+	}
 
-	items_on_form_rendered: function() {
-		set_schedule_date(this.frm);
-	},
-
-	schedule_date: function() {
+	items_on_form_rendered() {
 		set_schedule_date(this.frm);
 	}
-});
+
+	schedule_date() {
+		set_schedule_date(this.frm);
+	}
+};
 
 // for backward compatibility: combine new and previous states
 $.extend(cur_frm.cscript, new erpnext.buying.PurchaseOrderController({frm: cur_frm}));
diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
index b76c378..ee0e1ef 100644
--- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
+++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
@@ -205,10 +205,10 @@
 
 })
 
-erpnext.buying.RequestforQuotationController = erpnext.buying.BuyingController.extend({
-	refresh: function() {
+erpnext.buying.RequestforQuotationController = class RequestforQuotationController extends erpnext.buying.BuyingController {
+	refresh() {
 		var me = this;
-		this._super();
+		super.refresh();
 		if (this.frm.doc.docstatus===0) {
 			this.frm.add_custom_button(__('Material Request'),
 				function() {
@@ -302,17 +302,17 @@
 					me.get_suppliers_button(me.frm);
 				}, __("Tools"));
 		}
-	},
+	}
 
-	calculate_taxes_and_totals: function() {
+	calculate_taxes_and_totals() {
 		return;
-	},
+	}
 
-	tc_name: function() {
+	tc_name() {
 		this.get_terms();
-	},
+	}
 
-	get_suppliers_button: function (frm) {
+	get_suppliers_button (frm) {
 		var doc = frm.doc;
 		var dialog = new frappe.ui.Dialog({
 			title: __("Get Suppliers"),
@@ -410,8 +410,8 @@
 		});
 
 		dialog.show();
-	},
-});
+	}
+};
 
 // for backward compatibility: combine new and previous states
 $.extend(cur_frm.cscript, new erpnext.buying.RequestforQuotationController({frm: cur_frm}));
diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js
index a0187b0..a3ba52e 100644
--- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js
+++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js
@@ -4,19 +4,19 @@
 // attach required files
 {% include 'erpnext/public/js/controllers/buying.js' %};
 
-erpnext.buying.SupplierQuotationController = erpnext.buying.BuyingController.extend({
-	setup: function() {
+erpnext.buying.SupplierQuotationController = class SupplierQuotationController extends erpnext.buying.BuyingController {
+	setup() {
 		this.frm.custom_make_buttons = {
 			'Purchase Order': 'Purchase Order',
 			'Quotation': 'Quotation'
 		}
 
-		this._super();
-	},
+		super.setup();
+	}
 
-	refresh: function() {
+	refresh() {
 		var me = this;
-		this._super();
+		super.refresh();
 
 		if (this.frm.doc.__islocal && !this.frm.doc.valid_till) {
 			this.frm.set_value('valid_till', frappe.datetime.add_months(this.frm.doc.transaction_date, 1));
@@ -77,22 +77,22 @@
 				})
 			}, __("Get Items From"));
 		}
-	},
+	}
 
-	make_purchase_order: function() {
+	make_purchase_order() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.buying.doctype.supplier_quotation.supplier_quotation.make_purchase_order",
 			frm: cur_frm
 		})
-	},
-	make_quotation: function() {
+	}
+	make_quotation() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.buying.doctype.supplier_quotation.supplier_quotation.make_quotation",
 			frm: cur_frm
 		})
 
 	}
-});
+};
 
 // for backward compatibility: combine new and previous states
 $.extend(cur_frm.cscript, new erpnext.buying.SupplierQuotationController({frm: cur_frm}));
diff --git a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py
index 6900938..c1fc6fb 100644
--- a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py
+++ b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/test_subcontracted_raw_materials_to_be_transferred.py
@@ -9,12 +9,12 @@
 from erpnext.buying.report.subcontracted_raw_materials_to_be_transferred.subcontracted_raw_materials_to_be_transferred import execute
 import json, frappe, unittest
 
-class TestSubcontractedItemToBeReceived(unittest.TestCase):
+class TestSubcontractedItemToBeTransferred(unittest.TestCase):
 
-	def test_pending_and_received_qty(self):
+	def test_pending_and_transferred_qty(self):
 		po = create_purchase_order(item_code='_Test FG Item', is_subcontracted='Yes')
-		make_stock_entry(item_code='_Test Item', target='_Test Warehouse 1 - _TC', qty=100, basic_rate=100)
-		make_stock_entry(item_code='_Test Item Home Desktop 100', target='_Test Warehouse 1 - _TC', qty=100, basic_rate=100)
+		make_stock_entry(item_code='_Test Item', target='_Test Warehouse - _TC', qty=100, basic_rate=100)
+		make_stock_entry(item_code='_Test Item Home Desktop 100', target='_Test Warehouse - _TC', qty=100, basic_rate=100)
 		transfer_subcontracted_raw_materials(po.name)
 		col, data = execute(filters=frappe._dict({'supplier': po.supplier,
 		   'from_date': frappe.utils.get_datetime(frappe.utils.add_to_date(po.transaction_date, days=-10)),
@@ -38,7 +38,8 @@
 		'warehouse': '_Test Warehouse - _TC', 'rate': 100, 'amount': 200, 'stock_uom': 'Nos'}]
 	rm_item_string = json.dumps(rm_item)
 	se = frappe.get_doc(make_rm_stock_entry(po, rm_item_string))
+	se.from_warehouse = '_Test Warehouse 1 - _TC'
 	se.to_warehouse = '_Test Warehouse 1 - _TC'
 	se.stock_entry_type = 'Send to Subcontractor'
 	se.save()
-	se.submit()
\ No newline at end of file
+	se.submit()
diff --git a/erpnext/change_log/v13/v13.0.2.md b/erpnext/change_log/v13/v13_0_2.md
similarity index 100%
rename from erpnext/change_log/v13/v13.0.2.md
rename to erpnext/change_log/v13/v13_0_2.md
diff --git a/erpnext/change_log/v13/v13_3_0.md b/erpnext/change_log/v13/v13_3_0.md
new file mode 100644
index 0000000..016dbb0
--- /dev/null
+++ b/erpnext/change_log/v13/v13_3_0.md
@@ -0,0 +1,73 @@
+# Version 13.3.0 Release Notes
+
+### Features & Enhancements
+
+- Purchase receipt creation from purchase invoice ([#25126](https://github.com/frappe/erpnext/pull/25126))
+- New Document Transaction Deletion ([#25354](https://github.com/frappe/erpnext/pull/25354))
+- Employee Referral ([#24997](https://github.com/frappe/erpnext/pull/24997))
+- Add Create Expense Claim button in Delivery Trip ([#25526](https://github.com/frappe/erpnext/pull/25526))
+- Reduced rate of asset depreciation as per IT Act ([#25648](https://github.com/frappe/erpnext/pull/25648))
+- Improve DATEV export ([#25238](https://github.com/frappe/erpnext/pull/25238))
+- Add pick batch button ([#25413](https://github.com/frappe/erpnext/pull/25413))
+- Enable custom field search on POS ([#25421](https://github.com/frappe/erpnext/pull/25421))
+- New check field in subscriptions for (not) submitting invoices ([#25394](https://github.com/frappe/erpnext/pull/25394))
+- Show POS reserved stock in stock projected qty report ([#25593](https://github.com/frappe/erpnext/pull/25593))
+- e-way bill validity field ([#25555](https://github.com/frappe/erpnext/pull/25555))
+- Significant reduction in time taken to save sales documents ([#25475](https://github.com/frappe/erpnext/pull/25475))
+
+### Fixes
+
+- Bank statement import via google sheet ([#25677](https://github.com/frappe/erpnext/pull/25677))
+- Invoices not getting fetched during payment reconciliation ([#25598](https://github.com/frappe/erpnext/pull/25598))
+- Error on applying TDS without party ([#25632](https://github.com/frappe/erpnext/pull/25632))
+- Allow to cancel loan with cancelled repayment entry ([#25507](https://github.com/frappe/erpnext/pull/25507))
+- Can't open general ledger from consolidated financial report ([#25542](https://github.com/frappe/erpnext/pull/25542))
+- Add 'Partially Received' to Status drop-down list in Material Request ([#24857](https://github.com/frappe/erpnext/pull/24857))
+- Updated item filters for material request ([#25531](https://github.com/frappe/erpnext/pull/25531))
+- Added validation in stock entry to check duplicate serial nos ([#25611](https://github.com/frappe/erpnext/pull/25611))
+- Update shopify api version ([#25600](https://github.com/frappe/erpnext/pull/25600))
+- Dialog variable assignment after definition in POS ([#25680](https://github.com/frappe/erpnext/pull/25680))
+- Added tax_types list ([#25587](https://github.com/frappe/erpnext/pull/25587))
+- Include search fields in Project Link field query ([#25505](https://github.com/frappe/erpnext/pull/25505))
+- Item stock levels displaying inconsistently ([#25506](https://github.com/frappe/erpnext/pull/25506))
+- Change today to now to get data for reposting ([#25703](https://github.com/frappe/erpnext/pull/25703))
+- Parameter for get_filtered_list_for_consolidated_report in consolidated balance sheet ([#25700](https://github.com/frappe/erpnext/pull/25700))
+- Minor fixes in loan ([#25546](https://github.com/frappe/erpnext/pull/25546))
+- Fieldname when updating docfield property ([#25516](https://github.com/frappe/erpnext/pull/25516))
+- Use get_serial_nos for splitting ([#25590](https://github.com/frappe/erpnext/pull/25590))
+- Show item's full name on hover over item in POS ([#25554](https://github.com/frappe/erpnext/pull/25554))
+- Stock ledger entry created against draft stock entry ([#25540](https://github.com/frappe/erpnext/pull/25540))
+- Incorrect expense account set in pos invoice ([#25543](https://github.com/frappe/erpnext/pull/25543))
+- Stock balance and batch-wise balance history report showing different closing stock ([#25575](https://github.com/frappe/erpnext/pull/25575))
+- Make strings translatable ([#25521](https://github.com/frappe/erpnext/pull/25521))
+- Serial no changed after saving stock reconciliation ([#25541](https://github.com/frappe/erpnext/pull/25541))
+- Ignore fraction difference while making round off gl entry ([#25438](https://github.com/frappe/erpnext/pull/25438))
+- Sync shopify customer addresses ([#25481](https://github.com/frappe/erpnext/pull/25481))
+- Total stock summary report not working ([#25551](https://github.com/frappe/erpnext/pull/25551))
+- Rename field has not updated value of deposit and withdrawal fields ([#25545](https://github.com/frappe/erpnext/pull/25545))
+- Unexpected keyword argument 'merge_logs' ([#25489](https://github.com/frappe/erpnext/pull/25489))
+- Validation message of quality inspection in purchase receipt ([#25667](https://github.com/frappe/erpnext/pull/25667))
+- Added is_stock_item filter ([#25530](https://github.com/frappe/erpnext/pull/25530))
+- Fetch total stock at company in PO ([#25532](https://github.com/frappe/erpnext/pull/25532))
+- Updated filters for process statement of accounts ([#25384](https://github.com/frappe/erpnext/pull/25384))
+- Incorrect expense account set in pos invoice ([#25571](https://github.com/frappe/erpnext/pull/25571))
+- Client script breaking while settings tax labels ([#25653](https://github.com/frappe/erpnext/pull/25653))
+- Empty payment term column in accounts receivable report ([#25556](https://github.com/frappe/erpnext/pull/25556))
+- Designation insufficient permission on lead doctype. ([#25331](https://github.com/frappe/erpnext/pull/25331))
+- Force https for shopify webhook registration ([#25630](https://github.com/frappe/erpnext/pull/25630))
+- Patch regional fields for old companies ([#25673](https://github.com/frappe/erpnext/pull/25673))
+- Woocommerce order sync issue ([#25692](https://github.com/frappe/erpnext/pull/25692))
+- Allow to receive same serial numbers multiple times ([#25471](https://github.com/frappe/erpnext/pull/25471))
+- Update Allocated amount after Paid Amount is changed in PE ([#25515](https://github.com/frappe/erpnext/pull/25515))
+- Updating Standard Notification's channel field ([#25564](https://github.com/frappe/erpnext/pull/25564))
+- Report summary showing inflated values when values are accumulated in Group Company ([#25577](https://github.com/frappe/erpnext/pull/25577))
+- UI fixes related to overflowing payment section ([#25652](https://github.com/frappe/erpnext/pull/25652))
+- List invoices in Payment Reconciliation Payment ([#25524](https://github.com/frappe/erpnext/pull/25524))
+- Ageing errors in PSOA ([#25490](https://github.com/frappe/erpnext/pull/25490))
+- Prevent spurious defaults for items when making prec from dnote ([#25559](https://github.com/frappe/erpnext/pull/25559))
+- Stock reconciliation getting time out error during submission ([#25557](https://github.com/frappe/erpnext/pull/25557))
+- Timesheet filter date exclusive issue ([#25626](https://github.com/frappe/erpnext/pull/25626))
+- Update cost center in the item table fetched from POS Profile ([#25609](https://github.com/frappe/erpnext/pull/25609))
+- Updated modified time in purchase invoice to pull new fields ([#25678](https://github.com/frappe/erpnext/pull/25678))
+- Stock and Accounts Settings form refactor ([#25534](https://github.com/frappe/erpnext/pull/25534))
+- Payment amount showing in foreign currency ([#25292](https://github.com/frappe/erpnext/pull/25292))
\ No newline at end of file
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index c409850..913458f 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -1006,7 +1006,6 @@
 				else:
 					grand_total -= self.get("total_advance")
 					base_grand_total = flt(grand_total * self.get("conversion_rate"), self.precision("base_grand_total"))
-			print(grand_total, base_grand_total)
 			if total != flt(grand_total, self.precision("grand_total")) or \
 				base_total != flt(base_grand_total, self.precision("base_grand_total")):
 				frappe.throw(_("Total Payment Amount in Payment Schedule must be equal to Grand / Rounded Total"))
diff --git a/erpnext/crm/doctype/lead/lead.js b/erpnext/crm/doctype/lead/lead.js
index 0c88d28..8dfee1d 100644
--- a/erpnext/crm/doctype/lead/lead.js
+++ b/erpnext/crm/doctype/lead/lead.js
@@ -4,8 +4,8 @@
 frappe.provide("erpnext");
 cur_frm.email_field = "email_id";
 
-erpnext.LeadController = frappe.ui.form.Controller.extend({
-	setup: function () {
+erpnext.LeadController = class LeadController extends frappe.ui.form.Controller {
+	setup () {
 		this.frm.make_methods = {
 			'Customer': this.make_customer,
 			'Quotation': this.make_quotation,
@@ -13,9 +13,9 @@
 		};
 
 		this.frm.toggle_reqd("lead_name", !this.frm.doc.organization_lead);
-	},
+	}
 
-	onload: function () {
+	onload () {
 		this.frm.set_query("customer", function (doc, cdt, cdn) {
 			return { query: "erpnext.controllers.queries.customer_query" }
 		});
@@ -27,9 +27,9 @@
 		this.frm.set_query("contact_by", function (doc, cdt, cdn) {
 			return { query: "frappe.core.doctype.user.user.user_query" }
 		});
-	},
+	}
 
-	refresh: function () {
+	refresh () {
 		let doc = this.frm.doc;
 		erpnext.toggle_naming_series();
 		frappe.dynamic_link = { doc: doc, fieldname: 'name', doctype: 'Lead' }
@@ -45,47 +45,47 @@
 		} else {
 			frappe.contacts.clear_address_and_contact(this.frm);
 		}
-	},
+	}
 
-	make_customer: function () {
+	make_customer () {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.crm.doctype.lead.lead.make_customer",
 			frm: cur_frm
 		})
-	},
+	}
 
-	make_opportunity: function () {
+	make_opportunity () {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.crm.doctype.lead.lead.make_opportunity",
 			frm: cur_frm
 		})
-	},
+	}
 
-	make_quotation: function () {
+	make_quotation () {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.crm.doctype.lead.lead.make_quotation",
 			frm: cur_frm
 		})
-	},
+	}
 
-	organization_lead: function () {
+	organization_lead () {
 		this.frm.toggle_reqd("lead_name", !this.frm.doc.organization_lead);
 		this.frm.toggle_reqd("company_name", this.frm.doc.organization_lead);
-	},
+	}
 
-	company_name: function () {
+	company_name () {
 		if (this.frm.doc.organization_lead && !this.frm.doc.lead_name) {
 			this.frm.set_value("lead_name", this.frm.doc.company_name);
 		}
-	},
+	}
 
-	contact_date: function () {
+	contact_date () {
 		if (this.frm.doc.contact_date) {
 			let d = moment(this.frm.doc.contact_date);
 			d.add(1, "day");
 			this.frm.set_value("ends_on", d.format(frappe.defaultDatetimeFormat));
 		}
 	}
-});
+};
 
 $.extend(cur_frm.cscript, new erpnext.LeadController({ frm: cur_frm }));
diff --git a/erpnext/crm/doctype/opportunity/opportunity.js b/erpnext/crm/doctype/opportunity/opportunity.js
index ac374a9..925c30b 100644
--- a/erpnext/crm/doctype/opportunity/opportunity.js
+++ b/erpnext/crm/doctype/opportunity/opportunity.js
@@ -145,8 +145,8 @@
 })
 
 // TODO commonify this code
-erpnext.crm.Opportunity = frappe.ui.form.Controller.extend({
-	onload: function() {
+erpnext.crm.Opportunity = class Opportunity extends frappe.ui.form.Controller {
+	onload() {
 
 		if(!this.frm.doc.status) {
 			frm.set_value('status', 'Open');
@@ -159,9 +159,9 @@
 		}
 
 		this.setup_queries();
-	},
+	}
 
-	setup_queries: function() {
+	setup_queries() {
 		var me = this;
 
 		if(this.frm.fields_dict.contact_by.df.options.match(/^User/)) {
@@ -185,15 +185,15 @@
 		else if (me.frm.doc.opportunity_from == "Customer") {
 			me.frm.set_query('party_name', erpnext.queries['customer']);
 		}
-	},
+	}
 
-	create_quotation: function() {
+	create_quotation() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.crm.doctype.opportunity.opportunity.make_quotation",
 			frm: cur_frm
 		})
 	}
-});
+};
 
 $.extend(cur_frm.cscript, new erpnext.crm.Opportunity({frm: cur_frm}));
 
diff --git a/erpnext/education/doctype/fees/test_fees.py b/erpnext/education/doctype/fees/test_fees.py
index eedc2ae..c6bb704 100644
--- a/erpnext/education/doctype/fees/test_fees.py
+++ b/erpnext/education/doctype/fees/test_fees.py
@@ -9,8 +9,7 @@
 from frappe.utils.make_random import get_random
 from erpnext.education.doctype.program.test_program import make_program_and_linked_courses
 
-# test_records = frappe.get_test_records('Fees')
-
+test_dependencies = ['Company']
 class TestFees(unittest.TestCase):
 
 	def test_fees(self):
diff --git a/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.js b/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.js
index b59d848..68e7780 100644
--- a/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.js
+++ b/erpnext/education/doctype/student_attendance_tool/student_attendance_tool.js
@@ -72,8 +72,8 @@
 });
 
 
-education.StudentsEditor = Class.extend({
-	init: function(frm, wrapper, students) {
+education.StudentsEditor = class StudentsEditor {
+	constructor(frm, wrapper, students) {
 		this.wrapper = wrapper;
 		this.frm = frm;
 		if(students.length > 0) {
@@ -81,8 +81,8 @@
 		} else {
 			this.show_empty_state();
 		}
-	},
-	make: function(frm, students) {
+	}
+	make(frm, students) {
 		var me = this;
 
 		$(this.wrapper).empty();
@@ -173,13 +173,13 @@
 		});
 
 		$(htmls.join("")).appendTo(me.wrapper);
-	},
+	}
 
-	show_empty_state: function() {
+	show_empty_state() {
 		$(this.wrapper).html(
 			`<div class="text-center text-muted" style="line-height: 100px;">
 				${__("No Students in")} ${this.frm.doc.student_group}
 			</div>`
 		);
 	}
-});
+};
diff --git a/erpnext/erpnext_integrations/doctype/mpesa_settings/test_mpesa_settings.py b/erpnext/erpnext_integrations/doctype/mpesa_settings/test_mpesa_settings.py
index d370fbc..3c2e59a 100644
--- a/erpnext/erpnext_integrations/doctype/mpesa_settings/test_mpesa_settings.py
+++ b/erpnext/erpnext_integrations/doctype/mpesa_settings/test_mpesa_settings.py
@@ -81,7 +81,7 @@
 		integration_request.reload()
 		self.assertEqual(pos_invoice.mpesa_receipt_number, "LGR7OWQX0R")
 		self.assertEqual(integration_request.status, "Completed")
-		
+
 		frappe.db.set_value("Customer", "_Test Customer", "default_currency", "")
 		integration_request.delete()
 		pr.reload()
@@ -139,7 +139,7 @@
 		pr.cancel()
 		pr.delete()
 		pos_invoice.delete()
-	
+
 	def test_processing_of_only_one_succes_callback_payload(self):
 		create_mpesa_settings(payment_gateway_name="Payment")
 		mpesa_account = frappe.db.get_value("Payment Gateway Account", {"payment_gateway": 'Mpesa-Payment'}, "payment_account")
diff --git a/erpnext/healthcare/doctype/exercise_type/exercise_type.js b/erpnext/healthcare/doctype/exercise_type/exercise_type.js
index b49b00e..0614604 100644
--- a/erpnext/healthcare/doctype/exercise_type/exercise_type.js
+++ b/erpnext/healthcare/doctype/exercise_type/exercise_type.js
@@ -9,14 +9,14 @@
 	}
 });
 
-erpnext.ExerciseEditor = Class.extend({
-	init: function(frm, wrapper) {
+erpnext.ExerciseEditor = class ExerciseEditor {
+	constructor(frm, wrapper) {
 		this.wrapper = wrapper;
 		this.frm = frm;
 		this.make(frm, wrapper);
-	},
+	}
 
-	make: function(frm, wrapper) {
+	make(frm, wrapper) {
 		$(this.wrapper).empty();
 
 		this.exercise_toolbar = $('<p>\
@@ -38,9 +38,9 @@
 			this.make_cards(frm);
 			this.make_buttons(frm);
 		}
-	},
+	}
 
-	make_cards: function(frm) {
+	make_cards(frm) {
 		var me = this;
 		$(me.exercise_cards).empty();
 
@@ -60,9 +60,9 @@
 					</div>
 			</div>`, {image_src: step.image, title: step.title, description: step.description, col_id: "col-"+i, card_id: "card-"+i, id: i})).appendTo(me.row);
 		});
-	},
+	}
 
-	make_buttons: function(frm) {
+	make_buttons(frm) {
 		let me = this;
 		$('.btn-edit').on('click', function() {
 			let id = $(this).attr('data-id');
@@ -82,9 +82,9 @@
 				frm.dirty();
 			}, 300);
 		});
-	},
+	}
 
-	show_add_card_dialog: function(frm) {
+	show_add_card_dialog(frm) {
 		let me = this;
 		let d = new frappe.ui.Dialog({
 			title: __('Add Exercise Step'),
@@ -137,9 +137,9 @@
 			primary_action_label: __('Add')
 		});
 		d.show();
-	},
+	}
 
-	show_edit_card_dialog: function(frm, id) {
+	show_edit_card_dialog(frm, id) {
 		let new_dialog = new frappe.ui.Dialog({
 			title: __("Edit Exercise Step"),
 			fields: [
@@ -183,4 +183,4 @@
 		});
 		new_dialog.show();
 	}
-});
+};
diff --git a/erpnext/healthcare/doctype/therapy_plan/test_therapy_plan.py b/erpnext/healthcare/doctype/therapy_plan/test_therapy_plan.py
index d079bed..113fa51 100644
--- a/erpnext/healthcare/doctype/therapy_plan/test_therapy_plan.py
+++ b/erpnext/healthcare/doctype/therapy_plan/test_therapy_plan.py
@@ -29,7 +29,7 @@
 		self.assertEqual(frappe.db.get_value('Therapy Plan', plan.name, 'status'), 'Completed')
 
 		patient, medical_department, practitioner = create_healthcare_docs()
-		appointment = create_appointment(patient, practitioner, nowdate())		
+		appointment = create_appointment(patient, practitioner, nowdate())
 		session = make_therapy_session(plan.name, plan.patient, 'Basic Rehab', '_Test Company', appointment.name)
 		session = frappe.get_doc(session)
 		session.submit()
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 9d1ce9b..3024819 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -15,10 +15,11 @@
 
 develop_version = '13.x.x-develop'
 
-app_include_js = "/assets/js/erpnext.min.js"
-app_include_css = "/assets/css/erpnext.css"
-web_include_js = "/assets/js/erpnext-web.min.js"
-web_include_css = "/assets/css/erpnext-web.css"
+app_include_js = "erpnext.bundle.js"
+app_include_css = "erpnext.bundle.css"
+web_include_js = "erpnext-web.bundle.js"
+web_include_css = "erpnext-web.bundle.css"
+email_css = "email.bundle.css"
 
 doctype_js = {
 	"Address": "public/js/address.js",
diff --git a/erpnext/hr/doctype/employee/employee.js b/erpnext/hr/doctype/employee/employee.js
index c21d4b8..5639cc9 100755
--- a/erpnext/hr/doctype/employee/employee.js
+++ b/erpnext/hr/doctype/employee/employee.js
@@ -2,8 +2,8 @@
 // License: GNU General Public License v3. See license.txt
 
 frappe.provide("erpnext.hr");
-erpnext.hr.EmployeeController = frappe.ui.form.Controller.extend({
-	setup: function() {
+erpnext.hr.EmployeeController = class EmployeeController extends frappe.ui.form.Controller {
+	setup() {
 		this.frm.fields_dict.user_id.get_query = function(doc, cdt, cdn) {
 			return {
 				query: "frappe.core.doctype.user.user.user_query",
@@ -12,30 +12,30 @@
 		}
 		this.frm.fields_dict.reports_to.get_query = function(doc, cdt, cdn) {
 			return { query: "erpnext.controllers.queries.employee_query"} }
-	},
+	}
 
-	refresh: function() {
+	refresh() {
 		var me = this;
 		erpnext.toggle_naming_series();
-	},
+	}
 
-	date_of_birth: function() {
+	date_of_birth() {
 		return cur_frm.call({
 			method: "get_retirement_date",
 			args: {date_of_birth: this.frm.doc.date_of_birth}
 		});
-	},
+	}
 
-	salutation: function() {
+	salutation() {
 		if(this.frm.doc.salutation) {
 			this.frm.set_value("gender", {
 				"Mr": "Male",
 				"Ms": "Female"
 			}[this.frm.doc.salutation]);
 		}
-	},
+	}
 
-});
+};
 frappe.ui.form.on('Employee',{
 	setup: function(frm) {
 		frm.set_query("leave_policy", function() {
diff --git a/erpnext/hr/doctype/employee_attendance_tool/employee_attendance_tool.js b/erpnext/hr/doctype/employee_attendance_tool/employee_attendance_tool.js
index 3205a92..ab965d5 100644
--- a/erpnext/hr/doctype/employee_attendance_tool/employee_attendance_tool.js
+++ b/erpnext/hr/doctype/employee_attendance_tool/employee_attendance_tool.js
@@ -68,13 +68,13 @@
 	}
 }
 
-erpnext.MarkedEmployee = Class.extend({
-	init: function(frm, wrapper, employee) {
+erpnext.MarkedEmployee = class MarkedEmployee {
+	constructor(frm, wrapper, employee) {
 		this.wrapper = wrapper;
 		this.frm = frm;
 		this.make(frm, employee);
-	},
-	make: function(frm, employee) {
+	}
+	make(frm, employee) {
 		var me = this;
 		$(this.wrapper).empty();
 
@@ -104,16 +104,16 @@
 				})).appendTo(row);
 		});
 	}
-});
+};
 
 
-erpnext.EmployeeSelector = Class.extend({
-	init: function(frm, wrapper, employee) {
+erpnext.EmployeeSelector = class EmployeeSelector {
+	constructor(frm, wrapper, employee) {
 		this.wrapper = wrapper;
 		this.frm = frm;
 		this.make(frm, employee);
-	},
-	make: function(frm, employee) {
+	}
+	make(frm, employee) {
 		var me = this;
 
 		$(this.wrapper).empty();
@@ -266,6 +266,6 @@
 
 		mark_employee_toolbar.appendTo($(this.wrapper));
 	}
-});
+};
 
 
diff --git a/erpnext/hr/doctype/employee_referral/employee_referral.json b/erpnext/hr/doctype/employee_referral/employee_referral.json
index bfd404b..3ae73a9 100644
--- a/erpnext/hr/doctype/employee_referral/employee_referral.json
+++ b/erpnext/hr/doctype/employee_referral/employee_referral.json
@@ -9,16 +9,18 @@
   "first_name",
   "last_name",
   "full_name",
-  "email",
-  "contact_no",
-  "resume",
-  "resume_link",
   "column_break_6",
   "date",
   "status",
   "for_designation",
+  "referral_details_section",
+  "email",
+  "contact_no",
+  "resume_link",
+  "column_break_12",
   "current_employer",
   "current_job_title",
+  "resume",
   "referrer_details_section",
   "referrer",
   "referrer_name",
@@ -189,12 +191,21 @@
    "label": "Referral Bonus Payment Status",
    "options": "\nUnpaid\nPaid",
    "read_only": 1
+  },
+  {
+   "fieldname": "referral_details_section",
+   "fieldtype": "Section Break",
+   "label": "Referral Details"
+  },
+  {
+   "fieldname": "column_break_12",
+   "fieldtype": "Column Break"
   }
  ],
  "index_web_pages_for_search": 1,
  "is_submittable": 1,
  "links": [],
- "modified": "2021-04-26 21:21:38.094086",
+ "modified": "2021-05-04 17:03:26.134560",
  "modified_by": "Administrator",
  "module": "HR",
  "name": "Employee Referral",
diff --git a/erpnext/hr/doctype/holiday_list/holiday_list.py b/erpnext/hr/doctype/holiday_list/holiday_list.py
index 8af8cea..f65e6e1 100644
--- a/erpnext/hr/doctype/holiday_list/holiday_list.py
+++ b/erpnext/hr/doctype/holiday_list/holiday_list.py
@@ -23,7 +23,7 @@
 		last_idx = max([cint(d.idx) for d in self.get("holidays")] or [0,])
 		for i, d in enumerate(date_list):
 			ch = self.append('holidays', {})
-			ch.description = self.weekly_off
+			ch.description = _(self.weekly_off)
 			ch.holiday_date = d
 			ch.weekly_off = 1
 			ch.idx = last_idx + i + 1
diff --git a/erpnext/hr/doctype/upload_attendance/test_upload_attendance.py b/erpnext/hr/doctype/upload_attendance/test_upload_attendance.py
index 6e151d0..03b0cf3 100644
--- a/erpnext/hr/doctype/upload_attendance/test_upload_attendance.py
+++ b/erpnext/hr/doctype/upload_attendance/test_upload_attendance.py
@@ -5,11 +5,18 @@
 
 import frappe
 import unittest
+import erpnext
 from frappe.utils import getdate
 from erpnext.hr.doctype.upload_attendance.upload_attendance import get_data
 from erpnext.hr.doctype.employee.test_employee import make_employee
 
+test_dependencies = ['Holiday List']
+
 class TestUploadAttendance(unittest.TestCase):
+	@classmethod
+	def setUpClass(cls):
+		frappe.db.set_value("Company", erpnext.get_default_company(), "default_holiday_list", '_Test Holiday List')
+
 	def test_date_range(self):
 		employee = make_employee("test_employee@company.com")
 		employee_doc = frappe.get_doc("Employee", employee)
diff --git a/erpnext/hr/doctype/upload_attendance/upload_attendance.js b/erpnext/hr/doctype/upload_attendance/upload_attendance.js
index 29aa854..bbafc82 100644
--- a/erpnext/hr/doctype/upload_attendance/upload_attendance.js
+++ b/erpnext/hr/doctype/upload_attendance/upload_attendance.js
@@ -5,19 +5,19 @@
 
 frappe.provide("erpnext.hr");
 
-erpnext.hr.AttendanceControlPanel = frappe.ui.form.Controller.extend({
-	onload: function() {
+erpnext.hr.AttendanceControlPanel = class AttendanceControlPanel extends frappe.ui.form.Controller {
+	onload() {
 		this.frm.set_value("att_fr_date", frappe.datetime.get_today());
 		this.frm.set_value("att_to_date", frappe.datetime.get_today());
-	},
+	}
 
-	refresh: function() {
+	refresh() {
 		this.frm.disable_save();
 		this.show_upload();
 		this.setup_import_progress();
-	},
+	}
 
-	get_template:function() {
+	get_template() {
 		if(!this.frm.doc.att_fr_date || !this.frm.doc.att_to_date) {
 			frappe.msgprint(__("Attendance From Date and Attendance To Date is mandatory"));
 			return;
@@ -28,7 +28,7 @@
 			from_date: this.frm.doc.att_fr_date,
 			to_date: this.frm.doc.att_to_date,
 		});
-	},
+	}
 
 	show_upload() {
 		var $wrapper = $(cur_frm.fields_dict.upload_html.wrapper).empty();
@@ -36,7 +36,7 @@
 			wrapper: $wrapper,
 			method: 'erpnext.hr.doctype.upload_attendance.upload_attendance.upload'
 		});
-	},
+	}
 
 	setup_import_progress() {
 		var $log_wrapper = $(this.frm.fields_dict.import_log.wrapper).empty();
@@ -64,6 +64,6 @@
 			}
 		});
 	}
-})
+}
 
 cur_frm.cscript = new erpnext.hr.AttendanceControlPanel({frm: cur_frm});
diff --git a/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py b/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py
index 92715d3..e86fa2b 100644
--- a/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py
+++ b/erpnext/hr/report/employee_leave_balance_summary/employee_leave_balance_summary.py
@@ -47,7 +47,7 @@
 	user = frappe.session.user
 	conditions = get_conditions(filters)
 
-	active_employees = frappe.get_all("Employee",
+	active_employees = frappe.get_list("Employee",
 		filters=conditions,
 		fields=["name", "employee_name", "department", "user_id", "leave_approver"])
 
@@ -72,4 +72,4 @@
 
 			data.append(row)
 
-	return data
\ No newline at end of file
+	return data
diff --git a/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py b/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py
index c5929c6..bcb0ee4 100644
--- a/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py
+++ b/erpnext/hr/report/monthly_attendance_sheet/monthly_attendance_sheet.py
@@ -57,10 +57,10 @@
 
 	data = []
 
+	leave_types = frappe.db.get_list("Leave Type")
 	leave_list = None
 	if filters.summarized_view:
-		leave_types = frappe.db.sql("""select name from `tabLeave Type`""", as_list=True)
-		leave_list = [d[0] + ":Float:120" for d in leave_types]
+		leave_list = [d.name + ":Float:120" for d in leave_types]
 		columns.extend(leave_list)
 		columns.extend([_("Total Late Entries") + ":Float:120", _("Total Early Exits") + ":Float:120"])
 
@@ -72,11 +72,11 @@
 			if (att_map_set & emp_map_set):
 				parameter_row = ["<b>"+ parameter + "</b>"] + ['' for day in range(filters["total_days_in_month"] + 2)]
 				data.append(parameter_row)
-				record, emp_att_data = add_data(emp_map[parameter], att_map, filters, holiday_map, conditions, default_holiday_list, leave_list=leave_list)
+				record, emp_att_data = add_data(emp_map[parameter], att_map, filters, holiday_map, conditions, default_holiday_list, leave_types=leave_types)
 				emp_att_map.update(emp_att_data)
 				data += record
 	else:
-		record, emp_att_map = add_data(emp_map, att_map, filters, holiday_map, conditions, default_holiday_list, leave_list=leave_list)
+		record, emp_att_map = add_data(emp_map, att_map, filters, holiday_map, conditions, default_holiday_list, leave_types=leave_types)
 		data += record
 
 	chart_data = get_chart_data(emp_att_map, days)
@@ -126,7 +126,7 @@
 
 	return chart
 
-def add_data(employee_map, att_map, filters, holiday_map, conditions, default_holiday_list, leave_list=None):
+def add_data(employee_map, att_map, filters, holiday_map, conditions, default_holiday_list, leave_types=None):
 
 	record = []
 	emp_att_map = {}
@@ -204,9 +204,9 @@
 				else:
 					leaves[d.leave_type] = d.count
 
-			for d in leave_list:
-				if d in leaves:
-					row.append(leaves[d])
+			for d in leave_types:
+				if d.name in leaves:
+					row.append(leaves[d.name])
 				else:
 					row.append("0.0")
 
diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
index ddbcdfd..2adfaf4 100644
--- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
+++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
@@ -45,8 +45,8 @@
 })
 
 // TODO commonify this code
-erpnext.maintenance.MaintenanceSchedule = frappe.ui.form.Controller.extend({
-	refresh: function() {
+erpnext.maintenance.MaintenanceSchedule = class MaintenanceSchedule extends frappe.ui.form.Controller {
+	refresh() {
 		frappe.dynamic_link = {doc: this.frm.doc, fieldname: 'customer', doctype: 'Customer'}
 
 		var me = this;
@@ -76,21 +76,21 @@
 				});
 			}, __('Create'));
 		}
-	},
+	}
 
-	start_date: function(doc, cdt, cdn) {
+	start_date(doc, cdt, cdn) {
 		this.set_no_of_visits(doc, cdt, cdn);
-	},
+	}
 
-	end_date: function(doc, cdt, cdn) {
+	end_date(doc, cdt, cdn) {
 		this.set_no_of_visits(doc, cdt, cdn);
-	},
+	}
 
-	periodicity: function(doc, cdt, cdn) {
+	periodicity(doc, cdt, cdn) {
 		this.set_no_of_visits(doc, cdt, cdn);
-	},
+	}
 
-	set_no_of_visits: function(doc, cdt, cdn) {
+	set_no_of_visits(doc, cdt, cdn) {
 		var item = frappe.get_doc(cdt, cdn);
 
 		if (item.start_date && item.end_date && item.periodicity) {
@@ -112,8 +112,8 @@
 			var no_of_visits = cint(date_diff / days_in_period[item.periodicity]);
 			frappe.model.set_value(item.doctype, item.name, "no_of_visits", no_of_visits);
 		}
-	},
-});
+	}
+};
 
 $.extend(cur_frm.cscript, new erpnext.maintenance.MaintenanceSchedule({frm: cur_frm}));
 
diff --git a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
index 4cbb02a..12dc59c 100644
--- a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
+++ b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
@@ -41,8 +41,8 @@
 })
 
 // TODO commonify this code
-erpnext.maintenance.MaintenanceVisit = frappe.ui.form.Controller.extend({
-	refresh: function() {
+erpnext.maintenance.MaintenanceVisit = class MaintenanceVisit extends frappe.ui.form.Controller {
+	refresh() {
 		frappe.dynamic_link = {doc: this.frm.doc, fieldname: 'customer', doctype: 'Customer'}
 
 		var me = this;
@@ -96,7 +96,7 @@
 					})
 				}, __("Get Items From"));
 		}
-	},
-});
+	}
+};
 
-$.extend(cur_frm.cscript, new erpnext.maintenance.MaintenanceVisit({frm: cur_frm}));
\ No newline at end of file
+$.extend(cur_frm.cscript, new erpnext.maintenance.MaintenanceVisit({frm: cur_frm}));
diff --git a/erpnext/manufacturing/doctype/bom/bom.js b/erpnext/manufacturing/doctype/bom/bom.js
index a09a5e3..b32b96a 100644
--- a/erpnext/manufacturing/doctype/bom/bom.js
+++ b/erpnext/manufacturing/doctype/bom/bom.js
@@ -360,16 +360,16 @@
 	}
 });
 
-erpnext.bom.BomController = erpnext.TransactionController.extend({
-	conversion_rate: function(doc) {
+erpnext.bom.BomController = class BomController extends erpnext.TransactionController {
+	conversion_rate(doc) {
 		if(this.frm.doc.currency === this.get_company_currency()) {
 			this.frm.set_value("conversion_rate", 1.0);
 		} else {
 			erpnext.bom.update_cost(doc);
 		}
-	},
+	}
 
-	item_code: function(doc, cdt, cdn){
+	item_code(doc, cdt, cdn){
 		var scrap_items = false;
 		var child = locals[cdt][cdn];
 		if (child.doctype == 'BOM Scrap Item') {
@@ -381,19 +381,19 @@
 		}
 
 		get_bom_material_detail(doc, cdt, cdn, scrap_items);
-	},
+	}
 
-	buying_price_list: function(doc) {
+	buying_price_list(doc) {
 		this.apply_price_list();
-	},
+	}
 
-	plc_conversion_rate: function(doc) {
+	plc_conversion_rate(doc) {
 		if (!this.in_apply_price_list) {
 			this.apply_price_list(null, true);
 		}
-	},
+	}
 
-	conversion_factor: function(doc, cdt, cdn) {
+	conversion_factor(doc, cdt, cdn) {
 		if (frappe.meta.get_docfield(cdt, "stock_qty", cdn)) {
 			var item = frappe.get_doc(cdt, cdn);
 			frappe.model.round_floats_in(item, ["qty", "conversion_factor"]);
@@ -402,8 +402,8 @@
 			this.toggle_conversion_factor(item);
 			this.frm.events.update_cost(this.frm);
 		}
-	},
-});
+	}
+};
 
 $.extend(cur_frm.cscript, new erpnext.bom.BomController({frm: cur_frm}));
 
diff --git a/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py b/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py
index 7528bf7..b80b320 100644
--- a/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py
+++ b/erpnext/payroll/doctype/payroll_entry/test_payroll_entry.py
@@ -15,7 +15,13 @@
 from erpnext.loan_management.doctype.loan.test_loan import create_loan, make_loan_disbursement_entry, create_loan_type, create_loan_accounts
 from erpnext.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual import process_loan_interest_accrual_for_term_loans
 
+test_dependencies = ['Holiday List']
+
 class TestPayrollEntry(unittest.TestCase):
+	@classmethod
+	def setUpClass(cls):
+		frappe.db.set_value("Company", erpnext.get_default_company(), "default_holiday_list", '_Test Holiday List')
+
 	def setUp(self):
 		for dt in ["Salary Slip", "Salary Component", "Salary Component Account",
 			"Payroll Entry", "Salary Structure", "Salary Structure Assignment", "Payroll Employee Detail", "Additional Salary"]:
diff --git a/erpnext/projects/doctype/timesheet/timesheet.js b/erpnext/projects/doctype/timesheet/timesheet.js
index b123af5..43a57e5 100644
--- a/erpnext/projects/doctype/timesheet/timesheet.js
+++ b/erpnext/projects/doctype/timesheet/timesheet.js
@@ -174,9 +174,10 @@
 
 		var $trigger_again = $('.form-grid').find('.grid-row').find('.btn-open-row');
 		$trigger_again.on('click', () => {
-			$('.form-grid')
-				.find('[data-fieldname="timer"]')
-				.append(frappe.render_template("timesheet"));
+			let $timer = $('.form-grid').find('[data-fieldname="timer"]');
+			if ($timer.get(0)) {
+				$timer.append(frappe.render_template("timesheet"));
+			}
 			frm.trigger("control_timer");
 		});
 	},
diff --git a/erpnext/public/css/email.css b/erpnext/public/css/email.css
deleted file mode 100644
index 8cf1a31..0000000
--- a/erpnext/public/css/email.css
+++ /dev/null
@@ -1,29 +0,0 @@
-.panel-header {
-  background-color: #fafbfc;
-  border: 1px solid #d1d8dd;
-  border-radius: 3px 3px 0 0;
-}
-.panel-body {
-  background-color: #fff;
-  border: 1px solid #d1d8dd;
-  border-top: none;
-  border-radius: 0 0 3px 3px;
-  overflow-wrap: break-word;
-}
-.sender-avatar {
-  width: 24px;
-  height: 24px;
-  border-radius: 3px;
-  vertical-align: middle;
-}
-.sender-avatar-placeholder {
-  width: 24px;
-  height: 24px;
-  border-radius: 3px;
-  vertical-align: middle;
-  line-height: 24px;
-  text-align: center;
-  color: #d1d8dd;
-  border: 1px solid #d1d8dd;
-  background-color: #fff;
-}
diff --git a/erpnext/public/css/erpnext.css b/erpnext/public/css/erpnext.css
deleted file mode 100644
index 6e4efcb..0000000
--- a/erpnext/public/css/erpnext.css
+++ /dev/null
@@ -1,408 +0,0 @@
-.erpnext-footer {
-  margin: 11px auto;
-  text-align: center;
-}
-.show-all-reports {
-  margin-top: 5px;
-  font-size: 11px;
-}
-/* toolbar */
-.toolbar-splash {
-  width: 32px;
-  height: 32px;
-  margin: -10px auto;
-}
-.erpnext-icon {
-  width: 24px;
-  margin-right: 0px;
-  margin-top: -3px;
-}
-.dashboard-list-item {
-  background-color: inherit;
-  padding: 5px 0px;
-  border-bottom: 1px solid #d1d8dd;
-}
-#page-stock-balance .dashboard-list-item {
-  padding: 5px 15px;
-}
-.dashboard-list-item:last-child {
-  border-bottom: none;
-}
-.frappe-control[data-fieldname='result_html'] {
-  overflow: scroll;
-}
-.assessment-result-tool {
-  table-layout: fixed;
-}
-.assessment-result-tool input {
-  width: 100%;
-  border: 0;
-  outline: none;
-  text-align: right;
-}
-.assessment-result-tool th {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.assessment-result-tool .total-score,
-.assessment-result-tool .grade,
-.assessment-result-tool .score {
-  text-align: right;
-}
-/* pos */
-body[data-route="pos"] .pos-bill-toolbar {
-  padding: 10px 0px;
-  height: 51px;
-}
-body[data-route="pos"] .pos-bill-item:hover,
-body[data-route="pos"] .list-customers-table > .pos-list-row:hover {
-  background-color: #f5f7fa;
-  cursor: pointer;
-}
-body[data-route="pos"] .pos-item-qty {
-  display: inline-block;
-}
-body[data-route="pos"] .pos-qty-row > div {
-  padding: 5px 0px;
-}
-body[data-route="pos"] .pos-qty-btn {
-  margin-top: 3px;
-  cursor: pointer;
-  font-size: 120%;
-}
-body[data-route="pos"] .search-area .form-group {
-  max-width: 100% !important;
-}
-body[data-route="pos"] .tax-table {
-  margin-bottom: 10px;
-}
-body[data-route="pos"] .discount-field-col {
-  padding-left: 24px;
-}
-body[data-route="pos"] .discount-amount-area .input-group:first-child {
-  margin-bottom: 2px;
-}
-body[data-route="pos"] .payment-toolbar .row {
-  width: 323px;
-  margin: 0 auto;
-}
-body[data-route="pos"] .payment-mode {
-  cursor: pointer;
-  font-family: sans-serif;
-  font-size: 15px;
-}
-body[data-route="pos"] .pos-payment-row .col-xs-6 {
-  padding: 15px;
-}
-body[data-route="pos"] .pos-payment-row {
-  border-bottom: 1px solid #d1d8dd;
-  margin: 2px 0px 5px 0px;
-  height: 60px;
-  margin-top: 0px;
-  margin-bottom: 0px;
-}
-body[data-route="pos"] .pos-payment-row:hover,
-body[data-route="pos"] .pos-keyboard-key:hover {
-  background-color: #fafbfc;
-  cursor: pointer;
-}
-body[data-route="pos"] .pos-keyboard-key,
-body[data-route="pos"] .delete-btn {
-  border: 1px solid #d1d8dd;
-  height: 85px;
-  width: 85px;
-  margin: 10px 10px;
-  font-size: 24px;
-  font-weight: 200;
-  background-color: #FDFDFD;
-  border-color: #e8e8e8;
-}
-body[data-route="pos"] .numeric-keypad {
-  border: 1px solid #d1d8dd;
-  height: 69px;
-  width: 69px;
-  font-size: 20px;
-  font-weight: 200;
-  background-color: #FDFDFD;
-  border-color: #e8e8e8;
-  margin-left: -4px;
-}
-body[data-route="pos"] .pos-pay {
-  height: 69px;
-  width: 69px;
-  font-size: 17px;
-  font-weight: 200;
-  margin-left: -4px;
-}
-body[data-route="pos"] .numeric-keypad {
-  height: 60px;
-  width: 60px;
-  font-size: 20px;
-  font-weight: 200;
-  border-radius: 0;
-  background-color: #fff;
-  margin-left: -4px;
-}
-@media (max-width: 1199px) {
-  body[data-route="pos"] .numeric-keypad {
-    height: 45px;
-    width: 45px;
-    font-size: 14px;
-  }
-}
-@media (max-width: 991px) {
-  body[data-route="pos"] .numeric-keypad {
-    height: 40px;
-    width: 40px;
-  }
-}
-body[data-route="pos"] .numeric_keypad {
-  margin-left: -15px;
-}
-body[data-route="pos"] .numeric_keypad > .row > button {
-  border: none;
-  border-right: 1px solid #d1d8dd;
-  border-bottom: 1px solid #d1d8dd;
-}
-body[data-route="pos"] .numeric_keypad > .row > button:first-child {
-  border-left: 1px solid #d1d8dd;
-}
-body[data-route="pos"] .numeric_keypad > .row:first-child > button {
-  border-top: 1px solid #d1d8dd;
-}
-body[data-route="pos"] .pos-pay {
-  background-color: #5E64FF;
-  border: none;
-}
-body[data-route="pos"] .multimode-payments {
-  padding-left: 30px;
-}
-body[data-route="pos"] .payment-toolbar {
-  padding-right: 30px;
-}
-body[data-route="pos"] .list-row-head.pos-invoice-list {
-  border-top: 1px solid #d1d8dd;
-}
-body[data-route="pos"] .modal-dialog {
-  width: 750px;
-}
-@media (max-width: 767px) {
-  body[data-route="pos"] .modal-dialog {
-    width: auto;
-  }
-  body[data-route="pos"] .modal-dialog .modal-content {
-    height: auto;
-  }
-}
-@media (max-width: 767px) {
-  body[data-route="pos"] .amount-row h3 {
-    font-size: 15px;
-  }
-  body[data-route="pos"] .pos-keyboard-key,
-  body[data-route="pos"] .delete-btn {
-    height: 50px;
-  }
-  body[data-route="pos"] .multimode-payments {
-    padding-left: 15px;
-  }
-  body[data-route="pos"] .payment-toolbar {
-    padding-right: 15px;
-  }
-}
-body[data-route="pos"] .amount-label {
-  font-size: 16px;
-}
-body[data-route="pos"] .selected-payment-mode {
-  background-color: #fafbfc;
-  cursor: pointer;
-}
-body[data-route="pos"] .pos-invoice-list {
-  padding: 15px 10px;
-}
-body[data-route="pos"] .write_off_amount,
-body[data-route="pos"] .change_amount {
-  margin: 15px;
-  width: 130px;
-}
-body[data-route="pos"] .pos-list-row {
-  display: table;
-  table-layout: fixed;
-  width: 100%;
-  padding: 9px 15px;
-  font-size: 12px;
-  margin: 0px;
-  border-bottom: 1px solid #d1d8dd;
-}
-body[data-route="pos"] .pos-list-row .cell {
-  display: table-cell;
-  vertical-align: middle;
-}
-body[data-route="pos"] .pos-list-row .cell.price-cell {
-  width: 50%;
-}
-body[data-route="pos"] .pos-list-row .subject {
-  width: 40%;
-}
-body[data-route="pos"] .pos-list-row .list-row-checkbox,
-body[data-route="pos"] .pos-list-row .list-select-all {
-  margin-right: 7px;
-}
-body[data-route="pos"] .pos-bill-header {
-  background-color: #f5f7fa;
-  border: 1px solid #d1d8dd;
-  padding: 13px 15px;
-}
-body[data-route="pos"] .pos-list-row.active {
-  background-color: #fffce7;
-}
-body[data-route="pos"] .totals-area {
-  border-right: 1px solid #d1d8dd;
-  border-left: 1px solid #d1d8dd;
-  margin-bottom: 15px;
-}
-body[data-route="pos"] .tax-area .pos-list-row {
-  border: none;
-}
-body[data-route="pos"] .item-cart-items {
-  height: calc(100vh - 526px);
-  overflow: auto;
-  border: 1px solid #d1d8dd;
-  border-top: none;
-}
-@media (max-width: 767px) {
-  body[data-route="pos"] .item-cart-items {
-    height: 30vh;
-  }
-}
-body[data-route="pos"] .no-items-message {
-  min-height: 200px;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  height: 100%;
-}
-body[data-route="pos"] .pos-list-row:last-child {
-  border-bottom: none;
-}
-body[data-route="pos"] .form-section-heading {
-  padding: 0;
-}
-body[data-route="pos"] .item-list {
-  border: 1px solid #d1d8dd;
-  border-top: none;
-  max-height: calc(100vh - 190px);
-  overflow: auto;
-}
-@media (max-width: 767px) {
-  body[data-route="pos"] .item-list {
-    max-height: initial;
-  }
-}
-body[data-route="pos"] .item-list .image-field {
-  height: 140px;
-}
-body[data-route="pos"] .item-list .image-field .placeholder-text {
-  font-size: 50px;
-}
-body[data-route="pos"] .item-list .pos-item-wrapper {
-  position: relative;
-}
-body[data-route="pos"] .pos-bill-toolbar {
-  margin-top: 10px;
-}
-body[data-route="pos"] .search-item .form-group {
-  margin: 0;
-}
-body[data-route="pos"] .item-list-area .pos-bill-header {
-  padding: 5px;
-  padding-left: 15px;
-}
-body[data-route="pos"] .pos-selected-item-action .pos-list-row:first-child {
-  padding-top: 0;
-}
-body[data-route="pos"] .pos-selected-item-action > .pos-list-row {
-  border: none;
-}
-@media (max-width: 1199px) {
-  body[data-route="pos"] .pos-selected-item-action > .pos-list-row {
-    padding: 5px 15px;
-  }
-}
-body[data-route="pos"] .edit-customer-btn {
-  position: absolute;
-  right: 57px;
-  top: 15px;
-  z-index: 100;
-}
-body[data-route="pos"] .btn-more {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  cursor: pointer;
-  background-color: #fafbfc;
-  min-height: 200px;
-}
-body[data-route="pos"] .collapse-btn {
-  cursor: pointer;
-}
-@media (max-width: 767px) {
-  body[data-route="pos"] .page-actions {
-    max-width: 110px;
-  }
-}
-.price-info {
-  position: absolute;
-  left: 0;
-  bottom: 0;
-  margin: 0 0 15px 15px;
-  background-color: rgba(141, 153, 166, 0.6);
-  padding: 5px 9px;
-  border-radius: 3px;
-  color: #fff;
-}
-.leaderboard .result {
-  border-top: 1px solid #d1d8dd;
-}
-.leaderboard .list-item {
-  padding-left: 45px;
-}
-.leaderboard .list-item_content {
-  padding-right: 45px;
-}
-.exercise-card {
-	box-shadow: 0 1px 3px rgba(0,0,0,0.30);
-	border-radius: 2px;
-	padding: 6px 6px 6px 8px;
-	margin-top: 10px;
-	height: 100% !important;
-}
-.exercise-card .card-img-top {
-	width: 100%;
-	height: 15vw;
-	object-fit: cover;
-}
-.exercise-card .btn-edit {
-	position: absolute;
-	bottom: 10px;
-	left: 20px;
-}
-.exercise-card .btn-del {
-	position: absolute;
-	bottom: 10px;
-	left: 50px;
-}
-.exercise-card .card-body {
-		margin-bottom: 10px;
-}
-.exercise-card .card-footer {
-		padding: 10px;
-}
-.exercise-row {
-	height: 100% !important;
-	display: flex;
-	flex-wrap: wrap;
-}
-.exercise-col {
-	padding: 10px;
-}
diff --git a/erpnext/public/css/leaflet/leaflet.css b/erpnext/public/css/leaflet/leaflet.css
deleted file mode 100755
index 979a8bd..0000000
--- a/erpnext/public/css/leaflet/leaflet.css
+++ /dev/null
@@ -1,611 +0,0 @@
-/* required styles */

-

-.leaflet-pane,

-.leaflet-tile,

-.leaflet-marker-icon,

-.leaflet-marker-shadow,

-.leaflet-tile-container,

-.leaflet-map-pane svg,

-.leaflet-map-pane canvas,

-.leaflet-zoom-box,

-.leaflet-image-layer,

-.leaflet-layer {

-    position: absolute;

-    left: 0;

-    top: 0;

-}

-

-.leaflet-container {

-    overflow: hidden;

-    -ms-touch-action: none;

-    touch-action: none;

-}

-

-.leaflet-tile,

-.leaflet-marker-icon,

-.leaflet-marker-shadow {

-    -webkit-user-select: none;

-    -moz-user-select: none;

-    user-select: none;

-    -webkit-user-drag: none;

-}

-

-

-/* Safari renders non-retina tile on retina better with this, but Chrome is worse */

-

-.leaflet-safari .leaflet-tile {

-    image-rendering: -webkit-optimize-contrast;

-}

-

-

-/* hack that prevents hw layers "stretching" when loading new tiles */

-

-.leaflet-safari .leaflet-tile-container {

-    width: 1600px;

-    height: 1600px;

-    -webkit-transform-origin: 0 0;

-}

-

-.leaflet-marker-icon,

-.leaflet-marker-shadow {

-    display: block;

-}

-

-

-/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */

-

-

-/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */

-

-.leaflet-container .leaflet-overlay-pane svg,

-.leaflet-container .leaflet-marker-pane img,

-.leaflet-container .leaflet-tile-pane img,

-.leaflet-container img.leaflet-image-layer {

-    max-width: none !important;

-}

-

-.leaflet-tile {

-    filter: inherit;

-    visibility: hidden;

-}

-

-.leaflet-tile-loaded {

-    visibility: inherit;

-}

-

-.leaflet-zoom-box {

-    width: 0;

-    height: 0;

-    -moz-box-sizing: border-box;

-    box-sizing: border-box;

-    z-index: 800;

-}

-

-

-/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */

-

-.leaflet-overlay-pane svg {

-    -moz-user-select: none;

-}

-

-.leaflet-pane {

-    z-index: 400;

-}

-

-.leaflet-tile-pane {

-    z-index: 200;

-}

-

-.leaflet-overlay-pane {

-    z-index: 400;

-}

-

-.leaflet-shadow-pane {

-    z-index: 500;

-}

-

-.leaflet-marker-pane {

-    z-index: 600;

-}

-

-.leaflet-popup-pane {

-    z-index: 700;

-}

-

-.leaflet-map-pane canvas {

-    z-index: 100;

-}

-

-.leaflet-map-pane svg {

-    z-index: 200;

-}

-

-.leaflet-vml-shape {

-    width: 1px;

-    height: 1px;

-}

-

-.lvml {

-    behavior: url(#default#VML);

-    display: inline-block;

-    position: absolute;

-}

-

-

-/* control positioning */

-

-.leaflet-control {

-    position: relative;

-    z-index: 800;

-    pointer-events: auto;

-}

-

-.leaflet-top,

-.leaflet-bottom {

-    position: absolute;

-    z-index: 1000;

-    pointer-events: none;

-}

-

-.leaflet-top {

-    top: 0;

-}

-

-.leaflet-right {

-    right: 0;

-}

-

-.leaflet-bottom {

-    bottom: 0;

-}

-

-.leaflet-left {

-    left: 0;

-}

-

-.leaflet-control {

-    float: left;

-    clear: both;

-}

-

-.leaflet-right .leaflet-control {

-    float: right;

-}

-

-.leaflet-top .leaflet-control {

-    margin-top: 10px;

-}

-

-.leaflet-bottom .leaflet-control {

-    margin-bottom: 10px;

-}

-

-.leaflet-left .leaflet-control {

-    margin-left: 10px;

-}

-

-.leaflet-right .leaflet-control {

-    margin-right: 10px;

-}

-

-

-/* zoom and fade animations */

-

-.leaflet-fade-anim .leaflet-tile {

-    will-change: opacity;

-}

-

-.leaflet-fade-anim .leaflet-popup {

-    opacity: 0;

-    -webkit-transition: opacity 0.2s linear;

-    -moz-transition: opacity 0.2s linear;

-    -o-transition: opacity 0.2s linear;

-    transition: opacity 0.2s linear;

-}

-

-.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {

-    opacity: 1;

-}

-

-.leaflet-zoom-animated {

-    -webkit-transform-origin: 0 0;

-    -ms-transform-origin: 0 0;

-    transform-origin: 0 0;

-}

-

-.leaflet-zoom-anim .leaflet-zoom-animated {

-    will-change: transform;

-}

-

-.leaflet-zoom-anim .leaflet-zoom-animated {

-    -webkit-transition: -webkit-transform 0.25s cubic-bezier(0, 0, 0.25, 1);

-    -moz-transition: -moz-transform 0.25s cubic-bezier(0, 0, 0.25, 1);

-    -o-transition: -o-transform 0.25s cubic-bezier(0, 0, 0.25, 1);

-    transition: transform 0.25s cubic-bezier(0, 0, 0.25, 1);

-}

-

-.leaflet-zoom-anim .leaflet-tile,

-.leaflet-pan-anim .leaflet-tile {

-    -webkit-transition: none;

-    -moz-transition: none;

-    -o-transition: none;

-    transition: none;

-}

-

-.leaflet-zoom-anim .leaflet-zoom-hide {

-    visibility: hidden;

-}

-

-

-/* cursors */

-

-.leaflet-interactive {

-    cursor: pointer;

-}

-

-.leaflet-grab {

-    cursor: -webkit-grab;

-    cursor: -moz-grab;

-}

-

-.leaflet-crosshair,

-.leaflet-crosshair .leaflet-interactive {

-    cursor: crosshair;

-}

-

-.leaflet-popup-pane,

-.leaflet-control {

-    cursor: auto;

-}

-

-.leaflet-dragging .leaflet-grab,

-.leaflet-dragging .leaflet-grab .leaflet-interactive,

-.leaflet-dragging .leaflet-marker-draggable {

-    cursor: move;

-    cursor: -webkit-grabbing;

-    cursor: -moz-grabbing;

-}

-

-

-/* visual tweaks */

-

-.leaflet-container {

-    background: #ddd;

-    outline: 0;

-}

-

-.leaflet-container a {

-    color: #0078A8;

-}

-

-.leaflet-container a.leaflet-active {

-    outline: 2px solid orange;

-}

-

-.leaflet-zoom-box {

-    border: 2px dotted #38f;

-    background: rgba(255, 255, 255, 0.5);

-}

-

-

-/* general typography */

-

-.leaflet-container {

-    font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;

-}

-

-

-/* general toolbar styles */

-

-.leaflet-bar {

-    box-shadow: 0 1px 5px rgba(0, 0, 0, 0.65);

-    border-radius: 4px;

-}

-

-.leaflet-bar a,

-.leaflet-bar a:hover {

-    background-color: #fff;

-    border-bottom: 1px solid #ccc;

-    width: 26px;

-    height: 26px;

-    line-height: 26px;

-    display: block;

-    text-align: center;

-    text-decoration: none;

-    color: black;

-}

-

-.leaflet-bar a,

-.leaflet-control-layers-toggle {

-    background-position: 50% 50%;

-    background-repeat: no-repeat;

-    display: block;

-}

-

-.leaflet-bar a:hover {

-    background-color: #f4f4f4;

-}

-

-.leaflet-bar a:first-child {

-    border-top-left-radius: 4px;

-    border-top-right-radius: 4px;

-}

-

-.leaflet-bar a:last-child {

-    border-bottom-left-radius: 4px;

-    border-bottom-right-radius: 4px;

-    border-bottom: none;

-}

-

-.leaflet-bar a.leaflet-disabled {

-    cursor: default;

-    background-color: #f4f4f4;

-    color: #bbb;

-}

-

-.leaflet-touch .leaflet-bar a {

-    width: 30px;

-    height: 30px;

-    line-height: 30px;

-}

-

-

-/* zoom control */

-

-.leaflet-control-zoom-in,

-.leaflet-control-zoom-out {

-    font: bold 18px 'Lucida Console', Monaco, monospace;

-    text-indent: 1px;

-}

-

-.leaflet-control-zoom-out {

-    font-size: 20px;

-}

-

-.leaflet-touch .leaflet-control-zoom-in {

-    font-size: 22px;

-}

-

-.leaflet-touch .leaflet-control-zoom-out {

-    font-size: 24px;

-}

-

-

-/* layers control */

-

-.leaflet-control-layers {

-    box-shadow: 0 1px 5px rgba(0, 0, 0, 0.4);

-    background: #fff;

-    border-radius: 5px;

-}

-

-.leaflet-control-layers-toggle {

-    background-image: url('assets/erpnext/images/leaflet/layers.png');

-    width: 36px;

-    height: 36px;

-}

-

-.leaflet-retina .leaflet-control-layers-toggle {

-    background-image: url('assets/erpnext/images/leaflet/layers-2x.png');

-    background-size: 26px 26px;

-}

-

-.leaflet-touch .leaflet-control-layers-toggle {

-    width: 44px;

-    height: 44px;

-}

-

-.leaflet-control-layers .leaflet-control-layers-list,

-.leaflet-control-layers-expanded .leaflet-control-layers-toggle {

-    display: none;

-}

-

-.leaflet-control-layers-expanded .leaflet-control-layers-list {

-    display: block;

-    position: relative;

-}

-

-.leaflet-control-layers-expanded {

-    padding: 6px 10px 6px 6px;

-    color: #333;

-    background: #fff;

-}

-

-.leaflet-control-layers-scrollbar {

-    overflow-y: scroll;

-    padding-right: 5px;

-}

-

-.leaflet-control-layers-selector {

-    margin-top: 2px;

-    position: relative;

-    top: 1px;

-}

-

-.leaflet-control-layers label {

-    display: block;

-}

-

-.leaflet-control-layers-separator {

-    height: 0;

-    border-top: 1px solid #ddd;

-    margin: 5px -10px 5px -6px;

-}

-

-

-/* attribution and scale controls */

-

-.leaflet-container .leaflet-control-attribution {

-    background: #fff;

-    background: rgba(255, 255, 255, 0.7);

-    margin: 0;

-}

-

-.leaflet-control-attribution,

-.leaflet-control-scale-line {

-    padding: 0 5px;

-    color: #333;

-}

-

-.leaflet-control-attribution a {

-    text-decoration: none;

-}

-

-.leaflet-control-attribution a:hover {

-    text-decoration: underline;

-}

-

-.leaflet-container .leaflet-control-attribution,

-.leaflet-container .leaflet-control-scale {

-    font-size: 11px;

-}

-

-.leaflet-left .leaflet-control-scale {

-    margin-left: 5px;

-}

-

-.leaflet-bottom .leaflet-control-scale {

-    margin-bottom: 5px;

-}

-

-.leaflet-control-scale-line {

-    border: 2px solid #777;

-    border-top: none;

-    line-height: 1.1;

-    padding: 2px 5px 1px;

-    font-size: 11px;

-    white-space: nowrap;

-    overflow: hidden;

-    -moz-box-sizing: border-box;

-    box-sizing: border-box;

-    background: #fff;

-    background: rgba(255, 255, 255, 0.5);

-}

-

-.leaflet-control-scale-line:not(:first-child) {

-    border-top: 2px solid #777;

-    border-bottom: none;

-    margin-top: -2px;

-}

-

-.leaflet-control-scale-line:not(:first-child):not(:last-child) {

-    border-bottom: 2px solid #777;

-}

-

-.leaflet-touch .leaflet-control-attribution,

-.leaflet-touch .leaflet-control-layers,

-.leaflet-touch .leaflet-bar {

-    box-shadow: none;

-}

-

-.leaflet-touch .leaflet-control-layers,

-.leaflet-touch .leaflet-bar {

-    border: 2px solid rgba(0, 0, 0, 0.2);

-    background-clip: padding-box;

-}

-

-

-/* popup */

-

-.leaflet-popup {

-    position: absolute;

-    text-align: center;

-}

-

-.leaflet-popup-content-wrapper {

-    padding: 1px;

-    text-align: left;

-    border-radius: 12px;

-}

-

-.leaflet-popup-content {

-    margin: 13px 19px;

-    line-height: 1.4;

-}

-

-.leaflet-popup-content p {

-    margin: 18px 0;

-}

-

-.leaflet-popup-tip-container {

-    margin: 0 auto;

-    width: 40px;

-    height: 20px;

-    position: relative;

-    overflow: hidden;

-}

-

-.leaflet-popup-tip {

-    width: 17px;

-    height: 17px;

-    padding: 1px;

-    margin: -10px auto 0;

-    -webkit-transform: rotate(45deg);

-    -moz-transform: rotate(45deg);

-    -ms-transform: rotate(45deg);

-    -o-transform: rotate(45deg);

-    transform: rotate(45deg);

-}

-

-.leaflet-popup-content-wrapper,

-.leaflet-popup-tip {

-    background: white;

-    color: #333;

-    box-shadow: 0 3px 14px rgba(0, 0, 0, 0.4);

-}

-

-.leaflet-container a.leaflet-popup-close-button {

-    position: absolute;

-    top: 0;

-    right: 0;

-    padding: 4px 4px 0 0;

-    border: none;

-    text-align: center;

-    width: 18px;

-    height: 14px;

-    font: 16px/14px Tahoma, Verdana, sans-serif;

-    color: #c3c3c3;

-    text-decoration: none;

-    font-weight: bold;

-    background: transparent;

-}

-

-.leaflet-container a.leaflet-popup-close-button:hover {

-    color: #999;

-}

-

-.leaflet-popup-scrolled {

-    overflow: auto;

-    border-bottom: 1px solid #ddd;

-    border-top: 1px solid #ddd;

-}

-

-.leaflet-oldie .leaflet-popup-content-wrapper {

-    zoom: 1;

-}

-

-.leaflet-oldie .leaflet-popup-tip {

-    width: 24px;

-    margin: 0 auto;

-    -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";

-    filter: progid: DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);

-}

-

-.leaflet-oldie .leaflet-popup-tip-container {

-    margin-top: -1px;

-}

-

-.leaflet-oldie .leaflet-control-zoom,

-.leaflet-oldie .leaflet-control-layers,

-.leaflet-oldie .leaflet-popup-content-wrapper,

-.leaflet-oldie .leaflet-popup-tip {

-    border: 1px solid #999;

-}

-

-

-/* div icon */

-

-.leaflet-div-icon {

-    background: #fff;

-    border: 1px solid #666;

-}
\ No newline at end of file
diff --git a/erpnext/public/css/leaflet/leaflet.draw.css b/erpnext/public/css/leaflet/leaflet.draw.css
deleted file mode 100755
index 6fb7db0..0000000
--- a/erpnext/public/css/leaflet/leaflet.draw.css
+++ /dev/null
@@ -1,316 +0,0 @@
-/* ================================================================== */
-
-
-/* Toolbars
-/* ================================================================== */
-
-.leaflet-draw-section {
-    position: relative;
-}
-
-.leaflet-draw-toolbar {
-    margin-top: 12px;
-}
-
-.leaflet-draw-toolbar-top {
-    margin-top: 0;
-}
-
-.leaflet-draw-toolbar-notop a:first-child {
-    border-top-right-radius: 0;
-}
-
-.leaflet-draw-toolbar-nobottom a:last-child {
-    border-bottom-right-radius: 0;
-}
-
-.leaflet-draw-toolbar a {
-    background-image: url('assets/erpnext/images/leaflet/spritesheet.png');
-    background-repeat: no-repeat;
-}
-
-.leaflet-retina .leaflet-draw-toolbar a {
-    background-image: url('assets/erpnext/images/leaflet/spritesheet-2x.png');
-    background-size: 270px 30px;
-}
-
-.leaflet-draw a {
-    display: block;
-    text-align: center;
-    text-decoration: none;
-}
-
-
-/* ================================================================== */
-
-
-/* Toolbar actions menu
-/* ================================================================== */
-
-.leaflet-draw-actions {
-    display: none;
-    list-style: none;
-    margin: 0;
-    padding: 0;
-    position: absolute;
-    left: 26px;
-    /* leaflet-draw-toolbar.left + leaflet-draw-toolbar.width */
-    top: 0;
-    white-space: nowrap;
-}
-
-.leaflet-right .leaflet-draw-actions {
-    right: 26px;
-    left: auto;
-}
-
-.leaflet-draw-actions li {
-    display: inline-block;
-}
-
-.leaflet-draw-actions li:first-child a {
-    border-left: none;
-}
-
-.leaflet-draw-actions li:last-child a {
-    -webkit-border-radius: 0 4px 4px 0;
-    border-radius: 0 4px 4px 0;
-}
-
-.leaflet-right .leaflet-draw-actions li:last-child a {
-    -webkit-border-radius: 0;
-    border-radius: 0;
-}
-
-.leaflet-right .leaflet-draw-actions li:first-child a {
-    -webkit-border-radius: 4px 0 0 4px;
-    border-radius: 4px 0 0 4px;
-}
-
-.leaflet-draw-actions a {
-    background-color: #919187;
-    border-left: 1px solid #AAA;
-    color: #FFF;
-    font: 11px/19px "Helvetica Neue", Arial, Helvetica, sans-serif;
-    line-height: 28px;
-    text-decoration: none;
-    padding-left: 10px;
-    padding-right: 10px;
-    height: 28px;
-}
-
-.leaflet-draw-actions-bottom {
-    margin-top: 0;
-}
-
-.leaflet-draw-actions-top {
-    margin-top: 1px;
-}
-
-.leaflet-draw-actions-top a,
-.leaflet-draw-actions-bottom a {
-    height: 27px;
-    line-height: 27px;
-}
-
-.leaflet-draw-actions a:hover {
-    background-color: #A0A098;
-}
-
-.leaflet-draw-actions-top.leaflet-draw-actions-bottom a {
-    height: 26px;
-    line-height: 26px;
-}
-
-
-/* ================================================================== */
-
-
-/* Draw toolbar
-/* ================================================================== */
-
-.leaflet-draw-toolbar .leaflet-draw-draw-polyline {
-    background-position: -2px -2px;
-}
-
-.leaflet-draw-toolbar .leaflet-draw-draw-polygon {
-    background-position: -31px -2px;
-}
-
-.leaflet-draw-toolbar .leaflet-draw-draw-rectangle {
-    background-position: -62px -2px;
-}
-
-.leaflet-draw-toolbar .leaflet-draw-draw-circle {
-    background-position: -92px -2px;
-}
-
-.leaflet-draw-toolbar .leaflet-draw-draw-marker {
-    background-position: -122px -2px;
-}
-
-
-/* ================================================================== */
-
-
-/* Edit toolbar
-/* ================================================================== */
-
-.leaflet-draw-toolbar .leaflet-draw-edit-edit {
-    background-position: -152px -2px;
-}
-
-.leaflet-draw-toolbar .leaflet-draw-edit-remove {
-    background-position: -182px -2px;
-}
-
-.leaflet-draw-toolbar .leaflet-draw-edit-edit.leaflet-disabled {
-    background-position: -212px -2px;
-}
-
-.leaflet-draw-toolbar .leaflet-draw-edit-remove.leaflet-disabled {
-    background-position: -242px -2px;
-}
-
-
-/* ================================================================== */
-
-
-/* Drawing styles
-/* ================================================================== */
-
-.leaflet-mouse-marker {
-    background-color: #fff;
-    cursor: crosshair;
-}
-
-.leaflet-draw-tooltip {
-    background: rgb(54, 54, 54);
-    background: rgba(0, 0, 0, 0.5);
-    border: 1px solid transparent;
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-    color: #fff;
-    font: 12px/18px "Helvetica Neue", Arial, Helvetica, sans-serif;
-    margin-left: 20px;
-    margin-top: -21px;
-    padding: 4px 8px;
-    position: absolute;
-    visibility: hidden;
-    white-space: nowrap;
-    z-index: 6;
-}
-
-.leaflet-draw-tooltip:before {
-    border-right: 6px solid black;
-    border-right-color: rgba(0, 0, 0, 0.5);
-    border-top: 6px solid transparent;
-    border-bottom: 6px solid transparent;
-    content: "";
-    position: absolute;
-    top: 7px;
-    left: -7px;
-}
-
-.leaflet-error-draw-tooltip {
-    background-color: #F2DEDE;
-    border: 1px solid #E6B6BD;
-    color: #B94A48;
-}
-
-.leaflet-error-draw-tooltip:before {
-    border-right-color: #E6B6BD;
-}
-
-.leaflet-draw-tooltip-single {
-    margin-top: -12px
-}
-
-.leaflet-draw-tooltip-subtext {
-    color: #f8d5e4;
-}
-
-.leaflet-draw-guide-dash {
-    font-size: 1%;
-    opacity: 0.6;
-    position: absolute;
-    width: 5px;
-    height: 5px;
-}
-
-
-/* ================================================================== */
-
-
-/* Edit styles
-/* ================================================================== */
-
-.leaflet-edit-marker-selected {
-    background: rgba(254, 87, 161, 0.1);
-    border: 4px dashed rgba(254, 87, 161, 0.6);
-    -webkit-border-radius: 4px;
-    border-radius: 4px;
-}
-
-.leaflet-edit-move {
-    cursor: move;
-}
-
-.leaflet-edit-resize {
-    cursor: pointer;
-}
-
-
-/* ================================================================== */
-
-
-/* Old IE styles
-/* ================================================================== */
-
-.leaflet-oldie .leaflet-draw-toolbar {
-    border: 3px solid #999;
-}
-
-.leaflet-oldie .leaflet-draw-toolbar a {
-    background-color: #eee;
-}
-
-.leaflet-oldie .leaflet-draw-toolbar a:hover {
-    background-color: #fff;
-}
-
-.leaflet-oldie .leaflet-draw-actions {
-    left: 32px;
-    margin-top: 3px;
-}
-
-.leaflet-oldie .leaflet-draw-actions li {
-    display: inline;
-    zoom: 1;
-}
-
-.leaflet-oldie .leaflet-edit-marker-selected {
-    border: 4px dashed #fe93c2;
-}
-
-.leaflet-oldie .leaflet-draw-actions a {
-    background-color: #999;
-}
-
-.leaflet-oldie .leaflet-draw-actions a:hover {
-    background-color: #a5a5a5;
-}
-
-.leaflet-oldie .leaflet-draw-actions-top a {
-    margin-top: 1px;
-}
-
-.leaflet-oldie .leaflet-draw-actions-bottom a {
-    height: 28px;
-    line-height: 28px;
-}
-
-.leaflet-oldie .leaflet-draw-actions-top.leaflet-draw-actions-bottom a {
-    height: 27px;
-    line-height: 27px;
-}
\ No newline at end of file
diff --git a/erpnext/public/js/account_tree_grid.js b/erpnext/public/js/account_tree_grid.js
index 757f33e..413a5ee 100644
--- a/erpnext/public/js/account_tree_grid.js
+++ b/erpnext/public/js/account_tree_grid.js
@@ -14,9 +14,9 @@
 // You should have received a copy of the GNU General Public License
 // along with this program.	If not, see <http://www.gnu.org/licenses/>.
 
-erpnext.AccountTreeGrid = frappe.views.TreeGridReport.extend({
-	init: function(wrapper, title) {
-		this._super({
+erpnext.AccountTreeGrid = class AccountTreeGrid extends frappe.views.TreeGridReport {
+	constructor(wrapper, title) {
+		super({
 			title: title,
 			parent: $(wrapper).find('.layout-main'),
 			page: wrapper.page,
@@ -33,8 +33,24 @@
 				}
 			},
 		});
-	},
-	setup_columns: function() {
+
+		this.filters = [
+			{fieldtype: "Select", label: __("Company"), link:"Company", fieldname: "company",
+				default_value: __("Select Company..."),
+				filter: function(val, item, opts, me) {
+					if (item.company == val || val == opts.default_value) {
+						return me.apply_zero_filter(val, item, opts, me);
+					}
+					return false;
+				}},
+			{fieldtype: "Select", label: "Fiscal Year", link:"Fiscal Year", fieldname: "fiscal_year",
+				default_value: __("Select Fiscal Year...")},
+			{fieldtype: "Date", label: __("From Date"), fieldname: "from_date"},
+			{fieldtype: "Label", label: __("To")},
+			{fieldtype: "Date", label: __("To Date"), fieldname: "to_date"}
+		]
+	}
+	setup_columns() {
 		this.columns = [
 			{id: "name", name: __("Account"), field: "name", width: 300, cssClass: "cell-title"},
 			{id: "opening_dr", name: __("Opening (Dr)"), field: "opening_dr", width: 100,
@@ -50,25 +66,10 @@
 			{id: "closing_cr", name: __("Closing (Cr)"), field: "closing_cr", width: 100,
 				formatter: this.currency_formatter}
 		];
+	}
 
-	},
-	filters: [
-		{fieldtype: "Select", label: __("Company"), link:"Company", fieldname: "company",
-			default_value: __("Select Company..."),
-			filter: function(val, item, opts, me) {
-				if (item.company == val || val == opts.default_value) {
-					return me.apply_zero_filter(val, item, opts, me);
-				}
-				return false;
-			}},
-		{fieldtype: "Select", label: "Fiscal Year", link:"Fiscal Year", fieldname: "fiscal_year",
-			default_value: __("Select Fiscal Year...")},
-		{fieldtype: "Date", label: __("From Date"), fieldname: "from_date"},
-		{fieldtype: "Label", label: __("To")},
-		{fieldtype: "Date", label: __("To Date"), fieldname: "to_date"}
-	],
-	setup_filters: function() {
-		this._super();
+	setup_filters() {
+		super.setup_filters();
 		var me = this;
 		// default filters
 		this.filter_inputs.fiscal_year.change(function() {
@@ -83,8 +84,8 @@
 		});
 		me.show_zero_check()
 		if(me.ignore_closing_entry) me.ignore_closing_entry();
-	},
-	prepare_data: function() {
+	}
+	prepare_data() {
 		var me = this;
 		if(!this.primary_data) {
 			// make accounts list
@@ -113,12 +114,12 @@
 		this.set_indent();
 		this.prepare_balances();
 
-	},
-	init_account: function(d) {
+	}
+	init_account(d) {
 		this.reset_item_values(d);
-	},
+	}
 
-	prepare_balances: function() {
+	prepare_balances() {
 		var gl = frappe.report_dump.data['GL Entry'];
 		var me = this;
 
@@ -139,8 +140,8 @@
 		});
 
 		this.update_groups();
-	},
-	update_balances: function(account, posting_date, v) {
+	}
+	update_balances(account, posting_date, v) {
 		// opening
 		if (posting_date < this.opening_date || v.is_opening === "Yes") {
 			if (account.report_type === "Profit and Loss" &&
@@ -161,8 +162,8 @@
 		var closing_bal = flt(account.opening_dr) - flt(account.opening_cr) +
 			flt(account.debit) - flt(account.credit);
 		this.set_debit_or_credit(account, "closing", closing_bal);
-	},
-	set_debit_or_credit: function(account, field, balance) {
+	}
+	set_debit_or_credit(account, field, balance) {
 		if(balance > 0) {
 			account[field+"_dr"] = balance;
 			account[field+"_cr"] = 0;
@@ -170,8 +171,8 @@
 			account[field+"_cr"] = Math.abs(balance);
 			account[field+"_dr"] = 0;
 		}
-	},
-	update_groups: function() {
+	}
+	update_groups() {
 		// update groups
 		var me= this;
 		$.each(this.data, function(i, account) {
@@ -202,9 +203,9 @@
 				}
 			}
 		});
-	},
+	}
 
-	set_fiscal_year: function() {
+	set_fiscal_year() {
 		if (this.opening_date > this.closing_date) {
 			frappe.msgprint(__("Opening Date should be before Closing Date"));
 			return;
@@ -223,9 +224,9 @@
 			frappe.msgprint(__("Opening Date and Closing Date should be within same Fiscal Year"));
 			return;
 		}
-	},
+	}
 
-	show_general_ledger: function(account) {
+	show_general_ledger(account) {
 		frappe.route_options = {
 			account: account,
 			company: this.company,
@@ -234,4 +235,4 @@
 		};
 		frappe.set_route("query-report", "General Ledger");
 	}
-});
+};
diff --git a/erpnext/public/js/bank-reconciliation-tool.bundle.js b/erpnext/public/js/bank-reconciliation-tool.bundle.js
new file mode 100644
index 0000000..636ef18
--- /dev/null
+++ b/erpnext/public/js/bank-reconciliation-tool.bundle.js
@@ -0,0 +1,3 @@
+import "./bank_reconciliation_tool/data_table_manager";
+import "./bank_reconciliation_tool/number_card";
+import "./bank_reconciliation_tool/dialog_manager";
diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js
index cdfd909..8b4a497 100644
--- a/erpnext/public/js/controllers/buying.js
+++ b/erpnext/public/js/controllers/buying.js
@@ -9,14 +9,14 @@
 
 cur_frm.email_field = "contact_email";
 
-erpnext.buying.BuyingController = erpnext.TransactionController.extend({
-	setup: function() {
-		this._super();
-	},
+erpnext.buying.BuyingController = class BuyingController extends erpnext.TransactionController {
+	setup() {
+		super.setup();
+	}
 
-	onload: function(doc, cdt, cdn) {
+	onload(doc, cdt, cdn) {
 		this.setup_queries(doc, cdt, cdn);
-		this._super();
+		super.onload();
 
 		this.frm.set_query('shipping_rule', function() {
 			return {
@@ -48,9 +48,9 @@
 			});
 		}
 		/* eslint-enable */
-	},
+	}
 
-	setup_queries: function(doc, cdt, cdn) {
+	setup_queries(doc, cdt, cdn) {
 		var me = this;
 
 		if(this.frm.fields_dict.buying_price_list) {
@@ -109,9 +109,9 @@
 				return me.set_query_for_item_tax_template(doc, cdt, cdn)
 			});
 		}
-	},
+	}
 
-	refresh: function(doc) {
+	refresh(doc) {
 		frappe.dynamic_link = {doc: this.frm.doc, fieldname: 'supplier', doctype: 'Supplier'};
 
 		this.frm.toggle_display("supplier_name",
@@ -122,38 +122,38 @@
 			this.set_from_product_bundle();
 		}
 
-		this._super();
-	},
+		super.refresh();
+	}
 
-	supplier: function() {
+	supplier() {
 		var me = this;
 		erpnext.utils.get_party_details(this.frm, null, null, function(){
 			me.apply_price_list();
 		});
-	},
+	}
 
-	supplier_address: function() {
+	supplier_address() {
 		erpnext.utils.get_address_display(this.frm);
 		erpnext.utils.set_taxes_from_address(this.frm, "supplier_address", "supplier_address", "supplier_address");
-	},
+	}
 
-	buying_price_list: function() {
+	buying_price_list() {
 		this.apply_price_list();
-	},
+	}
 
-	discount_percentage: function(doc, cdt, cdn) {
+	discount_percentage(doc, cdt, cdn) {
 		var item = frappe.get_doc(cdt, cdn);
 		item.discount_amount = 0.0;
 		this.price_list_rate(doc, cdt, cdn);
-	},
+	}
 
-	discount_amount: function(doc, cdt, cdn) {
+	discount_amount(doc, cdt, cdn) {
 		var item = frappe.get_doc(cdt, cdn);
 		item.discount_percentage = 0.0;
 		this.price_list_rate(doc, cdt, cdn);
-	},
+	}
 
-	qty: function(doc, cdt, cdn) {
+	qty(doc, cdt, cdn) {
 		var item = frappe.get_doc(cdt, cdn);
 		if ((doc.doctype == "Purchase Receipt") || (doc.doctype == "Purchase Invoice" && (doc.update_stock || doc.is_return))) {
 			frappe.model.round_floats_in(item, ["qty", "received_qty"]);
@@ -168,22 +168,22 @@
 			item.rejected_qty = flt(item.received_qty - item.qty, precision("rejected_qty", item));
 			item.received_stock_qty = flt(item.conversion_factor, precision("conversion_factor", item)) * flt(item.received_qty);
 		}
-		this._super(doc, cdt, cdn);
-	},
+		super.qty(doc, cdt, cdn);
+	}
 
-	batch_no: function(doc, cdt, cdn) {
-		this._super(doc, cdt, cdn);
-	},
+	batch_no(doc, cdt, cdn) {
+		super.batch_no(doc, cdt, cdn);
+	}
 
-	received_qty: function(doc, cdt, cdn) {
+	received_qty(doc, cdt, cdn) {
 		this.calculate_accepted_qty(doc, cdt, cdn)
-	},
+	}
 
-	rejected_qty: function(doc, cdt, cdn) {
+	rejected_qty(doc, cdt, cdn) {
 		this.calculate_accepted_qty(doc, cdt, cdn)
-	},
+	}
 
-	calculate_accepted_qty: function(doc, cdt, cdn){
+	calculate_accepted_qty(doc, cdt, cdn){
 		var item = frappe.get_doc(cdt, cdn);
 		frappe.model.round_floats_in(item, ["received_qty", "rejected_qty"]);
 
@@ -191,9 +191,9 @@
 
 		item.qty = flt(item.received_qty - item.rejected_qty, precision("qty", item));
 		this.qty(doc, cdt, cdn);
-	},
+	}
 
-	validate_negative_quantity: function(cdt, cdn, item, fieldnames){
+	validate_negative_quantity(cdt, cdn, item, fieldnames){
 		if(!item || !fieldnames) { return }
 
 		var is_negative_qty = false;
@@ -206,9 +206,9 @@
 		}
 
 		return is_negative_qty
-	},
+	}
 
-	warehouse: function(doc, cdt, cdn) {
+	warehouse(doc, cdt, cdn) {
 		var item = frappe.get_doc(cdt, cdn);
 		if(item.item_code && item.warehouse) {
 			return this.frm.call({
@@ -221,9 +221,9 @@
 				}
 			});
 		}
-	},
+	}
 
-	project: function(doc, cdt, cdn) {
+	project(doc, cdt, cdn) {
 		var item = frappe.get_doc(cdt, cdn);
 		if(item.project) {
 			$.each(this.frm.doc["items"] || [],
@@ -234,48 +234,48 @@
 					}
 				});
 		}
-	},
+	}
 
-	rejected_warehouse: function(doc, cdt) {
+	rejected_warehouse(doc, cdt) {
 		// trigger autofill_warehouse only if parent rejected_warehouse field is triggered
 		if (["Purchase Invoice", "Purchase Receipt"].includes(cdt)) {
 			this.autofill_warehouse(doc.items, "rejected_warehouse", doc.rejected_warehouse);
 		}
-	},
+	}
 
-	category: function(doc, cdt, cdn) {
+	category(doc, cdt, cdn) {
 		// should be the category field of tax table
 		if(cdt != doc.doctype) {
 			this.calculate_taxes_and_totals();
 		}
-	},
-	add_deduct_tax: function(doc, cdt, cdn) {
+	}
+	add_deduct_tax(doc, cdt, cdn) {
 		this.calculate_taxes_and_totals();
-	},
+	}
 
-	set_from_product_bundle: function() {
+	set_from_product_bundle() {
 		var me = this;
 		this.frm.add_custom_button(__("Product Bundle"), function() {
 			erpnext.buying.get_items_from_product_bundle(me.frm);
 		}, __("Get Items From"));
-	},
+	}
 
-	shipping_address: function(){
+	shipping_address(){
 		var me = this;
 		erpnext.utils.get_address_display(this.frm, "shipping_address",
 			"shipping_address_display", true);
-	},
+	}
 
-	billing_address: function() {
+	billing_address() {
 		erpnext.utils.get_address_display(this.frm, "billing_address",
 			"billing_address_display", true);
-	},
+	}
 
-	tc_name: function() {
+	tc_name() {
 		this.get_terms();
-	},
+	}
 
-	update_auto_repeat_reference: function(doc) {
+	update_auto_repeat_reference(doc) {
 		if (doc.auto_repeat) {
 			frappe.call({
 				method:"frappe.automation.doctype.auto_repeat.auto_repeat.update_reference",
@@ -292,9 +292,9 @@
 				}
 			})
 		}
-	},
+	}
 
-	manufacturer: function(doc, cdt, cdn) {
+	manufacturer(doc, cdt, cdn) {
 		const row = locals[cdt][cdn];
 
 		if(row.manufacturer) {
@@ -311,9 +311,9 @@
 				}
 			});
 		}
-	},
+	}
 
-	manufacturer_part_no: function(doc, cdt, cdn) {
+	manufacturer_part_no(doc, cdt, cdn) {
 		const row = locals[cdt][cdn];
 
 		if (row.manufacturer_part_no) {
@@ -336,7 +336,7 @@
 
 			}
 		}
-});
+};
 
 cur_frm.add_fetch('project', 'cost_center', 'cost_center');
 
@@ -497,4 +497,4 @@
 	});
 
 	dialog.show();
-}
\ No newline at end of file
+}
diff --git a/erpnext/public/js/controllers/stock_controller.js b/erpnext/public/js/controllers/stock_controller.js
index 87b21b7..d346357 100644
--- a/erpnext/public/js/controllers/stock_controller.js
+++ b/erpnext/public/js/controllers/stock_controller.js
@@ -3,22 +3,22 @@
 
 frappe.provide("erpnext.stock");
 
-erpnext.stock.StockController = frappe.ui.form.Controller.extend({
-	onload: function() {
+erpnext.stock.StockController = class StockController extends frappe.ui.form.Controller {
+	onload() {
 		// warehouse query if company
 		if (this.frm.fields_dict.company) {
 			this.setup_warehouse_query();
 		}
-	},
+	}
 
-	setup_warehouse_query: function() {
+	setup_warehouse_query() {
 		var me = this;
 		erpnext.queries.setup_queries(this.frm, "Warehouse", function() {
 			return erpnext.queries.warehouse(me.frm.doc);
 		});
-	},
+	}
 
-	setup_posting_date_time_check: function() {
+	setup_posting_date_time_check() {
 		// make posting date default and read only unless explictly checked
 		frappe.ui.form.on(this.frm.doctype, 'set_posting_date_and_time_read_only', function(frm) {
 			if(frm.doc.docstatus == 0 && frm.doc.set_posting_time) {
@@ -46,9 +46,9 @@
 				frm.trigger('set_posting_date_and_time_read_only');
 			}
 		});
-	},
+	}
 
-	show_stock_ledger: function() {
+	show_stock_ledger() {
 		var me = this;
 		if(this.frm.doc.docstatus > 0) {
 			cur_frm.add_custom_button(__("Stock Ledger"), function() {
@@ -63,9 +63,9 @@
 			}, __("View"));
 		}
 
-	},
+	}
 
-	show_general_ledger: function() {
+	show_general_ledger() {
 		var me = this;
 		if(this.frm.doc.docstatus > 0) {
 			cur_frm.add_custom_button(__('Accounting Ledger'), function() {
@@ -81,4 +81,4 @@
 			}, __("View"));
 		}
 	}
-});
+};
diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js
index 2e133be..31410da 100644
--- a/erpnext/public/js/controllers/taxes_and_totals.js
+++ b/erpnext/public/js/controllers/taxes_and_totals.js
@@ -1,12 +1,12 @@
 // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
 // License: GNU General Public License v3. See license.txt
 
-erpnext.taxes_and_totals = erpnext.payments.extend({
-	setup: function() {
+erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
+	setup() {
 		this.fetch_round_off_accounts();
-	},
+	}
 
-	apply_pricing_rule_on_item: function(item) {
+	apply_pricing_rule_on_item(item) {
 		let effective_item_rate = item.price_list_rate;
 		let item_rate = item.rate;
 		if (in_list(["Sales Order", "Quotation"], item.parenttype) && item.blanket_order_rate) {
@@ -32,9 +32,9 @@
 		}
 
 		frappe.model.set_value(item.doctype, item.name, "rate", item_rate);
-	},
+	}
 
-	calculate_taxes_and_totals: function(update_paid_amount) {
+	calculate_taxes_and_totals(update_paid_amount) {
 		this.discount_amount_applied = false;
 		this._calculate_taxes_and_totals();
 		this.calculate_discount_amount();
@@ -63,16 +63,16 @@
 		}
 
 		this.frm.refresh_fields();
-	},
+	}
 
-	calculate_discount_amount: function(){
+	calculate_discount_amount(){
 		if (frappe.meta.get_docfield(this.frm.doc.doctype, "discount_amount")) {
 			this.set_discount_amount();
 			this.apply_discount_amount();
 		}
-	},
+	}
 
-	_calculate_taxes_and_totals: function() {
+	_calculate_taxes_and_totals() {
 		this.validate_conversion_rate();
 		this.calculate_item_values();
 		this.initialize_taxes();
@@ -82,9 +82,9 @@
 		this.manipulate_grand_total_for_inclusive_tax();
 		this.calculate_totals();
 		this._cleanup();
-	},
+	}
 
-	validate_conversion_rate: function() {
+	validate_conversion_rate() {
 		this.frm.doc.conversion_rate = flt(this.frm.doc.conversion_rate, (cur_frm) ? precision("conversion_rate") : 9);
 		var conversion_rate_label = frappe.meta.get_label(this.frm.doc.doctype, "conversion_rate",
 			this.frm.doc.name);
@@ -99,9 +99,9 @@
 				frappe.throw(err_message);
 			}
 		}
-	},
+	}
 
-	calculate_item_values: function() {
+	calculate_item_values() {
 		var me = this;
 		if (!this.discount_amount_applied) {
 			$.each(this.frm.doc["items"] || [], function(i, item) {
@@ -121,16 +121,16 @@
 				me.set_in_company_currency(item, ["price_list_rate", "rate", "amount", "net_rate", "net_amount"]);
 			});
 		}
-	},
+	}
 
-	set_in_company_currency: function(doc, fields) {
+	set_in_company_currency(doc, fields) {
 		var me = this;
 		$.each(fields, function(i, f) {
 			doc["base_"+f] = flt(flt(doc[f], precision(f, doc)) * me.frm.doc.conversion_rate, precision("base_" + f, doc));
 		});
-	},
+	}
 
-	initialize_taxes: function() {
+	initialize_taxes() {
 		var me = this;
 
 		$.each(this.frm.doc["taxes"] || [], function(i, tax) {
@@ -152,9 +152,9 @@
 			}
 			frappe.model.round_floats_in(tax);
 		});
-	},
+	}
 
-	fetch_round_off_accounts: function() {
+	fetch_round_off_accounts() {
 		let me = this;
 		frappe.flags.round_off_applicable_accounts = [];
 
@@ -165,14 +165,14 @@
 					"company": me.frm.doc.company,
 					"account_list": frappe.flags.round_off_applicable_accounts
 				},
-				callback: function(r) {
+				callback(r) {
 					frappe.flags.round_off_applicable_accounts.push(...r.message);
 				}
 			});
 		}
-	},
+	}
 
-	determine_exclusive_rate: function() {
+	determine_exclusive_rate() {
 		var me = this;
 
 		var has_inclusive_tax = false;
@@ -210,9 +210,9 @@
 				me.set_in_company_currency(item, ["net_rate", "net_amount"]);
 			}
 		});
-	},
+	}
 
-	get_current_tax_fraction: function(tax, item_tax_map) {
+	get_current_tax_fraction(tax, item_tax_map) {
 		// Get tax fraction for calculating tax exclusive amount
 		// from tax inclusive amount
 		var current_tax_fraction = 0.0;
@@ -241,14 +241,14 @@
 			inclusive_tax_amount_per_qty *= -1;
 		}
 		return [current_tax_fraction, inclusive_tax_amount_per_qty];
-	},
+	}
 
-	_get_tax_rate: function(tax, item_tax_map) {
+	_get_tax_rate(tax, item_tax_map) {
 		return (Object.keys(item_tax_map).indexOf(tax.account_head) != -1) ?
 			flt(item_tax_map[tax.account_head], precision("rate", tax)) : tax.rate;
-	},
+	}
 
-	calculate_net_total: function() {
+	calculate_net_total() {
 		var me = this;
 		this.frm.doc.total_qty = this.frm.doc.total = this.frm.doc.base_total = this.frm.doc.net_total = this.frm.doc.base_net_total = 0.0;
 
@@ -261,9 +261,9 @@
 			});
 
 		frappe.model.round_floats_in(this.frm.doc, ["total", "base_total", "net_total", "base_net_total"]);
-	},
+	}
 
-	calculate_taxes: function() {
+	calculate_taxes() {
 		var me = this;
 		this.frm.doc.rounding_adjustment = 0;
 		var actual_tax_dict = {};
@@ -342,9 +342,9 @@
 				}
 			});
 		});
-	},
+	}
 
-	set_cumulative_total: function(row_idx, tax) {
+	set_cumulative_total(row_idx, tax) {
 		var tax_amount = tax.tax_amount_after_discount_amount;
 		if (tax.category == 'Valuation') {
 			tax_amount = 0;
@@ -357,13 +357,13 @@
 		} else {
 			tax.total = flt(this.frm.doc["taxes"][row_idx-1].total + tax_amount, precision("total", tax));
 		}
-	},
+	}
 
-	_load_item_tax_rate: function(item_tax_rate) {
+	_load_item_tax_rate(item_tax_rate) {
 		return item_tax_rate ? JSON.parse(item_tax_rate) : {};
-	},
+	}
 
-	get_current_tax_amount: function(item, tax, item_tax_map) {
+	get_current_tax_amount(item, tax, item_tax_map) {
 		var tax_rate = this._get_tax_rate(tax, item_tax_map);
 		var current_tax_amount = 0.0;
 
@@ -399,9 +399,9 @@
 		this.set_item_wise_tax(item, tax, tax_rate, current_tax_amount);
 
 		return current_tax_amount;
-	},
+	}
 
-	set_item_wise_tax: function(item, tax, tax_rate, current_tax_amount) {
+	set_item_wise_tax(item, tax, tax_rate, current_tax_amount) {
 		// store tax breakup for each item
 		let tax_detail = tax.item_wise_tax_detail;
 		let key = item.item_code || item.item_name;
@@ -411,9 +411,9 @@
 			item_wise_tax_amount += tax_detail[key][1];
 
 		tax_detail[key] = [tax_rate, flt(item_wise_tax_amount, precision("base_tax_amount", tax))];
-	},
+	}
 
-	round_off_totals: function(tax) {
+	round_off_totals(tax) {
 		if (frappe.flags.round_off_applicable_accounts.includes(tax.account_head)) {
 			tax.tax_amount= Math.round(tax.tax_amount);
 			tax.tax_amount_after_discount_amount = Math.round(tax.tax_amount_after_discount_amount);
@@ -421,16 +421,16 @@
 
 		tax.tax_amount = flt(tax.tax_amount, precision("tax_amount", tax));
 		tax.tax_amount_after_discount_amount = flt(tax.tax_amount_after_discount_amount, precision("tax_amount", tax));
-	},
+	}
 
-	round_off_base_values: function(tax) {
+	round_off_base_values(tax) {
 		if (frappe.flags.round_off_applicable_accounts.includes(tax.account_head)) {
 			tax.base_tax_amount= Math.round(tax.base_tax_amount);
 			tax.base_tax_amount_after_discount_amount = Math.round(tax.base_tax_amount_after_discount_amount);
 		}
-	},
+	}
 
-	manipulate_grand_total_for_inclusive_tax: function() {
+	manipulate_grand_total_for_inclusive_tax() {
 		var me = this;
 		// if fully inclusive taxes and diff
 		if (this.frm.doc["taxes"] && this.frm.doc["taxes"].length) {
@@ -461,9 +461,9 @@
 				}
 			}
 		}
-	},
+	}
 
-	calculate_totals: function() {
+	calculate_totals() {
 		// Changing sequence can cause rounding_adjustmentng issue and on-screen discrepency
 		var me = this;
 		var tax_count = this.frm.doc["taxes"] ? this.frm.doc["taxes"].length : 0;
@@ -509,9 +509,9 @@
 
 		// rounded totals
 		this.set_rounded_total();
-	},
+	}
 
-	set_rounded_total: function() {
+	set_rounded_total() {
 		var disable_rounded_total = 0;
 		if(frappe.meta.get_docfield(this.frm.doc.doctype, "disable_rounded_total", this.frm.doc.name)) {
 			disable_rounded_total = this.frm.doc.disable_rounded_total;
@@ -533,9 +533,9 @@
 
 			this.set_in_company_currency(this.frm.doc, ["rounding_adjustment", "rounded_total"]);
 		}
-	},
+	}
 
-	_cleanup: function() {
+	_cleanup() {
 		this.frm.doc.base_in_words = this.frm.doc.in_words = "";
 
 		if(this.frm.doc["items"] && this.frm.doc["items"].length) {
@@ -562,16 +562,16 @@
 				tax.item_wise_tax_detail = JSON.stringify(tax.item_wise_tax_detail);
 			});
 		}
-	},
+	}
 
-	set_discount_amount: function() {
+	set_discount_amount() {
 		if(this.frm.doc.additional_discount_percentage) {
 			this.frm.doc.discount_amount = flt(flt(this.frm.doc[frappe.scrub(this.frm.doc.apply_discount_on)])
 				* this.frm.doc.additional_discount_percentage / 100, precision("discount_amount"));
 		}
-	},
+	}
 
-	apply_discount_amount: function() {
+	apply_discount_amount() {
 		var me = this;
 		var distributed_amount = 0.0;
 		this.frm.doc.base_discount_amount = 0.0;
@@ -609,9 +609,9 @@
 				this._calculate_taxes_and_totals();
 			}
 		}
-	},
+	}
 
-	get_total_for_discount_amount: function() {
+	get_total_for_discount_amount() {
 		if(this.frm.doc.apply_discount_on == "Net Total") {
 			return this.frm.doc.net_total;
 		} else {
@@ -635,27 +635,27 @@
 
 			return flt(this.frm.doc.grand_total - total_actual_tax, precision("grand_total"));
 		}
-	},
+	}
 
-	calculate_total_advance: function(update_paid_amount) {
+	calculate_total_advance(update_paid_amount) {
 		var total_allocated_amount = frappe.utils.sum($.map(this.frm.doc["advances"] || [], function(adv) {
 			return flt(adv.allocated_amount, precision("allocated_amount", adv));
 		}));
 		this.frm.doc.total_advance = flt(total_allocated_amount, precision("total_advance"));
 
 		this.calculate_outstanding_amount(update_paid_amount);
-	},
+	}
 
-	is_internal_invoice: function() {
+	is_internal_invoice() {
 		if (['Sales Invoice', 'Purchase Invoice'].includes(this.frm.doc.doctype)) {
 			if (this.frm.doc.company === this.frm.doc.represents_company) {
 				return true;
 			}
 		}
 		return false;
-	},
+	}
 
-	calculate_outstanding_amount: function(update_paid_amount) {
+	calculate_outstanding_amount(update_paid_amount) {
 		// NOTE:
 		// paid_amount and write_off_amount is only for POS/Loyalty Point Redemption Invoice
 		// total_advance is only for non POS Invoice
@@ -703,9 +703,9 @@
 			this.frm.doc.outstanding_amount =  flt(total_amount_to_pay - flt(paid_amount) +
 				flt(this.frm.doc.change_amount * this.frm.doc.conversion_rate), precision("outstanding_amount"));
 		}
-	},
+	}
 
-	update_paid_amount_for_return: function() {
+	update_paid_amount_for_return() {
 		var grand_total = this.frm.doc.rounded_total || this.frm.doc.grand_total;
 
 		if(this.frm.doc.party_account_currency == this.frm.doc.currency) {
@@ -729,9 +729,9 @@
 		this.frm.refresh_fields();
 
 		this.calculate_paid_amount();
-	},
+	}
 
-	set_default_payment: function(total_amount_to_pay, update_paid_amount) {
+	set_default_payment(total_amount_to_pay, update_paid_amount) {
 		var me = this;
 		var payment_status = true;
 		if(this.frm.doc.is_pos && (update_paid_amount===undefined || update_paid_amount)) {
@@ -747,9 +747,9 @@
 				}
 			});
 		}
-	},
+	}
 
-	calculate_paid_amount: function() {
+	calculate_paid_amount() {
 		var me = this;
 		var paid_amount = 0.0;
 		var base_paid_amount = 0.0;
@@ -769,9 +769,9 @@
 
 		this.frm.set_value('paid_amount', flt(paid_amount, precision("paid_amount")));
 		this.frm.set_value('base_paid_amount', flt(base_paid_amount, precision("base_paid_amount")));
-	},
+	}
 
-	calculate_change_amount: function(){
+	calculate_change_amount(){
 		this.frm.doc.change_amount = 0.0;
 		this.frm.doc.base_change_amount = 0.0;
 		if(in_list(["Sales Invoice", "POS Invoice"], this.frm.doc.doctype)
@@ -790,9 +790,9 @@
 					precision("base_change_amount"));
 			}
 		}
-	},
+	}
 
-	calculate_write_off_amount: function(){
+	calculate_write_off_amount(){
 		if(this.frm.doc.paid_amount > this.frm.doc.grand_total){
 			this.frm.doc.write_off_amount = flt(this.frm.doc.grand_total - this.frm.doc.paid_amount
 				+ this.frm.doc.change_amount, precision("write_off_amount"));
@@ -804,4 +804,4 @@
 		}
 		this.calculate_outstanding_amount(false);
 	}
-});
+};
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index e153e6c..b533746 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -3,8 +3,8 @@
 
 frappe.provide('erpnext.accounts.dimensions');
 
-erpnext.TransactionController = erpnext.taxes_and_totals.extend({
-	setup: function() {
+erpnext.TransactionController = class TransactionController extends erpnext.taxes_and_totals {
+	setup() {
 		this._super();
 		frappe.flags.hide_serial_batch_dialog = true;
 		frappe.ui.form.on(this.frm.doctype + " Item", "rate", function(frm, cdt, cdn) {
@@ -222,8 +222,8 @@
 			});
 		}
 
-	},
-	onload: function() {
+	}
+	onload() {
 		var me = this;
 
 		if(this.frm.doc.__islocal) {
@@ -249,15 +249,15 @@
 				}
 			]);
 		}
-	},
+	}
 
-	is_return: function() {
+	is_return() {
 		if(!this.frm.doc.is_return && this.frm.doc.return_against) {
 			this.frm.set_value('return_against', '');
 		}
-	},
+	}
 
-	setup_quality_inspection: function() {
+	setup_quality_inspection() {
 		if(!in_list(["Delivery Note", "Sales Invoice", "Purchase Receipt", "Purchase Invoice"], this.frm.doc.doctype)) {
 			return;
 		}
@@ -290,9 +290,9 @@
 				}
 			}
 		});
-	},
+	}
 
-	make_payment_request: function() {
+	make_payment_request() {
 		var me = this;
 		const payment_request_type = (in_list(['Sales Order', 'Sales Invoice'], this.frm.doc.doctype))
 			? "Inward" : "Outward";
@@ -314,9 +314,9 @@
 				}
 			}
 		})
-	},
+	}
 
-	onload_post_render: function() {
+	onload_post_render() {
 		if(this.frm.doc.__islocal && !(this.frm.doc.taxes || []).length
 			&& !(this.frm.doc.__onload ? this.frm.doc.__onload.load_after_mapping : false)) {
 			frappe.after_ajax(() => this.apply_default_taxes());
@@ -328,9 +328,9 @@
 			this.setup_item_selector();
 			this.frm.get_field("items").grid.set_multiple_add("item_code", "qty");
 		}
-	},
+	}
 
-	refresh: function() {
+	refresh() {
 		erpnext.toggle_naming_series();
 		erpnext.hide_company();
 		this.set_dynamic_labels();
@@ -360,9 +360,9 @@
 					.appendTo($input_group);
 			}
 		}
-	},
+	}
 
-	scan_barcode: function() {
+	scan_barcode() {
 		let scan_barcode_field = this.frm.fields_dict["scan_barcode"];
 
 		let show_description = function(idx, exist = null) {
@@ -434,9 +434,9 @@
 			});
 		}
 		return false;
-	},
+	}
 
-	apply_default_taxes: function() {
+	apply_default_taxes() {
 		var me = this;
 		var taxes_and_charges_field = frappe.meta.get_docfield(me.frm.doc.doctype, "taxes_and_charges",
 			me.frm.doc.name);
@@ -475,22 +475,22 @@
 				}
 			});
 		}
-	},
+	}
 
-	setup_sms: function() {
+	setup_sms() {
 		var me = this;
 		let blacklist = ['Purchase Invoice', 'BOM'];
 		if(this.frm.doc.docstatus===1 && !in_list(["Lost", "Stopped", "Closed"], this.frm.doc.status)
 			&& !blacklist.includes(this.frm.doctype)) {
 			this.frm.page.add_menu_item(__('Send SMS'), function() { me.send_sms(); });
 		}
-	},
+	}
 
-	send_sms: function() {
+	send_sms() {
 		var sms_man = new erpnext.SMSManager(this.frm.doc);
-	},
+	}
 
-	barcode: function(doc, cdt, cdn) {
+	barcode(doc, cdt, cdn) {
 		var d = locals[cdt][cdn];
 		if(d.barcode=="" || d.barcode==null) {
 			// barcode cleared, remove item
@@ -499,9 +499,9 @@
 
 		this.frm.from_barcode = this.frm.from_barcode ? this.frm.from_barcode + 1 : 1;
 		this.item_code(doc, cdt, cdn);
-	},
+	}
 
-	item_code: function(doc, cdt, cdn) {
+	item_code(doc, cdt, cdn) {
 		var me = this;
 		var item = frappe.get_doc(cdt, cdn);
 		var update_stock = 0, show_batch_dialog = 0;
@@ -651,9 +651,9 @@
 				});
 			}
 		}
-	},
+	}
 
-	price_list_rate: function(doc, cdt, cdn) {
+	price_list_rate(doc, cdt, cdn) {
 		var item = frappe.get_doc(cdt, cdn);
 		frappe.model.round_floats_in(item, ["price_list_rate", "discount_percentage"]);
 
@@ -665,17 +665,17 @@
 				precision("rate", item));
 
 		this.calculate_taxes_and_totals();
-	},
+	}
 
-	margin_rate_or_amount: function(doc, cdt, cdn) {
+	margin_rate_or_amount(doc, cdt, cdn) {
 		// calculated the revised total margin and rate on margin rate changes
 		let item = frappe.get_doc(cdt, cdn);
 		this.apply_pricing_rule_on_item(item);
 		this.calculate_taxes_and_totals();
 		cur_frm.refresh_fields();
-	},
+	}
 
-	margin_type: function(doc, cdt, cdn) {
+	margin_type(doc, cdt, cdn) {
 		// calculate the revised total margin and rate on margin type changes
 		let item = frappe.get_doc(cdt, cdn);
 		if (!item.margin_type) {
@@ -685,9 +685,9 @@
 			this.calculate_taxes_and_totals();
 			cur_frm.refresh_fields();
 		}
-	},
+	}
 
-	get_incoming_rate: function(item, posting_date, posting_time, voucher_type, company) {
+	get_incoming_rate(item, posting_date, posting_time, voucher_type, company) {
 
 		let item_args = {
 			'item_code': item.item_code,
@@ -710,9 +710,9 @@
 				frappe.model.set_value(item.doctype, item.name, 'rate', r.message * item.conversion_factor);
 			}
 		});
-	},
+	}
 
-	add_taxes_from_item_tax_template: function(item_tax_map) {
+	add_taxes_from_item_tax_template(item_tax_map) {
 		let me = this;
 
 		if(item_tax_map && cint(frappe.defaults.get_default("add_taxes_from_item_tax_template"))) {
@@ -730,9 +730,9 @@
 				}
 			});
 		}
-	},
+	}
 
-	serial_no: function(doc, cdt, cdn) {
+	serial_no(doc, cdt, cdn) {
 		var me = this;
 		var item = frappe.get_doc(cdt, cdn);
 
@@ -752,9 +752,9 @@
 				}
 			}
 		}
-	},
+	}
 
-	update_qty: function(cdt, cdn) {
+	update_qty(cdt, cdn) {
 		var valid_serial_nos = [];
 		var serialnos = [];
 		var item = frappe.get_doc(cdt, cdn);
@@ -767,17 +767,17 @@
 		frappe.model.set_value(item.doctype, item.name,
 			"qty", valid_serial_nos.length / item.conversion_factor);
 		frappe.model.set_value(item.doctype, item.name, "stock_qty", valid_serial_nos.length);
-	},
+	}
 
-	validate: function() {
+	validate() {
 		this.calculate_taxes_and_totals(false);
-	},
+	}
 
-	update_stock: function() {
+	update_stock() {
 		this.frm.trigger('set_default_internal_warehouse');
-	},
+	}
 
-	set_default_internal_warehouse: function() {
+	set_default_internal_warehouse() {
 		let me = this;
 		if ((this.frm.doc.doctype === 'Sales Invoice' && me.frm.doc.update_stock)
 			|| this.frm.doc.doctype == 'Delivery Note') {
@@ -796,9 +796,9 @@
 				});
 			}
 		}
-	},
+	}
 
-	company: function() {
+	company() {
 		var me = this;
 		var set_pricing = function() {
 			if(me.frm.doc.company && me.frm.fields_dict.currency) {
@@ -905,16 +905,16 @@
 		if(this.frm.doc.company) {
 			erpnext.last_selected_company = this.frm.doc.company;
 		}
-	},
+	}
 
-	transaction_date: function() {
+	transaction_date() {
 		if (this.frm.doc.transaction_date) {
 			this.frm.transaction_date = this.frm.doc.transaction_date;
 			frappe.ui.form.trigger(this.frm.doc.doctype, "currency");
 		}
-	},
+	}
 
-	posting_date: function() {
+	posting_date() {
 		var me = this;
 		if (this.frm.doc.posting_date) {
 			this.frm.posting_date = this.frm.doc.posting_date;
@@ -943,9 +943,9 @@
 				frappe.ui.form.trigger(me.frm.doc.doctype, "currency");
 			}
 		}
-	},
+	}
 
-	due_date: function() {
+	due_date() {
 		// due_date is to be changed, payment terms template and/or payment schedule must
 		// be removed as due_date is automatically changed based on payment terms
 		if (this.frm.doc.due_date && !this.frm.updating_party_details && !this.frm.doc.is_pos) {
@@ -968,13 +968,13 @@
 				frappe.msgprint(final_message);
 			}
 		}
-	},
+	}
 
-	bill_date: function() {
+	bill_date() {
 		this.posting_date();
-	},
+	}
 
-	recalculate_terms: function() {
+	recalculate_terms() {
 		const doc = this.frm.doc;
 		if (doc.payment_terms_template) {
 			this.payment_terms_template();
@@ -993,17 +993,17 @@
 				}
 			);
 		}
-	},
+	}
 
-	get_company_currency: function() {
+	get_company_currency() {
 		return erpnext.get_currency(this.frm.doc.company);
-	},
+	}
 
-	contact_person: function() {
+	contact_person() {
 		erpnext.utils.get_contact_details(this.frm);
-	},
+	}
 
-	currency: function() {
+	currency() {
 		/* manqala 19/09/2016: let the translation date be whichever of the transaction_date or posting_date is available */
 		var transaction_date = this.frm.doc.transaction_date || this.frm.doc.posting_date;
 		/* end manqala */
@@ -1025,9 +1025,9 @@
 		} else {
 			this.conversion_rate();
 		}
-	},
+	}
 
-	conversion_rate: function() {
+	conversion_rate() {
 		const me = this.frm;
 		if(this.frm.doc.currency === this.get_company_currency()) {
 			this.frm.set_value("conversion_rate", 1.0);
@@ -1047,9 +1047,9 @@
 		}
 		// Make read only if Accounts Settings doesn't allow stale rates
 		this.frm.set_df_property("conversion_rate", "read_only", erpnext.stale_rate_allowed() ? 0 : 1);
-	},
+	}
 
-	shipping_rule: function() {
+	shipping_rule() {
 		var me = this;
 		if(this.frm.doc.shipping_rule) {
 			return this.frm.call({
@@ -1065,9 +1065,9 @@
 		else {
 			me.calculate_taxes_and_totals();
 		}
-	},
+	}
 
-	set_margin_amount_based_on_currency: function(exchange_rate) {
+	set_margin_amount_based_on_currency(exchange_rate) {
 		if (in_list(["Quotation", "Sales Order", "Delivery Note", "Sales Invoice", "Purchase Invoice", "Purchase Order", "Purchase Receipt"]), this.frm.doc.doctype) {
 			var me = this;
 			$.each(this.frm.doc.items || [], function(i, d) {
@@ -1077,9 +1077,9 @@
 				}
 			});
 		}
-	},
+	}
 
-	set_actual_charges_based_on_currency: function(exchange_rate) {
+	set_actual_charges_based_on_currency(exchange_rate) {
 		var me = this;
 		$.each(this.frm.doc.taxes || [], function(i, d) {
 			if(d.charge_type == "Actual") {
@@ -1087,9 +1087,9 @@
 					flt(d.tax_amount) / flt(exchange_rate));
 			}
 		});
-	},
+	}
 
-	get_exchange_rate: function(transaction_date, from_currency, to_currency, callback) {
+	get_exchange_rate(transaction_date, from_currency, to_currency, callback) {
 		var args;
 		if (["Quotation", "Sales Order", "Delivery Note", "Sales Invoice"].includes(this.frm.doctype)) {
 			args = "for_selling";
@@ -1113,9 +1113,9 @@
 				callback(flt(r.message));
 			}
 		});
-	},
+	}
 
-	price_list_currency: function() {
+	price_list_currency() {
 		var me=this;
 		this.set_dynamic_labels();
 
@@ -1129,9 +1129,9 @@
 		} else {
 			this.plc_conversion_rate();
 		}
-	},
+	}
 
-	plc_conversion_rate: function() {
+	plc_conversion_rate() {
 		if(this.frm.doc.price_list_currency === this.get_company_currency()) {
 			this.frm.set_value("plc_conversion_rate", 1.0);
 		} else if(this.frm.doc.price_list_currency === this.frm.doc.currency
@@ -1143,9 +1143,9 @@
 		if(!this.in_apply_price_list) {
 			this.apply_price_list(null, true);
 		}
-	},
+	}
 
-	uom: function(doc, cdt, cdn) {
+	uom(doc, cdt, cdn) {
 		var me = this;
 		var item = frappe.get_doc(cdt, cdn);
 		if(item.item_code && item.uom) {
@@ -1163,9 +1163,9 @@
 			});
 		}
 		me.calculate_stock_uom_rate(doc, cdt, cdn);
-	},
+	}
 
-	conversion_factor: function(doc, cdt, cdn, dont_fetch_price_list_rate) {
+	conversion_factor(doc, cdt, cdn, dont_fetch_price_list_rate) {
 		if(frappe.meta.get_docfield(cdt, "stock_qty", cdn)) {
 			var item = frappe.get_doc(cdt, cdn);
 			frappe.model.round_floats_in(item, ["qty", "conversion_factor"]);
@@ -1190,35 +1190,35 @@
 			}
 			this.calculate_stock_uom_rate(doc, cdt, cdn);
 		}
-	},
+	}
 
-	batch_no: function(doc, cdt, cdn) {
+	batch_no(doc, cdt, cdn) {
 		let item = frappe.get_doc(cdt, cdn);
 		this.apply_price_list(item, true);
-	},
+	}
 
-	toggle_conversion_factor: function(item) {
+	toggle_conversion_factor(item) {
 		// toggle read only property for conversion factor field if the uom and stock uom are same
 		if(this.frm.get_field('items').grid.fields_map.conversion_factor) {
 			this.frm.fields_dict.items.grid.toggle_enable("conversion_factor",
 				((item.uom != item.stock_uom) && !frappe.meta.get_docfield(cur_frm.fields_dict.items.grid.doctype, "conversion_factor").read_only)? true: false);
 		}
 
-	},
+	}
 
-	qty: function(doc, cdt, cdn) {
+	qty(doc, cdt, cdn) {
 		let item = frappe.get_doc(cdt, cdn);
 		this.conversion_factor(doc, cdt, cdn, true);
 		this.calculate_stock_uom_rate(doc, cdt, cdn);
 		this.apply_pricing_rule(item, true);
-	},
+	}
 
-	calculate_stock_uom_rate: function(doc, cdt, cdn) {
+	calculate_stock_uom_rate(doc, cdt, cdn) {
 		let item = frappe.get_doc(cdt, cdn);
 		item.stock_uom_rate = flt(item.rate)/flt(item.conversion_factor);
 		refresh_field("stock_uom_rate", item.name, item.parentfield);
-	},
-	service_stop_date: function(frm, cdt, cdn) {
+	}
+	service_stop_date(frm, cdt, cdn) {
 		var child = locals[cdt][cdn];
 
 		if(child.service_stop_date) {
@@ -1234,9 +1234,9 @@
 				frappe.throw(__("Service Stop Date cannot be after Service End Date"));
 			}
 		}
-	},
+	}
 
-	service_start_date: function(frm, cdt, cdn) {
+	service_start_date(frm, cdt, cdn) {
 		var child = locals[cdt][cdn];
 
 		if(child.service_start_date) {
@@ -1248,9 +1248,9 @@
 				}
 			})
 		}
-	},
+	}
 
-	calculate_net_weight: function(){
+	calculate_net_weight(){
 		/* Calculate Total Net Weight then further applied shipping rule to calculate shipping charges.*/
 		var me = this;
 		this.frm.doc.total_net_weight= 0.0;
@@ -1260,9 +1260,9 @@
 		});
 		refresh_field("total_net_weight");
 		this.shipping_rule();
-	},
+	}
 
-	set_dynamic_labels: function() {
+	set_dynamic_labels() {
 		// What TODO? should we make price list system non-mandatory?
 		this.frm.toggle_reqd("plc_conversion_rate",
 			!!(this.frm.doc.price_list_name && this.frm.doc.price_list_currency));
@@ -1271,9 +1271,9 @@
 		this.change_form_labels(company_currency);
 		this.change_grid_labels(company_currency);
 		this.frm.refresh_fields();
-	},
+	}
 
-	change_form_labels: function(company_currency) {
+	change_form_labels(company_currency) {
 		var me = this;
 
 		this.frm.set_currency_labels(["base_total", "base_net_total", "base_total_taxes_and_charges",
@@ -1320,9 +1320,9 @@
 		if(frappe.meta.get_docfield(cur_frm.doctype, "base_net_total"))
 			cur_frm.toggle_display("base_net_total", (show && (me.frm.doc.currency != company_currency)));
 
-	},
+	}
 
-	change_grid_labels: function(company_currency) {
+	change_grid_labels(company_currency) {
 		var me = this;
 
 		this.update_item_grid_labels(company_currency);
@@ -1363,9 +1363,9 @@
 		}
 
 		this.update_payment_schedule_grid_labels(company_currency);
-	},
+	}
 
-	update_item_grid_labels: function(company_currency) {
+	update_item_grid_labels(company_currency) {
 		this.frm.set_currency_labels([
 			"base_rate", "base_net_rate", "base_price_list_rate",
 			"base_amount", "base_net_amount", "base_rate_with_margin"
@@ -1375,9 +1375,9 @@
 			"rate", "net_rate", "price_list_rate", "amount",
 			"net_amount", "stock_uom_rate", "rate_with_margin"
 		], this.frm.doc.currency, "items");
-	},
+	}
 
-	update_payment_schedule_grid_labels: function(company_currency) {
+	update_payment_schedule_grid_labels(company_currency) {
 		const me = this;
 		if (this.frm.doc.payment_schedule && this.frm.doc.payment_schedule.length > 0) {
 			this.frm.set_currency_labels(["base_payment_amount", "base_outstanding", "base_paid_amount"],
@@ -1391,9 +1391,9 @@
 					schedule_grid.set_column_disp(fname, me.frm.doc.currency != company_currency);
 			});
 		}
-	},
+	}
 
-	toggle_item_grid_columns: function(company_currency) {
+	toggle_item_grid_columns(company_currency) {
 		const me = this;
 		// toggle columns
 		var item_grid = this.frm.fields_dict["items"].grid;
@@ -1414,21 +1414,21 @@
 			if(frappe.meta.get_docfield(item_grid.doctype, fname))
 				item_grid.set_column_disp(fname, (show && (me.frm.doc.currency != company_currency)));
 		});
-	},
+	}
 
-	recalculate: function() {
+	recalculate() {
 		this.calculate_taxes_and_totals();
-	},
+	}
 
-	recalculate_values: function() {
+	recalculate_values() {
 		this.calculate_taxes_and_totals();
-	},
+	}
 
-	calculate_charges: function() {
+	calculate_charges() {
 		this.calculate_taxes_and_totals();
-	},
+	}
 
-	ignore_pricing_rule: function() {
+	ignore_pricing_rule() {
 		if(this.frm.doc.ignore_pricing_rule) {
 			var me = this;
 			var item_list = [];
@@ -1462,9 +1462,9 @@
 		} else {
 			this.apply_pricing_rule();
 		}
-	},
+	}
 
-	apply_pricing_rule: function(item, calculate_taxes_and_totals) {
+	apply_pricing_rule(item, calculate_taxes_and_totals) {
 		var me = this;
 		var args = this._get_args(item);
 		if (!(args.items && args.items.length)) {
@@ -1483,9 +1483,9 @@
 				}
 			}
 		});
-	},
+	}
 
-	_get_args: function(item) {
+	_get_args(item) {
 		var me = this;
 		return {
 			"items": this._get_item_list(item),
@@ -1513,9 +1513,9 @@
 			"pos_profile": me.frm.doc.doctype == 'Sales Invoice' ? me.frm.doc.pos_profile : '',
 			"coupon_code": me.frm.doc.coupon_code
 		};
-	},
+	}
 
-	_get_item_list: function(item) {
+	_get_item_list(item) {
 		var item_list = [];
 		var append_item = function(d) {
 			if (d.item_code) {
@@ -1556,9 +1556,9 @@
 			});
 		}
 		return item_list;
-	},
+	}
 
-	_set_values_for_item_list: function(children) {
+	_set_values_for_item_list(children) {
 		var me = this;
 		var price_list_rate_changed = false;
 		var items_rule_dict = {};
@@ -1598,9 +1598,9 @@
 		me.apply_rule_on_other_items(items_rule_dict);
 
 		if(!price_list_rate_changed) me.calculate_taxes_and_totals();
-	},
+	}
 
-	apply_rule_on_other_items: function(args) {
+	apply_rule_on_other_items(args) {
 		const me = this;
 		const fields = ["discount_percentage", "pricing_rules", "discount_amount", "rate"];
 
@@ -1619,9 +1619,9 @@
 				});
 			}
 		}
-	},
+	}
 
-	apply_product_discount: function(args) {
+	apply_product_discount(args) {
 		const items = this.frm.doc.items.filter(d => (d.is_free_item)) || [];
 
 		const exist_items = items.map(row => (row.item_code, row.pricing_rules));
@@ -1646,9 +1646,9 @@
 		// free_item_data is a temporary variable
 		args.free_item_data = '';
 		refresh_field('items');
-	},
+	}
 
-	apply_price_list: function(item, reset_plc_conversion) {
+	apply_price_list(item, reset_plc_conversion) {
 		// We need to reset plc_conversion_rate sometimes because the call to
 		// `erpnext.stock.get_item_details.apply_price_list` is sensitive to its value
 		if (!reset_plc_conversion) {
@@ -1687,9 +1687,9 @@
 		}).always(() => {
 			me.in_apply_price_list = false;
 		});
-	},
+	}
 
-	remove_pricing_rule: function(item) {
+	remove_pricing_rule(item) {
 		let me = this;
 		const fields = ["discount_percentage",
 			"discount_amount", "margin_rate_or_amount", "rate_with_margin"];
@@ -1723,18 +1723,18 @@
 
 			me.trigger_price_list_rate();
 		}
-	},
+	}
 
-	trigger_price_list_rate: function() {
+	trigger_price_list_rate() {
 		var me  = this;
 
 		this.frm.doc.items.forEach(child_row => {
 			me.frm.script_manager.trigger("price_list_rate",
 				child_row.doctype, child_row.name);
 		})
-	},
+	}
 
-	validate_company_and_party: function() {
+	validate_company_and_party() {
 		var me = this;
 		var valid = true;
 
@@ -1749,9 +1749,9 @@
 			}
 		});
 		return valid;
-	},
+	}
 
-	get_terms: function() {
+	get_terms() {
 		var me = this;
 
 		erpnext.utils.get_terms(this.frm.doc.tc_name, this.frm.doc, function(r) {
@@ -1759,9 +1759,9 @@
 				me.frm.set_value("terms", r.message);
 			}
 		});
-	},
+	}
 
-	taxes_and_charges: function() {
+	taxes_and_charges() {
 		var me = this;
 		if(this.frm.doc.taxes_and_charges) {
 			return this.frm.call({
@@ -1787,9 +1787,9 @@
 				}
 			});
 		}
-	},
+	}
 
-	tax_category: function() {
+	tax_category() {
 		var me = this;
 		if(me.frm.updating_party_details) return;
 
@@ -1797,9 +1797,9 @@
 			() => this.update_item_tax_map(),
 			() => erpnext.utils.set_taxes(this.frm, "tax_category"),
 		]);
-	},
+	}
 
-	item_tax_template: function(doc, cdt, cdn) {
+	item_tax_template(doc, cdt, cdn) {
 		var me = this;
 		if(me.frm.updating_party_details) return;
 
@@ -1825,9 +1825,9 @@
 			item.item_tax_rate = "{}";
 			me.calculate_taxes_and_totals();
 		}
-	},
+	}
 
-	update_item_tax_map: function() {
+	update_item_tax_map() {
 		var me = this;
 		var item_codes = [];
 		$.each(this.frm.doc.items || [], function(i, item) {
@@ -1863,9 +1863,9 @@
 				}
 			});
 		}
-	},
+	}
 
-	is_recurring: function() {
+	is_recurring() {
 		// set default values for recurring documents
 		if(this.frm.doc.is_recurring && this.frm.doc.__islocal) {
 			frappe.msgprint(__("Please set recurring after saving"));
@@ -1888,9 +1888,9 @@
 		}
 
 		refresh_many(["notification_email_address", "repeat_on_day_of_month"]);
-	},
+	}
 
-	from_date: function() {
+	from_date() {
 		// set to_date
 		if(this.frm.doc.from_date) {
 			var recurring_type_map = {'Monthly': 1, 'Quarterly': 3, 'Half-yearly': 6,
@@ -1904,25 +1904,25 @@
 				refresh_field('to_date');
 			}
 		}
-	},
+	}
 
-	set_gross_profit: function(item) {
+	set_gross_profit(item) {
 		if (["Sales Order", "Quotation"].includes(this.frm.doc.doctype) && item.valuation_rate) {
 			var rate = flt(item.rate) * flt(this.frm.doc.conversion_rate || 1);
 			item.gross_profit = flt(((rate - item.valuation_rate) * item.stock_qty), precision("amount", item));
 		}
-	},
+	}
 
-	setup_item_selector: function() {
+	setup_item_selector() {
 		// TODO: remove item selector
 
 		return;
 		// if(!this.item_selector) {
 		// 	this.item_selector = new erpnext.ItemSelector({frm: this.frm});
 		// }
-	},
+	}
 
-	get_advances: function() {
+	get_advances() {
 		if(!this.frm.is_return) {
 			return this.frm.call({
 				method: "set_advances",
@@ -1932,9 +1932,9 @@
 				}
 			})
 		}
-	},
+	}
 
-	make_payment_entry: function() {
+	make_payment_entry() {
 		return frappe.call({
 			method: cur_frm.cscript.get_method_for_payment(),
 			args: {
@@ -1947,9 +1947,9 @@
 				// cur_frm.refresh_fields()
 			}
 		});
-	},
+	}
 
-	get_method_for_payment: function(){
+	get_method_for_payment(){
 		var method = "erpnext.accounts.doctype.payment_entry.payment_entry.get_payment_entry";
 		if(cur_frm.doc.__onload && cur_frm.doc.__onload.make_payment_via_journal_entry){
 			if(in_list(['Sales Invoice', 'Purchase Invoice'],  cur_frm.doc.doctype)){
@@ -1960,9 +1960,9 @@
 		}
 
 		return method
-	},
+	}
 
-	set_query_for_batch: function(doc, cdt, cdn) {
+	set_query_for_batch(doc, cdt, cdn) {
 		// Show item's batches in the dropdown of batch no
 
 		var me = this;
@@ -1992,9 +1992,9 @@
 				filters: filters
 			}
 		}
-	},
+	}
 
-	set_query_for_item_tax_template: function(doc, cdt, cdn) {
+	set_query_for_item_tax_template(doc, cdt, cdn) {
 		var item = frappe.get_doc(cdt, cdn);
 		if(!item.item_code) {
 			return doc.company ? {filters: {company: doc.company}} : {};
@@ -2014,9 +2014,9 @@
 				filters: filters
 			}
 		}
-	},
+	}
 
-	payment_terms_template: function() {
+	payment_terms_template() {
 		var me = this;
 		const doc = this.frm.doc;
 		if(doc.payment_terms_template && doc.doctype !== 'Delivery Note') {
@@ -2039,9 +2039,9 @@
 				}
 			})
 		}
-	},
+	}
 
-	payment_term: function(doc, cdt, cdn) {
+	payment_term(doc, cdt, cdn) {
 		const me = this;
 		var row = locals[cdt][cdn];
 		if(row.payment_term) {
@@ -2065,17 +2065,17 @@
 				}
 			})
 		}
-	},
+	}
 
-	against_blanket_order: function(doc, cdt, cdn) {
+	against_blanket_order(doc, cdt, cdn) {
 		var item = locals[cdt][cdn];
 		if(!item.against_blanket_order) {
 			frappe.model.set_value(this.frm.doctype + " Item", item.name, "blanket_order", null);
 			frappe.model.set_value(this.frm.doctype + " Item", item.name, "blanket_order_rate", 0.00);
 		}
-	},
+	}
 
-	blanket_order: function(doc, cdt, cdn) {
+	blanket_order(doc, cdt, cdn) {
 		var me = this;
 		var item = locals[cdt][cdn];
 		if (item.blanket_order && (item.parenttype=="Sales Order" || item.parenttype=="Purchase Order")) {
@@ -2103,34 +2103,34 @@
 				}
 			})
 		}
-	},
+	}
 
-	set_reserve_warehouse: function() {
+	set_reserve_warehouse() {
 		this.autofill_warehouse(this.frm.doc.supplied_items, "reserve_warehouse", this.frm.doc.set_reserve_warehouse);
-	},
+	}
 
-	set_warehouse: function() {
+	set_warehouse() {
 		this.autofill_warehouse(this.frm.doc.items, "warehouse", this.frm.doc.set_warehouse);
-	},
+	}
 
-	set_target_warehouse: function() {
+	set_target_warehouse() {
 		this.autofill_warehouse(this.frm.doc.items, "target_warehouse", this.frm.doc.set_target_warehouse);
-	},
+	}
 
-	set_from_warehouse: function() {
+	set_from_warehouse() {
 		this.autofill_warehouse(this.frm.doc.items, "from_warehouse", this.frm.doc.set_from_warehouse);
-	},
+	}
 
-	autofill_warehouse : function (child_table, warehouse_field, warehouse) {
+	autofill_warehouse(child_table, warehouse_field, warehouse) {
 		if (warehouse && child_table && child_table.length) {
 			let doctype = child_table[0].doctype;
 			$.each(child_table || [], function(i, item) {
 				frappe.model.set_value(doctype, item.name, warehouse_field, warehouse);
 			});
 		}
-	},
+	}
 
-	coupon_code: function() {
+	coupon_code() {
 		var me = this;
 		frappe.run_serially([
 			() => this.frm.doc.ignore_pricing_rule=1,
@@ -2139,7 +2139,7 @@
 			() => me.apply_pricing_rule()
 		]);
 	}
-});
+};
 
 erpnext.show_serial_batch_selector = function (frm, d, callback, on_close, show_dialog) {
 	let warehouse, receiving_stock, existing_stock;
diff --git a/erpnext/public/js/education/lms/quiz.js b/erpnext/public/js/education/lms/quiz.js
index 32fa4ab..5683f73 100644
--- a/erpnext/public/js/education/lms/quiz.js
+++ b/erpnext/public/js/education/lms/quiz.js
@@ -118,7 +118,7 @@
 			quiz_response: this.get_selected(),
 			course: this.course,
 			program: this.program,
-			time_taken: this.is_time_bound ? this.time_taken : ""
+			time_taken: this.is_time_bound ? this.time_taken : 0
 		}).then(res => {
 			this.submit_btn.remove()
 			if (!res.message) {
diff --git a/erpnext/public/js/erpnext-web.bundle.js b/erpnext/public/js/erpnext-web.bundle.js
new file mode 100644
index 0000000..7db6967
--- /dev/null
+++ b/erpnext/public/js/erpnext-web.bundle.js
@@ -0,0 +1,2 @@
+import "./website_utils";
+import "./shopping_cart";
diff --git a/erpnext/public/js/erpnext.bundle.js b/erpnext/public/js/erpnext.bundle.js
new file mode 100644
index 0000000..519cfca
--- /dev/null
+++ b/erpnext/public/js/erpnext.bundle.js
@@ -0,0 +1,27 @@
+import "./conf";
+import "./utils";
+import "./queries";
+import "./sms_manager";
+import "./utils/party";
+import "./controllers/stock_controller";
+import "./payment/payments";
+import "./controllers/taxes_and_totals";
+import "./controllers/transaction";
+import "./templates/item_selector.html";
+import "./templates/employees_to_mark_attendance.html";
+import "./utils/item_selector";
+import "./help_links";
+import "./agriculture/ternary_plot";
+import "./templates/item_quick_entry.html";
+import "./utils/item_quick_entry";
+import "./utils/customer_quick_entry";
+import "./education/student_button.html";
+import "./education/assessment_result_tool.html";
+import "./hub/hub_factory";
+import "./call_popup/call_popup";
+import "./utils/dimension_tree_filter";
+import "./telephony";
+import "./templates/call_link.html";
+
+// import { sum } from 'frappe/public/utils/util.js'
+
diff --git a/erpnext/public/js/hub/hub_factory.js b/erpnext/public/js/hub/hub_factory.js
index 8dab2d6..9c67c1c 100644
--- a/erpnext/public/js/hub/hub_factory.js
+++ b/erpnext/public/js/hub/hub_factory.js
@@ -19,11 +19,7 @@
 	}
 
 	make(page_name) {
-		const assets = [
-			'/assets/js/marketplace.min.js'
-		];
-
-		frappe.require(assets, () => {
+		frappe.require('marketplace.bundle.js', () => {
 			erpnext.hub.marketplace = new erpnext.hub.Marketplace({
 				parent: this.make_page(true, page_name)
 			});
diff --git a/erpnext/public/js/hub/marketplace.js b/erpnext/public/js/hub/marketplace.bundle.js
similarity index 100%
rename from erpnext/public/js/hub/marketplace.js
rename to erpnext/public/js/hub/marketplace.bundle.js
diff --git a/erpnext/public/js/item-dashboard.bundle.js b/erpnext/public/js/item-dashboard.bundle.js
new file mode 100644
index 0000000..2d329e2
--- /dev/null
+++ b/erpnext/public/js/item-dashboard.bundle.js
@@ -0,0 +1,5 @@
+import "../../stock/dashboard/item_dashboard.html";
+import "../../stock/dashboard/item_dashboard_list.html";
+import "../../stock/dashboard/item_dashboard.js";
+import "../../stock/page/warehouse_capacity_summary/warehouse_capacity_summary.html";
+import "../../stock/page/warehouse_capacity_summary/warehouse_capacity_summary_header.html";
diff --git a/erpnext/public/js/payment/payments.js b/erpnext/public/js/payment/payments.js
index 0d656bc..7df976c 100644
--- a/erpnext/public/js/payment/payments.js
+++ b/erpnext/public/js/payment/payments.js
@@ -1,31 +1,31 @@
 // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
 // License: GNU General Public License v3. See license.txt
 
-erpnext.payments = erpnext.stock.StockController.extend({
-	make_payment: function() {
+erpnext.payments = class payments extends erpnext.stock.StockController {
+	make_payment() {
 		var me = this;
 
 		this.dialog = new frappe.ui.Dialog({
 			title: 'Payment'
 		});
-	
+
 		this.dialog.show();
 		this.$body = this.dialog.body;
 		this.set_payment_primary_action();
 		this.make_keyboard();
 		this.select_text()
-	},
+	}
 
-	select_text: function(){
+	select_text(){
 		var me = this;
 		$(this.$body).find('.form-control').click(function(){
 			$(this).select();
 		})
-	},
+	}
 
-	set_payment_primary_action: function(){
+	set_payment_primary_action(){
 		var me = this;
-	
+
 		this.dialog.set_primary_action(__("Submit"), function() {
 			// Allow no ZERO payment
 			$.each(me.frm.doc.payments, function (index, data) {
@@ -36,18 +36,18 @@
 				}
 			});
 		})
-	},
+	}
 
-	make_keyboard: function(){
+	make_keyboard(){
 		var me = this;
 		$(this.$body).empty();
 		$(this.$body).html(frappe.render_template('pos_payment', this.frm.doc))
 		this.show_payment_details();
 		this.bind_keyboard_event()
 		this.clear_amount()
-	},
+	}
 
-	make_multimode_payment: function(){
+	make_multimode_payment(){
 		var me = this;
 
 		if(this.frm.doc.change_amount > 0){
@@ -57,9 +57,9 @@
 		this.payments = frappe.model.add_child(this.frm.doc, 'Multi Mode Payment', "payments");
 		this.payments.mode_of_payment = this.dialog.fields_dict.mode_of_payment.get_value();
 		this.payments.amount = flt(this.payment_val);
-	},
+	}
 
-	show_payment_details: function(){
+	show_payment_details(){
 		var me = this;
 		var multimode_payments = $(this.$body).find('.multimode-payments').empty();
 		if(this.frm.doc.payments.length){
@@ -82,9 +82,9 @@
 		}else{
 			$("<p>No payment mode selected in pos profile</p>").appendTo(multimode_payments)
 		}
-	},
+	}
 
-	set_outstanding_amount: function(){
+	set_outstanding_amount(){
 		this.selected_mode = $(this.$body).find(repl("input[idx='%(idx)s']",{'idx': this.idx}));
 		this.highlight_selected_row()
 		this.payment_val = 0.0
@@ -99,47 +99,47 @@
 		}
 		this.selected_mode.select()
 		this.bind_amount_change_event();
-	},
-	
-	bind_keyboard_event: function(){
+	}
+
+	bind_keyboard_event(){
 		var me = this;
 		this.payment_val = '';
 		this.bind_form_control_event();
 		this.bind_numeric_keys_event();
-	},
+	}
 
-	bind_form_control_event: function(){
+	bind_form_control_event(){
 		var me = this;
 		$(this.$body).find('.pos-payment-row').click(function(){
 			me.idx = $(this).attr("idx");
 			me.set_outstanding_amount()
 		})
-		
+
 		$(this.$body).find('.form-control').click(function(){
 			me.idx = $(this).attr("idx");
 			me.set_outstanding_amount();
 			me.update_paid_amount(true);
 		})
-		
+
 		$(this.$body).find('.write_off_amount').change(function(){
 			me.write_off_amount(flt($(this).val()), precision("write_off_amount"));
 		})
-		
+
 		$(this.$body).find('.change_amount').change(function(){
 			me.change_amount(flt($(this).val()), precision("change_amount"));
 		})
-	},
+	}
 
-	highlight_selected_row: function(){
+	highlight_selected_row(){
 		var me = this;
 		var selected_row = $(this.$body).find(repl(".pos-payment-row[idx='%(idx)s']",{'idx': this.idx}));
 		$(this.$body).find('.pos-payment-row').removeClass('selected-payment-mode')
 		selected_row.addClass('selected-payment-mode')
 		$(this.$body).find('.amount').attr('disabled', true);
 		this.selected_mode.attr('disabled', false);
-	},
-	
-	bind_numeric_keys_event: function(){
+	}
+
+	bind_numeric_keys_event(){
 		var me = this;
 		$(this.$body).find('.pos-keyboard-key').click(function(){
 			me.payment_val += $(this).text();
@@ -147,7 +147,7 @@
 			me.idx = me.selected_mode.attr("idx")
 			me.update_paid_amount()
 		})
-		
+
 		$(this.$body).find('.delete-btn').click(function(){
 			me.payment_val =  cstr(flt(me.selected_mode.val())).slice(0, -1);
 			me.selected_mode.val(format_currency(me.payment_val, me.frm.doc.currency));
@@ -155,9 +155,9 @@
 			me.update_paid_amount();
 		})
 
-	},
-	
-	bind_amount_change_event: function(){
+	}
+
+	bind_amount_change_event(){
 		var me = this;
 		this.selected_mode.change(function(){
 			me.payment_val =  flt($(this).val()) || 0.0;
@@ -165,9 +165,9 @@
 			me.idx = me.selected_mode.attr("idx")
 			me.update_payment_amount()
 		})
-	},
+	}
 
-	clear_amount: function() {
+	clear_amount() {
 		var me = this;
 		$(this.$body).find('.clr').click(function(e){
 			e.stopPropagation();
@@ -178,9 +178,9 @@
 			me.highlight_selected_row();
 			me.update_payment_amount();
 		})
-	},
+	}
 
-	write_off_amount: function(write_off_amount) {
+	write_off_amount(write_off_amount) {
 		var me = this;
 
 		this.frm.doc.write_off_amount = flt(write_off_amount, precision("write_off_amount"));
@@ -188,17 +188,17 @@
 			precision("base_write_off_amount"));
 		this.calculate_outstanding_amount(false)
 		this.show_amounts()
-	},
+	}
 
-	change_amount: function(change_amount) {
+	change_amount(change_amount) {
 		var me = this;
 
 		this.frm.doc.change_amount = flt(change_amount, precision("change_amount"));
 		this.calculate_write_off_amount()
 		this.show_amounts()
-	},
+	}
 
-	update_paid_amount: function(update_write_off) {
+	update_paid_amount(update_write_off) {
 		var me = this;
 		if(in_list(['change_amount', 'write_off_amount'], this.idx)){
 			var value = me.selected_mode.val();
@@ -213,9 +213,9 @@
 		}else{
 			this.update_payment_amount()
 		}
-	},
+	}
 
-	update_payment_amount: function(){
+	update_payment_amount(){
 		var me = this;
 
 		$.each(this.frm.doc.payments, function(index, data){
@@ -226,9 +226,9 @@
 
 		this.calculate_outstanding_amount(false);
 		this.show_amounts();
-	},
+	}
 
-	show_amounts: function(){
+	show_amounts(){
 		var me = this;
 		$(this.$body).find(".write_off_amount").val(format_currency(this.frm.doc.write_off_amount, this.frm.doc.currency));
 		$(this.$body).find('.paid_amount').text(format_currency(this.frm.doc.paid_amount, this.frm.doc.currency));
@@ -236,4 +236,4 @@
 		$(this.$body).find('.outstanding_amount').text(format_currency(this.frm.doc.outstanding_amount, frappe.get_doc(":Company", this.frm.doc.company).default_currency))
 		this.update_invoice();
 	}
-})
\ No newline at end of file
+}
diff --git a/erpnext/public/js/point-of-sale.bundle.js b/erpnext/public/js/point-of-sale.bundle.js
new file mode 100644
index 0000000..fbc4bbb
--- /dev/null
+++ b/erpnext/public/js/point-of-sale.bundle.js
@@ -0,0 +1,8 @@
+import "../../selling/page/point_of_sale/pos_item_selector.js";
+import "../../selling/page/point_of_sale/pos_item_cart.js";
+import "../../selling/page/point_of_sale/pos_item_details.js";
+import "../../selling/page/point_of_sale/pos_number_pad.js";
+import "../../selling/page/point_of_sale/pos_payment.js";
+import "../../selling/page/point_of_sale/pos_past_order_list.js";
+import "../../selling/page/point_of_sale/pos_past_order_summary.js";
+import "../../selling/page/point_of_sale/pos_controller.js";
diff --git a/erpnext/public/js/stock_analytics.js b/erpnext/public/js/stock_analytics.js
index 140c9dc..dfe2c88 100644
--- a/erpnext/public/js/stock_analytics.js
+++ b/erpnext/public/js/stock_analytics.js
@@ -2,8 +2,8 @@
 // License: GNU General Public License v3. See license.txt
 
 
-erpnext.StockAnalytics = erpnext.StockGridReport.extend({
-	init: function(wrapper, opts) {
+erpnext.StockAnalytics = class StockAnalytics extends erpnext.StockGridReport {
+	constructor(wrapper, opts) {
 		var args = {
 			title: __("Stock Analytics"),
 			parent: $(wrapper).find('.layout-main'),
@@ -30,9 +30,33 @@
 
 		if(opts) $.extend(args, opts);
 
-		this._super(args);
-	},
-	setup_columns: function() {
+		super(args);
+
+		this.filters = [
+			{fieldtype:"Select", label: __("Value or Qty"), fieldname: "value_or_qty",
+				options:[{label:__("Value"), value:"Value"}, {label:__("Quantity"), value:"Quantity"}],
+				filter: function(val, item, opts, me) {
+					return me.apply_zero_filter(val, item, opts, me);
+				}},
+			{fieldtype:"Select", label: __("Brand"), link:"Brand", fieldname: "brand",
+				default_value: __("Select Brand..."), filter: function(val, item, opts) {
+					return val == opts.default_value || item.brand == val || item._show;
+				}, link_formatter: {filter_input: "brand"}},
+			{fieldtype:"Select", label: __("Warehouse"), link:"Warehouse", fieldname: "warehouse",
+				default_value: __("Select Warehouse...")},
+			{fieldtype:"Date", label: __("From Date"), fieldname: "from_date"},
+			{fieldtype:"Date", label: __("To Date"), fieldname: "to_date"},
+			{fieldtype:"Select", label: __("Range"), fieldname: "range",
+				options:[
+					{label:__("Daily"), value:"Daily"},
+					{label:__("Weekly"), value:"Weekly"},
+					{label:__("Monthly"), value:"Monthly"},
+					{label:__("Quarterly"), value:"Quarterly"},
+					{label:__("Yearly"), value:"Yearly"},
+				]}
+		];
+	}
+	setup_columns() {
 		var std_columns = [
 			{id: "name", name: __("Item"), field: "name", width: 300},
 			{id: "brand", name: __("Brand"), field: "brand", width: 100},
@@ -43,43 +67,21 @@
 
 		this.make_date_range_columns();
 		this.columns = std_columns.concat(this.columns);
-	},
-	filters: [
-		{fieldtype:"Select", label: __("Value or Qty"), fieldname: "value_or_qty",
-			options:[{label:__("Value"), value:"Value"}, {label:__("Quantity"), value:"Quantity"}],
-			filter: function(val, item, opts, me) {
-				return me.apply_zero_filter(val, item, opts, me);
-			}},
-		{fieldtype:"Select", label: __("Brand"), link:"Brand", fieldname: "brand",
-			default_value: __("Select Brand..."), filter: function(val, item, opts) {
-				return val == opts.default_value || item.brand == val || item._show;
-			}, link_formatter: {filter_input: "brand"}},
-		{fieldtype:"Select", label: __("Warehouse"), link:"Warehouse", fieldname: "warehouse",
-			default_value: __("Select Warehouse...")},
-		{fieldtype:"Date", label: __("From Date"), fieldname: "from_date"},
-		{fieldtype:"Date", label: __("To Date"), fieldname: "to_date"},
-		{fieldtype:"Select", label: __("Range"), fieldname: "range",
-			options:[
-				{label:__("Daily"), value:"Daily"},
-				{label:__("Weekly"), value:"Weekly"},
-				{label:__("Monthly"), value:"Monthly"},
-				{label:__("Quarterly"), value:"Quarterly"},
-				{label:__("Yearly"), value:"Yearly"},
-			]}
-	],
-	setup_filters: function() {
+	}
+
+	setup_filters() {
 		var me = this;
-		this._super();
+		super.setup_filters();
 
 		this.trigger_refresh_on_change(["value_or_qty", "brand", "warehouse", "range"]);
 
 		this.show_zero_check();
-	},
-	init_filter_values: function() {
-		this._super();
+	}
+	init_filter_values() {
+		super.init_filter_values();
 		this.filter_inputs.range && this.filter_inputs.range.val('Monthly');
-	},
-	prepare_data: function() {
+	}
+	prepare_data() {
 		var me = this;
 
 		if(!this.data) {
@@ -112,8 +114,8 @@
 		this.prepare_balances();
 		this.update_groups();
 
-	},
-	prepare_balances: function() {
+	}
+	prepare_balances() {
 		var me = this;
 		var from_date = frappe.datetime.str_to_obj(this.from_date);
 		var to_date = frappe.datetime.str_to_obj(this.to_date);
@@ -164,8 +166,8 @@
 				item.closing_qty_value += diff;
 			}
 		}
-	},
-	update_groups: function() {
+	}
+	update_groups() {
 		var me = this;
 		$.each(this.data, function(i, item) {
 			// update groups
@@ -192,8 +194,8 @@
 				}
 			}
 		});
-	},
-	show_stock_ledger: function(item_code) {
+	}
+	show_stock_ledger(item_code) {
 		frappe.route_options = {
 			item_code: item_code,
 			from_date: this.from_date,
@@ -201,5 +203,5 @@
 		};
 		frappe.set_route("query-report", "Stock Ledger");
 	}
-});
+};
 
diff --git a/erpnext/public/js/stock_grid_report.js b/erpnext/public/js/stock_grid_report.js
index 832fd3e..752fafd 100644
--- a/erpnext/public/js/stock_grid_report.js
+++ b/erpnext/public/js/stock_grid_report.js
@@ -1,16 +1,16 @@
 // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
 // License: GNU General Public License v3. See license.txt
 
-erpnext.StockGridReport = frappe.views.TreeGridReport.extend({
-	get_item_warehouse: function(warehouse, item) {
+erpnext.StockGridReport = class StockGridReport extends frappe.views.TreeGridReport {
+	get_item_warehouse(warehouse, item) {
 		if(!this.item_warehouse[item]) this.item_warehouse[item] = {};
 		if(!this.item_warehouse[item][warehouse]) this.item_warehouse[item][warehouse] = {
 			balance_qty: 0.0, balance_value: 0.0, fifo_stack: []
 		};
 		return this.item_warehouse[item][warehouse];
-	},
+	}
 
-	get_value_diff: function(wh, sl, is_fifo) {
+	get_value_diff(wh, sl, is_fifo) {
 		// value
 		if(sl.qty > 0) {
 			// incoming - rate is given
@@ -59,8 +59,8 @@
 		wh.balance_qty += sl.qty;
 		wh.balance_value += value_diff;
 		return value_diff;
-	},
-	get_fifo_value_diff: function(wh, sl) {
+	}
+	get_fifo_value_diff(wh, sl) {
 		// get exact rate from fifo stack
 		var fifo_stack = (wh.fifo_stack || []).reverse();
 		var fifo_value_diff = 0.0;
@@ -89,9 +89,9 @@
 		// reset the updated stack
 		wh.fifo_stack = fifo_stack.reverse();
 		return -fifo_value_diff;
-	},
+	}
 
-	get_serialized_value_diff: function(sl) {
+	get_serialized_value_diff(sl) {
 		var me = this;
 
 		var value_diff = 0.0;
@@ -103,9 +103,9 @@
 		});
 
 		return value_diff;
-	},
+	}
 
-	get_serialized_buying_rates: function() {
+	get_serialized_buying_rates() {
 		var serialized_buying_rates = {};
 
 		if (frappe.report_dump.data["Serial No"]) {
@@ -115,5 +115,5 @@
 		}
 
 		return serialized_buying_rates;
-	},
-});
+	}
+};
diff --git a/erpnext/public/js/telephony.js b/erpnext/public/js/telephony.js
index 9548d6c..1c3e314 100644
--- a/erpnext/public/js/telephony.js
+++ b/erpnext/public/js/telephony.js
@@ -1,19 +1,19 @@
-frappe.ui.form.ControlData = frappe.ui.form.ControlData.extend( {
+frappe.ui.form.ControlData = class ControlData extends frappe.ui.form.ControlData  {
 	make_input() {
-		this._super();
+		super.make_input();
 		if (this.df.options == 'Phone') {
 			this.setup_phone();
 		}
 		if (this.frm && this.frm.fields_dict) {
 			Object.values(this.frm.fields_dict).forEach(function(field) {
-				if (field.df.read_only === 1 && field.df.options === 'Phone' 
+				if (field.df.read_only === 1 && field.df.options === 'Phone'
 					&& field.disp_area.style[0] != 'display' && !field.has_icon) {
 					field.setup_phone();
 					field.has_icon = true;
 				}
 			});
 		}
-	},
+	}
 	setup_phone() {
 		if (frappe.phone_call.handler) {
 			let control = this.df.read_only ? '.control-value' : '.control-input';
@@ -30,4 +30,4 @@
 				});
 		}
 	}
-});
+};
diff --git a/erpnext/public/js/utils/customer_quick_entry.js b/erpnext/public/js/utils/customer_quick_entry.js
index ebe6cd9..efb8dd9 100644
--- a/erpnext/public/js/utils/customer_quick_entry.js
+++ b/erpnext/public/js/utils/customer_quick_entry.js
@@ -1,17 +1,17 @@
 frappe.provide('frappe.ui.form');
 
-frappe.ui.form.CustomerQuickEntryForm = frappe.ui.form.QuickEntryForm.extend({
-	init: function(doctype, after_insert) {
+frappe.ui.form.CustomerQuickEntryForm = class CustomerQuickEntryForm extends frappe.ui.form.QuickEntryForm {
+	constructor(doctype, after_insert) {
+		super(doctype, after_insert);
 		this.skip_redirect_on_error = true;
-		this._super(doctype, after_insert);
-	},
+	}
 
-	render_dialog: function() {
+	render_dialog() {
 		this.mandatory = this.mandatory.concat(this.get_variant_fields());
-		this._super();
-	},
+		super.render_dialog();
+	}
 
-	get_variant_fields: function() {
+	get_variant_fields() {
 		var variant_fields = [{
 			fieldtype: "Section Break",
 			label: __("Primary Contact Details"),
@@ -77,5 +77,5 @@
 		}];
 
 		return variant_fields;
-	},
-})
\ No newline at end of file
+	}
+}
diff --git a/erpnext/public/js/utils/item_quick_entry.js b/erpnext/public/js/utils/item_quick_entry.js
index 27ef107..7e0198d 100644
--- a/erpnext/public/js/utils/item_quick_entry.js
+++ b/erpnext/public/js/utils/item_quick_entry.js
@@ -1,27 +1,27 @@
 frappe.provide('frappe.ui.form');
 
-frappe.ui.form.ItemQuickEntryForm = frappe.ui.form.QuickEntryForm.extend({
-	init: function(doctype, after_insert) {
-		this._super(doctype, after_insert);
-	},
+frappe.ui.form.ItemQuickEntryForm = class ItemQuickEntryForm extends frappe.ui.form.QuickEntryForm {
+	constructor(doctype, after_insert) {
+		super(doctype, after_insert);
+	}
 
-	render_dialog: function() {
+	render_dialog() {
 		this.mandatory = this.get_variant_fields().concat(this.mandatory);
 		this.mandatory = this.mandatory.concat(this.get_attributes_fields());
 		this.check_naming_series_based_on();
-		this._super();
+		super.render_dialog();
 		this.init_post_render_dialog_operations();
 		this.preset_fields_for_template();
 		this.dialog.$wrapper.find('.edit-full').text(__('Edit in full page for more options like assets, serial nos, batches etc.'))
-	},
+	}
 
-	check_naming_series_based_on: function() {
+	check_naming_series_based_on() {
 		if (frappe.defaults.get_default("item_naming_by") === "Naming Series") {
 			this.mandatory = this.mandatory.filter(d => d.fieldname !== "item_code");
 		}
-	},
+	}
 
-	init_post_render_dialog_operations: function() {
+	init_post_render_dialog_operations() {
 		this.dialog.fields_dict.attribute_html.$wrapper.append(frappe.render_template("item_quick_entry"));
 		this.init_for_create_variant_trigger();
 		this.init_for_item_template_trigger();
@@ -29,9 +29,9 @@
 		this.toggle_manufacturer_fields();
 		this.dialog.get_field("item_template").df.hidden = 1;
 		this.dialog.get_field("item_template").refresh();
-	},
+	}
 
-	register_primary_action: function() {
+	register_primary_action() {
 		var me = this;
 		this.dialog.set_primary_action(__('Save'), function() {
 			if (me.dialog.working) return;
@@ -59,9 +59,9 @@
 				me.insert(variant_values);
 			}
 		});
-	},
+	}
 
-	insert: function(variant_values) {
+	insert(variant_values) {
 		let me = this;
 		return new Promise(resolve => {
 			frappe.call({
@@ -94,9 +94,9 @@
 				freeze: true
 			});
 		});
-	},
+	}
 
-	open_doc: function() {
+	open_doc() {
 		this.dialog.hide();
 		this.update_doc();
 		if (this.dialog.fields_dict.create_variant.$input.prop("checked")) {
@@ -106,9 +106,9 @@
 		} else {
 			frappe.set_route('Form', this.doctype, this.doc.name);
 		}
-	},
+	}
 
-	get_variant_fields: function() {
+	get_variant_fields() {
 		var variant_fields = [{
 			fieldname: "create_variant",
 			fieldtype: "Check",
@@ -130,9 +130,9 @@
 		}];
 
 		return variant_fields;
-	},
+	}
 
-	get_manufacturing_fields: function() {
+	get_manufacturing_fields() {
 		this.manufacturer_fields = [{
 			fieldtype: 'Link',
 			options: 'Manufacturer',
@@ -148,9 +148,9 @@
 			reqd: 0
 		}];
 		return this.manufacturer_fields;
-	},
+	}
 
-	get_attributes_fields: function() {
+	get_attributes_fields() {
 		var attribute_fields = [{
 			fieldname: 'attribute_html',
 			fieldtype: 'HTML'
@@ -158,18 +158,18 @@
 
 		attribute_fields = attribute_fields.concat(this.get_manufacturing_fields());
 		return attribute_fields;
-	},
+	}
 
-	init_for_create_variant_trigger: function() {
+	init_for_create_variant_trigger() {
 		var me = this;
 
 		this.dialog.fields_dict.create_variant.$input.on("click", function() {
 			me.preset_fields_for_template();
 			me.init_post_template_trigger_operations(false, [], true);
 		});
-	},
+	}
 
-	preset_fields_for_template: function() {
+	preset_fields_for_template() {
 		var for_variant = this.dialog.get_value('create_variant');
 
 		// setup template field, seen and mandatory if variant
@@ -195,9 +195,9 @@
 			f.refresh();
 		});
 
-	},
+	}
 
-	init_for_item_template_trigger: function() {
+	init_for_item_template_trigger() {
 		var me = this;
 
 		me.dialog.fields_dict["item_template"].df.onchange = () => {
@@ -228,9 +228,9 @@
 				me.init_post_template_trigger_operations(false, [], true);
 			}
 		}
-	},
+	}
 
-	init_post_template_trigger_operations: function(is_manufacturer, attributes, attributes_flag) {
+	init_post_template_trigger_operations(is_manufacturer, attributes, attributes_flag) {
 		this.attributes = attributes;
 		this.attribute_values = {};
 		this.attributes_count = attributes.length;
@@ -240,23 +240,23 @@
 		this.toggle_manufacturer_fields();
 		this.dialog.fields_dict.attribute_html.$wrapper.find(".attributes").toggleClass("hide-control", attributes_flag);
 		this.dialog.fields_dict.attribute_html.$wrapper.find(".attributes-header").toggleClass("hide-control", attributes_flag);
-	},
+	}
 
-	toggle_manufacturer_fields: function() {
+	toggle_manufacturer_fields() {
 		var me = this;
 		$.each(this.manufacturer_fields, function(i, dialog_field) {
 			me.dialog.get_field(dialog_field.fieldname).df.hidden = !me.is_manufacturer;
 			me.dialog.get_field(dialog_field.fieldname).df.reqd = dialog_field.fieldname == 'manufacturer' ? me.is_manufacturer : false;
 			me.dialog.get_field(dialog_field.fieldname).refresh();
 		});
-	},
+	}
 
-	initiate_render_attributes: function() {
+	initiate_render_attributes() {
 		this.dialog.fields_dict.attribute_html.$wrapper.find(".attributes").empty();
 		this.render_attributes(this.attributes);
-	},
+	}
 
-	render_attributes: function(attributes) {
+	render_attributes(attributes) {
 		var me = this;
 
 		this.dialog.get_field('attribute_html').toggle(true);
@@ -291,9 +291,9 @@
 				});
 			}
 		});
-	},
+	}
 
-	init_make_control: function(fieldtype, row) {
+	init_make_control(fieldtype, row) {
 		this[row.attribute] = frappe.ui.form.make_control({
 			df: {
 				"fieldtype": fieldtype,
@@ -305,9 +305,9 @@
 			only_input: false
 		});
 		this[row.attribute].make_input();
-	},
+	}
 
-	init_awesomplete_for_attribute: function(row) {
+	init_awesomplete_for_attribute(row) {
 		var me = this;
 
 		this[row.attribute].input.awesomplete = new Awesomplete(this[row.attribute].input, {
@@ -343,9 +343,9 @@
 			me.attribute_values[$(e.target).attr("data-fieldname")] = e.target.value;
 			$(e.target).closest(".frappe-control").toggleClass("has-error", e.target.value ? false : true);
 		});
-	},
+	}
 
-	get_variant_doc: function() {
+	get_variant_doc() {
 		var me = this;
 		var variant_doc = {};
 		var attribute = this.validate_mandatory_attributes();
@@ -381,9 +381,9 @@
 			})
 		}
 		return variant_doc;
-	},
+	}
 
-	validate_mandatory_attributes: function() {
+	validate_mandatory_attributes() {
 		var me = this;
 		var attribute = {};
 		var mandatory = [];
@@ -404,4 +404,4 @@
 		}
 		return attribute;
 	}
-});
\ No newline at end of file
+};
diff --git a/erpnext/public/js/utils/item_selector.js b/erpnext/public/js/utils/item_selector.js
index d04c488..9fc2640 100644
--- a/erpnext/public/js/utils/item_selector.js
+++ b/erpnext/public/js/utils/item_selector.js
@@ -1,5 +1,5 @@
-erpnext.ItemSelector = Class.extend({
-	init: function(opts) {
+erpnext.ItemSelector = class ItemSelector {
+	constructor(opts) {
 		$.extend(this, opts);
 
 		if (!this.item_field) {
@@ -12,9 +12,9 @@
 
 		this.grid = this.frm.get_field("items").grid;
 		this.setup();
-	},
+	}
 
-	setup: function() {
+	setup() {
 		var me = this;
 		if(!this.grid.add_items_button) {
 			this.grid.add_items_button = this.grid.add_custom_button(__('Add Items'), function() {
@@ -26,9 +26,9 @@
 				setTimeout(function() { me.dialog.input.focus(); }, 1000);
 			});
 		}
-	},
+	}
 
-	make_dialog: function() {
+	make_dialog() {
 		this.dialog = new frappe.ui.Dialog({
 			title: __('Add Items')
 		});
@@ -53,9 +53,9 @@
 				me.timeout_id = undefined;
 			}, 500);
 		});
-	},
+	}
 
-	add_item: function(item_code) {
+	add_item(item_code) {
 		// add row or update qty
 		var added = false;
 
@@ -82,9 +82,9 @@
 			]);
 		}
 
-	},
+	}
 
-	render_items: function() {
+	render_items() {
 		let args = {
 			query: this.item_query,
 			filters: {}
@@ -107,4 +107,4 @@
 			me.dialog.results.html(frappe.render_template('item_selector', {'data':r.values}));
 		});
 	}
-});
\ No newline at end of file
+};
diff --git a/erpnext/public/js/utils/serial_no_batch_selector.js b/erpnext/public/js/utils/serial_no_batch_selector.js
index 3333d56..79b6220 100644
--- a/erpnext/public/js/utils/serial_no_batch_selector.js
+++ b/erpnext/public/js/utils/serial_no_batch_selector.js
@@ -1,6 +1,6 @@
 
-erpnext.SerialNoBatchSelector = Class.extend({
-	init: function(opts, show_dialog) {
+erpnext.SerialNoBatchSelector = class SerialNoBatchSelector {
+	constructor(opts, show_dialog) {
 		$.extend(this, opts);
 		this.show_dialog = show_dialog;
 		// frm, item, warehouse_details, has_batch, oldest
@@ -12,16 +12,16 @@
 		if(d && d.has_serial_no && !(this.show_dialog == false)) this.has_serial_no = 1;
 
 		this.setup();
-	},
+	}
 
-	setup: function() {
+	setup() {
 		this.item_code = this.item.item_code;
 		this.qty = this.item.qty;
 		this.make_dialog();
 		this.on_close_dialog();
-	},
+	}
 
-	make_dialog: function() {
+	make_dialog() {
 		var me = this;
 
 		this.data = this.oldest ? this.oldest : [];
@@ -176,15 +176,15 @@
 		}
 
 		this.dialog.show();
-	},
+	}
 
-	on_close_dialog: function() {
+	on_close_dialog() {
 		this.dialog.get_close_btn().on('click', () => {
 			this.on_close && this.on_close(this.item);
 		});
-	},
+	}
 
-	validate: function() {
+	validate() {
 		let values = this.values;
 		if(!values.warehouse) {
 			frappe.throw(__("Please select a warehouse"));
@@ -210,7 +210,7 @@
 			}
 			return true;
 		}
-	},
+	}
 
 	update_batch_items() {
 		// clones an items if muliple batches are selected.
@@ -233,14 +233,14 @@
 					'selected_qty', this.values.warehouse);
 			});
 		}
-	},
+	}
 
 	update_serial_no_item() {
 		// just updates serial no for the item
 		if(this.has_serial_no && !this.has_batch) {
 			this.map_row_values(this.item, this.values, 'serial_no', 'qty');
 		}
-	},
+	}
 
 	update_batch_serial_no_items() {
 		// if serial no selected is from different batches, adds new rows for each batch.
@@ -281,14 +281,14 @@
 				});
 			})
 		}
-	},
+	}
 
-	batch_exists: function(batch) {
+	batch_exists(batch) {
 		const batches = this.frm.doc.items.map(data => data.batch_no);
 		return (batches && in_list(batches, batch)) ? true : false;
-	},
+	}
 
-	map_row_values: function(row, values, number, qty_field, warehouse) {
+	map_row_values(row, values, number, qty_field, warehouse) {
 		row.qty = values[qty_field];
 		row.transfer_qty = flt(values[qty_field]) * flt(row.conversion_factor);
 		row[number] = values[number];
@@ -301,9 +301,9 @@
 		}
 
 		this.frm.dirty();
-	},
+	}
 
-	update_total_qty: function() {
+	update_total_qty() {
 		let qty_field = this.dialog.fields_dict.qty;
 		let total_qty = 0;
 
@@ -312,9 +312,9 @@
 		});
 
 		qty_field.set_input(total_qty);
-	},
+	}
 
-	get_batch_fields: function() {
+	get_batch_fields() {
 		var me = this;
 
 		return [
@@ -425,9 +425,9 @@
 				},
 			}
 		];
-	},
+	}
 
-	get_serial_no_fields: function() {
+	get_serial_no_fields() {
 		var me = this;
 		this.serial_list = [];
 
@@ -510,4 +510,4 @@
 			}
 		];
 	}
-});
+};
diff --git a/erpnext/public/less/hub.less b/erpnext/public/less/hub.less
deleted file mode 100644
index 29deada..0000000
--- a/erpnext/public/less/hub.less
+++ /dev/null
@@ -1,375 +0,0 @@
-@import "variables.less";
-@import (reference) "desk.less";
-
-body[data-route*="marketplace"] {
-	.layout-side-section {
-		padding-top: 25px;
-		padding-left: 5px;
-		padding-right: 25px;
-	}
-
-	[data-route], [data-action] {
-		cursor: pointer;
-	}
-
-	.layout-main-section {
-		border: none;
-		font-size: @text-medium;
-		padding-top: 25px;
-
-		@media (max-width: @screen-xs) {
-			padding-left: 20px;
-			padding-right: 20px;
-		}
-	}
-
-	input, textarea {
-		font-size: @text-medium;
-	}
-
-	.hub-image {
-		height: 200px;
-	}
-
-	.hub-image-loading, .hub-image-broken {
-		content: " ";
-		position: absolute;
-		left: 0;
-		height: 100%;
-		width: 100%;
-		background-color: var(--bg-light-gray);
-		display: flex;
-		align-items: center;
-		justify-content: center;
-
-		span {
-			font-size: 32px;
-			color: @text-extra-muted;
-		}
-	}
-
-	.progress-bar {
-		background-color: #89da28;
-	}
-
-	.subpage-title.flex {
-		align-items: flex-start;
-		justify-content: space-between;
-	}
-
-	.hub-card {
-		margin-bottom: 25px;
-		position: relative;
-		border: 1px solid @border-color;
-		border-radius: 4px;
-		overflow: hidden;
-
-		&:hover .hub-card-overlay {
-			display: block;
-		}
-	}
-
-	.hub-card.is-local {
-		&.active {
-			.hub-card-header {
-				background-color: #f4ffe5;
-			}
-
-			.octicon-check {
-				display: inline;
-			}
-		}
-
-		.octicon-check {
-			display: none;
-			position: absolute;
-			font-size: 20px;
-			right: 15px;
-			top: 50%;
-			transform: translateY(-50%);
-		}
-	}
-
-	.hub-card-header {
-		position: relative;
-		padding: 12px 15px;
-		height: 60px;
-		border-bottom: 1px solid @border-color;
-	}
-
-	.hub-card-body {
-		position: relative;
-		height: 200px;
-	}
-
-	.hub-card-overlay {
-		display: none;
-		position: absolute;
-		top: 0;
-		width: 100%;
-		height: 100%;
-		background-color: rgba(0, 0, 0, 0.05);
-	}
-
-	.hub-card-overlay-body {
-		position: relative;
-		height: 100%;
-	}
-
-	.hub-card-overlay-button {
-		position: absolute;
-		right: 15px;
-		bottom: 15px;
-	}
-
-	.hub-card-image {
-		position: relative;
-		width: 100%;
-		height: 100%;
-		object-fit: contain;
-	}
-
-	.hub-search-container {
-		margin-bottom: 20px;
-
-		input {
-			height: 32px;
-		}
-	}
-
-	.hub-sidebar {
-		padding-top: 25px;
-		padding-right: 15px;
-	}
-
-	.hub-sidebar-group {
-		margin-bottom: 10px;
-	}
-
-	.hub-sidebar-item {
-		padding: 5px 8px;
-		margin-bottom: 3px;
-		border-radius: 4px;
-		border: 1px solid transparent;
-
-		&.active, &:hover:not(.is-title) {
-			border-color: @border-color;
-		}
-	}
-
-	.hub-item-image {
-		position: relative;
-		border: 1px solid @border-color;
-		border-radius: 4px;
-		overflow: hidden;
-		height: 200px;
-		width: 200px;
-		display: flex;
-		align-items: center;
-	}
-
-	.hub-item-skeleton-image {
-		border-radius: 4px;
-		background-color: @light-bg;
-		overflow: hidden;
-		height: 200px;
-		width: 200px;
-	}
-
-	.hub-skeleton {
-		background-color: @light-bg;
-		color: @light-bg;
-		max-width: 500px;
-	}
-
-	.hub-item-seller img {
-		width: 50px;
-		height: 50px;
-		border-radius: 4px;
-		border: 1px solid @border-color;
-	}
-
-	.register-title {
-		font-size: @text-regular;
-	}
-
-	.register-form {
-		border: 1px solid @border-color;
-		border-radius: 4px;
-		padding: 15px 25px;
-	}
-
-	.publish-area.filled {
-		.empty-items-container {
-			display: none;
-		}
-	}
-
-	.publish-area.empty {
-		.hub-items-container {
-			display: none;
-		}
-	}
-
-	.publish-area-head {
-		display: flex;
-		justify-content: space-between;
-		margin-bottom: 20px;
-	}
-
-	.hub-list-item {
-		display: flex;
-		justify-content: space-between;
-		align-items: center;
-		border: 1px solid @border-color;
-		margin-bottom: -1px;
-		overflow: hidden;
-	}
-
-	.hub-list-item:first-child {
-		border-top-left-radius: 4px;
-		border-top-right-radius: 4px;
-	}
-	.hub-list-item:last-child {
-		border-bottom-left-radius: 4px;
-		border-bottom-right-radius: 4px;
-	}
-
-	.hub-list-left {
-		display: flex;
-		align-items: center;
-		max-width: 90%;
-	}
-
-	.hub-list-right {
-		padding-right: 15px;
-	}
-
-	.hub-list-image {
-		position: relative;
-		width: 58px;
-		height: 58px;
-		border-right: 1px solid @border-color;
-
-		&::after {
-			font-size: 12px;
-		}
-	}
-
-	.hub-list-body {
-		padding: 12px 15px;
-	}
-
-	.hub-list-title {
-		font-weight: bold;
-	}
-
-	.hub-list-subtitle {
-		color: @text-muted;
-	}
-
-	.selling-item-message-card {
-		max-width: 500px;
-		margin-bottom: 15px;
-		border-radius: 3px;
-		border: 1px solid @border-color;
-		.selling-item-detail {
-			overflow: auto;
-			.item-image {
-				float: left;
-				height: 80px;
-				width: 80px;
-				object-fit: contain;
-				margin: 5px;
-			}
-			.item-name {
-				margin-left: 10px;
-			}
-		}
-		.received-message-container {
-			clear: left;
-			background-color: @light-bg;
-			.received-message {
-				border-top: 1px solid @border-color;
-				padding: 10px;
-			}
-			.frappe-timestamp {
-				float: right;
-			}
-		}
-	}
-
-	.form-container {
-		.frappe-control {
-			max-width: 100% !important;
-		}
-	}
-
-	.form-message {
-		padding-top: 0;
-		padding-bottom: 0;
-		border-bottom: none;
-	}
-
-	.hub-items-container {
-		.hub-items-header {
-			justify-content: space-between;
-			align-items: baseline;
-		}
-	}
-
-	.hub-item-container {
-		overflow: hidden;
-	}
-
-	.hub-item-review-container {
-		margin-top: calc(30vh);
-	}
-
-	.hub-item-dropdown {
-		margin-top: 20px;
-	}
-
-	/* messages page */
-
-	.message-list-item {
-		display: flex;
-		align-items: center;
-		padding: 8px 12px;
-
-		&:not(.active) {
-			filter: grayscale(1);
-			color: @text-muted;
-		}
-
-		&:hover {
-			background-color: @light-bg;
-		}
-
-		.list-item-left {
-			width: 30px;
-			border-radius: 4px;
-			overflow: hidden;
-			margin-right: 15px;
-		}
-
-		.list-item-body {
-			font-weight: bold;
-			padding-bottom: 1px;
-		}
-	}
-
-	.message-container {
-		display: flex;
-		flex-direction: column;
-		border: 1px solid @border-color;
-		border-radius: 3px;
-		height: calc(100vh - 300px);
-		justify-content: space-between;
-		padding: 15px;
-	}
-
-	.message-list {
-		overflow: scroll;
-	}
-}
diff --git a/erpnext/public/less/pos.less b/erpnext/public/less/pos.less
deleted file mode 100644
index b081ed4..0000000
--- a/erpnext/public/less/pos.less
+++ /dev/null
@@ -1,229 +0,0 @@
-@import "../../../../frappe/frappe/public/less/variables.less";
-
-[data-route="point-of-sale"] {
-	.layout-main-section-wrapper {
-		margin-bottom: 0;
-	}
-
-	.pos-items-wrapper {
-		max-height: ~"calc(100vh - 210px)";
-	}
-}
-
-.pos {
-	// display: flex;
-	padding: 15px;
-}
-
-.list-item {
-	min-height: 40px;
-	height: auto;
-}
-
-.cart-container {
-	padding: 0 15px;
-	// flex: 2;
-	display: inline-block;
-	width: 39%;
-	vertical-align: top;
-}
-
-.item-container {
-	padding: 0 15px;
-	// flex: 3;
-	display: inline-block;
-	width: 60%;
-	vertical-align: top;
-}
-
-.search-field {
-	width: 60%;
-
-	input::placeholder {
-		font-size: @text-medium;
-	}
-}
-
-.item-group-field {
-	width: 40%;
-	margin-left: 15px;
-}
-
-.cart-wrapper {
-	margin-bottom: 12px;
-	.list-item__content:not(:first-child) {
-		justify-content: flex-end;
-	}
-
-	.list-item--head .list-item__content:nth-child(2) {
-		flex: 1.5;
-	}
-}
-
-.cart-items {
-	height: 150px;
-	overflow: auto;
-
-	.list-item.current-item {
-		background-color: @light-yellow;
-	}
-
-	.list-item.current-item.qty input {
-		border: 1px solid @brand-primary;
-		font-weight: bold;
-	}
-
-	.list-item.current-item.disc .discount {
-		font-weight: bold;
-	}
-
-	.list-item.current-item.rate .rate {
-		font-weight: bold;
-	}
-
-	.list-item .quantity {
-		flex: 1.5;
-	}
-
-	input {
-		text-align: right;
-		height: 22px;
-		font-size: @text-medium;
-	}
-}
-
-.fields {
-	display: flex;
-}
-
-.pos-items-wrapper {
-	max-height: 480px;
-	overflow-y: auto;
-}
-
-.pos-items {
-	overflow: hidden;
-}
-
-.pos-item-wrapper {
-	display: flex;
-	flex-direction: column;
-	position: relative;
-	width: 25%;
-}
-
-.image-view-container {
-	display: block;
-}
-
-.image-view-container .image-field {
-	height: auto;
-}
-
-.empty-state {
-	height: 100%;
-	position: relative;
-
-	span {
-		position: absolute;
-		color: @text-muted;
-		font-size: @text-medium;
-		top: 50%;
-		left: 50%;
-		transform: translate(-50%, -50%);
-	}
-}
-
-@keyframes yellow-fade {
-	0% {background-color: @light-yellow;}
-	100% {background-color: transparent;}
-}
-
-.highlight {
-	animation: yellow-fade 1s ease-in 1;
-}
-
-input[type=number]::-webkit-inner-spin-button,
-input[type=number]::-webkit-outer-spin-button {
-	-webkit-appearance: none;
-	margin: 0;
-}
-
-// number pad
-
-.number-pad {
-	border-collapse: collapse;
-	cursor: pointer;
-	display: table;
-}
-.num-row {
-	display: table-row;
-}
-.num-col {
-	display: table-cell;
-	border: 1px solid @border-color;
-
-	& > div {
-		width: 50px;
-		height: 50px;
-		text-align: center;
-		line-height: 50px;
-	}
-
-	&.active {
-		background-color: @light-yellow;
-	}
-
-	&.brand-primary {
-		background-color: @brand-primary;
-		color: #ffffff;
-	}
-}
-
-// taxes, totals and discount area
-.discount-amount {
-	.discount-inputs {
-		display: flex;
-		flex-direction: column;
-		padding: 15px 0;
-	}
-
-	input:first-child {
-		margin-bottom: 10px;
-	}
-}
-
-.taxes-and-totals {
-	border-top: 1px solid @border-color;
-
-	.taxes {
-		display: flex;
-		flex-direction: column;
-		padding: 15px 0;
-		align-items: flex-end;
-
-		& > div:first-child {
-			margin-bottom: 10px;
-		}
-	}
-}
-
-.grand-total {
-	border-top: 1px solid @border-color;
-
-	.list-item {
-		height: 60px;
-	}
-
-	.grand-total-value {
-		font-size: 18px;
-	}
-}
-
-.rounded-total-value {
-  font-size: 18px;
-}
-
-.quantity-total {
-  font-size: 18px;
-}
\ No newline at end of file
diff --git a/erpnext/public/less/products.less b/erpnext/public/less/products.less
deleted file mode 100644
index 5e744ce..0000000
--- a/erpnext/public/less/products.less
+++ /dev/null
@@ -1,71 +0,0 @@
-@import "variables.less";
-
-.products-list .product-image {
-	display: inline-block;
-	width: 160px;
-	height: 160px;
-	object-fit: contain;
-	margin-right: 1rem;
-}
-
-.product-image.no-image {
-	display: flex;
-	justify-content: center;
-	align-items: center;
-	font-size: 3rem;
-	color: var(--gray);
-	background: var(--light);
-}
-
-.product-image a {
-	text-decoration: none;
-}
-
-.filter-options {
-	margin-left: -5px;
-	padding-left: 5px;
-	max-height: 300px;
-	overflow: auto;
-}
-
-.item-slideshow-image {
-	height: 3rem;
-	width: 3rem;
-	object-fit: contain;
-	padding: 0.5rem;
-	border: 1px solid @border-color;
-	border-radius: 4px;
-	cursor: pointer;
-
-	&:hover, &.active {
-		border-color: var(--primary);
-	}
-}
-
-.address-card {
-	cursor: pointer;
-	position: relative;
-
-	.check {
-		display: none;
-	}
-
-	&.active {
-		border-color: var(--primary);
-
-		.check {
-			display: inline-flex;
-		}
-	}
-}
-
-.check {
-	display: inline-flex;
-    padding: 0.25rem;
-    background: var(--primary);
-    color: white;
-    border-radius: 50%;
-	font-size: 12px;
-	width: 24px;
-	height: 24px;
-}
\ No newline at end of file
diff --git a/erpnext/public/less/website.less b/erpnext/public/less/website.less
deleted file mode 100644
index ac878de..0000000
--- a/erpnext/public/less/website.less
+++ /dev/null
@@ -1,388 +0,0 @@
-@import "variables.less";
-
-.web-long-description {
-	font-size: 18px;
-	line-height: 200%;
-}
-
-.web-page-content {
-	margin-bottom: 30px;
-}
-
-.item-stock {
-	margin-bottom: 10px !important;
-}
-
-.product-link {
-	display: block;
-	text-align: center;
-}
-
-
-.product-image img {
-	max-height: 500px;
-	margin: 0 auto;
-}
-
-@media (max-width: 767px) {
-	.product-image {
-		height: 0px;
-		padding: 0px 0px 100%;
-		overflow: hidden;
-	}
-}
-
-.product-image-square {
-	width: 100%;
-	height: 0;
-	padding: 50% 0px;
-	background-size: cover;
-	background-repeat: no-repeat;
-	background-position: center top;
-}
-
-.product-image.missing-image {
-	.product-image-square;
-	position: relative;
-	background-color: @light-border-color;
-}
-
-.product-image.missing-image .octicon {
-	font-size: 32px;
-	color: @border-color;
-}
-
-.product-search {
-	margin-bottom: 15px;
-}
-
-
-@media (max-width: 767px) {
-	.product-search {
-		width: 100%;
-	}
-}
-
-.borderless td, .borderless th {
-  border-bottom: 1px solid @light-border-color;
-  padding-left:0px !important;
-  line-height: 1.8em !important;
-}
-
-.item-desc {
-	 border-top: 2px solid @light-border-color;
-	 padding-top:10px;
-}
-
-.featured-products {
-	border-top: 1px solid @light-border-color;
-}
-
-.transaction-list-item {
-	.indicator {
-		font-weight: inherit;
-		color: @text-muted;
-	}
-
-	.transaction-time {
-		margin-top: 5px;
-	}
-
-}
-
-// order.html
-.transaction-subheading {
-	.indicator {
-		font-weight: inherit;
-		color: @text-muted;
-	}
-}
-
-.order-container {
-	margin: 50px 0px;
-
-	.order-item-header .h6 {
-		padding: 7px 15px;
-	}
-
-	.order-items {
-		margin: 30px 0px 0px;
-	}
-
-	.order-item-table {
-		margin: 0px -15px;
-	}
-
-	.order-item-header {
-		border-bottom: 1px solid #d1d8dd;
-	}
-
-	.order-image-col {
-		padding-right: 0px;
-	}
-
-	.order-image {
-		max-width: 55px;
-		max-height: 55px;
-		margin-top: -5px;
-	}
-
-	.order-taxes {
-		margin-top: 30px;
-
-		.row {
-			margin-top: 15px;
-		}
-	}
-
-	.tax-grand-total-row {
-		padding-top: 15px;
-		padding-bottom: 30px;
-	}
-
-	.tax-grand-total {
-		display: inline-block;
-		font-size: 16px;
-		font-weight: bold;
-		margin-top: 5px;
-	}
-}
-
-.cart-container {
-	margin: 50px 0px;
-
-	.checkout {
-		margin-bottom:15px;
-	}
-
-	.cart-item-header .h6 {
-		padding: 7px 15px;
-	}
-
-	.cart-items {
-		margin: 30px 0px 0px;
-	}
-
-	.cart-item-table {
-		margin: 0px -15px;
-	}
-
-	.cart-item-header {
-		border-bottom: 1px solid #d1d8dd;
-	}
-
-	.cart-image-col {
-		padding-right: 0px;
-	}
-
-	.cart-image {
-		max-width: 55px;
-		max-height: 55px;
-		margin-top: -5px;
-	}
-
-	.cart-taxes {
-		margin-top: 30px;
-
-		.row {
-			margin-top: 15px;
-		}
-	}
-
-	.tax-grand-total-row {
-		border-top: 1px solid @border-color;
-		padding-top: 15px;
-	}
-
-	.cart-addresses {
-		margin-top: 50px;
-	}
-}
-
-.cart-items-dropdown .cart-dropdown,
-.item_name_dropdown {
-	display: none;
-
-}
-
-.cart-dropdown-container {
-	width: 400px;
-	padding: 15px;
-
-	.item-price {
-		display: block !important;
-		padding-bottom: 10px;
-	}
-
-	.cart-item-header {
-		border-bottom: 1px solid #d1d8dd;
-	}
-
-	.cart-items-dropdown {
-		max-height: 350px;
-	}
-
-	.cart-items-dropdown .cart-dropdown {
-		display:block;
-		margin-top:15px;
-	}
-
-	.item_name_dropdown {
-		display:block;
-	}
-
-	.item-description,
-	.cart-items .checkout,
-	.item_name_and_description {
-		display: none;
-	}
-
-	.checkout-btn {
-		padding-bottom:25px;
-	}
-	.col-name-description {
-		margin-bottom:8px;
-	}
-}
-
-// .number-spinner {
-// 	width:100px;
-// 	margin-top:5px;
-// }
-
-.cart-btn {
-	border-color: #ccc;
-}
-.cart-qty {
-	text-align:center;
-}
-
-.product-list-link {
-	.row {
-		border-bottom: 1px solid @light-border-color;
-	}
-
-	.row:hover {
-		background-color: @light-bg;
-	}
-
-	.row > div {
-		padding-top: 15px;
-		padding-bottom: 15px;
-	}
-}
-
-.product-list-link:first-child .row {
-	border-top: 1px solid @light-border-color;
-}
-
-.item-group-nav-buttons {
-	margin-top: 15px;
-}
-
-.footer-subscribe {
-	.btn-default {
-		background-color: transparent;
-		border: 1px solid @border-color;
-	}
-}
-
-@media (min-width: 992px) {
-	.footer-subscribe {
-		max-width: 350px;
-	}
-}
-
-.item-group-content {
-	margin-top: 30px;
-}
-
-.item-group-slideshow {
-	margin-bottom: 1rem;
-}
-
-.product-image-img {
-	border: 1px solid @light-border-color;
-	border-radius: 3px;
-}
-
-.product-text {
-	word-wrap: break-word;
-	height: 75px;
-	display: block; /* Fallback for non-webkit */
-	display: -webkit-box;
-	max-width: 100%;
-	margin: 0 auto;
-	-webkit-line-clamp: 3;
-	-webkit-box-orient: vertical;
-	overflow: hidden;
-	text-overflow: ellipsis;
-}
-
-.product-image-wrapper {
-	padding-bottom: 40px;
-}
-
-.duration-bar {
-  display: inline-block;
-  color: white;
-  background: #8FD288;
-  padding: 3px;
-}
-
-.duration-invisible {
-  visibility: hidden;
-}
-
-.duration-value {
-  float: right;
-}
-
-.bar-outer-text {
-  color: #8FD288;
-  background: none;
-  float: none;
-  border: none;
-}
-
-.bom-spec {
-	margin-bottom: 20px;
-}
-
-.modal-title {
-	margin-top: 5px;
-}
-
-.modal-header {
-	padding: 10px 15px;
-}
-// For Item Alternate Image
-.item-alternative-image {
-	padding: 5px;
-	margin-bottom: 5px;
-
-	&:hover {
-		border-color: @brand-primary;
-	}
-}
-
-.item-slideshow-image {
-	height: 3rem;
-	width: 3rem;
-	object-fit: contain;
-	padding: 0.5rem;
-	border: 1px solid @border-color;
-	border-radius: 4px;
-	cursor: pointer;
-
-	&:hover, &.active {
-		border-color: @brand-primary;
-	}
-}
-
-.section-products {
-	.card-img-top {
-		max-height: 300px;
-		object-fit: contain;
-	}
-}
\ No newline at end of file
diff --git a/erpnext/public/less/email.less b/erpnext/public/scss/email.bundle.scss
similarity index 60%
rename from erpnext/public/less/email.less
rename to erpnext/public/scss/email.bundle.scss
index 4077c49..3c0b918 100644
--- a/erpnext/public/less/email.less
+++ b/erpnext/public/scss/email.bundle.scss
@@ -1,14 +1,14 @@
-@import "../../../../frappe/frappe/public/less/variables.less";
+@import "frappe/public/scss/desk/variables";
 
 .panel-header {
-	background-color: @light-bg;
-	border: 1px solid @border-color;
+	background-color: var(--bg-color);
+	border: 1px solid $border-color;
 	border-radius: 3px 3px 0 0;
 }
 
 .panel-body {
 	background-color: #fff;
-	border: 1px solid @border-color;
+	border: 1px solid $border-color;
 	border-top: none;
 	border-radius: 0 0 3px 3px;
 	overflow-wrap: break-word;
@@ -22,11 +22,11 @@
 }
 
 .sender-avatar-placeholder {
-	.sender-avatar;
+	@extend .sender-avatar;
 
 	line-height: 24px;
 	text-align: center;
-	color: @border-color;
-	border: 1px solid @border-color;
+	color: $border-color;
+	border: 1px solid $border-color;
 	background-color: #fff;
-}
\ No newline at end of file
+}
diff --git a/erpnext/public/scss/erpnext-web.bundle.scss b/erpnext/public/scss/erpnext-web.bundle.scss
new file mode 100644
index 0000000..6ef1892
--- /dev/null
+++ b/erpnext/public/scss/erpnext-web.bundle.scss
@@ -0,0 +1,2 @@
+@import "./shopping_cart";
+@import "./website";
diff --git a/erpnext/public/scss/erpnext.bundle.scss b/erpnext/public/scss/erpnext.bundle.scss
new file mode 100644
index 0000000..d3313c7
--- /dev/null
+++ b/erpnext/public/scss/erpnext.bundle.scss
@@ -0,0 +1,3 @@
+@import "./erpnext";
+@import "./call_popup";
+@import "./point-of-sale";
diff --git a/erpnext/public/less/erpnext.less b/erpnext/public/scss/erpnext.scss
similarity index 81%
rename from erpnext/public/less/erpnext.less
rename to erpnext/public/scss/erpnext.scss
index 4076ebe..0e61861 100644
--- a/erpnext/public/less/erpnext.less
+++ b/erpnext/public/scss/erpnext.scss
@@ -1,4 +1,4 @@
-@import "variables.less";
+@import "frappe/public/scss/desk/variables";
 
 .erpnext-footer {
 	margin: 11px auto;
@@ -141,7 +141,7 @@
 	}
 
 	.pos-payment-row {
-		border-bottom:1px solid @border-color;
+		border-bottom:1px solid $border-color;
 		margin: 2px 0px 5px 0px;
 		height: 60px;
 		margin-top: 0px;
@@ -149,12 +149,12 @@
 	}
 
 	.pos-payment-row:hover, .pos-keyboard-key:hover{
-		background-color: @light-bg;
+		background-color: var(--bg-color);
 		cursor: pointer;
 	}
 
 	.pos-keyboard-key, .delete-btn {
-		border: 1px solid @border-color;
+		border: 1px solid $border-color;
 		height:85px;
 		width:85px;
 		margin:10px 10px;
@@ -165,7 +165,7 @@
 	}
 
 	.numeric-keypad {
-		border: 1px solid @border-color;
+		border: 1px solid $border-color;
 		height:69px;
 		width:69px;
 		font-size:20px;
@@ -192,13 +192,13 @@
 		background-color: #fff;
 		margin-left:-4px;
 
-		@media (max-width: @screen-md) {
+		@media (max-width: map-get($grid-breakpoints, "xl")) {
 			height: 45px;
 			width: 45px;
 			font-size: 14px;
 		}
 
-		@media (max-width: @screen-sm) {
+		@media (max-width: map-get($grid-breakpoints, "lg")) {
 			height: 40px;
 			width: 40px;
 		}
@@ -209,21 +209,21 @@
 
 		& > .row > button {
 			border: none;
-			border-right: 1px solid @border-color;
-			border-bottom: 1px solid @border-color;
+			border-right: 1px solid $border-color;
+			border-bottom: 1px solid $border-color;
 
 			&:first-child {
-				border-left: 1px solid @border-color;
+				border-left: 1px solid $border-color;
 			}
 		}
 
 		& > .row:first-child > button {
-			border-top: 1px solid @border-color;
+			border-top: 1px solid $border-color;
 		}
 	}
 
 	.pos-pay {
-		background-color: @brand-primary;
+		background-color: var(--primary);
 		border: none;
 	}
 
@@ -236,13 +236,13 @@
 	}
 
 	.list-row-head.pos-invoice-list {
-		border-top: 1px solid @border-color;
+		border-top: 1px solid $border-color;
 	}
 
 	.modal-dialog {
 		width: 750px;
 
-		@media (max-width: @screen-xs) {
+		@media (max-width: map-get($grid-breakpoints, 'md')) {
 			width: auto;
 
 			.modal-content {
@@ -251,7 +251,7 @@
 		}
 	}
 
-	@media (max-width: @screen-xs) {
+	@media (max-width: map-get($grid-breakpoints, 'md')) {
 		.amount-row h3 {
 			font-size: 15px;
 		}
@@ -271,7 +271,7 @@
 	}
 
 	.selected-payment-mode {
-		background-color: @light-bg;
+		background-color: var(--bg-color);
 		cursor: pointer;
 	}
 
@@ -291,7 +291,7 @@
 		padding: 9px 15px;
 		font-size: 12px;
 		margin: 0px;
-		border-bottom: 1px solid @border-color;
+		border-bottom: 1px solid $border-color;
 
 		.cell {
 			display: table-cell;
@@ -313,17 +313,17 @@
 
 	.pos-bill-header {
 		background-color: #f5f7fa;
-		border: 1px solid @border-color;
+		border: 1px solid $border-color;
 		padding: 13px 15px;
 	}
 
 	.pos-list-row.active {
-		background-color: @light-yellow;
+		background-color: var(--fg-hover-color);
 	}
 
 	.totals-area {
-		border-right: 1px solid @border-color;
-		border-left: 1px solid @border-color;
+		border-right: 1px solid $border-color;
+		border-left: 1px solid $border-color;
 		margin-bottom: 15px;
 	}
 
@@ -332,12 +332,12 @@
 	}
 
 	.item-cart-items {
-		height: ~"calc(100vh - 526px)";
+		height: calc(100vh - 526px);
 		overflow: auto;
-		border: 1px solid @border-color;
+		border: 1px solid $border-color;
 		border-top: none;
 
-		@media (max-width: @screen-xs) {
+		@media (max-width: map-get($grid-breakpoints, 'md')) {
 			height: 30vh;
 		}
 	}
@@ -359,12 +359,12 @@
 	}
 
 	.item-list {
-		border: 1px solid @border-color;
+		border: 1px solid $border-color;
 		border-top: none;
-		max-height: ~"calc(100vh - 190px)";
+		max-height: calc(100vh - 190px);
 		overflow: auto;
 
-		@media (max-width: @screen-xs) {
+		@media (max-width: map-get($grid-breakpoints, 'md')) {
 			max-height: initial;
 		}
 
@@ -402,7 +402,7 @@
 		&> .pos-list-row {
 			border: none;
 
-			@media (max-width: @screen-md) {
+			@media (max-width: map-get($grid-breakpoints, 'xl')) {
 				padding: 5px 15px;
 			}
 		}
@@ -420,7 +420,7 @@
 		justify-content: center;
 		align-items: center;
 		cursor: pointer;
-		background-color: @light-bg;
+		background-color: var(--bg-color);
 		min-height: 200px;
 	}
 
@@ -428,7 +428,7 @@
 		cursor: pointer;
 	}
 
-	@media (max-width: @screen-xs) {
+	@media (max-width: map-get($grid-breakpoints, 'md')) {
 		.page-actions {
 			max-width: 110px;
 		}
@@ -491,4 +491,4 @@
 
 .exercise-col {
 	padding: 10px;
-}
\ No newline at end of file
+}
diff --git a/erpnext/regional/india/utils.py b/erpnext/regional/india/utils.py
index 052d7bd..dc2bb93 100644
--- a/erpnext/regional/india/utils.py
+++ b/erpnext/regional/india/utils.py
@@ -517,7 +517,7 @@
 
 		if not isinstance(docname, list):
 			# removes characters not allowed in a filename (https://stackoverflow.com/a/38766141/4767738)
-			filename_prefix = re.sub('[^\w_.)( -]', '', docname)
+			filename_prefix = re.sub(r'[^\w_.)( -]', '', docname)
 
 	frappe.local.response.filename = '{0}_e-WayBill_Data_{1}.json'.format(filename_prefix, frappe.utils.random_string(5))
 
diff --git a/erpnext/selling/doctype/installation_note/installation_note.js b/erpnext/selling/doctype/installation_note/installation_note.js
index 7fd0877..ffa185b 100644
--- a/erpnext/selling/doctype/installation_note/installation_note.js
+++ b/erpnext/selling/doctype/installation_note/installation_note.js
@@ -30,8 +30,8 @@
 frappe.provide("erpnext.selling");
 
 // TODO commonify this code
-erpnext.selling.InstallationNote = frappe.ui.form.Controller.extend({
-	refresh: function() {
+erpnext.selling.InstallationNote = class InstallationNote extends frappe.ui.form.Controller {
+	refresh() {
 		var me = this;
 		if (this.frm.doc.docstatus===0) {
 			this.frm.add_custom_button(__('From Delivery Note'),
@@ -54,7 +54,7 @@
 				}, "fa fa-download", "btn-default"
 			);
 		}
-	},
-});
+	}
+};
 
 $.extend(cur_frm.cscript, new erpnext.selling.InstallationNote({frm: cur_frm}));
\ No newline at end of file
diff --git a/erpnext/selling/doctype/quotation/quotation.js b/erpnext/selling/doctype/quotation/quotation.js
index 5a0d9c9..7fecd4b 100644
--- a/erpnext/selling/doctype/quotation/quotation.js
+++ b/erpnext/selling/doctype/quotation/quotation.js
@@ -36,13 +36,12 @@
 	}
 });
 
-erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({
-	onload: function(doc, dt, dn) {
+erpnext.selling.QuotationController = class QuotationController extends erpnext.selling.SellingController {
+	onload(doc, dt, dn) {
 		var me = this;
-		this._super(doc, dt, dn);
-
-	},
-	party_name: function() {
+		super.onload(doc, dt, dn);
+	}
+	party_name() {
 		var me = this;
 		erpnext.utils.get_party_details(this.frm, null, null, function() {
 			me.apply_price_list();
@@ -51,9 +50,9 @@
 		if(me.frm.doc.quotation_to=="Lead" && me.frm.doc.party_name) {
 			me.frm.trigger("get_lead_details");
 		}
-	},
-	refresh: function(doc, dt, dn) {
-		this._super(doc, dt, dn);
+	}
+	refresh(doc, dt, dn) {
+		super.refresh(doc, dt, dn);
 		doctype = doc.quotation_to == 'Customer' ? 'Customer':'Lead';
 		frappe.dynamic_link = {doc: this.frm.doc, fieldname: 'party_name', doctype: doctype}
 
@@ -121,9 +120,9 @@
 
 		this.toggle_reqd_lead_customer();
 
-	},
+	}
 
-	set_dynamic_field_label: function(){
+	set_dynamic_field_label(){
 		if (this.frm.doc.quotation_to == "Customer")
 		{
 			this.frm.set_df_property("party_name", "label", "Customer");
@@ -138,22 +137,22 @@
 				return{	query: "erpnext.controllers.queries.lead_query" }
 			}
 		}
-	},
+	}
 
-	toggle_reqd_lead_customer: function() {
+	toggle_reqd_lead_customer() {
 		var me = this;
 
 		// to overwrite the customer_filter trigger from queries.js
 		this.frm.toggle_reqd("party_name", this.frm.doc.quotation_to);
 		this.frm.set_query('customer_address', this.address_query);
 		this.frm.set_query('shipping_address_name', this.address_query);
-	},
+	}
 
-	tc_name: function() {
+	tc_name() {
 		this.get_terms();
-	},
+	}
 
-	address_query: function(doc) {
+	address_query(doc) {
 		return {
 			query: 'frappe.contacts.doctype.address.address.address_query',
 			filters: {
@@ -161,20 +160,20 @@
 				link_name: doc.party_name
 			}
 		};
-	},
+	}
 
-	validate_company_and_party: function(party_field) {
+	validate_company_and_party(party_field) {
 		if(!this.frm.doc.quotation_to) {
 			frappe.msgprint(__("Please select a value for {0} quotation_to {1}", [this.frm.doc.doctype, this.frm.doc.name]));
 			return false;
 		} else if (this.frm.doc.quotation_to == "Lead") {
 			return true;
 		} else {
-			return this._super(party_field);
+			return super.validate_company_and_party(party_field);
 		}
-	},
+	}
 
-	get_lead_details: function() {
+	get_lead_details() {
 		var me = this;
 		if(!this.frm.doc.quotation_to === "Lead") {
 			return;
@@ -198,7 +197,7 @@
 			}
 		})
 	}
-});
+};
 
 cur_frm.script_manager.make(erpnext.selling.QuotationController);
 
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index e3b41e6..d5ceca8 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -102,14 +102,14 @@
 	}
 });
 
-erpnext.selling.SalesOrderController = erpnext.selling.SellingController.extend({
-	onload: function(doc, dt, dn) {
-		this._super();
-	},
+erpnext.selling.SalesOrderController = class SalesOrderController extends erpnext.selling.SellingController {
+	onload(doc, dt, dn) {
+		super.onload();
+	}
 
-	refresh: function(doc, dt, dn) {
+	refresh(doc, dt, dn) {
 		var me = this;
-		this._super();
+		super.refresh();
 		let allow_delivery = false;
 
 		if (doc.docstatus==1) {
@@ -241,14 +241,14 @@
 		}
 
 		this.order_type(doc);
-	},
+	}
 
 	create_pick_list() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.selling.doctype.sales_order.sales_order.create_pick_list",
 			frm: this.frm
 		})
-	},
+	}
 
 	make_work_order() {
 		var me = this;
@@ -343,33 +343,33 @@
 				}
 			}
 		});
-	},
+	}
 
-	order_type: function() {
+	order_type() {
 		this.toggle_delivery_date();
-	},
+	}
 
-	tc_name: function() {
+	tc_name() {
 		this.get_terms();
-	},
+	}
 
-	make_material_request: function() {
+	make_material_request() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.selling.doctype.sales_order.sales_order.make_material_request",
 			frm: this.frm
 		})
-	},
+	}
 
-	skip_delivery_note: function() {
+	skip_delivery_note() {
 		this.toggle_delivery_date();
-	},
+	}
 
-	toggle_delivery_date: function() {
+	toggle_delivery_date() {
 		this.frm.fields_dict.items.grid.toggle_reqd("delivery_date",
 			(this.frm.doc.order_type == "Sales" && !this.frm.doc.skip_delivery_note));
-	},
+	}
 
-	make_raw_material_request: function() {
+	make_raw_material_request() {
 		var me = this;
 		this.frm.call({
 			doc: this.frm.doc,
@@ -390,9 +390,9 @@
 				}
 			}
 		});
-	},
+	}
 
-	make_raw_material_request_dialog: function(r) {
+	make_raw_material_request_dialog(r) {
 		var fields = [
 			{fieldtype:'Check', fieldname:'include_exploded_items',
 				label: __('Include Exploded Items')},
@@ -447,9 +447,9 @@
 			primary_action_label: __('Create')
 		});
 		d.show();
-	},
+	}
 
-	make_delivery_note_based_on_delivery_date: function() {
+	make_delivery_note_based_on_delivery_date() {
 		var me = this;
 
 		var delivery_dates = [];
@@ -509,51 +509,51 @@
 		} else {
 			this.make_delivery_note();
 		}
-	},
+	}
 
-	make_delivery_note: function() {
+	make_delivery_note() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.selling.doctype.sales_order.sales_order.make_delivery_note",
 			frm: this.frm
 		})
-	},
+	}
 
-	make_sales_invoice: function() {
+	make_sales_invoice() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.selling.doctype.sales_order.sales_order.make_sales_invoice",
 			frm: this.frm
 		})
-	},
+	}
 
-	make_maintenance_schedule: function() {
+	make_maintenance_schedule() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_schedule",
 			frm: this.frm
 		})
-	},
+	}
 
-	make_project: function() {
+	make_project() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.selling.doctype.sales_order.sales_order.make_project",
 			frm: this.frm
 		})
-	},
+	}
 
-	make_inter_company_order: function() {
+	make_inter_company_order() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.selling.doctype.sales_order.sales_order.make_inter_company_purchase_order",
 			frm: this.frm
 		});
-	},
+	}
 
-	make_maintenance_visit: function() {
+	make_maintenance_visit() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_visit",
 			frm: this.frm
 		})
-	},
+	}
 
-	make_purchase_order: function(){
+	make_purchase_order(){
 		let pending_items = this.frm.doc.items.some((item) =>{
 			let pending_qty = flt(item.stock_qty) - flt(item.ordered_qty);
 			return pending_qty > 0;
@@ -690,9 +690,9 @@
 		dialog.get_field("items_for_po").refresh();
 		dialog.wrapper.find('.grid-heading-row .grid-row-check').click();
 		dialog.show();
-	},
+	}
 
-	hold_sales_order: function(){
+	hold_sales_order(){
 		var me = this;
 		var d = new frappe.ui.Dialog({
 			title: __('Reason for Hold'),
@@ -724,11 +724,11 @@
 			}
 		});
 		d.show();
-	},
-	close_sales_order: function(){
+	}
+	close_sales_order(){
 		this.frm.cscript.update_status("Close", "Closed")
-	},
-	update_status: function(label, status){
+	}
+	update_status(label, status){
 		var doc = this.frm.doc;
 		var me = this;
 		frappe.ui.form.is_saving = true;
@@ -743,5 +743,5 @@
 			}
 		});
 	}
-});
+};
 $.extend(cur_frm.cscript, new erpnext.selling.SalesOrderController({frm: cur_frm}));
diff --git a/erpnext/selling/page/point_of_sale/point_of_sale.js b/erpnext/selling/page/point_of_sale/point_of_sale.js
index e3405e0..6db4150 100644
--- a/erpnext/selling/page/point_of_sale/point_of_sale.js
+++ b/erpnext/selling/page/point_of_sale/point_of_sale.js
@@ -7,7 +7,7 @@
 		single_column: true
 	});
 
-	frappe.require('assets/js/point-of-sale.min.js', function() {
+	frappe.require('point-of-sale.bundle.js', function() {
 		wrapper.pos = new erpnext.PointOfSale.Controller(wrapper);
 		window.cur_pos = wrapper.pos;
 	});
@@ -19,4 +19,4 @@
 		wrapper.pos.wrapper.html("");
 		wrapper.pos.check_opening_entry();
 	}
-};
\ No newline at end of file
+};
diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js
index 0428573..eb02867 100644
--- a/erpnext/selling/sales_common.js
+++ b/erpnext/selling/sales_common.js
@@ -9,15 +9,15 @@
 cur_frm.email_field = "contact_email";
 
 frappe.provide("erpnext.selling");
-erpnext.selling.SellingController = erpnext.TransactionController.extend({
-	setup: function() {
-		this._super();
+erpnext.selling.SellingController = class SellingController extends erpnext.TransactionController {
+	setup() {
+		super.setup();
 		this.frm.add_fetch("sales_partner", "commission_rate", "commission_rate");
 		this.frm.add_fetch("sales_person", "commission_rate", "commission_rate");
-	},
+	}
 
-	onload: function() {
-		this._super();
+	onload() {
+		super.onload();
 		this.setup_queries();
 		this.frm.set_query('shipping_rule', function() {
 			return {
@@ -26,9 +26,9 @@
 				}
 			};
 		});
-	},
+	}
 
-	setup_queries: function() {
+	setup_queries() {
 		var me = this;
 
 		$.each([["customer", "customer"],
@@ -81,10 +81,10 @@
 			});
 		}
 
-	},
+	}
 
-	refresh: function() {
-		this._super();
+	refresh() {
+		super.refresh();
 
 		frappe.dynamic_link = {doc: this.frm.doc, fieldname: 'customer', doctype: 'Customer'}
 
@@ -95,45 +95,45 @@
 			this.frm.toggle_display("packing_list", packing_list_exists ? true : false);
 		}
 		this.toggle_editable_price_list_rate();
-	},
+	}
 
-	customer: function() {
+	customer() {
 		var me = this;
 		erpnext.utils.get_party_details(this.frm, null, null, function() {
 			me.apply_price_list();
 		});
-	},
+	}
 
-	customer_address: function() {
+	customer_address() {
 		erpnext.utils.get_address_display(this.frm, "customer_address");
 		erpnext.utils.set_taxes_from_address(this.frm, "customer_address", "customer_address", "shipping_address_name");
-	},
+	}
 
-	shipping_address_name: function() {
+	shipping_address_name() {
 		erpnext.utils.get_address_display(this.frm, "shipping_address_name", "shipping_address");
 		erpnext.utils.set_taxes_from_address(this.frm, "shipping_address_name", "customer_address", "shipping_address_name");
-	},
+	}
 
-	sales_partner: function() {
+	sales_partner() {
 		this.apply_pricing_rule();
-	},
+	}
 
-	campaign: function() {
+	campaign() {
 		this.apply_pricing_rule();
-	},
+	}
 
-	selling_price_list: function() {
+	selling_price_list() {
 		this.apply_price_list();
 		this.set_dynamic_labels();
-	},
+	}
 
-	discount_percentage: function(doc, cdt, cdn) {
+	discount_percentage(doc, cdt, cdn) {
 		var item = frappe.get_doc(cdt, cdn);
 		item.discount_amount = 0.0;
 		this.apply_discount_on_item(doc, cdt, cdn, 'discount_percentage');
-	},
+	}
 
-	discount_amount: function(doc, cdt, cdn) {
+	discount_amount(doc, cdt, cdn) {
 
 		if(doc.name === cdn) {
 			return;
@@ -142,9 +142,9 @@
 		var item = frappe.get_doc(cdt, cdn);
 		item.discount_percentage = 0.0;
 		this.apply_discount_on_item(doc, cdt, cdn, 'discount_amount');
-	},
+	}
 
-	apply_discount_on_item: function(doc, cdt, cdn, field) {
+	apply_discount_on_item(doc, cdt, cdn, field) {
 		var item = frappe.get_doc(cdt, cdn);
 		if(!item.price_list_rate) {
 			item[field] = 0.0;
@@ -152,14 +152,14 @@
 			this.price_list_rate(doc, cdt, cdn);
 		}
 		this.set_gross_profit(item);
-	},
+	}
 
-	commission_rate: function() {
+	commission_rate() {
 		this.calculate_commission();
 		refresh_field("total_commission");
-	},
+	}
 
-	total_commission: function() {
+	total_commission() {
 		if(this.frm.doc.base_net_total) {
 			frappe.model.round_floats_in(this.frm.doc, ["base_net_total", "total_commission"]);
 
@@ -175,9 +175,9 @@
 			this.frm.set_value("commission_rate",
 				flt(this.frm.doc.total_commission * 100.0 / this.frm.doc.base_net_total));
 		}
-	},
+	}
 
-	allocated_percentage: function(doc, cdt, cdn) {
+	allocated_percentage(doc, cdt, cdn) {
 		var sales_person = frappe.get_doc(cdt, cdn);
 		if(sales_person.allocated_percentage) {
 
@@ -193,15 +193,15 @@
 			refresh_field(["allocated_percentage", "allocated_amount", "commission_rate","incentives"], sales_person.name,
 				sales_person.parentfield);
 		}
-	},
+	}
 
-	sales_person: function(doc, cdt, cdn) {
+	sales_person(doc, cdt, cdn) {
 		var row = frappe.get_doc(cdt, cdn);
 		this.calculate_incentive(row);
 		refresh_field("incentives",row.name,row.parentfield);
-	},
+	}
 
-	warehouse: function(doc, cdt, cdn) {
+	warehouse(doc, cdt, cdn) {
 		var me = this;
 		var item = frappe.get_doc(cdt, cdn);
 
@@ -239,18 +239,18 @@
 				});
 			}
 		})
-	},
+	}
 
-	toggle_editable_price_list_rate: function() {
+	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"));
 
 		if(df && editable_price_list_rate) {
 			df.read_only = 0;
 		}
-	},
+	}
 
-	calculate_commission: function() {
+	calculate_commission() {
 		if(this.frm.fields_dict.commission_rate) {
 			if(this.frm.doc.commission_rate > 100) {
 				var msg = __(frappe.meta.get_label(this.frm.doc.doctype, "commission_rate", this.frm.doc.name)) +
@@ -262,9 +262,9 @@
 			this.frm.doc.total_commission = flt(this.frm.doc.base_net_total * this.frm.doc.commission_rate / 100.0,
 				precision("total_commission"));
 		}
-	},
+	}
 
-	calculate_contribution: function() {
+	calculate_contribution() {
 		var me = this;
 		$.each(this.frm.doc.doctype.sales_team || [], function(i, sales_person) {
 			frappe.model.round_floats_in(sales_person);
@@ -274,18 +274,18 @@
 					precision("allocated_amount", sales_person));
 			}
 		});
-	},
+	}
 
-	calculate_incentive: function(row) {
+	calculate_incentive(row) {
 		if(row.allocated_amount)
 		{
 			row.incentives = flt(
 					row.allocated_amount * row.commission_rate / 100.0,
 					precision("incentives", row));
 		}
-	},
+	}
 
-	batch_no: function(doc, cdt, cdn) {
+	batch_no(doc, cdt, cdn) {
 		var me = this;
 		var item = frappe.get_doc(cdt, cdn);
 
@@ -312,14 +312,14 @@
 				});
 			}
 		})
-	},
+	}
 
-	set_dynamic_labels: function() {
-		this._super();
+	set_dynamic_labels() {
+		super.set_dynamic_labels();
 		this.set_product_bundle_help(this.frm.doc);
-	},
+	}
 
-	set_product_bundle_help: function(doc) {
+	set_product_bundle_help(doc) {
 		if(!cur_frm.fields_dict.packing_list) return;
 		if ((doc.packed_items || []).length) {
 			$(cur_frm.fields_dict.packing_list.row.wrapper).toggle(true);
@@ -337,9 +337,9 @@
 			}
 		}
 		refresh_field('product_bundle_help');
-	},
+	}
 
-	company_address: function() {
+	company_address() {
 		var me = this;
 		if(this.frm.doc.company_address) {
 			frappe.call({
@@ -354,42 +354,42 @@
 		} else {
 			this.frm.set_value("company_address_display", "");
 		}
-	},
+	}
 
-	conversion_factor: function(doc, cdt, cdn, dont_fetch_price_list_rate) {
-	    this._super(doc, cdt, cdn, dont_fetch_price_list_rate);
+	conversion_factor(doc, cdt, cdn, dont_fetch_price_list_rate) {
+	    super.conversion_factor(doc, cdt, cdn, dont_fetch_price_list_rate);
 		if(frappe.meta.get_docfield(cdt, "stock_qty", cdn) &&
 			in_list(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
 				if (doc.doctype === 'Sales Invoice' && (!doc.update_stock)) return;
 				this.set_batch_number(cdt, cdn);
 			}
-	},
+	}
 
-	batch_no: function(doc, cdt, cdn) {
-		this._super(doc, cdt, cdn);
-	},
+	batch_no(doc, cdt, cdn) {
+		super.batch_no(doc, cdt, cdn);
+	}
 
-	qty: function(doc, cdt, cdn) {
-		this._super(doc, cdt, cdn);
+	qty(doc, cdt, cdn) {
+		super.qty(doc, cdt, cdn);
 
 		if(in_list(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
 			if (doc.doctype === 'Sales Invoice' && (!doc.update_stock)) return;
 			this.set_batch_number(cdt, cdn);
 		}
-	},
+	}
 
 	/* Determine appropriate batch number and set it in the form.
 	* @param {string} cdt - Document Doctype
 	* @param {string} cdn - Document name
 	*/
-	set_batch_number: function(cdt, cdn) {
+	set_batch_number(cdt, cdn) {
 		const doc = frappe.get_doc(cdt, cdn);
 		if (doc && doc.has_batch_no && doc.warehouse) {
 			this._set_batch_number(doc);
 		}
-	},
+	}
 
-	_set_batch_number: function(doc) {
+	_set_batch_number(doc) {
 		let args = {'item_code': doc.item_code, 'warehouse': doc.warehouse, 'qty': flt(doc.qty) * flt(doc.conversion_factor)};
 		if (doc.has_serial_no && doc.serial_no) {
 			args['serial_no'] = doc.serial_no
@@ -406,9 +406,9 @@
 				}
 			}
 		});
-	},
+	}
 
-	update_auto_repeat_reference: function(doc) {
+	update_auto_repeat_reference(doc) {
 		if (doc.auto_repeat) {
 			frappe.call({
 				method:"frappe.automation.doctype.auto_repeat.auto_repeat.update_reference",
@@ -426,7 +426,7 @@
 			})
 		}
 	}
-});
+};
 
 frappe.ui.form.on(cur_frm.doctype,"project", function(frm) {
 	if(in_list(["Delivery Note", "Sales Invoice"], frm.doc.doctype)) {
diff --git a/erpnext/setup/doctype/email_digest/email_digest.py b/erpnext/setup/doctype/email_digest/email_digest.py
index 8c97322..340d89b 100644
--- a/erpnext/setup/doctype/email_digest/email_digest.py
+++ b/erpnext/setup/doctype/email_digest/email_digest.py
@@ -249,7 +249,7 @@
 				card = cache.get(cache_key)
 
 				if card:
-					card = eval(card)
+					card = frappe.safe_eval(card)
 
 				else:
 					card = frappe._dict(getattr(self, "get_" + key)())
@@ -808,7 +808,6 @@
 			val = balance_on_to_date - balance_before_from_date
 		else:
 			last_year_closing_balance = get_balance_on(account, date=fy_start_date - timedelta(days=1))
-			print(fy_start_date - timedelta(days=1), last_year_closing_balance)
 			val = balance_on_to_date + (last_year_closing_balance - balance_before_from_date)
 
 		return val
@@ -837,4 +836,4 @@
 	elif frequency == "Monthly":
 		to_date = add_to_date(from_date, months=1)
 
-	return from_date, to_date
\ No newline at end of file
+	return from_date, to_date
diff --git a/erpnext/shopping_cart/test_shopping_cart.py b/erpnext/shopping_cart/test_shopping_cart.py
index d857bf5..ac61aeb 100644
--- a/erpnext/shopping_cart/test_shopping_cart.py
+++ b/erpnext/shopping_cart/test_shopping_cart.py
@@ -7,7 +7,7 @@
 from frappe.utils import nowdate, add_months
 from erpnext.shopping_cart.cart import _get_cart_quotation, update_cart, get_party
 from erpnext.tests.utils import create_test_contact_and_address
-
+from erpnext.accounts.doctype.tax_rule.tax_rule import  ConflictingTaxRule
 
 # test_dependencies = ['Payment Terms Template']
 
@@ -125,7 +125,7 @@
 		tax_rule = frappe.get_test_records("Tax Rule")[0]
 		try:
 			frappe.get_doc(tax_rule).insert()
-		except frappe.DuplicateEntryError:
+		except (frappe.DuplicateEntryError, ConflictingTaxRule):
 			pass
 
 	def create_quotation(self):
diff --git a/erpnext/stock/dashboard/item_dashboard.js b/erpnext/stock/dashboard/item_dashboard.js
index 933ca8a..dbf9901 100644
--- a/erpnext/stock/dashboard/item_dashboard.js
+++ b/erpnext/stock/dashboard/item_dashboard.js
@@ -1,11 +1,11 @@
 frappe.provide('erpnext.stock');
 
-erpnext.stock.ItemDashboard = Class.extend({
-	init: function (opts) {
+erpnext.stock.ItemDashboard = class ItemDashboard {
+	constructor(opts) {
 		$.extend(this, opts);
 		this.make();
-	},
-	make: function () {
+	}
+	make() {
 		var me = this;
 		this.start = 0;
 		if (!this.sort_by) {
@@ -79,9 +79,9 @@
 			me.refresh();
 		});
 
-	},
-	refresh: function () {
-		if (this.before_refresh) {
+	}
+	refresh() {
+		if(this.before_refresh) {
 			this.before_refresh();
 		}
 
@@ -104,9 +104,9 @@
 				me.render(r.message);
 			}
 		});
-	},
-	render: function (data) {
-		if (this.start === 0) {
+	}
+	render(data) {
+		if (this.start===0) {
 			this.max_count = 0;
 			this.result.empty();
 		}
@@ -141,11 +141,11 @@
 			$(`<div class='text-muted' style='margin: 20px 5px;'>
 				${message} </div>`).appendTo(this.result);
 		}
-	},
+	}
 
-	get_item_dashboard_data: function (data, max_count, show_item) {
-		if (!max_count) max_count = 0;
-		if (!data) data = [];
+	get_item_dashboard_data(data, max_count, show_item) {
+		if(!max_count) max_count = 0;
+		if(!data) data = [];
 
 		data.forEach(function (d) {
 			d.actual_or_pending = d.projected_qty + d.reserved_qty + d.reserved_qty_for_production + d.reserved_qty_for_sub_contract;
@@ -170,9 +170,9 @@
 			can_write: can_write,
 			show_item: show_item || false
 		};
-	},
+	}
 
-	get_capacity_dashboard_data: function (data) {
+	get_capacity_dashboard_data(data) {
 		if (!data) data = [];
 
 		data.forEach(function (d) {
@@ -189,7 +189,7 @@
 			can_write: can_write,
 		};
 	}
-});
+};
 
 erpnext.stock.move_item = function (item, source, target, actual_qty, rate, callback) {
 	var dialog = new frappe.ui.Dialog({
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js
index 7875b9c..b736015 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.js
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.js
@@ -123,17 +123,17 @@
 	}
 });
 
-erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend({
-	setup: function(doc) {
+erpnext.stock.DeliveryNoteController = class DeliveryNoteController extends erpnext.selling.SellingController {
+	setup(doc) {
 		this.setup_posting_date_time_check();
-		this._super(doc);
+		super.setup(doc);
 		this.frm.make_methods = {
 			'Delivery Trip': this.make_delivery_trip,
 		};
-	},
-	refresh: function(doc, dt, dn) {
+	}
+	refresh(doc, dt, dn) {
 		var me = this;
-		this._super();
+		super.refresh();
 		if ((!doc.is_return) && (doc.status!="Closed" || this.frm.is_new())) {
 			if (this.frm.doc.docstatus===0) {
 				this.frm.add_custom_button(__('Sales Order'),
@@ -231,64 +231,64 @@
 				erpnext.utils.make_subscription(doc.doctype, doc.name)
 			}, __('Create'))
 		}
-	},
+	}
 
-	make_shipment: function() {
+	make_shipment() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.stock.doctype.delivery_note.delivery_note.make_shipment",
 			frm: this.frm
 		})
-	},
+	}
 
-	make_sales_invoice: function() {
+	make_sales_invoice() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.stock.doctype.delivery_note.delivery_note.make_sales_invoice",
 			frm: this.frm
 		})
-	},
+	}
 
-	make_installation_note: function() {
+	make_installation_note() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.stock.doctype.delivery_note.delivery_note.make_installation_note",
 			frm: this.frm
 		});
-	},
+	}
 
-	make_sales_return: function() {
+	make_sales_return() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.stock.doctype.delivery_note.delivery_note.make_sales_return",
 			frm: this.frm
 		})
-	},
+	}
 
-	make_delivery_trip: function() {
+	make_delivery_trip() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.stock.doctype.delivery_note.delivery_note.make_delivery_trip",
 			frm: cur_frm
 		})
-	},
+	}
 
-	tc_name: function() {
+	tc_name() {
 		this.get_terms();
-	},
+	}
 
-	items_on_form_rendered: function(doc, grid_row) {
+	items_on_form_rendered(doc, grid_row) {
 		erpnext.setup_serial_or_batch_no();
-	},
+	}
 
-	packed_items_on_form_rendered: function(doc, grid_row) {
+	packed_items_on_form_rendered(doc, grid_row) {
 		erpnext.setup_serial_or_batch_no();
-	},
+	}
 
-	close_delivery_note: function(doc){
+	close_delivery_note(doc){
 		this.update_status("Closed")
-	},
+	}
 
-	reopen_delivery_note : function() {
+	reopen_delivery_note() {
 		this.update_status("Submitted")
-	},
+	}
 
-	update_status: function(status) {
+	update_status(status) {
 		var me = this;
 		frappe.ui.form.is_saving = true;
 		frappe.call({
@@ -302,8 +302,8 @@
 				frappe.ui.form.is_saving = false;
 			}
 		})
-	},
-});
+	}
+};
 
 $.extend(cur_frm.cscript, new erpnext.stock.DeliveryNoteController({frm: cur_frm}));
 
diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js
index 8aec893..45e3c21 100644
--- a/erpnext/stock/doctype/item/item.js
+++ b/erpnext/stock/doctype/item/item.js
@@ -380,7 +380,7 @@
 
 		// Show Stock Levels only if is_stock_item
 		if (frm.doc.is_stock_item) {
-			frappe.require('assets/js/item-dashboard.min.js', function() {
+			frappe.require('item-dashboard.bundle.js', function() {
 				const section = frm.dashboard.add_section('', __("Stock Levels"));
 				erpnext.item.item_dashboard = new erpnext.stock.ItemDashboard({
 					parent: section,
diff --git a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.js b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.js
index 1abbc35..433f78a 100644
--- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.js
+++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.js
@@ -5,8 +5,8 @@
 
 frappe.provide("erpnext.stock");
 
-erpnext.stock.LandedCostVoucher = erpnext.stock.StockController.extend({
-	setup: function() {
+erpnext.stock.LandedCostVoucher = class LandedCostVoucher extends erpnext.stock.StockController {
+	setup() {
 		var me = this;
 		this.frm.fields_dict.purchase_receipts.grid.get_field('receipt_document').get_query =
 			function (doc, cdt, cdn) {
@@ -30,9 +30,9 @@
 		this.frm.add_fetch("receipt_document", "supplier", "supplier");
 		this.frm.add_fetch("receipt_document", "posting_date", "posting_date");
 		this.frm.add_fetch("receipt_document", "base_grand_total", "grand_total");
-	},
+	}
 
-	refresh: function() {
+	refresh() {
 		var help_content =
 			`<br><br>
 			<table class="table table-bordered" style="background-color: #f9f9f9;">
@@ -67,9 +67,9 @@
 			let company_currency = frappe.get_doc(":Company", this.frm.doc.company).default_currency;
 			this.frm.set_currency_labels(["total_taxes_and_charges"], company_currency);
 		}
-	},
+	}
 
-	get_items_from_purchase_receipts: function() {
+	get_items_from_purchase_receipts() {
 		var me = this;
 		if(!this.frm.doc.purchase_receipts.length) {
 			frappe.msgprint(__("Please enter Purchase Receipt first"));
@@ -82,22 +82,22 @@
 				}
 			});
 		}
-	},
+	}
 
-	amount: function(frm) {
+	amount(frm) {
 		this.set_total_taxes_and_charges();
 		this.set_applicable_charges_for_item();
-	},
+	}
 
-	set_total_taxes_and_charges: function() {
+	set_total_taxes_and_charges() {
 		var total_taxes_and_charges = 0.0;
 		$.each(this.frm.doc.taxes || [], function(i, d) {
 			total_taxes_and_charges += flt(d.base_amount);
 		});
 		this.frm.set_value("total_taxes_and_charges", total_taxes_and_charges);
-	},
+	}
 
-	set_applicable_charges_for_item: function() {
+	set_applicable_charges_for_item() {
 		var me = this;
 
 		if(this.frm.doc.taxes.length) {
@@ -123,15 +123,15 @@
 				refresh_field("items");
 			}
 		}
-	},
-	distribute_charges_based_on: function (frm) {
+	}
+	distribute_charges_based_on (frm) {
 		this.set_applicable_charges_for_item();
-	},
+	}
 
-	items_remove: () => {
+	items_remove() {
 		this.trigger('set_applicable_charges_for_item');
 	}
-});
+};
 
 cur_frm.script_manager.make(erpnext.stock.LandedCostVoucher);
 
diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js
index 92c8d21..f516e06 100644
--- a/erpnext/stock/doctype/material_request/material_request.js
+++ b/erpnext/stock/doctype/material_request/material_request.js
@@ -407,28 +407,28 @@
 	}
 });
 
-erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.extend({
-	tc_name: function() {
+erpnext.buying.MaterialRequestController = class MaterialRequestController extends erpnext.buying.BuyingController {
+	tc_name() {
 		this.get_terms();
-	},
+	}
 
-	item_code: function() {
+	item_code() {
 		// to override item code trigger from transaction.js
-	},
+	}
 
-	validate_company_and_party: function() {
+	validate_company_and_party() {
 		return true;
-	},
+	}
 
-	calculate_taxes_and_totals: function() {
+	calculate_taxes_and_totals() {
 		return;
-	},
+	}
 
-	validate: function() {
+	validate() {
 		set_schedule_date(this.frm);
-	},
+	}
 
-	onload: function(doc, cdt, cdn) {
+	onload(doc, cdt, cdn) {
 		this.frm.set_query("item_code", "items", function() {
 			if (doc.material_request_type == "Customer Provided") {
 				return{
@@ -450,9 +450,9 @@
 				}
 			}
 		});
-	},
+	}
 
-	items_add: function(doc, cdt, cdn) {
+	items_add(doc, cdt, cdn) {
 		var row = frappe.get_doc(cdt, cdn);
 		if(doc.schedule_date) {
 			row.schedule_date = doc.schedule_date;
@@ -460,16 +460,16 @@
 		} else {
 			this.frm.script_manager.copy_from_first_row("items", row, ["schedule_date"]);
 		}
-	},
+	}
 
-	items_on_form_rendered: function() {
-		set_schedule_date(this.frm);
-	},
-
-	schedule_date: function() {
+	items_on_form_rendered() {
 		set_schedule_date(this.frm);
 	}
-});
+
+	schedule_date() {
+		set_schedule_date(this.frm);
+	}
+};
 
 // for backward compatibility: combine new and previous states
 $.extend(cur_frm.cscript, new erpnext.buying.MaterialRequestController({frm: cur_frm}));
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
index befdad9..688ae1d 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
@@ -114,15 +114,15 @@
 	}
 });
 
-erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend({
-	setup: function(doc) {
+erpnext.stock.PurchaseReceiptController = class PurchaseReceiptController extends erpnext.buying.BuyingController {
+	setup(doc) {
 		this.setup_posting_date_time_check();
-		this._super(doc);
-	},
+		super.setup(doc);
+	}
 
-	refresh: function() {
+	refresh() {
 		var me = this;
-		this._super();
+		super.refresh();
 		if(this.frm.doc.docstatus > 0) {
 			this.show_stock_ledger();
 			//removed for temporary
@@ -201,31 +201,31 @@
 		}
 
 		this.frm.toggle_reqd("supplier_warehouse", this.frm.doc.is_subcontracted==="Yes");
-	},
+	}
 
-	make_purchase_invoice: function() {
+	make_purchase_invoice() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.stock.doctype.purchase_receipt.purchase_receipt.make_purchase_invoice",
 			frm: cur_frm
 		})
-	},
+	}
 
-	make_purchase_return: function() {
+	make_purchase_return() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.stock.doctype.purchase_receipt.purchase_receipt.make_purchase_return",
 			frm: cur_frm
 		})
-	},
+	}
 
-	close_purchase_receipt: function() {
+	close_purchase_receipt() {
 		cur_frm.cscript.update_status("Closed");
-	},
+	}
 
-	reopen_purchase_receipt: function() {
+	reopen_purchase_receipt() {
 		cur_frm.cscript.update_status("Submitted");
-	},
+	}
 
-	make_retention_stock_entry: function() {
+	make_retention_stock_entry() {
 		frappe.call({
 			method: "erpnext.stock.doctype.stock_entry.stock_entry.move_sample_to_retention_warehouse",
 			args:{
@@ -242,13 +242,13 @@
 				}
 			}
 		});
-	},
+	}
 
-	apply_putaway_rule: function() {
+	apply_putaway_rule() {
 		if (this.frm.doc.apply_putaway_rule) erpnext.apply_putaway_rule(this.frm);
 	}
 
-});
+};
 
 // for backward compatibility: combine new and previous states
 $.extend(cur_frm.cscript, new erpnext.stock.PurchaseReceiptController({frm: cur_frm}));
diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
index e5ef978..5095a80 100644
--- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
@@ -297,6 +297,8 @@
 			item_code = "Test Extra Item 1", qty=10, basic_rate=100)
 		se2 = make_stock_entry(target="_Test Warehouse - _TC",
 			item_code = "_Test FG Item", qty=1, basic_rate=100)
+		se3 = make_stock_entry(target="_Test Warehouse - _TC",
+			item_code = "Test Extra Item 2", qty=1, basic_rate=100)
 		rm_items = [
 			{
 				"item_code": item_code,
@@ -331,6 +333,7 @@
 		se.cancel()
 		se1.cancel()
 		se2.cancel()
+		se3.cancel()
 		po.reload()
 		po.cancel()
 
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index 772c8df..6afcd1f 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -783,8 +783,8 @@
 	}
 });
 
-erpnext.stock.StockEntry = erpnext.stock.StockController.extend({
-	setup: function() {
+erpnext.stock.StockEntry = class StockEntry extends erpnext.stock.StockController {
+	setup() {
 		var me = this;
 
 		this.setup_posting_date_time_check();
@@ -831,9 +831,9 @@
 
 		frappe.dynamic_link = { doc: this.frm.doc, fieldname: 'supplier', doctype: 'Supplier' }
 		this.frm.set_query("supplier_address", erpnext.queries.address_query)
-	},
+	}
 
-	onload_post_render: function() {
+	onload_post_render() {
 		var me = this;
 		this.set_default_account(function() {
 			if(me.frm.doc.__islocal && me.frm.doc.company && !me.frm.doc.amended_from) {
@@ -842,9 +842,9 @@
 		});
 
 		this.frm.get_field("items").grid.set_multiple_add("item_code", "qty");
-	},
+	}
 
-	refresh: function() {
+	refresh() {
 		var me = this;
 		erpnext.toggle_naming_series();
 		this.toggle_related_fields(this.frm.doc);
@@ -855,22 +855,22 @@
 		}
 		erpnext.hide_company();
 		erpnext.utils.add_item(this.frm);
-	},
+	}
 
-	scan_barcode: function() {
+	scan_barcode() {
 		let transaction_controller= new erpnext.TransactionController({frm:this.frm});
 		transaction_controller.scan_barcode();
-	},
+	}
 
-	on_submit: function() {
+	on_submit() {
 		this.clean_up();
-	},
+	}
 
-	after_cancel: function() {
+	after_cancel() {
 		this.clean_up();
-	},
+	}
 
-	set_default_account: function(callback) {
+	set_default_account(callback) {
 		var me = this;
 
 		if(this.frm.doc.company && erpnext.is_perpetual_inventory_enabled(this.frm.doc.company)) {
@@ -890,9 +890,9 @@
 				}
 			});
 		}
-	},
+	}
 
-	clean_up: function() {
+	clean_up() {
 		// Clear Work Order record from locals, because it is updated via Stock Entry
 		if(this.frm.doc.work_order &&
 			in_list(["Manufacture", "Material Transfer for Manufacture", "Material Consumption for Manufacture"],
@@ -900,13 +900,13 @@
 			frappe.model.remove_from_locals("Work Order",
 				this.frm.doc.work_order);
 		}
-	},
+	}
 
-	fg_completed_qty: function() {
+	fg_completed_qty() {
 		this.get_items();
-	},
+	}
 
-	get_items: function() {
+	get_items() {
 		var me = this;
 		if(!this.frm.doc.fg_completed_qty || !this.frm.doc.bom_no)
 			frappe.throw(__("BOM and Manufacturing Quantity are required"));
@@ -922,9 +922,9 @@
 				}
 			});
 		}
-	},
+	}
 
-	work_order: function() {
+	work_order() {
 		var me = this;
 		this.toggle_enable_bom();
 		if(!me.frm.doc.work_order || me.frm.doc.job_card) {
@@ -957,13 +957,13 @@
 				}
 			}
 		});
-	},
+	}
 
-	toggle_enable_bom: function() {
+	toggle_enable_bom() {
 		this.frm.toggle_enable("bom_no", !!!this.frm.doc.work_order);
-	},
+	}
 
-	add_excise_button: function() {
+	add_excise_button() {
 		if(frappe.boot.sysdefaults.country === "India")
 			this.frm.add_custom_button(__("Excise Invoice"), function() {
 				var excise = frappe.model.make_new_doc_and_get_name('Journal Entry');
@@ -971,35 +971,35 @@
 				excise.voucher_type = 'Excise Entry';
 				frappe.set_route('Form', 'Journal Entry', excise.name);
 			}, __('Create'));
-	},
+	}
 
-	items_add: function(doc, cdt, cdn) {
+	items_add(doc, cdt, cdn) {
 		var row = frappe.get_doc(cdt, cdn);
 		this.frm.script_manager.copy_from_first_row("items", row, ["expense_account", "cost_center"]);
 
 		if(!row.s_warehouse) row.s_warehouse = this.frm.doc.from_warehouse;
 		if(!row.t_warehouse) row.t_warehouse = this.frm.doc.to_warehouse;
-	},
+	}
 
-	from_warehouse: function(doc) {
+	from_warehouse(doc) {
 		this.frm.trigger('set_tansit_warehouse');
 		this.set_warehouse_in_children(doc.items, "s_warehouse", doc.from_warehouse);
-	},
+	}
 
-	to_warehouse: function(doc) {
+	to_warehouse(doc) {
 		this.set_warehouse_in_children(doc.items, "t_warehouse", doc.to_warehouse);
-	},
+	}
 
-	set_warehouse_in_children: function(child_table, warehouse_field, warehouse) {
+	set_warehouse_in_children(child_table, warehouse_field, warehouse) {
 		let transaction_controller = new erpnext.TransactionController();
 		transaction_controller.autofill_warehouse(child_table, warehouse_field, warehouse);
-	},
+	}
 
-	items_on_form_rendered: function(doc, grid_row) {
+	items_on_form_rendered(doc, grid_row) {
 		erpnext.setup_serial_or_batch_no();
-	},
+	}
 
-	toggle_related_fields: function(doc) {
+	toggle_related_fields(doc) {
 		this.frm.toggle_enable("from_warehouse", doc.purpose!='Material Receipt');
 		this.frm.toggle_enable("to_warehouse", doc.purpose!='Material Issue');
 
@@ -1026,12 +1026,12 @@
 			doc.purpose!='Material Issue');
 
 		this.frm.fields_dict["items"].grid.set_column_disp("additional_cost", doc.purpose!='Material Issue');
-	},
+	}
 
-	supplier: function(doc) {
+	supplier(doc) {
 		erpnext.utils.get_party_details(this.frm, null, null, null);
 	}
-});
+};
 
 erpnext.stock.select_batch_and_serial_no = (frm, item) => {
 	let get_warehouse_type_and_name = (item) => {
diff --git a/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py
index 3296f5b..ba31ad7 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/test_stock_ledger_entry.py
@@ -15,10 +15,12 @@
 from erpnext.stock.doctype.landed_cost_voucher.test_landed_cost_voucher import create_landed_cost_voucher
 from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
 from erpnext.stock.doctype.stock_ledger_entry.stock_ledger_entry import BackDatedStockTransaction
+from frappe.core.page.permission_manager.permission_manager import reset
 
 class TestStockLedgerEntry(unittest.TestCase):
 	def setUp(self):
 		items = create_items()
+		reset('Stock Entry')
 
 		# delete SLE and BINs for all items
 		frappe.db.sql("delete from `tabStock Ledger Entry` where item_code in (%s)" % (', '.join(['%s']*len(items))), items)
@@ -314,10 +316,11 @@
 		# Set User with Stock User role but not Stock Manager
 		try:
 			user = frappe.get_doc("User", "test@example.com")
-			frappe.set_user(user.name)
 			user.add_roles("Stock User")
 			user.remove_roles("Stock Manager")
 
+			frappe.set_user(user.name)
+
 			stock_entry_on_today = make_stock_entry(target="_Test Warehouse - _TC", qty=10, basic_rate=100)
 			back_dated_se_1 = make_stock_entry(target="_Test Warehouse - _TC", qty=10, basic_rate=100,
 				posting_date=add_days(today(), -1), do_not_submit=True)
diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js
index ac4ed5e..3badc7e 100644
--- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js
+++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.js
@@ -220,8 +220,8 @@
 
 });
 
-erpnext.stock.StockReconciliation = erpnext.stock.StockController.extend({
-	setup: function() {
+erpnext.stock.StockReconciliation = class StockReconciliation extends erpnext.stock.StockController {
+	setup() {
 		var me = this;
 
 		this.setup_posting_date_time_check();
@@ -249,17 +249,17 @@
 				}
 			}
 		}
-	},
+	}
 
-	refresh: function() {
+	refresh() {
 		if(this.frm.doc.docstatus > 0) {
 			this.show_stock_ledger();
 			if (erpnext.is_perpetual_inventory_enabled(this.frm.doc.company)) {
 				this.show_general_ledger();
 			}
 		}
-	},
+	}
 
-});
+};
 
 cur_frm.cscript = new erpnext.stock.StockReconciliation({frm: cur_frm});
diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
index 7e216d6..0278c96 100644
--- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -469,7 +469,7 @@
 	def submit(self):
 		if len(self.items) > 100:
 			msgprint(_("The task has been enqueued as a background job. In case there is any issue on processing in background, the system will add a comment about the error on this Stock Reconciliation and revert to the Draft stage"))
-			self.queue_action('submit', timeout=2000)
+			self.queue_action('submit', timeout=4600)
 		else:
 			self._submit()
 
diff --git a/erpnext/stock/page/stock_balance/stock_balance.js b/erpnext/stock/page/stock_balance/stock_balance.js
index bddffd4..f00dd3e 100644
--- a/erpnext/stock/page/stock_balance/stock_balance.js
+++ b/erpnext/stock/page/stock_balance/stock_balance.js
@@ -62,7 +62,7 @@
 
 	// page.sort_selector.wrapper.css({'margin-right': '15px', 'margin-top': '4px'});
 
-	frappe.require('assets/js/item-dashboard.min.js', function() {
+	frappe.require('item-dashboard.bundle.js', function() {
 		page.item_dashboard = new erpnext.stock.ItemDashboard({
 			parent: page.main,
 			page_length: 20,
diff --git a/erpnext/stock/page/warehouse_capacity_summary/warehouse_capacity_summary.js b/erpnext/stock/page/warehouse_capacity_summary/warehouse_capacity_summary.js
index b610e7d..c0ffdc9 100644
--- a/erpnext/stock/page/warehouse_capacity_summary/warehouse_capacity_summary.js
+++ b/erpnext/stock/page/warehouse_capacity_summary/warehouse_capacity_summary.js
@@ -79,7 +79,7 @@
 		}
 	});
 
-	frappe.require('assets/js/item-dashboard.min.js', function() {
+	frappe.require('item-dashboard.bundle.js', function() {
 		$(frappe.render_template('warehouse_capacity_summary_header')).appendTo(page.main);
 
 		page.capacity_dashboard = new erpnext.stock.ItemDashboard({
@@ -117,4 +117,4 @@
 		setup_click('Item');
 		setup_click('Warehouse');
 	});
-};
\ No newline at end of file
+};
diff --git a/erpnext/stock/stock_balance.py b/erpnext/stock/stock_balance.py
index 8ba1f1c..8917bfe 100644
--- a/erpnext/stock/stock_balance.py
+++ b/erpnext/stock/stock_balance.py
@@ -194,9 +194,6 @@
 		serial_nos = frappe.db.sql("""select count(name) from `tabSerial No`
 			where item_code=%s and warehouse=%s and docstatus < 2""", (d[0], d[1]))
 
-		if serial_nos and flt(serial_nos[0][0]) != flt(d[2]):
-			print(d[0], d[1], d[2], serial_nos[0][0])
-
 		sle = frappe.db.sql("""select valuation_rate, company from `tabStock Ledger Entry`
 			where item_code = %s and warehouse = %s and is_cancelled = 0
 			order by posting_date desc limit 1""", (d[0], d[1]))
@@ -230,7 +227,7 @@
 		})
 
 		update_bin(args)
-		
+
 		create_repost_item_valuation_entry({
 			"item_code": d[0],
 			"warehouse": d[1],
diff --git a/erpnext/support/doctype/warranty_claim/warranty_claim.js b/erpnext/support/doctype/warranty_claim/warranty_claim.js
index 79f4675..c9aa41f 100644
--- a/erpnext/support/doctype/warranty_claim/warranty_claim.js
+++ b/erpnext/support/doctype/warranty_claim/warranty_claim.js
@@ -36,8 +36,8 @@
 	}
 });
 
-erpnext.support.WarrantyClaim = frappe.ui.form.Controller.extend({
-	refresh: function() {
+erpnext.support.WarrantyClaim = class WarrantyClaim extends frappe.ui.form.Controller {
+	refresh() {
 		frappe.dynamic_link = {doc: this.frm.doc, fieldname: 'customer', doctype: 'Customer'}
 
 		if(!cur_frm.doc.__islocal &&
@@ -45,15 +45,15 @@
 			cur_frm.add_custom_button(__('Maintenance Visit'),
 				this.make_maintenance_visit);
 		}
-	},
+	}
 
-	make_maintenance_visit: function() {
+	make_maintenance_visit() {
 		frappe.model.open_mapped_doc({
 			method: "erpnext.support.doctype.warranty_claim.warranty_claim.make_maintenance_visit",
 			frm: cur_frm
 		})
 	}
-});
+};
 
 $.extend(cur_frm.cscript, new erpnext.support.WarrantyClaim({frm: cur_frm}));
 
diff --git a/erpnext/templates/generators/item/item.html b/erpnext/templates/generators/item/item.html
index 135982d..17f6880 100644
--- a/erpnext/templates/generators/item/item.html
+++ b/erpnext/templates/generators/item/item.html
@@ -28,9 +28,7 @@
 
 {% block base_scripts %}
 <!-- js should be loaded in body! -->
-<script type="text/javascript" src="/assets/frappe/js/lib/jquery/jquery.min.js"></script>
-<script type="text/javascript" src="/assets/js/frappe-web.min.js"></script>
-<script type="text/javascript" src="/assets/js/control.min.js"></script>
-<script type="text/javascript" src="/assets/js/dialog.min.js"></script>
-<script type="text/javascript" src="/assets/js/bootstrap-4-web.min.js"></script>
-{% endblock %}
\ No newline at end of file
+{{ include_script("frappe-web.bundle.js") }}
+{{ include_script("controls.bundle.js") }}
+{{ include_script("dialog.bundle.js") }}
+{% endblock %}
diff --git a/erpnext/templates/includes/rfq.js b/erpnext/templates/includes/rfq.js
index b56c416..37beb5a 100644
--- a/erpnext/templates/includes/rfq.js
+++ b/erpnext/templates/includes/rfq.js
@@ -11,23 +11,23 @@
 	doc.buying_price_list = "{{ doc.buying_price_list }}"
 });
 
-rfq = Class.extend({
-	init: function(){
+rfq = class rfq {
+	constructor(){
 		this.onfocus_select_all();
 		this.change_qty();
 		this.change_rate();
 		this.terms();
 		this.submit_rfq();
 		this.navigate_quotations();
-	},
+	}
 
-	onfocus_select_all: function(){
+	onfocus_select_all(){
 		$("input").click(function(){
 			$(this).select();
 		})
-	},
+	}
 
-	change_qty: function(){
+	change_qty(){
 		var me = this;
 		$('.rfq-items').on("change", ".rfq-qty", function(){
 			me.idx = parseFloat($(this).attr('data-idx'));
@@ -36,9 +36,9 @@
 			me.update_qty_rate();
 			$(this).val(format_number(me.qty, doc.number_format, 2));
 		})
-	},
+	}
 
-	change_rate: function(){
+	change_rate(){
 		var me = this;
 		$(".rfq-items").on("change", ".rfq-rate", function(){
 			me.idx = parseFloat($(this).attr('data-idx'));
@@ -47,15 +47,15 @@
 			me.update_qty_rate();
 			$(this).val(format_number(me.rate, doc.number_format, 2));
 		})
-	},
+	}
 
-	terms: function(){
+	terms(){
 		$(".terms").on("change", ".terms-feedback", function(){
 			doc.terms = $(this).val();
 		})
-	},
+	}
 
-	update_qty_rate: function(){
+	update_qty_rate(){
 		var me = this;
 		doc.grand_total = 0.0;
 		$.each(doc.items, function(idx, data){
@@ -69,9 +69,9 @@
 			doc.grand_total += flt(data.amount);
 			$('.tax-grand-total').text(format_number(doc.grand_total, doc.number_format, 2));
 		})
-	},
+	}
 
-	submit_rfq: function(){
+	submit_rfq(){
 		$('.btn-sm').click(function(){
 			frappe.freeze();
 			frappe.call({
@@ -90,12 +90,12 @@
 				}
 			})
 		})
-	},
+	}
 
-	navigate_quotations: function() {
+	navigate_quotations() {
 		$('.quotations').click(function(){
 			name = $(this).attr('idx')
 			window.location.href = "/quotations/" + encodeURIComponent(name);
 		})
 	}
-})
+}
diff --git a/erpnext/templates/pages/cart.html b/erpnext/templates/pages/cart.html
index ea34371..c64c634 100644
--- a/erpnext/templates/pages/cart.html
+++ b/erpnext/templates/pages/cart.html
@@ -139,9 +139,7 @@
 
 {% block base_scripts %}
 <!-- js should be loaded in body! -->
-<script type="text/javascript" src="/assets/frappe/js/lib/jquery/jquery.min.js"></script>
-<script type="text/javascript" src="/assets/js/frappe-web.min.js"></script>
-<script type="text/javascript" src="/assets/js/control.min.js"></script>
-<script type="text/javascript" src="/assets/js/dialog.min.js"></script>
-<script type="text/javascript" src="/assets/js/bootstrap-4-web.min.js"></script>
+{{ include_script("frappe-web.bundle.js") }}
+{{ include_script("controls.bundle.js") }}
+{{ include_script("dialog.bundle.js") }}
 {% endblock %}
diff --git a/erpnext/tests/__init__.py b/erpnext/tests/__init__.py
index e69de29..a504340 100644
--- a/erpnext/tests/__init__.py
+++ b/erpnext/tests/__init__.py
@@ -0,0 +1 @@
+global_test_dependencies = ['User', 'Company', 'Item']
diff --git a/erpnext/utilities/__init__.py b/erpnext/utilities/__init__.py
index 618cc98..0a5aa3c 100644
--- a/erpnext/utilities/__init__.py
+++ b/erpnext/utilities/__init__.py
@@ -12,7 +12,6 @@
 
 		for f in dt.fields:
 			if f.fieldname == d.fieldname and f.fieldtype in ("Text", "Small Text"):
-				print(f.parent, f.fieldname)
 				f.fieldtype = "Text Editor"
 				dt.save()
 				break
diff --git a/yarn.lock b/yarn.lock
index 0a2ac1a..242695c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1540,16 +1540,11 @@
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 
-ini@1.3.7:
+ini@1.3.7, ini@~1.3.0:
   version "1.3.7"
   resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84"
   integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==
 
-ini@~1.3.0:
-  version "1.3.5"
-  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
-  integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
-
 is-callable@^1.1.5:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e"
@@ -2000,9 +1995,9 @@
   integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=
 
 lodash@^4.17.15:
-  version "4.17.19"
-  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
-  integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
+  version "4.17.21"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
 
 log-symbols@^4.0.0:
   version "4.1.0"