Elektronische Signatur » History » Version 9
Carsten Rose, 14.04.2021 02:06
1 | 1 | Carsten Rose | h1. Elektronische Signatur |
---|---|---|---|
2 | |||
3 | * Person A loest im Tool eine Email aus, die an Person B gesendet wird. |
||
4 | * Die Email enthaelt eine URL mit einem zeitlich beschraenktes Einmal-Token. |
||
5 | * Person B empfaengt die Email und klickt auf dem Link. |
||
6 | * Bei Aufruf der URL wird entweder ein Form geoeffnet (um weitere Information abzufragen) oder der Link loest direkt eine Action aus das etwas bestaetigt wird. |
||
7 | |||
8 | |||
9 | 2 | Carsten Rose | h1. Approval Mail ausloesen - Page: application |
10 | 1 | Carsten Rose | |
11 | 2 | Carsten Rose | * QFQ Record: a) Logik um die Approval Mail auszuloesen, b) Den Link anzubieten um das versenden zu starten. |
12 | 1 | Carsten Rose | <pre> |
13 | # |
||
14 | # {{action:SE::w}}'='sendApprovalMail' |
||
15 | # {{appId:RE}} |
||
16 | # |
||
17 | 2 | Carsten Rose | |
18 | # Logic to send email with AUTH token |
||
19 | 1 | Carsten Rose | 10 { |
20 | # Take care that the SIP variable is cleared after first use. |
||
21 | sql = SELECT '' FROM (SELECT '') AS fake WHERE '{{action:SE::w}}'='sendApprovalMail' |
||
22 | |||
23 | # Be sure an auth token is defined |
||
24 | 20.sql = UPDATE Application SET auth='{{random:V}}' WHERE auth='' AND id={{appId:S}} |
||
25 | |||
26 | 30 { |
||
27 | sql = SELECT n.text AS _body |
||
28 | n.title AS _subject |
||
29 | app.auth AS _auth |
||
30 | QDATE_FORMAT(app.deadline) AS _deadline |
||
31 | FROM Note AS n, Application AS app |
||
32 | WHERE n.reference='Email Template: Approve Mail' |
||
33 | AND app.id={{appId:R}} |
||
34 | |||
35 | 40.sql = SELECT 'to:<email>|from:<email>|subject:{{subject:R}}|body:{{body}}|grid:<grid>|xid:<xId>' AS _sendmail |
||
36 | } |
||
37 | |||
38 | } |
||
39 | |||
40 | 2 | Carsten Rose | # Logic to show application status |
41 | 100 { |
||
42 | 1 | Carsten Rose | |
43 | 2 | Carsten Rose | sql = SELECT ... |
44 | 1 | Carsten Rose | |
45 | 2 | Carsten Rose | # Link to initiate email |
46 | 110.sql = SELECT 'p:{{pageAlias:T}}&action=sendApprovalMail&appId={{appId:R}}|q:An approval mail will be sent|s|b:Send mail' AS _link |
||
47 | FROM Application AS app |
||
48 | WHERE app.id={{appId:R}} |
||
49 | } |
||
50 | </pre> |
||
51 | 1 | Carsten Rose | |
52 | 3 | Carsten Rose | * Email Template (z.B. Note Record) mit Variablen. Achtung: evtl darf der Text nicht HTML SpecialChar kodiert werden. |
53 | 1 | Carsten Rose | <pre> |
54 | Dear {{name:R}} |
||
55 | ... |
||
56 | Please click {{baseUrl:Y}}/index.php?id=confirmation&auth={{auth:R}}. |
||
57 | ... |
||
58 | The applicants deadline is {{deadline:R}}. |
||
59 | ... |
||
60 | </pre> |
||
61 | |||
62 | 6 | Carsten Rose | h1. Approval/Deny - Page: approval |
63 | 1 | Carsten Rose | |
64 | * Seite wird nicht im Menu angezeigt. |
||
65 | 6 | Carsten Rose | * Seite muss ohne Zugriffsbeschraenkung (fe group) aufrufbar sein. |
66 | * Spalten: |
||
67 | |||
68 | * Application.reviewDecission: approve|deny |
||
69 | * Application.reviewTs: NULL|Timestamp |
||
70 | |||
71 | 1 | Carsten Rose | <pre> |
72 | 3 | Carsten Rose | # |
73 | # {{auth:CE:alnumx}} |
||
74 | 5 | Carsten Rose | # {{action:SE}} = 'approve' |
75 | 1 | Carsten Rose | # |
76 | 3 | Carsten Rose | |
77 | 6 | Carsten Rose | # Normalize |
78 | 5 | Carsten Rose | 10.sql = SELECT '{{auth:CE:alnumx}}' AS _auth |
79 | '{{appId:S0}}' AS _appId |
||
80 | '{{action:SE::w}}' AS _action |
||
81 | 1 | Carsten Rose | |
82 | 5 | Carsten Rose | # User calls this page with AUTH token: offer button 'approve' and 'deny' |
83 | 20 { |
||
84 | sql = SELECT '' FROM (SELECT '') AS fake WHERE '{{auth:R}}'!='' |
||
85 | |||
86 | 30 { |
||
87 | # Gather facts |
||
88 | sql = SELECT app.id AS _appId |
||
89 | , QDATE_FORMAT(app.deadline) AS _deadline |
||
90 | , app.deadline<NOW() AS _deadlineExpired |
||
91 | , ISNULL(app.reviewTs) AS _reviewOpen |
||
92 | FROM Application AS app |
||
93 | WHERE '{{auth:R}}'=app.auth |
||
94 | |||
95 | altsql = SELECT Sorry, token unknown. Maybe the URL is broken. |
||
96 | |||
97 | 40 { |
||
98 | sql = SELECT 'Applicant: ', app.name, ', ', app.firstName, '<br>' |
||
99 | 1 | Carsten Rose | , 'Applicaton: ', app.title |
100 | , 'p:{{pageAlias:T}}&action=approve&appId={{appId:R}}|t:Approve|s|b' AS _link, ' ' |
||
101 | , 'p:{{pageAlias:T}}&action=deny&appId={{appId:R}}|t:Deny|s|b' AS _link |
||
102 | 5 | Carsten Rose | FROM Application AS app |
103 | WHERE app.id={{appId:R}} |
||
104 | AND !{{deadlineExpired:R}} |
||
105 | AND {{reviewOpen:R}} |
||
106 | |||
107 | # Detailed message whats wrong. |
||
108 | altsql = SELECT IF({{deadlineExpired:R}},'Deadline expired: {{deadline:R}}','') |
||
109 | 7 | Carsten Rose | , IF({{reviewOpen:R}},'','The approval/deny has already been done.') |
110 | 1 | Carsten Rose | } |
111 | } |
||
112 | } |
||
113 | |||
114 | 6 | Carsten Rose | # User clicked on 'approve' or 'deny'. Arguments {{appId}} and {{action}} are given. |
115 | 5 | Carsten Rose | 50 { |
116 | sql = SELECT ISNULL(app.reviewTs) AS _reviewOpen |
||
117 | FROM Application AS app |
||
118 | WHERE app.id={{appId:R}} |
||
119 | AND '{{action:R}}'!='' |
||
120 | |||
121 | 60 { |
||
122 | sql = SELECT '' |
||
123 | FROM Application |
||
124 | WHERE app.id={{appId:R}} AND ISNULL(reviewTs) |
||
125 | althead = The approval/deny has already been done. |
||
126 | tail = Thanks for the decission. |
||
127 | 1 | Carsten Rose | |
128 | 5 | Carsten Rose | 70 { |
129 | 9 | Carsten Rose | sql = UPDATE Application SET reviewDecission='{{action:R}}', reviewTs=NOW() WHERE id={{appId:R}} |
130 | 5 | Carsten Rose | } |
131 | 3 | Carsten Rose | |
132 | 5 | Carsten Rose | # Send notification mail to applicant |
133 | 80 { |
||
134 | sql = SELECT '....' AS _sendmail |
||
135 | } |
||
136 | } |
||
137 | } |
||
138 | </pre> |