diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py index ce6894318c4..e17ddba146b 100644 --- a/addons/sale_stock/sale_stock.py +++ b/addons/sale_stock/sale_stock.py @@ -635,34 +635,64 @@ class sale_order_line(osv.osv): class sale_advance_payment_inv(osv.osv_memory): _inherit = "sale.advance.payment.inv" - def _create_invoices(self, cr, uid, inv_values, sale_id, context=None): - result = super(sale_advance_payment_inv, self)._create_invoices(cr, uid, inv_values, sale_id, context=context) + def create_invoices(self, cr, uid, ids, context=None): + """ create invoices for the active sale orders """ sale_obj = self.pool.get('sale.order') - sale_line_obj = self.pool.get('sale.order.line') + act_window = self.pool.get('ir.actions.act_window') wizard = self.browse(cr, uid, ids[0], context) - sale = sale_obj.browse(cr, uid, sale_id, context=context) - if sale.order_policy == 'postpaid': - raise osv.except_osv( - _('Error!'), - _("You cannot make an advance on a sales order \ - that is defined as 'Automatic Invoice after delivery'.")) + sale_ids = context.get('active_ids', []) + if wizard.advance_payment_method == 'all': + # create the final invoices of the active sale orders + res = sale_obj.manual_invoice(cr, uid, sale_ids, context) + if context.get('open_invoices', False): + return res + return {'type': 'ir.actions.act_window_close'} - # If invoice on picking: add the cost on the SO - # If not, the advance will be deduced when generating the final invoice - line_name = inv_values.get('invoice_line') and inv_values.get('invoice_line')[2].get('name') or '' - line_tax = inv_values.get('invoice_line') and inv_values.get('invoice_line')[2].get('invoice_line_tax_id') or False - if sale.order_policy == 'picking': - vals = { - 'order_id': sale.id, - 'name': line_name, - 'price_unit': -inv_amount, - 'product_uom_qty': wizard.qtty or 1.0, - 'product_uos_qty': wizard.qtty or 1.0, - 'product_uos': res.get('uos_id', False), - 'product_uom': res.get('uom_id', False), - 'product_id': wizard.product_id.id or False, - 'discount': False, - 'tax_id': line_tax, + if wizard.advance_payment_method == 'lines': + # open the list view of sale order lines to invoice + res = act_window.for_xml_id(cr, uid, 'sale', 'action_order_line_tree2', context) + res['context'] = { + 'search_default_uninvoiced': 1, + 'search_default_order_id': sale_ids and sale_ids[0] or False, } - sale_line_obj.create(cr, uid, vals, context=context) - return result + return res + assert wizard.advance_payment_method in ('fixed', 'percentage') + + inv_ids = [] + for sale_id, inv_values in self._prepare_advance_invoice_vals(cr, uid, ids, context=context): + + sale_obj = self.pool.get('sale.order') + sale_line_obj = self.pool.get('sale.order.line') + sale = sale_obj.browse(cr, uid, sale_id, context=context) + if sale.order_policy == 'postpaid': + raise osv.except_osv( + _('Error!'), + _("You cannot make an advance on a sales order \ + that is defined as 'Automatic Invoice after delivery'.")) + + # If invoice on picking: add the cost on the SO + # If not, the advance will be deduced when generating the final invoice + line_name = inv_values.get('invoice_line') and inv_values.get('invoice_line')[0][2].get('name') or '' + line_tax = inv_values.get('invoice_line') and inv_values.get('invoice_line')[0][2].get('invoice_line_tax_id') or False + if sale.order_policy == 'picking': + vals = { + 'order_id': sale.id, + 'name': line_name, + 'price_unit': -inv_amount, + 'product_uom_qty': wizard.qtty or 1.0, + 'product_uos_qty': wizard.qtty or 1.0, + 'product_uos': res.get('uos_id', False), + 'product_uom': res.get('uom_id', False), + 'product_id': wizard.product_id.id or False, + 'discount': False, + 'tax_id': line_tax, + } + sale_line_obj.create(cr, uid, vals, context=context) + + inv_ids.append(self._create_invoices(cr, uid, inv_values, sale_id, context=context)) + + if context.get('open_invoices', False): + return self.open_invoices( cr, uid, ids, inv_ids, context=context) + return {'type': 'ir.actions.act_window_close'} + res = super(sale_advance_payment_inv, self).create_invoices(self, cr, uid, ids, context=context) + return res \ No newline at end of file