From e9a78399ceb0044c7b5c230841d5ae2117604576 Mon Sep 17 00:00:00 2001 From: User Date: Thu, 30 Dec 2021 21:08:16 +0500 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=BE=D1=80=D0=BE=D0=B1=D1=8C=D1=91?= =?UTF-8?q?=D0=B2=20=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/task_1/index.ts | 39 +++++++++++++++++++++++++++++++++++---- src/task_2/index.ts | 31 ++++++++++++++++++++++--------- src/task_3/index.ts | 43 +++++++++++++++++++++++++++++++++---------- src/task_4/index.ts | 18 +++++++++++++----- src/task_5/index.ts | 35 ++++++++++++++++++++--------------- 5 files changed, 123 insertions(+), 43 deletions(-) diff --git a/src/task_1/index.ts b/src/task_1/index.ts index 52f4a7d..c68d3bd 100644 --- a/src/task_1/index.ts +++ b/src/task_1/index.ts @@ -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 } } \ No newline at end of file diff --git a/src/task_2/index.ts b/src/task_2/index.ts index 461dbe9..43f256d 100644 --- a/src/task_2/index.ts +++ b/src/task_2/index.ts @@ -13,7 +13,7 @@ * возвращает true - если карта привязана к какому-нибудь пользователю, false в ином случае * 2) Типизировать все свойства и методы класса MoneyRepository, * пользуясь уже предоставленными интерфейсами (избавиться от всех any типов) -*/ + */ import { Currency } from '../enums'; @@ -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; + } + }) } } \ No newline at end of file diff --git a/src/task_3/index.ts b/src/task_3/index.ts index 9020644..cc7e349 100644 --- a/src/task_3/index.ts +++ b/src/task_3/index.ts @@ -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) + } } } \ No newline at end of file diff --git a/src/task_4/index.ts b/src/task_4/index.ts index bdd7528..2e759e0 100644 --- a/src/task_4/index.ts +++ b/src/task_4/index.ts @@ -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; + } } } \ No newline at end of file diff --git a/src/task_5/index.ts b/src/task_5/index.ts index 7423c32..17471a6 100644 --- a/src/task_5/index.ts +++ b/src/task_5/index.ts @@ -1,7 +1,7 @@ /** Задача 5 - BankTerminal * Имеется класс BankTerminal. Класс представляет банковский терминал. * Требуется: - * 1) Реализовать классу BankTerminal 5 методjd: + * 1) Реализовать классу BankTerminal 5 методjd: * 1.1) authorize - позволяет авторизировать пользователя c помощью авторизации в BankOffice * 1.2) takeUsersMoney - позволяет авторизованному пользователю положить денежные единицы * в хранилище и пополнить свой баланс на карте @@ -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'; @@ -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); } } \ No newline at end of file