Merged master into apollo-client branch. Withdrew the communityAPI call for the gdtTransactionList and replaced it with the apollo query.
2
.github/workflows/test.yml
vendored
@ -317,7 +317,7 @@ jobs:
|
||||
report_name: Coverage Backend Login
|
||||
type: lcov
|
||||
result_path: ./coverage/coverage.info
|
||||
min_coverage: 25
|
||||
min_coverage: 34
|
||||
token: ${{ github.token }}
|
||||
|
||||
##############################################################################
|
||||
|
||||
3
.gitignore
vendored
@ -3,4 +3,5 @@
|
||||
.vscode
|
||||
messages.pot
|
||||
.skeema
|
||||
nbproject
|
||||
nbproject
|
||||
.metadata
|
||||
|
||||
25
CHANGELOG.md
@ -4,15 +4,38 @@ All notable changes to this project will be documented in this file. Dates are d
|
||||
|
||||
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
||||
|
||||
#### [1.3.1](https://github.com/gradido/gradido/compare/1.2.1...1.3.1)
|
||||
|
||||
- update code for correct transactions listening [`#725`](https://github.com/gradido/gradido/pull/725)
|
||||
- bugfix: change to new frontend passwort reset [`#724`](https://github.com/gradido/gradido/pull/724)
|
||||
- feat: Add Pagination Buttons to GDT Transaction List [`#716`](https://github.com/gradido/gradido/pull/716)
|
||||
- fix bug, change statment from transaction infbox [`#712`](https://github.com/gradido/gradido/pull/712)
|
||||
- 650-display of the gdt transactions [`#687`](https://github.com/gradido/gradido/pull/687)
|
||||
- Login-Server bug fix, allow names with 2 characters also [`#714`](https://github.com/gradido/gradido/pull/714)
|
||||
- Apollo sendCoins via Login-Server [`#699`](https://github.com/gradido/gradido/pull/699)
|
||||
- increase coverage to 34% [`#700`](https://github.com/gradido/gradido/pull/700)
|
||||
- mobile friendly, add text, change text [`#683`](https://github.com/gradido/gradido/pull/683)
|
||||
- Css color input error [`#646`](https://github.com/gradido/gradido/pull/646)
|
||||
- Apollo gdt [`#686`](https://github.com/gradido/gradido/pull/686)
|
||||
- Backend Setup [`#584`](https://github.com/gradido/gradido/pull/584)
|
||||
- text-size in textarea and font-variante if focus [`#677`](https://github.com/gradido/gradido/pull/677)
|
||||
- 680 app large maximum width [`#681`](https://github.com/gradido/gradido/pull/681)
|
||||
- linting, server is working [`34b30b2`](https://github.com/gradido/gradido/commit/34b30b216b6fafcb5b686d4b023b05f2e9766bdf)
|
||||
- server stack seems to work. Graphql does not load properly yet [`43f7cf8`](https://github.com/gradido/gradido/commit/43f7cf87679713d436a64d569d6af1594a12ee33)
|
||||
- initial commit, base packages [`fdf0979`](https://github.com/gradido/gradido/commit/fdf0979830fece04208a6b3bb06bb5323a3c149b)
|
||||
|
||||
#### [1.2.1](https://github.com/gradido/gradido/compare/1.2.0...1.2.1)
|
||||
|
||||
> 22 July 2021
|
||||
|
||||
- release 1.2.1 [`#670`](https://github.com/gradido/gradido/pull/670)
|
||||
- exchange positions of decay in transaction in old frontend [`#662`](https://github.com/gradido/gradido/pull/662)
|
||||
- fix unneccessary migration run on fresh (docker) setup [`#654`](https://github.com/gradido/gradido/pull/654)
|
||||
- move back decay as standalone transaction in old frontend [`#656`](https://github.com/gradido/gradido/pull/656)
|
||||
- fix display error with creation [`#652`](https://github.com/gradido/gradido/pull/652)
|
||||
- release [`a0b8056`](https://github.com/gradido/gradido/commit/a0b8056c17b22570a1b1dbb6fa6ce71e561b04af)
|
||||
- update content for frontend [`d37ce09`](https://github.com/gradido/gradido/commit/d37ce0949ef97d2a6c6ffaf0be31db9f6d92e743)
|
||||
- exchange positions [`bc000ef`](https://github.com/gradido/gradido/commit/bc000efd87c9701480c4aeaa7b819ab49bfe8f01)
|
||||
- update init db dataset [`ca4ef82`](https://github.com/gradido/gradido/commit/ca4ef82b874185f3d93acf8d1fca9ad6d3dadcaf)
|
||||
|
||||
#### [1.2.0](https://github.com/gradido/gradido/compare/1.1.1...1.2.0)
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
Healthy money for a healthy world
|
||||
|
||||

|
||||

|
||||
|
||||
The Gradido model can create global prosperity and peace
|
||||
The Corona crisis has fundamentally changed our world within a very short time.
|
||||
@ -39,4 +39,4 @@ git submodule update --recursive --init
|
||||
## Useful Links
|
||||
|
||||
- [Gradido.net](https://gradido.net/)
|
||||
- [Discord](https://discord.gg/kA3zBAKQDC)
|
||||
- [Discord](https://discord.gg/kA3zBAKQDC)
|
||||
|
||||
@ -5,12 +5,26 @@ export class GdtTransactionInput {
|
||||
@Field(() => String)
|
||||
email: string
|
||||
|
||||
@Field(() => Number)
|
||||
firstPage?: number
|
||||
@Field(() => Number, { nullable: true })
|
||||
currentPage?: number
|
||||
|
||||
@Field(() => Number)
|
||||
items?: number
|
||||
@Field(() => Number, { nullable: true })
|
||||
pageSize?: number
|
||||
|
||||
@Field(() => String)
|
||||
@Field(() => String, { nullable: true })
|
||||
order?: string
|
||||
}
|
||||
@ArgsType()
|
||||
export class GdtTransactionSessionIdInput {
|
||||
@Field(() => Number)
|
||||
sessionId: number
|
||||
|
||||
@Field(() => Number, { nullable: true })
|
||||
currentPage?: number
|
||||
|
||||
@Field(() => Number, { nullable: true })
|
||||
pageSize?: number
|
||||
|
||||
@Field(() => String, { nullable: true })
|
||||
order?: string
|
||||
}
|
||||
|
||||
@ -33,8 +33,8 @@ export class GdtEntryList {
|
||||
@Field(() => Number)
|
||||
count: number
|
||||
|
||||
@Field(() => [GdtEntry])
|
||||
gdtEntries: GdtEntry[]
|
||||
@Field(() => [GdtEntry], { nullable: true })
|
||||
gdtEntries?: GdtEntry[]
|
||||
|
||||
@Field(() => Number)
|
||||
gdtSum: number
|
||||
|
||||
@ -10,11 +10,11 @@ export class GdtResolver {
|
||||
@Query(() => GdtEntryList)
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
async listGDTEntries(
|
||||
@Args() { email, firstPage = 1, items = 5, order = 'DESC' }: GdtTransactionInput,
|
||||
@Args() { email, currentPage = 1, pageSize = 5, order = 'DESC' }: GdtTransactionInput,
|
||||
): Promise<GdtEntryList> {
|
||||
email = email.trim().toLowerCase()
|
||||
const result = await apiGet(
|
||||
`${CONFIG.GDT_API_URL}/GdtEntries/listPerEmailApi/${email}/${firstPage}/${items}/${order}`,
|
||||
`${CONFIG.GDT_API_URL}/GdtEntries/listPerEmailApi/${email}/${currentPage}/${pageSize}/${order}`,
|
||||
)
|
||||
|
||||
if (!result.success) {
|
||||
|
||||
@ -3,6 +3,8 @@ import CONFIG from '../../config'
|
||||
import { TransactionList } from '../models/Transaction'
|
||||
import { TransactionListInput, TransactionSendArgs } from '../inputs/TransactionInput'
|
||||
import { apiGet, apiPost } from '../../apis/loginAPI'
|
||||
import { GdtEntryList } from '../models/GdtEntryList'
|
||||
import { GdtTransactionSessionIdInput } from '../inputs/GdtInputs'
|
||||
|
||||
@Resolver()
|
||||
export class TransactionResolver {
|
||||
@ -17,18 +19,38 @@ export class TransactionResolver {
|
||||
return new TransactionList(result.data)
|
||||
}
|
||||
|
||||
@Query(() => GdtEntryList)
|
||||
async gdtTransactionList(
|
||||
@Args()
|
||||
{ sessionId, currentPage = 1, pageSize = 25, order = 'DESC' }: GdtTransactionSessionIdInput,
|
||||
): Promise<GdtEntryList> {
|
||||
console.log(
|
||||
`${CONFIG.COMMUNITY_API_URL}listGDTTransactions/${currentPage}/${pageSize}/${order}/${sessionId}`,
|
||||
)
|
||||
const result = await apiGet(
|
||||
`${CONFIG.COMMUNITY_API_URL}listGDTTransactions/${currentPage}/${pageSize}/${order}/${sessionId}`,
|
||||
)
|
||||
if (!result.success) {
|
||||
console.log('? ', result)
|
||||
throw new Error(result.data)
|
||||
}
|
||||
return new GdtEntryList(result.data)
|
||||
}
|
||||
|
||||
@Query(() => String)
|
||||
async sendCoins(
|
||||
@Args() { sessionId, email, amount, memo }: TransactionSendArgs,
|
||||
): Promise<string> {
|
||||
const payload = {
|
||||
session_id: sessionId,
|
||||
email,
|
||||
amount,
|
||||
target_email: email,
|
||||
amount: amount * 10000,
|
||||
memo,
|
||||
auto_sign: true,
|
||||
transaction_type: 'transfer',
|
||||
blockchain_type: 'mysql',
|
||||
}
|
||||
const result = await apiPost(CONFIG.COMMUNITY_API_URL + 'sendCoins', payload)
|
||||
const result = await apiPost(CONFIG.LOGIN_API_URL + 'createTransaction', payload)
|
||||
if (!result.success) {
|
||||
throw new Error(result.data)
|
||||
}
|
||||
|
||||
@ -25,7 +25,10 @@ class AppRequestsController extends AppController
|
||||
$this->loadComponent('GradidoNumber');
|
||||
//$this->loadComponent('JsonRpcRequestClient');
|
||||
//$this->Auth->allow(['add', 'edit']);
|
||||
$this->Auth->allow(['index', 'sendCoins', 'createCoins', 'getBalance', 'listTransactions', 'getDecayStartBlock']);
|
||||
$this->Auth->allow([
|
||||
'index', 'sendCoins', 'createCoins', 'getBalance',
|
||||
'listTransactions','listGDTTransactions', 'getDecayStartBlock'
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@ -271,8 +274,6 @@ class AppRequestsController extends AppController
|
||||
public function getBalance($session_id = 0)
|
||||
{
|
||||
$this->viewBuilder()->setLayout('ajax');
|
||||
$this->response = $this->response->withType('application/json');
|
||||
|
||||
$login_result = $this->requestLogin($session_id, false);
|
||||
if($login_result !== true) {
|
||||
$this->set('body', $login_result);
|
||||
@ -303,16 +304,12 @@ class AppRequestsController extends AppController
|
||||
}
|
||||
|
||||
$body['decay_date'] = $now;
|
||||
$this->addAdminError("AppRequests", "getBalance", $body, $user['id']);
|
||||
$this->set('body', $body);
|
||||
}
|
||||
|
||||
public function listTransactions($page = 1, $count = 25, $orderDirection = 'ASC', $session_id = 0)
|
||||
{
|
||||
|
||||
$this->viewBuilder()->setLayout('ajax');
|
||||
$this->response = $this->response->withType('application/json');
|
||||
|
||||
$startTime = microtime(true);
|
||||
|
||||
$login_result = $this->requestLogin($session_id, false);
|
||||
@ -343,17 +340,13 @@ class AppRequestsController extends AppController
|
||||
$limit = $count;
|
||||
$offset = 0;
|
||||
$skip_first_transaction = false;
|
||||
if($page == 1) {
|
||||
$limit--;
|
||||
} else {
|
||||
if($page > 1) {
|
||||
$offset = (( $page - 1 ) * $count) - 1;
|
||||
}
|
||||
if($offset) {
|
||||
$limit++;
|
||||
$skip_first_transaction = true;
|
||||
if($orderDirection == 'ASC') {
|
||||
$offset--;
|
||||
}
|
||||
}
|
||||
|
||||
if($offset && $orderDirection == 'ASC') {
|
||||
$offset--;
|
||||
}
|
||||
|
||||
//echo "limit: $limit, offset: $offset, skip first transaction: $skip_first_transaction<br>";
|
||||
@ -366,6 +359,11 @@ class AppRequestsController extends AppController
|
||||
//->page($page)
|
||||
->offset($offset)
|
||||
;
|
||||
$state_user_transactions_count = $stateUserTransactionsQuery->count();
|
||||
if($state_user_transactions_count > $offset + $limit) {
|
||||
$skip_first_transaction = true;
|
||||
}
|
||||
|
||||
$decay = true;
|
||||
if($page > 1) {
|
||||
$decay = false;
|
||||
@ -391,7 +389,7 @@ class AppRequestsController extends AppController
|
||||
'state' => 'success',
|
||||
'transactions' => $transactions,
|
||||
'transactionExecutingCount' => $session->read('Transactions.executing'),
|
||||
'count' => $stateUserTransactionsQuery->count(),
|
||||
'count' => $state_user_transactions_count,
|
||||
'gdtSum' => $gdtSum,
|
||||
'timeUsed' => microtime(true) - $startTime
|
||||
];
|
||||
@ -409,6 +407,45 @@ class AppRequestsController extends AppController
|
||||
$this->set('body', $body);
|
||||
}
|
||||
|
||||
public function listGDTTransactions($page = 1, $count = 25, $orderDirection = 'ASC', $session_id = 0)
|
||||
{
|
||||
$timeBegin = microtime(true);
|
||||
$this->viewBuilder()->setLayout('ajax');
|
||||
|
||||
$login_result = $this->requestLogin($session_id, false);
|
||||
|
||||
if($login_result !== true) {
|
||||
return $this->returnJson($login_result);
|
||||
}
|
||||
$session = $this->getRequest()->getSession();
|
||||
$user = $session->read('StateUser');
|
||||
|
||||
if(!$user) {
|
||||
return $this->returnJson(['state' => 'error', 'msg' => 'user not found', 'details' => 'exist a valid session cookie?']);
|
||||
}
|
||||
|
||||
$gdtEntries = $this->JsonRequestClient->sendRequestGDT([
|
||||
'email' => $user['email'],
|
||||
'page' => $page,
|
||||
'count' => $count,
|
||||
'orderDirection' => $orderDirection
|
||||
], 'GdtEntries' . DS . 'listPerEmailApi');
|
||||
|
||||
if('success' == $gdtEntries['state']) {
|
||||
$timeEnd = microtime(true);
|
||||
$gdtEntries['data']['timeUsed'] = $timeEnd - $timeBegin;
|
||||
return $this->returnJson($gdtEntries['data']);
|
||||
|
||||
} else {
|
||||
if($user) {
|
||||
$this->addAdminError('StateBalancesController', 'ajaxGdtOverview', $gdtEntries, $user['id']);
|
||||
} else {
|
||||
$this->addAdminError('StateBalancesController', 'ajaxGdtOverview', $gdtEntries, 0);
|
||||
}
|
||||
}
|
||||
return $this->returnJson(['state' => 'error', 'msg' => 'error by requesting gdt server', 'details' => $gdtEntries]);
|
||||
}
|
||||
|
||||
public function getDecayStartBlock()
|
||||
{
|
||||
$transactionsTable = TableRegistry::getTableLocator()->get('Transactions');
|
||||
|
||||
@ -65,36 +65,14 @@ class StateBalancesController extends AppController
|
||||
if($update_balance_result['success'] !== true) {
|
||||
$this->addAdminError('StateBalances', 'overview', $update_balance_result, $user['id']);
|
||||
}
|
||||
|
||||
// sendRequestGDT
|
||||
// listPerEmailApi
|
||||
|
||||
$gdtSum = 0;
|
||||
//if('admin' === $user['role']) {
|
||||
$gdtEntries = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'sumPerEmailApi');
|
||||
//var_dump($gdtEntries);
|
||||
if('success' == $gdtEntries['state'] && 'success' == $gdtEntries['data']['state']) {
|
||||
$gdtSum = intval($gdtEntries['data']['sum']);
|
||||
} else {
|
||||
if($user) {
|
||||
$this->addAdminError('StateBalancesController', 'overview', $gdtEntries, $user['id']);
|
||||
} else {
|
||||
$this->addAdminError('StateBalancesController', 'overview', $gdtEntries, 0);
|
||||
}
|
||||
}
|
||||
//}
|
||||
//
|
||||
//
|
||||
|
||||
$stateBalancesTable = TableRegistry::getTableLocator()->get('StateBalances');
|
||||
$stateUserTransactionsTable = TableRegistry::getTableLocator()->get('StateUserTransactions');
|
||||
$transactionsTable = TableRegistry::getTableLocator()->get('Transactions');
|
||||
|
||||
$transactionsTable = TableRegistry::getTableLocator()->get('Transactions');
|
||||
|
||||
$stateBalancesTable->updateBalances($user['id']);
|
||||
|
||||
$gdtSum = 0;
|
||||
$gdtEntries = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'sumPerEmailApi');
|
||||
|
||||
if('success' == $gdtEntries['state'] && 'success' == $gdtEntries['data']['state']) {
|
||||
$gdtSum = intval($gdtEntries['data']['sum']);
|
||||
} else {
|
||||
@ -210,13 +188,30 @@ class StateBalancesController extends AppController
|
||||
return $result;
|
||||
}
|
||||
$user = $session->read('StateUser');
|
||||
$requestResult = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'listPerEmailApi');
|
||||
$requestResult = $this->JsonRequestClient->sendRequestGDT([
|
||||
'email' => $user['email'],
|
||||
'page' => 1,
|
||||
'count' => 100,
|
||||
'orderDirection' => 'DESC'
|
||||
], 'GdtEntries' . DS . 'listPerEmailApi');
|
||||
|
||||
//var_dump($requestResult);
|
||||
if('success' === $requestResult['state'] && 'success' === $requestResult['data']['state']) {
|
||||
|
||||
if('success' === $requestResult['state'] && 'success' === $requestResult['data']['state'])
|
||||
{
|
||||
$moreEntrysAsShown = false;
|
||||
if(isset($requestResult['data']['count'])) {
|
||||
if($requestResult['data']['count'] > 100) {
|
||||
$moreEntrysAsShown = true;
|
||||
}
|
||||
} else {
|
||||
$moreEntrysAsShown = $requestResult['data']['moreEntrysAsShown'];
|
||||
}
|
||||
//var_dump(array_keys($requestResult['data']));
|
||||
$ownEntries = $requestResult['data']['ownEntries'];
|
||||
if(isset($requestResult['data']['gdtEntries'])) {
|
||||
$ownEntries = $requestResult['data']['gdtEntries'];
|
||||
} else {
|
||||
$ownEntries = $requestResult['data']['ownEntries'];
|
||||
}
|
||||
//$gdtEntries = $requestResult['data']['entries'];
|
||||
|
||||
$gdtSum = 0;
|
||||
@ -239,8 +234,7 @@ class StateBalancesController extends AppController
|
||||
//echo "gdtSum: $gdtSum<br>";
|
||||
$this->set('gdtSum', $gdtSum);
|
||||
$this->set('ownEntries', $ownEntries);
|
||||
$this->set('gdtSumPerEmail', $requestResult['data']['gdtSumPerEmail']);
|
||||
$this->set('moreEntrysAsShown', $requestResult['data']['moreEntrysAsShown']);
|
||||
$this->set('moreEntrysAsShown', $moreEntrysAsShown);
|
||||
$this->set('user', $user);
|
||||
|
||||
if (isset($requestResult['data']['publishers'])) {
|
||||
|
||||
@ -19,13 +19,9 @@ function publisherLink($publisher, $the) {
|
||||
|
||||
$this->assign('title', __('GDT Kontoübersicht'));
|
||||
$header = '<h3>' . __('Zur Verfügung: ') . '</h3>';
|
||||
$gdtSumFromEmails = 0;
|
||||
foreach($gdtSumPerEmail as $email => $gdt) {
|
||||
$gdtSumFromEmails += $gdt;
|
||||
}
|
||||
|
||||
if($gdtSum > 0){
|
||||
$header .= '<h2>'.$this->element('printGDT', ['number' => $gdtSumFromEmails]).'</h2>';
|
||||
$header .= '<h2>'.$this->element('printGDT', ['number' => $gdtSum]).'</h2>';
|
||||
}
|
||||
if($moreEntrysAsShown) {
|
||||
$header .= '<span>'. __('Nur die letzten 100 Einträge werden angezeigt!') . '</span>';
|
||||
|
||||
@ -419,7 +419,7 @@ return [
|
||||
|
||||
'GroupAlias' => 'docker',
|
||||
'GDTServer' => [
|
||||
//'host' => 'gdt'
|
||||
'host' => 'https://gdt.gradido.net' // staging
|
||||
],
|
||||
'API' => [
|
||||
'allowedCaller' => ['login-server']
|
||||
|
||||
@ -71,6 +71,7 @@ services:
|
||||
- mariadb
|
||||
networks:
|
||||
- internal-net
|
||||
- external-net
|
||||
volumes:
|
||||
- ./community_server/config/php-fpm/php-ini-overrides.ini:/etc/php/7.4/fpm/conf.d/99-overrides.ini
|
||||
- ./community_server/src:/var/www/cakephp/src
|
||||
|
||||
36
docu/Concepts/BusinessRequirements/BenutzerVerwaltung.md
Normal file
@ -0,0 +1,36 @@
|
||||
# Benutzer-Verwaltung
|
||||
|
||||
Benutzer
|
||||
|
||||
* *
|
||||
* natürliche Person = TRUE (Flag für Schöpfungserlaubnis Human)
|
||||
* Vorname
|
||||
* Nachname
|
||||
* natürliche Person = FALSE (Flag für Schöpfungserlaubnis Human)
|
||||
* Projekt/Firmenname/Organisation/Verein...
|
||||
* Benutzername
|
||||
* Emailadresse
|
||||
* Konto
|
||||
* Trustlevel (Zukunft)
|
||||
|
||||
|
||||
Gradido-ID als Ersatz für Email-Adresse : server/nutzername
|
||||
|
||||
Nutzername ist pro server eindeutig
|
||||
|
||||
Nutzerprofil mit Bild und persönlichen Angeboten
|
||||
|
||||
|
||||
## Anwendungsfälle
|
||||
|
||||
### neuen Benutzer anlegen
|
||||
|
||||
### Benutzer bearbeiten
|
||||
|
||||
### Benutzer löschen
|
||||
|
||||
### Benutzer authentifizieren
|
||||
|
||||
### Benutzer authorisieren
|
||||
|
||||
### Benutzer bekanntgeben
|
||||
262
docu/Concepts/BusinessRequirements/CommunityVerwaltung.md
Normal file
@ -0,0 +1,262 @@
|
||||
# Verwaltung der Communities
|
||||
|
||||
Diese Konzept beschreibt den Begriff "Community" im Kontext von Gradido, welche Eingenschaften eine Community hat und was man mit einer Community alles machen kann.
|
||||
|
||||
## Die Bedeutung des Begriffs Community
|
||||
|
||||
Eine Community bedeutet im Kontext von Gradido eine Gemeinschaft von Personen, die sich nach der Philosophie von Gradido zu einer gemeinsamen Gruppierung zusammenschließen. Unter dem gemeinsamen Zusammenschluß folgen sie der Natürlichen Ökonomie des Lebens. Die Community dient dabei als Rahmen für die Gruppe von Personen, um ihnen den geregelten Zugang zu ermöglichen. Unter dem Begriff "Zugang zur Community" wird die Registrierung eines Benutzerkontos für eine Person verstanden. Dabei erfolgt eine Autentifizierung der Person, um einen personenspezifischen Zugriff auf die Community-Funktionalitäten zu ermöglichen. Denn eine Community bietet einer Person eine Vielzahl an Funktionalitäten, die ein Community-Mitglied nutzen kann. So steht die Verwaltung und das Handeln mit Gradido-Geld als die Hauptfunktionalität einer Community im Vordergrund. Doch sind auch weitere Funktionalitäten, wie eine Selbstdarstellung über Benutzerprofile oder ein sich Vernetzen mit Community-Mitgliedern, aber auch ein Community übergreifendes Vernetzen als soziale Netzewerke möglich. So können aus kleinen Communities über Vertrauensverhältnisse Zusammenschlüsse mehrere eigenständigen Communities entstehen oder auch eine Hierarchie von Communities als Parent-Child-Verbindung aufgebaut werden (siehe weiter unten "Community-Modelle").
|
||||
|
||||
Innerhalb der Community erfolgt die Umsetzung und Verwaltung des "lebendigen Geldes". Soll heißen hier werden die Mechanismen zur Dreifachen-Schöpfung vollzogen, die das geschöpfte Geld nach den Community-Regeln auf die drei Arten von Empfängerkonten (Benutzerkonto, Gemeinwohlkonto und Ausgleichs- und Umweltkonto) verteilt. Ein Community-Mitglied kann über seinen Community-Zugang auf sein persönliches Benutzerkonto zugreifen und darüber sein Gradido-Geld verwalten. Neben der Einsicht auf seinen aktuellen Kontostand kann er u.a. seine regelmäßig geschöpften Gradido einsehen, mit vorhandenen Gradido bezahlen oder einem anderen Mitglied Gradido überweisen. Die Geldbewegungen werden als eine Liste von Transaktionen geführt und die Vergänglichkeit der Gradidos immer aktuell zur Anzeige gebracht.
|
||||
|
||||
Nach der Bedeutung des Begriffs Community werden nun die Eigenschaften einer Community detailliert beschrieben, damit all die zuvor erwähnten Möglichkeiten der Community abbildbar sind.
|
||||
|
||||
## Eigenschaften einer Community
|
||||
|
||||
Hier werden die Eigenschaften einer Community beschrieben, die notwendig sind, um die oben erwähnten Möglichkeiten der Community zu erfüllen. Es geht dabei um verschiedene Themen und ihre dazu notwendigen Prozesse, die wiederum unter Verweiß in anderen Dokumenten detailter beschrieben sind.
|
||||
|
||||
### Anzeige und -Darstellung
|
||||
|
||||
Da es also mehrere Communities geben wird, benötigt jede Community ihren eigenen Namen und gar ein Symbol oder Bild, um eine optische Unterscheidung bei der Anzeige in den Systemen sicherzustellen. Für eine Aussendarstellung wäre eine Beschreibung der Community und ihre eigene Philosopie, was die Community auszeichnet hilfreich. Diese Werte müssen vom Community-Administrator gepflegt werden können.
|
||||
|
||||
### Mitgliederverwaltung
|
||||
|
||||
Für die Verwaltung von Community-Mitgliedern werden entsprechende Verwaltungsprozesse wie Registrierung, Login mit Autentifizierung, eine Benutzerverwaltung für neue, bestehende und ausscheidende Mitgleider benötigt. Die Benutzerverwaltung stellt zusätzlich die Anforderung, dass ein Community-Mitglied eindeutig identifizierbar ist und das Community übergreifend. Das bedeutet es kann eine Person immer nur einmal existieren und darf auch niemals in mehreren Communities gleichzeitig Mitglied sein. Denn es muss sichergestellt werden, dass eine Person sich keine unerlaubte Vorteil durch zum Beispiel mehrfache Geldschöpfung in mehreren Communities verschafft. Die Details der Mitgliederverwaltung werden beschrieben im Dokument [BenutzerVerwaltung](.\BenutzerVerwaltung.md).
|
||||
|
||||
### Community-Vernetzung
|
||||
|
||||
Für die Community-Vernetzung sind Verwaltungsprozesse zwischen den Communities und auch den Community-Mitgliedern notwendig, um entsprechende Vertrauensverhältnisse aufzubauen. Diese müssen den notwendigen Sicherheitsansprüchen genügen, da darauf aufbauend dann später die Geld-Flüsse abgewickelt werden. Entsprechend den Community-Modellen (siehe im folgenden Unterkapitel **Community Modelle**) wird ein Prozess benötigt, der die Hierarchie bzw. das Vertrauensverhältnis zwischen zwei eigenständigen Communities aufbaut und daraus dann die möglichen Funktionalitätserweiterungen für die Mitglieder bzw. den Communities freischaltet bzw. unterstützt. Zusätzlich wird auch der jeweilige umgekehrte Prozess benötigt, der eine bestehende Hierarchie bzw. ein bestehendes Vertrauensverhältnis zwischen zwei Communities auflöst und löscht, sowie die daraus resultierenden Funktionseinschränkungen für die Mitglieder und die betroffenen Communities.
|
||||
|
||||
Zum besseren Verständnis der Community-Vernetzung erfolgt hier eine Beschreibung der möglichen Konstellationen, wie sich Communities miteinander verbinden können.
|
||||
|
||||
#### Community Modelle
|
||||
|
||||
Bei Gradido werden verschiedene Modelle von Community-Abhängigkeiten unterstützt. Dabei soll unterschieden werden zwischen:
|
||||
|
||||
* eigenständige Community
|
||||
* sich gegenseitig vertrauende Communities
|
||||
* von einander abhängige (vererbende) Communities
|
||||
* Mischung aus den vorherigen Modellen
|
||||
|
||||
Das nachfolgende Bild zeigt einen ersten Eindruck über die unterschiedlichen Community-Modelle:
|
||||
|
||||

|
||||
|
||||
##### Eigenständige Community
|
||||
|
||||
Eine eigenständige Community zeichnet sich darin aus, dass sie keine Beziehung zu einer anderen Community aufgebaut hat. Das heißt sie hat weder eine vertrauenswürdige Verknüpfung mit einer zweiten Community, noch hat sie eine Verbindung zu einer Parent-Community und besitzt auch selbst keine Verbindung zu einer Child-Community. Somit kann diese Community für ihre Mitglieder nur Community intern wirksame Prozesse anbieten. Das heißt es ist kein Community übergreifender Handel bzw. Austausch von Gradido möglich. Andererseits werden in dieser Community die Prozesse freigeschaltet, dass ein Aufbau eines vertrauenswürdiges Verhältnis zu einer anderen Community erlaubt, der Aufbau einer Parent-Beziehung und auch der Aufbau einer Child-Beziehung ermöglicht. Die zugehörigen Abbau-Prozesse dagegen sind nicht freigeschalten. Der Community übegreifende Überprüfungsprozess bei der Mitglieder-Registrierung zur eindeutigen Identifikation in der Mitglieder-Verwaltung zählt dabei nicht als vertrauenswürdige Verbindung zwischen Communities.
|
||||
|
||||
##### Gegenseitig vertrauende Communities
|
||||
|
||||
*Hier soll beschrieben werden, was den Unterschied auszeichnet zu einer "Eigenständigen Community", wie man das gegenseitige Vertrauen (sprich Verknüpfung) zwischen zwei oder mehreren Communities auf- und wieder abbaut, was bedarf es an Vorraussetzungen für einen Vertrauens-Auf/Abbau und welche Konsequenzen der Auf- und Abbau des gegenseitigen Vertrauens haben soll.*
|
||||
|
||||
Das Modell der sich *gegenseitig vertrauenden Communities* entspringt der Idee des sich miteinander Vernetzens und damit das Handeln und Agieren mit Gradido-Mitgliedern, die nicht in der eigenen Community als Mitglied registriert sind. Um dies zu ermöglichen bedarf es einem Aufbau-Prozess zwischen zwei Communities, die sich zukünftig gegenseitig ein enges Vertrauen schenken. Auf der Basis dieses Vertrauens tauschen die beiden Communities Informationen untereinander aus, so dass für die Mitglieder beider Communities die Funktionalitäten auf der Gradido-Plattform so transparent erscheinen, als ob sie alle Mitglied einer Community wären. Das würde sich beispielsweise bei der Suche nach einem bestimmten Community-Mitglied auswirken, da nun alle Mitgleider beider Communities in einer Liste zur Anzeige gebracht werden können. Oder der Transfer von Gradidos von einem Mitglied zu einem anderen Mitglied ist über dieses Community-Verhältnis nun auch Community übergreifend möglich. Auch weitere Angebote, die bisher nur in einer Community zur Verfügung standen, sind nun auch den Mitgliedern der anderen Community zugänglich.
|
||||
|
||||
Während des Aufbau-Prozesses werden neben den eigentlichen Security relevanten Informationen für den Aufbau und die Sicherstellung des Vertrauensverhältnisses auch fachliche Informationen ausgetauscht. Unter fachlichen Informationen sind die nun freigeschaltenen Angebote beider Communities gemeint. Somit werden in der einen Community nun auch die fachlichen Prozesse und Angebote der anderen Community zugänglich und freigeschalten und umgekehrt. Wie feingranular die Prozesse und Angebote dabei ausgetauscht und freigeschaltet werden unterliegt einer administrativen Konfiguration der jeweiligen Community. Das heißt der Administrator jeder Community kann im Vorfeld selektiv konfigurieren welche Angebote und Prozesse beim Aufbau-Prozess für ein Vertrauensverhältnis mit einer anderen Community übertragen und freigeschaltet werden. Diese Konfiguration sollte zuvor Community intern abgestimmt sein, um nicht schon zu Beginn der Zusammenarbeit der beiden Communities irgendwelche Missstimmungen unter den Mitgliedern zu verursachen. Die Details des *Vertrauensverhältnis Aufbau-Prozesses* sind weiter unten im Kapitel **Anwendungsfälle** beschrieben.
|
||||
|
||||
##### Abhängige Communities
|
||||
|
||||
*Hier soll beschrieben werden, was den Unterschied zu eigenständigen und sich gegenseitig vertrauenden Communities zu den hier abhängigen (sprich vererbten) Communities auszeichnet, welche Vorraussetzungen bedarf der Auf/Abbau einer abhängigen Community und welche Konsequenzen hat der Auf- und Abbau von abhängigen Communities.*
|
||||
|
||||
Das Modell der *abhängigen Communities* findet seinen Ursprung den Föderalismus von Deutschland in einer Community-Struktur abbilden zu können. Das bedeutet, dass eine baumartige Struktur von Communities aufgebaut werden kann, wie nachfolgendes Bild schemenhaft zeigt:
|
||||
|
||||

|
||||
|
||||
Es wird somit zwischen zwei Communities aus benachbarten Ebenen eine Parent-Child-Beziehung erzeugt. Dadurch gehen diese beiden Communities eine besondere Beziehung untereinander ein, die zu folgenden veränderten Eigenschaften und Verhalten der Parent- und der Child-Community führen:
|
||||
|
||||
###### Parent-Community
|
||||
|
||||
* kann 1 bis n Child-Communities besitzen
|
||||
* verwaltet keine Mitglieder mit AGE-Konto
|
||||
* verwaltet nur noch Community eigenes Allgemeinwohl-Konto und AUF-Konto
|
||||
* benötigt in der Parent-Child-Beziehung einen besonderen Verteilungsschlüssel für das geschöpfte Geld auf die beiden Allgemeinwohl- und AUF-Konten in Richtung Child- nach Parent-Community
|
||||
* bedarf spezieller Administrations-Rechte und Rollen zum Auf- und Abbau der Child-Community-Beziehungen
|
||||
* bedarf spezieller Administrationsprozesse zur Verwaltung der Parent-Aufgaben:
|
||||
* Auf- und Abbau der Parent-Child-Beziehung
|
||||
* Verschiebung aller Mitglieder von der Parent- in die Child-Community
|
||||
* Stoppen des Sicherstellungsprozesses, dass eine *natürliche Person* nur Mitglied einer einzigen Community ist, sobald die erste Child-Beziehung aufgebaut ist und alle Mitglieder dahin verschoben sind
|
||||
* Prozess zur Aufnahme der geschöpften Allgemeinwohl- und AUF-Gelder aus den Child-Communities
|
||||
* stoppt den Schöpfungsprozess sobald eine Child-Beziehung aufgebaut ist
|
||||
* startet den Schöpfungsprozess sobald die letzte Child-Beziehung aufgelöst ist
|
||||
* Aufnahmeprozess von Mitgliedern aus einer Child-Community, bevor dessen Beziehung aufgelöst wird
|
||||
* starten des Sicherstellungsprozesses, dass eine *natürliche Person* nur Mitglied einer einzigen Community ist, sobald die letzte Child-Beziehung aufgelöst ist
|
||||
|
||||
###### Child-Community
|
||||
|
||||
* besitzt genau eine Parent-Community
|
||||
* **sofern es eine Community der untersten Ebene ist:**
|
||||
* verwaltet die Mitglieder mit AGE-Konto
|
||||
* nimmt die *natürliche Personen*-Mitglieder aus der Parent-Community auf
|
||||
* bietet einen Wechsel-Prozess für ein Mitglied aus dieser Community in eine andere (Child)-Community
|
||||
* läuft hier der automatische 3-fach-Schöpfungsprozess inklusive der Verteilung des geschöpften Geldes gemäß dem zuvor definierten Verteilungsschlüssel innerhalb der Community
|
||||
* wird hier sicher gestellt, dass nur auf PersonalAccounts von *natürlichen Personen* und nicht auf ImpersonalAccounts von *Projekten/Vereine/Firmen* Geld geschöpft wird
|
||||
* **sofern es eine Parent-Community gibt:**
|
||||
* läuft hier der Verteilungsprozess aus der Schöpfung auf das Allgemeinwohl- und AUF-Konto gemäß des Verteilungsschlüssels in Richtung von Child nach Parent also von unten nach oben
|
||||
* hier läuft der Prozess zur Sicherstellung, dass eine *natürliche Person* nur Mitglied einer einzigen (Child)-Community ist
|
||||
*
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
##### Mischung aus den vorherigen Modellen
|
||||
|
||||
*Hier soll beschrieben werden welche möglichen Mischungen von Modellen erlaubt sind und welche nicht, was hat eine Mischungsvariante an Konsequenzen, wie wird eine Mischungsvariante auf/abgebaut, welche Vorraussetzungen bedarf es für den Auf/Abbau einer Mischungsvariante.**
|
||||
|
||||
### Geldschöpfung
|
||||
|
||||
Eine Community stellt die Mechanismen für die Dreifache-Geldschöpfung bereit. Dazu müssen zuerst die Verteilungsschlüssel auf die drei Kontoarten definiert bzw. konfigurierbar sein. Diese Konfigurationswerte werden vom Community-Administrator gepflegt. Sie dienen als Grundlage für die Höhe der regelmäßig geschöpften Beträge auf die drei Empfängerkonto-Typen. Die regelmäßige Geldschöpfung läuft automatisiert im Hintergrund und muss den Regeln der Nartürlichen Ökonomie des Lebens folgen. Die Details der Dreifachen Geldschöpfung sind in dem Dokument [RegelnDerGeldschoepfung](./RegelnDerGeldschoepfung.md) beschrieben.
|
||||
|
||||
### Konto-Verwaltung
|
||||
|
||||
Durch die Dreifach-Geldschöpfung verwaltet die Community auch die drei Arten von Konten: Benutzerkonto, Gemeinwohlkonto und Ausgleichs- und Umweltkonto(AUF).
|
||||
|
||||
Für jedes Mitglied der Community wird also ein eigenes Benutzerkonto verwaltet, auf das ein Drittel der monatlichen Geldschöpfung fließt. Das Gemeinwohlkonto und das AUF-Konto existieren pro Community einmal und auf jedes der beiden Konten fließen monatlich die beiden anderen Drittel der Geldschöpfung.
|
||||
|
||||
Somit muss also eine Community für jede Kontoart die entsprechenden Kontoverwaltungsprozesse anbieten. Einmal in Verbindung pro Mitglied für das Benutzerkonto und dann jeweils eine Verwaltung für das Gemeinwohlkonto und eine Verwaltung für das AUF-Konto. Die Berechtigungen für die Zugriffe auf die drei Kontoarten müssen ebenfalls in der Community gepflegt und kontrolliert werden. Das bedeutet die Community muss ihren Mitgliedern auf ihre eigenen Benutzerkonten Zugriffsrechte erteilen und diese auch kontrollieren, so dass keine unerlaubten Zugriffe stattfinden können. Dann müssen in der Community bestimmte Mitglieder Sonderberechtigungen erhalten, um die Verwaltung des Gemeinwohlkontos und des AUF-Kontos durchführen zu können. Die Verwaltung der Berechtigungen ist wiederum alleine dem Community-Administrator erlaubt. Die Details der Kontenverwaltung ist im Dokument [KontenVerwaltung](.\KontenVerwaltung.md) beschrieben.
|
||||
|
||||
### Berechtigungsverwaltung
|
||||
|
||||
Die Community muss für die verschiedenen Eigenschaften und Prozesse eine eigene Berechtigungsverwaltung zur Verfügung stellen. Für die verschiedenen Berechtigungen muss ein Rollen- und Rechte-Konzept administrierbar sein, so dass für die verschiedenen Mitglieder der Community die Zugriffe feingranular definiert, gesteuert und kontrolliert werden können. Allein der Administrator hat die Rechte auf die Berechtigungsverwaltung zuzugreifen. Das System muss diese hinterlegten Rollen und Rechte dann auf die verwalteten Mitglieder abbilden und für jeden Zugriff auf die Community entsprechend kontrollieren, freigeben oder verhindern.
|
||||
|
||||
### Attribute einer Community
|
||||
|
||||
In diesem Kapitel werden die Attribute beschrieben, die in einer Community zu speichern sind.
|
||||
|
||||
#### Name
|
||||
|
||||
Das Attribut *Name* dient zur möglichst eindeutigen Benennung der Community. Er wird als Menschen lesbare Anzeige und als Unterscheidungskriterium bei mehreren Communities eingesetzt. Nur der Community Administrator kann diesen setzen und verändern.
|
||||
|
||||
#### Bild
|
||||
|
||||
Das Attribut *Bild* wird für die Anzeige einer Community verwendet und kann nur vom Community-Administrator gesetzt werden.
|
||||
|
||||
#### Beschreibung
|
||||
|
||||
Das Attribut *Beschreibung* ist ein Text, der die Philosophie der Community ausdrücken soll. Hier können sich die Community-Mitglieder eine gemeinsame Formulierung ausdenken, die nach ihrer Vorstellung den Kern und die Grundregeln ihrer Gemeinschaft am besten ausdrücken. Dies könnte wie eine Art Aussendarstellung für neue Mitglieder dienen. Aber nur der Community-Administrator hat die Schreib-Rechte für dieses Attribut.
|
||||
|
||||
#### Serverzuordnung
|
||||
|
||||
Das Attribut *Serverzuordnung* ist technisch motiviert und dient zusammen mit dem Attribut Name der eindeutigen Identifikation einer Community. Bei der Gründung einer neuen Community muss festgelegt werden auf welchem Server diese Community gehostet wird - auf einem schon vorhandenen Server oder ein extra für diese Community neu aufgesetzter Server. Das Attribut Serverzuordnung muss aber für eine Virtualisierung und technische Skalierung auf mehrere Server-Instanzen vorbereitet sein, sodass keine direkte physische Hardware-Serverzuordnung hierdurch fixiert ist. Aber auch ein eventueller Umzug der Community von einem Server auf einen anderen Server muss möglich sein. Der Community-Administrator hat alleiniges Zugriffsrecht auf dieses Attribut.
|
||||
|
||||
#### Liste von Benutzer
|
||||
|
||||
Dieses Listenattribut beinhaltet Benutzer-Elemente, die erfolgreich als Mitglied der Community registriert sind. Die Details eines Benutzer-Elements werden in dem Dokument [BenutzerVerwaltung](./BenutzerVerwaltung.md) beschrieben. Ein Benutzer-Element besitzt wiederum ein Konto, das für die Community als Ziel der Schöpfung für das AGE des Mitglieds dient. Gleichzeitig wird für ein Benutzer-Element aber auch unterschieden zwischen einem Menschkonto (PersonalAccount) und einem Sachkonto (ImpersonalAccount). Denn nur für ein Benutzerelement mit PersonalAccount, sprich für eine *natürliche Person*, darf Geld für das AGE geschöpft werden, wohingegen für ein Benutzerelement mit ImpersonalAccount, sprich für ein *Projekt/Verein/Sache*, kein Geld geschöpft werden darf.
|
||||
|
||||
#### Gemeinwohlkonto
|
||||
|
||||
Das Attribut *Gemeinwohlkonto* dient als ein Konto-Element, das den Kontotyp Gemeinwohlkonto repräsentiert. Alle Kontobewegungen, wie Geldschöpfung, Geldtransfers, etc., die das Gemeinwohl dieser Community betreffen, werden über dieses Attribut abgewickelt. Details zu Kontobewegungen werden im Dokument [KontenVerwaltung](KontenVerwaltung.md) beschrieben und die Regeln und Vorgänge der Geldschöpfung sind im Dokument [RegelnDerGeldschoepfung](RegelnDerGeldschoepfung.md) zu finden. Auf dieses Attribut haben nur Mitglieder mit entsprechenden Zugriffsrechten die Erlaubnis und Möglichkeiten darauf Einsicht zu nehmen und Prozesse auszulösen.
|
||||
|
||||
#### Ausgleichs- und Umweltkonto AUF-Konto
|
||||
|
||||
Das Attribut *Ausgleichs- und Umweltkonto* dient als ein Konto-Element, das den Kontotyp AUF-Konto repräsentiert. Alle Kontobewegungen, wie Geldschöpfung, Geldtransfers, etc., die das AUF-Konto dieser Community betreffen, werden über dieses Attribut abgewickelt. Details zu Kontobewegungen werden im Dokument [KontenVerwaltung](KontenVerwaltung.md) beschrieben und die Regeln und Vorgänge der Geldschöpfung sind im Dokument [RegelnDerGeldschoepfung](RegelnDerGeldschoepfung.md) zu finden. Auf dieses Attribut haben nur Mitglieder mit entsprechenden Zugriffsrechten die Erlaubnis und Möglichkeiten darauf Einsicht zu nehmen und Prozesse auszulösen.
|
||||
|
||||
#### Verteilungsschlüssel der Dreifachen-Schöpfung
|
||||
|
||||
Im Attribut *Verteilungsschlüssel* der Dreifach-Schöpfung werden die für die Community festgelegten Verteilschlüssel konfiguriert. Diese Werte dienen als Grundlage für die Geldschöpfung innerhalb dieser Community. Nur der Administrator hat Zugriffsrechte auf dieses Attribut.
|
||||
|
||||
Sobald die Community in einer Parent-Child-Beziehung steht, muss das Attribut *Verteilungsschlüssel* ebenfalls die Verteilung der Allgemeinwohl- und AUF-Gelder zwischen Child und Parent-Community definieren. Die erweiterte Konfiguration des Verteilungsschlüssel muss Teil des Aufbau-Prozesses einer Parent-Child-Beziehung sein bzw. währenddessen geprüft und konfiguriert werden.
|
||||
|
||||
#### Parent
|
||||
|
||||
Das Attribut *Parent* dient für den hierarchischen Aufbau von Communities. Es enthält den Bezug auf die Community, die für diese Community als Eltern-Community eingerichtet ist. Eine Child-Community kann maximal eine Parent-Community haben. Durch diesen Bezug zu der Parent-Community werden einzelne Prozesse zwischen der Parent- und der Child-Community freigeschalten. Damit ergeben sich erweiterte Möglichkeiten u.a. für die Community-Mitglieder beider Communities, wie beispielsweise das Community übergreifende Handeln zwischen den Community-Mitgliedern oder eine veränderte Verteiltung der Gemeinwohl- und AUF-Schöpfung, etc.. Die Administration dieses Attributes erfolgt implizit über die fachlichen Prozesse, die den Auf- und Abbau einer Parent-Child-Beziehung zwischen zwei Communities steuern. Diese können nur durch den Adminitrator und seiner Berechtigung ausgelöst werden. Die Beschreibung dieser Prozesse ist weiter unten im Kapitel **Anwendungsfälle auf einer Community** zu finden.
|
||||
|
||||
#### Liste Children
|
||||
|
||||
Das Attribut *Liste Children* dient ebenfalls dem hierarchischen Aufbau von Communities. Es enthält die Bezüge auf die Communities, die für diese Community als Child-Community eingerichtet sind. Eine Parent-Community kann mehrere Child-Communities haben. Durch diesen Bezug zu den Child-Communities werden einzelne Prozesse zwischen der Parent- und den Child-Communities freigeschalten. Damit ergeben sich erweiterte Möglichkeiten u.a. für die Community-Mitglieder beider Communities, wie beispielsweise das Community übergreifende Handeln zwischen den Community-Mitgliedern oder eine veränderte Verteiltung der Gemeinwohl- und AUF-Schöpfung, etc.. Die Administration dieses Attributes erfolgt implizit über die fachlichen Prozesse, die den Auf- und Abbau einer Parent-Child-Beziehung zwischen zwei Communities steuern. Diese können nur durch den Administrator und seiner Berechtigung ausgelöst werden. Die Beschreibung dieser Prozesse ist weiter unten im Kapitel **Anwendungsfälle auf einer Community** zu finden.
|
||||
|
||||
#### Liste Trusted Communities
|
||||
|
||||
Das Attribut *Liste Trusted Communities* dient dem Aufbau von gleichberechtigten Community-Gruppierungen. Es enthält die Referenzen auf die Communities, die für diese Community als vertrauenswürdige Communities eingerichtet sind. Eine vertrauenswürdige Community-Gruppierung kann mehrere gleichberechtigte Communities haben. Durch diesen Bezug zu den vertrauenswürdigen Communities werden einzelne Prozesse zwischen den sich gegenseitig vertrauenden Communities freigeschalten. Damit ergeben sich erweiterte Möglichkeiten u.a. für die Community-Mitglieder beider Communities, wie beispielsweise das Community übergreifende Handeln zwischen den Community-Mitgliedern, etc.. Zwischen zwei *Trusted Communities* erfolgt keine Verteilung gemäß einem Verteilungsschlüssel von geschöpftem Geld das für das Allgemeinwohl- bzw. AUF-Konto bestimmt ist. Dies bleibt Eigentum jeder Community trotz vertrauenswürdiger Beziehung untereinander.
|
||||
|
||||
Die Administration dieses Attributes erfolgt implizit über die fachlichen Prozesse, die den Auf- und Abbau einer vertrauenswürdigen Beziehung zwischen zwei Communities steuern. Diese können nur durch den Adminitrator und seiner Berechtigung ausgelöst werden. Die Beschreibung dieser Prozesse ist im nachfolgenden Kapitel **Anwendungsfälle auf einer Community** zu finden.
|
||||
|
||||
|
||||
## Anwendungsfälle auf einer Community
|
||||
|
||||
Die nachfolgenden Anwendungsfälle beschreiben die fachlichen Vorraussetzungen, den fachlichen Ablauf und die fachlichen Veränderungen bzw. den fachlichen Status, der am Ende des erfolgreich abgeschlossenen Anwendungsfalles erreicht wird. Desweiteren erfolgt die fachliche Beschreibung der möglichen Fehlerfälle, in die ein Anwendungsfall münden kann und welcher fachlicher Status am Ende des Anwendungsfalles herrschen soll.
|
||||
|
||||
### Neue Community erstellen
|
||||
|
||||
*Allgemeine fachliche Beschreibung des Anwendungsfalles.*
|
||||
|
||||
#### Vorraussetzungen
|
||||
|
||||
#### Ablauf
|
||||
|
||||
#### Ende Status
|
||||
|
||||
#### Fehlerfälle
|
||||
|
||||
### Community bearbeiten
|
||||
|
||||
*Allgemeine fachliche Beschreibung des Anwendungsfalles.*
|
||||
|
||||
#### Vorraussetzungen
|
||||
|
||||
#### Ablauf
|
||||
|
||||
#### Ende Status
|
||||
|
||||
#### Fehlerfälle
|
||||
|
||||
### Community löschen
|
||||
|
||||
*Allgemeine fachliche Beschreibung des Anwendungsfalles.*
|
||||
|
||||
#### Vorraussetzungen
|
||||
|
||||
#### Ablauf
|
||||
|
||||
#### Ende Status
|
||||
|
||||
#### Fehlerfälle
|
||||
|
||||
### Trusted Community verbinden
|
||||
|
||||
*Allgemeine fachliche Beschreibung des Anwendungsfalles.*
|
||||
|
||||
#### Vorraussetzungen
|
||||
|
||||
#### Ablauf
|
||||
|
||||
#### Ende Status
|
||||
|
||||
#### Fehlerfälle
|
||||
|
||||
### Trusted Community lösen
|
||||
|
||||
*Allgemeine fachliche Beschreibung des Anwendungsfalles.*
|
||||
|
||||
#### Vorraussetzungen
|
||||
|
||||
#### Ablauf
|
||||
|
||||
#### Ende Status
|
||||
|
||||
#### Fehlerfälle
|
||||
|
||||
### Parent Community einrichten
|
||||
|
||||
*Allgemeine fachliche Beschreibung des Anwendungsfalles.*
|
||||
|
||||
#### Vorraussetzungen
|
||||
|
||||
#### Ablauf
|
||||
|
||||
#### Ende Status
|
||||
|
||||
#### Fehlerfälle
|
||||
|
||||
### Parent Community löschen
|
||||
|
||||
*Allgemeine fachliche Beschreibung des Anwendungsfalles.*
|
||||
|
||||
#### Vorraussetzungen
|
||||
|
||||
#### Ablauf
|
||||
|
||||
#### Ende Status
|
||||
|
||||
#### Fehlerfälle
|
||||
115
docu/Concepts/BusinessRequirements/GraDiDoTransaktionen.md
Normal file
@ -0,0 +1,115 @@
|
||||
# GraDiDo-Transaktionen
|
||||
|
||||
Im Kontext von GraDiDo gibt es unterschiedliche Arten von Transaktionen:
|
||||
|
||||
* das Schöpfen von GraDiDo (GDD)
|
||||
* das Übertragen von GDD
|
||||
* die Vergänglichkeit von GDD
|
||||
* das Schöpfen von GraDiDo-Transform (GDT)
|
||||
* das Übertragen von GDT
|
||||
* das Umwandeln von GDT in GDD
|
||||
* Campagnen-Transaktion auf GDT (Prozent Aufschlag auf aktuellen GDT-Saldo)
|
||||
|
||||
Dieses Konzept beschreibt für jede Art der Transaktion ihre fachliche Bedeutung, die notwendigen Vorraussetzungen, der fachliche Ablauf und den Ende-Status nach erfolgreicher Transaktionsbearbeitung. Desweiteren werden für jede Transaktionsart alle fachlich möglichen Fehlerfälle aufgeführt und welchen Endstatus die abgebrochene Transaktion dann hinterläßt.
|
||||
|
||||
## Schöpfen von GDD
|
||||
|
||||
*Hier erfolgt die fachliche Beschreibung der Transaktion*
|
||||
|
||||
### Vorraussetzungen
|
||||
|
||||
### Ablauf
|
||||
|
||||
### Ende Status
|
||||
|
||||
### Fehlerfälle
|
||||
|
||||
## Übertragen von GDD
|
||||
|
||||
*Hier erfolgt die fachliche Beschreibung der Transaktion*
|
||||
|
||||
### Vorraussetzungen
|
||||
|
||||
### Ablauf
|
||||
|
||||
### Ende Status
|
||||
|
||||
### Fehlerfälle
|
||||
|
||||
## Vergänglichkeit von GDD
|
||||
|
||||
*Hier erfolgt die fachliche Beschreibung der Transaktion*
|
||||
|
||||
### Vorraussetzungen
|
||||
|
||||
### Ablauf
|
||||
|
||||
### Ende Status
|
||||
|
||||
### Fehlerfälle
|
||||
|
||||
## Schöpfen von GDT
|
||||
|
||||
*Hier erfolgt die fachliche Beschreibung der Transaktion*
|
||||
|
||||
Das Schöpfen von Gradido-Transform wird aktuell (07.2021) über die Plattform Elopage abgewickelt. Das heißt ein auf Elopage registriertes Mitglied zahlt dort eine Summe von Euros auf sein Konto ein. Diese Transaktion in Elopage wird vom GDT-Server abgegriffen und in der GDT-Datenbank gespeichert.
|
||||
|
||||
Folgende Transaktions-Konstellationen können fachlich zwischen Elopage und dem GDT-Server auftreten bzw. müssen von den beteligten Systemen abgewickelt werden:
|
||||
|
||||

|
||||
|
||||
In Variante 1 ist zu sehen, dass die 21%-Transaktion vor der Übertragung der Elopage-Transaktion stattgefunden hat und die Berechnung des GDT-Kontostandes davon unberührt bleibt.
|
||||
|
||||
In Variante 2 taucht nun die Frage auf, wie man mit offenen Transaktionen aus Elopage umgeht. Sollen diese in der 21%-Transaktion mitberücksichtigt werden, dann hätte das eine Änderung der Kontostandsberechnung gegenüber Variante 1 zur Folge. Sollen diese offenen Transaktionen nicht mitberücksichtigt werden, dann wäre kein Unterschied gegenüber Variante 1.
|
||||
|
||||
In Variante 3 ist aber zu sehen, dass ein nicht berücksichtigen der offenen Transaktion einen weiteren Effekt nach sich zieht. Denn eine offene Transaktion könnte ja auch nicht erfolgreich committet, sondern könnte aus welchem Grund auch immer gecancelt werden. Das würde bedeuten, dass die 21%-Transaktion erst abgeschlossen werden kann, sobald die offene Transaktion erfolgreich beendet ist.
|
||||
|
||||
### Beschluß vom 27.01.2021:
|
||||
|
||||
Die aktuell implementierte Lösung des eigenständigen GDT-Servers sowie die GDT-Kontoführung ohne Amount und stetiger Berechnung des GDT-Saldos aus der Liste der Transaktionen bleibt vorerst bestehen, um die geplante 21%-Campagne für den 21.09.2021 nicht zu gefährden. Die Anzeige des GDT-Kontos in die neue GUI der Gradido-Anwendung wird gegen die neu eingeführte Apollo-Server-Instanz gehen, die aber wiederum die GDT-Requests nur an den GDT-Server durchreicht. Eine Migration der GDT-Serverlogik in die Gradido-Anwendung des Apollo-Server wird auf später verschoben.
|
||||
|
||||
|
||||
### Vorraussetzungen
|
||||
|
||||
### Ablauf
|
||||
|
||||
### Ende Status
|
||||
|
||||
### Fehlerfälle
|
||||
|
||||
## Übertragen von GDT
|
||||
|
||||
*Hier erfolgt die fachliche Beschreibung der Transaktion*
|
||||
|
||||
### Vorraussetzungen
|
||||
|
||||
### Ablauf
|
||||
|
||||
### Ende Status
|
||||
|
||||
### Fehlerfälle
|
||||
|
||||
## Umwandeln von GDT in GDD
|
||||
|
||||
*Hier erfolgt die fachliche Beschreibung der Transaktion*
|
||||
|
||||
### Vorraussetzungen
|
||||
|
||||
### Ablauf
|
||||
|
||||
### Ende Status
|
||||
|
||||
### Fehlerfälle
|
||||
|
||||
|
||||
## Campagnen-Transaktion auf GDT
|
||||
|
||||
*Hier erfolgt die fachliche Beschreibung der Transaktion*
|
||||
|
||||
### Vorraussetzungen
|
||||
|
||||
### Ablauf
|
||||
|
||||
### Ende Status
|
||||
|
||||
### Fehlerfälle
|
||||
42
docu/Concepts/BusinessRequirements/KontenVerwaltung.md
Normal file
@ -0,0 +1,42 @@
|
||||
# Kontoverwaltung
|
||||
|
||||
In Gradido werden mehrere Arten von Konten notwendig sein:
|
||||
|
||||
* Mitglieder-Konten
|
||||
* AGE-Konto in GDD mit Vergänglichkeit
|
||||
* Konto in GDT ohne Vergänglichkeit
|
||||
* Community-Konten
|
||||
* Allgemeinwohl-Konto in GDD mit Vergänglichkeit
|
||||
* AUF-Konto in GDD mit Vergänglichkeit
|
||||
|
||||

|
||||
|
||||
Ziel der Kontoverwaltung soll sein, dass es ein Basistyp eines Kontos gibt, der alle gemeinsamen Eigenschaften der verschiedenen Kontenarten beinhaltet. Ob es für die Unterschiede der verschiedenen Kontenarten dann eigene abgeleitete Konto-Typen geben wird oder ob in dem Basistyp die Unterschiede über Steuerungsattribute, wie Vergängglichkeits-Flag oder Währungsattribut, geregelt wird, bleibt der technischen Implementierung überlassen.
|
||||
|
||||
Grundlegend wird aber die Gradido-Anwendung die Implementierung aller Kontenarten enthalten und keine Separierung in eigenständigen Anwendungsinstanzen vorsehen.
|
||||
|
||||
## Eigenschaften
|
||||
|
||||
Die Basiseigenschaften eines Kontos in Gradido enthalten folgende Attribute:
|
||||
|
||||
* Name
|
||||
* Währung
|
||||
* Amount
|
||||
* Vergänglichkeits-Flag
|
||||
* Liste der Transaktionen
|
||||
|
||||
Beim Anlegen eines Kontos wird der Name, die Währung, der Amount-Wert auf 0,00 und das Flag der Vergänglichkeit gemäß Verwendungszweck des Kontos initialisiert. Im Anwendungsfall *Transaktion verarbeiten* wird ja nach Konto-Initialisierung (sprich Währung und Vergänglichkeitsflag) und Transaktionstyp die entsprechende Transaktionsverarbeitungslogik auf dem Amount des Kontos ausgeführt. Am Ende der Transaktionsverarbeitung wird die Transaktion in die Liste der Transaktionen aufgenommen und dient lediglich zur Nachvollziehbarkeit der Konto-Bewegungen bei der Anzeige. Die Details der Transaktionsverarbeitung wird im Kapitel **Transaktion verarbeiten** näher beschrieben.
|
||||
|
||||
Menschkonto (HumanAccount, PersonalAccount) vs Sachkonto (ItemAccount, ImpersonalAccount )
|
||||
|
||||
## Anwendungsfälle
|
||||
|
||||
### Konto neuanlegen
|
||||
|
||||
### Konto bearbeiten
|
||||
|
||||
### Konto löschen
|
||||
|
||||
### Konto ent/sperren
|
||||
|
||||
### Transaktion verarbeiten
|
||||
@ -0,0 +1,3 @@
|
||||
# Regeln der Geldschöpfung
|
||||
|
||||
*Hier werden die fachlichen Regeln der 3-fachen Schöpfung beschrieben*
|
||||
@ -0,0 +1,297 @@
|
||||
<mxfile>
|
||||
<diagram id="7TIwaco-nNd4k_Px12gs" name="Page-1">
|
||||
<mxGraphModel dx="955" dy="800" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0"/>
|
||||
<mxCell id="1" parent="0"/>
|
||||
<mxCell id="2" value="10 GDT Elopage-Tx<br>pending" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="160" y="80" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="4" value="10 GDT Elopage-Tx<br>success" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="400" y="80" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="5" value="10 GDT GDT-Tx<br>success" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
|
||||
<mxGeometry x="520" y="200" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="6" value="" style="endArrow=classic;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" source="2" target="3" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="510" y="470" as="sourcePoint"/>
|
||||
<mxPoint x="560" y="420" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="7" value="Tx-Transfer nach GDT" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="6" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.425" y="1" relative="1" as="geometry">
|
||||
<mxPoint as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="8" value="" style="endArrow=classic;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="519" y="120" as="sourcePoint"/>
|
||||
<mxPoint x="519.0000000000002" y="200" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="9" value="Tx-Transfer nach GDT" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="8" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.425" y="1" relative="1" as="geometry">
|
||||
<mxPoint as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="10" value="Normaler Transkationsablauf" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=16;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="40" y="20" width="240" height="20" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="19" value="Transkationsablauf mit 21%-Aktion" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=16;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="40" y="400" width="300" height="20" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="20" value="21%-Tx" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
|
||||
<mxGeometry x="190" y="640" width="60" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="21" value="Kontostand GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="20" y="280" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="22" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=16;entryX=0;entryY=1;entryDx=0;entryDy=0;" parent="1" target="2" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="160" y="280" as="sourcePoint"/>
|
||||
<mxPoint x="160" y="240" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="23" value="100 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="130" y="280" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="24" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=16;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="280" y="280" as="sourcePoint"/>
|
||||
<mxPoint x="280" y="240" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="25" value="100 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="250" y="280" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="26" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=16;entryX=0;entryY=1;entryDx=0;entryDy=0;" parent="1" target="4" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="400" y="280" as="sourcePoint"/>
|
||||
<mxPoint x="400" y="240" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="27" value="100 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="370" y="280" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="28" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=16;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="520" y="280" as="sourcePoint"/>
|
||||
<mxPoint x="520" y="240" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="29" value="100 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="490" y="280" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="30" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=16;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="640" y="280" as="sourcePoint"/>
|
||||
<mxPoint x="640" y="240" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="31" value="110 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="610" y="280" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="32" value="Kontostand GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="20" y="700" width="70" height="60" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="33" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=16;entryX=0;entryY=1;entryDx=0;entryDy=0;" parent="1" target="43" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="160" y="710" as="sourcePoint"/>
|
||||
<mxPoint x="160" y="600" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="34" value="100 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="130" y="720" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="35" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=16;entryX=1;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="36" target="20" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="280" y="640" as="sourcePoint"/>
|
||||
<mxPoint x="280" y="600" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="36" value="121 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="220" y="720" width="60" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="37" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=16;entryX=0;entryY=1;entryDx=0;entryDy=0;exitX=0.414;exitY=-0.075;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="38" target="45" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="400" y="640" as="sourcePoint"/>
|
||||
<mxPoint x="400" y="600" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="38" value="121 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="370" y="720" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="39" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=16;exitX=0.414;exitY=-0.075;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="40" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="520" y="640" as="sourcePoint"/>
|
||||
<mxPoint x="520" y="600" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="40" value="121 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="490" y="720" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="41" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=16;exitX=0.414;exitY=0.05;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="42" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="640" y="640" as="sourcePoint"/>
|
||||
<mxPoint x="640" y="600" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="42" value="131 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="610" y="720" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="43" value="10 GDT Elopage-Tx<br>pending" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="160" y="440" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="44" value="10 GDT GDT-Tx<br>pending" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
|
||||
<mxGeometry x="280" y="560" width="240" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="45" value="10 GDT Elopage-Tx<br>success" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="400" y="440" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="46" value="10 GDT GDT-Tx<br>success" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
|
||||
<mxGeometry x="520" y="560" width="120" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="47" value="" style="endArrow=classic;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" source="43" target="44" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="510" y="830" as="sourcePoint"/>
|
||||
<mxPoint x="560" y="780" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="48" value="Tx-Transfer nach GDT" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="47" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.425" y="1" relative="1" as="geometry">
|
||||
<mxPoint as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="49" value="" style="endArrow=classic;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="519" y="480" as="sourcePoint"/>
|
||||
<mxPoint x="519.0000000000002" y="560" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="50" value="Tx-Transfer nach GDT" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="49" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.425" y="1" relative="1" as="geometry">
|
||||
<mxPoint as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="3" value="10 GDT GDT-Tx<br>pending" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
|
||||
<mxGeometry x="280" y="200" width="240" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="51" value="21%-Tx" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
|
||||
<mxGeometry x="320" y="765" width="60" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="52" value="Kontostand GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="20" y="840" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="53" value="100 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="130" y="840" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="54" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=16;entryX=1;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="55" target="51" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="280" y="760" as="sourcePoint"/>
|
||||
<mxPoint x="280" y="720" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="55" value="133,1 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="344" y="840" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="56" value="110 GDT" style="text;html=1;strokeColor=#b85450;fillColor=#f8cecc;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="250" y="837" width="60" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="57" value="133,1 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="490" y="840" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="58" value="133,1 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="610" y="840" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="59" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=12;entryX=0;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="56" target="44" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="430" y="760" as="sourcePoint"/>
|
||||
<mxPoint x="480" y="710" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="60" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=12;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="57" target="40" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="430" y="750" as="sourcePoint"/>
|
||||
<mxPoint x="480" y="700" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="61" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=12;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="58" target="42" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="430" y="750" as="sourcePoint"/>
|
||||
<mxPoint x="480" y="700" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="62" value="" style="endArrow=none;html=1;fontSize=12;strokeWidth=3;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="10" y="760" as="sourcePoint"/>
|
||||
<mxPoint x="800" y="760" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="64" value="Variante 2" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=14;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="10" y="770" width="70" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="65" value="Variante 1" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=14;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="10" y="640" width="70" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="67" value="Kontostand GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="20" y="1000" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="68" value="100 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="130" y="1000" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="69" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=16;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="70" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="301" y="920" as="sourcePoint"/>
|
||||
<mxPoint x="401" y="920" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="70" value="100 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="365" y="1000" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="71" value="100 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="250" y="1000" width="60" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="72" value="100 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="490" y="1000" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="73" value="110 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="610" y="1000" width="70" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="74" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=12;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="72" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="430" y="910" as="sourcePoint"/>
|
||||
<mxPoint x="525" y="920" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="75" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=12;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="73" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="430" y="910" as="sourcePoint"/>
|
||||
<mxPoint x="645" y="920" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="76" value="" style="endArrow=none;html=1;fontSize=12;strokeWidth=3;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="10" y="880" as="sourcePoint"/>
|
||||
<mxPoint x="800" y="880" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="77" value="Variante 3" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=14;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="10" y="930" width="70" height="30" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="66" value="21%-Tx" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
|
||||
<mxGeometry x="320" y="924" width="400" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="78" value="" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;fontSize=16;entryX=1;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="79" target="66" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="626" y="920" as="sourcePoint"/>
|
||||
<mxPoint x="726" y="960" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="79" value="133,1 GDT" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=12;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="680" y="1000" width="80" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
@ -0,0 +1,34 @@
|
||||
<mxfile>
|
||||
<diagram id="BGiljZVv0MSwwXBWfka-" name="Page-1">
|
||||
<mxGraphModel dx="955" dy="800" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0"/>
|
||||
<mxCell id="1" parent="0"/>
|
||||
<mxCell id="2" value="<font style="font-size: 16px"><b>Community</b></font>" style="rounded=0;whiteSpace=wrap;html=1;align=center;verticalAlign=top;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
|
||||
<mxGeometry x="40" y="40" width="400" height="480" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="4" value="Mitglied" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=top;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="104" y="90" width="310" height="220" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="3" value="Mitglied" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=top;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="84" y="110" width="310" height="220" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="5" value="Mitglied<br><div style="text-align: left"><ul><li><span style="text-align: left">Name</span></li><li><span>Vorname</span></li><li><span>...</span></li></ul></div>" style="rounded=1;whiteSpace=wrap;html=1;align=center;verticalAlign=top;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="64" y="130" width="310" height="220" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="6" value="AGE-Konto" style="rounded=0;whiteSpace=wrap;html=1;align=center;verticalAlign=top;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
||||
<mxGeometry x="80" y="240" width="270" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="7" value="GDT-Konto" style="rounded=0;whiteSpace=wrap;html=1;align=center;verticalAlign=top;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
|
||||
<mxGeometry x="80" y="290" width="270" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="8" value="Allgemeinwohl-Konto" style="rounded=0;whiteSpace=wrap;html=1;align=center;verticalAlign=top;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
|
||||
<mxGeometry x="80" y="380" width="270" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="9" value="AUF-Konto" style="rounded=0;whiteSpace=wrap;html=1;align=center;verticalAlign=top;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
|
||||
<mxGeometry x="80" y="440" width="270" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
BIN
docu/Concepts/BusinessRequirements/image/CommunityModell.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 847 KiB |
BIN
docu/Concepts/BusinessRequirements/image/Kontoarten.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
docu/Concepts/BusinessRequirements/image/my_gradido.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
@ -0,0 +1,40 @@
|
||||
# Technical Overview
|
||||
|
||||
This document describes the technical overview for the Gradido infrastructur. Beginning with a bird's eye view of all involved components, the following chapters will go in details of each component.
|
||||
|
||||
# Inventory Taking
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## Community-Server
|
||||
|
||||
### Public API
|
||||
|
||||

|
||||
|
||||
### Database Skeema
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
# Ideas of future Architecture
|
||||
|
||||
## Moduls
|
||||
|
||||

|
||||
|
||||
## ObjectModel
|
||||
|
||||

|
||||
|
||||
## DatabaseModel
|
||||
|
||||

|
||||
|
||||
|
||||
#
|
||||
@ -0,0 +1,40 @@
|
||||
# GraDiDo-Transactions
|
||||
|
||||
## General Description
|
||||
|
||||
The GraDiDo-System offers the business processes "CreateGradido" and "TransferGradio". Both processes need data, which has to be transferred between the involved different systems, especially between the internal Gradido servers and the external "BlockChain"-Service - currently (07.2021) IOTA is in use.
|
||||
|
||||
The main topic for the Gradido-Transactions is to ensure a misusage of money creation and keep all changes on an account consistent.
|
||||
|
||||
The basic requirements on this transfer data should be encapsulated in a base type and the business details for the different processes should be extended in separated types, which inherited the basics from the base type.
|
||||
|
||||
## Transaction Processes
|
||||
|
||||
In this chapter the two business processes are described to understand the different requirements, which leads to the transaction model following below.
|
||||
|
||||
### CreateGradido
|
||||
|
||||
The creation of Gradido-money has to fulfill the following business rules:
|
||||
|
||||
* it can only be create for a *personal account* of a human being
|
||||
* the account of the human being belongs to one Community
|
||||
* per month
|
||||
* maximal 1.000 GDD for the personal account
|
||||
* maximal 1.000 GDD for the general welfare account of the community per community member
|
||||
* maximal 1.000 GDD for the compensation and environmental fund of the community per community member
|
||||
* use the configured community specific triple-amount for the three recipients
|
||||
* the target month of creation must not be older than 3 month
|
||||
|
||||
### TransferGradido
|
||||
|
||||
## Type of Transactions
|
||||
|
||||
For the two business processes there are two different types of transactions necessary.
|
||||
|
||||
### Create-Transaction
|
||||
|
||||
The Create-Transaction is used to create GDDs for
|
||||
|
||||
### Transfer-Transaction
|
||||
|
||||
## Transaction-Model
|
||||
@ -0,0 +1,167 @@
|
||||
<mxfile>
|
||||
<diagram id="AW5C9lin9agWobY9p01H" name="Page-1">
|
||||
<mxGraphModel dx="1339" dy="941" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1654" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0"/>
|
||||
<mxCell id="1" parent="0"/>
|
||||
<mxCell id="2" value="Community Server API" style="shape=umlFrame;whiteSpace=wrap;html=1;width=200;height=30;boundedLbl=1;verticalAlign=middle;align=left;spacingLeft=5;fontSize=16;fontStyle=1;fillColor=#ffe6cc;strokeColor=#d79b00;" parent="1" vertex="1">
|
||||
<mxGeometry x="40" y="40" width="2320" height="680" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="4" value="" style="endArrow=none;html=1;rounded=0;align=center;verticalAlign=top;endFill=0;labelBackgroundColor=none;endSize=2;fontSize=16;" parent="1" target="5" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="175" y="190" as="sourcePoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="11" value="" style="endArrow=none;html=1;rounded=0;align=center;verticalAlign=top;endFill=0;labelBackgroundColor=none;endSize=2;fontSize=16;" parent="1" target="12" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="1070" y="310" as="sourcePoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="14" value="" style="endArrow=none;html=1;rounded=0;align=center;verticalAlign=top;endFill=0;labelBackgroundColor=none;endSize=2;fontSize=16;" parent="1" target="15" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="1710" y="310" as="sourcePoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="17" value="" style="endArrow=none;html=1;rounded=0;align=center;verticalAlign=top;endFill=0;labelBackgroundColor=none;endSize=2;fontSize=16;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" target="18" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="2180" y="180" as="sourcePoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="20" value="" style="endArrow=none;html=1;rounded=0;align=center;verticalAlign=top;endFill=0;labelBackgroundColor=none;endSize=2;fontSize=16;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" target="21" edge="1">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="2480" y="180" as="sourcePoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="22" value="<<interface>> GET {server}/api/getBalance/[sessionId]" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#fff2cc;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="60" y="120" width="230" height="52" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="24" value="- sessionId : string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="22">
|
||||
<mxGeometry y="26" width="230" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="26" value="<<interface>> GET {server}/api/listTransactions/[start page]/[element count]/[sort]/[session_id]" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#fff2cc;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="310" y="120" width="440" height="130" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="27" value="- startpage : int" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="26">
|
||||
<mxGeometry y="26" width="440" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="28" value="- element_count : int" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="26">
|
||||
<mxGeometry y="52" width="440" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="29" value="- sort : enum" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="26">
|
||||
<mxGeometry y="78" width="440" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="30" value="- sessionID : string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="26">
|
||||
<mxGeometry y="104" width="440" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="31" value="<<interface>> POST {server}/api/createCoins/{sessionID}/[email | username | pubkey]/{amount}/{target_date}/{memo}/{auto_sign]" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#fff2cc;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="770" y="120" width="620" height="234" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="32" value="- sessionId : string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="31">
|
||||
<mxGeometry y="26" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="33" value="- email : string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="31">
|
||||
<mxGeometry y="52" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="34" value="- username : enum" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="31">
|
||||
<mxGeometry y="78" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="35" value="- pubkey : string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="31">
|
||||
<mxGeometry y="104" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="36" value="- amount : float" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="31">
|
||||
<mxGeometry y="130" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="37" value="- target_date : date" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="31">
|
||||
<mxGeometry y="156" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="38" value="- memo : string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="31">
|
||||
<mxGeometry y="182" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="39" value="- auto_sign : boolean" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="31">
|
||||
<mxGeometry y="208" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="40" value="<<interface>> POST {server}/api/sendCoins/{sessionID}/[email | username | pubkey]/{amount}/{target_date}/{memo}/{auto_sign]" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#fff2cc;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="1410" y="120" width="620" height="234" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="41" value="- sessionId : string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="40">
|
||||
<mxGeometry y="26" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="42" value="- email : string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="40">
|
||||
<mxGeometry y="52" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="43" value="- username : enum" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="40">
|
||||
<mxGeometry y="78" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="44" value="- pubkey : string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="40">
|
||||
<mxGeometry y="104" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="45" value="- amount : float" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="40">
|
||||
<mxGeometry y="130" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="46" value="- target_date : date" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="40">
|
||||
<mxGeometry y="156" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="47" value="- memo : string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="40">
|
||||
<mxGeometry y="182" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="48" value="- auto_sign : boolean" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="40">
|
||||
<mxGeometry y="208" width="620" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="49" value="<<interface>> GET {server}/api/klicktipp_subscribe/[session_id]" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;dashed=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="2050" y="120" width="280" height="52" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="50" value="- sessionId : string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dashed=1;" vertex="1" parent="49">
|
||||
<mxGeometry y="26" width="280" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="51" value="<<interface>> GET {server}/api/klicktipp_unsubscribe/[session_id]" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;dashed=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="2050" y="198" width="280" height="52" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="52" value="- sessionId : string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dashed=1;" vertex="1" parent="51">
|
||||
<mxGeometry y="26" width="280" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="53" value="AppRequestsController" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#dae8fc;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
||||
<mxGeometry x="60" y="520" width="1970" height="156" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="54" value="+ function : getBalance($session_id = 0)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="53">
|
||||
<mxGeometry y="26" width="1970" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="55" value="+ function : listTransactions($page = 1, $count = 25, $orderDirection = 'ASC', $session_id = 0)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="53">
|
||||
<mxGeometry y="52" width="1970" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="56" value="+ function : createCoins()" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="53">
|
||||
<mxGeometry y="78" width="1970" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="61" value="+ function : sendCoins()" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="53">
|
||||
<mxGeometry y="104" width="1970" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="62" value="+ function : getDecayStartBlock()" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" vertex="1" parent="53">
|
||||
<mxGeometry y="130" width="1970" height="26" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="57" value="200 OK<br>return" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;entryX=0.059;entryY=0.009;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" target="53">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="175" y="173" as="sourcePoint"/>
|
||||
<mxPoint x="420" y="390" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="58" value="200 OK<br>return" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;entryX=0.239;entryY=0.009;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryPerimeter=0;" edge="1" parent="1" source="26" target="53">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="185" y="183" as="sourcePoint"/>
|
||||
<mxPoint x="290" y="530" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="59" value="200 OK<br>return" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;entryX=0.519;entryY=-0.014;entryDx=0;entryDy=0;exitX=0.505;exitY=1.115;exitDx=0;exitDy=0;exitPerimeter=0;entryPerimeter=0;" edge="1" parent="1" source="39" target="53">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="540" y="260" as="sourcePoint"/>
|
||||
<mxPoint x="419.9999999999991" y="530" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="60" value="200 OK<br>return" style="html=1;verticalAlign=bottom;endArrow=open;dashed=1;endSize=8;entryX=0.85;entryY=0.001;entryDx=0;entryDy=0;exitX=0.524;exitY=1.077;exitDx=0;exitDy=0;exitPerimeter=0;entryPerimeter=0;" edge="1" parent="1" source="48" target="53">
|
||||
<mxGeometry relative="1" as="geometry">
|
||||
<mxPoint x="1740" y="315" as="sourcePoint"/>
|
||||
<mxPoint x="1619.999999999999" y="585" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
@ -0,0 +1,209 @@
|
||||
<mxfile>
|
||||
<diagram id="gFWPI0aHTji9uMcxbVr0" name="Page-1">
|
||||
<mxGraphModel dx="1088" dy="800" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1654" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0"/>
|
||||
<mxCell id="1" parent="0"/>
|
||||
<mxCell id="2" value="<div style="box-sizing: border-box ; width: 100% ; background: #e4e4e4 ; padding: 2px">Community</div><table style="width: 100% ; font-size: 1em" cellpadding="2" cellspacing="0"><tbody><tr><td>PK</td><td>Id</td></tr><tr><td><br></td><td>Name</td></tr><tr><td></td><td>Icon<br>Beschreibung<br>virtuellServer<br>GemeinwohlKontoID<br>AUFKontoID<br>ParentCommunityID<br></td></tr></tbody></table>" style="verticalAlign=top;align=left;overflow=fill;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
|
||||
<mxGeometry x="310" y="280" width="140" height="160" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="3" value="<div style="box-sizing: border-box ; width: 100% ; background: #e4e4e4 ; padding: 2px">Benutzer</div><table style="width: 100% ; font-size: 1em" cellpadding="2" cellspacing="0"><tbody><tr><td>PK</td><td>Id</td></tr><tr><td>FK1</td><td>CommunityID</td></tr><tr><td>Boolean<br><br><br><br><br><br><br></td><td>SchöpfenFlag<br>Icon<br>Strasse<br>Hausnummer<br>PLZ<br>Ort<br>Adresszusatz<br></td></tr></tbody></table>" style="verticalAlign=top;align=left;overflow=fill;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
||||
<mxGeometry x="550" y="280" width="180" height="160" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="4" value="" style="endArrow=classic;html=1;entryX=1;entryY=0.208;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.25;exitDx=0;exitDy=0;" parent="1" source="3" target="2" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="530" y="290" as="sourcePoint"/>
|
||||
<mxPoint x="690" y="580" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="510" y="320"/>
|
||||
<mxPoint x="510" y="313"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="5" value="<div style="box-sizing: border-box ; width: 100% ; background: #e4e4e4 ; padding: 2px">Konto</div><table style="width: 100% ; font-size: 1em" cellpadding="2" cellspacing="0"><tbody><tr><td>PK</td><td>Id</td></tr><tr><td><br></td><td>Art<br>Vergänglichkeit<br>ErstelltAm</td></tr><tr><td></td><td>Saldo<br>Währung</td></tr></tbody></table>" style="verticalAlign=top;align=left;overflow=fill;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="1110" y="340" width="110" height="120" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="6" value="<div style="box-sizing: border-box ; width: 100% ; background: #e4e4e4 ; padding: 2px">NatürlichePerson</div><table style="width: 100% ; font-size: 1em" cellpadding="2" cellspacing="0"><tbody><tr><td>PK</td><td>Id</td></tr><tr><td>FK1</td><td>BenutzerID</td></tr><tr><td></td><td>Vorname<br>Nachname<br>Geburtsdatum<br>AGEKontoID</td></tr></tbody></table>" style="verticalAlign=top;align=left;overflow=fill;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
||||
<mxGeometry x="830" y="280" width="180" height="120" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="7" value="<div style="box-sizing: border-box ; width: 100% ; background: #e4e4e4 ; padding: 2px">FiktivePerson</div><table style="width: 100% ; font-size: 1em" cellpadding="2" cellspacing="0"><tbody><tr><td>PK</td><td>Id</td></tr><tr><td>FK1</td><td>BenutzerID</td></tr><tr><td></td><td>Name<br>GDDKonto</td></tr></tbody></table>" style="verticalAlign=top;align=left;overflow=fill;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
||||
<mxGeometry x="830" y="420" width="180" height="90" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="8" value="" style="endArrow=classic;html=1;entryX=1.003;entryY=0.153;entryDx=0;entryDy=0;entryPerimeter=0;exitX=-0.003;exitY=0.375;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="6" target="3" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="750" y="430" as="sourcePoint"/>
|
||||
<mxPoint x="800" y="380" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="800" y="325"/>
|
||||
<mxPoint x="800" y="304"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="9" value="" style="endArrow=classic;html=1;exitX=0;exitY=0.461;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.008;entryY=0.15;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="7" target="3" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="750" y="430" as="sourcePoint"/>
|
||||
<mxPoint x="800" y="380" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="790" y="461"/>
|
||||
<mxPoint x="790" y="304"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="10" value="" style="endArrow=classic;html=1;exitX=0.994;exitY=0.892;exitDx=0;exitDy=0;exitPerimeter=0;entryX=-0.014;entryY=0.204;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="6" target="5" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1070" y="430" as="sourcePoint"/>
|
||||
<mxPoint x="1110" y="370" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="1030" y="387"/>
|
||||
<mxPoint x="1030" y="366"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="11" value="" style="endArrow=classic;html=1;exitX=0.997;exitY=0.883;exitDx=0;exitDy=0;exitPerimeter=0;entryX=-0.009;entryY=0.204;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="7" target="5" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1070" y="430" as="sourcePoint"/>
|
||||
<mxPoint x="1120" y="380" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="1040" y="499"/>
|
||||
<mxPoint x="1040" y="366"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="12" value="<div style="box-sizing: border-box ; width: 100% ; background: #e4e4e4 ; padding: 2px">Transaktion</div><table style="width: 100% ; font-size: 1em" cellpadding="2" cellspacing="0"><tbody><tr><td>PK</td><td>Id</td></tr><tr><td>FK1</td><td>KontoID</td></tr><tr><td></td><td>ErhaltenAm<br>Sender<br>Empfänger<br>GebuchtAm<br>Betrag<br>Währung<br>Verwendungszweck<br><br></td></tr></tbody></table>" style="verticalAlign=top;align=left;overflow=fill;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
|
||||
<mxGeometry x="1270" y="320" width="140" height="160" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="13" value="" style="endArrow=classic;html=1;entryX=0.995;entryY=0.221;entryDx=0;entryDy=0;exitX=0;exitY=0.288;exitDx=0;exitDy=0;exitPerimeter=0;entryPerimeter=0;" parent="1" source="12" target="5" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1160" y="430" as="sourcePoint"/>
|
||||
<mxPoint x="1210" y="380" as="targetPoint"/>
|
||||
<Array as="points"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="14" value="<div style="box-sizing: border-box ; width: 100% ; background: #e4e4e4 ; padding: 2px">Identitätsnachweis</div><table style="width: 100% ; font-size: 1em" cellpadding="2" cellspacing="0"><tbody><tr><td>PK</td><td>Id</td></tr><tr><td>FK1</td><td>NatürlichePersonID</td></tr><tr><td></td><td>Identitätsart<br>Identitätsnummer<br>Identitätsdaten<br>AusgestelltAm<br>AusgestelltDurch<br>ErfasstAm<br>ErfasstDurch<br>GeprüftAm<br>GeprüftVon</td></tr></tbody></table>" style="verticalAlign=top;align=left;overflow=fill;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
||||
<mxGeometry x="1110" y="120" width="140" height="180" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="15" value="" style="endArrow=classic;html=1;entryX=1.003;entryY=0.217;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.25;exitDx=0;exitDy=0;" parent="1" source="14" target="6" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="1070" y="270" as="sourcePoint"/>
|
||||
<mxPoint x="1120" y="220" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="1080" y="165"/>
|
||||
<mxPoint x="1080" y="306"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="16" value="" style="endArrow=classic;html=1;exitX=0.996;exitY=0.659;exitDx=0;exitDy=0;exitPerimeter=0;entryX=-0.009;entryY=0.2;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="2" target="5" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="540" y="440" as="sourcePoint"/>
|
||||
<mxPoint x="590" y="390" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="510" y="386"/>
|
||||
<mxPoint x="510" y="540"/>
|
||||
<mxPoint x="1050" y="540"/>
|
||||
<mxPoint x="1050" y="365"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="17" value="" style="endArrow=classic;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0.005;entryY=0.208;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="2" target="5" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="570" y="440" as="sourcePoint"/>
|
||||
<mxPoint x="620" y="390" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="500" y="399"/>
|
||||
<mxPoint x="500" y="550"/>
|
||||
<mxPoint x="1060" y="550"/>
|
||||
<mxPoint x="1060" y="365"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="18" value="<div style="box-sizing: border-box ; width: 100% ; background: #e4e4e4 ; padding: 2px">ChildCommunities</div><table style="width: 100% ; font-size: 1em" cellpadding="2" cellspacing="0"><tbody><tr><td>PK</td><td>Id</td></tr><tr><td>FK1</td><td>CommunityID</td></tr><tr><td>FK2</td><td>ChildCommunityID</td></tr></tbody></table>" style="verticalAlign=top;align=left;overflow=fill;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
|
||||
<mxGeometry x="40" y="320" width="150" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="19" value="" style="endArrow=classic;html=1;exitX=0.993;exitY=0.581;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.163;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="18" target="2" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="200" y="440" as="sourcePoint"/>
|
||||
<mxPoint x="250" y="390" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="210" y="366"/>
|
||||
<mxPoint x="210" y="306"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="20" value="" style="endArrow=classic;html=1;entryX=-0.007;entryY=0.159;entryDx=0;entryDy=0;entryPerimeter=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;" parent="1" source="18" target="2" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="200" y="440" as="sourcePoint"/>
|
||||
<mxPoint x="250" y="390" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="220" y="380"/>
|
||||
<mxPoint x="220" y="305"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="21" value="" style="endArrow=classic;html=1;exitX=0;exitY=0.834;exitDx=0;exitDy=0;exitPerimeter=0;entryX=-0.004;entryY=0.159;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="2" target="2" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="200" y="440" as="sourcePoint"/>
|
||||
<mxPoint x="250" y="390" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="280" y="413"/>
|
||||
<mxPoint x="280" y="305"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="22" value="<div style="box-sizing: border-box ; width: 100% ; background: #e4e4e4 ; padding: 2px">TrustedCommunities</div><table style="width: 100% ; font-size: 1em" cellpadding="2" cellspacing="0"><tbody><tr><td>PK</td><td>Id</td></tr><tr><td>FK1</td><td>CommunityID</td></tr><tr><td>FK2</td><td>TrustedCommunityID</td></tr></tbody></table>" style="verticalAlign=top;align=left;overflow=fill;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
|
||||
<mxGeometry x="40" y="420" width="150" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="23" value="" style="endArrow=classic;html=1;entryX=-0.014;entryY=0.159;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.997;exitY=0.556;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="22" target="2" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="200" y="440" as="sourcePoint"/>
|
||||
<mxPoint x="250" y="390" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="230" y="464"/>
|
||||
<mxPoint x="230" y="305"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="24" value="" style="endArrow=classic;html=1;entryX=-0.004;entryY=0.159;entryDx=0;entryDy=0;entryPerimeter=0;exitX=1;exitY=0.806;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="22" target="2" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="200" y="440" as="sourcePoint"/>
|
||||
<mxPoint x="250" y="390" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="240" y="484"/>
|
||||
<mxPoint x="240" y="305"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="25" value="<div style="box-sizing: border-box ; width: 100% ; background: #e4e4e4 ; padding: 2px">Rolle</div><table style="width: 100% ; font-size: 1em" cellpadding="2" cellspacing="0"><tbody><tr><td>PK</td><td>Id</td></tr><tr><td><br></td><td>Name</td></tr><tr><td></td><td><br></td></tr></tbody></table>" style="verticalAlign=top;align=left;overflow=fill;html=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
|
||||
<mxGeometry x="750" y="140" width="80" height="50" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="26" value="<div style="box-sizing: border-box ; width: 100% ; background: #e4e4e4 ; padding: 2px">RollenZuordnung</div><table style="width: 100% ; font-size: 1em" cellpadding="2" cellspacing="0"><tbody><tr><td>PK</td><td>Id</td></tr><tr><td>FK1</td><td>RolleID</td></tr><tr><td>FK2</td><td>BenutzerID</td></tr></tbody></table>" style="verticalAlign=top;align=left;overflow=fill;html=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
|
||||
<mxGeometry x="590" y="120" width="110" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="27" value="" style="endArrow=classic;html=1;exitX=1;exitY=0.643;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="26" target="25" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="760" y="390" as="sourcePoint"/>
|
||||
<mxPoint x="810" y="340" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="28" value="" style="endArrow=classic;html=1;exitX=-0.014;exitY=0.9;exitDx=0;exitDy=0;exitPerimeter=0;entryX=-0.003;entryY=0.159;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="26" target="3" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="770" y="310" as="sourcePoint"/>
|
||||
<mxPoint x="820" y="260" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="530" y="183"/>
|
||||
<mxPoint x="530" y="305"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="29" value="<div style="box-sizing: border-box ; width: 100% ; background: #e4e4e4 ; padding: 2px">Recht</div><table style="width: 100% ; font-size: 1em" cellpadding="2" cellspacing="0"><tbody><tr><td>PK</td><td>Id</td></tr><tr><td>FK1</td><td>RolleId</td></tr><tr><td></td><td>Name<br>Key</td></tr></tbody></table>" style="verticalAlign=top;align=left;overflow=fill;html=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
|
||||
<mxGeometry x="870" y="120" width="70" height="90" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="30" value="" style="endArrow=classic;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="29" target="25" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="840" y="310" as="sourcePoint"/>
|
||||
<mxPoint x="890" y="260" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
@ -0,0 +1,184 @@
|
||||
<mxfile>
|
||||
<diagram id="ZgDWW9pSgEU1kBHeR6SU" name="Page-1">
|
||||
<mxGraphModel dx="1134" dy="800" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1654" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0"/>
|
||||
<mxCell id="1" parent="0"/>
|
||||
<mxCell id="31" value="<p style="margin: 0px ; margin-top: 4px ; text-align: center"><b>Class Community</b></p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ Name: String</p><p style="margin: 0px ; margin-left: 4px">+ Icon: Bitmap<br></p><p style="margin: 0px ; margin-left: 4px">+ Beschreibung: String<br></p><p style="margin: 0px ; margin-left: 4px">+ Server: String<br></p><p style="margin: 0px ; margin-left: 4px">+ Gemeinwohlkonto: Konto</p><p style="margin: 0px ; margin-left: 4px">+ AUFKonto: Konto</p><p style="margin: 0px ; margin-left: 4px">+ ParentCommunity: Community</p><p style="margin: 0px ; margin-left: 4px">+ ChildCommunities: List&lt;Community&gt;</p><p style="margin: 0px ; margin-left: 4px">+ TrustedCommunities: List&lt;Community&gt;</p><p style="margin: 0px ; margin-left: 4px">+ Benutzer: List&lt;Benutzer&gt;</p><p style="margin: 0px ; margin-left: 4px">+ Administratoren: List&lt;Benutzer&gt;</p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ method(): Type</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
|
||||
<mxGeometry x="90" y="80" width="230" height="220" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="32" value="<p style="margin: 0px ; margin-top: 4px ; text-align: center"><b>Class Benutzer</b></p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ Schöpfer: Boolean</p><p style="margin: 0px ; margin-left: 4px">+ Icon: Bitmap</p><p style="margin: 0px ; margin-left: 4px">+ Strasse: String</p><p style="margin: 0px ; margin-left: 4px">+ Hausnummer: String</p><p style="margin: 0px ; margin-left: 4px">+ PLZ: String</p><p style="margin: 0px ; margin-left: 4px">+ Ort: String</p><p style="margin: 0px ; margin-left: 4px">+ Adresszusatz: String</p><p style="margin: 0px ; margin-left: 4px">+ Rollen: List&lt;Rolle&gt;</p><p style="margin: 0px ; margin-left: 4px">+ Identitätsnachweise: List&lt;Identitätsnachweis&gt;</p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ method(): Type</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="440" y="233" width="260" height="187" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="33" value="<p style="margin: 0px ; margin-top: 4px ; text-align: center"><b>Class NartürlichePerson</b></p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ Vorname: String</p><p style="margin: 0px ; margin-left: 4px">+ Nachname: String</p><p style="margin: 0px ; margin-left: 4px">+ Geburtsdatum: Date</p><p style="margin: 0px ; margin-left: 4px">+ AGEKonto: Konto</p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ method(): Type</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="382.5" y="480" width="160" height="120" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="34" value="" style="endArrow=open;endFill=1;endSize=12;html=1;entryX=1;entryY=0.05;entryDx=0;entryDy=0;entryPerimeter=0;exitX=1;exitY=0.559;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="31" target="31">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="520" y="410" as="sourcePoint"/>
|
||||
<mxPoint x="680" y="410" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="340" y="203"/>
|
||||
<mxPoint x="340" y="91"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="35" value="" style="endArrow=open;endFill=1;endSize=12;html=1;exitX=1;exitY=0.609;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="31">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="520" y="410" as="sourcePoint"/>
|
||||
<mxPoint x="320" y="90" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="350" y="214"/>
|
||||
<mxPoint x="350" y="90"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="36" value="" style="endArrow=open;endFill=1;endSize=12;html=1;exitX=1;exitY=0.677;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="31">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="520" y="410" as="sourcePoint"/>
|
||||
<mxPoint x="320" y="90" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="360" y="229"/>
|
||||
<mxPoint x="360" y="90"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="37" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="33" target="32">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="790" y="290" as="sourcePoint"/>
|
||||
<mxPoint x="950" y="290" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="463" y="450"/>
|
||||
<mxPoint x="570" y="450"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="38" value="<p style="margin: 0px ; margin-top: 4px ; text-align: center"><b>Class FiktivePerson</b></p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ Name: String</p><p style="margin: 0px ; margin-left: 4px">+ GDDKonto: Konto</p><p style="margin: 0px ; margin-left: 4px">+ Administratoren: List&lt;Benutzer&gt;</p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ method(): Type</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="557.5" y="480" width="200" height="110" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="39" value="" style="endArrow=block;dashed=1;endFill=0;endSize=12;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="38" target="32">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="790" y="290" as="sourcePoint"/>
|
||||
<mxPoint x="950" y="290" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="658" y="450"/>
|
||||
<mxPoint x="570" y="450"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="40" value="" style="endArrow=open;endFill=1;endSize=12;html=1;exitX=1;exitY=0.618;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.059;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="38" target="32">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="790" y="290" as="sourcePoint"/>
|
||||
<mxPoint x="950" y="290" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="780" y="548"/>
|
||||
<mxPoint x="780" y="243"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="41" value="" style="endArrow=open;endFill=1;endSize=12;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=-0.008;entryY=0.065;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="31" target="32">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="410" y="410" as="sourcePoint"/>
|
||||
<mxPoint x="70" y="371" as="targetPoint"/>
|
||||
<Array as="points"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="42" value="" style="endArrow=open;endFill=1;endSize=12;html=1;exitX=1;exitY=0.814;exitDx=0;exitDy=0;exitPerimeter=0;entryX=-0.004;entryY=0.062;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="31" target="32">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="410" y="410" as="sourcePoint"/>
|
||||
<mxPoint x="120" y="370" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="380" y="259"/>
|
||||
<mxPoint x="380" y="244"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="43" value="<p style="margin: 0px ; margin-top: 4px ; text-align: center"><b>Class Rolle</b></p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ Name: String</p><p style="margin: 0px ; margin-left: 4px">+ Rechte: List&lt;Recht&gt;</p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ method(): Type</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
|
||||
<mxGeometry x="880" y="250" width="130" height="90" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="44" value="<p style="margin: 0px ; margin-top: 4px ; text-align: center"><b>Class Recht</b></p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ Name: String</p><p style="margin: 0px ; margin-left: 4px">+ Key: String</p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ method(): Type</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
|
||||
<mxGeometry x="1062.5" y="292" width="100" height="90" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="45" value="" style="endArrow=open;endFill=1;endSize=12;html=1;entryX=0.01;entryY=0.111;entryDx=0;entryDy=0;entryPerimeter=0;exitX=1.015;exitY=0.578;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="43" target="44">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="700" y="650" as="sourcePoint"/>
|
||||
<mxPoint x="860" y="650" as="targetPoint"/>
|
||||
<Array as="points"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="46" value="" style="endArrow=open;endFill=1;endSize=12;html=1;entryX=-0.012;entryY=0.133;entryDx=0;entryDy=0;entryPerimeter=0;exitX=1;exitY=0.706;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="32" target="43">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="530" y="330" as="sourcePoint"/>
|
||||
<mxPoint x="690" y="330" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="830" y="365"/>
|
||||
<mxPoint x="830" y="262"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="47" value="<p style="margin: 0px ; margin-top: 4px ; text-align: center"><b>Class Identitätsnachweis</b></p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ IdentArt: Enum</p><p style="margin: 0px ; margin-left: 4px">+ IdentNummer: String</p><p style="margin: 0px ; margin-left: 4px">+ IdentDaten: Sring</p><p style="margin: 0px ; margin-left: 4px">+ AusgestelltAm: Date</p><p style="margin: 0px ; margin-left: 4px">+ AusgestelltDurch: String</p><p style="margin: 0px ; margin-left: 4px">+ GültigBis: Date</p><p style="margin: 0px ; margin-left: 4px">+ erfasstAm: Date</p><p style="margin: 0px ; margin-left: 4px">+ erfasstDurch: String</p><p style="margin: 0px ; margin-left: 4px">+ geprüftAm: Date</p><p style="margin: 0px ; margin-left: 4px">+ geprüftDurch: String</p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ method(): Type</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="880" y="373" width="150" height="200" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="48" value="" style="endArrow=open;endFill=1;endSize=12;html=1;exitX=1;exitY=0.813;exitDx=0;exitDy=0;exitPerimeter=0;entryX=-0.007;entryY=0.06;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="32" target="47">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="770" y="330" as="sourcePoint"/>
|
||||
<mxPoint x="930" y="330" as="targetPoint"/>
|
||||
<Array as="points"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="49" value="<p style="margin: 0px ; margin-top: 4px ; text-align: center"><b>Class Konto</b></p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ Art: Enum</p><p style="margin: 0px ; margin-left: 4px">+ Vergänglichkeit: Boolean</p><p style="margin: 0px ; margin-left: 4px">+ ErstelltAm: Date</p><p style="margin: 0px ; margin-left: 4px">+ Saldo: Float</p><p style="margin: 0px ; margin-left: 4px">+ Währung: String</p><p style="margin: 0px ; margin-left: 4px">+ Transaktionen: List&lt;Transaktion&gt;</p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ method(): Type</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
||||
<mxGeometry x="480" y="640" width="200" height="150" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="50" value="<p style="margin: 0px ; margin-top: 4px ; text-align: center"><b>Class Transaktion</b></p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ ErhaltenAm: Timestamp</p><p style="margin: 0px ; margin-left: 4px">+ Sender: String</p><p style="margin: 0px ; margin-left: 4px">+ Empfänger: String</p><p style="margin: 0px ; margin-left: 4px">+ GebuchtAm: Timestamp</p><p style="margin: 0px ; margin-left: 4px">+ Betrag: Float</p><p style="margin: 0px ; margin-left: 4px">+ Währung: String</p><p style="margin: 0px ; margin-left: 4px">+ Verwendungszweck: String</p><hr size="1"><p style="margin: 0px ; margin-left: 4px">+ method(): Type</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
||||
<mxGeometry x="757.5" y="730" width="170" height="160" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="51" value="" style="endArrow=open;endFill=1;endSize=12;html=1;entryX=-0.015;entryY=0.081;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.995;exitY=0.7;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="49" target="50">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="480" y="670" as="sourcePoint"/>
|
||||
<mxPoint x="640" y="670" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="52" value="" style="endArrow=open;endFill=1;endSize=12;html=1;exitX=1.003;exitY=0.436;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.1;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="38" target="49">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="480" y="670" as="sourcePoint"/>
|
||||
<mxPoint x="640" y="670" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="810" y="528"/>
|
||||
<mxPoint x="810" y="653"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="53" value="" style="endArrow=open;endFill=1;endSize=12;html=1;exitX=0.003;exitY=0.667;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.1;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="33" target="49">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="480" y="670" as="sourcePoint"/>
|
||||
<mxPoint x="640" y="670" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="350" y="560"/>
|
||||
<mxPoint x="350" y="653"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="54" value="" style="endArrow=open;endFill=1;endSize=12;html=1;exitX=-0.009;exitY=0.473;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.115;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="31" target="49">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="410" y="330" as="sourcePoint"/>
|
||||
<mxPoint x="570" y="330" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="60" y="184"/>
|
||||
<mxPoint x="60" y="650"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="55" value="" style="endArrow=open;endFill=1;endSize=12;html=1;exitX=-0.009;exitY=0.427;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.108;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="31" target="49">
|
||||
<mxGeometry width="160" relative="1" as="geometry">
|
||||
<mxPoint x="410" y="330" as="sourcePoint"/>
|
||||
<mxPoint x="570" y="330" as="targetPoint"/>
|
||||
<Array as="points">
|
||||
<mxPoint x="30" y="174"/>
|
||||
<mxPoint x="30" y="650"/>
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
@ -0,0 +1,97 @@
|
||||
<mxfile>
|
||||
<diagram id="IpaYKNE555SeSldH36kN" name="Page-1">
|
||||
<mxGraphModel dx="1554" dy="1143" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1654" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0"/>
|
||||
<mxCell id="1" parent="0"/>
|
||||
<mxCell id="2" value="Gradido" style="rounded=0;whiteSpace=wrap;html=1;labelPosition=center;verticalLabelPosition=middle;align=left;verticalAlign=top;fontSize=18;gradientColor=#ffd966;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="80" y="80" width="1100" height="1040" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="3" value="Moduls and Services" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=18;fontStyle=1" vertex="1" parent="1">
|
||||
<mxGeometry x="80" y="40" width="200" height="20" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="4" value="UI - Layer" style="rounded=0;whiteSpace=wrap;html=1;fontSize=18;align=left;verticalAlign=top;gradientColor=#b3b3b3;fillColor=#f5f5f5;strokeColor=#666666;" vertex="1" parent="1">
|
||||
<mxGeometry x="100" y="120" width="1060" height="120" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="5" value="User Internet-Browser (GDD-Application)" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;gradientColor=#ffd966;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="160" y="150" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="6" value="User Mobile (GDD-Application)" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;gradientColor=#ffd966;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="400" y="150" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="7" value="Admin Internet-Browser (GDD-Admin-Application)" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;gradientColor=#97d077;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
|
||||
<mxGeometry x="630" y="150" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="8" value="Admin Internet-Browser (GDD-Monitoring-Application)" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;gradientColor=#7ea6e0;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
||||
<mxGeometry x="870" y="150" width="250" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="9" value="Business - Layer" style="rounded=0;whiteSpace=wrap;html=1;fontSize=18;align=left;verticalAlign=top;gradientColor=#b3b3b3;fillColor=#f5f5f5;strokeColor=#666666;" vertex="1" parent="1">
|
||||
<mxGeometry x="100" y="440" width="1060" height="440" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="10" value="Persistenz - Layer" style="rounded=0;whiteSpace=wrap;html=1;fontSize=18;align=left;verticalAlign=top;gradientColor=#b3b3b3;fillColor=#f5f5f5;strokeColor=#666666;" vertex="1" parent="1">
|
||||
<mxGeometry x="97" y="920" width="1063" height="160" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="11" value="Client - Layer" style="rounded=0;whiteSpace=wrap;html=1;fontSize=18;align=left;verticalAlign=top;gradientColor=#b3b3b3;fillColor=#f5f5f5;strokeColor=#666666;" vertex="1" parent="1">
|
||||
<mxGeometry x="100" y="280" width="1060" height="120" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="12" value="GDD-Application Client (Apollo)" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;gradientColor=#ffd966;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="270" y="305" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="13" value="GDD-Admin-Application Client (Apollo)" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;gradientColor=#97d077;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
|
||||
<mxGeometry x="630" y="310" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="14" value="GDD-Monitoring-Application Client (Apollo)" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;gradientColor=#7ea6e0;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
||||
<mxGeometry x="870" y="310" width="250" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="20" value="CommunityService" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
|
||||
<mxGeometry x="130" y="515" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="21" value="BenutzerService" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="380" y="515" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="22" value="KontoService" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
||||
<mxGeometry x="640" y="515" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="23" value="BerechtigungService" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
|
||||
<mxGeometry x="910" y="515" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="24" value="GDTService" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;fillColor=#b0e3e6;strokeColor=#0e8088;" vertex="1" parent="1">
|
||||
<mxGeometry x="910" y="640" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="25" value="GDT Database" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;fillColor=#b0e3e6;strokeColor=#0e8088;" vertex="1" parent="1">
|
||||
<mxGeometry x="525" y="965" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="26" value="Gradido Database" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;gradientColor=#ffd966;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="160" y="965" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="28" value="NodeService" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" vertex="1" parent="1">
|
||||
<mxGeometry x="910" y="760" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="29" value="IdentityService" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="380" y="630" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="31" value="IOTA" style="rounded=0;whiteSpace=wrap;html=1;labelPosition=center;verticalLabelPosition=middle;align=left;verticalAlign=top;fontSize=18;gradientColor=#7ea6e0;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
||||
<mxGeometry x="1240" y="930" width="360" height="150" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="33" value="BlockChain" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" vertex="1" parent="1">
|
||||
<mxGeometry x="1315" y="965" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="34" value="Elopage" style="rounded=0;whiteSpace=wrap;html=1;labelPosition=center;verticalLabelPosition=middle;align=left;verticalAlign=top;fontSize=18;gradientColor=#ffa500;fillColor=#ffcd28;strokeColor=#d79b00;" vertex="1" parent="1">
|
||||
<mxGeometry x="1240" y="80" width="360" height="320" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="35" value="User Internet-Browser (GDT-Application)" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;fillColor=#fff2cc;strokeColor=#d6b656;gradientColor=#ffd966;" vertex="1" parent="1">
|
||||
<mxGeometry x="1315" y="140" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="36" value="GDT-Application" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;fillColor=#b0e3e6;strokeColor=#0e8088;" vertex="1" parent="1">
|
||||
<mxGeometry x="1260" y="290" width="150" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="37" value="MarketPlace- Application" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;fillColor=#fff2cc;strokeColor=#d6b656;gradientColor=#ffd966;" vertex="1" parent="1">
|
||||
<mxGeometry x="1430" y="290" width="150" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="38" value="BlockChain" style="shape=module;align=left;spacingLeft=20;align=center;verticalAlign=top;fontSize=16;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;gradientDirection=south;gradientColor=#FFFFFF;" vertex="1" parent="1">
|
||||
<mxGeometry x="900" y="965" width="210" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
@ -0,0 +1,156 @@
|
||||
<mxfile>
|
||||
<diagram id="3pXCp0T4fARAkGCHK-PK" name="Page-1">
|
||||
<mxGraphModel dx="1088" dy="800" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0"/>
|
||||
<mxCell id="1" parent="0"/>
|
||||
<mxCell id="2" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;" parent="1" vertex="1">
|
||||
<mxGeometry x="40" y="80" width="870" height="800" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="3" value="Gradido - technical Infrastructure-Overview<br><font style="font-size: 12px">State of 07.2021</font>" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=16;fontStyle=1" parent="1" vertex="1">
|
||||
<mxGeometry x="40" y="20" width="400" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="4" value="UI-Interface "<b>CommunityServer</b>" <br>base on PHP + mySQL (migrate to ApolloServer)" style="rounded=1;whiteSpace=wrap;html=1;fontSize=16;align=center;fillColor=#d5e8d4;strokeColor=#82b366;gradientColor=#97d077;" parent="1" vertex="1">
|
||||
<mxGeometry x="130" y="310" width="490" height="60" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="5" value="User-Account "<b>LoginServer</b>" <br>base on C++ Poco" style="rounded=1;whiteSpace=wrap;html=1;fontSize=16;align=center;fillColor=#dae8fc;strokeColor=#6c8ebf;gradientColor=#7ea6e0;" parent="1" vertex="1">
|
||||
<mxGeometry x="130" y="450" width="350" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="6" value="Blockchain "<b>NodeServer</b>" <br>base on C++ Poco" style="rounded=1;whiteSpace=wrap;html=1;fontSize=16;align=center;fillColor=#e6d0de;strokeColor=#996185;gradientColor=#d5739d;" parent="1" vertex="1">
|
||||
<mxGeometry x="130" y="590" width="220" height="70" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="7" value="CommunityServer DB" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=15;fontStyle=1;gradientColor=#97d077;" parent="1" vertex="1">
|
||||
<mxGeometry x="520" y="760" width="150" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="8" value="" style="endArrow=classic;startArrow=classic;html=1;fontSize=15;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.947;entryY=1.033;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="7" target="4" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="390" y="590" as="sourcePoint"/>
|
||||
<mxPoint x="440" y="540" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="9" value="LoginServer DB" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=15;fontStyle=1;gradientColor=#7ea6e0;" parent="1" vertex="1">
|
||||
<mxGeometry x="400" y="760" width="110" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="10" value="" style="endArrow=classic;startArrow=classic;html=1;fontSize=15;entryX=0.92;entryY=1.014;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryPerimeter=0;" parent="1" source="9" target="5" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="715" y="770" as="sourcePoint"/>
|
||||
<mxPoint x="708.24" y="324.02" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="13" value="" style="endArrow=classic;startArrow=classic;html=1;fontSize=15;fontColor=#000000;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" target="6" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="240" y="760" as="sourcePoint"/>
|
||||
<mxPoint x="460" y="550" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="14" value="" style="group" parent="1" vertex="1" connectable="0">
|
||||
<mxGeometry x="200" y="600" width="200" height="183.75" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="11" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#e6d0de;strokeColor=#996185;fontSize=15;fontStyle=1;gradientColor=#d5739d;rotation=-90;flipH=1;flipV=0;" parent="14" vertex="1">
|
||||
<mxGeometry x="43.2" y="91.56" width="84.21" height="216.87" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="12" value="<span style="font-weight: 700;">IOTA BlockChain</span>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=15;glass=0;opacity=0;fillColor=none;labelBackgroundColor=none;" parent="14" vertex="1">
|
||||
<mxGeometry x="29.998421052631578" y="180" width="115.78947368421052" height="40" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="15" value="<b>Layer 1:</b>" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;glass=0;labelBackgroundColor=none;fontSize=15;fontColor=#000000;opacity=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="50" y="735" width="70" height="20" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="17" value="" style="endArrow=none;dashed=1;html=1;fontSize=15;fontColor=#000000;entryX=1.002;entryY=0.801;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" target="2" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="40" y="720" as="sourcePoint"/>
|
||||
<mxPoint x="802" y="720" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="22" value="<b>Layer 2:</b>" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;glass=0;labelBackgroundColor=none;fontSize=15;fontColor=#000000;opacity=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="50" y="281" width="70" height="20" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="23" value="" style="endArrow=classic;startArrow=classic;html=1;fontSize=15;fontColor=#000000;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="6" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="310" y="767.8947368421052" as="sourcePoint"/>
|
||||
<mxPoint x="240" y="519" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="24" value="" style="endArrow=classic;startArrow=classic;html=1;fontSize=15;entryX=0.898;entryY=0.986;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryPerimeter=0;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="371.91999999999996" y="760.98" as="sourcePoint"/>
|
||||
<mxPoint x="369.9999999999999" y="520" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="25" value="" style="endArrow=classic;startArrow=classic;html=1;fontSize=15;fontColor=#000000;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="5" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="250" y="600" as="sourcePoint"/>
|
||||
<mxPoint x="305" y="371" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="26" value=""<b>GDT-Server</b>" <br>base on C++ + mySQL" style="rounded=1;whiteSpace=wrap;html=1;fontSize=16;align=center;fillColor=#fff2cc;strokeColor=#d6b656;gradientColor=#ffd966;" parent="1" vertex="1">
|
||||
<mxGeometry x="690" y="310" width="210" height="60" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="27" value="GDT-Server DB" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=15;fontStyle=1;gradientColor=#ffd966;" parent="1" vertex="1">
|
||||
<mxGeometry x="710" y="760" width="150" height="80" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="28" value="" style="endArrow=classic;startArrow=classic;html=1;fontSize=15;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.894;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="27" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="580" y="590" as="sourcePoint"/>
|
||||
<mxPoint x="784.8800000000001" y="370" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="29" value="" style="endArrow=classic;startArrow=classic;html=1;fontSize=15;fontColor=#000000;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" target="26" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="620" y="340" as="sourcePoint"/>
|
||||
<mxPoint x="600" y="520" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="30" value="<font style="font-size: 12px">json-<br>ajax-<br>request</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;fontColor=#000000;labelBackgroundColor=none;" parent="29" vertex="1" connectable="0">
|
||||
<mxGeometry x="-0.3429" relative="1" as="geometry">
|
||||
<mxPoint x="10" y="-28" as="offset"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="31" value="<font style="font-size: 12px">json-<br>ajax-<br>request</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;fontColor=#000000;labelBackgroundColor=none;" parent="1" vertex="1" connectable="0">
|
||||
<mxGeometry x="280" y="410" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="32" value="<font style="font-size: 12px">json-rpc<br></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;fontColor=#000000;labelBackgroundColor=none;" parent="1" vertex="1" connectable="0">
|
||||
<mxGeometry x="210" y="540" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="33" value="<font style="font-size: 12px">gRPC<br></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;fontColor=#000000;labelBackgroundColor=none;" parent="1" vertex="1" connectable="0">
|
||||
<mxGeometry x="220" y="700" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="34" value="<font style="font-size: 12px">gRPC<br></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;fontColor=#000000;labelBackgroundColor=none;" parent="1" vertex="1" connectable="0">
|
||||
<mxGeometry x="350" y="545" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="35" value="" style="endArrow=none;dashed=1;html=1;fontSize=15;fontColor=#000000;entryX=1.002;entryY=0.401;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0;exitY=0.4;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="39.13" y="273" as="sourcePoint"/>
|
||||
<mxPoint x="910.8699999999998" y="273.79999999999995" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="36" value="<b>Layer 3:</b>" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;glass=0;labelBackgroundColor=none;fontSize=15;fontColor=#000000;opacity=0;" parent="1" vertex="1">
|
||||
<mxGeometry x="50" y="90" width="70" height="20" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="39" value=""<b>Elopage</b>" <br>external Service-Portal" style="rounded=1;whiteSpace=wrap;html=1;fontSize=16;align=center;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
|
||||
<mxGeometry x="670" y="120" width="210" height="60" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="40" value=""<b>Gradido-Page</b>"" style="rounded=1;whiteSpace=wrap;html=1;fontSize=16;align=center;fillColor=#cdeb8b;strokeColor=#36393d;" parent="1" vertex="1">
|
||||
<mxGeometry x="130" y="120" width="490" height="60" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="41" value="" style="endArrow=classic;startArrow=classic;html=1;fontSize=15;fontColor=#000000;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" parent="1" source="4" target="40" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="550" y="420" as="sourcePoint"/>
|
||||
<mxPoint x="600" y="370" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="42" value="" style="endArrow=classic;startArrow=classic;html=1;fontSize=15;fontColor=#000000;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.395;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="26" target="39" edge="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint x="774.5" y="310" as="sourcePoint"/>
|
||||
<mxPoint x="774.5" y="180" as="targetPoint"/>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="43" value="<font style="font-size: 12px">json-<br>request</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;fontColor=#000000;labelBackgroundColor=none;" parent="1" vertex="1" connectable="0">
|
||||
<mxGeometry x="350" y="216" as="geometry"/>
|
||||
</mxCell>
|
||||
<mxCell id="44" value="<font style="font-size: 12px">json-<br>request</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=15;fontColor=#000000;labelBackgroundColor=none;" parent="1" vertex="1" connectable="0">
|
||||
<mxGeometry x="750" y="216" as="geometry"/>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
BIN
docu/Concepts/TechnicalRequirements/image/CommunityDBSkeema.png
Normal file
|
After Width: | Height: | Size: 840 KiB |
BIN
docu/Concepts/TechnicalRequirements/image/CommunityServerApi.png
Normal file
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 104 KiB |
|
After Width: | Height: | Size: 127 KiB |
BIN
docu/Concepts/TechnicalRequirements/image/ModulsOverview.png
Normal file
|
After Width: | Height: | Size: 190 KiB |
BIN
docu/Concepts/TechnicalRequirements/image/TechnicalOverview.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
51
docu/Concepts/Testfallkatalog/ReadMe-Testkatalog.md
Normal file
@ -0,0 +1,51 @@
|
||||
# Testfall-Katalog
|
||||
|
||||
Der Testfall-Katalog wird in dem Verzeichnis *Testfallkatalog* angelegt. Er wird zu den verschiedenen fachlichen Themen durch Unterverzeichnisse gegliedert. In den jeweiligen Unterverzeichnissen sind die zugehörigen Testfälle als einzelne Dateien definiert.
|
||||
|
||||
## Namenskonventionen
|
||||
|
||||
Als **Themen** sind beispielsweise
|
||||
|
||||
* CommunityVerwaltung
|
||||
* BenutzerVerwaltung
|
||||
* Schöpfung/Vergänglichkeit
|
||||
* u.a.
|
||||
|
||||
vorgesehen, die als Unterverzeichnisse mit folgenden Nameskonventionen angelegt sind:
|
||||
|
||||
* Prefix-Pattern: "T", zweistellige laufende Nr, "-", Themenbezeichnung
|
||||
* Beispiel: T01-CommunityVerwaltung
|
||||
|
||||
Die **Testfälle** selbst werden in einzelnen Dateien beschrieben. Die Namen der Testfall-Dateien folgen dem Namenspattern:
|
||||
|
||||
* Prefix-Pattern: "Prefix des Verzeichnisses"-"C", dreistellige laufende Nr, "-", zweistellig laufende Nr, "-", Testfallbezeichnung
|
||||
* Beispiel: T02-C002-01-Benutzerregistrierung
|
||||
* die dreistellige Nummer wird mit der Testfallbezeichnung in Bezug gesetzt
|
||||
* die zweistellige Nummer dient als optionale Untergliederung für einen Testfall
|
||||
* Beispiel:
|
||||
* T02-C002-01-Benutzerregistrierung: Schritt 1 - Registrierungslink
|
||||
* T02-C002-02-Benutzerregistrierung: Schritt 2 - Datenerfassung
|
||||
* T02-C002-03-Benutzerregistrierung: Schritt 3 - ...
|
||||
|
||||
Um Dialog-Masken als **Bilder** in die Testfallbeschreibungen einzubinden, gibt es das Verzeichnis Testfallkatalog/image. Dieses enthält alle Bilder aller Testfälle nach folgenden Konventionen:
|
||||
|
||||
* Die Bild-Dateien werden so benannt, wie die Testfalldatei, die sie einbindet.
|
||||
* Sollten mehrere Bilder pro Testfall-Beschreibung notwendig sein, dann wird am Ende des Dateinamens, aber vor der Extension eine laufende Nummer vergeben.
|
||||
* In der Testfall-Beschreibung können diese Bilder mit folgender Notation eingebunden werden:
|
||||
* ``
|
||||
* *Wie man direkt DrawIO-Bilder einhängen kann, ist noch nicht klar (notfalls muss eben ein PNG-Bild davon exportiert werden)*
|
||||
|
||||
## Testfall-Vorlage
|
||||
|
||||
Im Verzeichnis Testfallkatalog liegt eine Datei *Testfall-Vorlage.md*, die als Kopie für das Anlegen eines neuen Testfalles herangezogen werden kann. Die Kopie der Testfallvorlage im Test-Thema-Verzeichnis ist dann gemäß den oben beschriebenen Namenskonventionen für die Testfall-Datei umzubenennen.
|
||||
|
||||
In der Testfall-Vorlage sind die Gliederungen und Themen benannt, was eine Testfallbeschreibung beinhalten sollte.
|
||||
|
||||
## Ziel des Testfall-Katalogs
|
||||
|
||||
1. Erfassung aller Testfälle für die bisher vorhandene Software
|
||||
1. Schrittweise werden die Testfall-Dateien auf Basis von Test-Sessions erstellt und mit Inhalt gefüllt.
|
||||
2. Testfall-Erfassung als Grundlage **VOR** der Entwicklung!
|
||||
1. Bei der Erstellung eines Tickets für Software-Entwicklung/Änderung wird das "Test-Thema" und der "Testfall" definiert, der als Anforderung für das Ticket dann vom Ticket-Owner in Form einer Testfall-Datei beschrieben wird.
|
||||
2. Der Link der Testfall-Datei wird im Ticket hinterlegt
|
||||
3. Ein Ticket OHNE Testfall-Datei darf weder beim Review abgenommen noch für ein Release geschlossen werden.
|
||||
@ -0,0 +1,23 @@
|
||||
# Testfall: "*T01-C001-01-CreateCommunity*"
|
||||
|
||||
## Thema: "*T01-CommunityVerwaltung*"
|
||||
|
||||
## Beschreibung:
|
||||
|
||||
*Welche(n) Anwendungsschritt/Oberfläche/Logik ist durch den Testfall betroffen?*
|
||||
|
||||
## Vorraussetzungen:
|
||||
|
||||
*Welche Vorraussetzungen (Daten/Anwendungschritte, etc.) müssen erfüllt sein, um den Testfall durchführen zu können?*
|
||||
|
||||
## Testfall-Schritte:
|
||||
|
||||
*Welche Schritte müssen zur Durchführung des Testfalles getätigt werden? (Dateneingaben/ Navigationen/ Link- o Button-Klicks/ Schritte der Anwendungslogik/ etc.)*
|
||||
|
||||
## Ende-Bedingungen:
|
||||
|
||||
*Welche Bedingungen werden am Ende des Testfalles bei positivem Ergebnis erwartet? (Daten/ GUI/ Zustände/ etc)*
|
||||
|
||||
## erwartete Fehlerfälle:
|
||||
|
||||
*Welche Fehlerfälle können auftreten und wie ist das erwartete Verhalten/ Rückgabewerte/ Fehlercode*
|
||||
@ -0,0 +1,109 @@
|
||||
# Testfall: "T02-C001-01-LoginMaske"
|
||||
|
||||
## Thema: "T02-Benutzerverwaltung"
|
||||
|
||||
## Beschreibung:
|
||||
|
||||
*Welche(n) Anwendungsschritt/Oberfläche/Logik ist durch den Testfall betroffen?*
|
||||
|
||||
Es wird die Anzeige der Login-Maske geprüft auf:
|
||||
|
||||
* Vorhandensein aller geforderten Elemente gemäß Entwurf:
|
||||
|
||||

|
||||
|
||||
* Layoutprüfung der statischen und dynamischen Elemente
|
||||
* formelle Validierung von Eingaben in die Eingabefelder mit entsprechenden Fehlermeldungen
|
||||
* Funktionsprüfung der Mehrsprachigkeit
|
||||
* Funktionsprüfung der Footer-Links
|
||||
|
||||
**Nicht enthalten in diesem Testfall:**
|
||||
|
||||
* die Funktion hinter dem Button "Anmelden"; siehe dazu Testfall: [T02-C001-02-LoginMaske.md](./T02-C002-02-LoginMaske.md)
|
||||
* die Funktion hinter dem Link "Passwort vergessen"; siehe dazu Testfall: [T02-C001-03-LoginMaske.md](./T02-C001-03-LoginMaske.md)
|
||||
|
||||
## Vorraussetzungen:
|
||||
|
||||
*Welche Vorraussetzungen (Daten/Anwendungschritte, etc.) müssen erfüllt sein, um den Testfall durchführen zu können?*
|
||||
|
||||
Es wird die URL
|
||||
|
||||
* Testumgebung: https://stage1.gradido.net/vue/login
|
||||
* Produktionsumgebung: https://gradido.net/vue/login
|
||||
|
||||
aufgerufen und die Login-Maske wird angezeigt.
|
||||
|
||||
## Testfall-Schritte:
|
||||
|
||||
*Welche Schritte müssen zur Durchführung des Testfalles getätigt werden? (Dateneingaben/ Navigationen/ Link- o Button-Klicks/ Schritte der Anwendungslogik/ etc.)*
|
||||
|
||||
1. Prüfung auf korrekte Anzeige der Statischen Elemente:
|
||||
|
||||
1. Text, Rechtschreibung und Layout von:
|
||||
1. Maskenüberschrift "Gradido"
|
||||
2. Maskentext "Tausend Dank, weil du bei uns bist"
|
||||
3. Eingabeüberschrift "Anmeldung"
|
||||
4. Label "Email"
|
||||
5. Default-Text "Email" bei ungefülltem Eingabefeld
|
||||
6. Label "Passwort"
|
||||
7. Default-Text "Passwort" bei ungefülltem Eingabefeld
|
||||
8. Button-Text "Anmeldung"
|
||||
9. Linktext "Passwort vergessen"
|
||||
10. Sprachauswahltexte
|
||||
11. Footer Copyright
|
||||
12. Footer Links:
|
||||
1. "Gradido-Akademie"
|
||||
2. "App-Version"
|
||||
3. "Impressum"
|
||||
4. "Datenschutzerklärung"
|
||||
5. "Mitgliederbereich"
|
||||
6. "Whitepaper"
|
||||
7. "Support"
|
||||
2. Prüfung der Eingabedynamik in der Login-Maske:
|
||||
|
||||
1. Eingabefeld Email:
|
||||
1. valide Emailadresse gemäß Pattern: "name"@"domain"."ländercode"
|
||||
2. maximale Länge einer Email-Adresse?
|
||||
2. Eingabefeld Passwort:
|
||||
1. mindestens ein Zeichen
|
||||
2. maximale Länge eines Passwortes?
|
||||
3. Sichtbarschaltung und Verdeckung des eingegebenen Passwortes
|
||||
3. Sprachauswahl:
|
||||
1. entsprechen alle angezeigten Text der aktuell eingestellten Sprache?
|
||||
2. Umstellung der Sprache über die Sprachauswahl-Box
|
||||
3. Wiederholung von Schritt 2.3.1 und 2.3.2 bis alle verfügbaren Sprachen geprüft sind
|
||||
4. Footer-Links:
|
||||
1. "Gradido-Akademie" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://gradido.net/de"
|
||||
2. "App-Version" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://github.com/gradido/gradido/releases/latest"
|
||||
3. "Impressum" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://gradido.net/de/impressum/"
|
||||
4. "Datenschutzerklärung" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://gradido.net/de/datenschutz/"
|
||||
5. "Mitgliederbereich" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://elopage.com/s/gradido/sign_in?locale=de"
|
||||
6. "Whitepaper" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://docs.google.com/document/d/1jZp-DiiMPI9ZPNXmjsvOQ1BtnfDFfx8BX7CDmA8KKjY/edit?usp=sharing"
|
||||
7. "Support"reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://gradido.net/de/contact/"
|
||||
|
||||
## Ende-Bedingungen:
|
||||
|
||||
*Welche Bedingungen werden am Ende des Testfalles bei positivem Ergebnis erwartet? (Daten/ GUI/ Zustände/ etc)*
|
||||
|
||||
Die Login-Maske wird wie erwartet angezeigt.
|
||||
|
||||
Die Texte und Layouts entsprechen den Vorgaben.
|
||||
|
||||
Die Format-Validierungen der Eingabefelder erfüllen die vorgegebenen Regeln
|
||||
|
||||
Alle Links reagieren gemäß den Vorgaben
|
||||
|
||||
Die Eingabefelder sind mit validen Inhalten gefüllt, so dass der Button "Anmeldung" betätigt werden könnte. Dies ist aber Teil des nächsten Testfalls unter [T02-C001-02-LoginMaske.md](./T02-C001-02-LoginMakse.md)
|
||||
|
||||
## erwartete Fehlerfälle:
|
||||
|
||||
*Welche Fehlerfälle können auftreten und wie ist das erwartete Verhalten/ Rückgabewerte/ Fehlercode?*
|
||||
|
||||
Eingabefeld "Email":
|
||||
|
||||
* kein Inhalt -> Fehlermeldung "Email ist ein Pflichtfeld"
|
||||
* ungültige Email-Adresseingabe -> Fehlermeldung "Email muss eine gültige E-Mail-Adresse sein"
|
||||
|
||||
Eingabefeld "Passwort":
|
||||
|
||||
* kein Inhalt -> Fehlermeldung "Passwort ist ein Pflichtfeld"
|
||||
@ -0,0 +1,54 @@
|
||||
# Testfall: "T02-C001-02-LoginMaske"
|
||||
|
||||
## Thema: "T02-Benutzerverwaltung"
|
||||
|
||||
## Beschreibung:
|
||||
|
||||
*Welche(n) Anwendungsschritt/Oberfläche/Logik ist durch den Testfall betroffen?*
|
||||
|
||||
Es wird in der Login-Maske die Funktion des Buttons "Anmeldung"geprüft:
|
||||
|
||||

|
||||
|
||||
**Nicht enthalten in diesem Testfall:**
|
||||
|
||||
* die Anzeige, Layout und Validierung der Login-Maske; siehe dazu Testfall: [T02-C001-01-LoginMaske.md](./T02-C001-01-LoginMaske.md)
|
||||
* die Funktion hinter dem Link "Passwort vergessen"; siehe dazu Testfall: [T02-C001-03-LoginMaske.md](./T02-C001-03-LoginMaske.md)
|
||||
|
||||
## Vorraussetzungen:
|
||||
|
||||
*Welche Vorraussetzungen (Daten/Anwendungschritte, etc.) müssen erfüllt sein, um den Testfall durchführen zu können?*
|
||||
|
||||
Die Eingabefelder Email und Passwort sind mit validen Inhalten gefüllt.
|
||||
|
||||
## Testfall-Schritte:
|
||||
|
||||
*Welche Schritte müssen zur Durchführung des Testfalles getätigt werden? (Dateneingaben/ Navigationen/ Link- o Button-Klicks/ Schritte der Anwendungslogik/ etc.)*
|
||||
|
||||
Prüfung auf korrekten Funktionsweise des Buttons "Anmeldung":
|
||||
|
||||
1. In beiden Eingabefeldern Email und Passwort sind gültige und schon registrierte Anmeldedaten eines Mitglieds eingetragen
|
||||
2. Mit Betätigen des Buttons "Anmeldung" wird der Login-Prozess gestartet
|
||||
1. *Gibt es noch weitere Prüfschritte (LOG-Ausgaben auf Login-, Community-Server o.ä.) die hier überprüft werden sollten?*
|
||||
3. Bei erfolgreichem Login wird die URL angezeigt
|
||||
* Testumgebung: "https://stage1.gradido.net/vue/overview"
|
||||
* Produktionsumgebung: "https://gradido.net/vue/overview"
|
||||
4. Bei fehlerhaftem Login wird eine entsprechend aussagekräftige Fehlermeldung angezeigt und die Anzeige verbleibt auf der Login-Maske.
|
||||
|
||||
## Ende-Bedingungen:
|
||||
|
||||
*Welche Bedingungen werden am Ende des Testfalles bei positivem Ergebnis erwartet? (Daten/ GUI/ Zustände/ etc)*
|
||||
|
||||
Der Login-Prozess wurde erfolgreich durchlaufen.
|
||||
|
||||
Alle zu überprüfende Schritte des Login-Prozesses sind erfolgreich abgeschlossen.
|
||||
|
||||
Es wird die Übersichtseite des angemeldeten Mitglieds angezeigt.
|
||||
|
||||
## erwartete Fehlerfälle:
|
||||
|
||||
*Welche Fehlerfälle können auftreten und wie ist das erwartete Verhalten/ Rückgabewerte/ Fehlercode?*
|
||||
|
||||
nicht registrierte Nutzerdaten in Eingabefeld "Email" und/oder "Passwort":
|
||||
|
||||
* ungültiger Login -> Fehlermeldung "Leider konnten wir keinen Account finden mit diesen Daten!"
|
||||
@ -0,0 +1,170 @@
|
||||
# Testfall: "T02-C001-03-LoginMaske"
|
||||
|
||||
## Thema: "T02-Benutzerverwaltung"
|
||||
|
||||
## Beschreibung:
|
||||
|
||||
*Welche(n) Anwendungsschritt/Oberfläche/Logik ist durch den Testfall betroffen?*
|
||||
|
||||
Es wird in der Login-Maske die Funktion des Links "Passwort vergessen?"geprüft:
|
||||
|
||||

|
||||
|
||||
**Nicht enthalten in diesem Testfall:**
|
||||
|
||||
* die Anzeige, Layout und Validierung der Login-Maske; siehe dazu Testfall: [T02-C001-01-LoginMaske](./T02-C001-01-LoginMaske.md)
|
||||
* die Funktion hinter dem Link "Passwort vergessen"; siehe dazu Testfall: [T02-C001-02-LoginMaske](T02-C001-02-LoginMaske.md)
|
||||
|
||||
## Vorraussetzungen:
|
||||
|
||||
*Welche Vorraussetzungen (Daten/Anwendungschritte, etc.) müssen erfüllt sein, um den Testfall durchführen zu können?*
|
||||
|
||||
Es wird die URL
|
||||
|
||||
* Testumgebung: https://stage1.gradido.net/vue/login
|
||||
* Produktionsumgebung: https://gradido.net/vue/login
|
||||
|
||||
aufgerufen und die Login-Maske wird angezeigt.
|
||||
|
||||
## Testfall-Schritte:
|
||||
|
||||
*Welche Schritte müssen zur Durchführung des Testfalles getätigt werden? (Dateneingaben/ Navigationen/ Link- o Button-Klicks/ Schritte der Anwendungslogik/ etc.)*
|
||||
|
||||
* Prüfung auf korrekte Funktionsweise des Links "Passwort vergessen?"
|
||||
* keine sonstigen Eingaben bzw. Vorraussetzungen notwendig
|
||||
* Mit Betätigen des Links "Passwort vergessen?" wird der Passwort-Zurücksetzen-Prozess gestartet und unter
|
||||
* der Testumgebung: https://stage1.gradido.net/vue/password
|
||||
* der Produktionsumgebung: https://gradido.net/vue/password
|
||||
* folgende Maske angezeigt:
|
||||
|
||||

|
||||
|
||||
1. **Prüfung der Anzeige-Elemente, Layout und Eingabevalidierungen des Eingabefeldes, Text, Rechtschreibung und Layout von:**
|
||||
|
||||
* Maskenüberschrift "Passwort zurücksetzen"
|
||||
* Maskentext "Wenn du dein Passwort vergessen hast, kannst du es hier zurücksetzen"
|
||||
* Label "Email"
|
||||
* Default-Text "Email" bei ungefülltem Eingabefeld
|
||||
* Button-Text "Jetzt senden"
|
||||
* Linktext "zurück"
|
||||
* Sprachauswahltexte
|
||||
* Footer Copyright
|
||||
* Footer Links:
|
||||
1. "Gradido-Akademie"
|
||||
2. "App-Version"
|
||||
3. "Impressum"
|
||||
4. "Datenschutzerklärung"
|
||||
5. "Mitgliederbereich"
|
||||
6. "Whitepaper"
|
||||
7. "Support"
|
||||
|
||||
2. **Prüfung der Eingabedynamik in der 1ten Passwort-Zurücksetzen-Maske:**
|
||||
|
||||
1. Eingabefeld Email:
|
||||
2. valide Emailadresse gemäß Pattern: "name"@"domain"."ländercode"
|
||||
3. maximale Länge einer Email-Adresse?
|
||||
4. Sprachauswahl:
|
||||
|
||||
1. entsprechen alle angezeigten Texte der aktuell eingestellten Sprache?
|
||||
2. Umstellung der Sprache über die Sprachauswahl-Box
|
||||
3. Wiederholung von Schritt 2.4.1 und 2.4.2 bis alle verfügbaren Sprachen geprüft sind
|
||||
5. Link "Zurück" ist aktiv und landet auf URL
|
||||
|
||||
1. Testumgebung: https://stage1.gradido.net/vue/Login
|
||||
2. Produktionsumgebung: https://gradido.net/vue/Login
|
||||
6. Footer-Links:
|
||||
|
||||
1. "Gradido-Akademie" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://gradido.net/de"
|
||||
2. "App-Version" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://github.com/gradido/gradido/releases/latest"
|
||||
3. "Impressum" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://gradido.net/de/impressum/"
|
||||
4. "Datenschutzerklärung" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://gradido.net/de/datenschutz/"
|
||||
5. "Mitgliederbereich" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://elopage.com/s/gradido/sign_in?locale=de"
|
||||
6. "Whitepaper" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://docs.google.com/document/d/1jZp-DiiMPI9ZPNXmjsvOQ1BtnfDFfx8BX7CDmA8KKjY/edit?usp=sharing"
|
||||
7. "Support"reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://gradido.net/de/contact/"
|
||||
3. **Prüfung des eigentlichen Passwort-Zurücksetzen Prozesses**
|
||||
|
||||
1. Eingabe einer bekannten und validen Email.Adresse, auf die man Zugriff hat.
|
||||
2. Mit Betätigen des Links "Passwort zurücksetzen" wird der Passwort-Zurücksetzen Prozess gestartet
|
||||
3. *Gibt es noch weitere Prüfschritte (LOG-Ausgaben auf Login-, Community-Server o.ä.) die hier überprüft werden sollten?*
|
||||
4. Sobald der Prozess die Zurücksetzen-Email abgeschickt hat, wird die folgende Maske angezeigt:
|
||||
|
||||

|
||||
|
||||
5. **In dem angegebenen Email-Postfach wird eine Email empfangen, die ein Zurücksetzen-Link enthält:**
|
||||
1. Testumgebung: https://stage1.gradido.net/vue/reset/'erzeugter rest-code'
|
||||
2. Produktionsumgebung: https://gradido.net/vue/reset/'erzeugter reset-code'
|
||||
6. **Mit Betätigen des Reset-Links bzw. Aufruf des Rest-Links im Browser wird folgende Maske angezeigt:**
|
||||
|
||||

|
||||
|
||||
7. **Prüfung der Anzeige-Elemente, Layout und Eingabevalidierungen der Eingabefelder ,Text, Rechtschreibung und Layout von:
|
||||
|
||||
* Maskenüberschrift "Passwort zurücksetzen"
|
||||
* Maskentext "Jetzt kannst du ein neues Passwort speichern, mit dem du dich zukünftig in der Gradido-App anmelden kannst."
|
||||
* Label "neues Passwort"
|
||||
* Default-Text "neues Passwort" bei ungefülltem Eingabefeld
|
||||
* Label "neues Passwort wiederholen"
|
||||
* Default-Text "neues Passwort wiederholen" bei ungefülltem Eingabefeld
|
||||
* Button-Text "Passwort zurücksetzen"
|
||||
* Linktext "zurück"
|
||||
* Sprachauswahltexte
|
||||
* Footer Copyright
|
||||
* Footer Links:
|
||||
|
||||
* "Gradido-Akademie"
|
||||
* "App-Version"
|
||||
* "Impressum"
|
||||
* "Datenschutzerklärung"
|
||||
* "Mitgliederbereich"
|
||||
* "Whitepaper"
|
||||
* "Support"
|
||||
|
||||
8. **Prüfung der Eingabedynamik in der 2ten Passwort-Zurücksetzen-Maske:**
|
||||
9. Eingabefeld "Neues Passwort":
|
||||
|
||||
1. mindestens ein Zeichen
|
||||
2. maximale Länge eines Passwortes?
|
||||
3. Sichtbarschaltung und Verdeckung des eingegebenen Passwortes
|
||||
10. Eingabefeld "Neues Passwort wiederholen":
|
||||
|
||||
1. mindestens ein Zeichen
|
||||
2. maximale Länge eines Passwortes?
|
||||
3. Sichtbarschaltung und Verdeckung des eingegebenen Passwortes
|
||||
11. Sprachauswahl:
|
||||
|
||||
1. entsprechen alle angezeigten Texte der aktuell eingestellten Sprache?
|
||||
2. Umstellung der Sprache über die Sprachauswahl-Box
|
||||
3. Wiederholung von Schritt 8.3.1 und 8.3.2 bis alle verfügbaren Sprachen geprüft sind
|
||||
12. Link "Zurück" ist aktiv und landet auf URL
|
||||
|
||||
1. Testumgebung: https://stage1.gradido.net/vue/Login
|
||||
2. Produktionsumgebung: https://gradido.net/vue/Login
|
||||
13. Footer-Links:
|
||||
|
||||
1. "Gradido-Akademie" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://gradido.net/de"
|
||||
2. "App-Version" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://github.com/gradido/gradido/releases/latest"
|
||||
3. "Impressum" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://gradido.net/de/impressum/"
|
||||
4. "Datenschutzerklärung" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://gradido.net/de/datenschutz/"
|
||||
5. "Mitgliederbereich" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://elopage.com/s/gradido/sign_in?locale=de"
|
||||
6. "Whitepaper" reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://docs.google.com/document/d/1jZp-DiiMPI9ZPNXmjsvOQ1BtnfDFfx8BX7CDmA8KKjY/edit?usp=sharing"
|
||||
7. "Support"reagiert und landet je nach aktuell eingestellter Sprache auf URL "https://gradido.net/de/contact/"
|
||||
|
||||
Bei erfolgreichem Passwort-Reset wird folgende Maske angezeigt:
|
||||
|
||||
## Ende-Bedingungen:
|
||||
|
||||
*Welche Bedingungen werden am Ende des Testfalles bei positivem Ergebnis erwartet? (Daten/ GUI/ Zustände/ etc)*
|
||||
|
||||
Der Login-Prozess wurde erfolgreich durchlaufen.
|
||||
|
||||
Alle zu überprüfende Schritte des Login-Prozesses sind erfolgreich abgeschlossen.
|
||||
|
||||
Es wird die Übersichtseite des angemeldeten Mitglieds angezeigt.
|
||||
|
||||
## erwartete Fehlerfälle:
|
||||
|
||||
*Welche Fehlerfälle können auftreten und wie ist das erwartete Verhalten/ Rückgabewerte/ Fehlercode?*
|
||||
|
||||
nicht registrierte Nutzerdaten in Eingabefeld "Email" und/oder "Passwort":
|
||||
|
||||
* ungültiger Login -> Fehlermeldung "Leider konnten wir keinen Account finden mit diesen Daten!"
|
||||
@ -0,0 +1,23 @@
|
||||
# Testfall: "*T03-C001-01-CreateActiveBasicIncome*"
|
||||
|
||||
## Thema: "*T03-Schoepfung-Vergaenglichkeit*"
|
||||
|
||||
## Beschreibung:
|
||||
|
||||
*Welche(n) Anwendungsschritt/Oberfläche/Logik ist durch den Testfall betroffen?*
|
||||
|
||||
## Vorraussetzungen:
|
||||
|
||||
*Welche Vorraussetzungen (Daten/Anwendungschritte, etc.) müssen erfüllt sein, um den Testfall durchführen zu können?*
|
||||
|
||||
## Testfall-Schritte:
|
||||
|
||||
*Welche Schritte müssen zur Durchführung des Testfalles getätigt werden? (Dateneingaben/ Navigationen/ Link- o Button-Klicks/ Schritte der Anwendungslogik/ etc.)*
|
||||
|
||||
## Ende-Bedingungen:
|
||||
|
||||
*Welche Bedingungen werden am Ende des Testfalles bei positivem Ergebnis erwartet? (Daten/ GUI/ Zustände/ etc)*
|
||||
|
||||
## erwartete Fehlerfälle:
|
||||
|
||||
*Welche Fehlerfälle können auftreten und wie ist das erwartete Verhalten/ Rückgabewerte/ Fehlercode?*
|
||||
23
docu/Concepts/Testfallkatalog/Testfall-Vorlage.md
Normal file
@ -0,0 +1,23 @@
|
||||
# Testfall: "*Dateiname*"
|
||||
|
||||
## Thema: "*Name des Verzeichnisses*"
|
||||
|
||||
## Beschreibung:
|
||||
|
||||
*Welche(n) Anwendungsschritt/Oberfläche/Logik ist durch den Testfall betroffen?*
|
||||
|
||||
## Vorraussetzungen:
|
||||
|
||||
*Welche Vorraussetzungen (Daten/Anwendungschritte, etc.) müssen erfüllt sein, um den Testfall durchführen zu können?*
|
||||
|
||||
## Testfall-Schritte:
|
||||
|
||||
*Welche Schritte müssen zur Durchführung des Testfalles getätigt werden? (Dateneingaben/ Navigationen/ Link- o Button-Klicks/ Schritte der Anwendungslogik/ etc.)*
|
||||
|
||||
## Ende-Bedingungen:
|
||||
|
||||
*Welche Bedingungen werden am Ende des Testfalles bei positivem Ergebnis erwartet? (Daten/ GUI/ Zustände/ etc)*
|
||||
|
||||
## erwartete Fehlerfälle:
|
||||
|
||||
*Welche Fehlerfälle können auftreten und wie ist das erwartete Verhalten/ Rückgabewerte/ Fehlercode?*
|
||||
BIN
docu/Concepts/Testfallkatalog/image/T02-C001-01-LoginMaske.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
docu/Concepts/Testfallkatalog/image/T02-C001-03-LoginMaske1.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
docu/Concepts/Testfallkatalog/image/T02-C001-03-LoginMaske2.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
docu/Concepts/Testfallkatalog/image/T02-C001-03-LoginMaske3.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
docu/Concepts/Testfallkatalog/image/T02-C001-03-LoginMaske4.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
@ -125,6 +125,106 @@ Transaction:
|
||||
- `creation_amount`: only for creation transaction, created account before decay
|
||||
- `target_date`: only by creation transaction, target date for creation, start time for decay calculation (if < as global decay start time)
|
||||
|
||||
## List GDT Transactions
|
||||
`GET http://localhost/api/listGDTTransactions/[1]/[25]/[DESC]/[session_id]`
|
||||
Parts symbolized by [] are optional
|
||||
- first parameter (1) is page for paging
|
||||
- second parameter (25) is count for paging
|
||||
- third parameter is ordering of resulting array, default is ASC
|
||||
- fourth parameter is session_id (session will be searched in php session and GRADIDO_LOGIN cookie and if not found use this )
|
||||
|
||||
#### Paging
|
||||
With count you say how many entrys you like to have in the result.
|
||||
With page you say on which page you are.
|
||||
For example 50 transactions are in db.
|
||||
With 1/25 you get the first 25 transactions (1-25)
|
||||
With 2/20 you get the second 20 transactions (21-40)
|
||||
|
||||
### Response
|
||||
Assuming session was valid and gdt server was setup correct
|
||||
{
|
||||
"state": "success",
|
||||
"count": 4,
|
||||
"gdtEntries": [
|
||||
{
|
||||
"id": 1,
|
||||
"amount": 99,
|
||||
"date": "2020-01-01T13:47:12+00:00",
|
||||
"email": "dariofrodo@gmx.de",
|
||||
"comment": "",
|
||||
"coupon_code": null,
|
||||
"gdt_entry_type_id": 1,
|
||||
"factor": 18,
|
||||
"amount2": 0,
|
||||
"factor2": 1,
|
||||
"gdt": 1782
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"amount": 100.12,
|
||||
"date": "2021-07-28T13:58:00+00:00",
|
||||
"email": "tester2@gmail.com",
|
||||
"comment": null,
|
||||
"coupon_code": "",
|
||||
"gdt_entry_type_id": 4,
|
||||
"factor": 15,
|
||||
"amount2": 0,
|
||||
"factor2": 0.05,
|
||||
"gdt": 75.09000000000002
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"amount": 1782,
|
||||
"date": "2021-07-30T13:21:46+00:00",
|
||||
"email": "dariofrodo@gmx.de",
|
||||
"comment": "Event 20-20",
|
||||
"coupon_code": null,
|
||||
"gdt_entry_type_id": 7,
|
||||
"factor": 0.2,
|
||||
"amount2": 0,
|
||||
"factor2": 1,
|
||||
"gdt": 356.40000000000006
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"amount": 10,
|
||||
"date": "2021-07-31T13:58:00+00:00",
|
||||
"email": "tester1@gmail.com",
|
||||
"comment": null,
|
||||
"coupon_code": "",
|
||||
"gdt_entry_type_id": 4,
|
||||
"factor": 15,
|
||||
"amount2": 0,
|
||||
"factor2": 0.05,
|
||||
"gdt": 7.5
|
||||
}
|
||||
],
|
||||
"gdtSum": 2220.99,
|
||||
"timeUsed": 0.012517929077148438
|
||||
}
|
||||
|
||||
- `count`: Count of total gdt transactions for user
|
||||
- `gdtEntries`: array with gdt entries, sort by date
|
||||
- `amount`: amount of payed money in euro, expect by gdt_entry_type_id = 7, then it is GDT Sum for Global Modificator time span
|
||||
- `date`: date of transaction with let create gdt transaction, date for picking factor and Global Modificator
|
||||
- `email`: email of user which has payed money, for gdt_entry_type_id = 4 it is the email of user who was recruited
|
||||
- `comment`: custom comment or Global Modificator name if gdt_entry_type_id = 7
|
||||
- `gdt_entry_type_id`: type of gdt entry
|
||||
(1) Form: Single GDT Entry directly created by admin via formular
|
||||
(2) CVS: Created by importing a CVS-List with multiple GDT Entries
|
||||
(3) Elopage: Automatic created by Elopage Transaction (with revenue > 0 and payment state success)
|
||||
(4) Elopage Publisher: Automatic created by Elopage Transaction (with revenue > 0 and payment state success) for publisher
|
||||
(5) Digistore: Automatic created by Digistore Transaction
|
||||
(6) CVS2: Created by importing a CVS-List with multiple GDT Entries, other format (used by Bernds old Accounting Tool)
|
||||
(7) Global Modificator: Global Modificator which grand percental bonus on GDT in possession in event time span
|
||||
- `factor`: Mulitplication factor for calculating gdt, change(d) over time
|
||||
- `amount2`: Bonus add amount for gdt, sparly used
|
||||
- `factor2`: Bonus mulitplication factor used by elopage publisher entry
|
||||
- `gdt`: GDT Value, calculatedt from other value: gdt = amount * factor * factor2 + amount2
|
||||
- `gdtSum`: Total GDT Sum of user
|
||||
- `timeUsed`: GDT Server isn't optimized, this is for easy checking if it is still fast enough
|
||||
|
||||
|
||||
## Creation transaction
|
||||
Makes a creation transaction to create new Gradido
|
||||
|
||||
|
||||
@ -342,7 +342,7 @@ Ein GDT Eintrag sieht so aus:
|
||||
```
|
||||
{
|
||||
"id": 8857,
|
||||
"amount": 1000, // = 10,00 Euro
|
||||
"amount": 1000, // GDT
|
||||
"date": "2020-06-17T14:12:00+00:00",
|
||||
"email": "foerderkreis-1@gradido.org",
|
||||
"comment": null,
|
||||
@ -379,8 +379,10 @@ Bis zum 5. (Bernd ist 2.)
|
||||
Diese Beziehung wird durch die connectEntries dargestellt.
|
||||
Insbesondere durch den publishersPath, connect enthält einfach nur alle mögliche Daten.
|
||||
|
||||
|
||||
# TODO
|
||||
TODO: Update GDT-Server um paging und Zugriff auf alle Einträge zu erhalten, optimierter Zugriff
|
||||
GET https://staging.gradido.net/state-balances/ajaxGdtTransactions
|
||||
Liefert wenn alles in Ordnung ist:
|
||||
|
||||
wenn nicht type 7 dann "amount" in euro ansonsten in GDT
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "bootstrap-vue-gradido-wallet",
|
||||
"version": "1.2.1",
|
||||
"version": "1.3.1",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "node run/server.js",
|
||||
|
||||
|
Before Width: | Height: | Size: 763 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 766 B |
|
Before Width: | Height: | Size: 737 B |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="36px" height="36px" viewBox="0 0 36 36" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>UI/icons/dark/github</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs/>
|
||||
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="UI/icons/dark/github" fill="#182359">
|
||||
<path d="M17.9985267,2 C9.16436969,2 2,9.16338746 2,18.0004911 C2,25.0695847 6.58405721,31.0660855 12.9420179,33.1818042 C13.7425335,33.3291384 14.0342552,32.8350778 14.0342552,32.4107554 C14.0342552,32.0306332 14.020504,31.0248319 14.0126462,29.6899843 C9.56217195,30.6564965 8.62316216,27.5447988 8.62316216,27.5447988 C7.89533135,25.696246 6.84631204,25.2041499 6.84631204,25.2041499 C5.3935971,24.2120998 6.95632156,24.2317444 6.95632156,24.2317444 C8.56226404,24.3447006 9.40697996,25.8809049 9.40697996,25.8809049 C10.834157,28.3256699 13.1522146,27.6194481 14.063722,27.2098591 C14.2090917,26.1765554 14.6226097,25.4713159 15.0793456,25.0715492 C11.5266276,24.6678535 7.7912152,23.294699 7.7912152,17.163633 C7.7912152,15.417232 8.41492986,13.9880905 9.43841125,12.8703152 C9.27339697,12.4656374 8.72433162,10.8380859 9.5955677,8.63593112 C9.5955677,8.63593112 10.9382731,8.20571534 13.9949661,10.2762516 C15.27088,9.9206851 16.6401056,9.7438841 18.0004911,9.7370085 C19.3598944,9.7438841 20.7281378,9.9206851 22.0060161,10.2762516 C25.0607447,8.20571534 26.4014856,8.63593112 26.4014856,8.63593112 C27.2746861,10.8380859 26.7256208,12.4656374 26.5615888,12.8703152 C27.5870346,13.9880905 28.2058381,15.417232 28.2058381,17.163633 C28.2058381,23.3104147 24.4645324,24.6629424 20.9010099,25.0587802 C21.4746309,25.5528408 21.9863716,26.5291752 21.9863716,28.0211793 C21.9863716,30.1604715 21.966727,31.8862457 21.966727,32.4107554 C21.966727,32.8390067 22.255502,33.3369962 23.0668222,33.180822 C29.4198717,31.0601921 34,25.0676202 34,18.0004911 C34,9.16338746 26.8356303,2 17.9985267,2" id="icons/icon-github"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
@ -1,17 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="36px" height="36px" viewBox="0 0 36 36" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>UI/icons/color/google</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs/>
|
||||
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="UI/icons/color/google">
|
||||
<g id="Group" transform="translate(2.000000, 2.000000)">
|
||||
<path d="M32.4365525,16.6024012 C32.4365525,15.4515967 32.3313665,14.344128 32.1357206,13.2820585 L16.5492615,13.2820585 L16.5492615,19.5616128 L25.4557094,19.5616128 C25.0721312,21.5908257 23.9059692,23.3098098 22.1535707,24.4613022 L22.1535707,28.5341733 L27.5019274,28.5341733 C30.631561,25.7077204 32.4365525,21.5461142 32.4365525,16.6024012 L32.4365525,16.6024012 Z" id="Shape" fill="#4285F4"/>
|
||||
<path d="M16.5492615,32.4674071 C21.0175621,32.4674071 24.7635856,31.0139403 27.5019274,28.5341733 L22.1535707,24.4613022 C20.6718508,25.4353244 18.7756982,26.0110706 16.5492615,26.0110706 C12.2387399,26.0110706 8.59088994,23.1557272 7.2893887,19.3181072 L1.76011213,19.3181072 L1.76011213,23.5244249 C4.48302664,28.8299569 10.0796222,32.4674071 16.5492615,32.4674071 L16.5492615,32.4674071 Z" id="Shape" fill="#34A853"/>
|
||||
<path d="M7.2893887,19.3181072 C6.95840347,18.344085 6.77047118,17.3033395 6.77047118,16.2337035 C6.77047118,15.1640676 6.95840347,14.1233221 7.2893887,13.1492999 L7.2893887,8.94298219 L1.76011213,8.94298219 C0.639530783,11.1345322 0,13.6142992 0,16.2337035 C0,18.8531079 0.639530783,21.3328749 1.76011213,23.5244249 L7.2893887,19.3181072 L7.2893887,19.3181072 Z" id="Shape" fill="#FBBC05"/>
|
||||
<path d="M16.5492615,6.4563365 C18.9790577,6.4563365 21.160615,7.27558824 22.8758478,8.88382548 L27.6225407,4.22764161 C24.755872,1.60892511 21.0098485,0 16.5492615,0 C10.0803235,0 4.48302664,3.63813805 1.76011213,8.94298219 L7.2893887,13.1492999 C8.59088994,9.31236774 12.2394411,6.4563365 16.5492615,6.4563365 Z" id="Shape" fill="#EA4335"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 316 B |
|
Before Width: | Height: | Size: 620 B |
|
Before Width: | Height: | Size: 426 B |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 533 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 187 KiB |
|
Before Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
@ -1,145 +0,0 @@
|
||||
import axios from 'axios'
|
||||
import CONFIG from '../config'
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
import regeneratorRuntime from 'regenerator-runtime'
|
||||
|
||||
// control email-text sended with email verification code
|
||||
const EMAIL_TYPE = {
|
||||
DEFAULT: 2, // if user has registered directly
|
||||
ADMIN: 5, // if user was registered by an admin
|
||||
}
|
||||
|
||||
const apiGet = async (url) => {
|
||||
try {
|
||||
const result = await axios.get(url)
|
||||
if (result.status !== 200) {
|
||||
throw new Error('HTTP Status Error ' + result.status)
|
||||
}
|
||||
if (!['success', 'warning'].includes(result.data.state)) {
|
||||
throw new Error(result.data.msg)
|
||||
}
|
||||
return { success: true, result }
|
||||
} catch (error) {
|
||||
return { success: false, result: error }
|
||||
}
|
||||
}
|
||||
|
||||
const apiPost = async (url, payload) => {
|
||||
try {
|
||||
const result = await axios.post(url, payload)
|
||||
if (result.status !== 200) {
|
||||
throw new Error('HTTP Status Error ' + result.status)
|
||||
}
|
||||
if (result.data.state === 'warning') {
|
||||
return { success: true, result: result.error }
|
||||
}
|
||||
if (result.data.state !== 'success') {
|
||||
throw new Error(result.data.msg)
|
||||
}
|
||||
return { success: true, result }
|
||||
} catch (error) {
|
||||
return { success: false, result: error }
|
||||
}
|
||||
}
|
||||
|
||||
const loginAPI = {
|
||||
login: async (email, password) => {
|
||||
const payload = {
|
||||
email,
|
||||
password,
|
||||
}
|
||||
return apiPost(CONFIG.LOGIN_API_URL + 'unsecureLogin', payload)
|
||||
},
|
||||
logout: async (sessionId) => {
|
||||
const payload = { session_id: sessionId }
|
||||
return apiPost(CONFIG.LOGIN_API_URL + 'logout', payload)
|
||||
},
|
||||
create: async (email, firstName, lastName, password) => {
|
||||
const payload = {
|
||||
email,
|
||||
first_name: firstName,
|
||||
last_name: lastName,
|
||||
password,
|
||||
emailType: EMAIL_TYPE.DEFAULT,
|
||||
login_after_register: true,
|
||||
}
|
||||
return apiPost(CONFIG.LOGIN_API_URL + 'createUser', payload)
|
||||
},
|
||||
sendEmail: async (email, email_text = 7, email_verification_code_type = 'resetPassword') => {
|
||||
const payload = {
|
||||
email,
|
||||
email_text,
|
||||
email_verification_code_type,
|
||||
}
|
||||
return apiPost(CONFIG.LOGIN_API_URL + 'sendEmail', payload)
|
||||
},
|
||||
loginViaEmailVerificationCode: async (optin) => {
|
||||
return apiGet(
|
||||
CONFIG.LOGIN_API_URL + 'loginViaEmailVerificationCode?emailVerificationCode=' + optin,
|
||||
)
|
||||
},
|
||||
getUserInfos: async (sessionId, email) => {
|
||||
const payload = {
|
||||
session_id: sessionId,
|
||||
email: email,
|
||||
ask: ['user.first_name', 'user.last_name'],
|
||||
}
|
||||
return apiPost(CONFIG.LOGIN_API_URL + 'getUserInfos', payload)
|
||||
},
|
||||
updateUserInfos: async (sessionId, email, data) => {
|
||||
const payload = {
|
||||
session_id: sessionId,
|
||||
email,
|
||||
update: {
|
||||
'User.first_name': data.firstName,
|
||||
'User.last_name': data.lastName,
|
||||
// 'User.description': data.description,
|
||||
},
|
||||
}
|
||||
return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload)
|
||||
},
|
||||
changePassword: async (sessionId, email, password) => {
|
||||
const payload = {
|
||||
session_id: sessionId,
|
||||
email,
|
||||
password,
|
||||
}
|
||||
return apiPost(CONFIG.LOGIN_API_URL + 'resetPassword', payload)
|
||||
},
|
||||
changePasswordProfile: async (sessionId, email, password, passwordNew) => {
|
||||
const payload = {
|
||||
session_id: sessionId,
|
||||
email,
|
||||
update: {
|
||||
'User.password_old': password,
|
||||
'User.password': passwordNew,
|
||||
},
|
||||
}
|
||||
return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload)
|
||||
},
|
||||
changeUsernameProfile: async (sessionId, email, username) => {
|
||||
const payload = {
|
||||
session_id: sessionId,
|
||||
email,
|
||||
update: {
|
||||
'User.username': username,
|
||||
},
|
||||
}
|
||||
return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload)
|
||||
},
|
||||
updateLanguage: async (sessionId, email, language) => {
|
||||
const payload = {
|
||||
session_id: sessionId,
|
||||
email,
|
||||
update: {
|
||||
'User.language': language,
|
||||
},
|
||||
}
|
||||
return apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload)
|
||||
},
|
||||
checkUsername: async (username, groupId = 1) => {
|
||||
return apiGet(CONFIG.LOGIN_API_URL + `checkUsername?username=${username}&group_id=${groupId}`)
|
||||
},
|
||||
}
|
||||
|
||||
export default loginAPI
|
||||
@ -1,22 +1,22 @@
|
||||
<template>
|
||||
<div>
|
||||
<span v-if="decaytyp === 'short'">
|
||||
<small>{{ decay ? ' -' + decay.balance + ' ' + decayStartBlockTextShort : '' }}</small>
|
||||
{{ decay ? ' -' + decay.balance + ' ' + decayStartBlockTextShort : '' }}
|
||||
</span>
|
||||
|
||||
<div v-if="decaytyp === 'new'">
|
||||
<b-list-group style="border: 0px">
|
||||
<b-list-group-item style="border: 0px; background-color: #f1f1f1">
|
||||
<div class="d-flex">
|
||||
<div class="d-flex" v-if="!decay.decayStartBlock">
|
||||
<div style="width: 100%" class="text-center pb-3">
|
||||
<b-icon icon="droplet-half" height="12" class="mb-2" />
|
||||
{{ $t('decay.calculation_decay') }}
|
||||
<b>{{ $t('decay.calculation_decay') }}</b>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex">
|
||||
<div style="width: 40%" class="text-right pr-3 mr-2">
|
||||
{{ $t('decay.last_transaction') }}
|
||||
<div v-if="!decay.decayStartBlock">{{ $t('decay.last_transaction') }}</div>
|
||||
</div>
|
||||
<div style="width: 60%">
|
||||
<div v-if="decay.decayStartBlock > 0">
|
||||
@ -27,7 +27,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span>
|
||||
<span v-if="!decay.decayStart">
|
||||
{{ $d($moment.unix(decay.decayStart), 'long') }}
|
||||
{{ $i18n.locale === 'de' ? 'Uhr' : '' }}
|
||||
</span>
|
||||
@ -37,17 +37,23 @@
|
||||
|
||||
<div class="d-flex">
|
||||
<div style="width: 40%" class="text-right pr-3 mr-2">
|
||||
{{ $t('decay.past_time') }}
|
||||
<div v-if="!decay.decayStartBlock">{{ $t('decay.past_time') }}</div>
|
||||
</div>
|
||||
<div style="width: 60%">
|
||||
<div v-if="decay.decayStartBlock > 0">{{ $t('decay.since_introduction') }}</div>
|
||||
<span v-if="duration">
|
||||
<b v-if="duration.years > 0">{{ duration.years }} {{ $t('decay.year') }},</b>
|
||||
<b v-if="duration.months > 0">{{ duration.months }} {{ $t('decay.months') }},</b>
|
||||
<b v-if="duration.days > 0">{{ duration.days }} {{ $t('decay.days') }},</b>
|
||||
<b v-if="duration.hours > 0">{{ duration.hours }} {{ $t('decay.hours') }},</b>
|
||||
<b v-if="duration.minutes > 0">{{ duration.minutes }} {{ $t('decay.minutes') }},</b>
|
||||
<b v-if="duration.seconds > 0">{{ duration.seconds }} {{ $t('decay.seconds') }}</b>
|
||||
<span v-if="duration.years > 0">{{ duration.years }} {{ $t('decay.year') }},</span>
|
||||
<span v-if="duration.months > 0">
|
||||
{{ duration.months }} {{ $t('decay.months') }},
|
||||
</span>
|
||||
<span v-if="duration.days > 0">{{ duration.days }} {{ $t('decay.days') }},</span>
|
||||
<span v-if="duration.hours > 0">{{ duration.hours }} {{ $t('decay.hours') }},</span>
|
||||
<span v-if="duration.minutes > 0">
|
||||
{{ duration.minutes }} {{ $t('decay.minutes') }},
|
||||
</span>
|
||||
<span v-if="duration.seconds > 0">
|
||||
{{ duration.seconds }} {{ $t('decay.seconds') }}
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@ -72,7 +78,7 @@ export default {
|
||||
computed: {
|
||||
decayStartBlockTextShort() {
|
||||
return this.decay.decayStartBlock
|
||||
? ' - Startblock Decay am: ' + this.$d(this.$moment.unix(this.decay.decayStartBlock))
|
||||
? this.$t('decay.decayStart') + this.$d(this.$moment.unix(this.decay.decayStartBlock))
|
||||
: ''
|
||||
},
|
||||
duration() {
|
||||
|
||||
@ -123,3 +123,47 @@ export const checkUsername = gql`
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
export const gdtTransactionListQuery = gql`
|
||||
query($sessionId: Float!, $currentPage: Float!, $pageSize: Float!) {
|
||||
gdtTransactionList(sessionId: $sessionId, currentPage: $currentPage, pageSize: $pageSize) {
|
||||
state
|
||||
count
|
||||
gdtEntries {
|
||||
amount
|
||||
date
|
||||
email
|
||||
comment
|
||||
couponCode
|
||||
gdtEntryType
|
||||
factor
|
||||
amount2
|
||||
factor2
|
||||
gdt
|
||||
}
|
||||
gdtSum
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
export const listGDTEntriesQuery = gql`
|
||||
query($email: String!, $currentPage: Float!, $pageSize: Float!) {
|
||||
listGDTEntries(email: $email, currentPage: $currentPage, pageSize: $pageSize) {
|
||||
state
|
||||
count
|
||||
gdtEntries {
|
||||
amount
|
||||
date
|
||||
email
|
||||
comment
|
||||
couponCode
|
||||
gdtEntryType
|
||||
factor
|
||||
amount2
|
||||
factor2
|
||||
gdt
|
||||
}
|
||||
gdtSum
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
@ -23,7 +23,8 @@
|
||||
"decay_since_last_transaction":"Vergänglichkeit seit der letzten Transaktion",
|
||||
"calculation_decay":"Berechnung der Vergänglichkeit",
|
||||
"Starting_block_decay":"Startblock Vergänglichkeit",
|
||||
"decay_introduced":"Die Vergänglichkeit wurde Eingeführt am",
|
||||
"decay_introduced":"Die Vergänglichkeit wurde Eingeführt am ",
|
||||
"decayStart": " - Startblock für Vergänglichkeit am: ",
|
||||
"last_transaction":"Letzte Transaktion",
|
||||
"past_time":"Vergangene Zeit",
|
||||
"since_introduction":"seit Einführung der Vergänglichkeit",
|
||||
@ -33,10 +34,11 @@
|
||||
"hours":"Stunden",
|
||||
"minutes":"Minuten",
|
||||
"seconds":"Sekunden",
|
||||
"received":"empfangen",
|
||||
"sent":"gesendet",
|
||||
"created":"geschöpft",
|
||||
"fromCommunity":"Aus der Community"
|
||||
"received":"Empfangen",
|
||||
"sent":"Gesendet",
|
||||
"created":"Geschöpft",
|
||||
"fromCommunity":"Aus der Gemeinschaft",
|
||||
"toCommunity":"An die Gemeinschaft"
|
||||
},
|
||||
"form": {
|
||||
"cancel": "Abbrechen",
|
||||
@ -94,7 +96,9 @@
|
||||
"show_all":"Alle <strong>{count}</strong> Transaktionen ansehen",
|
||||
"nullTransactions":"Du hast noch keine Transaktionen auf deinem Konto.",
|
||||
"more": "mehr",
|
||||
"receiverNotFound":"Empfänger nicht gefunden"
|
||||
"receiverNotFound":"Empfänger nicht gefunden",
|
||||
"gdd-text":"Gradido Transaktionen",
|
||||
"gdt-text":"Gradido Transform Transaktionen"
|
||||
},
|
||||
"site": {
|
||||
"login": {
|
||||
@ -165,5 +169,20 @@
|
||||
"title": "Passwort zurücksetzen",
|
||||
"text": "Jetzt kannst du ein neues Passwort speichern, mit dem du dich zukünftig in der Gradido-App anmelden kannst.",
|
||||
"not-authenticated": "Leider konnten wir dich nicht authentifizieren. Bitte wende dich an den Support."
|
||||
},
|
||||
"gdt": {
|
||||
"gdt-received":"Gradido Transform (GDT) erhalten",
|
||||
"factor":"Faktor",
|
||||
"raise": "Erhöhung",
|
||||
"credit": "Gutschrift",
|
||||
"conversion-gdt-euro":"Umrechnung Euro / Gradido Transform (GDT)",
|
||||
"calculation":"Berechnung der Gradido Transform",
|
||||
"conversion":"Umrechnung",
|
||||
"formula":"Berechungsformel",
|
||||
"no-transactions":"Du hast zur Zeit keine Transaktionen",
|
||||
"publisher":"Dein geworbenes Mitglied hat einen Beitrag bezahlt",
|
||||
"gdt-receive":"Aktion",
|
||||
"your-share":"Geworbenes Mitglied",
|
||||
"contribution":"Beitrag"
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,6 +24,7 @@
|
||||
"calculation_decay": "Calculation of Decay",
|
||||
"Starting_block_decay": "Starting Block Decay",
|
||||
"decay_introduced": "Decay was Introduced on",
|
||||
"decayStart": " - Starting block for decay at: ",
|
||||
"last_transaction": "Last transaction:",
|
||||
"past_time": "Past time",
|
||||
"since_introduction": "Since the introduction of Decay",
|
||||
@ -33,10 +34,11 @@
|
||||
"hours": "Hours",
|
||||
"minutes": "Minutes",
|
||||
"seconds": "Seconds",
|
||||
"received":"received",
|
||||
"sent":"sent",
|
||||
"created":"reated",
|
||||
"fromCommunity":"From the community"
|
||||
"received":"Received",
|
||||
"sent":"Sent",
|
||||
"created":"Created",
|
||||
"fromCommunity":"From the community",
|
||||
"toCommunity":"To the community"
|
||||
},
|
||||
"form": {
|
||||
"cancel":"Cancel",
|
||||
@ -94,7 +96,9 @@
|
||||
"show_all":"View all <strong>{count}</strong> transactions.",
|
||||
"nullTransactions":"You don't have any transactions on your account yet.",
|
||||
"more": "more",
|
||||
"receiverNotFound":"Recipient not found"
|
||||
"receiverNotFound":"Recipient not found",
|
||||
"gdd-text":"Gradido Transactions",
|
||||
"gdt-text":"Gradido Transform Transactions"
|
||||
},
|
||||
"site": {
|
||||
"login": {
|
||||
@ -166,5 +170,20 @@
|
||||
"title": "Reset Password",
|
||||
"text": "Now you can save a new password to login to the Gradido-App in the future.",
|
||||
"not-authenticated": "Unfortunately we could not authenticate you. Please contact the support."
|
||||
}
|
||||
},
|
||||
"gdt": {
|
||||
"gdt-received": "Gradido Transform (GDT) received",
|
||||
"factor": "Factor",
|
||||
"raise": "Increase",
|
||||
"credit": "Credit",
|
||||
"conversion-gdt-euro": "Conversion Euro / Gradido Transform (GDT)",
|
||||
"calculation": "Calculation of Gradido Transform",
|
||||
"conversion": "Conversion",
|
||||
"formula": "Calculation formula",
|
||||
"no-transactions":"You currently have no transactions",
|
||||
"publisher":"A member you referred has paid a contribution",
|
||||
"gdt-receive":"GDT receive",
|
||||
"your-share":"Your share",
|
||||
"contribution":"Contribution"
|
||||
}
|
||||
}
|
||||
|
||||
@ -29,6 +29,8 @@ export const mutations = {
|
||||
|
||||
export const actions = {
|
||||
login: ({ dispatch, commit }, data) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('Login Data:', data)
|
||||
commit('sessionId', data.sessionId)
|
||||
commit('email', data.user.email)
|
||||
commit('language', data.user.language)
|
||||
@ -38,6 +40,8 @@ export const actions = {
|
||||
commit('description', data.user.description)
|
||||
},
|
||||
logout: ({ commit, state }) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('Logout Data:', state)
|
||||
commit('sessionId', null)
|
||||
commit('email', null)
|
||||
commit('username', '')
|
||||
|
||||
@ -14,6 +14,7 @@ const apolloMock = jest.fn().mockResolvedValue({
|
||||
logout: 'success',
|
||||
},
|
||||
})
|
||||
const toasterMock = jest.fn()
|
||||
|
||||
describe('DashboardLayoutGdd', () => {
|
||||
let wrapper
|
||||
@ -32,6 +33,9 @@ describe('DashboardLayoutGdd', () => {
|
||||
$router: {
|
||||
push: routerPushMock,
|
||||
},
|
||||
$toasted: {
|
||||
error: toasterMock,
|
||||
},
|
||||
$apollo: {
|
||||
query: apolloMock,
|
||||
},
|
||||
@ -225,7 +229,7 @@ describe('DashboardLayoutGdd', () => {
|
||||
describe('update transactions returns error', () => {
|
||||
beforeEach(async () => {
|
||||
apolloMock.mockRejectedValue({
|
||||
message: 'error',
|
||||
message: 'Ouch!',
|
||||
})
|
||||
await wrapper
|
||||
.findComponent({ ref: 'router-view' })
|
||||
@ -236,6 +240,10 @@ describe('DashboardLayoutGdd', () => {
|
||||
it('sets pending to true', () => {
|
||||
expect(wrapper.vm.pending).toBeTruthy()
|
||||
})
|
||||
|
||||
it('calls $toasted.error method', () => {
|
||||
expect(toasterMock).toBeCalledWith('Ouch!')
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@ -49,7 +49,6 @@
|
||||
|
||||
<div @click="$sidebar.displaySidebar(false)">
|
||||
<fade-transition :duration="200" origin="center top" mode="out-in">
|
||||
<!-- your content here -->
|
||||
<router-view
|
||||
ref="router-view"
|
||||
:balance="balance"
|
||||
@ -129,8 +128,9 @@ export default {
|
||||
this.transactionCount = transactionList.count
|
||||
this.pending = false
|
||||
})
|
||||
.catch(() => {
|
||||
.catch((error) => {
|
||||
this.pending = true
|
||||
this.$toasted.error(error.message)
|
||||
// what to do when loading balance fails?
|
||||
})
|
||||
},
|
||||
|
||||
@ -133,9 +133,3 @@ export default {
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.active {
|
||||
background-color: rgba(192, 192, 192, 0.568);
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -106,28 +106,40 @@ describe('GddTransactionList', () => {
|
||||
expect(transaction.find('svg').classes()).toContain('text-danger')
|
||||
})
|
||||
|
||||
it('shows the amount of transaction', () => {
|
||||
expect(transaction.findAll('div').at(2).text()).toContain('19.93')
|
||||
it('has a minus operator', () => {
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-operator').at(0).text()).toContain(
|
||||
'-',
|
||||
)
|
||||
})
|
||||
|
||||
it('has a minus operator', () => {
|
||||
expect(transaction.findAll('div').at(2).text()).toContain('-')
|
||||
it('shows the amount of transaction', () => {
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-amount').at(0).text()).toContain(
|
||||
'19.93',
|
||||
)
|
||||
})
|
||||
|
||||
it('shows the name of the receiver', () => {
|
||||
expect(transaction.findAll('div').at(0).text()).toContain('Bob der Baumeister')
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-name').at(0).text()).toContain(
|
||||
'Bob der Baumeister',
|
||||
)
|
||||
})
|
||||
|
||||
it('shows the message of the transaction', () => {
|
||||
expect(transaction.findAll('div').at(5).text()).toContain('Alles Gute zum Geburtstag')
|
||||
expect(transaction.findAll('.gdd-transaction-list-message').at(0).text()).toContain(
|
||||
'Alles Gute zum Geburtstag',
|
||||
)
|
||||
})
|
||||
|
||||
it('shows the date of the transaction', () => {
|
||||
expect(transaction.findAll('div').at(8).text()).toContain('Tue May 25 2021')
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-date').at(0).text()).toContain(
|
||||
'Tue May 25 2021',
|
||||
)
|
||||
})
|
||||
|
||||
it('shows the decay calculation', () => {
|
||||
expect(transaction.findAll('div').at(9).text()).toContain('-0.5')
|
||||
expect(transaction.findAll('div.gdd-transaction-list-item-decay').at(0).text()).toContain(
|
||||
'-0.5',
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
@ -145,20 +157,28 @@ describe('GddTransactionList', () => {
|
||||
expect(transaction.find('svg').classes()).toContain('gradido-global-color-accent')
|
||||
})
|
||||
|
||||
it('shows the amount of transaction', () => {
|
||||
expect(transaction.findAll('div').at(2).text()).toContain('1000')
|
||||
it('has a plus operator', () => {
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-operator').at(0).text()).toContain(
|
||||
'+',
|
||||
)
|
||||
})
|
||||
|
||||
it('has a plus operator', () => {
|
||||
expect(transaction.findAll('div').at(2).text()).toContain('+')
|
||||
it('shows the amount of transaction', () => {
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-amount').at(0).text()).toContain(
|
||||
'1000',
|
||||
)
|
||||
})
|
||||
|
||||
it('shows the name of the receiver', () => {
|
||||
expect(transaction.findAll('div').at(3).text()).toContain('Gradido Akademie')
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-name').at(0).text()).toContain(
|
||||
'Gradido Akademie',
|
||||
)
|
||||
})
|
||||
|
||||
it('shows the date of the transaction', () => {
|
||||
expect(transaction.findAll('div').at(3).text()).toContain('Thu Apr 29 2021')
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-date').at(0).text()).toContain(
|
||||
'Thu Apr 29 2021',
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
@ -176,24 +196,40 @@ describe('GddTransactionList', () => {
|
||||
expect(transaction.find('svg').classes()).toContain('gradido-global-color-accent')
|
||||
})
|
||||
|
||||
it('has a plus operator', () => {
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-operator').at(0).text()).toContain(
|
||||
'+',
|
||||
)
|
||||
})
|
||||
|
||||
it('shows the amount of transaction', () => {
|
||||
expect(transaction.findAll('div').at(2).text()).toContain('+ 314.98')
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-amount').at(0).text()).toContain(
|
||||
'314.98',
|
||||
)
|
||||
})
|
||||
|
||||
it('shows the name of the recipient', () => {
|
||||
expect(transaction.findAll('div').at(0).text()).toContain('Jan Ulrich')
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-name').at(0).text()).toContain(
|
||||
'Jan Ulrich',
|
||||
)
|
||||
})
|
||||
|
||||
it('shows the message of the transaction', () => {
|
||||
expect(transaction.findAll('div').at(5).text()).toContain('Für das Fahrrad!')
|
||||
expect(transaction.findAll('.gdd-transaction-list-message').at(0).text()).toContain(
|
||||
'Für das Fahrrad!',
|
||||
)
|
||||
})
|
||||
|
||||
it('shows the date of the transaction', () => {
|
||||
expect(transaction.findAll('div').at(8).text()).toContain('Thu Apr 29 2021')
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-date').at(0).text()).toContain(
|
||||
'Thu Apr 29 2021',
|
||||
)
|
||||
})
|
||||
|
||||
it('shows the decay calculation', () => {
|
||||
expect(transaction.findAll('div').at(9).text()).toContain('-1.5')
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-decay').at(0).text()).toContain(
|
||||
'-1.5',
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
@ -211,16 +247,22 @@ describe('GddTransactionList', () => {
|
||||
expect(transaction.find('svg').classes()).toContain('gradido-global-color-gray')
|
||||
})
|
||||
|
||||
it('shows the amount of transaction', () => {
|
||||
expect(transaction.findAll('div').at(2).text()).toContain('1.07')
|
||||
it('has a minus operator', () => {
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-operator').at(0).text()).toContain(
|
||||
'-',
|
||||
)
|
||||
})
|
||||
|
||||
it('has a minus operator', () => {
|
||||
expect(transaction.findAll('div').at(2).text()).toContain('-')
|
||||
it('shows the amount of transaction', () => {
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-amount').at(0).text()).toContain(
|
||||
'1.07',
|
||||
)
|
||||
})
|
||||
|
||||
it('shows the name of the receiver', () => {
|
||||
expect(transaction.findAll('div').at(3).text()).toBe('decay.decay_since_last_transaction')
|
||||
expect(transaction.findAll('.gdd-transaction-list-item-name').at(0).text()).toBe(
|
||||
'decay.decay_since_last_transaction',
|
||||
)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@ -6,66 +6,70 @@
|
||||
:key="transactionId"
|
||||
:style="type === 'decay' ? 'background-color:#f1e0ae3d' : ''"
|
||||
>
|
||||
<!-- ROW Start -->
|
||||
<div class="d-flex gdd-transaction-list-item" v-b-toggle="'a' + date + ''">
|
||||
<!-- ICON -->
|
||||
<div style="width: 8%">
|
||||
<b-icon :icon="getProperties(type).icon" :class="getProperties(type).class" />
|
||||
</div>
|
||||
<!-- Text Links -->
|
||||
<div class="font1_2em pr-2 text-right" style="width: 32%">
|
||||
<span>{{ getProperties(type).operator }}</span>
|
||||
|
||||
<small v-if="type === 'decay'">{{ $n(balance, 'decimal') }}</small>
|
||||
|
||||
<span v-else>{{ $n(balance, 'decimal') }}</span>
|
||||
<div v-if="type !== 'decay' && type !== 'creation'">
|
||||
<small>
|
||||
{{ $t('form.memo') }}
|
||||
</small>
|
||||
</div>
|
||||
<div v-if="decay">
|
||||
<br />
|
||||
<b-icon v-if="type != 'decay'" icon="droplet-half" height="15" class="mb-3" />
|
||||
</div>
|
||||
</div>
|
||||
<!-- Text Rechts -->
|
||||
<div class="font1_2em text-left pl-2" style="width: 55%">
|
||||
<div>{{ name ? name : '' }}</div>
|
||||
<div>
|
||||
<small>
|
||||
{{ memo }}
|
||||
</small>
|
||||
</div>
|
||||
<span v-if="type === 'decay'">
|
||||
<small>{{ $t('decay.decay_since_last_transaction') }}</small>
|
||||
</span>
|
||||
<div v-if="date" class="text-sm">
|
||||
{{ $d($moment(date), 'long') }} {{ $i18n.locale === 'de' ? 'Uhr' : '' }}
|
||||
</div>
|
||||
<decay-information v-if="decay" decaytyp="short" :decay="decay" />
|
||||
</div>
|
||||
<!-- Collaps Toggle Button -->
|
||||
<div v-if="type != 'decay'" class="text-right" style="width: 5%">
|
||||
<div class="list-group-item gdd-transaction-list-item" v-b-toggle="'a' + date + ''">
|
||||
<!-- Collaps Button -->
|
||||
<div v-if="type != 'decay'" class="text-right" style="width: 95%; position: absolute">
|
||||
<b-button class="btn-sm">
|
||||
<b>i</b>
|
||||
</b-button>
|
||||
</div>
|
||||
|
||||
<b-row>
|
||||
<!-- ICON -->
|
||||
<div class="col-1 gdd-transaction-list-item-icon">
|
||||
<b-icon :icon="getProperties(type).icon" :class="getProperties(type).class" />
|
||||
</div>
|
||||
|
||||
<div class="col col-11">
|
||||
<!-- Betrag / Name Email -->
|
||||
<b-row>
|
||||
<div class="col-5 text-right">
|
||||
<span class="gdd-transaction-list-item-operator">
|
||||
{{ getProperties(type).operator }}
|
||||
</span>
|
||||
<span class="gdd-transaction-list-item-amount">{{ $n(balance, 'decimal') }}</span>
|
||||
</div>
|
||||
<div class="col-7 gdd-transaction-list-item-name">
|
||||
{{ type !== 'decay' ? name : $t('decay.decay_since_last_transaction') }}
|
||||
</div>
|
||||
</b-row>
|
||||
|
||||
<!-- Nachricht -->
|
||||
<b-row v-if="type !== 'decay'">
|
||||
<div class="col-5 text-right">{{ $t('form.memo') }}</div>
|
||||
<div class="col-7 gdd-transaction-list-message">{{ memo }}</div>
|
||||
</b-row>
|
||||
|
||||
<!-- Datum -->
|
||||
<b-row v-if="type !== 'decay'">
|
||||
<div class="col-5 text-right">{{ $t('form.date') }}</div>
|
||||
<div class="col-7 gdd-transaction-list-item-date">
|
||||
{{ $d($moment(date), 'long') }} {{ $i18n.locale === 'de' ? 'Uhr' : '' }}
|
||||
</div>
|
||||
</b-row>
|
||||
|
||||
<!-- Decay -->
|
||||
<b-row v-if="decay">
|
||||
<div class="col-5 text-right">
|
||||
<b-icon v-if="type != 'decay'" icon="droplet-half" height="15" class="mb-1" />
|
||||
</div>
|
||||
<div class="col-7 gdd-transaction-list-item-decay">
|
||||
<decay-information v-if="decay" decaytyp="short" :decay="decay" />
|
||||
</div>
|
||||
</b-row>
|
||||
</div>
|
||||
</b-row>
|
||||
|
||||
<!-- Collaps Start -->
|
||||
|
||||
<b-collapse v-if="type != 'decay'" class="pb-4" :id="'a' + date + ''">
|
||||
<div style="border: 0px; background-color: #f1f1f1" class="p-2 pb-4 mb-4">
|
||||
<decay-information v-if="decay" decaytyp="new" :decay="decay" />
|
||||
</div>
|
||||
</b-collapse>
|
||||
|
||||
<!-- Collaps End -->
|
||||
</div>
|
||||
<!-- ROW End -->
|
||||
<!-- Collaps Start -->
|
||||
<b-collapse v-if="type != 'decay'" :id="'a' + date + ''">
|
||||
<b-list-group v-if="type === 'creation'">
|
||||
<b-list-group-item style="border: 0px">
|
||||
<div class="d-flex">
|
||||
<div style="width: 40%" class="text-right pr-3 mr-2">{{ $t('decay.created') }}</div>
|
||||
<div style="width: 60%">{{ $t('decay.fromCommunity') }}</div>
|
||||
</div>
|
||||
</b-list-group-item>
|
||||
</b-list-group>
|
||||
<decay-information v-if="decay" decaytyp="new" :decay="decay" />
|
||||
</b-collapse>
|
||||
<!-- Collaps End -->
|
||||
</b-list-group-item>
|
||||
<pagination-buttons
|
||||
v-if="showPagination && transactionCount > pageSize"
|
||||
@ -103,7 +107,6 @@ export default {
|
||||
data() {
|
||||
return {
|
||||
currentPage: 1,
|
||||
startDecay: 0,
|
||||
}
|
||||
},
|
||||
props: {
|
||||
|
||||
253
frontend/src/views/Pages/AccountOverview/GdtTransactionList.vue
Normal file
@ -0,0 +1,253 @@
|
||||
<template>
|
||||
<div class="gdt-transaction-list">
|
||||
<div class="list-group">
|
||||
<div v-if="transactionGdtCount === 0">
|
||||
{{ $t('gdt.no-transactions') }}
|
||||
</div>
|
||||
<div
|
||||
v-else
|
||||
v-for="{ id, amount, date, comment, gdt_entry_type_id, factor, gdt } in transactionsGdt"
|
||||
:key="id"
|
||||
>
|
||||
<div class="list-group-item gdt-transaction-list-item" v-b-toggle="'a' + date + ''">
|
||||
<!-- Icon -->
|
||||
<div class="text-right" style="position: absolute">
|
||||
<b-icon
|
||||
v-if="gdt_entry_type_id"
|
||||
:icon="getIcon(gdt_entry_type_id).icon"
|
||||
:class="getIcon(gdt_entry_type_id).class"
|
||||
></b-icon>
|
||||
</div>
|
||||
|
||||
<!-- Collaps Button -->
|
||||
<div class="text-right" style="width: 96%; position: absolute">
|
||||
<b-button class="btn-sm">
|
||||
<b>i</b>
|
||||
</b-button>
|
||||
</div>
|
||||
|
||||
<!-- Betrag -->
|
||||
|
||||
<!-- 7 nur GDT erhalten -->
|
||||
<b-row v-if="gdt_entry_type_id === 7">
|
||||
<div class="col-6 text-right">
|
||||
<div>{{ $t('gdt.gdt-receive') }}</div>
|
||||
<div>{{ $t('gdt.credit') }}</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div>{{ comment }}</div>
|
||||
<div>{{ $n(gdt, 'decimal') }} GDT</div>
|
||||
</div>
|
||||
</b-row>
|
||||
<!--4 publisher -->
|
||||
<b-row v-else-if="gdt_entry_type_id === 4">
|
||||
<div class="col-6 text-right">
|
||||
<div>{{ $t('gdt.your-share') }}</div>
|
||||
<div>{{ $t('gdt.credit') }}</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div>5%</div>
|
||||
<div>{{ $n(amount, 'decimal') }} GDT</div>
|
||||
</div>
|
||||
</b-row>
|
||||
<!-- 1, 2, 3, 5, 6 spenden in euro -->
|
||||
<b-row v-else>
|
||||
<div class="col-6 text-right">
|
||||
<div>{{ $t('gdt.contribution') }}</div>
|
||||
<div>{{ $t('gdt.credit') }}</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div>{{ $n(amount, 'decimal') }} €</div>
|
||||
<div>{{ $n(gdt, 'decimal') }} GDT</div>
|
||||
</div>
|
||||
</b-row>
|
||||
|
||||
<!-- Betrag ENDE-->
|
||||
|
||||
<!-- Nachricht-->
|
||||
<b-row v-if="comment && gdt_entry_type_id !== 7">
|
||||
<div class="col-6 text-right">
|
||||
{{ $t('form.memo') }}
|
||||
</div>
|
||||
<div class="col-6">
|
||||
{{ comment }}
|
||||
</div>
|
||||
</b-row>
|
||||
|
||||
<!-- Datum-->
|
||||
<b-row v-if="date" class="gdt-list-row text-header">
|
||||
<div class="col-6 text-right">
|
||||
{{ $t('form.date') }}
|
||||
</div>
|
||||
<div class="col-6">
|
||||
{{ $d($moment(date), 'long') }} {{ $i18n.locale === 'de' ? 'Uhr' : '' }}
|
||||
</div>
|
||||
</b-row>
|
||||
</div>
|
||||
|
||||
<!-- Collaps START -->
|
||||
|
||||
<b-collapse v-if="gdt_entry_type_id" :id="'a' + date + ''" class="pb-4">
|
||||
<div style="border: 0px; background-color: #f1f1f1" class="p-2 pb-4 mb-4">
|
||||
<!-- Überschrift -->
|
||||
<b-row class="gdt-list-clooaps-header-text text-center pb-3">
|
||||
<div class="col h4" v-if="gdt_entry_type_id === 7">
|
||||
{{ $t('gdt.conversion-gdt-euro') }}
|
||||
</div>
|
||||
<div class="col h4" v-else-if="gdt_entry_type_id === 4">
|
||||
{{ $t('gdt.publisher') }}
|
||||
</div>
|
||||
<div class="col h4" v-else>{{ $t('gdt.calculation') }}</div>
|
||||
</b-row>
|
||||
|
||||
<!-- 7 nur GDT erhalten -->
|
||||
<b-row class="gdt-list-clooaps-box-7" v-if="gdt_entry_type_id == 7">
|
||||
<div class="col-6 text-right clooaps-col-left">
|
||||
<div>{{ $t('gdt.raise') }}</div>
|
||||
<div>{{ $t('gdt.conversion') }}</div>
|
||||
</div>
|
||||
<div class="col-6 clooaps-col-right">
|
||||
<div>{{ factor * 100 }} %</div>
|
||||
<div>
|
||||
{{ $n(amount, 'decimal') }} GDT * {{ factor * 100 }} % =
|
||||
{{ $n(gdt, 'decimal') }} GDT
|
||||
</div>
|
||||
</div>
|
||||
</b-row>
|
||||
<!-- 4 publisher -->
|
||||
<b-row class="gdt-list-clooaps-box-4" v-else-if="gdt_entry_type_id === 4">
|
||||
<div class="col-6 text-right clooaps-col-left"></div>
|
||||
<div class="col-6 clooaps-col-right"></div>
|
||||
</b-row>
|
||||
|
||||
<!-- 1, 2, 3, 5, 6 spenden in euro -->
|
||||
<b-row class="gdt-list-clooaps-box--all" v-else>
|
||||
<div class="col-6 text-right clooaps-col-left">
|
||||
<div>{{ $t('gdt.factor') }}</div>
|
||||
<div>{{ $t('gdt.formula') }}</div>
|
||||
</div>
|
||||
<div class="col-6 clooaps-col-right">
|
||||
<div>{{ factor }} GDT pro €</div>
|
||||
<div>
|
||||
{{ $n(amount, 'decimal') }} € * {{ factor }} GDT / € =
|
||||
{{ $n(gdt, 'decimal') }} GDT
|
||||
</div>
|
||||
</div>
|
||||
</b-row>
|
||||
</div>
|
||||
</b-collapse>
|
||||
<!-- Collaps ENDE -->
|
||||
</div>
|
||||
</div>
|
||||
<pagination-buttons
|
||||
v-if="transactionGdtCount > pageSize"
|
||||
:has-next="hasNext"
|
||||
:has-previous="hasPrevious"
|
||||
:total-pages="totalPages"
|
||||
:current-page="currentPage"
|
||||
@show-next="showNext"
|
||||
@show-previous="showPrevious"
|
||||
></pagination-buttons>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listGDTEntriesQuery } from '../../../graphql/queries'
|
||||
import PaginationButtons from '../../../components/PaginationButtons'
|
||||
|
||||
const iconsByType = {
|
||||
1: { icon: 'heart', classes: 'gradido-global-color-accent' },
|
||||
4: { icon: 'person-check', classes: 'gradido-global-color-accent' },
|
||||
7: { icon: 'gift', classes: 'gradido-global-color-accent' },
|
||||
}
|
||||
|
||||
export default {
|
||||
name: 'gdt-transaction-list',
|
||||
components: {
|
||||
PaginationButtons,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
transactionsGdt: { default: () => [] },
|
||||
transactionGdtCount: { type: Number, default: 0 },
|
||||
currentPage: 1,
|
||||
pageSize: 25,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
hasNext() {
|
||||
return this.currentPage * this.pageSize < this.transactionGdtCount
|
||||
},
|
||||
hasPrevious() {
|
||||
return this.currentPage > 1
|
||||
},
|
||||
totalPages() {
|
||||
return Math.ceil(this.transactionGdtCount / this.pageSize)
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
async updateGdt() {
|
||||
this.$apollo
|
||||
.query({
|
||||
query: listGDTEntriesQuery,
|
||||
variables: {
|
||||
email: this.$store.state.email,
|
||||
currentPage: this.currentPage,
|
||||
pageSize: this.pageSize,
|
||||
},
|
||||
})
|
||||
.then((result) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('Result: ', result)
|
||||
const {
|
||||
data: { listGDTEntries },
|
||||
} = result
|
||||
// eslint-disable-next-line no-console
|
||||
this.transactionsGdt = listGDTEntries.gdtEntries
|
||||
this.transactionGdtCount = listGDTEntries.count
|
||||
})
|
||||
.catch((error) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('error: ', error)
|
||||
this.$toasted.error(error.message)
|
||||
})
|
||||
},
|
||||
getIcon(givenType) {
|
||||
const type = iconsByType[givenType]
|
||||
if (type)
|
||||
return {
|
||||
icon: type.icon,
|
||||
class: type.classes + ' m-mb-1 font2em',
|
||||
}
|
||||
this.throwError('no icon to given type: ' + givenType)
|
||||
},
|
||||
throwError(msg) {
|
||||
throw new Error(msg)
|
||||
},
|
||||
showNext() {
|
||||
this.currentPage++
|
||||
this.updateGdt()
|
||||
window.scrollTo(0, 0)
|
||||
},
|
||||
showPrevious() {
|
||||
this.currentPage--
|
||||
this.updateGdt()
|
||||
window.scrollTo(0, 0)
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.updateGdt()
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
.el-table .cell {
|
||||
padding-left: 0px;
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
.nav-tabs .nav-link.active,
|
||||
.nav-tabs .nav-item.show .nav-link {
|
||||
background-color: #f8f9fe38;
|
||||
}
|
||||
</style>
|
||||
@ -63,7 +63,7 @@ export default {
|
||||
email: this.form.email,
|
||||
},
|
||||
})
|
||||
.then((result) => {
|
||||
.then(() => {
|
||||
this.$router.push('/thx/password')
|
||||
})
|
||||
.catch(() => {
|
||||
|
||||
@ -93,6 +93,7 @@ export default {
|
||||
const {
|
||||
data: { login },
|
||||
} = result
|
||||
console.log('login:', login)
|
||||
this.$store.dispatch('login', login)
|
||||
this.$router.push('/overview')
|
||||
loader.hide()
|
||||
|
||||
@ -3,11 +3,31 @@ import UserProfileTransactionList from './UserProfileTransactionList'
|
||||
|
||||
const localVue = global.localVue
|
||||
|
||||
const mutationObserverMock = jest.fn(function MutationObserver(callback) {
|
||||
this.observe = jest.fn()
|
||||
this.disconnect = jest.fn()
|
||||
this.trigger = (mockedMutationsList) => {
|
||||
callback(mockedMutationsList, this)
|
||||
}
|
||||
})
|
||||
|
||||
global.MutationObserver = mutationObserverMock
|
||||
|
||||
describe('UserProfileTransactionList', () => {
|
||||
let wrapper
|
||||
|
||||
const mocks = {
|
||||
$t: jest.fn((t) => t),
|
||||
$n: jest.fn((n) => String(n)),
|
||||
$d: jest.fn((d) => d),
|
||||
$i18n: {
|
||||
locale: jest.fn(() => 'en'),
|
||||
},
|
||||
$store: {
|
||||
state: {
|
||||
sessionId: 1,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
const Wrapper = () => {
|
||||
@ -37,5 +57,9 @@ describe('UserProfileTransactionList', () => {
|
||||
expect.arrayContaining([expect.arrayContaining([{ firstPage: 2, items: 25 }])]),
|
||||
)
|
||||
})
|
||||
|
||||
it('renders the transaction gradido transform table', () => {
|
||||
expect(wrapper.findComponent({ name: 'GdtTransactionList' }).exists()).toBeTruthy()
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@ -1,29 +1,39 @@
|
||||
<template>
|
||||
<div>
|
||||
<b-container fluid>
|
||||
<b-row>
|
||||
<b-col class="order-xl-1">
|
||||
<gdd-transaction-list
|
||||
:timestamp="timestamp"
|
||||
:transactionCount="transactionCount"
|
||||
:transactions="transactions"
|
||||
:show-pagination="true"
|
||||
@update-transactions="updateTransactions"
|
||||
/>
|
||||
</b-col>
|
||||
</b-row>
|
||||
</b-container>
|
||||
<div class="pb-4">
|
||||
<b-tabs content-class="mt-3 pt-4 pb-4" justified>
|
||||
<b-tab :title="'Gradido (' + $n(balance, 'decimal') + ' GDD)'" class="px-4">
|
||||
<p class="tab-tex">{{ $t('transaction.gdd-text') }}</p>
|
||||
|
||||
<gdd-transaction-list
|
||||
:timestamp="timestamp"
|
||||
:transactionCount="transactionCount"
|
||||
:transactions="transactions"
|
||||
:show-pagination="true"
|
||||
@update-transactions="updateTransactions"
|
||||
/>
|
||||
</b-tab>
|
||||
|
||||
<b-tab :title="'Gradido Transform (' + $n(GdtBalance, 'decimal') + ' GDT)'" class="px-4">
|
||||
<p class="">{{ $t('transaction.gdt-text') }}</p>
|
||||
|
||||
<gdt-transaction-list />
|
||||
</b-tab>
|
||||
</b-tabs>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import GddTransactionList from './AccountOverview/GddTransactionList.vue'
|
||||
import GdtTransactionList from './AccountOverview/GdtTransactionList.vue'
|
||||
|
||||
export default {
|
||||
name: 'UserProfileTransactionList',
|
||||
components: {
|
||||
GddTransactionList,
|
||||
GdtTransactionList,
|
||||
},
|
||||
props: {
|
||||
balance: { type: Number, default: 0 },
|
||||
GdtBalance: { type: Number, default: 0 },
|
||||
transactions: {
|
||||
default: () => [],
|
||||
},
|
||||
@ -41,4 +51,15 @@ export default {
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style></style>
|
||||
<style>
|
||||
.nav-tabs > li > a {
|
||||
/* adjust padding for height*/
|
||||
padding-top: 14px;
|
||||
padding-bottom: 14px;
|
||||
}
|
||||
|
||||
.nav-tabs > li.active {
|
||||
background-color: aquamarine;
|
||||
font-size: larger;
|
||||
}
|
||||
</style>
|
||||
|
||||