payment-service.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /**
  2. * Copyright © Magento, Inc. All rights reserved.
  3. * See COPYING.txt for license details.
  4. */
  5. define([
  6. 'underscore',
  7. 'Magento_Checkout/js/model/quote',
  8. 'Magento_Checkout/js/model/payment/method-list',
  9. 'Magento_Checkout/js/action/select-payment-method'
  10. ], function (_, quote, methodList, selectPaymentMethod) {
  11. 'use strict';
  12. /**
  13. * Free method filter
  14. * @param {Object} paymentMethod
  15. * @return {Boolean}
  16. */
  17. var isFreePaymentMethod = function (paymentMethod) {
  18. return paymentMethod.method === 'free';
  19. },
  20. /**
  21. * Grabs the grand total from quote
  22. * @return {Number}
  23. */
  24. getGrandTotal = function () {
  25. return quote.totals()['grand_total'];
  26. };
  27. return {
  28. isFreeAvailable: false,
  29. /**
  30. * Populate the list of payment methods
  31. * @param {Array} methods
  32. */
  33. setPaymentMethods: function (methods) {
  34. var freeMethod,
  35. filteredMethods,
  36. methodIsAvailable,
  37. methodNames;
  38. freeMethod = _.find(methods, isFreePaymentMethod);
  39. this.isFreeAvailable = !!freeMethod;
  40. if (freeMethod && getGrandTotal() <= 0) {
  41. methods.splice(0, methods.length, freeMethod);
  42. selectPaymentMethod(freeMethod);
  43. }
  44. filteredMethods = _.without(methods, freeMethod);
  45. if (filteredMethods.length === 1) {
  46. selectPaymentMethod(filteredMethods[0]);
  47. } else if (quote.paymentMethod()) {
  48. methodIsAvailable = methods.some(function (item) {
  49. return item.method === quote.paymentMethod().method;
  50. });
  51. //Unset selected payment method if not available
  52. if (!methodIsAvailable) {
  53. selectPaymentMethod(null);
  54. }
  55. }
  56. /**
  57. * Overwrite methods with existing methods to preserve ko array references.
  58. * This prevent ko from re-rendering those methods.
  59. */
  60. methodNames = _.pluck(methods, 'method');
  61. _.map(methodList(), function (existingMethod) {
  62. var existingMethodIndex = methodNames.indexOf(existingMethod.method);
  63. if (existingMethodIndex !== -1) {
  64. methods[existingMethodIndex] = existingMethod;
  65. }
  66. });
  67. methodList(methods);
  68. },
  69. /**
  70. * Get the list of available payment methods.
  71. * @return {Array}
  72. */
  73. getAvailablePaymentMethods: function () {
  74. var allMethods = methodList().slice(),
  75. grandTotalOverZero = getGrandTotal() > 0;
  76. if (!this.isFreeAvailable) {
  77. return allMethods;
  78. }
  79. if (grandTotalOverZero) {
  80. return _.reject(allMethods, isFreePaymentMethod);
  81. }
  82. return _.filter(allMethods, isFreePaymentMethod);
  83. }
  84. };
  85. });