diff --git a/swad_changelog.h b/swad_changelog.h
index 61e108d62..77fc5ee2c 100644
--- a/swad_changelog.h
+++ b/swad_changelog.h
@@ -111,11 +111,12 @@
/****************************** Public constants *****************************/
/*****************************************************************************/
-#define Log_PLATFORM_VERSION "SWAD 15.42.4 (2015/11/21)"
+#define Log_PLATFORM_VERSION "SWAD 15.43 (2015/11/21)"
// Number of lines (includes comments but not blank lines) has been got with the following command:
// nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h sql/swad*.sql | tail -1
/*
+ Version 15.43: Nov 21, 2015 New figure (statistic) about first day of week. (187693 lines)
Version 15.42.4: Nov 21, 2015 Fixed bug when getting first day of week from IP preferences. (187535 lines)
Version 15.42.3: Nov 21, 2015 Stats of hits distributed by week depend on user's preference about first day of the week. (187528 lines)
Version 15.42.2: Nov 21, 2015 Fixed bug in JavaScript code to draw months. (187524 lines)
diff --git a/swad_statistic.c b/swad_statistic.c
index edb65b5a2..0bdeff514 100644
--- a/swad_statistic.c
+++ b/swad_statistic.c
@@ -240,6 +240,7 @@ static void Sta_GetAndShowSurveysStats (void);
static void Sta_GetAndShowNumUsrsPerPrivacy (void);
static void Sta_GetAndShowNumUsrsPerPrivacyForAnObject (const char *TxtObject,const char *FieldName);
static void Sta_GetAndShowNumUsrsPerLanguage (void);
+static void Sta_GetAndShowNumUsrsPerFirstDayOfWeek (void);
static void Sta_GetAndShowNumUsrsPerLayout (void);
static void Sta_GetAndShowNumUsrsPerTheme (void);
static void Sta_GetAndShowNumUsrsPerIconSet (void);
@@ -3930,6 +3931,10 @@ void Sta_ShowUseOfPlatform (void)
/***** Number of users who have chosen a language *****/
Sta_GetAndShowNumUsrsPerLanguage ();
break;
+ case Sta_FIRST_DAY_OF_WEEK:
+ /***** Number of users who have chosen a first day of week *****/
+ Sta_GetAndShowNumUsrsPerFirstDayOfWeek ();
+ break;
case Sta_LAYOUTS:
/***** Number of users who have chosen a layout *****/
Sta_GetAndShowNumUsrsPerLayout ();
@@ -7771,6 +7776,145 @@ static void Sta_GetAndShowNumUsrsPerLanguage (void)
Lay_EndRoundFrameTable ();
}
+/*****************************************************************************/
+/***** Get and show number of users who have chosen a first day of week ******/
+/*****************************************************************************/
+
+static void Sta_GetAndShowNumUsrsPerFirstDayOfWeek (void)
+ {
+ extern const bool Cal_DayIsValidAsFirstDayOfWeek[7];
+ extern const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES];
+ extern const char *Txt_Calendar;
+ extern const char *Txt_First_day_of_the_week;
+ extern const char *Txt_DAYS_SMALL[7];
+ extern const char *Txt_No_of_users;
+ extern const char *Txt_PERCENT_of_users;
+ unsigned FirstDayOfWeek;
+ char Query[1024];
+ unsigned NumUsrs[Lay_NUM_LAYOUTS];
+ unsigned NumUsrsTotal = 0;
+
+ Lay_StartRoundFrameTable (NULL,2,Txt_STAT_USE_STAT_TYPES[Sta_FIRST_DAY_OF_WEEK]);
+
+ /***** Heading row *****/
+ fprintf (Gbl.F.Out,"
"
+ ""
+ "%s"
+ " | "
+ ""
+ "%s"
+ " | "
+ ""
+ "%s"
+ " | "
+ "
",
+ Txt_Calendar,
+ Txt_No_of_users,
+ Txt_PERCENT_of_users);
+
+ /***** For each day... *****/
+ for (FirstDayOfWeek = 0; // Monday
+ FirstDayOfWeek <= 6; // Sunday
+ FirstDayOfWeek++)
+ if (Cal_DayIsValidAsFirstDayOfWeek[FirstDayOfWeek])
+ {
+ /***** Get number of users who have chosen this first day of week from database *****/
+ switch (Gbl.Scope.Current)
+ {
+ case Sco_SCOPE_SYS:
+ sprintf (Query,"SELECT COUNT(*) FROM usr_data"
+ " WHERE FirstDayOfWeek='%u'",
+ (unsigned) FirstDayOfWeek);
+ break;
+ case Sco_SCOPE_CTY:
+ sprintf (Query,"SELECT COUNT(DISTINCT usr_data.UsrCod)"
+ " FROM institutions,centres,degrees,courses,crs_usr,usr_data"
+ " WHERE institutions.CtyCod='%ld'"
+ " AND institutions.InsCod=centres.InsCod"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_data.UsrCod"
+ " AND usr_data.FirstDayOfWeek='%u'",
+ Gbl.CurrentCty.Cty.CtyCod,(unsigned) FirstDayOfWeek);
+ break;
+ case Sco_SCOPE_INS:
+ sprintf (Query,"SELECT COUNT(DISTINCT usr_data.UsrCod)"
+ " FROM centres,degrees,courses,crs_usr,usr_data"
+ " WHERE centres.InsCod='%ld'"
+ " AND centres.CtrCod=degrees.CtrCod"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_data.UsrCod"
+ " AND usr_data.FirstDayOfWeek='%u'",
+ Gbl.CurrentIns.Ins.InsCod,(unsigned) FirstDayOfWeek);
+ break;
+ case Sco_SCOPE_CTR:
+ sprintf (Query,"SELECT COUNT(DISTINCT usr_data.UsrCod)"
+ " FROM degrees,courses,crs_usr,usr_data"
+ " WHERE degrees.CtrCod='%ld'"
+ " AND degrees.DegCod=courses.DegCod"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_data.UsrCod"
+ " AND usr_data.FirstDayOfWeek='%u'",
+ Gbl.CurrentCtr.Ctr.CtrCod,(unsigned) FirstDayOfWeek);
+ break;
+ case Sco_SCOPE_DEG:
+ sprintf (Query,"SELECT COUNT(DISTINCT usr_data.UsrCod)"
+ " FROM courses,crs_usr,usr_data"
+ " WHERE courses.DegCod='%ld'"
+ " AND courses.CrsCod=crs_usr.CrsCod"
+ " AND crs_usr.UsrCod=usr_data.UsrCod"
+ " AND usr_data.FirstDayOfWeek='%u'",
+ Gbl.CurrentDeg.Deg.DegCod,(unsigned) FirstDayOfWeek);
+ break;
+ case Sco_SCOPE_CRS:
+ sprintf (Query,"SELECT COUNT(DISTINCT usr_data.UsrCod)"
+ " FROM crs_usr,usr_data"
+ " WHERE crs_usr.CrsCod='%ld'"
+ " AND crs_usr.UsrCod=usr_data.UsrCod"
+ " AND usr_data.FirstDayOfWeek='%u'",
+ Gbl.CurrentCrs.Crs.CrsCod,(unsigned) FirstDayOfWeek);
+ break;
+ default:
+ Lay_ShowErrorAndExit ("Wrong scope.");
+ break;
+ }
+ NumUsrs[FirstDayOfWeek] = (unsigned) DB_QueryCOUNT (Query,"can not get the number of users who have chosen a layout");
+
+ /* Update total number of users */
+ NumUsrsTotal += NumUsrs[FirstDayOfWeek];
+ }
+
+ /***** Write number of users who have chosen each layout *****/
+ for (FirstDayOfWeek = 0; // Monday
+ FirstDayOfWeek <= 6; // Sunday
+ FirstDayOfWeek++)
+ if (Cal_DayIsValidAsFirstDayOfWeek[FirstDayOfWeek])
+ fprintf (Gbl.F.Out,""
+ ""
+ ""
+ " | "
+ ""
+ "%u"
+ " | "
+ ""
+ "%5.2f%%"
+ " | "
+ "
",
+ Gbl.Prefs.IconsURL,FirstDayOfWeek,
+ Txt_DAYS_SMALL[FirstDayOfWeek],
+ Txt_First_day_of_the_week,Txt_DAYS_SMALL[FirstDayOfWeek],
+ NumUsrs[FirstDayOfWeek],
+ NumUsrsTotal ? (float) NumUsrs[FirstDayOfWeek] * 100.0 /
+ (float) NumUsrsTotal :
+ 0);
+
+ Lay_EndRoundFrameTable ();
+ }
+
/*****************************************************************************/
/********* Get and show number of users who have chosen a layout *************/
/*****************************************************************************/
diff --git a/swad_statistic.h b/swad_statistic.h
index e4a8aaae3..dccf340d6 100644
--- a/swad_statistic.h
+++ b/swad_statistic.h
@@ -97,7 +97,7 @@ typedef enum
Sta_CLICKS_GBL_PER_COURSE = 23,
} Sta_ClicksGroupedBy_t;
-#define Sta_NUM_FIGURES 21
+#define Sta_NUM_FIGURES 22
typedef enum
{
Sta_USERS, // Number of users
@@ -116,6 +116,7 @@ typedef enum
Sta_SURVEYS, // Number of surveys
Sta_PRIVACY, // Number of users per privacity
Sta_LANGUAGES, // Number of users per language
+ Sta_FIRST_DAY_OF_WEEK, // Number of users per first day of week
Sta_LAYOUTS, // Number of users per layout
Sta_THEMES, // Number of users per theme
Sta_ICON_SETS, // Number of users per icon set
diff --git a/swad_text.c b/swad_text.c
index e2b567209..8f4a08c70 100644
--- a/swad_text.c
+++ b/swad_text.c
@@ -36715,6 +36715,26 @@ const char *Txt_STAT_USE_STAT_TYPES[Sta_NUM_FIGURES] =
"Lingua"
#endif
,
+#if L==0 // Sta_FIRST_DAY_OF_WEEK
+ "Calendari"
+#elif L==1
+ "Kalender"
+#elif L==2
+ "Calendar"
+#elif L==3
+ "Calendario"
+#elif L==4
+ "Calendrier"
+#elif L==5
+ "Arapapaha"
+#elif L==6
+ "Calendario"
+#elif L==7
+ "Kalendarz"
+#elif L==8
+ "Calendário"
+#endif
+ ,
#if L==0 // Sta_LAYOUTS
"Disseny"
#elif L==1