import Concession from '../entity/Concession'; import ConcessionAdapterInterface from './ConcessionAdapterInterface'; import PassengerTypeAdapterInterface from '../../PassengerType/adapter/PassengerTypeAdapterInterface'; import DiscountPercentage from '../../common/entities/DiscountPercentage'; import Money from '../../common/entities/Money'; import Currency from '../../common/entities/Currency'; export default class ConcessionAdapter implements ConcessionAdapterInterface { protected passengerTypeAdapter: PassengerTypeAdapterInterface; constructor(passengerTypeAdapter: PassengerTypeAdapterInterface) { this.passengerTypeAdapter = passengerTypeAdapter; } adapt(json: any, instance: Concession): Concession { instance.amount = new Money(new Currency('GBP', 'L', 0), 0); instance.percentage = new DiscountPercentage(0, 0); // Conditionals because the object GIVEN by backend has different format for each if (json.amount) { instance.type = Concession.TYPE_FIXED; instance.value = json.amount.amount; instance.amount.currency.decimal_precision = 2; } else if (json.percentage) { instance.type = Concession.TYPE_PERCENTAGE; instance.value = json.percentage.amount; instance.percentage.precision = json.percentage.precision; } // TODO: Move this to the commented line below once backend has moved passenger_type_id to actual passenger_type. instance.passenger_type = this.passengerTypeAdapter.transformToEntity({ id: json.passenger_type_id, name: 'Adult' }); // instance.passenger_type = this.passengerTypeAdapter.transformToEntity(json.passenger_type); return instance; } prepare(instance: Concession): object { let concessionPricePrepared; if (instance.type === Concession.TYPE_PERCENTAGE) { concessionPricePrepared = { percentage: { value: instance.percentage.value * instance.percentage.precision, precision: instance.percentage.precision, }, }; } else if (instance.type === Concession.TYPE_FIXED) { concessionPricePrepared = { amount: { amount: instance.amount.amount * instance.amount.currency.decimal_precision, currency_name: instance.amount.currency.iso_code, }, }; } return { // passenger_type: this.passengerTypeAdapter.prepare(instance.passenger_type), passenger_type_id: instance.passenger_type.id, ...concessionPricePrepared, }; } transformToEntity(json: any): Concession { return this.adapt(json, new Concession()); } transformToPayload(instance: Concession): any { return this.prepare(instance); } private calculatePriceByPrecision(amount, precision) { return amount / (10 * precision); } }