mirror of
https://github.com/OCA/stock-logistics-warehouse.git
synced 2025-01-21 14:27:28 +02:00
115 lines
3.9 KiB
Python
115 lines
3.9 KiB
Python
# Copyright 2017-18 Eficent Business and IT Consulting Services S.L.
|
|
# (http://www.eficent.com)
|
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
|
|
|
from odoo import api, fields, models, _
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class StockCycleCount(models.Model):
|
|
_name = 'stock.cycle.count'
|
|
_description = "Stock Cycle Counts"
|
|
_inherit = 'mail.thread'
|
|
_order = "id desc"
|
|
|
|
@api.model
|
|
def _default_company(self):
|
|
company_id = self.env['res.company']._company_default_get(self._name)
|
|
return company_id
|
|
|
|
name = fields.Char(string='Name', readonly=True)
|
|
location_id = fields.Many2one(
|
|
comodel_name='stock.location', string='Location',
|
|
required=True,
|
|
readonly=True, states={'draft': [('readonly', False)]},
|
|
)
|
|
responsible_id = fields.Many2one(
|
|
comodel_name='res.users', string='Assigned to',
|
|
readonly=True, states={'draft': [('readonly', False)]},
|
|
track_visibility='onchange',
|
|
)
|
|
date_deadline = fields.Date(
|
|
string='Required Date',
|
|
readonly=True, states={'draft': [('readonly', False)]},
|
|
track_visibility='onchange',
|
|
)
|
|
cycle_count_rule_id = fields.Many2one(
|
|
comodel_name='stock.cycle.count.rule', string='Cycle count rule',
|
|
required=True,
|
|
readonly=True, states={'draft': [('readonly', False)]},
|
|
track_visibility='onchange',
|
|
)
|
|
state = fields.Selection(selection=[
|
|
('draft', 'Planned'),
|
|
('open', 'Execution'),
|
|
('cancelled', 'Cancelled'),
|
|
('done', 'Done')
|
|
], string='State', default='draft', track_visibility='onchange',
|
|
)
|
|
stock_adjustment_ids = fields.One2many(
|
|
comodel_name='stock.inventory', inverse_name='cycle_count_id',
|
|
string='Inventory Adjustment',
|
|
track_visibility='onchange',
|
|
)
|
|
inventory_adj_count = fields.Integer(
|
|
compute='_compute_inventory_adj_count',
|
|
)
|
|
company_id = fields.Many2one(
|
|
comodel_name='res.company', string='Company',
|
|
required=True,
|
|
default=_default_company,
|
|
readonly=True,
|
|
)
|
|
|
|
@api.depends('stock_adjustment_ids')
|
|
@api.multi
|
|
def _compute_inventory_adj_count(self):
|
|
for rec in self:
|
|
rec.inventory_adj_count = len(rec.stock_adjustment_ids)
|
|
|
|
@api.multi
|
|
def do_cancel(self):
|
|
self.write({'state': 'cancelled'})
|
|
|
|
@api.multi
|
|
def _prepare_inventory_adjustment(self):
|
|
self.ensure_one()
|
|
return {
|
|
'name': 'INV/{}'.format(self.name),
|
|
'cycle_count_id': self.id,
|
|
'location_id': self.location_id.id,
|
|
'exclude_sublocation': True
|
|
}
|
|
|
|
@api.model
|
|
def create(self, vals):
|
|
vals['name'] = self.env['ir.sequence'].next_by_code(
|
|
'stock.cycle.count') or ''
|
|
return super(StockCycleCount, self).create(vals)
|
|
|
|
@api.multi
|
|
def action_create_inventory_adjustment(self):
|
|
if any([s != 'draft' for s in self.mapped('state')]):
|
|
raise UserError(_(
|
|
"You can only confirm cycle counts in state 'Planned'."
|
|
))
|
|
for rec in self:
|
|
data = rec._prepare_inventory_adjustment()
|
|
self.env['stock.inventory'].create(data)
|
|
self.write({'state': 'open'})
|
|
return True
|
|
|
|
@api.multi
|
|
def action_view_inventory(self):
|
|
action = self.env.ref('stock.action_inventory_form')
|
|
result = action.read()[0]
|
|
result['context'] = {}
|
|
adjustment_ids = self.mapped('stock_adjustment_ids').ids
|
|
if len(adjustment_ids) > 1:
|
|
result['domain'] = [('id', 'in', adjustment_ids)]
|
|
elif len(adjustment_ids) == 1:
|
|
res = self.env.ref('stock.view_inventory_form', False)
|
|
result['views'] = [(res and res.id or False, 'form')]
|
|
result['res_id'] = adjustment_ids and adjustment_ids[0] or False
|
|
return result
|