module mdlBourse{

	// Types génériques, l'implémentation est à la discrétion du programmeur.
	typedef Object Date; // Un objet représentant une date.
	typedef sequence<Date> Planning; // Un objet représentant une série de dates.
	typedef Object Heure; // Un objet représentant une heure.
	typedef sequence<Heure> Horaire; // Un objet représenant un horaire de périodes.
	typedef Object Courtier; // Un objet représentant un courtier.
	typedef sequence<Courtier> ListeCourtier; // Un objet représentant une liste de courtiers.
	struct Solde {Courtier Broker; long Sum;}; // Un objet représentant un solde, i.e. un Courtier et un montant positif s'il doit être versé, négatif s'il est attendu.
	typedef sequence<Solde> ListeSolde; // Un objet représentant une liste de soldes.
	typedef Object MarketSheet; // Un objet représentant la feuille de marché.
	typedef Object Cours; // Un objet représentant le cours d'une action.
	typedef Object Transaction; // Un objet représentant une transaction.
	typedef sequence<Transaction> ListeTransaction; // Un object représentant une liste de transactions.
	typedef Object Ordre; // Un objet représentant un ordre.
	typedef sequence<Ordre> ListeOrdre; // Un objet représentant une liste d'ordres.
	typedef sequence<String> Journal; // Un objet représentant un journal d'activité.

	// Composant Courtier
	module Courtier{
		
		// Composant Paramètres
		module BrokerSetting{
		
		}
		
		// Composant Données client{
		
		}
	}
	
	// Composant Contrôleur
	module Controleur{
	
	}
	
	// Composant Système
	module Systeme{
		
		// Interface Signaler liquidation effectuée
		interface WarnSystem{
			
			// REQUIRES : numLiquidation est le numéro d'une liquidation en attente de paiement enregistrée auprès du système.
			// EFFECTS : passe la liquidation comme effectuée.
			void warnLiquidationDone(in unsigned long numLiquidation);
			
		}
		
		// Composant Paramètres
		module Parametres{
		
			// Interface Consulter Paramètres
			interface CheckSettings{
			
				// EFFECTS : Renvoie True si le système est en cours d'exécution, False s'il est arrêté.
				boolean isSystemActive();
				
				// EFFECTS : Renvoie les jours de fermeture de la bourse.
				Planning getClosingDates(); 
				
				// EFFECTS : Renvoie les intervalles d'heure des périodes. Chaque période compte un intervalle composé d'une heure de début
				// et d'une heure de fin, différentes d'au moins 5 minutes.
				Horaire getHoraire();
			}
			
			// Interface Modifier Paramètres
			interface ModifySettings{
				
				// REQUIRES : Le système est actif.
				// EFFECTS : Arrête le système.
				void stopSystem();
				
				// REQUIRES : Le système est arrêté.
				// EFFECTS : Relance le système.
				void rebootSystem();
				
				// EFFECTS : Change les horaires des périodes avec le nouvel horaire newHours.
				void setHoraire(in Horaire newHours);
				
				// REQUIRES : newDay n'est pas présent dans les jours de fermeture.
				// EFFECTS : Ajoute un jour de fermeture, newDay.
				void addClosingDay(in Date newDay);
				
				// REQUIRES : obsDay est présent dans les jours de fermeture.
				// EFFECTS : Enlève un jour de fermeture, obsDay.
				void removeClosingDay(in Date obsDay);
			}
			
		}
		
		// Composant Service Identification
		module LoginService{
			
			// Interface S'identifier
			interface Login{
				
				// EFFECTS : Renvoie True si une session courtier a été ouverte, c'est-à-dire si un compte courtier dont le nom d'utilisateur 
				// est Username et le mot de passe est Password existe.
				boolean BrokerLogin(in String Username, in String Password);
				
				// EFFECTS : Renvoie True si une session administrateur a été ouverte, c'est-à-dire si un compte administrateur dont le 
				// nom d'utilisateur est Username et le mot de passe est Password existe.
				boolean AdminLogin(in String Username, in String Password);
				
			}
		}
		
		// Composant Base de données
		module Database{
			
			// Composant Données utilisateurs
			module UserData{
				
				// Interface Consulter Données
				interface CheckUserData{
					
					// REQUIRES : Courtier est un courtier enregistré auprès du système.
					// EFFECTS : Renvoie True si le courtier Courtier est bloqué, False sinon.
					boolean isBrokerBlocked(in String Courtier);
					
					// EFFECTS : Renvoie la liste des courtiers enregistrés auprès du système.
					ListeCourtier getBrokerList();
					
					// EFFECTS : Renvoie la liste des soldes du courtier Broker, c'est-à-dire la liste des courtiers à qui il doit de l'argent
					// ou qui lui doivent de l'argent, accompagnée des montants.
					ListeSolde getSalesList(in Courtier Broker);
					
				}
				
				// Interface Modifier Données
				interface ModifyUserData{
					
					// REQUIRES : Courtier n'est pas un courtier bloqué.
					// EFFECTS : Bloque le courtier Courtier.
					void blockBroker(in String Courtier);
					
					// REQUIRES : Courtier est un courtier bloqué.
					// EFFECTS : débloque le courtier Courtier.
					void unblockBroker(in String Courtier);
					
				}
			}
			
			// Composant Données marché
			module MarketData{
				
				// Interface Consulter Données
				interface CheckMarketData{
					
					// EFFECTS : Renvoie la feuille de marché de la société dont le numéro de TVA est numCorp.
					MarketSheet getMarketSheet(in unsigned long numCorp);
					
					// REQUIRES : numCorp est le numéro de TVA d'une société enregistrée auprès du système.
					// EFFECTS : Renvoie True si la société de numéro numCorp est bloquée, False sinon.
					boolean isCorpBlocked(in unsigned long numCorp);
					
					// REQUIRES : numCorp est le numéro de TVA d'une société enregistrée auprès du système.
					// EFFECTS : Renvoie le cours de l'action de la société de numéro numCorp, entre la date présente et la date fromDay.
					Cours getCours(in unsigned long numCorp, in Date fromDay);
					
					// REQUIRES : numTitre est le numéro d'un titre enregistré auprès du système.
					// EFFECTS : Renvoie toutes les transactions dont le titre numTitre a fait l'objet.
					ListeTransaction getTitreTrace(in unsigned long numTitre);
					
					// REQUIRES : Courtier est un courtier enregistré auprès du système.
					// EFFECTS : Renvoie la liste des ordres passés par le courtier Courtier.
					ListeOrdre getOrders(in String Courtier);
					
					// REQUIRES : numCorp est le numéro de TVA d'une société enregistrée auprès du système.
					// EFFECTS : Renvoie les 5 meilleures transactions pour un vendeur de l'action de la société identifiée par numCorp.
					ListeTransaction getTopFiveSell(in unsigned long numCorp);
					
					// REQUIRES : numCorp est le numéro de TVA d'une société enregistrée auprès du système.
					// EFFECTS : Renvoie les 5 meilleures transactions pour un acheteur de l'action de la société identifiée par numCorp.
					ListeTransaction getTopFiveBuy(in unsigned long numCorp);
					
				}
				
				// Interface Modifier Données
				interface ModifyMarketData{
					
					// REQUIRES : numCorp est le numéro de TVA d'une société enregistrée auprès du système ; numCorp n'est pas suspendue.
					// EFFECTS : Suspend le cours de la société numCorp.
					blockCours(in unsigned long numCorp);
					
					// REQUIRES : numCorp est le numéro de TVA d'une société enregistrée auprès du système ; numCorp est suspendue.
					// EFFECTS : Relance le cours de la société numCorp.
					unblockCours(in unsigned long numCorp);
					
				}
				
				// Interface Emettre Ordre
				interface OrderSubmission{
					
					// EFFECTS : enregistre l'ordre toReg auprès du marché.
					registerOrder(in Ordre toReg);
					
				}
			}
		}
		
		// Composants Informations système
		module SystemData{
				
			// Interface Consulter informations
			interface checkSystemData{
					
				// EFFECTS : Renvoie les informations du fichier journal pour le jour Day.
				Journal getJournal(in Date Day);
					
			}
		}
	}
