@ironcode/vas-lib 3.0.0-alpha.6 → 3.0.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/lib/model/estimate-control/estimate-item.model.js +1 -1
- package/cjs/lib/model/estimate-control/estimate-item.model.js.map +1 -1
- package/cjs/lib/model/estimate-control/estimate.model.d.ts +2 -1
- package/cjs/lib/model/estimate-control/estimate.model.d.ts.map +1 -1
- package/cjs/lib/model/estimate-control/estimate.model.js +12 -12
- package/cjs/lib/model/estimate-control/estimate.model.js.map +1 -1
- package/fesm2022/ironcode-vas-lib.mjs +13 -13
- package/fesm2022/ironcode-vas-lib.mjs.map +1 -1
- package/lib/model/estimate-control/estimate.model.d.ts +2 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"estimate-item.model.js","sourceRoot":"","sources":["../../../../../../projects/vas-lib/src/lib/model/estimate-control/estimate-item.model.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"estimate-item.model.js","sourceRoot":"","sources":["../../../../../../projects/vas-lib/src/lib/model/estimate-control/estimate-item.model.ts"],"names":[],"mappings":"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","sourcesContent":["import { Big } from 'big.js';\nimport { EstimateItemDto } from './estimate-item.dto';\nimport { v4 as uuid } from 'uuid';\nimport { EstimateCostCategory, EstimateWorkCategory } from './estimate.types';\n\nconst b = (value: string | number | Big = '0') => {\n try {\n if (typeof value === 'string') {\n return new Big(value.replace(/[^\\d^.]/g, ''));\n }\n return new Big(value);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n console.error(`failed to construct Big from value '${value}'`);\n return new Big('0');\n }\n};\n\nexport class EstimateItemModel {\n\n constructor(\n public id: string,\n public description: string,\n public type: string,\n public quantity: number,\n public quantityAdjusted: number,\n public units: number,\n public unitsAdjusted: number,\n public price: string,\n public priceAdjusted: string,\n public workCategory: EstimateWorkCategory,\n public costCategory: EstimateCostCategory,\n public comment: string\n ) {\n }\n\n getTotalUnits(adjusted = false): string {\n return adjusted ?\n b(this.quantityAdjusted || '0').mul(this.unitsAdjusted || '0').toFixed(2) :\n b(this.quantity || '0').mul(this.units || '0').toFixed(2);\n }\n\n getLineValue(\n labourRate = '1',\n timeBasis = '1',\n adjusted = false\n ): string {\n const cat: EstimateCostCategory = this.costCategory || 'none';\n\n if (this.workCategory === 'removed') {\n return '0';\n }\n\n const units = (adjusted ? this.unitsAdjusted : this.units) || 0;\n const quantity = (adjusted ? this.quantityAdjusted : this.quantity) || 0;\n const price = (adjusted ? this.priceAdjusted : this.price) || '';\n\n try {\n switch (cat) {\n case 'labour': {\n return price != '' ?\n price :\n b(quantity || '0')\n .mul(units || '0')\n .mul(labourRate || '0')\n .div(timeBasis)\n .toFixed(2);\n }\n case 'pm': {\n return b(price || '0')\n .mul(quantity || '0')\n .toFixed(2);\n }\n case 'parts': {\n return b(price || '0')\n .mul(quantity || '0')\n .toFixed(2);\n }\n case 'specialist': {\n return b(price || '0')\n .mul(quantity || '0')\n .toFixed(2);\n }\n default: {\n return '0';\n }\n }\n } catch (e) {\n console.warn(e);\n }\n return '0';\n }\n\n toDto(): EstimateItemDto {\n return {\n id: this.id,\n description: this.description,\n type: this.type,\n quantity: this.quantity,\n quantityAdjusted: this.quantityAdjusted,\n units: this.units,\n unitsAdjusted: this.unitsAdjusted,\n price: this.price,\n priceAdjusted: this.priceAdjusted,\n workCategory: this.workCategory,\n costCategory: this.costCategory,\n comment: this.comment\n };\n }\n\n static create(): EstimateItemModel {\n return new EstimateItemModel(\n uuid(),\n '',\n '',\n 1,\n 1,\n 0,\n 0,\n '',\n '',\n 'none',\n 'none',\n ''\n );\n }\n\n static fromDto(dto: Partial<EstimateItemDto>): EstimateItemModel {\n return new EstimateItemModel(\n dto.id || uuid(),\n dto.description || '',\n dto.type || '',\n dto.quantity || 0,\n dto.quantityAdjusted || 0,\n dto.units || 0,\n dto.unitsAdjusted || 0,\n dto.price || '',\n dto.priceAdjusted || '',\n dto.workCategory || 'none',\n dto.costCategory || 'none',\n dto.comment || ''\n );\n }\n\n static equal(\n a: EstimateItemDto | undefined,\n b: EstimateItemDto | undefined\n ): boolean {\n return (\n a?.id === b?.id &&\n a?.description === b?.description &&\n a?.type === b?.type &&\n a?.quantity === b?.quantity &&\n a?.quantityAdjusted === b?.quantityAdjusted &&\n a?.units === b?.units &&\n a?.unitsAdjusted === b?.unitsAdjusted &&\n a?.price === b?.price &&\n a?.priceAdjusted === b?.priceAdjusted &&\n a?.workCategory === b?.workCategory &&\n a?.costCategory === b?.costCategory &&\n a?.comment === b?.comment\n );\n }\n\n}\n"]}
|
|
@@ -27,8 +27,9 @@ export declare class EstimateModel {
|
|
|
27
27
|
summaryNet: EstimateSummaryDto;
|
|
28
28
|
summary: EstimateSummaryDto;
|
|
29
29
|
summaryAdjusted: EstimateSummaryDto;
|
|
30
|
+
get timeBasisSafe(): string;
|
|
30
31
|
static create(source?: EstimateSource): EstimateModel;
|
|
31
|
-
static fromDto(dto: Partial<EstimateDto>):
|
|
32
|
+
static fromDto<T extends EstimateModel>(this: new () => T, dto: Partial<EstimateDto>): T;
|
|
32
33
|
addItem(modelOrDto: EstimateItemModel | Partial<EstimateItemDto>, opts?: {
|
|
33
34
|
calculate?: boolean;
|
|
34
35
|
}): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"estimate.model.d.ts","sourceRoot":"","sources":["../../../../../../projects/vas-lib/src/lib/model/estimate-control/estimate.model.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAuB,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,CAAC,OAAO,MAAM,oBAAoB,GAAG,YAAY,GAAG,qBAAqB,GAAG,OAAO,CAAC;AAE1F,MAAM,CAAC,OAAO,MAAM,cAAc,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAehG,qBAAa,aAAa;IAEjB,EAAE,EAAE,MAAM,CAAU;IACpB,MAAM,EAAE,cAAc,CAAY;IAClC,KAAK,EAAE,MAAM,CAAM;IACnB,OAAO,EAAE,MAAM,CAAM;IACrB,SAAS,EAAE,MAAM,CAA0B;IAC3C,OAAO,EAAE,MAAM,CAAK;IACpB,GAAG,EAAE,MAAM,CAAU;IACrB,GAAG,EAAE,MAAM,CAAU;IACrB,KAAK,EAAE,MAAM,CAAU;IACvB,UAAU,EAAE,MAAM,CAAO;IACzB,OAAO,EAAE,MAAM,CAAU;IACzB,UAAU,EAAE,MAAM,CAAU;IAC5B,SAAS,EAAE,MAAM,CAAU;IAC3B,WAAW,EAAE,MAAM,CAAU;IAC7B,YAAY,EAAE,oBAAoB,CAAW;IAC7C,aAAa,EAAE,MAAM,CAAU;IAC/B,aAAa,EAAE,MAAM,CAAU;IAC/B,SAAS,EAAE,MAAM,CAAO;IACxB,QAAQ,UAAS;IACjB,KAAK,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAM;IACrC,UAAU,EAAE,kBAAkB,CAanC;IACK,OAAO,EAAE,kBAAkB,CAahC;IACK,eAAe,EAAE,kBAAkB,CAaxC;IAEF,MAAM,CAAC,MAAM,CAAC,MAAM,GAAE,cAAyB,GAAG,aAAa;IAM/D,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"estimate.model.d.ts","sourceRoot":"","sources":["../../../../../../projects/vas-lib/src/lib/model/estimate-control/estimate.model.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAuB,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,CAAC,OAAO,MAAM,oBAAoB,GAAG,YAAY,GAAG,qBAAqB,GAAG,OAAO,CAAC;AAE1F,MAAM,CAAC,OAAO,MAAM,cAAc,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAehG,qBAAa,aAAa;IAEjB,EAAE,EAAE,MAAM,CAAU;IACpB,MAAM,EAAE,cAAc,CAAY;IAClC,KAAK,EAAE,MAAM,CAAM;IACnB,OAAO,EAAE,MAAM,CAAM;IACrB,SAAS,EAAE,MAAM,CAA0B;IAC3C,OAAO,EAAE,MAAM,CAAK;IACpB,GAAG,EAAE,MAAM,CAAU;IACrB,GAAG,EAAE,MAAM,CAAU;IACrB,KAAK,EAAE,MAAM,CAAU;IACvB,UAAU,EAAE,MAAM,CAAO;IACzB,OAAO,EAAE,MAAM,CAAU;IACzB,UAAU,EAAE,MAAM,CAAU;IAC5B,SAAS,EAAE,MAAM,CAAU;IAC3B,WAAW,EAAE,MAAM,CAAU;IAC7B,YAAY,EAAE,oBAAoB,CAAW;IAC7C,aAAa,EAAE,MAAM,CAAU;IAC/B,aAAa,EAAE,MAAM,CAAU;IAC/B,SAAS,EAAE,MAAM,CAAO;IACxB,QAAQ,UAAS;IACjB,KAAK,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAM;IACrC,UAAU,EAAE,kBAAkB,CAanC;IACK,OAAO,EAAE,kBAAkB,CAahC;IACK,eAAe,EAAE,kBAAkB,CAaxC;IAEF,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,MAAM,CAAC,MAAM,CAAC,MAAM,GAAE,cAAyB,GAAG,aAAa;IAM/D,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,aAAa,EACpC,IAAI,EAAE,UAAU,CAAC,EACjB,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,GACxB,CAAC;IAUJ,OAAO,CACL,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,EACxD,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE;IAWhC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE;IAOxE,SAAS,IAAI,IAAI;IAsCjB;;;;;;OAMG;IACH,aAAa,CAAC,QAAQ,UAAQ,GAAG,kBAAkB;IAwCnD;;;OAGG;IACH,UAAU,CACR,UAAU,EAAE,WAAW,CAAC,SAAS,CAAC,EAClC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,oBAAoB,EAClC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,OAAO,GAChB,WAAW,CAAC,SAAS,CAAC;IAgDzB,KAAK,IAAI,WAAW;IA2BpB,aAAa,CAAC,QAAQ,UAAQ,GAAG,MAAM;CAoBxC"}
|
|
@@ -83,6 +83,9 @@ class EstimateModel {
|
|
|
83
83
|
labourRate: '0.00',
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
|
+
get timeBasisSafe() {
|
|
87
|
+
return (this.timeBasis || '1') === '0' ? '1' : this.timeBasis;
|
|
88
|
+
}
|
|
86
89
|
static create(source = 'manual') {
|
|
87
90
|
const model = new EstimateModel();
|
|
88
91
|
model.source = source;
|
|
@@ -90,7 +93,7 @@ class EstimateModel {
|
|
|
90
93
|
}
|
|
91
94
|
static fromDto(dto) {
|
|
92
95
|
var _a;
|
|
93
|
-
const model = new
|
|
96
|
+
const model = new this();
|
|
94
97
|
Object.assign(model, Object.assign(Object.assign({}, dto), { items: (_a = dto.items) === null || _a === void 0 ? void 0 : _a.map(item => estimate_item_model_1.EstimateItemModel.fromDto(item)) }));
|
|
95
98
|
model.calculate();
|
|
96
99
|
return model;
|
|
@@ -110,9 +113,6 @@ class EstimateModel {
|
|
|
110
113
|
}
|
|
111
114
|
}
|
|
112
115
|
calculate() {
|
|
113
|
-
if (this.source === 'gtmotive') {
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
116
|
this.summaryNet = this.getSummaryNet(false);
|
|
117
117
|
if (this.adjusted) {
|
|
118
118
|
this.summaryAdjusted = this.getSummary(this.summaryNet, this.sundryRate, this.sundryMax, this.sundryFixed, this.sundryMethod, this.partsDiscount, this.paintDiscount, this.adjusted);
|
|
@@ -138,7 +138,7 @@ class EstimateModel {
|
|
|
138
138
|
getSummaryNet(adjusted = false) {
|
|
139
139
|
const summary = this.items.reduce((map, item) => {
|
|
140
140
|
map[item.costCategory] = b(map[item.costCategory] || '0')
|
|
141
|
-
.add(item.getLineValue(this.labourRate, this.
|
|
141
|
+
.add(item.getLineValue(this.labourRate, this.timeBasisSafe, adjusted))
|
|
142
142
|
.toFixed(2);
|
|
143
143
|
return map;
|
|
144
144
|
}, {
|
|
@@ -159,12 +159,12 @@ class EstimateModel {
|
|
|
159
159
|
const mechHours = this.items
|
|
160
160
|
.filter(item => item.workCategory !== 'paint')
|
|
161
161
|
.reduce((h, item) => h.add(b(item.getTotalUnits(adjusted))), b())
|
|
162
|
-
.div(this.
|
|
162
|
+
.div(this.timeBasisSafe || '1')
|
|
163
163
|
.round(2);
|
|
164
164
|
const paintHours = this.items
|
|
165
165
|
.filter(item => item.workCategory === 'paint')
|
|
166
166
|
.reduce((h, item) => h.add(b(item.getTotalUnits(adjusted))), b())
|
|
167
|
-
.div(this.
|
|
167
|
+
.div(this.timeBasisSafe || '1')
|
|
168
168
|
.round(1);
|
|
169
169
|
const mechCost = mechHours.mul(this.labourRate || '0');
|
|
170
170
|
const paintCost = paintHours.mul(this.labourRate || '0');
|
|
@@ -185,7 +185,7 @@ class EstimateModel {
|
|
|
185
185
|
}
|
|
186
186
|
else if (sundryMethod === 'percentage-with-max') {
|
|
187
187
|
partsSundry = b(summaryNet.parts).mul(sundryRate || '1').toFixed(2);
|
|
188
|
-
partsSundry = Math.min(parseFloat(sundryMax || '0'), parseFloat(partsSundry)).toFixed();
|
|
188
|
+
partsSundry = Math.min(parseFloat(sundryMax || '0'), parseFloat(partsSundry)).toFixed(2);
|
|
189
189
|
}
|
|
190
190
|
else if (sundryMethod === 'fixed') {
|
|
191
191
|
partsSundry = b(sundryFixed).toFixed(2);
|
|
@@ -236,7 +236,7 @@ class EstimateModel {
|
|
|
236
236
|
sundryMethod: this.sundryMethod,
|
|
237
237
|
partsDiscount: this.partsDiscount,
|
|
238
238
|
paintDiscount: this.paintDiscount,
|
|
239
|
-
timeBasis: this.
|
|
239
|
+
timeBasis: this.timeBasisSafe,
|
|
240
240
|
items: this.items.map(i => i.toDto()),
|
|
241
241
|
adjusted: this.adjusted,
|
|
242
242
|
summary: this.summary,
|
|
@@ -249,19 +249,19 @@ class EstimateModel {
|
|
|
249
249
|
.filter(item => item.workCategory !== 'paint')
|
|
250
250
|
.reduce((h, item) => h.add(b(item.getTotalUnits(adjusted))), b())
|
|
251
251
|
.round(2)
|
|
252
|
-
.div(this.
|
|
252
|
+
.div(this.timeBasisSafe);
|
|
253
253
|
const paintHours = this.items
|
|
254
254
|
.filter(item => item.workCategory === 'paint')
|
|
255
255
|
.reduce((h, item) => h.add(b(item.getTotalUnits(adjusted))), b())
|
|
256
256
|
.round(1)
|
|
257
|
-
.div(this.
|
|
257
|
+
.div(this.timeBasisSafe);
|
|
258
258
|
return mechUnitsHours.add(paintHours).toFixed(2);
|
|
259
259
|
}
|
|
260
260
|
const units = this.items
|
|
261
261
|
.filter(i => i.costCategory === 'labour')
|
|
262
262
|
.reduce((p, c) => p.add(b(c.getTotalUnits(adjusted))), b('0'))
|
|
263
263
|
.toFixed(2);
|
|
264
|
-
return b(units).div(this.
|
|
264
|
+
return b(units).div(this.timeBasisSafe).toFixed(2);
|
|
265
265
|
}
|
|
266
266
|
}
|
|
267
267
|
exports.EstimateModel = EstimateModel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"estimate.model.js","sourceRoot":"","sources":["../../../../../../projects/vas-lib/src/lib/model/estimate-control/estimate.model.ts"],"names":[],"mappings":"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","sourcesContent":["import { Big } from 'big.js';\nimport moment from 'moment';\nimport { v4 as uuid } from 'uuid';\nimport { EstimateItemModel } from './estimate-item.model';\nimport { CostCategorySummary, EstimateDto, EstimateSummaryDto } from './estimate.dto';\nimport { EstimateItemDto } from './estimate-item.dto';\n\nexport declare type EstimateSundryMethod = 'percentage' | 'percentage-with-max' | 'fixed';\n\nexport declare type EstimateSource = 'audatex' | 'glassmatix' | 'gtmotive' | 'manual' | 'ibody';\n\nconst b = (value: string | number | Big = '0') => {\n try {\n if (typeof value === 'string') {\n return new Big(value.replace(/[^\\d^.]/g, ''));\n }\n return new Big(value);\n } catch (e) {\n console.error(`failed to construct Big from value '${value}'`);\n return new Big('0');\n }\n};\n\n\nexport class EstimateModel {\n\n public id: string = uuid();\n public source: EstimateSource = 'manual';\n public label: string = '';\n public comment: string = '';\n public timestamp: string = moment().toISOString();\n public version: number = 1;\n public net: string = '0.00';\n public vat: string = '0.00';\n public gross: string = '0.00';\n public labourRate: string = '1';\n public vatRate: string = '0.00';\n public sundryRate: string = '0.00';\n public sundryMax: string = '0.00';\n public sundryFixed: string = '0.00';\n public sundryMethod: EstimateSundryMethod = 'fixed';\n public partsDiscount: string = '0.00';\n public paintDiscount: string = '0.00';\n public timeBasis: string = '1';\n public adjusted = false;\n public items: Array<EstimateItemModel> = [];\n public summaryNet: EstimateSummaryDto = {\n labour: '0.00',\n none: '0.00',\n parts: '0.00',\n pm: '0.00',\n pl: '0.00',\n specialist: '0.00',\n other: '0.00',\n gross: '0.00',\n net: '0.00',\n hours: '0.00',\n vat: '0.00',\n labourRate: '0.00',\n };\n public summary: EstimateSummaryDto = {\n labour: '0.00',\n none: '0.00',\n parts: '0.00',\n pm: '0.00',\n pl: '0.00',\n specialist: '0.00',\n other: '0.00',\n gross: '0.00',\n net: '0.00',\n hours: '0.00',\n vat: '0.00',\n labourRate: '0.00',\n };\n public summaryAdjusted: EstimateSummaryDto = {\n labour: '0.00',\n none: '0.00',\n parts: '0.00',\n pm: '0.00',\n pl: '0.00',\n specialist: '0.00',\n other: '0.00',\n gross: '0.00',\n net: '0.00',\n hours: '0.00',\n vat: '0.00',\n labourRate: '0.00',\n };\n\n static create(source: EstimateSource = 'manual'): EstimateModel {\n const model = new EstimateModel();\n model.source = source;\n return model;\n }\n\n static fromDto(dto: Partial<EstimateDto>): EstimateModel {\n const model = new EstimateModel();\n Object.assign(model, {\n ...dto,\n items: dto.items?.map(item => EstimateItemModel.fromDto(item)),\n });\n model.calculate();\n return model;\n }\n\n addItem(\n modelOrDto: EstimateItemModel | Partial<EstimateItemDto>,\n opts?: { calculate?: boolean }\n ) {\n this.items.push(modelOrDto instanceof EstimateItemModel ?\n modelOrDto :\n EstimateItemModel.fromDto(modelOrDto)\n );\n if (!opts || (opts && opts.calculate)) {\n this.calculate();\n }\n }\n\n addItems(items: Array<EstimateItemModel>, opts?: { calculate?: boolean }) {\n this.items = this.items.concat(items);\n if (!opts || (opts && opts.calculate)) {\n this.calculate();\n }\n }\n\n calculate(): void {\n\n if (this.source === 'gtmotive') {\n return;\n }\n\n this.summaryNet = this.getSummaryNet(false);\n\n if (this.adjusted) {\n this.summaryAdjusted = this.getSummary(\n this.summaryNet,\n this.sundryRate,\n this.sundryMax,\n this.sundryFixed,\n this.sundryMethod,\n this.partsDiscount,\n this.paintDiscount,\n this.adjusted\n );\n }\n this.summary = this.getSummary(\n this.summaryNet,\n this.sundryRate,\n this.sundryMax,\n this.sundryFixed,\n this.sundryMethod,\n this.partsDiscount,\n this.paintDiscount,\n this.adjusted\n );\n\n this.net = b(0)\n .add(this.summary.labour)\n .add(this.summary.none)\n .add(this.summary.parts)\n .add(this.summary.pm)\n .add(this.summary.specialist)\n .toFixed(2);\n this.vat = b(this.net || '0').mul(this.vatRate || '0').toFixed(2);\n this.gross = b(this.net || '0').add(this.vat || '0').toFixed(2);\n }\n\n /**\n * Returns the net summary (before sundries and discounts) of the estimate.\n * By summary, we mean grouping the costs by cost category.\n *\n * @param adjusted if the values should be calculated using the original or\n * adjusted values\n */\n getSummaryNet(adjusted = false): EstimateSummaryDto {\n const summary = this.items.reduce((map, item) => {\n map[item.costCategory] = b(map[item.costCategory] || '0')\n .add(item.getLineValue(this.labourRate, this.timeBasis, adjusted))\n .toFixed(2);\n return map;\n }, {\n labour: '0.00',\n none: '0.00',\n parts: '0.00',\n pm: '0.00',\n pl: '0.00',\n specialist: '0.00',\n other: '0.00',\n net: '0.00',\n vat: '0.00',\n gross: '0.00',\n hours: '0.00',\n labourRate: '0',\n } as EstimateSummaryDto);\n\n if (this.source === 'audatex') {\n const mechHours = this.items\n .filter(item => item.workCategory !== 'paint')\n .reduce((h, item) => h.add(b(item.getTotalUnits(adjusted))), b())\n .div(this.timeBasis || '1')\n .round(2);\n const paintHours = this.items\n .filter(item => item.workCategory === 'paint')\n .reduce((h, item) => h.add(b(item.getTotalUnits(adjusted))), b())\n .div(this.timeBasis || '1')\n .round(1);\n\n const mechCost = mechHours.mul(this.labourRate || '0');\n const paintCost = paintHours.mul(this.labourRate || '0');\n summary.labour = mechCost.add(paintCost).toFixed(2);\n }\n return summary;\n }\n\n /**\n * Applies the sundry and discount values to the net summary.\n\n */\n getSummary(\n summaryNet: EstimateDto['summary'],\n sundryRate: string,\n sundryMax: string,\n sundryFixed: string,\n sundryMethod: EstimateSundryMethod,\n partsDiscount: string,\n paintDiscount: string,\n adjusted: boolean\n ): EstimateDto['summary'] {\n const partsDisc = b('1').minus(partsDiscount || '0');\n const paintDisc = b('1').minus(paintDiscount || '0');\n\n let partsSundry = '0.00';\n\n if (sundryMethod === 'percentage') {\n partsSundry = b(summaryNet.parts).mul(sundryRate || '1').toFixed(2);\n } else if (sundryMethod === 'percentage-with-max') {\n partsSundry = b(summaryNet.parts).mul(sundryRate || '1').toFixed(2);\n partsSundry = Math.min(\n parseFloat(sundryMax || '0'),\n parseFloat(partsSundry)\n ).toFixed();\n } else if (sundryMethod === 'fixed') {\n partsSundry = b(sundryFixed).toFixed(2);\n }\n\n const parts = b(summaryNet.parts).add(partsSundry);\n\n const net = b(0)\n .add(summaryNet.labour)\n .add(summaryNet.none)\n .add(parts)\n .add(summaryNet.pm)\n .add(summaryNet.specialist)\n .toFixed(2);\n const vat = b(net || '0')\n .mul(this.vatRate || '0')\n .toFixed(2);\n const gross = b(net || '0').add(vat || '0').toFixed(2);\n\n return {\n labour: summaryNet.labour,\n none: summaryNet.none,\n parts: b(parts).mul(partsDisc).toFixed(2),\n pm: b(summaryNet.pm).mul(paintDisc).toFixed(2),\n pl: summaryNet.pl,\n specialist: summaryNet.specialist,\n other: summaryNet.other,\n net: net,\n vat: vat,\n gross: gross,\n labourRate: this.labourRate,\n hours: this.getTotalHours(adjusted)\n };\n }\n\n toDto(): EstimateDto {\n return {\n id: this.id,\n source: this.source,\n label: this.label,\n comment: this.comment,\n timestamp: this.timestamp,\n version: this.version,\n net: this.net,\n vat: this.vat,\n gross: this.gross,\n labourRate: this.labourRate,\n vatRate: this.vatRate,\n sundryRate: this.sundryRate,\n sundryMax: this.sundryMax,\n sundryFixed: this.sundryFixed,\n sundryMethod: this.sundryMethod,\n partsDiscount: this.partsDiscount,\n paintDiscount: this.paintDiscount,\n timeBasis: this.timeBasis,\n items: this.items.map(i => i.toDto()),\n adjusted: this.adjusted,\n summary: this.summary,\n summaryAdjusted: this.summaryAdjusted\n };\n }\n\n getTotalHours(adjusted = false): string {\n if (this.source === 'audatex') {\n const mechUnitsHours = this.items\n .filter(item => item.workCategory !== 'paint')\n .reduce((h, item) => h.add(b(item.getTotalUnits(adjusted))), b())\n .round(2)\n .div(this.timeBasis || '1');\n const paintHours = this.items\n .filter(item => item.workCategory === 'paint')\n .reduce((h, item) => h.add(b(item.getTotalUnits(adjusted))), b())\n .round(1)\n .div(this.timeBasis || '1');\n return mechUnitsHours.add(paintHours).toFixed(2);\n }\n const units = this.items\n .filter(i => i.costCategory === 'labour')\n .reduce((p, c) => p.add(b(c.getTotalUnits(adjusted))), b('0'))\n .toFixed(2);\n return b(units).div(this.timeBasis || '1').toFixed(2);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"estimate.model.js","sourceRoot":"","sources":["../../../../../../projects/vas-lib/src/lib/model/estimate-control/estimate.model.ts"],"names":[],"mappings":"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","sourcesContent":["import { Big } from 'big.js';\nimport moment from 'moment';\nimport { v4 as uuid } from 'uuid';\nimport { EstimateItemModel } from './estimate-item.model';\nimport { CostCategorySummary, EstimateDto, EstimateSummaryDto } from './estimate.dto';\nimport { EstimateItemDto } from './estimate-item.dto';\n\nexport declare type EstimateSundryMethod = 'percentage' | 'percentage-with-max' | 'fixed';\n\nexport declare type EstimateSource = 'audatex' | 'glassmatix' | 'gtmotive' | 'manual' | 'ibody';\n\nconst b = (value: string | number | Big = '0') => {\n try {\n if (typeof value === 'string') {\n return new Big(value.replace(/[^\\d^.]/g, ''));\n }\n return new Big(value);\n } catch (e) {\n console.error(`failed to construct Big from value '${value}'`);\n return new Big('0');\n }\n};\n\n\nexport class EstimateModel {\n\n public id: string = uuid();\n public source: EstimateSource = 'manual';\n public label: string = '';\n public comment: string = '';\n public timestamp: string = moment().toISOString();\n public version: number = 1;\n public net: string = '0.00';\n public vat: string = '0.00';\n public gross: string = '0.00';\n public labourRate: string = '1';\n public vatRate: string = '0.00';\n public sundryRate: string = '0.00';\n public sundryMax: string = '0.00';\n public sundryFixed: string = '0.00';\n public sundryMethod: EstimateSundryMethod = 'fixed';\n public partsDiscount: string = '0.00';\n public paintDiscount: string = '0.00';\n public timeBasis: string = '1';\n public adjusted = false;\n public items: Array<EstimateItemModel> = [];\n public summaryNet: EstimateSummaryDto = {\n labour: '0.00',\n none: '0.00',\n parts: '0.00',\n pm: '0.00',\n pl: '0.00',\n specialist: '0.00',\n other: '0.00',\n gross: '0.00',\n net: '0.00',\n hours: '0.00',\n vat: '0.00',\n labourRate: '0.00',\n };\n public summary: EstimateSummaryDto = {\n labour: '0.00',\n none: '0.00',\n parts: '0.00',\n pm: '0.00',\n pl: '0.00',\n specialist: '0.00',\n other: '0.00',\n gross: '0.00',\n net: '0.00',\n hours: '0.00',\n vat: '0.00',\n labourRate: '0.00',\n };\n public summaryAdjusted: EstimateSummaryDto = {\n labour: '0.00',\n none: '0.00',\n parts: '0.00',\n pm: '0.00',\n pl: '0.00',\n specialist: '0.00',\n other: '0.00',\n gross: '0.00',\n net: '0.00',\n hours: '0.00',\n vat: '0.00',\n labourRate: '0.00',\n };\n\n get timeBasisSafe(): string {\n return (this.timeBasis || '1') === '0' ? '1' : this.timeBasis;\n }\n\n static create(source: EstimateSource = 'manual'): EstimateModel {\n const model = new EstimateModel();\n model.source = source;\n return model;\n }\n\n static fromDto<T extends EstimateModel>(\n this: new () => T,\n dto: Partial<EstimateDto>\n ): T {\n const model = new this();\n Object.assign(model, {\n ...dto,\n items: dto.items?.map(item => EstimateItemModel.fromDto(item)),\n });\n model.calculate();\n return model;\n }\n\n addItem(\n modelOrDto: EstimateItemModel | Partial<EstimateItemDto>,\n opts?: { calculate?: boolean }\n ) {\n this.items.push(modelOrDto instanceof EstimateItemModel ?\n modelOrDto :\n EstimateItemModel.fromDto(modelOrDto)\n );\n if (!opts || (opts && opts.calculate)) {\n this.calculate();\n }\n }\n\n addItems(items: Array<EstimateItemModel>, opts?: { calculate?: boolean }) {\n this.items = this.items.concat(items);\n if (!opts || (opts && opts.calculate)) {\n this.calculate();\n }\n }\n\n calculate(): void {\n\n this.summaryNet = this.getSummaryNet(false);\n\n if (this.adjusted) {\n this.summaryAdjusted = this.getSummary(\n this.summaryNet,\n this.sundryRate,\n this.sundryMax,\n this.sundryFixed,\n this.sundryMethod,\n this.partsDiscount,\n this.paintDiscount,\n this.adjusted\n );\n }\n this.summary = this.getSummary(\n this.summaryNet,\n this.sundryRate,\n this.sundryMax,\n this.sundryFixed,\n this.sundryMethod,\n this.partsDiscount,\n this.paintDiscount,\n this.adjusted\n );\n\n this.net = b(0)\n .add(this.summary.labour)\n .add(this.summary.none)\n .add(this.summary.parts)\n .add(this.summary.pm)\n .add(this.summary.specialist)\n .toFixed(2);\n this.vat = b(this.net || '0').mul(this.vatRate || '0').toFixed(2);\n this.gross = b(this.net || '0').add(this.vat || '0').toFixed(2);\n }\n\n /**\n * Returns the net summary (before sundries and discounts) of the estimate.\n * By summary, we mean grouping the costs by cost category.\n *\n * @param adjusted if the values should be calculated using the original or\n * adjusted values\n */\n getSummaryNet(adjusted = false): EstimateSummaryDto {\n const summary = this.items.reduce((map, item) => {\n map[item.costCategory] = b(map[item.costCategory] || '0')\n .add(item.getLineValue(this.labourRate, this.timeBasisSafe, adjusted))\n .toFixed(2);\n return map;\n }, {\n labour: '0.00',\n none: '0.00',\n parts: '0.00',\n pm: '0.00',\n pl: '0.00',\n specialist: '0.00',\n other: '0.00',\n net: '0.00',\n vat: '0.00',\n gross: '0.00',\n hours: '0.00',\n labourRate: '0',\n } as EstimateSummaryDto);\n\n if (this.source === 'audatex') {\n const mechHours = this.items\n .filter(item => item.workCategory !== 'paint')\n .reduce((h, item) => h.add(b(item.getTotalUnits(adjusted))), b())\n .div(this.timeBasisSafe || '1')\n .round(2);\n const paintHours = this.items\n .filter(item => item.workCategory === 'paint')\n .reduce((h, item) => h.add(b(item.getTotalUnits(adjusted))), b())\n .div(this.timeBasisSafe || '1')\n .round(1);\n\n const mechCost = mechHours.mul(this.labourRate || '0');\n const paintCost = paintHours.mul(this.labourRate || '0');\n summary.labour = mechCost.add(paintCost).toFixed(2);\n }\n return summary;\n }\n\n /**\n * Applies the sundry and discount values to the net summary.\n\n */\n getSummary(\n summaryNet: EstimateDto['summary'],\n sundryRate: string,\n sundryMax: string,\n sundryFixed: string,\n sundryMethod: EstimateSundryMethod,\n partsDiscount: string,\n paintDiscount: string,\n adjusted: boolean\n ): EstimateDto['summary'] {\n const partsDisc = b('1').minus(partsDiscount || '0');\n const paintDisc = b('1').minus(paintDiscount || '0');\n\n let partsSundry = '0.00';\n\n if (sundryMethod === 'percentage') {\n partsSundry = b(summaryNet.parts).mul(sundryRate || '1').toFixed(2);\n } else if (sundryMethod === 'percentage-with-max') {\n partsSundry = b(summaryNet.parts).mul(sundryRate || '1').toFixed(2);\n partsSundry = Math.min(\n parseFloat(sundryMax || '0'),\n parseFloat(partsSundry)\n ).toFixed(2);\n } else if (sundryMethod === 'fixed') {\n partsSundry = b(sundryFixed).toFixed(2);\n }\n\n const parts = b(summaryNet.parts).add(partsSundry);\n\n const net = b(0)\n .add(summaryNet.labour)\n .add(summaryNet.none)\n .add(parts)\n .add(summaryNet.pm)\n .add(summaryNet.specialist)\n .toFixed(2);\n const vat = b(net || '0')\n .mul(this.vatRate || '0')\n .toFixed(2);\n const gross = b(net || '0').add(vat || '0').toFixed(2);\n\n return {\n labour: summaryNet.labour,\n none: summaryNet.none,\n parts: b(parts).mul(partsDisc).toFixed(2),\n pm: b(summaryNet.pm).mul(paintDisc).toFixed(2),\n pl: summaryNet.pl,\n specialist: summaryNet.specialist,\n other: summaryNet.other,\n net: net,\n vat: vat,\n gross: gross,\n labourRate: this.labourRate,\n hours: this.getTotalHours(adjusted)\n };\n }\n\n toDto(): EstimateDto {\n return {\n id: this.id,\n source: this.source,\n label: this.label,\n comment: this.comment,\n timestamp: this.timestamp,\n version: this.version,\n net: this.net,\n vat: this.vat,\n gross: this.gross,\n labourRate: this.labourRate,\n vatRate: this.vatRate,\n sundryRate: this.sundryRate,\n sundryMax: this.sundryMax,\n sundryFixed: this.sundryFixed,\n sundryMethod: this.sundryMethod,\n partsDiscount: this.partsDiscount,\n paintDiscount: this.paintDiscount,\n timeBasis: this.timeBasisSafe,\n items: this.items.map(i => i.toDto()),\n adjusted: this.adjusted,\n summary: this.summary,\n summaryAdjusted: this.summaryAdjusted\n };\n }\n\n getTotalHours(adjusted = false): string {\n if (this.source === 'audatex') {\n const mechUnitsHours = this.items\n .filter(item => item.workCategory !== 'paint')\n .reduce((h, item) => h.add(b(item.getTotalUnits(adjusted))), b())\n .round(2)\n .div(this.timeBasisSafe);\n const paintHours = this.items\n .filter(item => item.workCategory === 'paint')\n .reduce((h, item) => h.add(b(item.getTotalUnits(adjusted))), b())\n .round(1)\n .div(this.timeBasisSafe);\n return mechUnitsHours.add(paintHours).toFixed(2);\n }\n const units = this.items\n .filter(i => i.costCategory === 'labour')\n .reduce((p, c) => p.add(b(c.getTotalUnits(adjusted))), b('0'))\n .toFixed(2);\n return b(units).div(this.timeBasisSafe).toFixed(2);\n }\n}\n"]}
|
|
@@ -3381,7 +3381,7 @@ class EstimateItemModel {
|
|
|
3381
3381
|
b$2(quantity || '0')
|
|
3382
3382
|
.mul(units || '0')
|
|
3383
3383
|
.mul(labourRate || '0')
|
|
3384
|
-
.div(timeBasis
|
|
3384
|
+
.div(timeBasis)
|
|
3385
3385
|
.toFixed(2);
|
|
3386
3386
|
}
|
|
3387
3387
|
case 'pm': {
|
|
@@ -3522,13 +3522,16 @@ class EstimateModel {
|
|
|
3522
3522
|
vat: '0.00',
|
|
3523
3523
|
labourRate: '0.00',
|
|
3524
3524
|
};
|
|
3525
|
+
get timeBasisSafe() {
|
|
3526
|
+
return (this.timeBasis || '1') === '0' ? '1' : this.timeBasis;
|
|
3527
|
+
}
|
|
3525
3528
|
static create(source = 'manual') {
|
|
3526
3529
|
const model = new EstimateModel();
|
|
3527
3530
|
model.source = source;
|
|
3528
3531
|
return model;
|
|
3529
3532
|
}
|
|
3530
3533
|
static fromDto(dto) {
|
|
3531
|
-
const model = new
|
|
3534
|
+
const model = new this();
|
|
3532
3535
|
Object.assign(model, {
|
|
3533
3536
|
...dto,
|
|
3534
3537
|
items: dto.items?.map(item => EstimateItemModel.fromDto(item)),
|
|
@@ -3551,9 +3554,6 @@ class EstimateModel {
|
|
|
3551
3554
|
}
|
|
3552
3555
|
}
|
|
3553
3556
|
calculate() {
|
|
3554
|
-
if (this.source === 'gtmotive') {
|
|
3555
|
-
return;
|
|
3556
|
-
}
|
|
3557
3557
|
this.summaryNet = this.getSummaryNet(false);
|
|
3558
3558
|
if (this.adjusted) {
|
|
3559
3559
|
this.summaryAdjusted = this.getSummary(this.summaryNet, this.sundryRate, this.sundryMax, this.sundryFixed, this.sundryMethod, this.partsDiscount, this.paintDiscount, this.adjusted);
|
|
@@ -3579,7 +3579,7 @@ class EstimateModel {
|
|
|
3579
3579
|
getSummaryNet(adjusted = false) {
|
|
3580
3580
|
const summary = this.items.reduce((map, item) => {
|
|
3581
3581
|
map[item.costCategory] = b$1(map[item.costCategory] || '0')
|
|
3582
|
-
.add(item.getLineValue(this.labourRate, this.
|
|
3582
|
+
.add(item.getLineValue(this.labourRate, this.timeBasisSafe, adjusted))
|
|
3583
3583
|
.toFixed(2);
|
|
3584
3584
|
return map;
|
|
3585
3585
|
}, {
|
|
@@ -3600,12 +3600,12 @@ class EstimateModel {
|
|
|
3600
3600
|
const mechHours = this.items
|
|
3601
3601
|
.filter(item => item.workCategory !== 'paint')
|
|
3602
3602
|
.reduce((h, item) => h.add(b$1(item.getTotalUnits(adjusted))), b$1())
|
|
3603
|
-
.div(this.
|
|
3603
|
+
.div(this.timeBasisSafe || '1')
|
|
3604
3604
|
.round(2);
|
|
3605
3605
|
const paintHours = this.items
|
|
3606
3606
|
.filter(item => item.workCategory === 'paint')
|
|
3607
3607
|
.reduce((h, item) => h.add(b$1(item.getTotalUnits(adjusted))), b$1())
|
|
3608
|
-
.div(this.
|
|
3608
|
+
.div(this.timeBasisSafe || '1')
|
|
3609
3609
|
.round(1);
|
|
3610
3610
|
const mechCost = mechHours.mul(this.labourRate || '0');
|
|
3611
3611
|
const paintCost = paintHours.mul(this.labourRate || '0');
|
|
@@ -3626,7 +3626,7 @@ class EstimateModel {
|
|
|
3626
3626
|
}
|
|
3627
3627
|
else if (sundryMethod === 'percentage-with-max') {
|
|
3628
3628
|
partsSundry = b$1(summaryNet.parts).mul(sundryRate || '1').toFixed(2);
|
|
3629
|
-
partsSundry = Math.min(parseFloat(sundryMax || '0'), parseFloat(partsSundry)).toFixed();
|
|
3629
|
+
partsSundry = Math.min(parseFloat(sundryMax || '0'), parseFloat(partsSundry)).toFixed(2);
|
|
3630
3630
|
}
|
|
3631
3631
|
else if (sundryMethod === 'fixed') {
|
|
3632
3632
|
partsSundry = b$1(sundryFixed).toFixed(2);
|
|
@@ -3677,7 +3677,7 @@ class EstimateModel {
|
|
|
3677
3677
|
sundryMethod: this.sundryMethod,
|
|
3678
3678
|
partsDiscount: this.partsDiscount,
|
|
3679
3679
|
paintDiscount: this.paintDiscount,
|
|
3680
|
-
timeBasis: this.
|
|
3680
|
+
timeBasis: this.timeBasisSafe,
|
|
3681
3681
|
items: this.items.map(i => i.toDto()),
|
|
3682
3682
|
adjusted: this.adjusted,
|
|
3683
3683
|
summary: this.summary,
|
|
@@ -3690,19 +3690,19 @@ class EstimateModel {
|
|
|
3690
3690
|
.filter(item => item.workCategory !== 'paint')
|
|
3691
3691
|
.reduce((h, item) => h.add(b$1(item.getTotalUnits(adjusted))), b$1())
|
|
3692
3692
|
.round(2)
|
|
3693
|
-
.div(this.
|
|
3693
|
+
.div(this.timeBasisSafe);
|
|
3694
3694
|
const paintHours = this.items
|
|
3695
3695
|
.filter(item => item.workCategory === 'paint')
|
|
3696
3696
|
.reduce((h, item) => h.add(b$1(item.getTotalUnits(adjusted))), b$1())
|
|
3697
3697
|
.round(1)
|
|
3698
|
-
.div(this.
|
|
3698
|
+
.div(this.timeBasisSafe);
|
|
3699
3699
|
return mechUnitsHours.add(paintHours).toFixed(2);
|
|
3700
3700
|
}
|
|
3701
3701
|
const units = this.items
|
|
3702
3702
|
.filter(i => i.costCategory === 'labour')
|
|
3703
3703
|
.reduce((p, c) => p.add(b$1(c.getTotalUnits(adjusted))), b$1('0'))
|
|
3704
3704
|
.toFixed(2);
|
|
3705
|
-
return b$1(units).div(this.
|
|
3705
|
+
return b$1(units).div(this.timeBasisSafe).toFixed(2);
|
|
3706
3706
|
}
|
|
3707
3707
|
}
|
|
3708
3708
|
|