Version 20.54: Mar 30, 2021 Statistics about agendas.

This commit is contained in:
acanas 2021-03-30 14:45:37 +02:00
parent ff125a81de
commit fb564b58cf
13 changed files with 238 additions and 137 deletions

View File

@ -1870,7 +1870,7 @@ unsigned Agd_GetNumEventsFromUsr (long UsrCod)
unsigned Agd_GetNumUsrsWithEvents (Hie_Lvl_Level_t Scope) unsigned Agd_GetNumUsrsWithEvents (Hie_Lvl_Level_t Scope)
{ {
/***** Get number of courses with events from database *****/ /***** Get number of users with events from database *****/
switch (Scope) switch (Scope)
{ {
case Hie_Lvl_SYS: case Hie_Lvl_SYS:
@ -1893,7 +1893,6 @@ unsigned Agd_GetNumUsrsWithEvents (Hie_Lvl_Level_t Scope)
" AND ins_instits.InsCod=ctr_centers.InsCod" " AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=agd_agendas.UsrCod", " AND crs_users.UsrCod=agd_agendas.UsrCod",
Gbl.Hierarchy.Cty.CtyCod); Gbl.Hierarchy.Cty.CtyCod);
@ -1909,7 +1908,6 @@ unsigned Agd_GetNumUsrsWithEvents (Hie_Lvl_Level_t Scope)
" WHERE ctr_centers.InsCod=%ld" " WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=agd_agendas.UsrCod", " AND crs_users.UsrCod=agd_agendas.UsrCod",
Gbl.Hierarchy.Ins.InsCod); Gbl.Hierarchy.Ins.InsCod);
@ -1923,7 +1921,6 @@ unsigned Agd_GetNumUsrsWithEvents (Hie_Lvl_Level_t Scope)
"agd_agendas" "agd_agendas"
" WHERE deg_degrees.CtrCod=%ld" " WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=agd_agendas.UsrCod", " AND crs_users.UsrCod=agd_agendas.UsrCod",
Gbl.Hierarchy.Ctr.CtrCod); Gbl.Hierarchy.Ctr.CtrCod);
@ -1935,7 +1932,6 @@ unsigned Agd_GetNumUsrsWithEvents (Hie_Lvl_Level_t Scope)
"crs_users," "crs_users,"
"agd_agendas" "agd_agendas"
" WHERE crs_courses.DegCod=%ld" " WHERE crs_courses.DegCod=%ld"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=crs_users.CrsCod" " AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=agd_agendas.UsrCod", " AND crs_users.UsrCod=agd_agendas.UsrCod",
Gbl.Hierarchy.Deg.DegCod); Gbl.Hierarchy.Deg.DegCod);
@ -1974,57 +1970,61 @@ unsigned Agd_GetNumEvents (Hie_Lvl_Level_t Scope)
return (unsigned) return (unsigned)
DB_QueryCOUNT ("can not get number of events", DB_QueryCOUNT ("can not get number of events",
"SELECT COUNT(*)" "SELECT COUNT(*)"
" FROM ins_instits," " FROM (SELECT DISTINCT crs_users.UsrCod"
"ctr_centers," " FROM ins_instits,"
"deg_degrees," "ctr_centers,"
"crs_courses," "deg_degrees,"
"crs_users," "crs_courses,"
"crs_users"
" WHERE ins_instits.CtyCod=%ld"
" AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod) AS users,"
"agd_agendas" "agd_agendas"
" WHERE ins_instits.CtyCod=%ld" " WHERE users.UsrCod=agd_agendas.UsrCod",
" AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=agd_agendas.UsrCod",
Gbl.Hierarchy.Cty.CtyCod); Gbl.Hierarchy.Cty.CtyCod);
case Hie_Lvl_INS: case Hie_Lvl_INS:
return (unsigned) return (unsigned)
DB_QueryCOUNT ("can not get number of events", DB_QueryCOUNT ("can not get number of events",
"SELECT COUNT(*)" "SELECT COUNT(*)"
" FROM ctr_centers," " FROM (SELECT DISTINCT crs_users.UsrCod"
"deg_degrees," " FROM ctr_centers,"
"crs_courses," "deg_degrees,"
"crs_users," "crs_courses,"
"crs_users"
" WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod) AS users,"
"agd_agendas" "agd_agendas"
" WHERE ctr_centers.InsCod=%ld" " WHERE users.UsrCod=agd_agendas.UsrCod",
" AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=agd_agendas.UsrCod",
Gbl.Hierarchy.Ins.InsCod); Gbl.Hierarchy.Ins.InsCod);
case Hie_Lvl_CTR: case Hie_Lvl_CTR:
return (unsigned) return (unsigned)
DB_QueryCOUNT ("can not get number of events", DB_QueryCOUNT ("can not get number of events",
"SELECT COUNT(*)" "SELECT COUNT(*)"
" FROM deg_degrees," " FROM (SELECT DISTINCT crs_users.UsrCod"
"crs_courses," " FROM deg_degrees,"
"crs_users," "crs_courses,"
"crs_users"
" WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod) AS users,"
"agd_agendas" "agd_agendas"
" WHERE deg_degrees.CtrCod=%ld" " WHERE users.UsrCod=agd_agendas.UsrCod",
" AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=agd_agendas.UsrCod",
Gbl.Hierarchy.Ctr.CtrCod); Gbl.Hierarchy.Ctr.CtrCod);
case Hie_Lvl_DEG: case Hie_Lvl_DEG:
return (unsigned) return (unsigned)
DB_QueryCOUNT ("can not get number of events", DB_QueryCOUNT ("can not get number of events",
"SELECT COUNT(*)" "SELECT COUNT(*)"
" FROM crs_courses," " FROM (SELECT DISTINCT crs_users.UsrCod"
"crs_users," " FROM crs_courses,"
"crs_users"
" WHERE crs_courses.DegCod=%ld"
" AND crs_courses.CrsCod=crs_users.CrsCod) AS users,"
"agd_agendas" "agd_agendas"
" WHERE crs_courses.DegCod=%ld" " WHERE users.UsrCod=agd_agendas.UsrCod",
" AND crs_courses.CrsCod=crs_users.CrsCod"
" AND crs_users.UsrCod=agd_agendas.UsrCod",
Gbl.Hierarchy.Deg.DegCod); Gbl.Hierarchy.Deg.DegCod);
case Hie_Lvl_CRS: case Hie_Lvl_CRS:
return (unsigned) return (unsigned)

View File

@ -1896,7 +1896,6 @@ unsigned Asg_GetNumCoursesWithAssignments (Hie_Lvl_Level_t Scope)
" AND ins_instits.InsCod=ctr_centers.InsCod" " AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=asg_assignments.CrsCod", " AND crs_courses.CrsCod=asg_assignments.CrsCod",
Gbl.Hierarchy.Cty.CtyCod); Gbl.Hierarchy.Cty.CtyCod);
case Hie_Lvl_INS: case Hie_Lvl_INS:
@ -1910,7 +1909,6 @@ unsigned Asg_GetNumCoursesWithAssignments (Hie_Lvl_Level_t Scope)
" WHERE ctr_centers.InsCod=%ld" " WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=asg_assignments.CrsCod", " AND crs_courses.CrsCod=asg_assignments.CrsCod",
Gbl.Hierarchy.Ins.InsCod); Gbl.Hierarchy.Ins.InsCod);
case Hie_Lvl_CTR: case Hie_Lvl_CTR:
@ -1922,7 +1920,6 @@ unsigned Asg_GetNumCoursesWithAssignments (Hie_Lvl_Level_t Scope)
"asg_assignments" "asg_assignments"
" WHERE deg_degrees.CtrCod=%ld" " WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=asg_assignments.CrsCod", " AND crs_courses.CrsCod=asg_assignments.CrsCod",
Gbl.Hierarchy.Ctr.CtrCod); Gbl.Hierarchy.Ctr.CtrCod);
case Hie_Lvl_DEG: case Hie_Lvl_DEG:
@ -1932,7 +1929,6 @@ unsigned Asg_GetNumCoursesWithAssignments (Hie_Lvl_Level_t Scope)
" FROM crs_courses," " FROM crs_courses,"
"asg_assignments" "asg_assignments"
" WHERE crs_courses.DegCod=%ld" " WHERE crs_courses.DegCod=%ld"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=asg_assignments.CrsCod", " AND crs_courses.CrsCod=asg_assignments.CrsCod",
Gbl.Hierarchy.Deg.DegCod); Gbl.Hierarchy.Deg.DegCod);
case Hie_Lvl_CRS: case Hie_Lvl_CRS:

View File

@ -1743,7 +1743,6 @@ unsigned Att_GetNumCoursesWithAttEvents (Hie_Lvl_Level_t Scope)
" WHERE ctr_centers.InsCod=%ld" " WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=att_events.CrsCod", " AND crs_courses.CrsCod=att_events.CrsCod",
Gbl.Hierarchy.Ins.InsCod); Gbl.Hierarchy.Ins.InsCod);
break; break;
@ -1755,7 +1754,6 @@ unsigned Att_GetNumCoursesWithAttEvents (Hie_Lvl_Level_t Scope)
"att_events" "att_events"
" WHERE deg_degrees.CtrCod=%ld" " WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=att_events.CrsCod", " AND crs_courses.CrsCod=att_events.CrsCod",
Gbl.Hierarchy.Ctr.CtrCod); Gbl.Hierarchy.Ctr.CtrCod);
break; break;
@ -1765,7 +1763,6 @@ unsigned Att_GetNumCoursesWithAttEvents (Hie_Lvl_Level_t Scope)
" FROM crs_courses," " FROM crs_courses,"
"att_events" "att_events"
" WHERE crs_courses.DegCod=%ld" " WHERE crs_courses.DegCod=%ld"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=att_events.CrsCod", " AND crs_courses.CrsCod=att_events.CrsCod",
Gbl.Hierarchy.Deg.DegCod); Gbl.Hierarchy.Deg.DegCod);
break; break;

View File

@ -600,13 +600,14 @@ TODO: Salvador Romero Cort
TODO: FIX BUG, URGENT! En las fechas como parámetro Dat_WriteParamsIniEndDates(), por ejemplo al cambiar el color de la gráfica de accesos por día y hora, no se respeta la zona horaria. TODO: FIX BUG, URGENT! En las fechas como parámetro Dat_WriteParamsIniEndDates(), por ejemplo al cambiar el color de la gráfica de accesos por día y hora, no se respeta la zona horaria.
*/ */
#define Log_PLATFORM_VERSION "SWAD 20.53.1 (2021-03-30)" #define Log_PLATFORM_VERSION "SWAD 20.54 (2021-03-30)"
#define CSS_FILE "swad20.45.css" #define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.6.2.js" #define JS_FILE "swad20.6.2.js"
/* /*
TODO: Rename CENTRE to CENTER in help wiki. TODO: Rename CENTRE to CENTER in help wiki.
TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams TODO: Rename ASSESSMENT.Announcements to ASSESSMENT.Calls_for_exams
Version 20.54: Mar 30, 2021 Statistics about agendas. (309539 lines)
Version 20.53.1: Mar 30, 2021 Optimizations in database selects. (309459 lines) Version 20.53.1: Mar 30, 2021 Optimizations in database selects. (309459 lines)
Version 20.53: Mar 29, 2021 Code refactoring in database selects. (309473 lines) Version 20.53: Mar 29, 2021 Code refactoring in database selects. (309473 lines)
Version 20.52: Mar 28, 2021 Code refactoring in database selects. (309103 lines) Version 20.52: Mar 28, 2021 Code refactoring in database selects. (309103 lines)

View File

@ -31,6 +31,7 @@
#include <string.h> // For string functions #include <string.h> // For string functions
#include "swad_action.h" #include "swad_action.h"
#include "swad_agenda.h"
#include "swad_box.h" #include "swad_box.h"
#include "swad_database.h" #include "swad_database.h"
#include "swad_figure.h" #include "swad_figure.h"
@ -183,6 +184,8 @@ static void Fig_GetAndShowNumUsrsPerNotifyEvent (void);
static void Fig_GetAndShowNoticesStats (void); static void Fig_GetAndShowNoticesStats (void);
static void Fig_GetAndShowMsgsStats (void); static void Fig_GetAndShowMsgsStats (void);
static void Fig_GetAndShowAgendasStats (void);
static void Fig_GetAndShowSurveysStats (void); static void Fig_GetAndShowSurveysStats (void);
static void Fig_GetAndShowNumUsrsPerPrivacy (void); static void Fig_GetAndShowNumUsrsPerPrivacy (void);
static void Fig_GetAndShowNumUsrsPerPrivacyForAnObject (const char *TxtObject, static void Fig_GetAndShowNumUsrsPerPrivacyForAnObject (const char *TxtObject,
@ -347,6 +350,7 @@ void Fig_ShowFigures (void)
[Fig_NOTIFY_EVENTS ] = Fig_GetAndShowNumUsrsPerNotifyEvent, [Fig_NOTIFY_EVENTS ] = Fig_GetAndShowNumUsrsPerNotifyEvent,
[Fig_NOTICES ] = Fig_GetAndShowNoticesStats, [Fig_NOTICES ] = Fig_GetAndShowNoticesStats,
[Fig_MESSAGES ] = Fig_GetAndShowMsgsStats, [Fig_MESSAGES ] = Fig_GetAndShowMsgsStats,
[Fig_AGENDAS ] = Fig_GetAndShowAgendasStats,
[Fig_SOCIAL_NETWORKS ] = Net_ShowWebAndSocialNetworksStats, [Fig_SOCIAL_NETWORKS ] = Net_ShowWebAndSocialNetworksStats,
[Fig_LANGUAGES ] = Fig_GetAndShowNumUsrsPerLanguage, [Fig_LANGUAGES ] = Fig_GetAndShowNumUsrsPerLanguage,
[Fig_FIRST_DAY_OF_WEEK] = Fig_GetAndShowNumUsrsPerFirstDayOfWeek, [Fig_FIRST_DAY_OF_WEEK] = Fig_GetAndShowNumUsrsPerFirstDayOfWeek,
@ -431,7 +435,7 @@ static void Fig_GetAndShowNumUsrsInCrss (Rol_Role_t Role)
(Gbl.Scope.Current == Hie_Lvl_CTR ? Gbl.Hierarchy.Ctr.CtrCod : (Gbl.Scope.Current == Hie_Lvl_CTR ? Gbl.Hierarchy.Ctr.CtrCod :
(Gbl.Scope.Current == Hie_Lvl_DEG ? Gbl.Hierarchy.Deg.DegCod : (Gbl.Scope.Current == Hie_Lvl_DEG ? Gbl.Hierarchy.Deg.DegCod :
(Gbl.Scope.Current == Hie_Lvl_CRS ? Gbl.Hierarchy.Crs.CrsCod : (Gbl.Scope.Current == Hie_Lvl_CRS ? Gbl.Hierarchy.Crs.CrsCod :
-1L))))); -1L)))));
char *Class = (Role == Rol_UNK) ? "DAT_N LINE_TOP RB" : char *Class = (Role == Rol_UNK) ? "DAT_N LINE_TOP RB" :
"DAT RB"; "DAT RB";
unsigned Roles = (Role == Rol_UNK) ? ((1 << Rol_STD) | unsigned Roles = (Role == Rol_UNK) ? ((1 << Rol_STD) |
@ -3567,18 +3571,7 @@ static void Fig_GetAndShowTimelineActivityStats (void)
HTM_TR_End (); HTM_TR_End ();
/***** Get total number of users *****/ /***** Get total number of users *****/
NumUsrsTotal = NumUsrsTotal = Usr_GetTotalNumberOfUsers ();
(Gbl.Scope.Current == Hie_Lvl_SYS) ? Usr_GetTotalNumberOfUsersInPlatform () :
Usr_GetCachedNumUsrsInCrss (Gbl.Scope.Current,
(Gbl.Scope.Current == Hie_Lvl_CTY ? Gbl.Hierarchy.Cty.CtyCod :
(Gbl.Scope.Current == Hie_Lvl_INS ? Gbl.Hierarchy.Ins.InsCod :
(Gbl.Scope.Current == Hie_Lvl_CTR ? Gbl.Hierarchy.Ctr.CtrCod :
(Gbl.Scope.Current == Hie_Lvl_DEG ? Gbl.Hierarchy.Deg.DegCod :
(Gbl.Scope.Current == Hie_Lvl_CRS ? Gbl.Hierarchy.Crs.CrsCod :
-1L))))),
1 << Rol_STD |
1 << Rol_NET |
1 << Rol_TCH);
/***** Get total number of following/followers from database *****/ /***** Get total number of following/followers from database *****/
for (NoteType = (Tml_Not_NoteType_t) 0; for (NoteType = (Tml_Not_NoteType_t) 0;
@ -3921,18 +3914,7 @@ static void Fig_GetAndShowFollowStats (void)
HTM_TR_End (); HTM_TR_End ();
/***** Get total number of users *****/ /***** Get total number of users *****/
NumUsrsTotal = NumUsrsTotal = Usr_GetTotalNumberOfUsers ();
(Gbl.Scope.Current == Hie_Lvl_SYS) ? Usr_GetTotalNumberOfUsersInPlatform () :
Usr_GetCachedNumUsrsInCrss (Gbl.Scope.Current,
(Gbl.Scope.Current == Hie_Lvl_CTY ? Gbl.Hierarchy.Cty.CtyCod :
(Gbl.Scope.Current == Hie_Lvl_INS ? Gbl.Hierarchy.Ins.InsCod :
(Gbl.Scope.Current == Hie_Lvl_CTR ? Gbl.Hierarchy.Ctr.CtrCod :
(Gbl.Scope.Current == Hie_Lvl_DEG ? Gbl.Hierarchy.Deg.DegCod :
(Gbl.Scope.Current == Hie_Lvl_CRS ? Gbl.Hierarchy.Crs.CrsCod :
-1L))))),
1 << Rol_STD |
1 << Rol_NET |
1 << Rol_TCH);
/***** Get total number of following/followers from database *****/ /***** Get total number of following/followers from database *****/
for (Fol = 0; for (Fol = 0;
@ -4553,8 +4535,8 @@ static void Fig_GetAndShowNumUsrsPerNotifyEvent (void)
extern const char *Txt_NOTIFY_EVENTS_PLURAL[Ntf_NUM_NOTIFY_EVENTS]; extern const char *Txt_NOTIFY_EVENTS_PLURAL[Ntf_NUM_NOTIFY_EVENTS];
extern const char *Txt_Number_of_users; extern const char *Txt_Number_of_users;
extern const char *Txt_PERCENT_of_users; extern const char *Txt_PERCENT_of_users;
extern const char *Txt_Number_of_BR_events; extern const char *Txt_Number_of_events;
extern const char *Txt_Number_of_BR_emails; extern const char *Txt_Number_of_emails;
extern const char *Txt_Total; extern const char *Txt_Total;
Ntf_NotifyEvent_t NotifyEvent; Ntf_NotifyEvent_t NotifyEvent;
char *SubQuery; char *SubQuery;
@ -4579,24 +4561,13 @@ static void Fig_GetAndShowNumUsrsPerNotifyEvent (void)
HTM_TH (1,1,"LM",Txt_Event); HTM_TH (1,1,"LM",Txt_Event);
HTM_TH (1,1,"RM",Txt_Number_of_users); HTM_TH (1,1,"RM",Txt_Number_of_users);
HTM_TH (1,1,"RM",Txt_PERCENT_of_users); HTM_TH (1,1,"RM",Txt_PERCENT_of_users);
HTM_TH (1,1,"RM",Txt_Number_of_BR_events); HTM_TH (1,1,"RM",Txt_Number_of_events);
HTM_TH (1,1,"RM",Txt_Number_of_BR_emails); HTM_TH (1,1,"RM",Txt_Number_of_emails);
HTM_TR_End (); HTM_TR_End ();
/***** Get total number of users *****/ /***** Get total number of users *****/
NumUsrsTotal = NumUsrsTotal = Usr_GetTotalNumberOfUsers ();
(Gbl.Scope.Current == Hie_Lvl_SYS) ? Usr_GetTotalNumberOfUsersInPlatform () :
Usr_GetCachedNumUsrsInCrss (Gbl.Scope.Current,
(Gbl.Scope.Current == Hie_Lvl_CTY ? Gbl.Hierarchy.Cty.CtyCod :
(Gbl.Scope.Current == Hie_Lvl_INS ? Gbl.Hierarchy.Ins.InsCod :
(Gbl.Scope.Current == Hie_Lvl_CTR ? Gbl.Hierarchy.Ctr.CtrCod :
(Gbl.Scope.Current == Hie_Lvl_DEG ? Gbl.Hierarchy.Deg.DegCod :
(Gbl.Scope.Current == Hie_Lvl_CRS ? Gbl.Hierarchy.Crs.CrsCod :
-1L))))),
1 << Rol_STD |
1 << Rol_NET |
1 << Rol_TCH);
/***** Get total number of users who want to be /***** Get total number of users who want to be
notified by email on some event, from database *****/ notified by email on some event, from database *****/
@ -4964,6 +4935,76 @@ static void Fig_GetAndShowMsgsStats (void)
Box_BoxTableEnd (); Box_BoxTableEnd ();
} }
/*****************************************************************************/
/********* Get and show number of users who have chosen a language ***********/
/*****************************************************************************/
static void Fig_GetAndShowAgendasStats (void)
{
extern const char *Hlp_ANALYTICS_Figures_agendas;
extern const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES];
extern const char *Txt_Number_of_events;
extern const char *Txt_Number_of_users;
extern const char *Txt_PERCENT_of_users;
extern const char *Txt_Number_of_events_per_user;
unsigned NumEvents;
unsigned NumUsrs;
unsigned NumUsrsTotal;
/***** Begin box and table *****/
Box_BoxTableBegin (NULL,Txt_FIGURE_TYPES[Fig_AGENDAS],
NULL,NULL,
Hlp_ANALYTICS_Figures_agendas,Box_NOT_CLOSABLE,2);
/***** Heading row *****/
HTM_TR_Begin (NULL);
HTM_TH (1,1,"RM",Txt_Number_of_events);
HTM_TH (1,1,"RM",Txt_Number_of_users);
HTM_TH (1,1,"RM",Txt_PERCENT_of_users);
HTM_TH (1,1,"RM",Txt_Number_of_events_per_user);
HTM_TR_End ();
/***** Number of agenda events *****/
NumEvents = Agd_GetNumEvents (Gbl.Scope.Current);
/***** Number of users with agenda events *****/
NumUsrs = Agd_GetNumUsrsWithEvents (Gbl.Scope.Current);
/***** Get total number of users in current scope *****/
NumUsrsTotal = Usr_GetTotalNumberOfUsers ();
/***** Write number of users who have chosen each language *****/
HTM_TR_Begin (NULL);
HTM_TD_Begin ("class=\"DAT RM\"");
HTM_Unsigned (NumEvents);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT RM\"");
HTM_Unsigned (NumUsrs);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT RM\"");
HTM_Percentage (NumUsrsTotal ? (double) NumUsrs * 100.0 /
(double) NumUsrsTotal :
0);
HTM_TD_End ();
HTM_TD_Begin ("class=\"DAT RM\"");
HTM_Double2Decimals (NumUsrs ? (double) NumEvents /
(double) NumUsrs :
0);
HTM_TD_End ();
HTM_TR_End ();
/***** End table and box *****/
Box_BoxTableEnd ();
}
/*****************************************************************************/ /*****************************************************************************/
/***************************** Show stats of surveys *************************/ /***************************** Show stats of surveys *************************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -33,7 +33,7 @@
/************************** Public types and constants ***********************/ /************************** Public types and constants ***********************/
/*****************************************************************************/ /*****************************************************************************/
#define Fig_NUM_FIGURES 30 #define Fig_NUM_FIGURES 31
typedef enum typedef enum
{ {
Fig_USERS, // Number of users Fig_USERS, // Number of users
@ -56,6 +56,7 @@ typedef enum
Fig_NOTIFY_EVENTS, // Number of users per notify event Fig_NOTIFY_EVENTS, // Number of users per notify event
Fig_NOTICES, // Number of notices Fig_NOTICES, // Number of notices
Fig_MESSAGES, // Number of users' (sent and received) messages Fig_MESSAGES, // Number of users' (sent and received) messages
Fig_AGENDAS, // Number of agendas
Fig_SOCIAL_NETWORKS, // Number of users in social networks Fig_SOCIAL_NETWORKS, // Number of users in social networks
Fig_LANGUAGES, // Number of users per language Fig_LANGUAGES, // Number of users per language
Fig_FIRST_DAY_OF_WEEK, // Number of users per first day of week Fig_FIRST_DAY_OF_WEEK, // Number of users per first day of week

View File

@ -3288,6 +3288,27 @@ const char *Hlp_ANALYTICS_Figures_messages =
"ANALYTICS.Figures.en#messages"; "ANALYTICS.Figures.en#messages";
#endif #endif
const char *Hlp_ANALYTICS_Figures_agendas =
#if L==1
"ANALYTICS.Figures.es#agendas";
#elif L==2
"ANALYTICS.Figures.en#agendas";
#elif L==3
"ANALYTICS.Figures.en#agendas";
#elif L==4
"ANALYTICS.Figures.es#agendas";
#elif L==5
"ANALYTICS.Figures.en#agendas";
#elif L==6
"ANALYTICS.Figures.es#agendas";
#elif L==7
"ANALYTICS.Figures.en#agendas";
#elif L==8
"ANALYTICS.Figures.en#agendas";
#elif L==9
"ANALYTICS.Figures.en#agendas";
#endif
const char *Hlp_ANALYTICS_Figures_webs_social_networks = const char *Hlp_ANALYTICS_Figures_webs_social_networks =
#if L==1 #if L==1
"ANALYTICS.Figures.es#webs--redes-sociales"; "ANALYTICS.Figures.es#webs--redes-sociales";

View File

@ -442,18 +442,7 @@ void Net_ShowWebAndSocialNetworksStats (void)
unsigned NumUsrs; unsigned NumUsrs;
/***** Get total number of users in current scope *****/ /***** Get total number of users in current scope *****/
NumUsrsTotal = NumUsrsTotal = Usr_GetTotalNumberOfUsers ();
(Gbl.Scope.Current == Hie_Lvl_SYS) ? Usr_GetTotalNumberOfUsersInPlatform () :
Usr_GetCachedNumUsrsInCrss (Gbl.Scope.Current,
(Gbl.Scope.Current == Hie_Lvl_CTY ? Gbl.Hierarchy.Cty.CtyCod :
(Gbl.Scope.Current == Hie_Lvl_INS ? Gbl.Hierarchy.Ins.InsCod :
(Gbl.Scope.Current == Hie_Lvl_CTR ? Gbl.Hierarchy.Ctr.CtrCod :
(Gbl.Scope.Current == Hie_Lvl_DEG ? Gbl.Hierarchy.Deg.DegCod :
(Gbl.Scope.Current == Hie_Lvl_CRS ? Gbl.Hierarchy.Crs.CrsCod :
-1L))))),
1 << Rol_STD |
1 << Rol_NET |
1 << Rol_TCH); // Any user
/***** Get number of users with a web / social network *****/ /***** Get number of users with a web / social network *****/
switch (Gbl.Scope.Current) switch (Gbl.Scope.Current)

View File

@ -2205,7 +2205,6 @@ unsigned Prg_GetNumCoursesWithItems (Hie_Lvl_Level_t Scope)
" AND ins_instits.InsCod=ctr_centers.InsCod" " AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=prg_items.CrsCod", " AND crs_courses.CrsCod=prg_items.CrsCod",
Gbl.Hierarchy.Cty.CtyCod); Gbl.Hierarchy.Cty.CtyCod);
case Hie_Lvl_INS: case Hie_Lvl_INS:
@ -2219,7 +2218,6 @@ unsigned Prg_GetNumCoursesWithItems (Hie_Lvl_Level_t Scope)
" WHERE ctr_centers.InsCod=%ld" " WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=prg_items.CrsCod", " AND crs_courses.CrsCod=prg_items.CrsCod",
Gbl.Hierarchy.Ins.InsCod); Gbl.Hierarchy.Ins.InsCod);
case Hie_Lvl_CTR: case Hie_Lvl_CTR:
@ -2231,7 +2229,6 @@ unsigned Prg_GetNumCoursesWithItems (Hie_Lvl_Level_t Scope)
"prg_items" "prg_items"
" WHERE deg_degrees.CtrCod=%ld" " WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=prg_items.CrsCod", " AND crs_courses.CrsCod=prg_items.CrsCod",
Gbl.Hierarchy.Ctr.CtrCod); Gbl.Hierarchy.Ctr.CtrCod);
case Hie_Lvl_DEG: case Hie_Lvl_DEG:
@ -2241,7 +2238,6 @@ unsigned Prg_GetNumCoursesWithItems (Hie_Lvl_Level_t Scope)
" FROM crs_courses," " FROM crs_courses,"
"prg_items" "prg_items"
" WHERE crs_courses.DegCod=%ld" " WHERE crs_courses.DegCod=%ld"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=prg_items.CrsCod", " AND crs_courses.CrsCod=prg_items.CrsCod",
Gbl.Hierarchy.Deg.DegCod); Gbl.Hierarchy.Deg.DegCod);
case Hie_Lvl_CRS: case Hie_Lvl_CRS:

View File

@ -4630,7 +4630,6 @@ unsigned Prj_GetNumCoursesWithProjects (Hie_Lvl_Level_t Scope)
" AND ins_instits.InsCod=ctr_centers.InsCod" " AND ins_instits.InsCod=ctr_centers.InsCod"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=prj_projects.CrsCod", " AND crs_courses.CrsCod=prj_projects.CrsCod",
Gbl.Hierarchy.Cty.CtyCod); Gbl.Hierarchy.Cty.CtyCod);
case Hie_Lvl_INS: case Hie_Lvl_INS:
@ -4644,7 +4643,6 @@ unsigned Prj_GetNumCoursesWithProjects (Hie_Lvl_Level_t Scope)
" WHERE ctr_centers.InsCod=%ld" " WHERE ctr_centers.InsCod=%ld"
" AND ctr_centers.CtrCod=deg_degrees.CtrCod" " AND ctr_centers.CtrCod=deg_degrees.CtrCod"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=prj_projects.CrsCod", " AND crs_courses.CrsCod=prj_projects.CrsCod",
Gbl.Hierarchy.Ins.InsCod); Gbl.Hierarchy.Ins.InsCod);
case Hie_Lvl_CTR: case Hie_Lvl_CTR:
@ -4656,7 +4654,6 @@ unsigned Prj_GetNumCoursesWithProjects (Hie_Lvl_Level_t Scope)
"prj_projects" "prj_projects"
" WHERE deg_degrees.CtrCod=%ld" " WHERE deg_degrees.CtrCod=%ld"
" AND deg_degrees.DegCod=crs_courses.DegCod" " AND deg_degrees.DegCod=crs_courses.DegCod"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=prj_projects.CrsCod", " AND crs_courses.CrsCod=prj_projects.CrsCod",
Gbl.Hierarchy.Ctr.CtrCod); Gbl.Hierarchy.Ctr.CtrCod);
case Hie_Lvl_DEG: case Hie_Lvl_DEG:
@ -4666,7 +4663,6 @@ unsigned Prj_GetNumCoursesWithProjects (Hie_Lvl_Level_t Scope)
" FROM crs_courses," " FROM crs_courses,"
"prj_projects" "prj_projects"
" WHERE crs_courses.DegCod=%ld" " WHERE crs_courses.DegCod=%ld"
" AND crs_courses.Status=0"
" AND crs_courses.CrsCod=prj_projects.CrsCod", " AND crs_courses.CrsCod=prj_projects.CrsCod",
Gbl.Hierarchy.Deg.DegCod); Gbl.Hierarchy.Deg.DegCod);
break; break;

View File

@ -21319,7 +21319,7 @@ const char *Txt_MENU_TITLE[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB] =
#if L==1 // ca #if L==1 // ca
"Agenda" "Agenda"
#elif L==2 // de #elif L==2 // de
"Organizer" "Agenda"
#elif L==3 // en #elif L==3 // en
"Agenda" "Agenda"
#elif L==4 // es #elif L==4 // es
@ -23246,7 +23246,7 @@ const char *Txt_MENU_SUBTITLE[Tab_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB] =
#if L==1 // ca #if L==1 // ca
"Agenda" "Agenda"
#elif L==2 // de #elif L==2 // de
"Organizer" "Agenda"
#elif L==3 // en #elif L==3 // en
"Agenda (personal organizer)" "Agenda (personal organizer)"
#elif L==4 // es #elif L==4 // es
@ -29245,46 +29245,67 @@ const char *Txt_Number_of_BR_courses_with_BR_surveys =
"N.&ordm; de<br />disciplinas<br />com inqu&eacute;ritos"; "N.&ordm; de<br />disciplinas<br />com inqu&eacute;ritos";
#endif #endif
const char *Txt_Number_of_BR_events = const char *Txt_Number_of_events =
#if L==1 // ca #if L==1 // ca
"N.&ordm; d'<br />esdeveniments."; "N.&ordm; d'esdeveniments";
#elif L==2 // de #elif L==2 // de
"Anzahl der<br />Ereignisse"; "Anzahl der Ereignisse";
#elif L==3 // en #elif L==3 // en
"Number of<br />events"; "Number of events";
#elif L==4 // es #elif L==4 // es
"N.&ordm; de<br />eventos"; "N.&ordm; de eventos";
#elif L==5 // fr #elif L==5 // fr
"Nombre<br />d'&eacute;v&eacute;nements"; "Nombre d'&eacute;v&eacute;nements";
#elif L==6 // gn #elif L==6 // gn
"N.&ordm; de<br />eventos"; // Okoteve traducción "N.&ordm; de eventos"; // Okoteve traducción
#elif L==7 // it #elif L==7 // it
"Numero di<br />eventi"; "Numero di eventi";
#elif L==8 // pl #elif L==8 // pl
"Liczba of<br />zdarzenia"; "Liczba of zdarzenia";
#elif L==9 // pt #elif L==9 // pt
"N&uacute;mero de<br />eventos"; "N&uacute;mero de eventos";
#endif #endif
const char *Txt_Number_of_BR_emails = const char *Txt_Number_of_events_per_user =
#if L==1 // ca #if L==1 // ca
"N.&ordm; de<br />correos"; // Necessita traduccio "N.&ordm; d'esdeveniments per usuari";
#elif L==2 // de #elif L==2 // de
"Anzahl der<br />E-Mails"; "Anzahl der Ereignisse pro Benutzer";
#elif L==3 // en #elif L==3 // en
"Number of<br />emails"; "Number of events per user";
#elif L==4 // es #elif L==4 // es
"N.&ordm; de<br />correos"; "N.&ordm; de eventos por usuario";
#elif L==5 // fr #elif L==5 // fr
"Nombre<br />d'emails"; "Nombre d'&eacute;v&eacute;nements par utilisateur";
#elif L==6 // gn #elif L==6 // gn
"N.&ordm; de<br />correos"; // Okoteve traducción "N.&ordm; de eventos por usuario"; // Okoteve traducción
#elif L==7 // it #elif L==7 // it
"Numero di<br />email"; "Numero di eventi per utente";
#elif L==8 // pl #elif L==8 // pl
"Liczba<br />email"; "Liczba zdarze&nacute; na u&zdot;ytkownika";
#elif L==9 // pt #elif L==9 // pt
"N&uacute;mero de<br />emails"; "N&uacute;mero de eventos por utilizador";
#endif
const char *Txt_Number_of_emails =
#if L==1 // ca
"N.&ordm; de correos"; // Necessita traduccio
#elif L==2 // de
"Anzahl der E-Mails";
#elif L==3 // en
"Number of emails";
#elif L==4 // es
"N.&ordm; de correos";
#elif L==5 // fr
"Nombre d'emails";
#elif L==6 // gn
"N.&ordm; de correos"; // Okoteve traducción
#elif L==7 // it
"Numero di email";
#elif L==8 // pl
"Liczba email";
#elif L==9 // pt
"N&uacute;mero de emails";
#endif #endif
const char *Txt_Number_of_BR_exams = const char *Txt_Number_of_BR_exams =
@ -32770,7 +32791,7 @@ const char *Txt_Public_agenda_USER = // Warning: it is very important to include
#if L==1 // ca #if L==1 // ca
"Agenda p&uacute;blica de %s"; "Agenda p&uacute;blica de %s";
#elif L==2 // de #elif L==2 // de
"&Ouml;ffentliche Organizer von %s"; "&Ouml;ffentliche Agenda von %s";
#elif L==3 // en #elif L==3 // en
"%s's public agenda"; "%s's public agenda";
#elif L==4 // es #elif L==4 // es
@ -44378,6 +44399,27 @@ const char *Txt_FIGURE_TYPES[Fig_NUM_FIGURES] =
"Wiadomo&sacute;ci" "Wiadomo&sacute;ci"
#elif L==9 // pt #elif L==9 // pt
"Mensagens" "Mensagens"
#endif
,
[Fig_AGENDAS] =
#if L==1 // ca
"Agendes"
#elif L==2 // de
"Agenden"
#elif L==3 // en
"Agendas"
#elif L==4 // es
"Agendas"
#elif L==5 // fr
"Agendas"
#elif L==6 // gn
"Aporyr&atilde;"
#elif L==7 // it
"Agende"
#elif L==8 // pl
"Pami&eogon;tnik"
#elif L==9 // pt
"Agendas"
#endif #endif
, ,
[Fig_SOCIAL_NETWORKS] = [Fig_SOCIAL_NETWORKS] =

View File

@ -9395,13 +9395,34 @@ void Usr_ShowWarningNoUsersFound (Rol_Role_t Role)
/****************** Get total number of users in platform ********************/ /****************** Get total number of users in platform ********************/
/*****************************************************************************/ /*****************************************************************************/
unsigned Usr_GetTotalNumberOfUsersInPlatform (void) unsigned Usr_GetTotalNumberOfUsers (void)
{ {
/***** Get number of users from database *****/ long Cod;
return unsigned Roles;
(unsigned) DB_QueryCOUNT ("can not get number of users",
"SELECT COUNT(UsrCod)" /***** Get number of users with events from database *****/
" FROM usr_data"); switch (Gbl.Scope.Current)
{
case Hie_Lvl_SYS:
return (unsigned) DB_GetNumRowsTable ("usr_data"); // All users in platform
case Hie_Lvl_CTY:
case Hie_Lvl_INS:
case Hie_Lvl_CTR:
case Hie_Lvl_DEG:
case Hie_Lvl_CRS:
Cod = (Gbl.Scope.Current == Hie_Lvl_CTY ? Gbl.Hierarchy.Cty.CtyCod :
(Gbl.Scope.Current == Hie_Lvl_INS ? Gbl.Hierarchy.Ins.InsCod :
(Gbl.Scope.Current == Hie_Lvl_CTR ? Gbl.Hierarchy.Ctr.CtrCod :
(Gbl.Scope.Current == Hie_Lvl_DEG ? Gbl.Hierarchy.Deg.DegCod :
Gbl.Hierarchy.Crs.CrsCod))));
Roles = (1 << Rol_STD) |
(1 << Rol_NET) |
(1 << Rol_TCH);
return Usr_GetCachedNumUsrsInCrss (Gbl.Scope.Current,Cod,Roles); // All users in courses
default:
Lay_WrongScopeExit ();
return 0; // Not reached
}
} }
/*****************************************************************************/ /*****************************************************************************/

View File

@ -516,7 +516,7 @@ bool Usr_ChkIfUsrCodExists (long UsrCod);
void Usr_ShowWarningNoUsersFound (Rol_Role_t Role); void Usr_ShowWarningNoUsersFound (Rol_Role_t Role);
unsigned Usr_GetTotalNumberOfUsersInPlatform (void); unsigned Usr_GetTotalNumberOfUsers (void);
unsigned Usr_GetNumUsrsInCrss (Hie_Lvl_Level_t Scope,long Cod,unsigned Roles); unsigned Usr_GetNumUsrsInCrss (Hie_Lvl_Level_t Scope,long Cod,unsigned Roles);
unsigned Usr_GetCachedNumUsrsInCrss (Hie_Lvl_Level_t Scope,long Cod,unsigned Roles); unsigned Usr_GetCachedNumUsrsInCrss (Hie_Lvl_Level_t Scope,long Cod,unsigned Roles);