Version 21.56: Nov 10, 2021 Code refactoring in hierarchy.

This commit is contained in:
acanas 2021-11-10 10:53:08 +01:00
parent fe8168dcf8
commit a257bf39c3
27 changed files with 443 additions and 718 deletions

View File

@ -82,10 +82,6 @@ static void Ctr_GetDataOfCenterFromRow (struct Ctr_Center *Ctr,MYSQL_ROW row);
static void Ctr_ListCentersForEdition (const struct Plc_Places *Places); static void Ctr_ListCentersForEdition (const struct Plc_Places *Places);
static bool Ctr_CheckIfICanEditACenter (struct Ctr_Center *Ctr); static bool Ctr_CheckIfICanEditACenter (struct Ctr_Center *Ctr);
static Ctr_StatusTxt_t Ctr_GetStatusTxtFromStatusBits (Ctr_Status_t Status);
static Ctr_Status_t Ctr_GetStatusBitsFromStatusTxt (Ctr_StatusTxt_t StatusTxt);
static void Ctr_PutParamOtherCtrCod (void *CtrCod);
static void Ctr_ShowAlertAndButtonToGoToCtr (void); static void Ctr_ShowAlertAndButtonToGoToCtr (void);
static void Ctr_PutParamGoToCtr (void *CtrCod); static void Ctr_PutParamGoToCtr (void *CtrCod);
@ -93,7 +89,7 @@ static void Ctr_PutParamGoToCtr (void *CtrCod);
static void Ctr_PutFormToCreateCenter (const struct Plc_Places *Places); static void Ctr_PutFormToCreateCenter (const struct Plc_Places *Places);
static void Ctr_PutHeadCentersForSeeing (bool OrderSelectable); static void Ctr_PutHeadCentersForSeeing (bool OrderSelectable);
static void Ctr_PutHeadCentersForEdition (void); static void Ctr_PutHeadCentersForEdition (void);
static void Ctr_ReceiveFormRequestOrCreateCtr (Ctr_Status_t Status); static void Ctr_ReceiveFormRequestOrCreateCtr (Hie_Status_t Status);
static unsigned Ctr_GetNumCtrsInCty (long CtyCod); static unsigned Ctr_GetNumCtrsInCty (long CtyCod);
@ -329,18 +325,17 @@ static void Ctr_PutIconToEditCenters (void)
static void Ctr_ListOneCenterForSeeing (struct Ctr_Center *Ctr,unsigned NumCtr) static void Ctr_ListOneCenterForSeeing (struct Ctr_Center *Ctr,unsigned NumCtr)
{ {
extern const char *Txt_CENTER_STATUS[Ctr_NUM_STATUS_TXT]; extern const char *Txt_CENTER_STATUS[Hie_NUM_STATUS_TXT];
struct Plc_Place Plc; struct Plc_Place Plc;
const char *TxtClassNormal; const char *TxtClassNormal;
const char *TxtClassStrong; const char *TxtClassStrong;
const char *BgColor; const char *BgColor;
Ctr_StatusTxt_t StatusTxt;
/***** Get data of place of this center *****/ /***** Get data of place of this center *****/
Plc.PlcCod = Ctr->PlcCod; Plc.PlcCod = Ctr->PlcCod;
Plc_GetDataOfPlaceByCod (&Plc); Plc_GetDataOfPlaceByCod (&Plc);
if (Ctr->Status & Ctr_STATUS_BIT_PENDING) if (Ctr->Status & Hie_STATUS_BIT_PENDING)
{ {
TxtClassNormal = "DAT_LIGHT"; TxtClassNormal = "DAT_LIGHT";
TxtClassStrong = "BT_LINK LT DAT_LIGHT"; TxtClassStrong = "BT_LINK LT DAT_LIGHT";
@ -395,11 +390,7 @@ static void Ctr_ListOneCenterForSeeing (struct Ctr_Center *Ctr,unsigned NumCtr)
HTM_TD_End (); HTM_TD_End ();
/***** Center status *****/ /***** Center status *****/
StatusTxt = Ctr_GetStatusTxtFromStatusBits (Ctr->Status); Hie_WriteStatusCell (Ctr->Status,TxtClassNormal,BgColor,Txt_CENTER_STATUS);
HTM_TD_Begin ("class=\"%s LM %s\"",TxtClassNormal,BgColor);
if (StatusTxt != Ctr_STATUS_ACTIVE) // If active ==> do not show anything
HTM_Txt (Txt_CENTER_STATUS[StatusTxt]);
HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -604,7 +595,7 @@ bool Ctr_GetDataOfCenterByCod (struct Ctr_Center *Ctr)
/***** Clear data *****/ /***** Clear data *****/
Ctr->InsCod = -1L; Ctr->InsCod = -1L;
Ctr->PlcCod = -1L; Ctr->PlcCod = -1L;
Ctr->Status = (Ctr_Status_t) 0; Ctr->Status = (Hie_Status_t) 0;
Ctr->RequesterUsrCod = -1L; Ctr->RequesterUsrCod = -1L;
Ctr->ShrtName[0] = '\0'; Ctr->ShrtName[0] = '\0';
Ctr->FullName[0] = '\0'; Ctr->FullName[0] = '\0';
@ -750,7 +741,7 @@ void Ctr_WriteSelectorOfCenter (void)
static void Ctr_ListCentersForEdition (const struct Plc_Places *Places) static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
{ {
extern const char *Txt_Another_place; extern const char *Txt_Another_place;
extern const char *Txt_CENTER_STATUS[Ctr_NUM_STATUS_TXT]; extern const char *Txt_CENTER_STATUS[Hie_NUM_STATUS_TXT];
unsigned NumCtr; unsigned NumCtr;
struct Ctr_Center *Ctr; struct Ctr_Center *Ctr;
unsigned NumPlc; unsigned NumPlc;
@ -760,8 +751,6 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
unsigned NumDegs; unsigned NumDegs;
unsigned NumUsrsCtr; unsigned NumUsrsCtr;
unsigned NumUsrsInCrssOfCtr; unsigned NumUsrsInCrssOfCtr;
Ctr_StatusTxt_t StatusTxt;
unsigned StatusUnsigned;
/***** Initialize structure with user's data *****/ /***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat); Usr_UsrDataConstructor (&UsrDat);
@ -798,7 +787,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
Ico_PutIconRemovalNotAllowed (); Ico_PutIconRemovalNotAllowed ();
else // I can remove center else // I can remove center
Ico_PutContextualIconToRemove (ActRemCtr,NULL, Ico_PutContextualIconToRemove (ActRemCtr,NULL,
Ctr_PutParamOtherCtrCod,&Ctr->CtrCod); Hie_PutParamOtherHieCod,&Ctr->CtrCod);
HTM_TD_End (); HTM_TD_End ();
/* Center code */ /* Center code */
@ -816,7 +805,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActChgCtrPlc); Frm_BeginForm (ActChgCtrPlc);
Ctr_PutParamOtherCtrCod (&Ctr->CtrCod); Hie_PutParamOtherHieCod (&Ctr->CtrCod);
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE, HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,
"name=\"PlcCod\" class=\"PLC_SEL\""); "name=\"PlcCod\" class=\"PLC_SEL\"");
HTM_OPTION (HTM_Type_STRING,"0", HTM_OPTION (HTM_Type_STRING,"0",
@ -844,7 +833,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActRenCtrSho); Frm_BeginForm (ActRenCtrSho);
Ctr_PutParamOtherCtrCod (&Ctr->CtrCod); Hie_PutParamOtherHieCod (&Ctr->CtrCod);
HTM_INPUT_TEXT ("ShortName",Cns_HIERARCHY_MAX_CHARS_SHRT_NAME,Ctr->ShrtName, HTM_INPUT_TEXT ("ShortName",Cns_HIERARCHY_MAX_CHARS_SHRT_NAME,Ctr->ShrtName,
HTM_SUBMIT_ON_CHANGE, HTM_SUBMIT_ON_CHANGE,
"class=\"INPUT_SHORT_NAME\""); "class=\"INPUT_SHORT_NAME\"");
@ -859,7 +848,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActRenCtrFul); Frm_BeginForm (ActRenCtrFul);
Ctr_PutParamOtherCtrCod (&Ctr->CtrCod); Hie_PutParamOtherHieCod (&Ctr->CtrCod);
HTM_INPUT_TEXT ("FullName",Cns_HIERARCHY_MAX_CHARS_FULL_NAME,Ctr->FullName, HTM_INPUT_TEXT ("FullName",Cns_HIERARCHY_MAX_CHARS_FULL_NAME,Ctr->FullName,
HTM_SUBMIT_ON_CHANGE, HTM_SUBMIT_ON_CHANGE,
"class=\"INPUT_FULL_NAME\""); "class=\"INPUT_FULL_NAME\"");
@ -874,7 +863,7 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActChgCtrWWW); Frm_BeginForm (ActChgCtrWWW);
Ctr_PutParamOtherCtrCod (&Ctr->CtrCod); Hie_PutParamOtherHieCod (&Ctr->CtrCod);
HTM_INPUT_URL ("WWW",Ctr->WWW,HTM_SUBMIT_ON_CHANGE, HTM_INPUT_URL ("WWW",Ctr->WWW,HTM_SUBMIT_ON_CHANGE,
"class=\"INPUT_WWW_NARROW\" required=\"required\""); "class=\"INPUT_WWW_NARROW\" required=\"required\"");
Frm_EndForm (); Frm_EndForm ();
@ -916,30 +905,9 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
HTM_TD_End (); HTM_TD_End ();
/* Center status */ /* Center status */
StatusTxt = Ctr_GetStatusTxtFromStatusBits (Ctr->Status); Hie_WriteStatusCellEditable (Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM,
HTM_TD_Begin ("class=\"DAT LM\""); Ctr->Status,ActChgCtrSta,Ctr->CtrCod,
if (Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM && Txt_CENTER_STATUS);
StatusTxt == Ctr_STATUS_PENDING)
{
Frm_BeginForm (ActChgCtrSta);
Ctr_PutParamOtherCtrCod (&Ctr->CtrCod);
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,
"name=\"Status\" class=\"INPUT_STATUS\"");
StatusUnsigned = (unsigned) Ctr_GetStatusBitsFromStatusTxt (Ctr_STATUS_PENDING);
HTM_OPTION (HTM_Type_UNSIGNED,&StatusUnsigned,true,false,
"%s",Txt_CENTER_STATUS[Ctr_STATUS_PENDING]);
StatusUnsigned = (unsigned) Ctr_GetStatusBitsFromStatusTxt (Ctr_STATUS_ACTIVE);
HTM_OPTION (HTM_Type_UNSIGNED,&StatusUnsigned,false,false,
"%s",Txt_CENTER_STATUS[Ctr_STATUS_ACTIVE]);
HTM_SELECT_End ();
Frm_EndForm ();
}
else if (StatusTxt != Ctr_STATUS_ACTIVE) // If active ==> do not show anything
HTM_Txt (Txt_CENTER_STATUS[StatusTxt]);
HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
} }
@ -958,52 +926,10 @@ static void Ctr_ListCentersForEdition (const struct Plc_Places *Places)
static bool Ctr_CheckIfICanEditACenter (struct Ctr_Center *Ctr) static bool Ctr_CheckIfICanEditACenter (struct Ctr_Center *Ctr)
{ {
return (bool) (Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM || // I am an institution administrator or higher return (bool) (Gbl.Usrs.Me.Role.Logged >= Rol_INS_ADM || // I am an institution administrator or higher
((Ctr->Status & Ctr_STATUS_BIT_PENDING) != 0 && // Center is not yet activated ((Ctr->Status & Hie_STATUS_BIT_PENDING) != 0 && // Center is not yet activated
Gbl.Usrs.Me.UsrDat.UsrCod == Ctr->RequesterUsrCod)); // I am the requester Gbl.Usrs.Me.UsrDat.UsrCod == Ctr->RequesterUsrCod)); // I am the requester
} }
/*****************************************************************************/
/******************* Set StatusTxt depending on status bits ******************/
/*****************************************************************************/
// Ctr_STATUS_UNKNOWN = 0 // Other
// Ctr_STATUS_ACTIVE = 1 // 00 (Status == 0)
// Ctr_STATUS_PENDING = 2 // 01 (Status == Ctr_STATUS_BIT_PENDING)
// Ctr_STATUS_REMOVED = 3 // 1- (Status & Ctr_STATUS_BIT_REMOVED)
static Ctr_StatusTxt_t Ctr_GetStatusTxtFromStatusBits (Ctr_Status_t Status)
{
if (Status == 0)
return Ctr_STATUS_ACTIVE;
if (Status == Ctr_STATUS_BIT_PENDING)
return Ctr_STATUS_PENDING;
if (Status & Ctr_STATUS_BIT_REMOVED)
return Ctr_STATUS_REMOVED;
return Ctr_STATUS_UNKNOWN;
}
/*****************************************************************************/
/******************* Set status bits depending on StatusTxt ******************/
/*****************************************************************************/
// Ctr_STATUS_UNKNOWN = 0 // Other
// Ctr_STATUS_ACTIVE = 1 // 00 (Status == 0)
// Ctr_STATUS_PENDING = 2 // 01 (Status == Ctr_STATUS_BIT_PENDING)
// Ctr_STATUS_REMOVED = 3 // 1- (Status & Ctr_STATUS_BIT_REMOVED)
static Ctr_Status_t Ctr_GetStatusBitsFromStatusTxt (Ctr_StatusTxt_t StatusTxt)
{
switch (StatusTxt)
{
case Ctr_STATUS_UNKNOWN:
case Ctr_STATUS_ACTIVE:
return (Ctr_Status_t) 0;
case Ctr_STATUS_PENDING:
return Ctr_STATUS_BIT_PENDING;
case Ctr_STATUS_REMOVED:
return Ctr_STATUS_BIT_REMOVED;
}
return (Ctr_Status_t) 0;
}
/*****************************************************************************/ /*****************************************************************************/
/******************** Write parameter with code of center ********************/ /******************** Write parameter with code of center ********************/
/*****************************************************************************/ /*****************************************************************************/
@ -1013,16 +939,6 @@ void Ctr_PutParamCtrCod (long CtrCod)
Par_PutHiddenParamLong (NULL,"ctr",CtrCod); Par_PutHiddenParamLong (NULL,"ctr",CtrCod);
} }
/*****************************************************************************/
/***************** Write parameter with code of other center *****************/
/*****************************************************************************/
static void Ctr_PutParamOtherCtrCod (void *CtrCod)
{
if (CtrCod)
Par_PutHiddenParamLong (NULL,"OthCtrCod",*((long *) CtrCod));
}
/*****************************************************************************/ /*****************************************************************************/
/****************** Get parameter with code of other center ******************/ /****************** Get parameter with code of other center ******************/
/*****************************************************************************/ /*****************************************************************************/
@ -1052,7 +968,7 @@ void Ctr_RemoveCenter (void)
Ctr_EditingCenterConstructor (); Ctr_EditingCenterConstructor ();
/***** Get center code *****/ /***** Get center code *****/
Ctr_EditingCtr->CtrCod = Ctr_GetAndCheckParamOtherCtrCod (1); Ctr_EditingCtr->CtrCod = Hie_GetAndCheckParamOtherHieCod (1);
/***** Get data of the center from database *****/ /***** Get data of the center from database *****/
Ctr_GetDataOfCenterByCod (Ctr_EditingCtr); Ctr_GetDataOfCenterByCod (Ctr_EditingCtr);
@ -1124,7 +1040,7 @@ void Ctr_ChangeCtrPlc (void)
Ctr_EditingCenterConstructor (); Ctr_EditingCenterConstructor ();
/***** Get center code *****/ /***** Get center code *****/
Ctr_EditingCtr->CtrCod = Ctr_GetAndCheckParamOtherCtrCod (1); Ctr_EditingCtr->CtrCod = Hie_GetAndCheckParamOtherHieCod (1);
/***** Get parameter with place code *****/ /***** Get parameter with place code *****/
NewPlcCod = Plc_GetParamPlcCod (); NewPlcCod = Plc_GetParamPlcCod ();
@ -1152,7 +1068,7 @@ void Ctr_RenameCenterShort (void)
Ctr_EditingCenterConstructor (); Ctr_EditingCenterConstructor ();
/***** Rename center *****/ /***** Rename center *****/
Ctr_EditingCtr->CtrCod = Ctr_GetAndCheckParamOtherCtrCod (1); Ctr_EditingCtr->CtrCod = Hie_GetAndCheckParamOtherHieCod (1);
Ctr_RenameCenter (Ctr_EditingCtr,Cns_SHRT_NAME); Ctr_RenameCenter (Ctr_EditingCtr,Cns_SHRT_NAME);
} }
@ -1162,7 +1078,7 @@ void Ctr_RenameCenterFull (void)
Ctr_EditingCenterConstructor (); Ctr_EditingCenterConstructor ();
/***** Rename center *****/ /***** Rename center *****/
Ctr_EditingCtr->CtrCod = Ctr_GetAndCheckParamOtherCtrCod (1); Ctr_EditingCtr->CtrCod = Hie_GetAndCheckParamOtherHieCod (1);
Ctr_RenameCenter (Ctr_EditingCtr,Cns_FULL_NAME); Ctr_RenameCenter (Ctr_EditingCtr,Cns_FULL_NAME);
} }
@ -1252,7 +1168,7 @@ void Ctr_ChangeCtrWWW (void)
Ctr_EditingCenterConstructor (); Ctr_EditingCenterConstructor ();
/***** Get the code of the center *****/ /***** Get the code of the center *****/
Ctr_EditingCtr->CtrCod = Ctr_GetAndCheckParamOtherCtrCod (1); Ctr_EditingCtr->CtrCod = Hie_GetAndCheckParamOtherHieCod (1);
/***** Get the new WWW for the center *****/ /***** Get the new WWW for the center *****/
Par_GetParToText ("WWW",NewWWW,Cns_MAX_BYTES_WWW); Par_GetParToText ("WWW",NewWWW,Cns_MAX_BYTES_WWW);
@ -1284,32 +1200,24 @@ void Ctr_ChangeCtrWWW (void)
void Ctr_ChangeCtrStatus (void) void Ctr_ChangeCtrStatus (void)
{ {
extern const char *Txt_The_status_of_the_center_X_has_changed; extern const char *Txt_The_status_of_the_center_X_has_changed;
Ctr_Status_t NewStatus; Hie_Status_t Status;
Ctr_StatusTxt_t NewStatusTxt;
/***** Center constructor *****/ /***** Center constructor *****/
Ctr_EditingCenterConstructor (); Ctr_EditingCenterConstructor ();
/***** Get center code *****/ /***** Get parameters from form *****/
Ctr_EditingCtr->CtrCod = Ctr_GetAndCheckParamOtherCtrCod (1); /* Get center code */
Ctr_EditingCtr->CtrCod = Hie_GetAndCheckParamOtherHieCod (1);
/***** Get parameter with status *****/ /* Get parameter with status */
NewStatus = (Ctr_Status_t) Status = Hie_GetParamStatus (); // New status
Par_GetParToUnsignedLong ("Status",
0,
(unsigned long) Ctr_MAX_STATUS,
(unsigned long) Ctr_WRONG_STATUS);
if (NewStatus == Ctr_WRONG_STATUS)
Err_WrongStatusExit ();
NewStatusTxt = Ctr_GetStatusTxtFromStatusBits (NewStatus);
NewStatus = Ctr_GetStatusBitsFromStatusTxt (NewStatusTxt); // New status
/***** Get data of center *****/ /***** Get data of center *****/
Ctr_GetDataOfCenterByCod (Ctr_EditingCtr); Ctr_GetDataOfCenterByCod (Ctr_EditingCtr);
/***** Update status in table of centers *****/ /***** Update status *****/
Ctr_DB_UpdateCtrStatus (Ctr_EditingCtr->CtrCod,NewStatus); Ctr_DB_UpdateCtrStatus (Ctr_EditingCtr->CtrCod,Status);
Ctr_EditingCtr->Status = NewStatus; Ctr_EditingCtr->Status = Status;
/***** Write message to show the change made /***** Write message to show the change made
and put button to go to center changed *****/ and put button to go to center changed *****/
@ -1581,7 +1489,7 @@ void Ctr_ReceiveFormReqCtr (void)
Ctr_EditingCenterConstructor (); Ctr_EditingCenterConstructor ();
/***** Receive form to request a new center *****/ /***** Receive form to request a new center *****/
Ctr_ReceiveFormRequestOrCreateCtr ((Ctr_Status_t) Ctr_STATUS_BIT_PENDING); Ctr_ReceiveFormRequestOrCreateCtr ((Hie_Status_t) Hie_STATUS_BIT_PENDING);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1594,14 +1502,14 @@ void Ctr_ReceiveFormNewCtr (void)
Ctr_EditingCenterConstructor (); Ctr_EditingCenterConstructor ();
/***** Receive form to create a new center *****/ /***** Receive form to create a new center *****/
Ctr_ReceiveFormRequestOrCreateCtr ((Ctr_Status_t) 0); Ctr_ReceiveFormRequestOrCreateCtr ((Hie_Status_t) 0);
} }
/*****************************************************************************/ /*****************************************************************************/
/************* Receive form to request or create a new center ****************/ /************* Receive form to request or create a new center ****************/
/*****************************************************************************/ /*****************************************************************************/
static void Ctr_ReceiveFormRequestOrCreateCtr (Ctr_Status_t Status) static void Ctr_ReceiveFormRequestOrCreateCtr (Hie_Status_t Status)
{ {
extern const char *Txt_The_center_X_already_exists; extern const char *Txt_The_center_X_already_exists;
extern const char *Txt_Created_new_center_X; extern const char *Txt_Created_new_center_X;
@ -1962,7 +1870,7 @@ static void Ctr_EditingCenterConstructor (void)
Ctr_EditingCtr->CtrCod = -1L; Ctr_EditingCtr->CtrCod = -1L;
Ctr_EditingCtr->InsCod = -1L; Ctr_EditingCtr->InsCod = -1L;
Ctr_EditingCtr->PlcCod = -1L; Ctr_EditingCtr->PlcCod = -1L;
Ctr_EditingCtr->Status = (Ctr_Status_t) 0; Ctr_EditingCtr->Status = (Hie_Status_t) 0;
Ctr_EditingCtr->RequesterUsrCod = -1L; Ctr_EditingCtr->RequesterUsrCod = -1L;
Ctr_EditingCtr->ShrtName[0] = '\0'; Ctr_EditingCtr->ShrtName[0] = '\0';
Ctr_EditingCtr->FullName[0] = '\0'; Ctr_EditingCtr->FullName[0] = '\0';

View File

@ -39,25 +39,6 @@
/************************** Public types and constants ***********************/ /************************** Public types and constants ***********************/
/*****************************************************************************/ /*****************************************************************************/
typedef enum
{
Ctr_STATUS_BIT_PENDING = (1 << 0), // Center is requested, but not yet activated
Ctr_STATUS_BIT_REMOVED = (1 << 1), // Center has been removed
} Ctr_Status_Bits_t;
typedef unsigned Ctr_Status_t;
#define Ctr_MAX_STATUS ((Ctr_Status_t) 3)
#define Ctr_WRONG_STATUS ((Ctr_Status_t) (Ctr_MAX_STATUS + 1))
#define Ctr_NUM_STATUS_TXT 4
typedef enum
{
Ctr_STATUS_UNKNOWN = 0, // Other
Ctr_STATUS_ACTIVE = 1, // 00 (Status == 0)
Ctr_STATUS_PENDING = 2, // 01 (Status == Ctr_STATUS_BIT_PENDING)
Ctr_STATUS_REMOVED = 3, // 1- (Status & Ctr_STATUS_BIT_REMOVED)
} Ctr_StatusTxt_t;
#define Ctr_MAX_CENTERS_PER_USR 10 // Used in list of my centers #define Ctr_MAX_CENTERS_PER_USR 10 // Used in list of my centers
struct Ctr_Center struct Ctr_Center
@ -65,7 +46,7 @@ struct Ctr_Center
long CtrCod; // Center code long CtrCod; // Center code
long InsCod; // Institution code long InsCod; // Institution code
long PlcCod; // Place code long PlcCod; // Place code
Ctr_Status_t Status; // Center status Hie_Status_t Status; // Center status
long RequesterUsrCod; // User code of the person who requested the creation of this center long RequesterUsrCod; // User code of the person who requested the creation of this center
struct Map_Coordinates Coord; // Geographical coordinates struct Map_Coordinates Coord; // Geographical coordinates
char ShrtName[Cns_HIERARCHY_MAX_BYTES_SHRT_NAME + 1]; char ShrtName[Cns_HIERARCHY_MAX_BYTES_SHRT_NAME + 1];

View File

@ -34,6 +34,7 @@
#include "swad_error.h" #include "swad_error.h"
#include "swad_global.h" #include "swad_global.h"
#include "swad_hierarchy.h" #include "swad_hierarchy.h"
#include "swad_hierarchy_database.h"
#include "swad_search.h" #include "swad_search.h"
/*****************************************************************************/ /*****************************************************************************/
@ -46,7 +47,7 @@ extern struct Globals Gbl;
/***************************** Create a new center ***************************/ /***************************** Create a new center ***************************/
/*****************************************************************************/ /*****************************************************************************/
long Ctr_DB_CreateCenter (const struct Ctr_Center *Ctr,Ctr_Status_t Status) long Ctr_DB_CreateCenter (const struct Ctr_Center *Ctr,Hie_Status_t Status)
{ {
return return
DB_QueryINSERTandReturnCode ("can not create a new center", DB_QueryINSERTandReturnCode ("can not create a new center",
@ -187,7 +188,7 @@ unsigned Ctr_DB_GetCtrsWithPendingDegs (MYSQL_RES **mysql_res)
" AND deg_degrees.CtrCod=ctr_centers.CtrCod" " AND deg_degrees.CtrCod=ctr_centers.CtrCod"
" GROUP BY deg_degrees.CtrCod" " GROUP BY deg_degrees.CtrCod"
" ORDER BY ctr_centers.ShortName", " ORDER BY ctr_centers.ShortName",
(unsigned) Deg_STATUS_BIT_PENDING, (unsigned) Hie_STATUS_BIT_PENDING,
Gbl.Usrs.Me.UsrDat.UsrCod); Gbl.Usrs.Me.UsrDat.UsrCod);
case Rol_SYS_ADM: case Rol_SYS_ADM:
return (unsigned) return (unsigned)
@ -200,7 +201,7 @@ unsigned Ctr_DB_GetCtrsWithPendingDegs (MYSQL_RES **mysql_res)
" AND deg_degrees.CtrCod=ctr_centers.CtrCod" " AND deg_degrees.CtrCod=ctr_centers.CtrCod"
" GROUP BY deg_degrees.CtrCod" " GROUP BY deg_degrees.CtrCod"
" ORDER BY ctr_centers.ShortName", " ORDER BY ctr_centers.ShortName",
(unsigned) Deg_STATUS_BIT_PENDING); (unsigned) Hie_STATUS_BIT_PENDING);
default: // Forbidden for other users default: // Forbidden for other users
Err_WrongRoleExit (); Err_WrongRoleExit ();
return 0; // Not reached return 0; // Not reached
@ -594,7 +595,7 @@ void Ctr_DB_UpdateCtrCoordinate (long CtrCod,
/******************** Update status in table of centers **********************/ /******************** Update status in table of centers **********************/
/*****************************************************************************/ /*****************************************************************************/
void Ctr_DB_UpdateCtrStatus (long CtrCod,Ctr_Status_t NewStatus) void Ctr_DB_UpdateCtrStatus (long CtrCod,Hie_Status_t NewStatus)
{ {
DB_QueryUPDATE ("can not update the status of a center", DB_QueryUPDATE ("can not update the status of a center",
"UPDATE ctr_centers" "UPDATE ctr_centers"

View File

@ -38,7 +38,7 @@
/****************************** Public prototypes ****************************/ /****************************** Public prototypes ****************************/
/*****************************************************************************/ /*****************************************************************************/
long Ctr_DB_CreateCenter (const struct Ctr_Center *Ctr,Ctr_Status_t Status); long Ctr_DB_CreateCenter (const struct Ctr_Center *Ctr,Hie_Status_t Status);
unsigned Ctr_DB_GetListOfCtrsInCurrentIns (MYSQL_RES **mysql_res); unsigned Ctr_DB_GetListOfCtrsInCurrentIns (MYSQL_RES **mysql_res);
unsigned Ctr_DB_GetListOfCtrsFull (MYSQL_RES **mysql_res,long InsCod); unsigned Ctr_DB_GetListOfCtrsFull (MYSQL_RES **mysql_res,long InsCod);
@ -74,7 +74,7 @@ void Ctr_DB_UpdateCtrWWW (long CtrCod,const char NewWWW[Cns_MAX_BYTES_WWW + 1]);
void Ctr_DB_UpdateCtrPhotoAttribution (long CtrCod,const char NewPhotoAttribution[Med_MAX_BYTES_ATTRIBUTION + 1]); void Ctr_DB_UpdateCtrPhotoAttribution (long CtrCod,const char NewPhotoAttribution[Med_MAX_BYTES_ATTRIBUTION + 1]);
void Ctr_DB_UpdateCtrCoordinate (long CtrCod, void Ctr_DB_UpdateCtrCoordinate (long CtrCod,
const char *CoordField,double NewCoord); const char *CoordField,double NewCoord);
void Ctr_DB_UpdateCtrStatus (long CtrCod,Ctr_Status_t NewStatus); void Ctr_DB_UpdateCtrStatus (long CtrCod,Hie_Status_t NewStatus);
bool Ctr_DB_CheckIfMapIsAvailableInIns (long InsCod); bool Ctr_DB_CheckIfMapIsAvailableInIns (long InsCod);

View File

@ -602,14 +602,15 @@ TODO: FIX BUG, URGENT! En las fechas como par
TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo. TODO: En las encuestas, que los estudiantes no puedan ver los resultados hasta que no finalice el plazo.
*/ */
#define Log_PLATFORM_VERSION "SWAD 21.55.2 (2021-11-10)" #define Log_PLATFORM_VERSION "SWAD 21.56 (2021-11-10)"
#define CSS_FILE "swad20.45.css" #define CSS_FILE "swad20.45.css"
#define JS_FILE "swad20.69.1.js" #define JS_FILE "swad20.69.1.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 21.55.2: Nov 10, 2021 Code refactoring in switch statements (until swad_button.c). (? lines) Version 21.56: Nov 10, 2021 Code refactoring in hierarchy. (319618 lines)
Version 21.55.2: Nov 10, 2021 Code refactoring in switch statements (until swad_button.c). (319875 lines)
Version 21.55.1: Nov 09, 2021 Removed unused comments. (319893 lines) Version 21.55.1: Nov 09, 2021 Removed unused comments. (319893 lines)
Version 21.55: Nov 09, 2021 New module swad_template. Removed unused comments. (320885 lines) Version 21.55: Nov 09, 2021 New module swad_template. Removed unused comments. (320885 lines)
Version 21.54.8: Nov 09, 2021 Queries moved from API module to database modules. (322179 lines) Version 21.54.8: Nov 09, 2021 Queries moved from API module to database modules. (322179 lines)

View File

@ -550,6 +550,19 @@ static void Con_ShowConnectedUsrsCurrentCrsOneByOneOnRightColumn (Rol_Role_t Rol
static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role) static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role)
{ {
extern const char *Txt_View_record_for_this_course; extern const char *Txt_View_record_for_this_course;
static const Act_Action_t NextAction[Rol_NUM_ROLES] =
{
[Rol_UNK ] = ActUnk,
[Rol_GST ] = ActUnk,
[Rol_USR ] = ActUnk,
[Rol_STD ] = ActSeeRecOneStd,
[Rol_NET ] = ActSeeRecOneTch,
[Rol_TCH ] = ActSeeRecOneTch,
[Rol_DEG_ADM] = ActUnk,
[Rol_CTR_ADM] = ActUnk,
[Rol_INS_ADM] = ActUnk,
[Rol_SYS_ADM] = ActUnk,
};
const char *ClassTxt; const char *ClassTxt;
const char *ClassLink; const char *ClassLink;
long UsrCod; long UsrCod;
@ -599,19 +612,9 @@ static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role)
// The form must be unique because // The form must be unique because
// the list of connected users // the list of connected users
// is dynamically updated via AJAX // is dynamically updated via AJAX
switch (Role) if (NextAction[Role] == ActUnk)
{ Err_WrongRoleExit ();
case Rol_STD: Frm_BeginFormUnique (NextAction[Role]);
Frm_BeginFormUnique (ActSeeRecOneStd);
break;
case Rol_NET:
case Rol_TCH:
Frm_BeginFormUnique (ActSeeRecOneTch);
break;
default:
Err_WrongRoleExit ();
break;
}
Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod); Usr_PutParamUsrCodEncrypted (UsrDat->EnUsrCod);
HTM_DIV_Begin ("class=\"CON_NAME_NARROW\""); // Limited width HTM_DIV_Begin ("class=\"CON_NAME_NARROW\""); // Limited width
@ -647,6 +650,19 @@ static void Con_WriteRowConnectedUsrOnRightColumn (Rol_Role_t Role)
static void Con_ShowConnectedUsrsCurrentLocationOneByOneOnMainZone (Rol_Role_t Role) static void Con_ShowConnectedUsrsCurrentLocationOneByOneOnMainZone (Rol_Role_t Role)
{ {
static const Act_Action_t NextAction[Rol_NUM_ROLES] =
{
[Rol_UNK ] = ActUnk,
[Rol_GST ] = ActUnk,
[Rol_USR ] = ActUnk,
[Rol_STD ] = ActSeeRecOneStd,
[Rol_NET ] = ActSeeRecOneTch,
[Rol_TCH ] = ActSeeRecOneTch,
[Rol_DEG_ADM] = ActUnk,
[Rol_CTR_ADM] = ActUnk,
[Rol_INS_ADM] = ActUnk,
[Rol_SYS_ADM] = ActUnk,
};
MYSQL_RES *mysql_res; MYSQL_RES *mysql_res;
MYSQL_ROW row; MYSQL_ROW row;
unsigned NumUsrs = 0; // Initialized to avoid warning unsigned NumUsrs = 0; // Initialized to avoid warning
@ -708,20 +724,12 @@ static void Con_ShowConnectedUsrsCurrentLocationOneByOneOnMainZone (Rol_Role_t R
ClassLink = "BT_LINK CON_NAME_WIDE CON_NO_CRS"; ClassLink = "BT_LINK CON_NAME_WIDE CON_NO_CRS";
} }
HTM_TD_Begin ("class=\"%s COLOR%u\"",ClassTxt,Gbl.RowEvenOdd); HTM_TD_Begin ("class=\"%s COLOR%u\"",ClassTxt,Gbl.RowEvenOdd);
if (PutLinkToRecord) if (PutLinkToRecord)
{ {
switch (Role) if (NextAction[Role] == ActUnk)
{ Err_WrongRoleExit ();
case Rol_STD: Frm_BeginForm (NextAction[Role]);
Frm_BeginForm (ActSeeRecOneStd);
break;
case Rol_NET:
case Rol_TCH:
Frm_BeginForm (ActSeeRecOneTch);
break;
default:
Err_WrongRoleExit ();
}
Usr_PutParamUsrCodEncrypted (UsrDat.EnUsrCod); Usr_PutParamUsrCodEncrypted (UsrDat.EnUsrCod);
} }
@ -735,6 +743,7 @@ static void Con_ShowConnectedUsrsCurrentLocationOneByOneOnMainZone (Rol_Role_t R
if (PutLinkToRecord) if (PutLinkToRecord)
Frm_EndForm (); Frm_EndForm ();
HTM_TD_End (); HTM_TD_End ();
/***** Write time from last access *****/ /***** Write time from last access *****/

View File

@ -34,6 +34,7 @@
#include "swad_error.h" #include "swad_error.h"
#include "swad_global.h" #include "swad_global.h"
#include "swad_hierarchy.h" #include "swad_hierarchy.h"
#include "swad_hierarchy_database.h"
#include "swad_search.h" #include "swad_search.h"
/*****************************************************************************/ /*****************************************************************************/
@ -137,7 +138,7 @@ unsigned Cty_DB_GetCtysWithPendingInss (MYSQL_RES **mysql_res)
" AND ins_instits.CtyCod=cty_countrs.CtyCod" " AND ins_instits.CtyCod=cty_countrs.CtyCod"
" GROUP BY ins_instits.CtyCod" " GROUP BY ins_instits.CtyCod"
" ORDER BY cty_countrs.Name_%s", " ORDER BY cty_countrs.Name_%s",
(unsigned) Ins_STATUS_BIT_PENDING, (unsigned) Hie_STATUS_BIT_PENDING,
Lan_STR_LANG_ID[Gbl.Prefs.Language]); Lan_STR_LANG_ID[Gbl.Prefs.Language]);
} }

View File

@ -100,28 +100,21 @@ static void Crs_PutIconToViewCourses (void);
static void Crs_ListCoursesForEdition (void); static void Crs_ListCoursesForEdition (void);
static void Crs_ListCoursesOfAYearForEdition (unsigned Year); static void Crs_ListCoursesOfAYearForEdition (unsigned Year);
static bool Crs_CheckIfICanEdit (struct Crs_Course *Crs); static bool Crs_CheckIfICanEdit (struct Crs_Course *Crs);
static Crs_StatusTxt_t Crs_GetStatusTxtFromStatusBits (Crs_Status_t Status);
static Crs_Status_t Crs_GetStatusBitsFromStatusTxt (Crs_StatusTxt_t StatusTxt);
static void Crs_PutFormToCreateCourse (void); static void Crs_PutFormToCreateCourse (void);
static void Crs_PutHeadCoursesForSeeing (void); static void Crs_PutHeadCoursesForSeeing (void);
static void Crs_PutHeadCoursesForEdition (void); static void Crs_PutHeadCoursesForEdition (void);
static void Crs_ReceiveFormRequestOrCreateCrs (unsigned Status); static void Crs_ReceiveFormRequestOrCreateCrs (Hie_Status_t Status);
static void Crs_GetParamsNewCourse (struct Crs_Course *Crs); static void Crs_GetParamsNewCourse (struct Crs_Course *Crs);
static void Crs_GetDataOfCourseFromRow (struct Crs_Course *Crs,MYSQL_ROW row); static void Crs_GetDataOfCourseFromRow (struct Crs_Course *Crs,MYSQL_ROW row);
static void Crs_EmptyCourseCompletely (long CrsCod); static void Crs_EmptyCourseCompletely (long CrsCod);
static void Crs_UpdateCrsStatus (struct Crs_Course *Crs,Crs_Status_t Status);
static void Crs_PutButtonToGoToCrs (void); static void Crs_PutButtonToGoToCrs (void);
static void Crs_PutButtonToRegisterInCrs (void); static void Crs_PutButtonToRegisterInCrs (void);
static void Crs_PutIconToSearchCourses (__attribute__((unused)) void *Args); static void Crs_PutIconToSearchCourses (__attribute__((unused)) void *Args);
static void Crs_PutParamOtherCrsCod (void *CrsCod);
static long Crs_GetAndCheckParamOtherCrsCod (long MinCodAllowed);
static void Crs_WriteRowCrsData (unsigned NumCrs,MYSQL_ROW row,bool WriteColumnAccepted); static void Crs_WriteRowCrsData (unsigned NumCrs,MYSQL_ROW row,bool WriteColumnAccepted);
static void Crs_EditingCourseConstructor (void); static void Crs_EditingCourseConstructor (void);
@ -938,13 +931,12 @@ static bool Crs_ListCoursesOfAYearForSeeing (unsigned Year)
extern const char *Txt_COURSE_With_users; extern const char *Txt_COURSE_With_users;
extern const char *Txt_COURSE_Without_users; extern const char *Txt_COURSE_Without_users;
extern const char *Txt_YEAR_OF_DEGREE[1 + Deg_MAX_YEARS_PER_DEGREE]; extern const char *Txt_YEAR_OF_DEGREE[1 + Deg_MAX_YEARS_PER_DEGREE];
extern const char *Txt_COURSE_STATUS[Crs_NUM_STATUS_TXT]; extern const char *Txt_COURSE_STATUS[Hie_NUM_STATUS_TXT];
unsigned NumCrs; unsigned NumCrs;
struct Crs_Course *Crs; struct Crs_Course *Crs;
const char *TxtClassNormal; const char *TxtClassNormal;
const char *TxtClassStrong; const char *TxtClassStrong;
const char *BgColor; const char *BgColor;
Crs_StatusTxt_t StatusTxt;
bool ThisYearHasCourses = false; bool ThisYearHasCourses = false;
unsigned NumUsrs[Rol_NUM_ROLES]; unsigned NumUsrs[Rol_NUM_ROLES];
@ -957,7 +949,7 @@ static bool Crs_ListCoursesOfAYearForSeeing (unsigned Year)
if (Crs->Year == Year) // The year of the course is this? if (Crs->Year == Year) // The year of the course is this?
{ {
ThisYearHasCourses = true; ThisYearHasCourses = true;
if (Crs->Status & Crs_STATUS_BIT_PENDING) if (Crs->Status & Hie_STATUS_BIT_PENDING)
{ {
TxtClassNormal = "DAT_LIGHT"; TxtClassNormal = "DAT_LIGHT";
TxtClassStrong = "BT_LINK LT DAT_LIGHT"; TxtClassStrong = "BT_LINK LT DAT_LIGHT";
@ -1025,11 +1017,7 @@ static bool Crs_ListCoursesOfAYearForSeeing (unsigned Year)
HTM_TD_End (); HTM_TD_End ();
/* Course status */ /* Course status */
StatusTxt = Crs_GetStatusTxtFromStatusBits (Crs->Status); Hie_WriteStatusCell (Crs->Status,TxtClassNormal,BgColor,Txt_COURSE_STATUS);
HTM_TD_Begin ("class=\"%s LM %s\"",TxtClassNormal,BgColor);
if (StatusTxt != Crs_STATUS_ACTIVE) // If active ==> do not show anything
HTM_Txt (Txt_COURSE_STATUS[StatusTxt]);
HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
} }
@ -1151,15 +1139,13 @@ static void Crs_ListCoursesForEdition (void)
static void Crs_ListCoursesOfAYearForEdition (unsigned Year) static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
{ {
extern const char *Txt_YEAR_OF_DEGREE[1 + Deg_MAX_YEARS_PER_DEGREE]; extern const char *Txt_YEAR_OF_DEGREE[1 + Deg_MAX_YEARS_PER_DEGREE];
extern const char *Txt_COURSE_STATUS[Crs_NUM_STATUS_TXT]; extern const char *Txt_COURSE_STATUS[Hie_NUM_STATUS_TXT];
struct Crs_Course *Crs; struct Crs_Course *Crs;
unsigned YearAux; unsigned YearAux;
unsigned NumCrs; unsigned NumCrs;
struct UsrData UsrDat; struct UsrData UsrDat;
bool ICanEdit; bool ICanEdit;
unsigned NumUsrs[Rol_NUM_ROLES]; unsigned NumUsrs[Rol_NUM_ROLES];
Crs_StatusTxt_t StatusTxt;
unsigned StatusUnsigned;
/***** Initialize structure with user's data *****/ /***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat); Usr_UsrDataConstructor (&UsrDat);
@ -1191,7 +1177,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
Ico_PutIconRemovalNotAllowed (); Ico_PutIconRemovalNotAllowed ();
else // Crs->NumUsrs == 0 && ICanEdit else // Crs->NumUsrs == 0 && ICanEdit
Ico_PutContextualIconToRemove (ActRemCrs,NULL, Ico_PutContextualIconToRemove (ActRemCrs,NULL,
Crs_PutParamOtherCrsCod,&Crs->CrsCod); Hie_PutParamOtherHieCod,&Crs->CrsCod);
HTM_TD_End (); HTM_TD_End ();
/* Course code */ /* Course code */
@ -1204,7 +1190,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActChgInsCrsCod); Frm_BeginForm (ActChgInsCrsCod);
Crs_PutParamOtherCrsCod (&Crs->CrsCod); Hie_PutParamOtherHieCod (&Crs->CrsCod);
HTM_INPUT_TEXT ("InsCrsCod",Crs_MAX_CHARS_INSTITUTIONAL_CRS_COD, HTM_INPUT_TEXT ("InsCrsCod",Crs_MAX_CHARS_INSTITUTIONAL_CRS_COD,
Crs->InstitutionalCrsCod,HTM_SUBMIT_ON_CHANGE, Crs->InstitutionalCrsCod,HTM_SUBMIT_ON_CHANGE,
"class=\"INPUT_INS_CODE\""); "class=\"INPUT_INS_CODE\"");
@ -1219,7 +1205,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActChgCrsYea); Frm_BeginForm (ActChgCrsYea);
Crs_PutParamOtherCrsCod (&Crs->CrsCod); Hie_PutParamOtherHieCod (&Crs->CrsCod);
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE, HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,
"name=\"OthCrsYear\" class=\"HIE_SEL_NARROW\""); "name=\"OthCrsYear\" class=\"HIE_SEL_NARROW\"");
for (YearAux = 0; for (YearAux = 0;
@ -1242,7 +1228,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActRenCrsSho); Frm_BeginForm (ActRenCrsSho);
Crs_PutParamOtherCrsCod (&Crs->CrsCod); Hie_PutParamOtherHieCod (&Crs->CrsCod);
HTM_INPUT_TEXT ("ShortName",Cns_HIERARCHY_MAX_CHARS_SHRT_NAME,Crs->ShrtName, HTM_INPUT_TEXT ("ShortName",Cns_HIERARCHY_MAX_CHARS_SHRT_NAME,Crs->ShrtName,
HTM_SUBMIT_ON_CHANGE, HTM_SUBMIT_ON_CHANGE,
"class=\"INPUT_SHORT_NAME\""); "class=\"INPUT_SHORT_NAME\"");
@ -1257,7 +1243,7 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActRenCrsFul); Frm_BeginForm (ActRenCrsFul);
Crs_PutParamOtherCrsCod (&Crs->CrsCod); Hie_PutParamOtherHieCod (&Crs->CrsCod);
HTM_INPUT_TEXT ("FullName",Cns_HIERARCHY_MAX_CHARS_FULL_NAME,Crs->FullName, HTM_INPUT_TEXT ("FullName",Cns_HIERARCHY_MAX_CHARS_FULL_NAME,Crs->FullName,
HTM_SUBMIT_ON_CHANGE, HTM_SUBMIT_ON_CHANGE,
"class=\"INPUT_FULL_NAME\""); "class=\"INPUT_FULL_NAME\"");
@ -1288,30 +1274,9 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
HTM_TD_End (); HTM_TD_End ();
/* Course status */ /* Course status */
StatusTxt = Crs_GetStatusTxtFromStatusBits (Crs->Status); Hie_WriteStatusCellEditable (Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM,
HTM_TD_Begin ("class=\"DAT LM\""); Crs->Status,ActChgCrsSta,Crs->CrsCod,
if (Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM && Txt_COURSE_STATUS);
StatusTxt == Crs_STATUS_PENDING)
{
Frm_BeginForm (ActChgCrsSta);
Crs_PutParamOtherCrsCod (&Crs->CrsCod);
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,
"name=\"Status\" class=\"INPUT_STATUS\"");
StatusUnsigned = (unsigned) Crs_GetStatusBitsFromStatusTxt (Crs_STATUS_PENDING);
HTM_OPTION (HTM_Type_UNSIGNED,&StatusUnsigned,true,false,
"%s",Txt_COURSE_STATUS[Crs_STATUS_PENDING]);
StatusUnsigned = (unsigned) Crs_GetStatusBitsFromStatusTxt (Crs_STATUS_ACTIVE);
HTM_OPTION (HTM_Type_UNSIGNED,&StatusUnsigned,false,false,
"%s",Txt_COURSE_STATUS[Crs_STATUS_ACTIVE]);
HTM_SELECT_End ();
Frm_EndForm ();
}
else if (StatusTxt != Crs_STATUS_ACTIVE) // If active ==> do not show anything
HTM_Txt (Txt_COURSE_STATUS[StatusTxt]);
HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
} }
@ -1328,52 +1293,10 @@ static void Crs_ListCoursesOfAYearForEdition (unsigned Year)
static bool Crs_CheckIfICanEdit (struct Crs_Course *Crs) static bool Crs_CheckIfICanEdit (struct Crs_Course *Crs)
{ {
return (bool) (Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM || // I am a degree administrator or higher return (bool) (Gbl.Usrs.Me.Role.Logged >= Rol_DEG_ADM || // I am a degree administrator or higher
((Crs->Status & Crs_STATUS_BIT_PENDING) != 0 && // Course is not yet activated ((Crs->Status & Hie_STATUS_BIT_PENDING) != 0 && // Course is not yet activated
Gbl.Usrs.Me.UsrDat.UsrCod == Crs->RequesterUsrCod)); // I am the requester Gbl.Usrs.Me.UsrDat.UsrCod == Crs->RequesterUsrCod)); // I am the requester
} }
/*****************************************************************************/
/******************* Set StatusTxt depending on status bits ******************/
/*****************************************************************************/
// Crs_STATUS_UNKNOWN = 0 // Other
// Crs_STATUS_ACTIVE = 1 // 00 (Status == 0)
// Crs_STATUS_PENDING = 2 // 01 (Status == Crs_STATUS_BIT_PENDING)
// Crs_STATUS_REMOVED = 3 // 1- (Status & Crs_STATUS_BIT_REMOVED)
static Crs_StatusTxt_t Crs_GetStatusTxtFromStatusBits (Crs_Status_t Status)
{
if (Status == 0)
return Crs_STATUS_ACTIVE;
if (Status == Crs_STATUS_BIT_PENDING)
return Crs_STATUS_PENDING;
if (Status & Crs_STATUS_BIT_REMOVED)
return Crs_STATUS_REMOVED;
return Crs_STATUS_UNKNOWN;
}
/*****************************************************************************/
/******************* Set status bits depending on StatusTxt ******************/
/*****************************************************************************/
// Crs_STATUS_UNKNOWN = 0 // Other
// Crs_STATUS_ACTIVE = 1 // 00 (Status == 0)
// Crs_STATUS_PENDING = 2 // 01 (Status == Crs_STATUS_BIT_PENDING)
// Crs_STATUS_REMOVED = 3 // 1- (Status & Crs_STATUS_BIT_REMOVED)
static Crs_Status_t Crs_GetStatusBitsFromStatusTxt (Crs_StatusTxt_t StatusTxt)
{
switch (StatusTxt)
{
case Crs_STATUS_UNKNOWN:
case Crs_STATUS_ACTIVE:
return (Crs_Status_t) 0;
case Crs_STATUS_PENDING:
return Crs_STATUS_BIT_PENDING;
case Crs_STATUS_REMOVED:
return Crs_STATUS_BIT_REMOVED;
}
return (Crs_Status_t) 0;
}
/*****************************************************************************/ /*****************************************************************************/
/*********************** Put a form to create a new course *******************/ /*********************** Put a form to create a new course *******************/
/*****************************************************************************/ /*****************************************************************************/
@ -1541,7 +1464,7 @@ void Crs_ReceiveFormReqCrs (void)
Crs_EditingCourseConstructor (); Crs_EditingCourseConstructor ();
/***** Receive form to request a new course *****/ /***** Receive form to request a new course *****/
Crs_ReceiveFormRequestOrCreateCrs ((unsigned) Crs_STATUS_BIT_PENDING); Crs_ReceiveFormRequestOrCreateCrs ((Hie_Status_t) Hie_STATUS_BIT_PENDING);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1554,14 +1477,14 @@ void Crs_ReceiveFormNewCrs (void)
Crs_EditingCourseConstructor (); Crs_EditingCourseConstructor ();
/***** Receive form to create a new course *****/ /***** Receive form to create a new course *****/
Crs_ReceiveFormRequestOrCreateCrs (0); Crs_ReceiveFormRequestOrCreateCrs ((Hie_Status_t) 0);
} }
/*****************************************************************************/ /*****************************************************************************/
/************* Receive form to request or create a new course ****************/ /************* Receive form to request or create a new course ****************/
/*****************************************************************************/ /*****************************************************************************/
static void Crs_ReceiveFormRequestOrCreateCrs (unsigned Status) static void Crs_ReceiveFormRequestOrCreateCrs (Hie_Status_t Status)
{ {
extern const char *Txt_The_course_X_already_exists; extern const char *Txt_The_course_X_already_exists;
extern const char *Txt_Created_new_course_X; extern const char *Txt_Created_new_course_X;
@ -1648,7 +1571,7 @@ void Crs_RemoveCourse (void)
Crs_EditingCourseConstructor (); Crs_EditingCourseConstructor ();
/***** Get course code *****/ /***** Get course code *****/
Crs_EditingCrs->CrsCod = Crs_GetAndCheckParamOtherCrsCod (1); Crs_EditingCrs->CrsCod = Hie_GetAndCheckParamOtherHieCod (1);
/***** Get data of the course from database *****/ /***** Get data of the course from database *****/
Crs_GetDataOfCourseByCod (Crs_EditingCrs); Crs_GetDataOfCourseByCod (Crs_EditingCrs);
@ -1691,7 +1614,7 @@ bool Crs_GetDataOfCourseByCod (struct Crs_Course *Crs)
/***** Clear data *****/ /***** Clear data *****/
Crs->DegCod = -1L; Crs->DegCod = -1L;
Crs->Year = 0; Crs->Year = 0;
Crs->Status = (Crs_Status_t) 0; Crs->Status = (Hie_Status_t) 0;
Crs->RequesterUsrCod = -1L; Crs->RequesterUsrCod = -1L;
Crs->ShrtName[0] = '\0'; Crs->ShrtName[0] = '\0';
Crs->FullName[0] = '\0'; Crs->FullName[0] = '\0';
@ -1883,7 +1806,7 @@ void Crs_ChangeInsCrsCod (void)
/***** Get parameters from form *****/ /***** Get parameters from form *****/
/* Get course code */ /* Get course code */
Crs_EditingCrs->CrsCod = Crs_GetAndCheckParamOtherCrsCod (1); Crs_EditingCrs->CrsCod = Hie_GetAndCheckParamOtherHieCod (1);
/* Get institutional code */ /* Get institutional code */
Par_GetParToText ("InsCrsCod",NewInstitutionalCrsCod,Crs_MAX_BYTES_INSTITUTIONAL_CRS_COD); Par_GetParToText ("InsCrsCod",NewInstitutionalCrsCod,Crs_MAX_BYTES_INSTITUTIONAL_CRS_COD);
@ -1929,7 +1852,7 @@ void Crs_ChangeCrsYear (void)
/***** Get parameters from form *****/ /***** Get parameters from form *****/
/* Get course code */ /* Get course code */
Crs_EditingCrs->CrsCod = Crs_GetAndCheckParamOtherCrsCod (1); Crs_EditingCrs->CrsCod = Hie_GetAndCheckParamOtherHieCod (1);
/* Get parameter with year */ /* Get parameter with year */
Par_GetParToText ("OthCrsYear",YearStr,2); Par_GetParToText ("OthCrsYear",YearStr,2);
@ -2002,19 +1925,6 @@ void Crs_UpdateCrsYear (struct Crs_Course *Crs,unsigned NewYear)
Crs->Year = NewYear; Crs->Year = NewYear;
} }
/*****************************************************************************/
/********************** Change the status of a course ************************/
/*****************************************************************************/
static void Crs_UpdateCrsStatus (struct Crs_Course *Crs,Crs_Status_t Status)
{
/***** Update status in table of courses *****/
Crs_DB_UpdateCrsStatus (Crs->CrsCod,Status);
/***** Copy course status *****/
Crs->Status = Status;
}
/*****************************************************************************/ /*****************************************************************************/
/************************ Change the name of a course ************************/ /************************ Change the name of a course ************************/
/*****************************************************************************/ /*****************************************************************************/
@ -2025,7 +1935,7 @@ void Crs_RenameCourseShort (void)
Crs_EditingCourseConstructor (); Crs_EditingCourseConstructor ();
/***** Rename course *****/ /***** Rename course *****/
Crs_EditingCrs->CrsCod = Crs_GetAndCheckParamOtherCrsCod (1); Crs_EditingCrs->CrsCod = Hie_GetAndCheckParamOtherHieCod (1);
Crs_RenameCourse (Crs_EditingCrs,Cns_SHRT_NAME); Crs_RenameCourse (Crs_EditingCrs,Cns_SHRT_NAME);
} }
@ -2035,7 +1945,7 @@ void Crs_RenameCourseFull (void)
Crs_EditingCourseConstructor (); Crs_EditingCourseConstructor ();
/***** Rename course *****/ /***** Rename course *****/
Crs_EditingCrs->CrsCod = Crs_GetAndCheckParamOtherCrsCod (1); Crs_EditingCrs->CrsCod = Hie_GetAndCheckParamOtherHieCod (1);
Crs_RenameCourse (Crs_EditingCrs,Cns_FULL_NAME); Crs_RenameCourse (Crs_EditingCrs,Cns_FULL_NAME);
} }
@ -2125,32 +2035,24 @@ void Crs_RenameCourse (struct Crs_Course *Crs,Cns_ShrtOrFullName_t ShrtOrFullNam
void Crs_ChangeCrsStatus (void) void Crs_ChangeCrsStatus (void)
{ {
extern const char *Txt_The_status_of_the_course_X_has_changed; extern const char *Txt_The_status_of_the_course_X_has_changed;
Crs_Status_t Status; Hie_Status_t Status;
Crs_StatusTxt_t StatusTxt;
/***** Course constructor *****/ /***** Course constructor *****/
Crs_EditingCourseConstructor (); Crs_EditingCourseConstructor ();
/***** Get parameters from form *****/ /***** Get parameters from form *****/
/* Get course code */ /* Get course code */
Crs_EditingCrs->CrsCod = Crs_GetAndCheckParamOtherCrsCod (1); Crs_EditingCrs->CrsCod = Hie_GetAndCheckParamOtherHieCod (1);
/* Get parameter with status */ /* Get parameter with status */
Status = (Crs_Status_t) Status = Hie_GetParamStatus (); // New status
Par_GetParToUnsignedLong ("Status",
0,
(unsigned long) Crs_MAX_STATUS,
(unsigned long) Crs_WRONG_STATUS);
if (Status == Crs_WRONG_STATUS)
Err_WrongStatusExit ();
StatusTxt = Crs_GetStatusTxtFromStatusBits (Status);
Status = Crs_GetStatusBitsFromStatusTxt (StatusTxt); // New status
/***** Get data of course *****/ /***** Get data of course *****/
Crs_GetDataOfCourseByCod (Crs_EditingCrs); Crs_GetDataOfCourseByCod (Crs_EditingCrs);
/***** Update status *****/ /***** Update status *****/
Crs_UpdateCrsStatus (Crs_EditingCrs,Status); Crs_DB_UpdateCrsStatus (Crs_EditingCrs->CrsCod,Status);
Crs_EditingCrs->Status = Status;
/***** Create alert to show the change made *****/ /***** Create alert to show the change made *****/
Ale_CreateAlert (Ale_SUCCESS,NULL, Ale_CreateAlert (Ale_SUCCESS,NULL,
@ -2334,31 +2236,6 @@ void Crs_PutParamCrsCod (long CrsCod)
Par_PutHiddenParamLong (NULL,"crs",CrsCod); Par_PutHiddenParamLong (NULL,"crs",CrsCod);
} }
/*****************************************************************************/
/******************** Write parameter with code of course ********************/
/*****************************************************************************/
static void Crs_PutParamOtherCrsCod (void *CrsCod)
{
if (CrsCod)
Par_PutHiddenParamLong (NULL,"OthCrsCod",*((long *) CrsCod));
}
/*****************************************************************************/
/********************* Get parameter with code of course *********************/
/*****************************************************************************/
static long Crs_GetAndCheckParamOtherCrsCod (long MinCodAllowed)
{
long CrsCod;
/***** Get and check parameter with code of course *****/
if ((CrsCod = Par_GetParToLong ("OthCrsCod")) < MinCodAllowed)
Err_WrongCourseExit ();
return CrsCod;
}
/*****************************************************************************/ /*****************************************************************************/
/************************** Write courses of a user **************************/ /************************** Write courses of a user **************************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -52,33 +52,14 @@
/******************************* Public types ********************************/ /******************************* Public types ********************************/
/*****************************************************************************/ /*****************************************************************************/
typedef enum
{
Crs_STATUS_BIT_PENDING = (1 << 0), // Course is requested, but not yet activated
Crs_STATUS_BIT_REMOVED = (1 << 1), // Course has been removed
} Crs_Status_Bits_t;
typedef unsigned Crs_Status_t;
#define Crs_MAX_STATUS ((Crs_Status_t) 3)
#define Crs_WRONG_STATUS ((Crs_Status_t) (Crs_MAX_STATUS + 1))
#define Crs_NUM_STATUS_TXT 4
typedef enum
{
Crs_STATUS_UNKNOWN = 0, // Other
Crs_STATUS_ACTIVE = 1, // 00 (Status == 0)
Crs_STATUS_PENDING = 2, // 01 (Status == Crs_STATUS_BIT_PENDING)
Crs_STATUS_REMOVED = 3, // 1- (Status & Crs_STATUS_BIT_REMOVED)
} Crs_StatusTxt_t;
struct Crs_Course struct Crs_Course
{ {
long CrsCod; long CrsCod;
char InstitutionalCrsCod[Crs_MAX_BYTES_INSTITUTIONAL_CRS_COD + 1]; // Institutional code of the course char InstitutionalCrsCod[Crs_MAX_BYTES_INSTITUTIONAL_CRS_COD + 1]; // Institutional code of the course
long DegCod; long DegCod;
unsigned Year; // Year: 0 (optatives), 1, 2, 3... unsigned Year; // Year: 0 (optatives), 1, 2, 3...
unsigned Status; // Course status Hie_Status_t Status; // Course status
long RequesterUsrCod; // User code of the person who requested the creation of this course long RequesterUsrCod; // User code of the person who requested the creation of this course
char ShrtName[Cns_HIERARCHY_MAX_BYTES_SHRT_NAME + 1]; // Short name of course char ShrtName[Cns_HIERARCHY_MAX_BYTES_SHRT_NAME + 1]; // Short name of course
char FullName[Cns_HIERARCHY_MAX_BYTES_FULL_NAME + 1]; // Full name of course char FullName[Cns_HIERARCHY_MAX_BYTES_FULL_NAME + 1]; // Full name of course
}; };

View File

@ -35,6 +35,7 @@
#include "swad_error.h" #include "swad_error.h"
#include "swad_global.h" #include "swad_global.h"
#include "swad_hierarchy.h" #include "swad_hierarchy.h"
#include "swad_hierarchy_database.h"
/*****************************************************************************/ /*****************************************************************************/
/************** External global variables from others modules ****************/ /************** External global variables from others modules ****************/
@ -46,7 +47,7 @@ extern struct Globals Gbl;
/************* Add a new requested course to pending requests ****************/ /************* Add a new requested course to pending requests ****************/
/*****************************************************************************/ /*****************************************************************************/
void Crs_DB_CreateCourse (struct Crs_Course *Crs,unsigned Status) void Crs_DB_CreateCourse (struct Crs_Course *Crs,Hie_Status_t Status)
{ {
/***** Insert new course into pending requests *****/ /***** Insert new course into pending requests *****/
Crs->CrsCod = Crs->CrsCod =
@ -60,7 +61,7 @@ void Crs_DB_CreateCourse (struct Crs_Course *Crs,unsigned Status)
Crs->DegCod, Crs->DegCod,
Crs->Year, Crs->Year,
Crs->InstitutionalCrsCod, Crs->InstitutionalCrsCod,
Status, (unsigned) Status,
Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.Usrs.Me.UsrDat.UsrCod,
Crs->ShrtName, Crs->ShrtName,
Crs->FullName); Crs->FullName);
@ -118,7 +119,7 @@ unsigned Crs_DB_GetCrssInCurrentDegFull (MYSQL_RES **mysql_res)
" ORDER BY Year," " ORDER BY Year,"
"ShortName", "ShortName",
Gbl.Hierarchy.Deg.DegCod, Gbl.Hierarchy.Deg.DegCod,
(unsigned) Crs_STATUS_BIT_REMOVED); // All courses except those removed (unsigned) Hie_STATUS_BIT_REMOVED); // All courses except those removed
} }
/*****************************************************************************/ /*****************************************************************************/
@ -497,20 +498,6 @@ void Crs_DB_UpdateCrsYear (long CrsCod,unsigned NewYear)
CrsCod); CrsCod);
} }
/*****************************************************************************/
/********************** Change the status of a course ************************/
/*****************************************************************************/
void Crs_DB_UpdateCrsStatus (long CrsCod,Crs_Status_t Status)
{
DB_QueryUPDATE ("can not update the status of a course",
"UPDATE crs_courses"
" SET Status=%u"
" WHERE CrsCod=%ld",
(unsigned) Status,
CrsCod);
}
/*****************************************************************************/ /*****************************************************************************/
/***************** Update course name in table of courses ********************/ /***************** Update course name in table of courses ********************/
/*****************************************************************************/ /*****************************************************************************/
@ -539,6 +526,20 @@ void Crs_DB_UpdateCrsDeg (long CrsCod,long DegCod)
CrsCod); CrsCod);
} }
/*****************************************************************************/
/********************** Change the status of a course ************************/
/*****************************************************************************/
void Crs_DB_UpdateCrsStatus (long CrsCod,Hie_Status_t Status)
{
DB_QueryUPDATE ("can not update the status of a course",
"UPDATE crs_courses"
" SET Status=%u"
" WHERE CrsCod=%ld",
(unsigned) Status,
CrsCod);
}
/*****************************************************************************/ /*****************************************************************************/
/***************** Update my last click in current course ********************/ /***************** Update my last click in current course ********************/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -35,7 +35,7 @@
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
void Crs_DB_CreateCourse (struct Crs_Course *Crs,unsigned Status); void Crs_DB_CreateCourse (struct Crs_Course *Crs,Hie_Status_t Status);
unsigned Crs_DB_GetCrssInDeg (MYSQL_RES **mysql_res,long DegCod); unsigned Crs_DB_GetCrssInDeg (MYSQL_RES **mysql_res,long DegCod);
unsigned Crs_DB_GetCrssInCurrentDegBasic (MYSQL_RES **mysql_res); unsigned Crs_DB_GetCrssInCurrentDegBasic (MYSQL_RES **mysql_res);
@ -65,10 +65,10 @@ unsigned Crs_DB_GetNumCrssWithUsrs (Rol_Role_t Role,
unsigned Crs_DB_GetCrssFromUsr (MYSQL_RES **mysql_res,long UsrCod,long DegCod); unsigned Crs_DB_GetCrssFromUsr (MYSQL_RES **mysql_res,long UsrCod,long DegCod);
void Crs_DB_UpdateInstitutionalCrsCod (long CrsCod,const char *NewInstitutionalCrsCod); void Crs_DB_UpdateInstitutionalCrsCod (long CrsCod,const char *NewInstitutionalCrsCod);
void Crs_DB_UpdateCrsStatus (long CrsCod,Crs_Status_t Status);
void Crs_DB_UpdateCrsYear (long CrsCod,unsigned NewYear); void Crs_DB_UpdateCrsYear (long CrsCod,unsigned NewYear);
void Crs_DB_UpdateCrsName (long CrsCod,const char *FieldName,const char *NewCrsName); void Crs_DB_UpdateCrsName (long CrsCod,const char *FieldName,const char *NewCrsName);
void Crs_DB_UpdateCrsDeg (long CrsCod,long DegCod); void Crs_DB_UpdateCrsDeg (long CrsCod,long DegCod);
void Crs_DB_UpdateCrsStatus (long CrsCod,Hie_Status_t Status);
void Crs_DB_UpdateCrsLastClick (void); void Crs_DB_UpdateCrsLastClick (void);

View File

@ -79,8 +79,6 @@ static struct Deg_Degree *Deg_EditingDeg = NULL; // Static variable to keep the
static void Deg_ListDegreesForEdition (void); static void Deg_ListDegreesForEdition (void);
static bool Deg_CheckIfICanEditADegree (struct Deg_Degree *Deg); static bool Deg_CheckIfICanEditADegree (struct Deg_Degree *Deg);
static Deg_StatusTxt_t Deg_GetStatusTxtFromStatusBits (Deg_Status_t Status);
static Deg_Status_t Deg_GetStatusBitsFromStatusTxt (Deg_StatusTxt_t StatusTxt);
static void Deg_PutFormToCreateDegree (void); static void Deg_PutFormToCreateDegree (void);
static void Deg_PutHeadDegreesForSeeing (void); static void Deg_PutHeadDegreesForSeeing (void);
static void Deg_PutHeadDegreesForEdition (void); static void Deg_PutHeadDegreesForEdition (void);
@ -94,8 +92,7 @@ static void Deg_ListOneDegreeForSeeing (struct Deg_Degree *Deg,unsigned NumDeg);
static void Deg_EditDegreesInternal (void); static void Deg_EditDegreesInternal (void);
static void Deg_PutIconsEditingDegrees (__attribute__((unused)) void *Args); static void Deg_PutIconsEditingDegrees (__attribute__((unused)) void *Args);
static void Deg_ReceiveFormRequestOrCreateDeg (unsigned Status); static void Deg_ReceiveFormRequestOrCreateDeg (Hie_Status_t Status);
static void Deg_PutParamOtherDegCod (void *DegCod);
static void Deg_GetDataOfDegreeFromRow (struct Deg_Degree *Deg,MYSQL_ROW row); static void Deg_GetDataOfDegreeFromRow (struct Deg_Degree *Deg,MYSQL_ROW row);
@ -303,7 +300,7 @@ void Deg_ShowDegsOfCurrentCtr (void)
static void Deg_ListDegreesForEdition (void) static void Deg_ListDegreesForEdition (void)
{ {
extern const char *Txt_DEGREE_STATUS[Deg_NUM_STATUS_TXT]; extern const char *Txt_DEGREE_STATUS[Hie_NUM_STATUS_TXT];
unsigned NumDeg; unsigned NumDeg;
struct DegreeType *DegTyp; struct DegreeType *DegTyp;
struct Deg_Degree *Deg; struct Deg_Degree *Deg;
@ -313,8 +310,6 @@ static void Deg_ListDegreesForEdition (void)
bool ICanEdit; bool ICanEdit;
unsigned NumCrss; unsigned NumCrss;
unsigned NumUsrsInCrssOfDeg; unsigned NumUsrsInCrssOfDeg;
Deg_StatusTxt_t StatusTxt;
unsigned StatusUnsigned;
/***** Initialize structure with user's data *****/ /***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat); Usr_UsrDataConstructor (&UsrDat);
@ -349,7 +344,7 @@ static void Deg_ListDegreesForEdition (void)
Ico_PutIconRemovalNotAllowed (); Ico_PutIconRemovalNotAllowed ();
else else
Ico_PutContextualIconToRemove (ActRemDeg,NULL, Ico_PutContextualIconToRemove (ActRemDeg,NULL,
Deg_PutParamOtherDegCod,&Deg->DegCod); Hie_PutParamOtherHieCod,&Deg->DegCod);
HTM_TD_End (); HTM_TD_End ();
/* Degree code */ /* Degree code */
@ -367,7 +362,7 @@ static void Deg_ListDegreesForEdition (void)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActRenDegSho); Frm_BeginForm (ActRenDegSho);
Deg_PutParamOtherDegCod (&Deg->DegCod); Hie_PutParamOtherHieCod (&Deg->DegCod);
HTM_INPUT_TEXT ("ShortName",Cns_HIERARCHY_MAX_CHARS_SHRT_NAME,Deg->ShrtName, HTM_INPUT_TEXT ("ShortName",Cns_HIERARCHY_MAX_CHARS_SHRT_NAME,Deg->ShrtName,
HTM_SUBMIT_ON_CHANGE, HTM_SUBMIT_ON_CHANGE,
"class=\"INPUT_SHORT_NAME\""); "class=\"INPUT_SHORT_NAME\"");
@ -382,7 +377,7 @@ static void Deg_ListDegreesForEdition (void)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActRenDegFul); Frm_BeginForm (ActRenDegFul);
Deg_PutParamOtherDegCod (&Deg->DegCod); Hie_PutParamOtherHieCod (&Deg->DegCod);
HTM_INPUT_TEXT ("FullName",Cns_HIERARCHY_MAX_CHARS_FULL_NAME,Deg->FullName, HTM_INPUT_TEXT ("FullName",Cns_HIERARCHY_MAX_CHARS_FULL_NAME,Deg->FullName,
HTM_SUBMIT_ON_CHANGE, HTM_SUBMIT_ON_CHANGE,
"class=\"INPUT_FULL_NAME\""); "class=\"INPUT_FULL_NAME\"");
@ -397,7 +392,7 @@ static void Deg_ListDegreesForEdition (void)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActChgDegTyp); Frm_BeginForm (ActChgDegTyp);
Deg_PutParamOtherDegCod (&Deg->DegCod); Hie_PutParamOtherHieCod (&Deg->DegCod);
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE, HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,
"name=\"OthDegTypCod\" class=\"HIE_SEL_NARROW\""); "name=\"OthDegTypCod\" class=\"HIE_SEL_NARROW\"");
for (NumDegTyp = 0; for (NumDegTyp = 0;
@ -426,7 +421,7 @@ static void Deg_ListDegreesForEdition (void)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActChgDegWWW); Frm_BeginForm (ActChgDegWWW);
Deg_PutParamOtherDegCod (&Deg->DegCod); Hie_PutParamOtherHieCod (&Deg->DegCod);
HTM_INPUT_URL ("WWW",Deg->WWW,HTM_SUBMIT_ON_CHANGE, HTM_INPUT_URL ("WWW",Deg->WWW,HTM_SUBMIT_ON_CHANGE,
"class=\"INPUT_WWW_NARROW\" required=\"required\""); "class=\"INPUT_WWW_NARROW\" required=\"required\"");
Frm_EndForm (); Frm_EndForm ();
@ -463,27 +458,10 @@ static void Deg_ListDegreesForEdition (void)
HTM_TD_End (); HTM_TD_End ();
/* Degree status */ /* Degree status */
StatusTxt = Deg_GetStatusTxtFromStatusBits (Deg->Status); Hie_WriteStatusCellEditable (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM,
HTM_TD_Begin ("class=\"DAT LM\""); Deg->Status,ActChgDegSta,Deg->DegCod,
if (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM && Txt_DEGREE_STATUS);
StatusTxt == Deg_STATUS_PENDING)
{
Frm_BeginForm (ActChgDegSta);
Deg_PutParamOtherDegCod (&Deg->DegCod);
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,
"name=\"Status\" class=\"INPUT_STATUS\"");
StatusUnsigned = (unsigned) Deg_GetStatusBitsFromStatusTxt (Deg_STATUS_PENDING);
HTM_OPTION (HTM_Type_UNSIGNED,&StatusUnsigned,true,false,
"%s",Txt_DEGREE_STATUS[Deg_STATUS_PENDING]);
StatusUnsigned = (unsigned) Deg_GetStatusBitsFromStatusTxt (Deg_STATUS_ACTIVE);
HTM_OPTION (HTM_Type_UNSIGNED,&StatusUnsigned,false,false,
"%s",Txt_DEGREE_STATUS[Deg_STATUS_ACTIVE]);
HTM_SELECT_End ();
Frm_EndForm ();
}
else if (StatusTxt != Deg_STATUS_ACTIVE) // If active ==> do not show anything
HTM_Txt (Txt_DEGREE_STATUS[StatusTxt]);
HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
} }
@ -501,52 +479,10 @@ static void Deg_ListDegreesForEdition (void)
static bool Deg_CheckIfICanEditADegree (struct Deg_Degree *Deg) static bool Deg_CheckIfICanEditADegree (struct Deg_Degree *Deg)
{ {
return (bool) (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM || // I am a center administrator or higher return (bool) (Gbl.Usrs.Me.Role.Logged >= Rol_CTR_ADM || // I am a center administrator or higher
((Deg->Status & Deg_STATUS_BIT_PENDING) != 0 && // Degree is not yet activated ((Deg->Status & Hie_STATUS_BIT_PENDING) != 0 && // Degree is not yet activated
Gbl.Usrs.Me.UsrDat.UsrCod == Deg->RequesterUsrCod)); // I am the requester Gbl.Usrs.Me.UsrDat.UsrCod == Deg->RequesterUsrCod)); // I am the requester
} }
/*****************************************************************************/
/******************* Set StatusTxt depending on status bits ******************/
/*****************************************************************************/
// Deg_STATUS_UNKNOWN = 0 // Other
// Deg_STATUS_ACTIVE = 1 // 00 (Status == 0)
// Deg_STATUS_PENDING = 2 // 01 (Status == Deg_STATUS_BIT_PENDING)
// Deg_STATUS_REMOVED = 3 // 1- (Status & Deg_STATUS_BIT_REMOVED)
static Deg_StatusTxt_t Deg_GetStatusTxtFromStatusBits (Deg_Status_t Status)
{
if (Status == 0)
return Deg_STATUS_ACTIVE;
if (Status == Deg_STATUS_BIT_PENDING)
return Deg_STATUS_PENDING;
if (Status & Deg_STATUS_BIT_REMOVED)
return Deg_STATUS_REMOVED;
return Deg_STATUS_UNKNOWN;
}
/*****************************************************************************/
/******************* Set status bits depending on StatusTxt ******************/
/*****************************************************************************/
// Deg_STATUS_UNKNOWN = 0 // Other
// Deg_STATUS_ACTIVE = 1 // 00 (Status == 0)
// Deg_STATUS_PENDING = 2 // 01 (Status == Deg_STATUS_BIT_PENDING)
// Deg_STATUS_REMOVED = 3 // 1- (Status & Deg_STATUS_BIT_REMOVED)
static Deg_Status_t Deg_GetStatusBitsFromStatusTxt (Deg_StatusTxt_t StatusTxt)
{
switch (StatusTxt)
{
case Deg_STATUS_UNKNOWN:
case Deg_STATUS_ACTIVE:
return (Deg_Status_t) 0;
case Deg_STATUS_PENDING:
return Deg_STATUS_BIT_PENDING;
case Deg_STATUS_REMOVED:
return Deg_STATUS_BIT_REMOVED;
}
return (Deg_Status_t) 0;
}
/*****************************************************************************/ /*****************************************************************************/
/*********************** Put a form to create a new degree *******************/ /*********************** Put a form to create a new degree *******************/
/*****************************************************************************/ /*****************************************************************************/
@ -831,20 +767,19 @@ static void Deg_ListOneDegreeForSeeing (struct Deg_Degree *Deg,unsigned NumDeg)
{ {
extern const char *Txt_DEGREE_With_courses; extern const char *Txt_DEGREE_With_courses;
extern const char *Txt_DEGREE_Without_courses; extern const char *Txt_DEGREE_Without_courses;
extern const char *Txt_DEGREE_STATUS[Deg_NUM_STATUS_TXT]; extern const char *Txt_DEGREE_STATUS[Hie_NUM_STATUS_TXT];
struct DegreeType DegTyp; struct DegreeType DegTyp;
const char *TxtClassNormal; const char *TxtClassNormal;
const char *TxtClassStrong; const char *TxtClassStrong;
const char *BgColor; const char *BgColor;
unsigned NumCrss = Crs_GetCachedNumCrssInDeg (Deg->DegCod); unsigned NumCrss = Crs_GetCachedNumCrssInDeg (Deg->DegCod);
Deg_StatusTxt_t StatusTxt;
/***** Get data of type of degree of this degree *****/ /***** Get data of type of degree of this degree *****/
DegTyp.DegTypCod = Deg->DegTypCod; DegTyp.DegTypCod = Deg->DegTypCod;
if (!DegTyp_GetDataOfDegreeTypeByCod (&DegTyp)) if (!DegTyp_GetDataOfDegreeTypeByCod (&DegTyp))
Err_WrongDegTypExit (); Err_WrongDegTypExit ();
if (Deg->Status & Deg_STATUS_BIT_PENDING) if (Deg->Status & Hie_STATUS_BIT_PENDING)
{ {
TxtClassNormal = "DAT_LIGHT"; TxtClassNormal = "DAT_LIGHT";
TxtClassStrong = "BT_LINK LT DAT_LIGHT"; TxtClassStrong = "BT_LINK LT DAT_LIGHT";
@ -899,11 +834,7 @@ static void Deg_ListOneDegreeForSeeing (struct Deg_Degree *Deg,unsigned NumDeg)
HTM_TD_End (); HTM_TD_End ();
/***** Degree status *****/ /***** Degree status *****/
StatusTxt = Deg_GetStatusTxtFromStatusBits (Deg->Status); Hie_WriteStatusCell (Deg->Status,TxtClassNormal,BgColor,Txt_DEGREE_STATUS);
HTM_TD_Begin ("class=\"%s LM %s\"",TxtClassNormal,BgColor);
if (StatusTxt != Deg_STATUS_ACTIVE) // If active ==> do not show anything
HTM_Txt (Txt_DEGREE_STATUS[StatusTxt]);
HTM_TD_End ();
/***** End table row *****/ /***** End table row *****/
HTM_TR_End (); HTM_TR_End ();
@ -1105,7 +1036,7 @@ void Deg_ReceiveFormReqDeg (void)
Deg_EditingDegreeConstructor (); Deg_EditingDegreeConstructor ();
/***** Receive form to request a new degree *****/ /***** Receive form to request a new degree *****/
Deg_ReceiveFormRequestOrCreateDeg ((unsigned) Deg_STATUS_BIT_PENDING); Deg_ReceiveFormRequestOrCreateDeg ((Hie_Status_t) Hie_STATUS_BIT_PENDING);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1118,14 +1049,14 @@ void Deg_ReceiveFormNewDeg (void)
Deg_EditingDegreeConstructor (); Deg_EditingDegreeConstructor ();
/***** Receive form to create a new degree *****/ /***** Receive form to create a new degree *****/
Deg_ReceiveFormRequestOrCreateDeg (0); Deg_ReceiveFormRequestOrCreateDeg ((Hie_Status_t) 0);
} }
/*****************************************************************************/ /*****************************************************************************/
/******************* Receive form to create a new degree *********************/ /******************* Receive form to create a new degree *********************/
/*****************************************************************************/ /*****************************************************************************/
static void Deg_ReceiveFormRequestOrCreateDeg (unsigned Status) static void Deg_ReceiveFormRequestOrCreateDeg (Hie_Status_t Status)
{ {
extern const char *Txt_The_degree_X_already_exists; extern const char *Txt_The_degree_X_already_exists;
extern const char *Txt_Created_new_degree_X; extern const char *Txt_Created_new_degree_X;
@ -1192,7 +1123,7 @@ void Deg_RemoveDegree (void)
Deg_EditingDegreeConstructor (); Deg_EditingDegreeConstructor ();
/***** Get degree code *****/ /***** Get degree code *****/
Deg_EditingDeg->DegCod = Deg_GetAndCheckParamOtherDegCod (1L); Deg_EditingDeg->DegCod = Hie_GetAndCheckParamOtherHieCod (1L);
/***** Get data of degree *****/ /***** Get data of degree *****/
Deg_GetDataOfDegreeByCod (Deg_EditingDeg); Deg_GetDataOfDegreeByCod (Deg_EditingDeg);
@ -1224,16 +1155,6 @@ void Deg_PutParamDegCod (long DegCod)
Par_PutHiddenParamLong (NULL,"deg",DegCod); Par_PutHiddenParamLong (NULL,"deg",DegCod);
} }
/*****************************************************************************/
/******************** Write parameter with code of degree ********************/
/*****************************************************************************/
static void Deg_PutParamOtherDegCod (void *DegCod)
{
if (DegCod)
Par_PutHiddenParamLong (NULL,"OthDegCod",*((long *) DegCod));
}
/*****************************************************************************/ /*****************************************************************************/
/********************* Get parameter with code of degree *********************/ /********************* Get parameter with code of degree *********************/
/*****************************************************************************/ /*****************************************************************************/
@ -1263,7 +1184,7 @@ bool Deg_GetDataOfDegreeByCod (struct Deg_Degree *Deg)
/***** Clear data *****/ /***** Clear data *****/
Deg->CtrCod = -1L; Deg->CtrCod = -1L;
Deg->DegTypCod = -1L; Deg->DegTypCod = -1L;
Deg->Status = (Deg_Status_t) 0; Deg->Status = (Hie_Status_t) 0;
Deg->RequesterUsrCod = -1L; Deg->RequesterUsrCod = -1L;
Deg->ShrtName[0] = '\0'; Deg->ShrtName[0] = '\0';
Deg->FullName[0] = '\0'; Deg->FullName[0] = '\0';
@ -1385,7 +1306,7 @@ void Deg_RenameDegreeShort (void)
Deg_EditingDegreeConstructor (); Deg_EditingDegreeConstructor ();
/***** Rename degree *****/ /***** Rename degree *****/
Deg_EditingDeg->DegCod = Deg_GetAndCheckParamOtherDegCod (1L); Deg_EditingDeg->DegCod = Hie_GetAndCheckParamOtherHieCod (1L);
Deg_RenameDegree (Deg_EditingDeg,Cns_SHRT_NAME); Deg_RenameDegree (Deg_EditingDeg,Cns_SHRT_NAME);
} }
@ -1395,7 +1316,7 @@ void Deg_RenameDegreeFull (void)
Deg_EditingDegreeConstructor (); Deg_EditingDegreeConstructor ();
/***** Rename degree *****/ /***** Rename degree *****/
Deg_EditingDeg->DegCod = Deg_GetAndCheckParamOtherDegCod (1L); Deg_EditingDeg->DegCod = Hie_GetAndCheckParamOtherHieCod (1L);
Deg_RenameDegree (Deg_EditingDeg,Cns_FULL_NAME); Deg_RenameDegree (Deg_EditingDeg,Cns_FULL_NAME);
} }
@ -1486,7 +1407,7 @@ void Deg_ChangeDegreeType (void)
/***** Get parameters from form *****/ /***** Get parameters from form *****/
/* Get degree code */ /* Get degree code */
Deg_EditingDeg->DegCod = Deg_GetAndCheckParamOtherDegCod (1L); Deg_EditingDeg->DegCod = Hie_GetAndCheckParamOtherHieCod (1L);
/* Get the new degree type */ /* Get the new degree type */
NewDegTypCod = DegTyp_GetAndCheckParamOtherDegTypCod (1); NewDegTypCod = DegTyp_GetAndCheckParamOtherDegTypCod (1);
@ -1519,7 +1440,7 @@ void Deg_ChangeDegWWW (void)
/***** Get parameters from form *****/ /***** Get parameters from form *****/
/* Get the code of the degree */ /* Get the code of the degree */
Deg_EditingDeg->DegCod = Deg_GetAndCheckParamOtherDegCod (1L); Deg_EditingDeg->DegCod = Hie_GetAndCheckParamOtherHieCod (1L);
/* Get the new WWW for the degree */ /* Get the new WWW for the degree */
Par_GetParToText ("WWW",NewWWW,Cns_MAX_BYTES_WWW); Par_GetParToText ("WWW",NewWWW,Cns_MAX_BYTES_WWW);
@ -1551,31 +1472,22 @@ void Deg_ChangeDegWWW (void)
void Deg_ChangeDegStatus (void) void Deg_ChangeDegStatus (void)
{ {
extern const char *Txt_The_status_of_the_degree_X_has_changed; extern const char *Txt_The_status_of_the_degree_X_has_changed;
Deg_Status_t Status; Hie_Status_t Status;
Deg_StatusTxt_t StatusTxt;
/***** Degree constructor *****/ /***** Degree constructor *****/
Deg_EditingDegreeConstructor (); Deg_EditingDegreeConstructor ();
/***** Get parameters from form *****/ /***** Get parameters from form *****/
/* Get degree code */ /* Get degree code */
Deg_EditingDeg->DegCod = Deg_GetAndCheckParamOtherDegCod (1L); Deg_EditingDeg->DegCod = Hie_GetAndCheckParamOtherHieCod (1L);
/* Get parameter with status */ /* Get parameter with status */
Status = (Deg_Status_t) Status = Hie_GetParamStatus (); // New status
Par_GetParToUnsignedLong ("Status",
0,
(unsigned long) Deg_MAX_STATUS,
(unsigned long) Deg_WRONG_STATUS);
if (Status == Deg_WRONG_STATUS)
Err_WrongStatusExit ();
StatusTxt = Deg_GetStatusTxtFromStatusBits (Status);
Status = Deg_GetStatusBitsFromStatusTxt (StatusTxt); // New status
/***** Get data of degree *****/ /***** Get data of degree *****/
Deg_GetDataOfDegreeByCod (Deg_EditingDeg); Deg_GetDataOfDegreeByCod (Deg_EditingDeg);
/***** Update status in table of degrees *****/ /***** Update status *****/
Deg_DB_UpdateDegStatus (Deg_EditingDeg->DegCod,Status); Deg_DB_UpdateDegStatus (Deg_EditingDeg->DegCod,Status);
Deg_EditingDeg->Status = Status; Deg_EditingDeg->Status = Status;
@ -1919,7 +1831,7 @@ static void Deg_EditingDegreeConstructor (void)
Deg_EditingDeg->DegCod = -1L; Deg_EditingDeg->DegCod = -1L;
Deg_EditingDeg->DegTypCod = -1L; Deg_EditingDeg->DegTypCod = -1L;
Deg_EditingDeg->CtrCod = -1L; Deg_EditingDeg->CtrCod = -1L;
Deg_EditingDeg->Status = (Deg_Status_t) 0; Deg_EditingDeg->Status = (Hie_Status_t) 0;
Deg_EditingDeg->RequesterUsrCod = -1L; Deg_EditingDeg->RequesterUsrCod = -1L;
Deg_EditingDeg->ShrtName[0] = '\0'; Deg_EditingDeg->ShrtName[0] = '\0';
Deg_EditingDeg->FullName[0] = '\0'; Deg_EditingDeg->FullName[0] = '\0';

View File

@ -47,31 +47,12 @@
/******************************* Public types ********************************/ /******************************* Public types ********************************/
/*****************************************************************************/ /*****************************************************************************/
typedef enum
{
Deg_STATUS_BIT_PENDING = (1 << 0), // Degree is requested, but not yet activated
Deg_STATUS_BIT_REMOVED = (1 << 1), // Degree has been removed
} Deg_Status_Bits_t;
typedef unsigned Deg_Status_t;
#define Deg_MAX_STATUS ((Deg_Status_t) 3)
#define Deg_WRONG_STATUS ((Deg_Status_t) (Deg_MAX_STATUS + 1))
#define Deg_NUM_STATUS_TXT 4
typedef enum
{
Deg_STATUS_UNKNOWN = 0, // Other
Deg_STATUS_ACTIVE = 1, // 00 (Status == 0)
Deg_STATUS_PENDING = 2, // 01 (Status == Deg_STATUS_BIT_PENDING)
Deg_STATUS_REMOVED = 3, // 1- (Status & Deg_STATUS_BIT_REMOVED)
} Deg_StatusTxt_t;
struct Deg_Degree struct Deg_Degree
{ {
long DegCod; // Degree code long DegCod; // Degree code
long DegTypCod; // Degree type code long DegTypCod; // Degree type code
long CtrCod; // Center code long CtrCod; // Center code
Deg_Status_t Status; // Degree status Hie_Status_t Status; // Degree status
long RequesterUsrCod; // User code of the person who requested the creation of this degree long RequesterUsrCod; // User code of the person who requested the creation of this degree
char ShrtName[Cns_HIERARCHY_MAX_BYTES_SHRT_NAME + 1]; // Short name of degree char ShrtName[Cns_HIERARCHY_MAX_BYTES_SHRT_NAME + 1]; // Short name of degree
char FullName[Cns_HIERARCHY_MAX_BYTES_FULL_NAME + 1]; // Full name of degree char FullName[Cns_HIERARCHY_MAX_BYTES_FULL_NAME + 1]; // Full name of degree

View File

@ -30,6 +30,7 @@
#include "swad_error.h" #include "swad_error.h"
#include "swad_global.h" #include "swad_global.h"
#include "swad_hierarchy.h" #include "swad_hierarchy.h"
#include "swad_hierarchy_database.h"
/*****************************************************************************/ /*****************************************************************************/
/************** External global variables from others modules ****************/ /************** External global variables from others modules ****************/
@ -53,7 +54,7 @@ void Deg_DB_CreateDegreeType (const char DegTypName[DegTyp_MAX_BYTES_DEGREE_TYPE
/***************************** Create a new degree ***************************/ /***************************** Create a new degree ***************************/
/*****************************************************************************/ /*****************************************************************************/
void Deg_DB_CreateDegree (struct Deg_Degree *Deg,unsigned Status) void Deg_DB_CreateDegree (struct Deg_Degree *Deg,Hie_Status_t Status)
{ {
Deg->DegCod = Deg->DegCod =
DB_QueryINSERTandReturnCode ("can not create a new degree", DB_QueryINSERTandReturnCode ("can not create a new degree",
@ -65,7 +66,7 @@ void Deg_DB_CreateDegree (struct Deg_Degree *Deg,unsigned Status)
"%ld,'%s','%s','%s')", "%ld,'%s','%s','%s')",
Deg->CtrCod, Deg->CtrCod,
Deg->DegTypCod, Deg->DegTypCod,
Status, (unsigned) Status,
Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.Usrs.Me.UsrDat.UsrCod,
Deg->ShrtName, Deg->ShrtName,
Deg->FullName, Deg->FullName,
@ -392,7 +393,7 @@ unsigned Deg_DB_GetDegsWithPendingCrss (MYSQL_RES **mysql_res)
" ORDER BY deg_degrees.ShortName", " ORDER BY deg_degrees.ShortName",
Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.Usrs.Me.UsrDat.UsrCod,
Sco_GetDBStrFromScope (HieLvl_DEG), Sco_GetDBStrFromScope (HieLvl_DEG),
(unsigned) Crs_STATUS_BIT_PENDING); (unsigned) Hie_STATUS_BIT_PENDING);
case Rol_SYS_ADM: case Rol_SYS_ADM:
return (unsigned) return (unsigned)
DB_QuerySELECT (mysql_res,"can not get degrees with pending courses", DB_QuerySELECT (mysql_res,"can not get degrees with pending courses",
@ -404,7 +405,7 @@ unsigned Deg_DB_GetDegsWithPendingCrss (MYSQL_RES **mysql_res)
" AND crs_courses.DegCod=deg_degrees.DegCod" " AND crs_courses.DegCod=deg_degrees.DegCod"
" GROUP BY crs_courses.DegCod" " GROUP BY crs_courses.DegCod"
" ORDER BY deg_degrees.ShortName", " ORDER BY deg_degrees.ShortName",
(unsigned) Crs_STATUS_BIT_PENDING); (unsigned) Hie_STATUS_BIT_PENDING);
default: // Forbidden for other users default: // Forbidden for other users
Err_WrongRoleExit (); Err_WrongRoleExit ();
return 0; // Not reached return 0; // Not reached
@ -663,7 +664,7 @@ void Deg_DB_UpdateDegWWW (long DegCod,const char NewWWW[Cns_MAX_BYTES_WWW + 1])
/*********************** Update the status of a degree ***********************/ /*********************** Update the status of a degree ***********************/
/*****************************************************************************/ /*****************************************************************************/
void Deg_DB_UpdateDegStatus (long DegCod,Deg_Status_t NewStatus) void Deg_DB_UpdateDegStatus (long DegCod,Hie_Status_t NewStatus)
{ {
DB_QueryUPDATE ("can not update the status of a degree", DB_QueryUPDATE ("can not update the status of a degree",
"UPDATE deg_degrees" "UPDATE deg_degrees"

View File

@ -38,7 +38,7 @@
/*****************************************************************************/ /*****************************************************************************/
void Deg_DB_CreateDegreeType (const char DegTypName[DegTyp_MAX_BYTES_DEGREE_TYPE_NAME + 1]); void Deg_DB_CreateDegreeType (const char DegTypName[DegTyp_MAX_BYTES_DEGREE_TYPE_NAME + 1]);
void Deg_DB_CreateDegree (struct Deg_Degree *Deg,unsigned Status); void Deg_DB_CreateDegree (struct Deg_Degree *Deg,Hie_Status_t Status);
unsigned Deg_DB_GetDegreeTypes (MYSQL_RES **mysql_res, unsigned Deg_DB_GetDegreeTypes (MYSQL_RES **mysql_res,
HieLvl_Level_t Scope,DegTyp_Order_t Order); HieLvl_Level_t Scope,DegTyp_Order_t Order);
@ -76,7 +76,7 @@ void Deg_DB_UpdateDegNameDB (long DegCod,const char *FieldName,
void Deg_DB_UpdateDegCtr (long DegCod,long NewCtrCod); void Deg_DB_UpdateDegCtr (long DegCod,long NewCtrCod);
void Deg_DB_UpdateDegTyp (long DegCod,long NewDegTypCod); void Deg_DB_UpdateDegTyp (long DegCod,long NewDegTypCod);
void Deg_DB_UpdateDegWWW (long DegCod,const char NewWWW[Cns_MAX_BYTES_WWW + 1]); void Deg_DB_UpdateDegWWW (long DegCod,const char NewWWW[Cns_MAX_BYTES_WWW + 1]);
void Deg_DB_UpdateDegStatus (long DegCod,Deg_Status_t NewStatus); void Deg_DB_UpdateDegStatus (long DegCod,Hie_Status_t NewStatus);
unsigned Deg_DB_GetDegsFromUsr (MYSQL_RES **mysql_res,long UsrCod,long CtrCod); unsigned Deg_DB_GetDegsFromUsr (MYSQL_RES **mysql_res,long UsrCod,long CtrCod);
unsigned Deg_DB_GetUsrMainDeg (MYSQL_RES **mysql_res,long UsrCod); unsigned Deg_DB_GetUsrMainDeg (MYSQL_RES **mysql_res,long UsrCod);

View File

@ -81,6 +81,11 @@ void Err_WrongScopeExit (void)
/********* when wrong country, institution, center, degree or course *********/ /********* when wrong country, institution, center, degree or course *********/
/*****************************************************************************/ /*****************************************************************************/
void Err_WrongHierarchyExit (void)
{
Err_ShowErrorAndExit ("Wrong hierarchy.");
}
void Err_WrongCountrExit (void) void Err_WrongCountrExit (void)
{ {
Err_ShowErrorAndExit ("Wrong country."); Err_ShowErrorAndExit ("Wrong country.");

View File

@ -31,6 +31,7 @@ void Err_NotEnoughMemoryExit (void);
void Err_QuerySizeExceededExit (void); void Err_QuerySizeExceededExit (void);
void Err_WrongActionExit (void); void Err_WrongActionExit (void);
void Err_WrongScopeExit (void); void Err_WrongScopeExit (void);
void Err_WrongHierarchyExit (void);
void Err_WrongCountrExit (void); void Err_WrongCountrExit (void);
void Err_WrongInstitExit (void); void Err_WrongInstitExit (void);
void Err_WrongCenterExit (void); void Err_WrongCenterExit (void);

View File

@ -47,6 +47,13 @@
extern struct Globals Gbl; extern struct Globals Gbl;
/*****************************************************************************/
/***************************** Private prototypes ****************************/
/*****************************************************************************/
static Hie_StatusTxt_t Hie_GetStatusTxtFromStatusBits (Hie_Status_t Status);
static Hie_Status_t Hie_GetStatusBitsFromStatusTxt (Hie_StatusTxt_t StatusTxt);
/*****************************************************************************/ /*****************************************************************************/
/********** List pending institutions, centers, degrees and courses **********/ /********** List pending institutions, centers, degrees and courses **********/
/*****************************************************************************/ /*****************************************************************************/
@ -747,24 +754,145 @@ void Hie_FreeGoToMsg (void)
} }
/*****************************************************************************/ /*****************************************************************************/
/******************* Get number of countries with users **********************/ /*********************** Write status cell in table **************************/
/*****************************************************************************/ /*****************************************************************************/
void Hie_DB_BuildSubquery (char SubQuery[128],HieLvl_Level_t Scope,long Cod) void Hie_WriteStatusCell (Hie_Status_t Status,
const char *Class,const char *BgColor,
const char *Txt[Hie_NUM_STATUS_TXT])
{ {
static const char *Format[HieLvl_NUM_LEVELS] = Hie_StatusTxt_t StatusTxt = Hie_GetStatusTxtFromStatusBits (Status);
HTM_TD_Begin ("class=\"%s LM %s\"",Class,BgColor);
if (StatusTxt != Hie_STATUS_ACTIVE) // If active ==> do not show anything
HTM_Txt (Txt[StatusTxt]);
HTM_TD_End ();
}
void Hie_WriteStatusCellEditable (bool ICanEdit,Hie_Status_t Status,
Act_Action_t NextAction,long HieCod,
const char *Txt[Hie_NUM_STATUS_TXT])
{
Hie_StatusTxt_t StatusTxt = Hie_GetStatusTxtFromStatusBits (Status);
unsigned StatusUnsigned;
/***** Begin cell *****/
HTM_TD_Begin ("class=\"DAT LM\"");
if (ICanEdit && StatusTxt == Hie_STATUS_PENDING)
{
/* Begin form */
Frm_BeginForm (NextAction);
Hie_PutParamOtherHieCod (&HieCod);
/* Selector */
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,
"name=\"Status\" class=\"INPUT_STATUS\"");
StatusUnsigned = (unsigned) Hie_GetStatusBitsFromStatusTxt (Hie_STATUS_PENDING);
HTM_OPTION (HTM_Type_UNSIGNED,&StatusUnsigned,true,false,
"%s",Txt[Hie_STATUS_PENDING]);
StatusUnsigned = (unsigned) Hie_GetStatusBitsFromStatusTxt (Hie_STATUS_ACTIVE);
HTM_OPTION (HTM_Type_UNSIGNED,&StatusUnsigned,false,false,
"%s",Txt[Hie_STATUS_ACTIVE]);
HTM_SELECT_End ();
/* End form */
Frm_EndForm ();
}
else if (StatusTxt != Hie_STATUS_ACTIVE) // If active ==> do not show anything
HTM_Txt (Txt[StatusTxt]);
/***** End cell *****/
HTM_TD_End ();
}
/*****************************************************************************/
/**************************** Get parameter status ***************************/
/*****************************************************************************/
Hie_Status_t Hie_GetParamStatus (void)
{
Hie_Status_t Status;
Hie_StatusTxt_t StatusTxt;
/***** Get parameter with status *****/
Status = (Hie_Status_t)
Par_GetParToUnsignedLong ("Status",
0,
(unsigned long) Hie_MAX_STATUS,
(unsigned long) Hie_WRONG_STATUS);
if (Status == Hie_WRONG_STATUS)
Err_WrongStatusExit ();
StatusTxt = Hie_GetStatusTxtFromStatusBits (Status);
Status = Hie_GetStatusBitsFromStatusTxt (StatusTxt); // New status
return Status;
}
/*****************************************************************************/
/******************* Set StatusTxt depending on status bits ******************/
/*****************************************************************************/
// Hie_STATUS_UNKNOWN = 0 // Other
// Hie_STATUS_ACTIVE = 1 // 00 (Status == 0)
// Hie_STATUS_PENDING = 2 // 01 (Status == Hie_STATUS_BIT_PENDING)
// Hie_STATUS_REMOVED = 3 // 1- (Status & Hie_STATUS_BIT_REMOVED)
static Hie_StatusTxt_t Hie_GetStatusTxtFromStatusBits (Hie_Status_t Status)
{
if (Status == 0)
return Hie_STATUS_ACTIVE;
if (Status == Hie_STATUS_BIT_PENDING)
return Hie_STATUS_PENDING;
if (Status & Hie_STATUS_BIT_REMOVED)
return Hie_STATUS_REMOVED;
return Hie_STATUS_UNKNOWN;
}
/*****************************************************************************/
/******************* Set status bits depending on StatusTxt ******************/
/*****************************************************************************/
// Hie_STATUS_UNKNOWN = 0 // Other
// Hie_STATUS_ACTIVE = 1 // 00 (Status == 0)
// Hie_STATUS_PENDING = 2 // 01 (Status == Hie_STATUS_BIT_PENDING)
// Hie_STATUS_REMOVED = 3 // 1- (Status & Hie_STATUS_BIT_REMOVED)
static Hie_Status_t Hie_GetStatusBitsFromStatusTxt (Hie_StatusTxt_t StatusTxt)
{
static const Hie_Status_t StatusBits[Hie_NUM_STATUS_TXT] =
{ {
[HieLvl_UNK] = "", // Unknown [Hie_STATUS_UNKNOWN] = (Hie_Status_t) 0,
[HieLvl_SYS] = "", // System [Hie_STATUS_ACTIVE ] = (Hie_Status_t) 0,
[HieLvl_CTY] = "ins_instits.CtyCod=%ld AND ", // Country [Hie_STATUS_PENDING] = Hie_STATUS_BIT_PENDING,
[HieLvl_INS] = "ctr_centers.InsCod=%ld AND ", // Institution [Hie_STATUS_REMOVED] = Hie_STATUS_BIT_REMOVED,
[HieLvl_CTR] = "deg_degrees.CtrCod=%ld AND ", // Center
[HieLvl_DEG] = "crs_courses.DegCod=%ld AND ", // Degree
[HieLvl_CRS] = "crs_users.CrsCod=%ld AND ", // Course
}; };
if (Cod > 0) return StatusBits[StatusTxt];
sprintf (SubQuery,Format[Scope],Cod); }
else
SubQuery[0] = '\0'; /*****************************************************************************/
/**** Write parameter with code of other institution/center/degree/course ****/
/*****************************************************************************/
void Hie_PutParamOtherHieCod (void *HieCod)
{
if (HieCod)
Par_PutHiddenParamLong (NULL,"OthHieCod",*((long *) HieCod));
}
/*****************************************************************************/
/***** Get parameter with code of other institution/center/degree/course *****/
/*****************************************************************************/
long Hie_GetAndCheckParamOtherHieCod (long MinCodAllowed)
{
long HieCod;
/***** Get and check parameter with code *****/
if ((HieCod = Par_GetParToLong ("OthHieCod")) < MinCodAllowed)
Err_WrongHierarchyExit ();
return HieCod;
} }

View File

@ -65,6 +65,14 @@ void Hie_GetAndWriteInsCtrDegAdminBy (long UsrCod,unsigned ColSpan);
char *Hie_BuildGoToMsg (const char *Where); char *Hie_BuildGoToMsg (const char *Where);
void Hie_FreeGoToMsg (void); void Hie_FreeGoToMsg (void);
void Hie_DB_BuildSubquery (char SubQuery[128],HieLvl_Level_t Scope,long Cod); void Hie_WriteStatusCell (Hie_Status_t Status,
const char *Class,const char *BgColor,
const char *Txt[Hie_NUM_STATUS_TXT]);
void Hie_WriteStatusCellEditable (bool ICanEdit,Hie_Status_t Status,
Act_Action_t NextAction,long HieCod,
const char *Txt[Hie_NUM_STATUS_TXT]);
Hie_Status_t Hie_GetParamStatus (void);
void Hie_PutParamOtherHieCod (void *HieCod);
long Hie_GetAndCheckParamOtherHieCod (long MinCodAllowed);
#endif #endif

View File

@ -30,6 +30,29 @@
#include "swad_hierarchy_level.h" #include "swad_hierarchy_level.h"
#include "swad_scope.h" #include "swad_scope.h"
/*****************************************************************************/
/******************* Get number of countries with users **********************/
/*****************************************************************************/
void Hie_DB_BuildSubquery (char SubQuery[128],HieLvl_Level_t Scope,long Cod)
{
static const char *Format[HieLvl_NUM_LEVELS] =
{
[HieLvl_UNK] = "", // Unknown
[HieLvl_SYS] = "", // System
[HieLvl_CTY] = "ins_instits.CtyCod=%ld AND ", // Country
[HieLvl_INS] = "ctr_centers.InsCod=%ld AND ", // Institution
[HieLvl_CTR] = "deg_degrees.CtrCod=%ld AND ", // Center
[HieLvl_DEG] = "crs_courses.DegCod=%ld AND ", // Degree
[HieLvl_CRS] = "crs_users.CrsCod=%ld AND ", // Course
};
if (Cod > 0)
sprintf (SubQuery,Format[Scope],Cod);
else
SubQuery[0] = '\0';
}
/*****************************************************************************/ /*****************************************************************************/
/****** Get institutions, centers and degrees administrated by an admin *****/ /****** Get institutions, centers and degrees administrated by an admin *****/
/*****************************************************************************/ /*****************************************************************************/

View File

@ -33,6 +33,7 @@
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
void Hie_DB_BuildSubquery (char SubQuery[128],HieLvl_Level_t Scope,long Cod);
unsigned Hie_DB_GetInsCtrDegAdminBy (MYSQL_RES **mysql_res,long UsrCod); unsigned Hie_DB_GetInsCtrDegAdminBy (MYSQL_RES **mysql_res,long UsrCod);
#endif #endif

View File

@ -40,4 +40,23 @@ typedef enum
HieLvl_CRS = 6, // Course HieLvl_CRS = 6, // Course
} HieLvl_Level_t; } HieLvl_Level_t;
typedef enum
{
Hie_STATUS_BIT_PENDING = (1 << 0), // Requested, but not yet activated
Hie_STATUS_BIT_REMOVED = (1 << 1), // Removed
} Hie_Status_Bits_t;
typedef unsigned Hie_Status_t;
#define Hie_MAX_STATUS ((Hie_Status_t) 3)
#define Hie_WRONG_STATUS ((Hie_Status_t) (Hie_MAX_STATUS + 1))
#define Hie_NUM_STATUS_TXT 4
typedef enum
{
Hie_STATUS_UNKNOWN = 0, // Other
Hie_STATUS_ACTIVE = 1, // 00 (Status == 0)
Hie_STATUS_PENDING = 2, // 01 (Status == Hie_STATUS_BIT_PENDING)
Hie_STATUS_REMOVED = 3, // 1- (Status & Hie_STATUS_BIT_REMOVED)
} Hie_StatusTxt_t;
#endif #endif

View File

@ -87,11 +87,6 @@ static void Ins_GetShrtNameAndCtyOfInstitution (struct Ins_Instit *Ins,
static void Ins_ListInstitutionsForEdition (void); static void Ins_ListInstitutionsForEdition (void);
static bool Ins_CheckIfICanEdit (struct Ins_Instit *Ins); static bool Ins_CheckIfICanEdit (struct Ins_Instit *Ins);
static Ins_StatusTxt_t Ins_GetStatusTxtFromStatusBits (Ins_Status_t Status);
static Ins_Status_t Ins_GetStatusBitsFromStatusTxt (Ins_StatusTxt_t StatusTxt);
static void Ins_PutParamOtherInsCod (void *InsCod);
static long Ins_GetParamOtherInsCod (void);
static void Ins_UpdateInsNameDB (long InsCod,const char *FieldName,const char *NewInsName); static void Ins_UpdateInsNameDB (long InsCod,const char *FieldName,const char *NewInsName);
@ -100,7 +95,7 @@ static void Ins_PutParamGoToIns (void *InsCod);
static void Ins_PutFormToCreateInstitution (void); static void Ins_PutFormToCreateInstitution (void);
static void Ins_PutHeadInstitutionsForEdition (void); static void Ins_PutHeadInstitutionsForEdition (void);
static void Ins_ReceiveFormRequestOrCreateIns (unsigned Status); static void Ins_ReceiveFormRequestOrCreateIns (Hie_Status_t Status);
static void Ins_EditingInstitutionConstructor (); static void Ins_EditingInstitutionConstructor ();
static void Ins_EditingInstitutionDestructor (); static void Ins_EditingInstitutionDestructor ();
@ -364,13 +359,12 @@ static void Ins_PutIconToEditInstitutions (void)
static void Ins_ListOneInstitutionForSeeing (struct Ins_Instit *Ins,unsigned NumIns) static void Ins_ListOneInstitutionForSeeing (struct Ins_Instit *Ins,unsigned NumIns)
{ {
extern const char *Txt_INSTITUTION_STATUS[Ins_NUM_STATUS_TXT]; extern const char *Txt_INSTITUTION_STATUS[Hie_NUM_STATUS_TXT];
const char *TxtClassNormal; const char *TxtClassNormal;
const char *TxtClassStrong; const char *TxtClassStrong;
const char *BgColor; const char *BgColor;
Ins_StatusTxt_t StatusTxt;
if (Ins->Status & Ins_STATUS_BIT_PENDING) if (Ins->Status & Hie_STATUS_BIT_PENDING)
{ {
TxtClassNormal = "DAT_LIGHT"; TxtClassNormal = "DAT_LIGHT";
TxtClassStrong = "BT_LINK LT DAT_LIGHT"; TxtClassStrong = "BT_LINK LT DAT_LIGHT";
@ -431,11 +425,7 @@ static void Ins_ListOneInstitutionForSeeing (struct Ins_Instit *Ins,unsigned Num
HTM_TD_End (); HTM_TD_End ();
/***** Institution status *****/ /***** Institution status *****/
StatusTxt = Ins_GetStatusTxtFromStatusBits (Ins->Status); Hie_WriteStatusCell (Ins->Status,TxtClassNormal,BgColor,Txt_INSTITUTION_STATUS);
HTM_TD_Begin ("class=\"%s LM %s\"",TxtClassNormal,BgColor);
if (StatusTxt != Ins_STATUS_ACTIVE) // If active ==> do not show anything
HTM_Txt (Txt_INSTITUTION_STATUS[StatusTxt]);
HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
@ -709,12 +699,12 @@ bool Ins_GetDataOfInstitByCod (struct Ins_Instit *Ins)
bool InsFound = false; bool InsFound = false;
/***** Clear data *****/ /***** Clear data *****/
Ins->CtyCod = -1L; Ins->CtyCod = -1L;
Ins->Status = (Ins_Status_t) 0; Ins->Status = (Hie_Status_t) 0;
Ins->RequesterUsrCod = -1L; Ins->RequesterUsrCod = -1L;
Ins->ShrtName[0] = Ins->ShrtName[0] =
Ins->FullName[0] = Ins->FullName[0] =
Ins->WWW[0] = '\0'; Ins->WWW[0] = '\0';
Ins->NumUsrsWhoClaimToBelongToIns.Valid = false; Ins->NumUsrsWhoClaimToBelongToIns.Valid = false;
/***** Check if institution code is correct *****/ /***** Check if institution code is correct *****/
@ -923,7 +913,7 @@ void Ins_WriteSelectorOfInstitution (void)
static void Ins_ListInstitutionsForEdition (void) static void Ins_ListInstitutionsForEdition (void)
{ {
extern const char *Txt_INSTITUTION_STATUS[Ins_NUM_STATUS_TXT]; extern const char *Txt_INSTITUTION_STATUS[Hie_NUM_STATUS_TXT];
unsigned NumIns; unsigned NumIns;
struct Ins_Instit *Ins; struct Ins_Instit *Ins;
char WWW[Cns_MAX_BYTES_WWW + 1]; char WWW[Cns_MAX_BYTES_WWW + 1];
@ -932,8 +922,6 @@ static void Ins_ListInstitutionsForEdition (void)
unsigned NumCtrs; unsigned NumCtrs;
unsigned NumUsrsIns; unsigned NumUsrsIns;
unsigned NumUsrsInCrssOfIns; unsigned NumUsrsInCrssOfIns;
Ins_StatusTxt_t StatusTxt;
unsigned StatusUnsigned;
/***** Initialize structure with user's data *****/ /***** Initialize structure with user's data *****/
Usr_UsrDataConstructor (&UsrDat); Usr_UsrDataConstructor (&UsrDat);
@ -971,7 +959,7 @@ static void Ins_ListInstitutionsForEdition (void)
Ico_PutIconRemovalNotAllowed (); Ico_PutIconRemovalNotAllowed ();
else else
Ico_PutContextualIconToRemove (ActRemIns,NULL, Ico_PutContextualIconToRemove (ActRemIns,NULL,
Ins_PutParamOtherInsCod,&Ins->InsCod); Hie_PutParamOtherHieCod,&Ins->InsCod);
HTM_TD_End (); HTM_TD_End ();
/* Institution code */ /* Institution code */
@ -989,10 +977,10 @@ static void Ins_ListInstitutionsForEdition (void)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActRenInsSho); Frm_BeginForm (ActRenInsSho);
Ins_PutParamOtherInsCod (&Ins->InsCod); Hie_PutParamOtherHieCod (&Ins->InsCod);
HTM_INPUT_TEXT ("ShortName",Cns_HIERARCHY_MAX_CHARS_SHRT_NAME,Ins->ShrtName, HTM_INPUT_TEXT ("ShortName",Cns_HIERARCHY_MAX_CHARS_SHRT_NAME,Ins->ShrtName,
HTM_SUBMIT_ON_CHANGE, HTM_SUBMIT_ON_CHANGE,
"class=\"INPUT_SHORT_NAME\""); "class=\"INPUT_SHORT_NAME\"");
Frm_EndForm (); Frm_EndForm ();
} }
else else
@ -1004,10 +992,10 @@ static void Ins_ListInstitutionsForEdition (void)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActRenInsFul); Frm_BeginForm (ActRenInsFul);
Ins_PutParamOtherInsCod (&Ins->InsCod); Hie_PutParamOtherHieCod (&Ins->InsCod);
HTM_INPUT_TEXT ("FullName",Cns_HIERARCHY_MAX_CHARS_FULL_NAME,Ins->FullName, HTM_INPUT_TEXT ("FullName",Cns_HIERARCHY_MAX_CHARS_FULL_NAME,Ins->FullName,
HTM_SUBMIT_ON_CHANGE, HTM_SUBMIT_ON_CHANGE,
"class=\"INPUT_FULL_NAME\""); "class=\"INPUT_FULL_NAME\"");
Frm_EndForm (); Frm_EndForm ();
} }
else else
@ -1019,19 +1007,19 @@ static void Ins_ListInstitutionsForEdition (void)
if (ICanEdit) if (ICanEdit)
{ {
Frm_BeginForm (ActChgInsWWW); Frm_BeginForm (ActChgInsWWW);
Ins_PutParamOtherInsCod (&Ins->InsCod); Hie_PutParamOtherHieCod (&Ins->InsCod);
HTM_INPUT_URL ("WWW",Ins->WWW,HTM_SUBMIT_ON_CHANGE, HTM_INPUT_URL ("WWW",Ins->WWW,HTM_SUBMIT_ON_CHANGE,
"class=\"INPUT_WWW_NARROW\" required=\"required\""); "class=\"INPUT_WWW_NARROW\" required=\"required\"");
Frm_EndForm (); Frm_EndForm ();
} }
else else
{ {
Str_Copy (WWW,Ins->WWW,sizeof (WWW) - 1); Str_Copy (WWW,Ins->WWW,sizeof (WWW) - 1);
HTM_DIV_Begin ("class=\"EXTERNAL_WWW_SHORT\""); HTM_DIV_Begin ("class=\"EXTERNAL_WWW_SHORT\"");
HTM_A_Begin ("href=\"%s\" target=\"_blank\" class=\"DAT\" title=\"%s\"", HTM_A_Begin ("href=\"%s\" target=\"_blank\" class=\"DAT\" title=\"%s\"",
Ins->WWW,Ins->WWW); Ins->WWW,Ins->WWW);
HTM_Txt (WWW); HTM_Txt (WWW);
HTM_A_End (); HTM_A_End ();
HTM_DIV_End (); HTM_DIV_End ();
} }
HTM_TD_End (); HTM_TD_End ();
@ -1061,27 +1049,9 @@ static void Ins_ListInstitutionsForEdition (void)
HTM_TD_End (); HTM_TD_End ();
/* Institution status */ /* Institution status */
HTM_TD_Begin ("class=\"DAT LM\""); Hie_WriteStatusCellEditable (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM,
StatusTxt = Ins_GetStatusTxtFromStatusBits (Ins->Status); Ins->Status,ActChgInsSta,Ins->InsCod,
if (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM && Txt_INSTITUTION_STATUS);
StatusTxt == Ins_STATUS_PENDING)
{
Frm_BeginForm (ActChgInsSta);
Ins_PutParamOtherInsCod (&Ins->InsCod);
HTM_SELECT_Begin (HTM_SUBMIT_ON_CHANGE,
"name=\"Status\" class=\"INPUT_STATUS\"");
StatusUnsigned = (unsigned) Ins_GetStatusBitsFromStatusTxt (Ins_STATUS_PENDING);
HTM_OPTION (HTM_Type_UNSIGNED,&StatusUnsigned,true,false,
"%s",Txt_INSTITUTION_STATUS[Ins_STATUS_PENDING]);
StatusUnsigned = (unsigned) Ins_GetStatusBitsFromStatusTxt (Ins_STATUS_ACTIVE);
HTM_OPTION (HTM_Type_UNSIGNED,&StatusUnsigned,false,false,
"%s",Txt_INSTITUTION_STATUS[Ins_STATUS_ACTIVE]);
HTM_SELECT_End ();
Frm_EndForm ();
}
else if (StatusTxt != Ins_STATUS_ACTIVE) // If active ==> do not show anything
HTM_Txt (Txt_INSTITUTION_STATUS[StatusTxt]);
HTM_TD_End ();
HTM_TR_End (); HTM_TR_End ();
} }
@ -1100,50 +1070,8 @@ static void Ins_ListInstitutionsForEdition (void)
static bool Ins_CheckIfICanEdit (struct Ins_Instit *Ins) static bool Ins_CheckIfICanEdit (struct Ins_Instit *Ins)
{ {
return (bool) (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM || // I am a superuser return (bool) (Gbl.Usrs.Me.Role.Logged == Rol_SYS_ADM || // I am a superuser
((Ins->Status & Ins_STATUS_BIT_PENDING) != 0 && // Institution is not yet activated ((Ins->Status & Hie_STATUS_BIT_PENDING) != 0 && // Institution is not yet activated
Gbl.Usrs.Me.UsrDat.UsrCod == Ins->RequesterUsrCod)); // I am the requester Gbl.Usrs.Me.UsrDat.UsrCod == Ins->RequesterUsrCod)); // I am the requester
}
/*****************************************************************************/
/******************* Set StatusTxt depending on status bits ******************/
/*****************************************************************************/
// Ins_STATUS_UNKNOWN = 0 // Other
// Ins_STATUS_ACTIVE = 1 // 00 (Status == 0)
// Ins_STATUS_PENDING = 2 // 01 (Status == Ins_STATUS_BIT_PENDING)
// Ins_STATUS_REMOVED = 3 // 1- (Status & Ins_STATUS_BIT_REMOVED)
static Ins_StatusTxt_t Ins_GetStatusTxtFromStatusBits (Ins_Status_t Status)
{
if (Status == 0)
return Ins_STATUS_ACTIVE;
if (Status == Ins_STATUS_BIT_PENDING)
return Ins_STATUS_PENDING;
if (Status & Ins_STATUS_BIT_REMOVED)
return Ins_STATUS_REMOVED;
return Ins_STATUS_UNKNOWN;
}
/*****************************************************************************/
/******************* Set status bits depending on StatusTxt ******************/
/*****************************************************************************/
// Ins_STATUS_UNKNOWN = 0 // Other
// Ins_STATUS_ACTIVE = 1 // 00 (Status == 0)
// Ins_STATUS_PENDING = 2 // 01 (Status == Ins_STATUS_BIT_PENDING)
// Ins_STATUS_REMOVED = 3 // 1- (Status & Ins_STATUS_BIT_REMOVED)
static Ins_Status_t Ins_GetStatusBitsFromStatusTxt (Ins_StatusTxt_t StatusTxt)
{
switch (StatusTxt)
{
case Ins_STATUS_UNKNOWN:
case Ins_STATUS_ACTIVE:
return (Ins_Status_t) 0;
case Ins_STATUS_PENDING:
return Ins_STATUS_BIT_PENDING;
case Ins_STATUS_REMOVED:
return Ins_STATUS_BIT_REMOVED;
}
return (Ins_Status_t) 0;
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1165,16 +1093,6 @@ void Ins_PutParamInsCod (long InsCod)
Par_PutHiddenParamLong (NULL,"ins",InsCod); Par_PutHiddenParamLong (NULL,"ins",InsCod);
} }
/*****************************************************************************/
/***************** Write parameter with code of institution ******************/
/*****************************************************************************/
static void Ins_PutParamOtherInsCod (void *InsCod)
{
if (InsCod)
Par_PutHiddenParamLong (NULL,"OthInsCod",*((long *) InsCod));
}
/*****************************************************************************/ /*****************************************************************************/
/******************* Get parameter with code of institution ******************/ /******************* Get parameter with code of institution ******************/
/*****************************************************************************/ /*****************************************************************************/
@ -1184,18 +1102,12 @@ long Ins_GetAndCheckParamOtherInsCod (long MinCodAllowed)
long InsCod; long InsCod;
/***** Get and check parameter with code of institution *****/ /***** Get and check parameter with code of institution *****/
if ((InsCod = Ins_GetParamOtherInsCod ()) < MinCodAllowed) if ((InsCod = Par_GetParToLong ("OthInsCod")) < MinCodAllowed)
Err_WrongInstitExit (); Err_WrongInstitExit ();
return InsCod; return InsCod;
} }
static long Ins_GetParamOtherInsCod (void)
{
/***** Get code of institution *****/
return Par_GetParToLong ("OthInsCod");
}
/*****************************************************************************/ /*****************************************************************************/
/**************************** Remove a institution ***************************/ /**************************** Remove a institution ***************************/
/*****************************************************************************/ /*****************************************************************************/
@ -1210,7 +1122,7 @@ void Ins_RemoveInstitution (void)
Ins_EditingInstitutionConstructor (); Ins_EditingInstitutionConstructor ();
/***** Get institution code *****/ /***** Get institution code *****/
Ins_EditingIns->InsCod = Ins_GetAndCheckParamOtherInsCod (1); Ins_EditingIns->InsCod = Hie_GetAndCheckParamOtherHieCod (1);
/***** Get data of the institution from database *****/ /***** Get data of the institution from database *****/
Ins_GetDataOfInstitByCod (Ins_EditingIns); Ins_GetDataOfInstitByCod (Ins_EditingIns);
@ -1284,7 +1196,7 @@ void Ins_RenameInsShort (void)
Ins_EditingInstitutionConstructor (); Ins_EditingInstitutionConstructor ();
/***** Rename institution *****/ /***** Rename institution *****/
Ins_EditingIns->InsCod = Ins_GetAndCheckParamOtherInsCod (1); Ins_EditingIns->InsCod = Hie_GetAndCheckParamOtherHieCod (1);
Ins_RenameInstitution (Ins_EditingIns,Cns_SHRT_NAME); Ins_RenameInstitution (Ins_EditingIns,Cns_SHRT_NAME);
} }
@ -1294,7 +1206,7 @@ void Ins_RenameInsFull (void)
Ins_EditingInstitutionConstructor (); Ins_EditingInstitutionConstructor ();
/***** Rename institution *****/ /***** Rename institution *****/
Ins_EditingIns->InsCod = Ins_GetAndCheckParamOtherInsCod (1); Ins_EditingIns->InsCod = Hie_GetAndCheckParamOtherHieCod (1);
Ins_RenameInstitution (Ins_EditingIns,Cns_FULL_NAME); Ins_RenameInstitution (Ins_EditingIns,Cns_FULL_NAME);
} }
@ -1398,7 +1310,7 @@ void Ins_ChangeInsWWW (void)
/***** Get parameters from form *****/ /***** Get parameters from form *****/
/* Get the code of the institution */ /* Get the code of the institution */
Ins_EditingIns->InsCod = Ins_GetAndCheckParamOtherInsCod (1); Ins_EditingIns->InsCod = Hie_GetAndCheckParamOtherHieCod (1);
/* Get the new WWW for the institution */ /* Get the new WWW for the institution */
Par_GetParToText ("WWW",NewWWW,Cns_MAX_BYTES_WWW); Par_GetParToText ("WWW",NewWWW,Cns_MAX_BYTES_WWW);
@ -1430,31 +1342,22 @@ void Ins_ChangeInsWWW (void)
void Ins_ChangeInsStatus (void) void Ins_ChangeInsStatus (void)
{ {
extern const char *Txt_The_status_of_the_institution_X_has_changed; extern const char *Txt_The_status_of_the_institution_X_has_changed;
Ins_Status_t Status; Hie_Status_t Status;
Ins_StatusTxt_t StatusTxt;
/***** Institution constructor *****/ /***** Institution constructor *****/
Ins_EditingInstitutionConstructor (); Ins_EditingInstitutionConstructor ();
/***** Get parameters from form *****/ /***** Get parameters from form *****/
/* Get institution code */ /* Get institution code */
Ins_EditingIns->InsCod = Ins_GetAndCheckParamOtherInsCod (1); Ins_EditingIns->InsCod = Hie_GetAndCheckParamOtherHieCod (1);
/* Get parameter with status */ /* Get parameter with status */
Status = (Ins_Status_t) Status = Hie_GetParamStatus (); // New status
Par_GetParToUnsignedLong ("Status",
0,
(unsigned long) Ins_MAX_STATUS,
(unsigned long) Ins_WRONG_STATUS);
if (Status == Ins_WRONG_STATUS)
Err_WrongStatusExit ();
StatusTxt = Ins_GetStatusTxtFromStatusBits (Status);
Status = Ins_GetStatusBitsFromStatusTxt (StatusTxt); // New status
/***** Get data of institution *****/ /***** Get data of institution *****/
Ins_GetDataOfInstitByCod (Ins_EditingIns); Ins_GetDataOfInstitByCod (Ins_EditingIns);
/***** Update status in table of institutions *****/ /***** Update status *****/
Ins_DB_UpdateInsStatus (Status,Ins_EditingIns->InsCod); Ins_DB_UpdateInsStatus (Status,Ins_EditingIns->InsCod);
Ins_EditingIns->Status = Status; Ins_EditingIns->Status = Status;
@ -1650,7 +1553,7 @@ void Ins_ReceiveFormReqIns (void)
Ins_EditingInstitutionConstructor (); Ins_EditingInstitutionConstructor ();
/***** Receive form to request a new institution *****/ /***** Receive form to request a new institution *****/
Ins_ReceiveFormRequestOrCreateIns ((unsigned) Ins_STATUS_BIT_PENDING); Ins_ReceiveFormRequestOrCreateIns ((Hie_Status_t) Hie_STATUS_BIT_PENDING);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1663,14 +1566,14 @@ void Ins_ReceiveFormNewIns (void)
Ins_EditingInstitutionConstructor (); Ins_EditingInstitutionConstructor ();
/***** Receive form to create a new institution *****/ /***** Receive form to create a new institution *****/
Ins_ReceiveFormRequestOrCreateIns (0); Ins_ReceiveFormRequestOrCreateIns ((Hie_Status_t) 0);
} }
/*****************************************************************************/ /*****************************************************************************/
/*********** Receive form to request or create a new institution *************/ /*********** Receive form to request or create a new institution *************/
/*****************************************************************************/ /*****************************************************************************/
static void Ins_ReceiveFormRequestOrCreateIns (unsigned Status) static void Ins_ReceiveFormRequestOrCreateIns (Hie_Status_t Status)
{ {
extern const char *Txt_The_institution_X_already_exists; extern const char *Txt_The_institution_X_already_exists;
extern const char *Txt_Created_new_institution_X; extern const char *Txt_Created_new_institution_X;

View File

@ -35,32 +35,13 @@
/************************ Public types and constants *************************/ /************************ Public types and constants *************************/
/*****************************************************************************/ /*****************************************************************************/
typedef enum
{
Ins_STATUS_BIT_PENDING = (1 << 0), // Institution is requested, but not yet activated
Ins_STATUS_BIT_REMOVED = (1 << 1), // Institution has been removed
} Ins_Status_Bits_t;
typedef unsigned Ins_Status_t;
#define Ins_MAX_STATUS ((Ins_Status_t) 3)
#define Ins_WRONG_STATUS ((Ins_Status_t) (Ins_MAX_STATUS + 1))
#define Ins_NUM_STATUS_TXT 4
typedef enum
{
Ins_STATUS_UNKNOWN = 0, // Other
Ins_STATUS_ACTIVE = 1, // 00 (Status == 0)
Ins_STATUS_PENDING = 2, // 01 (Status == Ins_STATUS_BIT_PENDING)
Ins_STATUS_REMOVED = 3, // 1- (Status & Ins_STATUS_BIT_REMOVED)
} Ins_StatusTxt_t;
#define Ins_MAX_INSTITS_PER_USR 10 // Used in list of my institutions #define Ins_MAX_INSTITS_PER_USR 10 // Used in list of my institutions
struct Ins_Instit struct Ins_Instit
{ {
long InsCod; long InsCod;
long CtyCod; long CtyCod;
Ins_Status_t Status; // Institution status Hie_Status_t Status; // Institution status
long RequesterUsrCod; // User code of the person who requested the creation of this institution long RequesterUsrCod; // User code of the person who requested the creation of this institution
char ShrtName[Cns_HIERARCHY_MAX_BYTES_SHRT_NAME + 1]; char ShrtName[Cns_HIERARCHY_MAX_BYTES_SHRT_NAME + 1];
char FullName[Cns_HIERARCHY_MAX_BYTES_FULL_NAME + 1]; char FullName[Cns_HIERARCHY_MAX_BYTES_FULL_NAME + 1];

View File

@ -33,6 +33,7 @@
#include "swad_error.h" #include "swad_error.h"
#include "swad_global.h" #include "swad_global.h"
#include "swad_hierarchy.h" #include "swad_hierarchy.h"
#include "swad_hierarchy_database.h"
#include "swad_institution.h" #include "swad_institution.h"
#include "swad_institution_database.h" #include "swad_institution_database.h"
@ -46,7 +47,7 @@ extern struct Globals Gbl;
/************************** Create a new institution *************************/ /************************** Create a new institution *************************/
/*****************************************************************************/ /*****************************************************************************/
long Ins_DB_CreateInstitution (const struct Ins_Instit *Ins,unsigned Status) long Ins_DB_CreateInstitution (const struct Ins_Instit *Ins,Hie_Status_t Status)
{ {
return return
DB_QueryINSERTandReturnCode ("can not create institution", DB_QueryINSERTandReturnCode ("can not create institution",
@ -57,7 +58,7 @@ long Ins_DB_CreateInstitution (const struct Ins_Instit *Ins,unsigned Status)
" (%ld,%u,%ld," " (%ld,%u,%ld,"
"'%s','%s','%s')", "'%s','%s','%s')",
Ins->CtyCod, Ins->CtyCod,
Status, (unsigned) Status,
Gbl.Usrs.Me.UsrDat.UsrCod, Gbl.Usrs.Me.UsrDat.UsrCod,
Ins->ShrtName, Ins->ShrtName,
Ins->FullName, Ins->FullName,
@ -82,7 +83,7 @@ void Ins_DB_UpdateInsCty (long InsCod,long CtyCod)
/****************** Update status in table of institutions *******************/ /****************** Update status in table of institutions *******************/
/*****************************************************************************/ /*****************************************************************************/
void Ins_DB_UpdateInsStatus (long InsCod,Ins_Status_t Status) void Ins_DB_UpdateInsStatus (long InsCod,Hie_Status_t Status)
{ {
DB_QueryUPDATE ("can not update the status of an institution", DB_QueryUPDATE ("can not update the status of an institution",
"UPDATE ins_instits" "UPDATE ins_instits"
@ -223,7 +224,7 @@ unsigned Ins_DB_GetAllInsWithPendingCtr (MYSQL_RES **mysql_res)
" AND ctr_centers.InsCod=ins_instits.InsCod" " AND ctr_centers.InsCod=ins_instits.InsCod"
" GROUP BY ctr_centers.InsCod" " GROUP BY ctr_centers.InsCod"
" ORDER BY ins_instits.ShortName", " ORDER BY ins_instits.ShortName",
(unsigned) Ctr_STATUS_BIT_PENDING); (unsigned) Hie_STATUS_BIT_PENDING);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -245,7 +246,7 @@ unsigned Ins_DB_GetInsWithPendingCtrsAdminByMe (MYSQL_RES **mysql_res)
" AND ctr_centers.InsCod=ins_instits.InsCod" " AND ctr_centers.InsCod=ins_instits.InsCod"
" GROUP BY ctr_centers.InsCod" " GROUP BY ctr_centers.InsCod"
" ORDER BY ins_instits.ShortName", " ORDER BY ins_instits.ShortName",
(unsigned) Ctr_STATUS_BIT_PENDING, (unsigned) Hie_STATUS_BIT_PENDING,
Gbl.Usrs.Me.UsrDat.UsrCod); Gbl.Usrs.Me.UsrDat.UsrCod);
} }

View File

@ -37,9 +37,9 @@
/***************************** Public prototypes *****************************/ /***************************** Public prototypes *****************************/
/*****************************************************************************/ /*****************************************************************************/
long Ins_DB_CreateInstitution (const struct Ins_Instit *Ins,unsigned Status); long Ins_DB_CreateInstitution (const struct Ins_Instit *Ins,Hie_Status_t Status);
void Ins_DB_UpdateInsCty (long InsCod,long CtyCod); void Ins_DB_UpdateInsCty (long InsCod,long CtyCod);
void Ins_DB_UpdateInsStatus (long InsCod,Ins_Status_t Status); void Ins_DB_UpdateInsStatus (long InsCod,Hie_Status_t Status);
void Ins_DB_UpdateInsName (long InsCod,const char *FieldName,const char *NewInsName); void Ins_DB_UpdateInsName (long InsCod,const char *FieldName,const char *NewInsName);
void Ins_DB_UpdateInsWWW (long InsCod,const char NewWWW[Cns_MAX_BYTES_WWW + 1]); void Ins_DB_UpdateInsWWW (long InsCod,const char NewWWW[Cns_MAX_BYTES_WWW + 1]);

View File

@ -71,6 +71,7 @@
#include "swad_exam_log.h" #include "swad_exam_log.h"
#include "swad_figure.h" #include "swad_figure.h"
#include "swad_forum.h" #include "swad_forum.h"
#include "swad_hierarchy.h"
#include "swad_holiday.h" #include "swad_holiday.h"
#include "swad_info.h" #include "swad_info.h"
#include "swad_institution.h" #include "swad_institution.h"
@ -4033,9 +4034,9 @@ const char *Txt_Center_X_removed = // Warning: it is very important to include %
"Centro <strong>%s</strong> removido."; "Centro <strong>%s</strong> removido.";
#endif #endif
const char *Txt_CENTER_STATUS[Crs_NUM_STATUS_TXT] = const char *Txt_CENTER_STATUS[Hie_NUM_STATUS_TXT] =
{ {
[Ctr_STATUS_UNKNOWN] = [Hie_STATUS_UNKNOWN] =
#if L==1 // ca #if L==1 // ca
"Desconegudo" "Desconegudo"
#elif L==2 // de #elif L==2 // de
@ -4056,7 +4057,7 @@ const char *Txt_CENTER_STATUS[Crs_NUM_STATUS_TXT] =
"Desconhecido" "Desconhecido"
#endif #endif
, ,
[Ctr_STATUS_ACTIVE] = [Hie_STATUS_ACTIVE] =
#if L==1 // ca #if L==1 // ca
"Activo" "Activo"
#elif L==2 // de #elif L==2 // de
@ -4077,7 +4078,7 @@ const char *Txt_CENTER_STATUS[Crs_NUM_STATUS_TXT] =
"Ativo" "Ativo"
#endif #endif
, ,
[Ctr_STATUS_PENDING] = [Hie_STATUS_PENDING] =
#if L==1 // ca #if L==1 // ca
"Novo" "Novo"
#elif L==2 // de #elif L==2 // de
@ -4098,7 +4099,7 @@ const char *Txt_CENTER_STATUS[Crs_NUM_STATUS_TXT] =
"Novo" "Novo"
#endif #endif
, ,
[Ctr_STATUS_REMOVED] = [Hie_STATUS_REMOVED] =
#if L==1 // ca #if L==1 // ca
"Eliminado" "Eliminado"
#elif L==2 // de #elif L==2 // de
@ -5710,9 +5711,9 @@ const char *Txt_Course_program =
"Programa da disciplina"; "Programa da disciplina";
#endif #endif
const char *Txt_COURSE_STATUS[Crs_NUM_STATUS_TXT] = const char *Txt_COURSE_STATUS[Hie_NUM_STATUS_TXT] =
{ {
[Crs_STATUS_UNKNOWN] = [Hie_STATUS_UNKNOWN] =
#if L==1 // ca #if L==1 // ca
"Desconegudo" "Desconegudo"
#elif L==2 // de #elif L==2 // de
@ -5733,7 +5734,7 @@ const char *Txt_COURSE_STATUS[Crs_NUM_STATUS_TXT] =
"Desconhecido" "Desconhecido"
#endif #endif
, ,
[Crs_STATUS_ACTIVE] = [Hie_STATUS_ACTIVE] =
#if L==1 // ca #if L==1 // ca
"Activa" "Activa"
#elif L==2 // de #elif L==2 // de
@ -5754,7 +5755,7 @@ const char *Txt_COURSE_STATUS[Crs_NUM_STATUS_TXT] =
"Ativa" "Ativa"
#endif #endif
, ,
[Crs_STATUS_PENDING] = [Hie_STATUS_PENDING] =
#if L==1 // ca #if L==1 // ca
"Nova" "Nova"
#elif L==2 // de #elif L==2 // de
@ -5775,7 +5776,7 @@ const char *Txt_COURSE_STATUS[Crs_NUM_STATUS_TXT] =
"Nova" "Nova"
#endif #endif
, ,
[Crs_STATUS_REMOVED] = [Hie_STATUS_REMOVED] =
#if L==1 // ca #if L==1 // ca
"Eliminada" "Eliminada"
#elif L==2 // de #elif L==2 // de
@ -8120,9 +8121,9 @@ const char *Txt_degree =
"grau"; "grau";
#endif #endif
const char *Txt_DEGREE_STATUS[Deg_NUM_STATUS_TXT] = const char *Txt_DEGREE_STATUS[Hie_NUM_STATUS_TXT] =
{ {
[Deg_STATUS_UNKNOWN] = [Hie_STATUS_UNKNOWN] =
#if L==1 // ca #if L==1 // ca
"Desconegudo" "Desconegudo"
#elif L==2 // de #elif L==2 // de
@ -8143,7 +8144,7 @@ const char *Txt_DEGREE_STATUS[Deg_NUM_STATUS_TXT] =
"Desconhecido" "Desconhecido"
#endif #endif
, ,
[Deg_STATUS_ACTIVE] = [Hie_STATUS_ACTIVE] =
#if L==1 // ca #if L==1 // ca
"Activa" "Activa"
#elif L==2 // de #elif L==2 // de
@ -8164,7 +8165,7 @@ const char *Txt_DEGREE_STATUS[Deg_NUM_STATUS_TXT] =
"Ativa" "Ativa"
#endif #endif
, ,
[Deg_STATUS_PENDING] = [Hie_STATUS_PENDING] =
#if L==1 // ca #if L==1 // ca
"Nova" "Nova"
#elif L==2 // de #elif L==2 // de
@ -8185,7 +8186,7 @@ const char *Txt_DEGREE_STATUS[Deg_NUM_STATUS_TXT] =
"Nova" "Nova"
#endif #endif
, ,
[Deg_STATUS_REMOVED] = [Hie_STATUS_REMOVED] =
#if L==1 // ca #if L==1 // ca
"Eliminada" "Eliminada"
#elif L==2 // de #elif L==2 // de
@ -17443,9 +17444,9 @@ const char *Txt_Institution_X_removed = // Warning: it is very important to incl
#endif #endif
const char *Txt_INSTITUTION_STATUS[Ins_NUM_STATUS_TXT] = const char *Txt_INSTITUTION_STATUS[Hie_NUM_STATUS_TXT] =
{ {
[Ins_STATUS_UNKNOWN] = [Hie_STATUS_UNKNOWN] =
#if L==1 // ca #if L==1 // ca
"Desconegudo" "Desconegudo"
#elif L==2 // de #elif L==2 // de
@ -17466,7 +17467,7 @@ const char *Txt_INSTITUTION_STATUS[Ins_NUM_STATUS_TXT] =
"Desconhecido" "Desconhecido"
#endif #endif
, ,
[Ins_STATUS_ACTIVE] = [Hie_STATUS_ACTIVE] =
#if L==1 // ca #if L==1 // ca
"Activa" "Activa"
#elif L==2 // de #elif L==2 // de
@ -17487,7 +17488,7 @@ const char *Txt_INSTITUTION_STATUS[Ins_NUM_STATUS_TXT] =
"Ativa" "Ativa"
#endif #endif
, ,
[Ins_STATUS_PENDING] = [Hie_STATUS_PENDING] =
#if L==1 // ca #if L==1 // ca
"Nova" "Nova"
#elif L==2 // de #elif L==2 // de
@ -17508,7 +17509,7 @@ const char *Txt_INSTITUTION_STATUS[Ins_NUM_STATUS_TXT] =
"Nova" "Nova"
#endif #endif
, ,
[Ins_STATUS_REMOVED] = [Hie_STATUS_REMOVED] =
#if L==1 // ca #if L==1 // ca
"Eliminada" "Eliminada"
#elif L==2 // de #elif L==2 // de