public static void updateCDR(ActorSystem system, SipServletMessage message, CallStateChanged.State state) { CallDetailRecordsDao records = daoManager.getCallDetailRecordsDao(); SipServletRequest request = null; // Update CallDetailRecord if (message instanceof SipServletResponse) { request = (SipServletRequest) getLinkedSession(message).getAttribute(B2BUA_LAST_REQUEST); } else if (message instanceof SipServletRequest) { request = (SipServletRequest) message; } CallDetailRecord callRecord = records.getCallDetailRecord((Sid) request.getSession().getAttribute(CDR_SID)); if (callRecord != null) { if(logger.isInfoEnabled()) { logger.info("CDR found! Updating"); } callRecord = callRecord.setStatus(state.name()); final DateTime now = DateTime.now(); callRecord = callRecord.setEndTime(now); int seconds; if (callRecord.getStartTime() != null) { seconds = (int) (DateTime.now().getMillis() - callRecord.getStartTime().getMillis()) / 1000; } else { seconds = 0; } callRecord = callRecord.setDuration(seconds); records.updateCallDetailRecord(callRecord); sendCallInfoStreamEvent(system, message, state); } }
map.put("phone_number_sid", DaoUtils.writeSid(cdr.getPhoneNumberSid())); map.put("status", cdr.getStatus()); map.put("start_time", DaoUtils.writeDateTime(cdr.getStartTime())); map.put("end_time", DaoUtils.writeDateTime(cdr.getEndTime())); map.put("duration", cdr.getDuration());
case BUSY: cdr = cdr.setDuration(0); cdr = cdr.setRingDuration((int) ((DateTime.now().getMillis() - cdr.getStartTime().getMillis()) / 1000)); break; case IN_PROGRESS: case COMPLETED: cdr = cdr.setEndTime(DateTime.now()); cdr = cdr.setDuration((int) ((DateTime.now().getMillis() - cdr.getStartTime().getMillis()) / 1000)); break;
callRecord = callRecord.setEndTime(now); int seconds; if (callRecord.getStartTime() != null) { seconds = (int) (DateTime.now().getMillis() - callRecord.getStartTime().getMillis()) / 1000; } else { seconds = 0; final DateTime now = DateTime.now(); callRecord = callRecord.setEndTime(now); final int seconds = (int) ((DateTime.now().getMillis() - callRecord.getStartTime().getMillis()) / 1000); callRecord = callRecord.setDuration(seconds);
cdr = message.getOnHold() == null ? cdr : cdr.setOnHold(message.getOnHold()); cdr = message.getMsId() == null ? cdr : cdr.setMsId(message.getMsId()); cdr = message.upateDuration() ? cdr : cdr.setDuration((int) ((DateTime.now().getMillis() - cdr.getStartTime().getMillis()) / 1000)); cdr = message.updateRingDuration() ? cdr : cdr.setRingDuration((int) ((DateTime.now().getMillis() - cdr.getStartTime().getMillis()) / 1000));
@Override public String toString() { return "CDR SID: "+getSid()+" | InstanceId: "+getInstanceId()+" | ParentCallSid: "+getParentCallSid()+" | ConferenceSid: "+getConferenceSid()+" | DateCreated: "+getDateCreated()+" | DateUpdated: "+getDateUpdated()+" | AccountSid: "+getAccountSid()+" | To: "+getTo()+" | From: "+getFrom() +" | PhoneNumberSid: "+getPhoneNumberSid()+" | Status: "+getStatus()+" | StartTime: "+getStartTime()+" | EndTime: "+getEndTime()+" | Duration: "+getDuration()+" | Price: "+getPrice()+" | PriceUnit: "+getPriceUnit()+" | Direction: "+getDirection()+" | AnsweredBy: "+getAnsweredBy() +" | ApiVersion: "+getApiVersion()+" | ForwaredFrom: "+getForwardedFrom()+" | CallerName: "+getCallerName()+" | Uri: "+getUri()+" | CallPath: "+getCallPath()+" | RingDuration: "+getRingDuration()+" | Muted: "+isMuted()+" | StartConferenceOnEnter: "+isStartConferenceOnEnter() +" | isEndConferenceOnExit: "+ isEndConferenceOnExit()+" | isOnHold: "+isOnHold(); }
@Override public JsonElement serialize(final CallDetailRecord cdr, Type type, final JsonSerializationContext context) { final JsonObject object = new JsonObject(); writeSid(cdr.getSid(), object); writeInstanceId(cdr.getInstanceId(), object); writeDateCreated(cdr.getDateCreated(), object); writeDateUpdated(cdr.getDateUpdated(), object); writeParentCallSid(cdr.getParentCallSid(), object); writeAccountSid(cdr.getAccountSid(), object); writeTo(cdr.getTo(), object); writeFrom(cdr.getFrom(), object); writePhoneNumberSid(cdr.getPhoneNumberSid(), object); writeStatus(cdr.getStatus(), object); writeStartTime(cdr.getStartTime(), object); writeEndTime(cdr.getEndTime(), object); writeDuration(cdr.getDuration(), object); writePriceUnit(cdr.getPriceUnit(), object); writeDirection(cdr.getDirection(), object); writeAnsweredBy(cdr.getAnsweredBy(), object); writeApiVersion(cdr.getApiVersion(), object); writeForwardedFrom(cdr.getForwardedFrom(), object); writeCallerName(cdr.getCallerName(), object); writeUri(cdr.getUri(), object); writeRingDuration(cdr.getRingDuration(), object); writeSubResources(cdr, object); return object; }
@Override public void marshal(final Object object, final HierarchicalStreamWriter writer, final MarshallingContext context) { final CallDetailRecord cdr = (CallDetailRecord) object; writer.startNode("Call"); writeSid(cdr.getSid(), writer); writeInstanceId(cdr.getInstanceId(), writer); writeDateCreated(cdr.getDateCreated(), writer); writeDateUpdated(cdr.getDateUpdated(), writer); writeParentCallSid(cdr.getParentCallSid(), writer); writeAccountSid(cdr.getAccountSid(), writer); writeTo(cdr.getTo(), writer); writeFrom(cdr.getFrom(), writer); writePhoneNumberSid(cdr.getPhoneNumberSid(), writer); writeStatus(cdr.getStatus(), writer); writeStartTime(cdr.getStartTime(), writer); writeEndTime(cdr.getEndTime(), writer); writeDuration(cdr.getDuration(), writer); writePrice(cdr.getPrice(), writer); writePriceUnit(cdr.getPriceUnit(), writer); writeDirection(cdr.getDirection(), writer); writeAnsweredBy(cdr.getAnsweredBy(), writer); writeApiVersion(cdr.getApiVersion(), writer); writeForwardedFrom(cdr.getForwardedFrom(), writer); writeCallerName(cdr.getCallerName(), writer); writeUri(cdr.getUri(), writer); writeSubResources(cdr, writer); writeRingDuration(cdr.getRingDuration(), writer); writer.endNode(); }