@vidal-community/vidal-web-components
Version:
Vidal Web Components
91 lines • 4.09 kB
JavaScript
import { Dose } from '../model/dose';
export function useConversionService() {
return conversionServiceInstance;
}
class ConversionService {
constructor() {
this.MAX_CONVERSION_STEP_LIMIT = 10;
}
findMatchingUnitUri(equivalentDrugUnits, prescriptionUnit) {
for (const unit of equivalentDrugUnits) {
if (unit.uri === prescriptionUnit.uri) {
return unit.uri;
}
for (const conversionRate of unit.conversionRates) {
if (conversionRate.refUnit.uri === prescriptionUnit.uri) {
return conversionRate.refUnit.uri;
}
if (conversionRate.unit.uri === prescriptionUnit.uri) {
return conversionRate.unit.uri;
}
}
}
return undefined;
}
convertDose(dose, targetUnit, conversionRate) {
if (targetUnit === dose.unit.uri) {
return dose;
}
if (conversionRate.length === 0) {
return;
}
const refUnit = conversionRate[0].refUnit.uri;
const convertedDose = new Dose(dose.value, dose.unit);
let conversionSteps = 0;
while (convertedDose.unit.uri !== targetUnit &&
conversionSteps < this.MAX_CONVERSION_STEP_LIMIT) {
conversionSteps++;
conversionRate.forEach((conversionRate) => {
if (this.isDirectConversionPossibleByMultiplying(convertedDose.unit, conversionRate, targetUnit)) {
convertedDose.value = this.multiplyDoseByCoeff(convertedDose.value, conversionRate);
convertedDose.unit = conversionRate.unit;
return;
}
if (this.isDirectConversionPossibleByDividing(convertedDose.unit, conversionRate, targetUnit) ||
this.isConversionToRefUnitPossibleByMultiplying(convertedDose.unit, conversionRate, refUnit)) {
convertedDose.value = this.divideDoseByCoeff(convertedDose.value, conversionRate);
convertedDose.unit = conversionRate.refUnit;
return;
}
if (this.isConversionToRefUnitPossibleByDividing(refUnit, conversionRate, convertedDose.unit)) {
convertedDose.value = this.multiplyDoseByCoeff(convertedDose.value, conversionRate);
convertedDose.unit = conversionRate.refUnit;
}
});
}
if (conversionSteps === this.MAX_CONVERSION_STEP_LIMIT) {
console.error('For the next dose : ' +
dose.toString() +
', the conversion could not be made to the target unit: ' +
targetUnit);
console.error('The associated conversion rates are: ');
console.table(conversionRate);
return;
}
return convertedDose;
}
isConversionToRefUnitPossibleByDividing(refUnit, conversionRate, unit) {
return (refUnit === conversionRate.unit.uri &&
unit.uri === conversionRate.refUnit.uri);
}
isConversionToRefUnitPossibleByMultiplying(unit, conversionRate, refUnit) {
return (unit.uri === conversionRate.unit.uri &&
refUnit === conversionRate.refUnit.uri);
}
isDirectConversionPossibleByDividing(unit, conversionRate, targetUnit) {
return (unit.uri === conversionRate.unit.uri &&
targetUnit === conversionRate.refUnit.uri);
}
isDirectConversionPossibleByMultiplying(unit, conversionRate, targetUnit) {
return (unit.uri === conversionRate.refUnit.uri &&
targetUnit === conversionRate.unit.uri);
}
divideDoseByCoeff(value, conversionRate) {
return (value / conversionRate.numerator) * conversionRate.denominator;
}
multiplyDoseByCoeff(value, conversionRate) {
return value * (conversionRate.numerator / conversionRate.denominator);
}
}
const conversionServiceInstance = new ConversionService();
//# sourceMappingURL=conversion-service.js.map