}
product_template()
+ class product_product(osv.osv):
+ _inherit = "product.product"
+
+ def do_change_standard_price(self, cr, uid, ids, datas, context=None):
+ """ Changes the Standard Price of Product and creates an account move accordingly.
+ @param datas : dict. contain default datas like new_price, stock_output_account, stock_input_account, stock_journal
+ @param context: A standard dictionary
+ @return:
+
+ """
- location_obj = self.pool.get('stock.location')
- move_obj = self.pool.get('account.move')
- move_line_obj = self.pool.get('account.move.line')
- if context is None:
- context = {}
-
- new_price = datas.get('new_price', 0.0)
- journal_id = datas.get('stock_journal', False)
+ product_obj=self.browse(cr, uid, ids, context=context)[0]
- account_variation = product_obj.categ_id.property_stock_variation
- account_variation_id = account_variation and account_variation.id or False
+ stock_price_diff_account = datas.get('stock_price_diff_account',False)
+
- if not account_variation_id: raise osv.except_osv(_('Error!'), _('Variation Account is not specified for Product Category: %s') % (product_obj.categ_id.name))
+ if not stock_price_diff_account:
+ stock_price_diff_account = product_obj.categ_id.property_account_creditor_price_difference_categ and product_obj.categ_id.property_account_creditor_price_difference_categ.id or False
+ if not stock_price_diff_account:
+ raise osv.except_osv(_('Error!'),_('There is no price diffrent account defined ' \
+ 'for this product: "%s" (id: %d)') % (product_obj.name, product_obj.id,))
- move_ids = []
- loc_ids = location_obj.search(cr, uid,[('usage','=','internal')])
- for rec_id in ids:
- for location in location_obj.browse(cr, uid, loc_ids, context=context):
- c = context.copy()
- c.update({
- 'location': location.id,
- 'compute_child': False
- })
-
- product = self.browse(cr, uid, rec_id, context=c)
- qty = product.qty_available
- diff = product.standard_price - new_price
- if not diff: raise osv.except_osv(_('Error!'), _("Could not find any difference between standard price and new price!"))
- if qty:
- company_id = location.company_id and location.company_id.id or False
- if not company_id: raise osv.except_osv(_('Error!'), _('Company is not specified in Location'))
- #
- # Accounting Entries
- #
- if not journal_id:
- journal_id = product.categ_id.property_stock_journal and product.categ_id.property_stock_journal.id or False
- if not journal_id:
- raise osv.except_osv(_('Error!'),
- _('There is no journal defined '\
- 'on the product category: "%s" (id: %d)') % \
- (product.categ_id.name,
- product.categ_id.id,))
- move_id = move_obj.create(cr, uid, {
- 'journal_id': journal_id,
- 'company_id': company_id
- })
-
- move_ids.append(move_id)
-
-
- if diff > 0:
- amount_diff = qty * diff
- move_line_obj.create(cr, uid, {
- 'name': product.name,
- 'account_id': stock_price_diff_account,
- 'debit': amount_diff,
- 'move_id': move_id,
- })
- move_line_obj.create(cr, uid, {
- 'name': product.categ_id.name,
- 'account_id': account_variation_id,
- 'credit': amount_diff,
- 'move_id': move_id
- })
- elif diff < 0:
- amount_diff = qty * -diff
- move_line_obj.create(cr, uid, {
- 'name': product.name,
- 'account_id': stock_price_diff_account,
- 'credit': amount_diff,
- 'move_id': move_id
- })
- move_line_obj.create(cr, uid, {
- 'name': product.categ_id.name,
- 'account_id': account_variation_id,
- 'debit': amount_diff,
- 'move_id': move_id
- })
-
- self.write(cr, uid, rec_id, {'standard_price': new_price})
-
- return move_ids
++ datas['stock_input_account'] = stock_price_diff_account
++ datas['stock_output_account'] = stock_price_diff_account
++
++ return super(product_product, self).do_change_standard_price(cr, uid, ids, datas, context)
+
+ product_product()
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: