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;
        }
Example #2
0
        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));
        }
Example #4
0
        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();
        }
Example #5
0
        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;
 }
Example #12
0
        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;
                    }
                }
            }
        }
Example #13
0
        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();
        }
Example #14
0
        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;
 }