From 22864909eae01f33cf57877e9132a2b2d745b0db Mon Sep 17 00:00:00 2001 From: "Lulu Grimalkin (lugr)" Date: Mon, 6 Oct 2025 11:20:16 +0200 Subject: [PATCH] [ADD] Inventory: add stock valuation cheat sheet An adaptation of the venerable business memento from 9.0 to the new inventory valuation mechanics of Odoo 19.0 by scavenging and cobbling together of the 11-year-old scripts `entries.js` and `coa-valuation.js`. The shared data is kept in a separate file. Task ID: 5107300 --- .../inventory_valuation.rst | 1 + .../inventory_valuation/cheat_sheet.rst | 624 ++++++++ .../cheat_sheet/avco-justification.png | Bin 0 -> 19230 bytes .../cheat_sheet/avco-valuation.png | Bin 0 -> 13608 bytes .../cheat_sheet/fifo-adjust.png | Bin 0 -> 14730 bytes .../cheat_sheet/fifo-valuation.png | Bin 0 -> 12945 bytes .../cheat_sheet/valuation-accounting.png | Bin 0 -> 17099 bytes .../cheat_sheet/valuation-stock.png | Bin 0 -> 26054 bytes static/css/valuation.css | 119 ++ static/js/accounts.js | 2 +- static/js/chart-of-accounts.js | 2 +- static/js/entries.js | 2 +- static/js/misc.js | 19 +- static/js/reconciliation.js | 2 +- static/js/valuation-accounting.js | 264 ++++ static/js/valuation-data.js | 1343 +++++++++++++++++ static/js/valuation-journal.js | 173 +++ 17 files changed, 2543 insertions(+), 8 deletions(-) create mode 100644 content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet.rst create mode 100644 content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet/avco-justification.png create mode 100644 content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet/avco-valuation.png create mode 100644 content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet/fifo-adjust.png create mode 100644 content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet/fifo-valuation.png create mode 100644 content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet/valuation-accounting.png create mode 100644 content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet/valuation-stock.png create mode 100644 static/css/valuation.css create mode 100644 static/js/valuation-accounting.js create mode 100644 static/js/valuation-data.js create mode 100644 static/js/valuation-journal.js diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation.rst b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation.rst index 05704a93f9..b48c1b7a7c 100644 --- a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation.rst +++ b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation.rst @@ -7,6 +7,7 @@ Inventory valuation .. toctree:: :titlesonly: + inventory_valuation/cheat_sheet inventory_valuation/inventory_valuation_config inventory_valuation/using_inventory_valuation inventory_valuation/landed_costs diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet.rst b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet.rst new file mode 100644 index 0000000000..45c136d804 --- /dev/null +++ b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet.rst @@ -0,0 +1,624 @@ +:code-column: +:custom-css: valuation.css +:custom-js: misc.js,valuation-data.js,valuation-journal.js,valuation-accounting.js + +=================== +Inventory valuation +=================== + +.. role:: good +.. role:: meh +.. role:: bad + +.. important:: + This documentation is for Odoo 19 or later. + :ref:`Discover why we changed. ` + + +Costing Methods +=============== + +Odoo supports 3 costing methods configured in accounting's settings and, optionally, +the product's category. + +.. rst-class:: alternatives doc-aside + +Standard Cost: fixed unit cost, updated manually + .. 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 + +Average Cost: weighted average of all units + .. 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 + +FIFO: First In, First Out + .. 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 + +.. note:: Removal strategies also support :abbr:`LIFO (Last In, First Out)` and + :abbr:`FEFO (First Expiry, First Out)`, but they only impact which product is first picked, not + the valuation method. For example, you can pick using LIFO, but using Average Cost for valuation, + as LIFO is not allowed by :abbr:`IFRS (International Financial Reporting Standards)`. + + +Inventory vs Accounting +======================= + +.. rst-class:: inventory-app-paragraph + + :doc:`The inventory app ` keeps track of the inventory + value in real time as you **receive and deliver goods**. The reporting menu allows analysing + inventory on hand and values per company, location, product, etc. + +.. rst-class:: accounting-app-paragraph + + :doc:`The accounting app ` updates accounts when you receive + **invoices or bills**. Even though receipts and invoices differ, it’s not practical for + accountants to post journal entries for every inventory movement. So, they post a closing entry + to account for the difference between what has been invoiced and received/delivered. This closing + process happens usually once a year for SMEs, or once a month for larger companies. + +.. h:div:: feature-table doc-aside + + +------------------+------------+-----------+ + | | Accounting | Inventory | + +==================+============+===========+ + | Purchase Order | :meh:`/` | :meh:`/` | + +------------------+------------+-----------+ + | Receipt | :meh:`/` | :good:`✓` | + +------------------+------------+-----------+ + | Vendor Bill | :good:`✓` | :meh:`/` | + +------------------+------------+-----------+ + | Sales Order | :meh:`/` | :meh:`/` | + +------------------+------------+-----------+ + | Customer Invoice | :good:`✓` | :meh:`/` | + +------------------+------------+-----------+ + | Delivery | :meh:`/` | :good:`✓` | + +------------------+------------+-----------+ + | Closing Entry | :good:`✓` | :meh:`/` | + +------------------+------------+-----------+ + + +Accounting Methods +================== + +There are two accounting practices on how to maintain your accounts: + +**Periodic:** Post vendor bills as expenses by nature, and update stock valuation in the closing +entry by reducing expenses (stock variation). It’s the best practice in Europe. + +**Perpetual:** Post vendor bills as assets (stock valuation), report expenses when goods are sold +(cost of goods sold). It’s the best practice in countries that follow Anglo-Saxon accounting, like +the USA and India. + +.. role:: pink +.. role:: yellow +.. role:: green +.. role:: blue +.. role:: darkblue +.. role:: purple +.. role:: washed + +* :purple:`Stock Account`: defined on the product's category +* :yellow:`Stock Variation`: defined on the stock account +* :blue:`Expense/Cost of Goods Sold`: defined on the product/product category +* :green:`Inventory Adjustment`: defined on the Inventory Loss location + (optional, recommended for Anglo-Saxon accounting) +* :pink:`Cost of Production`: defined on the Production location + (optional, recommended for Anglo-Saxon accounting) +* :darkblue:`Expense`: defined on the stock account + (necessary only for perpetual Continental accounting) + +.. rst-class:: config-table + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + + - + + - OPERATION + - BE Periodic + - US Perpetual + - US Periodic + - BE Perpetual + - Debit + - Credit + - + + - ADJUSTMENT + - + - :purple:`Stock` + - + - + - + - 40 + - + + - + - + - :green:`Loss` + - + - + - 40 + - + - + + - BILL + - :blue:`Expenses` + - :purple:`Stock` + - :blue:`COGS` + - :purple:`Stock` + - 500 + - + - + + - + - :washed:`Payable` + - :washed:`Payable` + - :washed:`Payable` + - :washed:`Payable` + - + - :washed:`500` + - + + - INVOICE + - + - :blue:`COGS` + - + - :blue:`Expenses` + - 400 + - + - + + - + - + - :purple:`Stock` + - + - :purple:`Stock` + - + - 400 + - + + - + - :washed:`Income` + - :washed:`Income` + - :washed:`Income` + - :washed:`Income` + - + - :washed:`750` + - + + - + - :washed:`Receivable` + - :washed:`Receivable` + - :washed:`Receivable` + - :washed:`Receivable` + - :washed:`750` + - + - + + - MANUFACTURING + - + - :purple:`Stock` + - + - + - 52 + - + - + + - + - + - :pink:`COP` + - + - + - + - 52 + - + + - + - + - :purple:`Stock` + - + - + - + - 50 + - + + - + - + - :pink:`COP` + - + - + - 50 + - + - + + - CLOSING + - :yellow:`Stock Variation` + - + - + - + - + - 62 [#copc-stockvar]_ + - + + - + - :purple:`Stock` + - + - + - + - 62 + - + - + + - + - + - :yellow:`Stock Variation` + - + - + - 0 [#aspl-stockvar]_ + - + - + + - + - + - :purple:`Stock` + - + - + - + - 0 + - + + - + - + - + - :yellow:`COGS` + - + - + - 100 [#aspc-cogs]_ + - + + - + - + - + - :purple:`Stock` + - + - 100 + - + - + + - + - + - + - :pink:`COP` + - + - + - 52 + - + + - + - + - + - :purple:`Stock` + - + - 52 + - + - + + - + - + - + - :pink:`COP` + - + - 50 + - + - + + - + - + - + - :purple:`Stock` + - + - + - 50 + - + + - + - + - + - :green:`Loss` + - + - 40 + - + - + + - + - + - + - :purple:`Stock` + - + - + - 40 + - + + - + - + - + - + - :blue:`Expenses` + - 38 [#copl-expenses]_ + - + - + + - + - + - + - + - :purple:`Stock` + - + - 38 + - + + - + - + - + - + - :yellow:`Stock Variation` + - + - 62 [#copl-stockvar]_ + - + + - + - + - + - + - :darkblue:`Expenses` + - 62 + - + +.. [#copc-stockvar] Inventory - Stock = 102 - 40 + +.. [#aspl-stockvar] Inventory - Stock = 0 + +.. [#aspc-cogs] Inventory - Stock = 140 - 40 + (What comes from loss/:abbr:`COP (Cost of Production)` is done separately.) + +.. [#copl-expenses] Inventory - Stock = 102 - 140 + +.. [#copl-stockvar] Stock Y - Stock Y-1 = 102 - 40 + +.. _accounting-entries: + +Accounting Entries +================== + +.. h:div:: accounting-entries doc-aside + + .. placeholder + + +.. _journal-entries: + +Journal Entries Configuration +============================= + + +.. h:div:: journal-entries doc-aside + + .. placeholder + + +.. _changes-in-19: + +Changes in Odoo 19 +================== + +Before Odoo 19, the Perpetual accounting method was implemented by posting real-time accounting +entries at each stock movement. That created a lot of journal items in accounting, which was an +issue for performance, general ledger clarity and auditability. + +Since Odoo 19, the Perpetual method impacts the stock valuation account at the invoice level. The +closing entry is then used to manage bills to receive, invoices to issue, deferred revenues, prepaid +expenses, and other gaps between inventory values and accounting ones. + +.. h:div:: feature-table doc-aside + + +-----------------------+--------------------------------+--------------------------------+ + | | Odoo 18 | Odoo 19 | + +=======================+================================+================================+ + | Periodic Continental | :meh:`Manual closing` | :good:`Automated closing` | + +-----------------------+--------------------------------+--------------------------------+ + | Periodic Anglo-Saxon | :bad:`Not supported` | :good:`Fully supported` | + +-----------------------+--------------------------------+--------------------------------+ + | Perpetual Continental | :meh:`Manual closing` | :good:`✓` | + +-----------------------+--------------------------------+--------------------------------+ + | Perpetual Anglo-Saxon | :meh:`Manual closing` | :good:`✓` | + +-----------------------+--------------------------------+--------------------------------+ + | Accounting valuation | :meh:`Requires inventory` | :good:`Accounting only` | + +-----------------------+--------------------------------+--------------------------------+ + | Perpetual Entries | :good:`Invoices + every moves` | :good:`Invoices + one closing` | + +-----------------------+--------------------------------+--------------------------------+ + | Invoices to issue | :bad:`✗` | :good:`✓` | + +-----------------------+--------------------------------+--------------------------------+ + | Prepaid expenses | :bad:`✗` | :good:`✓` | + +-----------------------+--------------------------------+--------------------------------+ + | Bills to receive | :bad:`✗` | :good:`✓` | + +-----------------------+--------------------------------+--------------------------------+ + | Deferred revenues | :bad:`✗` | :good:`✓` | + +-----------------------+--------------------------------+--------------------------------+ + | Performance | :bad:`Slower` | :good:`Faster` | + +-----------------------+--------------------------------+--------------------------------+ + | General ledger | :good:`More journal entries` | :good:`Fewer journal entries` | + +-----------------------+--------------------------------+--------------------------------+ + + +What does it look like in Odoo? +=============================== + +In Inventory +------------ + +Open :menuselection:`Reporting --> Stock` to have a view on the current average cost for the product +and the total value of the stock. They can both be open to display details. + +.. image:: cheat_sheet/valuation-stock.png + + +AVCO product +~~~~~~~~~~~~ + +You can open :guilabel:`Unit Cost` to check all existing updates and their origins. In +:abbr:`AVCO (Average Cost)` this allows you to understand how the currently used value was +calculated. + +.. image:: cheat_sheet/avco-justification.png + +By opening :guilabel:`Total Value`, you can see all incoming quantities for which you still have a +remaining quantity and the value used for their valuation. In AVCO or standard cost, the used value +is always the current average unit cost. + +.. image:: cheat_sheet/avco-valuation.png + + +FIFO product +~~~~~~~~~~~~ + +In :abbr:`FIFO (First In, First Out)`, remaining units from each previous incoming move keep their +own individual valuation as shown in :guilabel:`Total Value`. + +.. image:: cheat_sheet/fifo-valuation.png + +In FIFO or AVCO remaining quantities from a previous incoming move can have their value adjusted if +necessary. + +.. image:: cheat_sheet/fifo-adjust.png + + +In Accounting +------------- + +Open :menuselection:`Review --> Inventory Valuation` to have a look at the difference between the +accounting stock value and the current inventory value recorded thanks to the incoming moves with a +remaining quantity. + +Click on :guilabel:`Generate Entry` to get a new accounting entry to review and post. + +.. image:: cheat_sheet/valuation-accounting.png + +Open +:menuselection:`Review --> Invoices not received, Invoices to be issued, Prepaid expenses and Deferred Revenues` +to easily record these entries. + +With Anglo-Saxon perpetual accounting, this will also help to distribute recorded Inventory +Variations to accounts such as Bill to Receive/:abbr:`GRNI (Goods Received Not Invoiced)` or +:abbr:`COGS (Cost of Goods Sold)` as shown in the :ref:`Accounting Entries ` +and :ref:`Journal Entries Configuration ` sections. diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet/avco-justification.png b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet/avco-justification.png new file mode 100644 index 0000000000000000000000000000000000000000..759a0177326fde1fd64208d1be50559b3e5a346a GIT binary patch literal 19230 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 literal 0 HcmV?d00001 diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet/avco-valuation.png b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet/avco-valuation.png new file mode 100644 index 0000000000000000000000000000000000000000..114bee1012c35fc1cab7dec30a7e391154804c7b GIT binary patch literal 13608 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 literal 0 HcmV?d00001 diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet/fifo-adjust.png b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet/fifo-adjust.png new file mode 100644 index 0000000000000000000000000000000000000000..cacf9d07aaa183816c53551c5152463fe3cb2dde GIT binary patch literal 14730 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 V^X{{il*j3mvVw*@{DsB4{{_Iy^fUkf literal 0 HcmV?d00001 diff --git a/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet/fifo-valuation.png b/content/applications/inventory_and_mrp/inventory/product_management/inventory_valuation/cheat_sheet/fifo-valuation.png new file mode 100644 index 0000000000000000000000000000000000000000..e214d19786362b5465475e6759495155107e3cca GIT binary patch literal 12945 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 z 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 dt, dl.alternatives > dd { + display: none; +} +dl.alternatives > dd { + margin-left: 0; +} + +.values-table { + text-align: right; + tr > th:first-of-type { + text-align: left; + } +} + +.accounting-entries, .journal-entries, .values-table { + border: 1px solid #d5d5d5; + background-color: #f8f8f8; + /* width: 80%; */ + margin: 0px auto; +} +.accounting-entries { + th, td { + padding-top: 0px !important; + padding-bottom: 0px !important; + } + thead th, tr > td { + padding-left: 48px; + } + tbody th { + font-weight: normal; + } + .parent-line { background-color: #fafafa; } + .child-line { background-color: #f0f0f0; } +} +.entries-listing { + padding: .5rem; +} + +#accounting-entries-controls label, +#journaling-entries-controls label { + display: block; +} + +label:hover, .highlighter-list li:hover { + background-color: hsl(0, 0%, 94%); + cursor: pointer; +} +.related { + background-color: hsl(317deg 16% 90%) !important; + border: 1px solid #000000 !important; + transition: .3s; +} +.secondary { + background-color: hsl(180deg 67% 94%) !important; + transition: .3s; +} +.highlight-op { + background-color: hsl(317deg 16% 90%) !important; + transition: .3s; +} +.highlighter-target { + th { + font-weight: 400; + } + .related { + /*background-color: #eee !important;*/ + color: #7A436B !important; + } + .secondary { + background-color: #eee !important; + color: #7A436B !important; + } +} +.valuation-chart .highlight-op { + background-color: #030035; + border-bottom: 1px solid #000000 !important; +} + +.feature-table, .config-table { + table { + /* width: unset; */ + margin: auto; + white-space: nowrap; + text-align: center; + } + tbody td:first-child { + text-align: left; + } +} + +.accounting-app-paragraph:hover ~ .feature-table tr > td:first-child:has(+ td .good), +.inventory-app-paragraph:hover ~ .feature-table tr > td:first-child:has(+ td + td .good) +{ font-weight: bold; } + +.feature-table { + td { width: 32px; } + td:has(.good) { background-color: #d9ead3 !important; } + td:has(.meh) { background-color: #fce5cd !important; } + td:has(.bad) { background-color: #f4cccc !important; } +} +.config-table { + th, td { + padding-top: 0px !important; + padding-bottom: 0px !important; + } + td:has(.washed) { color: var(--bs-gray); } +} + +.pink, td:has(.pink) { background-color: #fcc0fc !important; } +.yellow, td:has(.yellow) { background-color: #fff2cc !important; } +.green, td:has(.green) { background-color: #d9ead3 !important; } +.blue, td:has(.blue) { background-color: #cfe2f3 !important; } +.darkblue, td:has(.darkblue) { background-color: #6d9eeb !important; } +.purple, td:has(.purple) { background-color: #d9d2e9 !important; } diff --git a/static/js/accounts.js b/static/js/accounts.js index f7ba5c7763..744cb3073e 100644 --- a/static/js/accounts.js +++ b/static/js/accounts.js @@ -1,6 +1,6 @@ /* global Immutable, React */ (function () { - // NOTE: used by cheat_sheet.rst + // NOTE: used by accounting cheat_sheet.rst 'use strict'; function highlight(primary, secondary) { diff --git a/static/js/chart-of-accounts.js b/static/js/chart-of-accounts.js index 960e8af53e..462bf5fdda 100644 --- a/static/js/chart-of-accounts.js +++ b/static/js/chart-of-accounts.js @@ -1,7 +1,7 @@ /* global Immutable, React */ /* global createAtom */ (function () { - // NOTE: used by cheat_sheet.rst + // NOTE: used by accounting cheat_sheet.rst 'use strict'; var data = createAtom(); diff --git a/static/js/entries.js b/static/js/entries.js index f6bbf20978..f30fdffb9d 100644 --- a/static/js/entries.js +++ b/static/js/entries.js @@ -2,7 +2,7 @@ /* global createAtom, findAncestor */ (function () { 'use strict'; - // NOTE: cheat_sheet.rst + // NOTE: used by accounting cheat_sheet.rst var data = createAtom(); data.addWatch('chart', function (k, m, prev, next) { diff --git a/static/js/misc.js b/static/js/misc.js index 1bc7cd3e3e..8272594726 100644 --- a/static/js/misc.js +++ b/static/js/misc.js @@ -6,7 +6,7 @@ }); function highlight() { - // NOTE: used by double-entry.rst + // NOTE: used by valuation cheat_sheet.rst $('.highlighter-list').each(function () { var $this = $(this), $target = $($this.data('target')); @@ -34,7 +34,7 @@ * - automatically select first control on startup */ function alternatives() { - // NOTE: used by double-entry.rst & valuation_methods pages + // NOTE: used by valuation cheat_sheet.rst $('dl.alternatives').each(function (index) { var $list = $(this), $contents = $list.children('dd'); @@ -51,7 +51,18 @@ label.appendChild(input); label.appendChild(document.createTextNode(' ')); - label.appendChild(document.createTextNode(this.textContent)); + + // Hack to bold the definition since we have to strip rST formatting + const [headText, tailText] = this.textContent.split(':', 2); + if (tailText) { + const bold = document.createElement('b'), + defined = document.createTextNode(`${headText}:`); + bold.appendChild(defined); + label.appendChild(bold); + } + + label.appendChild(document.createTextNode(tailText || headText)); + label.normalize(); return label; })) @@ -67,7 +78,7 @@ }); } function checks_handling() { - // NOTE: used by cheat_sheet.rst + // NOTE: used by accounting cheat_sheet.rst var $section = $('.checks-handling'); if (!$section.length) { return; } diff --git a/static/js/reconciliation.js b/static/js/reconciliation.js index 84c4ee07df..8925f95c0d 100644 --- a/static/js/reconciliation.js +++ b/static/js/reconciliation.js @@ -1,5 +1,5 @@ (function () { - // NOTE: cheat_sheet.rst + // NOTE: used by accounting cheat_sheet.rst document.addEventListener('DOMContentLoaded', function () { var $rec = $('#reconciliation .reconciliation-example'); if (!$rec.length) { return; } diff --git a/static/js/valuation-accounting.js b/static/js/valuation-accounting.js new file mode 100644 index 0000000000..f2f8d053a2 --- /dev/null +++ b/static/js/valuation-accounting.js @@ -0,0 +1,264 @@ +/* global Immutable, React */ +/* global createAtom */ +/* global VALUATION_{STANDARDS,METHODS,JOURNALS,ENTRIES,REVIEWS} */ +(function () { + 'use strict'; + // NOTE: used by valuation cheat_sheet.rst + + const mode = createAtom(['continental', 'periodic']); + const data = createAtom(); + + function watch (next) { + React.render( + React.createElement(Controls, { p: next }), + document.getElementById('accounting-entries-controls')); + React.render( + React.createElement(Chart, { p: next }), + document.querySelector('.accounting-entries')); + } + + data.addWatch('chart', (k, m, prev, next) => watch(next)); + mode.addWatch('chart', (k, m, prev, next) => watch(data.deref())); + + document.addEventListener('DOMContentLoaded', function () { + const chart = document.querySelector('.accounting-entries'); + if (!chart) { return; } + + const controls = document.createElement('div'); + controls.setAttribute('id', 'accounting-entries-controls'); + chart.parentNode.insertBefore(controls, chart); + + data.reset(Immutable.Map({ + // last-selected operation + active: null, + // set of all currently enabled operations + operations: Immutable.OrderedSet() + })); + }); + + function toKey(s, postfix) { + if (postfix) { + s += ' ' + postfix; + } + return s.replace(/[^0-9a-z ]/gi, '').toLowerCase().split(/\s+/).join('-'); + } + + const Controls = React.createClass({ + render: function () { + const state = this.props.p; + return React.DOM.div( + null, + React.DOM.b(null, 'Choose a standard:'), + VALUATION_STANDARDS.map(function (item, index) { + return React.DOM.label( + { key: index }, + React.DOM.input({ + type: 'radio', + checked: item.get('name') === mode.deref()[0], + onChange: function (e) { + const newValue = item.get('name'); + mode.reset([newValue, newValue === 'continental' ? 'periodic' : 'perpetual']); + } + }), + ' ', + item.get('text') + ); + }), + React.DOM.br(), + React.DOM.b(null, 'Choose an accounting method:'), + VALUATION_METHODS.map(function (item, index) { + return React.DOM.label( + { key: index }, + React.DOM.input({ + type: 'radio', + checked: item.get('name') === mode.deref()[1], + onChange: e => mode.swap(vals => [vals[0], item.get('name')]), + }), + ' ', + item.get('text') + ); + }), + React.DOM.br(), + React.DOM.b(null, 'Activate operations to see the impact:'), + React.DOM.br(), React.DOM.br(), + 'Operations', + VALUATION_ENTRIES.map(function (item, key) { + return React.DOM.label( + { + key: key, + style: { display: 'block' }, + className: (key === state.get('active') ? 'highlight-op' : void 0) + }, + React.DOM.input({ + type: 'checkbox', + checked: state.get('operations').contains(key), + onChange: function (e) { + if (e.target.checked) { + data.swap(d => d.set('active', key) + .update('operations', ops => ops.add(key))); + } else { + data.swap(d => d.set('active', null) + .update('operations', ops => ops.remove(key))); + } + } + }), + ' ', + item.get('title') + ); + }), + React.DOM.br(), + 'Review', + VALUATION_REVIEWS.map(function (item, key) { + // We bold the text if any of the operations in this review is + // relevant to the currently selected operations. + const boldable = item.getIn([...mode.deref(), 'operations']) + .some(function (op) { + if (!op.has('entries') && !op.has('except')) + return true; + const opset = state.get('operations').toSet(); + if (opset.isSuperset(op.get('entries', [])) + && opset.intersect(op.get('except', [])).isEmpty()) + return true; + }); + return React.DOM.label( + { + key: key, + style: { display: 'block' }, + className: (key === state.get('active') ? 'highlight-op' : void 0) + }, + React.DOM.input({ + type: 'checkbox', + checked: state.get('operations').contains(key), + onChange: function (e) { + if (e.target.checked) { + data.swap(d => d.set('active', key) + .update('operations', ops => ops.add(key))); + } else { + data.swap(d => d.set('active', null) + .update('operations', ops => ops.remove(key))); + } + } + }), + ' ', + boldable ? React.DOM.b(null, item.get('title')) : item.get('title'), + ); + }), + React.DOM.br(), + ); + } + }); + + const Chart = React.createClass({ + render: function () { + // Only used for highlighting cells. + const lastop = Immutable.Map( + this.props.p.get('active') + ? (VALUATION_ENTRIES.concat(VALUATION_REVIEWS) + .getIn([this.props.p.get('active'), ...mode.deref(), 'operations'], Immutable.List())) + .map(op => [VALUATION_JOURNALS.getIn([mode.deref()[0], ...op.get('account'), 'code']), + op.has('credit') ? 'credit' : 'debit']) + : Immutable.Map()); + return React.DOM.div( + null, + React.DOM.table( + { className: 'table table-condensed' }, + 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) { + // Don't highlight the cell if it's going to be empty. + const highlight = lastop.get(data.get('code')), + debit = format(data.get('debit')), + credit = format(data.get('credit')); + return React.DOM.tr( + { + key: data.get('code'), + className: data.get('level') ? 'parent-line' : 'child-line', + }, + React.DOM.th( + null, + data.get('level') ? '\u2001 ' : '', + data.get('code') || '', ' ', data.get('title') + ), + React.DOM.td( + { className: React.addons.classSet({ + 'text-right': true, + 'highlight-op': debit ? highlight === 'debit' : void 0 }) }, + debit), + React.DOM.td( + { className: React.addons.classSet({ + 'text-right': true, + 'highlight-op': credit ? highlight === 'credit' : void 0 }) }, + credit), + React.DOM.td( + { className: 'text-right' }, + ((data.get('debit') || data.get('credit')) + ? format(data.get('debit') - data.get('credit'), 0) + : ''), + ) + ); + }) + ) + ) + ); + }, + accounts: function() { + const currentOperations = this.props.p.get('operations'); + if (!currentOperations) + return null; + const totals = VALUATION_ENTRIES.concat(VALUATION_REVIEWS) + .filter((val, key) => currentOperations.includes(key)) + .valueSeq() + .flatMap(entry => entry.getIn([...mode.deref(), 'operations'])) + .reduce(function (acc, op) { + // `entries' and `except' fields are explained in valuation-data.js (quod vide) + if (op.has('entries') || op.has('except')) { + const opset = currentOperations.toSet(); + if (!(opset.isSuperset(op.get('entries', [])) + && opset.intersect(op.get('except', [])).isEmpty())) { + return acc; + } + } + const code = VALUATION_JOURNALS.getIn([mode.deref()[0], ...op.get('account'), 'code']); + return acc + .updateIn([code, 'debit'], + d => (d || 0) + op.get('debit', 0)) + .updateIn([code, 'credit'], + c => (c || 0) + op.get('credit', 0)); + }, Immutable.Map()); + return accounts.get(mode.deref()[0]).map(account => + account.merge(account.get('accounts') + .map(code => totals.get(code, NULL)) + .reduce((acc, it) => acc.mergeWith((a, b) => a + b, it, NULL)))); + } + }); + + const NULL = Immutable.Map({ debit: 0, credit: 0 }); + const accounts = VALUATION_JOURNALS.map(method => method.toList().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; }) + ) + ); + })); + 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/valuation-data.js b/static/js/valuation-data.js new file mode 100644 index 0000000000..7a7b5b7806 --- /dev/null +++ b/static/js/valuation-data.js @@ -0,0 +1,1343 @@ +/* global Immutable */ +// NOTE: used by valuation-journal.js & valuation-accounting.js + +// Deep conversion with OrderedMap as default +Immutable.fromJSButOrdered = code => Immutable.fromJS(code, (key, value) => + Immutable.Iterable.isKeyed(value) ? value.toOrderedMap() : value.toList()); + +const VALUATION_STANDARDS = Immutable.fromJS([ + { name: 'continental', text: "Continental (Expenses = Purchase Expenses)" }, + { name: 'anglo_saxon', text: "Anglo-Saxon (Expenses = Cost of Goods Sold)" }, +]); + +const VALUATION_METHODS = Immutable.fromJS([ + { name: 'periodic', text: "Periodic: focuses on expenses by nature" }, + { name: 'perpetual', text: "Perpetual: focuses on inventory value" }, +]); + +const VALUATION_JOURNALS = Immutable.fromJSButOrdered({ + continental: { + EQUITY: { code: 1, title: "Equity and Liabilities" }, + ASSETS: { code: 2, title: "Fixed Assets" }, + STOCK: { + code: 3, title: "Stock (Current Assets)", + RAW: { code: 300000, title: "Inventory Raw Materials" }, + WIP: { code: 320000, title: "Work in Progress" }, + FINISHED_GOODS: { code: 330000, title: "Inventory Finished Goods" }, + GOODS_FOR_RESALE: { code: 340000, title: "Inventory Goods Purchase for Resale" }, + }, + LIABILITIES: { + code: 4, title: "Receivables and Payables", + CUSTOMERS: { code: 400000, title: "Customers" }, + VAT_RECOVERABLE: { code: 411000, title: "VAT Recoverable" }, + RECEIVABLE: { code: 414000, title: "Income Receivable" }, + SUPPLIERS: { code: 440000, title: "Suppliers" }, + INVOICES_UNRECEIVED: { code: 444000, title: "Invoices to Be Received" }, + VAT_PAYABLE: { code: 451000, title: "VAT Payable" }, + DEFERRED_CHARGES: { code: 490000, title: "Deferred Charges" }, + DEFERRED_INCOME: { code: 493000, title: "Deferred Income" }, + }, + CASH: { code: 5, title: "Financial Accounts and Cash" }, + EXPENSES: { + code: 6, title: "Expenses", + RAW: { code: 600000, title: "Raw Materials" }, + FINISHED: { code: 600200, title: "Cost of Finished Goods" }, + GOODS_FOR_RESALE: { code: 604000, title: "Goods for Resale" }, + CHANGE_IN_RAW: { code: 609000, title: "Decrease (Increase) in Stocks of Raw Materials" }, + CHANGE_IN_GOODS_FOR_RESALE: { code: 609400, title: "Decrease (Increase) in Stocks of Goods Purchased for Resale" }, + }, + REVENUES: { + code: 7, title: "Revenues", + SALES: { code: 700000, title: "Sales" }, + CHANGE_IN_WIP: { code: 712000, title: "Increase (Decrease) in Stocks of Work in Progress" }, + CHANGE_IN_FINISHED_GOODS: { code: 713000, title: "Increase (Decrease) in Stocks of Finished Goods" }, + }, + INITIAL_BALANCE: { code: 0, title: "General Balance for Inventory Initial Value" }, + }, + anglo_saxon: { + ASSETS: { + code: 1, title: "Assets", + BANK: { code: 101401, title: "Bank" }, + INVENTORY: { code: 110100, title: "Inventory" }, + RAW: { code: 110101, title: "Raw Materials Inventory" }, + MANUFACTURED: { code: 110102, title: "Manufactured Products Inventory" }, + COST: { code: 110400, title: "Cost of Production" }, + VARIATIONS: { code: 110600, title: "Inventory Variations" }, + RECEIVABLE: { code: 121000, title: "Accounts Receivable" }, + UNINVOICED: { code: 121200, title: "Uninvoiced Receivable" }, + PREPAID: { code: 128000, title: "Prepaid Expenses" }, + TAX_PAID: { code: 131000, title: "Tax Paid" }, + }, + LIABILITIES: { + code: 2, title: "Liabilities", + PAYABLE: { code: 211000, title: "Accounts Payable" }, + UNINVOICED: { + code: 211100, + title: "Bills to Receive/Goods Received Not Invoiced", + }, + DEFERRED: { code: 212000, title: "Deferred Revenue" }, + TAX_RECEIVED: { code: 251000, title: "Tax Received" }, + }, + EQUITY: { + code: 3, title: "Equity", + COMMON: { code: 303000, title: "Common Stock" }, + }, + REVENUES: { + code: 4, title: "Revenue", + SALES: { code: 400000, title: "Product Sales" }, + }, + EXPENSES: { + code: 5, title: "Expenses", + COST: { code: 500000, title: "Cost of Goods Sold" }, + PRICE_DIFFERENCE: { code: 530000, title: "Price Difference" }, + INVENTORY_LOSS: { code: 609100, title: "Inventory Loss Expense" }, + MISC: { code: 609000, title: "Miscellanous Expenses" }, + }, + INITIAL_BALANCE: { code: 0, title: "General Balance for Inventory Initial Value" }, + }, +}); + +/* Entry and review operations follow the following schema: + { name: { + title: "...", + continental: { + periodic: { + operations: [{ account: [...], // corresponds to the above table + debit OR credit: n, // mutually exclusive + entries: [...], // reviews only, optional + except: [...], // reviews only, optional + }, ...], + journal_operations: [...], // `closing' reviews only + explanation: [...], + configuration: [...], + }, + perpetual: { ditto }, + }, + anglo_saxon: { + periodic: { ditto }, + perpetual: { ditto }, + }, + }, + }, ... + See below for more on review operations. + */ +const VALUATION_ENTRIES = Immutable.fromJSButOrdered({ + initial_inventory: { + title: "Initial Inventory (Goods for Resale $50)", + continental: { + periodic: { + operations: [ + { account: ['STOCK', 'GOODS_FOR_RESALE'], debit: 50 }, + { account: ['INITIAL_BALANCE'], credit: 50 }, + ], + explanation: [], + configuration: [ + "Stock Account: defined on the product category", + ], + }, + perpetual: { + operations: [ + { account: ['STOCK', 'GOODS_FOR_RESALE'], debit: 50 }, + { account: ['INITIAL_BALANCE'], credit: 50 }, + ], + explanation: [], + configuration: [ + "Stock Account: defined on the product category", + ], + }, + }, + anglo_saxon: { + periodic: { + operations: [ + { account: ['ASSETS', 'INVENTORY'], debit: 50 }, + { account: ['INITIAL_BALANCE'], credit: 50 }, + ], + explanation: [], + configuration: [ + "Stock Account: defined on the product category", + ], + }, + perpetual: { + operations: [ + { account: ['ASSETS', 'INVENTORY'], debit: 50 }, + { account: ['INITIAL_BALANCE'], credit: 50 }, + ], + explanation: [], + configuration: [ + "Stock Account: defined on the product category", + ], + }, + }, + }, + supplier_reception: { + title: "Supplier Goods Reception (PO $50, Bill $50)", + continental: { + periodic: { + operations: [], + explanation: [ + "In a periodic inventory valuation, goods' receipts are not directly posted in the accounting.", + "The inventory value is updated when entries are generated from stock valuation report at closing.", + ], + configuration: [], + }, + perpetual: { + operations: [], + explanation: [ + "In a perpetual inventory valuation, goods receipts are not directly posted in the accounting.", + "The inventory value is updated:", + "- when the invoice/bill is posted", + "- when entries are generated from stock valuation report at closing", + ], + configuration: [], + }, + }, + anglo_saxon: { + periodic: { + operations: [], + explanation: [ + "In a periodic inventory valuation, goods' receipts are not directly posted in the accounting.", + "The inventory value is updated when entries are generated from stock valuation report at closing.", + ], + configuration: [], + }, + perpetual: { + operations: [], + explanation: [ + "In a perpetual inventory valuation, goods receipts are not directly posted in the accounting.", + "The inventory value is updated:", + "- when the invoice/bill is posted", + "- when entries are generated from stock valuation report at closing", + ], + configuration: [], + }, + }, + }, + supplier_bill: { + title: "Supplier Bill (PO $50, Bill $50)", + continental: { + periodic: { + operations: [ + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 50 }, + { account: ['LIABILITIES', 'SUPPLIERS'], credit: 54.5 }, + { account: ['LIABILITIES', 'VAT_RECOVERABLE'], debit: 4.5 }, + ], + explanation: [], + configuration: [ + "Account Payable: defined on the supplier contact", + "Tax Account: defined on the account from the Purchase Taxes set on the product", + "Expense Account: defined on the product/product category", + ], + }, + perpetual: { + operations: [ + { account: ['STOCK', 'GOODS_FOR_RESALE'], debit: 50 }, + { account: ['LIABILITIES', 'SUPPLIERS'], credit: 54.5 }, + { account: ['LIABILITIES', 'VAT_RECOVERABLE'], debit: 4.5 }, + ], + explanation: [], + configuration: [ + "Stock Account: defined on the product category", + "Account Payable Account: defined on the supplier contact", + "Tax Account: defined on the account from the Purchase Taxes set on the product", + ], + }, + }, + anglo_saxon: { + periodic: { + operations: [ + { account: ['EXPENSES', 'COST'], debit: 50 }, + { account: ['LIABILITIES', 'PAYABLE'], credit: 54.5 }, + { account: ['ASSETS', 'TAX_PAID'], debit: 4.5 }, + ], + explanation: [], + configuration: [ + "Account Payable: defined on the supplier contact", + "Tax Account: defined on the account from the Purchase Taxes set on the product", + "Expense Account: defined on the product/product category", + ], + }, + perpetual: { + operations: [ + { account: ['ASSETS', 'INVENTORY'], debit: 50 }, + { account: ['LIABILITIES', 'PAYABLE'], credit: 54.5 }, + { account: ['ASSETS', 'TAX_PAID'], debit: 4.5 }, + ], + explanation: [], + configuration: [ + "Account Payable: defined on the supplier contact", + "Tax Account: defined on the account from the Purchase Taxes set on the product", + "Expense Account: defined on the product/product category", + ], + }, + }, + }, + supplier_reception_extra: { + title: "Supplier Goods Reception (PO $48, Bill $50)", + continental: { + periodic: { + operations: [], + explanation: [ + "In a periodic inventory valuation, goods' receipts are not directly posted in the accounting.", + "The inventory value is updated when entries are generated from stock valuation report at closing.", + ], + configuration: [], + }, + perpetual: { + operations: [], + explanation: [ + "In a perpetual inventory valuation, goods receipts are not directly posted in the accounting.", + "The inventory value is updated:", + "- when the invoice/bill is posted", + "- when entries are generated from stock valuation report at closing", + ], + configuration: [], + }, + }, + anglo_saxon: { + periodic: { + operations: [], + explanation: [ + "In a periodic inventory valuation, goods' receipts are not directly posted in the accounting.", + "The inventory value is updated when entries are generated from stock valuation report at closing.", + ], + configuration: [], + }, + perpetual: { + operations: [], + explanation: [ + "In a perpetual inventory valuation, goods receipts are not directly posted in the accounting.", + "The inventory value is updated:", + "- when the invoice/bill is posted", + "- when entries are generated from stock valuation report at closing", + ], + configuration: [], + }, + }, + }, + supplier_bill_extra: { + title: "Supplier Bill (PO $48, Bill $50)", + continental: { + periodic: { + operations: [ + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 50 }, + { account: ['LIABILITIES', 'SUPPLIERS'], credit: 54.5 }, + { account: ['LIABILITIES', 'VAT_RECOVERABLE'], debit: 4.5 }, + ], + explanation: [], + configuration: [ + "Account Payable: defined on the supplier contact", + "Tax Account: defined on the account from the Purchase Taxes set on the product", + "Expense Account: defined on the product/product category", + ], + }, + perpetual: { + operations: [ + { account: ['STOCK', 'GOODS_FOR_RESALE'], debit: 50 }, + { account: ['LIABILITIES', 'SUPPLIERS'], credit: 54.5 }, + { account: ['LIABILITIES', 'VAT_RECOVERABLE'], debit: 4.5 }, + ], + explanation: [], + configuration: [ + "Stock Account: defined on the product category", + "Account Payable Account: defined on the supplier contact", + "Tax Account: defined on the account from the Purchase Taxes set on the product", + ], + }, + }, + anglo_saxon: { + periodic: { + operations: [ + { account: ['EXPENSES', 'COST'], debit: 50 }, + { account: ['LIABILITIES', 'PAYABLE'], credit: 54.5 }, + { account: ['ASSETS', 'TAX_PAID'], debit: 4.5 }, + ], + explanation: [], + configuration: [ + "Account Payable: defined on the supplier contact", + "Tax Account: defined on the account from the Purchase Taxes set on the product", + "Expense Account: defined on the product/product category", + ], + }, + perpetual: { + operations: [ + { account: ['ASSETS', 'INVENTORY'], debit: 50 }, + { account: ['LIABILITIES', 'PAYABLE'], credit: 54.5 }, + { account: ['ASSETS', 'TAX_PAID'], debit: 4.5 }, + ], + explanation: [], + configuration: [ + "Account Payable: defined on the supplier contact", + "Tax Account: defined on the account from the Purchase Taxes set on the product", + "Expense Account: defined on the product/product category", + ], + }, + }, + }, + customer_shipping: { + title: "Customer Shipping (SO $100, Invoice $100, Good Value $50)", + continental: { + periodic: { + operations: [], + explanation: [ + "In a periodic inventory valuation, goods shipments are not directly posted in the accounting.", + "The inventory value is updated when entries are generated from stock valuation report at closing.", + ], + configuration: [], + }, + perpetual: { + operations: [], + explanation: [ + "In a perpetual inventory valuation, goods shipments are not directly posted in the accounting.", + "The inventory value is updated:", + "- when the invoice/bill is posted", + "- when entries are generated from stock valuation report at closing", + ], + configuration: [], + }, + }, + anglo_saxon: { + periodic: { + operations: [], + explanation: [ + "In a periodic inventory valuation, goods shipments are not directly posted in the accounting.", + "The inventory value is updated when entries are generated from stock valuation report at closing.", + ], + configuration: [], + }, + perpetual: { + operations: [], + explanation: [ + "In a perpetual inventory valuation, goods shipments are not directly posted in the accounting.", + "The inventory value is updated:", + "- when the invoice/bill is posted", + "- when entries are generated from stock valuation report at closing", + ], + configuration: [], + }, + }, + }, + customer_invoice: { + title: "Customer Invoice (SO $100, Invoice $100, Good Value $50)", + continental: { + periodic: { + operations: [ + { account: ['LIABILITIES', 'CUSTOMERS'], debit: 109 }, + { account: ['LIABILITIES', 'VAT_PAYABLE'], credit: 9 }, + { account: ['REVENUES', 'SALES'], credit: 100 }, + ], + explanation: [], + configuration: [ + "Account Receivable Account: defined on the customer contact", + "Tax Account: defined on the account from the Sales Taxes set on the product", + "Income Account: defined on the product/product category", + ], + }, + perpetual: { + operations: [ + { account: ['STOCK', 'GOODS_FOR_RESALE'], credit: 50 }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 50 }, + { account: ['LIABILITIES', 'CUSTOMERS'], debit: 109 }, + { account: ['LIABILITIES', 'VAT_PAYABLE'], credit: 9 }, + { account: ['REVENUES', 'SALES'], credit: 100 }, + ], + explanation: [], + configuration: [ + "Stock Account: defined on the product category", + "Expense/COGS Account: defined on the product/product category", + "Account Receivable Account: defined on the customer contact", + "Tax Account: defined on the account from the Sales Taxes set on the product", + "Income Account: defined on the product/product category", + ], + }, + }, + anglo_saxon: { + periodic: { + operations: [ + { account: ['ASSETS', 'RECEIVABLE'], debit: 109 }, + { account: ['LIABILITIES', 'TAX_RECEIVED'], credit: 9 }, + { account: ['REVENUES', 'SALES'], credit: 100 }, + ], + explanation: [], + configuration: [ + "Account Receivable Account: defined on the customer contact", + "Tax Account: defined on the account from the Sales Taxes set on the product", + "Income Account: defined on the product/product category", + ], + }, + perpetual: { + operations: [ + { account: ['ASSETS', 'INVENTORY'], credit: 50 }, + { account: ['EXPENSES', 'COST'], debit: 50 }, + { account: ['ASSETS', 'RECEIVABLE'], debit: 109 }, + { account: ['LIABILITIES', 'TAX_RECEIVED'], credit: 9 }, + { account: ['REVENUES', 'SALES'], credit: 100 }, + ], + explanation: [], + configuration: [ + "Stock Account: defined on the product category", + "Expense/COGS Account: defined on the product/product category", + "Account Receivable Account: defined on the customer contact", + "Tax Account: defined on the account from the Sales Taxes set on the product", + "Income Account: defined on the product/product category", + ], + }, + }, + }, + manufacturing_order: { + title: "Manufacturing Order (Finished Product at $52, Component at $50)", + continental: { + periodic: { + operations: [], + explanation: [ + "In a periodic inventory valuation manufacturing orders are not directly posted in the accounting.", + "The inventory value is updated when entries are genarted from stock valuation report at closing.", + ], + configuration: [], + }, + perpetual: { + operations: [], + explanation: [ + "No 'Cost of Production' account is set on the production location, therefore variations in" + + " inventories of manufactured goods and components will be recorded at closing.", + ], + configuration: [], + }, + }, + anglo_saxon: { + periodic: { + operations: [], + explanation: [ + "In a periodic inventory valuation manufacturing orders are not directly posted in the accounting.", + "The inventory value is updated when entries are genarted from stock valuation report at closing.", + ], + configuration: [], + }, + perpetual: { + operations: [ + { account: ['ASSETS', 'MANUFACTURED'], debit: 52 }, + { account: ['ASSETS', 'COST'], credit: 52 }, + { account: ['ASSETS', 'RAW'], credit: 50 }, + { account: ['ASSETS', 'COST'], debit: 50 }, + ], + explanation: [], + configuration: [ + "Stock Account for manufactured product: defined on the product category", + "Stock Account for component: defined on the product category", + "Cost of Production Account: defined on the production location", + ], + }, + }, + }, + inventory_loss: { + title: "Inventory Loss (Scrap $30)", + continental: { + periodic: { + operations: [], + explanation: [ + "In a periodic inventory valuation, inventory adjustments are not directly posted in the accounting.", + "The inventory value is updated when entries are generated from stock valuation report at closing.", + ], + configuration: [], + }, + perpetual: { + operations: [], + explanation: [ + "No 'Inventory Loss' account is set on the inventory loss location, therefore variations in" + + " inventories coming from inventory adjustments will be recorded at closing.", + ], + configuration: [], + }, + }, + anglo_saxon: { + periodic: { + operations: [], + explanation: [ + "In a periodic inventory valuation, inventory adjustments are not directly posted in the accounting.", + "The inventory value is updated when entries are generated from stock valuation report at closing.", + ], + configuration: [], + }, + perpetual: { + operations: [ + { account: ['ASSETS', 'INVENTORY'], credit: 30 }, + { account: ['EXPENSES', 'INVENTORY_LOSS'], debit: 30 }, + ], + explanation: [], + configuration: [ + "Stock Account: defined on the product category", + "Inventory Adjustment Account: defined on the inventory loss location", + ], + }, + }, + }, +}); + +/* >Hic sunt dracones< + * + * Reviews are treated almost identically to entry operations in both scripts, + * except for the following difference in behaviour. + * + * [valuation-journal.js] + * The journal chart will use `journal_operations' (unique to `closing') if it + * exists, falling back to `operations' as normal otherwise. It will ignore the + * `entries' and `except' fields. + * + * [valuation-accounting.js] + * The accounting chart will ignore `journal_operations'. If an `entries' or + * `except' field is defined, it will only use that operation if said fields + * match the currently active operations (see above for keys). It must match + * ALL in `entries' and NONE in `except' in order to be used. The commented out + * parts in the `explanation' field (otherwise unused here) are relevant only + * for this chart. + */ +const VALUATION_REVIEWS = Immutable.fromJSButOrdered({ + unreceived: { + title: "Invoices not received", + continental: { + periodic: { + operations: [ + { account: ['LIABILITIES', 'INVOICES_UNRECEIVED'], credit: 50, + entries: ['supplier_reception'], + except: ['supplier_bill'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 50, + entries: ['supplier_reception'], + except: ['supplier_bill'] }, + { account: ['LIABILITIES', 'INVOICES_UNRECEIVED'], credit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + ], + explanation: [ + "These accrual entries are adjusting journal entries made at the end of an accounting period to ensure" + + " that expenses are recognized in the period in which they are incurred, regardless of when cash is paid.", + "Related operations:", + "1) Supplier Goods Reception (PO $50, Bill $50) is done but no bill is received yet", + "2) Supplier Goods Reception (PO $48, Bill $50) is done but no bill is received yet", + ], + configuration: [ + "Expense Account: defined on the product/product category", + "GRNI Account: defined when generating accrual entries from 'Invoices not received'", + ], + }, + perpetual: { + operations: [ + { account: ['LIABILITIES', 'INVOICES_UNRECEIVED'], credit: 50, + entries: ['supplier_reception'], + except: ['supplier_bill'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 50, + entries: ['supplier_reception'], + except: ['supplier_bill'] }, + { account: ['LIABILITIES', 'INVOICES_UNRECEIVED'], credit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + ], + explanation: [ + "These accrual entries are adjusting journal entries made at the end of an accounting period to ensure" + + " that expenses are recognized in the period in which they are incurred, regardless of when cash is paid.", + "They are reverted after the period we are closing.", + "Related operations:", + "1) Supplier Goods Reception (PO $50, Bill $50) is done but no bill is received yet", + "2) Supplier Goods Reception (PO $48, Bill $50) is done but no bill is received yet", + ], + configuration: [ + "Expense Account: defined on the product/product category", + "GRNI Account: defined when generating accrual entries from 'Invoices not received'", + ], + }, + }, + anglo_saxon: { + periodic: { + operations: [ + { account: ['LIABILITIES', 'UNINVOICED'], credit: 50, + entries: ['supplier_reception'], + except: ['supplier_bill'] }, + { account: ['EXPENSES', 'COST'], debit: 50, + entries: ['supplier_reception'], + except: ['supplier_bill'] }, + { account: ['LIABILITIES', 'UNINVOICED'], credit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + { account: ['EXPENSES', 'COST'], debit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + ], + explanation: [ + "These accrual entries are adjusting journal entries made at the end of an accounting period to ensure" + + " that expenses are recognized in the period in which they are incurred, regardless of when cash is paid.", + "Related operations:", + "1) Supplier Goods Reception (PO $50, Bill $50) is done but no bill is received yet", + "2) Supplier Goods Reception (PO $48, Bill $50) is done but no bill is received yet", + ], + configuration: [ + "Expense Account: defined on the product/product category", + "GRNI Account: defined when generating accrual entries from 'Invoices not received'", + ], + }, + perpetual: { + operations: [ + { account: ['LIABILITIES', 'UNINVOICED'], credit: 50, + entries: ['supplier_reception'], + except: ['supplier_bill'] }, + { account: ['ASSETS', 'VARIATIONS'], debit: 50, + entries: ['supplier_reception'], + except: ['supplier_bill'] }, + { account: ['LIABILITIES', 'UNINVOICED'], credit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + { account: ['ASSETS', 'VARIATIONS'], debit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + ], + explanation: [ + "Accrual entries are adjusting journal entries made at the end of an accounting period to ensure" + + " that revenues/expenses are recognized in the period in which they are earned/incurred, regardless of" + + " when cash is received / paid.", + "They are reverted after the period we are closing.", + "From a stock point of view, it also enables us to specify a part of the origin of stock variations (between" + + " Accounting Stock and Inventory Stock) recorded from the stock valuation report.", + "Related operations:", + "1) Supplier Goods Reception (PO $50, Bill $50) is done but no bill is received yet", + "2) Supplier Goods Reception (PO $48, Bill $50) is done but no bill is received yet", + ], + configuration: [ + "Inventory Variation Account: defined on the used Stock Account for the product category", + "GRNI Account: defined when generating accrual entries from 'Invoices not received'", + ], + }, + }, + }, + uninvoiced: { + title: "Invoices to be issued", + continental: { + periodic: { + operations: [ + { account: ['LIABILITIES', 'RECEIVABLE'], debit: 100, + entries: ['customer_shipping'], + except: ['customer_invoice'] }, + { account: ['REVENUES', 'SALES'], credit: 100, + entries: ['customer_shipping'], + except: ['customer_invoice'] }, + ], + explanation: [ + "These accrual entries are adjusting journal entries made at the end of an accounting period to ensure" + + " that revenues are recognized in the period in which they are earned, regardless of when cash is received.", + "Related operation:", + "Customer Shipping (SO $100, Invoice $100, Good Value $50) is done but no invoice is sent yet", + ], + configuration: [ + "Revenue Account: defined on the product/product category", + "Uninvoiced Receivable Account: defined when generating accrual entries from 'Invoices to be issued'", + ], + }, + perpetual: { + operations: [ + { account: ['LIABILITIES', 'RECEIVABLE'], debit: 100, + entries: ['customer_shipping'], + except: ['customer_invoice'] }, + { account: ['REVENUES', 'SALES'], credit: 100, + entries: ['customer_shipping'], + except: ['customer_invoice'] }, + ], + explanation: [ + "These accrual entries are adjusting journal entries made at the end of an accounting period to ensure" + + " that revenues are recognized in the period in which they are earned, regardless of when cash is received.", + "They are reverted after the period we are closing.", + "Related operation:", + "Customer Shipping (SO $100, Invoice $100, Good Value $50) is done but no invoice is sent yet", + ], + configuration: [ + "Revenue Account: defined on the product/product category", + "Uninvoiced Receivable Account: defined when generating accrual entries from 'Invoices to be issued'", + ], + }, + }, + anglo_saxon: { + periodic: { + operations: [ + { account: ['ASSETS', 'UNINVOICED'], debit: 100, + entries: ['customer_shipping'], + except: ['customer_invoice'] }, + { account: ['REVENUES', 'SALES' ], credit: 100, + entries: ['customer_shipping'], + except: ['customer_invoice'] }, + ], + explanation: [ + "These accrual entries are adjusting journal entries made at the end of an accounting period to ensure" + + " that revenues are recognized in the period in which they are earned, regardless of" + + " when cash is received.", + "Related operation:", + "Customer Shipping (SO $100, Invoice $100, Good Value $50) is done but no invoice is sent yet", + ], + configuration: [ + "Revenue Account: defined on the product/product category", + "Uninvoiced Receivable Account: defined when generating accrual entries from 'Invoices to be issued'", + ], + }, + perpetual: { + operations: [ + { account: ['ASSETS', 'UNINVOICED'], debit: 100, + entries: ['customer_shipping'], + except: ['customer_invoice'] }, + { account: ['REVENUES', 'SALES'], credit: 100, + entries: ['customer_shipping'], + except: ['customer_invoice'] }, + { account: ['ASSETS', 'VARIATIONS'], credit: 50, + entries: ['customer_shipping'], + except: ['customer_invoice'] }, + { account: ['EXPENSES', 'COST'], debit: 50, + entries: ['customer_shipping'], + except: ['customer_invoice'] }, + ], + explanation: [ + "These accrual entries are adjusting journal entries made at the end of an accounting period to ensure" + + " that revenues/expenses are recognized in the period in which they are earned/incurred, regardless of" + + " when cash is received/paid.", + "From a stock point of view, it also enables us to specify a part of the origin of stock variations (between" + + " Accounting Stock and Inventory Stock) recorded from the stock valuation report.", + "They are reverted after the period we are closing.", + "Related operation:", + "Customer Shipping (SO $100, Invoice $100, Good Value $50) is done but no invoice is sent yet", + ], + configuration: [ + "Inventory Variation Account: defined on the used Stock Account for the product category", + "Uninvoiced Receivable Account: defined when generating accrual entries from 'Invoices to be issued'", + "Revenue Account: defined on the product/product category", + "Expense/COGS Account: defined on the product/product category", + ], + }, + }, + }, + prepaid: { + title: "Prepaid Expenses", + continental: { + periodic: { + operations: [ + { account: ['LIABILITIES', 'DEFERRED_CHARGES'], debit: 50, + entries: ['supplier_bill'], + except: ['supplier_reception'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], credit: 50, + entries: ['supplier_bill'], + except: ['supplier_reception'] }, + { account: ['LIABILITIES', 'DEFERRED_CHARGES'], debit: 50, + entries: ['supplier_bill_extra'], + except: ['supplier_reception_extra'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], credit: 50, + entries: ['supplier_bill_extra'], + except: ['supplier_reception_extra'] }, + ], + explanation: [ + "Prepaid expenses are journal entries made during closing when a supplier bill is received before goods" + + " or services are received, so the amount is recorded as an asset until the expense is recognized.", + "Related operations:", + "1) Supplier Goods Reception (PO $50, Bill $50) is not done but the bill is received", + "2) Supplier Goods Reception (PO $48, Bill $50) is not done but the bill is received", + ], + configuration: [ + "Expense Account: defined on the product/product category", + "Prepaid Expense Account: defined when generating entries from 'Prepaid Expenses'", + ], + }, + perpetual: { + operations: [ + { account: ['LIABILITIES', 'DEFERRED_CHARGES'], debit: 50, + entries: ['supplier_bill'], + except: ['supplier_reception'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], credit: 50, + entries: ['supplier_bill'], + except: ['supplier_reception'] }, + { account: ['LIABILITIES', 'DEFERRED_CHARGES'], debit: 50, + entries: ['supplier_bill_extra'], + except: ['supplier_reception_extra'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], credit: 50, + entries: ['supplier_bill_extra'], + except: ['supplier_reception_extra'] }, + ], + explanation: [ + "Prepaid expenses are journal entries made during closing when a supplier bill is received before goods" + + " or services are received, so the amount is recorded as an asset until the expense is recognized.", + "Related operations:", + "1) Supplier Goods Reception (PO $50, Bill $50) is not done but the bill is received", + "2) Supplier Goods Reception (PO $48, Bill $50) is not done but the bill is received", + ], + configuration: [ + "Expense Account: defined on the product/product category", + "Prepaid Expense Account: defined when generating entries from 'Prepaid Expenses'", + ], + }, + }, + anglo_saxon: { + periodic: { + operations: [ + { account: ['ASSETS', 'PREPAID'], debit: 50, + entries: ['supplier_bill'], + except: ['supplier_reception'] }, + { account: ['EXPENSES', 'COST'], credit: 50, + entries: ['supplier_bill'], + except: ['supplier_reception'] }, + { account: ['ASSETS', 'PREPAID'], debit: 50, + entries: ['supplier_bill_extra'], + except: ['supplier_reception_extra'] }, + { account: ['EXPENSES', 'COST'], credit: 50, + entries: ['supplier_bill_extra'], + except: ['supplier_reception_extra'] }, + ], + explanation: [ + "Prepaid expenses are journal entries made during closing when a supplier bill is received before goods" + + " or services are received, so the amount is recorded as an asset until the expense is recognized.", + "Related operations:", + "1) Supplier Goods Reception (PO $50, Bill $50) is not done but the bill is received", + "2) Supplier Goods Reception (PO $48, Bill $50) is not done but the bill is received", + ], + configuration: [ + "Expense Account: defined on the product/product category", + "Prepaid Expense Account: defined when generating entries from 'Prepaid Expenses'", + ], + }, + perpetual: { + operations: [ + { account: ['ASSETS', 'PREPAID'], debit: 50, + entries: ['supplier_bill'], + except: ['supplier_reception'] }, + { account: ['ASSETS', 'VARIATIONS'], credit: 50, + entries: ['supplier_bill'], + except: ['supplier_reception'] }, + { account: ['ASSETS', 'PREPAID'], debit: 50, + entries: ['supplier_bill_extra'], + except: ['supplier_reception_extra'] }, + { account: ['ASSETS', 'VARIATIONS'], credit: 50, + entries: ['supplier_bill_extra'], + except: ['supplier_reception_extra'] }, + ], + explanation: [ + "Prepaid expenses are journal entries made during closing when a supplier bill is received before goods" + + " or services are received, so the amount is recorded as an asset until the expense is recognized.", + "From a stock point of view, it also enables us to specify a part of the origin of stock variations (between" + + " Accounting Stock and Inventory Stock) recorded from the stock valuation report.", + "Related operations:", + "1) Supplier Goods Reception (PO $50, Bill $50) is not done but the bill is received", + "2) Supplier Goods Reception (PO $48, Bill $50) is not done but the bill is received", + ], + configuration: [ + "Inventory Variation Account: defined on the used Stock Account for the product category", + "Prepaid Expense Account: defined when generating entries from 'Prepaid Expenses'", + ], + }, + }, + }, + deferred: { + title: "Deferred Revenues", + continental: { + periodic: { + operations: [ + { account: ['LIABILITIES', 'DEFERRED_INCOME'], credit: 100, + entries: ['customer_invoice'], + except: ['customer_shipping'] }, + { account: ['REVENUES', 'SALES'], debit: 100, + entries: ['customer_invoice'], + except: ['customer_shipping'] }, + ], + explanation: [ + "Deferred revenues are journal entries made during closing when an invoice has been issued but goods or" + + " services are not delivered yet, so the amount has to be recorded as a liability until the revenue is earned.", + "They are reverted after the period we are closing.", + "Related operation:", + "Customer Shipping (SO $100, Invoice $100, Good Value $50) is not done but the invoice is sent", + ], + configuration: [ + "Revenue Account: defined on the product/product category", + "Deferred Revenue Account: defined when generating accrual entries from 'Deferred Revenues'", + ], + }, + perpetual: { + operations: [ + { account: ['LIABILITIES', 'DEFERRED_INCOME'], credit: 100, + entries: ['customer_invoice'], + except: ['customer_shipping'] }, + { account: ['REVENUES', 'SALES'], debit: 100, + entries: ['customer_invoice'], + except: ['customer_shipping'] }, + ], + explanation: [ + "Deferred revenues are journal entries made during closing when an invoice has been issued but goods or" + + " services are not delivered yet, so the amount has to be recorded as a liability until the revenue is earned.", + "They are reverted after the period we are closing.", + "Related operation:", + "Customer Shipping (SO $100, Invoice $100, Good Value $50) is not done but the invoice is sent", + ], + configuration: [ + "Revenue Account: defined on the product/product category", + "Deferred Revenue Account: defined when generating accrual entries from 'Deferred Revenues'", + ], + }, + }, + anglo_saxon: { + periodic: { + operations: [ + { account: ['LIABILITIES', 'DEFERRED'], credit: 100, + entries: ['customer_invoice'], + except: ['customer_shipping'] }, + { account: ['REVENUES', 'SALES'], debit: 100, + entries: ['customer_invoice'], + except: ['customer_shipping'] }, + ], + explanation: [ + "Deferred revenues are journal entries made during closing when an invoice has been issued but goods or" + + " services are not delivered yet, so the amount has to be recorded as a liability until the revenue is earned.", + "They are reverted after the period we are closing.", + "Related operation:", + "Customer Shipping (SO $100, Invoice $100, Good Value $50) is not done but the invoice is sent", + ], + configuration: [ + "Revenue Account: defined on the product/product category", + "Deferred Revenue Account: defined when generating accrual entries from 'Deferred Revenues'", + ], + }, + perpetual: { + operations: [ + { account: ['LIABILITIES', 'DEFERRED'], credit: 100, + entries: ['customer_invoice'], + except: ['customer_shipping'] }, + { account: ['REVENUES', 'SALES'], debit: 100, + entries: ['customer_invoice'], + except: ['customer_shipping'] }, + { account: ['ASSETS', 'VARIATIONS'], debit: 50, + entries: ['customer_invoice'], + except: ['customer_shipping'] }, + { account: ['EXPENSES', 'COST'], credit: 50, + entries: ['customer_invoice'], + except: ['customer_shipping'] }, + ], + explanation: [ + "Deferred revenues are journal entries made during closing when an invoice has been issued but goods or" + + " services are not delivered yet, so the amount has to be recorded as a liability until the revenue is earned.", + "From a stock point of view, it also enables us to specify a part of the origin of stock variations (between" + + " Accounting Stock and Inventory Stock) recorded from the stock valuation report.", + "They are reverted after the period we are closing.", + "Related operation:", + "Customer Shipping (SO $100, Invoice $100, Good Value $50) is not done but the invoice is sent", + ], + configuration: [ + "Inventory Variation Account: defined on the used Stock Account for the product category", + "Deferred Revenue Account: defined when generating accrual entries from 'Deferred Revenues'", + "Revenue Account: defined on the product/product category", + "Expense/COGS Account : defined on the product/product category", + ], + }, + }, + }, + closing: { + title: "Closing Entry from Stock Valuation Report", + continental: { + periodic: { + journal_operations: [ + { account: ['STOCK', 'GOODS_FOR_RESALE'], debit: 20 }, + { account: ['EXPENSES', 'CHANGE_IN_GOODS_FOR_RESALE'], credit: 20 }, + { account: ['STOCK', 'FINISHED_GOODS'], debit: 52 }, + { account: ['STOCK', 'RAW'], credit: 50 }, + { account: ['REVENUES', 'CHANGE_IN_FINISHED_GOODS'], credit: 52 }, + { account: ['EXPENSES', 'CHANGE_IN_RAW'], debit: 50 }, + ], + operations: [ + { account: ['STOCK', 'GOODS_FOR_RESALE'], debit: 50, + entries: ['supplier_reception'] }, + { account: ['EXPENSES', 'CHANGE_IN_GOODS_FOR_RESALE'], credit: 50, + entries: ['supplier_reception'] }, + { account: ['STOCK', 'GOODS_FOR_RESALE'], debit: 50, + entries: ['supplier_reception_extra', 'supplier_bill_extra'] }, + { account: ['EXPENSES', 'CHANGE_IN_GOODS_FOR_RESALE'], credit: 50, + entries: ['supplier_reception_extra', 'supplier_bill_extra'] }, + { account: ['STOCK', 'GOODS_FOR_RESALE'], debit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + { account: ['EXPENSES', 'CHANGE_IN_GOODS_FOR_RESALE'], credit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + { account: ['STOCK', 'GOODS_FOR_RESALE'], credit: 50, + entries: ['customer_shipping'] }, + { account: ['EXPENSES', 'CHANGE_IN_GOODS_FOR_RESALE'], debit: 50, + entries: ['customer_shipping'] }, + { account: ['STOCK', 'GOODS_FOR_RESALE'], credit: 30, + entries: ['inventory_loss'] }, + { account: ['EXPENSES', 'CHANGE_IN_GOODS_FOR_RESALE'], debit: 30, + entries: ['inventory_loss'] }, + { account: ['STOCK', 'FINISHED_GOODS'], debit: 52, + entries: ['manufacturing_order'] }, + { account: ['STOCK', 'RAW'], credit: 50, + entries: ['manufacturing_order'] }, + { account: ['REVENUES', 'CHANGE_IN_FINISHED_GOODS'], credit: 52, + entries: ['manufacturing_order'] }, + { account: ['EXPENSES', 'CHANGE_IN_RAW'], debit: 50, + entries: ['manufacturing_order'] }, + ], + explanation: [ + "At closing, Stock Valuation must be updated to reflect reality. This will be done by generating entries from" + + " the Stock Valuation Report. This will recognize value coming from operations such as the following ones:", + "1) Supplier Goods Reception (PO $50, Bill $50)", + "2) Supplier Goods Reception (PO $48, Bill $50)", + "3) Customer Shipping (SO $100, Invoice $100, Good Value $50)", + "4) Inventory Loss (Scrap $30)", + "5) Manufacturing Order (Finished Product at $52, Component at $50)", + ], + configuration: [ + "Stock Account: defined on the product category", + "Inventory Variation Account: defined on the used Stock Account", + ], + }, + perpetual: { + journal_operations: [ + { account: ['STOCK', 'GOODS_FOR_RESALE'], debit: 18 }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], credit: 18 }, + { account: ['STOCK', 'FINISHED_GOODS'], debit: 52 }, + { account: ['EXPENSES', 'FINISHED'], credit: 52 }, + { account: ['STOCK', 'RAW'], credit: 50 }, + { account: ['EXPENSES', 'RAW'], debit: 50 }, + { account: ['EXPENSES', 'CHANGE_IN_GOODS_FOR_RESALE'], credit: 18 }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 18 }, + { account: ['EXPENSES', 'RAW'], credit: 50 }, + { account: ['EXPENSES', 'CHANGE_IN_RAW'], debit: 50 }, + { account: ['EXPENSES', 'FINISHED'], debit: 52 }, + { account: ['REVENUES', 'CHANGE_IN_FINISHED_GOODS'], credit: 52 }, + ], + operations: [ + { account: ['STOCK', 'GOODS_FOR_RESALE'], debit: 50, + entries: ['supplier_reception'], + except: ['supplier_bill'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], credit: 50, + entries: ['supplier_reception'], + except: ['supplier_bill'] }, + { account: ['STOCK', 'GOODS_FOR_RESALE'], debit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], credit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + { account: ['STOCK', 'GOODS_FOR_RESALE'], credit: 50, + entries: ['customer_shipping'], + except: ['customer_invoice'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 50, + entries: ['customer_shipping'], + except: ['customer_invoice'] }, + { account: ['STOCK', 'GOODS_FOR_RESALE'], credit: 30, + entries: ['inventory_loss'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 30, + entries: ['inventory_loss'] }, + { account: ['STOCK', 'FINISHED_GOODS'], debit: 52, + entries: ['manufacturing_order'] }, + { account: ['EXPENSES', 'FINISHED'], credit: 52, + entries: ['manufacturing_order'] }, + { account: ['STOCK', 'RAW'], credit: 50, + entries: ['manufacturing_order'] }, + { account: ['EXPENSES', 'RAW'], debit: 50, + entries: ['manufacturing_order'] }, + // Adjustment + // a) Purchased good for resale + { account: ['EXPENSES', 'CHANGE_IN_GOODS_FOR_RESALE'], credit: 50, + entries: ['supplier_reception'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 50, + entries: ['supplier_reception'] }, + { account: ['EXPENSES', 'CHANGE_IN_GOODS_FOR_RESALE'], credit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + { account: ['EXPENSES', 'CHANGE_IN_GOODS_FOR_RESALE'], credit: 50, + entries: ['supplier_reception_extra', 'supplier_bill_extra'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 50, + entries: ['supplier_reception_extra', 'supplier_bill_extra'] }, + { account: ['EXPENSES', 'CHANGE_IN_GOODS_FOR_RESALE'], debit: 50, + entries: ['customer_shipping'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], credit: 50, + entries: ['customer_shipping'] }, + { account: ['EXPENSES', 'CHANGE_IN_GOODS_FOR_RESALE'], debit: 30, + entries: ['inventory_loss'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], credit: 30, + entries: ['inventory_loss'] }, + // b) Component + { account: ['EXPENSES', 'RAW'], credit: 50, + entries: ['manufacturing_order'] }, + { account: ['EXPENSES', 'CHANGE_IN_RAW'], debit: 50, + entries: ['manufacturing_order'] }, + // c) Finished product + { account: ['EXPENSES', 'FINISHED'], debit: 52, + entries: ['manufacturing_order'] }, + { account: ['REVENUES', 'CHANGE_IN_FINISHED_GOODS'], credit: 52, + entries: ['manufacturing_order'] }, + // Second half, excluded from journal chart + { account: ['STOCK', 'GOODS_FOR_RESALE'], credit: 50, + entries: ['supplier_bill'], + except: ['supplier_reception'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 50, + entries: ['supplier_bill'], + except: ['supplier_reception'] }, + { account: ['STOCK', 'GOODS_FOR_RESALE'], credit: 50, + entries: ['supplier_bill_extra'], + except: ['supplier_reception_extra'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], debit: 50, + entries: ['supplier_bill_extra'], + except: ['supplier_reception_extra'] }, + { account: ['STOCK', 'GOODS_FOR_RESALE'], debit: 50, + entries: ['customer_invoice'], + except: ['customer_shipping'] }, + { account: ['EXPENSES', 'GOODS_FOR_RESALE'], credit: 50, + entries: ['customer_invoice'], + except: ['customer_shipping'] }, + ], + explanation: [ + "At closing Accounting Stock and Inventory Stock must have the same value.", + "A difference could come from cases such as the ones listed below and this will be corrected thanks to" + + " the Stock Valuation Report closing entry.", + "1) Supplier Goods Reception (PO $50, Bill $50) is done but no bill is received yet", + "2) Supplier Goods Reception (PO $48, Bill $50) is done but no bill is received yet", + "3) Customer Shipping (SO $100, Invoice $100, Good Value $50) is done but no invoice is sent yet", + "4) Inventory Loss (Scrap $30)", + "5) Manufacturing Order (Finished Product at $52, Component at $50)", + "At closing, an adjusting entry is created to ensure that the values are correctly recorded in the" + + " variation and expenses accounts according to continental accounting logic. Indeed, even though" + + " expenses are recorded according to the COGS logic of Anglo-Saxon accounting during the period," + + " at closing the expenses recorded should represent what was actually purchased during this period.", + "The variation is known thanks to the calculation (Stock Account y - Stock Account y-1) for each of" + + " the following categories:", + "a. Purchased good for resale", + "b. Component", + "c. Finished product", + // "6) Supplier Goods Reception (PO $50, Bill $50) is not done but the bill is received", + // "7) Supplier Goods Reception (PO $48, Bill $50) is not done but the bill is received", + // "8) Customer Shipping (SO $100, Invoice $100, Good Value $50) is not done but the invoice is sent", + ], + configuration: [ + "Expense Account: defined on the product/product category", + "Stock Account: defined on the product category", + "Inventory Variation Account: defined on the used Stock Account", + "Expense Account for adjusting entry: defined on the used Stock Account", + ], + }, + }, + anglo_saxon: { + periodic: { + journal_operations: [ + { account: ['ASSETS', 'INVENTORY'], debit: 50 }, + { account: ['EXPENSES', 'COST'], credit: 50 }, + { account: ['ASSETS', 'INVENTORY'], credit: 30 }, + { account: ['EXPENSES', 'INVENTORY_LOSS'], debit: 30 }, + { account: ['ASSETS', 'MANUFACTURED'], debit: 52 }, + { account: ['ASSETS', 'COST'], credit: 52 }, + { account: ['ASSETS', 'RAW'], credit: 50 }, + { account: ['ASSETS', 'COST'], debit: 50 }, + ], + operations: [ + { account: ['ASSETS', 'INVENTORY'], debit: 50, + entries: ['supplier_reception'] }, + { account: ['EXPENSES', 'COST'], credit: 50, + entries: ['supplier_reception'] }, + { account: ['ASSETS', 'INVENTORY'], debit: 50, + entries: ['supplier_reception_extra', 'supplier_bill_extra'] }, + { account: ['EXPENSES', 'COST'], credit: 50, + entries: ['supplier_reception_extra', 'supplier_bill_extra'] }, + { account: ['ASSETS', 'INVENTORY'], debit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + { account: ['EXPENSES', 'COST'], credit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + { account: ['ASSETS', 'INVENTORY'], credit: 50, + entries: ['customer_shipping'] }, + { account: ['EXPENSES', 'COST'], debit: 50, + entries: ['customer_shipping'] }, + { account: ['ASSETS', 'INVENTORY'], credit: 30, + entries: ['inventory_loss'] }, + { account: ['EXPENSES', 'INVENTORY_LOSS'], debit: 30, + entries: ['inventory_loss'] }, + { account: ['ASSETS', 'MANUFACTURED'], debit: 52, + entries: ['manufacturing_order'] }, + { account: ['ASSETS', 'COST'], credit: 52, + entries: ['manufacturing_order'] }, + { account: ['ASSETS', 'RAW'], credit: 50, + entries: ['manufacturing_order'] }, + { account: ['ASSETS', 'COST'], debit: 50, + entries: ['manufacturing_order'] }, + ], + explanation: [ + "At closing, Stock Valuation must be updated to reflect reality. This will be done by generating entries from" + + " the Stock Valuation Report. This will recognize value coming from operations such as the following ones:", + "1) Supplier Goods Reception (PO $50, Bill $50)", + "2) Supplier Goods Reception (PO $48, Bill $50)", + "3) Customer Shipping (SO $100, Invoice $100, Good Value $50)", + "4) Inventory Loss (Scrap $30)", + "5) Manufacturing Order (Finished Product at $52, Component at $50)", + ], + configuration: [ + "Stock Account: defined on the product category", + "Inventory Variation Account: defined on the used Stock Account", + "Inventory Adjustment Account: defined on the Inventory Loss location", + "Cost of Production Account: defined on the Production location", + ], + }, + perpetual: { + journal_operations: [ + { account: ['ASSETS', 'INVENTORY'], debit: 48 }, + { account: ['ASSETS', 'VARIATIONS'], credit: 48 }, + ], + operations: [ + { account: ['ASSETS', 'INVENTORY'], debit: 50, + entries: ['supplier_reception'], + except: ['supplier_bill'] }, + { account: ['ASSETS', 'VARIATIONS'], credit: 50, + entries: ['supplier_reception'], + except: ['supplier_bill'] }, + { account: ['ASSETS', 'INVENTORY'], debit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + { account: ['ASSETS', 'VARIATIONS'], credit: 48, + entries: ['supplier_reception_extra'], + except: ['supplier_bill_extra'] }, + { account: ['ASSETS', 'INVENTORY'], credit: 50, + entries: ['customer_shipping'], + except: ['customer_invoice'] }, + { account: ['ASSETS', 'VARIATIONS'], debit: 50, + entries: ['customer_shipping'], + except: ['customer_invoice'] }, + { account: ['ASSETS', 'INVENTORY'], credit: 50, + entries: ['supplier_bill'], + except: ['supplier_reception'] }, + { account: ['ASSETS', 'VARIATIONS'], debit: 50, + entries: ['supplier_bill'], + except: ['supplier_reception'] }, + { account: ['ASSETS', 'INVENTORY'], credit: 50, + entries: ['supplier_bill_extra'], + except: ['supplier_reception_extra'] }, + { account: ['ASSETS', 'VARIATIONS'], debit: 50, + entries: ['supplier_bill_extra'], + except: ['supplier_reception_extra'] }, + { account: ['ASSETS', 'INVENTORY'], debit: 50, + entries: ['customer_invoice'], + except: ['customer_shipping'] }, + { account: ['ASSETS', 'VARIATIONS'], credit: 50, + entries: ['customer_invoice'], + except: ['customer_shipping'] }, + ], + explanation: [ + "At closing, Accounting Stock and Inventory Stock must have the same value.", + "A difference could come from cases such as the ones listed below and this will be corrected thanks to" + + " the Stock Valuation Report closing entry.", + "Related operations:", + "1) Supplier Goods Reception (PO $50, Bill $50) is done but no bill is received yet", + "2) Supplier Goods Reception (PO $48, Bill $50) is done but no bill is received yet", + "3) Customer Shipping (SO $100, Invoice $100, Good Value $50) is done but no invoice is sent yet", + // "4) Supplier Goods Reception (PO $50, Bill $50) is not done but the bill is received", + // "5) Supplier Goods Reception (PO $48, Bill $50) is not done but the bill is received", + // "6) Customer Shipping (SO $100, Invoice $100, Good Value $50) is not done but the invoice is sent", + ], + configuration: [ + "Stock Account: defined on the product category", + "Inventory Variation Account: defined on the used Stock Account", + ], + }, + }, + }, +}); diff --git a/static/js/valuation-journal.js b/static/js/valuation-journal.js new file mode 100644 index 0000000000..74920bd0b6 --- /dev/null +++ b/static/js/valuation-journal.js @@ -0,0 +1,173 @@ +/* global Immutable, React */ +/* global createAtom, findAncestor */ +/* global VALUATION_{STANDARDS,METHODS,JOURNALS,ENTRIES,REVIEWS} */ +(function () { + 'use strict'; + // NOTE: used by valuation cheat_sheet.rst + + const mode = createAtom(['continental', 'periodic']); + const data = createAtom(Immutable.Map()); + + function watch (next) { + React.render( + React.createElement(Controls, { entry: next }), + document.getElementById('journaling-entries-controls')); + React.render( + React.createElement(FormatEntry, { entry: next }), + document.querySelector('.journal-entries')); + } + + data.addWatch('chart', (k, m, prev, next) => watch(next.getIn(mode.deref()))); + mode.addWatch('chart', (k, m, prev, next) => watch(data.deref().getIn(next, Immutable.Map()))); + + document.addEventListener('DOMContentLoaded', function () { + const entriesSection = findAncestor(document.querySelector('.journal-entries'), 'section'); + if (!entriesSection) { return; } + + const controls = document.createElement('div'); + controls.setAttribute('id', 'journaling-entries-controls'); + entriesSection.insertBefore(controls, entriesSection.lastElementChild); + + data.reset(VALUATION_ENTRIES.first().getIn(['continental', 'periodic'])); + }); + + const Controls = React.createClass({ + render: function () { + const entry = this.props.entry; + return React.DOM.div( + null, + React.DOM.b(null, 'Choose a standard:'), + VALUATION_STANDARDS.map(function (item, index) { + return React.DOM.label( + { key: index }, + React.DOM.input({ + type: 'radio', + checked: item.get('name') === mode.deref()[0], + onChange: function (e) { + const newValue = item.get('name'); + mode.reset([newValue, newValue === 'continental' ? 'periodic' : 'perpetual']); + } + }), + ' ', + item.get('text') + ); + }), + React.DOM.br(), + React.DOM.b(null, 'Choose an accounting method:'), + VALUATION_METHODS.map(function (item, index) { + return React.DOM.label( + { key: index }, + React.DOM.input({ + type: 'radio', + checked: item.get('name') === mode.deref()[1], + onChange: e => mode.swap(vals => [vals[0], item.get('name')]), + }), + ' ', + item.get('text') + ); + }), + React.DOM.br(), + React.DOM.b(null, 'Activate operations to see the impact:'), + React.DOM.br(), React.DOM.br(), + 'Operations', + VALUATION_ENTRIES.map(function (item, index) { + return React.DOM.label( + { key: index }, + React.DOM.input({ + type: 'radio', + checked: item.getIn(mode.deref()) === entry, + onChange: e => data.reset(item), + }), + ' ', + item.get('title') + ); + }), + React.DOM.br(), + 'Review', + VALUATION_REVIEWS.map(function (item, index) { + return React.DOM.label( + { key: index }, + React.DOM.input({ + type: 'radio', + checked: item.getIn(mode.deref()) === entry, + onChange: e => data.reset(item), + }), + ' ', + item.get('title') + ); + }), + React.DOM.br(), + ); + } + }); + const FormatEntry = React.createClass({ + render: function () { + const entry = this.props.entry; + return React.DOM.div( + null, + React.DOM.table( + { className: 'table table-sm d-c-table' }, + React.DOM.thead( + null, + React.DOM.tr( + null, + React.DOM.th(), + React.DOM.th(null, "Debit"), + React.DOM.th(null, "Credit"), + ) + ), + React.DOM.tbody( + null, + entry && entry.get('journal_operations', entry.get('operations', [])).map(this.renderRow) + ) + ), + React.createElement(Listing, { + heading: "Explanation", + items: entry && entry.get('explanation'), + }), + React.createElement(Listing, { + heading: "Configuration", + items: entry && entry.get('configuration'), + }) + ); + }, + renderRow: function (entry, index) { + if (!entry) { + return React.DOM.tr( + { key: 'spacer-' + index }, + React.DOM.td({ colSpan: 3 }, "\u00A0") + ); + } + const journalEntry = VALUATION_JOURNALS.getIn([mode.deref()[0], ...entry.get('account')]); + const title = journalEntry.get('title'); + // Don't display 0 for 'General Balance for Inventory Initial Value' + const code = journalEntry.get('code') || ''; + return React.DOM.tr( + { key: index }, + React.DOM.td(null, `${code} ${title}`), + React.DOM.td(null, entry.get('debit')), + React.DOM.td(null, entry.get('credit')) + ); + } + }); + const Listing = React.createClass({ + render: function () { + if (!this.props.items || this.props.items.isEmpty()) { + return React.DOM.div(); + } + const items = this.props.items; + const idx = items.indexOf(null); + if (idx !== -1) { + console.log(items.slice(idx + 1).deref()); + items = items.take(idx); + } + return React.DOM.div( + { className: 'entries-listing' }, + React.DOM.h4(null, this.props.heading, ':'), + items.map(function (item, index) { + return React.DOM.p({ key: index }, item); + }) + ); + } + }); +}());