Support mask specific insert functions
[misc/kostenrechnung] / ajax / ajax.php
1 <?php
2
3 require_once('../init.php');
4
5 function fetch($mask)
6 {
7   $fields = array("to_char(sys_edit,'DD.MM.YYYY HH24:mm') AS sys_edit", 'sys_user');
8   foreach ($mask['edit'] as $field => $info) {
9     if ($info['sql'] === false) continue;
10     if ($info['type'] == 'date')
11       $fields[] = sprintf("to_char(%s,'DD.MM.YYYY') AS %s",
12                           empty($info['sql']) ? $field : $info['sql'],
13                           $field);
14     elseif ($info['type'] != 'passwd')
15       $fields[] = empty($info['sql']) ? $field : $info['sql'] . ' AS ' . $field;
16   }
17
18   $sql = sprintf('SELECT id,%s FROM %s WHERE id = %d',
19                  implode(',', $fields),
20                  $mask['table'], $_POST['id']);
21
22   $sth = pg_query($sql);
23   if ($sth === false) return false;
24
25   $row = pg_fetch_assoc($sth);
26
27   foreach ($mask['edit'] as $field => $info)
28     if ($info['type'] == 'boolean')
29       $row[$field] = $row[$field]?true:false;
30     elseif ($info['type'] == 'passwd')
31       $row[$field] = '';
32     elseif (array_key_exists('format', $info))
33       $row[$field] = sprintf($info['format'], $row[$field]);
34
35   return $row;
36 }
37
38 function details($mask)
39 {
40   if (empty($_POST['id']))
41     return array('error' => 'Missing ID');
42
43   $fields = array();
44   foreach ($mask['details']['list'] as $field => $info) {
45     if ($info['type'] == 'date')
46       $fields[] = sprintf("to_char(%s,'DD.MM.YYYY') AS %s",
47                           empty($info['sql']) ? $field : $info['sql'],
48                           $field);
49     elseif (!array_key_exists('fetch',$info))
50       $fields[] = empty($info['sql']) ? $field : $info['sql'] . ' AS ' . $field;
51   }
52
53   if (count($fields)) {
54     $sql = sprintf('SELECT id,%s FROM %s WHERE id = %d',
55                    implode(',', $fields),
56                    $mask['table'], $_POST['id']);
57
58     $sth = pg_query($sql);
59
60     if (!$sth)
61       return array('error' => pg_last_error(),
62                    'sql' => $sql);
63
64     $row = pg_fetch_assoc($sth);
65   } else {
66     $row = array();
67   }
68
69   foreach ($mask['details']['list'] as $field => $info)
70     if (array_key_exists('format', $info))
71       $row[$field] = sprintf($info['format'], $row[$field]);
72     elseif (array_key_exists('fetch', $info))
73       $row[$field] = $info['fetch']();
74
75   return $row;
76 }
77
78 function format_decimal($value)
79 {
80   $value = str_replace(',','.',$value);
81   return sprintf("%.2f", $value);
82 }
83
84 function save($mask)
85 {
86   if (empty($_POST['id']))
87     return array('error' => 'Missing ID');
88
89   $update = array(sprintf("sys_user = '%s'", pg_escape_string($_SESSION['sys']['login'])),
90                   "sys_edit = now()");
91
92   foreach ($mask['edit'] as $field => $info) {
93     if ($info['required'] === true && !strlen($_POST[$field]))
94       return array('error' => sprintf('Pflichtfeld %s nicht ausgefüllt', $info['name']),
95                    'errormsg' => 'Pflichtfelder nicht ausgefüllt');
96
97     if ($info['type'] == 'boolean') {
98       $update[] = sprintf("%s=%d", $field, $_POST[$field] == 'on'?1:0);
99     } elseif ($info['type'] == 'number' || $info['type'] == 'hidden' || ($info['type'] == 'select' && $info['options_string'] !== true)) {
100       if (empty($_POST[$field]) && $info['null'] === true)
101         $update[] = sprintf("%s=NULL", $field);
102       else
103         $update[] = sprintf("%s=%d", $field, $_POST[$field]);
104     } elseif ($info['type'] == 'decimal') {
105       if (empty($_POST[$field]) && $info['null'] === true)
106         $update[] = sprintf("%s=NULL", $field);
107       else
108         $update[] = sprintf("%s=%s", $field, format_decimal($_POST[$field]));
109     } elseif ($info['type'] == 'passwd') {
110       if (!empty($_POST[$field]))
111         $update[] = sprintf("%s='%s'", $field,
112                             pg_escape_string(passwd(empty($_POST['login'])?$_SESSION['sys']['login']:$_POST['login'],
113                                                     $_POST[$field])));
114     } else {
115       if (empty($_POST[$field]) && $info['null'] === true)
116         $update[] = sprintf("%s=NULL", $field);
117       else
118         $update[] = sprintf("%s='%s'", $field, pg_escape_string($_POST[$field]));
119     }
120   }
121
122   $sql = sprintf('UPDATE %s SET %s WHERE id = %d',
123                  empty($mask['edit_table']) ? $mask['table'] : $mask['edit_table'],
124                  implode(', ', $update),
125                  intval($_POST['id']));
126
127   $sth = pg_query($sql);
128
129   if ($sth === false) {
130     error_log($sql . ': ' . pg_last_error());
131     return array('error' => pg_last_error(),
132                  'sql' => $sql);
133   }
134
135   return array('status' => true);
136 }
137
138 function insert($mask)
139 {
140   if (array_key_exists('insert', $mask))
141     return $mask['insert']($mask);
142
143   $fields = array('sys_user','sys_edit');
144   $values = array("'".pg_escape_string($_SESSION['sys']['login'])."'", 'now()');
145
146   foreach ($mask['edit'] as $field => $info) {
147     if ($info['required'] === true && !strlen($_POST[$field]))
148       return array('error' => sprintf('Pflichtfeld %s nicht ausgefüllt', $info['name']),
149                    'errormsg' => 'Pflichtfelder nicht ausgefüllt');
150
151     if ($info['type'] == 'boolean') {
152       $fields[] = $field;
153       $values[] = $_POST[$field] == 'on'?1:0;
154     } elseif ($info['type'] == 'number' || $info['type'] == 'hidden' || ($info['type'] == 'select' && $info['options_string'] !== true)) {
155       $fields[] = $field;
156       if (empty($_POST[$field]) && $info['null'] === true)
157         $values[] = 'NULL';
158       else
159         $values[] = intval($_POST[$field]);
160     } elseif ($info['type'] == 'decimal') {
161       $fields[] = $field;
162       if (empty($_POST[$field]) && $info['null'] === true)
163         $values[] = 'NULL';
164       else
165         $values[] = format_decimal($_POST[$field]);
166     } elseif ($info['type'] == 'passwd') {
167       if (!empty($_POST[$field])) {
168         $fields[] = $field;
169         $values[] = sprintf("'%s'", pg_escape_string(passwd(empty($_POST['login'])?$_SESSION['sys']['login']:$_POST['login'],
170                                                             $_POST[$field])));
171       }
172     } else {
173       $fields[] = $field;
174       if (empty($_POST[$field]) && $info['null'] === true)
175         $values[] = 'NULL';
176       else
177         $values[] = sprintf("'%s'", pg_escape_string($_POST[$field]));
178     }
179   }
180
181   $sql = sprintf('INSERT INTO %s (%s) VALUES (%s)',
182                  empty($mask['edit_table']) ? $mask['table'] : $mask['edit_table'],
183                  implode(',', $fields),
184                  implode(',', $values));
185
186   $sth = pg_query($sql);
187
188   if ($sth === false) {
189     error_log($sql . ': ' . pg_last_error());
190     return array('error' => pg_last_error(),
191                  'sql' => $sql);
192   }
193
194   return array('status' => true);
195 }
196
197 function delete_or_copy($mask)
198 {
199   if (empty($_POST['id']))
200     return array('error' => 'Missing ID');
201
202   if (!empty($mask['edit_table']))
203     return array('error' => 'Cannot handle deletion for secondary table');
204
205   if (DELETE_COPY === true) {
206     $sql = sprintf("INSERT INTO %s_deleted SELECT * FROM %s WHERE id = %d",
207                    $mask['table'], $mask['table'], $_POST['id']);
208
209     $sth = pg_query($sql);
210
211     if ($sth === false) {
212       error_log($sql . ': ' . pg_last_error());
213       return array('error' => pg_last_error(),
214                    'sql' => $sql);
215     }
216
217     $sql = sprintf("UPDATE %s_deleted SET sys_user='%s',sys_edit=now() WHERE id = %d",
218                    $mask['table'], $_SESSION['sys']['login'], $_POST['id']);
219
220     $sth = pg_query($sql);
221
222     if ($sth === false) {
223       error_log($sql . ': ' . pg_last_error());
224       return array('error' => pg_last_error(),
225                    'sql' => $sql);
226     }
227   }
228
229   $sql = sprintf("DELETE FROM %s WHERE id = %d", $mask['table'], $_POST['id']);
230
231   $sth = pg_query($sql);
232
233   if ($sth === false) {
234     error_log($sql . ': ' . pg_last_error());
235     return array('error' => pg_last_error(),
236                  'sql' => $sql);
237   }
238
239   return array('status' => true);
240 }
241
242 function set_variable($name,$mask)
243 {
244   if (!array_key_exists('variables',$mask))
245     return array('error' => 'Unknown variable ' . htmlspecialchars($_POST['name']));
246
247   if (!array_key_exists($_POST['name'],$mask['variables']))
248     return array('error' => 'Unknown variable ' . htmlspecialchars($_POST['name']));
249
250   $_SESSION[$name . '.' . $_POST['name']] = $_POST['value'];
251
252   if (array_key_exists('postcall',$mask['variables'][$_POST['name']]))
253     $mask['variables'][$_POST['name']]['postcall']();
254
255   return array('status' => true);
256 }
257
258 function get_infos($mask)
259 {
260   if (!array_key_exists('info',$mask))
261     return array('error' => 'Unknown callback ' . htmlspecialchars($_POST['name']));
262
263   if (!array_key_exists($_POST['name'],$mask['info']))
264     return array('error' => 'Unknown callback ' . htmlspecialchars($_POST['name']));
265
266   if (!array_key_exists('sql',$mask['info'][$_POST['name']]))
267     return array('error' => 'Unknown callback ' . htmlspecialchars($_POST['name']));
268
269   $sql = $mask['info'][$_POST['name']]['sql'];
270
271   while (preg_match('/\{([^\}]*)\}/', $sql, $matches))
272     $sql = str_replace('{'.$matches[1].'}', $_POST[$matches[1]], $sql);
273
274   return array('info' => query_db($sql),
275                'parameter' => $_POST);
276 }
277
278 if (empty($_POST['func']))
279   exit;
280
281 if (empty($_POST['source']))
282   exit;
283
284 connect_db();
285 if (load_mask($_POST['source']) === false) exit;
286
287 $data = array('error' => 'Unknown function');
288
289 if ($_POST['func'] == 'fetch') {
290   $data = fetch($mask);
291 } elseif ($_POST['func'] == 'details') {
292   $data = details($mask);
293 } elseif ($_POST['func'] == 'save') {
294   $data = save($mask);
295 } elseif ($_POST['func'] == 'insert') {
296   $data = insert($mask);
297 } elseif ($_POST['func'] == 'delete') {
298   $data = delete_or_copy($mask);
299 } elseif ($_POST['func'] == 'setvar') {
300   $data = set_variable($_POST['source'],$mask);
301 } elseif ($_POST['func'] == 'info') {
302   $data = get_infos($mask);
303 }
304
305 format_ajax($data);
306
307 ?>