diff --git a/App/Handbook.md b/App/Handbook.md
new file mode 100644
index 0000000..4ae0c04
--- /dev/null
+++ b/App/Handbook.md
@@ -0,0 +1,284 @@
+# Handbook
+
+## Introduction
+
+This documentations goal is to explain in detail and in a step-by-step approach how to setup the application, maintain and administrate it.
+
+By reading this documentation you'll learn how to setup the different application types and the possible configurations for each application. At the same time the documentation will also help you to prepare your server or local machine for the different purposes. The setup process will be explained for multiple operation systems and server environments. Knowledge in these areas will be helpful but not necessary in order to successfully get the applications running.
+
+In the maintenance chapter a general idea about server maintenance is given but don't fear you can use the applications without knowing any of this and completely rely on the built in maintenance features. These features are helpful for beginners as well as professionals. Additional maintenance and monitoring tools will be referenced for even more sophisticated server/application management.
+
+Another important topic for this documentation is the administration of the applications. Here you'll learn about the account, group and module management including permission management and setup. The heart of this application are the modules and in this chapter you'll see how modules are installed and configured and maintained. Individual module documentation is provided with every module where the ins and outs of every module are explained.
+
+## Installation
+
+The easiest and most common way to install the application is through the web installer. Alternatively you can also install it through a command line interface (cli). Generally, it is recommended to run this application on a linux computer or linux server.
+
+### Server Recommendations
+
+The server recommendations strongly depend on your individual needs, in the following you will find some general recommendations.
+
+* SSD 10GB space + space depending on how many media files you want the application to handle
+* CPU
+* RAM
+
+### Webserver and Database
+
+If you don't have a webserver already installed please install the webserver of your choice. Webservers which are supported are apache2 and nginx. Databases which are supported are mysql/mariadb, postgres and mssql/sqlsrv.
+
+#### Windows
+
+If you are on Windows you may want to download and install the newest version of [Xampp](https://www.apachefriends.org/download.html) / [Bitnami](https://bitnami.com/stack/wamp). During the installation please make sure your install `php` and `mysql`.
+
+#### Linux
+
+On linux you may want to install `apache2` and `mysql`. Please note you can also use this application with `nginx` and `postgres`:
+
+```sh
+sudo add-apt-repository ppa:ondrej/php
+sudo apt-get update
+
+sudo apt-get install software-properties-common apache2 mysql-server
+```
+
+```sh
+sudo a2enmod rewrite
+sudo a2enmod headers
+```
+
+### Php
+
+##### Windows
+
+On Windows php should already be installed with the webservers mentioned above just like the various extensions.
+
+##### Linux
+
+The following extensions are recommended and sometimes even mandatory:
+
+```sh
+sudo apt-get install php8.0 php8.0-dev php8.0-cli php8.0-common php8.0-mysql php8.0-pgsql php8.0-xdebug php8.0-opcache php8.0-pdo php8.0-sqlite php8.0-mbstring php8.0-curl php8.0-imap php8.0-bcmath php8.0-zip php8.0-dom php8.0-xml php8.0-phar php8.0-gd php-pear
+```
+
+### Software
+
+#### Mandatory
+
+##### OCR
+
+Some modules in the application may need text recognition of scanned files (e.g. DocumentManagement). If you don't use such a module you don't need to install this.
+
+###### Windows
+
+Download and install [tesseract](https://tesseract-ocr.github.io/tessdoc/Downloads.html).
+
+###### Linux
+
+```sh
+sudo apt-get install tesseract-ocr
+```
+
+#### Optional
+
+##### Caching
+
+Caching allows the application to store data in memory instead of re-calculating it again and again. This can speed up the general behavior of the application. Supported caching are redis and memcached (**not** memcache)
+
+###### Windows
+
+On windows you may want to download and install [redis](https://redis.io/download).
+
+###### Linux
+
+For caching you may install redis or memcached:
+
+```sh
+sudo apt install redis-server
+sudo phpenmod redis
+```
+
+### Application Installation
+
+#### Files
+
+Before you can install the application you need to put the application files into the webserver directory. This directory depends on the webserver which you used and the webserver configuration.
+
+##### Windows
+
+By default the windows directory should be `C:/xampp/htdocs`. Remove all files in this directory and put all the files of the Orange Management application into this directory.
+
+##### Linux
+
+By default the linux directory should be `/var/www/htm`. Remove all files in this directory and put all the files of the Orange Management application into this directory.
+
+#### Web Installer
+
+If you installed the application on your local computer you can open a browser window and navigate to [http://127.0.0.1/Install](http://127.0.0.1/Install). If you installed it on a remote server navigate to the URL of that server.
+
+Click yourself through the installation and fill out the forms during the installation process.
+
+##### Pre-installation check
+
+On the page called pre-installation check the installation script will check and inform you if the necessary php extensions and file permissions are available. Only requirements marked as optional can be missing. If any other requirements fail please don't continue with the installation and fix these requirements first. Once you fixed the requirements reload the installation script!
+
+###### File permissions
+
+File permissions should only be an issue on linux. You can change the file permissions of directories as follows:
+
+```sh
+sudo chmod -R 755 /var/www/htm/Modules
+```
+
+###### Php extensions
+
+If the extension is already installed you can just add it to your `php.ini` file. e.g.:
+
+```ini
+extension=mbstring.dll // Example in case you are installing on Windows
+extension=mbstring.so // Example in case you are installing on Linux
+```
+
+> The `php.ini` file can be **often** found at C:/xampp/php/php.ini on Windows and /etc/php/8.0/apache2/php.ini on Linux.
+
+If the extension is not installed and not activated you can alternatively run the following commands on Linux (just as example):
+
+```sh
+sudo apt-get install php8.0-mbstring
+sudo phpenmod mbstring
+```
+
+On windows you may follow the php [installation guide](https://www.php.net/manual/en/install.pecl.windows.php).
+
+##### Database
+
+On this page you must enter the database information which the application can use to store data.
+
+###### Address
+
+The address for the database server usually is `127.0.0.1`
+
+###### Type
+
+The database type depends on which database you used. If you followed this installation you probably used `mysql`
+
+###### Port
+
+The port depends on the database you installed. Different database vendors use different ports. If you followed this installation you probably used mysql, in this case the port is `3306`. If you used another database, please check the documentation of that database to find the default port.
+
+###### Database
+
+The recommended database name is `oms`. Please note that this database must be manually created by you. If you've not already done so during the database installation process, please create that database now. In order to create this database please check the documentation of your database vendor. On windows you might be able to log into `phpmyadmin` and create this database.
+
+###### Users
+
+For security purposes we recommend that you create 5 different users in your database application who only have access to `oms` database and each one of the users may only have the following permissions. The application installation script cannot create these users, please make sure you already created them:
+
+* One user may only be able to do schema changes
+* One user may only create data
+* One user may only read/select data
+* One user may only update/modify data
+* One user may only delete/remove data
+
+It is possible to always input the same user and same password for all users in the installation script but this is not recommended. If you just want to get started you may input the user and password which you defined during the database installation. Nevertheless, please change this in the future.
+
+##### Configuration
+
+On the last page you can define the name of your organization/company.
+
+###### Admin Login, Password, Email
+
+Here you must define the admin login name, the admin password and email.
+
+###### Top Level domain
+
+The top level domain is the domain name where you installed the application. If you only installed it locally, it is 127.0.0.1. If you installed it on your webserver, then you input the domain name e.g. `orange-management.org`
+
+###### Web Subdirectory
+
+The web subdirectory by default is `/`. If you installed the application in a subdirectory instead of the main directory of your webserver you input the name of the subdirectory here e.g. `/subdir/`.
+
+##### Install
+
+After clicking install you will either receive a message that something went wrong e.g. some configurations are wrong (please fix them) or the installation will redirect you to the login if everything went smoothly. Please make sure to delete the `Install` directory so that no-one else can use it.
+
+## First Steps
+
+After your first login you will see that everything is rather empty. A good starting point are the general application settings, groups and modules.
+
+### Application Settings
+
+The general application settings can be found in the Admin settings.
+
+Go to:
+
+`Modules (on the side navigation) > Admin > Settings`
+
+On this page you may change the general application settings such as login behavior, server localization, logging etc.
+
+### Modules
+
+Under `Modules` on the side navigation you can see all installed modules. By clicking on them you will get additional module information and module specific settings.
+
+If you want to install additional settings search for specific keywords on the module page and you will receive suggestions based on these keywords. You can then check out the detailed information of these modules in order to further inspect the features the modules provides.
+
+### Groups
+
+Groups are an easy solution to managing multiple users at the same time. After the installation only a handful of groups exist. Feel free to create additional groups based on your requirements.
+
+* `Guest`: Users in this group have no permissions (cannot even login by default)
+* `User`: Users in this group have basic read and write permissions
+* `Admin`: Users in this group have all permissions
+
+If a user is part of multiple groups (this is often the case in more complex permission handling) the user has the permissions of all groups he is part of. This allows to configure groups very carefully with only the necessary permissions.
+
+#### Permissions
+
+Groups (and accounts) can have the following permissions:
+
+* `READ`: The user can read/see certain content
+* `CREATE`: The user can create/write certain content
+* `MODIFY`: The user can modify/change certain content
+* `DELETE`: The user can remove certain content
+* `PERM`: The user can change permissions
+
+It's also possible to assign permissions directly to individual users but this is **not** recommended as this makes managing permissions much more difficult.
+
+When you assign the above mentioned permissions to a group you will see that you can also define:
+
+* The `Unit` this permission is for (after the installation you only have one unit but you maybe want to have additional units/sub-organizations later on)
+* The `App` this permission is for (after the installation you only have the `Backend` and the `Api` but in the future you may have additional apps, which sometimes even get provided by other modules e.g. `TicketApp`)
+* The `Module` this permission is for (e.g. the group only has create/write permissions for a certain module)
+* The `Type` is the module specific and can be found in the module help. This can be e.g. news-article in the News module, account in the Admin module etc.
+* The `Element` is the specific model/element (e.g. a specific news article). This is represented by the element ID/number.
+* The `Component` is the specific component of a element/model (e.g. the title of a news article).
+
+These restrictions show that it is possible to do very fine/granular permissions. It is possible to leave some of the above mentioned restrictions empty to allow a broader permission definition. Examples:
+
+* Everything empty = Group/user has the permissions (e.g. read, create, ...) on everything
+* Only define module = Group/user has the permissions (e.g. read, create, ...) on everything in this module
+* Only unit and module is defined = Group/user had the permissions(e.g. read, create, ...) on everything in this module but only for the specified unit/sub-organization.
+
+### Accounts
+
+By default only admin users can create new accounts. However it is possible to allow users to register by themselves in the admin module settings. Self-registered users are always part of the `user` group. Make sure the `user` group permissions are designed while keeping that in mind.
+
+If a admin user creates a new account you must decide if the user/account should also be allowed to login/have a profile or if this account is just an internal account.
+
+If the user should be allowed to login/active user you should click on `Create Profile` to also create a profile for the user. Upon doing this the user will receive a registration email in the same way as if he registered by himself. The registration email contains a preliminary password which the user should change.
+
+## Maintenance
+
+### Logs
+
+The application creates various logs which allow you to track data changes and application behavior incl. errors.
+
+#### Audit
+
+The auditor is a module which tracks all data creations, deletions and changes (button in the side navigation). This way you can fully audit the application and data changes. This is particular helpful for organizations with high regulatory restrictions. The Auditor module also allows you to export or print filtered logs.
+
+#### Errors
+
+Errors can be inspected in the Monitoring tab (button in the side navigation). It's also possible to submit application errors to `Orange Management` directly so we can check out what went wrong and try to find a solution to prevent this from happening in the future.
+
+If you have configured `Jobs` you can also automatically receive the error messages daily as email.
+
diff --git a/Project/PROJECT.md b/Project/PROJECT.md
index 6a7951c..d26fd9c 100644
--- a/Project/PROJECT.md
+++ b/Project/PROJECT.md
@@ -10,7 +10,7 @@
## Summary
-Last update of this file: 03.11.2021
+Last update of this file: 2021.11.20
### Timeline
@@ -70,49 +70,58 @@ The estimated annual costs in the milestones are based on the total annual costs
| ---------- | ---- | ------------------------------------------------------------ |
| 2022.08.27 | | **Define scope**
Which modules should be developed first
Which features must be part of the modules at the start
What is the expected timeline for the different modules |
| | | **Navigation**
Allow to hide navigation elements even if the module is installed.
Also disable routing for front end. This way only the functionality is available (API). |
-| | | **Customer Management**
Names
Address
Contact elements
Custom fields
Contract import from CRM system (maintenance contract)? (SD specific)
Add note types (e.g. phone, email, meeting, ...) |
-| | | **Job**
Create jobs
Manage jobs
Create a job which runs exchange scripts |
-| | | **Exchange** (Importer/Exporter)
GSD import script for customers (new entries and changed entries) (SD specific)
GSD import script for customer addresses (new entries and changed entries) (SD specific)
Allow to define exchange scripts as auto-run with a interval |
+| | | **Customer Management**
Names
Address
Contact elements
Custom fields
Contract import from CRM system (maintenance contract)? *(SD specific)* |
+| | | **Job**
Manage jobs
Consider to combine Job and Workflow (e.g. job only schedule + cmd, workflow is the script to execute) |
+| | | **Exchange** (Importer/Exporter)
GSD import script for customers (new entries and changed entries) *(SD specific)*
GSD import script for customer addresses (new entries and changed entries) *(SD specific)*
Allow to define exchange scripts as auto-run with a interval |
| | | **Permission**
Better permission handling (only show tickets the user is allowed to see) **difficult**
When returning models (backend and API requests) the permission should be checked (all modules)
After completely figuring out permissions every API function needs to be checked if it behaves correctly depending on the different permissions (e.g. user created the model, user who is allowed to access the model but not change it, ...) |
-| | | **Admin**
Implement password reset
Implement email sending
Implement global email server definition
[UI] Add user & group settings
[UI] Add account/group removal from each other
[UI] Add permission removal from accounts/groups
[UI] Add permission modification for accounts/groups
Create API key permissions
Create API key handling
Handle logging for API keys
Handle "login" for API keys (maybe create dummy account for that?) |
+| | | **Admin**
[UI] Add user & group settings
[UI] Add account/group removal from each other
[UI] Add permission removal from accounts/groups
[UI] Add permission modification for accounts/groups
Create API key/token permissions
Create API key/token handling
Handle logging for API keys/tokens
Handle "login" for API keys/tokens (maybe create dummy account for that?) |
| | | **Support** (Tickets)
Ticket creation
Ticket response
Status update via email
Feedback/rating via email click (using time limited hash) **difficult**
Response from customer via email (using time limited hash) . Requires ticket email address, maybe create one per app?**difficult**
Upload files to random support directory
Allow ticket creation from external sources (e.g. website) by using an api key. Allow custom fields as well. |
-| | | **Media**
Drag and drop upload
Ctrl+C/Ctrl+V upload
Move files and directories to subdirectories
Bulk actions (move, delete, download, ..)
Better file and directory permissions. Similar problem applies to permissions. **difficuly due to subdirs**
Create custom media types (e.g. contract) with l11n text/description
Implement download of directory
Add password support for directories.
> Difficult because of subdirectories
Allow to actually replace media files (same DB id but replaced the file on the hard drive)
After installing the Media module the admin account directory should be created, this is not done at the moment like other new accounts since the admin account is created before the media module is installed
Allow links as media files (e.g. use path). If a link is detected it should forward to that link, this would also allow other modules to create pseudo media elements e.g. helper/editor. Upon clicking on it e.g. the editor is opened. This would mean the editor needs to create this media model whenever the user creates a document. The path needs to be the same as in the moduel itself e.g. Accounts/... or whatever the user defined as path in the module itself. The url should be relative e.g. /editor?id={id} which makes it domain name independent.
Allow to create a collection when uploading multiple files
Create admin setting for handling media_type specifications |
-| | | **Contract Management**
Show contracts after clicking on document list in contract
Assign contract to an account
Create task/message if a contracts term runs out
Create job which informs people about contract end of life
Define custom info deadline (global and optionally for a single contract)
Setting to change responsible person/group A to B (e.g. person leaves company)
Implement directory view for contracts
Create a new media type "contract"
Contracts can have a different date of expiration and last renewal. (e.g. renewal needs to happen 1 month before contract end)
Contracts should be filtered by organization |
-| | | **System**
Implement maintenance mode where no one can edit anything.
Implement API only mode for modules, which disables UI interaction with a module completely (no navigation, no templates, ...) |
+| | | **Media**
Drag and drop upload
Ctrl+C/Ctrl+V upload
Move files and directories to subdirectories
Bulk actions (move, delete, download, ..)
Better file and directory permissions. Similar problem applies to permissions. **difficuly due to subdirs**
Implement download of directory
Add password support for directories.
> Difficult because of subdirectories
Allow to actually replace media files (same DB id but replaced the file on the hard drive)
Allow links as media files (e.g. use path). If a link is detected it should forward to that link, this would also allow other modules to create pseudo media elements e.g. helper/editor. Upon clicking on it e.g. the editor is opened. This would mean the editor needs to create this media model whenever the user creates a document. The path needs to be the same as in the moduel itself e.g. Accounts/... or whatever the user defined as path in the module itself. The url should be relative e.g. /editor?id={id} which makes it domain name independent.
Allow to create a collection when uploading multiple files |
+| | | **Contract Management**
Show contracts after clicking on document list in contract
Create task/message if a contracts term runs out
Create job which informs people about contract end of life
Setting to change responsible person/group A to B (e.g. person leaves company)
Implement directory view for contracts |
+| | | **System**
Create frontend event which checks for server messages regularly (e.g. server goes into maintenance/read-only mode) |
| | | **Workflow**
Individual UI templates incl. styles
Script management
Allow email message and response (text+time limited links via hash) |
| | | **Invoice Management**
OCR
Auto content recognition (supplier, articles, costs, taxes, payment terms)
Define approval workflow
Allow notes
Allow questions to other users (reference tasks and or media messages)
Allow to add additional documents
Allow PDF modifcation (allow notes on pdf, approval stamps) **difficult**
> This requires a JS live preview for adding this at a specific position (maybe PDFJSAnnotate, maybe customize pdf.js)
Job/Schedule which checks unhandled invoices
Hooks/Workflows for invoices |
-| | | **Quality Management**
Create quality issue (for account, article, other?)
Define workflow based on report type?
Statistics????
Export list to excel
Export based on filter to pdf
Expand GSD Exchange importer *a lot of work* (SD specific) |
+| | | **Quality Management**
Create quality issue (for account, article, other?)
Define workflow based on report type?
Statistics????
Export list to excel
Export based on filter to pdf
Expand GSD Exchange importer *a lot of work* *(SD specific)* |
| | | **Workflow** (implement some scripts)
Remove article (SD specific). How to handle data (custom database table?)
Create article (SD specific). How to handle data (custom database table?) |
| | | **Customer Management** (SD specific)
Expand GSD Exchange importer to also import customer files from CRM (files, emails)
Expand GSD Exchange importer to also import customer notes (notes, visitor reports) |
| | | **Sales**
Create easy way to create quick visitor reports (= maybe use notes for this with a type 'visit')
Allow to create visitor report on cell phone by using location matching (geolocation)
Analyze reports per sales rep (e.g. use filter for export?) |
-| | | **Item Management**
Names
Base data
Media files
Expand GSD Exchange importer to also import articles (SD specific) |
-| | | **Billing** (only data for upcoming modules)
Basic invoice data (no stock movement)
Expand GSD Exchange importer to bills as well (SD specific)
Bill expenses such as insurance, freight, etc. also need VAT percentages. Best would be to create cost types, this would allow to add multiple freight expenses and print them below the invoice
Show invoice pdf in preview on change
Save number-format and the rendered number in the bill, currently only the format is saved and rendered on the fly which is bad for searching and performance. Maybe even ONLY save the number?
Save original net value and discounted net value (currently only discounted net value is stored)
Save discounts |
+| | | **Item Management**
Names
Base data
Media files
Expand GSD Exchange importer to also import articles *(SD specific)* |
+| | | **Billing** (only data for upcoming modules)
Basic invoice data (no stock movement)
Expand GSD Exchange importer to bills as well *(SD specific)*
Bill expenses such as insurance, freight, etc. also need VAT percentages. Best would be to create cost types, this would allow to add multiple freight expenses and print them below the invoice
Show invoice pdf in preview on change |
| | | **Sales**
Sales rep ranking
Individual rep sales analysis (e.g. top customers, sales by product group, lost customers, ...) |
-| | | **Customer Management**
Customer sales info/statistics (total sales, invoices, articles, groups)
Invoice pdf importer from hard drive (without using the Exchange module) (SD specific)
Create a view where you can see all bills of the customer
Create a view where you can see all items of the customer |
+| | | **Customer Management**
Customer sales info/statistics (total sales, invoices, articles, groups)
Invoice pdf importer from hard drive (without using the Exchange module) *(SD specific)*
Create a view where you can see all bills of the customer
Create a view where you can see all items of the customer |
| | | **Sales**
Sales analysis reports |
| | | **Sales Analysis** (client sales analysis)
Sales + Gross profit
Quantity orders + quantity articles
Segment sales
Top articles
Cross selling (bought as well)
Amount of invoices
Amount of different articles |
| | | **Sales Analysis** (item sales analysis)
Sales + gross profit
quantity sales, quantity customers
Cross selling
Top customers
Amount of customers
Amount of article sales
Amount of new customers
Cross selling articles |
| | | **Job**
Create job which can automatically create checklists (e.g. end of month checklists) |
| | | **Checklist**
Create module
Checklists can create tasks
Allow to define recurring date time |
-| | | **Marketing**
Create promotions (incl. basic info)
Promotion planned costs
Promotion planned earnings
Promotion assign to customers
Promotion start/end
Promotion type (somehow use for cost center)
Promotion custom fields
Promotion media files
Create events (incl. basic info)
Event planned costs
Event planned earnings
Event assign to customers
Event speaker
Event start/end
Event type (somehow use for cost center)
Event custom fields
Event media files |
+| | | **Marketing**
Create promotions (incl. basic info)
Promotion type (somehow use for cost center)
Create events (incl. basic info)
Event type (somehow use for cost center) |
| | | **Human Resource Management**
Handle staff information (encrypted)
Handle staff positions
Manage documents (encrypted)
Manage contracts (encrypted)
Manage salary (encrypted)
List of assets and documents handed over to employees (to be returned on leave) |
| | | **Item Management**
Add an area for markers (e.g. not sold for a x month, not purchased for x month, bad margin... etc.) Similar to an alarm system (maybe green, yellow, red markers?)
Consider to use name for attribute identification (currently only used for localization). Is this really required?id might be fine?
Add an area for markers (e.g. not sold for a x month, not purchased for x month, bad margin... etc.) Similar to an alarm system (maybe green, yellow, red markers?)
Create a second optional list view where the item is shown at the bottom of the list which allows the user to the the item list at the top and the item itself below. Either create a custom view or somehow append an iframe below the list which is loaded based on the selected item |
| | | **Human Resource Clocking**
Basic clocking (browser + hardware)
Hardware needs to make web requests for the chip clocking
Clocking overview for employees
Vacation / absence management for employees
Clocking overview/analysis for managers/hr
Vacation / absence overview/analysis for managers/hr
Vacation approval workflow
Clocking change approval
Export of clocking times (hr)
Export of vacations, sickness, ... (hr) |
| | | **Dashboard**
Drag&Drop element sometimes disappear on drop
Create default dashboard templates which can be used by users, changing them copies it for this user
Allow people to modify a dashboard and automatically save it / reload it
Implement a way for other modules to provide dashboard components (allow modules to register themselves in a database table) |
| | | **Billing** (additional features)
Only create pdf preview if preview is visible?
[Analysis] Gross profit (total bill and elements)
Show bill relations (on tab which shows all related bills)
Create send as email button inside the bill. this opens the send email view where the email is pre-written with the attached pdf
In the supplier and client view you should be able to select multiple bills and click print for printing
In the supplier and client view you should be able to select multiple bills and click send as email for email sending
The send bill as email should have a global settings where you can either define a global email or empty = user specific email
Sending emails should have a default email format and a default invoice naming convention, additionally there should be the option to define a user specific email text and pdf naming convention
Clients should have a invoice_email address which is stored in the client |
| | | **Billing** (full implementation)
Allow to define re/usable templates (e.g. recurring invoices)
Allow to define re/usable texts
Automatic email invoice after finishing if user wants to use that
Batch print/export invoices based on filter
Bill element sorting should have a small bar at the beginning of every element which allows the user to drag/drop the element up or down. Of course the up/down arrows which are currently implemented should remain.
Forward bills to sales rep (if bill > X EUR or specific type)
Implement approval concept for invoices and invoice elements (e.g. price, tax, margin etc.). The problem is that different changes may require different responsible people to approve this, this means you would need some indication which shows which approval is still outstanding. Of course a less detailed visual indication would be a red, yellow, green marker at the beginning of the invoice/element or background highlight
Allow to import existing bills (e.g. order -> invoice, offer -> confirmation -> delivery note ...)
Share media files between imported bills for easier searching. Maybe do this by creating a root element which all bills reference and show files of this root bill?
Show list for recommended purchase items + type tags e.g. re-order because empty, cross selling, promotion (if promotion already used, don't offer any longer) |
-| | | **Warehouse Management**
Implement stock GSD stock importer |
+| | | **Warehouse Management**
Implement stock GSD stock importer *(SD specific)* |
| | | **Purchasing**
Create item list for purchasing |
-| | | **Accounting**
Implement GSD accounting importer
Print receivable of customer (also allow to do this from the client view in the Client Management) |
+| | | **Accounting**
Implement GSD accounting importer *(SD specific)*
Print receivable of customer (also allow to do this from the client view in the Client Management) |
| | | **Client Management** (additional feature implementation)
Add list for top articles on profile page... important for customer calls
Add list for recommended purchase items + type tags e.g. re-order because empty, cross selling, promotion (if promotion already used, don't offer any longer)
Create a simple button to send an email to a customer, this also should have the option to change the mail address (e.g. drop down with all available email addresses and option to manually write it)
Add a geo map of the customers location (either on a real map or on the already added SVG maps) |
| | | **Client Management** (nice to have)
Create a map of all customers (maybe as data points or as heat maps)
Create a map of sales (maybe as data points or as heat maps)
Create default letter Doc (with/without letter head)
Make customers only visible/readable to authorized people (e.g. sales rep may only see his own clients)
Client view should be customizable since different groups have different interests and read permissions (e.g. sales reps, finance, etc.)
Allow to specify the accounting account (e.g. a customer who is a supplier may have the same account) |
| | | **Accounting Analysis**
Create different P&L structures
Create different balance structures
Create cash analysis structure
Create asset/depreciation structure
Create comparison feature for the above mentioned structures (budget, IFRS, ...) |
#### Archived
-| Deadline | Done | Task |
-| -------- | ---- | ---- |
-| | | |
+| Deadline | Done | Task |
+| -------- | ---------- | ------------------------------------------------------------ |
+| | 2021.11.14 | **Admin**
Implement password reset
Implement email sending
Implement global email server definition |
+| | 2021.11.14 | **Customer Management**
Add note types (e.g. phone, email, meeting, ...). Maybe similar to MediaType? |
+| | 2021.11.14 | **Job**
Created a job which runs exchange scripts
Create jobs |
+| | 2021.11.15 | **System**
Implement maintenance mode where no one can edit anything. |
+| | 2021.11.15 | **System**
*Duplicate:* Implement API only mode for modules, which disables UI interaction with a module completely (no navigation, no templates, ...) *solved with the navigation module settings incl. disabling routes* |
+| | 2021.11.16 | **ContractManagement**
Create a new media type "contract" |
+| | 2021.11.19 | **ContractManagement**
Contracts can have a different date of expiration and last renewal. (e.g. renewal needs to happen 1 month before contract end)
Define custom info deadline (global and optionally for a single contract)
Contracts can be assigned to a unit. |
+| | 2021.11.19 | **Billing**
Save original net value and discounted net value (currently only discounted net value is stored)
Save discounts |
+| | 2021.11.20 | **Media**
Create custom media types (e.g. contract) with l11n text/description
Create admin setting for handling media_type specifications |
+| | 2021.11.20 | **Billing**
Save number-format and the rendered number in the bill, currently only the format is saved and rendered on the fly which is bad for searching and performance. Maybe even ONLY save the number? |
## Todos
@@ -120,25 +129,24 @@ Todos/tasks which are not important enough to be part of the milestones.
| Priority | Done | Task |
| -------- | ---- | ------------------------------------------------------------ |
-| high | | **Email**
Continue implementation of email sending and receiving. Especially receiving needs much more work. |
-| high | | **Media**
Allow to overwrite files on upload. |
| high | | **Search**
Implement a tag search hook which finds content based on tags
Implement module specific search (e.g. :tasks title ...)
Implement global search hook (every module performs a search based on the search)
Create a api search filter which allows to search in a specific module only (e.g. in the shop app only search the shop, in the QA app only search in QA) |
| high | | **UI input**
In the AdvancedInput, implement predefined values (e.g. predefined/default tags)
In the AdvancedInput, implement mandatory predefined values (e.g. tags which cannot be deleted)
Implement AdvancedSelect (with auto filtering, none-element, multi-select, default-selects, must-have selects)
 |
| high | | **UI change**
Find a way to load a different page after a successful form result (e.g. reload account creation page) |
| high | | **Table**
Implement drag sortable table rows (https://htmldom.dev/drag-and-drop-table-row/). Implement the same concept for other elements, maybe abstract it straight away! |
| high | | **Table**
Implement export (local=visible data, external=all data)
Implement filtering (local=visible data, external=all data)
Highlight filtering of the filtered columns |
| high | | **Forms**
On change highlight the data/element that got changed
Invalid API responses should undo the UI changes
Removing a form from the DOM should unbind it
Adding a template to the DOM should modify its id/generate a custom/random id for the added element
Add/bind UI elements after adding them to the DOM
Consider to allow multiple/different add buttons which behave a little bit different
If a form has unsaved content the browser should ask if the user really wants to change the page or close it ("beforeunload"-Event) |
+| medium | | **Logs**
Immediately send errors also via email to the admin/server email address if it is configured that way. |
+| medium | | **Registration**
Allow users to register by themselves
Send a email after creating a profile/self-registration with login information |
| medium | | **Url format**
Change the url format in most modules from query parameter to path (e.g. /module/profile?id=Admin to /module/Admin/profile) |
| medium | | **Modules**
Many models would benefit from unit and app association. Sometimes models should only be available/associated with a specific unit (e.g. news article for website, backend, shop etc.) |
-| | | **DataMapper**
The ::with() function uses blacklisting it should be changed to whitelisting for relations |
+| medium | | **DataMapper**
The ::with() function uses blacklisting it should be changed to whitelisting for relations |
| medium | | **DataMapper**
This is useful for Item profile, Customer profile, Supplier profile etc. Alternatively find a way to implement it in `::withConditionals` ?! Or do we need a new function `::withParameters('memberName/columnName`?', [options]). Or just a `::with()` function which we also need to specify for the future for which relations need to be loaded at all e.g. `::with('files', ['limit' => 5, 'sortBy' => 'createdAt', 'sortOrder' => 'ASC'], [Client::class])` I think the ::with(...) makes the most sense. Maybe this can also be combined with the withConditional. This way we can remove/merge withConditional. There is one problem, maybe we need a `::onlyWith` function, because we don't want to load all relations |
| medium | | **ActionManager**
Implement listeners for child elements if the selector is specified |
| medium | | **Action**
Create a action which adds/removes DOM elements
Log DOM changes to the user |
-| medium | | **Unit tests**
All Modules/\*\*/Models/\*, Modules/Controller/\* |
| medium | | **Modules**
Find a way to handle optional modules (e.g. comment module in the news module) in the past the Mapper was modified (comments were removed) if the comment module was installed. Somehow this is no longer available but maybe another solution could be a different Mapper which is replaced if the comment module is installed. But instead of replacing a complete file, a diff should be generated between the files and the ADDED lines should be merged. How to handle uninstall because here it doesn't work? I would need to know exactly what to remove. |
| medium | | **DataMapper**
In the DataMapper implement iterable fetch. Currently all models are returned in one go, additionally an iterator should be returned for iterable access in case of MANY results (e.g. Exchange module) |
+| low | | **Email**
Continue implementation of email sending and receiving. |
| low | | **ER diagrams**
Checklist
Contact
DatabaseEditor
Draw
Messages
Monitoring
Shop |
-| low | | **Code cleanup**
Many modules still have unnecessary getters/setters. This should be replaced with puplic members. Check the Developer-Guide on when to use getters/setters. |
| low | | **UI tabs**
[Template] Fix tab indices's. On many pages the tab indices's are broken (tabs, table/list, links, forms) |
| low | | **Surveys**
Currently the demo (demoSetup/\*) only uses one language (en). Generate surveys with multiple langauges similar to other module demos (e.g. Wiki, News). In that case also prefix the text with the language so it's easy to see which language is loaded e.g. `EN:` (like in the tag module demo)
Consider to add a closing paragrah. The description comes at the end, but maybe a paragraph at the end of the survey should be added?! |
| low | | **Modules**
The modules use the module name for identification in many places where the module id should be used for performance reasons |
@@ -177,12 +185,12 @@ Todos/tasks which are not important enough to be part of the milestones.
| low | | **Kanban**
Implement card status (archive, public, inactive)
Implement unread cards/comments notification/highlight
Highlight card with new comments (e.g. make comment count background red?)
Consider to replace card comments with normal comments from the Comments module |
| low | | **Knowledgebase**
Implement category create/edit view
Implement doc create/edit view (similar to news/editor)
Add category back/up button when in a subcategory |
| low | | **Monitoring**
Implement integrity check based on installed version and remote hash list (see monitoring-security.tpl.php) |
-| low | | **Messages**
Implement email sending/receiving
Implement internal message/conversion storage |
+| low | | **Messages**
Implement email sending/receiving
Implement internal message/conversion storage
Implement global messaging to users/groups in the app as notification. Allow to define which users and or groups to message, also define multiple localization if needed. Allow to create template messages (e.g. Server is going into maintenance in X minutes) |
| low | | **Organigram**
Create better organigram (better grouping, maybe as SVG)
Make the organigram printable
Make the organigram versioned/approved (e.g. for ISO) |
| low | | **Profile**
Define a default image for new profiles. However, don't create a new media file whenever a new profile is created but instead define one global image which than is loaded for all profiles which don't have a custom image. This makes it easy to replace the default image for all existing profiles and saves a lot of space. |
| low | | **Quality Assurance** |
-| low | | **QA**
Implement voting
Implement accepting answers
Implement question create view
Add question answer component/like comment in question
Make votes contain for who the vote is, this way the vote score sum for accounts is MUCH easier and faster
Create different QA Apps (check out WikiApp)
Make Questions QA App specific (check out WikiDoc)
Create QA app with login |
-| low | | **Supplier**
Create a view where you can see all bills of the supplier
Create a view where you can see all items of the supplier
[Notes] Add note types (e.g. phone, email, meeting, ...)
[Doc] Create default letter Doc (with/without letter head)
[Payable] Print payable
[Analysis] Purchase EUR + gross profit
[Analysis] Quantity order, quantity articles
[Analysis] Segment purchase
[Analysis] Top articles
[Analysis] Cross selling
Allow to specify the accounting account (e.g. a customer who is a supplier may have the same account) |
+| low | | **QA**
Implement voting
Implement accepting answers
Implement question create view
Add question answer component/like comment in question
Make votes contain for who the vote is, this way the vote score sum for accounts is MUCH easier and faster
Create QA app with login |
+| low | | **Supplier**
Create a view where you can see all bills of the supplier
Create a view where you can see all items of the supplier
[Doc] Create default letter Doc (with/without letter head)
[Payable] Print payable
[Analysis] Purchase EUR + gross profit
[Analysis] Quantity order, quantity articles
[Analysis] Segment purchase
[Analysis] Top articles
[Analysis] Cross selling
Allow to specify the accounting account (e.g. a customer who is a supplier may have the same account) |
| low | | **Tasks**
[Analyzer] Implement analyzing functionality (tasks created, answered, time required to finish task, always in time?)
Instead of hiding (or as an additional type) tasks created from other modules (e.g. support) make them link to the UI where it can be handled (e.g. ticket)
Make answer box on the right scroll down with the content, this way you can immediately respond without scrolling.
Attach custom event, if status is changed (e.g. trigger checklist event). Maybe don't do it, maybe other modules should instead check the status of the task!!!
Implement email notification on progress/changes (new task, forwarded, ...)
The unread task count is currently not really correct and needs to be fixed
Allow batch handling of tasks in the dashboard/overview for faster interaction (e.g. select and close)
Create a user calender for tasks which only shows when tasks are due
Don't show Tasks in dashboard which are far into the future, maybe create another list for this?
Implement has seen and unseen (use system where every task has a seen flag for a user if it is seen) |
| low | | **Calendar**
Load events back to a fixed amount of months (e.g. current month, previous month and next month)
Implement event popup in the UI on click
Create different interval templates (year, quarter, month, week, day)
Allow user to define the start of the week (e.g. Sunday, Monday)
Implement gantt chart
Create iCal parser/reader and builder
Create database, models and mappers |
| low | | **CMS**
Make file content view 100% container height
Allow content changes and saving
Ideas for applications based on modules (e.g. monitor/log dashboard, sales dashboard, calendar, support/ticket, clocking, Q&A, Wiki, shop)
Implement line numbers in code view
Implement code formatting / syntax highlighting
Allow different content types (e.g. pages, posts, ...) with individual templates |
@@ -199,8 +207,8 @@ Todos/tasks which are not important enough to be part of the milestones.
| low | | **Billing**
Costs such as shipping, insurance etc. should not be hard coded but customizable costs stored in a separate table. |
| low | | **Demo setup - Support**
Use default values for ticket attribute types in some cases instead of always using custom values |
| low | | **Update**
Create update logic for application, resources, modules, ... in the Admin/ApiController (`apiCheckForUpdates`) |
-| low | | **Billing**
Create setting for bill format per bill type (e.g. invoice, order, ...). |
-| low | | **Biling**
The bill archive should store the customer/supplier localized version since this is the official document. |
+| low | | **Billing**
Create setting for bill format per bill type (e.g. invoice, order, ...). NO! This should be handled with the different bill types! The bill types should also have a format defined and a default template. |
+| low | | **Billing**
The bill archive should store the customer/supplier localized version since this is the official document. |
| low | | **Billing**
Customers and suppliers should have default invoice and delivery addresses which should be used if no other address or custom input is used. |
| low | | **Editor**
The tools above should directly insert the markdown into the textarea. |
| low | | **Kanban**
The kanban board currently assumes up to 4 columns, however there should be a layout which allows more than 4 columns. Don't use flexbox but min-width and max-width combined with a horizontal scrollable board content. |
@@ -210,13 +218,14 @@ Todos/tasks which are not important enough to be part of the milestones.
| low | | **DataMappers**
Use `Mapper::TABLE` or string names in the mappers. At the moment both can be found. This is not concise. The `Mapper::TABLE` name is preferred in case of name changes. |
| low | | **Email**
Find a way to localize some hard coded email content. Pass localization array? Manually overwrite email body if a hard coded/default message should be returned (maybe by checking for a flag/status code)? |
| low | | **Temp directory**
Consider to create a temp directory in the main directory (Orange-Management) which can be used by all modules etc. Alternatively create this temp directory in `Modules/Media/Files` |
-| low | | **Code Coverage**
Adding `pathCoverage="true"` to the PHPUnit `.xml` file for path and branch coverage causes a memory overflow. Fix it. |
#### Archived
-| Priority | Done | Task |
-| -------- | ---- | ---- |
-| | | |
+| Priority | Done | Task |
+| -------- | ---------- | ------------------------------------------------------------ |
+| medium | 2021.11.14 | **Code cleanup**
Many modules still have unnecessary getters/setters. This should be replaced with puplic members. Check the Developer-Guide on when to use getters/setters. |
+| medium | 2021.11.20 | **QA**
Make Questions QA App specific (check out WikiDoc)
Create different QA Apps (check out WikiApp) |
+| low | 2021.11.20 | **Code Coverage**
Adding `pathCoverage="true"` to the PHPUnit `.xml` file for path and branch coverage causes a memory overflow. Fix it. *Solution: Create separate .cov files and combine them. However, this will not be implemented as default due to much slower testing* |
## Features
@@ -227,6 +236,7 @@ Features to be implemented at a later stage *nice to haves*.
| Priority | Done | Task |
| -------- | ---- | ------------------------------------------------------------ |
| medium | | **Editor**
Create immediate text preview similar to a rich text editor or Typora. |
+| medium | | **Admin**
Create a view where it's possible to create/activate, change and delete/deactivate hooks for events. |
| low | | **Editor**
Create special markdown content (calendar, chart, task, news, comment, media, ...)
Allow download as markdown, text, PDF, word
Implement versioning. |
| low | | **Event Management**
Implement goal definition. Goals could be based on tasks (every completed task represents x%), linear time line (every day represents x%), value based (a calculated value represents x%), manual input based (the user decides the completion %)
Add milestones |
| low | | **Project Management**
Implement goal definition. Goals could be based on tasks (every completed task represents x%), linear time line (every day represents x%), value based (a calculated value represents x%), manual input based (the user decides the completion %)
Add milestones |
@@ -238,19 +248,20 @@ Features to be implemented at a later stage *nice to haves*.
| low | | **Billing**
Automatically create recurring bills (invoices, delivery notes, etc.) if a customer wants to receive items automatically |
| low | | **Media**
Create preview option for images (e.g. ctrl+mouse hover or a different "list-view" like in explorer)
Validate file size on the frontend before uploading
Automatically change the file encoding of text files
Enable image interlacing (in the past there was a bug)
Implement media encryption/decryption (optionally)
Implement media password protection for read (optionally)
Implement resumable uploads
Implement path changes in the frontend
Allow the modification of collections
Implement external resources (URLs, dropbox, aws, ...)
Allow to edit the breadcrumbs, which replaces them with a text field which can be changed then than automatically loads the new path
Implement temporary file storage (very useful for making files downloadable for a limited time). Maybe create a new temp file directory or database collection where a available_until timedate gets defined (must be handled in the database). The biggest problem is how to delete them, this requires a background process/task scheduler. Additionally, these files must have permissions because they may be only for one user or a group of users. |
| low | | **Messages**
Allow to transform a message as task
Implement push notification
Users may be invited to old conversations |
-| low | | **Navigation**
Improve goto command to match based on proximity and only based on visible links
Consider to create on navigation language file (same as routing files) during the installation process
Create settings page which allows to modify the navigation in the module settings
Consider to implement tabs in the side bar
Consider to implement child elements on hover (sidebar and content) |
+| low | | **Navigation**
Improve goto command to match based on proximity and only based on visible links
Consider to create on navigation language file (same as routing files) during the installation process
Create settings page which allows to modify the navigation in the module settings
Consider to implement child elements on hover (sidebar and content) |
| low | | **News**
Implement email/message notification on create |
| low | | **Profile**
Find a way to hide some contact/address information for some modules. Some information are only meant for specific modules (e.g. private address, phone number e.g. HR module) The reason why this is difficult is that this information should not be part of the model table but in the relation (many-to-many). At the moment the information in the relation table is not used apart from the relations it self. A solution could be to specify a filter in the relation in the mapper. Empty = all relations, filter = only populate the model array with relations which match the filter. |
| low | | **Support**
Allow support/tickets to be transformed to Q&A question and answers
Allow Q&A to be transformed to support
Create support app with login
TicketAttributeTypes should specify which datatype they expect. The ApiController needs to validate if a value can be created for an attribute type (check validation pattern, datatype, is required) |
-| low | | **Tag**
Create settings with a set of default colors
Create a hook which gets triggered if a group is created. This hook also creates a tag |
+| low | | **Tag**
Create settings with a set of default colors |
| low | | **Settings**
Implement a setting which lets users see all content no matter the content language (e.g. all News) |
| low | | **Templates, Controllers, Views and Models**
Allow custom templates, controllers, views and models, which don't get replaced during updates (e.g. for ItemManagement, CustomerManagement, HR, ...). These should be stored in a directory called `Customized` in the parent directories *Controller*, *Themes*, *Views* and *Models*. Whenever a custom controller is uploaded/changed the routes of all the applications need to be checked and adjusted. |
#### Archived
-| Priority | Done | Task |
-| -------- | ---- | ---- |
-| | | |
+| Priority | Done | Task |
+| -------- | ---------- | ------------------------------------------------------------ |
+| low | 2021.11.15 | **Tag**
*Not implemented:* Create a hook which gets triggered if a group is created. This hook also creates a tag. *Tags and groups are very different, this actually is a bad idea* |
+| low | 2021.11.20 | **Navigation**
Consider to implement tabs in the side bar. *Decision: No! There are already too many menus/tabs. This becomes too complicated/confusing.* |
## Bugs
@@ -260,7 +271,6 @@ Features to be implemented at a later stage *nice to haves*.
| -------- | ---- | ------------------------------------------------------------ |
| high | | **DataMapper**
In some cases the array is required in the `::withConditional()` function. This seems to be the case if a model doesn't have the condition but a sub-model has it. The mapper should simply not use the conditional if it doesn't exist in the mapper (see `ItemManagement::BackendController` or `ClientManagement::BackendController` with the BillMapper, this is a stupid fix) |
| medium | | **Human Resource Management**
Fix employee list (see comment at the bottom, query builder bug) |
-| low | | **FileLogger**
The logger is somehow *sometimes* logging in the main directory of OMS. Why? Debug it! |
| low | | **KMeans**
In some weird cases the Cluster test fails. This happens approximately 5 / 100 test runs (invalid center coordinate value) |
| low | | **Dashboard**
Why does admin not have a dashobard? Everyone should have it! |
| low | | **Table**
The table overflow was fixed with putting them in a scrollable container (in the portlet). This broke the `.sticky` head, since the table no longer knows the head is out of view. Since it's in an overflow container it doesn't know about its changed scroll position. If this cannot be solved don't revert back because overflowing tables are much worse! |
@@ -268,9 +278,9 @@ Features to be implemented at a later stage *nice to haves*.
#### Archived
-| Priority | Done | Task |
-| -------- | ---- | ---- |
-| | | |
+| Priority | Done | Task |
+| -------- | ---------- | ------------------------------------------------------------ |
+| low | 2021.11.14 | **FileLogger**
The logger is somehow *sometimes* logging in the main directory of OMS. Why? Debug it! |
### Details
@@ -319,7 +329,7 @@ Drafts, concepts & ideas which are more complex or require more explanation.
Steps:
1. Turn into image if it isn't image
-2. Modify image (grayscale, remove noice, thresholding, dilate, erode, opening/morphology, canny, skew correction/deskew, rotate e.g. upside down or slanted)
+2. Modify image (grayscale, remove noise, thresholding, dilate, erode, opening/morphology, canny, skew correction/deskew, rotate e.g. upside down or slanted)
3. Extract text (maintain layout)
4. Get all suppliers and match against invoice (find name, alternatively try `invoice match_code`)
5. Has supplier template defined? Find custom areas. Sometimes a page 2 template must be defined if the second page looks different.
@@ -336,8 +346,8 @@ Steps:
Software:
-1. Tessaract + OpenCV + above mentioned steps
-2. Some Api (e.g. gogle vision ai, amazon textract, amazon rekognition)
+1. Tesseract + OpenCV + above mentioned steps
+2. Some Api (e.g. google vision ai, amazon textract, amazon recognition)
### Database permission handling
@@ -479,14 +489,78 @@ class TestMapper extends DataMapperFactory
#### New
-*
+##### Framework
+
+* Sending basic emails with `mail`, `sendmail` and `SMTP` is possible
+* Sending signed emails is possible.
+* Reading and creating mailboxes with `IMAP` is possible
+* Reading mailboxes with `POP3` is possible
+
+##### Frontend
+
+* Frontend messages can be manually closed with a close button (x)
+* Frontend messages can be defined sticky
+* Frontend messages may omit the title
+
+##### Admin
+
+* Implemented basic server/admin email settings
+* Implemented password reset with reset emails
+* Implemented read-only/maintenance mode (configurable in the `Admin` settings)
+
+##### Billing
+
+* Bill can have notes (very helpful for additional remarks later on e.g. from accounting/sales/purchasing)
+* Bills have net/gross profit, sales, costs and discount as unnormalized values
+* Bills store the bill number and the number format in the model
+
+##### ContractManagement
+
+* Create a new media type "contract" during installation
+* Contracts can have a renewal time in months set when the contract renewal must be done (latest).
+* Contracts can have a flag which indicates if the contract auto renews.
+* Added a global warning deadline until when users are informed before the renewal deadline runs out.
+* Contracts can be assigned to a unit.
+
+##### Editor
+
+* Implemented editor doc types (similar to media types)
+
+##### EventManagement
+
+* Events have planned and actual costs/earnings.
+* Accounts can be assigned to events with different purposes.
+* Events can have attributes (incl. default attributes)
+
+##### Job
+
+* Jobs can be created in the Job module
+* Created three jobs which run `monthly`, `weekly` and `daily` and execute some default tasks (e.g. email error logs to admin). These also have placeholders to run additional tasks (e.g. run exchange scripts)
+
+##### Marketing
+
+* Promotions have planned and actual costs/earnings.
+* Accounts can be assigned to promotions with different purposes.
+* Promotions can have attributes (incl. default attributes)
+
+##### ProjectManagement
+
+* Projects have planned and actual costs/earnings
+* Projects can have attributes (incl. default attributes)
#### Bug fixes
-*
+* Fixed a bug where the tests created a log file in the main directory
+* Fixed a bug where changing headers during the rendering process would conflict with already sent header information in the `WebApplication`. The response is now rendered independently, without sending it (first render data, then push the headers, then send the response).
+
+##### QA
+
+* Fixed a bug where the question and answer content where shorter than the score content on the side resulting in portlets without background color.
#### Other
+* Removed many unnecessary getters and setters
+
##### Tests
-*
+* The overall code coverage improved to 91.8% (mid of November, this will go down as now additional functionality will be implemented)
diff --git a/Strategy/Business Plan.md b/Strategy/Business Plan.md
index b928a48..f3c99c8 100644
--- a/Strategy/Business Plan.md
+++ b/Strategy/Business Plan.md
@@ -1,16 +1,16 @@
-# Executive Summary
+# Business Plan
-# Organization
+## Organization
The Orange Management organization is located in Germany and founded in November 2015 by Dennis Eichhorn for developing the Orange Management application and sub-components which incorporates solutions such as CRM, SRM, CMS, ERP, Shop and many more.
The main goal of the organization is to create solutions for companies and organizations of all sizes which allow them to seamless manage their operations from one application.
-## SWOT
+### SWOT
-### Strengths
+#### Strengths
-#### From Customer PoV
+##### From Customer PoV
* Everything in one application. Organizations and businesses no longer have to use multiple services from different providers and potentially integrate them into their existing applications
* Cheap for the customer compared to many other solutions
@@ -23,7 +23,7 @@ The main goal of the organization is to create solutions for companies and organ
* Regular updates. Either manually or automatically
* Large amount of modules and functionality
-#### Technical PoV
+##### Technical PoV
* Modular structure is designed in a very scalable way
* Multiple database support (mssql, mysql, postgresql)
@@ -31,51 +31,51 @@ The main goal of the organization is to create solutions for companies and organ
* Easily scalable
* Can be split across multiple servers
-### Weaknesses
+#### Weaknesses
-#### From Customer PoV
+##### From Customer PoV
* Installation for non-tech people is "difficult" (not the actual app installation but the WAMP or LAMP installation)
-#### Technical PoV
+##### Technical PoV
* Request based code execution. Database and cache connection is request based and not persistent etc. therefor slower and more complicated to maintain state
* Concurrency is difficult to solve due to the request based code execution and state storage
-### Opportunities
+#### Opportunities
* Continuous digitalization, automation and need to keep up with it
* Price attractiveness for all sizes of organizations and businesses
* Public free software tests (without registration)
* Growing demand for managing data (also for small businesses)
-#### Technical PoV
+##### Technical PoV
* Programming language performance improvement through parallelization/asynchronism implementation
* Programming language performance improvement through usage of type hints during compilation
* Switch to a different language (e.g. c, c++, c#) for higher perform, parallelization and state
-### Threats
+#### Threats
-#### External
+##### External
* Regulations. There are many different regulations for different regions and business fields that must be upheld
* Small customers still want to own software and not rent it and pay for it every year
* Since software is intangible it is generally attributed with a lower value than tangible assets
* Like for every programming language the general support for the language (updates, bug fixes, improvements)
-#### Internal
+##### Internal
* Own organization size/workload. A large amount of modules and tools are required to reach the critical size to make a product which is beneficial for a large amount of organizations and businesses
-## Strategy & Vision
+### Strategy & Vision
-### Vision
+#### Vision
* **Early:** Orange Management solutions are used by at least 1.000 organizations/businesses in 2025
* **Late:** Orange Management is one of the industry standard solution provider for organizations and businesses
-#### Goal
+##### Goal
1. Focus on the solution of the problem
2. Financially attractiveness for as many end-users as possible
@@ -84,7 +84,7 @@ The main goal of the organization is to create solutions for companies and organ
5. Accessible for everyone (desktop, tablet, phone, for disabled people, online/offline)
6. Fast user interface feedback and good performance
-#### How To Achieve?
+##### How To Achieve?
1. Use it during development incl. user feedback
2. Modular system and fair pricing
@@ -93,11 +93,11 @@ The main goal of the organization is to create solutions for companies and organ
5. Put the user experience above ease of implementation
6. Specialized software implementations instead of generalized solutions.
-### Strategy
+#### Strategy
-#### Initial Phase
+##### Initial Phase
-##### Customer
+###### Customer
In the beginning the goal is to reach a large amount of organizations no matter the size. As it is easier to address smaller organizations since they usually are less invested in existing software solutions they will be the initial target group. For them no customization will be done unless they can be integrated for everyone.
@@ -152,9 +152,9 @@ Recommended modules for businesses are:
With these modules almost every small business could operate. Smart advertisements could help to sell extending modules such as charting, balancing, cost center accounting, cost object accounting, warehousing etc.
-# Products & Services
+## Products & Services
-## Products
+### Products
Key solutions (consisting of multiple modules) which must be available are:
@@ -167,7 +167,7 @@ Key solutions (consisting of multiple modules) which must be available are:
* BI
* Office
-## Services
+### Services
Key services that should be implemented are:
@@ -184,9 +184,9 @@ Mid:
Late:
* Migration of existing data
-# Business Decisions
+## Business Decisions
-## Programming Language
+### Programming Language
In the following a ranking of numbers (1-10) will be used where 10 is the highest and 1 the lowest value. Many of these evaluations are pure subjective and based on the personal experiences made by the organization founder.
@@ -211,7 +211,7 @@ The decision why Orange Management decided to use PHP came down to the following
1. Since the web applications are supposed to run on all sizes of organizations and businesses PHP has the advantage with availability on simple (cheap) webservers.
2. The request based code execution makes it less susceptible against errors (re-starting and monitoring the application etc.) and therefore better for non-tech people.
-# Action Plan
+## Action Plan
1. First real world tests on testing company (admin, organization, task & helper module)
2. Create reports for the helper module for the testing company