*sigh* empty('0') evaluates to true even though the string is not empty.
[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   $fields = array('sys_user','sys_edit');
141   $values = array("'".pg_escape_string($_SESSION['sys']['login'])."'", 'now()');
142
143   foreach ($mask['edit'] as $field => $info) {
144     if ($info['required'] === true && !strlen($_POST[$field]))
145       return array('error' => sprintf('Pflichtfeld %s nicht ausgefüllt', $info['name']),
146                    'errormsg' => 'Pflichtfelder nicht ausgefüllt');
147
148     if ($info['type'] == 'boolean') {
149       $fields[] = $field;
150       $values[] = $_POST[$field] == 'on'?1:0;
151     } elseif ($info['type'] == 'number' || $info['type'] == 'hidden' || ($info['type'] == 'select' && $info['options_string'] !== true)) {
152       $fields[] = $field;
153       if (empty($_POST[$field]) && $info['null'] === true)
154         $values[] = 'NULL';
155       else
156         $values[] = intval($_POST[$field]);
157     } elseif ($info['type'] == 'decimal') {
158       $fields[] = $field;
159       if (empty($_POST[$field]) && $info['null'] === true)
160         $values[] = 'NULL';
161       else
162         $values[] = format_decimal($_POST[$field]);
163     } elseif ($info['type'] == 'passwd') {
164       if (!empty($_POST[$field])) {
165         $fields[] = $field;
166         $values[] = sprintf("'%s'", pg_escape_string(passwd(empty($_POST['login'])?$_SESSION['sys']['login']:$_POST['login'],
167                                                             $_POST[$field])));
168       }
169     } else {
170       $fields[] = $field;
171       if (empty($_POST[$field]) && $info['null'] === true)
172         $values[] = 'NULL';
173       else
174         $values[] = sprintf("'%s'", pg_escape_string($_POST[$field]));
175     }
176   }
177
178   $sql = sprintf('INSERT INTO %s (%s) VALUES (%s)',
179                  empty($mask['edit_table']) ? $mask['table'] : $mask['edit_table'],
180                  implode(',', $fields),
181                  implode(',', $values));
182
183   $sth = pg_query($sql);
184
185   if ($sth === false) {
186     error_log($sql . ': ' . pg_last_error());
187     return array('error' => pg_last_error(),
188                  'sql' => $sql);
189   }
190
191   return array('status' => true);
192 }
193
194 function delete_or_copy($mask)
195 {
196   if (empty($_POST['id']))
197     return array('error' => 'Missing ID');
198
199   if (!empty($mask['edit_table']))
200     return array('error' => 'Cannot handle deletion for secondary table');
201
202   if (DELETE_COPY === true) {
203     $sql = sprintf("INSERT INTO %s_deleted SELECT * FROM %s WHERE id = %d",
204                    $mask['table'], $mask['table'], $_POST['id']);
205
206     $sth = pg_query($sql);
207
208     if ($sth === false) {
209       error_log($sql . ': ' . pg_last_error());
210       return array('error' => pg_last_error(),
211                    'sql' => $sql);
212     }
213
214     $sql = sprintf("UPDATE %s_deleted SET sys_user='%s',sys_edit=now() WHERE id = %d",
215                    $mask['table'], $_SESSION['sys']['login'], $_POST['id']);
216
217     $sth = pg_query($sql);
218
219     if ($sth === false) {
220       error_log($sql . ': ' . pg_last_error());
221       return array('error' => pg_last_error(),
222                    'sql' => $sql);
223     }
224   }
225
226   $sql = sprintf("DELETE FROM %s WHERE id = %d", $mask['table'], $_POST['id']);
227
228   $sth = pg_query($sql);
229
230   if ($sth === false) {
231     error_log($sql . ': ' . pg_last_error());
232     return array('error' => pg_last_error(),
233                  'sql' => $sql);
234   }
235
236   return array('status' => true);
237 }
238
239 function set_variable($name,$mask)
240 {
241   if (!array_key_exists('variables',$mask))
242     return array('error' => 'Unknown variable ' . htmlspecialchars($_POST['name']));
243
244   if (!array_key_exists($_POST['name'],$mask['variables']))
245     return array('error' => 'Unknown variable ' . htmlspecialchars($_POST['name']));
246
247   $_SESSION[$name . '.' . $_POST['name']] = $_POST['value'];
248
249   if (array_key_exists('postcall',$mask['variables'][$_POST['name']]))
250     $mask['variables'][$_POST['name']]['postcall']();
251
252   return array('status' => true);
253 }
254
255 function get_infos($mask)
256 {
257   if (!array_key_exists('info',$mask))
258     return array('error' => 'Unknown callback ' . htmlspecialchars($_POST['name']));
259
260   if (!array_key_exists($_POST['name'],$mask['info']))
261     return array('error' => 'Unknown callback ' . htmlspecialchars($_POST['name']));
262
263   if (!array_key_exists('sql',$mask['info'][$_POST['name']]))
264     return array('error' => 'Unknown callback ' . htmlspecialchars($_POST['name']));
265
266   $sql = $mask['info'][$_POST['name']]['sql'];
267
268   while (preg_match('/\{([^\}]*)\}/', $sql, $matches))
269     $sql = str_replace('{'.$matches[1].'}', $_POST[$matches[1]], $sql);
270
271   return array('info' => query_db($sql));
272 }
273
274 if (empty($_POST['func']))
275   exit;
276
277 if (empty($_POST['source']))
278   exit;
279
280 connect_db();
281 if (load_mask($_POST['source']) === false) exit;
282
283 $data = array('error' => 'Unknown function');
284
285 if ($_POST['func'] == 'fetch') {
286   $data = fetch($mask);
287 } elseif ($_POST['func'] == 'details') {
288   $data = details($mask);
289 } elseif ($_POST['func'] == 'save') {
290   $data = save($mask);
291 } elseif ($_POST['func'] == 'insert') {
292   $data = insert($mask);
293 } elseif ($_POST['func'] == 'delete') {
294   $data = delete_or_copy($mask);
295 } elseif ($_POST['func'] == 'setvar') {
296   $data = set_variable($_POST['source'],$mask);
297 } elseif ($_POST['func'] == 'info') {
298   $data = get_infos($mask);
299 }
300
301 format_ajax($data);
302
303 ?>