From 2d49fce8c016bcbe218433f88ae9a72e21c21653 Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Wed, 5 Jan 2011 12:17:56 +0530 Subject: [PATCH 1/3] [FIX]report_intrastat:Belgium not defined as an Intrastat member by default: lp bug: https://launchpad.net/bugs/697209 fixed bzr revid: ron@tinyerp.com-20110105064756-1jbnvmpa24fc1oxc --- addons/report_intrastat/report_intrastat_data.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/report_intrastat/report_intrastat_data.xml b/addons/report_intrastat/report_intrastat_data.xml index f3c465c1549..006151915e2 100644 --- a/addons/report_intrastat/report_intrastat_data.xml +++ b/addons/report_intrastat/report_intrastat_data.xml @@ -4,6 +4,9 @@ + + + From 0bffe9bf6996c8e363a9db7dd80a560797d26678 Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Mon, 10 Jan 2011 17:25:25 +0530 Subject: [PATCH 2/3] [FIX]stock:Backorder Cannot be create on Incoming Shipment lp bug: https://launchpad.net/bugs/697085 fixed bzr revid: ron@tinyerp.com-20110110115525-ctcfqhgisj14abvo --- addons/stock/wizard/stock_partial_picking.py | 172 +++++++++---------- 1 file changed, 77 insertions(+), 95 deletions(-) diff --git a/addons/stock/wizard/stock_partial_picking.py b/addons/stock/wizard/stock_partial_picking.py index ad75c142a96..45a12208101 100644 --- a/addons/stock/wizard/stock_partial_picking.py +++ b/addons/stock/wizard/stock_partial_picking.py @@ -28,54 +28,71 @@ class stock_partial_picking(osv.osv_memory): _name = "stock.partial.picking" _description = "Partial Picking" _columns = { - 'date': fields.datetime('Date', required=True), - 'product_moves_out' : fields.one2many('stock.move.memory.out', 'wizard_id', 'Moves'), - 'product_moves_in' : fields.one2many('stock.move.memory.in', 'wizard_id', 'Moves'), + 'date': fields.datetime('Date', required=True), + 'product_moves_out' : fields.one2many('stock.move.memory.out', 'wizard_id', 'Moves'), + 'product_moves_in' : fields.one2many('stock.move.memory.in', 'wizard_id', 'Moves'), } - def __is_in(self,cr, uid, pick_ids): + def get_picking_type(self, cr, uid, picking, context=None): + picking_type = picking.type + for move in picking.move_lines: + if picking.type == 'in' and move.product_id.cost_method == 'average': + picking_type = 'in' + return picking_type + + def default_get(self, cr, uid, fields, context=None): + """ To get default values for the object. + @param self: The object pointer. + @param cr: A database cursor + @param uid: ID of the user currently logged in + @param fields: List of fields for which we want default values + @param context: A standard dictionary + @return: A dictionary which of fields with values. """ - @return: True if one of the moves has as picking type 'in' - """ - if not pick_ids: - return False + if context is None: + context = {} + + pick_obj = self.pool.get('stock.picking') + res = super(stock_partial_picking, self).default_get(cr, uid, fields, context=context) + picking_ids = context.get('active_ids', []) + if not picking_ids: + return res + + result = [] + for pick in pick_obj.browse(cr, uid, picking_ids, context=context): + pick_type = self.get_picking_type(cr, uid, pick, context=context) + for m in pick.move_lines: + if m.state in ('done', 'cancel'): + continue + result.append(self.__create_partial_picking_memory(m, pick_type)) + + if 'product_moves_in' in fields: + res.update({'product_moves_in': result}) + if 'product_moves_out' in fields: + res.update({'product_moves_out': result}) + if 'date' in fields: + res.update({'date': time.strftime('%Y-%m-%d %H:%M:%S')}) + return res + + def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): + result = super(stock_partial_picking, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar, submenu) pick_obj = self.pool.get('stock.picking') - pick_ids = pick_obj.search(cr, uid, [('id','in',pick_ids)]) - - - for pick in pick_obj.browse(cr, uid, pick_ids): - for move in pick.move_lines: - if pick.type == 'in' and move.product_id.cost_method == 'average': - return True - return False - - def __get_picking_type(self, cr, uid, pick_ids): - if self.__is_in(cr, uid, pick_ids): - return "product_moves_in" - else: - return "product_moves_out" - - def view_init(self, cr, uid, fields_list, context=None): - res = super(stock_partial_picking, self).view_init(cr, uid, fields_list, context=context) - return res - - def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False,submenu=False): - result = super(stock_partial_picking, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar,submenu) - - picking_ids = context.get('active_ids', False) - picking_type = self.__get_picking_type(cr, uid, picking_ids) + + for pick in pick_obj.browse(cr, uid, picking_ids, context=context): + picking_type = self.get_picking_type(cr, uid, pick, context=context) _moves_arch_lst = """
- """ % (_('Process Document'), _('Products'), picking_type) + """ % (_('Process Document'), _('Products'), "product_moves_" + picking_type) _moves_fields = result['fields'] + + # add field related to picking type only _moves_fields.update({ - 'product_moves_in' : {'relation': 'stock.move.memory.in', 'type' : 'one2many', 'string' : 'Product Moves'}, - 'product_moves_out' : {'relation': 'stock.move.memory.out', 'type' : 'one2many', 'string' : 'Product Moves'} + 'product_moves_' + picking_type: {'relation': 'stock.move.memory.'+picking_type, 'type' : 'one2many', 'string' : 'Product Moves'}, }) _moves_arch_lst += """ @@ -92,44 +109,22 @@ class stock_partial_picking(osv.osv_memory): result['fields'] = _moves_fields return result - def __create_partial_picking_memory(self, picking, is_in): + def __create_partial_picking_memory(self, picking, pick_type): move_memory = { - 'product_id' : picking.product_id.id, - 'quantity' : picking.product_qty, - 'product_uom' : picking.product_uom.id, - 'prodlot_id' : picking.prodlot_id.id, - 'move_id' : picking.id, + 'product_id' : picking.product_id.id, + 'quantity' : picking.product_qty, + 'product_uom' : picking.product_uom.id, + 'prodlot_id' : picking.prodlot_id.id, + 'move_id' : picking.id, } - if is_in: + if pick_type == 'in': move_memory.update({ - 'cost' : picking.product_id.standard_price, - 'currency' : picking.product_id.company_id.currency_id.id, + 'cost' : picking.product_id.standard_price, + 'currency' : picking.product_id.company_id.currency_id.id, }) return move_memory - def __get_active_stock_pickings(self, cr, uid, context=None): - pick_obj = self.pool.get('stock.picking') - if not context: - context = {} - - res = [] - for pick in pick_obj.browse(cr, uid, context.get('active_ids', []), context): - need_product_cost = (pick.type == 'in') - for m in pick.move_lines: - if m.state in ('done', 'cancel'): - continue - res.append(self.__create_partial_picking_memory(m, need_product_cost)) - - return res - - _defaults = { - 'product_moves_in' : __get_active_stock_pickings, - 'product_moves_out' : __get_active_stock_pickings, - 'date' : lambda *a : time.strftime('%Y-%m-%d %H:%M:%S'), - } - - def do_partial(self, cr, uid, ids, context=None): """ Makes partial moves and pickings done. @param self: The object pointer. @@ -140,6 +135,9 @@ class stock_partial_picking(osv.osv_memory): @return: A dictionary which of fields with values. """ pick_obj = self.pool.get('stock.picking') + move_obj = self.pool.get('stock.move') + location_obj = self.pool.get('stock.location') + picking_ids = context.get('active_ids', False) partial = self.browse(cr, uid, ids[0], context=context) partial_datas = { @@ -147,40 +145,24 @@ class stock_partial_picking(osv.osv_memory): } for pick in pick_obj.browse(cr, uid, picking_ids, context=context): - need_product_cost = (pick.type == 'in') - moves_list = need_product_cost and partial.product_moves_in or partial.product_moves_out - p_moves = {} - for product_move in moves_list: - p_moves[product_move.move_id.id] = product_move - - - for move in pick.move_lines: - if move.state in ('done', 'cancel'): - continue - if not p_moves.get(move.id): - continue - - partial_datas['move%s' % (move.id)] = { - 'product_id' : p_moves[move.id].id, - 'product_qty' : p_moves[move.id].quantity, - 'product_uom' :p_moves[move.id].product_uom.id, - 'prodlot_id' : p_moves[move.id].prodlot_id.id, + picking_type = self.get_picking_type(cr, uid, pick, context=context) + moves_list = picking_type == 'in' and partial.product_moves_in or partial.product_moves_out + + for move in moves_list: + partial_datas['move%s' % (move.move_id.id)] = { + 'product_id': move.id, + 'product_qty': move.quantity, + 'product_uom': move.product_uom.id, + 'prodlot_id': move.prodlot_id.id, } - - - if (move.picking_id.type == 'in') and (move.product_id.cost_method == 'average'): + if (picking_type == 'in') and (move.product_id.cost_method == 'average'): partial_datas['move%s' % (move.id)].update({ - 'product_price' : p_moves[move.id].cost, - 'product_currency': p_moves[move.id].currency.id, + 'product_price' : move.cost, + 'product_currency': move.currency.id, }) pick_obj.do_partial(cr, uid, picking_ids, partial_datas, context=context) return {} - - - stock_partial_picking() - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file From 54970584f1b8372ffaf5cdddade1c7f7ad6c8c59 Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Tue, 11 Jan 2011 10:11:17 +0530 Subject: [PATCH 3/3] [ADD]purchase:Add Yml file which has product price Costing Method is Average Price bzr revid: ron@tinyerp.com-20110111044117-sn2y9gwqskqpqgml --- addons/purchase/__openerp__.py | 2 +- .../test/purchase_on_average_price.yml | 107 ++++++++++++++++++ 2 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 addons/purchase/test/purchase_on_average_price.yml diff --git a/addons/purchase/__openerp__.py b/addons/purchase/__openerp__.py index 58b049e130e..643ba4fc212 100644 --- a/addons/purchase/__openerp__.py +++ b/addons/purchase/__openerp__.py @@ -54,7 +54,7 @@ 'report/purchase_report_view.xml', 'board_purchase_view.xml', ], - 'test': [ + 'test': ['test/purchase_on_average_price.yml', 'test/purchase_from_order.yml', 'test/purchase_from_manual.yml', 'test/purchase_from_picking.yml', diff --git a/addons/purchase/test/purchase_on_average_price.yml b/addons/purchase/test/purchase_on_average_price.yml new file mode 100644 index 00000000000..42e5e369840 --- /dev/null +++ b/addons/purchase/test/purchase_on_average_price.yml @@ -0,0 +1,107 @@ +- + In order to test Checking of Cost price of product if the product price "Costing Method" + is "Average Price" and we change value of product on incoming shipment + +- + I create product. +- + !record {model: product.product, id: product_product_pen0 }: + categ_id: product.product_category_3 + cost_method: average + name: Pen drive + procure_method: make_to_stock + supply_method: buy + type: product + standard_price: 1500.0 + list_price: 1500.0 + supply_method: buy + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit + volume: 0.0 + warranty: 0.0 + weight: 0.0 + +- + Update Starting Real Stock And Virtual Stock threw Wizard +- + !record {model: stock.change.product.qty , id: stock_change_product_id }: + product_id: product_product_pen0 + new_quantity: 2.0 + location_id: stock.stock_location_stock +- + Then, Click on "Update Price" button of this wizard. +- + !python {model: stock.change.product.qty }: | + self.change_product_qty(cr, uid, [ref('stock_change_product_id')], {'active_id': ref('product_product_pen0')}) +- + I create purchase order for Pen drive. +- + !record {model: purchase.order, id: purchase_order_po11}: + company_id: base.main_company + date_order: '2010-05-11' + invoice_method: order + location_id: stock.stock_location_stock + order_line: + - date_planned: '2010-05-13' + name: Pen drive + price_unit: 1500.0 + product_id: 'product_product_pen0' + product_qty: 2.0 + product_uom: product.product_uom_unit + state: draft + partner_address_id: base.res_partner_address_7 + partner_id: base.res_partner_4 + pricelist_id: purchase.list0 +- + PO Initially in Draft State . +- + !assert {model: purchase.order, id: purchase_order_po11}: + - state == 'draft' +- + PO Going to Draft To Confirm State +- + !workflow {model: purchase.order, action: purchase_confirm, ref: purchase_order_po11} +- + I check that the Order has transit from draft state to confirm state. +- + !assert {model: purchase.order, id: purchase_order_po11}: + - state == 'approved' +- + I receive the order of the supplier the Incoming Shipments menu. +- + !python {model: stock.picking }: | + import time + procurement_obj = self.pool.get('procurement.order') + proc_ids = procurement_obj.browse(cr, uid, [ref('purchase_order_po11')])[0] + picking_ids = self.search(cr, uid, [('purchase_id', '=', proc_ids.id),('type','=','in')]) + pickings = self.browse(cr, uid, picking_ids) + for picking in pickings: + move = picking.move_lines[0] + partial_datas = { + 'partner_id': picking.address_id.partner_id.id, + 'address_id': picking.address_id.id, + 'delivery_date' : time.strftime('%Y-%m-%d') + } + partial_datas['move%s'%(move.id)]= { + 'product_id': move.product_id, + 'product_qty': move.product_qty, + 'product_uom': move.product_uom.id, + 'product_price' : 1000.0, + } + self.do_partial(cr, uid, [picking.id], partial_datas) +- + I confirm the Reservation. +- + !python {model: stock.move }: | + procurement_obj = self.pool.get('procurement.order') + picking_obj = self.pool.get('stock.picking') + proc_ids = procurement_obj.browse(cr, uid, [ref('purchase_order_po11')])[0] + picking_ids = picking_obj.search(cr, uid, [('purchase_id', '=', proc_ids.id),('type','=','in')]) + move_ids = self.search(cr, uid, [('picking_id', '=', picking_ids)]) + self.action_done(cr,uid,move_ids) +- + Compare With Avarage Price Has Been Updated that is Correct +- + !assert {model: product.product, id: product_product_pen0 ,string: Updated Avarage Price Has not been Correct}: + - standard_price == 1250 +