Valion Consulting AG Implementing Better Solutions Monbijoustrasse 20 CH-3011 Bern +41 (0)31 328 10 10 www.valionconsulting.ch
i
ii
iii
1
2
3
4
5
6
7
8
Presentation Reporting Business 9
Presentation Business Reporting DataAccess Reporting Business Presentation 10
Presentation Business Presentation Business Core Presentation Dispatcher 11
12
13
14
15
16
17
IDo /// <summary> /// Schnittstelle um die bearbeitbaren Objekte /// dynamisch zu verändern. /// </summary> public interface IDo { decimal Id { get; set; } /// <summary> /// Erstellt ein neues Objekt in der Datenbank. /// </summary> /// <param name="dataaccess">dal-anbindung</param> /// <returns>die Unique-Id des Objekts.</returns> decimal Create(IDataAccess dataaccess); /// <summary> /// Aktualisiert das Objekt in der Datenbank. /// </summary> /// <param name="dataaccess">dal-anbindung</param> void Update(IDataAccess dataaccess); } /// <summary> /// Löscht das Objekt aus der Datenbank. /// </summary> /// <param name="dataaccess">dal-anbindung</param> void Delete(IDataAccess dataaccess); 18
/// <summary> /// Speichert die Daten in der Datenbank. /// Übergibt das geänderte Objekt anhand der entsprechenden /// Operation an den Proxy zur Ausführung. /// </summary> /// <param name="proxy">kommunikationsschnittstellenobjekt</param> /// <param name="loginname">login-name des Mitarbeiters</param> public void Save(IPresentation proxy, string loginname) { // Für jedes Objekt die Aktion auf der WCF-Schnittstelle auslösen foreach (KeyValuePair<IDo, SaveCommand> kvp in _objectlist) { // kvp.value = Command switch (kvp.value) { case SaveCommand.Add: // kvp.key = Objekt welches IDo implementiert kvp.key.id = proxy.createobject(kvp.key, loginname); break; 19
IDo 20
[OperationContract] [FaultContract(typeof(WrongInputDataException))] AbsenceCalendar GetAbsenceCalendar(decimal employeeid); OperationContract: FaultContract: [DataContract] public class ProjectPlanEntry : PlanEntry, IDisposable, IDo DataContract [ServiceKnownType(typeof(WeekPlanEntry))] decimal CreateObject(IDo obj, string loginname); ServiceKnownType: OperationContract ServiceKnownType 21
try { // Alle Feiertage des aktuellen Jahres anzeigen HolidayCalendar holidays = _proxy.getholidaycalendarfromyear(_year); ShowAllHolidaysDialog showallholidays = new ShowAllHolidaysDialog(holidays, _year); showallholidays.showdialog(); } catch (FaultException<WrongInputDataException> ex) { Trace.TraceError(ex.Message); MessageBox.Show(ex.Message, "NewMandatis", MessageBoxButton.OK, MessageBoxImage.Error); } <!-- WCF Konfiguration --> <system.servicemodel> <bindings> <basichttpbinding> <!-- Über die Binding-Parameter stellt man die zulässige Menge der Daten bei einem Call ein --> <binding name="mywcfbinding" maxbuffersize="512000" maxreceivedmessagesize="512000"> <readerquotas maxdepth="32" maxstringcontentlength="512000" maxarraylength="16384" maxbytesperread="4096" maxnametablecharcount="16384"/> </binding> </basichttpbinding> </bindings> 22
<services> <service name="ch.vc.newmandatis.backend.businesslayer.dispatcher.dispatcher"> <!-- Service Endpunkt - wo und wie der Service erreichbar ist --> <endpoint address="http://localhost:1550" binding="basichttpbinding" bindingconfiguration="mywcfbinding" contract="ch.vc.newmandatis.contract.servicecontract.ipresentation"> </endpoint> </service> </services> </system.servicemodel> UserControls 23
UserControl UserControl UserControl UserControl IPlugin UserControl IPlugin /// <summary> /// Initialisiert das UserControl /// </summary> /// <param name="proxy">proxy für die Kommunikation</param> /// <param name="user">der aktuell eingeloggte Benutzer</param> void Init(IPresentation proxy, InternalEmployee user); /// <summary> /// Gibt das Panel-Item für den Navigationsbereich zurück. /// </summary> /// <returns>das PanelItem.</returns> PaneItem GetPaneItem(); /// <summary> /// Gibt den RibbonTab für das Ribbon-Menü zurück. /// </summary> /// <returns>das Ribbon-Tab.</returns> RibbonTab GetRibbonTab(); IPresentation IPresentation _proxy = ChannelFactory<IPresentation>.CreateChannel(baseHttpBind,_endpointAddress); _proxy.checkconnection(); CheckConnection(): IPresentation 24
25
/// <summary> /// Löscht das übergebene Objekt aus der Datenbank. /// </summary> /// <param name="obj">ein Objekt, welches die IDo-Schnittstelle /// implementiert</param> /// <param name="loginname">login-name des Benuttzers</param> /// <exception cref="exceptions.wronginputdataexception">falsche /// Eingabedaten</exception> public void DeleteObject(IDo obj, string loginname) { _core.deleteobject(obj, loginname); } /// <summary> /// Gibt alle offenen resp. in Bearbeitung stehenden Projekte zurück. /// </summary> /// <returns>liste von Projekten</returns> public IList<Project> GetOpenProjects() { /// Holt alle offenen Projekte vom DAL IList<Project> projects = _dataaccess.getopenprojects(); // und dem Kern hinzufügen PutProjectsInList(projects); // Projekte zurückgeben return projects; } IPresentation 26
IDataAccess /// <summary> /// Schnittstelle für den Zugriff auf den Data Access Layer /// </summary> public interface IDataAccess { /// <summary> /// Gibt für das entsprechende Projekt alle zugeordneten /// Projektmitglieder zurück. /// </summary> /// <param name="projectid">die ProjektID</param> /// <returns>liste von Employee</returns> IList<Employee> GetProjectMember(decimal projectid); 27
28
/// <summary> /// Gibt den Eintrag für den entsprechenden Mitarbeiter zurück. /// </summary> /// <param name="employeeid"></param> /// <returns>employee Tabelle</returns> /// <exception cref="argumentexception">wenn ein Datenbankfehler auftritt.</exception> public DSNewMandatis.EmployeeDataTable GetEmployee(decimal employeeid) { try { return Adapter.GetDataByEmployeeId(employeeId); } catch (InvalidOperationException ex) { Trace.TraceError(string.Format("{0} - Error: {1}", "GetEmployee", ex.message)); throw new ArgumentException(ex.Message, ex); } } /// <summary> /// Mappe die Daten der übergebenen Employee Tabellen-Row in ein /// Emplyoee Business-Model Objekt. /// </summary> /// <param name="employeerow">der Record aus der Employee Tabelle</param> /// <returns>den Mitarbeiter</returns> public Employee GetEmployeeData(DSNewMandatis.EmployeeRow employeerow) { EmployeeCapacityMapping employeecapacitymapping = new EmployeeCapacityMapping(); // Überprüfe, ob es sich um einen externen Mitarbeiter handelt. if (employeerow.isexternpartnerflag == 1) // 1 == true { ExternalEmployee employee = new ExternalEmployee(employeeRow.Employee_ID); try { employee.employeesince = employeerow.datefrom; 29
30
31
32
[TestFixture] public class UtilTest { [Test] public void GetCalendarWeekTest() { //Letztes Datum in der KW int cw = Util.GetCalendarWeek(new DateTime(2009, 8, 2)); Assert.AreEqual(31, cw); [TextFixture]: [Test]: Assert: [SetUp]: [TestFixtureSetUp]: [TearDown]: [TestFixtureTearDown]: 33
34
35
36
37
38
39
40
41
A
Order # Test Name Status 1 UnitTest.Backend.DataAdapterTest.CreatePlannedAbsenceTest SUCCESS 2 UnitTest.Backend.DataAdapterTest.CreateProjectPlanEntry SUCCESS 3 UnitTest.Backend.DataAdapterTest.CreatePublicHolidayTest SUCCESS 4 UnitTest.Backend.DataAdapterTest.CreateShortTimePlanEntry SUCCESS 5 UnitTest.Backend.DataAdapterTest.CreateWeekPlanEntryTest SUCCESS 6 UnitTest.Backend.DataAdapterTest.DeletePlannedAbsenceTest SUCCESS 7 UnitTest.Backend.DataAdapterTest.DeleteProjectPlanEntryTest SUCCESS 8 UnitTest.Backend.DataAdapterTest.DeletePublicHolidayTest SUCCESS 9 UnitTest.Backend.DataAdapterTest.DeleteShortTimePlanEntry SUCCESS 10 UnitTest.Backend.DataAdapterTest.DeleteWeekPlanEntryTest SUCCESS 11 UnitTest.Backend.DataAdapterTest.GetAbsenceCalendarTest SUCCESS 12 UnitTest.Backend.DataAdapterTest.GetAbsenceCategoriesTest SUCCESS 13 UnitTest.Backend.DataAdapterTest.GetBusinessRulesTest SUCCESS 14 UnitTest.Backend.DataAdapterTest.GetCategoryCapacitiesForEmployeeTest SUCCESS 15 UnitTest.Backend.DataAdapterTest.GetDepartmentNames SUCCESS 16 UnitTest.Backend.DataAdapterTest.GetEmployeesTest SUCCESS 17 UnitTest.Backend.DataAdapterTest.GetExternalEmployeeTest SUCCESS 18 UnitTest.Backend.DataAdapterTest.GetFunctionTest SUCCESS 19 UnitTest.Backend.DataAdapterTest.GetHolidayCalendarTest SUCCESS 20 UnitTest.Backend.DataAdapterTest.GetInternalEmployeeTest SUCCESS 21 UnitTest.Backend.DataAdapterTest.GetOpenProjectsTest SUCCESS 22 UnitTest.Backend.DataAdapterTest.GetOvertimePaymentsTest SUCCESS 23 UnitTest.Backend.DataAdapterTest.GetProjectMemberCostTest SUCCESS 24 UnitTest.Backend.DataAdapterTest.GetProjectMemberTest SUCCESS 25 UnitTest.Backend.DataAdapterTest.GetProjectPlanTest SUCCESS 26 UnitTest.Backend.DataAdapterTest.GetProjectsForEmployeeTest SUCCESS 27 UnitTest.Backend.DataAdapterTest.GetProjectsForProjectCategoryTest SUCCESS 28 UnitTest.Backend.DataAdapterTest.GetProjectsForProjectManagerTest SUCCESS 29 UnitTest.Backend.DataAdapterTest.GetProjectTest SUCCESS 30 UnitTest.Backend.DataAdapterTest.GetShortTimePlanTest SUCCESS 31 UnitTest.Backend.DataAdapterTest.GetWeekPlanTest SUCCESS 32 UnitTest.Backend.DataAdapterTest.GetWorkTimeCaptureTest SUCCESS 33 UnitTest.Backend.DataAdapterTest.UpdatePlannedAbsenceTest SUCCESS 34 UnitTest.Backend.DataAdapterTest.UpdateProjectPlanEntryTest SUCCESS 35 UnitTest.Backend.DataAdapterTest.UpdatePublicHolidayTest SUCCESS 36 UnitTest.Backend.DataAdapterTest.UpdateShortTimePlanEntry SUCCESS 37 UnitTest.Backend.DataAdapterTest.UpdateWeekPlanEntryTest SUCCESS 38 UnitTest.CommunicationContract.DispatcherTest.CommitTest SUCCESS 39 UnitTest.CommunicationContract.DispatcherTest.CreateObjectTest SUCCESS B
40 UnitTest.CommunicationContract.DispatcherTest.DeleteObjectTest SUCCESS 41 UnitTest.CommunicationContract.DispatcherTest.ExistsHolidaysForNextYearTest SUCCESS 42 UnitTest.CommunicationContract.DispatcherTest.GetAbsenceCalendarTest SUCCESS 43 UnitTest.CommunicationContract.DispatcherTest.GetAbsenceCategoriesTest SUCCESS 44 UnitTest.CommunicationContract.DispatcherTest.GetApplicationInfoTest SUCCESS 45 UnitTest.CommunicationContract.DispatcherTest.GetBusinessRulesTest SUCCESS 46 UnitTest.CommunicationContract.DispatcherTest.GetCategoryCapacitiesForEmployeeTes t SUCCESS 47 UnitTest.CommunicationContract.DispatcherTest.GetDepartmentNames SUCCESS 48 UnitTest.CommunicationContract.DispatcherTest.GetEmployeesTest SUCCESS 49 UnitTest.CommunicationContract.DispatcherTest.GetExternalEmployeeTest SUCCESS 50 UnitTest.CommunicationContract.DispatcherTest.GetFunctionTest SUCCESS 51 UnitTest.CommunicationContract.DispatcherTest.GetHolidayBudgetTest SUCCESS 52 UnitTest.CommunicationContract.DispatcherTest.GetHolidayCalendarFromYearTest SUCCESS 53 UnitTest.CommunicationContract.DispatcherTest.GetHolidayCalendarTest SUCCESS 54 UnitTest.CommunicationContract.DispatcherTest.GetInternalEmployeeTest SUCCESS 55 UnitTest.CommunicationContract.DispatcherTest.GetOpenProjectsTest SUCCESS 56 UnitTest.CommunicationContract.DispatcherTest.GetOvertimePaymentsTest SUCCESS 57 UnitTest.CommunicationContract.DispatcherTest.GetProjectMemberCostTest SUCCESS 58 UnitTest.CommunicationContract.DispatcherTest.GetProjectMemberTest SUCCESS 59 UnitTest.CommunicationContract.DispatcherTest.GetProjectPlanTest SUCCESS 60 UnitTest.CommunicationContract.DispatcherTest.GetProjectsForEmployeeTest SUCCESS 61 UnitTest.CommunicationContract.DispatcherTest.GetProjectsForProjectCategoryTest SUCCESS 62 UnitTest.CommunicationContract.DispatcherTest.GetProjectsForProjectManagerTest SUCCESS 63 UnitTest.CommunicationContract.DispatcherTest.GetProjectTest SUCCESS 64 UnitTest.CommunicationContract.DispatcherTest.GetShortTimePlanTest SUCCESS 65 UnitTest.CommunicationContract.DispatcherTest.GetSumOfUsedHolidaysTest SUCCESS 66 UnitTest.CommunicationContract.DispatcherTest.GetWeekAbsencesTest SUCCESS 67 UnitTest.CommunicationContract.DispatcherTest.GetWeekPlanTest SUCCESS 68 UnitTest.CommunicationContract.DispatcherTest.GetWeekWorkTimeCaptureTest SUCCESS 69 UnitTest.CommunicationContract.DispatcherTest.GetWorkTimeCaptureTest SUCCESS 70 UnitTest.CommunicationContract.DispatcherTest.RegisterTest SUCCESS 71 UnitTest.CommunicationContract.DispatcherTest.UnRegsisterTest SUCCESS 72 UnitTest.CommunicationContract.DispatcherTest.UpdateObjectTest SUCCESS 73 UnitTest.CommunicationContract.UtilTest.GetCalendarWeekTest SUCCESS 74 UnitTest.CommunicationContract.UtilTest.IsInCalendarWeekTest SUCCESS 75 UnitTest.GUIFrontend.ControllerTest.CanUndoRedoTest SUCCESS 76 UnitTest.GUIFrontend.ControllerTest.CanUndoRedoTextsTest SUCCESS 77 UnitTest.GUIFrontend.ControllerTest.ClearUndoRedoStackTest SUCCESS 78 UnitTest.GUIFrontend.ControllerTest.ExecuteTest SUCCESS 79 UnitTest.GUIFrontend.ControllerTest.RedoTest SUCCESS 80 UnitTest.GUIFrontend.ControllerTest.UndoTest SUCCESS C
D
E
F
G
P-Nummer Pendenz Verantwortung Termin Status Bemerkung P30 Review der technischen Spez. -> Termin mit André abmachen Stefan 01.05.09 erledigt 18.5. 17.00-19.00 P31 PH Review Oliver & Stefan 14.04.09 erledigt P32 PH Review Protokoll versenden Stefan 14.04.09 erledigt P33 PH Protokoll Bemerkungen ins PH einpflegen Oliver & Stefan 20.04.09 erledigt P34 Abklären: Wochenplanung online? Stefan 17.04.09 erledigt Wird intern @vc gemacht P35 Abstract ändern oder nicht? Oli 23.04.09 erledigt Nein P36 Reporting Container -> Ein Modul Gesamtprojekt Stefan 01.06.09 erledigt P37 Statusbericht #3 Stefan 08.05.09 erledigt P38 Inhaltsverzeichnis / Struktur für Dokumentation erstellen Stefan 05.05.09 erledigt P39 Technische Detailspez. Oliver & Stefan 08.05.09 erledigt P40 Gui Prototypen zeichnen Oliver & Stefan 15.05.09 erledigt P41 GUI Control (Framework) auswählen Oliver & Stefan 15.05.09 erledigt DevComponents? => 2 Entw. 560.- $ P42 Interface Beschreibung IDataAccess Stefan 05.05.09 erledigt P43 Interface Beschreibung ICommunication Oliver 05.05.09 erledigt P44 Datenbankschema anpassen Stefan 05.05.09 erledigt P45 OOSD Oliver & Stefan 01.06.09 erledigt P46 Statusmeeting Präsi vorbereiten Stefan 27.05.09 erledigt P47 Statusbericht #4 Stefan 20.05.09 erledigt Am 20.5. erstellen, am 22.5. verschicken P48 Statusmeeting mit Marco Oliver & Stefan 29.05.09 erledigt Einladen. P49 Statusbericht #5 Stefan 19.06.09 erledigt P50 Corinne Usability Walkthrough einladen Stefan 05.06.09 erledigt 05.06.2009 P51 OOSD mit André besprechen Stefan 05.06.09 erledigt 05.06.2009 H