From ef11fc39add57bdc23994317b22e32d4f51a6db5 Mon Sep 17 00:00:00 2001 From: "uco (OpenERP)" Date: Thu, 3 Jun 2010 18:55:23 +0530 Subject: [PATCH] [IMP] product_price_unit: Improvement in overriding methods by calling its super method. bzr revid: uco@tinyerp.com-20100603132523-plrgpj1c40jfdm5e --- .../product_price_unit/product_price_unit.py | 319 ++---------------- .../product_price_unit_view.xml | 33 -- 2 files changed, 26 insertions(+), 326 deletions(-) diff --git a/addons/product_price_unit/product_price_unit.py b/addons/product_price_unit/product_price_unit.py index 008622e82f1..9922c3ab94e 100644 --- a/addons/product_price_unit/product_price_unit.py +++ b/addons/product_price_unit/product_price_unit.py @@ -24,6 +24,8 @@ from osv import fields from tools.translate import _ import decimal_precision as dp import time +from datetime import datetime +from dateutil.relativedelta import relativedelta class product_price_unit(osv.osv): _name = "product.price.unit" @@ -184,110 +186,6 @@ class product_product(osv.osv): res[id][f] = stock.get(id, 0.0) return res - def get_product_available(self, cr, uid, ids, context=None): - if not context: - context = {} - states=context.get('states',[]) - what=context.get('what',()) - if not ids: - ids = self.search(cr, uid, []) - res = {}.fromkeys(ids, 0.0) - if not ids: - return res - - if context.get('shop', False): - cr.execute('select warehouse_id from sale_shop where id=%s', (int(context['shop']),)) - res2 = cr.fetchone() - if res2: - context['warehouse'] = res2[0] - - if context.get('warehouse', False): - cr.execute('select lot_stock_id from stock_warehouse where id=%s', (int(context['warehouse']),)) - res2 = cr.fetchone() - if res2: - context['location'] = res2[0] - - if context.get('location', False): - if type(context['location']) == type(1): - location_ids = [context['location']] - else: - location_ids = context['location'] - else: - location_ids = [] - wids = self.pool.get('stock.warehouse').search(cr, uid, [], context=context) - for w in self.pool.get('stock.warehouse').browse(cr, uid, wids, context=context): - location_ids.append(w.lot_stock_id.id) - - # build the list of ids of children of the location given by id - if context.get('compute_child',True): - child_location_ids = self.pool.get('stock.location').search(cr, uid, [('location_id', 'child_of', location_ids)]) - location_ids= len(child_location_ids) and child_location_ids or location_ids - else: - location_ids= location_ids - - uoms_o = {} - product2uom = {} - for product in self.browse(cr, uid, ids, context=context): - product2uom[product.id] = product.uom_id.id - uoms_o[product.uom_id.id] = product.uom_id - - results = [] - results2 = [] - - from_date=context.get('from_date',False) - to_date=context.get('to_date',False) - date_str=False - if from_date and to_date: - date_str="date_planned>='%s' and date_planned<='%s'"%(from_date,to_date) - elif from_date: - date_str="date_planned>='%s'"%(from_date) - elif to_date: - date_str="date_planned<='%s'"%(to_date) - - if 'in' in what: - # all moves from a location out of the set to a location in the set - cr.execute( - 'select sum(product_qty), product_id, product_uom,sum(move_value) '\ - 'from stock_move '\ - 'where location_id <> ANY(%s)'\ - 'and location_dest_id =ANY(%s)'\ - 'and product_id =ANY(%s)'\ - 'and state in %s' + (date_str and 'and '+date_str+' ' or '') +''\ - 'group by product_id,product_uom',(location_ids,location_ids,ids,tuple(states),) - ) - results = cr.fetchall() - if 'out' in what: - # all moves from a location in the set to a location out of the set - cr.execute( - 'select sum(product_qty), product_id, product_uom,sum(move_value) '\ - 'from stock_move '\ - 'where location_id = ANY(%s)'\ - 'and location_dest_id <> ANY(%s) '\ - 'and product_id =ANY(%s)'\ - 'and state in %s' + (date_str and 'and '+date_str+' ' or '') + ''\ - 'group by product_id,product_uom',(location_ids,location_ids,ids,tuple(states),) - ) - results2 = cr.fetchall() - uom_obj = self.pool.get('product.uom') - uoms = map(lambda x: x[2], results) + map(lambda x: x[2], results2) - if context.get('uom', False): - uoms += [context['uom']] - - uoms = filter(lambda x: x not in uoms_o.keys(), uoms) - if uoms: - uoms = uom_obj.browse(cr, uid, list(set(uoms)), context=context) - for o in uoms: - uoms_o[o.id] = o - for amount, prod_id, prod_uom,move_value in results: - amount = uom_obj._compute_qty_obj(cr, uid, uoms_o[prod_uom], amount, - uoms_o[context.get('uom', False) or product2uom[prod_id]]) - res[prod_id] += amount - for amount, prod_id, prod_uom,move_value in results2: - amount = uom_obj._compute_qty_obj(cr, uid, uoms_o[prod_uom], amount, - uoms_o[context.get('uom', False) or product2uom[prod_id]]) - res[prod_id] -= amount - return res - def _product_available(self, cr, uid, ids, field_names=None, arg=False, context={}): res = super(product_product, self)._product_available(cr, uid, ids, field_names, arg, context) for f in field_names: @@ -388,51 +286,24 @@ class account_invoice_tax(osv.osv): _inherit = "account.invoice.tax" def compute(self, cr, uid, invoice_id, context={}): - tax_grouped = {} + tax_grouped = super(account_invoice_tax, self).compute(cr, uid, invoice_id, context) tax_obj = self.pool.get('account.tax') cur_obj = self.pool.get('res.currency') inv = self.pool.get('account.invoice').browse(cr, uid, invoice_id, context) - cur = inv.currency_id company_currency = inv.company_id.currency_id.id - + for t in tax_grouped.values(): + t['base'] = 0.0 + t['base_amount'] = 0.0 for line in inv.invoice_line: for tax in tax_obj.compute(cr, uid, line.invoice_line_tax_id, (line.price_unit* (1-(line.discount or 0.0)/100.0/line.price_unit_id.coefficient)), line.quantity, inv.address_invoice_id.id, line.product_id, inv.partner_id): - val={} - val['invoice_id'] = inv.id - val['name'] = tax['name'] - val['amount'] = tax['amount'] - val['manual'] = False - val['sequence'] = tax['sequence'] - val['base'] = tax['price_unit'] * line['quantity'] / line['price_unit_id'].coefficient - - if inv.type in ('out_invoice','in_invoice'): - val['base_code_id'] = tax['base_code_id'] - val['tax_code_id'] = tax['tax_code_id'] - val['base_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['base'] * tax['base_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False) - val['tax_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['amount'] * tax['tax_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False) - val['account_id'] = tax['account_collected_id'] or line.account_id.id - else: - val['base_code_id'] = tax['ref_base_code_id'] - val['tax_code_id'] = tax['ref_tax_code_id'] - val['base_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['base'] * tax['ref_base_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False) - val['tax_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, val['amount'] * tax['ref_tax_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False) - val['account_id'] = tax['account_paid_id'] or line.account_id.id - - key = (val['tax_code_id'], val['base_code_id'], val['account_id']) - if not key in tax_grouped: - tax_grouped[key] = val - else: - tax_grouped[key]['amount'] += val['amount'] - tax_grouped[key]['base'] += val['base'] - tax_grouped[key]['base_amount'] += val['base_amount'] - tax_grouped[key]['tax_amount'] += val['tax_amount'] - - for t in tax_grouped.values(): - t['amount'] = cur_obj.round(cr, uid, cur, t['amount']) - t['base_amount'] = cur_obj.round(cr, uid, cur, t['base_amount']) - t['tax_amount'] = cur_obj.round(cr, uid, cur, t['tax_amount']) + for t in tax_grouped.values(): + t['base'] += tax['price_unit'] * line['quantity'] / line['price_unit_id'].coefficient + if inv.type in ('out_invoice','in_invoice'): + t['base_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, t['base'] * tax['base_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False) + else: + t['base_amount'] = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, t['base'] * tax['ref_base_sign'], context={'date': inv.date_invoice or time.strftime('%Y-%m-%d')}, round=False) return tax_grouped - + account_invoice_tax() class hr_expense_line(osv.osv): @@ -635,158 +506,28 @@ class sale_order_line(osv.osv): inv_line_obj.write(cr, uid, created_ids, {'price_unit_id': pu_id}) return created_ids - def product_id_change(self, cr, uid, ids, pricelist, price_unit_id, product, qty=0, + def product_id_change(self, cr, uid, ids, pricelist, product, qty=0, uom=False, qty_uos=0, uos=False, name='', partner_id=False, lang=False, update_tax=True, date_order=False, packaging=False, fiscal_position=False, flag=False): - if not partner_id: - raise osv.except_osv(_('No Customer Defined !'), _('You have to select a customer in the sale form !\nPlease set one customer before choosing a product.')) - warning = {} - product_uom_obj = self.pool.get('product.uom') - partner_obj = self.pool.get('res.partner') - product_obj = self.pool.get('product.product') - if partner_id: - lang = partner_obj.browse(cr, uid, partner_id).lang - context = {'lang': lang, 'partner_id': partner_id} - + result = super(sale_order_line, self).product_id_change(cr, uid, ids, pricelist, + product, qty, uom, qty_uos, uos, name, partner_id, lang, + update_tax, date_order, packaging, fiscal_position, flag) if not product: - return {'value': {'th_weight': 0, 'product_packaging': False, - 'product_uos_qty': qty}, 'domain': {'product_uom': [], - 'product_uos': []}} + return result - if not date_order: - date_order = time.strftime('%Y-%m-%d') + product_obj = self.pool.get('product.product') + product_obj = product_obj.browse(cr, uid, product) + pu_id = product_obj.price_unit_id.id + result['value']['price_unit_id'] = pu_id - result = {} - product_obj = product_obj.browse(cr, uid, product, context=context) - if product: - pu = self.pool.get('product.product').browse(cr, uid, product) - pu_id = pu.price_unit_id.id - #result['value']['price_unit_id'] = pu_id - result['price_unit_id'] = pu_id - - if not packaging and product_obj.packaging: - packaging = product_obj.packaging[0].id - result['product_packaging'] = packaging - - if packaging: - default_uom = product_obj.uom_id and product_obj.uom_id.id - pack = self.pool.get('product.packaging').browse(cr, uid, packaging, context) - q = product_uom_obj._compute_qty(cr, uid, uom, pack.qty, default_uom) -# qty = qty - qty % q + q - if qty and (q and not (qty % q) == 0): - ean = pack.ean - qty_pack = pack.qty - type_ul = pack.ul - warn_msg = _("You selected a quantity of %d Units.\nBut it's not compatible with the selected packaging.\nHere is a proposition of quantities according to the packaging: ") % (qty) - warn_msg = warn_msg + "\n\n" + _("EAN: ") + str(ean) + _(" Quantity: ") + str(qty_pack) + _(" Type of ul: ") + str(type_ul.name) - warning = { - 'title': _('Picking Information !'), - 'message': warn_msg - } - result['product_uom_qty'] = qty - - if uom: - uom2 = product_uom_obj.browse(cr, uid, uom) - if product_obj.uom_id.category_id.id != uom2.category_id.id: - uom = False - - if uos: - if product_obj.uos_id: - uos2 = product_uom_obj.browse(cr, uid, uos) - if product_obj.uos_id.category_id.id != uos2.category_id.id: - uos = False - else: - uos = False - if product_obj.description_sale: - result['notes'] = product_obj.description_sale - fpos = fiscal_position and self.pool.get('account.fiscal.position').browse(cr, uid, fiscal_position) or False - if update_tax: #The quantity only have changed - result['delay'] = (product_obj.sale_delay or 0.0) - partner = partner_obj.browse(cr, uid, partner_id) - result['tax_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, product_obj.taxes_id) - result.update({'type': product_obj.procure_method}) - - if not flag: - result['name'] = self.pool.get('product.product').name_get(cr, uid, [product_obj.id], context=context)[0][1] - domain = {} - if (not uom) and (not uos): - result['product_uom'] = product_obj.uom_id.id - if product_obj.uos_id: - result['product_uos'] = product_obj.uos_id.id - result['product_uos_qty'] = qty * product_obj.uos_coeff - uos_category_id = product_obj.uos_id.category_id.id - else: - result['product_uos'] = False - result['product_uos_qty'] = qty - uos_category_id = False - result['th_weight'] = qty * product_obj.weight - domain = {'product_uom': - [('category_id', '=', product_obj.uom_id.category_id.id)], - 'product_uos': - [('category_id', '=', uos_category_id)]} - - elif uos: # only happens if uom is False - result['product_uom'] = product_obj.uom_id and product_obj.uom_id.id - result['product_uom_qty'] = qty_uos / product_obj.uos_coeff - result['th_weight'] = result['product_uom_qty'] * product_obj.weight - elif uom: # whether uos is set or not - default_uom = product_obj.uom_id and product_obj.uom_id.id - q = product_uom_obj._compute_qty(cr, uid, uom, qty, default_uom) - if product_obj.uos_id: - result['product_uos'] = product_obj.uos_id.id - result['product_uos_qty'] = qty * product_obj.uos_coeff - else: - result['product_uos'] = False - result['product_uos_qty'] = qty - result['th_weight'] = q * product_obj.weight # Round the quantity up - - # get unit price - - if not pricelist: - warning = { - 'title': 'No Pricelist !', - 'message': - 'You have to select a pricelist in the sale form !\n' - 'Please set one before choosing a product.' - } - else: - price = self.pool.get('product.pricelist').price_get(cr, uid, [pricelist], - product, qty or 1.0, partner_id, { - 'uom': uom, - 'date': date_order, - })[pricelist] - if price is False: - warning = { - 'title': 'No valid pricelist line found !', - 'message': - "Couldn't find a pricelist line matching this product and quantity.\n" - "You have to change either the product, the quantity or the pricelist." - } - else: - result.update({'price_unit': price}) - - # FIX ME pname = product_obj.name if product_obj.variants: pname = pname + ' ['+product_obj.variants + ']' if product_obj.price_unit_id and product_obj.price_unit_id.coefficient != 1.0: pname = pname + ' (' + product_obj.price_unit_id.name + ')' result['name'] = pname - return {'value': result, 'domain': domain,'warning': warning} - - def product_uom_change(self, cursor, user, ids, pricelist, product, price_unit_id=False, qty=0, - uom=False, qty_uos=0, uos=False, name='', partner_id=False, - lang=False, update_tax=True, date_order=False): - res = self.product_id_change(cursor, user, ids, pricelist, price_unit_id,product, - qty=0, uom=uom, qty_uos=qty_uos, uos=uos, name=name, - partner_id=partner_id, lang=lang, update_tax=update_tax, - date_order=date_order) - if 'product_uom' in res['value']: - del res['value']['product_uom'] - if not uom: - res['value']['price_unit'] = 0.0 - return res + return result sale_order_line() @@ -844,17 +585,9 @@ class purchase_order(osv.osv): } def inv_line_create(self, cr, uid, a, ol): - return (0, False, { - 'name': ol.name, - 'account_id': a, - 'price_unit': ol.price_unit or 0.0, - 'price_unit_id': ol.price_unit_id.id , - 'quantity': ol.product_qty, - 'product_id': ol.product_id.id or False, - 'uos_id': ol.product_uom.id or False, - 'invoice_line_tax_id': [(6, 0, [x.id for x in ol.taxes_id])], - 'account_analytic_id': ol.account_analytic_id.id, - }) + result = super(purchase_order, self).inv_line_create(cr, uid, a, ol) + result[2].update({'price_unit_id': ol.price_unit_id.id}) + return result def action_picking_create(self,cr, uid, ids, *args): picking_id = super(purchase_order, self).action_picking_create(cr, uid, ids, *args) diff --git a/addons/product_price_unit/product_price_unit_view.xml b/addons/product_price_unit/product_price_unit_view.xml index 1d7cb404df6..27b258dd156 100644 --- a/addons/product_price_unit/product_price_unit_view.xml +++ b/addons/product_price_unit/product_price_unit_view.xml @@ -155,39 +155,6 @@ - - - sale.order.form.inherit - sale.order - - form - - - - - - - - - sale.order.form.inherit2 - sale.order - - form - - - - - - - sale.order.form.inherit5 sale.order