nitro/apps/frontend/src/api/catalog/Offer.ts

246 lines
6.6 KiB
TypeScript

import { GetFurnitureData, GetProductDataForLocalization, LocalizeText, ProductTypeEnum } from '..';
import { ICatalogPage } from './ICatalogPage';
import { IProduct } from './IProduct';
import { IPurchasableOffer } from './IPurchasableOffer';
import { Product } from './Product';
export class Offer implements IPurchasableOffer
{
public static PRICING_MODEL_UNKNOWN: string = 'pricing_model_unknown';
public static PRICING_MODEL_SINGLE: string = 'pricing_model_single';
public static PRICING_MODEL_MULTI: string = 'pricing_model_multi';
public static PRICING_MODEL_BUNDLE: string = 'pricing_model_bundle';
public static PRICING_MODEL_FURNITURE: string = 'pricing_model_furniture';
public static PRICE_TYPE_NONE: string = 'price_type_none';
public static PRICE_TYPE_CREDITS: string = 'price_type_credits';
public static PRICE_TYPE_ACTIVITYPOINTS: string = 'price_type_activitypoints';
public static PRICE_TYPE_CREDITS_ACTIVITYPOINTS: string = 'price_type_credits_and_activitypoints';
private _pricingModel: string;
private _priceType: string;
private _offerId: number;
private _localizationId: string;
private _priceInCredits: number;
private _priceInActivityPoints: number;
private _activityPointType: number;
private _giftable: boolean;
private _isRentOffer: boolean;
private _page: ICatalogPage;
private _clubLevel: number = 0;
private _products: IProduct[];
private _badgeCode: string;
private _bundlePurchaseAllowed: boolean = false;
constructor(offerId: number, localizationId: string, isRentOffer: boolean, priceInCredits: number, priceInActivityPoints: number, activityPointType: number, giftable: boolean, clubLevel: number, products: IProduct[], bundlePurchaseAllowed: boolean)
{
this._offerId = offerId;
this._localizationId = localizationId;
this._isRentOffer = isRentOffer;
this._priceInCredits = priceInCredits;
this._priceInActivityPoints = priceInActivityPoints;
this._activityPointType = activityPointType;
this._giftable = giftable;
this._clubLevel = clubLevel;
this._products = products;
this._bundlePurchaseAllowed = bundlePurchaseAllowed;
this.setPricingModelForProducts();
this.setPricingType();
for(const product of products)
{
if(product.productType === ProductTypeEnum.BADGE)
{
this._badgeCode = product.extraParam;
break;
}
}
}
public activate(): void
{
}
public get clubLevel(): number
{
return this._clubLevel;
}
public get page(): ICatalogPage
{
return this._page;
}
public set page(k: ICatalogPage)
{
this._page = k;
}
public get offerId(): number
{
return this._offerId;
}
public get localizationId(): string
{
return this._localizationId;
}
public get priceInCredits(): number
{
return this._priceInCredits;
}
public get priceInActivityPoints(): number
{
return this._priceInActivityPoints;
}
public get activityPointType(): number
{
return this._activityPointType;
}
public get giftable(): boolean
{
return this._giftable;
}
public get product(): IProduct
{
if(!this._products || !this._products.length) return null;
if(this._products.length === 1) return this._products[0];
const products = Product.stripAddonProducts(this._products);
if(products.length) return products[0];
return null;
}
public get pricingModel(): string
{
return this._pricingModel;
}
public get priceType(): string
{
return this._priceType;
}
public get bundlePurchaseAllowed(): boolean
{
return this._bundlePurchaseAllowed;
}
public get isRentOffer(): boolean
{
return this._isRentOffer;
}
public get badgeCode(): string
{
return this._badgeCode;
}
public get localizationName(): string
{
const productData = GetProductDataForLocalization(this._localizationId);
if(productData) return productData.name;
return LocalizeText(this._localizationId);
}
public get localizationDescription(): string
{
const productData = GetProductDataForLocalization(this._localizationId);
if(productData) return productData.description;
return LocalizeText(this._localizationId);
}
public get isLazy(): boolean
{
return false;
}
public get products(): IProduct[]
{
return this._products;
}
private setPricingModelForProducts(): void
{
const products = Product.stripAddonProducts(this._products);
if(products.length === 1)
{
if(products[0].productCount === 1)
{
this._pricingModel = Offer.PRICING_MODEL_SINGLE;
}
else
{
this._pricingModel = Offer.PRICING_MODEL_MULTI;
}
}
else if(products.length > 1)
{
this._pricingModel = Offer.PRICING_MODEL_BUNDLE;
}
else
{
this._pricingModel = Offer.PRICING_MODEL_UNKNOWN;
}
}
private setPricingType(): void
{
if((this._priceInCredits > 0) && (this._priceInActivityPoints > 0))
{
this._priceType = Offer.PRICE_TYPE_CREDITS_ACTIVITYPOINTS;
}
else if(this._priceInCredits > 0)
{
this._priceType = Offer.PRICE_TYPE_CREDITS;
}
else if(this._priceInActivityPoints > 0)
{
this._priceType = Offer.PRICE_TYPE_ACTIVITYPOINTS;
}
else
{
this._priceType = Offer.PRICE_TYPE_NONE;
}
}
public clone(): IPurchasableOffer
{
const products: IProduct[] = [];
const productData = GetProductDataForLocalization(this.localizationId);
for(const product of this._products)
{
const furnitureData = GetFurnitureData(product.productClassId, product.productType);
products.push(new Product(product.productType, product.productClassId, product.extraParam, product.productCount, productData, furnitureData));
}
const offer = new Offer(this.offerId, this.localizationId, this.isRentOffer, this.priceInCredits, this.priceInActivityPoints, this.activityPointType, this.giftable, this.clubLevel, products, this.bundlePurchaseAllowed);
offer.page = this.page;
return offer;
}
}