Files
pfadi-bussle/db/bill.ts
2020-10-07 22:46:13 +02:00

101 lines
2.4 KiB
TypeScript

import * as mongoose from 'mongoose'
import { BILL_STATUS, MILAGE_RATES, getMilageRateValue } from './enums'
import { BookingDocument } from './booking'
export interface AdditionalCosts {
name: string
value: number
}
export interface BillDocument
extends mongoose.SchemaTimestampsConfig,
mongoose.Document {
booking: BookingDocument
milageStart: number
milageEnd: number
milage?: number
rate: MILAGE_RATES
status: BILL_STATUS
additionalCosts: AdditionalCosts[]
}
export interface BillModel extends mongoose.Model<BillDocument> {}
const BillSchema = new mongoose.Schema<BillDocument>(
{
booking: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Booking',
unique: true,
required: true,
},
milageStart: {
type: Number,
required: true,
validate: {
validator: function (v: number) {
const bill = this as BillDocument
return v <= bill.milageEnd
},
message: (props) => `${props.value} is bigger than milageEnd!`,
},
},
milageEnd: {
type: Number,
required: true,
validate: {
validator: function (v: number) {
const bill = this as BillDocument
return v >= bill.milageStart
},
message: (props) => `${props.value} is smaller than milageStart!`,
},
},
rate: {
type: String,
enum: Object.values(MILAGE_RATES),
default: MILAGE_RATES.EXTERN_LTE_200,
required: true,
},
additionalCosts: [
{
name: { type: String, required: true },
value: { type: Number, required: true },
},
],
status: {
type: String,
enum: Object.values(BILL_STATUS),
default: BILL_STATUS.UNINVOICED,
},
},
{
timestamps: true,
toJSON: { virtuals: true, getters: true },
toObject: { virtuals: true, getters: true },
}
)
BillSchema.virtual('milage').get(function () {
const bill = this as BillDocument
return bill.milageEnd - bill.milageStart
})
BillSchema.virtual('total').get(function () {
const bill = this as BillDocument
const milageCosts =
Math.round(bill.milage * getMilageRateValue(bill.rate) * 100) / 100
const additionalCostSum = bill.additionalCosts
.map(({ value }) => value)
.reduce((acc, value) => acc + value, 0)
return milageCosts + additionalCostSum
})
export default <BillModel>mongoose.models.Bill ||
mongoose.model<BillDocument, BillModel>('Bill', BillSchema)