import OB, {AnyBoolean} from "@onebro/oba-common"; import OBACore from "@onebro/oba-core"; import {Schema} from "mongoose"; import {ModelFactoryConfig,ModelFactory, getSpecialTypeSchemaDef} from "@onebro/oba-mongoose"; import {Order,OrderSignature,DocStatuses} from "../00-model-types"; import { finDocItemRefs,finDocItemAsPropSchema } from "./06-fin-doc-item"; import { vendorItemRefs,vendorItemAsPropSchema } from "./04-vendor-item"; import { userAcctAsPropSchema } from "./01-user-acct"; import { serviceRequestAsPropSchema, serviceRequestRefs } from "./03-service-req"; import { vendorAsPropSchema } from "./04-vendor"; export type OrderFactoryConfig = ModelFactoryConfig; export const orderAsPropSchema = (arr?:AnyBoolean) => { switch(true){ case !!arr:{ return { type:[Schema.Types.ObjectId], ref:"Order", default:[] as Order["instance"][], get:(p:Order["instance"][]) => p.map(o => o.preview), }; } default:{ return { type:Schema.Types.ObjectId, ref:"Order", get:(p:Order["instance"]) => p?p.preview:null, }; } } }; export const orderSchemaDef:OrderFactoryConfig["definition"] = { qid:{type:String,default:() => "ob_" + OB.longId().replace(/-/g,""),immutable:true}, type:{type:String,enum:["dc","wnf"]}, addr:{type:String}, reservation:{type:Object,default:{}}, customer:userAcctAsPropSchema(), vendor:vendorAsPropSchema(), items:vendorItemAsPropSchema(1), req:serviceRequestAsPropSchema(), bags:{type:[Schema.Types.Mixed],default:[]}, tickets:{type:[String],default:[]}, mileage:{type:Number}, tip:{type:Number}, disc:{type:Number}, rates:{type:Object,default:{}}, pmt:finDocItemAsPropSchema(0), score:{type:Number,default:0}, }; export const orderRefs_:OrderFactoryConfig["refs"] = [ {path:"items",model:"OrderItem",populate:vendorItemRefs}, {path:"pmt",model:"FinancialRecord",populate:finDocItemRefs}, {path:"req",model:"ServiceRequest",populate:serviceRequestRefs}, ]; export const orderRefs:OrderFactoryConfig["refs"] = [...orderRefs_]; export const orderVirtuals:OrderFactoryConfig["virtuals"] = { preview:{ get:function(){ const s = this as Order["instance"]; const p = {} as Order["preview"]; p.id = s.id; p.stat = s.stat; p.customer = s.customer as any; p.tickets = s.tickets; p.itemCt = s.items.length; p.amt = s.getAmt(); p.bags = s.bags.map(o => o.toString()); p.req = s.req as any; p.published = s.created; return p; } } }; export const orderMethods:OrderFactoryConfig["methods"] = { getAmt:function(){ const s = this as Order["instance"]; const {mileage = 0,tip = 0,disc = 0} = s; const {starchRate = 0,serviceRate = 0,transitRate = 0,taxRate = 0} = s.rates||{}; let laundry = 0,starch = 0; for(let i = 0,l = s.items.length;i o.preview); j.reservation = s.reservation; j.req = s.req as any; j.pmt = s.pmt as any; j.rates = s.rates; j.mileage = s.mileage||0; j.disc = s.disc||0; j.tip = s.tip||0; //j.amt = s.getAmt(); j.bags = s.bags.map(o => o.toString()); j.tickets = s.tickets.map(o => o.toString()); j.itemCt = s.items.length; j.published = s.created; return j; } }; export const OrderFactoryConfig:OrderFactoryConfig = { modelName:"Order", businessName:"order", collectionName:"cctx_playground_orders", statuses:DocStatuses, definition:orderSchemaDef, opts:{}, refs:orderRefs, virtuals:orderVirtuals, methods:orderMethods, }; export class OrderFactory extends ModelFactory {constructor(api:OBACore){super(api as any,OrderFactoryConfig);}}