valuecolumn, $this->table, $this->db->quote($blzkto)); return $this->db->fetchValue($sql); } public function distinctYears($blzkto) { $sql = sprintf("SELECT DISTINCT substr(datum::text,0,5) AS year FROM %s ". "WHERE blz_kto = %s ORDER BY year DESC", $this->table, $this->db->quote($blzkto)); return $this->db->fetchObjectList($sql); } public function distinctCategories($blzkto) { $sql = sprintf("SELECT DISTINCT category FROM %s WHERE blz_kto = %s ORDER BY category", $this->table, $this->db->quote($blzkto)); return $this->db->fetchObjectList($sql); } public function distinctFromTo($blzkto, $period=false) { $sql = sprintf("SELECT DISTINCT from_to FROM %s WHERE blz_kto = %s%s ORDER BY from_to", $this->table, $this->db->quote($blzkto), $period === false ? '' : ' AND ' . $period); return $this->db->fetchObjectList($sql); } public function distinctStatements($blzkto) { $sql = sprintf("SELECT DISTINCT statement FROM %s WHERE blz_kto = %s ORDER BY statement DESC", $this->table, $this->db->quote($blzkto)); return $this->db->fetchObjectList($sql); } public function filterTable(Array $data) { error_log('filter Table'); $out = ''; $where[] = sprintf("blz_kto = '%s'", $data['blzkto']); if (strlen($data['year'])) { $where[] = sprintf ("datum >= '%04d-01-01'", $data['year']); $year++; $where[] = sprintf ("datum < '%04d-01-01'", $data['year']+1); } if (strlen($data['deadline']) && strlen(trim($data['deadline']))) { $date = Utils::assertIsoDate(trim($data['deadline'])); $where[] = sprintf ("datum < '%s'", $date); } if (strlen($data['statement']) && strlen(trim($data['statement']))) { $where[] = sprintf("statement = '%s'", $data['statement']); } if (strlen($data['category']) && strlen(trim($data['category']))) { if (Utils::isAJAX()) $data['category'] = utf8_decode($data['category']); $where[] = sprintf("category = '%s'", $data['category']); } if (strlen($data['keyword']) && strlen(trim($data['keyword']))) { if (Utils::isAJAX()) $data['keyword'] = utf8_decode($data['keyword']); $where[] = sprintf("descr ~* '%s'", $data['keyword']); } if (strlen($data['from_to']) && strlen(trim($data['from_to']))) { if (Utils::isAJAX()) $data['from_to'] = utf8_decode($data['from_to']); $where[] = sprintf("from_to = '%s'", $data['from_to']); } if ($data['input'] && !$data['output']) { $where[] = "{$this->valuecolumn} > 0.0"; } elseif ($data['output'] && !$data['input']) { $where[] = "{$this->valuecolumn} < 0.0"; } $sql = sprintf("SELECT datum,id,category,descr,%s FROM %s WHERE %s ORDER BY datum,id", $this->valuecolumn, $this->table, implode (" AND ", $where)); $sum = 0.0; $sum_in = 0.0; $sum_out = 0.0; $color = 0; foreach ($this->db->fetchAssocList($sql) as $row) { $descr = explode ("\n", $row['descr']); if (!strlen($descr[0])) $descr[0] = '(leer)'; $date = Utils::assertGermanDate($row['datum']); $out .= sprintf ("", $color); $out .= sprintf ("%s", $date); $out .= sprintf ("%s", $row['category']); if (strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla/') === false) $out .= sprintf ("%s", $row['id'], $add, $descr[0]); else $out .= sprintf ("%s", get_class($this), $row['id'], $add, $descr[0]); $out .= sprintf ("%5.2f", $row[$this->valuecolumn]>0?"in":"out", $row[$this->valuecolumn]); $sum += $row[$this->valuecolumn]; if ($row[$this->valuecolumn] > 0) { $sum_in += $row[$this->valuecolumn]; } else { $sum_out += $row[$this->valuecolumn]; } $out .= ""; $color = !$color; } if (strlen($data['statement'])) { $out .= sprintf ("", $color); $out .= "Summe Einnahmen"; $out .= sprintf ("%5.2f",$sum_in); $out .= ""; $out .= sprintf ("", $color); $out .= "Summe Ausgaben"; $out .= sprintf ("%5.2f", $sum_out*-1); $out .= ""; } $out .= sprintf ("", $color); $out .= "Summe"; $out .= sprintf ("%5.2f", $sum>0?"in":"out", $sum); $out .= ""; return $out; } public function ajaxFilter(Array $data) { return array('table' => utf8_encode($this->filterTable($data))); } public function insert(Array $item) { $item[$this->valuecolumn] = $item['value']; unset($item['value']); if (!array_key_exists('sys_user', $item)) $item['sys_user'] = $_SERVER['REMOTE_USER']; return $this->db->insertInto($this->table, $item); } public function ajaxGetCategoryInfo(Array $data) { $result = []; $sql = sprintf("SELECT DISTINCT category FROM %s WHERE blz_kto = %s AND category <> '' AND category IS NOT NULL ORDER BY category", $this->table, $this->db->quote($data['blzkto'])); foreach ($this->db->fetchObjectList($sql) as $cat) { $condition = sprintf("datum >= now() - interval '%s' AND category = %s", $this->lookup_period, $this->db->quote($cat->category)); $names = [['id' => '', 'title' => '']]; foreach ($this->distinctFromTo($data['blzkto'], $condition) as $row) { $names[] = ['id' => utf8_encode($row->from_to), 'title' => utf8_encode($row->from_to)]; } $result[utf8_encode($cat->category)] = $names; } return ['list' => $result]; } public function ajaxInsert(Array $data) { if (!strlen($data['category']) && strlen($data['newcategory'])) $data['category'] = $data['newcategory']; if (!strlen($data['from_to']) && strlen($data['newfrom_to'])) $data['from_to'] = $data['newfrom_to']; return $this->insert(['blz_kto' => $data['blzkto'], 'datum' => Functions::date_german_to_iso($data['datum']), 'statement' => $data['statement'], 'from_to' => utf8_decode($data['from_to']), 'descr' => utf8_decode($data['descr']), 'category' => utf8_decode($data['category']), 'value' => str_replace (",",".", $data['value'])]); } protected function getCommonPrefix(Array $list) { $pl = 0; // common prefix length $n = count($list); $l = strlen($list[0]); while ($pl < $l) { $c = $list[0][$pl]; for ($i=1; $i<$n; $i++) { if ($list[$i][$pl] !== $c) break 2; } $pl++; } $prefix = substr($list[0], 0, $pl); return $prefix; } public function ajaxGetItems(Array $data) { $sql = sprintf("SELECT DISTINCT %s AS value FROM %s WHERE blz_kto = %s AND category = %s AND from_to = %s AND datum >= now() - interval '%s'", $this->valuecolumn, $this->table, $this->quote($data['blzkto']), $this->quote(utf8_decode($data['category'])), $this->quote(utf8_decode($data['from_to'])), $this->lookup_period); $values = $this->db->fetchObjectList($sql); $sql = sprintf("SELECT DISTINCT descr FROM %s WHERE blz_kto = %s AND category = %s AND from_to = %s AND datum >= now() - interval '%s' ORDER BY descr", $this->table, $this->quote($data['blzkto']), $this->quote(utf8_decode($data['category'])), $this->quote(utf8_decode($data['from_to'])), $this->lookup_period); $list = []; foreach ($this->db->fetchObjectList($sql) as $row) $list[] = utf8_encode($row->descr); return ['use_value' => count($values) == 1, 'value' => count($values) == 1 ? $values[0]->value : '', 'list' => $list, 'prefix' => $this->getCommonPrefix($list)]; } }