/* * GnuDialer - Complete, free predictive dialer * * Complete, free predictive dialer for contact centers. * * Copyright (C) 2003-2008, GnuDialer Project * * Heath Schultz * Richard Lyman * * This program is free software, distributed under the terms of * the GNU General Public License. */ #include #include "newstats.h" #include "post.h" int main() { excludeClosers = false; Post TheFields("text/html"); std::cout << "Content-type: text/html\n" << std::endl; std::cout << "Statistics\n"; std::cout << "\n\n"; std::string mode = TheFields.GetField("statsmode"); std::string selection = TheFields.GetField("selection"); std::cout << "\n"; startMon = atoi(TheFields.GetField("mon1").c_str()); startDay = atoi(TheFields.GetField("day1").c_str()); startYear = atoi(TheFields.GetField("year1").c_str()); endMon = atoi(TheFields.GetField("mon2").c_str()); endDay = atoi(TheFields.GetField("day2").c_str()); endYear = atoi(TheFields.GetField("year2").c_str()); // for mysql lookup std::string mon1 = TheFields.GetField("mon1"); std::string day1 = TheFields.GetField("day1"); std::string year1 = TheFields.GetField("year1"); std::string date1 = "'" + year1 + "-" + mon1 + "-" + day1 + "'"; std::string mon2 = TheFields.GetField("mon2"); std::string day2 = TheFields.GetField("day2"); std::string year2 = TheFields.GetField("year2"); std::string date2 = "'" + year2 + "-" + mon2 + "-" + day2 + "'"; //end mysql stuff double totalTalkTime = 0, totalLoggedHours = 0; int totalUsed = 0; int size = 0; std::string temp; QueueList TheQueues; AgentList TheAgents; AgentLoginHelperList TheAgentLogins; Composite * TheComposite; if (mode == "campaign") { TheComposite = new CampaignComposite; TheAgents.ParseAgentList(); size = TheAgents.size(); TheComposite->SetName(selection); TheComposite->Parse(TheAgents); SysDayStats::LoadDateRange(selection,startMon,startDay,startYear,endMon,endDay,endYear); } if (mode == "allcampaign") { TheComposite = new CampaignComposite; TheAgents.ParseAgentList(); size = TheAgents.size(); TheComposite->SetName(selection); TheComposite->Parse(TheAgents); SysDayStats::LoadDateRange(selection,startMon,startDay,startYear,endMon,endDay,endYear); TheQueues.ParseQueues(); for (int i = 0; i < TheQueues.size(); i++) { std::string tempCampaign = TheQueues.at(i).GetName(); if (tempCampaign != selection && tempCampaign != "CLOSER" && tempCampaign != "INBOUND" && tempCampaign != "DNC") { TheComposite->SetName(tempCampaign); TheComposite->Parse(TheAgents); SysDayStats::LoadDateRange(tempCampaign,startMon,startDay,startYear,endMon,endDay,endYear); } } } else if (mode == "agent") { TheComposite = new AgentComposite; TheQueues.ParseQueues(); size = TheQueues.size(); TheComposite->SetNumber(selection); TheComposite->Parse(TheQueues); TheAgentLogins.Parse(); } else { TheComposite = new CampaignComposite; TheAgents.ParseAgentList(); size = TheAgents.size(); TheComposite->SetName(selection); TheComposite->Parse(TheAgents); } Composite & TheStats = (*TheComposite); if (mode == "agent") { std::cout << "Agent " << selection << ": "; std::cout << startMon << "-" << startDay << "-" << startYear; std::cout << " thru " << endMon << "-" << endDay << "-" << endYear; std::cout << "

\n"; totalTalkTime = static_cast(TheStats.GetTalkTime()); totalLoggedHours = static_cast(TheAgentLogins.where(atoi(selection.c_str())).GetTimeLogged()); std::cout << "Logged Hours: " << formatHours(TheAgentLogins.where(atoi(selection.c_str())).GetTimeLogged()); if (totalLoggedHours) { std::cout << "

Talk Percent: " << formatDouble((totalTalkTime / totalLoggedHours) * 100.0) << "\%"; } else { std::cout << "

Talk Percent: 0.00\%"; } std::cout << "

\n"; } if (mode == "campaign" || mode == "allcampaign") { std::cout << startMon << "-" << startDay << "-" << startYear; std::cout << " thru " << endMon << "-" << endDay << "-" << endYear; std::cout << "

\n"; } std::cout << ""; if (mode == "campaign") { std::cout << "" << std::endl; if (SysDayStats::RangeMakesSense() && (mode == "campaign" || mode == "allcampaign")) { if (SysDayStats::Size()) { std::cout << ""; } else { std::cout << "No data for date range!" << std::endl; } } std::cout << ""; double __calls = static_cast(SysDayStats::Calls()); double __noans = static_cast(SysDayStats::NoAnswers()); double __nobus = static_cast(SysDayStats::Busies()); double __nocon = static_cast(SysDayStats::Congestions()); double __nodis = static_cast(SysDayStats::Disconnects()); double na_perc = __noans / __calls * 100.00; double __agcal = static_cast(TheStats.TotalCalls()); double __agnoa = static_cast(TheStats.NumDispos("2")); double __agans = static_cast(TheStats.NumDispos("3")); double __agbus = static_cast(TheStats.NumDispos("4")); double __agcon = static_cast(TheStats.NumDispos("5")); double __agdis = static_cast(TheStats.NumDispos("7")); double __aginv = static_cast(TheStats.NumDispos("9")); double aa_perc = __agans / __agcal * 100.00; double nc_totl = __noans + __nobus + __nocon + __nodis + __agnoa + __agbus + __agcon + __agdis + __aginv; double nc_perc = nc_totl / __calls * 100.00; std::cout << ""; std::cout << "" << std::endl; std::cout << "" << std::endl; std::cout << "" << std::endl; //mysql lookup stuff std::string querywhen = " (LEFT(calldate,10) >= STR_TO_DATE(" + date1 + ", '%Y-%m-%d') AND LEFT(calldate,10) <= STR_TO_DATE(" + date2 + ", '%Y-%m-%d')) "; MYSQL *mysql = NULL; MYSQL_RES *result; MYSQL_ROW row; std::string query; int totalAnswers = 0; int shortAnswers = 0; double sd_perc = 0.0; mysql = mysql_init(NULL); if (mysql == NULL) { std::cerr << "MySql init failed!" << std::endl; } if (!mysql_real_connect(mysql, "localhost", \ "asterisk", \ "1234", \ "asterisk", \ 3306, NULL, 0)) \ { \ std::cerr << "MySql connection failed!" << std::endl; std::cout << "MySql connection failed!" << std::endl; } query = "SELECT COUNT(*),disposition,SUM(billsec),LEFT(calldate,10) FROM cdr WHERE " + querywhen + " GROUP BY disposition "; // std::cout << query << "
"; if (mysql_query(mysql, query.c_str()) != 0) { //std::cout << "
Error selecting filter!
" << std::endl; } else { result = mysql_use_result(mysql); row = mysql_fetch_row(result); // if (row[1].c_str() == "ANSWERED") // { totalAnswers = stoi(row[0]); //std::cout << ""; // } mysql_free_result(result); } query = "SELECT COUNT(*),disposition,SUM(billsec),LEFT(calldate,10) FROM cdr WHERE " + querywhen + " AND duration < 7 GROUP BY disposition "; // std::cout << query << "
"; if (mysql_query(mysql, query.c_str()) != 0) { //std::cout << "
Error selecting filter!
" << std::endl; } else { result = mysql_use_result(mysql); row = mysql_fetch_row(result); // if (row[1].c_str() == "ANSWERED") // { shortAnswers = stoi(row[0]); //std::cout << ""; // } mysql_free_result(result); } // std::cout << shortAnswers << "
"; // std::cout << totalAnswers << "
"; double __shans = static_cast(shortAnswers); double __totans = static_cast(totalAnswers); sd_perc = __shans / __totans * 100.00; std::cout << "" << std::endl; //end mysql stuff std::cout << "
" << selection << "   " << std::endl; } if (mode == "allcampaign") { std::cout << "
All_Campaigns   " << std::endl; } std::cout << cell() << "Calls" << nbspx3() << std::endl; if (TheFields.HasField("callback")) std::cout << cell() << "Abn /CB" << nbspx3() << std::endl; if (TheFields.HasField("noanswer")) std::cout << cell() << "No Ans" << nbspx3() << std::endl; if (TheFields.HasField("voicemail")) std::cout << cell() << "VM" << nbspx3() << std::endl; if (TheFields.HasField("busy")) std::cout << cell() << "Busy" << nbspx3() << std::endl; if (TheFields.HasField("fastbusy")) std::cout << cell() << "Cong" << nbspx3() << std::endl; if (TheFields.HasField("fax")) std::cout << cell() << "Fax" << nbspx3() << std::endl; if (TheFields.HasField("disconnect")) std::cout << cell() << "Disc" << nbspx3() << std::endl; if (TheFields.HasField("donotcall")) std::cout << cell() << "DNC" << nbspx3() << std::endl; if (TheFields.HasField("invalid")) std::cout << cell() << "Inval" << nbspx3() << std::endl; if (TheFields.HasField("nosalefalse")) std::cout << cell() << "Other" << nbspx3() << std::endl; if (TheFields.HasField("nosaletrue")) std::cout << cell() << "No Sale" << nbspx3() << std::endl; if (TheFields.HasField("sale")) std::cout << cell() << "Sale" << nbspx3() << std::endl; if (TheFields.HasField("used")) std::cout << cell() << "Used" << nbspx3() << std::endl; std::cout << cell() << "Cnts" << nbspx3() << std::endl; std::cout << cell() << "TT" << nbspx3() << std::endl; std::cout << cell() << "Abn/ Cnv\%" << nbspx3() << std::endl; std::cout << cell() << "Cnts /Hr." << nbspx3() << std::endl; std::cout << cell() << "Sales /Hr." << nbspx3() << std::endl; std::cout << "
" << "   System  " << nbspx3() << std::endl; std::cout << cell() << SysDayStats::Calls() << std::endl; if (TheFields.HasField("callback")) std::cout << cell() << SysDayStats::Abandons() << std::endl; if (TheFields.HasField("noanswer")) std::cout << cell() << SysDayStats::NoAnswers() << std::endl; if (TheFields.HasField("voicemail")) std::cout << cell() << SysDayStats::AnsMachs() << std::endl; if (TheFields.HasField("busy")) std::cout << cell() << SysDayStats::Busies() << std::endl; if (TheFields.HasField("fastbusy")) std::cout << cell() << SysDayStats::Congestions() << std::endl; if (TheFields.HasField("fax")) std::cout << cell() << "0" << std::endl; if (TheFields.HasField("disconnect")) std::cout << cell() << SysDayStats::Disconnects() << std::endl; if (TheFields.HasField("donotcall")) std::cout << cell() << "" << std::endl; if (TheFields.HasField("invalid")) std::cout << cell() << "" << std::endl; if (TheFields.HasField("nosalefalse")) std::cout << cell() << "" << std::endl; if (TheFields.HasField("nosaletrue")) std::cout << cell() << "" << std::endl; if (TheFields.HasField("sale")) std::cout << cell() << "" << std::endl; if (TheFields.HasField("used")) std::cout << cell() << SysDayStats::Disconnects() << std::endl; std::cout << cell() << "" << std::endl; std::cout << cell() << "" << std::endl; if (SysDayStats::Calls() > 0 && SysDayStats::Abandons() > 0) { double d_abns = static_cast(SysDayStats::Abandons()); double d_agent_calls = static_cast(TheStats.TotalCalls()); double abn_perc = d_abns / d_agent_calls * 100.00; std::cout << cell() << std::setiosflags(std::ios_base::fixed) << std::setprecision(2) << abn_perc << std::endl; } else { std::cout << cell() << "0" << std::endl; } std::cout << cell() << "" << std::endl; std::cout << cell() << "" << std::endl; std::cout << "
" << std::endl; if (mode == "agent") { std::cout << "Agent "; } else { excludeClosers = true; } std::cout << "   Agents  " << nbspx3() << std::endl; std::cout << cell() << TheStats.TotalCalls() << std::endl; if (TheFields.HasField("callback")) std::cout << cell() << TheStats.NumDispos("0") << std::endl; if (TheFields.HasField("noanswer")) std::cout << cell() << TheStats.NumDispos("2") << std::endl; if (TheFields.HasField("voicemail")) std::cout << cell() << TheStats.NumDispos("3") << std::endl; if (TheFields.HasField("busy")) std::cout << cell() << TheStats.NumDispos("4") << std::endl; if (TheFields.HasField("fastbusy")) std::cout << cell() << TheStats.NumDispos("5") << std::endl; if (TheFields.HasField("fax")) std::cout << cell() << TheStats.NumDispos("6") << std::endl; if (TheFields.HasField("disconnect")) std::cout << cell() << TheStats.NumDispos("7") << std::endl; if (TheFields.HasField("donotcall")) std::cout << cell() << TheStats.NumDispos("8") << std::endl; if (TheFields.HasField("invalid")) std::cout << cell() << TheStats.NumDispos("9") << std::endl; if (TheFields.HasField("nosalefalse")) std::cout << cell() << TheStats.NumDispos("10") << std::endl; if (TheFields.HasField("nosaletrue")) std::cout << cell() << TheStats.NumDispos("11") << std::endl; if (TheFields.HasField("sale")) std::cout << cell() << TheStats.NumDispos("12") << std::endl; totalUsed = (TheStats.NumDispos("6") + TheStats.NumDispos("7") + TheStats.NumDispos("8") + TheStats.NumDispos("9") + TheStats.NumDispos("10") + TheStats.NumDispos("11") + TheStats.NumDispos("12")); if (TheFields.HasField("used")) std::cout << cell() << totalUsed << std::endl; std::cout << cell() << TheStats.GetContacts() << std::endl; std::cout << cell() << formatHours(TheStats.GetTalkTime()) << std::endl; std::cout << cell() << formatDouble(TheStats.GetConversion()) << std::endl; std::cout << cell() << formatDouble(TheStats.GetContactsPerHour()) << std::endl; std::cout << cell() << formatDouble(TheStats.GetSalesPerHour()) << std::endl; excludeClosers = true; //was false for (int i = 0; i < size; i++) { if (mode == "campaign" || mode == "allcampaign") { temp = itos(TheAgents.at(i).GetNumber()); } else { temp = TheQueues.at(i).GetName(); } if (TheStats.GetTalkTime(temp)) { std::cout << "
\n"; if (mode == "campaign" || mode == "allcampaign") std::cout << "Agent "; std::cout << temp << nbspx3() << std::endl; std::cout << cell() << TheStats.TotalCalls(temp) << std::endl; if (TheFields.HasField("callback")) std::cout << cell() << TheStats.NumDispos("0",temp) << std::endl; if (TheFields.HasField("noanswer")) std::cout << cell() << TheStats.NumDispos("2",temp) << std::endl; if (TheFields.HasField("voicemail")) std::cout << cell() << TheStats.NumDispos("3",temp) << std::endl; if (TheFields.HasField("busy")) std::cout << cell() << TheStats.NumDispos("4",temp) << std::endl; if (TheFields.HasField("fastbusy")) std::cout << cell() << TheStats.NumDispos("5",temp) << std::endl; if (TheFields.HasField("fax")) std::cout << cell() << TheStats.NumDispos("6",temp) << std::endl; if (TheFields.HasField("disconnect")) std::cout << cell() << TheStats.NumDispos("7",temp) << std::endl; if (TheFields.HasField("donotcall")) std::cout << cell() << TheStats.NumDispos("8",temp) << std::endl; if (TheFields.HasField("invalid")) std::cout << cell() << TheStats.NumDispos("9",temp) << std::endl; if (TheFields.HasField("nosalefalse")) std::cout << cell() << TheStats.NumDispos("10",temp) << std::endl; if (TheFields.HasField("nosaletrue")) std::cout << cell() << TheStats.NumDispos("11",temp) << std::endl; if (TheFields.HasField("sale")) std::cout << cell() << TheStats.NumDispos("12",temp) << std::endl; totalUsed = (TheStats.NumDispos("6",temp) + TheStats.NumDispos("7",temp) + TheStats.NumDispos("8",temp) + TheStats.NumDispos("9",temp) + TheStats.NumDispos("10",temp) + TheStats.NumDispos("11",temp) + TheStats.NumDispos("12",temp)); if (TheFields.HasField("used")) std::cout << cell() << totalUsed << std::endl; std::cout << cell() << TheStats.GetContacts(temp) << std::endl; std::cout << cell() << formatHours(TheStats.GetTalkTime(temp)) << std::endl; std::cout << cell() << formatDouble(TheStats.GetConversion(temp)) << std::endl; std::cout << cell() << formatDouble(TheStats.GetContactsPerHour(temp)) << std::endl; std::cout << cell() << formatDouble(TheStats.GetSalesPerHour(temp)) << std::endl; } } std::cout << "
Sys-NoAnsr/Calls" << std::setiosflags(std::ios_base::fixed) << std::setprecision(2) << na_perc << "
Agt-AnsM/AgCalls" << std::setiosflags(std::ios_base::fixed) << std::setprecision(2) << aa_perc << "
All-NonCmp/Calls" << std::setiosflags(std::ios_base::fixed) << std::setprecision(2) << nc_perc << "
" << row[0] << "" << row[0] << "
ShortAns/TotalAns" << std::setiosflags(std::ios_base::fixed) << std::setprecision(2) << sd_perc << "
\n"; std::cout << "
\n"; std::cout << ""; std::cout << ""; std::cout << "
"; std::cout << "\n"; return 0; }