public VoipCall GetCall(string callId)
        {
            var result = new VoipCall {
                Id = callId
            };
            var count = 6;

            while (count > 0)
            {
                try
                {
                    var call = CallResource.Fetch(result.Id, client: client);
                    if (!call.Price.HasValue || string.IsNullOrEmpty(call.Duration))
                    {
                        count--;
                        Thread.Sleep(10000);
                        continue;
                    }

                    result.Price        = (-1) * call.Price.Value;
                    result.DialDuration = Convert.ToInt32(call.Duration);
                    break;
                }
                catch (ApiException)
                {
                    count--;
                    Thread.Sleep(10000);
                }
            }

            return(result);
        }
Beispiel #2
0
        public void AnswerCall(VoipCall call)
        {
            call.AnsweredBy = _securityContext.CurrentAccount.ID;
            call.Status     = VoipCallStatus.Answered;

            _daoFactory.GetVoipDao().SaveOrUpdateCall(call);
        }
Beispiel #3
0
        internal VoiceResponse Inbound(VoipCall call, DaoFactory daoFactory)
        {
            var contactPhone = call.Status == VoipCallStatus.Incoming || call.Status == VoipCallStatus.Answered
                ? call.From
                : call.To;

            Contact contact;
            var     contacts = new VoipEngine(daoFactory).GetContacts(contactPhone, daoFactory);
            var     managers = contacts.SelectMany(CRMSecurity.GetAccessSubjectGuidsTo).ToList();
            var     agent    = GetSignalRHelper().GetAgent(managers);

            if (agent != null && agent.Item1 != null)
            {
                var agentId = agent.Item1.Id;
                SecurityContext.AuthenticateMe(agentId);
                call.AnsweredBy = agentId;

                contact = contacts.FirstOrDefault(CRMSecurity.CanAccessTo);

                daoFactory.VoipDao.SaveOrUpdateCall(call);
            }
            else
            {
                contact = contacts.FirstOrDefault();
            }

            if (contact == null)
            {
                contact        = new VoipEngine(daoFactory).CreateContact(call.From.TrimStart('+'));
                call.ContactId = contact.ID;
                daoFactory.VoipDao.SaveOrUpdateCall(call);
            }

            return(GetTwilioResponseHelper().Inbound(agent));
        }
Beispiel #4
0
        private static VoipCall ToCall(object[] r)
        {
            var call = new VoipCall
            {
                Id           = (string)r[0],
                ParentID     = (string)r[1],
                From         = (string)r[2],
                To           = (string)r[3],
                AnsweredBy   = new Guid((string)r[4]),
                DialDate     = TenantUtil.DateTimeFromUtc(Convert.ToDateTime(r[5])),
                DialDuration = Convert.ToInt32(r[6] ?? "0"),
                Price        = Convert.ToDecimal(r[7]),
                Status       = (VoipCallStatus)Convert.ToInt32(r[8]),
                VoipRecord   = new VoipRecord
                {
                    Id       = (string)r[9],
                    Uri      = (string)r[10],
                    Duration = Convert.ToInt32(r[11] ?? "0"),
                    Price    = Convert.ToDecimal(r[12])
                },
                ContactId        = Convert.ToInt32(r[13]),
                ContactIsCompany = Convert.ToBoolean(r[14])
            };

            if (call.ContactId != 0)
            {
                call.ContactTitle = call.ContactIsCompany
                                        ? r[15] == null ? null : Convert.ToString(r[15])
                                        : r[16] == null || r[17] == null ? null :
                                    string.Format("{0} {1}", Convert.ToString(r[16]), Convert.ToString(r[17]));
            }

            return(call);
        }
Beispiel #5
0
        private VoipCall ToCall(CallContact dbVoipCall)
        {
            var call = new VoipCall
            {
                Id           = dbVoipCall.DbVoipCall.Id,
                ParentID     = dbVoipCall.DbVoipCall.ParentCallId,
                From         = dbVoipCall.DbVoipCall.NumberFrom,
                To           = dbVoipCall.DbVoipCall.NumberTo,
                AnsweredBy   = dbVoipCall.DbVoipCall.AnsweredBy,
                DialDate     = TenantUtil.DateTimeFromUtc(dbVoipCall.DbVoipCall.DialDate),
                DialDuration = dbVoipCall.DbVoipCall.DialDuration,
                Price        = dbVoipCall.DbVoipCall.Price,
                Status       = (VoipCallStatus)dbVoipCall.DbVoipCall.Status,
                VoipRecord   = new VoipRecord
                {
                    Id       = dbVoipCall.DbVoipCall.RecordSid,
                    Uri      = dbVoipCall.DbVoipCall.RecordUrl,
                    Duration = dbVoipCall.DbVoipCall.RecordDuration,
                    Price    = dbVoipCall.DbVoipCall.RecordPrice
                },
                ContactId        = dbVoipCall.CrmContact.Id,
                ContactIsCompany = dbVoipCall.CrmContact.IsCompany,
            };

            if (call.ContactId != 0)
            {
                call.ContactTitle = call.ContactIsCompany
                                        ? dbVoipCall.CrmContact.CompanyName
                                        : dbVoipCall.CrmContact.FirstName == null || dbVoipCall.CrmContact.LastName == null ? null : string.Format("{0} {1}", dbVoipCall.CrmContact.FirstName, dbVoipCall.CrmContact.LastName);
            }

            return(call);
        }
Beispiel #6
0
        public Contact GetContact(VoipCall call)
        {
            if (call.ContactId != 0)
            {
                return(null);
            }

            var contactPhone = call.Status == VoipCallStatus.Incoming || call.Status == VoipCallStatus.Answered ? call.From : call.To;

            var newContactIds = _daoFactory.GetContactDao().GetContactIDsByContactInfo(ContactInfoType.Phone, contactPhone.TrimStart('+'), null, true);

            foreach (var newContactId in newContactIds)
            {
                if (newContactId != 0)
                {
                    var existContact = _daoFactory.GetContactDao().GetByID(newContactId);
                    if (_crmSecurity.CanAccessTo(existContact))
                    {
                        call.ContactId = newContactId;
                        return(existContact);
                    }
                }
            }

            return(null);
        }
Beispiel #7
0
        public VoipCall SaveOrUpdateCall(VoipCall call)
        {
            using (var db = GetDb())
            {
                var query = Insert(callsTable)
                            .InColumnValue("id", call.Id)
                            .InColumnValue("number_from", call.From)
                            .InColumnValue("number_to", call.To)
                            .InColumnValue("status", call.Status)
                            .InColumnValue("contact_id", call.ContactId);

                if (!call.AnsweredBy.Equals(Guid.Empty))
                {
                    query.InColumnValue("answered_by", call.AnsweredBy);
                }

                if (call.DialDate == DateTime.MinValue)
                {
                    call.DialDate = DateTime.UtcNow;
                }

                query.InColumnValue("dial_date", TenantUtil.DateTimeToUtc(call.DialDate));

                if (call.Price > 0)
                {
                    query.InColumnValue("price", call.Price);
                }

                db.ExecuteNonQuery(query);
            }

            return(call);
        }
Beispiel #8
0
        private void GetPriceAndDuration(VoipCall call)
        {
            var provider   = _voipDao.GetProvider();
            var twilioCall = provider.GetCall(call.Id);

            call.Price        = twilioCall.Price;
            call.DialDuration = twilioCall.DialDuration;
        }
        public void StopVoip()
        {
            if (VoipCall != null)
            {
                VoipCall.NotifyCallEnded();
                VoipCall = null;
            }

            Hub.Instance.VoipTaskInstance?.CloseVoipTask();
        }
Beispiel #10
0
 public VoipCallWrapper(VoipCall call, ContactWrapper contact = null)
 {
     Id           = call.Id;
     From         = call.From;
     To           = call.To;
     Status       = call.Status;
     AnsweredBy   = EmployeeWraper.Get(call.AnsweredBy);
     DialDate     = new ApiDateTime(call.DialDate);
     DialDuration = call.DialDuration;
     Cost         = call.TotalPrice;
     Contact      = contact;
     History      = call.History.Select(h => new VoipCallHistoryWrapper(h));
 }
        public VoipCallWrapper(VoipCall call, ContactWrapper contact = null)
        {
            Id             = call.Id;
            From           = call.From;
            To             = call.To;
            Status         = call.Status;
            AnsweredBy     = EmployeeWraper.Get(call.AnsweredBy);
            DialDate       = new ApiDateTime(call.DialDate);
            DialDuration   = call.DialDuration;
            Cost           = call.Price + call.ChildCalls.Sum(r => r.Price) + call.VoipRecord.Price;
            Contact        = contact;
            RecordUrl      = call.VoipRecord.Uri;
            RecordDuration = call.VoipRecord.Duration;

            if (call.ChildCalls.Any())
            {
                Calls = call.ChildCalls.Select(childCall => new VoipCallWrapper(childCall));
            }
        }
        public void StartOutgoingCall(OutgoingCallRequest request)
        {
            var capabilities = VoipPhoneCallMedia.Audio;

            if (request.VideoEnabled)
            {
                capabilities |= VoipPhoneCallMedia.Video;
            }
            var vCC = VoipCallCoordinator.GetDefault();

            VoipCall = vCC.RequestNewOutgoingCall(request.PeerUserId, request.PeerUserId, "ChatterBox Universal",
                                                  capabilities);
            if (VoipCall != null)
            {
                SubscribeToVoipCallEvents();

                VoipCall.NotifyCallActive();
            }
        }
Beispiel #13
0
        public void AddHistoryToCallContact(VoipCall call, DaoFactory daoFactory)
        {
            var listItemDao = daoFactory.GetListItemDao();

            if (call == null || call.ContactId == 0)
            {
                return;
            }

            var category = listItemDao.GetByTitle(ListType.HistoryCategory, CRMCommonResource.HistoryCategory_Call);

            if (category == null)
            {
                category    = new ListItem(CRMCommonResource.HistoryCategory_Call, "event_category_call.png");
                category.ID = listItemDao.CreateItem(ListType.HistoryCategory, category);
            }

            var contact = daoFactory.GetContactDao().GetByID(call.ContactId);

            if (contact != null && _crmSecurity.CanAccessTo(contact))
            {
                var note = call.Status == VoipCallStatus.Incoming || call.Status == VoipCallStatus.Answered
                    ? CRMContactResource.HistoryVoipIncomingNote
                    : CRMContactResource.HistoryVoipOutcomingNote;
                var content = string.Format(note, call.DialDuration);

                var relationshipEvent = new RelationshipEvent
                {
                    CategoryID = category.ID,
                    EntityType = EntityType.Any,
                    EntityID   = 0,
                    Content    = content,
                    ContactID  = contact.ID,
                    CreateOn   = _tenantUtil.DateTimeFromUtc(DateTime.UtcNow),
                    CreateBy   = _securityContext.CurrentAccount.ID
                };

                daoFactory.GetRelationshipEventDao().CreateItem(relationshipEvent);
            }
        }
Beispiel #14
0
        public VoipCall GetCall(string callId)
        {
            var result = new VoipCall {
                Id = callId
            };
            var count = 6;

            while (count > 0)
            {
                var call = client.GetCall(result.Id);
                if (!call.Price.HasValue || !call.Duration.HasValue)
                {
                    count--;
                    Thread.Sleep(10000);
                    continue;
                }

                result.Price        = (-1) * call.Price.Value;
                result.DialDuration = call.Duration.Value;
                break;
            }

            return(result);
        }
Beispiel #15
0
        public VoipCall SaveOrUpdateCall(VoipCall call)
        {
            using (var db = GetDb())
            {
                var query = Insert(callsTable)
                    .InColumnValue("id", call.Id)
                    .InColumnValue("number_from", call.From)
                    .InColumnValue("number_to", call.To)
                    .InColumnValue("status", call.Status)
                    .InColumnValue("contact_id", call.ContactId);

                if (!call.AnsweredBy.Equals(Guid.Empty))
                {
                    query.InColumnValue("answered_by", call.AnsweredBy);
                }

                if (call.DialDate == DateTime.MinValue)
                {
                    call.DialDate = DateTime.UtcNow;
                }

                query.InColumnValue("dial_date", TenantUtil.DateTimeToUtc(call.DialDate));

                if (call.Price > 0)
                {
                    query.InColumnValue("price", call.Price);
                }

                db.ExecuteNonQuery(query);
            }

            return call;
        }
Beispiel #16
0
        public VoipCall SaveOrUpdateCall(VoipCall call)
        {
            using (var db = GetDb())
            {
                var query = Insert("crm_voip_calls")
                            .InColumnValue("id", call.Id)
                            .InColumnValue("number_from", call.From)
                            .InColumnValue("number_to", call.To)
                            .InColumnValue("contact_id", call.ContactId);

                if (!string.IsNullOrEmpty(call.ParentID))
                {
                    query.InColumnValue("parent_call_id", call.ParentID);
                }

                if (call.Status.HasValue)
                {
                    query.InColumnValue("status", call.Status.Value);
                }

                if (!call.AnsweredBy.Equals(Guid.Empty))
                {
                    query.InColumnValue("answered_by", call.AnsweredBy);
                }

                if (call.DialDate == DateTime.MinValue)
                {
                    call.DialDate = DateTime.UtcNow;
                }

                query.InColumnValue("dial_date", TenantUtil.DateTimeToUtc(call.DialDate));

                if (call.DialDuration > 0)
                {
                    query.InColumnValue("dial_duration", call.DialDuration);
                }
                if (call.Price > Decimal.Zero)
                {
                    query.InColumnValue("price", call.Price);
                }

                if (call.VoipRecord != null)
                {
                    if (!string.IsNullOrEmpty(call.VoipRecord.Id))
                    {
                        query.InColumnValue("record_sid", call.VoipRecord.Id);
                    }
                    if (!string.IsNullOrEmpty(call.VoipRecord.Uri))
                    {
                        query.InColumnValue("record_url", call.VoipRecord.Uri);
                    }

                    if (call.VoipRecord.Duration != 0)
                    {
                        query.InColumnValue("record_duration", call.VoipRecord.Duration);
                    }

                    if (call.VoipRecord.Price != default(decimal))
                    {
                        query.InColumnValue("record_price", call.VoipRecord.Price);
                    }
                }

                db.ExecuteNonQuery(query);
            }

            return(call);
        }
Beispiel #17
0
        public VoipCall SaveOrUpdateCall(VoipCall call)
        {
            var voipCall = new DbVoipCall
            {
                TenantId   = TenantID,
                Id         = call.Id,
                NumberFrom = call.From,
                NumberTo   = call.To,
                ContactId  = call.ContactId
            };

            if (!string.IsNullOrEmpty(call.ParentID))
            {
                voipCall.ParentCallId = call.ParentID;
            }

            if (call.Status.HasValue)
            {
                voipCall.Status = (int)call.Status.Value;
            }

            if (!call.AnsweredBy.Equals(Guid.Empty))
            {
                voipCall.AnsweredBy = call.AnsweredBy;
            }

            if (call.DialDate == DateTime.MinValue)
            {
                call.DialDate = DateTime.UtcNow;
            }

            voipCall.DialDate = TenantUtil.DateTimeToUtc(call.DialDate);

            if (call.DialDuration > 0)
            {
                voipCall.DialDuration = call.DialDuration;
            }

            if (call.Price > decimal.Zero)
            {
                voipCall.Price = call.Price;
            }

            if (call.VoipRecord != null)
            {
                if (!string.IsNullOrEmpty(call.VoipRecord.Id))
                {
                    voipCall.RecordSid = call.VoipRecord.Id;
                }

                if (!string.IsNullOrEmpty(call.VoipRecord.Uri))
                {
                    voipCall.RecordUrl = call.VoipRecord.Uri;
                }

                if (call.VoipRecord.Duration != 0)
                {
                    voipCall.RecordDuration = call.VoipRecord.Duration;
                }

                if (call.VoipRecord.Price != default)
                {
                    voipCall.RecordPrice = call.VoipRecord.Price;
                }
            }

            VoipDbContext.VoipCalls.Add(voipCall);
            VoipDbContext.SaveChanges();

            return(call);
        }
Beispiel #18
0
        public VoipCall SaveOrUpdateCall(VoipCall callHistory)
        {
            var dao  = _daoFactory.GetVoipDao();
            var call = dao.GetCall(callHistory.Id) ?? callHistory;

            if (string.IsNullOrEmpty(call.ParentID))
            {
                GetContact(call);
            }

            if (!callHistory.AnsweredBy.Equals(Guid.Empty))
            {
                call.AnsweredBy = callHistory.AnsweredBy;
            }

            if (!callHistory.Date.Equals(default(DateTime)))
            {
                call.Date = callHistory.Date;
            }

            if (!callHistory.EndDialDate.Equals(default(DateTime)))
            {
                call.EndDialDate = callHistory.EndDialDate;
            }

            if (call.Price == 0 && callHistory.Price != default(decimal))
            {
                call.Price = callHistory.Price;
            }

            if (call.DialDuration == 0)
            {
                call.DialDuration = callHistory.DialDuration;
            }

            if (call.VoipRecord == null)
            {
                call.VoipRecord = new VoipRecord();
            }

            if (string.IsNullOrEmpty(call.VoipRecord.Id))
            {
                call.VoipRecord.Id = callHistory.VoipRecord.Id;
            }

            if (call.VoipRecord.Price == default(decimal))
            {
                call.VoipRecord.Price = callHistory.VoipRecord.Price;
            }

            if (string.IsNullOrEmpty(call.VoipRecord.Uri))
            {
                call.VoipRecord.Uri = callHistory.VoipRecord.Uri;
            }

            if (call.VoipRecord.Duration == 0)
            {
                call.VoipRecord.Duration = callHistory.VoipRecord.Duration;
            }

            if (callHistory.Status.HasValue)
            {
                call.Status = callHistory.Status;
            }

            return(dao.SaveOrUpdateCall(call));
        }
 private void Call_AnswerRequested(VoipPhoneCall sender, CallAnswerEventArgs args)
 {
     VoipCall.NotifyCallActive();
     Hub.Instance.VoipChannel.Answer();
 }
Beispiel #20
0
        private static VoipCall ToCall(object[] r)
        {
            var call = new VoipCall
                {
                    Id = (string)r[0],
                    From = (string)r[1],
                    To = (string)r[2],
                    AnsweredBy = new Guid((string)r[3]),
                    DialDate = TenantUtil.DateTimeFromUtc(Convert.ToDateTime(r[4])),
                    Price = Convert.ToDecimal(r[5]),
                    Status = (VoipCallStatus)Convert.ToInt32(r[6]),
                    ContactId = Convert.ToInt32(r[7]),
                    ContactIsCompany = Convert.ToBoolean(r[8])
                };

            if (call.ContactId != 0)
            {
                call.ContactTitle = call.ContactIsCompany
                                        ? r[9] == null ? null : Convert.ToString(r[9])
                                        : r[10] == null || r[11] == null ? null :
                                              string.Format("{0} {1}", Convert.ToString(r[10]), Convert.ToString(r[11]));
            }

            return call;
        }