Project

General

Profile

Elektronische Signatur » History » Version 8

Carsten Rose, 14.04.2021 02:04

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 8 Carsten Rose
      sql = UPDATE Application SET reviewDecission='{{action:R}}', reviewTs=NOW()
130 5 Carsten Rose
            WHERE app.id={{appId:R}} AND ISNULL(reviewTs)
131
    }
132 3 Carsten Rose
133 5 Carsten Rose
    # Send notification mail to applicant
134
    80 {
135
      sql = SELECT '....' AS _sendmail
136
    }
137
  } 
138
}
139
</pre>