diff --git a/addons/stock_account/models/stock.py b/addons/stock_account/models/stock.py index 284fde84d75dc45794e3ad20000a5ae617f37986..c29215f2b79e5060e216e4df03870fead07c7899 100644 --- a/addons/stock_account/models/stock.py +++ b/addons/stock_account/models/stock.py @@ -123,7 +123,7 @@ class StockMoveLine(models.Model): move_id.write(move_vals) if move_id.product_id.valuation == 'real_time': - move_id.with_context(force_valuation_amount=correction_value)._account_entry_move() + move_id.with_context(force_valuation_amount=correction_value, forced_quantity=qty_difference)._account_entry_move() if qty_difference > 0: move_id.product_price_update_before_done(forced_qty=qty_difference) return super(StockMoveLine, self).write(vals) @@ -453,9 +453,9 @@ class StockMove(models.Model): # The correction should behave as a return too. As `_account_entry_move` # will post the natural values for an IN move (credit IN account, debit # OUT one), we inverse the sign to create the correct entries. - move.with_context(force_valuation_amount=-corrected_value)._account_entry_move() + move.with_context(force_valuation_amount=-corrected_value, forced_quantity=0)._account_entry_move() else: - move.with_context(force_valuation_amount=corrected_value)._account_entry_move() + move.with_context(force_valuation_amount=corrected_value, forced_quantity=0)._account_entry_move() @api.model def _run_fifo_vacuum(self): @@ -514,6 +514,11 @@ class StockMove(models.Model): else: valuation_amount = cost + if self._context.get('forced_ref'): + ref = self._context['forced_ref'] + else: + ref = self.picking_id.name + # the standard_price of the product may be in another decimal precision, or not compatible with the coinage of # the company currency... so we need to use round() before creating the accounting entries. debit_value = self.company_id.currency_id.round(valuation_amount) @@ -540,7 +545,7 @@ class StockMove(models.Model): 'product_id': self.product_id.id, 'quantity': qty, 'product_uom_id': self.product_id.uom_id.id, - 'ref': self.picking_id.name, + 'ref': ref, 'partner_id': partner_id, 'debit': debit_value if debit_value > 0 else 0, 'credit': -debit_value if debit_value < 0 else 0, @@ -551,7 +556,7 @@ class StockMove(models.Model): 'product_id': self.product_id.id, 'quantity': qty, 'product_uom_id': self.product_id.uom_id.id, - 'ref': self.picking_id.name, + 'ref': ref, 'partner_id': partner_id, 'credit': credit_value if credit_value > 0 else 0, 'debit': -credit_value if credit_value < 0 else 0, @@ -571,7 +576,7 @@ class StockMove(models.Model): 'product_id': self.product_id.id, 'quantity': qty, 'product_uom_id': self.product_id.uom_id.id, - 'ref': self.picking_id.name, + 'ref': ref, 'partner_id': partner_id, 'credit': diff_amount > 0 and diff_amount or 0, 'debit': diff_amount < 0 and -diff_amount or 0, @@ -583,14 +588,25 @@ class StockMove(models.Model): def _create_account_move_line(self, credit_account_id, debit_account_id, journal_id): self.ensure_one() AccountMove = self.env['account.move'] - move_lines = self._prepare_account_move_line(self.product_qty, abs(self.value), credit_account_id, debit_account_id) + quantity = self.env.context.get('forced_quantity', self.product_qty if self._is_in() else -1 * self.product_qty) + + # Make an informative `ref` on the created account move to differentiate between classic + # movements, vacuum and edition of past moves. + ref = self.picking_id.name + if self.env.context.get('force_valuation_amount'): + if self.env.context.get('forced_quantity') == 0: + ref = 'Revaluation of %s (negative inventory)' % ref + elif self.env.context.get('forced_quantity') is not None: + ref = 'Correction of %s (modification of past move)' % ref + + move_lines = self.with_context(forced_ref=ref)._prepare_account_move_line(quantity, abs(self.value), credit_account_id, debit_account_id) if move_lines: date = self._context.get('force_period_date', fields.Date.context_today(self)) new_account_move = AccountMove.create({ 'journal_id': journal_id, 'line_ids': move_lines, 'date': date, - 'ref': self.picking_id.name, + 'ref': ref, 'stock_move_id': self.id, }) new_account_move.post() diff --git a/addons/stock_account/tests/test_stockvaluation.py b/addons/stock_account/tests/test_stockvaluation.py index 5d20a17f2bf2949f7c86f7dc6aa3fb98b116239d..417acb745149167b3c3777f5378916ddc4c169d0 100644 --- a/addons/stock_account/tests/test_stockvaluation.py +++ b/addons/stock_account/tests/test_stockvaluation.py @@ -115,6 +115,9 @@ class TestStockValuation(TransactionCase): self.assertEqual(len(valuation_aml), 1) self.assertEqual(move1_valuation_aml.debit, 100) self.assertEqual(move1_valuation_aml.credit, 0) + self.assertEqual(move1_valuation_aml.product_id.id, self.product1.id) + self.assertEqual(move1_valuation_aml.quantity, 10) + self.assertEqual(move1_valuation_aml.product_uom_id.id, self.uom_unit.id) output_aml = self._get_stock_output_move_lines() self.assertEqual(len(output_aml), 0) @@ -159,6 +162,9 @@ class TestStockValuation(TransactionCase): self.assertEqual(len(valuation_aml), 2) self.assertEqual(move2_valuation_aml.debit, 80) self.assertEqual(move2_valuation_aml.credit, 0) + self.assertEqual(move2_valuation_aml.product_id.id, self.product1.id) + self.assertEqual(move2_valuation_aml.quantity, 10) + self.assertEqual(move2_valuation_aml.product_uom_id.id, self.uom_unit.id) output_aml = self._get_stock_output_move_lines() self.assertEqual(len(output_aml), 0) @@ -207,6 +213,9 @@ class TestStockValuation(TransactionCase): self.assertEqual(len(valuation_aml), 3) self.assertEqual(move3_valuation_aml.debit, 0) self.assertEqual(move3_valuation_aml.credit, 30) + self.assertEqual(move3_valuation_aml.product_id.id, self.product1.id) + self.assertEqual(move3_valuation_aml.quantity, -3) + self.assertEqual(move3_valuation_aml.product_uom_id.id, self.uom_unit.id) output_aml = self._get_stock_output_move_lines() move3_output_aml = output_aml[-1] @@ -258,6 +267,9 @@ class TestStockValuation(TransactionCase): self.assertEqual(len(valuation_aml), 4) self.assertEqual(move1_correction_valuation_aml.debit, 20) self.assertEqual(move1_correction_valuation_aml.credit, 0) + self.assertEqual(move1_correction_valuation_aml.product_id.id, self.product1.id) + self.assertEqual(move1_correction_valuation_aml.quantity, 2) + self.assertEqual(move1_correction_valuation_aml.product_uom_id.id, self.uom_unit.id) output_aml = self._get_stock_output_move_lines() self.assertEqual(len(output_aml), 1) @@ -311,6 +323,9 @@ class TestStockValuation(TransactionCase): self.assertEqual(len(valuation_aml), 5) self.assertEqual(move4_valuation_aml.debit, 0) self.assertEqual(move4_valuation_aml.credit, 90) + self.assertEqual(move4_valuation_aml.product_id.id, self.product1.id) + self.assertEqual(move4_valuation_aml.quantity, -9) + self.assertEqual(move4_valuation_aml.product_uom_id.id, self.uom_unit.id) output_aml = self._get_stock_output_move_lines() move4_output_aml = output_aml[-1] @@ -373,6 +388,9 @@ class TestStockValuation(TransactionCase): self.assertEqual(len(valuation_aml), 6) self.assertEqual(move5_valuation_aml.debit, 0) self.assertEqual(move5_valuation_aml.credit, 160) + self.assertEqual(move5_valuation_aml.product_id.id, self.product1.id) + self.assertEqual(move5_valuation_aml.quantity, -20) + self.assertEqual(move5_valuation_aml.product_uom_id.id, self.uom_unit.id) output_aml = self._get_stock_output_move_lines() move5_output_aml = output_aml[-1] @@ -445,6 +463,9 @@ class TestStockValuation(TransactionCase): self.assertEqual(len(valuation_aml), 7) self.assertEqual(move6_valuation_aml.debit, 120) self.assertEqual(move6_valuation_aml.credit, 0) + self.assertEqual(move6_valuation_aml.product_id.id, self.product1.id) + self.assertEqual(move6_valuation_aml.quantity, 10) + self.assertEqual(move6_valuation_aml.product_uom_id.id, self.uom_unit.id) output_aml = self._get_stock_output_move_lines() self.assertEqual(len(output_aml), 3) @@ -495,6 +516,9 @@ class TestStockValuation(TransactionCase): vacuum_valuation_aml = valuation_aml[-1] self.assertEqual(len(valuation_aml), 8) self.assertEqual(vacuum_valuation_aml.balance, -40) + self.assertEqual(vacuum_valuation_aml.product_id.id, self.product1.id) + self.assertEqual(vacuum_valuation_aml.quantity, 0) + self.assertEqual(vacuum_valuation_aml.product_uom_id.id, self.uom_unit.id) output_aml = self._get_stock_output_move_lines() vacuum_output_aml = output_aml[-1] @@ -570,6 +594,9 @@ class TestStockValuation(TransactionCase): move6_correction_valuation_aml = valuation_aml[-1] self.assertEqual(move6_correction_valuation_aml.debit, 0) self.assertEqual(move6_correction_valuation_aml.credit, 24) + self.assertEqual(move6_correction_valuation_aml.product_id.id, self.product1.id) + self.assertEqual(move6_correction_valuation_aml.quantity, -2) + self.assertEqual(move6_correction_valuation_aml.product_uom_id.id, self.uom_unit.id) # link between stock move and account move self.assertEqual(len(move6.account_move_ids), 2) @@ -611,6 +638,9 @@ class TestStockValuation(TransactionCase): self.assertEqual(len(valuation_aml), 10) self.assertEqual(move7_valuation_aml.debit, 60) self.assertEqual(move7_valuation_aml.credit, 0) + self.assertEqual(move7_valuation_aml.product_id.id, self.product1.id) + self.assertEqual(move7_valuation_aml.quantity, 4) + self.assertEqual(move7_valuation_aml.product_uom_id.id, self.uom_unit.id) # link between stock move and account move self.assertEqual(len(move7.account_move_ids), 1) @@ -633,6 +663,9 @@ class TestStockValuation(TransactionCase): self.assertEqual(len(valuation_aml), 11) self.assertEqual(move6_correction2_valuation_aml.debit, 0) self.assertEqual(move6_correction2_valuation_aml.credit, 6) + self.assertEqual(move6_correction2_valuation_aml.product_id.id, self.product1.id) + self.assertEqual(move6_correction2_valuation_aml.quantity, 0) + self.assertEqual(move6_correction_valuation_aml.product_uom_id.id, self.uom_unit.id) # stock_account values self.assertEqual(move1.product_uom_qty, 12) diff --git a/addons/stock_landed_costs/models/stock_landed_cost.py b/addons/stock_landed_costs/models/stock_landed_cost.py index a4a73ef79c8e0175182bb5ac9f20e0b0e5b4ffcc..7522b46b6f88ad70226c2146212798722718ae25 100644 --- a/addons/stock_landed_costs/models/stock_landed_cost.py +++ b/addons/stock_landed_costs/models/stock_landed_cost.py @@ -103,6 +103,7 @@ class LandedCost(models.Model): new_landed_cost_value = line.move_id.landed_cost_value + line.additional_landed_cost line.move_id.write({ 'landed_cost_value': new_landed_cost_value, + 'value': line.move_id.value + cost_to_add, 'remaining_value': line.move_id.remaining_value + cost_to_add, 'price_unit': (line.move_id.value + new_landed_cost_value) / line.move_id.product_qty, }) @@ -321,7 +322,7 @@ class AdjustmentLines(models.Model): 'name': self.name, 'move_id': move.id, 'product_id': self.product_id.id, - 'quantity': self.quantity, + 'quantity': 0, } debit_line = dict(base_line, account_id=debit_account_id) credit_line = dict(base_line, account_id=credit_account_id) @@ -340,11 +341,11 @@ class AdjustmentLines(models.Model): if qty_out > 0: debit_line = dict(base_line, name=(self.name + ": " + str(qty_out) + _(' already out')), - quantity=qty_out, + quantity=0, account_id=already_out_account_id) credit_line = dict(base_line, name=(self.name + ": " + str(qty_out) + _(' already out')), - quantity=qty_out, + quantity=0, account_id=debit_account_id) diff = diff * qty_out / self.quantity if diff > 0: @@ -361,11 +362,11 @@ class AdjustmentLines(models.Model): if self.env.user.company_id.anglo_saxon_accounting: debit_line = dict(base_line, name=(self.name + ": " + str(qty_out) + _(' already out')), - quantity=qty_out, + quantity=0, account_id=credit_account_id) credit_line = dict(base_line, name=(self.name + ": " + str(qty_out) + _(' already out')), - quantity=qty_out, + quantity=0, account_id=already_out_account_id) if diff > 0: