diff --git a/stock_revaluation_fifo_lot/__init__.py b/stock_revaluation_fifo_lot/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/stock_revaluation_fifo_lot/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/stock_revaluation_fifo_lot/__manifest__.py b/stock_revaluation_fifo_lot/__manifest__.py new file mode 100644 index 0000000..0dd06ac --- /dev/null +++ b/stock_revaluation_fifo_lot/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Quartile (https://www.quartile.co) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Stock Revaluation FIFO Lot", + "version": "16.0.1.0.0", + "author": "Quartile", + "website": "https://www.quartile.co", + "category": "Warehouse", + "license": "AGPL-3", + "depends": ["stock_account"], + "data": [ + "security/ir.model.access.csv", + ], + "installable": True, +} diff --git a/stock_revaluation_fifo_lot/models/__init__.py b/stock_revaluation_fifo_lot/models/__init__.py new file mode 100644 index 0000000..f8149a2 --- /dev/null +++ b/stock_revaluation_fifo_lot/models/__init__.py @@ -0,0 +1,2 @@ +from . import stock_product_revaluation +from . import stock_product_revaluation_line diff --git a/stock_revaluation_fifo_lot/models/stock_product_revaluation.py b/stock_revaluation_fifo_lot/models/stock_product_revaluation.py new file mode 100644 index 0000000..450ecae --- /dev/null +++ b/stock_revaluation_fifo_lot/models/stock_product_revaluation.py @@ -0,0 +1,46 @@ +# Copyright 2025 Quartile (https://www.quartile.co) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from odoo.exceptions import UserError + + +class StockProductRevaluation(models.Model): + _name = 'stock.product.revaluation' + _description = 'Stock Product Revaluation' + _order = 'date desc' + + name = fields.Char(string='Reference', required=True, copy=False, readonly=True, + default=lambda self: self.env['ir.sequence'].next_by_code('stock.product.revaluation')) + date = fields.Date(string='Date', required=True, default=fields.Date.context_today) + journal_id = fields.Many2one('account.journal', string='Journal', required=True) + company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env.company) + line_ids = fields.One2many('stock.product.revaluation.line', 'revaluation_id', string='Revaluation Lines') + valuation_adjustment_ids = fields.One2many('stock.revaluation.adjustment.line', 'revaluation_id', string='Valuation Adjustments') + state = fields.Selection([ + ('draft', 'Draft'), + ('posted', 'Posted'), + ('cancelled', 'Cancelled') + ], default='draft', tracking=True) + + def action_post(self): + for record in self: + if not record.line_ids: + raise UserError("Please add at least one revaluation line.") + + # Example placeholder for valuation calculation logic + for line in record.line_ids: + # Simulate retrieving old valuation and calculating new one + original_value = 100 # Placeholder + new_value = original_value + line.amount + + self.env['stock.product.revaluation.valuation'].create({ + 'revaluation_id': record.id, + 'product_id': line.product_id.id, + 'lot_id': line.lot_id.id, + 'original_value': original_value, + 'new_value': new_value, + 'difference': new_value - original_value, + }) + + record.state = 'posted' diff --git a/stock_revaluation_fifo_lot/models/stock_product_revaluation_line.py b/stock_revaluation_fifo_lot/models/stock_product_revaluation_line.py new file mode 100644 index 0000000..ac830fa --- /dev/null +++ b/stock_revaluation_fifo_lot/models/stock_product_revaluation_line.py @@ -0,0 +1,15 @@ +# Copyright 2025 Quartile (https://www.quartile.co) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class StockProductRevaluationLine(models.Model): + _name = 'stock.product.revaluation.line' + _description = 'Stock Product Revaluation Line' + + revaluation_id = fields.Many2one('stock.product.revaluation', required=True, ondelete='cascade') + product_id = fields.Many2one('product.product', string='Product', required=True) + lot_id = fields.Many2one('stock.production.lot', string='Lot/Serial Number') + account_id = fields.Many2one('account.account', string='Account') + amount = fields.Float(string='Cost Adjustment') diff --git a/stock_revaluation_fifo_lot/models/stock_revaluation_adjustment_line.py b/stock_revaluation_fifo_lot/models/stock_revaluation_adjustment_line.py new file mode 100644 index 0000000..380f697 --- /dev/null +++ b/stock_revaluation_fifo_lot/models/stock_revaluation_adjustment_line.py @@ -0,0 +1,22 @@ +# Copyright 2025 Quartile (https://www.quartile.co) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from odoo.exceptions import UserError + + +class StockRevaluationAdjustmentLine(models.Model): + _name = 'stock.product.revaluation.valuation' + _description = 'Stock Product Revaluation Valuation' + + revaluation_id = fields.Many2one('stock.product.revaluation', required=True, ondelete='cascade') + product_id = fields.Many2one('product.product', string='Product') + lot_id = fields.Many2one('stock.production.lot', string='Lot/Serial Number') + original_value = fields.Float(string='Original Value') + new_value = fields.Float(string='New Value') + difference = fields.Float(string='Difference', compute='_compute_difference', store=True) + + @api.depends('original_value', 'new_value') + def _compute_difference(self): + for rec in self: + rec.difference = rec.new_value - rec.original_value \ No newline at end of file diff --git a/stock_revaluation_fifo_lot/security/ir.model.access.csv b/stock_revaluation_fifo_lot/security/ir.model.access.csv new file mode 100644 index 0000000..b5a94a6 --- /dev/null +++ b/stock_revaluation_fifo_lot/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_stock_product_revaluation,stock.product.revaluation,model_stock_product_revaluationstock.group_stock_user,1,1,1,1 +access_stock_product_revaluation_line,stock.product.revaluation.line,model_stock_product_revaluation_linestock.group_stock_user,1,1,1,1 +access_stock_product_revaluation_valuation,stock.product.revaluation.valuation,model_stock_product_revaluation_valuationstock.group_stock_user,1,1,1,1