You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.8 KiB

  1. # -*- coding: utf-8 -*-
  2. # Copyright (C) 2017 - Today: GRAP (http://www.grap.coop)
  3. # @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
  4. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  5. from openerp import models, api, _
  6. class SaleOrder(models.Model):
  7. _inherit = 'sale.order'
  8. @api.model
  9. def _prepare_order_field_from_pos(self, order_data):
  10. session_obj = self.env['pos.session']
  11. session = session_obj.browse(order_data['pos_session_id'])
  12. res = self.onchange_partner_id(order_data['partner_id'])['value']
  13. res.update({
  14. 'partner_id': order_data['partner_id'] or False,
  15. 'origin': _("Point of Sale %s") % (session.name),
  16. 'client_order_ref': order_data['name'],
  17. 'user_id': order_data['user_id'] or False,
  18. 'order_line': [],
  19. })
  20. if self.env.context.get('is_pos_pricelist'):
  21. res.update({
  22. 'pricelist_id': order_data['pricelist_id'],
  23. })
  24. for line_data in order_data['lines']:
  25. res['order_line'].append([
  26. 0, False, self._prepare_order_line_field_from_pos(
  27. line_data[2], res)])
  28. return res
  29. @api.model
  30. def _prepare_order_line_field_from_pos(self, line_data, sale_order_data):
  31. line_obj = self.env['sale.order.line']
  32. res = line_obj.product_id_change(
  33. sale_order_data['pricelist_id'], line_data['product_id'],
  34. qty=line_data['qty'],
  35. partner_id=sale_order_data['partner_id'])['value']
  36. res.update({
  37. 'product_id': line_data['product_id'],
  38. 'product_uom_qty': line_data['qty'],
  39. 'discount': line_data['discount'],
  40. 'tax_id': [(6, False, res['tax_id'])],
  41. })
  42. if self.env.context.get('is_pos_pricelist'):
  43. res.update({
  44. 'price_unit': line_data['price_unit'],
  45. 'tax_id': line_data['tax_ids'],
  46. })
  47. return res
  48. @api.model
  49. def create_order_from_pos(self, order_data):
  50. is_pos_pricelist = len(self.env['ir.module.module'].search(
  51. [('name', '=', 'pos_pricelist'), ('state', '=', 'installed')]))
  52. # Create Draft Sale order
  53. sale_order = self.create(
  54. self.with_context(is_pos_pricelist=is_pos_pricelist).
  55. _prepare_order_field_from_pos(order_data))
  56. # Confirm Sale Order
  57. if order_data['sale_order_state'] in ['confirmed', 'delivered']:
  58. sale_order.action_button_confirm()
  59. # mark picking as delivered
  60. if order_data['sale_order_state'] == 'delivered':
  61. sale_order.picking_ids.force_assign()
  62. sale_order.picking_ids.do_transfer()
  63. return {
  64. 'sale_order_id': sale_order.id,
  65. }