File manager - Edit - /home/premiey/www/wp-content/plugins/ameliabooking/v3/src/assets/js/public/booking.js
Back
import {useDiscountAmountPackage} from "./package"; import moment from "moment"; import httpClient from "../../../plugins/axios.js"; import { settings, locale } from "../../../plugins/settings.js" import { useUtcValue, useLocalValue, useUtcValueOffset, useStringFromDate } from "../common/date.js"; import { reactive, ref, computed } from "vue"; import { useCartItem } from "./cart"; import { useAppointmentsTotalAmount, useDiscountAmount, useServices } from "../common/appointments"; import { usePackageAmount } from "./package"; import useAction from "./actions"; import { useUrlQueryParams } from "../common/helper"; const globalLabels = reactive(window.wpAmeliaLabels) let errorMessage = ref() function usePaymentError (store, callback) { store.commit('booking/setLoading', false) callback() } function buildFormData (formData, data, parentKey) { if (data && typeof data === 'object' && !(data instanceof Date) && !(data instanceof File)) { Object.keys(data).forEach(key => { buildFormData(formData, data[key], parentKey ? `${parentKey}[${key}]` : key) }) } else { formData.append(parentKey, data !== null ? data : '') } } function useBookingData (store, formData, mandatoryJson = false, paymentData = {}, recaptcha = null) { let bookableType = store.getters['bookableType/getType'] ? store.getters['bookableType/getType'] : store.getters['booking/getBookableType'] let customFields = {} let availableCustomFields = bookableType !== 'event' ? store.getters['booking/getAvailableCustomFields'] : store.getters['customFields/getCustomFields'] let attachments = bookableType !== 'event' ? store.getters['booking/getAttachments'] : {} if (bookableType !== 'event') { for (let id in availableCustomFields) { if (availableCustomFields[id].type === 'file' && Object.keys(attachments).length && id in attachments && attachments[id].length ) { let uploadCustomField = { label: availableCustomFields[id].label, value: [], type: 'file' } for (let i = 0; i < attachments[id].length; i++) { uploadCustomField.value.push({ name: attachments[id][i].name }) } customFields[id] = uploadCustomField } else if (availableCustomFields[id].type !== 'content') { customFields[id] = availableCustomFields[id] } if (availableCustomFields[id].type === 'datepicker') { customFields[id].value = availableCustomFields[id].value ? useStringFromDate(new Date(availableCustomFields[id].value)) : null } } } else { for (let key in availableCustomFields) { if (availableCustomFields[key].type !== 'content') { customFields[availableCustomFields[key].id] = { label: availableCustomFields[key].label, type: availableCustomFields[key].type, value: availableCustomFields[key].value } } if (availableCustomFields[key].type === 'file') { customFields[availableCustomFields[key].id].value = [] if (availableCustomFields[key].value.length) { attachments[availableCustomFields[key].id] = availableCustomFields[key].value } for (let i = 0; i < availableCustomFields[key].value.length; i++) { customFields[availableCustomFields[key].id].value.push({ name: availableCustomFields[key].value[i].name }) } } if (availableCustomFields[key].type === 'datepicker') { customFields[availableCustomFields[key].id].value = availableCustomFields[key].value ? useStringFromDate(new Date(availableCustomFields[key].value)) : null } } } let deposit = bookableType !== 'event' ? !store.getters['booking/getPaymentDeposit'] : !store.getters['payment/getPaymentDeposit'] let componentProps = formData ? { state: bookableType !== 'event' ? store.state.booking : useEventsStoreData(store), form: formData, } : null if (formData && 'form' in componentProps && 'sidebar' in componentProps.form) { componentProps.form.sidebar.forEach((item) => { item.data.forEach((data) => { if (data && 'value' in data) { data.value = data.value.replace(/"/g, "'") } }) }) } if (formData && 'state' in componentProps && 'customFields' in componentProps.state && 'customFields' in componentProps.state.customFields) { Object.keys(componentProps.state.customFields.customFields).forEach((key) => { if ('options' in componentProps.state.customFields.customFields[key]) { delete componentProps.state.customFields.customFields[key].options } }) } if (formData && 'state' in componentProps && 'tickets' in componentProps.state && 'tickets' in componentProps.state.tickets) { componentProps.state.tickets.tickets.forEach((ticket, index) => { if ('translations' in ticket) { delete componentProps.state.tickets.tickets[index].translations } }) } let jsonData = { type: bookableType, bookings: [ { customFields: customFields, deposit: deposit, locale: locale, utcOffset: null, persons: bookableType !== 'event' ? store.getters['booking/getBookingPersons'] : store.getters['persons/getPersons'], customerId: bookableType !== 'event' ? store.getters['booking/getCustomerId'] : store.getters['customerInfo/getCustomerId'], customer: { id: bookableType !== 'event' ? store.getters['booking/getCustomerId'] : store.getters['customerInfo/getCustomerId'], firstName: bookableType !== 'event' ? store.getters['booking/getCustomerFirstName'] : store.getters['customerInfo/getCustomerFirstName'], lastName: bookableType !== 'event' ? store.getters['booking/getCustomerLastName'] : store.getters['customerInfo/getCustomerLastName'], email: bookableType !== 'event' ? store.getters['booking/getCustomerEmail'] : store.getters['customerInfo/getCustomerEmail'], phone: bookableType !== 'event' ? store.getters['booking/getCustomerPhone'] : store.getters['customerInfo/getCustomerPhone'], countryPhoneIso: bookableType !== 'event' ? store.getters['booking/getCustomerCountryPhoneIso'] : store.getters['customerInfo/getCustomerCountryPhoneIso'], externalId: bookableType !== 'event' ? store.getters['booking/getCustomerExternalId'] : store.getters['customerInfo/getCustomerExternalId'], } } ], payment: Object.assign( { gateway: bookableType !== 'event' ? store.getters['booking/getPaymentGateway'] : store.getters['payment/getPaymentGateway'], currency: settings.payments.currencyCode, }, { data: paymentData } ), recaptcha: recaptcha, locale: locale, timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone, urlParams: useUrlQueryParams(window.location.href), componentProps: componentProps, returnUrl: location.href, } switch (bookableType) { case ('appointment'): jsonData = Object.assign(jsonData, useAppointmentBookingData(store)) jsonData.bookings[0].utcOffset = jsonData.utcOffset jsonData.bookings[0].duration = store.getters['booking/getDuration'] jsonData.bookings[0].extras = store.getters['booking/getSelectedExtras'] break case ('package'): jsonData = Object.assign(jsonData, usePackageBookingData(store)) break case ('event'): jsonData = Object.assign(jsonData, { eventId: store.getters['eventBooking/getSelectedEventId'] }) let coupon = store.getters['coupon/getCoupon'] jsonData = Object.assign(jsonData, { couponCode: coupon && (coupon.discount || coupon.deduction) ? coupon.code : null, }) jsonData.bookings[0] = Object.assign(jsonData.bookings[0], { ticketsData: store.getters['tickets/getTicketsData'] }) break } let bookingData = jsonData let requestOptions = {} if (Object.keys(attachments).length && !mandatoryJson) { if ( bookingData.componentProps && bookingData.componentProps.state && bookableType !== 'event' ) { bookingData.componentProps.state.appointments.forEach(a => { Object.keys(a.services).forEach(s => { a.services[s].slots = []; }) }) } bookingData = new FormData() buildFormData(bookingData, jsonData) for (let id in attachments) { attachments[id].forEach((item, index) => { bookingData.append('files[' + id + '][' + index + ']', item.raw) }) } requestOptions = { headers: { 'Content-Type': 'multipart/form-data' } } } return { data: bookingData, options: requestOptions } } function useEventsStoreData (store) { return { eventId: store.getters['eventBooking/getSelectedEventId'], bookableType: store.getters['bookableType/getType'], coupon: store.getters['coupon/getCoupon'], customerInfo: store.getters['customerInfo/getAllData'], customFields: store.getters['customFields/getAllData'], payment: store.getters['payment/getAllData'], tickets: store.getters['tickets/getAllData'], persons: store.getters['persons/getAllData'], pagination: store.getters['pagination/getAllData'], params: store.getters['params/getAllData'] } } function useAppointmentBookingData (store) { let serviceId = store.getters['booking/getServiceId'] let cartItem = useCartItem(store) let appointments = cartItem.services[serviceId].list let firstAppointment = appointments[0] let otherAppointments = [] appointments.slice(1).forEach((appointment) => { otherAppointments.push({ providerId: appointment.providerId, locationId: appointment.locationId, bookingStart: appointment.date + ' ' + appointment.time, }) }) let bookingStart = firstAppointment.date + ' ' + firstAppointment.time let utcOffset = null if (settings.general.showClientTimeZone) { bookingStart = useUtcValue(bookingStart) utcOffset = useUtcValueOffset(bookingStart) otherAppointments.forEach((appointment) => { appointment.bookingStart = useUtcValue(appointment.bookingStart) appointment.utcOffset = useUtcValueOffset(appointment.bookingStart) }) } let coupon = store.getters['booking/getCoupon'] return { bookingStart: bookingStart, notifyParticipants: settings.notifications.notifyCustomers ? 1 : 0, locationId: firstAppointment.locationId, providerId: firstAppointment.providerId, serviceId: serviceId, utcOffset: utcOffset, recurring: otherAppointments, package: [], couponCode: coupon && (coupon.discount || coupon.deduction)? coupon.code : null, } } function usePackageBookingData (store) { let appointments = [] let rules = [] let cartItem = useCartItem(store) let activeItemServices = cartItem.services for (let serviceId in activeItemServices) { activeItemServices[serviceId].list.forEach((appointment) => { if (appointment.date && appointment.time) { let utcOffset = null let bookingStart = appointment.date + ' ' + appointment.time if (settings.general.showClientTimeZone) { bookingStart = useUtcValue(bookingStart) utcOffset = useUtcValueOffset(bookingStart) } appointments.push({ bookingStart: bookingStart, serviceId: parseInt(serviceId), providerId: appointment.providerId, locationId: appointment.locationId, utcOffset: utcOffset, notifyParticipants: settings.notifications.notifyCustomers ? 1 : 0, }) } }) rules.push({ serviceId: parseInt(serviceId), providerId: activeItemServices[serviceId].providerId ? activeItemServices[serviceId].providerId : null, locationId: activeItemServices[serviceId].locationId ? activeItemServices[serviceId].locationId : null }) } let coupon = store.getters['booking/getCoupon'] return { package: appointments, packageId: store.getters['booking/getPackageId'], packageRules: rules, utcOffset: useUtcValueOffset(null), deposit: !store.getters['booking/getPaymentDeposit'], couponCode: coupon && (coupon.discount || coupon.deduction)? coupon.code : null } } function createBooking (store, requestData, successCallback, errorCallback) { httpClient.post( '/bookings', requestData.data, requestData.options ).then(successCallback).catch(errorCallback) } function useCreateBooking (store, requestData, successCallback, errorCallback) { let bookableType = store.getters['bookableType/getType'] ? store.getters['bookableType/getType'] : store.getters['booking/getBookableType'] useAction( store, useBookingData( store, null, true, {}, null ).data, 'beforeBooking', bookableType, () => { createBooking(store, requestData, successCallback, errorCallback) }, message => { errorCallback({response:{data:{data:{message: message}}}}) } ) } function useBookingError (response, store) { let bookableType = store.getters['bookableType/getType'] ? store.getters['bookableType/getType'] : store.getters['booking/getBookableType'] let message = globalLabels['payment_error_default'] if ('data' in response) { if ('customerAlreadyBooked' in response.data && response.data.customerAlreadyBooked === true) { message = bookableType === 'event' ? globalLabels['customer_already_booked_ev'] : globalLabels['customer_already_booked_app'] } else if ('timeSlotUnavailable' in response.data && response.data.timeSlotUnavailable === true) { message = bookableType === 'event' ? globalLabels['maximum_capacity_reached'] : globalLabels['time_slot_unavailable'] } else if ('bookingsLimitReached' in response.data && response.data.bookingsLimitReached === true) { message = globalLabels['bookings_limit_reached'] } else if ('eventBookingUnavailable' in response.data && response.data.eventBookingUnavailable === true) { message = globalLabels['event_booking_unavailable'] } else if ('emailError' in response.data && response.data.emailError === true) { message = globalLabels['email_exist_error'] } else if ('couponUnknown' in response.data && response.data.couponUnknown === true) { message = globalLabels['coupon_unknown'] } else if ('couponInvalid' in response.data && response.data.couponInvalid === true) { message = globalLabels['coupon_invalid'] } else if ('couponExpired' in response.data && response.data.couponExpired === true) { message = globalLabels['coupon_expired'] } else if ('couponMissing' in response.data && response.data.couponMissing === true) { message = globalLabels['coupon_missing'] } else if ('paymentSuccessful' in response.data && response.data.paymentSuccessful === false) { message = globalLabels['payment_error'] } else if ('bookingAlreadyInWcCart' in response.data && response.data.bookingAlreadyInWcCart === true) { message = globalLabels['booking_already_in_wc_cart'] } else if ('wcError' in response.data && response.data.wcError === true) { message = globalLabels['wc_error'] } else if ('recaptchaError' in response.data && response.data.recaptchaError === true) { message = globalLabels['recaptcha_invalid_error'] } else if ('packageBookingUnavailable' in response.data && response.data.packageBookingUnavailable === true) { message = globalLabels['package_booking_unavailable'] } else if ('message' in response.data) { message = response.data.message } } return message } function saveStats (requestData) { httpClient.post( '/stats', requestData ).catch(e => { console.log(e.message) }) } function useNotify (response, success, error) { if (!settings.general.runInstantPostBookingActions) { let request = {} switch (response.type) { case ('appointment'): request = getAppointmentNotifyData(response) break case('package'): request = getPackageNotifyData(response) break case ('event'): request = getEventNotifyData(response) break } httpClient.post( '/bookings/success/' + request.id + '&nocache=' + (new Date().getTime()), request.data, {} ).then(success).catch(error) } } function getAppointmentNotifyData (response) { let recurringData = [] response.recurring.forEach((recurring) => { recurringData.push( { type: 'appointment', id: recurring.booking.id, appointmentStatusChanged: recurring.appointmentStatusChanged } ) }) return { id: response.booking.id, data: { type: 'appointment', appointmentStatusChanged: response.appointmentStatusChanged, recurring: recurringData, packageId: null, customer: response.customer, paymentId: 'paymentId' in response && response.paymentId ? response.paymentId : null, packageCustomerId: null } } } function getPackageNotifyData (response) { let bookings = [] let bookingId = 0 response.package.forEach((packData, index) => { if (index > 0) { bookings.push( { type: 'appointment', id: packData.booking.id, appointmentStatusChanged: packData.appointmentStatusChanged } ) } else { bookingId = packData.booking.id } }) return { id: bookingId, data: { type: 'package', appointmentStatusChanged: response.appointmentStatusChanged, recurring: bookings, packageId: response.packageId, customer: response.customer, paymentId: 'paymentId' in response && response.paymentId ? response.paymentId : null, packageCustomerId: response.packageCustomerId, } } } function getEventNotifyData (response) { return { id: response.booking.id, data: { type: 'event', appointmentStatusChanged: response.appointmentStatusChanged, paymentId: 'paymentId' in response && response.paymentId ? response.paymentId : null } } } function getSingleAppointmentData (store, date, data) { let services = useServices(store) let bookable = services.find(i => i.id === data.appointment.serviceId) return { appointmentId: data.appointment ? data.appointment.id : '', bookingId: data.booking.id, serviceId: data.appointment.serviceId, providerId: data.appointment.providerId, locationId: data.appointment.locationId, title: bookable.name, description: bookable.description, start: settings.general.showClientTimeZone ? useLocalValue(date.start) : data.appointment.bookingStart, end: settings.general.showClientTimeZone ? useLocalValue(date.end) : data.appointment.bookingEnd, utcStart: moment.utc(date.start.replace(/ /g, 'T')).toDate(), utcEnd: moment.utc(date.end.replace(/ /g, 'T')).toDate(), } } function runAction (store, response) { useAction( store, { payment: Object.assign(response.payment, {currency: settings.payments.currencyCode}), }, response.payment.gateway === 'onSite' ? 'Schedule' : 'Purchase', response.type, null, null ) } function useAppointmentCalendarData (store, response) { let appointments = [] let payments = [] let paymentAmount = 0 response.utcTime.forEach((date) => { appointments.push(getSingleAppointmentData(store, date, response)) payments.push(response.payment) paymentAmount = response.payment.amount }) response.recurring.forEach((data) => { data.utcTime.forEach((date) => { appointments.push(getSingleAppointmentData(store, date, data)) if (response.bookable.recurringPayment > 0 && response.payment.gateway !== 'wc') { payments.push(response.booking.payments[0]) paymentAmount += response.booking.payments[0].amount } }) }) runAction(store, response) return { type: 'appointment', data: appointments, token: response.booking.token, payments: payments, paymentAmount: paymentAmount, price: useAppointmentsTotalAmount(store, response.bookable, appointments) - (response.booking && response.booking.coupon ? useDiscountAmount(store, response.booking.coupon, appointments) : 0), customerCabinetUrl: response.customerCabinetUrl, } } function usePackageCalendarData (store, response) { let token = '' let appointments = [] response.package.forEach((data, index) => { if (index === 0) { token = data.booking.token } data.utcTime.forEach((date) => { appointments.push(getSingleAppointmentData(store, date, data)) }) }) runAction(store, response) let coupon = store.getters['booking/getCoupon'] return { type: 'package', data: appointments, token: token, payments: [response.payment], paymentAmount: response.payment.amount, payment: response.payment, price: usePackageAmount(store) - (coupon ? useDiscountAmountPackage(store, coupon) : 0), customerCabinetUrl: response.customerCabinetUrl, } } function useEventCalendarData (store, response) { let locationAddress = '' if (response.event.location) { locationAddress = response.event.location.address } else if (response.event.customLocation) { locationAddress = response.event.customLocation } let data = [] response.utcTime.forEach(function (date) { data.push( { eventId: response.event.id, bookingId: response.booking.id, locationId: response.event.locationId, organizerId: response.event.organizerId, title: response.event.name, description: response.event.description, start: settings.general.showClientTimeZone ? useLocalValue(date.start) : date.start, end: settings.general.showClientTimeZone ? useLocalValue(date.end) : date.end, utcStart: moment.utc(date.start.replace(/ /g, 'T')).toDate(), utcEnd: moment.utc(date.end.replace(/ /g, 'T')).toDate(), } ) }) let ticketsData = [] response.booking.ticketsData.forEach(ticket => { if (ticket.persons) { let ticketInEvent = response.event.customTickets.find(t => t.id === ticket.eventTicketId) ticket.name = ticketInEvent.name ticketsData.push(ticket) } }) let amSettings = computed(() => store.getters['getSettings']) let afterBookingUrl = computed(() => { let entitySettings = response.event.settings ? JSON.parse(response.event.settings) : amSettings.value let url = '' if ( 'general' in entitySettings && 'redirectUrlAfterAppointment' in entitySettings.general && entitySettings.general.redirectUrlAfterAppointment ) { url = entitySettings.general.redirectUrlAfterAppointment } else if (amSettings.value.general.redirectUrlAfterAppointment) { url = amSettings.value.general.redirectUrlAfterAppointment } return url }) let customerPanelUrl = computed(() => { let entitySettings = response.event.settings ? JSON.parse(response.event.settings) : amSettings.value let url = '' if ( 'roles' in entitySettings && 'customerCabinet' in entitySettings.roles && 'pageUrl' in entitySettings.roles.customerCabinet && entitySettings.roles.customerCabinet.pageUrl ) { url = entitySettings.roles.customerCabinet.pageUrl } else if (amSettings.value.roles.customerCabinet.pageUrl) { url = amSettings.value.roles.customerCabinet.pageUrl } return url }) runAction(store, response) return { type: response.type, active: settings.general.addToCalendar, data: data, event: response.event, bringingAnyone: response.event.bringingAnyone, customPricing: response.event.customPricing, ticketsData: ticketsData, address: locationAddress, token: response.booking.token, persons: response.booking.persons, payments: [response.payment], paymentAmount: response.payment.amount, price: response.booking.price, redirectAfterBookingUrl: afterBookingUrl.value, customerCabinetUrl: customerPanelUrl.value, } } function useCreateBookingSuccess (store, response, callback) { if (response.data.data) { let bookableType = store.getters['bookableType/getType'] ? store.getters['bookableType/getType'] : store.getters['booking/getBookableType'] store.commit((bookableType === 'event' ? 'setLoading' : 'booking/setLoading'), false) switch (bookableType) { case ('appointment'): store.commit('booking/setBooked', useAppointmentCalendarData(store, response.data.data)) break case ('package'): store.commit('booking/setBooked', usePackageCalendarData(store, response.data.data)) break case ('event'): store.commit('eventBooking/setBooked', useEventCalendarData(store, response.data.data)) break } useNotify(response.data.data, () => {}, () => {}) } if (typeof callback !== 'undefined') { callback() } } function useCreateBookingError (store, response, callback) { if ('data' in response) { errorMessage.value = useBookingError(response, store) } if (store.getters['bookableType/getType'] === 'event') { store.commit('setLoading', false) } else { store.commit('booking/setLoading', false) } if (typeof callback !== 'undefined') { callback() } } function getErrorMessage () { return errorMessage.value } export { usePaymentError, useBookingData, useCreateBooking, useCreateBookingSuccess, useCreateBookingError, useAppointmentCalendarData, usePackageCalendarData, useEventCalendarData, getErrorMessage, useBookingError, useNotify, saveStats, useAppointmentBookingData, }
| ver. 1.4 |
Github
|
.
| PHP 5.4.45 | Generation time: 0 |
proxy
|
phpinfo
|
Settings