This commit is contained in:
Dennis Eichhorn 2021-09-28 19:56:35 +02:00
parent 3a0cfe0388
commit f639fcdb0a
29 changed files with 1351 additions and 488 deletions

View File

@ -1,440 +0,0 @@
General UI
- [ ] Selecting multiple elements in lists for actions
- [ ] Table sorting
- [ ] Table filtering
- [ ] Table export in excel and csv
- [ ] Loads full page on first load
- [ ] Loads only content on consecutive calls
- [ ] Loads only data on table filtering, sorting, infinite scroll, pagination
- [ ] Saves state in local storage on reboot
- [ ] Suggests to install pwa
- [ ] Hotkey focus (quickly navigate page with hotkeys)
- [ ] Accessible
- [ ] Mobile support
- [ ] Saved forms befor submit in case of session/internet issues
- [ ] Voice navigation/actions
- [ ] Push messages (global)
Admin
- [ ] Create accounts
- [ ] Create groups
- [ ] Install modules
- [ ] Update modules
- [ ] Find modules
- [ ] Download modules
- [ ] Delete modules
- [ ] Module settings
- [ ] Allow admin login with account permissions in case of account request
- [ ] Reset account password
- [ ] Allow/disallow remote login per account
Auditor
- [ ] Loggings of creates, changes, deletes (optionally also reads)
- [ ] Total logs
- [ ] Group specific logs
- [ ] Account specific logs
- [ ] Module specific logs
- [ ] All logs show the differences
- [ ] Logs by IP
Jobs
- [ ] Create and manage scheduled tasks/jobs
- [ ] Reporting failed tasks/jobs
Exchange
- [ ] Import data from other software
- [ ] Export data to other software
Organization
- [ ] Manage units
- [ ] Manage departments
- [ ] Manage positions
- [ ] Organigram
- [ ] Images for units, departments and positions
- [ ] Optional automatic group creation for units, departments and positions
Dashboard
- [ ] Default dashboards
- [ ] Group specific dashboard
- [ ] Customizable dashboards by users (e.g. elements and order)
Profile
- [ ] Handle visibility for other accounts/groups
- [ ] Show content from other modules (e.g. media module)
- [ ] Localization handling (e.g. language, units, number formats, currency, etc.)
- [ ] Profile information (e.g. mail, birthday, etc.)
- [ ] Password management
Media
- [ ] Upload media
- [ ] Pausable media upload
- [ ] Droppable upload
- [ ] Media file creation (text, image)
- [ ] Media changes (text, image)
- [ ] PDF editor (comments, highlights and simple symbols)
- [ ] File viewing (text, image, pdf, ppt, word, audio, video)
- [ ] Virtual directories / collections which can reference files virtually preventing file duplication
- [ ] Physical directories in media module
- [ ] Reference to physical directories on the server
- [ ] Account specific files (also shown in the profile of a user)
- [ ] Module specific files (also shown in the module)
- [ ] Drag and drop of already uploaded files / directories (actual moving and creating references)
- [ ] Copy, Insert, Delete (right mouse click and ctrl+c/v)
- [ ] Tags for media elements
Tasks
- [ ] Can be assigned to multiple accounts
- [ ] Can be assigned to multiple groups
- [ ] Can be CC
- [ ] Optionally editable
- [ ] Optionally visible
- [ ] Optionally none-closable (e.g. only other modules can close the task on action)
- [ ] Due date or priority
- [ ] Tags for tasks
- [ ] Media attachment
- [ ] Analysis of tasks assigned to oneself
- [ ] Analysis of tasks created (can be disabled)
- [ ] Analysis of tasks per group
- [ ] Analysis of tasks per account
- [ ] Analysis of tasks per tag
- [ ] Automatically create tasks
- [ ] Re-usable task templates can be created
- [ ] Message/email integration (can be handled via message responses)
- [ ] Optional Message/email notification
- [ ] Without connection
Ticket
- [ ] Inform users via email (also external) if wanted
- [ ] Externals can access the ticket
- [ ] Different support groups for different problems
- [ ] Priorities
- [ ] Tags for tickets
- [ ] Media attachment
- [ ] Analysis of tickets assigned to oneself
- [ ] Analysis of tickets created (can be disabled)
- [ ] Analysis of tickets per group
- [ ] Analysis of tickets per account
- [ ] Analysis of tickets per tag
- [ ] Message/email integration (can be handled via message responses)
- [ ] Optional Message/email notification
- [ ] Without connection
Calendar
- [ ] Recurring events
- [ ] Module specific calendars (e.g. tasks, events, ...)
- [ ] Automatic scheduling for shared meetings/events
- [ ] Event conflict handling
- [ ] Optional sharing of calendars (readable and editable)
- [ ] Event tagging
- [ ] Event coloring
- [ ] Room management (blocking rooms and handling room conflicts for meetings)
- [ ] Without connection
Messaging
- [ ] Emails
- [ ] Layout like emails or like conversations
- [ ] Internal messages can access other modules and show the content in the mail (e.g. media, events, ...)
- [ ] Automatic response messages (internal and external)
- [ ] Spam detection
- [ ] Asynchronus backround tasks send system messages about their status and link if applicable
- [ ] Without connection
Chat
- [ ] Single user chat
- [ ] Group chat
- [ ] Manual group chat
- [ ] Chat rooms
- [ ] Visibility by groups
- [ ] Contact list
- [ ] Internal messages can access other modules and show the content in the mail (e.g. media, events, ...)
Editor
- [ ] Create and edit files
- [ ] Sharing documents with groups and accounts
- [ ] Saving documents in a directory structure
- [ ] Tags for documents
- [ ] Drag and drop of already created files / directories (actual moving and creating references)
- [ ] Copy, Insert, Delete (right mouse click and ctrl+c/v)
- [ ] Highlight which user wrote which content
- [ ] Live colaboration
- [ ] Versioning which shows who changed what
- [ ] Multi language support
- [ ] Multi tab support
- [ ] Without connection
Draw
- [ ] Create and edit drawing
- [ ] Export as png, jpg, gif or bmp
- [ ] Without connection
Helper
- [ ] Templates as basis (= base logic) for individual helpers (e.g. reports)
- [ ] Standalone templates which don't require additional data
- [ ] Helpers which use templates (e.g. new report based on new data)
- [ ] Direct database access
- [ ] Own sqlite database for templates
- [ ] Multi-language support
- [ ] Export as print, pdf, word, ppt, csv possible
- [ ] Tags for helper/templates
News
- [ ] Create and edit news
- [ ] Links as "news" for information sharing
- [ ] Tags for news
- [ ] Optionally tagging news as featured
- [ ] Timed news releases
- [ ] Comment integration
- [ ] Without connection
- [ ] Optional Message/email notification
Navigation
- [ ] Multi language
- [ ] Manual links/endpoint definition
- [ ] Renaming links
Billing
- [ ] Re-usable templates
- [ ] Re-usable texts
- [ ] Types (offer, order confirmation, calculation, delivery note, proforma invoice, invoice, monthly invoice, advance invoice, partial invoice, credit note, invoice correction)
- [ ] Creating invoices from existing invoices
- [ ] Warning for unusual articles for a customer
- [ ] Automatic (best) price selection for customer/article (quantity, customer, association, promotion)
- [ ] Automatic emailing
- [ ] Output as pdf, excel, word
- [ ] Saving pdf in journal
- [ ] Approval workflow for price changes
- [ ] Approval workflow for credit limits/new customers
- [ ] Approval workflow for invoice check (4 eye principle)
- [ ] Attaching additional information and documents
- [ ] Creating a collection of all invoices which belong together
- [ ] Invoices can reference other invoices
Purchasing
- [ ] Re-usable templates
- [ ] Re-usable texts
- [ ] Types (order, offer, order confirmation, calculation, delivery note, proforma invoice, invoice, monthly invoice, advance invoice, partial invoice, credit note, invoice correction)
- [ ] Creating invoices from existing invoices
- [ ] Warning for unusual articles from a supplier
- [ ] Automatic (best) price selection for customer/article (quantity, customer, association, promotion)
- [ ] Automatic emailing
- [ ] Output as pdf, excel, word
- [ ] Saving pdf in journal
- [ ] Approval workflow for price changes
- [ ] Approval workflow for credit limits/new customers
- [ ] Approval workflow for invoice check (4 eye principle)
- [ ] Attaching additional information and documents
- [ ] Creating a collection of all invoices which belong together
- [ ] Invoices can reference other invoices
Warehousing
- [ ] Article locations
- [ ] Article locations based on lot numbers
- [ ] Label printing incl. datamatrix/bar/qr code
- [ ] Stock bookings (move from one location to another)
- [ ] Stock adjustments (e.g. found item, removed item with multiple reasons)
Shipping
- [ ]
Stock Taking
- [ ] Generate counting lists (electronic and printable)
- [ ]
ClientManagement
- [ ]
SupplierManagement
- [ ]
Accounting
- [ ] Multiple environments (e.g. GAAP, IFRS)
- [ ] Stock evaluation
- [ ] Doubtful accounts (single and general)
- [ ] Automatic accounts payable/receivable asset/liability swap
- [ ] Timed bookings (e.g. accrual resolution)
- [ ] Booking templates
- [ ] Lockable periods
- [ ] Monthly closing
- [ ] Annual closing
- [ ] Custom fiscal year
P&L
- [ ]
Balance
- [ ]
AssetManagement
- [ ]
Reporting
- [ ]
Budgeting
- [ ]
RiskManagement
- [ ]
Cashflow
- [ ]
Profitcenter
- [ ]
Presentation
- [ ]
Spreadsheet
- [ ]
Survey
- [ ] Survey templates
- [ ] Survey categories
- [ ] Multiple choice
- [ ] Input (text, drop down)
- [ ] Task integration
- [ ] Publish date
- [ ] Public / private results
- [ ] Analsis (response rate, time until completion, responses for different answers, email responses)
- [ ] Message/email integration (can be handled via message responses)
- [ ] Optional Message/email notification
- [ ] Tags for surveys
- [ ] Without connection
Workflows
- [ ] Re-usable template workflows
- [ ] User generated workflows (not programming required)
- [ ] Tags for workflows
Kanban
- [ ] Tags for boards
- [ ] Tags for cards
- [ ] Task integration
- [ ] Event integration
- [ ] Project integration
- [ ] Calendar integration
- [ ] Message integration (everythin is also a message and messages can be linked)
Comments
- [ ] Comment managing
- [ ] Respond to other comments
QA
- [ ] Tags for QA
Knowledgebase
- [ ] Different wikis
- [ ] Tags for wikis
ProjectManagement
- [ ] Project calendar
- [ ] Tags for projects
- [ ] Kanban integration
EventManagement
- [ ] Event calendar
- [ ] Tags for events
Chart
- [ ] Bar chart
- [ ] Bar chart stacked
- [ ] Column chart
- [ ] Column chart stacked
- [ ] Line chart
- [ ] Area chart
- [ ] Area chart stacked
- [ ] Calendar heat map
- [ ] Gantt chart
- [ ] BCG matrix
- [ ] Scatter chart
- [ ] Mixed charts (e.g. bar+line)
- [ ] Pie chart
- [ ] Donut chart
- [ ] Gouge chart
- [ ] Pyramid chart
- [ ] Candlestick chart
- [ ] Radar chart
- [ ] Waterfall chart
- [ ] Bridge chart
- [ ] Venn diagram
- [ ] Tree
- [ ] Flow chart
- [ ] Tree map
- [ ] Node/Cluster diagram
- [ ] Tags for charts
Checklist
- [ ] Re-usable checklist templates
- [ ] Automatlically create tasks
- [ ] Track checklist completion based on tasks
- [ ] Tags for checklists
- [ ] Automatically create checklists
DBEditor
- [ ] Read the database
- [ ] Create and edit database queries which can be saved for future reference
- [ ] Export results as excel, csv or json
- [ ] Tags for database queries
Search
- [ ] Global internal search
- [ ] Search within modules
- [ ] Search within tables on current page
- [ ] Search within accounts or groups
- [ ] External search
Tag
- [ ] Multi language
- [ ] Account specific tags
- [ ] Global tags
- [ ] Colored
- [ ] Merge tags (= combine multiple tags as one tag)
CMS
- [ ] Upload, create, edit, delete all files in an application
- [ ] Navigation handling
- [ ] Localization handling
- [ ] Permission handling
- [ ] Content handling
- [ ] Default themes
AppBuilder
- [ ] Build apps / themes (uses json format)
Banking
- [ ] EBICS transfers
HumanResourceManagement
- [ ]
HumanResourceTimeManagement
- [ ] Online time recording
- [ ] Terminal time recording with bar/qr codes
- [ ] Terminal time recording with RFID
- [ ] Terminal time recording with id+pin
- [ ] Customizable time types
- [ ] Weekly overview
- [ ] Monthly overview
- [ ] Annual overview
- [ ] Statistics (worked, sick, overtime, late, ... for unit, department and employees)
- [ ] Showing present & missing employees (= status)
- [ ] Defining business hours per unit, group, department, employee
- [ ] Vacation tracking
- [ ] Vacation request
- [ ] Time correction request
Raspberry pi project
- [ ] Light sensor
- [ ] Humidity sensor
- [ ] Water sensor
- [ ] Camera
- [ ] RFID
- [ ] KeyPad
- [ ] Fingerprint sensor
- [ ] Touchscreen
- [ ] Magnetic switch
- [ ] Gas Sensor
- [ ] Moisture sensor
- [ ] Temperature sensor
- [ ] Touch display

View File

@ -1,10 +0,0 @@
## Sales
1. Print invoices based on filter (array of invoices)
2. Make invoices only printable after they got checked (by a different person) (Optional)
3. Client click opens accordion with client data
## Navigation
1. Maybe make sidebar tabbed 3-4 tabs at the top?
2. Allow child elements on hover (for content navigation only?!)
3. Mark links as dynamic request

View File

@ -32,7 +32,7 @@
* 1003200000 - OMS Supplier Management
* 1003300000 - OMS Tools
* 1003400000 - OMS MyPrivate
* 1003500000 -
* 1003500000 -
* 1003600000 - OMS Checklist
* 1003700000 - OMS Address
* 1003800000 - OMS Contact
@ -73,3 +73,7 @@
* 1007300000 - OMS CLM
* 1007400000 - OMS DatabaseEditor
* 1007500000 - OMS Tag
* 1007600000 - OMS Search
* 1007700000 - OMS Shop
* 1007800000 - OMS CMS
* 1007900000 - OMS ContractManagement

View File

@ -2,7 +2,9 @@
## Schütz Dental GmbH
* Details: Only the phpOMS framework (used in the QuickDashboard)
* Version: Pre-Alpha
* Duration: unlimited
* Compensation: none
* Rights: Unlimited use
* Limitations: No claim for updates, support, fixes, additional modules, customization and no rights to distribute the software or parts of it in any form.
* Rights: Unlimited use (see limitations)
* Limitations: No claim for updates, support, fixes, additional modules, customization, etc. and no rights to distribute the software or parts of it in any form.

View File

@ -19,6 +19,14 @@ Core JavaScript libraries
* License: https://github.com/mbostock/d3/blob/master/LICENSE
* Source: https://github.com/mbostock/d3
### ChartJs
* Files: chartjs/*
* License: https://github.com/chartjs/Chart.js/blob/master/LICENSE.md
* Source: https://github.com/chartjs/Chart.js
## Images
### Orange Fruit Pieces ###
* Files: module_teaser_small.png
* Author: Evan Amos

View File

@ -4,6 +4,6 @@ Organization members are expected to do regular significant contributions to the
The organization doesn't define any fixed hours and expects the members to decide on their own commitment. Long leave times of more than 3 weeks should be communicated in advance so other members can organize tasks according to this.
Members must not spend more time than 40 hours per week on the organization as we believe output quality will drastically reduce over time.
Members should not spend more than 40 hours per week on the organization as we believe output quality will drastically reduce over time.
Extremely few or insignificant contributions may lead to the exclusion from the organization based on judgmental basis by a senior member. A member can expect to receive a warning in advance in order to provide the chance to increase the activity or provide reasons for the past activities.

View File

@ -0,0 +1,95 @@
# Maintenance Checklist
## Security
### Functions
- [ ] The application has disabled function calls
- [ ] The application has deprecated function calls
### Integrity
#### Frameworks
- [ ] PHP framework integrity is valid
- [ ] JS framework integrity is valid
#### Modules
- [ ] Module models integrity is valid
- [ ] Module views integrity is valid
- [ ] Module controller integrity is valid
- [ ] Module themes integrity is valid
#### Application
- [ ] Core application integrity is valid
- [ ] Core model integrity is valid
- [ ] Default applications integrity is valid (e.g. API, Backend)
### Unicode
#### Frameworks
- [ ] PHP framework has no unicode
- [ ] JS framework has no unicode
#### Modules
- [ ] Module models have no unicode
- [ ] Module views have no unicode
- [ ] Module controller have no unicode
- [ ] Module themes have no unicode
#### Application
- [ ] Core application has no unicode
- [ ] Core models have no unicode
- [ ] Default applications have no unicode
## Database
- [ ] Database seems healthy
- [ ] If cache is used, at least 50% of the requests hit the cache (query cache, data cache)
- [ ] Average database response times are less than 50ms
- [ ] The server hardware and assigned resources fulfill the recommendations
## Application
- [ ] The application usage feels normal (decent response time, no errors, etc.)
- [ ] The server has at least 50% of free storage space available
### Updates
- [ ] The application has the newest version
- [ ] The customer requested to update the application
- [ ] The customer is informed to create a backup first
- [ ] The application is updated during the maintenance
### Logs
- [ ] Has logs: _____________________________________________
- [ ] Logs are sent to OMS after approval from customer for further checks
#### Levels
| Level | Count |
| ----------- | ----- |
| Emergencies | |
| Criticals | |
| Errors | |
| Warnings | |
| Alerts | |
| Notices | |
| Info | |
| Debug | |
## Closing
Date:
Performed by (OMS):
Customer name:
Supervised by (customer):

View File

@ -0,0 +1,33 @@
# Onboarding: Cheat-Sheet
**How to initially setup the codebase?**
* run: `git clone -b develop https://github.com/Orange-Management/Orange-Management.git`
* run: `git submodule update --init --recursive`
* run: `git submodule foreach git checkout develop`
**How to (re-)setup the demo application?**
* run: `php demoSetup/setup.php`
**Testing tools**
php: PHPUnit
* php setup run: `composer install` (requires composer to be installed)
js: Jasmine
**How to run unit tests?**
* php:
* run in main directory: `php -d pcov.enabled=1 vendor/bin/phpunit -c tests/phpunit_no_coverage.xml `
* also possible for submodules if you want to test only a specific submodule (e.g. phpOMS)
* js:
**How to run code inspection?**
* run phpstan + phpcs: `Build/Helper/testreport.sh`
* run phpstan: `php vendor/bin/phpstan analyse --autoload-file=phpOMS/Autoloader.php -l 8 -c Build/Config/phpstan.neon ./`
* run phpcs: `php vendor/bin/phpcs ./ --standard="Build/Config/phpcs.xml" -s --report-junit=Build/test/junit_phpcs.xml`

View File

@ -0,0 +1,17 @@
# Onboarding: DO'S and DON'TS
## DO'S
1. Read the documentation
2. Ask questions
3. If you see a bug, missing, incomplete or wrong documentation, fix it
4. If you have ideas for features, additional functionality etc. bring them forward for discussion
5. If you feel tired from doing a specific task try to mix it up with other tasks (e.g. do some unit tests, write some documentation, do some code formatting, ...)
6. Be respectful to others! This includes members, customers, business partners, third party developers, and in general everyone in relation to this project and organization
7. Follow the code of conduct
## DON'TS
1. Don't be late to appointments. It can happen but it shouldn't be a normal occurrence
2. Don't represent the project and organization in a bad light

View File

@ -0,0 +1,61 @@
# Onboarding: Q&A
## General Application Questions
**Explain the general structure of the application**
* WebApplication -> e.g. Backend/Application -> Modules
* WebApplication -> e.g. Api/Application -> Modules
**Where are the application models e.g. Cache, DataMapper, Routing, Dispatching, ... initialized?**
In the respective Application (e.g. Backend/Application)
**Draw a general request workflow**
![](./app_flow.drawio.svg)
**Explain the general structure of a module and its purposes**
* Admin: Contains routs, installation, update and status change scripts
* Controller: Contains the different controllers (e.g. BackendController, ApiController)
* Docs: Contains the dev and user documentation in the different languages
* Models: Contains the models
* tests: Contains the tests
* Theme: Contains the themes (tpl, css, js, language files)
* .github: Github specific scripts and files
* Root directory: Mainly contains license, readme, contributing and most importantly the `info.json` file which describes the module requirements. This file is also used during the installation process of the module
## Resources
**Which frameworks are used for this project?**
Only the in-house frameworks (phpOMS, jsOMS, cssOMS)
**Does the project use external / third-party resources?**
Yes, although only very few libraries.
## Code Inspections
**How can you check the code style for code you wrote?**
* Guidelines
* Just run the phpcs dev tool with the provided config
* run: `Build/Helper/testreport.sh`
**How can you check the code quality for code you wrote?**
* Guidelines
* Unit / integration tests (php: PHPUnit, js: jasmine)
* Static code analysis (phpstan)
* run: Build/Helper/testreport.sh
* run: `php -d pcov.enabled=1 vendor/bin/phpunit tests/phpunit_default.xml`
* It's recommended to run this in the Orange-Management/* main directory
* Running this in the main directory will run all tests, also for the submodules (e.g. phpOMS, Modules, ...)
**Where are the config files for the different developer tools**
* phpcs: Build repository
* phpstan: Build repository
* PHPUnit: respective repository

View File

@ -0,0 +1,18 @@
# Onboarding
- [ ] Welcome meeting
- [ ] DO'S and DON'TS
- [ ] Introduction to team
- [ ] Handover credentials (e.g. repository)
- [ ] Setup of dev environment
- [ ] Git & repositories
- [ ] Dev tools for unit testing, code quality, debugging, ...
- [ ] Setup application demo for local tests
- [ ] Overview of documents and code base
- [ ] Docs
- [ ] Build scripts
- [ ] Framework
- [ ] Application structure
- [ ] Q&A about the code base, application design, etc.
- [ ] Handover of some basic issues/tasks/todos

View File

@ -0,0 +1,268 @@
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="391px" height="457px" viewBox="-0.5 -0.5 391 457" content="&lt;mxfile host=&quot;&quot; modified=&quot;2020-11-14T22:52:30.884Z&quot; agent=&quot;5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Code/1.46.1 Chrome/78.0.3904.130 Electron/7.3.1 Safari/537.36&quot; version=&quot;13.6.5&quot; etag=&quot;IFN7UMR82D_5cHEK2kDX&quot;&gt;&lt;diagram id=&quot;f52d839b-af3d-9e28-9e5e-6aed9f243001&quot; name=&quot;Page-1&quot;&gt;3VrbcpswEP0av2ZA4mI/5p6HZqaTtE36KIMCamVEQcR2v77CiIAsJbEbLNxmMh6xSGJ19hztymYCzxer6wLl6S2LMZ0AJ15N4MUEAH/mic/asG4MMPQbQ1KQuDG5neGe/MbS6EhrRWJcKh05Y5STXDVGLMtwxBUbKgq2VLs9Mao+NUcJ1gz3EaK69YHEPJVWN5h1N24wSVL56CkImhtzFP1MClZl8nkTAJ82f83tBWrnkgstUxSzZc8ELyfwvGCMN63F6hzTGtoWtmbc1St3X/wucMZ3GSDj9IxohVuPN37xdYsFjgU08pIVPGUJyxC97Kxnm/XiekZHXKV8QUXTFc0fmPO1jC6qOBOmboZPjOWyn+61XEjJqiKSfkjPOCoSLHtJUtUe9obJlV5jtsC8WIsOBaaIk2c1uEhyJHnp9zL0MyPCEeBIOntTGS3JZuDN1Ckan+SoDm3R6LnRmTYxMMcDaPH4WuJCjwmlQgo19suUcHyfow1KSyFGNQKvIvuMC45Xb6LWrj5QV++6cvXLThm+7JL2NNHaTDgrCL0Bh+tqeBwtP32dn+12NhxBdwXO13C74TwXljv8q8Il11BUMbLAKn+LVW3K6LEqNLAK+gOwCv47rGoppNAKjEWr1psecg94fprnR8cnUYNY4xOAQ9IHrwh/7LW/111ORAElLjPh2aMcsrlobvp7sK4UTOKndY0kDBFFZUmi1nxF6LshUchpyMlgtD0PTA8qawW4jGV4CzVnjyB0gTzxlVB+BHk4+LbwWjnkK1KDs93KIYEdWve65XWHUovwfgWT5x1ee+A97e2oqWETg4EBrjdaYtAL1wm8kv8goMLBs7moY4OkbomEQUkkPGDZ0SUOCOwlDlc/ft2xihsKftuo+MGWxp2pvXQa2NvHLYkVGKq44U+vOwOsV3EXpMwRj9JjpF4rUAvUg4f9PmTIEmI33hkOpRCOxTvvsOeuUYRtAng8YevH/lsWVxSLKsupZ6k/t5PxORPFDKP0CKXvuaE16Xv/X9aBBnJ6o5HTO8DxzIiNAcP9A2FE6e8QDy0BDA3qR3l+BLoOxtS1jsoF4miOSjw6LmHojIYLnNnb72yUOm1Zo2Ti6VibHdRLnW8EL0dnnJZhQ3unXagngC94kQvkx1fiNi6+Z/HQATRc7nCZs8ywQ1n94c/f4oqjYxIYMAkG+OHPC/Vc1rxk8HGiaAgYcNo9lR1OQOKyexGg+Wq0e9kCXv4B&lt;/diagram&gt;&lt;/mxfile&gt;" style="background-color: rgb(255, 255, 255);">
<defs/>
<g>
<path d="M 35 50 L 35.03 70 L 35.03 55.03 L 35.03 68.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 35.03 73.88 L 31.53 66.88 L 35.03 68.63 L 38.53 66.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="35" cy="25" rx="25" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 25px; margin-left: 11px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
User
</div>
</div>
</div>
</foreignObject>
<text x="35" y="29" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
User
</text>
</switch>
</g>
<path d="M 35.03 110 L 35.03 130 L 35.03 120 L 35.03 133.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 35.03 138.88 L 31.53 131.88 L 35.03 133.63 L 38.53 131.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<rect x="0" y="75" width="70" height="35" fill="#ffffff" stroke="#000000" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 93px; margin-left: 1px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Http Request
</div>
</div>
</div>
</foreignObject>
<text x="35" y="96" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Http Request
</text>
</switch>
</g>
<path d="M 35.03 175 L 35.03 195.03 L 35.03 190 L 35.03 203.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 35.03 208.88 L 31.53 201.88 L 35.03 203.63 L 38.53 201.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<rect x="0" y="140" width="70" height="35" fill="#ffffff" stroke="#000000" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 158px; margin-left: 1px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
WebApp
</div>
</div>
</div>
</foreignObject>
<text x="35" y="161" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
WebApp
</text>
</switch>
</g>
<path d="M 76.37 236.26 L 92.51 236.29 L 92.51 248.51 L 108.63 248.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 71.12 236.25 L 78.12 232.76 L 76.37 236.26 L 78.11 239.76 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 113.88 248.5 L 106.88 252.01 L 108.63 248.5 L 106.88 245.01 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 35.03 245 L 35.03 265.03 L 35.03 261.03 L 35.01 274.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 35 279.88 L 31.51 272.88 L 35.01 274.63 L 38.51 272.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 76.37 218.76 L 92.51 218.8 L 92.51 206.51 L 108.63 206.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 71.12 218.75 L 78.13 215.27 L 76.37 218.76 L 78.11 222.27 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 113.88 206.5 L 106.88 210.01 L 108.63 206.5 L 106.88 203.01 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<rect x="0" y="210" width="70" height="35" fill="#ffffff" stroke="#000000" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 228px; margin-left: 1px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
???
<br/>
Application
</div>
</div>
</div>
</foreignObject>
<text x="35" y="231" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
???...
</text>
</switch>
</g>
<rect x="115" y="189" width="70" height="35" fill="#ffffff" stroke="#000000" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 207px; margin-left: 116px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Router
</div>
</div>
</div>
</foreignObject>
<text x="150" y="210" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Router
</text>
</switch>
</g>
<path d="M 150 272.37 L 150 286 L 150 278 L 150 291.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 150 267.12 L 153.5 274.12 L 150 272.37 L 146.5 274.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 150 296.88 L 146.5 289.88 L 150 291.63 L 153.5 289.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<rect x="115" y="231" width="70" height="35" fill="#ffffff" stroke="#000000" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 249px; margin-left: 116px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Dispatcher
</div>
</div>
</div>
</foreignObject>
<text x="150" y="252" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Dispatcher
</text>
</switch>
</g>
<path d="M 150 333 L 150 353.03 L 150 340 L 150 353.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 150 358.88 L 146.5 351.88 L 150 353.63 L 153.5 351.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 191.37 315.49 L 205.03 315.49 L 195.03 315.49 L 208.63 315.49" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 186.12 315.49 L 193.12 311.99 L 191.37 315.49 L 193.12 318.99 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 213.88 315.49 L 206.88 318.99 L 208.63 315.49 L 206.88 311.99 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<rect x="115" y="298" width="70" height="35" fill="#ffffff" stroke="#000000" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 316px; margin-left: 116px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Modules /
<br/>
Controller
</div>
</div>
</div>
</foreignObject>
<text x="150" y="319" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Modules /...
</text>
</switch>
</g>
<path d="M 291.37 315.49 L 305.03 315.49 L 300 315.49 L 313.63 315.49" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 286.12 315.49 L 293.12 311.99 L 291.37 315.49 L 293.12 318.99 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 318.88 315.49 L 311.88 318.99 L 313.63 315.49 L 311.88 311.99 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 250 339.37 L 250 353.03 L 250 340 L 250 353.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 250 334.12 L 253.5 341.12 L 250 339.37 L 246.5 341.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 250 358.88 L 246.5 351.88 L 250 353.63 L 253.5 351.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<rect x="215" y="298" width="70" height="35" fill="#ffffff" stroke="#000000" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 316px; margin-left: 216px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Mapper
</div>
</div>
</div>
</foreignObject>
<text x="250" y="319" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Mapper
</text>
</switch>
</g>
<rect x="320" y="298" width="70" height="35" fill="#ffffff" stroke="#000000" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 316px; margin-left: 321px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Database
</div>
</div>
</div>
</foreignObject>
<text x="355" y="319" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Database
</text>
</switch>
</g>
<path d="M 150 395 L 150 415.03 L 150 401.03 L 150 414.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 150 419.88 L 146.5 412.88 L 150 414.63 L 153.5 412.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/>
<rect x="115" y="360" width="70" height="35" fill="#ffffff" stroke="#000000" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 378px; margin-left: 116px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
View
</div>
</div>
</div>
</foreignObject>
<text x="150" y="381" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
View
</text>
</switch>
</g>
<rect x="115" y="421" width="70" height="35" fill="#ffffff" stroke="#000000" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 439px; margin-left: 116px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Template
</div>
</div>
</div>
</foreignObject>
<text x="150" y="442" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Template
</text>
</switch>
</g>
<ellipse cx="35" cy="311" rx="30" ry="30" fill="#ffffff" stroke="#000000" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 311px; margin-left: 6px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Response
</div>
</div>
</div>
</foreignObject>
<text x="35" y="315" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Response
</text>
</switch>
</g>
<rect x="215" y="360" width="70" height="35" fill="#ffffff" stroke="#000000" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 378px; margin-left: 216px;">
<div style="box-sizing: border-box; font-size: 0; text-align: center; ">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">
Model
</div>
</div>
</div>
</foreignObject>
<text x="250" y="381" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">
Model
</text>
</switch>
</g>
</g>
<switch>
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
<a transform="translate(0,-5)" xlink:href="https://desk.draw.io/support/solutions/articles/16000042487" target="_blank">
<text text-anchor="middle" font-size="10px" x="50%" y="100%">
Viewer does not support full SVG 1.1
</text>
</a>
</switch>
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

546
Project/PROJECT.md Normal file
View File

@ -0,0 +1,546 @@
# Project Status and Tasks
- [Summary](#summary)
- [Milestones](#milestones)
- [Todos](#todos)
- [Features](#features)
- [Bugs](#bugs)
- [Drafts, concepts & ideas](#drafts-concepts-ideas)
- [Most recent changelog](#most-recent-changelog)
## Summary
Last update of this file: 11.09.2021
### Timeline
### Key changes this month
### Challenges & problems
### Next steps
Continue with milestone task implementation.
## Milestones
Based on the pilot candidate with whom the functionality will be implemented.
| Deadline | Done | Milestone | Costs | Value |
| -------- | ---- | ------------------------------------------------------ | -------------- | -------------- |
| | | Replace ticket system from Z* | 7,200 EUR | 8,000 EUR |
| | | Replace document/contract management from CRM | 3,000 EUR | 6,000 EUR |
| | | Implement invoice management process | 0 EUR | 5,000 EUR |
| | | Replace QM from CRM | 700 EUR | 1,500 EUR |
| | | Replace workflows from CRM | 1,000 EUR | 3,000 EUR |
| | | Move sales reps from CRM | 3,000 EUR | 6,000 EUR |
| | | Replace Marketing events, seminars, shop data from CRM | 1,500 EUR | 2,000 EUR |
| | | Sales analysis (replace D* from G*) | 1,000 EUR | 2,000 EUR |
| | | Digitalizing human resource Human Resource Management | 0 EUR | 500 EUR |
| | | Replace billing from G* | 15,000 EUR | 20,000 EUR |
| | | Replace stock from G* | 7,500 EUR | 8,000 EUR |
| | | Replace inventory from G* | 500 EUR | 1,000 EUR |
| | | Replace manufacturing from G* + R&D + Quality control | 500 EUR | 10,000 EUR |
| | | Replace accounting from G* | 10,000 EUR | 12,000 EUR |
| | | Replace asset management from G* EUR | 500 EUR | 500 EUR |
| | | Replace reporting from L* | 4,200 EUR | 5,000 EUR |
| | | | **55,600 EUR** | **90,500 EUR** |
*The annual value is the relative value for the pilot candidate based on the current cost structure.*
### Cost basis
The estimated annual costs in the milestones are based on the total annual costs from the software from the pilot candidate. These total costs are then subjectively distributed to the different software aspects.
| Type | License | Customization | Total |
| --------- | -------------- | -------------- | -------------- |
| Z* | 7,200 EUR | | 7,200 EUR |
| G* | 26,600 EUR | 8,400 EUR | 35,000 EUR |
| L* | 4,200 EUR | | 4,200 EUR |
| CRM | | 9,200 EUR | 9,200 EUR |
| **Total** | **38,000 EUR** | **17,600 EUR** | **55,600 EUR** |
*Website costs are not included, they can be estimated at another 30,000 EUR per year*
### Tasks & decisions
| Deadline | Done | Task |
| ---------- | ---- | ------------------------------------------------------------ |
| 2021.08.27 | | **Define scope**<br />Which modules should be developed first<br />Which features must be part of the modules at the start<br />What is the expected timeline for the different modules |
| | | **Navigation**<br />Allow to hide navigation elements even if the module is installed.<br />Also disable routing for front end. This way only the functionality is available (API). |
| | | **Customer Management**<br />Names<br />Address<br />Contact elements<br />Custom fields<br />Contract import from CRM system (maintenance contract)? (SD specific)<br />Add note types (e.g. phone, email, meeting, ...) |
| | | **Job**<br />Create jobs<br />Manage jobs<br />Create a job which runs exchange scripts |
| | | **Exchange** (Importer/Exporter)<br />GSD import script for customers (new entries and changed entries) (SD specific)<br />GSD import script for customer addresses (new entries and changed entries) (SD specific)<br />Allow to define exchange scripts as auto-run with a interval |
| | | **Permission**<br />Better permission handling (only show tickets the user is allowed to see) **difficult**<br />When returning models (backend and API requests) the permission should be checked (all modules)<br />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**<br />Implement password reset<br />Implement email sending<br />Implement global email server definition<br />[UI] Add user & group settings<br />[UI] Add account/group removal from each other<br />[UI] Add permission removal from accounts/groups<br />[UI] Add permission modification for accounts/groups<br />Create API key permissions<br />Create API key handling<br />Handle logging for API keys<br />Handle "login" for API keys (maybe create dummy account for that?) |
| | | **Support** (Tickets)<br />Ticket creation<br />Ticket response<br />Status update via email<br />Feedback/rating via email click (using time limited hash) **difficult**<br />Response from customer via email (using time limited hash) . Requires ticket email address, maybe create one per app?**difficult**<br />Upload files to random support directory<br />Allow ticket creation from external sources (e.g. website) by using an api key. Allow custom fields as well. |
| | | **Media**<br />Drag and drop upload<br />Ctrl+C/Ctrl+V upload<br />Move files and directories to subdirectories<br />Bulk actions (move, delete, download, ..)<br />Better file and directory permissions. Similar problem applies to permissions. **difficuly due to subdirs**<br />Create custom media types (e.g. contract) with l11n text/description<br />Implement download of directory<br />Add password support for directories.<br /> > Difficult because of subdirectories<br />Allow to actually replace media files (same DB id but replaced the file on the hard drive)<br />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<br />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.<br />Allow to create a collection when uploading multiple files<br />Create admin setting for handling media_type specifications |
| | | **Contract Management**<br />Show contracts after clicking on document list in contract<br />Assign contract to an account<br />Create task/message if a contracts term runs out<br />Create job which informs people about contract end of life<br />Define custom info deadline (global and optionally for a single contract)<br />Setting to change responsible person/group A to B (e.g. person leaves company)<br />Implement directory view for contracts<br />Create a new media type "contract"<br />Contracts can have a different date of expiration and last renewal. (e.g. renewal needs to happen 1 month before contract end)<br />Contracts should be filtered by organization |
| | | **System**<br />Implement maintenance mode where no one can edit anything.<br />Implement API only mode for modules, which disables UI interaction with a module completely (no navigation, no templates, ...) |
| | | **Workflow**<br />Individual UI templates incl. styles<br />Script management<br />Allow email message and response (text+time limited links via hash) |
| | | **Invoice Management**<br />OCR<br />Auto content recognition (supplier, articles, costs, taxes, payment terms)<br />Define approval workflow<br />Allow notes<br />Allow questions to other users (reference tasks and or media messages)<br />Allow to add additional documents<br />Allow PDF modifcation (allow notes on pdf, approval stamps) **difficult**<br /> > This requires a JS live preview for adding this at a specific position (maybe PDFJSAnnotate, maybe customize pdf.js)<br />Job/Schedule which checks unhandled invoices<br />Hooks/Workflows for invoices |
| | | **Quality Management**<br />Create quality issue (for account, article, other?)<br />Define workflow based on report type?<br />Statistics????<br />Export list to excel<br />Export based on filter to pdf<br />Expand GSD Exchange importer *a lot of work* (SD specific) |
| | | **Workflow** (implement some scripts)<br />Remove article (SD specific). How to handle data (custom database table?)<br />Create article (SD specific). How to handle data (custom database table?) |
| | | **Customer Management** (SD specific)<br />Expand GSD Exchange importer to also import customer files from CRM (files, emails)<br />Expand GSD Exchange importer to also import customer notes (notes, visitor reports) |
| | | **Sales**<br />Create easy way to create quick visitor reports (= maybe use notes for this with a type 'visit')<br />Allow to create visitor report on cell phone by using location matching (geolocation)<br />Analyze reports per sales rep (e.g. use filter for export?) |
| | | **Item Management**<br />Names<br />Base data<br />Media files<br />Expand GSD Exchange importer to also import articles (SD specific) |
| | | **Billing** (only data for upcoming modules)<br />Basic invoice data (no stock movement)<br />Expand GSD Exchange importer to bills as well (SD specific)<br />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<br />Show invoice pdf in preview on change<br />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?<br />Save original net value and discounted net value (currently only discounted net value is stored)<br />Save discounts |
| | | **Sales**<br />Sales rep ranking<br />Individual rep sales analysis (e.g. top customers, sales by product group, lost customers, ...) |
| | | **Customer Management**<br />Customer sales info/statistics (total sales, invoices, articles, groups)<br />Invoice pdf importer from hard drive (without using the Exchange module) (SD specific)<br />Create a view where you can see all bills of the customer<br />Create a view where you can see all items of the customer |
| | | **Sales**<br />Sales analysis reports |
| | | **Sales Analysis** (client sales analysis)<br />Sales + Gross profit<br />Quantity orders + quantity articles<br />Segment sales<br />Top articles<br />Cross selling (bought as well)<br />Amount of invoices<br />Amount of different articles |
| | | **Sales Analysis** (item sales analysis)<br />Sales + gross profit<br />quantity sales, quantity customers<br />Cross selling<br />Top customers<br />Amount of customers<br />Amount of article sales<br />Amount of new customers<br />Cross selling articles |
| | | **Job**<br />Create job which can automatically create checklists (e.g. end of month checklists) |
| | | **Checklist**<br />Create module<br />Checklists can create tasks<br />Allow to define recurring date time |
| | | **Marketing**<br />Create promotions (incl. basic info)<br />Promotion planned costs<br />Promotion planned earnings<br />Promotion assign to customers<br />Promotion start/end<br />Promotion type (somehow use for cost center)<br />Promotion custom fields<br />Promotion media files<br />Create events (incl. basic info)<br />Event planned costs<br />Event planned earnings<br />Event assign to customers<br />Event speaker<br />Event start/end<br />Event type (somehow use for cost center)<br />Event custom fields<br />Event media files |
| | | **Human Resource Management**<br />Handle staff information (encrypted)<br />Handle staff positions<br />Manage documents (encrypted)<br />Manage contracts (encrypted)<br />Manage salary (encrypted)<br />List of assets and documents handed over to employees (to be returned on leave) |
| | | **Item Management**<br />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?)<br />Consider to use name for attribute identification (currently only used for localization). Is this really required?id might be fine?<br />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?)<br />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**<br />Basic clocking (browser + hardware)<br />Hardware needs to make web requests for the chip clocking<br />Clocking overview for employees<br />Vacation / absence management for employees<br />Clocking overview/analysis for managers/hr<br />Vacation / absence overview/analysis for managers/hr<br />Vacation approval workflow<br />Clocking change approval<br />Export of clocking times (hr)<br />Export of vacations, sickness, ... (hr) |
| | | **Dashboard**<br />Drag&Drop element sometimes disappear on drop<br />Create default dashboard templates which can be used by users, changing them copies it for this user<br />Allow people to modify a dashboard and automatically save it / reload it<br />Implement a way for other modules to provide dashboard components (allow modules to register themselves in a database table) |
| | | **Billing** (additional features)<br />Only create pdf preview if preview is visible?<br />[Analysis] Gross profit (total bill and elements)<br />Show bill relations (on tab which shows all related bills)<br />Create send as email button inside the bill. this opens the send email view where the email is pre-written with the attached pdf<br />In the supplier and client view you should be able to select multiple bills and click print for printing<br />In the supplier and client view you should be able to select multiple bills and click send as email for email sending<br />The send bill as email should have a global settings where you can either define a global email or empty = user specific email<br />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<br />Clients should have a invoice_email address which is stored in the client |
| | | **Billing** (full implementation)<br />Allow to define re/usable templates (e.g. recurring invoices)<br />Allow to define re/usable texts<br />Automatic email invoice after finishing if user wants to use that<br />Batch print/export invoices based on filter<br />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.<br />Forward bills to sales rep (if bill > X EUR or specific type)<br />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<br />Allow to import existing bills (e.g. order -> invoice, offer -> confirmation -> delivery note ...)<br />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?<br />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**<br />Implement stock GSD stock importer |
| | | **Purchasing**<br />Create item list for purchasing |
| | | **Accounting**<br />Implement GSD accounting importer<br />Print receivable of customer (also allow to do this from the client view in the Client Management) |
| | | **Client Management** (additional feature implementation)<br />Add list for top articles on profile page... important for customer calls<br />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)<br />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)<br />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)<br />Create a map of all customers (maybe as data points or as heat maps)<br />Create a map of sales (maybe as data points or as heat maps)<br />Create default letter Doc (with/without letter head)<br />Make customers only visible/readable to authorized people (e.g. sales rep may only see his own clients)<br />Client view should be customizable since different groups have different interests and read permissions (e.g. sales reps, finance, etc.)<br />Allow to specify the accounting account (e.g. a customer who is a supplier may have the same account) |
| | | **Accounting Analysis**<br />Create different P&L structures<br />Create different balance structures<br />Create cash analysis structure<br />Create asset/depreciation structure<br />Create comparison feature for the above mentioned structures (budget, IFRS, ...) |
#### Archived
| Deadline | Done | Task |
| -------- | ---------- | ------------------------------------------------------------ |
| | 2021.09.06 | **Admin**<br />[ModuleSettings] The module settings should have two tabs/pages. One containing a list of all settings for the module and the other a custom settings page where it's possible to give the impression of a customized setting view. The template itself is individual for the module but in the backend the list is still used. The reason for this customized settings template is that this allows to create a nicer input and form layout (e.g. media selector if a setting references a media file, show a preview output for images, custom input validation, ...) |
| | 2021.09.06 | **Media**<br />Change media_type from string to foreign key and create a media_type table where it's possible to create media types (this should have a localized table for type name). This allows us to upload media types such as contracts.<br />Create a installExternal binding for media_types (currently collections and uploads exist) |
| | 2021.09.18 | **Legal Pages**<br />Create Privacy Policy<br />Create Terms of Use<br />Create Imprint<br />Pages should be handled in the CMS module which becomes a standard module. |
## Todos
Todos/tasks which are not important enough to be part of the milestones.
| Priority | Done | Task |
| -------- | ---- | ------------------------------------------------------------ |
| high | | **Email**<br />Continue implementation of email sending and receiving. Especially receiving needs much more work. |
| high | | **Search**<br />Implement a tag search hook which finds content based on tags<br />Implement module specific search (e.g. :tasks title ...)<br />Implement global search hook (every module performs a search based on the search)<br />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**<br />In the AdvancedInput, implement predefined values (e.g. predefined/default tags)<br />In the AdvancedInput, implement mandatory predefined values (e.g. tags which cannot be deleted)<br />Implement AdvancedSelect (with auto filtering, none-element, multi-select, default-selects, must-have selects)<br />![Advanced select](img/todo/dropdown.png) |
| high | | **UI change**<br />Find a way to load a different page after a successful form result (e.g. reload account creation page) |
| high | | **Table**<br />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**<br />Implement export (local=visible data, external=all data)<br />Implement filtering (local=visible data, external=all data)<br />Highlight filtering of the filtered columns |
| high | | **Forms**<br />On change highlight the data/element that got changed<br />Invalid API responses should undo the UI changes<br />Removing a form from the DOM should unbind it<br />Adding a template to the DOM should modify its id/generate a custom/random id for the added element<br />Add/bind UI elements after adding them to the DOM<br />Consider to allow multiple/different add buttons which behave a little bit different<br />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 | | **Url format**<br />Change the url format in most modules from query parameter to path (e.g. /module/profile?id=Admin to /module/Admin/profile) |
| medium | | **Modules**<br />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**<br />The ::with() function uses blacklisting it should be changed to whitelisting for relations |
| medium | | **DataMapper**<br />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**<br />Implement listeners for child elements if the selector is specified |
| medium | | **Action**<br />Create a action which adds/removes DOM elements<br />Log DOM changes to the user |
| medium | | **Unit tests**<br />All Modules/\*\*/Models/\*, Modules/Controller/\* |
| medium | | **Modules**<br />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**<br />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 | | **Unit tests**<br />[phpOMS] ModuleManager->installApplications<br />[phpOMS] StatusAbstract->installRoutes<br />[phpOMS] StatusAbstract->installHooks<br />[phpOMS] StatusAbstract->activateHooks<br />[phpOMS] StatusAbstract->deactivateHooks<br />[phpOMS] StatusAbstract->uninstallHooks<br />[phpOMS] ModuleAbstract->createModels<br />[phpOMS] ModuleAbstract->updateModel<br />[phpOMS] ModuleAbstract->createModel<br />[phpOMS] ModuleAbstract->getLocalization<br />[phpOMS] InstallerAbstract->createTables<br />[phpOMS] InstallerAbstract->reInit<br />[phpOMS] Graph->findAllReachableNodesDFS<br />[phpOMS] Graph->getAllPathsBetweenNodes<br />[phpOMS] Graph->countAllPathsBetweenNodes<br />[phpOMS] Graph->longestPathBetweenNodes<br />[phpOMS] Graph->shortestPathBetweenNodes<br />[phpOMS] Graph->isConnected<br />[phpOMS] Node->getEdgeByNeighbor<br />[Model] CoreSettings->create |
| low | | **ER diagrams**<br />Checklist<br />Contact<br />DatabaseEditor<br />Draw<br />Messages<br />Monitoring<br />Shop |
| low | | **Code cleanup**<br />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**<br />[Template] Fix tab indices's. On many pages the tab indices's are broken (tabs, table/list, links, forms) |
| low | | **Surveys**<br />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)<br />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**<br />The modules use the module name for identification in many places where the module id should be used for performance reasons |
| low | | **Modules/permissions**<br />In many places where permissions are used bad and different names are used. Sometimes the term "type" is used, sometimes the term "state" (PermissionState). Both actually represent a superficial category every module can define for permissions. (e.g. a state could be account, task, profile, tag, ...). The term "state" makes no sense since it isn't a state. The term "type" is also bad because in another place it is used to define (read, write, change, ...). Maybe we should simply call it PermissionCategory/category?! (files to change: NavElement, PermissionAbstract, PermissionState) |
| low | | **Graph**<br />Implement missing functionality:<br />Find cycles using graph coloring<br />Find a negative cycle<br />Find cycles with n length<br />Find cycles with odd length<br />Find islands<br />Check if strongly connected<br />Find longest path<br />Get the girth<br />Get the circuit rank<br />Get the node connectivity<br />Get the edge connectivity<br />Check if bipartite<br />Check if triangle free |
| low | | **QueryBuilder**<br />Implement missing functions such as sum, count, ... |
| low | | **DataMapper**<br />Reconsider the order of the `get(*)` parameters (e.g. depths/fill) |
| low | | **General**<br />Once read only variables become available many models can remove getter/setter function (e.g. ApplicationAbstract, ConnectionAbstract and various models) |
| low | | **DataMapper**<br />In the DataMapper when using getQuery() and then making a ->where(...) the where will often fail because the table name is suffixed with an integer e.g. `_3`. This means you need to know the depth of the query in order to manually write it. The query builder should figure this out by himself. It knows the `_INT` value from the `FROM` clause and should just overwrite in the where clause where needed. See the GSD Importer from the exchange module for reference. |
| low | | **DataMapper**<br />Only update changed relations (e.g. allow coder to tell the DataMapper what changed) |
| low | | **DataMapper**<br />Implement get() where the coder can tell the DataMapper which fields and relations to fill (this might be solved with a better `::with()` function. |
| low | | **Grammar**<br />Implement schema modification grammar (alter tables) |
| low | | **Router, EventManager, Hook**<br />Instead of doing 100% regex matching, combine it with a tree search, this should be faster |
| low | | **Text search algorithm**<br />Implement a decent full text search for files/variables which finds texts that are similar (e.g. similar spelling, only some words in between, maybe different word order, etc.) |
| low | | **OAuth2**<br />Implement client<br />Implement server |
| low | | **ServiceWorkers**<br />Implement caching and responding |
| low | | **Code**<br />Implement QR code creation<br />Implement QR code reader<br />Implement data matrix creation<br />Implement data matrix reader<br />Implement various bar code readers |
| low | | **Speech recognition**<br />Remove the speech recognition wrapper once it becomes standard |
| low | | **Voice commands**<br />Implement table/link navigation |
| low | | **Input validation**<br />Implement nicer input validation (e.g. show check mark and x in the input fields / optionally)<br />![Input validation](img/todo/input_validation.png) |
| low | | **jsOMS Framework**<br />Consider to create a library function which finds the nearest element based on a select (horizontal and vertical search, `*.nearest()` does not work this way) |
| low | | **jsOMS UriFactory**<br />Consider to parse EVERY URL with the Uri factory. This however might cause double parsing and therefore bugs |
| low | | **Tabs**<br />The frontend loads the correct tab based on the provided fragment, but it is slow. Doing this in the backend can already fix this but the frontend implementation should be fixed, because this should be the job of the frontend. |
| low | | **Build process/website module display**<br />Text file with all the module git links<br />Download and install<br />Default inspections/tests (unit tests, info.json, language files used, language files in all languages same content, amount of languages, routes in controller available, dependencies valid, code coverage, phpstan, phpcs)<br />Add to database |
| low | | **Logs**<br />The "Log" tabs in many models should have a separate permission which hides them. Maybe a user needs to have read permissions of the monitoring module in order to see them? Alternatively it could be a *_MONITOR permission for the specific model in every module. This is a little bit finer but also expands the permission complexity |
| low | | **UI sections/portlets**<br />sections/portlets with a footer sometimes have problems with floated elements. e.g. a right floated button will break the layout if the left element(s) are too long causing wrapping.<br />> Solution: create flexbox with margin |
| low | | **Admin: Settings template**<br />In the Settings->Localization->Numeric the number format (decimal, thousands) don't have a spacer in between. Margin left doesn't work. |
| low | | **Admin**<br />The default Account mapper should not have a password reference, there should be a AccountLoginMapper which is used if anything needs to be done regarding the account password. Alternatively, think about a private field modifier which requires the programmer to specifically request the read/write permission for that field (password field). The reason for this is that otherwise the password hash might be dumped in case of an error |
| low | | **Auditor**<br />Consider to create foldable/tree view for json logs e.g. https://www.cssscript.com/json-data-tree-view/<br />Implement blockchain for the auditor. This either requires database locking (slow),modification of audit logs after inserts (slow) or a background process which calculates theblockchain (OK).<br />Create printable reports based on specific changes |
| low | | **Database Editor**<br />Implement basic functionality / queries in UI |
| low | | **Fleet Management** |
| low | | **Helper**<br />Implement direct print instead of opening a new window with `document.getElementById('iHelperFrame').contentWindow.print();` |
| low | | **Investments**<br />Approval<br />Comparison/calculations |
| low | | **Labeling**<br />Create default label layout for items |
| low | | **Item Management**<br />ItemAttributeTypes 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)<br />Show additional important item information for sales/purchase, currently too controlling/stats focused<br />Define some attributes mandatory (e.g. HC-code/tariff code number) |
| low | | **Kanban**<br />Implement card status (archive, public, inactive)<br />Implement unread cards/comments notification/highlight<br />Highlight card with new comments (e.g. make comment count background red?)<br />Consider to replace card comments with normal comments from the Comments module |
| low | | **Knowledgebase**<br />Implement category create/edit view<br />Implement doc create/edit view (similar to news/editor)<br />Add category back/up button when in a subcategory |
| low | | **Monitoring**<br />Implement integrity check based on installed version and remote hash list (see monitoring-security.tpl.php) |
| low | | **Messages**<br />Implement email sending/receiving<br />Implement internal message/conversion storage |
| low | | **Organigram**<br />Create better organigram (better grouping, maybe as SVG)<br />Make the organigram printable<br />Make the organigram versioned/approved (e.g. for ISO) |
| low | | **Profile**<br />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**<br />Implement voting<br />Implement accepting answers<br />Implement question create view<br />Add question answer component/like comment in question<br />Make votes contain for who the vote is, this way the vote score sum for accounts is MUCH easier and faster<br />Create different QA Apps (check out WikiApp)<br />Make Questions QA App specific (check out WikiDoc)<br />Create QA app with login |
| low | | **Supplier**<br />Create a view where you can see all bills of the supplier<br />Create a view where you can see all items of the supplier<br />[Notes] Add note types (e.g. phone, email, meeting, ...)<br />[Doc] Create default letter Doc (with/without letter head)<br />[Payable] Print payable<br />[Analysis] Purchase EUR + gross profit<br />[Analysis] Quantity order, quantity articles<br />[Analysis] Segment purchase<br />[Analysis] Top articles<br />[Analysis] Cross selling<br />Allow to specify the accounting account (e.g. a customer who is a supplier may have the same account) |
| low | | **Tasks**<br />[Analyzer] Implement analyzing functionality (tasks created, answered, time required to finish task, always in time?)<br />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)<br />Make answer box on the right scroll down with the content, this way you can immediately respond without scrolling.<br />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!!!<br />Implement email notification on progress/changes (new task, forwarded, ...)<br />The unread task count is currently not really correct and needs to be fixed<br />Allow batch handling of tasks in the dashboard/overview for faster interaction (e.g. select and close)<br />Create a user calender for tasks which only shows when tasks are due<br />Don't show Tasks in dashboard which are far into the future, maybe create another list for this?<br />Implement has seen and unseen (use system where every task has a seen flag for a user if it is seen) |
| low | | **Calendar**<br />Load events back to a fixed amount of months (e.g. current month, previous month and next month)<br />Implement event popup in the UI on click<br />Create different interval templates (year, quarter, month, week, day)<br />Allow user to define the start of the week (e.g. Sunday, Monday)<br />Implement gantt chart<br />Create iCal parser/reader and builder<br />Create database, models and mappers |
| low | | **CMS**<br />Make file content view 100% container height<br />Allow content changes and saving<br />Ideas for applications based on modules (e.g. monitor/log dashboard, sales dashboard, calendar, support/ticket, clocking, Q&A, Wiki, shop)<br />Implement line numbers in code view<br />Implement code formatting / syntax highlighting<br />Allow different content types (e.g. pages, posts, ...) with individual templates |
| low | | **Workflow**<br />Implement an approval module which only runs a module/user specific action once it is approved. This functionality might be part of the workflow module or at least smoothly interact with this module. Additionally, it should probably make use of the Tasks module.<br />New customer is created (approve)<br />New bill is created (approve, validate)<br />New supplier is created (approve) |
| low | | **ReadOnly**<br />Find a way to implement a read only setting. This could be helpful for maintenance times. |
| low | | **UriFactory**<br />Consider to use `\urlencode()` on every query parameter in the UriFactory. |
| low | | **ModuleMapper**<br />Implement module description, name, createdAt in the database table and use them. Currently they are available in the model but not yet implemented in the database schema. |
| low | | **Templates**<br />In some forms there are 2 buttons which a user shouldn't accidentally press (a save and create button or delete button). Position them far apart by using flexbox positioning (e.g. Module->Support->Settings). |
| low | | **ModuleMapper**<br />Create a `::limit()` function which is similar in concept to the existing function `::sortBy()`. As a result the limit can be removed from most other functions. |
| low | | **ModuleInstaller**<br />In most module *Installer.php* scripts the `installExternal()` re-implements Api functionality. Instead of creating new functions maybe the installer scripts should mock the API requests? (e.g. CMS is using the API while Media is re-implementing many functions) |
| low | | **CMS**<br />Make pages editable<br />Make posts editable |
| low | | **UI Slider**<br />Create a slider element with two elements which the user can slide (optionally also only one slider should be possible)<br />![Slider](img/todo/slider.png) |
| low | | **Demo setup - Billing**<br />Improve customer order randomization (types, dates) in the demo setup file `setupBillingClients.php`.<br />Create text lines in bills, currently no text lines are created only entries with items, but sometimes you want to write some text in an invoice |
| low | | **Billing**<br />Costs such as shipping, insurance etc. should not be hard coded but customizable costs stored in a separate table. |
| low | | **Demo setup - Support**<br />Use default values for ticket attribute types in some cases instead of always using custom values |
| low | | **Update**<br />Create update logic for application, resources, modules, ... in the Admin/ApiController (`apiCheckForUpdates`) |
| low | | **Billing**<br />Create setting for bill format per bill type (e.g. invoice, order, ...). |
| low | | **Biling**<br />The bill archive should store the customer/supplier localized version since this is the official document. |
| low | | **Billing**<br />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**<br />The tools above should directly insert the markdown into the textarea. |
| low | | **Kanban**<br />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. |
| low | | **Media**<br />Find a way to allow file edits if the file is not in the database but just in the file directory. At the same time this should not be possible for database files. |
| low | | **DataMapperAbstract**<br />The SQL query building seems to bee too complicated in some cases including unnecessary joins (e.g. see `TagMapper::get()`) |
| low | | **DataMapperAbstract**<br />Implement data binding |
| low | | **DataMappers**<br />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**<br />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 | | **SettingMapper & CoreSettings**<br />Consider to merge? Maybe only use the mapper, maybe let the CoreSettings use the `Setting` and `SettingMapper` |
#### Archived
| Priority | Done | Task |
| -------- | ---------- | ------------------------------------------------------------ |
| medium | 2021.09.04 | **Editor**<br />Add document type (e.g. phone, meeting, email). Maybe use tags? Or are tags something else?!<br />**Not implemented:** Such notes should be stored in their own table in the respective module! |
| medium | 2021.09.13 | **DataMapper**<br />The hasMany order should be customizable (ASC/DESC and also the row used for the order e.g. createdAt, ...). <br />*Solution:* Implemented `::sortBy()` |
| high | 2021.09.07 | **Permissions**<br />The admin group permissions cannot be changed<br />No user can remove himself from the admin group |
| high | 2021.09.07 | **DataMapper**<br />Create `deleteRelation` function as opposite to `createRelation`.<br />Create `ModuleAbstract` function `deleteModelRelation` as opposite to `createModelRelation` |
| high | 2021.09.09 | **Table**<br />If column is numeric sort numerically, not by character (1,2,3 vs, 1, 10, 11, 2)<br />The table sort is WAY too slow!!! (e.g. editor-list by title).One problem might be a bad algorithm (e.g. get content, and use sort() of js instead, check new order and re-sort the table rows based on the ordered array). Another problem could be that the browser is doing some stupid stuff because of UI calls?<br />If column is datetime sort by datetime, not by character (careful, datetime formats can be different) |
| medium | 2021.09.13 | **DataMapper**<br />Implement hasMany default parameters in mappers (e.g. sortBy, sortOrder).<br />Remove the `orderBy` functionality from the `::with()` function since this is now replaced with the `::sortBy()` function |
| low | 2021.09.18 | **Application**<br />Applications should be able to define module dependencies which are installed/checked during the installation process. |
| low | 2021.09.20 | **Application**<br />The application install should be defined in a similar class as the module installation (see `StatusAbstract.php` which is implemented by `Install.php` scripts in modules). This means Applications should have their own `Install.php` script! At the moment the CMS module, Admin Module and ApplicationManager are doing this. |
| low | 2021.09.27 | **Media**<br />Allow to stream large media files also for downloads. |
## Features
Features to be implemented at a later stage *nice to haves*.
### Tasks & decisions
| Priority | Done | Task |
| -------- | ---- | ------------------------------------------------------------ |
| medium | | **Editor**<br />Create immediate text preview similar to a rich text editor or Typora. |
| low | | **Editor**<br />Create special markdown content (calendar, chart, task, news, comment, media, ...)<br />Allow download as markdown, text, PDF, word<br />Implement versioning. |
| low | | **Event Management**<br />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 %)<br />Add milestones |
| low | | **Project Management**<br />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 %)<br />Add milestones |
| low | | **Promotion**<br />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 %) |
| low | | **Finance**<br />Implement accounting forensics (Benfords Law, cent value distribution analysis, amount of bookings between specific amounts, amount * bookings between specific amounts, etc.) |
| low | | **Item Management**<br />Item view should be customizable since different groups have different interests and read permissions (e.g. sales reps, finance, etc.)<br />Show different prices on item profile frontpage (e.g. domestic, export, quantity discount) |
| low | | **Purchase**<br />Consider to add a purchased analysis, used analysis and manufactured analysis (currently only sales focused). Examples items delivered in time, bad quality ratio) |
| low | | **Kanban**<br />Allow board templates? maybe at least colors?<br />Allow card templates? maybe at least colors? |
| low | | **Billing**<br />Automatically create recurring bills (invoices, delivery notes, etc.) if a customer wants to receive items automatically |
| low | | **Media**<br />Create preview option for images (e.g. ctrl+mouse hover or a different "list-view" like in explorer)<br />Validate file size on the frontend before uploading<br />Automatically change the file encoding of text files<br />Enable image interlacing (in the past there was a bug)<br />Implement media encryption/decryption (optionally)<br />Implement media password protection for read (optionally)<br />Implement resumable uploads<br />Implement path changes in the frontend<br />Allow the modification of collections<br />Implement external resources (URLs, dropbox, aws, ...)<br />Allow to edit the breadcrumbs, which replaces them with a text field which can be changed then than automatically loads the new path<br />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**<br />Allow to transform a message as task<br />Implement push notification<br />Users may be invited to old conversations |
| low | | **Navigation**<br />Improve goto command to match based on proximity and only based on visible links<br />Consider to create on navigation language file (same as routing files) during the installation process<br />Create settings page which allows to modify the navigation in the module settings<br />Consider to implement tabs in the side bar<br />Consider to implement child elements on hover (sidebar and content) |
| low | | **News**<br />Implement email/message notification on create |
| low | | **Profile**<br />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**<br />Allow support/tickets to be transformed to Q&A question and answers<br />Allow Q&A to be transformed to support<br />Create support app with login<br />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**<br />Create settings with a set of default colors<br />Create a hook which gets triggered if a group is created. This hook also creates a tag |
| low | | **Settings**<br />Implement a setting which lets users see all content no matter the content language (e.g. all News) |
| low | | **Templates, Controllers, Views and Models**<br />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 |
| -------- | ---- | ---- |
| | | |
## Bugs
### Tasks & decisions
| Priority | Done | Task |
| -------- | ---- | ------------------------------------------------------------ |
| high | | **DataMapper**<br />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**<br />Fix employee list (see comment at the bottom, query builder bug) |
| low | | **FileLogger**<br />The logger is somehow *sometimes* logging in the main directory of OMS. Why? Debug it! |
| low | | **KMeans**<br />In some weird cases the Cluster test fails. This happens approximately 5 / 100 test runs (invalid center coordinate value) |
| low | | **Dashboard**<br />Why does admin not have a dashobard? Everyone should have it! |
| low | | **Table**<br />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! |
| low | | **Rest**<br />There is a weird bug where the `multipart/form-data` cannot use the normal `boundary=` header to define the boundary. If this *correct* format is used the server somehow cannot populate the `php://input` correctly. If we move the `=` to a different position e.g. `bound=ary` this works fine. Currently this is solved by not using a `=` sign but `/`. This requires further inspections later on and could result in a bug with a different webserver (e.g. nginx). |
#### Archived
| Priority | Done | Task |
| -------- | ---------- | ------------------------------------------------------------ |
| high | 2021.09.04 | **Table**<br />Tables overflow on smaller screen resolutions. A fix is necessary!!!<br />**Solution:** make main `overflow-x: auto` |
| low | 2021.09.12 | **Module installation log**<br />Not all modules can create a installation log in the auditor since the auditor is only installed afterwards but it seems too many modules don't create a install log. This could be because even if the auditor is installed, the active routes are only changed on the file system but not in memory of the current request (install request). As a result NO audit logs are created during the install process. One solution could be to reload the routes manually in the install script after every module installation. |
### Details
#### Joins on same tables
Problem if joins on same tables (e.g. staff-list)
The tabbed join is the problem, the second query is the solution. The problem is that you need a different alias which is hard to created since th alias usually is suffixed with the depths which is a problem in this case since the alias has nothing to do with the depth.
A solution could be to index the joins by depths+join count e.g. account_2_1, account_2_2
```sql
SELECT `account_2`.`account_name1` as account_name1_2, `account_2`.`account_name2` as account_name2_2, `account_2`.`account_name3` as account_name3_2
FROM `hr_staff` as hr_staff_4
LEFT JOIN `media` as media_3 ON `hr_staff_4`.`hr_staff_image` = `media_3`.`media_id`
LEFT JOIN `profile_account` as profile_account_3 ON `hr_staff_4`.`hr_staff_profile` = `profile_account_3`.`profile_account_id`
LEFT JOIN `account` as account_2 ON `media_3`.`media_created_by` = `account_2`.`account_id`
AND `profile_account_3`.`profile_account_account` = `account_2`.`account_id`
LEFT JOIN `l11n` as l11n_1 ON `account_2`.`account_localization` = `l11n_1`.`l11n_id`
LEFT JOIN `media` as media_2 ON `profile_account_3`.`profile_account_image` = `media_2`.`media_id`
LEFT JOIN `account` as account_1 ON `media_2`.`media_created_by` = `account_1`.`account_id`;
```
```sql
SELECT `account_2`.`account_name1` as account_name1_2, `account_2`.`account_name2` as account_name2_2, `account_2`.`account_name3` as account_name3_2
FROM `hr_staff` as hr_staff_4
LEFT JOIN `media` as media_3 ON `hr_staff_4`.`hr_staff_image` = `media_3`.`media_id`
LEFT JOIN `profile_account` as profile_account_3 ON `hr_staff_4`.`hr_staff_profile` = `profile_account_3`.`profile_account_id`
LEFT JOIN `account` as account_3 ON `media_3`.`media_created_by` = `account_3`.`account_id`
LEFT JOIN `account` as account_2 ON `profile_account_3`.`profile_account_account` = `account_2`.`account_id`
LEFT JOIN `l11n` as l11n_1 ON `account_2`.`account_localization` = `l11n_1`.`l11n_id`
LEFT JOIN `media` as media_2 ON `profile_account_3`.`profile_account_image` = `media_2`.`media_id`
LEFT JOIN `account` as account_1 ON `media_2`.`media_created_by` = `account_1`.`account_id`;
```
The problem is that every object needs to have a unique id so we could do this like `_d3_o5` as alias.
The problem with that however is that this would work for the getQuery() function but in the populateAbstract we don't know the object id. But maybe we can solve it by also passing the object ID here?
This seems like a full weekend test!!! Better focus on other things first.
## Drafts, concepts & ideas
Drafts, concepts & ideas which are more complex or require more explanation.
### Invoice OCR
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)
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.
6. Match template areas to invoice (consider slanted invoice, longer text etc.), extract partial images.
1. Template areas should ideally contain a keyword and the actual value.
7. Parse partial images
8. Match according to `regex`
9. Find item list area from template (recurring elements unless only one element is defined)
1. Start should be defined by keywords (e.g. table headline)
2. Create sub definitions such as quantity/unit, single price, total price, ...
3. How to identify end of list?
4. How to handle multiline line elements (e.g. detailed article/service description)
5. How to automatically find account (e.g. article number, description, template definition)?
Software:
1. Tessaract + OpenCV + above mentioned steps
2. Some Api (e.g. gogle vision ai, amazon textract, amazon rekognition)
### Database permission handling
#### Option 1
```sql
select ...
from ...
where ...
(
account_permission_account = ACCOUNT
AND (account_permission_unit IS NULL OR account_permission_unit = 'UNIT')
AND (account_permission_app IS NULL OR account_permission_app = 'APP')
AND (account_permission_module IS NULL OR account_permission_module = 'MODULE')
AND (account_permission_type IS NULL OR account_permission_type = 'TYPE')
AND (account_permission_element IS NULL OR account_permission_element = 'THIS_ID')
AND (account_permission_component IS NULL OR account_permission_component = 'COMPONENT')
AND account_permission_permission = ???
)
OR
(
group_permission_group IN (...)
AND (group_permission_unit IS NULL OR group_permission_unit = 'UNIT')
AND (group_permission_app IS NULL OR group_permission_app = 'APP')
AND (group_permission_module IS NULL OR group_permission_module = 'MODULE')
AND (group_permission_type IS NULL OR group_permission_type = 'TYPE')
AND (group_permission_element IS NULL OR group_permission_element = 'THIS_ID')
AND (group_permission_component IS NULL OR group_permission_component = 'COMPONENT')
AND group_permission_permission = ???
)
```
#### Option 2
1. Check if general permission exists -> just do query
2. Check for specific element exists -> just do query but with column_id IN (... elements ...)
```php
::with(PermissionAbstractMapper::class, $permissions)
// this will create a where condition generated by the PermissionAbstractMapper::class e.g. call PermissionAbstractMapper::createWith($query)
```
### New DataMapper structure
```php
TestMapper::getAll()
->with('profiles', limit: 10, sortBy: 'id', sortOrder: SortOrder::ASC)
->with('profils/account')
->limit(TestMapper::class, 5)
->sortBy('id', SortOrder::ASC)
->execute();
TestMapper::getAll()
->depth(3)
->execute();
abstract class DataMapperAbstract
{
protected object $mapper;
protected static array $cache = [];
protected int $type = 0;
protected int $depth = 0;
public static function clear()
{
self::$cache = [];
}
public function __construct(object $mapper)
{
$this->mapper = $mapper;
}
abstract function execute();
}
class ReadMapper extends DataMapperAbstract
{
private $members = [];
public function with(string $variable, int $limit = 0, $sortBy = '', $sortOrder = SortOrder::DESC) : self
{
// $split = \explode('/', $variable);
// maybe> $members[$split[0]] = [\implode('/', $split[1..n], $limit, $sortBy, $sortOrder];
}
public function get()
{
$this->type = MapperType::GET;
}
public function execute()
{
switch($this->type) {
case MapperType::GET:
return $this->executeGet();
break;
}
}
}
abstract class DataMapperFactory
{
public const COLUMNS = [];
public static function get()
{
return (new ReadMapper(static))->get();
}
public static function getAll()
{
return (new ReadMapper(static))->getAll();
}
public static function update()
{
return (new UpdateMapper(static))->update();
}
public static function delete()
{
return (new DeleteMapper(static))->delete();
}
}
class TestMapper extends DataMapperFactory
{
public const COLUMNS = [];
}
```
## Most recent changelog
### September 2021
#### New
##### Admin
* Module settings can have a custom settings page by defining it in the module routing file. The template file should be stored in `\Modules\{Module}\Admin\Settings`.
* Settings now can have a regex pattern for validation. If it is not empty, setting changes must meet the pattern.
* Settings can now be installed by providing a `Admin.install.json` to the Admin module.
##### Media
* The media_type is now a table for custom media types.
* The media_type has a *installExternal* binding similar to uploading media files during module installation or collection creation.
* Media files are now streamed to the user.
##### phpOMS Framework
* Created `deleteRelation` function as opposite to `createRelation`
* Created `deleteModelRelation` as opposite to `createModelRelation`
* `hasMany` definitions in mappers can now have an additional component `['sort' => ['orderBy' => 'memberName', 'sortOrder' => 'DESC/ASC']]` which allows default ordering behavior for hasMany relations. This is useful if a model expects a specific order most of the time.
* Mappers can have a custom ordering which also overwrites the default mapper ordering behavior introduced in this update. The ordering can be called with `::sortBy($memberName, 'ASC/DESC', ...)`
##### UI
* The table UI sort recognizes *ISO 8601* format and sorts them accordingly. Since the template doesn't always output *ISO 8601* formatted times, it is recommended to use the `data-content` attribute to store the *ISO 8601* formatted time. This allows localized visualization but correct sorting behavior.
##### Applications & CMS
* Applications are now installed through the CMS module.
* Applications can have dependencies.
* Applications can provide for other modules.
* Applications can install routes.
* Applications can install navigation elements.
* Applications can install pages.
* Applications can have their own controllers
* Applications have their own install scripts
#### Bug fixes
##### UI
* Tables are now overflowing with scroll bars below if the horizontal screen size is smaller than the table.
* Table UI sort performance got improved. The previous sort didn't terminate properly resulting in a infinite loop.
* The table UI sort recognizes pure numeric values and sorts them accordingly instead of alphabetical.
##### Auditor
* Audit logs are created during module status changes incl. module installation.
* Audit logs are now also created during the installation process.
#### Other
##### Admin
* The admin group permissions can no longer get modified, which ensures there is always a admin group with sufficient permissions.
* A user can no longer remove himself from the admin group in order to prevent mistakes.
##### UI
* The install script has improved highlighting for mandatory input fields.

View File

@ -0,0 +1,4 @@
[Dolphin]
PreviewsShown=true
Timestamp=2021,9,26,16,55,51
Version=4

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
Project/img/todo/slider.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -29,6 +29,7 @@ The main goal of the organization is to create solutions for companies and organ
* Multiple database support (mssql, mysql, postgresql)
* Multiple cache support (file, memcache, redis)
* Easily scalable
* Can be split across multiple servers
### Weaknesses
@ -38,20 +39,21 @@ The main goal of the organization is to create solutions for companies and organ
#### Technical PoV
* Request based code execution. Database and cache connection is request based and not persistent etc.
* Concurrency is difficult to solve due to the request based code execution
* 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
* Continuous digitalization and need to keep up with it
* 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
* Programming language performance improvement through JIT implementation
* Programming language performance improvement through usage of typehints during compilation
* 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
@ -59,6 +61,8 @@ The main goal of the organization is to create solutions for companies and organ
* 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
@ -105,9 +109,9 @@ For these customers the following points are most important:
###### Price
The price should be very competitive. This could be achieved by providing a cheap basic package which includes the essentials for most organizations with a licence for up to **5** users. There could be different packages for different types of organizations. However a small organization should look at a package and immediately recognize that this basically contains everything they need. Small organizations need to have trust in a product without having to understand all the technical details of functionality which may be required for larger organizations.
The price should be very competitive. This could be achieved by providing a cheap basic package which includes the essentials for most organizations with a license for up to **5** users. There could be different packages for different types of organizations. However a small organization should look at a package and immediately recognize that this basically contains everything they need. Small organizations need to have trust in a product without having to understand all the technical details of functionality which may be required for larger organizations.
At the same time the customer needs to be informed, that he can customize his package if he wants to (e.g. add additional modules). Only after providing these information the customer needs to be informed that he can also completely customize his modules if he so desires without a basic package. For mid- to large sized organizations other price strategies could be better.
At the same time the customer needs to be informed, that he can customize his package if he wants to (e.g. add additional modules). Only after providing these information the customer needs to be informed that he can also completely customize his modules if he so desires without a basic package. For mid to large sized organizations other price strategies could be better.
A basic package should not cost more than 10 EUR per month as this is comparable to other competitors. Competitors offer overall much less but compared to the *basic* package they either provide similar features or the user will have a difficult time to understand why he has to pay more.
@ -184,23 +188,23 @@ Late:
## 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 in 2018.
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.
| Description | PHP | C/C++ | C# | GO | Java | Rust | NodeJS | Python |
| --------------------------------------- | ---------- | --------- | ---------- | --------- | ---------- | --------- | ---------- | ---------- |
| Language experience | 10 | 4 | 6 | 1 | 3 | 2 | 2 | 1 |
| Performance (runtime) | 5 | 10 | 9 | 9 | 9 | 10 | 7 | 3 |
| Web integration (tools, api, libs) | 10 | 4 | 10 | 9 | 9 | 4 | 10 | 9 |
| Package management system | 10 | 4 | 7 | ? | 4 | 7 | 5 | ? |
| Webserver, Vserver, Rootserver support | 10 | 7 | 7 | 7 | 7 | 7 | 7 | 8 |
| Concurrency | "no" | yes | yes | yes | yes | yes | yes | "no" |
| Community size for web applications | 10 | 3 | 8 | 6 | 6 | 2 | 9 | 7 |
| Community momentum | stable | stable | increasing | stable | decreasing | stable | increasing | decreasing |
| Code execution | request | running | running | running | running | running | running | request |
| Code quality tools | 10 | ? | ? | ? | ? | ? | ? | ? |
| Availability of libs (e.g. pdf, excel) | 10 | ? | ? | ? | ? | ? | ? | ? |
| Easy to install on own server/pc | no | yes | yes | yes | yes | yes | no | no |
| Availability on third party hosts | 10 | 7 | 7 | 7 | 7 | 7 | 8 | 9 |
| Description | PHP | C/C++ | C# | GO | Java | Rust | NodeJS | Python |
| -------------------------------------- | --------- | ------- | ---------- | ------- | ---------- | ------- | ---------- | ---------- |
| Language experience | 10 | 4 | 6 | 1 | 3 | 2 | 2 | 1 |
| Performance (runtime) | 5 | 10 | 9 | 9 | 9 | 10 | 7 | 3 |
| Web integration (tools, api, libs) | 10 | 4 | 10 | 9 | 9 | 4 | 10 | 9 |
| Package management system | 10 | 4 | 7 | ? | 4 | 7 | 5 | ? |
| Webserver, Vserver, Rootserver support | 10 | 7 | 7 | 7 | 7 | 7 | 7 | 8 |
| Concurrency | "no" | yes | yes | yes | yes | yes | yes | "no" |
| Community size for web applications | 10 | 3 | 8 | 6 | 6 | 2 | 9 | 7 |
| Community momentum | stable | stable | increasing | stable | decreasing | stable | increasing | decreasing |
| Code execution | "request" | running | running | running | running | running | running | "request" |
| Code quality tools | 10 | ? | ? | ? | ? | ? | ? | ? |
| Availability of libs (e.g. pdf, excel) | 10 | ? | ? | ? | ? | ? | ? | ? |
| Easy to install on own server/pc | no | yes | yes | yes | yes | yes | no | no |
| Availability on third party hosts | 10 | 7 | 7 | 7 | 7 | 7 | 8 | 9 |
The decision why Orange Management decided to use PHP came down to the following points:

View File

@ -2,8 +2,6 @@
The following list shows the domains and their purpose/reasoning:
## Owned
### orange-management.org
Organization page
@ -66,12 +64,3 @@ Used by the support
Same as .org just for marketing reasons but maybe used server environment in the future.
## Not Owned
### orange-management.blog
There is no reason for a blog at this point and if there will be one, then it will be a dev-blog which will be located at the .dev tld.
### orange-management.biz
This domain is just not appealing.

95
Strategy/FAQ/Pitching.md Normal file
View File

@ -0,0 +1,95 @@
# FAQ: Pitching
## General
* How long does this software exist in the market?
* Developed since 2013
* Used since 2017 for various projects
* How many developers are working on it?
* TBD
* How many customers do you have?
* TBD
## Legal
* Do you have a GDPR / DSGVO certificate?
* TBD
* Do you have any other audit certificates
* TBD
* Where is the data stored? Our servers only?
* Depends on your needs, both are possible
## Pricing
* What are the costs for the software
* Costs depend on the amount of users/licenses and modules installed:
* Recurring: There are license fees per user batches (e.g. 1, 5, 10, 15, 25, 50, 100, 150, 250, 500, 1000, unlimited)
* One-Off: One time payments for modules. Prices depend on the modules.
* Optional: Installation (if on your local server, mandatory for cloud version), Hotline, Customization, ...
* Maintenance
* Annual maintenance is included in the license fee
* We check error logs, application integrity, updates and database status and provide tips based on our findings
* Customization
* Depends on the customization, the hourly costs are 150 EUR
* Setup
* Cloud version: Setup fees on our servers are
* Local version: Support is optional, if you request it, it is
* Integration / Migration
* Depends on the software used and the existing data complexity
* Updates
* Included in the license fees
* Hotline
* Costs per minute are
* Alternatively, purchase a annual hotline/support package for
* 600 min for
* 6.000 min for
* Weekend and holidays are factored with 2x the time
## IT
* Is the software installed in the cloud or on our own server?
* Depends on your needs
* Some aspects can even be split e.g. shop cloud, erp local server
* What hardware is required for good performance?
* Network
* CPU
* GPU
* Drive
* RAM
* What software requirements are necessary?
* What are the programming languages you use?
* PHP & C
* Are there scripts / modules / procedures / extensions which can be created?
* Yes, bash scripts, jobs/schedules and custom scripts can be created
## References
* What companies use your software? / large companies & companies similar to ours?
* What was the reason for a customer stepping away from your software (before and after) implementing it
## Security
* How are passwords secured
* Hashed with bcrypt
* Encrypted data? / database / network
* Some modules use encrypted data and files (e.g. HR contracts)
* How often do you have updates / patches?
* On average at least weekly
* How do you ensure that the software is actually working as intended?
* We heave a large suit of automated tests
* We do in-house tests
* Users can submit error reports and bugs
## Features
* Is it possible to export data to excel
* Yes, most data can be exported to excel
* Is it possible to export data as pdf
* Yes, a lot of data can be exported as pdf
* Is it possible to import data from excel
* Yes, most data can be imported/updated from excel
* Is it possible to generate automated jobs / tasks
* Yes, there is a module for this. This requires a server which allows you to run jobs/tasks.
* Is the data live, calculated periodically or on demand?
* Depends on the data, all three are possible depending on the module and situation
* Does the update process work automatically?
* Updates can automatically start with jobs or you can start them manually
* How customizable is your software? Features, backend, frontend?
* The software his highly customizable
## Other
* Do you have 24/7 support, weekend support...?
* Yes, the time is factored 2x

Binary file not shown.

169
Strategy/Risk Management.md Normal file
View File

@ -0,0 +1,169 @@
# Risk Management
## Key Terms, Descriptions, and Principles
### Risk
Risks are characterized by probability of occurrence and consequence. Through risk management, GDF applies resources to lessen the likelihood of a future event occurring and/or the consequence should it occur. As risks increase in probability, GDF should anticipate that the events will occur and should put plans in place early to mitigate the consequences.
### Risk Components
Risks have three components:
* A future cause (yet to happen), which if eliminated or corrected, would prevent a potential consequence from occurring
* A probability (or likelihood) assessed at the present time of that future cause occurring
* The consequence (or effect) of that future occurrence
## Risk Management
### Risk Management Process
Risk management is a continuous process. It is an organized methodology for continuously identifying and measuring the unknowns; developing mitigation options; selection, and implementing appropriate risk mitigations; and tracking the implementation to ensure successful risk reduction.
### Risk Management Process Model
The following four-steps represent the management process
* Identification: What has, can or will go wrong?
* Assessment: What is the likelihood of the risk and the consequence of the risk?
* Mitigation: What, if anything, will be done about the risk?
* Monitoring: How was the risk changed?
### Top-Level Guidelines for Effective Risk Management
* Assess the causes of risks and develop strategies to manage these risks
* Identify as early as possible, and intensively manage those that critically affect OMS
* Include tests and evaluations as part of the risk management process.
* Include industry knowledge in risk management. Likelihood and consequence should be compared with experiences from similar industries.
* Use a proactive, structured risk assessment and analysis to identify and analyze root causes.
* Utilize risk assessment checklists if applicable
* Establish risk mitigation plans and obtain resources for such plans
* Include internal processes as part of risk assessment.
* Clearly define a set of evaluation criteria for assigning risk ratings for identified root causes.
## Risk Identification
The intent of risk identification is to answer the question “What can go wrong?” by:
* Looking at current and proposed staffing, processes, suppliers, products, resources, dependencies, etc.
* Reviewing potential shortfalls against expectations
* Analyzing negative trends
Risk identification is the activity that examines each element of the company to identify associated causes, begin their documentation, and set the stage for their successful management. Risk identification begins as early as possible and continues with regular analyses.
### Risk Categories
* Operational Risk
* Financial Risk
* Compliance Risk
* Strategic Risk
* Other Risk
## Risk Analysis
Risk analysis answers the question “What are the likelihood and consequence of the risk?” and “How high is the risk?”. The following tasks are part of the risk analysis:
* Estimate the likelihood the risk event will occur
* Estimate the possible consequence in terms of cost, schedule and performance
* Determine the resulting risk level and prioritize for mitigation
Risk analysis provides an estimate of each risks likelihood and consequence, and the resulting risk level in order to more effectively manage risks and prioritize mitigation efforts. Consistent predefined likelihood and consequence criteria provide a structured means for the evaluating risks so decision makers can make objective comparisons.
### Likelihood
Risk likelihood is the evaluated probability an event will occur given existing conditions. The estimated likelihood of the risk should be tied to a specific well-defined risk event or condition and risk statement. The following table provides the criteria for establishing the initial assessment of likelihood of a risk occurring.
| Level | Likelihood | Probability of Occurrence |
| ----- | -------------- | ------------------------- |
| 5 | Near Certainty | \> 80% |
| 4 | Highly likely | \> 60% ≤ 80% |
| 3 | Likely | \> 40% ≤ 60% |
| 2 | Low Likelihood | \> 20% ≤ 70% |
| 1 | Not Likely | \> 0% ≤ 20% |
The initial assessment of probability of occurrence needs to be considered in combination with consequences, should the event be realized, and also the effectiveness of mitigation actions when making decisions on whether a given probability level is too high and would preclude proceeding on a planned course of action. Depending on the circumstances, there may be cases in which a risk (probability and consequence) is high enough to change course, in the absence of assured mitigation.
While dealing with individual risks, decision makers should understand the overall risk exposure of the company and the threat that cumulative or compounding effects of multiple risks pose to successfully satisfying business objectives. Multiple risks may expose the company to a greater risk than any individual risk due to complexity, stretched resources, risk interactions, or the aggregate likelihood of the risk realization.
### Consequence
During analysis, each risk should be evaluated in terms of impact should the risk be fully realized. Risk consequence is measured as a deviation against historic company or business specific baselines.
| Level | Likelihood | Cost over Budget | Schedule | Performance |
| ----- | ------------------ | ---------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 5 | Critical Impact | > 10% | Schedule slip will require a major schedule rebaselining | Degradation precludes system from meeting a KPP or key technical/supportability threshold. Unable to meet mission objectives |
| 4 | Significant Impact | \> 5% ≤ 10% | Schedule slip puts funding at risk | Degradation impairs ability to meet a KSA. Technical design or supportability margin exhausted in key areas. Significant performance impact affecting System-of System interdependencies. Work-arounds required to meet mission objectives |
| 3 | Moderate Impact | \> 1% ≤ 5% | Schedule slip impacts synchronization with interdependent expectations by greater than 3 months | Unable to meet lower tier attributes, TPMs, or CTPs. Design or supportability margins reduced. Minor performance impact affecting System-of System interdependencies. Work-arounds required to achieve mission tasks. |
| 2 | Minor Impact | ≤ 1% | Some schedule slip, but can meet dates within 1 month | Reduced technical performance or supportability; can be tolerated with little impact on program objectives. Design margins reduced, within trade space |
| 1 | Minimal Impact | +0% | Minimal schedule impact | Minimal consequences to meeting technical performance or supportability requirements. Design margins will be met; margin to planned tripwires |
## Risk Mitigation
The risk mitigation strategy includes the options or combination of options and the specific implementation approach. It answers the question “What is the plan to address the risk?” or “Should the risk be accepted, avoided, transferred, or controlled?”. After analyzing the risks, the company should develop a strategy to manage risks by evaluating the four risk mitigation options:
* Avoiding risk by eliminating the cause and/or the consequence
* Controlling the cause or consequence
* Transferring the risk to other entities
* Assuming the level of risk and continuing on the current plan
Some risk mitigation activities may be implemented as contingency plans when a specific triggering event occurs. The level of detail in risk mitigation depends on the nature of the risk to be addressed. When selecting the mitigation option(s) and formulating the implementation approach, the risk owner should address questions such as:
* Is the risk mitigation plan feasible (options and implementation approach)?
* Is the risk mitigation plan affordable in terms of funding and any needed additional resources (e.g. personnel, equipment)?
* Is adequate time available to drop and implement the risk mitigation plan?
* What impact does the risk mitigation plan have?
* Are the expectations realistic given circumstances, constraints, and objectives?
### Risk Acceptance (and Monitoring)
By accepting the risk, the company acknowledges that the risk event or condition may be realized and is prepared to accept the consequences. Accepting a risk does not mean it should be ignored. The company should continue to track the risk to ensure the accepted consequences do not change for the worse or the likelihood increase. Monitoring implies the company establishes knowledge points that provide opportunities to reevaluate the risk. Before accepting the risk, the company should identify the resources and schedule that would be needed should the risk be realized.
### Risk Avoidance
Through risk avoidance, a program the company reduces or eliminates the risk event or condition by taking an alternate path. It eliminates the source of the risk and replaces it with another solution.
### Risk Transfer
Risk transfer includes reassigning or delegating responsibility for tasks to mitigate a risk to another entity. This might include transferring the financial responsibility as well. This approach may involve reallocating risk management tasks from one party to another. The same risk may be carried by multiple entities. However, it should be recognized that the transference of risk does not eliminate all responsibility and risks must be monitored for potential consequences.
### Risk Control
The risk control option seeks to actively reduce risk to an acceptable level. Control generally entails taking action to reduce the likelihood, or the consequence, of a risk to as low as practical in order to minimize potential impacts.
Control options should result in reduced risk likelihood and/or consequence. Risk control activities often reduce the likelihood of the risk event occurring or accelerate knowledge affecting the likelihood. The result may be a new risk description with revised consequences and an updated prioritization and mitigation strategy.
## Risk Monitoring
Risk monitoring answers the question “How has the risk changed?” or “How are the risk mitigation plans working? Based on results, should additional actions be taken to mitigate or control the risk?”.
Risk monitoring includes a continuous process to systematically track and evaluate the performance of risk mitigation plans against established metrics. Not all risk mitigation will be successful. The company should reevaluate the risk mitigation approach and associated activities to determine effectiveness and whether action is needed.
Risk monitoring includes recording, maintaining, and reporting risks, risk analysis, risk mitigation, and tracking results. If a risk changes significantly, the company should adjust the risk mitigation strategy accordingly. If the risk is lower than previously analyzed, the company may reduce or cancel risk mitigation activities and consider freeing resources for other uses. If risk severity increases, appropriate risk mitigation efforts should be developed and implemented.
## Review
The Risk Management System needs to be reviewed on a regular basis in terms of effectiveness and efficiency. The review should be performed by independent personnel (either internal or external) and adjusted to changes accordingly.
The review should be performed on an annual basis.
## Risk Register
The risk register is a central repository to describe and track risks as well as record actions. It includes information for each risk such as risk category, likelihood, consequence, mitigation measures, risk owner and documentation of changes.
| Risk No. | O | Category | S | Risk Event | L | C | Mitigation Strategy | Changes | Comments |
| -------- | ---- | ---------------- | ------ | ------------------------------------------------------------ | ---- | ---- | ------------------------------------------------------------ | ------- | ------------------------------------------------------------ |
| 1 | DE | Operational Risk | Active | Loss of source code | 1 | 5 | Avoiding: Store source code in cloud (github). At least one local developer PC and project server. | | |
| 2 | DE | Operational Risk | Active | Source code leak | 5 | 1 | Controlling: The programming language is compiled at runtime. The value of the software lies in the updates, support and licenses. | | Many companies transferred the revenue model to subscriptions (e.g. Adobe, Microsoft) in order to avoid similar problems. |
| 3 | DE | Operational Risk | Active | User acquires additional permissions without authorization (every software which uses permissions) | 2 | 5 | Avoiding: Permissions can only be granted by users which have received the permissions to do so. Users which can change permissions may also only have the permission to change specific users/permissions (single application elements, not the whole application.). We provide a documentation on who to manage permissions incl. best practices. Customers with a maintenance contract also receive additional advice based on their account permission handling. We also check regularly if features can be used by default without the necessary permissions. | | The consequences or severities depend on the permissions which can be acquired. |
| 4 | DE | Operational Risk | Active | User code execution (every software which allows data upload/input) | 3 | 5 | Avoiding: User provided code is a critical part of some modules (e.g. Helper, Job). These modules provided by OMS execute code user code in iframes. We provide guidelines regarding this sensitive topic which explains that only developers in a company should have access to such functionalities. | | |
| 5 | DE | Operational Risk | Active | Data leak (e.g. database data, file uploads) (every software which stores data) | 2 | 5 | Avoiding: We regularly check if users have access to data without the necessary permissions. Our modules may use encryption for extremely sensitive data. Media files are only accessible through the media module which allows to check the necessary reading permissions. We also provide a general policy for customers who to secure and maintain their servers. | | This is a big problem for almost every company working with data. The biggest known leaks happened among others to Adobe, ebay, Equifax, LinkedIn, Yahoo, ... |
| 6 | DE | Operational Risk | Active | Corrupt/malicious data injection (every software which accepts data input) | 3 | 3 | Avoiding: Data is validated client side (minimal protection) and server side. Generally, user input is only accepted if it matches the specified allowed format. Data is usually not sanitized to avoid mistakes during the sanitizing process. Database query statements are prepared and encoded. | | |
Abbreviations:
* O: Owner
* L: Likelihood
* C: Consequence