You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
500 lines
16 KiB
500 lines
16 KiB
<template>
|
|
<div
|
|
class="tw-px-[15px] tw-mb-[60px] xl:tw-px-[60px] xl:tw-max-w-screen-xl xl:tw-mx-auto xl:tw-grid xl:tw-grid-cols-[822px_auto] xl:tw-gap-[30px]"
|
|
>
|
|
<section
|
|
class="section section-one tw-my-[40px] md:tw-my-[50px] xl:tw-col-span-2"
|
|
>
|
|
<StepInfo :step_active="step"></StepInfo>
|
|
</section>
|
|
<section class="section section-two">
|
|
<h2
|
|
class="t18 title-icon-left tw-text-black tw-mb-[15px] xl:tw-mb-[10px] xl:tw-text-[24px]"
|
|
>
|
|
{{ $t("Booking Info") }}
|
|
</h2>
|
|
<div
|
|
class="notice tw-body-3 tw-text-black tw-mb-[20px] tw-hidden xl:tw-block"
|
|
>
|
|
{{
|
|
$t(
|
|
"Please enter your info carefully. Once submitted it cannot be changed."
|
|
)
|
|
}}
|
|
</div>
|
|
<BookingInfoItem
|
|
v-for="(item, index) in order"
|
|
:key="index"
|
|
:info="item"
|
|
:content="content"
|
|
:questions="content.booking_questions"
|
|
:contact.sync="userContactList"
|
|
:active="activeLabel"
|
|
@changeActiveLabel="activeLabel = $event"
|
|
@contact="contactData = $event"
|
|
@answer="answerData = $event"
|
|
@bookingDetail_validation="getBookingDetail_validation"
|
|
>
|
|
</BookingInfoItem>
|
|
<h2
|
|
class="t18 title-icon-left tw-text-black tw-mb-[15px] lg:tw-mb-[8px] xl:tw-text-[24px] xl:tw-mt-[60px]"
|
|
>
|
|
{{ $t("Complete Payment") }}
|
|
</h2>
|
|
<div
|
|
class="notice tw-body-3 tw-text-black tw-mb-[20px] tw-hidden xl:tw-block"
|
|
>
|
|
{{
|
|
$t(
|
|
"Please enter your info carefully. Once submitted it cannot be changed."
|
|
)
|
|
}}
|
|
</div>
|
|
|
|
<PurchaserInfo
|
|
:class="[bookingDetail_Validation ? 'noFilter' : 'haveFilter']"
|
|
ref="purchaserInfo"
|
|
:userCompanyList="userCompanyList"
|
|
:countryOptions="countryOptions"
|
|
:infoType="type"
|
|
:bookingDetail_Validation="bookingDetail_Validation"
|
|
@type="type = $event"
|
|
@active="companyActiveLabel = $event"
|
|
@individual="individualData = $event"
|
|
@company="companyData = $event"
|
|
@purchaserInfo_validation="getPurchaserInfo_validation"
|
|
></PurchaserInfo>
|
|
<ChooseMethod
|
|
:class="[purchaserInfo_Validation ? 'noFilter' : 'haveFilter']"
|
|
:orderNo="orderNo"
|
|
:purchaserInfo_Validation="purchaserInfo_Validation"
|
|
@paymentType="paymentData.payment_type = $event"
|
|
@update="updateToken($event)"
|
|
>
|
|
</ChooseMethod>
|
|
<Invoice v-if="language == 'zh-tw'"></Invoice>
|
|
<PcTotalPrice
|
|
:subTotal="subTotal"
|
|
:currency="currency"
|
|
v-on:payNowClick="payNow()"
|
|
></PcTotalPrice>
|
|
</section>
|
|
<section class="section section-three">
|
|
<PriceInfo
|
|
v-for="(item, index) in order"
|
|
:key="index"
|
|
:info="item"
|
|
:currency="currency"
|
|
></PriceInfo>
|
|
<TotalPrice
|
|
:subTotal="subTotal"
|
|
:currency="currency"
|
|
v-on:payNowClick="payNow()"
|
|
></TotalPrice>
|
|
</section>
|
|
<AddContactModal @update="updateContactList"></AddContactModal>
|
|
<EditContactModal
|
|
ref="EditContactModal"
|
|
:contact.sync="userContactList[this.activeLabel - 1]"
|
|
@update="getContactList"
|
|
></EditContactModal>
|
|
<AddCompanyModal
|
|
:selectList.sync="countryOptions"
|
|
@update="updateCompanyList()"
|
|
>
|
|
</AddCompanyModal>
|
|
<EditCompanyModal
|
|
:selectList.sync="countryOptions"
|
|
:company.sync="userCompanyList[companyActiveLabel - 1]"
|
|
@update="getCompanyList()"
|
|
></EditCompanyModal>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import StepInfo from "@/components/service/StepInfo";
|
|
import BookingInfoItem from "@/components/service/BookingInfoItem";
|
|
import PurchaserInfo from "@/components/service/PurchaserInfo";
|
|
import ChooseMethod from "@/components/service/ChooseMethod";
|
|
import PriceInfo from "@/components/service/PriceInfo";
|
|
import TotalPrice from "@/components/service/TotalPrice";
|
|
import PcTotalPrice from "@/components/service/PcTotalPrice";
|
|
import elementInput from "@/components/newComponent/form/ElementInput";
|
|
import AddContactModal from "@/components/newComponent/modal/AddContactModal";
|
|
import EditContactModal from "@/components/newComponent/modal/EditContactModal";
|
|
import AddCompanyModal from "@/components/newComponent/modal/AddCompanyModal";
|
|
import EditCompanyModal from "@/components/newComponent/modal/EditCompanyModal";
|
|
import Invoice from "@/components/service/Invoice.vue";
|
|
|
|
export default {
|
|
name: "service",
|
|
layout: "service",
|
|
auth: true,
|
|
components: {
|
|
StepInfo,
|
|
BookingInfoItem,
|
|
PurchaserInfo,
|
|
ChooseMethod,
|
|
PriceInfo,
|
|
TotalPrice,
|
|
PcTotalPrice,
|
|
elementInput,
|
|
Invoice,
|
|
AddContactModal,
|
|
EditContactModal,
|
|
AddCompanyModal,
|
|
EditCompanyModal,
|
|
},
|
|
data() {
|
|
return {
|
|
apiUrl: process.env.SERVICE_CONSOLE,
|
|
devECPayUrl: "https://dev-lambda.showeasy.com",
|
|
language: this.$i18n.locale,
|
|
step: "2",
|
|
orderNo: this.$route.params.id,
|
|
order: null,
|
|
serviceId: "",
|
|
currency: "",
|
|
type: "Individual",
|
|
individualData: {},
|
|
companyData: {},
|
|
contactData: {},
|
|
paymentData: {},
|
|
answerData: [],
|
|
content: {
|
|
preview_image: "",
|
|
country: null,
|
|
city: null,
|
|
name: "",
|
|
highlights: "",
|
|
details: "",
|
|
cancellation_policy: "",
|
|
saved: false,
|
|
confirmation_time: 24,
|
|
supplier: null,
|
|
available_sections: null,
|
|
timeStatus: "",
|
|
dateStatus: "",
|
|
times: [],
|
|
start: "",
|
|
end: "",
|
|
faq: null,
|
|
packages: [],
|
|
additionalServices: [],
|
|
booking_questions: [],
|
|
},
|
|
subTotal: 0,
|
|
activeLabel: 0,
|
|
companyActiveLabel: 0,
|
|
userContactList: [],
|
|
userCompanyList: [],
|
|
countryOptions: [],
|
|
contact: [],
|
|
method: "",
|
|
payToken: "",
|
|
three_d_url: "",
|
|
validation: {
|
|
bookingInfo: false,
|
|
purchaserInfo: false,
|
|
chooseMethod: false,
|
|
},
|
|
bookingDetail_Validation: false,
|
|
purchaserInfo_Validation: false,
|
|
};
|
|
},
|
|
async created() {
|
|
if (this.$auth.loggedIn) {
|
|
// await this.getContactList();
|
|
// await this.getActiveLength();
|
|
// await this.getOrder();
|
|
// await this.getServiceData();
|
|
// await this.getPackages();
|
|
// await this.getAdditionalServices();
|
|
// await this.getCountries();
|
|
// await this.getCompanyList();
|
|
}
|
|
},
|
|
mounted() {},
|
|
methods: {
|
|
async getContactList() {
|
|
await this.$axios
|
|
.get(
|
|
`/member/contacts?jwt=${
|
|
this.$auth.$storage.getUniversal("jwt").token
|
|
}`
|
|
)
|
|
.then((result) => {
|
|
this.userContactList = result.data.contacts;
|
|
return result.data;
|
|
})
|
|
.catch((err) => {
|
|
console.log(err);
|
|
});
|
|
},
|
|
async updateContactList() {
|
|
await this.$axios
|
|
.get(
|
|
`/member/contacts?jwt=${
|
|
this.$auth.$storage.getUniversal("jwt").token
|
|
}`
|
|
)
|
|
.then((result) => {
|
|
this.userContactList = result.data.contacts;
|
|
this.activeLabel = this.userContactList.length;
|
|
return result.data;
|
|
})
|
|
.catch((err) => {
|
|
console.log(err);
|
|
});
|
|
},
|
|
async getOrder() {
|
|
await this.$axios
|
|
.get(
|
|
`/order/${this.$route.params.id}?jwt=${
|
|
this.$auth.$storage.getUniversal("jwt").token
|
|
}`
|
|
)
|
|
.then((res) => {
|
|
this.order = res.data;
|
|
for (let index in this.order[0].order_item) {
|
|
this.subTotal += this.order[0].order_item[index].item_amount;
|
|
}
|
|
for (let index in this.order[0].order_as) {
|
|
this.subTotal += this.order[0].order_as[index].as_amount;
|
|
}
|
|
this.serviceId = this.order[0].service_id;
|
|
this.currency = this.order[0].currency;
|
|
})
|
|
.catch((err) => {
|
|
console.log(err);
|
|
});
|
|
},
|
|
async getServiceData() {
|
|
await this.$axios
|
|
.get(
|
|
`${this.apiUrl}/user-services/content?service_id=${this.serviceId}&lang_code=${this.$i18n.localeProperties["langQuery"]}¤cy=${this.currency}`
|
|
)
|
|
.then((res) => {
|
|
this.content.preview_image = res.data.preview_image;
|
|
this.content.name = res.data.name;
|
|
this.content.country = res.data.country;
|
|
this.content.city = res.data.city;
|
|
this.content.highlights = res.data.highlights;
|
|
this.content.details = res.data.details;
|
|
this.content.cancellation_policy = res.data.cancellation_policy;
|
|
this.content.supplier = res.data.supplier;
|
|
this.content.available_sections = res.data.available_sections;
|
|
this.content.times = res.data.available_sections.times;
|
|
this.content.timeStatus = res.data.available_sections.time_status;
|
|
this.content.dateStatus = res.data.available_sections.date_status;
|
|
this.content.start = res.data.available_sections.start;
|
|
this.content.end = res.data.available_sections.end;
|
|
this.content.payment_currency = res.data.payment_currency;
|
|
this.content.booking_questions = res.data.booking_questions;
|
|
})
|
|
.catch((error) => console.log(error));
|
|
},
|
|
async getPackages() {
|
|
let orderPackageId = this.order[0].order_item[0].package_id
|
|
? this.order[0].order_item[0].package_id
|
|
: "";
|
|
await this.$axios
|
|
.get(
|
|
`${this.apiUrl}/user-services/packages?service_id=${this.serviceId}&lang_code=${this.$i18n.localeProperties["langQuery"]}¤cy=${this.currency}`
|
|
)
|
|
.then((res) => {
|
|
this.content.packages = res.data;
|
|
let packageObject =
|
|
this.content.packages[
|
|
this.content.packages.findIndex(
|
|
(item) => item.package_id === orderPackageId
|
|
)
|
|
];
|
|
for (let i in packageObject.questions) {
|
|
packageObject.questions[i].required =
|
|
packageObject.questions[i].required_ans;
|
|
this.content.booking_questions.push(packageObject.questions[i]);
|
|
}
|
|
})
|
|
.catch((error) => console.log(error));
|
|
},
|
|
async getAdditionalServices() {
|
|
await this.$axios
|
|
.get(
|
|
`${this.apiUrl}/user-services/additional?service_id=${this.serviceId}&lang_code=${this.$i18n.localeProperties["langQuery"]}¤cy=${this.currency}`
|
|
)
|
|
.then((res) => {
|
|
this.content.additionalServices =
|
|
res.data.services == [] ? null : res.data;
|
|
if (this.order[0].order_as.length > 0) {
|
|
for (let i in this.content.additionalServices[0].questions) {
|
|
this.content.additionalServices[0].questions[i].required =
|
|
this.content.additionalServices[0].questions[i].required_ans;
|
|
this.content.booking_questions.push(
|
|
this.content.additionalServices[0].questions[i]
|
|
);
|
|
}
|
|
}
|
|
})
|
|
.catch((error) => console.log(error));
|
|
},
|
|
async payNow() {
|
|
let vm = this;
|
|
if (this.paymentData.payment_type == "Credit Card") {
|
|
try {
|
|
ECPay.getPayToken(function (paymentInfo, errMsg) {
|
|
//console.log("response => getPayToken(paymentInfo, errMsg):", paymentInfo, errMsg);
|
|
if (errMsg != null) {
|
|
vm.ErrHandle(errMsg);
|
|
return;
|
|
}
|
|
vm.payToken = paymentInfo.PayToken;
|
|
vm.updateOrder(Object);
|
|
return true;
|
|
});
|
|
} catch (err) {
|
|
this.ErrHandle(err);
|
|
}
|
|
} else {
|
|
vm.updateOrder(Object);
|
|
}
|
|
},
|
|
async getCountries() {
|
|
await this.$axios
|
|
.get(`/users/countries?lang=${this.$i18n.locale.replace("-", "")}`)
|
|
.then((result) => {
|
|
this.countryOptions = result.data.result;
|
|
})
|
|
.catch((err) => {
|
|
console.log(err);
|
|
});
|
|
},
|
|
async getCompanyList() {
|
|
await this.$axios
|
|
.get(
|
|
`/member/company?jwt=${this.$auth.$storage.getUniversal("jwt").token}`
|
|
)
|
|
.then((result) => {
|
|
this.userCompanyList = result.data.data;
|
|
Array.from(this.userCompanyList).forEach((item) => {
|
|
let id = item.company_country;
|
|
let countryName = this.countryOptions.filter(
|
|
(item) => item.id === id || null
|
|
);
|
|
item.company_country_name = countryName[0].name ?? 0;
|
|
});
|
|
return result.data;
|
|
})
|
|
.catch((err) => {
|
|
console.log(err);
|
|
});
|
|
},
|
|
updateCompanyList() {
|
|
this.$axios
|
|
.get(
|
|
`/member/company?jwt=${this.$auth.$storage.getUniversal("jwt").token}`
|
|
)
|
|
.then((result) => {
|
|
this.userCompanyList = result.data.data;
|
|
this.companyActiveLabel = this.userCompanyList.length;
|
|
this.Company.company_name =
|
|
result.data.data[this.activeLabel].company_name;
|
|
this.Company.company_tax_no =
|
|
result.data.data[this.activeLabel].company_tax_no;
|
|
this.Company.company_address1 =
|
|
result.data.data[this.activeLabel].company_address1;
|
|
this.Company.company_address2 =
|
|
result.data.data[this.activeLabel].company_address2;
|
|
this.Company.company_city =
|
|
result.data.data[this.activeLabel].company_city;
|
|
this.Company.company_state =
|
|
result.data.data[this.activeLabel].company_state;
|
|
this.Company.company_country =
|
|
result.data.data[this.activeLabel].company_country_name;
|
|
this.Company.company_zipcode =
|
|
result.data.data[this.activeLabel].company_zipcode;
|
|
return result.data;
|
|
})
|
|
.catch((err) => {
|
|
console.log(err);
|
|
});
|
|
},
|
|
updateOrder() {
|
|
let Object = {
|
|
order_id: this.order[0].order_id,
|
|
total: this.subTotal,
|
|
amount: this.subTotal,
|
|
discount: 0,
|
|
contact: [this.contactData],
|
|
answer: this.answerData,
|
|
};
|
|
if (this.type == "Individual") {
|
|
Object.purchase_personal = this.individualData;
|
|
} else {
|
|
Object.purchase_company = this.companyData;
|
|
}
|
|
Object.payment = [this.paymentData];
|
|
Object.payment[0].payment_index = 0;
|
|
Object.payment[0].amount = this.subTotal;
|
|
this.$axios
|
|
.put(
|
|
`/order/${this.$route.params.id}?jwt=${
|
|
this.$auth.$storage.getUniversal("jwt").token || ""
|
|
}`,
|
|
Object
|
|
)
|
|
.then((res) => {
|
|
if (res.status == "200") {
|
|
if (this.paymentData.payment_type == "Credit Card") {
|
|
this.createPayment();
|
|
} else {
|
|
this.$router.push(
|
|
this.localePath("/service/done/" + this.$route.params.id)
|
|
);
|
|
}
|
|
}
|
|
})
|
|
.catch((error) => {
|
|
console.log(error);
|
|
});
|
|
},
|
|
getActiveLength() {
|
|
this.activeLabel = this.userContactList.length > 0 ? 1 : 0;
|
|
},
|
|
updateToken(token) {
|
|
this.payToken = token;
|
|
},
|
|
createPayment() {
|
|
this.$axios
|
|
.post(`${this.devECPayUrl}/payment/ecpay/create-payment`, {
|
|
pay_token: this.payToken,
|
|
payment_flow: "ecpay",
|
|
product_order_no: this.orderNo,
|
|
})
|
|
.then((response) => {
|
|
if (response.data.status_code === 200) {
|
|
window.location.assign(response.data.three_d_url);
|
|
}
|
|
})
|
|
.catch((error) => console.log(error));
|
|
},
|
|
getBookingDetail_validation(data) {
|
|
this.bookingDetail_Validation = data;
|
|
},
|
|
getPurchaserInfo_validation(data) {
|
|
this.purchaserInfo_Validation = data;
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
.noFilter {
|
|
pointer-events: auto;
|
|
cursor: auto;
|
|
}
|
|
|
|
.haveFilter {
|
|
cursor: not-allowed;
|
|
pointer-events: none;
|
|
filter: opacity(50%);
|
|
}
|
|
</style>
|