[MERGE] sale: Add _prepare_invoice(), courtesy of Alexis Delattre
authorOlivier Dony <odo@openerp.com>
Wed, 15 Feb 2012 16:28:10 +0000 (17:28 +0100)
committerOlivier Dony <odo@openerp.com>
Wed, 15 Feb 2012 16:28:10 +0000 (17:28 +0100)
bzr revid: odo@openerp.com-20120215162810-5c8t8i5nnb3jeyx9

1  2 
addons/sale/sale.py

diff --combined addons/sale/sale.py
@@@ -269,7 -269,7 +269,7 @@@ class sale_order(osv.osv)
      }
      _defaults = {
          'picking_policy': 'direct',
 -        'date_order': lambda *a: time.strftime(DEFAULT_SERVER_DATE_FORMAT),
 +        'date_order': fields.date.context_today,
          'order_policy': 'manual',
          'state': 'draft',
          'user_id': lambda obj, cr, uid, context: uid,
      def button_dummy(self, cr, uid, ids, context=None):
          return True
  
-     #FIXME: the method should return the list of invoices created (invoice_ids)
-     # and not the id of the last invoice created (res). The problem is that we
-     # cannot change it directly since the method is called by the sales order
-     # workflow and I suppose it expects a single id...
-     def _inv_get(self, cr, uid, order, context=None):
-         return {}
-     def _make_invoice(self, cr, uid, order, lines, context=None):
-         journal_obj = self.pool.get('account.journal')
-         inv_obj = self.pool.get('account.invoice')
-         obj_invoice_line = self.pool.get('account.invoice.line')
-         if context is None:
-             context = {}
-         journal_ids = journal_obj.search(cr, uid, [('type', '=', 'sale'), ('company_id', '=', order.company_id.id)], limit=1)
+     def _prepare_invoice(self, cr, uid, order, lines, context=None):
+         """ Builds the dict containing the values for the invoice
+             @param order: order object
+             @param line: list of invoice line IDs that must be attached to the invoice
+             @return: dict that will be used to create the invoice object
+         """
+         journal_ids = self.pool.get('account.journal').search(cr, uid,
+             [('type', '=', 'sale'), ('company_id', '=', order.company_id.id)],
+             limit=1)
          if not journal_ids:
              raise osv.except_osv(_('Error !'),
                  _('There is no sales journal defined for this company: "%s" (id:%d)') % (order.company_id.name, order.company_id.id))
-         a = order.partner_id.property_account_receivable.id
-         pay_term = order.payment_term and order.payment_term.id or False
-         invoiced_sale_line_ids = self.pool.get('sale.order.line').search(cr, uid, [('order_id', '=', order.id), ('invoiced', '=', True)], context=context)
-         from_line_invoice_ids = []
-         for invoiced_sale_line_id in self.pool.get('sale.order.line').browse(cr, uid, invoiced_sale_line_ids, context=context):
-             for invoice_line_id in invoiced_sale_line_id.invoice_lines:
-                 if invoice_line_id.invoice_id.id not in from_line_invoice_ids:
-                     from_line_invoice_ids.append(invoice_line_id.invoice_id.id)
-         for preinv in order.invoice_ids:
-             if preinv.state not in ('cancel',) and preinv.id not in from_line_invoice_ids:
-                 for preline in preinv.invoice_line:
-                     inv_line_id = obj_invoice_line.copy(cr, uid, preline.id, {'invoice_id': False, 'price_unit': -preline.price_unit})
-                     lines.append(inv_line_id)
-         inv = {
+         return {
              'name': order.client_order_ref or '',
              'origin': order.name,
              'type': 'out_invoice',
              'reference': order.client_order_ref or order.name,
-             'account_id': a,
+             'account_id': order.partner_id.property_account_receivable.id,
              'partner_id': order.partner_id.id,
              'journal_id': journal_ids[0],
              'address_invoice_id': order.partner_invoice_id.id,
              'invoice_line': [(6, 0, lines)],
              'currency_id': order.pricelist_id.currency_id.id,
              'comment': order.note,
-             'payment_term': pay_term,
+             'payment_term': order.payment_term and order.payment_term.id or False,
              'fiscal_position': order.fiscal_position.id or order.partner_id.property_account_position.id,
-             'date_invoice': context.get('date_invoice',False),
+             'date_invoice': context.get('date_invoice', False),
              'company_id': order.company_id.id,
              'user_id': order.user_id and order.user_id.id or False
          }
-         inv.update(self._inv_get(cr, uid, order))
+     def _make_invoice(self, cr, uid, order, lines, context=None):
+         inv_obj = self.pool.get('account.invoice')
+         obj_invoice_line = self.pool.get('account.invoice.line')
+         if context is None:
+             context = {}
+         invoiced_sale_line_ids = self.pool.get('sale.order.line').search(cr, uid, [('order_id', '=', order.id), ('invoiced', '=', True)], context=context)
+         from_line_invoice_ids = []
+         for invoiced_sale_line_id in self.pool.get('sale.order.line').browse(cr, uid, invoiced_sale_line_ids, context=context):
+             for invoice_line_id in invoiced_sale_line_id.invoice_lines:
+                 if invoice_line_id.invoice_id.id not in from_line_invoice_ids:
+                     from_line_invoice_ids.append(invoice_line_id.invoice_id.id)
+         for preinv in order.invoice_ids:
+             if preinv.state not in ('cancel',) and preinv.id not in from_line_invoice_ids:
+                 for preline in preinv.invoice_line:
+                     inv_line_id = obj_invoice_line.copy(cr, uid, preline.id, {'invoice_id': False, 'price_unit': -preline.price_unit})
+                     lines.append(inv_line_id)
+         inv = self._prepare_invoice(cr, uid, order, lines, context=context)
          inv_id = inv_obj.create(cr, uid, inv, context=context)
-         data = inv_obj.onchange_payment_term_date_invoice(cr, uid, [inv_id], pay_term, time.strftime(DEFAULT_SERVER_DATE_FORMAT))
+         data = inv_obj.onchange_payment_term_date_invoice(cr, uid, [inv_id], inv['payment_term'], time.strftime(DEFAULT_SERVER_DATE_FORMAT))
          if data.get('value', False):
              inv_obj.write(cr, uid, [inv_id], data['value'], context=context)
          inv_obj.button_compute(cr, uid, [inv_id])
          self.write(cr, uid, ids, {'state': 'cancel'})
          return True
  
 -    def action_wait(self, cr, uid, ids, *args):
 +    def action_wait(self, cr, uid, ids, context=None):
          for o in self.browse(cr, uid, ids):
              if not o.order_line:
                  raise osv.except_osv(_('Error !'),_('You cannot confirm a sale order which has no line.'))
              if (o.order_policy == 'manual'):
 -                self.write(cr, uid, [o.id], {'state': 'manual', 'date_confirm': time.strftime(DEFAULT_SERVER_DATE_FORMAT)})
 +                self.write(cr, uid, [o.id], {'state': 'manual', 'date_confirm': fields.date.context_today(self, cr, uid, context=context)})
              else:
 -                self.write(cr, uid, [o.id], {'state': 'progress', 'date_confirm': time.strftime(DEFAULT_SERVER_DATE_FORMAT)})
 +                self.write(cr, uid, [o.id], {'state': 'progress', 'date_confirm': fields.date.context_today(self, cr, uid, context=context)})
              self.pool.get('sale.order.line').button_confirm(cr, uid, [x.id for x in o.order_line])
              message = _("The quotation '%s' has been converted to a sales order.") % (o.name,)
              self.log(cr, uid, o.id, message)
@@@ -981,7 -979,7 +979,7 @@@ class sale_order_line(osv.osv)
          'price_unit': 0.0,
      }
  
-     def _prepare_order_line_invoice_line(self, cr, uid, ids, line, account_id=False, context=None):
+     def _prepare_order_line_invoice_line(self, cr, uid, line, account_id=False, context=None):
          """ Builds the invoice line dict from a sale order line
              @param line: sale order line object
              @param account_id: the id of the account to force eventually (the method is used for picking return including service)
          create_ids = []
          sales = set()
          for line in self.browse(cr, uid, ids, context=context):
-             vals = self._prepare_order_line_invoice_line(cr, uid, ids, line, False, context)
+             vals = self._prepare_order_line_invoice_line(cr, uid, line, False, context)
              if vals:
                  inv_id = self.pool.get('account.invoice.line').create(cr, uid, vals, context=context)
                  cr.execute('insert into sale_order_line_invoice_rel (order_line_id,invoice_id) values (%s,%s)', (line.id, inv_id))