Add support for password fields
[misc/kostenrechnung] / ajax / ajax.php
1 <?php
2
3 require_once('../init.php');
4
5 function fetch($mask)
6 {
7   $fields = array('sys_edit', 'sys_user');
8   foreach ($mask['edit'] as $field => $info)
9     if ($info['type'] != 'passwd')
10       $fields[] = $field;
11
12   $sql = sprintf('SELECT id,%s FROM %s WHERE id = %d',
13                  implode(',', $fields),
14                  $mask['table'], $_POST['id']);
15
16   $sth = pg_query($sql);
17   if ($sth === false) return false;
18
19   $row = pg_fetch_assoc($sth);
20
21   foreach ($mask['edit'] as $field => $info)
22     if ($info['type'] == 'boolean')
23       $row[$field] = $row[$field]?true:false;
24     elseif (array_key_exists('format', $info))
25       $row[$field] = sprintf($info['format'], $row[$field]);
26
27   return $row;
28 }
29
30 function details($mask)
31 {
32   if (empty($_POST['id']))
33     return array('error' => 'Missing ID');
34
35   $sql = sprintf('SELECT id,%s FROM %s WHERE id = %d',
36                  implode(',', array_keys($mask['details']['list'])),
37                  $mask['table'], $_POST['id']);
38
39   $sth = pg_query($sql);
40
41   if (!$sth)
42     return array('error' => pg_last_error(),
43                  'sql' => $sql);
44
45   $row = pg_fetch_assoc($sth);
46
47   foreach ($mask['details']['list'] as $field => $info)
48     if (array_key_exists('format', $info))
49       $row[$field] = sprintf($info['format'], $row[$field]);
50
51   return $row;
52 }
53
54 function save($mask)
55 {
56   if (empty($_POST['id']))
57     return array('error' => 'Missing ID');
58
59   $update = array(sprintf("sys_user = '%s'", pg_escape_string($_SESSION['sys']['login'])),
60                   "sys_edit = now()");
61
62   foreach ($mask['edit'] as $field => $info)
63     if ($info['type'] == 'boolean') {
64       $update[] = sprintf("%s=%d", $field, $_POST[$field] == 'on'?1:0);
65     } elseif ($info['type'] == 'number') {
66       $update[] = sprintf("%s=%d", $field, $_POST[$field]);
67     } else {
68       $update[] = sprintf("%s='%s'", $field, pg_escape_string($_POST[$field]));
69     }
70
71   $sql = 'UPDATE ' . $mask['table'] . ' SET ';
72   $sql .= implode(', ', $update);
73   $sql .= ' WHERE id = ' . intval($_POST['id']);
74
75   $sth = pg_query($sql);
76
77   if ($sth === false) {
78     error_log($sql . ': ' . pg_last_error());
79     return array('error' => pg_last_error(),
80                  'sql' => $sql);
81   }
82
83   return array('status' => true);
84 }
85
86 function insert($mask)
87 {
88   $fields = array('sys_user','sys_edit');
89   $values = array("'".pg_escape_string($_SESSION['sys']['login'])."'", 'now()');
90
91   foreach ($mask['edit'] as $field => $info)
92     if ($info['type'] == 'boolean') {
93       $fields[] = $field;
94       $values[] = $_POST[$field] == 'on'?1:0;
95     } elseif ($info['type'] == 'number') {
96       $fields[] = $field;
97       $values[] = intval($_POST[$field]);
98     } else {
99       $fields[] = $field;
100       $values[] = sprintf("'%s'", pg_escape_string($_POST[$field]));
101     }
102
103   $sql = 'INSERT INTO ' . $mask['table'] . ' (' . implode(',', $fields) . ') ';
104   $sql .= 'VALUES (' . implode(',', $values) . ')';
105
106   $sth = pg_query($sql);
107
108   if ($sth === false) {
109     error_log($sql . ': ' . pg_last_error());
110     return array('error' => pg_last_error(),
111                  'sql' => $sql);
112   }
113
114   return array('status' => true);
115 }
116
117 function delete_or_copy($mask)
118 {
119   if (empty($_POST['id']))
120     return array('error' => 'Missing ID');
121
122   if (DELETE_COPY === true) {
123     $sql = sprintf("INSERT INTO %s_deleted SELECT * FROM %s WHERE id = %d",
124                    $mask['table'], $mask['table'], $_POST['id']);
125
126     $sth = pg_query($sql);
127
128     if ($sth === false) {
129       error_log($sql . ': ' . pg_last_error());
130       return array('error' => pg_last_error(),
131                    'sql' => $sql);
132     }
133
134     $sql = sprintf("UPDATE %s_deleted SET sys_user='%s',sys_edit=now() WHERE id = %d",
135                    $mask['table'], $_SESSION['sys']['login'], $_POST['id']);
136
137     $sth = pg_query($sql);
138
139     if ($sth === false) {
140       error_log($sql . ': ' . pg_last_error());
141       return array('error' => pg_last_error(),
142                    'sql' => $sql);
143     }
144   }
145
146   $sql = sprintf("DELETE FROM %s WHERE id = %d", $mask['table'], $_POST['id']);
147
148   $sth = pg_query($sql);
149
150   if ($sth === false) {
151     error_log($sql . ': ' . pg_last_error());
152     return array('error' => pg_last_error(),
153                  'sql' => $sql);
154   }
155
156   return array('status' => true);
157 }
158
159 function format_ajax($data)
160 {
161   header('Content-type: application/json; charset=UTF-8');
162   echo json_encode($data);
163   exit;
164 }
165
166 if (empty($_POST['func']))
167   exit;
168
169 if (empty($_POST['source']))
170   exit;
171
172 connect_db();
173 if (load_mask($_POST['source']) === false) exit;
174
175 $data = array('error' => 'Unknown function');
176
177 if ($_POST['func'] == 'fetch') {
178   $data = fetch($mask);
179 } elseif ($_POST['func'] == 'details') {
180   $data = details($mask);
181 } elseif ($_POST['func'] == 'save') {
182   $data = save($mask);
183 } elseif ($_POST['func'] == 'insert') {
184   $data = insert($mask);
185 } elseif ($_POST['func'] == 'delete') {
186   $data = delete_or_copy($mask);
187 }
188
189 format_ajax($data);
190
191 ?>