frontend/src/models/Contract.ts

249 lines
6.7 KiB
TypeScript

import { Option } from "common/SearchSelect";
import { GrainOptions, ToGrainOption } from "grain";
import GrainDescriber from "grain/GrainDescriber";
import { cloneDeep } from "lodash";
import { pond } from "protobuf-ts/pond";
import { getGrainUnit, stringToMaterialColour } from "utils";
import { or } from "utils/types";
export class Contract {
public settings: pond.ContractSettings = pond.ContractSettings.create();
public title: string = "Contract";
public colour: string = "";
public unit: string = "";
public label: string = "";
private objKey: string = "";
public static create(pb?: pond.Contract): Contract {
let my = new Contract();
if (pb) {
my.settings = pond.ContractSettings.fromObject(cloneDeep(or(pb.settings, {})));
my.title = pb.name;
my.objKey = pb.key;
my.unit = my.measurementUnit();
my.colour = my.commodityColour();
my.label = my.commodityLabel();
}
return my;
}
private measurementUnit(): string {
if (this.settings.type === pond.ContractType.CONTRACT_TYPE_GRAIN) {
return getGrainUnit() === pond.GrainUnit.GRAIN_UNIT_WEIGHT ? "mT" : "bu";
}
return "";
}
private commodityColour(): string {
if (this.settings.type === pond.ContractType.CONTRACT_TYPE_GRAIN) {
if (this.isCustom()) {
return stringToMaterialColour(this.settings.customCommodity);
} else {
return GrainDescriber(this.settings.commodity).colour;
}
}
return "blue";
}
public commodityLabel(): string {
let label = "";
if (this.settings.type === pond.ContractType.CONTRACT_TYPE_GRAIN) {
if (this.isCustom()) {
label = this.settings.customCommodity;
} else {
label = GrainDescriber(this.settings.commodity).name;
}
}
return label;
}
public static clone(other?: Contract): Contract {
if (other) {
return Contract.create(
pond.Contract.fromObject({
title: other.title,
key: other.objKey,
settings: cloneDeep(other.settings)
})
);
}
return Contract.create();
}
public static any(data: any): Contract {
return Contract.create(pond.Contract.fromObject(cloneDeep(data)));
}
public key(): string {
if (this) {
return this.objKey;
} else {
return "";
}
}
public name(): string {
if (this) {
return this.title;
} else {
return "";
}
}
public objectType(): pond.ObjectType {
return pond.ObjectType.OBJECT_TYPE_CONTRACT;
}
public objectTypeString(): string {
return "Contract";
}
//possibly add another field to the contract for the subtype
public subtype(): string {
return this.settings.customCommodity;
}
//this is for grain transaction to compare if the source type matches
public storage(): pond.BinStorage {
let storage = pond.BinStorage.BIN_STORAGE_SUPPORTED_GRAIN;
if (this.settings.commodity === pond.Grain.GRAIN_CUSTOM) {
storage = pond.BinStorage.BIN_STORAGE_UNSUPPORTED_GRAIN;
}
return storage;
}
public grain(): pond.Grain {
return this.settings.commodity;
}
public customType(): string {
return this.settings.customCommodity;
}
public isCustom(): boolean {
let custom = false;
switch (this.settings.type) {
case pond.ContractType.CONTRACT_TYPE_GRAIN:
return this.settings.commodity === pond.Grain.GRAIN_CUSTOM;
}
return custom;
}
public static customValue(type: pond.ContractType): number {
let v = 0;
switch (type) {
case pond.ContractType.CONTRACT_TYPE_GRAIN:
return pond.Grain.GRAIN_CUSTOM;
}
return v;
}
public static commodityOptionsForType(type: pond.ContractType): Option[] {
let ops: Option[] = [];
if (type === pond.ContractType.CONTRACT_TYPE_GRAIN) {
ops = GrainOptions();
}
return ops;
}
public static typeOptions(): Option[] {
return [
{
label: "Grain",
value: pond.ContractType.CONTRACT_TYPE_GRAIN
}
];
}
public static toTypeOption(type: pond.ContractType): Option {
switch (type) {
case pond.ContractType.CONTRACT_TYPE_GRAIN:
return {
label: "Grain",
value: pond.ContractType.CONTRACT_TYPE_GRAIN
};
default:
return {
label: "Unknown",
value: pond.ContractType.CONTRACT_TYPE_UNKNOWN
};
}
}
public static toCommodityOption(type: pond.ContractType, commodity: number): Option {
switch (type) {
case pond.ContractType.CONTRACT_TYPE_GRAIN:
return ToGrainOption(commodity);
default:
return { label: "None", value: 0 };
}
}
/**
* returns the conversion value in the settings, if not set will return 1
* @returns 1 or bushels per tonne
*/
public conversionValue(): number {
//trying to avoid a divide by 0 error by only returning a value greater than 0
//since to get the secondary unit you divide the current unit by the conversion value
if (this.settings.conversionValue > 0) {
return this.settings.conversionValue;
} else {
return 1;
}
}
//used for grain transactions to compare the source and destinations since different bushels per tonne for custom grain should be treated like seperate grain types
public bushelsPerTonne(): number {
return this.conversionValue();
}
public sizeInPreferredUnit(): number {
let size = this.settings.size;
switch (this.settings.type) {
case pond.ContractType.CONTRACT_TYPE_GRAIN:
if (getGrainUnit() === pond.GrainUnit.GRAIN_UNIT_WEIGHT && this.conversionValue() > 1) {
size = size / this.conversionValue();
}
}
return Math.round(size * 100) / 100;
}
public deliveredInPreferredUnit(): number {
let del = this.settings.delivered;
switch (this.settings.type) {
case pond.ContractType.CONTRACT_TYPE_GRAIN:
if (getGrainUnit() === pond.GrainUnit.GRAIN_UNIT_WEIGHT && this.conversionValue() > 1) {
del = del / this.conversionValue();
}
}
return Math.round(del * 100) / 100;
}
public static toStoredUnit(
secondaryUnitVal: number,
contractType: pond.ContractType,
conversionValue: number
): number {
let storedunitVal = secondaryUnitVal;
switch (contractType) {
case pond.ContractType.CONTRACT_TYPE_GRAIN:
if (getGrainUnit() === pond.GrainUnit.GRAIN_UNIT_WEIGHT && conversionValue > 1) {
storedunitVal = secondaryUnitVal * conversionValue;
}
}
return storedunitVal;
}
public grainName(): string {
if (this.grain() !== pond.Grain.GRAIN_INVALID) {
if (this.grain() === pond.Grain.GRAIN_CUSTOM) {
return this.customType();
} else {
return GrainDescriber(this.grain()).name;
}
} else {
return "None";
}
}
}