public double CalculatePriceOfCall(CallInfo call)
 {
     if (_FavoriteNumbers.Contains(call.Target))
     {
         return 0;
     }
     else
     {
         return call.Duration.TotalMinutes * _PricePerMinute;
     }
 }
        public double CalculatePriceOfCall(CallInfo call)
        {
            var durationInMinutes = call.Duration.TotalMinutes;

            if (_PrivateMinutes != 0)
            {
                if (durationInMinutes > _PrivateMinutes)
                {
                    durationInMinutes -= _PrivateMinutes;
                    _PrivateMinutes = 0;
                }
                else
                {
                    _PrivateMinutes -= durationInMinutes;
                    return 0;
                }
            }

            return durationInMinutes * _PricePerMinute;
        }
 public static string ToLogString(CallInfo callInfo)
 {
     return String.Format("Call: from - {0}, to - {1}, time - {2}, duration(min) - {3}, price - {4}",
         callInfo.Source.GetValue, callInfo.Target.GetValue, callInfo.StartedAt, callInfo.Duration.TotalMinutes, callInfo.Price);
 }
        protected void AddCall(object sender, CallInfo callInfo)
        {
            var currentTariffPlan =
                this._CurrentContracts
                .Where(x => x.Number == callInfo.Source)
                .OrderBy(x => x.Date)
                .Last()
                .TariffPlan;

            callInfo.Price = currentTariffPlan.CalculatePriceOfCall(callInfo);

            _Logger.WriteToLog("-> Billing system get new call");
            _Logger.WriteToLog(ObjectToLogString.ToLogString(callInfo));

            _NotPayCalls.Add(callInfo);
        }
        protected void RejectRequest(Request request, ResponseState responseState, IPort port)
        {
            var response = new Response(responseState, request);
            _Logger.WriteToLog("-> ATS reject");
            _Logger.WriteToLog(ObjectToLogString.ToLogString(response));

            CallInfo call = new CallInfo(request.SourceNumber, request.TargetNumber);
            call.StartedAt = LocalDateTime.Now;

            port.CallWasCompleted(response);
            OnTerminateCall(this, call);
        }
        protected void ProcessRequest(object sender, Request request)
        {
            var senderPort = _RoutingPorts[request.SourceNumber];
            var targetPort = _RoutingPorts[request.TargetNumber];

            var callInfo = new CallInfo(request.SourceNumber, request.TargetNumber);

            if (OnConnecting != null && !OnConnecting(request.SourceNumber))
            {
                RejectRequest(request, ResponseState.NotEnoughtMoney, senderPort);
            }
            else if (targetPort == null)
            {
                RejectRequest(request, ResponseState.TargetNotExist, senderPort);
            }
            else if (targetPort.GetState == PortState.Busy)
            {
                RejectRequest(request, ResponseState.Busy, senderPort);
            }
            else if (targetPort.GetState == PortState.SwitchedOff)
            {
                RejectRequest(request, ResponseState.Offline, senderPort);
            }
            else
            {
                this._ConnectingCalls.Add(callInfo);
                AcceptRequest(request, targetPort);
            }
        }