PROJECT: Internship Diary

This portfolio summarizes my contributions to Internship Diary.

Overview

Internship Diary is a desktop-based internship tracking application. The user interacts with it using a CLI, and it has a GUI created with JavaFX.

The inspiration behind this project is a common problem faced by all group members - the difficulty in organising and tracking internship applications efficiently. With having internship experience being a graduation requirement for all Computer Science NUS undergraduates, we strongly feel for the need to have a software application to help students like us deal with the organising and tracking of internship applications. Hence, Internship Diary was created.

Summary of contributions

  • Major enhancement: Adding Reminder feature (PR: #82, #152, #201, #215)

    • What it does: This feature enables the user to view applications that need to be submitted or have interviews scheduled in 7 days.

    • Justification: It aims to help the user keep track of his internship applications, to avoid missing submission deadlines or interview dates. It can also give the user an idea of the applications to focus on more first.

  • Minor enhancement: Implement the display of the last stage where an application failed (PR: #115, #134)

    • What it does: This implementation enables the user to view the stage (applied, interview, offered) which the application was at before it was ghosted or rejected.

    • Justification: This aims to help the user reflect on the stage at which the application could have been done better, to aid future applications.

  • Code contributed: Reposense

  • Other contributions:

    • Helped with refactoring UI of Internship Diary from Address Book (PR: #52)

    • Project management:

      • Updated team repository’s issue panel by assigning, labelling and closing issues

    • Documentation:

      • Added relevant sections for Reminder feature and improved other sections in User Guide and Developer Guide

Contributions to the User Guide

Given below are sections I contributed to the User Guide. They showcase my ability to write documentation targeting end-users.

Getting applications due or have interviews in 7 days: reminder

Displays all internship application(s) that:

  • have status wishlist and need to be submitted in 7 days

  • have status interview and interviews scheduled in 7 days

The applications will be displayed in order of earliest application date or scheduled interview date followed by those with later dates.

This command helps to remind you of applications which you might want to focus on first, so that you do not miss submission deadlines or any upcoming interviews.

Format: reminder

reminderexample
Figure 1. Example display of Internship Diary when reminder is executed
reminder can be used anytime, but it does not work on archived applications.
Any command after reminder will be ignored.
e.g. reminder dummy variable be just be treated as reminder

Contributions to the Developer Guide

Given below are sections I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project.

Reminder Command

The reminder command displays to users a list of internship applications which:

  • have status wishlist and need to be submitted in 7 days

  • have status interview and interviews scheduled in 7 days

The applications will be displayed in order of earliest application date or scheduled interview date followed by those with later dates.

The following sequence diagram shows how the command is executed:

ReminderSequenceDiagram
Figure 2. Interactions Inside the Logic Component for the reminder Command

Implementation

The reminder command is implemented in the class ReminderCommand.

When the execute() method of the ReminderCommand is called, several predicates classes implementing Predicate<InternshipApplication> are created:

  • ApplicationDateDuePredicate — Predicate to check whether the ApplicationDate field of an internship application has a date of the current date or within 7 days of the current date.

  • StatusIsWishlistPredicate — Predicate to check whether the Status field of an internship application is wishlist.

  • InterviewDateDuePredicate — Predicate to check whether there is at least one interview in the ArrayList<Interview> interviews of an internship application that has a date of the current date or within 7 days from the current date.

  • StatusIsInterviewPredicate — Predicate to check whether the Status field of an internship application is interview.

  • IsNotArchivedPredicate — Predicate to check whether an internship application is not archived.

Firstly, an AND operation on the ApplicationDateDuePredicate and StatusIsWishlistPredicate as well as another AND operation on the InterviewDateDuePredicate and StatusIsInterviewPredicate are performed. Next, an OR operation is performed on the predicates from the previous two AND operations. An AND operation is then performed on the predicate obtained from the previous OR operation and the IsNotArchivedPredicate. The IsNotArchivedPredicate is used to make sure that archived internship applications do not appear when reminder is used. The final predicate produced is then passed into the method updateFilteredInternshipApplicationList() of the ModelManager instance.

The activity diagram below summarises how each internship application is checked by the predicates mentioned above:

Reminder
Figure 3. Activity Diagram on how ReminderCommand filters out applications to display

A comparator ApplicationDateAndInterviewDateComparator implementing Comparator<InternshipApplication> is also created and then passed into the method updateFilteredInternshipApplicationList() of the ModelManager instance to sort internship applications in terms of which application is more urgent. For each internship application, its ApplicationDate field as well as the earliest interview date in the List<Interview> interviews are compared to current date and the earlier date out of the two is used for the sorting. The most urgent application will be at the top.

Design Considerations

Aspect: The order to display the internship applications
  • Alternative 1 (current choice): Display the internship applications in the order of either their applicationDate or interviewDate of the earliest interview scheduled in List<Interview> interviews is closer to current date.

    • Pros: More useful to the user as the user can directly know which internship application to focus on more, regardless of whether it is to prepare for the submission of the application, or to prepare for an interview scheduled.

    • Cons: Longer code as both the earliest interviewDate and the applicationDate of an application needs to be compared to current date to see which date is closer and that date will then be used to sort the internship applications.

  • Alternative 2: Display the internship applications in the order of which application’s applicationDate is closer to current date.

    • Pros: Cleaner code as the applications can just be sorted by their applicationDate.

    • Cons: Has the assumption that an internship application with a earlier applicationDate will have an interview scheduled at an earlier interviewDate as compared to an application with later applicationDate. User might miss out on a earlier interviewDate for an application with later applicationDate and additional commands have to be typed in to check interviewDate.

Aspect: The filtering of internship applications to be shown
  • Alternative 1 (current choice): Using separate predicates(ApplicationDateDuePredicate, StatusIsWishlistPredicate, InterviewDateDuePredicate, StatusIsInterviewPredicate) to filter out internship applications with ApplicationDate or earliest interviewDate within 7 days from current date.

    • Pros: Cleaner code and each Predicate class only needs to check for one field. Easier to test as well.

    • Cons: Longer code as more predicates instantiated and used.

  • Alternative 2: Using just one predicate to filter out internship applications with ApplicationDate or earliest interviewDate within 7 days from current date.

    • Pros: Reduce the number of predicates to be instantiated and to be used.

    • Cons: More conditions to check for in one predicate which could lead to potential bugs.