trytonpsk-stock_co/inventory.py

141 lines
4.5 KiB
Python
Executable File

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.model import fields, ModelView, Workflow
from trytond.pool import PoolMeta
from trytond.modules.company.model import employee_field
from trytond.pyson import Eval, If
class CreateInventoriesStart(metaclass=PoolMeta):
__name__ = 'stock.inventory.create.start'
assign_to = employee_field('Assing To')
category = fields.Many2One('product.category', 'Category', 'Product Categories')
products = fields.Many2Many('product.product', None, None, 'Products',
domain=[
If(
Eval('category'),
('template.categories', '=', Eval('category')),
())
],
depends=['categories'])
class CreateInventories(metaclass=PoolMeta):
__name__ = 'stock.inventory.create'
def get_inventory(self, location, Inventory):
inventory = super(CreateInventories, self).get_inventory(
location, Inventory)
if self.start.products:
self.start.complete_lines = False
products = [s.id for s in self.start.products]
prd_ids = [{'product': p} for p in products]
inventory.assign_to = self.start.assign_to
inventory.lines = prd_ids
return inventory
class InventoryLine(metaclass=PoolMeta):
'Stock Inventory Line'
__name__ = 'stock.inventory.line'
@classmethod
def __setup__(cls):
super(InventoryLine, cls).__setup__()
cls._states = {
'readonly': ~Eval('inventory_state').in_([
"draft", "checkup", "pre_count"])
}
cls.quantity.states = cls._states
class Inventory(metaclass=PoolMeta):
'Stock Inventory'
__name__ = 'stock.inventory'
assign_to = employee_field('Assing To')
approved_by = employee_field("Approved By")
comment = fields.Text('Comment')
complete_line = fields.Boolean(
"Complete",
help="Add an inventory line for each missing product.")
@classmethod
def __setup__(cls):
super(Inventory, cls).__setup__()
cls.state.selection.extend([
('pre_count', 'Pre-count'),
('checkup', 'Checkup')])
cls._states = {
'readonly': (
~Eval('state').in_(["draft", "checkup", "pre_count"])
| ~Eval('location')
| ~Eval('date')),
}
cls.lines.states = cls._states
cls._transitions |= set((
('draft', 'checkup'),
('checkup', 'draft'),
('checkup', 'pre_count'),
('pre_count', 'done'),
('pre_count', 'draft'),
('pre_count', 'cancelled'),
('draft', 'cancelled'),
))
cls._buttons.update({
'pre_count': {
'invisible': Eval('state') != 'checkup',
'depends': ['state'],
},
'checkup': {
'invisible': Eval('state') != 'draft',
'depends': ['state'],
},
'draft': {
'invisible': ~Eval('state').in_(['pre_count', 'checkup']),
'depends': ['state'],
},
})
@classmethod
@ModelView.button
@Workflow.transition('pre_count')
def pre_count(cls, inventories):
pass
@classmethod
@ModelView.button
@Workflow.transition('checkup')
def checkup(cls, inventories):
pass
@classmethod
@ModelView.button
@Workflow.transition('draft')
def draft(cls, inventories):
pass
@classmethod
@ModelView.button_action('stock.wizard_inventory_count')
def count(cls, inventories):
complete_inv = {'yes': [], 'no': []}
for inventory in inventories:
if inventory.complete_line:
complete_inv['yes'].append(inventory)
else:
complete_inv['no'].append(inventory)
cls.complete_lines(complete_inv['yes'], fill=True)
cls.complete_lines(complete_inv['no'], fill=False)
# class InventoryProductCategory(ModelSQL):
# "Inventory -Product Category"
# __name__ = "stock.inventory.product_category"
# _table = 'stock_inventory_product_category_rel'
# inventory = fields.Many2One('stock.inventory', 'Inventory',
# ondelete='CASCADE', select=True, required=True)
# category = fields.Many2One('product.category', 'Product Category',
# ondelete='CASCADE', select=True, required=True)