urlbase(), 'ajax/ajax.php?id={0}&source=documents__files&func=file&name=download'); JavaScript::instance()->add("Hallinta.closeDialogAfterInsert = false;"); JavaScript::instance()->add("Hallinta.fetchItemAfterInsert = true;"); JavaScript::instance()->add("Hallinta.preInsert = check_insert_file;"); JavaScript::instance()->add("Hallinta.postFetch = files_post_fetch;"); if (basename($_SERVER['SCRIPT_NAME']) == 'index.php' && ScannerBase::getScanner()->hasScanner()) { $icon = Hallinta::instance()->urlbase().'masks/'.basename(__DIR__).'/icon/scanner.png'; Actions::instance()->addLink(new Link(array('id' => 'btn_scan', 'icon' => $icon, 'title' => 'Open Scanner', 'function' => 'open_scanner'))); } $jscode = <<add($jscode); $sql_download = " CASE WHEN substring(lower(path),length(path)-3+1) = 'png' THEN '' WHEN substring(lower(path),length(path)-3+1) = 'pdf' THEN '' WHEN substring(lower(path),length(path)-3+1) = 'zip' THEN '' WHEN substring(lower(path),length(path)-2+1) = '7z' THEN '' WHEN substring(lower(path),length(path)-3+1) = 'csv' THEN '' WHEN substring(lower(path),length(path)-3+1) = 'odt' THEN '' WHEN substring(lower(path),length(path)-3+1) = 'doc' THEN '' WHEN substring(lower(path),length(path)-4+1) = 'docx' THEN '' WHEN substring(lower(path),length(path)-3+1) = 'xls' THEN '' WHEN substring(lower(path),length(path)-4+1) = 'xlsx' THEN '' WHEN substring(lower(path),length(path)-3+1) = 'ods' THEN '' WHEN substring(lower(path),length(path)-8+1) = 'gnumeric' THEN '' WHEN substring(lower(path),length(path)-6+1) = 'tar.gz' THEN '' WHEN substring(lower(path),length(path)-7+1) = 'tar.bz2' THEN '' WHEN substring(lower(path),length(path)-3+1) = 'gif' THEN '' WHEN substring(lower(path),length(path)-3+1) = 'tex' THEN '' WHEN substring(lower(path),length(path)-3+1) = 'sql' THEN '' WHEN substring(lower(path),length(path)-3+1) = 'txt' THEN '' WHEN substring(lower(path),length(path)-3+1) = 'jpg' THEN '' WHEN substring(lower(path),length(path)-4+1) = 'epub' THEN '' WHEN substring(lower(path),length(path)-4+1) = 'html' THEN '' ELSE '' END "; $sql_download = str_replace('IMGPATH', Hallinta::instance()->urlbase().'images/icons', $sql_download); $monthlist = ['1' => 'Januar', '2' => 'Februar', '3' => 'März', '4' => 'April', '5' => 'Mai', '6' => 'Juni', '7' => 'Juli', '8' => 'August', '9' => 'September', '10' => 'Oktober', '11' => 'November', '12' => 'Dezember']; $mask = array( 'table' => 'doc_files', 'title' => 'Dokumente', 'sort' => 1, 'sortdir' => 'DESC', 'list' => array( 'id' => array( 'name' => 'ID', 'visible' => false, ), 'date||\'-\'||lpad(id::text, 5, \'0\')' => array( 'name' => 'SortCol', 'visible' => false, ), 'owner' => array( 'name' => 'Besitzer', 'sqltype' => 'int', 'width' => 90, 'filter' => 's', 'specs' => array('ClassName' => 'aligncenter'), 'control' => "new Rico.TableColumn.lookup(".grid_lookup_sql('doc_owner','id','name').", 0, '')", 'distinct' => "SELECT DISTINCT owner,name FROM doc_files JOIN doc_owner ON owner = doc_owner.id ORDER BY name", ), 'type' => array( 'name' => 'Typ', 'sqltype' => 'int', 'width' => 90, 'filter' => 's', 'specs' => array('ClassName' => 'aligncenter'), 'control' => "new Rico.TableColumn.lookup(".grid_lookup_sql('doc_types','id','name').", 0, '')", 'distinct' => "SELECT DISTINCT type,name FROM doc_files JOIN doc_types ON type = doc_types.id ORDER BY name", ), 'extract(year from date)' => array( 'name' => 'Jahr', 'sqltype' => 'int', 'specs' => array('ClassName' => 'aligncenter'), 'filter' => 's', 'width' => 50, 'distinct' => "SELECT DISTINCT extract(year from date) AS year FROM doc_files ORDER BY year DESC", ), 'extract(month from date)' => array( 'name' => 'Monat', 'sqltype' => 'int', 'specs' => array('ClassName' => 'aligncenter'), 'filter' => 's', 'width' => 50, 'control' => "new Rico.TableColumn.lookup(".json_encode($monthlist).", 0, '')", 'distinct' => "SELECT DISTINCT extract(month from date) AS month FROM doc_files ORDER BY month ASC", ), 'date' => array( 'name' => 'Datum', 'sqltype' => 'date', 'filter' => 't^5', 'width' => 80, ), 'title' => array( 'name' => 'Titel', 'width' => 345, 'filter' => 't', ), 'filename' => array( 'name' => 'Datei', 'width' => 200, 'filter' => 't', 'visible' => false, 'sql' => "regexp_replace(path, '.+/', '')", ), 'path' => array( 'name' => 'Pfad', 'width' => 300, 'filter' => 't', 'visible' => false, ), 'download' => array( 'name' => 'DL', 'width' => 25, 'specs' => array('ClassName' => 'aligncenter', 'canSort' => false), 'control' => $href, 'sql' => $sql_download, ), ), 'edit' => array( 'owner' => array( 'name' => 'Besitzer', 'type' => 'select', 'options' => 'SELECT id,name AS text FROM doc_owner ORDER BY name', 'option_empty' => '-- select --', 'required' => true, ), 'type' => array( 'name' => 'Typ', 'type' => 'select', 'options' => 'SELECT id,name AS text FROM doc_types ORDER BY name', 'option_empty' => '-- select --', 'required' => true, ), 'title' => array( 'name' => 'Titel', 'type' => 'text', 'size' => 21, 'required' => true, ), 'date' => array( 'name' => 'Datum', 'type' => 'date', 'size' => 8, 'null' => true, 'required' => true, ), 'path' => array( 'name' => 'Dokument', 'type' => 'file', 'path' => 'documents', 'source' => 'use_from_scanner', 'sql' => false, ), 'path_source' => array( 'name' => 'Dokument Source', 'type' => 'hidden', 'sql' => false, 'ignore' => true, ), 'keywords' => array( 'name' => 'Schlagworte', 'type' => 'textarea', ), ), 'files' => array( 'download' => 'process_download', 'preview' => 'process_preview', 'scanner' => 'process_scanner', ), 'delete' => 'delete_file', ); function process_download() { global $mask; if ($_SESSION['sys']['login'] == 'joey') $inline = true; else $inline = false; download_file($mask['table'],'path',$mask['edit']['path']['path'],$_GET['id'],$inline); } function process_preview() { if (isset($_GET['id'])) { assert_peep_image($_GET['id']); $path = get_scandir() . $_SESSION['sys']['login'] . '.' . $_GET['id'] . '.png'; } else { $path = Hallinta::instance()->basedir() . get_preview_png(); } send_file($path, true); } function process_scanner() { if (isset($_GET['series'])) $preview_pdf = 'archive/documents/scanner/'.$_SESSION['sys']['login'].'.series.pdf'; else $preview_pdf = 'archive/documents/scanner/'.$_SESSION['sys']['login'].'.pdf'; send_file(Hallinta::instance()->basedir() . $preview_pdf, false); } function delete_file() { global $db; $sql = sprintf("SELECT path FROM doc_files WHERE id = %d", $_POST['id']); $sth = $db->query($sql); $row = $sth->fetch(); if (unlink($_SESSION['sys']['basedir'] . 'archive/documents/'.$row['path']) === false) return array('error' => 'Cannot delete file'); $sql = sprintf("DELETE FROM doc_files WHERE id = %d", $_POST['id']); $db->query($sql); return array('status' => true); } /* * Convenience functions: * get_scandir() * get_preview_pnm() * get_preview_png() * get_series_file() */ function get_scandir() { return Hallinta::instance()->basedir() . 'archive/documents/scanner/'; } function get_preview_pnm() { return get_scandir() . $_SESSION['sys']['login'] . '.pnm'; } function get_preview_png() { return 'archive/documents/scanner/'.$_SESSION['sys']['login'].'.png'; } function get_series_file() { return get_scandir() . $_SESSION['sys']['login'] . '.series'; } function pnm2pdf() { $scanner = ScannerBase::getScanner(); // TODO: Use arranged pages $preview_pnm = get_preview_pnm(); $preview_pdf = 'archive/documents/scanner/'.$_SESSION['sys']['login'].'.pdf'; $scanner->convertPNMtoPDF($preview_pnm, Hallinta::instance()->basedir() . $preview_pdf); return $preview_pdf; } /* * Series processing: * series_tidy(); * series_load(); * series_save(Array $list); * series_append(); * assert_peep_image($name); * assert_peep_pdf($name); */ function series_load() { $series = get_series_file(); if (!file_exists($series)) return []; $list = []; foreach (explode("\n", file_get_contents($series)) as $name) if (strlen($name)) $list[] = $name; return $list; } function series_tidy() { $dir = get_scandir(); $list = series_load(); foreach ($list as $name) { $path = $dir.$_SESSION['sys']['login'].'.'.$name.'.pnm'; if (file_exists($path)) unlink($path); $path = $dir.$_SESSION['sys']['login'].'.'.$name.'.png'; if (file_exists($path)) unlink($path); } series_save([]); } function series_save(Array $list) { $series = get_series_file(); if (file_exists($series)) unlink($series); $content = ""; foreach ($list as $name) if ($name) $content .= $name . "\n"; file_put_contents($series, $content); } function series_append() { $list = series_load(); $name = md5(time()); $new_pnm = $_SESSION['sys']['login'] . '.' . $name . '.pnm'; $preview_pnm = get_preview_pnm(); if (!file_exists($preview_pnm)) throw new Exception("No preview available"); copy($preview_pnm, get_scandir() . $new_pnm); $list[] = $name; series_save($list); return ['page' => count($list), 'name' => $name]; } function series_delete_file($name) { $dir = get_scandir(); $path = $dir . $_SESSION['sys']['login'].'.'.$name.'.pnm'; if (file_exists($path)) unlink($path); $path = $dir . $_SESSION['sys']['login'].'.'.$name.'.png'; if (file_exists($path)) unlink($path); $path = $dir . $_SESSION['sys']['login'].'.'.$name.'.pdf'; if (file_exists($path)) unlink($path); } function assert_peep_image($name) { $dir = get_scandir(); $new_png = $_SESSION['sys']['login'] . '.' . $name . '.png'; if (file_exists($dir.$new_png)) return; $new_pnm = $_SESSION['sys']['login'] . '.' . $name . '.pnm'; $cmd = sprintf("convert -geometry 250 %s %s", escapeshellarg($dir.$new_pnm), escapeshellarg($dir.$new_png)); system($cmd); } function assert_peep_pdf($name) { $scanner = ScannerBase::getScanner(); $dir = get_scandir(); $new_pdf = $_SESSION['sys']['login'] . '.' . $name . '.pdf'; if (file_exists($dir.$new_pdf)) return; $new_pnm = $_SESSION['sys']['login'] . '.' . $name . '.pnm'; $scanner->convertPNMtoPDF($dir.$new_pnm, $dir.$new_pdf); } function cb_scanner() { if (!is_dir(get_scandir())) mkdir(get_scandir(), 0755, true); if (!is_writable(get_scandir())) ajax_error('documents/scanner nicht beschreibbar'); $preview = file_exists(Hallinta::instance()->basedir() . get_preview_png()) ? true : false; return ['html' => Template::render('scanner', []), 'preview' => $preview]; } function cb_preview() { $scanner = ScannerBase::getScanner(); $preview_pnm = get_preview_pnm(); $preview_png = get_preview_png(); $scanner->scanIntoPNM($preview_pnm); $scanner->convertPNMtoPNG($preview_pnm, Hallinta::instance()->basedir() . $preview_png); return ['preview' => Hallinta::instance()->urlbase() . $preview_png]; } function cb_rotate() { $scanner = ScannerBase::getScanner(); $preview_pnm = get_preview_pnm(); $preview_png = get_preview_png(); $scanner->rotatePNM($preview_pnm, $_POST['direction']); $scanner->convertPNMtoPNG($preview_pnm, Hallinta::instance()->basedir() . $preview_png); return ['preview' => Hallinta::instance()->urlbase() . $preview_png]; } function cb_download() { return ['path' => pnm2pdf()]; } function cb_store() { return series_append(); } function cb_peep() { $name = $_POST['name']; assert_peep_image($name); assert_peep_pdf($name); } function cb_tidy() { $dir = get_scandir(); foreach (new DirectoryIterator($dir) as $fileInfo) { if ($fileInfo->isDot()) continue; if ($fileInfo->isDir()) continue; if (strpos($fileInfo->getFilename(), $_SESSION['sys']['login'].'.') === 0) unlink($dir.$fileInfo->getFilename()); } } function cb_series_tidy() { $dir = get_scandir(); foreach (series_load() as $name) series_delete_file($name); $path = $dir . $_SESSION['sys']['login'].'.series.pdf'; if (file_exists($path)) unlink($path); $path = $dir . $_SESSION['sys']['login'].'.series'; if (file_exists($path)) unlink($path); } function cb_arrange() { $hallinta = Hallinta::instance(); if (!is_dir(get_scandir())) mkdir(get_scandir(), 0755, true); if (!is_writable(get_scandir())) ajax_error('documents/scanner nicht beschreibbar'); $page = 0; $list = []; foreach (series_load() as $name) $list[] = ['name' => $name, 'page' => ++$page, 'up' => $hallinta->urlbase().'masks/'.basename(__DIR__).'/icon/up-icon.png', 'down' => $hallinta->urlbase().'masks/'.basename(__DIR__).'/icon/down-icon.png', 'delete' => $hallinta->urlbase().'masks/'.basename(__DIR__).'/icon/trash-icon.png', 'src' => sprintf("%sajax/ajax.php?func=file&name=preview&source=%s__%s&id=%s", $hallinta->urlbase(), $hallinta->module(), $hallinta->page(), $name)]; if (count($list)) { $list[0]['up'] = false; $list[count($list)-1]['down'] = false; } return ['html' => Template::render('arrange', ['list' => $list])]; } function cb_series() { $dir = get_scandir(); $scanner = ScannerBase::getScanner(); $files = []; foreach (series_load() as $name) { assert_peep_pdf($name); $files[] = $dir . $_SESSION['sys']['login'] . '.' . $name . '.pdf'; } $outfile = $dir . $_SESSION['sys']['login'] . '.series.pdf'; $scanner->mergePDF($files, $outfile); } function cb_arrange_del() { $list = series_load(); for ($i=0; $i < count($list); $i++) if ($list[$i] === $_POST['name']) { series_delete_file($list[$i]); unset($list[$i]); } series_save($list); } function cb_arrange_up() { $list = series_load(); for ($i=1; $i < count($list); $i++) if ($list[$i] === $_POST['name']) { $tmp = $list[$i]; $list[$i] = $list[$i-1]; $list[$i-1] = $tmp; } series_save($list); } function cb_arrange_down() { $list = series_load(); for ($i=0; $i < count($list)-1; $i++) if ($list[$i] === $_POST['name']) { $tmp = $list[$i]; $list[$i] = $list[$i+1]; $list[$i+1] = $tmp; } series_save($list); } function use_from_scanner($field, $info) { if (isset($_POST['path_source']) && $_POST['path_source'] == 'scanner') { $preview_pdf = pnm2pdf(); $title = str_replace(["'", "&", ":", "/", "*", "\\"], ['', '', '', '', '', ''], $_POST['title']); list($base, $fname) = unique_pathname($info['path'], $title.'.pdf'); if (copy(Hallinta::instance()->basedir() . $preview_pdf, $base.$fname) === false) ajax_error("Datei kann nicht kopiert werden"); return $fname; } elseif (isset($_POST['path_source']) && $_POST['path_source'] == 'series') { cb_series(); $preview_pdf = 'archive/documents/scanner/' . $_SESSION['sys']['login'] . '.series.pdf'; $title = str_replace(["'", "&", ":", "/", "*", "\\"], ['', '', '', '', '', ''], $_POST['title']); list($base, $fname) = unique_pathname($info['path'], $title.'.pdf'); if (copy(Hallinta::instance()->basedir() . $preview_pdf, $base.$fname) === false) ajax_error("Datei kann nicht kopiert werden"); return $fname; } else { return NULL; } ajax_error("Something went wrong"); }