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.

163 lines
5.8 KiB

  1. /** ***************************************************************************
  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. ******************************************************************************/
  6. odoo.define('pos_order_to_sale_order.screens', function (require) {
  7. "use strict";
  8. var screens = require('point_of_sale.screens');
  9. var gui = require('point_of_sale.gui');
  10. var core = require('web.core');
  11. var framework = require('web.framework');
  12. var rpc = require('web.rpc');
  13. var _t = core._t;
  14. /** **********************************************************************
  15. New Widget CreateSaleOrderButtonWidget:
  16. * On click, display a new screen to select the action to do
  17. */
  18. var CreateSaleOrderButtonWidget = screens.ActionButtonWidget.extend({
  19. template: 'CreateSaleOrderButtonWidget',
  20. button_click: function () {
  21. if (this.pos.get_order().get_client()) {
  22. this.gui.show_screen('create_sale_order');
  23. } else {
  24. this.gui.show_popup('error', {
  25. 'title': _t('No customer defined'),
  26. 'body': _t(
  27. 'You should select a customer in order to create' +
  28. ' a Sale Order.'),
  29. });
  30. }
  31. },
  32. is_visible: function () {
  33. return this.pos.get_order().orderlines.length > 0;
  34. },
  35. });
  36. screens.define_action_button({
  37. 'name': 'create_sale_order',
  38. 'widget': CreateSaleOrderButtonWidget,
  39. 'condition': function () {
  40. return this.pos.config.iface_create_sale_order;
  41. },
  42. });
  43. screens.OrderWidget.include({
  44. update_summary: function () {
  45. this._super();
  46. if (this.getParent().action_buttons &&
  47. this.getParent().action_buttons.create_sale_order) {
  48. this.getParent().action_buttons.create_sale_order.renderElement();
  49. }
  50. },
  51. });
  52. /** **********************************************************************
  53. New ScreenWidget CreateSaleOrderScreenWidget:
  54. * On show, display all buttons, depending on the pos configuration
  55. */
  56. var CreateSaleOrderScreenWidget = screens.ScreenWidget.extend({
  57. template: 'CreateSaleOrderScreenWidget',
  58. auto_back: true,
  59. show: function(){
  60. var self = this;
  61. this._super();
  62. this.renderElement();
  63. this.$('.back').click(function(){
  64. self.gui.back();
  65. });
  66. if (!this.pos.config.iface_create_draft_sale_order) {
  67. this.$('#button-create-draft-order').addClass('oe_hidden');
  68. }
  69. if (!this.pos.config.iface_create_confirmed_sale_order) {
  70. this.$('#button-create-confirmed-order').addClass('oe_hidden');
  71. }
  72. if (!this.pos.config.iface_create_delivered_sale_order) {
  73. this.$('#button-create-delivered-order').addClass('oe_hidden');
  74. }
  75. this.$('.paymentmethod').click(function(event){
  76. self.click_sale_order_button(event.currentTarget.attributes.action.nodeValue);
  77. });
  78. },
  79. click_sale_order_button: function(action) {
  80. var self = this;
  81. console.log("click_sale_order_button : " + action);
  82. this.gui.show_popup('confirm', {
  83. 'title': _t(
  84. 'Create Sale Order and discard the current' +
  85. ' PoS Order?'),
  86. 'body': _t(
  87. "This operation will permanently discard the current PoS" +
  88. " Order and create a Sale Order, based on the" +
  89. " current order lines."),
  90. confirm: function(){
  91. framework.blockUI();
  92. rpc.query({
  93. model: 'sale.order',
  94. method: 'create_order_from_pos',
  95. args: [self.pos.get('selectedOrder').export_as_JSON(), action],
  96. }).then(function (result) {
  97. self.hook_create_sale_order_success(result);
  98. }).fail(function (error, event) {
  99. self.hook_create_sale_order_error(error, event);
  100. });
  101. },
  102. });
  103. },
  104. /**
  105. * Overloadable function to make custom action after Sale order
  106. * Creation succeeded
  107. */
  108. hook_create_sale_order_success: function (result) {
  109. framework.unblockUI();
  110. this.pos.get('selectedOrder').destroy();
  111. },
  112. /**
  113. * Overloadable function to make custom action after Sale order
  114. * Creation failed
  115. */
  116. hook_create_sale_order_error: function (error, event) {
  117. framework.unblockUI();
  118. event.preventDefault();
  119. if (error.code === 200) {
  120. // Business Logic Error, not a connection problem
  121. this.gui.show_popup('error-traceback', {
  122. 'title': error.data.message,
  123. 'body': error.data.debug,
  124. });
  125. } else {
  126. // Connexion problem
  127. this.gui.show_popup('error', {
  128. 'title': _t('The order could not be sent'),
  129. 'body': _t('Check your internet connection and try again.'),
  130. });
  131. }
  132. },
  133. });
  134. gui.define_screen({
  135. 'name': 'create_sale_order',
  136. 'widget': CreateSaleOrderScreenWidget,
  137. 'condition': function () {
  138. return this.pos.config.iface_create_sale_order;
  139. },
  140. });
  141. });