Pavel Švagr
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    --- title: Software Requirements Specification (SRS) for Milacci tags: milacci, ackee --- # Software Requirements Specification for `Milacci` ## System roles | Role | Objective| |-|-| |Chatbot|User who can see list of users and their detail with hour rates.| |User|User with valid Google account who can primary create invoices and check self details such as hour rates, time entries, notifications and invoice history.| |Team leader|User with same rights as employee but moreover can manage their team members.| |Admin|System administrator who can manage whole system and use all features.| ## Product functions ### `Authentication` - Users (aka active users) are authenticated via Google login - Suspended users and users without local account cannot log into app - Deleted user cannot log into app, Google account and Redmine #### Login - Users can login with their Ackee email (`{name}.{surname}@ackee.cz`). - `Chatbot` users can login with their email & password combination ### `User management` #### User registration - User fills in the following information - Email - Contact email - Password - User state - Sumbitting the data - The user role will be set to `chatbot` #### Creating the new user - User fills in the following information about the user he wants to add - User's name - required - User's surname - required - Contact email - required - Work type (agreement, registration number or employment contract) - required - Start date - required - Registration number - State which says user is or is not internal - User's phone number - Job title (backend, frontend, etc.) - each user can be placed to one of these groups only, required - System role - User's team leader - required - Hourly capacity in format number of hours per month - User's date of birth - Notes - An email address for the new user is created in format `{name}.{surname}@ackee.cz` - Submitting the data - Creates a remote user account at Google, using the new email - Creates a remote user account at Redmine, using the new email - Creates a local user account - Adds the new email as a subscriber for `ackee.zip` Mailchimp list - Sends a [registration email](#Registration-email) - Requires following role: Admin #### User update - Admin can update each field of each user - User can update following fields - Birth date - Registration number (IČO) - TODO: vyresit s Katou User with role `admin` can update each field of each user. User with role `user` can update only own birth date and registration number (IČO). #### User list User with role `admin` can list all users. User with role `teamLeader` can see users from his / her team only. User with role `user` cannot list users. - Admin can list all users with their hour rates - Team leader can list users with [hour rates](#Hour-rates-management) from their team with hour rates - User cannot list users #### User detail User with role `admin` can see all fields of each users. User with role `user` can see his / her own detail but only start date (TODO: zjistit od Kati). `teamLeader` can see detail of users from his / her team such as email, phone number, work type, hour rates, next vacation. - Admin can see all fields of each users - User can see following fields - TODO: vyresit s Katou - Start date - Hour rates - Team leader can see detail of users from their team with following fields - Email - Phone number - Work type - Hour rates - Next vacation #### Google groups synchronization - App can manage Ackee's Google groups - Users are moved to following Google groups depending on their internal state - Internal (milacci@ackee.cz) for internal users - External (ackee-externisti@ackee.cz) for external users - Users are moved to following Google groups depending on their job title - Backend - iOS - Android - Frontend - Marketing - Design - Tester - DevOps - Other teams dont have Google groups - Sync process starts automatically each day - It takes all active users - It synces the user groups in GSuite - One way synchronization (the cron only adding users to the groups) #### Registration email - Registration email is sent automatically after [user is created](#User-registration) - Email is sent to user's contact email - Email contains following information - Google credentials - Username - Password - must be changed after first login - Login URL to the app - Link to [První den v Ackee](https://wiki.ack.ee/doku.php?id=navody:prvni_den_v_ackee) page. ### `Hour rates management` Allows users to manage user's hour rates. Hour rate is user's salary per hour. #### Hour rate create - User fills in following information - Since date - indicates from which date is hour rate active - Value - Submitting the data - Creates hour rate - Deactivates previous hour rate from specified date (`since date`) - There should be only one active hour rate - Requires roles: `admin` #### Hour rate list - `User` can list all own hour rates with following information - Since date - Value - Percentage increase - against previous hour rate - `Valid to` date - `Team leader` can list all own hour rates and all hour rates of their team members with members - `Admin` can list all hour rates with their users #### Hour rate update Use this only if it is necessary. `Delete` and `create` process is much better because of history of hour rates. - User can fill following information - Since date - previous hour rate would not be deactivated / updated from this new date (need to do it manually) - Value - percentage of increase would not be recalculated - Percentage of increase - `Valid to` date - Requires roles: `admin` #### Hour rate delete - Use this for example if user filled bad data - Valid date of previous hour rate would not be reverted - Recommended way after deleting the hour rate is create the new one - Requires roles: `admin` #### Hour rate detail - User can see following information - `Valid to` date - Since date - Percentage of increase - against previous hour rate - Value - User - hour rate owner - Team leader can see own hour rates and hour rates of users from his / her team - Admin can see all hour rates #### Hour rate stats - User can read hour rate stats within the whole company - There is average of increase the hour rate value which is calculated each month - Requires roles: `admin` ### `Invoices` Allows users manage invoices. Also provides informations about time entries which are synced from Redmine. #### Invoice create - Current month invoices are automatically created each hour for each user - If invoice in current month does not exist the new invoice is created - Invoice is set to not issued state #### Manual create - User fills in the following information about the invoice he / she wants to create - Items of invoice - Title with work description - Quantity - number of hours user worked - Hour rate - VAT rate - Period of issue - Requires roles: `admin` #### Invoice update - User can upload PDF file with original invoice - Submitting the data - Check if invoice is first for current month - If not --> throws an error (user can have only one invoice per month) - Synces users time entries - Finds all time entries for specified period of issue - Validation - Checks invoice for specified period doesnt exist - Counts real value of invoice (sum of found time entries and user's hour rate which is related to time entry period) - Pairs time entries with new invoice - Set invoice state to waiting - If file is deleted the invoice state is set to not issued - If the current state is equal to waiting #### Invoices list - User with role admin can list all invoices - Another users can list only own invoices - User can see following information - PDF file name - Total value - Invoice state - Number of spent hours #### Invoice detail - User with role admin can see detail of each invoice - Another users can see only own invoices - Synces users time entries - Finds all time entries for specified period of issue - Counts real value of invoice (sum of found time entries and user's hour rate which is related to time entry period) - Pairs time entries with new invoice - User can see following information - PDF invoice link - valid for 1 hour - PDF file name - Invoice state Number of spent hours - User detail - the invoice owner #### Time entry list - User can list own time entries - User with role `admin` is allowed to list all time entries - User can see following information - Time where the time entry was spent - Spent hours - Total value - salary - Description - Tracking system project #### Tracking system project synchronization - Tracking system projects are synced automatically each hour - It takes all tracking system projects - Map tracking system projects to projects in time entries - Add project name if projects are successfully mapped #### DPP invoice creation DPP is special type of invoice. Only users who have work type equal to `agreement` can create this type of invoice. If invoice value is bigger than 10.000 CZK warning notification is created before form submit. After submutting form is time entries validated and XLS doc with all time entries for current month, hour rates and spent hours is created. Generated XLS file includes header with year and month in `YYYY-MM` format and user's name and surname, time entry description, spent hours, date of spending hours and creation date in the end of file. If time entry has not description then is description generated randomly from existing descriptions of other time entries. - User fills in followed informations - Period of issue - If invoice value is bigger then 10.000 CZK user is notified about it before submitting the form - Submitting the data - Synces user's time entries - Finds time entries for specified period - Checks invoice for specified period doesnt exist - Creates local invoice - Pairs time entries with new invoice - Creates XLS document with following information - Header with period of issue and user's name and surname - Time entry - Work description (if its empty then randomly choose description from time entries with description) - Number of spent hours - Date of spending hours - Date of invoice creation - Uploads XLS document to Google bucket under `/invoices/{userId}` folder #### Invoice download User with role `admin` can download compressed zip file with filtered or all uploaded invoices. ### `Working days` User with role `admin` is allowed to check how many hours in month each employee worked and check if they fulfilled their contract. This module takes days in month, filter weekends and public holidays. This value is compared to employee's time entries. ### `Notifications` Allows users to see their notifications. Each notification type has base settings which contains: - `email notification` - notification will be sent also as email - Values: `yes` or `no` - Usage: if is needed to highlight importance of notification - `additional users` - these users also receives created user's notification - Values: list of emails - Usage: if is needed to notify department or another users (for example: HR, finance department, bosses) - `days in advance` - notification will be created before action or event is happening - Values: number of days - Usage: if is needed to prepare for action or event (for example: buy gifts for users with birthday) - `notify team leader` - team leader will be notified about action / event - Values: `yes` or `no` - Usage: if is needed to user's team leader know about action / event This settings can be changed on backend side for each notification type. #### Types ##### Birthday *Default settings* ``` email notification = yes, additional users = katerina.kebzova@ackee.cz, days in advance = 21, notify team leader = no, ``` - Birthday notification is created before user's birthday - Finds users with set birth date - Checks if users will have birthday - Creates notification which is shown in app - Sends email notification Three weeks before user's birthday (need to set birthday in his / her profile) is created notification which is shown to HR. *Notification texts* - Title: `Miláček bude mít narozeniny!` - Body: `Miláček {name} {surname} bude mít narozeniny (DD.MM.YYYY), bude mu X let!` *Email texts* - Title: `Miláček bude mít narozeniny!` - Body: `Miláček {name} {surname} bude mít narozeniny (DD.MM.YYYY), bude mu X let!` ##### Invoice *Default settings* ``` email notification = yes, additional users = katerina.kebzova@ackee.cz, days in advance = 21, notify team leader = no, ``` - Invoice notification is created each last day in month at 11 p.m. - Finds users whose did not create invoice for current month - Creates notification which is shown in app - Sends email notification - Email for user is sent to Ackee email Last day in month at 11 p.m. will be created notification which notify user about creating the invoice if is not already created. Notification is sent to HR and user also as email. *Notification texts* - Title: `TODO` - not implemented yet - Body: `TODO` - not implemented yet *Email texts* - Title: `TODO` - not implemented yet - Body: `TODO` - not implemented yet ##### Three month review *Default settings* ``` email notification = yes, additional users = katerina.kebzova@ackee.cz, days in advance = 21, notify team leader = yes, ``` - Three month review notification is created - Finds users whose are 3 months after boarding in company - Creates notification which is shown in app - Sends email notification - Email for user is sent to Ackee email Three weeks before three month boarding is sent notification (also email notification) to team leader, HR and user which contains. *Notification texts - for `user`* - Title: `Hodnocení po zkušebce` - Body: `Blíží se hodnocení po zkušebce, nastoupil/a jsi k nám DD.MM.YYYY, kontaktuj svého team leadera a HR!` *Notification texts - for `additional users` & `team leader`* - Title: `Hodnocení po zkušebce` - Body: `Miláček X Y bude mít hodnocení po zkušebce, nastoupil k nám DD.MM.YYYY!` *Email texts - for `user`* - Title: `Hodnocení po zkušebce` - Body: `Blíží se hodnocení po zkušebce, nastoupil/a jsi k nám DD.MM.YYYY, kontaktuj svého team leadera a HR!` *Email texts - for `additional users` & `team leader`* - Title: `Hodnocení po zkušebce` - Body: `Miláček X Y bude mít hodnocení po zkušebce, nastoupil k nám DD.MM.YYYY!` ##### Ackeeversary *Default settings* ``` ackeeversary form url = https://forms.gle/QWDmBRvvMSvBy7HZ7, email notification = yes, additional users = katerina.kebzova@ackee.cz, martin.pulpitel@ackee.cz, days in advance = 21, notify team leader = yes, ``` - Ackeeversary notification is created each year after user's boarding - Finds users with start date - Checks if it is user's next year in company - Creates notification which is shown in app - Sends email notification - Email for user contains link to [Ackeeversary form](https://forms.gle/QWDmBRvvMSvBy7HZ7) and is sent to user's Ackee email Three weeks before year boarding is sent notification (also email notification) to team leader, HR, Martin Půlpitel and user which contains [link to Ackeeversary form](https://forms.gle/QWDmBRvvMSvBy7HZ7). *Notification texts - for `user`* - Title: `Ackeeversary` - Body: `Blíží se roční hodnocení, nastoupil/a si k nám DD.MM.YYYY vyplň prosím formulář, který jsme ti poslali na mail a dej vědět HR!` *Notification texts - for `additional users` & `team leader`* - Title: `Ackeeversary` - Body: `Miláček X Y bude mít roční hodnocení, nastoupil k nám DD.MM.YYYY!` *Email texts - for `user`* - Title: `Ackeeversary` - Body: `Blíží se roční hodnocení, nastoupil/a si k nám DD.MM.YYYY vyplň prosím formulář, který jsme ti poslali na mail a dej vědět HR!` *Email texts - for `additional users` & `team leader`* - Title: `Ackeeversary` - Body: `Miláček X Y bude mít roční hodnocení, nastoupil k nám DD.MM.YYYY!` #### Notification list User with role `admin` can list all notifications, other users can list own notifications only. #### Notification updation User with role `admin` can update each notification, other users can mark their notification as read or resolved. #### Notification deletion Notifications are deleted each year at 1. 1. 00:00 via background process which removes all notifications from past year. Notification can be also deleted by user with role `admin`. #### Notification creation Notifications are created via background process every day. Process create all defined types for all active users which meets conditions specified in `Types` chapter. Notification can be also created by user with role `admin`. #### Notification detail Each user can read own notification. User with role `admin` can read all notifications. ## Documentation * [Milacci API docs](https://console.cloud.google.com/storage/browser/aglio-docs.ack.ee/milacci2-api/development/?project=infrastruktura-1307) * [Wireframes](https://projects.invisionapp.com/d/main#/projects/prototypes/17788608) * [Design](https://projects.invisionapp.com/d/main#/projects/prototypes/18116264) * [FE dev](milacci-frontend-development.ack.ee)

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully