diff --git a/db/index.ts b/db/index.ts index 2368320..da7ba49 100644 --- a/db/index.ts +++ b/db/index.ts @@ -1,6 +1,7 @@ import * as mongoose from 'mongoose' import Booker from './booker' import Booking from './booking' +import Bill, { BillDocument } from './bill' import { dateFormatFrontend } from '../helpers/date' import { BOOKING_STATUS } from './enums' @@ -82,3 +83,15 @@ export async function createBooking({ await booking.populate('booker').execPopulate() return booking.toJSON() } + +export async function createBill(bookingUUID: string, billData: BillDocument) { + await connect() + const bill = new Bill(billData) + + const booking = await getBookingByUUID(bookingUUID) + bill.booking = booking._id + + await bill.save() + await bill.populate('booking').execPopulate() + return bill.toJSON() +} diff --git a/pages/api/booking/[uuid]/bill.ts b/pages/api/booking/[uuid]/bill.ts new file mode 100644 index 0000000..ef6a871 --- /dev/null +++ b/pages/api/booking/[uuid]/bill.ts @@ -0,0 +1,33 @@ +import { NextApiRequest, NextApiResponse } from 'next' +import { BillDocument } from '../../../../db/bill' +import { createBill } from '../../../../db/index' + +export default async function userHandler( + req: NextApiRequest, + res: NextApiResponse +) { + const { + method, + query: { uuid: uuids }, + } = req + + const bookingUUID = Array.isArray(uuids) ? uuids[0] : uuids + + let bill: BillDocument + + switch (method) { + case 'POST': + try { + bill = await createBill(bookingUUID, req.body) + res.status(200).json(bill) + } catch (e) { + console.error(e) + res.status(500).end(`Internal Server Error...Guru is meditating...`) + return + } + break + default: + res.setHeader('Allow', ['POST']) + res.status(405).end(`Method ${method} Not Allowed`) + } +} diff --git a/pages/api/booking/[uuid].tsx b/pages/api/booking/[uuid]/index.ts similarity index 88% rename from pages/api/booking/[uuid].tsx rename to pages/api/booking/[uuid]/index.ts index 8ff4959..33ebce3 100644 --- a/pages/api/booking/[uuid].tsx +++ b/pages/api/booking/[uuid]/index.ts @@ -1,7 +1,7 @@ import { NextApiRequest, NextApiResponse } from 'next' -import { BookingDocument } from '../../../db/booking' -import { BOOKING_STATUS } from '../../../db/enums' -import { getBookingByUUID } from '../../../db/index' +import { BookingDocument } from '../../../../db/booking' +import { BOOKING_STATUS } from '../../../../db/enums' +import { getBookingByUUID } from '../../../../db/index' export default async function userHandler( req: NextApiRequest, diff --git a/pages/api/booking/index.tsx b/pages/api/booking/index.ts similarity index 100% rename from pages/api/booking/index.tsx rename to pages/api/booking/index.ts diff --git a/pages/api/daysbooked.ics.tsx b/pages/api/daysbooked.ics.ts similarity index 100% rename from pages/api/daysbooked.ics.tsx rename to pages/api/daysbooked.ics.ts diff --git a/pages/api/daysbooked.tsx b/pages/api/daysbooked.ts similarity index 100% rename from pages/api/daysbooked.tsx rename to pages/api/daysbooked.ts diff --git a/pages/booking/[uuid]/bill.tsx b/pages/booking/[uuid]/bill.tsx index 2265e37..f331ae2 100644 --- a/pages/booking/[uuid]/bill.tsx +++ b/pages/booking/[uuid]/bill.tsx @@ -3,6 +3,7 @@ import React, { useEffect, useState } from 'react' import Footer from '../../../components/footer' import Header from '../../../components/header' import Input from '../../../components/wizard/input' +import { BillDocument } from '../../../db/bill' import { BookingDocument } from '../../../db/booking' import { BOOKING_STATUS, MILAGE_RATES } from '../../../db/enums' import { getBookingByUUID } from '../../../db/index' @@ -44,9 +45,9 @@ function getBookingStatus(booking: BookingDocument) { } } -async function cancelBooking(booking: BookingDocument) { - const response = await fetch(`/api/booking/${booking.uuid}`, { - method: 'PATCH', +async function saveBill(booking: BookingDocument, bill: BillDocument) { + const response = await fetch(`/api/booking/${booking.uuid}/bill/`, { + method: 'POST', mode: 'cors', cache: 'no-cache', credentials: 'same-origin', @@ -54,7 +55,7 @@ async function cancelBooking(booking: BookingDocument) { 'Content-Type': 'application/json', }, referrerPolicy: 'no-referrer', - body: JSON.stringify({ status: BOOKING_STATUS.CANCELED }), + body: JSON.stringify(bill), }) return response.json() } @@ -69,122 +70,118 @@ export default function Bill({ const [milageEnd, setMilageEnd] = useState(0) const [rate, setRate] = useState(MILAGE_RATES.EXTERN_UP_TO_200) const milage = - (0 < milageEnd && - 0 < milageStart && - milageStart < milageEnd && - milageEnd - milageStart) || - 0 - const total = milage && rate && milage * rate + (0 < milageStart && milageStart < milageEnd && milageEnd - milageStart) || 0 + const total = (milage && rate && milage * rate) || 0 // in case the props change, update the internal state useEffect(() => setBooking(bookingProp), [bookingProp]) - const onCancelBooking = async () => { - if (!confirm('Soll die Buchung wirklich storniert werden?')) { - return - } - try { - const updatedBooking = await cancelBooking(booking) - setBooking(updatedBooking) - } catch (e) { - alert( - 'Die Buchung konnte nicht storniert werden. Kontaktieren Sie uns bitt per E-Mail!' - ) - } - } - return (

Pfadi Bussle Buchung

-
- Buchungsstatus: {getBookingStatus(booking)} -
-
- Buchungszeitraum:{' '} - {dateFormatFrontend(new Date(booking.startDate))} -{' '} - {dateFormatFrontend(new Date(booking.endDate))} -
-
- Bucher: {booking.booker.name} -
-
- >) => - setMilageStart(Number(e.target.value)) - } - /> - >) => - setMilageEnd(Number(e.target.value)) - } - /> - -
-
- -
- -
- { + event.preventDefault() + saveBill(booking, { + milageStart, + milageEnd, + milage, + total, + rate: MILAGE_RATES[rate], + }) + }} + > +
+ Buchungsstatus: {getBookingStatus(booking)} +
+
+ Buchungszeitraum:{' '} + {dateFormatFrontend(new Date(booking.startDate))} -{' '} + {dateFormatFrontend(new Date(booking.endDate))} +
+
+ Bucher: {booking.booker.name} +
+
+ >) => + setMilageStart(Number(e.target.value)) + } + /> + >) => + setMilageEnd(Number(e.target.value)) + } + /> + +
+
+ +
+ +
+ + + +
-
- -
- + +
+ +