From 0bf005c84a0ce2d95c3355c603239dce7cc0b725 Mon Sep 17 00:00:00 2001 From: "Brandon Seltenrich (BRSE)" Date: Wed, 21 Dec 2022 20:18:36 +0000 Subject: [PATCH] [IMP] inventory: update automated inventory valuation closes odoo/documentation#3605 X-original-commit: aaa1de94bd53ed0ed4eb54156c238b0315808d69 Signed-off-by: Brandon Seltenrich (brse) --- .../reporting/inventory_valuation_config.rst | 550 ++++-------------- .../inventory-valuation-fields.png | Bin 0 -> 16705 bytes ...tock-valuation-breakdown-in-accounting.png | Bin 0 -> 30014 bytes static/js/coa-valuation-anglo-saxon.js | 276 --------- static/js/coa-valuation-continental.js | 265 --------- 5 files changed, 129 insertions(+), 962 deletions(-) create mode 100644 content/applications/inventory_and_mrp/inventory/management/reporting/inventory_valuation_config/inventory-valuation-fields.png create mode 100644 content/applications/inventory_and_mrp/inventory/management/reporting/inventory_valuation_config/stock-valuation-breakdown-in-accounting.png delete mode 100644 static/js/coa-valuation-anglo-saxon.js delete mode 100644 static/js/coa-valuation-continental.js diff --git a/content/applications/inventory_and_mrp/inventory/management/reporting/inventory_valuation_config.rst b/content/applications/inventory_and_mrp/inventory/management/reporting/inventory_valuation_config.rst index 15dff5805..4a03119ac 100644 --- a/content/applications/inventory_and_mrp/inventory/management/reporting/inventory_valuation_config.rst +++ b/content/applications/inventory_and_mrp/inventory/management/reporting/inventory_valuation_config.rst @@ -1,424 +1,132 @@ -:code-column: -:custom-css: accounting.css -:custom-js: coa-valuation-continental.js,coa-valuation-anglo-saxon.js,misc.js - ================================= -Inventory valuation configuration +Inventory Valuation Configuration ================================= -Inventory valuation refers to how you value your stock. It’s a very -important aspect of a business as the inventory can be the biggest asset -of a company. - -Inventory valuation implies two main choices: - -- The cost method you use to value your goods (standard, fifo, avco) -- The way you record this value into your accounting books (manually or automatically) - -Those two concepts are explained in the sections below. - -Costing Methods: Standard, FIFO, AVCO -===================================== - -The costing method is defined in the product category. There are three -options available. Each of them is explained in detail below. - -.. rst-class:: alternatives doc-aside - -Standard Price - .. rst-class:: values-table - - .. list-table:: - :widths: 28 18 18 18 18 - :header-rows: 1 - :stub-columns: 1 - - * - Operation - - Unit Cost - - Qty On Hand - - Delta Value - - Inventory Value - * - - - €10 - - 0 - - - - €0 - * - Receive 8 Products at €10 - - €10 - - 8 - - +8*€10 - - €80 - * - Receive 4 Products at €16 - - €10 - - 12 - - +4*€10 - - €120 - * - Deliver 10 Products - - €10 - - 2 - - | -10*€10 - | - - €20 - * - Receive 2 Products at €9 - - €10 - - 4 - - +2*€10 - - €40 - - In **Standard Price**, any product will be valued at the cost that you defined - manually on the product form. Usually, this cost is an estimation based - on the material and labor needed to obtain the product. This cost must - be reviewed periodically. - -Average Price - .. rst-class:: values-table - - .. list-table:: - :widths: 28 18 18 18 18 - :header-rows: 1 - :stub-columns: 1 - - * - Operation - - Unit Cost - - Qty On Hand - - Delta Value - - Inventory Value - * - - - €0 - - 0 - - - - €0 - * - Receive 8 Products at €10 - - €10 - - 8 - - +8*€10 - - €80 - * - Receive 4 Products at €16 - - €12 - - 12 - - +4*€16 - - €144 - * - Deliver 10 Products - - €12 - - 2 - - | -10*€12 - | - - €24 - * - Receive 2 Products at €6 - - €9 - - 4 - - +2*€6 - - €36 - - In **AVCO (Average Cost)**, each product has the same value and this - value is the average purchase cost of the product. With this costing method, the - cost of the product is recomputed as each receipt. - - The average cost does not change when products leave the warehouse. - -FIFO - .. rst-class:: values-table - - .. list-table:: - :widths: 28 18 18 18 18 - :header-rows: 1 - :stub-columns: 1 - - * - Operation - - Unit Cost - - Qty On Hand - - Delta Value - - Inventory Value - * - - - €0 - - 0 - - - - €0 - * - Receive 8 Products at €10 - - €10 - - 8 - - +8*€10 - - €80 - * - Receive 4 Products at €16 - - €12 - - 12 - - +4*€16 - - €144 - * - Deliver 10 Products - - €16 - - 2 - - | -8*€10 - | -2*€16 - - €32 - * - Receive 2 Products at €6 - - €11 - - 4 - - +2*€6 - - €44 - - In **FIFO (First In First Out)**, the products are valued at their - purchase cost. When a product leaves the stock, that’s the “First in, - first out” rule that applies. - - Pay attention, that this is a financial FIFO. The first value “in” - is the first value “out”, no matter the storage location, warehouse - or serial number. - - FIFO is advised if you manage all your workflows into Odoo (Sales, - Purchases, Inventory). It suits any kind of users. - -Inventory Valuation: Manual or Automated -======================================== - -There are two ways to record your inventory valuation in your accounting -books. As the costing method, this is defined in your product category. -Those two methods are detailed below. - -It is important to also note that the accounting entries will depend on -your accounting mode: it can be continental or anglo-saxon. In -continental accounting, the cost of a good is taken into account as soon -as the product is received in stock. In anglo-saxon accounting, the cost -of a good is only recorded as an expense when this good is invoiced to a -final customer. In the tables below, you can easily compare those two -accounting modes. - -Usually, based on your country, the correct accounting mode will be -chosen by default. If you want to verify your accounting mode, activate -the :ref:`developer mode ` and open your accounting -settings. - -Manual Inventory Valuation --------------------------- - -In this case, goods receipts and deliveries won’t have any direct impact -on your accounting books. Periodically, you create a manual journal -entry representing the value of what you have in stock. To know that -value, go in :menuselection:`Inventory --> Reporting --> Inventory Valuation`. - -This is the default configuration in Odoo and it works -out-of-the-box. Check following operations and find out how -Odoo is managing the accounting postings. - -Continental Accounting -~~~~~~~~~~~~~~~~~~~~~~ - -.. rst-class:: alternatives doc-aside - -Vendor Bill - .. rst-class:: values-table - - ============================= ===== ====== - \ Debit Credit - ============================= ===== ====== - Assets: Inventory 50 - Assets: Deferred Tax Assets 4.68 - Liabilities: Accounts Payable 54.68 - ============================= ===== ====== - - Configuration: - * Purchased Goods: defined on the product or on the internal category of related product (Expense Account field) - * Deferred Tax Assets: defined on the tax used on the purchase order line - * Accounts Payable: defined on the vendor related to the bill -Goods Receptions - No Journal Entry -Customer Invoice - .. rst-class:: values-table - - ===================================== ===== ====== - \ Debit Credit - ===================================== ===== ====== - Revenues: Sold Goods 100 - Liabilities: Deferred Tax Liabilities 9 - Assets: Accounts Receivable 109 - ===================================== ===== ====== - - Configuration: - * Revenues: defined on the product or on the internal category of related product (Income Account field) - * Deferred Tax Liabilities: defined on the tax used on the invoice line - * Accounts Receivable: defined on the customer (Receivable Account) - - The fiscal position used on the invoice may have a rule that replaces the - Income Account or the tax defined on the product by another one. -Customer Shipping - No Journal Entry -Manufacturing Orders - No Journal Entry - -.. raw:: html - -
- -At the end of the month/year, your company does a physical inventory -or just relies on the inventory in Odoo to value the stock into your books. - -Create a journal entry to move the stock variation value from your -Profit&Loss section to your assets. - -.. h:div:: doc-aside - - .. rst-class:: values-table - - ===================================== ===== ====== - \ Debit Credit - ===================================== ===== ====== - Assets: Inventory X - Expenses: Inventory Variations X - ===================================== ===== ====== - - If the stock value decreased, the **Inventory** account is credited - and the **Inventory Variations** debited. - -.. raw:: html - -
- -Anglo-Saxon Accounting -~~~~~~~~~~~~~~~~~~~~~~ - -.. rst-class:: alternatives doc-aside - -Vendor Bill - .. rst-class:: values-table - - ============================= ===== ====== - \ Debit Credit - ============================= ===== ====== - Assets: Inventory 50 - Assets: Deferred Tax Assets 4.68 - Liabilities: Accounts Payable 54.68 - ============================= ===== ====== - - Configuration: - * Purchased Goods: defined on the product or on the internal category of related product - (Expense Account field) - * Deferred Tax Assets: defined on the tax used on the purchase order line - * Accounts Payable: defined on the vendor related to the bill -Goods Receptions - No Journal Entry -Customer Invoice - .. rst-class:: values-table - - ===================================== ===== ====== - \ Debit Credit - ===================================== ===== ====== - Revenues: Sold Goods 100 - Liabilities: Deferred Tax Liabilities 9 - Assets: Accounts Receivable 109 - ===================================== ===== ====== - - Configuration: - * Revenues: defined on the product or on the internal category of related - product (Income Account field) - * Deferred Tax Liabilities: defined on the tax used on the invoice line - * Accounts Receivable: defined on the customer (Receivable Account) - - The fiscal position used on the invoice may have a rule that replaces the - Income Account or the tax defined on the product by another one. -Customer Shipping - No Journal Entry -Manufacturing Orders - No Journal Entry - -.. raw:: html - -
- -At the end of the month/year, your company does a physical inventory -or just relies on the inventory in Odoo to value the stock into your books. - -Then you need to break down the purchase balance into both the inventory and -the cost of goods sold using the following formula: - -Cost of goods sold (COGS) = Starting inventory value + Purchases – Closing inventory value - -To update the stock valuation in your books, record such an entry: - -.. h:div:: doc-aside - - .. rst-class:: values-table - - ===================================== ===== ====== - \ Debit Credit - ===================================== ===== ====== - Assets: Inventory (closing value) X - Expenses: Cost of Good Sold X - Expenses: Purchased Goods X - Assets: Inventory (starting value) X - ===================================== ===== ====== - -Automated Inventory Valuation ------------------------------ - -In that case, when a product enters or leaves your stock, an accounting -entry will be automatically created. This means your accounting books -are always up-to-date. This mode is dedicated to expert accountants and -advanced users only. As opposed to periodic valuation, it requires some -extra configuration & testing. - -First, you need to define the accounts that will be used for those -accounting entries. This is done on the product category. - -Continental Accounting -~~~~~~~~~~~~~~~~~~~~~~ - -.. h:div:: valuation-chart-continental doc-aside - - .. placeholder - -.. raw:: html - -
- -.. h:div:: doc-aside - - **Configuration:** - - - Accounts Receivable/Payable: defined on the partner (Accounting tab) - - - Deferred Tax Assets/Liabilities: defined on the tax used on the invoice line - - - Revenues/Expenses: defined by default on product's internal category; can be - also set in product form (Accounting tab) as a replacement value. - - - Inventory Variations: to set as Stock Input/Output Account in product's internal - category - - - Inventory: to set as Stock Valuation Account in product's internal category - -Anglo-Saxon Accounting -~~~~~~~~~~~~~~~~~~~~~~ - -.. h:div:: valuation-chart-anglo-saxon doc-aside - - .. placeholder - -.. raw:: html - -
- -.. h:div:: doc-aside - - **Configuration:** - - - Accounts Receivable/Payable: defined on the partner (Accounting tab) - - - Deferred Tax Assets/Liabilities: defined on the tax used on the - invoice line - - - Revenues: defined on the product category as a default, or specifically - to a specific product. - - - Expenses: this is where you should set the "Cost of Goods Sold" account. - Defined on the product category as a default value, or specifically on - the product form. - - - Goods Received Not Purchased: to set as Stock Input Account in product's - internal category - - - Goods Issued Not Invoiced: to set as Stock Output Account in product's - internal category - - - Inventory: to set as Stock Valuation Account in product's internal category - - - Price Difference: to set in product's internal category or in product - form as a specific replacement value +All of a company's stock on-hand contributes to the valuation of its inventory. That value should +be reflected in the company's accounting records to accurately show the value of the company and +all of its assets. + +By default, Odoo uses a periodic inventory valuation (also known as manual inventory valuation). +This method implies that the accounting team posts journal entries based on the physical inventory +of the company, and that warehouse employees take the time to count the stock. In Odoo, this method +is reflected inside each product category, where the :guilabel:`Costing Method` field will be set +to `Standard Price` by default, and the :guilabel:`Inventory Valuation` field will be set to +`Manual`. + +.. image:: inventory_valuation_config/inventory-valuation-fields.png + :align: center + :alt: The Inventory Valuation fields are located on the Product Categories form. + +Alternatively, automated inventory valuation is an integrated valuation method that updates the +inventory value in real-time by creating journal entries whenever there are stock moves initiated +between locations in a company's inventory. + +.. note:: + Automated inventory valuation is a method recommended for expert accountants, given the extra + steps involved in journal entry configuration. Even after the initial setup, the method will + need to be periodically checked to ensure accuracy, and adjustments may be needed on an ongoing + basis depending on the needs and priorities of the business. + +Types of Accounting +------------------- + +Accounting entries will depend on the accounting mode: Continental or Anglo-Saxon. + +.. tip:: + Verify the accounting mode by activating the :ref:`developer-mode` + and navigating to :menuselection:`Accounting --> Configuration --> Settings`. + +In Anglo-Saxon accounting, the costs of goods sold (COGS) are reported when products are sold or +delivered. This means that the cost of a good is only recorded as an expense when a customer is +invoiced for a product. Interim Stock Accounts are used for the input and output accounts, and are +both Asset Accounts in the Balance Sheet. + +In Continental accounting, the cost of a good is reported as soon as a product is received into +stock. Additionally, a *single* Expense account is used for both input and output accounts in +the Balance Sheet. + +Costing Methods +--------------- + +Below are the three costing methods that can be used in Odoo for inventory valuation. + +- **Standard Price**: is the default costing method in Odoo. The cost of the product is manually + defined on the product form, and this cost is used to compute the valuation. Even if the purchase + price on a Purchase Order differs, the valuation will still use the cost defined on the product + form. +- **Average Cost (AVCO)**: calculates the valuation of a product based on the average cost of that + product, divided by the total number of available stock on-hand. With this costing method, + inventory valuation is *dynamic*, and constantly adjusts based on the purchase price of products. +- **First In First Out (FIFO)**: tracks the costs of incoming and outgoing items in real-time and + uses the real price of the products to change the valuation. The oldest purchase price is used as + the cost for the next good sold until an entire lot of that product is sold. When the next + inventory lot moves up in the queue, an updated product cost is used based on the valuation of + that specific lot. This method is arguably the most accurate inventory valuation method for a + variety of reasons, however, it's highly sensitive to input data and human error. + +.. warning:: + Changing the costing method greatly impacts inventory valuation. It's highly recommended to + consult an accountant first before making any adjustments here. + +Configure automated inventory valuation in Odoo +----------------------------------------------- + +Make changes to inventory valuation options by navigating to :menuselection:`Inventory --> +Configuration --> Product Categories`, and choose the category/categories where the automated +valuation method should apply. + +.. note:: + It is possible to use different valuation settings for different product categories. + +Under the :guilabel:`Inventory Valuation` heading are two labels: :guilabel:`Costing Method` and +:guilabel:`Inventory Valuation`. Pick the desired :guilabel:`Costing Method` using the drop-down +menu (e.g. :guilabel:`Standard`, :guilabel:`Average Cost (AVCO)`, or :guilabel:`First In First Out +(FIFO)` and switch the :guilabel:`Inventory Valuation` to :guilabel:`Automated`. + +.. seealso:: + :doc:`Using the inventory valuation ` + +.. note:: + When choosing :guilabel:`Average Cost (AVCO)` as the :guilabel:`Costing Method`, the numerical + value in the :guilabel:`Cost` field for products in the respective product category will no + longer be editable, and will appear grayed out. The :guilabel:`Cost` amount will instead + automatically update based on the average purchase price both of inventory on hand and the costs + accumulated from validated purchase orders. + +On the same screen, the :guilabel:`Account Stock Properties` fields will appear, as they are now +required fields given the change to automated inventory valuation. These accounts are defined as +follows: + +- :guilabel:`Stock Valuation Account`: when automated inventory valuation is enabled on a product, + this account will hold the current value of the products. +- :guilabel:`Stock Input Account`: counterpart journal items for all incoming stock moves will be + posted in this account, unless there is a specific valuation account set on the source location. + This is the default value for all products in a given category, and can also be set directly on + each product. +- :guilabel:`Stock Output Account`: counterpart journal items for all outgoing stock moves will be + posted in this account, unless there is a specific valuation account set on the destination + location. This is the default value for all products in a given category, and can also be set + directly on each product. + +Access reporting data generated by inventory valuation +------------------------------------------------------ + +To start, go to :menuselection:`Accounting --> Reporting --> Balance Sheet`. At the top of the +dashboard, change the :guilabel:`As of` field value to :guilabel:`Today`, and adjust the filtering +:guilabel:`Options` to :guilabel:`Unfold All` in order to see all of the latest data displayed, +all at once. + +Under the parent :guilabel:`Current Assets` line item, look for the nested :guilabel:`Stock +Valuation Account` line item, where the total valuation of all of the inventory on hand is +displayed. + +Access more specific information with the :guilabel:`Stock Valuation Account` drop-down menu, by +selecting either the :guilabel:`General Ledger` to see an itemized view of all of the journal +entries, or by selecting :guilabel:`Journal Items` to review all of the individualized journal +entries that were submitted to the account. As well, annotations to the :guilabel:`Balance Sheet` +can be added by choosing :guilabel:`Annotate`, filling in the text box, and clicking +:guilabel:`Save`. + +.. image:: inventory_valuation_config/stock-valuation-breakdown-in-accounting.png + :align: center + :alt: See the full inventory valuation breakdown in Odoo Accounting app. diff --git a/content/applications/inventory_and_mrp/inventory/management/reporting/inventory_valuation_config/inventory-valuation-fields.png b/content/applications/inventory_and_mrp/inventory/management/reporting/inventory_valuation_config/inventory-valuation-fields.png new file mode 100644 index 0000000000000000000000000000000000000000..c6550b6ae4b6ef2bb92cb4ff4ec39acc5e959cc3 GIT binary patch literal 16705 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 literal 0 HcmV?d00001 diff --git a/static/js/coa-valuation-anglo-saxon.js b/static/js/coa-valuation-anglo-saxon.js deleted file mode 100644 index f67e3711f..000000000 --- a/static/js/coa-valuation-anglo-saxon.js +++ /dev/null @@ -1,276 +0,0 @@ -/* global Immutable, React */ -/* global createAtom */ -(function () { - 'use strict'; - - var data = createAtom(); - - function toKey(s, postfix) { - if (postfix) { - s += ' ' + postfix; - } - return s.replace(/[^0-9a-z ]/gi, '').toLowerCase().split(/\s+/).join('-'); - - } - var Controls = React.createClass({ - render: function () { - var state = this.props.p; - return React.DOM.div(null, operations.map(function (op) { - var label = op.get('label'), operations = op.get('operations'); - return React.DOM.label( - { - key: toKey(label), - style: { display: 'block' }, - className: (operations === state.get('active') ? 'highlight-op' : void 0) - }, - React.DOM.input({ - type: 'checkbox', - checked: state.get('operations').contains(operations), - onChange: function (e) { - if (e.target.checked) { - data.swap(function (d) { - return d.set('active', operations) - .update('operations', function (ops) { - return ops.add(operations); - }); - }); - } else { - data.swap(function (d) { - return d.set('active', null) // keep visible in state map - .update('operations', function (ops) { - return ops.remove(operations); - }); - }); - } - } - }), - " ", - label - ); - })); - } - }); - - var Chart = React.createClass({ - render: function () { - var lastop = Immutable.Map( - (this.props.p.get('active') || Immutable.List()).map(function (op) { - return [op.get('account'), op.has('credit') ? 'credit' : 'debit']; - }) - ); - return React.DOM.div( - null, - React.DOM.table( - { className: 'table table-sm' }, - React.DOM.thead( - null, - React.DOM.tr( - null, - React.DOM.th(), - React.DOM.th({ className: 'text-right' }, "Debit"), - React.DOM.th({ className: 'text-right' }, "Credit"), - React.DOM.th({ className: 'text-right' }, "Balance")) - ), - React.DOM.tbody( - null, - this.accounts().map(function (data) { - var highlight = lastop.get(data.get('code')); - return React.DOM.tr( - { key: data.get('code') }, - React.DOM.th(null, - data.get('level') ? '\u2001 ' : '', - data.get('code'), ' ', data.get('label')), - React.DOM.td({ - className: React.addons.classSet({ - 'text-right': true, - 'highlight-op': highlight === 'debit' - }) - }, format(data.get('debit'))), - React.DOM.td({ - className: React.addons.classSet({ - 'text-right': true, - 'highlight-op': highlight === 'credit' - }) - }, format(data.get('credit'))), - React.DOM.td( - { className: 'text-right' }, - ((data.get('debit') || data.get('credit')) - ? format(data.get('debit') - data.get('credit'), 0) - : '') - ) - ); - }) - ) - ) - ); - }, - accounts: function () { - var data = this.props.p.get('operations'); - - var totals = data.toIndexedSeq().flatten(true).reduce(function (acc, op) { - return acc - .updateIn([op.get('account'), 'debit'], function (d) { - return (d || 0) + op.get('debit', zero)(data); - }) - .updateIn([op.get('account'), 'credit'], function (c) { - return (c || 0) + op.get('credit', zero)(data); - }); - }, Immutable.Map()); - - return accounts.map(function (account) { - // for each account, add sum - return account.merge( - account.get('accounts').map(function (code) { - return totals.get(code, NULL); - }).reduce(function (acc, it) { - return acc.mergeWith(function (a, b) { return a + b; }, it, NULL); - }) - ); - }); - } - }); - data.addWatch('chart', function (k, m, prev, next) { - React.render( - React.createElement(Controls, { p: next }), - document.getElementById('chart-controls-anglo-saxon')); - React.render( - React.createElement(Chart, { p: next }), - document.querySelector('.valuation-chart-anglo-saxon')); - }); - - document.addEventListener('DOMContentLoaded', function () { - var chart = document.querySelector('.valuation-chart-anglo-saxon'); - if (!chart) { return; } - - var controls = document.createElement('div'); - controls.setAttribute('id', 'chart-controls-anglo-saxon'); - chart.parentNode.insertBefore(controls, chart); - - data.reset(Immutable.Map({ - // last-selected operation - active: null, - // set of all currently enabled operations - operations: Immutable.OrderedSet() - })); - }); - - var NULL = Immutable.Map({ debit: 0, credit: 0 }); - var ASSETS = { - code: 1, - label: "Assets", - BANK: { code: 11000, label: "Cash" }, - ACCOUNTS_RECEIVABLE: { code: 13100, label: "Accounts Receivable" }, - STOCK: { code: 14000, label: "Inventory" }, - RAW_MATERIALS: { code: 14100, label: "Raw Materials Inventory" }, - STOCK_OUT: { code: 14600, label: "Goods Issued Not Invoiced" }, - TAXES_PAID: { code: 19000, label: "Deferred Tax Assets" } - }; - var LIABILITIES = { - code: 2, - label: "Liabilities", - ACCOUNTS_PAYABLE: { code: 21000, label: "Accounts Payable" }, - STOCK_IN: { code: 23000, label: "Goods Received Not Purchased" }, - TAXES_PAYABLE: { code: 26200, label: "Deferred Tax Liabilities" } - }; - var EQUITY = { - code: 3, - label: "Equity", - CAPITAL: { code: 31000, label: "Common Stock" } - }; - var REVENUE = { - code: 4, - label: "Revenue", - SALES: { code: 41000, label: "Goods" }, - }; - var EXPENSES = { - code: 5, - label: "Expenses", - GOODS_SOLD: { code: 51100, label: "Cost of Goods Sold" }, - MANUFACTURING_OVERHEAD: { code: 52000, label: "Manufacturing Overhead" }, - PRICE_DIFFERENCE: { code: 53000, label: "Price Difference" } - }; - var categories = Immutable.fromJS([ASSETS, LIABILITIES, EQUITY, REVENUE, EXPENSES], function (k, v) { - return Immutable.Iterable.isIndexed(v) - ? v.toList() - : v.toOrderedMap(); - }); - var accounts = categories.toSeq().flatMap(function (cat) { - return Immutable.Seq.of(cat.set('level', 0)).concat(cat.filter(function (v, k) { - return k.toUpperCase() === k; - }).toIndexedSeq().map(function (acc) { return acc.set('level', 1) })); - }).map(function (account) { // add accounts: Seq to each account - return account.set( - 'accounts', - Immutable.Seq.of(account.get('code')).concat( - account.toIndexedSeq().map(function (val) { - return Immutable.Map.isMap(val) && val.get('code'); - }).filter(function (val) { return !!val; }) - ) - ); - }); - - var sale = 100, - cor = 50, - cor_tax = cor * 0.09, - tax = sale * 0.09, - total = sale + tax, - purchase = 52, - purchase_tax = 52 * 0.09; - var operations = Immutable.fromJS([{ - label: "Vendor Bill (PO $50, Invoice $50)", - operations: [ - { account: LIABILITIES.STOCK_IN.code, debit: constant(50) }, - { account: ASSETS.TAXES_PAID.code, debit: constant(50 * 0.09) }, - { account: LIABILITIES.ACCOUNTS_PAYABLE.code, credit: constant(50 * 1.09) }, - ] - }, { - label: "Supplier Goods Reception (PO $50, Invoice $50)", - operations: [ - { account: LIABILITIES.STOCK_IN.code, credit: constant(50) }, - { account: ASSETS.STOCK.code, debit: constant(50) }, - ] - }, { - label: "Vendor Bill (PO $48, Invoice $50)", - operations: [ - { account: EXPENSES.PRICE_DIFFERENCE.code, debit: constant(2) }, - { account: LIABILITIES.STOCK_IN.code, debit: constant(48) }, - { account: ASSETS.TAXES_PAID.code, debit: constant(50 * 0.09) }, - { account: LIABILITIES.ACCOUNTS_PAYABLE.code, credit: constant(50 * 1.09) }, - ] - }, { - label: "Supplier Goods Reception (PO $48, Invoice $50)", - operations: [ - { account: LIABILITIES.STOCK_IN.code, credit: constant(48) }, - { account: ASSETS.STOCK.code, debit: constant(48) }, - ] - }, { - label: "Customer Invoice", - operations: [ - { account: ASSETS.ACCOUNTS_RECEIVABLE.code, debit: constant(total) }, - { account: EXPENSES.GOODS_SOLD.code, debit: constant(cor) }, - { account: REVENUE.SALES.code, credit: constant(sale) }, - { account: ASSETS.STOCK_OUT.code, credit: constant(cor) }, - { account: LIABILITIES.TAXES_PAYABLE.code, credit: constant(tax) } - ] - }, { - label: "Customer Shipping", - operations: [ - { account: ASSETS.STOCK_OUT.code, debit: constant(cor) }, - { account: ASSETS.STOCK.code, credit: constant(cor) } - ] - }, { - label: "Production Order", - operations: [ - { account: ASSETS.STOCK.code, debit: constant(50) }, - { account: EXPENSES.MANUFACTURING_OVERHEAD.code, debit: constant(2) }, - { account: ASSETS.RAW_MATERIALS.code, credit: constant(52) } - ] - }]); - function constant(val) { return function () { return val; }; } - var zero = constant(0); - function format(val, def) { - if (!val) { return def === undefined ? '' : def; } - if (val % 1 === 0) { return val; } - return val.toFixed(2); - } -})(); diff --git a/static/js/coa-valuation-continental.js b/static/js/coa-valuation-continental.js deleted file mode 100644 index d9d9c0e25..000000000 --- a/static/js/coa-valuation-continental.js +++ /dev/null @@ -1,265 +0,0 @@ -/* global Immutable, React */ -/* global createAtom */ -(function () { - 'use strict'; - - var data = createAtom(); - - function toKey(s, postfix) { - if (postfix) { - s += ' ' + postfix; - } - return s.replace(/[^0-9a-z ]/gi, '').toLowerCase().split(/\s+/).join('-'); - - } - var Controls = React.createClass({ - render: function () { - var state = this.props.p; - return React.DOM.div(null, operations.map(function (op) { - var label = op.get('label'), operations = op.get('operations'); - return React.DOM.label( - { - key: toKey(label), - style: { display: 'block' }, - className: (operations === state.get('active') ? 'highlight-op' : void 0) - }, - React.DOM.input({ - type: 'checkbox', - checked: state.get('operations').contains(operations), - onChange: function (e) { - if (e.target.checked) { - data.swap(function (d) { - return d.set('active', operations) - .update('operations', function (ops) { - return ops.add(operations); - }); - }); - } else { - data.swap(function (d) { - return d.set('active', null) // keep visible in state map - .update('operations', function (ops) { - return ops.remove(operations); - }) - }); - } - } - }), - " ", - label - ); - })); - } - }); - - var Chart = React.createClass({ - render: function () { - var lastop = Immutable.Map( - (this.props.p.get('active') || Immutable.List()).map(function (op) { - return [op.get('account'), op.has('credit') ? 'credit' : 'debit']; - }) - ); - return React.DOM.div( - null, - React.DOM.table( - { className: 'table table-sm' }, - React.DOM.thead( - null, - React.DOM.tr( - null, - React.DOM.th(), - React.DOM.th({ className: 'text-right' }, "Debit"), - React.DOM.th({ className: 'text-right' }, "Credit"), - React.DOM.th({ className: 'text-right' }, "Balance")) - ), - React.DOM.tbody( - null, - this.accounts().map(function (data) { - var highlight = lastop.get(data.get('code')); - return React.DOM.tr( - { key: data.get('code') }, - React.DOM.th(null, - data.get('level') ? '\u2001 ' : '', - data.get('code'), ' ', data.get('label')), - React.DOM.td({ - className: React.addons.classSet({ - 'text-right': true, - 'highlight-op': highlight === 'debit' - }) - }, format(data.get('debit'))), - React.DOM.td({ - className: React.addons.classSet({ - 'text-right': true, - 'highlight-op': highlight === 'credit' - }) - }, format(data.get('credit'))), - React.DOM.td( - { className: 'text-right' }, - ((data.get('debit') || data.get('credit')) - ? format(data.get('debit') - data.get('credit'), 0) - : '') - ) - ); - }) - ) - ) - ); - }, - accounts: function () { - var data = this.props.p.get('operations'); - - var totals = data.toIndexedSeq().flatten(true).reduce(function (acc, op) { - return acc - .updateIn([op.get('account'), 'debit'], function (d) { - return (d || 0) + op.get('debit', zero)(data); - }) - .updateIn([op.get('account'), 'credit'], function (c) { - return (c || 0) + op.get('credit', zero)(data); - }); - }, Immutable.Map()); - - return accounts.map(function (account) { - // for each account, add sum - return account.merge( - account.get('accounts').map(function (code) { - return totals.get(code, NULL); - }).reduce(function (acc, it) { - return acc.mergeWith(function (a, b) { return a + b; }, it, NULL); - }) - ); - }); - } - }); - data.addWatch('chart', function (k, m, prev, next) { - React.render( - React.createElement(Controls, { p: next }), - document.getElementById('chart-controls-continental')); - React.render( - React.createElement(Chart, { p: next }), - document.querySelector('.valuation-chart-continental')); - }); - - document.addEventListener('DOMContentLoaded', function () { - var chart = document.querySelector('.valuation-chart-continental'); - if (!chart) { return; } - - var controls = document.createElement('div'); - controls.setAttribute('id', 'chart-controls-continental'); - chart.parentNode.insertBefore(controls, chart); - - data.reset(Immutable.Map({ - // last-selected operation - active: null, - // set of all currently enabled operations - operations: Immutable.OrderedSet() - })); - }); - - var NULL = Immutable.Map({ debit: 0, credit: 0 }); - var ASSETS = { - code: 1, - label: "Assets", - BANK: { code: 11000, label: "Cash" }, - ACCOUNTS_RECEIVABLE: { code: 13100, label: "Accounts Receivable" }, - STOCK: { code: 14000, label: "Inventory" }, - RAW_MATERIALS: { code: 14100, label: "Raw Materials Inventory" }, - TAXES_PAID: { code: 19000, label: "Deferred Tax Assets" } - }; - var LIABILITIES = { - code: 2, - label: "Liabilities", - ACCOUNTS_PAYABLE: { code: 21000, label: "Accounts Payable" }, - TAXES_PAYABLE: { code: 26200, label: "Deferred Tax Liabilities" } - }; - var EQUITY = { - code: 3, - label: "Equity", - CAPITAL: { code: 31000, label: "Common Stock" } - }; - var REVENUE = { - code: 4, - label: "Revenue", - SALES: { code: 41000, label: "Goods" }, - }; - var EXPENSES = { - code: 5, - label: "Expenses", - PURCHASED_GOODS: { code: 51000, label: "Purchased Goods" }, - PURCHASED_SERVICES: { code: 52000, label: "Purchased Services" }, - INVENTORY_VARIATIONS: { code: 58000, label: "Inventory Variations" }, - OTHER_OPERATING_EXPENSES: { code: 59000, label: "Other Operating Expenses" }, - }; - var categories = Immutable.fromJS([ASSETS, LIABILITIES, EQUITY, REVENUE, EXPENSES], function (k, v) { - return Immutable.Iterable.isIndexed(v) - ? v.toList() - : v.toOrderedMap(); - }); - var accounts = categories.toSeq().flatMap(function (cat) { - return Immutable.Seq.of(cat.set('level', 0)).concat(cat.filter(function (v, k) { - return k.toUpperCase() === k; - }).toIndexedSeq().map(function (acc) { return acc.set('level', 1) })); - }).map(function (account) { // add accounts: Seq to each account - return account.set( - 'accounts', - Immutable.Seq.of(account.get('code')).concat( - account.toIndexedSeq().map(function (val) { - return Immutable.Map.isMap(val) && val.get('code'); - }).filter(function (val) { return !!val; }) - ) - ); - }); - - var sale = 100, - cor = 50, - cor_tax = cor * 0.09, - tax = sale * 0.09, - total = sale + tax, - purchase = 52, - purchase_tax = 52 * 0.09; - var operations = Immutable.fromJS([{ - label: "Vendor Invoice (PO €50, Invoice €50)", - operations: [ - { account: EXPENSES.PURCHASED_GOODS.code, debit: constant(50) }, - { account: ASSETS.TAXES_PAID.code, debit: constant(50 * 0.09) }, - { account: LIABILITIES.ACCOUNTS_PAYABLE.code, credit: constant(50 * 1.09) }, - ] - }, { - label: "Vendor Goods Reception (PO €50, Invoice €50)", - operations: [ - { account: EXPENSES.INVENTORY_VARIATIONS.code, credit: constant(50) }, - { account: ASSETS.STOCK.code, debit: constant(50) }, - ] - }, { - label: "Vendor Invoice (PO €48, Invoice €50)", - operations: [ - { account: EXPENSES.PURCHASED_GOODS.code, debit: constant(50) }, - { account: ASSETS.TAXES_PAID.code, debit: constant(50 * 0.09) }, - { account: LIABILITIES.ACCOUNTS_PAYABLE.code, credit: constant(50 * 1.09) }, - ] - }, { - label: "Vendor Goods Reception (PO €48, Invoice €50)", - operations: [ - { account: EXPENSES.INVENTORY_VARIATIONS.code, credit: constant(48) }, - { account: ASSETS.STOCK.code, debit: constant(48) }, - ] - }, { - label: "Customer Invoice (€100 + 9% tax)", - operations: [ - { account: ASSETS.ACCOUNTS_RECEIVABLE.code, debit: constant(total) }, - { account: REVENUE.SALES.code, credit: constant(sale) }, - { account: LIABILITIES.TAXES_PAYABLE.code, credit: constant(tax) } - ] - }, { - label: "Customer Shipping", - operations: [ - { account: EXPENSES.INVENTORY_VARIATIONS.code, debit: constant(cor) }, - { account: ASSETS.STOCK.code, credit: constant(cor) } - ] - }]); - function constant(val) { return function () { return val; }; } - var zero = constant(0); - function format(val, def) { - if (!val) { return def === undefined ? '' : def; } - if (val % 1 === 0) { return val; } - return val.toFixed(2); - } -})();