public TimeSpan CalculateClientCallDuration(ClientContract client, DateTime dateFrom, DateTime dateTo) { var duration = SessionHistory. Where(s => s.Source == client && (s.CallAccepted && s.Events.First().EventTime >= dateFrom && s.Events.Last().EventTime <= dateTo)). Aggregate(TimeSpan.Zero, (total, current) => total.Add(current.EndCalling.Subtract(current.StartCalling))); return duration; }
public Session(ClientContract source, ClientContract target, IRate rate) { Events = new List<ConnectionEvent>(); Source = source; Target = target; Rate = rate; }
public void CalculateClientMonthlyTax(ClientContract client) { var lastTax = TaxHistory.Any(t => t.Client == client) ? TaxHistory.Last(t => t.Client == client).PayDate : DateTime.MinValue; var currentRate = RateHistory.Last(h => h.Client == client).Rate; var duration = CalculateClientCallDuration(client, lastTax, CurrentTime); duration = duration.Subtract(TimeSpan.FromMinutes(currentRate.FreeMinutesPerMonth)); var tax = currentRate.CalculateCost(duration.TotalMinutes > 0 ? duration : TimeSpan.Zero) + currentRate.MonthlyFee; TaxHistory.Add(new ClientTaxHistory(client, CurrentTime, tax)); }
private static void AnswerACall(ClientContract sourceClient, ClientContract targetClient) { Console.Clear(); sourceClient.Terminal.Call(targetClient.TelephoneNumber); Console.WriteLine("There is incomming call from: {0}", sourceClient.TelephoneNumber); Console.WriteLine("Accept? (y/n)"); var result = Console.ReadLine(); if(result == "y") { targetClient.Terminal.Accept(); Console.WriteLine("Who will drop a call?"); Console.WriteLine("1. You"); Console.WriteLine("2. Your companion"); int res = 0; int.TryParse(Console.ReadLine(), out res); if (res > 0 && res <= 2) { switch (res) { case 1: sourceClient.Terminal.Drop(); break; case 2: targetClient.Terminal.Drop(); break; } } } else { targetClient.Terminal.Drop(); } Console.WriteLine("Press any key"); Console.ReadLine(); }
private static void ChangeYourRate(ClientContract client) { Console.Clear(); Console.WriteLine("Which rate do you want to choose?"); var index = 0; foreach (var rate in _telephoneExchange.Rates.Where(r => r != client.Rate)) { index++; if (rate is PerMinuteRate) { Console.WriteLine("{0}. Per minute rate. Price per minute: {1}", index, ((PerMinuteRate)rate).PricePerMinute); } else if (rate is PerSecondRate) { Console.WriteLine("{0}. Per second rate. Price per second: {1}", index, ((PerSecondRate)rate).PricePerSecond); } } int result = 0; int.TryParse(Console.ReadLine(), out result); if (result > 0 && result <= index) { var newRate = _telephoneExchange.Rates.Where(r => r != client.Rate).ElementAt(index - 1); try { _telephoneExchange.ChangeClientRate(client, newRate); } catch(ArgumentException exp) { Console.WriteLine(exp.Message); Console.WriteLine("Press any key"); Console.ReadLine(); } } }
public ClientRateHistory(ClientContract client, DateTime date, IRate rate) { Client = client; Date = date; Rate = rate; }
public IEnumerable<Session> GetSessionHistory(ClientContract client, DateTime dateFrom, DateTime dateTo) { return SessionHistory.Where(s => (s.Source == client || s.Target == client) && (s.Events.Any() && s.Events.First().EventTime >= dateFrom && s.Events.Last().EventTime <= dateTo)); }
public ClientContract AddClient(string name, ushort code, IRate rate) { // get free telephone number var freeNumber = GetFreeTelephoneNumber(code); if (!freeNumber.HasValue) throw new ArgumentException("There is no free telephone number in this code"); // get free terminal var freeTerminal = Terminals.FirstOrDefault(t => BillingSystem.Contracts.All(c => c.Terminal != t)); if (freeTerminal == null) freeTerminal = AddNewTerminal(); // connect terminal with first free port ConnectTerminalToFreePort(freeTerminal); var newClientContract = new ClientContract(name, freeNumber.Value, freeTerminal, rate); BillingSystem.Contracts.Add(newClientContract); BillingSystem.RateHistory.Add(new ClientRateHistory(newClientContract, BillingSystem.CurrentTime, rate)); return newClientContract; }
public void RemoveClient(ClientContract client) { var clientTerminal = client.Terminal; var terminalToPortConnection = _terminalToPertConnections.First(c => c.Terminal == clientTerminal); _terminalToPertConnections.Remove(terminalToPortConnection); terminalToPortConnection.Dispose(); DisconnectWithTerminal(clientTerminal); BillingSystem.Contracts.Remove(client); }
public void ChangeClientRate(ClientContract client, IRate newRate) { var currentDate = BillingSystem.CurrentTime; var lastHistoryDate = BillingSystem.RateHistory.LastOrDefault(h => h.Client == client).Date; if (new DateTime(lastHistoryDate.Year, lastHistoryDate.Month + 1, lastHistoryDate.Day) > currentDate) throw new ArgumentException("You cannot change rate before on month has gone"); client.Rate = newRate; BillingSystem.CalculateClientMonthlyTax(client); var rateHistory = new ClientRateHistory(client, currentDate, newRate); BillingSystem.RateHistory.Add(rateHistory); }
public ConnectionEvent(ClientContract source, ConnectionEventType type, DateTime eventTime) { Source = source; Type = type; EventTime = eventTime; }
private static void ShowPersonalInfo(ClientContract client) { while (true) { Console.Clear(); Console.WriteLine("Your personal account: {0}", client); var perMinuteRate = client.Rate as PerMinuteRate; if(perMinuteRate != null) { Console.WriteLine("Per minute rate\n -price per minute: {0} \n -monthly fee: {1} \n -free minutes: {2}", perMinuteRate.PricePerMinute, perMinuteRate.MonthlyFee, perMinuteRate.FreeMinutesPerMonth); } else { var perSecondRate = client.Rate as PerSecondRate; Console.WriteLine("Per second rate\n -price per minute: {0} \n -monthly fee: {1} \n -free minutes: {2}", perSecondRate.PricePerSecond, perSecondRate.MonthlyFee, perSecondRate.FreeMinutesPerMonth); } Console.WriteLine(); Console.WriteLine("1. Make a call"); Console.WriteLine("2. Answer a call"); Console.WriteLine("3. Change your rate"); Console.WriteLine("4. Get pays detail info"); Console.WriteLine("5. Back"); int result = 0; int.TryParse(Console.ReadLine(), out result); if (result > 0 && result <= 5) { switch(result) { case 1: MakeACall(client); break; case 2: { Console.WriteLine("Choose your profile"); var index = 0; foreach (var callingClient in _telephoneExchange.BillingSystem.Contracts) { index++; Console.WriteLine("{0} {1}", index, callingClient); } int res = 0; int.TryParse(Console.ReadLine(), out res); if (res > 0 && res <= index) { AnswerACall(_telephoneExchange.BillingSystem.Contracts.ElementAt(res - 1), client); } break; } case 3: ChangeYourRate(client); break; case 4: ShowPaysInfo(client); break; case 5: return; } } } }
private static void ShowPaysInfo(ClientContract client) { Console.Clear(); var lastEvent = DateTime.MinValue; foreach(var taxHistory in _telephoneExchange.BillingSystem.TaxHistory.Where(h => h.Client == client)) { Console.WriteLine("-----------------------"); var date = taxHistory.PayDate; Console.WriteLine("Date: {0} Tax: {1}", taxHistory.PayDate, taxHistory.Tax); Console.WriteLine("History:"); foreach (var session in _telephoneExchange.BillingSystem.SessionHistory. Where(s => s.Source == client)) { var endCalling = session.EndCalling; if(lastEvent < endCalling && endCalling < date) { Console.WriteLine("Session: Target: {0}, Duration: {1}, EndCalling: {2:dd.MM HH:mm:ss}", session.Target, session.CallAccepted ? session.EndCalling.Subtract(session.StartCalling) : TimeSpan.Zero, session.EndCalling); } } lastEvent = date; } Console.WriteLine("Press any key"); Console.ReadLine(); }
private static void MakeACall(ClientContract sourceClient) { Console.Clear(); Console.WriteLine("Which telephone number do you want to connect?"); Console.WriteLine("Code:"); var code = Convert.ToUInt16(Console.ReadLine()); Console.WriteLine("Number:"); var number = Convert.ToUInt32(Console.ReadLine()); TelephoneNumber targetTelephoneNumber; try { targetTelephoneNumber = new TelephoneNumber(code, number); sourceClient.Terminal.Call(targetTelephoneNumber); } catch (ArgumentNullException exp) { Console.WriteLine(exp.Message); Console.WriteLine("Press any key"); Console.ReadLine(); return; } if(_telephoneExchange.BillingSystem.Contracts.Any(c => c.TelephoneNumber == targetTelephoneNumber)) { var targetTerminal = _telephoneExchange.BillingSystem.Contracts.First(c => c.TelephoneNumber == targetTelephoneNumber).Terminal; targetTerminal.Accept(); Console.WriteLine("Who will drop a call?"); Console.WriteLine("1. You"); Console.WriteLine("2. Your companion"); int result = 0; int.TryParse(Console.ReadLine(), out result); if (result > 0 && result <= 2) { switch (result) { case 1: sourceClient.Terminal.Drop(); break; case 2: targetTerminal.Drop(); break; } } } Console.WriteLine("Press any key"); Console.ReadLine(); }
public ClientTaxHistory(ClientContract client, DateTime payDate, float tax) { Client = client; PayDate = payDate; Tax = tax; }