Version19.190

This commit is contained in:
acanas 2020-04-19 02:39:20 +02:00
parent e31ab3c7e9
commit ef47fd45ab
12 changed files with 886 additions and 85 deletions

View File

@ -1402,7 +1402,7 @@ a:hover img.CENTRE_PHOTO_SHOW
}
/***************************** Buildings and rooms ***************************/
.BLD_SEL
.BLD_SEL, .ROOM_TYPE_SEL
{
width:80px;
}

1
icon/code.svg Normal file
View File

@ -0,0 +1 @@
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="code" class="svg-inline--fa fa-code fa-w-20" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="#404040" d="M278.9 511.5l-61-17.7c-6.4-1.8-10-8.5-8.2-14.9L346.2 8.7c1.8-6.4 8.5-10 14.9-8.2l61 17.7c6.4 1.8 10 8.5 8.2 14.9L293.8 503.3c-1.9 6.4-8.5 10.1-14.9 8.2zm-114-112.2l43.5-46.4c4.6-4.9 4.3-12.7-.8-17.2L117 256l90.6-79.7c5.1-4.5 5.5-12.3.8-17.2l-43.5-46.4c-4.5-4.8-12.1-5.1-17-.5L3.8 247.2c-5.1 4.7-5.1 12.8 0 17.5l144.1 135.1c4.9 4.6 12.5 4.4 17-.5zm327.2.6l144.1-135.1c5.1-4.7 5.1-12.8 0-17.5L492.1 112.1c-4.8-4.5-12.4-4.3-17 .5L431.6 159c-4.6 4.9-4.3 12.7.8 17.2L523 256l-90.6 79.7c-5.1 4.5-5.5 12.3-.8 17.2l43.5 46.4c4.5 4.9 12.1 5.1 17 .6z"></path></svg>

After

Width:  |  Height:  |  Size: 764 B

1
icon/photo-video.svg Normal file
View File

@ -0,0 +1 @@
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="photo-video" class="svg-inline--fa fa-photo-video fa-w-20" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="#404040" d="M608 0H160a32 32 0 0 0-32 32v96h160V64h192v320h128a32 32 0 0 0 32-32V32a32 32 0 0 0-32-32zM232 103a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9V73a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm352 208a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9v-30a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm0-104a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9v-30a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm0-104a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9V73a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm-168 57H32a32 32 0 0 0-32 32v288a32 32 0 0 0 32 32h384a32 32 0 0 0 32-32V192a32 32 0 0 0-32-32zM96 224a32 32 0 1 1-32 32 32 32 0 0 1 32-32zm288 224H64v-32l64-64 32 32 128-128 96 96z"></path></svg>

After

Width:  |  Height:  |  Size: 808 B

View File

@ -1137,6 +1137,7 @@ CREATE TABLE IF NOT EXISTS rooms (
CtrCod INT NOT NULL,
BldCod INT NOT NULL DEFAULT -1,
Floor INT NOT NULL DEFAULT 0,
Type ENUM('no_type','administration','auditorium','cafeteria','canteen','classroom','concierge','corridor','gym','hall','kindergarten','laboratory','library','office','outdoors','parking','pavilion','room','secretariat','seminar','shop','store','toilets','virtual','yard') NOT NULL DEFAULT 'no_type',
ShortName VARCHAR(511) NOT NULL,
FullName VARCHAR(2047) NOT NULL,
Capacity INT NOT NULL,

View File

@ -364,6 +364,7 @@ const struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
[ActRemRoo ] = {1747,-1,TabUnk,ActSeeRoo , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Roo_RemoveRoom ,Roo_ContEditAfterChgRoom ,NULL},
[ActChgRooBld ] = {1845,-1,TabUnk,ActSeeRoo , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Roo_ChangeBuilding ,Roo_ContEditAfterChgRoom ,NULL},
[ActChgRooFlo ] = {1846,-1,TabUnk,ActSeeRoo , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Roo_ChangeFloor ,Roo_ContEditAfterChgRoom ,NULL},
[ActChgRooTyp ] = {1847,-1,TabUnk,ActSeeRoo , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Roo_ChangeType ,Roo_ContEditAfterChgRoom ,NULL},
[ActRenRooSho ] = {1748,-1,TabUnk,ActSeeRoo , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Roo_RenameRoomShort ,Roo_ContEditAfterChgRoom ,NULL},
[ActRenRooFul ] = {1749,-1,TabUnk,ActSeeRoo , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Roo_RenameRoomFull ,Roo_ContEditAfterChgRoom ,NULL},
[ActChgRooMaxUsr ] = {1750,-1,TabUnk,ActSeeRoo , 0, 0, 0,0x3C6, 0, 0, 0,Act_CONT_NORM,Act_BRW_1ST_TAB,Roo_ChangeCapacity ,Roo_ContEditAfterChgRoom ,NULL},
@ -3594,6 +3595,7 @@ Act_Action_t Act_FromActCodToAction[1 + Act_MAX_ACTION_COD] = // Do not reuse un
ActRenBldLoc, // #1844
ActChgRooBld, // #1845
ActChgRooFlo, // #1846
ActChgRooTyp, // #1847
};
/*****************************************************************************/

View File

@ -64,7 +64,7 @@ typedef enum
typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to indicate obsolete action
#define Act_MAX_ACTION_COD 1846
#define Act_MAX_ACTION_COD 1847
#define Act_MAX_OPTIONS_IN_MENU_PER_TAB 13
@ -341,9 +341,10 @@ typedef signed int Act_Action_t; // Must be a signed type, because -1 is used to
#define ActRemRoo (ActRenHld + 42)
#define ActChgRooBld (ActRenHld + 43)
#define ActChgRooFlo (ActRenHld + 44)
#define ActRenRooSho (ActRenHld + 45)
#define ActRenRooFul (ActRenHld + 46)
#define ActChgRooMaxUsr (ActRenHld + 47)
#define ActChgRooTyp (ActRenHld + 45)
#define ActRenRooSho (ActRenHld + 46)
#define ActRenRooFul (ActRenHld + 47)
#define ActChgRooMaxUsr (ActRenHld + 48)
/*****************************************************************************/
/********************************* Degree tab ********************************/

View File

@ -497,8 +497,8 @@ enscript -2 --landscape --color --file-align=2 --highlight --line-numbers -o - *
En OpenSWAD:
ps2pdf source.ps destination.pdf
*/
#define Log_PLATFORM_VERSION "SWAD 19.189 (2020-04-16)"
#define CSS_FILE "swad19.187.css"
#define Log_PLATFORM_VERSION "SWAD 19.190 (2020-04-18)"
#define CSS_FILE "swad19.190.css"
#define JS_FILE "swad19.172.1.js"
/*
*
@ -549,6 +549,12 @@ Funci
// TODO: Integrar pull requests con traducciones del alemán del usuario eruedin en GitHub
// TODO: Cambiar icono notificaciones nuevas con "bell-on.svg"
Version 19.190.1: Apr 18, 2020 Fixed bug in degree photo, reported by Adrián José Martínez Navarro. (? lines)
Version 19.190: Apr 18, 2020 Changes in rooms. (288488 lines)
2 changes necessary in database:
ALTER TABLE rooms ADD COLUMN Type ENUM('no_type','administration','auditorium','cafeteria','canteen','classroom','concierge','corridor','gym','hall','kindergarten','laboratory','library','office','outdoors','parking','pavilion','room','secretariat','seminar','shop','store','toilets','virtual','yard') NOT NULL DEFAULT 'no_type' AFTER Floor;
DROP TABLE IF EXISTS log_old;
Version 19.189: Apr 16, 2020 Fixed security issue in test exams.
Removed table with test status. (287719 lines)
3/4 changes necessary in database:

View File

@ -2354,24 +2354,51 @@ mysql> DESCRIBE projects;
/***** Table rooms *****/
/*
mysql> DESCRIBE rooms;
+-----------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+----------------+
| RooCod | int(11) | NO | PRI | NULL | auto_increment |
| CtrCod | int(11) | NO | MUL | NULL | |
| BldCod | int(11) | NO | | -1 | |
| Floor | int(11) | NO | | 0 | |
| ShortName | varchar(511) | NO | | NULL | |
| FullName | varchar(2047) | NO | | NULL | |
| Capacity | int(11) | NO | | NULL | |
+-----------+---------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+----------------+
| RooCod | int(11) | NO | PRI | NULL | auto_increment |
| CtrCod | int(11) | NO | MUL | NULL | |
| BldCod | int(11) | NO | | -1 | |
| Floor | int(11) | NO | | 0 | |
| Type | enum('no_type','administration','auditorium','cafeteria','canteen','classroom','concierge','corridor','gym','hall','kindergarten','laboratory','library','office','outdoors','parking','pavilion','room','secretariat','seminar','shop','store','toilets','virtual','yard') | NO | | no_type | |
| ShortName | varchar(511) | NO | | NULL | |
| FullName | varchar(2047) | NO | | NULL | |
| Capacity | int(11) | NO | | NULL | |
+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
*/
DB_CreateTable ("CREATE TABLE IF NOT EXISTS rooms ("
"RooCod INT NOT NULL AUTO_INCREMENT,"
"CtrCod INT NOT NULL,"
"BldCod INT NOT NULL DEFAULT -1,"
"Floor INT NOT NULL DEFAULT 0,"
"Type ENUM("
"'no_type',"
"'administration',"
"'auditorium',"
"'cafeteria',"
"'canteen',"
"'classroom',"
"'concierge',"
"'corridor',"
"'gym',"
"'hall',"
"'kindergarten',"
"'laboratory',"
"'library',"
"'office',"
"'outdoors',"
"'parking',"
"'pavilion',"
"'room',"
"'secretariat',"
"'seminar',"
"'shop',"
"'store',"
"'toilets',"
"'virtual',"
"'yard') NOT NULL DEFAULT 'no_type',"
"ShortName VARCHAR(511) NOT NULL," // Roo_MAX_BYTES_SHRT_NAME
"FullName VARCHAR(2047) NOT NULL," // Roo_MAX_BYTES_FULL_NAME
"Capacity INT NOT NULL,"

View File

@ -47,6 +47,64 @@ extern struct Globals Gbl;
/***************************** Private constants *****************************/
/*****************************************************************************/
static const char *Roo_TypesDB[Roo_NUM_TYPES] =
{
[Roo_NO_TYPE ] = "no_type",
[Roo_ADMINISTRATION] = "administration",
[Roo_AUDITORIUM ] = "auditorium",
[Roo_CAFETERIA ] = "cafeteria",
[Roo_CANTEEN ] = "canteen",
[Roo_CLASSROOM ] = "classroom",
[Roo_CONCIERGE ] = "concierge",
[Roo_CORRIDOR ] = "corridor",
[Roo_GYM ] = "gym",
[Roo_HALL ] = "hall",
[Roo_KINDERGARTEN ] = "kindergarten",
[Roo_LABORATORY ] = "laboratory",
[Roo_LIBRARY ] = "library",
[Roo_OFFICE ] = "office",
[Roo_OUTDOORS ] = "outdoors",
[Roo_PARKING ] = "parking",
[Roo_PAVILION ] = "pavilion",
[Roo_ROOM ] = "room",
[Roo_SECRETARIAT ] = "secretariat",
[Roo_SEMINAR ] = "seminar",
[Roo_SHOP ] = "shop",
[Roo_STORE ] = "store",
[Roo_TOILETS ] = "toilets",
[Roo_VIRTUAL ] = "virtual",
[Roo_YARD ] = "yard",
};
static const char *Roo_TypesIcons[Roo_NUM_TYPES] =
{
[Roo_NO_TYPE ] = "question.svg",
[Roo_ADMINISTRATION] = "user-tie.svg",
[Roo_AUDITORIUM ] = "landmark.svg",
[Roo_CAFETERIA ] = "coffee.svg",
[Roo_CANTEEN ] = "utensils.svg",
[Roo_CLASSROOM ] = "chalkboard-teacher.svg",
[Roo_CONCIERGE ] = "concierge-bell",
[Roo_CORRIDOR ] = "walking.svg",
[Roo_GYM ] = "dumbbell.svg",
[Roo_HALL ] = "map-signs.svg",
[Roo_KINDERGARTEN ] = "child.svg",
[Roo_LABORATORY ] = "flask.svg",
[Roo_LIBRARY ] = "book.svg",
[Roo_OFFICE ] = "house-user.svg",
[Roo_OUTDOORS ] = "cloud-sun.svg",
[Roo_PARKING ] = "car.svg",
[Roo_PAVILION ] = "volleyball-ball.svg",
[Roo_ROOM ] = "chalkboard.svg",
[Roo_SECRETARIAT ] = "stamp.svg",
[Roo_SEMINAR ] = "chalkboard-teacher.svg",
[Roo_SHOP ] = "shopping-cart.svg",
[Roo_STORE ] = "daily.svg",
[Roo_TOILETS ] = "toilet.svg",
[Roo_VIRTUAL ] = "laptop-house.svg",
[Roo_YARD ] = "canadian-mapple-leaf.svg",
};
/*****************************************************************************/
/******************************* Private types *******************************/
/*****************************************************************************/
@ -69,6 +127,7 @@ static void Roo_PutIconsEditingRooms (__attribute__((unused)) void *Args);
static void Roo_GetDataOfRoomByCod (struct Roo_Room *Room);
static void Roo_GetBldShrtName (struct Roo_Room *Room,const char *BldShrtNameFromDB);
static Roo_RoomType_t Roo_GetTypeFromString (const char *Str);
static void Roo_EditRoomsInternal (void);
@ -77,8 +136,11 @@ static void Roo_ListRoomsForEdition (const struct Bld_Buildings *Buildings,
static void Roo_PutSelectorBuilding (long BldCod,
const struct Bld_Buildings *Buildings,
bool SubmitOnChange);
static void Roo_PutSelectorType (Roo_RoomType_t RoomType,
bool SubmitOnChange);
static void Roo_PutParamRooCod (long RooCod);
static int Roo_GetParamFloor (void);
static Roo_RoomType_t Roo_GetParamType (void);
static void Roo_RenameRoom (Cns_ShrtOrFullName_t ShrtOrFullName);
static bool Roo_CheckIfRoomNameExists (const char *FieldName,const char *Name,long RooCod);
@ -88,7 +150,7 @@ static void Roo_WriteCapacity (char Str[Cns_MAX_DECIMAL_DIGITS_UINT + 1],unsigne
static void Roo_PutFormToCreateRoom (const struct Bld_Buildings *Buildings);
static void Roo_PutHeadRooms (void);
static void Roo_CreateRoom (const struct Roo_Room *Room);
static void Roo_CreateRoom (struct Roo_Room *Room);
static void Roo_EditingRoomConstructor (void);
static void Roo_EditingRoomDestructor (void);
@ -114,6 +176,7 @@ void Roo_SeeRooms (void)
extern const char *Txt_Rooms;
extern const char *Txt_ROOMS_HELP_ORDER[Roo_NUM_ORDERS];
extern const char *Txt_ROOMS_ORDER[Roo_NUM_ORDERS];
extern const char *Txt_ROOM_TYPES[Roo_NUM_TYPES];
extern const char *Txt_New_room;
struct Roo_Rooms Rooms;
Roo_Order_t Order;
@ -178,7 +241,7 @@ void Roo_SeeRooms (void)
/* Type */
HTM_TD_Begin ("class=\"DAT LM %s\"",Gbl.ColorRows[RowEvenOdd]);
HTM_Txt (Rooms.Lst[NumRoom].ShrtName);
Ico_PutIconOn (Roo_TypesIcons[Rooms.Lst[NumRoom].Type],Txt_ROOM_TYPES[Rooms.Lst[NumRoom].Type]);
HTM_TD_End ();
/* Short name */
@ -346,7 +409,7 @@ void Roo_GetListRooms (struct Roo_Rooms *Rooms,
{
[Roo_ORDER_BY_BUILDING ] = "buildings.ShortName,rooms.Floor,rooms.ShortName",
[Roo_ORDER_BY_FLOOR ] = "rooms.Floor,buildings.ShortName,rooms.ShortName",
[Roo_ORDER_BY_TYPE ] = "rooms.Floor,buildings.ShortName,rooms.ShortName",
[Roo_ORDER_BY_TYPE ] = "rooms.Type,buildings.ShortName,rooms.Floor,rooms.ShortName",
[Roo_ORDER_BY_SHRT_NAME] = "rooms.ShortName,rooms.FullName",
[Roo_ORDER_BY_FULL_NAME] = "rooms.FullName,rooms.ShortName",
[Roo_ORDER_BY_CAPACITY ] = "rooms.Capacity DESC,buildings.ShortName,rooms.Floor,rooms.ShortName",
@ -366,9 +429,10 @@ void Roo_GetListRooms (struct Roo_Rooms *Rooms,
"rooms.BldCod," // row[1]
"buildings.ShortName," // row[2]
"rooms.Floor," // row[3]
"rooms.ShortName," // row[4]
"rooms.FullName," // row[5]
"rooms.Capacity" // row[6]
"rooms.Type," // row[4]
"rooms.ShortName," // row[5]
"rooms.FullName," // row[6]
"rooms.Capacity" // row[7]
" FROM rooms LEFT JOIN buildings"
" ON rooms.BldCod=buildings.BldCod"
" WHERE rooms.CtrCod=%ld"
@ -427,16 +491,19 @@ void Roo_GetListRooms (struct Roo_Rooms *Rooms,
/* Get floor (row[3]) */
Room->Floor = Str_ConvertStrCodToLongCod (row[3]);
/* Get the short name of the room (row[4]) */
Str_Copy (Room->ShrtName,row[4],
/* Get type (row[4]) */
Room->Type = Roo_GetTypeFromString (row[4]);
/* Get the short name of the room (row[5]) */
Str_Copy (Room->ShrtName,row[5],
Roo_MAX_BYTES_SHRT_NAME);
/* Get the full name of the room (row[5]) */
Str_Copy (Room->FullName,row[5],
/* Get the full name of the room (row[6]) */
Str_Copy (Room->FullName,row[6],
Roo_MAX_BYTES_FULL_NAME);
/* Get seating capacity in this room (row[6]) */
if (sscanf (row[6],"%u",&Room->Capacity) != 1)
/* Get seating capacity in this room (row[7]) */
if (sscanf (row[7],"%u",&Room->Capacity) != 1)
Room->Capacity = Roo_UNLIMITED_CAPACITY;
break;
case Roo_ONLY_SHRT_NAME:
@ -474,9 +541,10 @@ static void Roo_GetDataOfRoomByCod (struct Roo_Room *Room)
"SELECT rooms.BldCod," // row[0]
"buildings.ShortName," // row[1]
"rooms.Floor," // row[2]
"rooms.ShortName," // row[3]
"rooms.FullName," // row[4]
"rooms.Capacity" // row[5]
"rooms.Type," // row[3]
"rooms.ShortName," // row[4]
"rooms.FullName," // row[5]
"rooms.Capacity" // row[6]
" FROM rooms LEFT JOIN buildings"
" ON rooms.BldCod=buildings.BldCod"
" WHERE rooms.RooCod=%ld",
@ -497,16 +565,19 @@ static void Roo_GetDataOfRoomByCod (struct Roo_Room *Room)
/* Get floor (row[2]) */
Room->Floor = Str_ConvertStrCodToLongCod (row[2]);
/* Get the short name of the room (row[3]) */
Str_Copy (Room->ShrtName,row[3],
/* Get type (row[3]) */
Room->Type = Roo_GetTypeFromString (row[3]);
/* Get the short name of the room (row[4]) */
Str_Copy (Room->ShrtName,row[4],
Roo_MAX_BYTES_SHRT_NAME);
/* Get the full name of the room (row[4]) */
Str_Copy (Room->FullName,row[4],
/* Get the full name of the room (row[5]) */
Str_Copy (Room->FullName,row[5],
Roo_MAX_BYTES_FULL_NAME);
/* Get seating capacity in this room (row[5]) */
if (sscanf (row[5],"%u",&Room->Capacity) != 1)
/* Get seating capacity in this room (row[6]) */
if (sscanf (row[6],"%u",&Room->Capacity) != 1)
Room->Capacity = Roo_UNLIMITED_CAPACITY;
}
@ -538,6 +609,24 @@ static void Roo_GetBldShrtName (struct Roo_Room *Room,const char *BldShrtNameFro
}
}
/*****************************************************************************/
/********************** Convert from string to type **************************/
/*****************************************************************************/
static Roo_RoomType_t Roo_GetTypeFromString (const char *Str)
{
Roo_RoomType_t Type;
/***** Compare string with all string types *****/
for (Type = (Roo_RoomType_t) 0;
Type <= (Roo_RoomType_t) (Roo_NUM_TYPES - 1);
Type++)
if (!strcmp (Roo_TypesDB[Type],Str))
return Type;
return Roo_NO_TYPE;
}
/*****************************************************************************/
/**************************** Free list of rooms *****************************/
/*****************************************************************************/
@ -609,11 +698,11 @@ static void Roo_ListRoomsForEdition (const struct Bld_Buildings *Buildings,
HTM_TD_End ();
/* Room type */
HTM_TD_Begin ("class=\"LM\"");
Frm_StartForm (ActRenRooSho);
HTM_TD_Begin ("class=\"CM\"");
Frm_StartForm (ActChgRooTyp);
Roo_PutParamRooCod (Room->RooCod);
HTM_INPUT_TEXT ("ShortName",Roo_MAX_CHARS_SHRT_NAME,Room->ShrtName,true,
"size=\"10\" class=\"INPUT_SHORT_NAME\"");
Roo_PutSelectorType (Room->Type,
true); // Submit on change
Frm_EndForm ();
HTM_TD_End ();
@ -653,7 +742,7 @@ static void Roo_ListRoomsForEdition (const struct Bld_Buildings *Buildings,
}
/*****************************************************************************/
/**************************** Put building selector **************************/
/********** Put selector of the building to which the room belongs ***********/
/*****************************************************************************/
static void Roo_PutSelectorBuilding (long BldCod,
@ -683,13 +772,39 @@ static void Roo_PutSelectorBuilding (long BldCod,
NumBld < Buildings->Num;
NumBld++)
HTM_OPTION (HTM_Type_LONG,&Buildings->Lst[NumBld].BldCod,
Buildings->Lst[NumBld].BldCod == BldCod,false,
BldCod == Buildings->Lst[NumBld].BldCod,false,
"%s",Buildings->Lst[NumBld].ShrtName);
/***** End selector *****/
HTM_SELECT_End ();
}
/*****************************************************************************/
/************************ Put selector of room type **************************/
/*****************************************************************************/
static void Roo_PutSelectorType (Roo_RoomType_t RoomType,
bool SubmitOnChange)
{
extern const char *Txt_ROOM_TYPES[Roo_NUM_TYPES];
Roo_RoomType_t Type;
/***** Begin selector *****/
HTM_SELECT_Begin (SubmitOnChange,
"name=\"Type\" class=\"ROOM_TYPE_SEL\"");
/***** Options for types *****/
for (Type = (Roo_RoomType_t) 0;
Type <= (Roo_RoomType_t) (Roo_NUM_TYPES - 1);
Type++)
HTM_OPTION (HTM_Type_UNSIGNED,&Type,
Type == RoomType,false,
"%s",Txt_ROOM_TYPES[Type]);
/***** End selector *****/
HTM_SELECT_End ();
}
/*****************************************************************************/
/********************* Write parameter with code of room *********************/
/*****************************************************************************/
@ -715,10 +830,27 @@ long Roo_GetParamRooCod (void)
static int Roo_GetParamFloor (void)
{
/***** Get code of room *****/
/***** Get floor *****/
return (int) Par_GetParToLong ("Floor");
}
/*****************************************************************************/
/************************** Get parameter with type **************************/
/*****************************************************************************/
static Roo_RoomType_t Roo_GetParamType (void)
{
long TypeLong;
/***** Get type string *****/
TypeLong = Par_GetParToLong ("Type");
if (TypeLong >= 0 && TypeLong < Roo_NUM_TYPES)
return (Roo_RoomType_t) TypeLong; // Correc type
/***** Default type when no type or wrong type *****/
return Roo_NO_TYPE;
}
/*****************************************************************************/
/******************************** Remove a room ******************************/
/*****************************************************************************/
@ -791,11 +923,10 @@ void Roo_ChangeBuilding (void)
/***** Get data of the room from database *****/
Roo_GetDataOfRoomByCod (Roo_EditingRoom);
/***** Check if the old capacity equals the new one
/***** Check if the old building equals the new one
(this happens when return is pressed without changes) *****/
if (NewBldCod < 0)
NewBldCod = -1L;
if (NewBldCod == Roo_EditingRoom->BldCod)
/***** Message to show no changes made *****/
Ale_CreateAlert (Ale_INFO,NULL,
@ -803,8 +934,8 @@ void Roo_ChangeBuilding (void)
Roo_EditingRoom->FullName);
else
{
/***** Update the table of rooms changing the old building to the new *****/
DB_QueryUPDATE ("can not update the capacity of a room",
/***** Update the table of rooms changing the old building for the new one *****/
DB_QueryUPDATE ("can not update the building of a room",
"UPDATE rooms SET BldCod=%ld WHERE RooCod=%ld",
NewBldCod,Roo_EditingRoom->RooCod);
@ -819,7 +950,7 @@ void Roo_ChangeBuilding (void)
}
/*****************************************************************************/
/********************* Change sitting capacity of a room *********************/
/************************ Change the floor of a room *************************/
/*****************************************************************************/
void Roo_ChangeFloor (void)
@ -842,7 +973,7 @@ void Roo_ChangeFloor (void)
/***** Get data of the room from database *****/
Roo_GetDataOfRoomByCod (Roo_EditingRoom);
/***** Check if the old capacity equals the new one
/***** Check if the old floor equals the new one
(this happens when return is pressed without changes) *****/
if (NewFloor == Roo_EditingRoom->Floor)
/***** Message to show no changes made *****/
@ -851,7 +982,7 @@ void Roo_ChangeFloor (void)
Roo_EditingRoom->FullName);
else
{
/***** Update the table of rooms changing the old capacity to the new *****/
/***** Update the table of rooms changing the old floor for the new one *****/
DB_QueryUPDATE ("can not update the capacity of a room",
"UPDATE rooms SET Floor=%d WHERE RooCod=%ld",
NewFloor,Roo_EditingRoom->RooCod);
@ -866,6 +997,58 @@ void Roo_ChangeFloor (void)
}
}
/*****************************************************************************/
/************************* Change the type of a room *************************/
/*****************************************************************************/
void Roo_ChangeType (void)
{
extern const char *Txt_The_type_of_room_X_has_not_changed;
extern const char *Txt_The_type_of_room_X_is_now_Y;
extern const char *Txt_ROOM_TYPES[Roo_NUM_TYPES];
Roo_RoomType_t NewType;
/***** Room constructor *****/
Roo_EditingRoomConstructor ();
/***** Get parameters from form *****/
/* Get the code of the room */
if ((Roo_EditingRoom->RooCod = Roo_GetParamRooCod ()) == -1L)
Lay_ShowErrorAndExit ("Code of room is missing.");
/* Get the type of the room */
NewType = Roo_GetParamType ();
/***** Get data of the room from database *****/
Roo_GetDataOfRoomByCod (Roo_EditingRoom);
/***** Check if the old type equals the new one
(this happens when return is pressed without changes) *****/
if ((unsigned) NewType >= Roo_NUM_TYPES)
NewType = Roo_NO_TYPE;
if (NewType == Roo_EditingRoom->Type)
/***** Message to show no changes made *****/
Ale_CreateAlert (Ale_INFO,NULL,
Txt_The_type_of_room_X_has_not_changed,
Roo_EditingRoom->FullName);
else
{
/***** Update the table of rooms changing the old type for the new one *****/
DB_QueryUPDATE ("can not update the type of a room",
"UPDATE rooms SET Type='%s' WHERE RooCod=%ld",
Roo_TypesDB[NewType],
Roo_EditingRoom->RooCod);
/***** Get updated data of the room from database *****/
Roo_GetDataOfRoomByCod (Roo_EditingRoom);
/***** Message to show the change made *****/
Ale_CreateAlert (Ale_SUCCESS,NULL,
Txt_The_type_of_room_X_is_now_Y,
Roo_EditingRoom->FullName,Txt_ROOM_TYPES[Roo_EditingRoom->Type]);
}
}
/*****************************************************************************/
/********************** Change the short name of a room **********************/
/*****************************************************************************/
@ -1036,7 +1219,7 @@ void Roo_ChangeCapacity (void)
Roo_EditingRoom->FullName);
else
{
/***** Update the table of rooms changing the old capacity to the new *****/
/***** Update the table of rooms changing the old capacity for the new one *****/
DB_QueryUPDATE ("can not update the capacity of a room",
"UPDATE rooms SET Capacity=%u WHERE RooCod=%ld",
NewCapacity,Roo_EditingRoom->RooCod);
@ -1129,8 +1312,8 @@ static void Roo_PutFormToCreateRoom (const struct Bld_Buildings *Buildings)
/***** Room type *****/
HTM_TD_Begin ("class=\"LM\"");
HTM_INPUT_TEXT ("ShortName",Roo_MAX_CHARS_SHRT_NAME,Roo_EditingRoom->ShrtName,false,
"size=\"10\" class=\"INPUT_SHORT_NAME\" required=\"required\"");
Roo_PutSelectorType (Roo_EditingRoom->Type,
false); // Don't submit on change
HTM_TD_End ();
/***** Room short name *****/
@ -1251,17 +1434,22 @@ void Roo_RecFormNewRoom (void)
/**************************** Create a new room ******************************/
/*****************************************************************************/
static void Roo_CreateRoom (const struct Roo_Room *Room)
static void Roo_CreateRoom (struct Roo_Room *Room)
{
/***** Correct wrong room type *****/
if ((unsigned) Room->Type >= Roo_NUM_TYPES)
Room->Type = Roo_NO_TYPE;
/***** Create a new room *****/
DB_QueryINSERT ("can not create room",
"INSERT INTO rooms"
" (CtrCod,BldCod,Floor,ShortName,FullName,Capacity)"
" (CtrCod,BldCod,Floor,Type,ShortName,FullName,Capacity)"
" VALUES"
" (%ld,%ld,%d,'%s','%s',%u)",
" (%ld,%ld,%d,'%s','%s','%s',%u)",
Gbl.Hierarchy.Ctr.CtrCod,
Room->BldCod,
Room->Floor,
Roo_TypesDB[Room->Type],
Room->ShrtName,
Room->FullName,
Room->Capacity);

View File

@ -44,32 +44,34 @@
#define Roo_UNLIMITED_CAPACITY INT_MAX // This number can be stored in database as an integer...
// ...and means that a room has no limited capacity
#define Roo_NUM_TYPES 25
typedef enum
{
Roo_ADMINISTRATION = 0, // "user-tie.svg" // "Administración"
Roo_AUDITORIUM = 1, // "landmark.svg" "university.svg" "theater-masks.svg" // "Auditorio"
Roo_CAFETERIA = 2, // "coffee.svg" "mug-hot.svg" // "Cafetería"
Roo_CANTEEN = 3, // "utensils.svg" // "Comedor"
Roo_CLASSROOM = 4, // "chalkboard-teacher.svg" "chalkboard.svg" // "Aula"
Roo_CONCIERGE = 5, // "concierge-bell" "user-cog.svg" "house-user.svg" // "Conserjería/Portería"
Roo_CORRIDOR = 6, // "walking.svg" "map-signs.svg" "door-open.svg" // "Pasillo"
Roo_GYM = 7, // "dumbbell.svg" // "Gimnasio"
Roo_HALL = 8, // "map-signs.svg" "archway.svg" "hotel.svg" "concierge-bell.svg" "door-open.svg" "street-view.svg" // "Vestíbulo"
Roo_KINDERGARTEN = 9, // "child.svg" "baby.svg" "baby-carriage.svg" // "Guardería"
Roo_LABORATORY = 10, // "flask.svg" "microscope.svg" // "Laboratorio"
Roo_LIBRARY = 11, // "book.svg" "book-reader.svg" // "Biblioteca"
Roo_OFFICE = 12, // "house-user.svg" "door-open.svg" // "Oficina/Despacho"
Roo_OUTDOORS = 13, // "cloud-sun.svg" // "Exteriores"
Roo_PARKING = 14, // "car.svg" // "Parking"
Roo_PAVILION = 15, // "volleyball-ball.svg" "running.svg" // "Pabellón"
Roo_ROOM = 16, // // "Sala"
Roo_SECRETARIAT = 17, // "stamp.svg" "pen-alt.svg" "file-alt.svg" "user-tie.svg" // "Secretaría"
Roo_SEMINAR = 18, // "chalkboard-teacher.svg" "chalkboard.svg" // "Seminario"
Roo_SHOP = 19, // "shopping-cart.svg" "shopping-basket.svg" "store-alt.svg" shopping-bag // "Tienda"
Roo_STORE = 20, // "daily.svg" "boxes.svg" "box-open.svg" "box.svg" // "Almacén"
Roo_TOILETS = 21, // "toilet.svg" // "Aseos"
Roo_VIRTUAL = 22, // "laptop-house.svg" "cloud.svg" // "Virtual"
Roo_YARD = 23, // "canadian-mapple-leaf.svg" // "Patio/Jardín"
Roo_NO_TYPE = 0, // // "Sin tipo"
Roo_ADMINISTRATION = 1, // "user-tie.svg" // "Administración"
Roo_AUDITORIUM = 2, // "landmark.svg" "university.svg" "theater-masks.svg" // "Auditorio"
Roo_CAFETERIA = 3, // "coffee.svg" "mug-hot.svg" // "Cafetería"
Roo_CANTEEN = 4, // "utensils.svg" // "Comedor"
Roo_CLASSROOM = 5, // "chalkboard-teacher.svg" "chalkboard.svg" // "Aula"
Roo_CONCIERGE = 6, // "concierge-bell" "user-cog.svg" "house-user.svg" // "Conserjería/Portería"
Roo_CORRIDOR = 7, // "walking.svg" "map-signs.svg" "door-open.svg" // "Pasillo"
Roo_GYM = 8, // "dumbbell.svg" // "Gimnasio"
Roo_HALL = 9, // "map-signs.svg" "archway.svg" "hotel.svg" "concierge-bell.svg" "door-open.svg" "street-view.svg" // "Vestíbulo"
Roo_KINDERGARTEN = 10, // "child.svg" "baby.svg" "baby-carriage.svg" // "Guardería"
Roo_LABORATORY = 11, // "flask.svg" "microscope.svg" // "Laboratorio"
Roo_LIBRARY = 12, // "book.svg" "book-reader.svg" // "Biblioteca"
Roo_OFFICE = 13, // "house-user.svg" "door-open.svg" // "Despacho/Oficina"
Roo_OUTDOORS = 14, // "cloud-sun.svg" // "Exteriores"
Roo_PARKING = 15, // "car.svg" // "Aparcamiento"
Roo_PAVILION = 16, // "volleyball-ball.svg" "running.svg" // "Pabellón"
Roo_ROOM = 17, // "chalkboard.svg" // "Sala"
Roo_SECRETARIAT = 18, // "stamp.svg" "pen-alt.svg" "file-alt.svg" "user-tie.svg" // "Secretaría"
Roo_SEMINAR = 19, // "chalkboard-teacher.svg" "chalkboard.svg" // "Seminario"
Roo_SHOP = 20, // "shopping-cart.svg" "shopping-basket.svg" "store-alt.svg" "shopping-bag.svg" // "Tienda"
Roo_STORE = 21, // "daily.svg" "boxes.svg" "box-open.svg" "box.svg" // "Almacén"
Roo_TOILETS = 22, // "toilet.svg" // "Aseos"
Roo_VIRTUAL = 23, // "laptop-house.svg" "cloud.svg" // "Virtual"
Roo_YARD = 24, // "canadian-mapple-leaf.svg" // "Patio/Jardín"
} Roo_RoomType_t;
struct Roo_Room
@ -79,6 +81,7 @@ struct Roo_Room
long BldCod; // Building code
char BldShrtName[Bld_MAX_BYTES_SHRT_NAME + 1]; // Building short name
int Floor; // Room floor
Roo_RoomType_t Type; // Room type
char ShrtName[Roo_MAX_BYTES_SHRT_NAME + 1]; // Room short name
char FullName[Roo_MAX_BYTES_FULL_NAME + 1]; // Room full name
unsigned Capacity; // Room seating capacity
@ -132,6 +135,7 @@ void Roo_RemoveRoom (void);
void Roo_RemoveAllRoomsInCtr (long CtrCod);
void Roo_ChangeBuilding (void);
void Roo_ChangeFloor (void);
void Roo_ChangeType (void);
void Roo_RenameRoomShort (void);
void Roo_RenameRoomFull (void);
void Roo_ChangeCapacity (void);

View File

@ -287,7 +287,7 @@ void Syl_EditSyllabus (void)
Syl_ResetSyllabus (&Syllabus);
/***** Edit syllabus *****/
(void) Syl_CheckAndEditSyllabus (&Syllabus);
Syl_CheckAndEditSyllabus (&Syllabus);
}
/*****************************************************************************/

View File

@ -38417,6 +38417,534 @@ const char *Txt_ROOMS_ORDER[Roo_NUM_ORDERS] =
#endif
};
const char *Txt_ROOM_TYPES[Roo_NUM_TYPES] =
{
[Roo_NO_TYPE] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"No type"
#elif L==4 // es
"Sin tipo"
#elif L==5 // fr
""
#elif L==6 // gn
"Sin tipo" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_ADMINISTRATION] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Administration"
#elif L==4 // es
"Administraci&oacute;n"
#elif L==5 // fr
""
#elif L==6 // gn
"Administraci&oacute;n" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_AUDITORIUM] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Auditorium"
#elif L==4 // es
"Auditorio"
#elif L==5 // fr
""
#elif L==6 // gn
"Auditorio" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_CAFETERIA] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Cafeteria"
#elif L==4 // es
"Cafeter&iacute;a"
#elif L==5 // fr
""
#elif L==6 // gn
"Cafeter&iacute;a" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_CANTEEN] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Canteen"
#elif L==4 // es
"Comedor"
#elif L==5 // fr
""
#elif L==6 // gn
"Comedor" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_CLASSROOM] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Classroom"
#elif L==4 // es
"Aula"
#elif L==5 // fr
""
#elif L==6 // gn
"Aula" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_CONCIERGE] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Concierge"
#elif L==4 // es
"Conserjer&iacute;a/Porter&iacute;a"
#elif L==5 // fr
""
#elif L==6 // gn
"Conserjer&iacute;a/Porter&iacute;a" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_CORRIDOR] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Corridor"
#elif L==4 // es
"Pasillo"
#elif L==5 // fr
""
#elif L==6 // gn
"Pasillo" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_GYM] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Gym"
#elif L==4 // es
"Gimnasio"
#elif L==5 // fr
""
#elif L==6 // gn
"Gimnasio" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_HALL] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Hall"
#elif L==4 // es
"Vest&iacute;bulo"
#elif L==5 // fr
""
#elif L==6 // gn
"Vest&iacute;bulo" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_KINDERGARTEN] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Kindergarten"
#elif L==4 // es
"Guarder&iacute;a"
#elif L==5 // fr
""
#elif L==6 // gn
"Guarder&iacute;a" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_LABORATORY] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Laboratory"
#elif L==4 // es
"Laboratorio"
#elif L==5 // fr
""
#elif L==6 // gn
"Laboratorio" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_LIBRARY] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Library"
#elif L==4 // es
"Biblioteca"
#elif L==5 // fr
""
#elif L==6 // gn
"Biblioteca" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_OFFICE] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Office"
#elif L==4 // es
"Despacho/Oficina"
#elif L==5 // fr
""
#elif L==6 // gn
"Despacho/Oficina" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_OUTDOORS] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Outdoors"
#elif L==4 // es
"Exteriores"
#elif L==5 // fr
""
#elif L==6 // gn
"Exteriores" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_PARKING] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Parking"
#elif L==4 // es
"Aparcamiento"
#elif L==5 // fr
""
#elif L==6 // gn
"Aparcamiento" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_PAVILION] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Pavilion"
#elif L==4 // es
"Pabellón"
#elif L==5 // fr
""
#elif L==6 // gn
"Pabellón" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_ROOM] =
#if L==1 // ca
"Sala"
#elif L==2 // de
"Raum"
#elif L==3 // en
"Room"
#elif L==4 // es
"Sala"
#elif L==5 // fr
"Salle"
#elif L==6 // gn
"Mbo'ehakoty"
#elif L==7 // it
"Aula"
#elif L==8 // pl
"Klasa"
#elif L==9 // pt
"Sala"
#endif
,
[Roo_SECRETARIAT] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Secretariat"
#elif L==4 // es
"Secretar&iacute;a"
#elif L==5 // fr
""
#elif L==6 // gn
"Secretar&iacute;a" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_SEMINAR] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Seminar"
#elif L==4 // es
"Seminario"
#elif L==5 // fr
""
#elif L==6 // gn
"Seminario" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_SHOP] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Shop"
#elif L==4 // es
"Tienda"
#elif L==5 // fr
""
#elif L==6 // gn
"Tienda" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_STORE] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Store"
#elif L==4 // es
"Almac&eacute;n"
#elif L==5 // fr
""
#elif L==6 // gn
"Almac&eacute;n" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_TOILETS] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Toilets"
#elif L==4 // es
"Aseos"
#elif L==5 // fr
""
#elif L==6 // gn
"Aseos" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_VIRTUAL] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Virtual"
#elif L==4 // es
"Virtual"
#elif L==5 // fr
""
#elif L==6 // gn
"Virtual" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
,
[Roo_YARD] =
#if L==1 // ca
""
#elif L==2 // de
""
#elif L==3 // en
"Yard"
#elif L==4 // es
"Patio/Jard&iacute;n"
#elif L==5 // fr
""
#elif L==6 // gn
"Patio/Jard&iacute;n" // Okoteve traducción
#elif L==7 // it
""
#elif L==8 // pl
""
#elif L==9 // pt
""
#endif
};
const char *Txt_Rooms =
#if L==1 // ca
"Sales";
@ -48974,6 +49502,48 @@ const char *Txt_The_type_of_enrolment_of_the_type_of_group_X_has_not_changed = /
"O tipo de inscri&ccedil;&atilde;o do tipo de grupo <strong>%s</strong> n&atilde;o foi alterado.";
#endif
const char *Txt_The_type_of_room_X_has_not_changed = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"El tipus de la sala <strong>%s</strong> no ha canviat.";
#elif L==2 // de
"Der Art des Raum <strong>%s</strong> hat sich nicht ge&auml;ndert.";
#elif L==3 // en
"The type of room <strong>%s</strong> has not changed.";
#elif L==4 // es
"El tipo de la sala <strong>%s</strong> no ha cambiado.";
#elif L==5 // fr
"Le type de la salle <strong>%s</strong> n'a pas chang&eacute;.";
#elif L==6 // gn
"El tipo de la sala <strong>%s</strong> no ha cambiado."; // Okoteve traducción
#elif L==7 // it
"Il tipo della aula <strong>%s</strong> non &egrave; cambiata.";
#elif L==8 // pl
"Typ klasy <strong>%s</strong> nie uleg&lstrok;a zmianie.";
#elif L==9 // pt
"O tipo da sala <strong>%s</strong> n&atilde;o mudou.";
#endif
const char *Txt_The_type_of_room_X_is_now_Y = // Warning: it is very important to include two %s in the following sentences
#if L==1 // ca
"El tipus de la sala <strong>%s</strong> ara &eacute;s <strong>%s</strong>.";
#elif L==2 // de
"Der Art des Raum <strong>%s</strong> betr&auml;gt jetzt <strong>%s</strong>.";
#elif L==3 // en
"The type of room <strong>%s</strong> is now <strong>%s</strong>.";
#elif L==4 // es
"El tipo de la sala <strong>%s</strong> ahora es <strong>%s</strong>.";
#elif L==5 // fr
"Le type de la salle <strong>%s</strong> est maintenant de <strong>%s</strong>.";
#elif L==6 // gn
"El tipo de la sala <strong>%s</strong> ahora es <strong>%s</strong>."; // Okoteve traducción
#elif L==7 // it
"Il tipo della aula <strong>%s</strong> &egrave; ora <strong>%s</strong>.";
#elif L==8 // pl
"Typ klasy <strong>%s</strong> wynosi teraz <strong>%s</strong>.";
#elif L==9 // pt
"O tipo da sala <strong>%s</strong> &eacute; agora <strong>%s</strong>.";
#endif
const char *Txt_The_type_of_the_holiday_X_has_changed = // Warning: it is very important to include %s in the following sentences
#if L==1 // ca
"El tipo de la festividad <strong>%s</strong> ha cambiado."; // Necessita traduccio