← Back to team overview

avanzosc team mailing list archive

Re: [Merge] lp:~mikelarregi/avanzosc/dos_refund_products into lp:~avanzosc-security-team/avanzosc/72horas

 

Review: Needs Fixing code review

Módulo bastante gordo.

Algunos cambios pequeños entre líneas, y en general, esta gente podría haber hecho mejor el módulo, sin esas comprobaciones de tipo de producto y acciones en consecuencia, pero bueno, no vamos a ser nosotros quienes cambiemos ahora todo el enfoque.

Un saludo.

Diff comments:

> === modified file 'dos_refund_products/__init__.py'
> --- dos_refund_products/__init__.py	2014-06-11 10:23:47 +0000
> +++ dos_refund_products/__init__.py	2014-06-26 13:41:20 +0000
> @@ -19,8 +19,7 @@
>  #
>  ##############################################################################
>  
> -import wizard
> -import refund_products
> -
> +from . import wizard
> +from . import models
>  
>  # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
> 
> === modified file 'dos_refund_products/__openerp__.py'
> --- dos_refund_products/__openerp__.py	2014-06-11 10:23:47 +0000
> +++ dos_refund_products/__openerp__.py	2014-06-26 13:41:20 +0000
> @@ -21,21 +21,17 @@
>  
>  
>  {
> -    "name" : "DOS Refund Products",
> -    "version" : "1.0",
> -    "author" : "DOS",
> -    "category" : "Enterprise Specific Modules",
> -    "website" : "www.dos-sl.es",
> +    "name": "DOS Refund Products",
> +    "version": "1.0",
> +    "author": "DOS",
> +    "category": "Enterprise Specific Modules",
> +    "website": "www.dos-sl.es",
>      "description": "This module allows refunds product and create pickings.",
> -    "depends" : ["base", "product", "stock", "dos_contracts"],
> -    "init_xml" : [],
> -    "update_xml" : [
> -					'security/ir.model.access.csv',
> -					'refund_products_view.xml',
> -                    'wizard/break_pack_product_view.xml',
> -	],
> -    "active": False,
> +    "depends": ["base", "product", "stock", "dos_contracts"],
> +    "data": [
> +        'security/ir.model.access.csv',
> +        'views/refund_products_view.xml',
> +        'wizard/break_pack_product_view.xml',
> +        ],
>      "installable": True
>  }
> -
> -
> 
> === added directory 'dos_refund_products/models'
> === added file 'dos_refund_products/models/__init__.py'
> --- dos_refund_products/models/__init__.py	1970-01-01 00:00:00 +0000
> +++ dos_refund_products/models/__init__.py	2014-06-26 13:41:20 +0000
> @@ -0,0 +1,22 @@
> +# -*- coding: utf-8 -*-
> +##############################################################################
> +#
> +#    OpenERP, Open Source Management Solution
> +#    Copyright (C) 2004-2010 DOS (<http://www.dos-sl.es>).
> +#
> +#    This program is free software: you can redistribute it and/or modify
> +#    it under the terms of the GNU Affero General Public License as
> +#    published by the Free Software Foundation, either version 3 of the
> +#    License, or (at your option) any later version.
> +#
> +#    This program is distributed in the hope that it will be useful,
> +#    but WITHOUT ANY WARRANTY; without even the implied warranty of
> +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +#    GNU Affero General Public License for more details.
> +#
> +#    You should have received a copy of the GNU Affero General Public License
> +#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
> +#
> +##############################################################################
> +
> +from . import refund_products
> \ No newline at end of file
> 
> === renamed file 'dos_refund_products/refund_products.py' => 'dos_refund_products/models/refund_products.py'
> --- dos_refund_products/refund_products.py	2014-06-11 10:23:47 +0000
> +++ dos_refund_products/models/refund_products.py	2014-06-26 13:41:20 +0000
> @@ -19,452 +19,546 @@
>  #
>  ##############################################################################
>  
> -from osv import osv
> +from openerp.osv import orm, fields
>  from osv import fields
>  from tools.translate import _
>  import time
>  import netsvc
>  
> -class refund_products(osv.osv):
> -	
> -	_name = 'refund.products' 
> -	_description = "Refund Products"
> -
> -	_columns = {    
> -		'date': fields.datetime('Date', required=True),
> -		'picking_in_id': fields.many2one('stock.picking', 'In Picking', readonly=True),
> -		'picking_out_id': fields.many2one('stock.picking', 'Out Picking', readonly=True),
> -		'refund_product_ids': fields.one2many('refund.product', 'refund_id', 'Refund Products'),
> -		'state': fields.selection( ( ('draft','Draft'), ('done','Done'),), readonly=True ), 
> -	}
> -	
> -	_defaults = {
> -		'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
> -		'state': lambda *a: 'draft',
> -	}
> -	
> -	_order = 'date desc'
> -	
> -	
> -	def _get_pack_products(self, cr, uid, stock_warehouse, pack_product, pack_production_lot):
> -		
> -		sale_obj = self.pool.get('sale.order')
> -		#stock_picking_obj = self.pool.get('stock.picking')
> -		#stock_move_obj = self.pool.get('stock.move')
> -		bom_obj = self.pool.get('mrp.bom')
> -		product_obj = self.pool.get('product.product')
> -		
> -		sim_product_id = None
> -		sim_production_lot_id = None
> -		link_product_id = None
> -		link_production_lot_id = None
> -			
> -		# Si el producto tiene como metodo suministro producir (Pack)
> -		# Creamos lineas con los materiales que lo componen
> -		if pack_product and pack_product.supply_method == 'produce':
> -
> -			bom_id = bom_obj._bom_find(cr, uid, pack_product.id, pack_product.uom_id and pack_product.uom_id.id, [])
> -			
> -			if bom_id:
> -				bom_point = bom_obj.browse(cr, uid, bom_id, context={})
> -				
> -				if bom_point.bom_lines:
> -
> -					#Recorremos materiales
> -					for bom_line in bom_point.bom_lines:
> -						prodlot_id = sale_obj._get_bom_product_lot(cr, uid, stock_warehouse, pack_production_lot.id, bom_line.product_id.id)
> -						
> -						#Si es SIM
> -						if product_obj._is_sim(bom_line.product_id.categ_id):
> -							sim_product_id = bom_line.product_id.id
> -							sim_production_lot_id = prodlot_id
> -														
> -						#Si es Enlace
> -						elif product_obj._is_link(bom_line.product_id.categ_id):
> -							link_product_id = bom_line.product_id.id
> -							link_production_lot_id = prodlot_id
> -		
> -		return sim_product_id, sim_production_lot_id, link_product_id, link_production_lot_id
> -							
> -
> -	def picking_processing(self, cr, uid, picking_ids, date, context=None):
> -		""" Makes partial moves and pickings done."""
> -		
> -		pick_obj = self.pool.get('stock.picking')
> -		
> -		partial_datas = {
> -			'delivery_date' : date
> -		}
> -
> -		for pick in pick_obj.browse(cr, uid, picking_ids, context=context):
> -
> -			for move in pick.move_lines:
> -				partial_datas['move%s' % (move.id)] = {
> -					'product_id': move.product_id.id, 
> -					'product_qty': move.product_qty, 
> -					'product_uom': move.product_uom.id, 
> -					'prodlot_id': move.prodlot_id.id, 
> -				}
> -
> -		pick_obj.do_partial(cr, uid, picking_ids, partial_datas, context=context)
> -		
> -
> -	def button_done(self, cr, uid, ids, context=None):
> -		if context is None:
> -			context = {}
> -			
> -		stock_warehouse_obj = self.pool.get('stock.warehouse')
> -		prod_obj = self.pool.get('product.product')
> -		pick_obj = self.pool.get('stock.picking')
> -		move_obj = self.pool.get('stock.move')
> -		prodlot_obj = self.pool.get('stock.production.lot')
> -		uom_obj = self.pool.get('product.uom')
> -		annexe_obj = self.pool.get('contract.annexe')
> -		wf_service = netsvc.LocalService("workflow")
> -		
> -		
> -		#Comprobamos que hay al menos un almacen definido
> -		stock_warehouse = None
> -		stock_warehouse_ids = stock_warehouse_obj.search(cr, uid, [])
> -		
> -		for warehouse in stock_warehouse_obj.browse(cr, uid, stock_warehouse_ids, context):
> -			stock_warehouse = warehouse
> -			break
> -		
> -		if not stock_warehouse:
> -			raise osv.except_osv(_('Stock Warehouse not defined !'), _('Stock Warehouse not defined.'))  
> -		
> -			
> -		data = self.browse(cr, uid, ids, context=context)
> -		
> -		for refund_products in data:
> -
> -			date_cur = refund_products.date
> -			
> -			if refund_products.refund_product_ids and refund_products.state in ('draft',):
> -				
> -				origin_partner = None
> -				new_picking_in = None
> -				new_picking_out = None
> -				
> -				for prod in refund_products.refund_product_ids:
> -					
> -					# Validaciones
> -					if prod_obj._is_sim(prod.product_id.categ_id) and prod_obj._is_sim(prod.refund_product_id.categ_id):
> -						annexe_ids = annexe_obj.search(cr, uid, [("product_id", "=", prod.product_id.id), ("production_lot_id", "=", prod.prodlot_id.id), ("active_annexe", "=", True)])
> -						annexe_subs_ids = annexe_obj.search(cr, uid, [("product_id", "=", prod.refund_product_id.id), ("production_lot_id", "=", prod.refund_prodlot_id.id), ("active_annexe", "=", True)])
> -						
> -					elif prod_obj._is_link(prod.product_id.categ_id) and prod_obj._is_link(prod.refund_product_id.categ_id):
> -						annexe_ids = annexe_obj.search(cr, uid, [("product_2_id", "=", prod.product_id.id), ("production_lot_2_id", "=", prod.prodlot_id.id), ("active_annexe", "=", True)])
> -						annexe_subs_ids = annexe_obj.search(cr, uid, [("product_2_id", "=", prod.refund_product_id.id), ("production_lot_2_id", "=", prod.refund_prodlot_id.id), ("active_annexe", "=", True)])						
> -						
> -					elif prod_obj._is_pack(prod.product_id.categ_id) and prod_obj._is_pack(prod.refund_product_id.categ_id):
> -						annexe_ids = annexe_obj.search(cr, uid, [("pack_product_id", "=", prod.product_id.id), ("pack_production_lot_id", "=", prod.prodlot_id.id), ("active_annexe", "=", True)])
> -						annexe_subs_ids = annexe_obj.search(cr, uid, [("pack_product_id", "=", prod.refund_product_id.id), ("pack_production_lot_id", "=", prod.refund_prodlot_id.id), ("active_annexe", "=", True)])					
> -						
> -					else:
> -						raise osv.except_osv(_('Error !'), _('Can not return products with different category.'))
> -					
> -					annexe_id = annexe_ids and annexe_ids[0] or None
> -					annexe_subs_id = annexe_subs_ids and annexe_subs_ids[0] or None
> -
> -					#Obtenemos movimiento de salida del producto devuelto
> -					refund_prodlot = prod.refund_prodlot_id
> -					move = refund_prodlot.move_ids and refund_prodlot.move_ids[0] or None
> -					
> -					for m in refund_prodlot.move_ids:
> -						if m.location_id.id == stock_warehouse.lot_stock_id.id and m.picking_id:
> -							move = m
> -							break
> -					
> -					#Obtenemos movimiento de entrada del producto sustitucion
> -					subs_prodlot = prod.prodlot_id
> -					move_subs = subs_prodlot.move_ids and subs_prodlot.move_ids[0] or None
> -					
> -					for m in subs_prodlot.move_ids:
> -						if m.location_dest_id.id == stock_warehouse.lot_stock_id.id:
> -							move_subs = m
> -							break					
> -					
> -					#Evitamos que se devuelvan productos procedentes de distintos clientes
> -					if origin_partner and move and move.picking_id.partner_id and origin_partner != move.picking_id.partner_id.id:
> -						raise osv.except_osv(_('Error !'), _('Can not return products from different partner.'))
> -						
> -					if move and move.state == 'done' and move.picking_id.type in ('internal', 'out'):
> -						
> -						origin_partner = move.picking_id.partner_id and move.picking_id.partner_id.id or None
> -						
> -						# Comprobamos que el articulo de sustitución no está asignado ya en un anexo.
> -						# En el caso que lo esté, intercambiamos productos entre ellos.
> -						if annexe_id and annexe_subs_id:
> -							
> -							annexe = annexe_obj.browse(cr, uid, annexe_id, context)
> -							
> -							pack_product_id = annexe.pack_product_id.id
> -							pack_production_lot_id = annexe.pack_production_lot_id.id
> -							product_id = annexe.product_id.id
> -							production_lot_id = annexe.production_lot_id.id
> -							product_2_id = annexe.product_2_id.id
> -							production_lot_2_id = annexe.production_lot_2_id.id
> -							
> -							annexe_subs = annexe_obj.browse(cr, uid, annexe_subs_id, context)
> -							
> -							subs_pack_product_id = annexe_subs.pack_product_id.id
> -							subs_pack_production_lot_id = annexe_subs.pack_production_lot_id.id
> -							subs_product_id = annexe_subs.product_id.id
> -							subs_production_lot_id = annexe_subs.production_lot_id.id
> -							subs_product_2_id = annexe_subs.product_2_id.id
> -							subs_production_lot_2_id = annexe_subs.production_lot_2_id.id							
> -
> -							# Intercambiamos productos entre anexos
> -							vals = {}
> -							
> -							# SIM
> -							if prod_obj._is_sim(prod.refund_product_id.categ_id):
> -								vals = {'product_id': prod.refund_product_id.id, 'production_lot_id': prod.refund_prodlot_id.id}
> -							# Enlace
> -							elif prod_obj._is_link(prod.refund_product_id.categ_id):
> -								vals = {'product_2_id': prod.refund_product_id.id, 'production_lot_2_id': prod.refund_prodlot_id.id}
> -							# Pack
> -							elif prod_obj._is_pack(prod.refund_product_id.categ_id):
> -								# Obtenemos productos que forman el pack
> -								#product_id, production_lot_id, product_2_id, production_lot_2_id = self._get_pack_products(cr, uid, stock_warehouse, prod.refund_product_id, prod.refund_prodlot_id)
> -
> -								vals = {'pack_product_id': subs_pack_product_id, 
> -										'pack_production_lot_id': subs_pack_production_lot_id,
> -										'product_id': subs_product_id, 
> -										'production_lot_id': subs_production_lot_id,
> -										'product_2_id': subs_product_2_id, 
> -										'production_lot_2_id': subs_production_lot_2_id,
> -								}
> -								
> -							if vals:
> -								annexe_obj.write(cr, uid, [annexe_id], vals)
> -								
> -								
> -							vals_subs = {}
> -							
> -							# SIM
> -							if prod_obj._is_sim(prod.product_id.categ_id):
> -								vals_subs = {'product_id': prod.product_id.id, 'production_lot_id': prod.prodlot_id.id}
> -							# Enlace
> -							elif prod_obj._is_link(prod.product_id.categ_id):
> -								vals_subs = {'product_2_id': prod.product_id.id, 'production_lot_2_id': prod.prodlot_id.id}
> -							# Pack
> -							elif prod_obj._is_pack(prod.product_id.categ_id):
> -								# Obtenemos productos que forman el pack
> -								#product_id, production_lot_id, product_2_id, production_lot_2_id = self._get_pack_products(cr, uid, stock_warehouse, prod.product_id, prod.prodlot_id)
> -								
> -								vals_subs = {'pack_product_id': pack_product_id, 
> -											'pack_production_lot_id': pack_production_lot_id,
> -											'product_id': product_id, 
> -											'production_lot_id': production_lot_id,
> -											'product_2_id': product_2_id, 
> -											'production_lot_2_id': production_lot_2_id,
> -								}
> -								
> -							if vals_subs:
> -								annexe_obj.write(cr, uid, [annexe_subs_id], vals_subs)
> -							
> -						else:
> -							# Obtenemos datos del anexo o en su defecto del movimiento
> -							annexe_subs = annexe_subs_id and annexe_obj.browse(cr, uid, annexe_subs_id) or None 
> -							contract_subs = annexe_subs and annexe_subs.contract_id or None
> -							
> -							picking_vals = {
> -								'partner_id':contract_subs and contract_subs.customer_id.id or move.picking_id.partner_id.id,
> -		                        'address_id':contract_subs and contract_subs.customer_address_id.id or move.picking_id.address_id.id,
> -		                        'elevator_partner_id':contract_subs and contract_subs.elevator_id and contract_subs.elevator_id.id or (move.picking_id.elevator_partner_id and move.picking_id.elevator_partner_id.id or None),
> -		                        'elevator_invoice_id':contract_subs and contract_subs.elevator_address_id and contract_subs.elevator_address_id.id or (move.picking_id.elevator_invoice_id and move.picking_id.elevator_invoice_id.id or None),
> -		                        'middleman_partner_id':contract_subs and contract_subs.middleman_id and contract_subs.middleman_id.id or (move.picking_id.middleman_partner_id and move.picking_id.middleman_partner_id.id or None),
> -		                        'contract_id':contract_subs and contract_subs.id or (move.picking_id.contract_id and move.picking_id.contract_id.id or None),
> -							}
> -							
> -							#Creamos albaran de entrada con los productos devueltos
> -							if not new_picking_in:
> -								type = 'in'
> -
> -								vals = {#'name':'%s-return' % move.picking_id.name,
> -										'name':self.pool.get('ir.sequence').get(cr, uid, 'stock.picking.in'),
> -				                        'move_lines':[], 
> -				                        'state':'draft', 
> -				                        'type':type,
> -				                        'date':date_cur, 
> -				                        'invoice_state':'none',
> -									}
> -								
> -								vals.update(picking_vals)
> -								
> -								new_picking_in = pick_obj.copy(cr, uid, move.picking_id.id, vals)
> -							
> -							#Creamos lineas de albarán de entrada
> -							new_location=move.location_dest_id.id
> -							new_qty = 1
> -							
> -							vals = {
> -								'product_qty': new_qty,
> -								'product_uos_qty': uom_obj._compute_qty(cr, uid, move.product_uom.id, new_qty, move.product_uos.id),
> -								'picking_id':new_picking_in, 
> -								'state':'draft',
> -								'location_id':new_location, 
> -								'location_dest_id':prod.location_dest_id and prod.location_dest_id.id or move.location_id.id,
> -								'date':date_cur,}
> -			
> -							new_move = move_obj.copy(cr, uid, move.id, vals)
> -							move_obj.write(cr, uid, [move.id], {'move_history_ids2':[(4,new_move)]})
> -							
> -							
> -							#Creamos albaran de salida con los productos sustituidos
> -							if not new_picking_out:
> -								type = 'out'
> -
> -								vals = {#'name':'%s-replace' % move.picking_id.name,
> -										'name': self.pool.get('ir.sequence').get(cr, uid, 'stock.picking.out'),
> -				                        'move_lines':[], 
> -				                        'state':'draft', 
> -				                        'type':type,
> -				                        'date':date_cur,
> -				                        'invoice_state':'none',
> -									}
> -								
> -								vals.update(picking_vals)
> -								
> -								new_picking_out = pick_obj.copy(cr, uid, move.picking_id.id, vals)
> -								
> -							#Creamos lineas de albarán de salida
> -							# 	Los almacenes de destino serán los mismos que los del movimiento origen de la sustitucion
> -							#	Cambia producto y lote
> -							new_qty = 1
> -							new_product_id = prod.product_id.id
> -							new_prodlot_id = prod.prodlot_id.id
> -							
> -							vals = {
> -								'product_qty': new_qty,
> -								'product_uos_qty': uom_obj._compute_qty(cr, uid, move.product_uom.id, new_qty, move.product_uos.id),
> -								'picking_id':new_picking_out, 
> -								'state':'draft',
> -								'product_id':new_product_id, 
> -								'prodlot_id':new_prodlot_id,
> -								'date':date_cur,
> -								'contract_id':contract_subs and contract_subs.id or None,
> -								'contract_annexe_id':annexe_subs and annexe_subs.id or None,
> -								}
> -			
> -							new_move = move_obj.copy(cr, uid, move.id, vals)
> -							#move_obj.write(cr, uid, [move.id], {'move_history_ids2':[(4,new_move)]})
> -							
> -							#Actualizamos anexo con los nuevos productos sustituidos
> -							if annexe_subs_id:
> -								vals = {}
> -								
> -								# SIM
> -								if prod_obj._is_sim(prod.product_id.categ_id):
> -									vals = {'product_id': new_product_id, 'production_lot_id': new_prodlot_id}
> -								# Enlace
> -								elif prod_obj._is_link(prod.product_id.categ_id):
> -									vals = {'product_2_id': new_product_id, 'production_lot_2_id': new_prodlot_id}
> -								# Pack
> -								elif prod_obj._is_pack(prod.product_id.categ_id):
> -									# Obtenemos productos que forman el pack
> -									product_id, production_lot_id, product_2_id, production_lot_2_id = self._get_pack_products(cr, uid, stock_warehouse, prod.product_id, prod.prodlot_id)
> -									
> -									vals = {'pack_product_id': new_product_id, 
> -											'pack_production_lot_id': new_prodlot_id,
> -											'product_id': product_id, 
> -											'production_lot_id': production_lot_id,
> -											'product_2_id': product_2_id, 
> -											'production_lot_2_id': production_lot_2_id,
> -										}
> -									
> -								if vals:
> -									annexe_obj.write(cr, uid, [annexe_subs_id], vals)
> -		
> -
> -				"""
> -				if not new_picking_in or not new_picking_out:
> -					
> -					raise osv.except_osv(_('Error !'), _('Could not make the return of the products.'))
> -				"""
> -				
> -				if new_picking_in:
> -
> -					#Confirmamos albarán de entrada
> -					wf_service.trg_validate(uid, 'stock.picking', new_picking_in, 'button_confirm', cr)
> -					pick_obj.force_assign(cr, uid, [new_picking_in], context)
> -					
> -					#Procesamos albarán de entrada
> -					self.picking_processing(cr, uid, [new_picking_in], date_cur, context)
> -					
> -				if new_picking_out:
> -							
> -					#Confirmamos albarán de salida
> -					wf_service.trg_validate(uid, 'stock.picking', new_picking_out, 'button_confirm', cr)
> -					pick_obj.force_assign(cr, uid, [new_picking_out], context)
> -					
> -					#Procesamos albarán de entrada
> -					self.picking_processing(cr, uid, [new_picking_out], date_cur, context)
> -					
> -			else:
> -				raise osv.except_osv(_('Error !'), _('There are no products to return.'))               
> -					
> -		return self.write(cr, uid, ids, {'state':'done', 
> -										 'picking_in_id': new_picking_in, 
> -										 'picking_out_id': new_picking_out}, context=context)
> -				
> -refund_products()
> -
> -
> -class refund_product(osv.osv):
> -	
> -	_name = 'refund.product' 
> -	_description = "Refund Product"
> -
> -	_columns = { 
> -		'refund_id': fields.many2one('refund.products', 'Refund Products', select=True, required=True),   
> -		'refund_product_id': fields.many2one('product.product', 'Refund Product', select=True, required=True),
> -		'refund_prodlot_id': fields.many2one('stock.production.lot', 'Refund Product Lot', select=True, required=True),
> -		'product_id': fields.many2one('product.product', 'Substitution Product', select=True, required=True),
> -		'prodlot_id': fields.many2one('stock.production.lot', 'Substitution Product Lot', select=True, required=True),
> -		'location_id': fields.many2one('stock.location', 'Source Location', select=True, store=True, required=True),
> -		'location_dest_id': fields.many2one('stock.location', 'Destination Location', required=True),
> -	}
> -	
> -	def onchange_refund_product(self, cr, uid, ids, product_id=False, prodlot_id=False):
> -		if not product_id or not prodlot_id:
> -			return {'value': {'location_id': False, 'location_dest_id': False}}
> -
> -
> -		stock_warehouse_obj = self.pool.get('stock.warehouse')
> -		prodlot_obj = self.pool.get('stock.production.lot')
> -		
> -		#Comprobamos que hay al menos un almacen definido
> -		stock_warehouse = None
> -		stock_warehouse_ids = stock_warehouse_obj.search(cr, uid, [])
> -		
> -		for warehouse in stock_warehouse_obj.browse(cr, uid, stock_warehouse_ids, context=None):
> -			stock_warehouse = warehouse
> -			break
> -		
> -		if not stock_warehouse:
> -			raise osv.except_osv(_('Stock Warehouse not defined !'), _('Stock Warehouse not defined.'))  
> -		
> -		#Obtenemos movimiento de salida del producto devuelto
> -		prodlot = prodlot_obj.browse(cr, uid, prodlot_id)
> -		
> -		move = prodlot.move_ids and prodlot.move_ids[0] or None
> -		
> -		for m in prodlot.move_ids:
> -			if m.location_id.id == stock_warehouse.lot_stock_id.id and m.picking_id:
> -				move = m
> -				break
> -
> -		val = {
> -			'location_id': move and move.location_dest_id and move.location_dest_id.id or False,
> -			'location_dest_id': stock_warehouse.lot_stock_id.id,
> -		}
> -
> -		return {'value': val}
> -
> -refund_product()
> -
> -
> +
> +class RefundProducts(orm.Model):
> +    _name = 'refund.products'
> +    _description = "Refund Products"
> +    _columns = {
> +        'date': fields.datetime('Date', required=True),
> +        'picking_in_id': fields.many2one('stock.picking', 'In Picking',

Esto tendría que ser stock.picking.in

> +                                         readonly=True),
> +        'picking_out_id': fields.many2one('stock.picking', 'Out Picking',

Esto tendría que ser stock.picking.out

> +                                          readonly=True),
> +        'refund_product_ids': fields.one2many('refund.product', 'refund_id',
> +                                              'Refund Products'),
> +        'state': fields.selection((('draft', 'Draft'), ('done', 'Done'), ),
> +                                  readonly=True),
> +    }
> +    _defaults = {
> +        'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
> +        'state': lambda *a: 'draft',

Aquí no hace falta lambda

> +    }
> +    _order = 'date desc'
> +
> +    def _get_pack_products(self, cr, uid, stock_warehouse, pack_product,
> +                           pack_production_lot):
> +        sale_obj = self.pool['sale.order']
> +        # stock_picking_obj = self.pool.get('stock.picking')
> +        # stock_move_obj = self.pool.get('stock.move')
> +        bom_obj = self.pool['mrp.bom']
> +        product_obj = self.pool['product.product']
> +        sim_product_id = None
> +        sim_production_lot_id = None
> +        link_product_id = None
> +        link_production_lot_id = None
> +        # Si el producto tiene como metodo suministro producir (Pack)
> +        # Creamos lineas con los materiales que lo componen
> +        if pack_product and pack_product.supply_method == 'produce':
> +            bom_id = bom_obj._bom_find(cr, uid, pack_product.id,
> +                                       (pack_product.uom_id and
> +                                        pack_product.uom_id.id), [])
> +            if bom_id:
> +                bom_point = bom_obj.browse(cr, uid, bom_id, context={})
> +                if bom_point.bom_lines:
> +                    # Recorremos materiales
> +                    for bom_line in bom_point.bom_lines:
> +                        prodlot_id = sale_obj._get_bom_product_lot(
> +                            cr, uid, stock_warehouse, pack_production_lot.id,
> +                            bom_line.product_id.id)
> +                        # Si es SIM
> +                        if product_obj._is_sim(bom_line.product_id.categ_id):
> +                            sim_product_id = bom_line.product_id.id
> +                            sim_production_lot_id = prodlot_id
> +                        # Si es Enlace
> +                        elif product_obj._is_link(
> +                                bom_line.product_id.categ_id):
> +                            link_product_id = bom_line.product_id.id
> +                            link_production_lot_id = prodlot_id
> +        return (sim_product_id, sim_production_lot_id, link_product_id,
> +                link_production_lot_id)
> +
> +    def picking_processing(self, cr, uid, picking_ids, date, context=None):
> +        """ Makes partial moves and pickings done."""
> +        pick_obj = self.pool['stock.picking']
> +        partial_datas = {
> +            'delivery_date': date
> +        }
> +        for pick in pick_obj.browse(cr, uid, picking_ids, context=context):
> +            for move in pick.move_lines:
> +                partial_datas['move%s' % (move.id)] = {
> +                    'product_id': move.product_id.id,
> +                    'product_qty': move.product_qty,
> +                    'product_uom': move.product_uom.id,
> +                    'prodlot_id': move.prodlot_id.id,
> +                }
> +        pick_obj.do_partial(cr, uid, picking_ids, partial_datas,
> +                            context=context)
> +
> +    def button_done(self, cr, uid, ids, context=None):
> +        if context is None:
> +            context = {}
> +        stock_warehouse_obj = self.pool['stock.warehouse']
> +        prod_obj = self.pool['product.product']
> +        pick_obj = self.pool['stock.picking']
> +        move_obj = self.pool['stock.move']
> +        prodlot_obj = self.pool['stock.production.lot']
> +        uom_obj = self.pool['product.uom']
> +        annexe_obj = self.pool['contract.annexe']
> +        wf_service = netsvc.LocalService("workflow")
> +        # Comprobamos que hay al menos un almacen definido
> +        stock_warehouse = None

Este es un código espaguetti total. Pregúntale a Oihane cómo lo ha resuelto, que también tenía ella este mismo código.

> +        stock_warehouse_ids = stock_warehouse_obj.search(cr, uid, [])
> +        for warehouse in stock_warehouse_obj.browse(cr, uid,
> +                                                    stock_warehouse_ids,
> +                                                    context):
> +            stock_warehouse = warehouse
> +            break
> +        if not stock_warehouse:
> +            raise orm.except_orm(_('Stock Warehouse not defined !'),
> +                                 _('Stock Warehouse not defined.'))
> +        data = self.browse(cr, uid, ids, context=context)
> +        for refund_products in data:
> +            date_cur = refund_products.date
> +            if (refund_products.refund_product_ids and
> +                    refund_products.state in ('draft',)):
> +                origin_partner = None
> +                new_picking_in = None
> +                new_picking_out = None
> +                for prod in refund_products.refund_product_ids:
> +                    # Validaciones
> +                    if (prod_obj._is_sim(prod.product_id.categ_id) and
> +                            prod_obj._is_sim(prod.refund_product_id.categ_id)):
> +                        annexe_ids = annexe_obj.search(
> +                            cr, uid, [("product_id", "=", prod.product_id.id),
> +                                      ("production_lot_id", "=",
> +                                       prod.prodlot_id.id),
> +                                      ("active_annexe", "=", True)])
> +                        annexe_subs_ids = annexe_obj.search(
> +                            cr, uid, [("product_id", "=",
> +                                       prod.refund_product_id.id),
> +                                      ("production_lot_id", "=",
> +                                       prod.refund_prodlot_id.id),
> +                                      ("active_annexe", "=", True)])
> +                    elif (prod_obj._is_link(prod.product_id.categ_id) and
> +                            prod_obj._is_link(
> +                                prod.refund_product_id.categ_id)):
> +                        annexe_ids = annexe_obj.search(
> +                            cr, uid,
> +                            [("product_2_id", "=", prod.product_id.id),
> +                             ("production_lot_2_id", "=", prod.prodlot_id.id),
> +                             ("active_annexe", "=", True)])
> +                        annexe_subs_ids = annexe_obj.search(
> +                            cr, uid, [("product_2_id", "=",
> +                                       prod.refund_product_id.id),
> +                                      ("production_lot_2_id", "=",
> +                                       prod.refund_prodlot_id.id),
> +                                      ("active_annexe", "=", True)])
> +                    elif (prod_obj._is_pack(prod.product_id.categ_id) and
> +                            prod_obj._is_pack(
> +                                prod.refund_product_id.categ_id)):
> +                        annexe_ids = (annexe_obj.search(
> +                            cr, uid, [("pack_product_id", "=",
> +                                       prod.product_id.id),
> +                                      ("pack_production_lot_id", "=",
> +                                       prod.prodlot_id.id),
> +                                      ("active_annexe", "=", True)]))
> +                        annexe_subs_ids = annexe_obj.search(
> +                            cr, uid, [("pack_product_id", "=",
> +                                      prod.refund_product_id.id),
> +                                      ("pack_production_lot_id", "=",
> +                                      prod.refund_prodlot_id.id),
> +                                      ("active_annexe", "=", True)])
> +                    else:
> +                        raise orm.except_orm(_('Error !'),
> +                                             _('Can not return products'
> +                                               ' with different category.'))
> +                    annexe_id = annexe_ids and annexe_ids[0] or None
> +                    annexe_subs_id = (annexe_subs_ids and annexe_subs_ids[0]
> +                                      or None)
> +                    # Obtenemos movimiento de salida del producto devuelto
> +                    refund_prodlot = prod.refund_prodlot_id
> +                    move = (refund_prodlot.move_ids and
> +                            refund_prodlot.move_ids[0] or None)
> +                    for m in refund_prodlot.move_ids:
> +                        if m.location_id.id == (stock_warehouse.lot_stock_id.id
> +                                                and m.picking_id):
> +                            move = m
> +                            break
> +                    # Obtenemos movimiento de entrada del producto sustitucion
> +                    subs_prodlot = prod.prodlot_id
> +                    move_subs = (subs_prodlot.move_ids and
> +                                 subs_prodlot.move_ids[0] or None)
> +                    for m in subs_prodlot.move_ids:
> +                        if (m.location_dest_id.id ==
> +                                stock_warehouse.lot_stock_id.id):
> +                            move_subs = m
> +                            break
> +                    # Evitamos que se devuelvan productos
> +                    # procedentes de distintos clientes
> +                    if (origin_partner and move and move.picking_id.partner_id
> +                            and origin_partner !=
> +                            move.picking_id.partner_id.id):
> +                        raise orm.except_orm(_('Error !'),
> +                                             _('Can not return products '
> +                                               'from different partner.'))
> +                    if move and move.state == ('done' and move.picking_id.type
> +                                               in ('internal', 'out')):
> +                        origin_partner = (move.picking_id.partner_id and
> +                                          move.picking_id.partner_id.id
> +                                          or None)
> +                        # Comprobamos que el articulo de sustitución
> +                        # no está asignado ya en un anexo. En el caso
> +                        # que lo esté, intercambiamos productos entre ellos.
> +                        if annexe_id and annexe_subs_id:
> +                            annexe = annexe_obj.browse(cr, uid, annexe_id,
> +                                                       context)
> +                            pack_product_id = annexe.pack_product_id.id
> +                            pack_production_lot_id = (
> +                                annexe.pack_production_lot_id.id)
> +                            product_id = annexe.product_id.id
> +                            production_lot_id = annexe.production_lot_id.id
> +                            product_2_id = annexe.product_2_id.id
> +                            production_lot_2_id = annexe.production_lot_2_id.id
> +                            annexe_subs = annexe_obj.browse(
> +                                cr, uid, annexe_subs_id, context)
> +                            subs_pack_product_id = (
> +                                annexe_subs.pack_product_id.id)
> +                            subs_pack_production_lot_id = (
> +                                annexe_subs.pack_production_lot_id.id)
> +                            subs_product_id = annexe_subs.product_id.id
> +                            subs_production_lot_id = (
> +                                annexe_subs.production_lot_id.id)
> +                            subs_product_2_id = annexe_subs.product_2_id.id
> +                            subs_production_lot_2_id = (
> +                                annexe_subs.production_lot_2_id.id)
> +                            # Intercambiamos productos entre anexos
> +                            vals = {}
> +                            # SIM
> +                            if prod_obj._is_sim(
> +                                    prod.refund_product_id.categ_id):
> +                                vals = {
> +                                    'product_id':
> +                                        prod.refund_product_id.id,
> +                                    'production_lot_id':
> +                                        prod.refund_prodlot_id.id
> +                                    }
> +                            # Enlace
> +                            elif prod_obj._is_link(
> +                                    prod.refund_product_id.categ_id):
> +                                vals = {
> +                                    'product_2_id': prod.refund_product_id.id,
> +                                    'production_lot_2_id':
> +                                        prod.refund_prodlot_id.id
> +                                    }
> +                            # Pack
> +                            elif prod_obj._is_pack(
> +                                    prod.refund_product_id.categ_id):
> +                                # Obtenemos productos que forman el pack
> +                                # product_id, production_lot_id, product_2_id,
> +                                # production_lot_2_id = self._get_pack_products
> +                                # (cr, uid, stock_warehouse, prod.
> +                                # refund_product_id, prod.refund_prodlot_id)
> +                                vals = {
> +                                    'pack_product_id': subs_pack_product_id,
> +                                    'pack_production_lot_id':
> +                                        subs_pack_production_lot_id,
> +                                    'product_id': subs_product_id,
> +                                    'production_lot_id':
> +                                        subs_production_lot_id,
> +                                    'product_2_id': subs_product_2_id,
> +                                    'production_lot_2_id':
> +                                        subs_production_lot_2_id,
> +                                    }
> +                            if vals:
> +                                annexe_obj.write(cr, uid, [annexe_id], vals)
> +                            vals_subs = {}
> +                            # SIM
> +                            if prod_obj._is_sim(prod.product_id.categ_id):
> +                                vals_subs = {
> +                                    'product_id': prod.product_id.id,
> +                                    'production_lot_id': prod.prodlot_id.id
> +                                    }
> +                            # Enlace
> +                            elif prod_obj._is_link(prod.product_id.categ_id):
> +                                vals_subs = {
> +                                    'product_2_id': prod.product_id.id,
> +                                    'production_lot_2_id': prod.prodlot_id.id
> +                                    }
> +                            # Pack
> +                            elif prod_obj._is_pack(prod.product_id.categ_id):
> +                                # Obtenemos productos que forman el pack
> +                                # product_id, production_lot_id, product_2_id,
> +                                # production_lot_2_id = self._get_pack_products
> +                                # (cr, uid, stock_warehouse, prod.product_id,
> +                                # prod.prodlot_id)
> +                                vals_subs = {
> +                                    'pack_product_id': pack_product_id,
> +                                    'pack_production_lot_id':
> +                                        pack_production_lot_id,
> +                                    'product_id': product_id,
> +                                    'production_lot_id': production_lot_id,
> +                                    'product_2_id': product_2_id,
> +                                    'production_lot_2_id': production_lot_2_id,
> +                                    }
> +                            if vals_subs:
> +                                annexe_obj.write(cr, uid, [annexe_subs_id],
> +                                                 vals_subs)
> +                        else:
> +                            # Obtenemos datos del anexo
> +                            # o en su defecto del movimiento
> +                            annexe_subs = (annexe_subs_id and
> +                                           annexe_obj.browse(cr, uid,
> +                                                             annexe_subs_id)
> +                                           or None)
> +                            contract_subs = (annexe_subs and
> +                                             annexe_subs.contract_id or None)
> +                            picking_vals = {
> +                                'partner_id': (
> +                                    contract_subs and
> +                                    contract_subs.customer_id.id or
> +                                    move.picking_id.partner_id.id),
> +                                'address_id': (
> +                                    contract_subs and
> +                                    contract_subs.customer_address_id.id or
> +                                    move.picking_id.address_id.id),
> +                                'elevator_partner_id': (
> +                                    contract_subs and
> +                                    contract_subs.elevator_id and
> +                                    contract_subs.elevator_id.id or
> +                                    (move.picking_id.elevator_partner_id and
> +                                     move.picking_id.elevator_partner_id.id
> +                                     or None)),
> +                                'elevator_invoice_id': (
> +                                    contract_subs and
> +                                    contract_subs.elevator_address_id and
> +                                    contract_subs.elevator_address_id.id or
> +                                    (move.picking_id.elevator_invoice_id and
> +                                     move.picking_id.elevator_invoice_id.id
> +                                     or None)),
> +                                'middleman_partner_id': (
> +                                    contract_subs and
> +                                    contract_subs.middleman_id and
> +                                    contract_subs.middleman_id.id or
> +                                    (move.picking_id.middleman_partner_id and
> +                                     move.picking_id.middleman_partner_id.id
> +                                     or None)),
> +                                'contract_id': (
> +                                    contract_subs and contract_subs.id or
> +                                    (move.picking_id.contract_id and
> +                                     move.picking_id.contract_id.id or None)),
> +                            }
> +                            # Creamos albaran de entrada con
> +                            # los productos devueltos
> +                            if not new_picking_in:
> +                                type = 'in'
> +                                vals = {
> +                                    # 'name':'%s-return' %
> +                                    # move.picking_id.name,
> +                                    'name': self.pool['ir.sequence'].get(
> +                                        cr, uid, 'stock.picking.in'),
> +                                    'move_lines': [],
> +                                    'state': 'draft',
> +                                    'type': type,
> +                                    'date': date_cur,
> +                                    'invoice_state': 'none',
> +                                    }
> +                                vals.update(picking_vals)
> +                                new_picking_in = pick_obj.copy(
> +                                    cr, uid, move.picking_id.id, vals)
> +                            # Creamos lineas de albarán de entrada
> +                            new_location = move.location_dest_id.id
> +                            new_qty = 1
> +                            vals = {
> +                                'product_qty': new_qty,
> +                                'product_uos_qty': uom_obj._compute_qty(
> +                                    cr, uid, move.product_uom.id, new_qty,
> +                                    move.product_uos.id),
> +                                'picking_id': new_picking_in,
> +                                'state': 'draft',
> +                                'location_id': new_location,
> +                                'location_dest_id': (
> +                                    prod.location_dest_id and
> +                                    prod.location_dest_id.id or
> +                                    move.location_id.id),
> +                                'date': date_cur}
> +                            new_move = move_obj.copy(cr, uid, move.id, vals)
> +                            move_obj.write(cr, uid, [move.id],
> +                                           {'move_history_ids2':
> +                                            [(4, new_move)]})
> +                            # Creamos albaran de salida
> +                            # con los productos sustituidos
> +                            if not new_picking_out:
> +                                type = 'out'
> +                                vals = {
> +                                    # 'name':'%s-replace' %
> +                                    # move.picking_id.name,
> +                                    'name': self.pool['ir.sequence'].get(
> +                                        cr, uid, 'stock.picking.out'),
> +                                    'move_lines': [],
> +                                    'state': 'draft',
> +                                    'type': type,
> +                                    'date': date_cur,
> +                                    'invoice_state': 'none',
> +                                    }
> +                                vals.update(picking_vals)
> +                                new_picking_out = pick_obj.copy(
> +                                    cr, uid, move.picking_id.id, vals)
> +                            # Creamos lineas de albarán de salida
> +                            # Los almacenes de destino serán los mismos que
> +                            # los del movimiento origen de la sustitucion
> +                            # Cambia producto y lote
> +                            new_qty = 1
> +                            new_product_id = prod.product_id.id
> +                            new_prodlot_id = prod.prodlot_id.id
> +                            vals = {
> +                                'product_qty': new_qty,
> +                                'product_uos_qty': uom_obj._compute_qty(
> +                                    cr, uid, move.product_uom.id, new_qty,
> +                                    move.product_uos.id),
> +                                'picking_id': new_picking_out,
> +                                'state': 'draft',
> +                                'product_id': new_product_id,
> +                                'prodlot_id': new_prodlot_id,
> +                                'date': date_cur,
> +                                'contract_id': (contract_subs and
> +                                                contract_subs.id or None),
> +                                'contract_annexe_id': (annexe_subs and
> +                                                       annexe_subs.id or None),
> +                                }
> +                            new_move = move_obj.copy(cr, uid, move.id, vals)
> +                            # move_obj.write(cr, uid, [move.id],
> +                            # {'move_history_ids2':[(4,new_move)]})
> +                            # Actualizamos anexo con
> +                            # los nuevos productos sustituidos
> +                            if annexe_subs_id:
> +                                vals = {}
> +                                # SIM
> +                                if prod_obj._is_sim(prod.product_id.categ_id):
> +                                    vals = {
> +                                        'product_id': new_product_id,
> +                                        'production_lot_id': new_prodlot_id
> +                                        }
> +                                # Enlace
> +                                elif prod_obj._is_link(
> +                                        prod.product_id.categ_id):
> +                                    vals = {
> +                                        'product_2_id': new_product_id,
> +                                        'production_lot_2_id': new_prodlot_id
> +                                        }
> +                                # Pack
> +                                elif prod_obj._is_pack(
> +                                        prod.product_id.categ_id):
> +                                    # Obtenemos productos que forman el pack
> +                                    (product_id, production_lot_id,
> +                                     product_2_id, production_lot_2_id) = (
> +                                        self._get_pack_products(
> +                                            cr, uid, stock_warehouse,
> +                                            prod.product_id, prod.prodlot_id))
> +                                    vals = {
> +                                        'pack_product_id': new_product_id,
> +                                        'pack_production_lot_id':
> +                                            new_prodlot_id,
> +                                        'product_id': product_id,
> +                                        'production_lot_id':
> +                                            production_lot_id,
> +                                        'product_2_id': product_2_id,
> +                                        'production_lot_2_id':
> +                                            production_lot_2_id,
> +                                        }
> +                                if vals:
> +                                    annexe_obj.write(cr, uid, [annexe_subs_id],
> +                                                     vals)
> +                """

Este texto no pinta nada aquí. No daría error, pero daría esa salida por consola. Lo que querían yo creo es comentar ese trozo de código.

> +                if not new_picking_in or not new_picking_out:
> +                    raise osv.except_osv(_('Error !'),
> +                    _('Could not make the return of the products.'))
> +                """
> +                if new_picking_in:
> +                    # Confirmamos albarán de entrada
> +                    wf_service.trg_validate(uid, 'stock.picking',
> +                                            new_picking_in,
> +                                            'button_confirm', cr)
> +                    pick_obj.force_assign(cr, uid, [new_picking_in], context)
> +                    # Procesamos albarán de entrada
> +                    self.picking_processing(cr, uid, [new_picking_in],
> +                                            date_cur, context)
> +                if new_picking_out:
> +                    # Confirmamos albarán de salida
> +                    wf_service.trg_validate(uid, 'stock.picking',
> +                                            new_picking_out, 'button_confirm',
> +                                            cr)
> +                    pick_obj.force_assign(cr, uid, [new_picking_out], context)
> +                    # Procesamos albarán de entrada
> +                    self.picking_processing(cr, uid, [new_picking_out],
> +                                            date_cur, context)
> +            else:
> +                raise orm.except_orm(_('Error !'),
> +                                     _('There are no products to return.'))
> +        return self.write(cr, uid, ids,
> +                          {'state': 'done', 'picking_in_id': new_picking_in,
> +                           'picking_out_id': new_picking_out}, context=context)
> +
> +
> +class RefundProduct(osv.osv):

orm.Model

> +
> +    _name = 'refund.product'
> +    _description = "Refund Product"
> +    _columns = {
> +        'refund_id': fields.many2one('refund.products', 'Refund Products',
> +                                     select=True, required=True),
> +        'refund_product_id': fields.many2one('product.product',
> +                                             'Refund Product', select=True,
> +                                             required=True),
> +        'refund_prodlot_id': fields.many2one('stock.production.lot',
> +                                             'Refund Product Lot', select=True,
> +                                             required=True),
> +        'product_id': fields.many2one('product.product',
> +                                      'Substitution Product', select=True,
> +                                      required=True),
> +        'prodlot_id': fields.many2one('stock.production.lot',
> +                                      'Substitution Product Lot', select=True,
> +                                      required=True),
> +        'location_id': fields.many2one('stock.location', 'Source Location',
> +                                       select=True, store=True, required=True),
> +        'location_dest_id': fields.many2one('stock.location',
> +                                            'Destination Location',
> +                                            required=True),
> +    }
> +
> +    def onchange_refund_product(self, cr, uid, ids, product_id=False,
> +                                prodlot_id=False):
> +        if not product_id or not prodlot_id:
> +            return {'value': {'location_id': False, 'location_dest_id': False}}
> +        stock_warehouse_obj = self.pool['stock.warehouse']
> +        prodlot_obj = self.pool['stock.production.lot']
> +        # Comprobamos que hay al menos un almacen definido
> +        stock_warehouse = None
> +        stock_warehouse_ids = stock_warehouse_obj.search(cr, uid, [])
> +        for warehouse in stock_warehouse_obj.browse(cr, uid,
> +                                                    stock_warehouse_ids,
> +                                                    context=context):
> +            stock_warehouse = warehouse
> +            break
> +        if not stock_warehouse:
> +            raise orm.except_orm(_('Stock Warehouse not defined !'),
> +                                 _('Stock Warehouse not defined.'))
> +        # Obtenemos movimiento de salida del producto devuelto
> +        prodlot = prodlot_obj.browse(cr, uid, prodlot_id)
> +        move = prodlot.move_ids and prodlot.move_ids[0] or None
> +        for m in prodlot.move_ids:
> +            if m.location_id.id == (stock_warehouse.lot_stock_id.id
> +                                    and m.picking_id):
> +                move = m
> +                break
> +        val = {
> +            'location_id': (move and move.location_dest_id and
> +                            move.location_dest_id.id or False),
> +            'location_dest_id': stock_warehouse.lot_stock_id.id,
> +        }
> +        return {'value': val}
> 
> === added directory 'dos_refund_products/views'
> === renamed file 'dos_refund_products/refund_products_view.xml' => 'dos_refund_products/views/refund_products_view.xml'
> === modified file 'dos_refund_products/wizard/__init__.py'
> --- dos_refund_products/wizard/__init__.py	2014-06-11 10:23:47 +0000
> +++ dos_refund_products/wizard/__init__.py	2014-06-26 13:41:20 +0000
> @@ -19,7 +19,7 @@
>  #
>  ##############################################################################
>  
> -import break_pack_product
> +from . import break_pack_product
>  
>  # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
>  
> 
> === modified file 'dos_refund_products/wizard/break_pack_product.py'
> --- dos_refund_products/wizard/break_pack_product.py	2014-06-11 10:23:47 +0000
> +++ dos_refund_products/wizard/break_pack_product.py	2014-06-26 13:41:20 +0000
> @@ -1,6 +1,6 @@
>  # -*- coding: utf-8 -*-
>  ##############################################################################
> -#    
> +#
>  #    OpenERP, Open Source Management Solution
>  #    Copyright (C) 2004-2012 DOS (<http://www.dos-sl.es>).
>  #
> @@ -15,167 +15,174 @@
>  #    GNU Affero General Public License for more details.
>  #
>  #    You should have received a copy of the GNU Affero General Public License
> -#    along with this program.  If not, see <http://www.gnu.org/licenses/>.     
> +#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
>  #
>  ##############################################################################
>  
>  import time
>  import datetime
> -import ir
> -from tools.translate import _
> -from osv import osv, fields
> -
> -
> -class break_pack_product(osv.osv_memory):
> -	
> -	_name = 'break.pack.product'
> -
> -	_columns = {
> -		'pack_product_id': fields.many2one('product.product', 'Pack Product', select=True, required=True),
> -		'pack_production_lot_id': fields.many2one('stock.production.lot', 'Production Lot', required=True),
> -		'sim_product_id': fields.many2one('product.product', 'SIM Product', select=True),
> -		'sim_production_lot_id': fields.many2one('stock.production.lot', 'ICC', select=True),
> -		'link_product_id': fields.many2one('product.product', 'Link Product', select=True),
> -		'link_production_lot_id': fields.many2one('stock.production.lot', 'IMEI', select=True),
> -		'state': fields.selection( ( ('draft','Draft'), ('done','Done'), ) ),         
> -	}
> -	
> -	_defaults = { 
> -		'state': lambda *a: 'draft',
> -	}
> -	
> -
> -	def break_pack(self, cr, uid, ids, context=None):
> -		
> -		stock_warehouse_obj = self.pool.get('stock.warehouse')
> -		sale_obj = self.pool.get('sale.order')
> -		stock_picking_obj = self.pool.get('stock.picking')
> -		stock_move_obj = self.pool.get('stock.move')
> -		bom_obj = self.pool.get('mrp.bom')
> -		product_obj = self.pool.get('product.product')
> -		
> -		user = self.pool.get('res.users').browse(cr, uid, uid)
> -		company_id = user.company_id
> -		
> -		# Comprobamos que hay al menos un almacen definido
> -		stock_warehouse = None
> -		stock_warehouse_ids = stock_warehouse_obj.search(cr, uid, [])
> -		
> -		for warehouse in stock_warehouse_obj.browse(cr, uid, stock_warehouse_ids, context):
> -			stock_warehouse = warehouse
> -			break
> -		
> -		if not stock_warehouse:
> -			raise osv.except_osv(_('Stock Warehouse not defined !'), _('Stock Warehouse not defined.'))
> -		
> -		
> -		# Comenzamos con la rotura del pack
> -		for data in self.browse(cr, uid, ids, context=context):
> -			
> -			pack_product_id = data.pack_product_id
> -			pack_production_lot_id = data.pack_production_lot_id
> -			
> -			sim_product_id = None
> -			sim_production_lot_id = None
> -			link_product_id = None
> -			link_production_lot_id = None
> -			
> -						
> -			#Si el producto tiene como metodo suministro producir (Pack)
> -			#Creamos lineas con los materiales que lo componen
> -			if pack_product_id and pack_product_id.supply_method == 'produce':
> -				delete = False
> -				
> -				bom_id = bom_obj._bom_find(cr, uid, pack_product_id.id, pack_product_id.uom_id and pack_product_id.uom_id.id, [])
> -				
> -				if bom_id:
> -					bom_point = bom_obj.browse(cr, uid, bom_id, context={})
> -					
> -					if bom_point.bom_lines:
> -						#Creamos albarán interno para traspasar los materiales
> -						#de la ubicacion de produccion a la ubicacion de stock
> -						vals = {
> -								'origin': 'BREAK_PACK',
> -								'date': time.strftime('%Y-%m-%d %H:%M:%S'),
> -								'move_type': 'direct',
> -								'invoice_state': 'none',
> -								'state': 'draft',
> -								'auto_picking': False,
> -								'type': 'internal',
> -						}
> -						stock_picking_id = stock_picking_obj.create(cr, uid, vals)
> -						
> -						#Recorremos materiales
> -						for bom_line in bom_point.bom_lines:
> -							prodlot_id = sale_obj._get_bom_product_lot(cr, uid, stock_warehouse, pack_production_lot_id.id, bom_line.product_id.id)
> -							location_id = sale_obj._get_bom_stock_location_dest(cr, uid, stock_warehouse, pack_production_lot_id.id, bom_line.product_id.id)
> -							
> -							#Si es SIM
> -							if product_obj._is_sim(bom_line.product_id.categ_id):
> -								sim_product_id = bom_line.product_id.id
> -								sim_production_lot_id = prodlot_id
> -															
> -							#Si es Enlace
> -							elif product_obj._is_link(bom_line.product_id.categ_id):
> -								link_product_id = bom_line.product_id.id
> -								link_production_lot_id = prodlot_id	
> -								
> -							
> -							#Creamos nueva linea de albarán interno
> -							vals = {
> -									'picking_id': stock_picking_id,
> -									'product_id': bom_line.product_id.id,
> -									'name': '[' + (bom_line.product_id.default_code or '') + '] ' + (bom_line.product_id.name or ''),
> -									'prodlot_id': prodlot_id,
> -									'product_qty': 1,
> -									'product_uos_qty': 1,
> -									'product_uom': bom_line.product_id.uom_id and bom_line.product_id.uom_id.id or False,
> -									'location_id': location_id,
> -									'location_dest_id': stock_warehouse.lot_stock_id.id,
> -									'date_expected': time.strftime('%Y-%m-%d %H:%M:%S'),
> -									'date': time.strftime('%Y-%m-%d %H:%M:%S'),
> -									'auto_validate': False,
> -									'priority': '1',
> -									'state': 'done',
> -							}
> -							
> -							stock_move_id = stock_move_obj.create(cr, uid, vals)
> -			
> -							delete = True
> -						
> -				if delete:
> -					#Creamos linea de salida de pack en albarán interno
> -					vals = {
> -							'picking_id': stock_picking_id,
> -							'product_id': pack_product_id.id,
> -							'name': '[' + (pack_product_id.default_code or '') + '] ' + (pack_product_id.name or ''),
> -							'prodlot_id': pack_production_lot_id.id,
> -							'product_qty': 1,
> -							'product_uos_qty': 1,
> -							'product_uom': pack_product_id.uom_id and pack_product_id.uom_id.id or False,
> -							'location_id': stock_warehouse.lot_stock_id.id,
> -							'location_dest_id': stock_warehouse.lot_broken_id.id,
> -							'date_expected': time.strftime('%Y-%m-%d %H:%M:%S'),
> -							'date': time.strftime('%Y-%m-%d %H:%M:%S'),
> -							'auto_validate': False,
> -							'priority': '1',
> -							'state': 'done',
> -					}
> -					
> -					stock_move_id = stock_move_obj.create(cr, uid, vals)
> -					
> -					#Validamos albaran interno
> -					stock_picking_obj.write(cr, uid, [stock_picking_id], {'state': 'done'})
> -					
> -					
> -			return self.write(cr, uid, ids, {'state':'done', 
> -											 'sim_product_id':sim_product_id, 
> -											 'sim_production_lot_id': sim_production_lot_id,
> -											 'link_product_id':link_product_id, 
> -											 'link_production_lot_id': link_production_lot_id,
> -											 }, context=context)
> -
> -break_pack_product()
> -	   
> +from openerp.addons.base import ir
> +from openerp.tools.translate import _
> +from openerp.osv import osv, fields

from openerp.osv import orm, fields

> +
> +
> +class BreakPackProduct(orm.TransientModel):
> +    _name = 'break.pack.product'
> +    _columns = {
> +        'pack_product_id': fields.many2one('product.product', 'Pack Product',
> +                                           select=True, required=True),
> +        'pack_production_lot_id':
> +            fields.many2one('stock.production.lot', 'Production Lot',
> +                            required=True),
> +        'sim_product_id': fields.many2one('product.product', 'SIM Product',
> +                                          select=True),
> +        'sim_production_lot_id': fields.many2one('stock.production.lot', 'ICC',
> +                                                 select=True),
> +        'link_product_id': fields.many2one('product.product', 'Link Product',
> +                                           select=True),
> +        'link_production_lot_id': fields.many2one('stock.production.lot',
> +                                                  'IMEI', select=True),
> +        'state': fields.selection((('draft', 'Draft'), ('done', 'Done'))),
> +    }
> +    _defaults = {
> +        'state': lambda *a: 'draft',

No hace falta lambda

> +    }
> +
> +    def break_pack(self, cr, uid, ids, context=None):
> +        stock_warehouse_obj = self.pool['stock.warehouse']
> +        sale_obj = self.pool['sale.order']
> +        stock_picking_obj = self.pool['stock.picking']
> +        stock_move_obj = self.pool['stock.move']
> +        bom_obj = self.pool['mrp.bom']
> +        product_obj = self.pool['product.product']
> +        user = self.pool['res.users'].browse(cr, uid, uid, context=context)
> +        company_id = user.company_id
> +        # Comprobamos que hay al menos un almacen definido
> +        stock_warehouse = None
> +        stock_warehouse_ids = stock_warehouse_obj.search(cr, uid, [],
> +                                                         context=context)
> +        for warehouse in stock_warehouse_obj.browse(
> +                cr, uid, stock_warehouse_ids, context):
> +            stock_warehouse = warehouse
> +            break
> +        if not stock_warehouse:
> +            raise orm.except_orm(_('Stock Warehouse not defined !'),
> +                                 _('Stock Warehouse not defined.'))
> +        # Comenzamos con la rotura del pack
> +        for data in self.browse(cr, uid, ids, context=context):
> +            pack_product_id = data.pack_product_id
> +            pack_production_lot_id = data.pack_production_lot_id
> +            sim_product_id = None
> +            sim_production_lot_id = None
> +            link_product_id = None
> +            link_production_lot_id = None
> +            # Si el producto tiene como metodo suministro producir (Pack)
> +            # Creamos lineas con los materiales que lo componen
> +            if pack_product_id and pack_product_id.supply_method == 'produce':
> +                delete = False
> +                bom_id = bom_obj._bom_find(cr, uid, pack_product_id.id,
> +                                           (pack_product_id.uom_id and
> +                                            pack_product_id.uom_id.id), [])
> +                if bom_id:
> +                    bom_point = bom_obj.browse(cr, uid, bom_id, context={})
> +                    if bom_point.bom_lines:
> +                        # Creamos albarán interno para traspasar los materiales
> +                        # de la ubicacion de produccion a la ubicacion de stock
> +                        vals = {
> +                            'origin': 'BREAK_PACK',
> +                            'date': time.strftime('%Y-%m-%d %H:%M:%S'),
> +                            'move_type': 'direct',
> +                            'invoice_state': 'none',
> +                            'state': 'draft',
> +                            'auto_picking': False,
> +                            'type': 'internal',
> +                        }
> +                        stock_picking_id = stock_picking_obj.create(
> +                            cr, uid, vals, context=context)
> +                        # Recorremos materiales
> +                        for bom_line in bom_point.bom_lines:
> +                            prodlot_id = sale_obj._get_bom_product_lot(
> +                                cr, uid, stock_warehouse,
> +                                pack_production_lot_id.id,
> +                                bom_line.product_id.id)
> +                            location_id = (
> +                                sale_obj._get_bom_stock_location_dest(
> +                                    cr, uid, stock_warehouse,
> +                                    pack_production_lot_id.id,
> +                                    bom_line.product_id.id))
> +                            # Si es SIM
> +                            if product_obj._is_sim(
> +                                    bom_line.product_id.categ_id):
> +                                sim_product_id = bom_line.product_id.id
> +                                sim_production_lot_id = prodlot_id
> +                            # Si es Enlace
> +                            elif product_obj._is_link(
> +                                    bom_line.product_id.categ_id):
> +                                link_product_id = bom_line.product_id.id
> +                                link_production_lot_id = prodlot_id
> +                            # Creamos nueva linea de albarán interno
> +                            vals = {
> +                                'picking_id': stock_picking_id,
> +                                'product_id': bom_line.product_id.id,
> +                                'name': (
> +                                    '[%s] %s' %
> +                                    ((bom_line.product_id.default_code or ''),
> +                                     (bom_line.product_id.name or ''))),
> +                                'prodlot_id': prodlot_id,
> +                                'product_qty': 1,
> +                                'product_uos_qty': 1,
> +                                'product_uom': (
> +                                    bom_line.product_id.uom_id and
> +                                    bom_line.product_id.uom_id.id
> +                                    or False),
> +                                'location_id': location_id,
> +                                'location_dest_id':
> +                                    stock_warehouse.lot_stock_id.id,
> +                                'date_expected':
> +                                    time.strftime('%Y-%m-%d %H:%M:%S'),
> +                                'date':
> +                                    time.strftime('%Y-%m-%d %H:%M:%S'),
> +                                'auto_validate': False,
> +                                'priority': '1',
> +                                'state': 'done',
> +                            }
> +                            stock_move_id = stock_move_obj.create(
> +                                cr, uid, vals, context=context)
> +                            delete = True
> +                if delete:
> +                    # Creamos linea de salida de pack en albarán interno
> +                    vals = {
> +                        'picking_id': stock_picking_id,
> +                        'product_id': pack_product_id.id,
> +                        'name': '[%s] %s' % ((pack_product_id.default_code
> +                                              or ''), (pack_product_id.name
> +                                                       or '')),
> +                        'prodlot_id': pack_production_lot_id.id,
> +                        'product_qty': 1,
> +                        'product_uos_qty': 1,
> +                        'product_uom': (pack_product_id.uom_id and
> +                                        pack_product_id.uom_id.id or False),
> +                        'location_id': stock_warehouse.lot_stock_id.id,
> +                        'location_dest_id':
> +                                stock_warehouse.lot_broken_id.id,
> +                        'date_expected': time.strftime('%Y-%m-%d %H:%M:%S'),
> +                        'date': time.strftime('%Y-%m-%d %H:%M:%S'),
> +                        'auto_validate': False,
> +                        'priority': '1',
> +                        'state': 'done',
> +                    }
> +                    stock_move_id = stock_move_obj.create(cr, uid, vals,
> +                                                          context=context)
> +                    # Validamos albaran interno
> +                    stock_picking_obj.write(cr, uid, [stock_picking_id],
> +                                            {'state': 'done'}, context=context)
> +            return self.write(
> +                cr, uid, ids, {
> +                    'state': 'done',
> +                    'sim_product_id': sim_product_id,
> +                    'sim_production_lot_id': sim_production_lot_id,
> +                    'link_product_id': link_product_id,
> +                    'link_production_lot_id': link_production_lot_id,
> +                    }, context=context)
> +
>  # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
> -
> 
> === modified file 'dos_refund_products/wizard/break_pack_product_view.xml'
> --- dos_refund_products/wizard/break_pack_product_view.xml	2014-06-11 10:23:47 +0000
> +++ dos_refund_products/wizard/break_pack_product_view.xml	2014-06-26 13:41:20 +0000
> @@ -5,7 +5,6 @@
>  		<record id="view_break_pack_product_wizard" model="ir.ui.view">
>  			<field name="name">Break Pack Product</field>
>  			<field name="model">break.pack.product</field>
> -			<field name="type">form</field>
>  			<field name="arch" type="xml">
>  				<form string="Break Pack Product">
>  					<group col="8">
> 


-- 
https://code.launchpad.net/~mikelarregi/avanzosc/dos_refund_products/+merge/224626
Your team Avanzosc_security is subscribed to branch lp:~avanzosc-security-team/avanzosc/72horas.


References