You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

232 lines
12 KiB

# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Anfas Faisal K (odoo@cybrosys.info)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import fields, models
class StockLandedCost(models.Model):
"""Inherits 'stock.landed.cost' model to add additional functionality
related to cancelling and resetting landed cost records.
Methods:
action_landed_cost_cancel: Cancels the landed cost record by deleting
its associated accounting entries, stock valuation, and changes state
to 'cancelled.
action_landed_cost_reset_and_cancel: Resets the landed cost record by
deleting its associated accounting entries and stock valuation.
It changes the state back to 'draft'.
action_landed_cost_cancel_and_delete: Deletes the landed cost record by
deleting its associated accounting entries and stock valuation. It also
deletes the Landed cost record.
action_landed_cost_cancel_form: Cancels the landed cost record and
deletes its associated accounting entries and stock valuation.
It also creates two entries to revert back to the original cost price,
which are also deleted in the process.
"""
_inherit = 'stock.landed.cost'
is_cancel = fields.Boolean(string='Cancel', default=False,
help='If the user clicks the "Cancel" button'
'once, it will hide the button and make'
'it invisible.')
def action_landed_cost_cancel(self):
"""Cancels the landed cost record by deleting its associated
accounting entries, stock valuation, and changes state to 'cancelled'.
Additionally, it reverts the original cost price by creating two
entries, which are also deleted in the process.
"""
for rec in self:
for line in rec.valuation_adjustment_lines.filtered(
lambda line: line.move_id):
product = line.move_id.product_id
if product.cost_method == 'average':
original_price = product.standard_price
new_price = product.standard_price - line.additional_landed_cost
product.write({'standard_price': new_price})
stock_valuation_layer = self.env['stock.valuation.layer'] \
.search([('product_id', '=', product.id),
('description', '=', f'Product value manually '
f'modified (from {original_price} to {new_price})')],
limit=1)
if stock_valuation_layer:
stock_valuation_layer.account_move_id.button_draft()
stock_valuation_layer.account_move_id.sudo().unlink()
stock_valuation_layer.sudo().unlink()
if rec.account_move_id:
account_id = rec.account_move_id
account_move_ids = account_id.line_ids
if account_move_ids:
account_id.sudo().write(
{'state': 'draft', 'name': 'Delete Sequence Number'})
account_move_ids.sudo().unlink()
account_id.sudo().unlink()
if rec.valuation_adjustment_lines:
rec.valuation_adjustment_lines.unlink()
if rec.stock_valuation_layer_ids:
rec.stock_valuation_layer_ids.sudo().unlink()
rec.write({'state': 'cancel'})
def action_landed_cost_reset_and_cancel(self):
"""Resets the landed cost record by deleting its associated accounting
entries and stock valuation. It changes the state back to 'draft'.
Additionally, it reverts the original cost price by creating two entries,
which are also deleted in the process.
"""
for rec in self:
for line in rec.valuation_adjustment_lines.filtered(
lambda line: line.move_id):
product = line.move_id.product_id
if product.cost_method == 'average':
original_price = product.standard_price
new_price = product.standard_price - line.additional_landed_cost
product.write({'standard_price': new_price})
stock_valuation_layer = self.env['stock.valuation.layer'] \
.search([('product_id', '=', product.id),
('description', '=', f'Product value manually '
f'modified (from {original_price} to {new_price})')],
limit=1)
if stock_valuation_layer:
stock_valuation_layer.account_move_id.button_draft()
stock_valuation_layer.account_move_id.sudo().unlink()
stock_valuation_layer.sudo().unlink()
if rec.account_move_id:
account_id = rec.account_move_id
account_move_ids = account_id.line_ids
if account_move_ids:
account_id.sudo().write(
{'state': 'draft', 'name': 'Delete Sequence Number'})
account_move_ids.sudo().unlink()
account_id.sudo().unlink()
if rec.valuation_adjustment_lines:
rec.valuation_adjustment_lines.unlink()
if rec.stock_valuation_layer_ids:
rec.sudo().stock_valuation_layer_ids.unlink()
rec.write({'state': 'draft'})
def action_landed_cost_cancel_and_delete(self):
"""Deletes the landed cost record by deleting its associated accounting
entries and stock valuation. It also deletes the Landed cost record.
Additionally, it reverts the original cost price by creating two
entries, which are also deleted in the process.
"""
for rec in self:
for line in rec.valuation_adjustment_lines.filtered(
lambda line: line.move_id):
product = line.move_id.product_id
if product.cost_method == 'average':
original_price = product.standard_price
new_price = product.standard_price - line.additional_landed_cost
product.write({'standard_price': new_price})
stock_valuation_layer = self.env['stock.valuation.layer'] \
.search([('product_id', '=', product.id),
('description', '=', f'Product value manually '
f'modified (from {original_price} to {new_price})')],
limit=1)
if stock_valuation_layer:
stock_valuation_layer.account_move_id.button_draft()
stock_valuation_layer.account_move_id.sudo().unlink()
stock_valuation_layer.sudo().unlink()
if rec.account_move_id:
account_id = rec.account_move_id
account_move_ids = account_id.line_ids
if account_move_ids:
account_id.sudo().write(
{'state': 'draft', 'name': 'Delete Sequence Number'})
account_move_ids.sudo().unlink()
account_id.sudo().unlink()
if rec.valuation_adjustment_lines:
rec.valuation_adjustment_lines.unlink()
if rec.stock_valuation_layer_ids:
rec.sudo().stock_valuation_layer_ids.unlink()
rec.write({'state': 'cancel'})
rec.unlink()
def action_landed_cost_cancel_form(self):
"""Cancels the landed cost record and deletes its associated
accounting entries and stock valuation. It also creates two entries
to revert back to the original cost price, which are also deleted in
the process.
The specific action performed depends on the value of the
'cancel_landed_cost_odoo.land_cost_cancel_modes'
configuration parameter:
- 'cancel': Changes the landed cost state to 'cancel' and sets
the 'is_cancel' flag to True.
- 'cancel_draft': Changes the landed cost state to 'draft'
and sets the 'is_cancel' flag to False.
- 'cancel_delete': Deletes the landed cost record and returns an
action to open the Landed Cost tree view.
"""
for rec in self:
for line in rec.valuation_adjustment_lines.filtered(
lambda line: line.move_id):
product = line.move_id.product_id
if product.cost_method == 'average':
original_price = product.standard_price
new_price = product.standard_price - line.additional_landed_cost
product.write({'standard_price': new_price})
stock_valuation_layer = self.env['stock.valuation.layer'] \
.search([('product_id', '=', product.id),
('description', '=', f'Product value manually '
f'modified (from {original_price} to {new_price})')],
limit=1)
if stock_valuation_layer:
stock_valuation_layer.account_move_id.button_draft()
stock_valuation_layer.account_move_id.sudo().unlink()
stock_valuation_layer.sudo().unlink()
if self.account_move_id:
account_id = self.account_move_id
account_move_ids = account_id.line_ids
if account_move_ids:
account_id.sudo().write(
{'state': 'draft', 'name': 'Delete Sequence Number'})
account_move_ids.sudo().unlink()
account_id.sudo().unlink()
if self.valuation_adjustment_lines:
self.valuation_adjustment_lines.unlink()
if self.stock_valuation_layer_ids:
self.sudo().stock_valuation_layer_ids.unlink()
landed_mode = self.env['ir.config_parameter'].sudo().get_param(
'cancel_landed_cost_odoo.land_cost_cancel_modes')
if landed_mode == 'cancel':
self.write({'state': 'cancel'})
self.is_cancel = True
if landed_mode == 'cancel_draft':
self.write({'state': 'draft'})
self.is_cancel = False
if landed_mode == 'cancel_delete':
self.write({'state': 'cancel'})
self.unlink()
return {
'name': 'Landed Cost',
'type': 'ir.actions.act_window',
'res_model': 'stock.landed.cost',
'view_mode': 'tree,form',
'target': 'current'
}