for this job I need a software programer to extend an existing WPF 2010 master-detail project. The existing project manages people ( firstnames, lastnames, age....) and their telephonenumbers. (1 to n relation)
And now to continue this project the data of a third table of the same SQL-database shall be displayed in a separate window. This new window could for example be opened when the user double-clicks an item (person) in the existing Listbox on the already existing mainwindow of the project. This new window shall display the matching calendar entries of the people stored in the master table. These calendar entries are reminders, appointments, birthdays, evnets of any kind a.s.o.
I think that all this is a rather easy task for a confirmed software programer. The central point, therefore, is not only that the project runs fine but the way **how the project is coded** matters to me too! The fact is that I am trying to learn WPF myself. And this project shall be a **tutorial for me** from which I can learn WPF, the MVVM pattern and "best practice"
You can find a list of the most important requirements to meet in the "Advanced--Additional Informatio".
Visual Studio Version: 2010
Code behind: Visual Basic ( NOT C#)
WPF MVVM pattern (separation of View, ViewModel and Model)
Datacontext: Entities (from SQL into Entities, automatic generated (by wizard) entityclass when data is added as entity to the project)
Databinding: Properties of EntityClass
MoveCurrentToFirst, MoveCurrentToNext, MoveCurrentToPrevious, MoveCurrentToLast..... for datanavigation in the events, reminders and other calendarentries.
Sorting, grouping and filtering of the data.
Editing: AddNew, Remove, RemoveAt.....CancelEdit, CommitEdit....
Commands for the buttons.
And last but not least, a lot of comments to explain what's happening where in the code would help me to understand the used techniques.
Who accepts the challenge?
The whole point of the exercise is to manage and display Reminders, Appointments, Evnets of any kind, Birthdays a.s.o. In the following description of the job I will use the term of
"Reminder" for every possible entry-type. It shall be a Master-Detail WPF-Project. The Master-data is composed of People with a FirstName, SurName,... a.s.o. For every person in
the People-data one or more related reminders do exist. These reminders are stored in the child-table "tblReminders". On start only the data of the Mastertable(People) shall be
displayed in the existing mainwindow of the poject. By clicking a button (or double-click on a list-item) a second window with the Reminder-data shall open and display the related reminders for the current Person.
1) The data shall be listed-up in a Listview or datagrid and the details of the current item shall be displayed in speciffic, separated elements
(above the list).
2) In addition to that, the Reminders shall "appear" as bolded dates in a calendar-element (maybe on a panel on the left side of the window) This calendar-element shall work in both
directions. I mean when clicking on a bolded date, the current item shall be set to that selected calendar-entry.
3) In the List of all the reminders a color-code shall inform about the "status" of an entry. For example Greeen for "Done", red for "date passed"(but not done), yellow for "watch out,
4) Only the items where the field "Hide" is set to "False" in the DataBase shall be displayed. To view all of the items (even the "Hide" = True) the user has to enter a password!
5) Filtering the different states of the reminders shall be possible. Main filter is the access-level: see point 4. Other filters are All, only "Done", not yet "Done"
6) Filtering of the different "EventTypes" shall be possible
7) buttons for CRUD-operations of the reminder-data (add, delete, update With confirmation messagebox for delete-operation!)
8) Extra, separated window for adding or updating items.
9) When editing an item then "autocomplete"-feature (maybe ComboBoxes) for the fields Event, Place, WhereExactly, EventType and ContactPerson.
10) Concerning this "WarningEmail-feature" I think that for the moment it's enough when the current person of the main-data gets a warning-messagebox.
Nonetheless the code to check if there is a "mailDate" and if "mailSent" is True or False should be provided by the coder. This should be checked right at the start
of the project, not only when the Reminder-window is shown.
11) While editing a reminder the coder has to make sure that EventDay (start date of a reminder) always is "smaller" or at least "equal" to the date of EventEnd. So if EventDate is
changed to a "bigger" date than EventEnd, EventEnd has to change to the new date of EventDay. But if the user sets a "smaller" date for EventEnd than EventDay, then the user must
get an errormessage.
12) When a reminder lasts for more than one day, then the "duration" of the reminder has to be set as bolded dates in the calendar-element.
13) In the detail-area of the reminder-window an element has to inform the user how many days are left until the current reminder occurs. Different styles (color, font...) to mark if a
reminder is nearing or maybe already passed would be good!
14) I would be glad about a groupdescription on the "EntryType" field.
15) If WPF still supports the NumericUpDown-element then I think it would be the right choice for the "Interval" field for the periodic repeating items. And maybe radioButtons could do
for setting the "RadioBtn" field's value.
Name of the table: tblReminders.
Description of the fields:
Name: Id; Type: int; AllowNull = False; IsIdentity = True (primary key)
Name: Fk_People; Type: int; AllowNull = False (foreign key of master table People)
Name: EventDay; Type: datetime; AllowNull = True
Name: EventEnd; Type: datetime; AllowNull = True
Always >= EvnetDay; Never before EventDay!!
Name: EventTime; Type: nvarchar(15); AllowNull = True
Daytime of the Reminder. F. ex: 14:15:00
Name: Event; Type: nvarchar(100); AllowNull = True
Description of the event
Name: Place; Type: nvarchar(60); AllowNull = True
Description of the place where the reminder is taking place
Name: WhereExactly; Type: nvarchar(60); AllowNull = True
The exact place. [url removed, login to view]: second floor, first office on the left
Name: EventType; Type: nvarchar(40); AllowNull = True
Every reminder belongs to an eventtype. Is used for grouping, sorting or filtering the reminders
Name: ContactPerson; Type: nvarchar(50); AllowNull = True
Can be a name of a person, a phonenumber or an e-mail
Name: Notes; Type: nvarchar(380); AllowNull = True
Additional notes to describe the reminder
Name: Done; Type: bit; AllowNull = True
When set to TRUE then the reminder is "done". Will not be displayed in the standard view (filtered out)
Name: Periodic; Type: bit; AllowNull = True
Certain reminders repeat periodically, like a birthday f.ex. turns back every year
Name: Interval; Type: int; AllowNull = True
The time-span in which a periodic reminder will repeat. F.ex. every month, every five years, every 10 days....
Name: RadioBtn; Type: nvarchar(10); AllowNull = True
Sets the interval-type. The user can choose by radiobutton of a reminder repeats in x days, x weeks, x month or x years
Name: Ask; Type: bit; AllowNull = True
When set to False the next date for a periodic reminder is "automatically" changed to be displayed as a date "to come" in the future.
When set to TRUE then, when the date for a periodically returning reminder has passed, a button has to appear on the window. The reminder will be displayed as "passed"
until the user hits this "display at next date"-button. At that moment a function has to calculate the next time (date) when this periodic reminder will occure again.
Name: StartDate; Type: date; AllowNull = True
The date on which a reminder is added.
Name: Day_J_in; Type: int; AllowNull = True
This value sets how many days the person in the Master table has to be warned by e-mail, BEFORE the reminder occures.
Name: WarningAddress; Type: nvarchar(90); AllowNull = True
The e-mail addresses for the warning e-mails. Comma-separated string containig the e-mails. (fore the case that there are more than only one.)
Name: mailDate; Type: date; AllowNull = True
The date on which a "warning e-mail" is sent to "WarningAddress"
Name: mailSent; Type: bit; AllowNull = True
When set to False, a warning e-mail is sent. When set to True, no warning e-mail.
Name: Hide; Type: bit; AllowNull = True
Defaul = False When set to True this entry is only displayed when the user has entered the right password.
Special case 1:
The date of a periodically returning reminder is re-calculated because it's date is passed. Then the new StartDate (for the warning e-mail) has to be recalculated,
considering the "Day_J_in" value. The field "mailSent" has to be unchecked too!