2010-08-10 12:28:52 +00:00
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# 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/>.
#
##############################################################################
import netsvc
import time
from osv import osv , fields
from tools . translate import _
2011-03-03 14:11:51 +00:00
class stock_return_picking_memory ( osv . osv_memory ) :
_name = " stock.return.picking.memory "
_rec_name = ' product_id '
_columns = {
' product_id ' : fields . many2one ( ' product.product ' , string = " Product " , required = True ) ,
' quantity ' : fields . float ( " Quantity " , required = True ) ,
' wizard_id ' : fields . many2one ( ' stock.return.picking ' , string = " Wizard " ) ,
' move_id ' : fields . many2one ( ' stock.move ' , " Move " ) ,
}
stock_return_picking_memory ( )
2010-08-10 12:28:52 +00:00
class stock_return_picking ( osv . osv_memory ) :
_name = ' stock.return.picking '
_description = ' Return Picking '
2011-03-03 14:11:51 +00:00
_columns = {
' product_return_moves ' : fields . one2many ( ' stock.return.picking.memory ' , ' wizard_id ' , ' Moves ' ) ,
' invoice_state ' : fields . selection ( [ ( ' 2binvoiced ' , ' To be refunded/invoiced ' ) , ( ' none ' , ' No invoicing ' ) ] , ' Invoicing3 ' , required = True ) ,
}
2010-08-10 12:28:52 +00:00
2010-11-22 10:37:53 +00:00
def default_get ( self , cr , uid , fields , context = None ) :
2010-08-25 18:09:47 +00:00
"""
2010-08-10 12:28:52 +00:00
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
2010-08-25 18:09:47 +00:00
@param fields : List of fields for which we want default values
@param context : A standard dictionary
@return : A dictionary with default values for all field in ` ` fields ` `
"""
2011-03-03 14:11:51 +00:00
result1 = [ ]
2010-11-23 07:05:05 +00:00
if context is None :
2010-11-22 10:37:53 +00:00
context = { }
2010-08-10 12:28:52 +00:00
res = super ( stock_return_picking , self ) . default_get ( cr , uid , fields , context = context )
record_id = context and context . get ( ' active_id ' , False ) or False
pick_obj = self . pool . get ( ' stock.picking ' )
2010-11-22 10:37:53 +00:00
pick = pick_obj . browse ( cr , uid , record_id , context = context )
2010-08-25 18:09:47 +00:00
if pick :
if ' invoice_state ' in fields :
if pick . invoice_state == ' invoiced ' :
2011-03-03 14:11:51 +00:00
res . update ( { ' invoice_state ' : ' 2binvoiced ' } )
2010-08-25 18:09:47 +00:00
else :
2011-03-03 14:11:51 +00:00
res . update ( { ' invoice_state ' : ' none ' } )
2010-08-25 18:09:47 +00:00
for line in pick . move_lines :
return_id = ' return %s ' % ( line . id )
if return_id in fields :
res [ return_id ] = line . product_qty
2011-03-03 14:11:51 +00:00
result1 . append ( { ' product_id ' : line . product_id . id , ' quantity ' : line . product_qty , ' move_id ' : line . id } )
if ' product_return_moves ' in fields :
res . update ( { ' product_return_moves ' : result1 } )
2010-08-10 12:28:52 +00:00
return res
2010-08-25 18:09:47 +00:00
2010-08-10 12:28:52 +00:00
def view_init ( self , cr , uid , fields_list , context = None ) :
2010-12-06 12:42:05 +00:00
"""
2010-08-10 12:28:52 +00:00
Creates view dynamically and adding fields at runtime .
@param self : The object pointer .
@param cr : A database cursor
@param uid : ID of the user currently logged in
2010-12-06 12:42:05 +00:00
@param context : A standard dictionary
2010-08-10 12:28:52 +00:00
@return : New arch of view with new columns .
"""
2010-11-23 07:05:05 +00:00
if context is None :
2010-11-22 10:37:53 +00:00
context = { }
2010-08-10 12:28:52 +00:00
res = super ( stock_return_picking , self ) . view_init ( cr , uid , fields_list , context = context )
2010-12-06 12:42:05 +00:00
record_id = context and context . get ( ' active_id ' , False )
2010-08-10 12:28:52 +00:00
if record_id :
pick_obj = self . pool . get ( ' stock.picking ' )
2010-11-22 10:37:53 +00:00
pick = pick_obj . browse ( cr , uid , record_id , context = context )
2010-09-28 17:25:47 +00:00
if pick . state not in [ ' done ' , ' confirmed ' , ' assigned ' ] :
raise osv . except_osv ( _ ( ' Warning ! ' ) , _ ( " You may only return pickings that are Confirmed, Available or Done! " ) )
return_history = { }
valid_lines = 0
2010-09-17 10:08:47 +00:00
for m in [ line for line in pick . move_lines ] :
2010-09-28 17:25:47 +00:00
if m . state == ' done ' :
return_history [ m . id ] = 0
for rec in m . move_history_ids2 :
return_history [ m . id ] + = ( rec . product_qty * rec . product_uom . factor )
2010-12-14 16:06:57 +00:00
if m . product_qty * m . product_uom . factor > = return_history [ m . id ] :
2010-09-28 17:25:47 +00:00
valid_lines + = 1
if not valid_lines :
raise osv . except_osv ( _ ( ' Warning ! ' ) , _ ( " There are no products to return (only lines in Done state and not fully returned yet can be returned)! " ) )
2010-08-10 12:28:52 +00:00
return res
2010-12-06 12:42:05 +00:00
def fields_view_get ( self , cr , uid , view_id = None , view_type = ' form ' ,
2010-08-10 12:28:52 +00:00
context = None , toolbar = False , submenu = False ) :
2010-12-06 12:42:05 +00:00
"""
2010-08-10 12:28:52 +00:00
Changes the view dynamically
@param self : The object pointer .
@param cr : A database cursor
@param uid : ID of the user currently logged in
2010-12-06 12:42:05 +00:00
@param context : A standard dictionary
2010-08-10 12:28:52 +00:00
@return : New arch of view .
"""
res = super ( stock_return_picking , self ) . fields_view_get ( cr , uid , view_id = view_id , view_type = view_type , context = context , toolbar = toolbar , submenu = False )
record_id = context and context . get ( ' active_id ' , False )
active_model = context . get ( ' active_model ' )
if active_model != ' stock.picking ' :
return res
if record_id :
pick_obj = self . pool . get ( ' stock.picking ' )
pick = pick_obj . browse ( cr , uid , record_id )
return_history = { }
res [ ' fields ' ] . clear ( )
2011-03-03 14:11:51 +00:00
arch_lst = [ ' <?xml version= " 1.0 " ?> ' , ' <form string= " %s " > ' % _ ( ' Return lines ' ) ]
2010-09-28 17:25:47 +00:00
for m in pick . move_lines :
return_history [ m . id ] = 0
for rec in m . move_history_ids2 :
return_history [ m . id ] + = rec . product_qty
2010-08-10 12:28:52 +00:00
quantity = m . product_qty
2011-03-03 14:11:51 +00:00
arch_lst . append ( ' <field name= " product_return_moves " colspan= " 4 " nolabel= " 1 " mode= " tree,form " width= " 550 " height= " 200 " ></field> ' )
_moves_fields = res [ ' fields ' ]
2010-08-10 12:28:52 +00:00
arch_lst . append ( ' <field name= " invoice_state " /> \n <newline/> ' )
2010-10-15 13:42:15 +00:00
res [ ' fields ' ] [ ' invoice_state ' ] = { ' string ' : _ ( ' Invoicing ' ) , ' type ' : ' selection ' , ' required ' : True , ' selection ' : [ ( ' 2binvoiced ' , _ ( ' To be refunded/invoiced ' ) ) , ( ' none ' , _ ( ' No invoicing ' ) ) ] }
2011-03-03 14:11:51 +00:00
_moves_fields . update ( {
' product_return_moves ' : { ' relation ' : ' stock.return.picking.memory ' , ' type ' : ' one2many ' , ' string ' : ' Product Moves ' } ,
} )
2010-08-10 12:28:52 +00:00
arch_lst . append ( ' <group col= " 2 " colspan= " 4 " > ' )
2011-03-03 14:11:51 +00:00
arch_lst . append ( ' <separator colspan= " 2 " /> ' )
2010-08-10 12:28:52 +00:00
arch_lst . append ( ' <button icon= " gtk-cancel " special= " cancel " string= " Cancel " /> ' )
2010-09-17 11:25:14 +00:00
arch_lst . append ( ' <button name= " create_returns " string= " Return " colspan= " 1 " type= " object " icon= " gtk-apply " /> ' )
2010-08-10 12:28:52 +00:00
arch_lst . append ( ' </group> ' )
arch_lst . append ( ' </form> ' )
res [ ' arch ' ] = ' \n ' . join ( arch_lst )
2011-03-03 14:11:51 +00:00
res [ ' fields ' ] = _moves_fields
2010-08-10 12:28:52 +00:00
return res
2010-11-22 10:37:53 +00:00
def create_returns ( self , cr , uid , ids , context = None ) :
2011-01-12 13:23:38 +00:00
"""
2010-08-10 12:28:52 +00:00
Creates return picking .
@param self : The object pointer .
@param cr : A database cursor
@param uid : ID of the user currently logged in
2010-12-06 12:42:05 +00:00
@param ids : List of ids selected
@param context : A standard dictionary
@return : A dictionary which of fields with values .
"""
2010-11-23 07:05:05 +00:00
if context is None :
2011-01-12 13:23:38 +00:00
context = { }
2010-08-10 12:28:52 +00:00
record_id = context and context . get ( ' active_id ' , False ) or False
move_obj = self . pool . get ( ' stock.move ' )
pick_obj = self . pool . get ( ' stock.picking ' )
uom_obj = self . pool . get ( ' product.uom ' )
2011-03-03 14:11:51 +00:00
data_obj = self . pool . get ( ' stock.return.picking.memory ' )
2010-08-10 12:28:52 +00:00
wf_service = netsvc . LocalService ( " workflow " )
2010-11-22 10:37:53 +00:00
pick = pick_obj . browse ( cr , uid , record_id , context = context )
2010-08-10 12:28:52 +00:00
data = self . read ( cr , uid , ids [ 0 ] )
new_picking = None
date_cur = time . strftime ( ' % Y- % m- %d % H: % M: % S ' )
set_invoice_state_to_none = True
2010-09-28 17:25:47 +00:00
returned_lines = 0
2011-03-03 14:11:51 +00:00
# Create new picking for returned products
if pick . type == ' out ' :
new_type = ' in '
elif pick . type == ' in ' :
new_type = ' out '
else :
new_type = ' internal '
new_picking = pick_obj . copy ( cr , uid , pick . id , { ' name ' : ' %s -return ' % pick . name ,
' move_lines ' : [ ] , ' state ' : ' draft ' , ' type ' : new_type ,
' date ' : date_cur , ' invoice_state ' : data [ ' invoice_state ' ] , } )
val_id = data [ ' product_return_moves ' ]
for v in val_id :
data_get = data_obj . read ( cr , uid , v )
mov_id = data_get [ ' move_id ' ]
new_qty = data_get [ ' quantity ' ]
move = move_obj . browse ( cr , uid , mov_id , context = context )
2010-08-10 12:28:52 +00:00
new_location = move . location_dest_id . id
2011-03-03 14:11:51 +00:00
returned_qty = move . product_qty
for rec in move . move_history_ids2 :
returned_qty - = rec . product_qty
2010-09-28 17:25:47 +00:00
2011-03-03 14:11:51 +00:00
if returned_qty != new_qty :
set_invoice_state_to_none = False
if new_qty :
returned_lines + = 1
new_move = move_obj . copy ( cr , uid , move . id , {
' 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 , ' state ' : ' draft ' ,
' location_id ' : new_location , ' location_dest_id ' : move . location_id . id ,
' date ' : date_cur , } )
move_obj . write ( cr , uid , [ move . id ] , { ' move_history_ids2 ' : [ ( 4 , new_move ) ] } )
2010-09-28 17:25:47 +00:00
if not returned_lines :
raise osv . except_osv ( _ ( ' Warning ! ' ) , _ ( " Please specify at least one non-zero quantity! " ) )
2010-08-10 12:28:52 +00:00
if set_invoice_state_to_none :
pick_obj . write ( cr , uid , [ pick . id ] , { ' invoice_state ' : ' none ' } )
2010-09-28 17:25:47 +00:00
wf_service . trg_validate ( uid , ' stock.picking ' , new_picking , ' button_confirm ' , cr )
pick_obj . force_assign ( cr , uid , [ new_picking ] , context )
2011-01-18 13:41:41 +00:00
# Update view id in context, lp:702939
view_list = {
' out ' : ' view_picking_out_tree ' ,
' in ' : ' view_picking_in_tree ' ,
' internal ' : ' vpicktree ' ,
}
data_obj = self . pool . get ( ' ir.model.data ' )
res = data_obj . get_object_reference ( cr , uid , ' stock ' , view_list . get ( new_type , ' vpicktree ' ) )
context . update ( { ' view_id ' : res and res [ 1 ] or False } )
2010-09-28 17:25:47 +00:00
return {
' domain ' : " [( ' id ' , ' in ' , [ " + str ( new_picking ) + " ])] " ,
' name ' : ' Picking List ' ,
' view_type ' : ' form ' ,
' view_mode ' : ' tree,form ' ,
' res_model ' : ' stock.picking ' ,
' type ' : ' ir.actions.act_window ' ,
' context ' : context ,
}
2010-08-10 12:28:52 +00:00
stock_return_picking ( )
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: