@ -24,15 +24,20 @@ from odoo.exceptions import UserError
class StockPicking ( models . Model ) :
class StockPicking ( models . Model ) :
""" Inheriting model stock.picking """
_inherit = ' stock.picking '
_inherit = ' stock.picking '
invoice_count = fields . Integer ( string = ' Invoices ' , compute = ' _compute_invoice_count ' )
invoice_count = fields . Integer ( string = ' Invoices ' ,
compute = ' _compute_invoice_count ' )
operation_code = fields . Selection ( related = ' picking_type_id.code ' )
operation_code = fields . Selection ( related = ' picking_type_id.code ' )
is_return = fields . Boolean ( )
is_return = fields . Boolean ( )
def _compute_invoice_count ( self ) :
def _compute_invoice_count ( self ) :
""" This compute function used to count the number of invoice for the picking """
""" This compute function used to count the number of invoice for
the picking """
for picking_id in self :
for picking_id in self :
move_ids = picking_id . env [ ' account.move ' ] . search ( [ ( ' invoice_origin ' , ' = ' , picking_id . name ) ] )
move_ids = picking_id . env [ ' account.move ' ] . search (
[ ( ' transfer_ids ' , ' in ' , picking_id . id ) ] )
if move_ids :
if move_ids :
self . invoice_count = len ( move_ids )
self . invoice_count = len ( move_ids )
else :
else :
@ -44,19 +49,31 @@ class StockPicking(models.Model):
for picking_id in self :
for picking_id in self :
current_user = self . env . uid
current_user = self . env . uid
if picking_id . picking_type_id . code == ' outgoing ' :
if picking_id . picking_type_id . code == ' outgoing ' :
customer_journal_id = picking_id . env [ ' ir.config_parameter ' ] . sudo ( ) . get_param (
customer_journal_id = \
' stock_move_invoice.customer_journal_id ' ) or False
picking_id . env [ ' ir.config_parameter ' ] . sudo ( ) . \
get_param ( ' stock_move_invoice.customer_journal_id ' ) or \
False
if not customer_journal_id :
if not customer_journal_id :
raise UserError ( _ ( " Please configure the journal from settings " ) )
raise UserError (
_ ( " Please configure the journal from settings " ) )
invoice_line_list = [ ]
invoice_line_list = [ ]
for move_ids_without_package in picking_id . move_ids_without_package :
for move_ids_without_package in picking_id . \
move_ids_without_package :
vals = ( 0 , 0 , {
vals = ( 0 , 0 , {
' name ' : move_ids_without_package . description_picking ,
' name ' : move_ids_without_package . description_picking ,
' product_id ' : move_ids_without_package . product_id . id ,
' product_id ' : move_ids_without_package . product_id . id ,
' price_unit ' : move_ids_without_package . product_id . lst_price ,
' price_unit ' :
' account_id ' : move_ids_without_package . product_id . property_account_income_id . id if move_ids_without_package . product_id . property_account_income_id
move_ids_without_package . product_id . lst_price ,
else move_ids_without_package . product_id . categ_id . property_account_income_categ_id . id ,
' account_id ' :
' tax_ids ' : [ ( 6 , 0 , [ picking_id . company_id . account_sale_tax_id . id ] ) ] ,
move_ids_without_package . product_id .
property_account_income_id . id if
move_ids_without_package .
product_id . property_account_income_id
else move_ids_without_package .
product_id . categ_id .
property_account_income_categ_id . id ,
' tax_ids ' : [ ( 6 , 0 , [
picking_id . company_id . account_sale_tax_id . id ] ) ] ,
' quantity ' : move_ids_without_package . quantity_done ,
' quantity ' : move_ids_without_package . quantity_done ,
} )
} )
invoice_line_list . append ( vals )
invoice_line_list . append ( vals )
@ -66,11 +83,13 @@ class StockPicking(models.Model):
' invoice_user_id ' : current_user ,
' invoice_user_id ' : current_user ,
' narration ' : picking_id . name ,
' narration ' : picking_id . name ,
' partner_id ' : picking_id . partner_id . id ,
' partner_id ' : picking_id . partner_id . id ,
' currency_id ' : picking_id . env . user . company_id . currency_id . id ,
' currency_id ' :
picking_id . env . user . company_id . currency_id . id ,
' journal_id ' : int ( customer_journal_id ) ,
' journal_id ' : int ( customer_journal_id ) ,
' payment_reference ' : picking_id . name ,
' payment_reference ' : picking_id . name ,
' picking_id ' : picking_id . id ,
' picking_id ' : picking_id . id ,
' invoice_line_ids ' : invoice_line_list
' invoice_line_ids ' : invoice_line_list ,
' transfer_ids ' : self
} )
} )
return invoice
return invoice
@ -80,19 +99,29 @@ class StockPicking(models.Model):
for picking_id in self :
for picking_id in self :
current_user = self . env . uid
current_user = self . env . uid
if picking_id . picking_type_id . code == ' incoming ' :
if picking_id . picking_type_id . code == ' incoming ' :
vendor_journal_id = picking_id . env [ ' ir.config_parameter ' ] . sudo ( ) . get_param (
vendor_journal_id = picking_id . env [
' ir.config_parameter ' ] . sudo ( ) . get_param (
' stock_move_invoice.vendor_journal_id ' ) or False
' stock_move_invoice.vendor_journal_id ' ) or False
if not vendor_journal_id :
if not vendor_journal_id :
raise UserError ( _ ( " Please configure the journal from the settings. " ) )
raise UserError (
_ ( " Please configure the journal from the settings. " ) )
invoice_line_list = [ ]
invoice_line_list = [ ]
for move_ids_without_package in picking_id . move_ids_without_package :
for move_ids_without_package in picking_id . \
move_ids_without_package :
vals = ( 0 , 0 , {
vals = ( 0 , 0 , {
' name ' : move_ids_without_package . description_picking ,
' name ' : move_ids_without_package . description_picking ,
' product_id ' : move_ids_without_package . product_id . id ,
' product_id ' : move_ids_without_package . product_id . id ,
' price_unit ' : move_ids_without_package . product_id . lst_price ,
' price_unit ' :
' account_id ' : move_ids_without_package . product_id . property_account_income_id . id if move_ids_without_package . product_id . property_account_income_id
move_ids_without_package . product_id . lst_price ,
else move_ids_without_package . product_id . categ_id . property_account_income_categ_id . id ,
' account_id ' :
' tax_ids ' : [ ( 6 , 0 , [ picking_id . company_id . account_purchase_tax_id . id ] ) ] ,
move_ids_without_package . product_id .
property_account_income_id . id if
move_ids_without_package . product_id .
property_account_income_id
else move_ids_without_package . product_id . categ_id .
property_account_income_categ_id . id ,
' tax_ids ' : [ ( 6 , 0 , [
picking_id . company_id . account_purchase_tax_id . id ] ) ] ,
' quantity ' : move_ids_without_package . quantity_done ,
' quantity ' : move_ids_without_package . quantity_done ,
} )
} )
invoice_line_list . append ( vals )
invoice_line_list . append ( vals )
@ -102,11 +131,13 @@ class StockPicking(models.Model):
' invoice_user_id ' : current_user ,
' invoice_user_id ' : current_user ,
' narration ' : picking_id . name ,
' narration ' : picking_id . name ,
' partner_id ' : picking_id . partner_id . id ,
' partner_id ' : picking_id . partner_id . id ,
' currency_id ' : picking_id . env . user . company_id . currency_id . id ,
' currency_id ' :
picking_id . env . user . company_id . currency_id . id ,
' journal_id ' : int ( vendor_journal_id ) ,
' journal_id ' : int ( vendor_journal_id ) ,
' payment_reference ' : picking_id . name ,
' payment_reference ' : picking_id . name ,
' picking_id ' : picking_id . id ,
' picking_id ' : picking_id . id ,
' invoice_line_ids ' : invoice_line_list
' invoice_line_ids ' : invoice_line_list ,
' transfer_ids ' : self
} )
} )
return invoice
return invoice
@ -116,19 +147,29 @@ class StockPicking(models.Model):
for picking_id in self :
for picking_id in self :
current_user = picking_id . env . uid
current_user = picking_id . env . uid
if picking_id . picking_type_id . code == ' incoming ' :
if picking_id . picking_type_id . code == ' incoming ' :
customer_journal_id = picking_id . env [ ' ir.config_parameter ' ] . sudo ( ) . get_param (
customer_journal_id = \
' stock_move_invoice.customer_journal_id ' ) or False
picking_id . env [ ' ir.config_parameter ' ] . sudo ( ) . \
get_param ( ' stock_move_invoice.customer_journal_id ' ) or \
False
if not customer_journal_id :
if not customer_journal_id :
raise UserError ( _ ( " Please configure the journal from settings " ) )
raise UserError (
_ ( " Please configure the journal from settings " ) )
invoice_line_list = [ ]
invoice_line_list = [ ]
for move_ids_without_package in picking_id . move_ids_without_package :
for move_ids_without_package in picking_id . \
move_ids_without_package :
vals = ( 0 , 0 , {
vals = ( 0 , 0 , {
' name ' : move_ids_without_package . description_picking ,
' name ' : move_ids_without_package . description_picking ,
' product_id ' : move_ids_without_package . product_id . id ,
' product_id ' : move_ids_without_package . product_id . id ,
' price_unit ' : move_ids_without_package . product_id . lst_price ,
' price_unit ' :
' account_id ' : move_ids_without_package . product_id . property_account_income_id . id if move_ids_without_package . product_id . property_account_income_id
move_ids_without_package . product_id . lst_price ,
else move_ids_without_package . product_id . categ_id . property_account_income_categ_id . id ,
' account_id ' : move_ids_without_package . product_id .
' tax_ids ' : [ ( 6 , 0 , [ picking_id . company_id . account_sale_tax_id . id ] ) ] ,
property_account_income_id . id if
move_ids_without_package . product_id .
property_account_income_id
else move_ids_without_package . product_id . categ_id .
property_account_income_categ_id . id ,
' tax_ids ' : [ ( 6 , 0 , [
picking_id . company_id . account_sale_tax_id . id ] ) ] ,
' quantity ' : move_ids_without_package . quantity_done ,
' quantity ' : move_ids_without_package . quantity_done ,
} )
} )
invoice_line_list . append ( vals )
invoice_line_list . append ( vals )
@ -138,11 +179,13 @@ class StockPicking(models.Model):
' invoice_user_id ' : current_user ,
' invoice_user_id ' : current_user ,
' narration ' : picking_id . name ,
' narration ' : picking_id . name ,
' partner_id ' : picking_id . partner_id . id ,
' partner_id ' : picking_id . partner_id . id ,
' currency_id ' : picking_id . env . user . company_id . currency_id . id ,
' currency_id ' :
picking_id . env . user . company_id . currency_id . id ,
' journal_id ' : int ( customer_journal_id ) ,
' journal_id ' : int ( customer_journal_id ) ,
' payment_reference ' : picking_id . name ,
' payment_reference ' : picking_id . name ,
' picking_id ' : picking_id . id ,
' picking_id ' : picking_id . id ,
' invoice_line_ids ' : invoice_line_list
' invoice_line_ids ' : invoice_line_list ,
' transfer_ids ' : self
} )
} )
return invoice
return invoice
@ -152,19 +195,28 @@ class StockPicking(models.Model):
for picking_id in self :
for picking_id in self :
current_user = self . env . uid
current_user = self . env . uid
if picking_id . picking_type_id . code == ' outgoing ' :
if picking_id . picking_type_id . code == ' outgoing ' :
vendor_journal_id = picking_id . env [ ' ir.config_parameter ' ] . sudo ( ) . get_param (
vendor_journal_id = picking_id . env [
' ir.config_parameter ' ] . sudo ( ) . get_param (
' stock_move_invoice.vendor_journal_id ' ) or False
' stock_move_invoice.vendor_journal_id ' ) or False
if not vendor_journal_id :
if not vendor_journal_id :
raise UserError ( _ ( " Please configure the journal from the settings. " ) )
raise UserError (
_ ( " Please configure the journal from the settings. " ) )
invoice_line_list = [ ]
invoice_line_list = [ ]
for move_ids_without_package in picking_id . move_ids_without_package :
for move_ids_without_package in picking_id . \
move_ids_without_package :
vals = ( 0 , 0 , {
vals = ( 0 , 0 , {
' name ' : move_ids_without_package . description_picking ,
' name ' : move_ids_without_package . description_picking ,
' product_id ' : move_ids_without_package . product_id . id ,
' product_id ' : move_ids_without_package . product_id . id ,
' price_unit ' : move_ids_without_package . product_id . lst_price ,
' price_unit ' :
' account_id ' : move_ids_without_package . product_id . property_account_income_id . id if move_ids_without_package . product_id . property_account_income_id
move_ids_without_package . product_id . lst_price ,
else move_ids_without_package . product_id . categ_id . property_account_income_categ_id . id ,
' account_id ' : move_ids_without_package . product_id .
' tax_ids ' : [ ( 6 , 0 , [ picking_id . company_id . account_purchase_tax_id . id ] ) ] ,
property_account_income_id . id if
move_ids_without_package . product_id .
property_account_income_id
else move_ids_without_package . product_id . categ_id .
property_account_income_categ_id . id ,
' tax_ids ' : [ ( 6 , 0 , [
picking_id . company_id . account_purchase_tax_id . id ] ) ] ,
' quantity ' : move_ids_without_package . quantity_done ,
' quantity ' : move_ids_without_package . quantity_done ,
} )
} )
invoice_line_list . append ( vals )
invoice_line_list . append ( vals )
@ -174,11 +226,13 @@ class StockPicking(models.Model):
' invoice_user_id ' : current_user ,
' invoice_user_id ' : current_user ,
' narration ' : picking_id . name ,
' narration ' : picking_id . name ,
' partner_id ' : picking_id . partner_id . id ,
' partner_id ' : picking_id . partner_id . id ,
' currency_id ' : picking_id . env . user . company_id . currency_id . id ,
' currency_id ' :
picking_id . env . user . company_id . currency_id . id ,
' journal_id ' : int ( vendor_journal_id ) ,
' journal_id ' : int ( vendor_journal_id ) ,
' payment_reference ' : picking_id . name ,
' payment_reference ' : picking_id . name ,
' picking_id ' : picking_id . id ,
' picking_id ' : picking_id . id ,
' invoice_line_ids ' : invoice_line_list
' invoice_line_ids ' : invoice_line_list ,
' transfer_ids ' : self
} )
} )
return invoice
return invoice
@ -190,18 +244,134 @@ class StockPicking(models.Model):
' type ' : ' ir.actions.act_window ' ,
' type ' : ' ir.actions.act_window ' ,
' view_mode ' : ' tree,form ' ,
' view_mode ' : ' tree,form ' ,
' res_model ' : ' account.move ' ,
' res_model ' : ' account.move ' ,
' domain ' : [ ( ' invoice_origin ' , ' = ' , self . name ) ] ,
' domain ' : [ ( ' transfer_ids ' , ' in ' , self . id ) ] ,
' context ' : { ' create ' : False } ,
' context ' : { ' create ' : False } ,
' target ' : ' current '
' target ' : ' current '
}
}
def action_create_multi_invoice_for_multi_transfer ( self ) :
""" This is the function for creating customer invoice
from the picking """
picking_type = list ( self . picking_type_id )
if all ( first == picking_type [ 0 ] for first in picking_type ) :
if self . picking_type_id . code == ' outgoing ' :
partner = list ( self . partner_id )
if all ( first == partner [ 0 ] for first in partner ) :
partner_id = self . partner_id
invoice_line_list = [ ]
customer_journal_id = \
self . env [ ' ir.config_parameter ' ] . sudo ( ) . \
get_param ( ' stock_move_invoice.customer_journal_id ' ) \
or False
if not customer_journal_id :
raise UserError (
_ ( " Please configure the journal from settings " ) )
for picking_id in self :
for move_ids_without_package in picking_id . \
move_ids_without_package :
vals = ( 0 , 0 , {
' name ' :
move_ids_without_package . description_picking
,
' product_id ' :
move_ids_without_package . product_id . id ,
' price_unit ' : move_ids_without_package .
product_id . lst_price ,
' account_id ' : move_ids_without_package .
product_id . property_account_income_id . id if
move_ids_without_package . product_id .
property_account_income_id
else move_ids_without_package .
product_id . categ_id .
property_account_income_categ_id . id ,
' tax_ids ' : [ ( 6 , 0 , [ picking_id . company_id .
account_purchase_tax_id . id ] ) ] ,
' quantity ' :
move_ids_without_package . quantity_done ,
} )
invoice_line_list . append ( vals )
invoice = self . env [ ' account.move ' ] . create ( {
' move_type ' : ' out_invoice ' ,
' invoice_origin ' : picking_id . name ,
' invoice_user_id ' : self . env . uid ,
' narration ' : picking_id . name ,
' partner_id ' : partner_id . id ,
' currency_id ' :
picking_id . env . user . company_id . currency_id . id ,
' journal_id ' : int ( customer_journal_id ) ,
' payment_reference ' : picking_id . name ,
' invoice_line_ids ' : invoice_line_list ,
' transfer_ids ' : self
} )
else :
for picking_id in self :
picking_id . create_invoice ( )
elif self . picking_type_id . code == ' incoming ' :
partner = list ( self . partner_id )
if all ( first == partner [ 0 ] for first in partner ) :
partner_id = self . partner_id
bill_line_list = [ ]
vendor_journal_id = \
self . env [ ' ir.config_parameter ' ] . sudo ( ) . \
get_param ( ' stock_move_invoice.vendor_journal_id ' ) \
or False
if not vendor_journal_id :
raise UserError ( _ ( " Please configure the journal from "
" the settings. " ) )
for picking_id in self :
for move_ids_without_package in picking_id . \
move_ids_without_package :
vals = ( 0 , 0 , {
' name ' :
move_ids_without_package . description_picking
,
' product_id ' :
move_ids_without_package . product_id . id ,
' price_unit ' : move_ids_without_package .
product_id . lst_price ,
' account_id ' : move_ids_without_package .
product_id . property_account_income_id . id if
move_ids_without_package . product_id .
property_account_income_id
else move_ids_without_package .
product_id . categ_id .
property_account_income_categ_id . id ,
' tax_ids ' : [ ( 6 , 0 , [ picking_id . company_id .
account_purchase_tax_id . id ] ) ] ,
' quantity ' :
move_ids_without_package . quantity_done ,
} )
bill_line_list . append ( vals )
invoice = self . env [ ' account.move ' ] . create ( {
' move_type ' : ' in_invoice ' ,
' invoice_origin ' : picking_id . name ,
' invoice_user_id ' : self . env . uid ,
' narration ' : picking_id . name ,
' partner_id ' : partner_id . id ,
' currency_id ' :
picking_id . env . user . company_id . currency_id . id ,
' journal_id ' : int ( vendor_journal_id ) ,
' payment_reference ' : picking_id . name ,
' picking_id ' : picking_id . id ,
' invoice_line_ids ' : bill_line_list ,
' transfer_ids ' : self
} )
else :
for picking_id in self :
picking_id . create_bill ( )
else :
raise UserError (
_ ( " Please select single type transfer " ) )
class StockReturnInvoicePicking ( models . TransientModel ) :
class StockReturnInvoicePicking ( models . TransientModel ) :
_inherit = ' stock.return.picking '
_inherit = ' stock.return.picking '
def _create_returns ( self ) :
def _create_returns ( self ) :
""" in this function the picking is marked as return """
""" in this function the picking is marked as return """
new_picking , pick_type_id = super ( StockReturnInvoicePicking , self ) . _create_returns ( )
new_picking , pick_type_id = \
super ( StockReturnInvoicePicking , self ) . _create_returns ( )
picking = self . env [ ' stock.picking ' ] . browse ( new_picking )
picking = self . env [ ' stock.picking ' ] . browse ( new_picking )
picking . write ( { ' is_return ' : True } )
picking . write ( { ' is_return ' : True } )
return new_picking , pick_type_id
return new_picking , pick_type_id