Merge pull request #2027 from odoo-dev/8.0-wmsstaging7-jco
8.0 wmsstaging7 jco
This commit is contained in:
commit
114f66c277
|
@ -848,7 +848,10 @@ class mrp_production(osv.osv):
|
|||
dicts[product_id] = {}
|
||||
|
||||
# total qty of consumed product we need after this consumption
|
||||
total_consume = ((product_qty + produced_qty) * scheduled.product_qty / production.product_qty)
|
||||
if product_qty + produced_qty <= production.product_qty:
|
||||
total_consume = ((product_qty + produced_qty) * scheduled.product_qty / production.product_qty)
|
||||
else:
|
||||
total_consume = (production.product_qty * scheduled.product_qty / production.product_qty)
|
||||
qty = total_consume - consumed_qty
|
||||
|
||||
# Search for quants related to this related move
|
||||
|
@ -905,10 +908,6 @@ class mrp_production(osv.osv):
|
|||
main_production_move = False
|
||||
if production_mode == 'consume_produce':
|
||||
# To produce remaining qty of final product
|
||||
#vals = {'state':'confirmed'}
|
||||
#final_product_todo = [x.id for x in production.move_created_ids]
|
||||
#stock_mov_obj.write(cr, uid, final_product_todo, vals)
|
||||
#stock_mov_obj.action_confirm(cr, uid, final_product_todo, context)
|
||||
produced_products = {}
|
||||
for produced_product in production.move_created_ids2:
|
||||
if produced_product.scrapped:
|
||||
|
@ -921,17 +920,13 @@ class mrp_production(osv.osv):
|
|||
produced_qty = produced_products.get(produce_product.product_id.id, 0)
|
||||
subproduct_factor = self._get_subproduct_factor(cr, uid, production.id, produce_product.id, context=context)
|
||||
rest_qty = (subproduct_factor * production.product_qty) - produced_qty
|
||||
if float_compare(rest_qty, (subproduct_factor * production_qty), precision_rounding=produce_product.product_id.uom_id.rounding) < 0:
|
||||
prod_name = produce_product.product_id.name_get()[0][1]
|
||||
raise osv.except_osv(_('Warning!'), _('You are going to produce total %s quantities of "%s".\nBut you can only produce up to total %s quantities.') % ((subproduct_factor * production_qty), prod_name, rest_qty))
|
||||
if float_compare(rest_qty, 0, precision_rounding=produce_product.product_id.uom_id.rounding) > 0:
|
||||
lot_id = False
|
||||
if wiz:
|
||||
lot_id = wiz.lot_id.id
|
||||
new_moves = stock_mov_obj.action_consume(cr, uid, [produce_product.id], (subproduct_factor * production_qty), location_id=produce_product.location_id.id, restrict_lot_id=lot_id, context=context)
|
||||
stock_mov_obj.write(cr, uid, new_moves, {'production_id': production_id}, context=context)
|
||||
if produce_product.product_id.id == production.product_id.id and new_moves:
|
||||
main_production_move = new_moves[0]
|
||||
lot_id = False
|
||||
if wiz:
|
||||
lot_id = wiz.lot_id.id
|
||||
new_moves = stock_mov_obj.action_consume(cr, uid, [produce_product.id], (subproduct_factor * production_qty), location_id=produce_product.location_id.id, restrict_lot_id=lot_id, context=context)
|
||||
stock_mov_obj.write(cr, uid, new_moves, {'production_id': production_id}, context=context)
|
||||
if produce_product.product_id.id == production.product_id.id and new_moves:
|
||||
main_production_move = new_moves[0]
|
||||
|
||||
if production_mode in ['consume', 'consume_produce']:
|
||||
if wiz:
|
||||
|
|
|
@ -757,7 +757,6 @@
|
|||
<field name="product_uom_qty"/>
|
||||
<field name="product_uom" string="Unit of Measure" groups="product.group_uom"/>
|
||||
<field name="state" invisible="1"/>
|
||||
<!--TODO: should have a partial picking here-->
|
||||
</tree>
|
||||
</field>
|
||||
</group>
|
||||
|
@ -1048,14 +1047,15 @@
|
|||
<field name="name">product.template.procurement</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="product.product_template_only_form_view"/>
|
||||
<field name="groups_id" eval="[(4, ref('mrp.group_mrp_user'))]"/>
|
||||
<field name="arch" type="xml">
|
||||
<div name="buttons" position="inside">
|
||||
<button class="oe_inline oe_stat_button" name="%(template_open_bom)d" type="action"
|
||||
groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-flask">
|
||||
attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-flask">
|
||||
<field string="Bill of Materials" name="bom_count" widget="statinfo" />
|
||||
</button>
|
||||
<button class="oe_inline oe_stat_button" name="action_view_mos" type="object"
|
||||
groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-list-alt">
|
||||
attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-list-alt">
|
||||
<field string="Manufacturing" name="mo_count" widget="statinfo" />
|
||||
</button>
|
||||
</div>
|
||||
|
@ -1066,14 +1066,15 @@
|
|||
<field name="name">product.product.procurement</field>
|
||||
<field name="model">product.product</field>
|
||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||
<field name="groups_id" eval="[(4, ref('mrp.group_mrp_user'))]"/>
|
||||
<field name="arch" type="xml">
|
||||
<div name="buttons" position="inside">
|
||||
<button class="oe_inline oe_stat_button" name="action_view_bom" type="object"
|
||||
groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-flask">
|
||||
attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-flask">
|
||||
<field string="Bill of Materials" name="bom_count" widget="statinfo" />
|
||||
</button>
|
||||
<button class="oe_inline oe_stat_button" name="%(act_product_mrp_production)d" type="action"
|
||||
groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-list-alt">
|
||||
attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-list-alt">
|
||||
<field string="Manufacturing" name="mo_count" widget="statinfo" />
|
||||
</button>
|
||||
</div>
|
||||
|
|
|
@ -8,11 +8,12 @@
|
|||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="base.view_partner_form"/>
|
||||
<field name="priority" eval="50"/>
|
||||
<field name="groups_id" eval="[(4, ref('project.group_project_user'))]"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@name='buttons']" position="inside">
|
||||
<button class="oe_inline oe_stat_button" type="action" name="%(action_view_task)d"
|
||||
context="{'search_default_partner_id': active_id, 'default_partner_id': active_id}"
|
||||
icon="fa-tasks" groups="project.group_project_user">
|
||||
icon="fa-tasks">
|
||||
<field string="Tasks" name="task_count" widget="statinfo"/>
|
||||
</button>
|
||||
|
||||
|
|
|
@ -74,21 +74,31 @@
|
|||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="base.view_partner_form" />
|
||||
<field name="priority" eval="20"/>
|
||||
<field name="groups_id" eval="[(4, ref('purchase.group_purchase_user'))]"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@name='buttons']" position="inside">
|
||||
<button class="oe_inline oe_stat_button" name="%(purchase.act_res_partner_2_purchase_order)d" type="action"
|
||||
attrs="{'invisible': [('supplier', '=', False)]}"
|
||||
groups="purchase.group_purchase_user" icon="fa-shopping-cart">
|
||||
attrs="{'invisible': [('supplier', '=', False)]}" icon="fa-shopping-cart">
|
||||
<field string="Purchases" name="purchase_order_count" widget="statinfo"/>
|
||||
</button>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="res_partner_view_purchase_account_buttons" model="ir.ui.view">
|
||||
<field name="name">res.partner.view.purchase.account.buttons</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="base.view_partner_form" />
|
||||
<field name="priority" eval="20"/>
|
||||
<field name="groups_id" eval="[(4, ref('account.group_account_user'))]"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@name='buttons']" position="inside">
|
||||
<button class="oe_inline oe_stat_button" name="%(purchase.act_res_partner_2_supplier_invoices)d" type="action"
|
||||
attrs="{'invisible': [('supplier', '=', False)]}" icon="fa-pencil-square-o" help="Supplier Invoices"
|
||||
groups="account.group_account_user">
|
||||
attrs="{'invisible': [('supplier', '=', False)]}" icon="fa-pencil-square-o" help="Supplier Invoices">
|
||||
<field string="Supplier Inv." name="supplier_invoice_count" widget="statinfo"/>
|
||||
</button>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -46,11 +46,12 @@
|
|||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="base.view_partner_form" />
|
||||
<field name="priority" eval="20"/>
|
||||
<field name="groups_id" eval="[(4, ref('base.group_sale_salesman'))]"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@name='buttons']" position="inside">
|
||||
<button class="oe_inline oe_stat_button" type="action" name="%(sale.act_res_partner_2_sale_order)d"
|
||||
attrs="{'invisible': [('customer', '=', False)]}"
|
||||
icon="fa-strikethrough" groups="base.group_sale_salesman">
|
||||
icon="fa-strikethrough">
|
||||
<field string="Sales" name="sale_order_count" widget="statinfo"/>
|
||||
</button>
|
||||
</xpath>
|
||||
|
|
|
@ -498,10 +498,11 @@
|
|||
<field name="name">product.product.sale.order</field>
|
||||
<field name="model">product.product</field>
|
||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||
<field name="groups_id" eval="[(4, ref('base.group_sale_salesman'))]"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@name='buttons']" position="inside">
|
||||
<button class="oe_inline oe_stat_button" name="%(action_order_line_product_tree)d"
|
||||
type="action" groups="base.group_sale_salesman" icon="fa-strikethrough">
|
||||
<button class="oe_inline oe_stat_button" name="%(action_order_line_product_tree)d"
|
||||
type="action" icon="fa-strikethrough">
|
||||
<field string="Sales" name="sales_count" widget="statinfo" />
|
||||
</button>
|
||||
</xpath>
|
||||
|
@ -512,10 +513,11 @@
|
|||
<field name="name">product.template.sale.order.button</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="product.product_template_only_form_view"/>
|
||||
<field name="groups_id" eval="[(4, ref('base.group_sale_salesman'))]"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@name='buttons']" position="inside">
|
||||
<button class="oe_inline oe_stat_button" name="action_view_sales"
|
||||
type="object" groups="base.group_sale_salesman" icon="fa-strikethrough">
|
||||
<button class="oe_inline oe_stat_button" name="action_view_sales"
|
||||
type="object" icon="fa-strikethrough">
|
||||
<field string="Sales" name="sales_count" widget="statinfo" />
|
||||
</button>
|
||||
</xpath>
|
||||
|
|
|
@ -55,7 +55,7 @@ class stock_change_product_qty(osv.osv_memory):
|
|||
if len(product_ids) == 1:
|
||||
res['product_id'] = product_ids[0]
|
||||
else:
|
||||
raise orm.except_orm(_('Warning'), _('Please use the Product Variant vue to update the product quantity.'))
|
||||
raise orm.except_orm(_('Warning'), _('Please use the Product Variant view to update the product quantity.'))
|
||||
|
||||
if 'location_id' in fields:
|
||||
location_id = res.get('location_id', False)
|
||||
|
|
|
@ -21,9 +21,39 @@
|
|||
|
||||
from openerp.osv import fields, osv
|
||||
from openerp.tools.translate import _
|
||||
from openerp.fields import Many2one
|
||||
|
||||
|
||||
|
||||
class product_template(osv.osv):
|
||||
_name = 'product.template'
|
||||
_inherit = 'product.template'
|
||||
|
||||
_columns = {
|
||||
'valuation': fields.property(type='selection', selection=[('manual_periodic', 'Periodical (manual)'),
|
||||
('real_time', 'Real Time (automated)')], string='Inventory Valuation',
|
||||
help="If real-time valuation is enabled for a product, the system will automatically write journal entries corresponding to stock moves, with product price as specified by the 'Costing Method'" \
|
||||
"The inventory variation account set on the product category will represent the current inventory value, and the stock input and stock output account will hold the counterpart moves for incoming and outgoing products."
|
||||
, required=True, copy=True),
|
||||
'cost_method': fields.property(type='selection', selection=[('standard', 'Standard Price'), ('average', 'Average Price'), ('real', 'Real Price')],
|
||||
help="""Standard Price: The cost price is manually updated at the end of a specific period (usually every year).
|
||||
Average Price: The cost price is recomputed at each incoming shipment and used for the product valuation.
|
||||
Real Price: The cost price displayed is the price of the last outgoing product (will be use in case of inventory loss for example).""",
|
||||
string="Costing Method", required=True, copy=True),
|
||||
'property_stock_account_input': fields.property(
|
||||
type='many2one',
|
||||
relation='account.account',
|
||||
string='Stock Input Account',
|
||||
help="When doing real-time inventory valuation, counterpart journal items for all incoming stock moves will be posted in this account, unless "
|
||||
"there is a specific valuation account set on the source location. When not set on the product, the one from the product category is used."),
|
||||
'property_stock_account_output': fields.property(
|
||||
type='many2one',
|
||||
relation='account.account',
|
||||
string='Stock Output Account',
|
||||
help="When doing real-time inventory valuation, counterpart journal items for all outgoing stock moves will be posted in this account, unless "
|
||||
"there is a specific valuation account set on the destination location. When not set on the product, the one from the product category is used."),
|
||||
}
|
||||
|
||||
class product_product(osv.osv):
|
||||
_inherit = "product.product"
|
||||
|
||||
def get_product_accounts(self, cr, uid, product_id, context=None):
|
||||
""" To get the stock input account, stock output account and stock journal related to product.
|
||||
|
@ -32,7 +62,7 @@ class product_product(osv.osv):
|
|||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
product_obj = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
|
||||
product_obj = self.browse(cr, uid, product_id, context=context)
|
||||
|
||||
stock_input_acc = product_obj.property_stock_account_input and product_obj.property_stock_account_input.id or False
|
||||
if not stock_input_acc:
|
||||
|
@ -60,6 +90,7 @@ class product_product(osv.osv):
|
|||
'property_stock_valuation_account_id': account_valuation
|
||||
}
|
||||
|
||||
|
||||
def do_change_standard_price(self, cr, uid, ids, new_price, context=None):
|
||||
""" Changes the Standard Price of Product and creates an account move accordingly."""
|
||||
location_obj = self.pool.get('stock.location')
|
||||
|
@ -79,69 +110,44 @@ class product_product(osv.osv):
|
|||
diff = product.standard_price - new_price
|
||||
if not diff:
|
||||
raise osv.except_osv(_('Error!'), _("No difference between standard price and new price!"))
|
||||
qty = product.qty_available
|
||||
if qty:
|
||||
# Accounting Entries
|
||||
move_vals = {
|
||||
'journal_id': datas['stock_journal'],
|
||||
'company_id': location.company_id.id,
|
||||
}
|
||||
move_id = move_obj.create(cr, uid, move_vals, context=context)
|
||||
|
||||
if diff > 0:
|
||||
amount_diff = qty * diff
|
||||
debit_account_id = datas['stock_account_input']
|
||||
credit_account_id = datas['property_stock_valuation_account_id']
|
||||
else:
|
||||
amount_diff = qty * -diff
|
||||
debit_account_id = datas['property_stock_valuation_account_id']
|
||||
credit_account_id = datas['stock_account_output']
|
||||
|
||||
move_line_obj.create(cr, uid, {
|
||||
'name': _('Standard Price changed'),
|
||||
'account_id': debit_account_id,
|
||||
'debit': amount_diff,
|
||||
'credit': 0,
|
||||
'move_id': move_id,
|
||||
}, context=context)
|
||||
move_line_obj.create(cr, uid, {
|
||||
'name': _('Standard Price changed'),
|
||||
'account_id': credit_account_id,
|
||||
'debit': 0,
|
||||
'credit': amount_diff,
|
||||
'move_id': move_id
|
||||
}, context=context)
|
||||
for prod_variant in product.product_variant_ids:
|
||||
qty = prod_variant.qty_available
|
||||
if qty:
|
||||
# Accounting Entries
|
||||
move_vals = {
|
||||
'journal_id': datas['stock_journal'],
|
||||
'company_id': location.company_id.id,
|
||||
}
|
||||
move_id = move_obj.create(cr, uid, move_vals, context=context)
|
||||
|
||||
if diff > 0:
|
||||
amount_diff = qty * diff
|
||||
debit_account_id = datas['stock_account_input']
|
||||
credit_account_id = datas['property_stock_valuation_account_id']
|
||||
else:
|
||||
amount_diff = qty * -diff
|
||||
debit_account_id = datas['property_stock_valuation_account_id']
|
||||
credit_account_id = datas['stock_account_output']
|
||||
|
||||
move_line_obj.create(cr, uid, {
|
||||
'name': _('Standard Price changed'),
|
||||
'account_id': debit_account_id,
|
||||
'debit': amount_diff,
|
||||
'credit': 0,
|
||||
'move_id': move_id,
|
||||
}, context=context)
|
||||
move_line_obj.create(cr, uid, {
|
||||
'name': _('Standard Price changed'),
|
||||
'account_id': credit_account_id,
|
||||
'debit': 0,
|
||||
'credit': amount_diff,
|
||||
'move_id': move_id
|
||||
}, context=context)
|
||||
self.write(cr, uid, rec_id, {'standard_price': new_price})
|
||||
return True
|
||||
|
||||
|
||||
class product_template(osv.osv):
|
||||
_name = 'product.template'
|
||||
_inherit = 'product.template'
|
||||
_columns = {
|
||||
'valuation': fields.property(type='selection', selection=[('manual_periodic', 'Periodical (manual)'),
|
||||
('real_time', 'Real Time (automated)')], string='Inventory Valuation',
|
||||
help="If real-time valuation is enabled for a product, the system will automatically write journal entries corresponding to stock moves, with product price as specified by the 'Costing Method'" \
|
||||
"The inventory variation account set on the product category will represent the current inventory value, and the stock input and stock output account will hold the counterpart moves for incoming and outgoing products."
|
||||
, required=True),
|
||||
'cost_method': fields.property(type='selection', selection=[('standard', 'Standard Price'), ('average', 'Average Price'), ('real', 'Real Price')],
|
||||
help="""Standard Price: The cost price is manually updated at the end of a specific period (usually every year).
|
||||
Average Price: The cost price is recomputed at each incoming shipment and used for the product valuation.
|
||||
Real Price: The cost price displayed is the price of the last outgoing product (will be use in case of inventory loss for example).""",
|
||||
string="Costing Method", required=True),
|
||||
'property_stock_account_input': fields.property(
|
||||
type='many2one',
|
||||
relation='account.account',
|
||||
string='Stock Input Account',
|
||||
help="When doing real-time inventory valuation, counterpart journal items for all incoming stock moves will be posted in this account, unless "
|
||||
"there is a specific valuation account set on the source location. When not set on the product, the one from the product category is used."),
|
||||
'property_stock_account_output': fields.property(
|
||||
type='many2one',
|
||||
relation='account.account',
|
||||
string='Stock Output Account',
|
||||
help="When doing real-time inventory valuation, counterpart journal items for all outgoing stock moves will be posted in this account, unless "
|
||||
"there is a specific valuation account set on the destination location. When not set on the product, the one from the product category is used."),
|
||||
}
|
||||
|
||||
|
||||
|
||||
class product_category(osv.osv):
|
||||
|
|
|
@ -164,8 +164,8 @@ class stock_quant(osv.osv):
|
|||
:returns: journal_id, source account, destination account, valuation account
|
||||
:raise: osv.except_osv() is any mandatory account or journal is not defined.
|
||||
"""
|
||||
product_obj = self.pool.get('product.product')
|
||||
accounts = product_obj.get_product_accounts(cr, uid, move.product_id.id, context)
|
||||
product_obj = self.pool.get('product.template')
|
||||
accounts = product_obj.get_product_accounts(cr, uid, move.product_id.product_tmpl_id.id, context)
|
||||
if move.location_id.valuation_out_account_id:
|
||||
acc_src = move.location_id.valuation_out_account_id.id
|
||||
else:
|
||||
|
|
|
@ -33,6 +33,8 @@ class change_standard_price(osv.osv_memory):
|
|||
"If cost price is decreased, stock variation account will be creadited and stock input account will be debited."),
|
||||
}
|
||||
|
||||
|
||||
|
||||
def default_get(self, cr, uid, fields, context=None):
|
||||
""" To get default values for the object.
|
||||
@param self: The object pointer.
|
||||
|
@ -44,8 +46,12 @@ class change_standard_price(osv.osv_memory):
|
|||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
product_pool = self.pool.get('product.product')
|
||||
if context.get("active_model") == 'product.product':
|
||||
product_pool = self.pool.get('product.product')
|
||||
else:
|
||||
product_pool = self.pool.get('product.template')
|
||||
product_obj = product_pool.browse(cr, uid, context.get('active_id', False))
|
||||
|
||||
res = super(change_standard_price, self).default_get(cr, uid, fields, context=context)
|
||||
|
||||
price = product_obj.standard_price
|
||||
|
@ -66,10 +72,15 @@ class change_standard_price(osv.osv_memory):
|
|||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
rec_id = context and context.get('active_id', False)
|
||||
rec_id = context.get('active_id', False)
|
||||
assert rec_id, _('Active ID is not set in Context.')
|
||||
prod_obj = self.pool.get('product.product')
|
||||
if context.get("active_model") == 'product.product':
|
||||
prod_obj = self.pool.get('product.product')
|
||||
rec_id = prod_obj.browse(cr, uid, rec_id, context=context).product_tmpl_id.id
|
||||
prod_obj = self.pool.get('product.template')
|
||||
|
||||
res = self.browse(cr, uid, ids, context=context)
|
||||
|
||||
prod_obj.do_change_standard_price(cr, uid, [rec_id], res[0].new_price, context)
|
||||
return {'type': 'ir.actions.act_window_close'}
|
||||
|
||||
|
|
|
@ -99,11 +99,11 @@ class stock_landed_cost(osv.osv):
|
|||
}
|
||||
|
||||
def _create_accounting_entries(self, cr, uid, line, move_id, context=None):
|
||||
product_obj = self.pool.get('product.product')
|
||||
product_obj = self.pool.get('product.template')
|
||||
cost_product = line.cost_line_id and line.cost_line_id.product_id
|
||||
if not cost_product:
|
||||
return False
|
||||
accounts = product_obj.get_product_accounts(cr, uid, line.product_id.id, context=context)
|
||||
accounts = product_obj.get_product_accounts(cr, uid, line.product_id.product_tmpl_id.id, context=context)
|
||||
debit_account_id = accounts['property_stock_valuation_account_id']
|
||||
credit_account_id = cost_product.property_account_expense and cost_product.property_account_expense.id or cost_product.categ_id.property_account_expense_categ.id
|
||||
if not credit_account_id:
|
||||
|
|
Loading…
Reference in New Issue