val += c.get('amount', 0.0)
return val
+ def _amount_all_wrapper(self, cr, uid, ids, field_name, arg, context=None):
+ """ Wrapper because of direct method passing as parameter for function fields """
+ return self._amount_all(cr, uid, ids, field_name, arg, context=context)
+
def _amount_all(self, cr, uid, ids, field_name, arg, context=None):
cur_obj = self.pool.get('res.currency')
res = {}
'name': fields.char('Order Reference', size=64, required=True,
readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, select=True),
'origin': fields.char('Source Document', size=64, help="Reference of the document that generated this sales order request."),
- 'client_order_ref': fields.char('Customer Reference', size=64),
+ 'client_order_ref': fields.char('Reference/Description', size=64),
'state': fields.selection([
('draft', 'Draft Quotation'),
('sent', 'Quotation Sent'),
fnct_search=_invoiced_search, type='boolean', help="It indicates that sales order has at least one invoice."),
'note': fields.text('Terms and conditions'),
- 'amount_untaxed': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Untaxed Amount',
+ 'amount_untaxed': fields.function(_amount_all_wrapper, digits_compute=dp.get_precision('Account'), string='Untaxed Amount',
store={
'sale.order': (lambda self, cr, uid, ids, c={}: ids, ['order_line'], 10),
'sale.order.line': (_get_order, ['price_unit', 'tax_id', 'discount', 'product_uom_qty'], 10),
},
multi='sums', help="The amount without tax.", track_visibility='always'),
- 'amount_tax': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Taxes',
+ 'amount_tax': fields.function(_amount_all_wrapper, digits_compute=dp.get_precision('Account'), string='Taxes',
store={
'sale.order': (lambda self, cr, uid, ids, c={}: ids, ['order_line'], 10),
'sale.order.line': (_get_order, ['price_unit', 'tax_id', 'discount', 'product_uom_qty'], 10),
},
multi='sums', help="The tax amount."),
- 'amount_total': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Total',
+ 'amount_total': fields.function(_amount_all_wrapper, digits_compute=dp.get_precision('Account'), string='Total',
store={
'sale.order': (lambda self, cr, uid, ids, c={}: ids, ['order_line'], 10),
'sale.order.line': (_get_order, ['price_unit', 'tax_id', 'discount', 'product_uom_qty'], 10),
_sql_constraints = [
('name_uniq', 'unique(name, company_id)', 'Order Reference must be unique per Company!'),
]
- _order = 'name desc'
+ _order = 'date_order desc, id desc'
# Form filling
def unlink(self, cr, uid, ids, context=None):
context = {}
if vals.get('name', '/') == '/':
vals['name'] = self.pool.get('ir.sequence').get(cr, uid, 'sale.order') or '/'
+ if vals.get('partner_id') and any(f not in vals for f in ['partner_invoice_id', 'partner_shipping_id', 'pricelist_id']):
+ defaults = self.onchange_partner_id(cr, uid, [], vals['partner_id'], context)['value']
+ vals = dict(defaults, **vals)
context.update({'mail_create_nolog': True})
new_id = super(sale_order, self).create(cr, uid, vals, context=context)
self.message_post(cr, uid, [new_id], body=_("Quotation created"), context=context)
'''
assert len(ids) == 1, 'This option should only be used for a single id at a time'
self.signal_quotation_sent(cr, uid, ids)
- datas = {
- 'model': 'sale.order',
- 'ids': ids,
- 'form': self.read(cr, uid, ids[0], context=context),
- }
- return {'type': 'ir.actions.report.xml', 'report_name': 'sale.order', 'datas': datas, 'nodestroy': True}
+ return self.pool['report'].get_action(cr, uid, ids, 'sale.report_saleorder', context=context)
def manual_invoice(self, cr, uid, ids, context=None):
""" create invoices for the given sales orders (ids), and open the form
lines.append(line.id)
created_lines = obj_sale_order_line.invoice_line_create(cr, uid, lines)
if created_lines:
- invoices.setdefault(o.partner_id.id, []).append((o, created_lines))
+ invoices.setdefault(o.partner_invoice_id.id or o.partner_id.id, []).append((o, created_lines))
if not invoices:
for o in self.browse(cr, uid, ids, context=context):
for i in o.invoice_ids:
def action_done(self, cr, uid, ids, context=None):
return self.write(cr, uid, ids, {'state': 'done'}, context=context)
+ def onchange_fiscal_position(self, cr, uid, ids, fiscal_position, order_lines, context=None):
+ order_line = []
+ fiscal_obj = self.pool.get('account.fiscal.position')
+ product_obj = self.pool.get('product.product')
+ line_obj = self.pool.get('sale.order.line')
+
+ fpos = False
+ if fiscal_position:
+ fpos = fiscal_obj.browse(cr, uid, fiscal_position, context=context)
+
+ for line in order_lines:
+ # create (0, 0, { fields })
+ # update (1, ID, { fields })
+ if line[0] in [0, 1]:
+ taxes_id = None
+ if line[2].get('product_id'):
+ taxes_id = product_obj.browse(cr, uid, line[2]['product_id'], context=context).taxes_id
+ elif line[1]:
+ # don't change taxes if they are no product defined
+ taxes_id = line_obj.browse(cr, uid, line[1], context=context).product_id.taxes_id
+ if taxes_id:
+ line[2]['tax_id'] = [[6, 0, fiscal_obj.map_tax(cr, uid, fpos, taxes_id)]]
+ order_line.append(line)
+
+ # link (4, ID)
+ # link all (6, 0, IDS)
+ elif line[0] in [4, 6]:
+ line_ids = line[0] == 4 and [line[1]] or line[2]
+ for line_id in line_ids:
+ taxes_id = line_obj.browse(cr, uid, line_id, context=context).product_id.taxes_id
+ order_line.append([1, line_id, {'tax_id': [[6, 0, fiscal_obj.map_tax(cr, uid, fpos, taxes_id)]]}])
+
+ else:
+ order_line.append(line)
+ return {'value': {'order_line': order_line}}
# TODO add a field price_unit_uos
pass
return {'value': value}
+ def create(self, cr, uid, values, context=None):
+ if values.get('order_id') and values.get('product_id') and any(f not in values for f in ['name', 'price_unit', 'type', 'product_uom_qty', 'product_uom']):
+ order = self.pool['sale.order'].read(cr, uid, values['order_id'], ['pricelist_id', 'partner_id', 'date_order', 'fiscal_position'], context=context)
+ defaults = self.product_id_change(cr, uid, [], order['pricelist_id'][0], values['product_id'],
+ qty=float(values.get('product_uom_qty', False)),
+ uom=values.get('product_uom', False),
+ qty_uos=float(values.get('product_uos_qty', False)),
+ uos=values.get('product_uos', False),
+ name=values.get('name', False),
+ partner_id=order['partner_id'][0],
+ date_order=order['date_order'],
+ fiscal_position=order['fiscal_position'][0] if order['fiscal_position'] else False,
+ flag=False, # Force name update
+ context=context
+ )['value']
+ values = dict(defaults, **values)
+ return super(sale_order_line, self).create(cr, uid, values, context=context)
+
def copy_data(self, cr, uid, id, default=None, context=None):
if not default:
default = {}
lang=False, update_tax=True, date_order=False, packaging=False, fiscal_position=False, flag=False, context=None):
context = context or {}
lang = lang or context.get('lang',False)
- if not partner_id:
+ if not partner_id:
raise osv.except_osv(_('No Customer Defined!'), _('Before choosing a product,\n select a customer in the sales form.'))
warning = {}
product_uom_obj = self.pool.get('product.uom')
partner_obj = self.pool.get('res.partner')
product_obj = self.pool.get('product.product')
context = {'lang': lang, 'partner_id': partner_id}
- if partner_id:
- lang = partner_obj.browse(cr, uid, partner_id).lang
+ partner = partner_obj.browse(cr, uid, partner_id)
+ lang = partner.lang
context_partner = {'lang': lang, 'partner_id': partner_id}
if not product:
uos = False
else:
uos = False
- fpos = fiscal_position and self.pool.get('account.fiscal.position').browse(cr, uid, fiscal_position) or False
+
+ fpos = False
+ if not fiscal_position:
+ fpos = partner.property_account_position or False
+ else:
+ fpos = self.pool.get('account.fiscal.position').browse(cr, uid, fiscal_position)
if update_tax: #The quantity only have changed
result['tax_id'] = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, product_obj.taxes_id)
def send_mail(self, cr, uid, ids, context=None):
context = context or {}
- if context.get('active_model') == 'sale.order' and context.get('active_ids') and context.get('mark_so_as_sent'):
+ if context.get('default_model') == 'sale.order' and context.get('default_res_id') and context.get('mark_so_as_sent'):
context = dict(context, mail_post_autofollow=True)
- self.pool.get('sale.order').signal_quotation_sent(cr, uid, context['active_ids'])
+ self.pool.get('sale.order').signal_quotation_sent(cr, uid, [context['default_res_id']])
return super(mail_compose_message, self).send_mail(cr, uid, ids, context=context)
sale_order_obj = self.pool.get('sale.order')
res = super(account_invoice, self).confirm_paid(cr, uid, ids, context=context)
so_ids = sale_order_obj.search(cr, uid, [('invoice_ids', 'in', ids)], context=context)
- if so_ids:
- sale_order_obj.message_post(cr, uid, so_ids, body=_("Invoice paid"), context=context)
+ for so_id in so_ids:
+ sale_order_obj.message_post(cr, uid, so_id, body=_("Invoice paid"), context=context)
return res
def unlink(self, cr, uid, ids, context=None):