/* eslint-disable no-unsafe-optional-chaining */ /* eslint-disable react/no-danger */ /* eslint-disable react/no-unused-prop-types */ /* eslint-disable react/no-array-index-key */ import dayjs from "dayjs"; import { useRouter } from "next/navigation"; import { useMemo, useState } from "react"; import { useMediaQuery } from "usehooks-ts"; import Form from "@/components/form/form"; import FormItem from "@/components/form/form-item"; import Container from "@/components/shared/container"; import { Badge } from "@/components/ui/badge/badge"; import { Button } from "@/components/ui/button/button"; import Card from "@/components/ui/card/card"; import LIcon from "@/components/ui/lucid-icon/lucid-icon"; import { Modal } from "@/components/ui/modal/modal"; import { useModal } from "@/components/ui/modal/modal.hook"; import { Skeleton } from "@/components/ui/skeleton/skeleton"; import PolicyCheck from "@/components/widget/policy-check/policy-check"; import RezervationSummaryDrawer from "@/components/widget/reservation-summary-drawer/reservation-summary-drawer"; import { RezervationSummaryDivider, RezervationSummaryFlightInfo, RezervationSummaryFlightTotalPrice, RezervationSummaryProvider, RezervationSummaryTitle, } from "@/components/widget/rezervation-summary/rezervation-summary"; import CoreSummaryInvoiceNoteFormItem from "@/features/core/summary/components/core-summary-invoice-note-form-item"; import CoreSummaryRequestNoteFormItem from "@/features/core/summary/components/core-summary-request-note-form-item"; import CustomerInfoFormItems from "@/features/customer/customer-info/customer-info-form/customer-info-form"; import CustomerInfoSelectInput from "@/features/customer/customer-info-select/customer-info-select-input"; import { DateHelper, getFormatedFlightTime, } from "@/libs/helpers/date-time-helper"; import { getAirportCode, sortCombinationGroups, sortFlightSegments, } from "@/libs/helpers/flight-helper"; import { PriceManager } from "@/libs/price-manager/price-manager"; import type { IFlightAddToCartResponse } from "@/services/eva-display/flight/flight-add-to-cart/flight-add-to-cart.service"; import { useFlightCreatePostWithResultMutation } from "@/services/eva-display/flight/flight-create-post/flight-create-post.service"; import type { IFlightDetailResponse } from "@/services/eva-display/flight/flight-detail/flight-detail.service"; import { useFlightValidateMutation } from "@/services/eva-display/flight/flight-validate/flight-validate.service"; import { useUserInformationsMutation } from "@/services/eva-display/user/user-information.service"; import { useNotifyStore } from "@/store/notify-store/use-notify-store"; import { requiredRule } from "@/validations/form-rules/rules/required-rule"; import { useFlighSummaryCtx } from "./context/flight-summary-context"; interface FlightSummaryContentProps { data: IFlightAddToCartResponse; detailData: IFlightDetailResponse; } interface ReservationSummaryProps { showButton: boolean; } const DEFAULT_COUNTRY_VALUE = { Id: 277, ParentId: null, ParentRegion: null, Label: "", }; const FlightSummaryContent = (props: FlightSummaryContentProps) => { const isDesktop = useMediaQuery("(min-width: 768px)"); const [milesState, setMilesState] = useState({}); const { setNotify } = useNotifyStore(); const router = useRouter(); const { passengers, tpPassengers, searchId, pricingCombinationKeys, employees, isAbroad, travelReasonId, } = useFlighSummaryCtx(); const errModal = useModal({ open: false }); const userInformationsMutation = useUserInformationsMutation(); const validateMutation = useFlightValidateMutation(); const createPostMutation = useFlightCreatePostWithResultMutation(); const getDefaultValues = () => { const defaultFormValues: any = {}; Array.from(Array(tpPassengers.employee?.count ?? 0), (_, employeeIndex) => { defaultFormValues[`${employeeIndex}-employee`] = employees[employeeIndex]?.value; return null; }); return defaultFormValues; }; const defaultValues = useMemo(getDefaultValues, [ employees, tpPassengers.employee?.count, ]); const handleSubmit = async (values: any) => { const mappedPassengers: any[] = []; Object.entries(values).forEach(([formKey, formValue]) => { const formKeySplitted = formKey.split("-"); const passengerIndex = formKeySplitted[0]!; const passengerType = formKeySplitted[1]!; const customerField = formKeySplitted[2]!; const customerFieldValue = formValue; if (passengerIndex && passengerType) { if (["guest", "child"].includes(passengerType) && customerField) { const customer = { ...mappedPassengers[+passengerIndex], [customerField]: customerFieldValue, psKey: passengers[+passengerIndex]!.key, customerType: "guest", }; mappedPassengers[+passengerIndex] = customer; } else if (passengerType === "employee") { const customer = { id: customerFieldValue, psKey: passengers[+passengerIndex]!.key, customerType: "employee", }; mappedPassengers[+passengerIndex] = customer; } } }); const employeePassengers = mappedPassengers.filter( (x) => x.customerType === "employee", ); const employeeInformations = await userInformationsMutation.mutateAsync({ userIds: employeePassengers.map((x) => x.id), }); const usersHasntInformations = employeePassengers .map((x) => x.id) .filter( (x) => !employeeInformations.find((y) => y.userId.toString() === x), ); const hasAllUsersInformations = usersHasntInformations.length === 0; if (!hasAllUsersInformations) { setNotify({ title: "Uyarı", message: "Kullanıcı bilgilerine ulaşılamadı", variant: "warning", }); } const formPassengers = mappedPassengers.map((mappedPassengerItem) => { if (mappedPassengerItem.customerType === "guest") { return mappedPassengerItem; } const employeeInformation = employeeInformations.find( (x) => x.userId.toString() === mappedPassengerItem.id, ); if (!employeeInformation) { throw new Error("Employee informations not found"); } return { phone: employeeInformation.phoneNumber, email: employeeInformation.email, psKey: mappedPassengerItem.psKey, name: employeeInformation.userDetail.firstName, surname: employeeInformation.userDetail.lastName, tc: employeeInformation.passaportDetail.citizenNo, birthDate: DateHelper.isoStringToFullYearString( employeeInformation.userDetail.birthDate, ".", ), gender: employeeInformation.userDetail.gender, milesCode: milesState[employeeInformation.userId?.toString()], }; }); const bookingPassengers: any[] = formPassengers.map( (flightPassenger, index) => { return { Id: 0, IsMaster: index === 0, Address: { AddressName: "", Street: "", City: "", Country: DEFAULT_COUNTRY_VALUE, PostalCode: "", }, Email: flightPassenger.email ?? "", Prefix: "", Suffix: "", PhoneNumbers: [ { CountryCode: 90, AreaCode: flightPassenger.phone?.slice(1, 4), Number: flightPassenger.phone?.slice(4), Type: 3, }, ], Country: DEFAULT_COUNTRY_VALUE, LoyaltyCode: "", TcKimlikNo: flightPassenger.tc ?? "", // "", SpecialServiceRequests: [], ZipCode: "", SecretCustomer: null, PassportTypeId: 0, MernisQueryStatus: 0, Key: flightPassenger.psKey ?? "Key", Name: flightPassenger.name ?? "", Surname: flightPassenger.surname ?? "", Age: 0, PassengerType: 0, Birthday: flightPassenger.birthDate, Gender: !flightPassenger.gender ? 1 : +flightPassenger.gender, CrmCode: "", MilesCode: flightPassenger.milesCode ?? "", HesCode: "", PassportNumber: flightPassenger.passportNo ?? "", }; }, ); let invalid = false; bookingPassengers.forEach((passenger) => { if (!passenger.Email && !passenger.TcKimlikNo) { invalid = true; } }); if (invalid) { setNotify({ title: "Hata", message: "Lütfen tüm yolcuların bilgilerini eksiksiz doldurunuz.", variant: "warning", }); } // const billingPassenger = bookingPassengers[0]!; try { // await validateMutation.mutateAsync({ // FlightValidateBookingRequest: { // BillingRequest: { // IsInvoiceInformationDifferent: false, // Type: 0, // InvoiceAccountCode: null, // InvoiceFirstName: billingPassenger.Name, // InvoiceLastName: billingPassenger.Surname, // Gender: +billingPassenger.Gender, // InvoiceTitle: "", // InvoiceTaxOffice: "", // InvoiceIdentityNumber: billingPassenger.TcKimlikNo, // "12345678999", // InvoiceEmail: billingPassenger.Email, // "mail@omer.com", // InvoicePhone: "944444444444", // InvoiceAddress: billingPassenger.Address, // InvoiceCountry: billingPassenger.Country, // }, // BookingPassengers: bookingPassengers, // AddOnsKeyList: [], // CancelWarrantySearchId: "", // SearchId: props.searchId, // CartId: props.data.cartId, // KvkkApproval: true, // ReservationNotes: "Uçuş", // }, // }); const resp = await createPostMutation.mutateAsync({ CorpCreateFlightRequest: { SearchId: searchId, CartId: props.data.cartId, RequestId: null, TravelReasonId: !travelReasonId ? 1 : +travelReasonId, LinkId: "", SearchProductKey: pricingCombinationKeys[0]!, PassengerInformations: bookingPassengers, IsPreBook: true, KvkkStatus: false, PriceCombinationKeys: [pricingCombinationKeys[0]!], ProjectCode: values["invoice-note"], ReservationNote: values["request-note"], }, }); if (resp.result?.requestId && resp.result?.requestId !== 0) { router.push( `/booking-request-success?bookingId=${resp.result.requestId}`, ); } else { setNotify({ title: "Hata", message: resp.errors?.[0]?.message ?? "Bir hata oluştu", variant: "error", }); } } catch (error) { /* empty */ } }; const combinationGroups = sortCombinationGroups( props.detailData.pricingCombinations[0]?.combinationGroups ?? [], ); if (!combinationGroups) { return (
); } const flightSegments = sortFlightSegments( combinationGroups[0]?.flightSegments!, ); const milesAndSmilesAirlineCodes = ["TK", "AJ0"]; const isShowMilesCode = flightSegments.some((flightSegment) => { return ( milesAndSmilesAirlineCodes.includes( flightSegment?.marketingAirlineCode, ) || milesAndSmilesAirlineCodes.includes(flightSegment?.operatingAirlineCode) ); }); // eslint-disable-next-line react/no-unstable-nested-components function ReservationSummary({ showButton }: ReservationSummaryProps) { return ( <> 1 ? "Gidiş Dönüş" : "Tek Yön" } /> {combinationGroups.map((combinationGroup) => { const flightSegmentsItem = sortFlightSegments( combinationGroup.flightSegments, ); const originSegmentItem = flightSegmentsItem[0]!; const departureSegmentItem = flightSegmentsItem[flightSegmentsItem.length - 1]!; return ( ); })} {/* TODO:Total price ile toplamları eşit gelmiyor be problemi fixlenirse burası gösterilir */} {/* */} {showButton && ( )} ); } return (

{props.data.reservationSummaryCaption}

{`${flightSegments[0]?.origin.split("(")[0]} - ${ flightSegments[ flightSegments.length - 1 ]?.destination.split("(")[0] }, ${flightSegments[0]?.marketingAirline}`}

{tpPassengers.employee?.count + tpPassengers.guest?.count}{" "} Yetişkin
{tpPassengers.child?.count > 0 && (
{tpPassengers.child?.count} Çocuk
)}
{combinationGroups.length > 1 ? ( ) : ( )} {combinationGroups.length > 1 ? "Gidiş Dönüş" : "Tek Yön"}

{Array.from( Array(tpPassengers.employee?.count ?? 0), (_, employeeIndex) => ( {({ field, setValue }) => ( { setMilesState((prev: any) => ({ ...prev, [field.value]: milesCode, })); }} value={field.value ?? null} onChange={(value) => setValue(value)} label={`${employeeIndex + 1}. Yetişkin`} /> )} ), )} {Array.from( Array(tpPassengers.guest?.count ?? 0), (_, index) => (

{tpPassengers.employee.count + index + 1}. Yetişkin

Misafir
), )} {Array.from( Array(tpPassengers.child?.count ?? 0), (_, index) => (

{index + 1}. Çocuk

Misafir
), )}
{({ field, fieldState, setValue }) => (
(
)} renderLabelItem={({ toggleModal }) => ( )} /> {fieldState.error && ( {fieldState.error.message} )}
)}
{isDesktop ? (
) : ( Talep Oluştur } > )}
Uçak rezervasyonu oluşturulamadı!
{JSON.stringify(createPostMutation.data)}
); }; export default FlightSummaryContent;