Skip to content

Instantly share code, notes, and snippets.

@axel-andrade
Last active October 26, 2022 02:14
Show Gist options
  • Save axel-andrade/cc219179ae1e621b5301d5b2f2f73898 to your computer and use it in GitHub Desktop.
Save axel-andrade/cc219179ae1e621b5301d5b2f2f73898 to your computer and use it in GitHub Desktop.
type Order = {
id: number;
value: number;
customer: string;
};
class Payment {
private discount: number;
private fee: number;
private order: Order;
constructor(discount: number, fee: number, order: Order) {
this.discount = discount;
this.fee = fee;
this.order = order;
}
public getDiscount(value: number): number {
return (value * this.discount) / 100;
}
public getFee(value: number): number {
return (value * this.fee) / 100;
}
public getFinalValue(): number {
const discount = this.getDiscount(this.order.value);
let currentValue = this.order.value;
if (discount > 0) {
currentValue = currentValue - discount;
}
const fee = this.getFee(currentValue);
if (fee > 0) {
return currentValue + fee;
}
return currentValue;
}
public getOrder(): Order {
return this.order;
}
}
class CreditPayment extends Payment {
constructor(discount: number, fee: number, order: Order) {
super(discount, fee, order);
}
public getDiscount(value: number): number {
throw new Error("not implemented discount in credit payment method");
}
}
class PixPayment extends Payment {
constructor(discount: number, fee: number, order: Order) {
super(discount, fee, order);
}
public getFee(value: number): number {
throw new Error("not implemented fee in pix payment method");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment