payment-method.e2e-spec.ts 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. /* eslint-disable @typescript-eslint/no-non-null-assertion */
  2. import {
  3. DefaultLogger,
  4. dummyPaymentHandler,
  5. LanguageCode,
  6. PaymentMethodEligibilityChecker,
  7. } from '@vendure/core';
  8. import {
  9. createErrorResultGuard,
  10. createTestEnvironment,
  11. E2E_DEFAULT_CHANNEL_TOKEN,
  12. ErrorResultGuard,
  13. } from '@vendure/testing';
  14. import gql from 'graphql-tag';
  15. import path from 'path';
  16. import { vi } from 'vitest';
  17. import { afterAll, beforeAll, describe, expect, it } from 'vitest';
  18. import { initialData } from '../../../e2e-common/e2e-initial-data';
  19. import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
  20. import { CurrencyCode, DeletionResult } from './graphql/generated-e2e-admin-types';
  21. import * as Codegen from './graphql/generated-e2e-admin-types';
  22. import { ErrorCode } from './graphql/generated-e2e-shop-types';
  23. import * as CodegenShop from './graphql/generated-e2e-shop-types';
  24. import { CREATE_CHANNEL } from './graphql/shared-definitions';
  25. import { ADD_ITEM_TO_ORDER, ADD_PAYMENT, GET_ELIGIBLE_PAYMENT_METHODS } from './graphql/shop-definitions';
  26. import { proceedToArrangingPayment } from './utils/test-order-utils';
  27. const checkerSpy = vi.fn();
  28. const minPriceChecker = new PaymentMethodEligibilityChecker({
  29. code: 'min-price-checker',
  30. description: [{ languageCode: LanguageCode.en, value: 'Min price checker' }],
  31. args: {
  32. minPrice: {
  33. type: 'int',
  34. },
  35. },
  36. check(ctx, order, args) {
  37. checkerSpy();
  38. if (order.totalWithTax >= args.minPrice) {
  39. return true;
  40. } else {
  41. return 'Order total too low';
  42. }
  43. },
  44. });
  45. describe('PaymentMethod resolver', () => {
  46. const orderGuard: ErrorResultGuard<CodegenShop.TestOrderWithPaymentsFragment> = createErrorResultGuard(
  47. input => !!input.lines,
  48. );
  49. const { server, adminClient, shopClient } = createTestEnvironment({
  50. ...testConfig(),
  51. // logger: new DefaultLogger(),
  52. paymentOptions: {
  53. paymentMethodEligibilityCheckers: [minPriceChecker],
  54. paymentMethodHandlers: [dummyPaymentHandler],
  55. },
  56. });
  57. beforeAll(async () => {
  58. await server.init({
  59. initialData,
  60. productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-minimal.csv'),
  61. customerCount: 2,
  62. });
  63. await adminClient.asSuperAdmin();
  64. }, TEST_SETUP_TIMEOUT_MS);
  65. afterAll(async () => {
  66. await server.destroy();
  67. });
  68. it('create', async () => {
  69. const { createPaymentMethod } = await adminClient.query<
  70. Codegen.CreatePaymentMethodMutation,
  71. Codegen.CreatePaymentMethodMutationVariables
  72. >(CREATE_PAYMENT_METHOD, {
  73. input: {
  74. code: 'no-checks',
  75. enabled: true,
  76. handler: {
  77. code: dummyPaymentHandler.code,
  78. arguments: [{ name: 'automaticSettle', value: 'true' }],
  79. },
  80. translations: [
  81. {
  82. languageCode: LanguageCode.en,
  83. name: 'No Checker',
  84. description: 'This is a test payment method',
  85. },
  86. ],
  87. },
  88. });
  89. expect(createPaymentMethod).toEqual({
  90. id: 'T_1',
  91. name: 'No Checker',
  92. code: 'no-checks',
  93. description: 'This is a test payment method',
  94. enabled: true,
  95. checker: null,
  96. handler: {
  97. args: [
  98. {
  99. name: 'automaticSettle',
  100. value: 'true',
  101. },
  102. ],
  103. code: 'dummy-payment-handler',
  104. },
  105. translations: [
  106. {
  107. description: 'This is a test payment method',
  108. id: 'T_1',
  109. languageCode: 'en',
  110. name: 'No Checker',
  111. },
  112. ],
  113. });
  114. });
  115. it('update', async () => {
  116. const { updatePaymentMethod } = await adminClient.query<
  117. Codegen.UpdatePaymentMethodMutation,
  118. Codegen.UpdatePaymentMethodMutationVariables
  119. >(UPDATE_PAYMENT_METHOD, {
  120. input: {
  121. id: 'T_1',
  122. checker: {
  123. code: minPriceChecker.code,
  124. arguments: [{ name: 'minPrice', value: '0' }],
  125. },
  126. handler: {
  127. code: dummyPaymentHandler.code,
  128. arguments: [{ name: 'automaticSettle', value: 'false' }],
  129. },
  130. translations: [
  131. {
  132. languageCode: LanguageCode.en,
  133. description: 'modified',
  134. },
  135. ],
  136. },
  137. });
  138. expect(updatePaymentMethod).toEqual({
  139. id: 'T_1',
  140. name: 'No Checker',
  141. code: 'no-checks',
  142. description: 'modified',
  143. enabled: true,
  144. checker: {
  145. args: [{ name: 'minPrice', value: '0' }],
  146. code: minPriceChecker.code,
  147. },
  148. handler: {
  149. args: [
  150. {
  151. name: 'automaticSettle',
  152. value: 'false',
  153. },
  154. ],
  155. code: dummyPaymentHandler.code,
  156. },
  157. translations: [
  158. {
  159. description: 'modified',
  160. id: 'T_1',
  161. languageCode: 'en',
  162. name: 'No Checker',
  163. },
  164. ],
  165. });
  166. });
  167. it('unset checker', async () => {
  168. const { updatePaymentMethod } = await adminClient.query<
  169. Codegen.UpdatePaymentMethodMutation,
  170. Codegen.UpdatePaymentMethodMutationVariables
  171. >(UPDATE_PAYMENT_METHOD, {
  172. input: {
  173. id: 'T_1',
  174. checker: null,
  175. },
  176. });
  177. expect(updatePaymentMethod.checker).toEqual(null);
  178. const { paymentMethod } = await adminClient.query<
  179. Codegen.GetPaymentMethodQuery,
  180. Codegen.GetPaymentMethodQueryVariables
  181. >(GET_PAYMENT_METHOD, { id: 'T_1' });
  182. expect(paymentMethod!.checker).toEqual(null);
  183. });
  184. it('paymentMethodEligibilityCheckers', async () => {
  185. const { paymentMethodEligibilityCheckers } =
  186. await adminClient.query<Codegen.GetPaymentMethodCheckersQuery>(GET_PAYMENT_METHOD_CHECKERS);
  187. expect(paymentMethodEligibilityCheckers).toEqual([
  188. {
  189. code: minPriceChecker.code,
  190. args: [{ name: 'minPrice', type: 'int' }],
  191. },
  192. ]);
  193. });
  194. it('paymentMethodHandlers', async () => {
  195. const { paymentMethodHandlers } =
  196. await adminClient.query<Codegen.GetPaymentMethodHandlersQuery>(GET_PAYMENT_METHOD_HANDLERS);
  197. expect(paymentMethodHandlers).toEqual([
  198. {
  199. code: dummyPaymentHandler.code,
  200. args: [{ name: 'automaticSettle', type: 'boolean' }],
  201. },
  202. ]);
  203. });
  204. describe('eligibility checks', () => {
  205. beforeAll(async () => {
  206. await adminClient.query<
  207. Codegen.CreatePaymentMethodMutation,
  208. Codegen.CreatePaymentMethodMutationVariables
  209. >(CREATE_PAYMENT_METHOD, {
  210. input: {
  211. code: 'price-check',
  212. enabled: true,
  213. checker: {
  214. code: minPriceChecker.code,
  215. arguments: [{ name: 'minPrice', value: '200000' }],
  216. },
  217. handler: {
  218. code: dummyPaymentHandler.code,
  219. arguments: [{ name: 'automaticSettle', value: 'true' }],
  220. },
  221. translations: [
  222. {
  223. languageCode: LanguageCode.en,
  224. name: 'With Min Price Checker',
  225. description: 'Order total must be more than 2k',
  226. },
  227. ],
  228. },
  229. });
  230. await adminClient.query<
  231. Codegen.CreatePaymentMethodMutation,
  232. Codegen.CreatePaymentMethodMutationVariables
  233. >(CREATE_PAYMENT_METHOD, {
  234. input: {
  235. code: 'disabled-method',
  236. enabled: false,
  237. handler: {
  238. code: dummyPaymentHandler.code,
  239. arguments: [{ name: 'automaticSettle', value: 'true' }],
  240. },
  241. translations: [
  242. {
  243. languageCode: LanguageCode.en,
  244. name: 'Disabled ones',
  245. description: 'This method is disabled',
  246. },
  247. ],
  248. },
  249. });
  250. await shopClient.asUserWithCredentials('hayden.zieme12@hotmail.com', 'test');
  251. await shopClient.query<
  252. CodegenShop.AddItemToOrderMutation,
  253. CodegenShop.AddItemToOrderMutationVariables
  254. >(ADD_ITEM_TO_ORDER, {
  255. productVariantId: 'T_1',
  256. quantity: 1,
  257. });
  258. await proceedToArrangingPayment(shopClient);
  259. });
  260. it('eligiblePaymentMethods', async () => {
  261. const { eligiblePaymentMethods } =
  262. await shopClient.query<CodegenShop.GetEligiblePaymentMethodsQuery>(
  263. GET_ELIGIBLE_PAYMENT_METHODS,
  264. );
  265. expect(eligiblePaymentMethods).toEqual([
  266. {
  267. id: 'T_1',
  268. code: 'no-checks',
  269. isEligible: true,
  270. eligibilityMessage: null,
  271. },
  272. {
  273. id: 'T_2',
  274. code: 'price-check',
  275. isEligible: false,
  276. eligibilityMessage: 'Order total too low',
  277. },
  278. ]);
  279. });
  280. it('addPaymentToOrder does not allow ineligible method', async () => {
  281. checkerSpy.mockClear();
  282. const { addPaymentToOrder } = await shopClient.query<
  283. CodegenShop.AddPaymentToOrderMutation,
  284. CodegenShop.AddPaymentToOrderMutationVariables
  285. >(ADD_PAYMENT, {
  286. input: {
  287. method: 'price-check',
  288. metadata: {},
  289. },
  290. });
  291. orderGuard.assertErrorResult(addPaymentToOrder);
  292. expect(addPaymentToOrder.errorCode).toBe(ErrorCode.INELIGIBLE_PAYMENT_METHOD_ERROR);
  293. expect(addPaymentToOrder.eligibilityCheckerMessage).toBe('Order total too low');
  294. expect(checkerSpy).toHaveBeenCalledTimes(1);
  295. });
  296. });
  297. describe('channels', () => {
  298. const SECOND_CHANNEL_TOKEN = 'SECOND_CHANNEL_TOKEN';
  299. const THIRD_CHANNEL_TOKEN = 'THIRD_CHANNEL_TOKEN';
  300. beforeAll(async () => {
  301. await adminClient.query<Codegen.CreateChannelMutation, Codegen.CreateChannelMutationVariables>(
  302. CREATE_CHANNEL,
  303. {
  304. input: {
  305. code: 'second-channel',
  306. token: SECOND_CHANNEL_TOKEN,
  307. defaultLanguageCode: LanguageCode.en,
  308. currencyCode: CurrencyCode.GBP,
  309. pricesIncludeTax: true,
  310. defaultShippingZoneId: 'T_1',
  311. defaultTaxZoneId: 'T_1',
  312. },
  313. },
  314. );
  315. await adminClient.query<Codegen.CreateChannelMutation, Codegen.CreateChannelMutationVariables>(
  316. CREATE_CHANNEL,
  317. {
  318. input: {
  319. code: 'third-channel',
  320. token: THIRD_CHANNEL_TOKEN,
  321. defaultLanguageCode: LanguageCode.en,
  322. currencyCode: CurrencyCode.GBP,
  323. pricesIncludeTax: true,
  324. defaultShippingZoneId: 'T_1',
  325. defaultTaxZoneId: 'T_1',
  326. },
  327. },
  328. );
  329. });
  330. it('creates a PaymentMethod in channel2', async () => {
  331. adminClient.setChannelToken(SECOND_CHANNEL_TOKEN);
  332. const { createPaymentMethod } = await adminClient.query<
  333. Codegen.CreatePaymentMethodMutation,
  334. Codegen.CreatePaymentMethodMutationVariables
  335. >(CREATE_PAYMENT_METHOD, {
  336. input: {
  337. code: 'channel-2-method',
  338. enabled: true,
  339. handler: {
  340. code: dummyPaymentHandler.code,
  341. arguments: [{ name: 'automaticSettle', value: 'true' }],
  342. },
  343. translations: [
  344. {
  345. languageCode: LanguageCode.en,
  346. name: 'Channel 2 method',
  347. description: 'This is a test payment method',
  348. },
  349. ],
  350. },
  351. });
  352. expect(createPaymentMethod.code).toBe('channel-2-method');
  353. });
  354. it('method is listed in channel2', async () => {
  355. adminClient.setChannelToken(SECOND_CHANNEL_TOKEN);
  356. const { paymentMethods } =
  357. await adminClient.query<Codegen.GetPaymentMethodListQuery>(GET_PAYMENT_METHOD_LIST);
  358. expect(paymentMethods.totalItems).toBe(1);
  359. expect(paymentMethods.items[0].code).toBe('channel-2-method');
  360. });
  361. it('method is not listed in channel3', async () => {
  362. adminClient.setChannelToken(THIRD_CHANNEL_TOKEN);
  363. const { paymentMethods } =
  364. await adminClient.query<Codegen.GetPaymentMethodListQuery>(GET_PAYMENT_METHOD_LIST);
  365. expect(paymentMethods.totalItems).toBe(0);
  366. });
  367. it('method is listed in default channel', async () => {
  368. adminClient.setChannelToken(E2E_DEFAULT_CHANNEL_TOKEN);
  369. const { paymentMethods } =
  370. await adminClient.query<Codegen.GetPaymentMethodListQuery>(GET_PAYMENT_METHOD_LIST);
  371. expect(paymentMethods.totalItems).toBe(4);
  372. expect(paymentMethods.items.map(i => i.code).sort()).toEqual([
  373. 'channel-2-method',
  374. 'disabled-method',
  375. 'no-checks',
  376. 'price-check',
  377. ]);
  378. });
  379. it('delete from channel', async () => {
  380. adminClient.setChannelToken(SECOND_CHANNEL_TOKEN);
  381. const { paymentMethods } =
  382. await adminClient.query<Codegen.GetPaymentMethodListQuery>(GET_PAYMENT_METHOD_LIST);
  383. expect(paymentMethods.totalItems).toBe(1);
  384. const { deletePaymentMethod } = await adminClient.query<
  385. Codegen.DeletePaymentMethodMutation,
  386. Codegen.DeletePaymentMethodMutationVariables
  387. >(DELETE_PAYMENT_METHOD, {
  388. id: paymentMethods.items[0].id,
  389. });
  390. expect(deletePaymentMethod.result).toBe(DeletionResult.DELETED);
  391. const { paymentMethods: checkChannel } =
  392. await adminClient.query<Codegen.GetPaymentMethodListQuery>(GET_PAYMENT_METHOD_LIST);
  393. expect(checkChannel.totalItems).toBe(0);
  394. adminClient.setChannelToken(E2E_DEFAULT_CHANNEL_TOKEN);
  395. const { paymentMethods: checkDefault } =
  396. await adminClient.query<Codegen.GetPaymentMethodListQuery>(GET_PAYMENT_METHOD_LIST);
  397. expect(checkDefault.totalItems).toBe(4);
  398. });
  399. it('delete from default channel', async () => {
  400. adminClient.setChannelToken(SECOND_CHANNEL_TOKEN);
  401. const { createPaymentMethod } = await adminClient.query<
  402. Codegen.CreatePaymentMethodMutation,
  403. Codegen.CreatePaymentMethodMutationVariables
  404. >(CREATE_PAYMENT_METHOD, {
  405. input: {
  406. code: 'channel-2-method2',
  407. enabled: true,
  408. handler: {
  409. code: dummyPaymentHandler.code,
  410. arguments: [{ name: 'automaticSettle', value: 'true' }],
  411. },
  412. translations: [
  413. {
  414. languageCode: LanguageCode.en,
  415. name: 'Channel 2 method 2',
  416. description: 'This is a test payment method',
  417. },
  418. ],
  419. },
  420. });
  421. adminClient.setChannelToken(E2E_DEFAULT_CHANNEL_TOKEN);
  422. const { deletePaymentMethod: delete1 } = await adminClient.query<
  423. Codegen.DeletePaymentMethodMutation,
  424. Codegen.DeletePaymentMethodMutationVariables
  425. >(DELETE_PAYMENT_METHOD, {
  426. id: createPaymentMethod.id,
  427. });
  428. expect(delete1.result).toBe(DeletionResult.NOT_DELETED);
  429. expect(delete1.message).toBe(
  430. 'The selected PaymentMethod is assigned to the following Channels: second-channel. Set "force: true" to delete from all Channels.',
  431. );
  432. const { paymentMethods: check1 } =
  433. await adminClient.query<Codegen.GetPaymentMethodListQuery>(GET_PAYMENT_METHOD_LIST);
  434. expect(check1.totalItems).toBe(5);
  435. const { deletePaymentMethod: delete2 } = await adminClient.query<
  436. Codegen.DeletePaymentMethodMutation,
  437. Codegen.DeletePaymentMethodMutationVariables
  438. >(DELETE_PAYMENT_METHOD, {
  439. id: createPaymentMethod.id,
  440. force: true,
  441. });
  442. expect(delete2.result).toBe(DeletionResult.DELETED);
  443. const { paymentMethods: check2 } =
  444. await adminClient.query<Codegen.GetPaymentMethodListQuery>(GET_PAYMENT_METHOD_LIST);
  445. expect(check2.totalItems).toBe(4);
  446. });
  447. });
  448. it('create without description', async () => {
  449. const { createPaymentMethod } = await adminClient.query<
  450. Codegen.CreatePaymentMethodMutation,
  451. Codegen.CreatePaymentMethodMutationVariables
  452. >(CREATE_PAYMENT_METHOD, {
  453. input: {
  454. code: 'no-description',
  455. enabled: true,
  456. handler: {
  457. code: dummyPaymentHandler.code,
  458. arguments: [{ name: 'automaticSettle', value: 'true' }],
  459. },
  460. translations: [
  461. {
  462. languageCode: LanguageCode.en,
  463. name: 'No Description',
  464. },
  465. ],
  466. },
  467. });
  468. expect(createPaymentMethod).toEqual({
  469. id: 'T_6',
  470. name: 'No Description',
  471. code: 'no-description',
  472. description: '',
  473. enabled: true,
  474. checker: null,
  475. handler: {
  476. args: [
  477. {
  478. name: 'automaticSettle',
  479. value: 'true',
  480. },
  481. ],
  482. code: 'dummy-payment-handler',
  483. },
  484. translations: [
  485. {
  486. description: '',
  487. id: 'T_6',
  488. languageCode: 'en',
  489. name: 'No Description',
  490. },
  491. ],
  492. });
  493. });
  494. it('returns only active payment methods', async () => {
  495. // Cleanup: Remove all existing payment methods
  496. const { paymentMethods } = await adminClient.query(GET_PAYMENT_METHOD_LIST);
  497. for (const method of paymentMethods.items) {
  498. await adminClient.query(DELETE_PAYMENT_METHOD, { id: method.id, force: true });
  499. }
  500. // Arrange: Create both enabled and disabled payment methods
  501. await adminClient.query(CREATE_PAYMENT_METHOD, {
  502. input: {
  503. code: 'active-method',
  504. enabled: true,
  505. handler: {
  506. code: 'dummy-payment-handler',
  507. arguments: [{ name: 'automaticSettle', value: 'true' }],
  508. },
  509. translations: [
  510. {
  511. languageCode: LanguageCode.en,
  512. name: 'Active Method',
  513. description: 'This is an active method',
  514. },
  515. ],
  516. },
  517. });
  518. await adminClient.query(CREATE_PAYMENT_METHOD, {
  519. input: {
  520. code: 'inactive-method',
  521. enabled: false,
  522. handler: {
  523. code: 'dummy-payment-handler',
  524. arguments: [{ name: 'automaticSettle', value: 'true' }],
  525. },
  526. translations: [
  527. {
  528. languageCode: LanguageCode.en,
  529. name: 'Inactive Method',
  530. description: 'This is an inactive method',
  531. },
  532. ],
  533. },
  534. });
  535. // Act: Query active payment methods
  536. const { activePaymentMethods } = await shopClient.query(ACTIVE_PAYMENT_METHODS_QUERY);
  537. // Assert: Ensure only the active payment method is returned
  538. expect(activePaymentMethods).toHaveLength(1);
  539. expect(activePaymentMethods[0].code).toBe('active-method');
  540. expect(activePaymentMethods[0].name).toBe('Active Method');
  541. expect(activePaymentMethods[0].description).toBe('This is an active method');
  542. });
  543. });
  544. export const PAYMENT_METHOD_FRAGMENT = gql`
  545. fragment PaymentMethod on PaymentMethod {
  546. id
  547. code
  548. name
  549. description
  550. enabled
  551. checker {
  552. code
  553. args {
  554. name
  555. value
  556. }
  557. }
  558. handler {
  559. code
  560. args {
  561. name
  562. value
  563. }
  564. }
  565. translations {
  566. id
  567. languageCode
  568. name
  569. description
  570. }
  571. }
  572. `;
  573. export const CREATE_PAYMENT_METHOD = gql`
  574. mutation CreatePaymentMethod($input: CreatePaymentMethodInput!) {
  575. createPaymentMethod(input: $input) {
  576. ...PaymentMethod
  577. }
  578. }
  579. ${PAYMENT_METHOD_FRAGMENT}
  580. `;
  581. export const UPDATE_PAYMENT_METHOD = gql`
  582. mutation UpdatePaymentMethod($input: UpdatePaymentMethodInput!) {
  583. updatePaymentMethod(input: $input) {
  584. ...PaymentMethod
  585. }
  586. }
  587. ${PAYMENT_METHOD_FRAGMENT}
  588. `;
  589. export const GET_PAYMENT_METHOD_HANDLERS = gql`
  590. query GetPaymentMethodHandlers {
  591. paymentMethodHandlers {
  592. code
  593. args {
  594. name
  595. type
  596. }
  597. }
  598. }
  599. `;
  600. export const GET_PAYMENT_METHOD_CHECKERS = gql`
  601. query GetPaymentMethodCheckers {
  602. paymentMethodEligibilityCheckers {
  603. code
  604. args {
  605. name
  606. type
  607. }
  608. }
  609. }
  610. `;
  611. export const GET_PAYMENT_METHOD = gql`
  612. query GetPaymentMethod($id: ID!) {
  613. paymentMethod(id: $id) {
  614. ...PaymentMethod
  615. }
  616. }
  617. ${PAYMENT_METHOD_FRAGMENT}
  618. `;
  619. export const GET_PAYMENT_METHOD_LIST = gql`
  620. query GetPaymentMethodList($options: PaymentMethodListOptions) {
  621. paymentMethods(options: $options) {
  622. items {
  623. ...PaymentMethod
  624. }
  625. totalItems
  626. }
  627. }
  628. ${PAYMENT_METHOD_FRAGMENT}
  629. `;
  630. export const DELETE_PAYMENT_METHOD = gql`
  631. mutation DeletePaymentMethod($id: ID!, $force: Boolean) {
  632. deletePaymentMethod(id: $id, force: $force) {
  633. message
  634. result
  635. }
  636. }
  637. `;
  638. const ACTIVE_PAYMENT_METHODS_QUERY = gql`
  639. query ActivePaymentMethods {
  640. activePaymentMethods {
  641. id
  642. code
  643. name
  644. description
  645. translations {
  646. languageCode
  647. name
  648. description
  649. }
  650. }
  651. }
  652. `;