207 lines
5.6 KiB
JavaScript
207 lines
5.6 KiB
JavaScript
|
import { CartBaseController } from './cart_base_controller'
|
||
|
|
||
|
/*
|
||
|
* Al pagar lo que podamos, primero hay que crear una orden y luego
|
||
|
* contactarse con la APIv2 para generar la variante con el precio que
|
||
|
* queramos agregar. Agregamos la variante al carrito y lanzamos el
|
||
|
* proceso de pago.
|
||
|
*/
|
||
|
export default class extends CartBaseController {
|
||
|
static targets = [ 'form' ]
|
||
|
static values = {
|
||
|
variantId: Number,
|
||
|
currency: String,
|
||
|
price: Number,
|
||
|
firstname: String
|
||
|
}
|
||
|
|
||
|
connect () {
|
||
|
this.paymentMethodByCurrency = {
|
||
|
ARS: 'Spree::PaymentMethod::MercadoPago',
|
||
|
USD: 'Spree::PaymentMethod::Paypal'
|
||
|
}
|
||
|
}
|
||
|
|
||
|
store (event) {
|
||
|
const target = event.currentTarget || event.target
|
||
|
|
||
|
this[`${target.dataset.name}Value`] = target.value
|
||
|
}
|
||
|
|
||
|
set formDisable (disable) {
|
||
|
this.formTarget.elements.forEach(x => x.disabled = disable)
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Realiza todos los pasos:
|
||
|
*
|
||
|
* * Crear pedido
|
||
|
* * Crear variante con el monto y moneda
|
||
|
* * Agregar al pedido
|
||
|
* * Agregar dirección al pedido
|
||
|
* * Obtener métodos de envío
|
||
|
* * Obtener métodos de pago
|
||
|
* * Pagar
|
||
|
* * Reenviar a confirmación
|
||
|
* * Ejecutar el pago (si aplica)
|
||
|
*/
|
||
|
async pay (event = undefined) {
|
||
|
if (event) {
|
||
|
event.preventDefault()
|
||
|
event.stopPropagation()
|
||
|
}
|
||
|
|
||
|
if (!this.formTarget.checkValidity()) {
|
||
|
this.formTarget.classList.add('was-validated')
|
||
|
return
|
||
|
}
|
||
|
|
||
|
this.formDisable = true
|
||
|
|
||
|
// Crear pedido. Todos los pedidos van a ser hechos desde
|
||
|
// Argentina, no hay forma de cambiar esto.
|
||
|
const orderToken = await this.tempCartCreate()
|
||
|
const quantity = 1
|
||
|
const include = 'line_items'
|
||
|
const currency = this.currencyValue
|
||
|
const price = this.priceValue
|
||
|
const email = 'noreply@sutty.nl'
|
||
|
const firstname = this.firstnameValue
|
||
|
const lastname = '-'
|
||
|
const address1 = '-'
|
||
|
const country_id = 250 // XXX: Internet
|
||
|
const city = '-'
|
||
|
const phone = '11111111'
|
||
|
const zipcode = '1111'
|
||
|
const ship_address_attributes = { firstname, lastname, address1, city, country_id, zipcode, phone }
|
||
|
const bill_address_attributes = ship_address_attributes
|
||
|
const confirmation_delivered = true
|
||
|
const custom_return_url = this.customReturnUrl()
|
||
|
|
||
|
let variant_id = this.variantIdValue
|
||
|
|
||
|
// Crear la variante
|
||
|
const payWhatYouCanResponse = await this.spree.sutty.payWhatYouCan({ orderToken }, { variant_id, price, currency, quantity })
|
||
|
|
||
|
variant_id = payWhatYouCanResponse.data.id
|
||
|
|
||
|
if (!variant_id) {
|
||
|
this.formDisable = false
|
||
|
console.error('No se pudo generar la variante', { variant_id, price, currency, quantity })
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Configurar la moneda del pedido
|
||
|
let response = await this.spree.sutty.updateOrder({ orderToken }, { currency, confirmation_delivered, custom_return_url })
|
||
|
|
||
|
if (response.status > 299) {
|
||
|
console.error(response)
|
||
|
this.formDisable = false
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Agregar al carrito
|
||
|
response = await this.spree.cart.addItem({ orderToken }, { variant_id, quantity, include })
|
||
|
|
||
|
if (response.isFail()) {
|
||
|
this.handleFailure(response)
|
||
|
this.formDisable = false
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Actualizar la dirección
|
||
|
response = await this.spree.checkout.orderUpdate({ orderToken }, { order: { email, ship_address_attributes, bill_address_attributes }})
|
||
|
|
||
|
if (response.isFail()) {
|
||
|
this.handleFailure(response)
|
||
|
this.formDisable = false
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Obtener los medios de envío
|
||
|
response = await this.spree.checkout.shippingMethods({ orderToken }, { include: 'shipping_rates' })
|
||
|
|
||
|
if (response.isFail()) {
|
||
|
this.handleFailure(response)
|
||
|
this.formDisable = false
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Elegir medio de envío
|
||
|
response = await this.spree.checkout.orderUpdate({ orderToken }, {
|
||
|
order: {
|
||
|
shipments_attributes: [{
|
||
|
id: response.success().data[0].id,
|
||
|
selected_shipping_rate_id: response.success().included.filter(x => x.type == 'shipping_rate')[0].id
|
||
|
}]
|
||
|
}
|
||
|
})
|
||
|
|
||
|
// Elegir medio de pago
|
||
|
response = await this.spree.checkout.paymentMethods({ orderToken })
|
||
|
|
||
|
if (response.isFail()) {
|
||
|
this.handleFailure(response)
|
||
|
this.formDisable = false
|
||
|
return
|
||
|
}
|
||
|
|
||
|
const payment_method_id = response.success().data.find(x => this.paymentMethodByCurrency[this.currencyValue] == x.attributes.type).id
|
||
|
|
||
|
response = await this.spree.checkout.orderUpdate({ orderToken },
|
||
|
{
|
||
|
order: { payments_attributes: [{ payment_method_id }] },
|
||
|
payment_source: {
|
||
|
[payment_method_id]: {
|
||
|
name: 'Pepitx',
|
||
|
month: 12,
|
||
|
year: 2021
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
|
||
|
if (response.isFail()) {
|
||
|
this.handleFailure(response)
|
||
|
this.formDisable = false
|
||
|
return
|
||
|
}
|
||
|
|
||
|
response = await this.spree.checkout.complete({ orderToken })
|
||
|
|
||
|
if (response.isFail()) {
|
||
|
this.handleFailure(response)
|
||
|
this.formDisable = false
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Reenviar al medio de pago
|
||
|
const checkoutUrls = await this.spree.sutty.getCheckoutURL({ orderToken })
|
||
|
const redirectUrl = checkoutUrls.data[0]
|
||
|
|
||
|
Turbolinks.visit(redirectUrl)
|
||
|
|
||
|
// Volver
|
||
|
}
|
||
|
|
||
|
async tempCartCreate () {
|
||
|
const response = await this.spree.cart.create()
|
||
|
|
||
|
// If we fail here it's probably a server error, so we inform the
|
||
|
// user.
|
||
|
if (response.isFail()) {
|
||
|
this.handleFailure(response)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
return response.success().data.attributes.token
|
||
|
}
|
||
|
|
||
|
// @return [String]
|
||
|
customReturnUrl () {
|
||
|
const url = new URL(window.location.href)
|
||
|
url.searchParams.set('open', '')
|
||
|
|
||
|
return url.toString()
|
||
|
}
|
||
|
}
|