Fix invoice on shipping
- use the right action to open invoice - don't override the wizard -> override the object bzr revid: ced-551748b81e7462f7700999a9cb555555665392ed
This commit is contained in:
parent
ebbf99690c
commit
79737e18e2
|
@ -2,20 +2,12 @@
|
|||
<terp>
|
||||
<data>
|
||||
|
||||
<wizard
|
||||
string="Add delivery line"
|
||||
model="sale.order"
|
||||
name="delivery.sale.order"
|
||||
id="wizard_deliver_line_add"
|
||||
keyword="client_action_multi" />
|
||||
|
||||
<wizard
|
||||
string="Create invoice"
|
||||
model="stock.picking"
|
||||
name="delivery.invoice_onshipping"
|
||||
keyword="client_action_multi"
|
||||
id="stock.wizard_invoice_onshipping"
|
||||
/>
|
||||
string="Add delivery line"
|
||||
model="sale.order"
|
||||
name="delivery.sale.order"
|
||||
id="wizard_deliver_line_add"
|
||||
keyword="client_action_multi"/>
|
||||
|
||||
</data>
|
||||
</terp>
|
||||
|
|
|
@ -6,14 +6,65 @@ from osv import fields,osv
|
|||
class stock_picking(osv.osv):
|
||||
_name = "stock.picking"
|
||||
_description = "Picking list"
|
||||
_inherit = 'stock.picking'
|
||||
_inherit = 'stock.picking'
|
||||
_columns = {
|
||||
'carrier_id':fields.many2one("delivery.carrier","Carrier"),
|
||||
'carrier_id':fields.many2one("delivery.carrier","Carrier"),
|
||||
'volume': fields.float('Volume'),
|
||||
'weight': fields.float('Weight'),
|
||||
|
||||
}
|
||||
|
||||
def action_invoice_create(self, cursor, user, ids, journal_id=False,
|
||||
group=False, type='out_invoice', context=None):
|
||||
invoice_obj = self.pool.get('account.invoice')
|
||||
picking_obj = self.pool.get('stock.picking')
|
||||
carrier_obj = self.pool.get('delivery.carrier')
|
||||
grid_obj = self.pool.get('delivery.grid')
|
||||
invoice_line_obj = self.pool.get('account.invoice.line')
|
||||
|
||||
result = super(stock_picking, self).action_invoice_create(cursor, user,
|
||||
ids, journal_id=journal_id, group=group, type=type,
|
||||
context=context)
|
||||
|
||||
picking_ids = result.keys()
|
||||
invoice_ids = result.values()
|
||||
|
||||
invoices = {}
|
||||
for invoice in invoice_obj.browse(cursor, user, invoice_ids,
|
||||
context=context):
|
||||
invoices[invoice.id] = invoice
|
||||
|
||||
for picking in picking_obj.browse(cursor, user, picking_ids,
|
||||
context=context):
|
||||
if not picking.carrier_id:
|
||||
continue
|
||||
grid_id = carrier_obj.grid_get(cursor, user, [picking.carrier_id.id],
|
||||
picking.address_id.id, context=context)
|
||||
if not grid_id:
|
||||
raise osv.except_osv('Warning',
|
||||
'The carrier %s (id: %d) has no delivery grid!' \
|
||||
% (picking.carrier_id.name,
|
||||
picking.carrier_id.id))
|
||||
invoice = invoices[result[picking.id]]
|
||||
price = grid_obj.get_price_from_picking(cursor, user, grid_id,
|
||||
invoice.amount_untaxed, picking.weight, picking.volume,
|
||||
context=context)
|
||||
account_id = picking.carrier_id.product_id.product_tmpl_id\
|
||||
.property_account_income.id
|
||||
if not account_id:
|
||||
account_id = picking.carrier_id.product_id.categ_id\
|
||||
.property_account_income_categ.id
|
||||
invoice_line_obj.create(cursor, user, {
|
||||
'name': picking.carrier_id.name,
|
||||
'invoice_id': invoice.id,
|
||||
'uos_id': picking.carrier_id.product_id.uos_id.id,
|
||||
'product_id': picking.carrier_id.product_id.id,
|
||||
'account_id': account_id,
|
||||
'price_unit': price,
|
||||
'quantity': 1,
|
||||
'invoice_line_tax_id': [(6, 0,
|
||||
[x.id for x in (picking.carrier_id.product_id.taxes_id
|
||||
or [])])],
|
||||
})
|
||||
return result
|
||||
|
||||
stock_picking()
|
||||
|
|
|
@ -26,4 +26,3 @@
|
|||
##############################################################################
|
||||
|
||||
import delivery_sale_order
|
||||
import delivery_invoice_onshipping
|
||||
|
|
|
@ -1,149 +0,0 @@
|
|||
##############################################################################
|
||||
#
|
||||
# Copyright (c) 2005-2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
|
||||
#
|
||||
# WARNING: This program as such is intended to be used by professional
|
||||
# programmers who take the whole responsability of assessing all potential
|
||||
# consequences resulting from its eventual inadequacies and bugs
|
||||
# End users who are looking for a ready-to-use solution with commercial
|
||||
# garantees and support are strongly adviced to contract a Free Software
|
||||
# Service Company
|
||||
#
|
||||
# This program is Free Software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# 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 General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import time
|
||||
import wizard
|
||||
import ir
|
||||
import pooler
|
||||
from osv.osv import except_osv
|
||||
import netsvc
|
||||
|
||||
invoice_form = """<?xml version="1.0"?>
|
||||
<form string="Create invoices">
|
||||
<separator colspan="4" string="Create invoices" />
|
||||
<field name="journal_id"/>
|
||||
<newline/>
|
||||
<field name="group"/>
|
||||
<newline/>
|
||||
<field name="type"/>
|
||||
</form>
|
||||
"""
|
||||
|
||||
invoice_fields = {
|
||||
'journal_id' : {
|
||||
'string':'Destination Journal',
|
||||
'type':'many2one',
|
||||
'relation':'account.journal',
|
||||
'required':True
|
||||
},
|
||||
'group' : {'string':'Group by partner', 'type':'boolean'}
|
||||
}
|
||||
|
||||
def make_default(val):
|
||||
def fct(obj, cr, uid):
|
||||
return val
|
||||
return fct
|
||||
|
||||
def _get_type(self, cr, uid, data, context):
|
||||
picking_obj=pooler.get_pool(cr.dbname).get('stock.picking')
|
||||
pick=picking_obj.browse(cr, uid, [data['id']])[0]
|
||||
if pick.loc_move_id:
|
||||
usage=pick.loc_move_id.usage
|
||||
else:
|
||||
usage=pick.move_lines[0].location_id.usage
|
||||
if pick.type=='out' and usage=='supplier':
|
||||
type='in_refund'
|
||||
elif pick.type=='out' and usage=='customer':
|
||||
type='out_invoice'
|
||||
elif pick.type=='in' and usage=='supplier':
|
||||
type='in_invoice'
|
||||
elif pick.type=='in' and usage=='customer':
|
||||
type='out_refund'
|
||||
else:
|
||||
type='out_invoice'
|
||||
invoice_fields['type']={'string':'Type', 'type':'selection', 'default':make_default(type),
|
||||
'selection':[
|
||||
('out_invoice','Customer Invoice'),
|
||||
('in_invoice','Supplier Invoice'),
|
||||
('out_refund','Customer Refund'),
|
||||
('in_refund','Supplier Refund'),
|
||||
], 'required':True}
|
||||
return {}
|
||||
|
||||
def _create_invoice(self, cr, uid, data, context):
|
||||
pool = pooler.get_pool(cr.dbname)
|
||||
picking_obj = pooler.get_pool(cr.dbname).get('stock.picking')
|
||||
res = picking_obj.action_invoice_create(cr, uid, data['ids'],journal_id=data['form']['journal_id'],group=data['form']['group'], type=data['form']['type'], context= context)
|
||||
for pick_id, inv_id in res.items():
|
||||
pool.get('stock.picking').write(cr, uid, [pick_id], {'invoice_state':'invoiced'})
|
||||
invoice = pool.get('account.invoice').browse(cr, uid, inv_id, context)
|
||||
picking = pool.get('stock.picking').browse(cr, uid, pick_id, context)
|
||||
if not picking.carrier_id:
|
||||
continue
|
||||
grid_id = pool.get('delivery.carrier').grid_get(cr, uid, [picking.carrier_id.id], picking.address_id.id, context)
|
||||
if not grid_id:
|
||||
raise wizard.except_wizard('Warning', 'The carrier %s (id: %d) as no delivery grid.'% (picking.carrier_id.name, picking.carrier_id.id) )
|
||||
price = pool.get('delivery.grid').get_price_from_picking(cr, uid, grid_id,
|
||||
invoice.amount_untaxed, picking.weight,
|
||||
picking.volume, context) or 0.0
|
||||
account_id = picking.carrier_id.product_id.product_tmpl_id.property_account_income.id
|
||||
if not account_id:
|
||||
account_id = picking.carrier_id.product_id.categ_id.property_account_income_categ.id
|
||||
pool.get('account.invoice.line').create(cr, uid, {
|
||||
'name':picking.carrier_id.name,
|
||||
'invoice_id': inv_id,
|
||||
'uos_id': picking.carrier_id.product_id.uos_id.id,
|
||||
'product_id':picking.carrier_id.product_id.id,
|
||||
'account_id':account_id,
|
||||
'price_unit': price,
|
||||
'quantity': 1,
|
||||
'invoice_line_tax_id': [(6,0,[x.id for x in (picking.carrier_id.product_id.taxes_id or []) ])],
|
||||
'note': '',
|
||||
})
|
||||
return res
|
||||
|
||||
def _action_open_window(self, cr, uid, data, context):
|
||||
res = _create_invoice(self, cr, uid, data, context)
|
||||
iids = res.values()
|
||||
form = data['form']
|
||||
return {
|
||||
'domain': "[('id','in', ["+','.join(map(str,iids))+"])]",
|
||||
'name': 'Invoices',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'tree,form',
|
||||
'res_model': 'account.invoice',
|
||||
'view_id': False,
|
||||
'context': "{'type':'out_invoice'}",
|
||||
'type': 'ir.actions.act_window'
|
||||
}
|
||||
|
||||
class make_invoice_onshipping(wizard.interface):
|
||||
states = {
|
||||
'init' : {
|
||||
'actions' : [_get_type],
|
||||
'result' : {'type' : 'form',
|
||||
'arch' : invoice_form,
|
||||
'fields' : invoice_fields,
|
||||
'state' : [('end', 'Cancel'),('create_invoice', 'Create invoice') ]}
|
||||
},
|
||||
'create_invoice' : {
|
||||
'actions' : [],
|
||||
'result' : {'type' : 'action', 'action': _action_open_window, 'state' : 'end'}
|
||||
},
|
||||
}
|
||||
make_invoice_onshipping("delivery.invoice_onshipping")
|
||||
|
|
@ -44,84 +44,110 @@ invoice_form = """<?xml version="1.0"?>
|
|||
"""
|
||||
|
||||
invoice_fields = {
|
||||
'journal_id' : {
|
||||
'string':'Destination Journal',
|
||||
'type':'many2one',
|
||||
'relation':'account.journal',
|
||||
'required':True
|
||||
'journal_id': {
|
||||
'string': 'Destination Journal',
|
||||
'type': 'many2one',
|
||||
'relation': 'account.journal',
|
||||
'required': True
|
||||
},
|
||||
'group': {
|
||||
'string': 'Group by partner',
|
||||
'type':'boolean'
|
||||
},
|
||||
'type': {
|
||||
'string': 'Type',
|
||||
'type': 'selection',
|
||||
'selection': [
|
||||
('out_invoice', 'Customer Invoice'),
|
||||
('in_invoice', 'Supplier Invoice'),
|
||||
('out_refund', 'Customer Refund'),
|
||||
('in_refund', 'Supplier Refund'),
|
||||
],
|
||||
'required': True
|
||||
},
|
||||
'group' : {'string':'Group by partner', 'type':'boolean'}
|
||||
}
|
||||
|
||||
def make_default(val):
|
||||
def fct(obj, cr, uid):
|
||||
return val
|
||||
return fct
|
||||
|
||||
def _get_type(self, cr, uid, data, context):
|
||||
def _get_type(obj, cr, uid, data, context):
|
||||
picking_obj=pooler.get_pool(cr.dbname).get('stock.picking')
|
||||
pick=picking_obj.browse(cr, uid, [data['id']])[0]
|
||||
|
||||
pick=picking_obj.browse(cr, uid, data['id'])
|
||||
if pick.loc_move_id:
|
||||
usage=pick.loc_move_id.usage
|
||||
else:
|
||||
usage=pick.move_lines[0].location_id.usage
|
||||
if pick.type=='out' and usage=='supplier':
|
||||
type='in_refund'
|
||||
elif pick.type=='out' and usage=='customer':
|
||||
type='out_invoice'
|
||||
elif pick.type=='in' and usage=='supplier':
|
||||
type='in_invoice'
|
||||
elif pick.type=='in' and usage=='customer':
|
||||
type='out_refund'
|
||||
else:
|
||||
type='out_invoice'
|
||||
invoice_fields['type']={'string':'Type', 'type':'selection', 'default':make_default(type),
|
||||
'selection':[
|
||||
('out_invoice','Customer Invoice'),
|
||||
('in_invoice','Supplier Invoice'),
|
||||
('out_refund','Customer Refund'),
|
||||
('in_refund','Supplier Refund'),
|
||||
], 'required':True}
|
||||
return {}
|
||||
|
||||
def _create_invoice(self, cr, uid, data, context):
|
||||
if pick.type == 'out' and usage == 'supplier':
|
||||
type = 'in_refund'
|
||||
elif pick.type == 'out' and usage == 'customer':
|
||||
type = 'out_invoice'
|
||||
elif pick.type == 'in' and usage == 'supplier':
|
||||
type = 'in_invoice'
|
||||
elif pick.type == 'in' and usage == 'customer':
|
||||
type = 'out_refund'
|
||||
else:
|
||||
type = 'out_invoice'
|
||||
return {'type': type}
|
||||
|
||||
def _create_invoice(obj, cr, uid, data, context):
|
||||
pool = pooler.get_pool(cr.dbname)
|
||||
picking_obj = pooler.get_pool(cr.dbname).get('stock.picking')
|
||||
res = picking_obj.action_invoice_create(cr, uid, data['ids'],journal_id=data['form']['journal_id'],group=data['form']['group'], type=data['form']['type'], context= context)
|
||||
for pick_id, inv_id in res.items():
|
||||
pool.get('stock.picking').write(cr, uid, [pick_id], {'invoice_state':'invoiced'})
|
||||
return res
|
||||
mod_obj = pool.get('ir.model.data')
|
||||
act_obj = pool.get('ir.actions.act_window')
|
||||
|
||||
type = data['form']['type']
|
||||
|
||||
res = picking_obj.action_invoice_create(cr, uid, data['ids'],
|
||||
journal_id=data['form']['journal_id'],group=data['form']['group'],
|
||||
type=type, context= context)
|
||||
|
||||
pick_ids = res.keys()
|
||||
invoice_ids = res.values()
|
||||
|
||||
pool.get('stock.picking').write(cr, uid, pick_ids,
|
||||
{'invoice_state': 'invoiced'})
|
||||
|
||||
if not invoice_ids:
|
||||
return {}
|
||||
|
||||
if type == 'out_invoice':
|
||||
xml_id = 'action_invoice_tree5'
|
||||
elif type == 'in_invoice':
|
||||
xml_id = 'action_invoice_tree8'
|
||||
elif type == 'out_refund':
|
||||
xml_id = 'action_invoice_tree10'
|
||||
else:
|
||||
xml_id = 'action_invoice_tree12'
|
||||
|
||||
result = mod_obj._get_id(cr, uid, 'account', xml_id)
|
||||
id = mod_obj.read(cr, uid, result, ['res_id'])['res_id']
|
||||
result = act_obj.read(cr, uid, id)
|
||||
result['res_id'] = invoice_ids
|
||||
return result
|
||||
|
||||
def _action_open_window(self, cr, uid, data, context):
|
||||
res = _create_invoice(self, cr, uid, data, context)
|
||||
iids = res.values()
|
||||
form = data['form']
|
||||
return {
|
||||
'domain': "[('id','in', ["+','.join(map(str,iids))+"])]",
|
||||
'name': 'Invoices',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'tree,form',
|
||||
'res_model': 'account.invoice',
|
||||
'view_id': False,
|
||||
'context': "{'type':'out_invoice'}",
|
||||
'type': 'ir.actions.act_window'
|
||||
}
|
||||
|
||||
class make_invoice_onshipping(wizard.interface):
|
||||
states = {
|
||||
'init' : {
|
||||
'actions' : [_get_type],
|
||||
'result' : {'type' : 'form',
|
||||
'arch' : invoice_form,
|
||||
'fields' : invoice_fields,
|
||||
'state' : [('end', 'Cancel'),('create_invoice', 'Create invoice') ]}
|
||||
'init': {
|
||||
'actions': [_get_type],
|
||||
'result': {
|
||||
'type': 'form',
|
||||
'arch': invoice_form,
|
||||
'fields': invoice_fields,
|
||||
'state': [
|
||||
('end', 'Cancel'),
|
||||
('create_invoice', 'Create invoice')
|
||||
]
|
||||
}
|
||||
},
|
||||
'create_invoice' : {
|
||||
'actions' : [],
|
||||
'result' : {'type' : 'action', 'action': _action_open_window, 'state' : 'end'}
|
||||
'create_invoice': {
|
||||
'actions': [],
|
||||
'result': {
|
||||
'type': 'action',
|
||||
'action': _create_invoice,
|
||||
'state': 'end'
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
make_invoice_onshipping("stock.invoice_onshipping")
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue