front/controllers/refund/index.js

  1. /* ============================================================================ *\
  2. || ########################################################################## ||
  3. || # Auction Software Marketplace Release: 0.6 Build 0.7 # ||
  4. || # ---------------------------------------------------------------------- # ||
  5. || # License # 35YAHCNR9344X6O666C123AB # ||
  6. || # ---------------------------------------------------------------------- # ||
  7. || # Copyright ©2014–2021 Develop Scripts LLC. All Rights Reserved # ||
  8. || # This file may not be redistributed in whole or significant part. # ||
  9. || # ------------- AUCTION SOFTWARE IS NOT FREE SOFTWARE ------------------ # ||
  10. || # http://www.auctionsoftwaremarketplace.com|support@auctionsoftware.com # ||
  11. || # ---------------------------------------------------------------------- # ||
  12. || ########################################################################## ||
  13. \* ============================================================================ */
  14. /* eslint-disable prefer-destructuring */
  15. /* eslint-disable no-param-reassign */
  16. const axios = require('axios')
  17. const refundModule = require('../../modules/refund').default
  18. const returnCtrl = require('../return')
  19. const schemaModule = require('./schema').default
  20. const { jsonResponse } = require('../logger')
  21. const kountCtrl = require('../kount')
  22. /**
  23. * short Describe sch
  24. *
  25. * @memberOf frontend.refund
  26. * @param {object} items items
  27. */
  28. const shortDescribeSCH = async (items) => {
  29. function changingdata(item) {
  30. const payItems = {
  31. itemId: item.item_id,
  32. name: item.title.substring(0, 31),
  33. description: item.desc_proc,
  34. quantity: item.qty,
  35. unitPrice: item.buynowamount,
  36. taxable: 'true',
  37. }
  38. return payItems
  39. }
  40. const promises = items.map(changingdata)
  41. items = await Promise.all(promises)
  42. return items
  43. }
  44. /**
  45. * generate Request Data
  46. *
  47. * @memberOf frontend.refund
  48. * @param {string} type to perform actions based on transaction price
  49. * @param {object} cardDetails card details
  50. * @param {object} lineItem lineitem
  51. * @param {object} cartValues cart values
  52. * @param {number} refTransId transaction reference id
  53. * @param {refundModule.insertPayLogRequest} method
  54. */
  55. const generateRequestData = async (type, cardDetails, lineItem, cartValues, refTransId) => {
  56. const request = {}
  57. request.createTransactionRequest = {}
  58. request.createTransactionRequest.merchantAuthentication = {
  59. name: global.authorize.api_login_id,
  60. transactionKey: global.authorize.transaction_key,
  61. }
  62. const results = await Promise.all([
  63. refundModule.insertPayLogRequest(cartValues.id, cartValues.user_id, type, 'authorize'),
  64. ])
  65. request.createTransactionRequest.refId = results[0].insertId
  66. request.createTransactionRequest.transactionRequest = {}
  67. if (type === 'priorAuthCaptureTransaction') {
  68. request.createTransactionRequest.transactionRequest.transactionType = type
  69. request.createTransactionRequest.transactionRequest.amount = cardDetails.card_amount
  70. request.createTransactionRequest.transactionRequest.refTransId = refTransId
  71. } else {
  72. request.createTransactionRequest.transactionRequest.transactionType = type
  73. request.createTransactionRequest.transactionRequest.amount = cardDetails.card_amount
  74. request.createTransactionRequest.transactionRequest.payment = {
  75. creditCard: {
  76. cardNumber: cardDetails.card_number,
  77. expirationDate: cardDetails.card_expiry,
  78. cardCode: cardDetails.card_cvv,
  79. },
  80. }
  81. request.createTransactionRequest.transactionRequest.lineItems = {
  82. lineItem,
  83. }
  84. request.createTransactionRequest.transactionRequest.tax = {
  85. amount: cartValues.total_tax,
  86. name: 'Sales Tax',
  87. }
  88. request.createTransactionRequest.transactionRequest.customer = {
  89. id: cartValues.user_id,
  90. }
  91. request.createTransactionRequest.transactionRequest.billTo = {
  92. firstName: cartValues.bill_first_name,
  93. lastName: cartValues.bill_first_name,
  94. address: cartValues.bill_address1,
  95. city: cartValues.bill_city,
  96. state: cartValues.bill_state,
  97. zip: cartValues.bill_zipcode,
  98. country: 'USA',
  99. }
  100. request.createTransactionRequest.transactionRequest.customerIP = '192.168.1.1'
  101. request.createTransactionRequest.transactionRequest.userFields = {
  102. userField: [
  103. {
  104. name: 'refId',
  105. value: results[0].insertId,
  106. },
  107. ],
  108. }
  109. }
  110. return request
  111. }
  112. const makeApiCall = async (data) => {
  113. let responseData = {}
  114. const url = global.authorize.endpoint
  115. const options = {
  116. method: 'POST',
  117. headers: { 'content-type': 'application/json' },
  118. data,
  119. url,
  120. }
  121. // refundModule.updatePayLogRequest(
  122. // { request: JSON.stringify(data) },
  123. // data.createTransactionRequest.refId,
  124. // 1,
  125. // )
  126. const response = await axios(options)
  127. const paymentResponse = response.data.transactionResponse
  128. if (paymentResponse) {
  129. refundModule.updatePayLogRequest(
  130. { response: JSON.stringify(paymentResponse), transactionID: paymentResponse.transId },
  131. paymentResponse.userFields[0].value,
  132. 0,
  133. )
  134. }
  135. if (
  136. paymentResponse &&
  137. (parseInt(paymentResponse.responseCode, 10) === 1 ||
  138. parseInt(paymentResponse.responseCode, 10) === 4)
  139. ) {
  140. responseData = {
  141. status: 'success',
  142. responseType: 1,
  143. message: 'Payment succesfully completed!',
  144. responseData: { paymentResponse },
  145. }
  146. } else if (paymentResponse && paymentResponse.errors) {
  147. responseData = {
  148. status: 'error',
  149. responseType: 2,
  150. message: paymentResponse.errors[0].errorText,
  151. }
  152. } else if (response.data.messages.message.length) {
  153. responseData = {
  154. status: 'error',
  155. responseType: 3,
  156. message: response.data.messages.message[0].text,
  157. }
  158. } else {
  159. responseData = {
  160. status: 'error',
  161. responseType: 4,
  162. message: 'Payment Gateway Error.',
  163. }
  164. }
  165. return responseData
  166. }
  167. /**
  168. * Payment Success Handler
  169. *
  170. * @memberOf frontend.refund
  171. * @param {refundModule.getCartDetails} modules
  172. * @param {refundModule.getReturnCommonInvoiceNo} modules
  173. * @param {refundModule.markCartRefund} modules
  174. * @param {refundModule.markBuyNowRefund} modules
  175. * @param {refundModule.addAppointment} modules
  176. * @param {refundModule.updateBuynowAppointment} modules
  177. */
  178. const paymentSuccess = async (cartID, userID, req) => {
  179. const [cartDetails, results] = await Promise.all([
  180. refundModule.getCartDetails(cartID),
  181. refundModule.getReturnCommonInvoiceNo(),
  182. ])
  183. let cinvoiceno = 10000
  184. if (results.length > 0) {
  185. cinvoiceno =
  186. results[0].return_invoice === 0 ||
  187. results[0].return_invoice === '' ||
  188. !results[0].return_invoice
  189. ? 10000
  190. : parseInt(results[0].return_invoice, 10) + 1
  191. }
  192. await Promise.all([
  193. refundModule.markCartRefund(req, cartID, 0),
  194. refundModule.markBuyNowRefund(cartID, cinvoiceno, 0),
  195. ])
  196. let apnmtIDUpdate = req.body.appointmentID
  197. if (!apnmtIDUpdate) {
  198. const resultsAppoint = await Promise.all([
  199. refundModule.addAppointment(req.body.pickup, userID, cartDetails[0].cartlocation_id),
  200. ])
  201. apnmtIDUpdate = resultsAppoint[0].insertId
  202. }
  203. await Promise.all([refundModule.updateBuynowAppointment(cartID, apnmtIDUpdate)])
  204. const responseData = {}
  205. return responseData
  206. }
  207. /**
  208. * Return Product Handler
  209. *
  210. * @memberOf frontend.refund
  211. * @param {frontend.return.relistProduct} modules
  212. */
  213. const returnProduct = async (items) => {
  214. async function relist(item) {
  215. await Promise.all([returnCtrl.relistProduct(item.id, 'returned')])
  216. return true
  217. }
  218. const promises = items.map(relist)
  219. items = await Promise.all(promises)
  220. return items
  221. }
  222. module.exports = {
  223. /**
  224. * Authorize Refund
  225. *
  226. * @memberOf frontend.refund
  227. * @param {frontend.refund.paymentSuccess} modules
  228. * @param {frontend.return.getSingleCartDetails} modules
  229. * @param {frontend.refund.returnProduct} modules
  230. */
  231. authorizePayment: async (req, res) => {
  232. try {
  233. const [cartDetails] = await Promise.all([
  234. returnCtrl.getSingleCartDetails(req, req.body.cart_id),
  235. ])
  236. await returnProduct(cartDetails.cartItems)
  237. await Promise.all([
  238. paymentSuccess(cartDetails.cartValues.id, cartDetails.cartValues.user_id, req),
  239. ])
  240. jsonResponse(res, 'success', {
  241. responseType: 1,
  242. message: 'Return Successfully completed!',
  243. })
  244. } catch (e) {
  245. console.error(e)
  246. jsonResponse(res, 'error', {
  247. responseType: 5,
  248. message: 'Internal Server error!',
  249. })
  250. }
  251. },
  252. }