Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 35 additions & 4 deletions src/task_1/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,48 @@ export interface IMoneyUnit {
}

export class MoneyRepository {
private _repository: any;
_repository: IMoneyUnit[];

constructor(initialRepository: any) {
constructor(initialRepository: IMoneyUnit[]) {
this._repository = initialRepository;
}

public giveOutMoney(count: any, currency: any): any {
public giveOutMoney(count: number, currency: Currency): boolean {
this._repository.sort((a,b) => parseInt(b.moneyInfo.denomination) - parseInt(a.moneyInfo.denomination))
for(let i = 0; i < this._repository.length; i++){
const denomination = parseInt(this._repository[i].moneyInfo.denomination);
if(this._repository[i].moneyInfo.currency !== currency || denomination > count || this._repository[i].count === 0){
continue;
}else{
const ost = Math.trunc(count/denomination);
if (ost >= this._repository[i].count){
count = count - this._repository[i].count*denomination;
this._repository[i].count = 0
}else{
count = count - ost*denomination;
this._repository[i].count -= ost
}
}
}

return count === 0;
}

public takeMoney(moneyUnits: any): any {
public takeMoney(moneyUnits: IMoneyUnit[]): boolean {
for (let j = 0; j< moneyUnits.length; j++){
let canTake = false
for (let i = 0; i < this._repository.length; i++) {
if (this._repository[i].moneyInfo.currency === moneyUnits[j].moneyInfo.currency
&& this._repository[i].moneyInfo.denomination === moneyUnits[j].moneyInfo.denomination) {
this._repository[i].count += moneyUnits[j].count
canTake = true
}
}
if (!canTake){
this._repository.push({ moneyInfo: { denomination: moneyUnits[j].moneyInfo.denomination, currency: moneyUnits[j].moneyInfo.currency }, count: moneyUnits[j].count })
}
}

return true
}
}
31 changes: 22 additions & 9 deletions src/task_2/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* возвращает true - если карта привязана к какому-нибудь пользователю, false в ином случае
* 2) Типизировать все свойства и методы класса MoneyRepository,
* пользуясь уже предоставленными интерфейсами (избавиться от всех any типов)
*/
*/

import { Currency } from '../enums';

Expand All @@ -32,23 +32,36 @@ export interface IBankUser {
}

export class BankOffice {
private _users: any;
private _cards: any;
private _users: IBankUser[];
private _cards: ICard[];

constructor(users: any, cards: any) {
constructor(users: IBankUser[], cards: ICard[]) {
this._users = users;
this._cards = cards;
}

public authorize(userId: any, cardId: any, cardPin: any): any {
public authorize(userId: string, cardId: string, cardPin: string): boolean {
const user = this._users.find(x => x.id === userId);
if (user === undefined){
return false
}
const card = user.cards.find(x => x.id === cardId);
if (card === undefined){
return false
}

return card.pin === cardPin
}

public getCardById(cardId: any): any {

public getCardById(cardId: string): ICard {
return this._cards.find(x => x.id === cardId)
}

public isCardTiedToUser(cardId: any): any {

public isCardTiedToUser(cardId: string): boolean {
return this._users.some((user) => {
if (user.cards.find(x => x.id === cardId)) {
return true;
}
})
}
}
43 changes: 33 additions & 10 deletions src/task_3/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,35 +15,58 @@
* на основе переданных аргументов
* 2) Типизировать все свойства и методы класса UserSettingsModule,
* пользуясь уже предоставленными интерфейсами (избавиться от всех any типов)
*/
*/

import { UserSettingOptions } from '../enums';
import { BankOffice, IBankUser } from "../task_2";

export class UserSettingsModule {
private _bankOffice: any;
private _user: any;
private _bankOffice: BankOffice;
private _user: IBankUser;

public set user(user: any) {
public set user(user: IBankUser) {
this._user = user;
}

constructor(initialBankOffice: any) {
constructor(initialBankOffice: BankOffice) {
this._bankOffice = initialBankOffice;
}

private changeUserName(newName: any): any {
private changeUserName(newName: string): boolean {
if (!this._user || this._user.name === newName) {
return false;
}
this._user.name = newName;

return true;
}

private changeUserSurname(newSurname: any): any {
private changeUserSurname(newSurname: string): boolean {
if (!this._user || this._user.surname === newSurname) {
return false;
}
this._user.surname = newSurname;

return true;
}

private registerForUserNewCard(newCardId: any): any {
private registerForUserNewCard(newCardId: string): boolean {
if(!this._bankOffice.isCardTiedToUser(newCardId) && this._bankOffice.getCardById(newCardId)){
this._user.cards.push(this._bankOffice.getCardById(newCardId))

return true
}
return false
}

public changeUserSettings(option: UserSettingOptions, argsForChangeFunction: any): any {

public changeUserSettings(option: UserSettingOptions, argsForChangeFunction: string): boolean {
switch (option) {
case UserSettingOptions.name:
return this.changeUserName(argsForChangeFunction)
case UserSettingOptions.surname:
return this.changeUserSurname(argsForChangeFunction)
case UserSettingOptions.newCard:
return this.registerForUserNewCard(argsForChangeFunction)
}
}
}
18 changes: 13 additions & 5 deletions src/task_4/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,26 @@
* 1USD = 70RUB и кратные курсу суммы (т.е. банкомат не может сконвертировать 100RUB, может только 70, 140 и т.д.)
* 2) Типизировать все свойства и методы класса UserSettingsModule,
* пользуясь уже предоставленными интерфейсами (избавиться от всех any типов)
*/
*/

import { Currency } from '../enums';
import {IMoneyUnit, MoneyRepository} from "../task_1";

export class CurrencyConverterModule {
private _moneyRepository: any;
private _moneyRepository: MoneyRepository;

constructor(initialMoneyRepository: any) {
constructor(initialMoneyRepository: MoneyRepository) {
this._moneyRepository = initialMoneyRepository;
}

public convertMoneyUnits(fromCurrency: Currency, toCurrency: Currency, moneyUnits: any): any {

public convertMoneyUnits(fromCurrency: Currency, toCurrency: Currency, moneyUnits: IMoneyUnit): number {
switch (fromCurrency) {
case toCurrency:
return 0;
case Currency.USD:
return parseInt(moneyUnits.moneyInfo.denomination) * moneyUnits.count * 70;
case Currency.RUB:
return parseInt(moneyUnits.moneyInfo.denomination) * moneyUnits.count / 70;
}
}
}
35 changes: 20 additions & 15 deletions src/task_5/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/** Задача 5 - BankTerminal
* Имеется класс BankTerminal. Класс представляет банковский терминал.
* Требуется:
* 1) Реализовать классу BankTerminal 5 методjd:
* 1) Реализовать классу BankTerminal 5 методjd:
* 1.1) authorize - позволяет авторизировать пользователя c помощью авторизации в BankOffice
* 1.2) takeUsersMoney - позволяет авторизованному пользователю положить денежные единицы
* в хранилище и пополнить свой баланс на карте
Expand All @@ -13,11 +13,11 @@
* с помощью методов CurrencyConverterModule
* 2) Типизировать все свойства и методы класса BankTerminal,
* пользуясь уже предоставленными интерфейсами (избавиться от всех any типов)
*/
*/

import { Currency, UserSettingOptions } from '../enums';
import { MoneyRepository } from '../task_1';
import { BankOffice, IBankUser } from '../task_2';
import {IMoneyUnit, MoneyRepository} from '../task_1';
import {BankOffice, IBankUser, ICard} from '../task_2';
import { UserSettingsModule } from '../task_3';
import { CurrencyConverterModule } from '../task_4';

Expand All @@ -28,30 +28,35 @@ export class BankTerminal {
private _currencyConverterModule: CurrencyConverterModule;
private _authorizedUser: IBankUser;

constructor(initBankOffice: any, initMoneyRepository: any) {
constructor(initBankOffice: BankOffice, initMoneyRepository: MoneyRepository) {
this._moneyRepository = initMoneyRepository;
this._bankOffice = initBankOffice;
this._userSettingsModule = new UserSettingsModule(initBankOffice);
this._currencyConverterModule = new CurrencyConverterModule(initMoneyRepository);
}

public authorizeUser(user: any, card: any, cardPin: any): any {

public authorizeUser(user: IBankUser, card: ICard, cardPin: string): boolean {
if (!this._bankOffice.authorize(user.id, card.id, cardPin)) {
return false;
}
this._userSettingsModule.user = user;
this._authorizedUser = user;
return true
}

public takeUsersMoney(moneyUnits: any): any {

public takeUsersMoney(moneyUnits: IMoneyUnit[]): boolean {
return this._moneyRepository.takeMoney(moneyUnits);
}

public giveOutUsersMoney(count: any): any {

public giveOutUsersMoney(count: number): boolean {
return this._moneyRepository.giveOutMoney(count, Currency.RUB);
}

public changeAuthorizedUserSettings(option: UserSettingOptions, argsForChangeFunction: any): any {

public changeAuthorizedUserSettings(option: UserSettingOptions, argsForChangeFunction: string): boolean {
return this._userSettingsModule.changeUserSettings(option, argsForChangeFunction);
}

public convertMoneyUnits(fromCurrency: Currency, toCurrency: Currency, moneyUnits: any): any {

public convertMoneyUnits(fromCurrency: Currency, toCurrency: Currency, moneyUnits: IMoneyUnit): number {
return this._currencyConverterModule.convertMoneyUnits(fromCurrency, toCurrency, moneyUnits);
}
}