import { GetServerSideProps } from 'next' import React, { useEffect, useState } from 'react' import Footer from '../../../components/footer' import Header from '../../../components/header' import Input from '../../../components/input' import Select from '../../../components/select' import { AdditionalCosts, BillDocument } from '../../../db/bill' import { BookingDocument } from '../../../db/booking' import { BILL_STATUS, MILAGE_RATES, getMilageRateValue, } from '../../../db/enums' import { getBookingByUUID } from '../../../db/index' import { dateFormatFrontend } from '../../../helpers/date' const milageRateOptions = Object.values(MILAGE_RATES).map((rate) => { return ( ) }) const bookingStatusOptions = Object.values(BILL_STATUS).map((status) => { return ( ) }) export const getServerSideProps: GetServerSideProps = async (context) => { const { res, params: { uuid: uuids }, } = context const uuid = Array.isArray(uuids) ? uuids[0] : uuids const booking = await getBookingByUUID(uuid) await booking.populate('booker').populate('bill').execPopulate() if (!booking) { res.statusCode = 404 res.end() return { props: {} } } // TODO: hack, not sure why _id is not serilizable const bookingJSON = JSON.parse(JSON.stringify(booking.toJSON())) return { props: { booking: bookingJSON }, } } function getRateLabel(rate: MILAGE_RATES) { switch (rate) { case MILAGE_RATES.INTERN_LTE_200: return 'Intern bis zu 200km' case MILAGE_RATES.INTERN_201_1000: return 'Intern 201-1.000km' case MILAGE_RATES.INTERN_1001_2000: return 'Intern 1.001-2.000km' case MILAGE_RATES.INTERN_GTE_2001: return 'Intern ab 2.001km' case MILAGE_RATES.EXTERN_LTE_200: return 'Extern bis zu 200km' case MILAGE_RATES.EXTERN_201_1000: return 'Extern 201-1.000km' case MILAGE_RATES.EXTERN_1001_2000: return 'Extern 1.001-2.000km' case MILAGE_RATES.EXTERN_GTE_2001: return 'Extern ab 2.001km' default: return 'Keine' } } function getBillStatusLabel(status: BILL_STATUS) { switch (status) { case BILL_STATUS.UNINVOICED: return 'Nicht gestellt' case BILL_STATUS.INVOICED: return 'Gestellt' case BILL_STATUS.PAID: return 'Bezahlt' default: return 'Unbekannt!!!' } } async function saveBill( booking: BookingDocument, bill: { milageStart: number milageEnd: number milage?: number rate: MILAGE_RATES additionalCosts?: AdditionalCosts[] status: BILL_STATUS } ): Promise { const response = await fetch(`/api/booking/${booking.uuid}/bill/`, { method: booking.bill?._id ? 'PATCH' : 'POST', mode: 'cors', cache: 'no-cache', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', }, referrerPolicy: 'no-referrer', body: JSON.stringify(bill), }) return response.json() } export default function BillPage({ booking: bookingProp, }: { booking: BookingDocument }) { const [booking, setBooking] = useState(bookingProp) const [milageStart, setMilageStart] = useState(booking.bill?.milageStart) const [milageEnd, setMilageEnd] = useState(booking.bill?.milageEnd) const [rate, setRate] = useState( booking.bill?.rate || MILAGE_RATES.EXTERN_LTE_200 ) const [status, setStatus] = useState(booking.bill?.status) const [storingInProgress, setStoringInProgress] = useState(false) const [storingError, setStoringError] = useState(null) const milage = (0 < milageStart && milageStart < milageEnd && milageEnd - milageStart) || 0 const total = Math.round(milage && rate && milage * getMilageRateValue(rate) * 100) / 100 || 0 // in case the props change, update the internal state useEffect(() => setBooking(bookingProp), [bookingProp]) const onSubmit = async (event: React.FormEvent) => { event.preventDefault() setStoringInProgress(true) setStoringError(null) try { const bill = await saveBill(booking, { milageStart, milageEnd, milage, rate, status, }) booking.bill = bill setBooking(booking) } catch (error) { setStoringError(error.toString()) console.error('Failed to store booking', error) } setStoringInProgress(false) } return (

Pfadi Bussle Buchung

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)) } />
{storingError && (
{storingError}
)}
) }