import React, { useEffect, useState } from 'react' import Input from '../../../../components/input' import Select from '../../../../components/select' import { IBooking } from '../../../../db/booking' import { BILL_STATUS, MILAGE_TARIFS } from '../../../../db/enums' import { getMilageMax } from '../../../../db/index' import { daysFormatFrontend } from '../../../../helpers/date' import { log } from '../../../../helpers/log' import { getBillTotal, createBill, patchBill } from '../../../../helpers/bill' import { getBookingStatus } from '../../../../helpers/booking' import { getServerSideBooking } from '../../../../lib/getServerSideProps' import withAuth from '../../../../helpers/withAuth' export const getServerSideProps = async (context) => { const milageMax = await getMilageMax() const serverSideBookingProps = await getServerSideBooking(context) return { props: { ...serverSideBookingProps.props, milageMax, }, } } const milageTarifOptions = Object.values(MILAGE_TARIFS).map((tarif) => { return ( ) }) const billStatusOptions = Object.values(BILL_STATUS).map((status) => { return ( ) }) function getTarifLabel(tarif: MILAGE_TARIFS) { switch (tarif) { case MILAGE_TARIFS.EXTERN: return 'Extern' case MILAGE_TARIFS.INTERN: return 'Intern' case MILAGE_TARIFS.NOCHARGE: return 'Frei von Kosten' 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!!!' } } function BookingBillPage({ booking: bookingProp, milageMax, }: { booking: IBooking milageMax: number }) { const [booking, setBooking] = useState(bookingProp) const [milageStart, setMilageStart] = useState( booking?.bill?.milageStart || milageMax ) const [milageEnd, setMilageEnd] = useState(booking?.bill?.milageEnd) const [tarif, setTarif] = useState( booking?.bill?.tarif || MILAGE_TARIFS.EXTERN ) const [status, setStatus] = useState(booking?.bill?.status) const [additionalCosts, setAdditionalCosts] = useState([]) const [storingInProgress, setStoringInProgress] = useState(false) const [storingError, setStoringError] = useState(null) const milage = (0 < milageStart && milageStart < milageEnd && milageEnd - milageStart) || 0 const total = getBillTotal({ tarif, milage, additionalCosts }) // 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 saveBill = !!booking.bill ? createBill : patchBill const bill = await saveBill(booking.uuid, { milageStart, milageEnd, milage, tarif, status, additionalCosts, }) booking.bill = bill setBooking(booking) } catch (error) { setStoringError('Buchung konnte nicht gespeichert werden!') log.error('Failed to store booking', error) } setStoringInProgress(false) } const onAddAdditionalCost = function ( event: React.MouseEvent ) { event.preventDefault() setAdditionalCosts([...additionalCosts, { name: '', value: 0 }]) } const onRemoveAdditionalCost = function ( event: React.MouseEvent, index: number ) { event.preventDefault() setAdditionalCosts([ ...additionalCosts.slice(0, index), ...additionalCosts.slice(index + 1), ]) } return ( <> {booking && (
Buchungszeitraum:{' '} {daysFormatFrontend(booking.days)}
Bucher: {booking.name}
Buchungsstatus: {getBookingStatus(booking.status)}
>) => setMilageStart(Number(e.target.value)) } /> >) => setMilageEnd(Number(e.target.value)) } />
{additionalCosts.map((_, index) => { return ( <>
{ const newAdditonalCosts = [...additionalCosts] newAdditonalCosts[index] = { value: newAdditonalCosts[index].value, name: event.target.value, } setAdditionalCosts(newAdditonalCosts) }} /> { const newAdditonalCosts = [...additionalCosts] newAdditonalCosts[index] = { name: newAdditonalCosts[index].name, value: Number(event.target.value), } setAdditionalCosts(newAdditonalCosts) }} />
) })}
{storingError && (
{storingError}
)}
)} ) } BookingBillPage.authenticationRequired = true export default withAuth(BookingBillPage)