diff --git a/db/billingRates.ts b/db/billingRates.ts new file mode 100644 index 0000000..c145218 --- /dev/null +++ b/db/billingRates.ts @@ -0,0 +1,5 @@ +export enum BILLING_RATES { + INTERN = 0.24, + EXTERN_UP_TO_200 = 0.45, + EXTERN_OVER_200 = 0.55, +} diff --git a/db/bookingBill.ts b/db/bookingBill.ts new file mode 100644 index 0000000..01f5cb0 --- /dev/null +++ b/db/bookingBill.ts @@ -0,0 +1,79 @@ +import * as mongoose from 'mongoose' +import { BILLING_RATES } from './billingRates' +import { PAYMENT_STATE } from './paymentState' +import { BookingDocument } from './booking' + +export interface AdditionalCosts { + name: string + value: number +} + +export interface BookingBillDocument + extends mongoose.SchemaTimestampsConfig, + mongoose.Document { + booking: BookingDocument + milageStart: number + milageEnd: number + milage?: number + rate: BILLING_RATES + paymentState: PAYMENT_STATE + additionalCosts: AdditionalCosts[] +} + +export interface BookingBillModel extends mongoose.Model {} + +const BookingBillSchema = new mongoose.Schema( + { + booking: { + type: mongoose.Schema.Types.ObjectId, + ref: 'Booking', + required: true, + }, + milageStart: { type: Number, required: true }, + milageEnd: { type: Number, required: true }, + rate: { + type: Number, + enum: Object.values(BILLING_RATES), + default: BILLING_RATES.EXTERN_UP_TO_200, + required: true, + }, + paymentState: { + type: String, + enum: Object.values(PAYMENT_STATE), + default: PAYMENT_STATE.OUTSTANDING, + required: true, + }, + additionalCosts: [ + { + name: { type: String, required: true }, + value: { type: Number, required: true }, + }, + ], + }, + { timestamps: true, collation: { locale: 'de', strength: 1 } } +) + +BookingBillSchema.virtual('milage').get(function () { + if (!this.milageStart || !this.milageEnd) { + return null + } + return this.milageEnd - this.milageStart +}) + +BookingBillSchema.virtual('invoiceAmount').get(function () { + if (!this.milageStart || !this.milageEnd) { + return null + } + const milageCosts = this.milage * this.rate + const additionalCostSum = this.additionalConsts.reduce( + (memo: number, { value }) => memo + value, + 0 + ) + return milageCosts + additionalCostSum +}) + +export default mongoose.models.BookingBill || + mongoose.model( + 'BookingBill', + BookingBillSchema + ) diff --git a/db/paymentState.ts b/db/paymentState.ts new file mode 100644 index 0000000..f878fe1 --- /dev/null +++ b/db/paymentState.ts @@ -0,0 +1,5 @@ +export enum PAYMENT_STATE { + OUTSTANDING = 'outstanding', + INVOICED = 'invoiced', + PAID = 'paid', +}