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.

62 lines
2.3 KiB

  1. # Copyright (C) 2017 - Today: GRAP (http://www.grap.coop)
  2. # @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
  3. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  4. from odoo import _, api, models
  5. class SaleOrder(models.Model):
  6. _inherit = "sale.order"
  7. @api.model
  8. def _prepare_from_pos(self, order_data):
  9. PosSession = self.env["pos.session"]
  10. session = PosSession.browse(order_data["pos_session_id"])
  11. return {
  12. "partner_id": order_data["partner_id"],
  13. "origin": _("Point of Sale %s") % (session.name),
  14. "client_order_ref": order_data["name"],
  15. "user_id": order_data["user_id"],
  16. "pricelist_id": order_data["pricelist_id"],
  17. "fiscal_position_id": order_data["fiscal_position_id"],
  18. }
  19. @api.model
  20. def create_order_from_pos(self, order_data, action):
  21. SaleOrderLine = self.env["sale.order.line"]
  22. # Create Draft Sale order
  23. order_vals = self._prepare_from_pos(order_data)
  24. sale_order = self.create(order_vals.copy())
  25. sale_order.onchange_partner_id()
  26. # we rewrite data, because onchange could alter some
  27. # custom data (like pricelist)
  28. sale_order.write(order_vals)
  29. # create Sale order lines
  30. for order_line_data in order_data["lines"]:
  31. # Create Sale order lines
  32. order_line_vals = SaleOrderLine._prepare_from_pos(
  33. sale_order, order_line_data[2])
  34. sale_order_line = SaleOrderLine.create(
  35. order_line_vals.copy())
  36. sale_order_line.product_id_change()
  37. # we rewrite data, because onchange could alter some
  38. # data (like quantity, or price)
  39. sale_order_line.write(order_line_vals)
  40. # Confirm Sale Order
  41. if action in ["confirmed", "delivered"]:
  42. sale_order.action_confirm()
  43. # mark picking as delivered
  44. if action == "delivered":
  45. # Mark all moves are delivered
  46. for move in sale_order.mapped(
  47. "picking_ids.move_ids_without_package"):
  48. move.quantity_done = move.product_uom_qty
  49. sale_order.mapped("picking_ids").button_validate()
  50. return {
  51. "sale_order_id": sale_order.id,
  52. }