##############################################################################
from osv import fields, osv
++from tools.translate import _
class product_category(osv.osv):
_inherit = "product.category"
}
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
++
++product_product()
++
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: