From 41556cfe73816fcba1923b5602a66d4f3ddf2845 Mon Sep 17 00:00:00 2001 From: Thomas Hooge Date: Tue, 11 Aug 2026 07:48:46 +0200 Subject: [PATCH] More improvements e.g. flags and provision target --- INSTALL | 2 +- db/mariadb.sql | 7 +- webgui/box.php | 45 ++ webgui/company.php | 21 +- webgui/documents.php | 74 ++- webgui/equipment.php | 19 +- webgui/globals.inc | 48 +- webgui/img/pwa-192.png | Bin 0 -> 14314 bytes webgui/img/pwa-512.png | Bin 0 -> 43498 bytes webgui/index.php | 6 +- webgui/inventory.php | 15 +- webgui/lib/db.inc | 10 + webgui/locale/de_DE.po | 874 +++++++++++++------------ webgui/locale/de_DE/LC_MESSAGES/yms.mo | Bin 22598 -> 23326 bytes webgui/manifest.json | 20 + webgui/manual.php | 3 +- webgui/provisions.php | 67 +- webgui/shapes/bavaria34.svg | 4 +- webgui/shapes/etap23.svg | 110 +++- webgui/shopping.php | 75 +++ webgui/storage.php | 22 +- webgui/task.php | 23 +- 22 files changed, 961 insertions(+), 484 deletions(-) create mode 100644 webgui/img/pwa-192.png create mode 100644 webgui/img/pwa-512.png create mode 100644 webgui/lib/db.inc create mode 100644 webgui/manifest.json create mode 100644 webgui/shopping.php diff --git a/INSTALL b/INSTALL index be117b4..930b82f 100644 --- a/INSTALL +++ b/INSTALL @@ -18,7 +18,7 @@ Yacht Management Software (YMS) Installation 1.3 Web GUI - Webserver -- PHP +- PHP (>= 8.0) - php-mysql - php-xml diff --git a/db/mariadb.sql b/db/mariadb.sql index 7dfd123..129af98 100644 --- a/db/mariadb.sql +++ b/db/mariadb.sql @@ -159,7 +159,7 @@ CREATE TABLE inventory ( weight float(5,2) UNSIGNED DEFAULT NULL, price decimal(12,2) DEFAULT NULL, purchdate date DEFAULT NULL, - invcond enum('unknown','new','good','normal','bad','repairable','defect') NOT NULL default 'unknown', + invcond enum('unknown','excellent','good','fair','bad','repairable','defect') NOT NULL default 'unknown', remarks varchar(150) DEFAULT NULL, PRIMARY KEY (invid), INDEX ix_invname (invname) @@ -178,7 +178,7 @@ CREATE TABLE cable ( color char(6) DEFAULT NULL, supplier smallint(6) DEFAULT NULL, manufacturer smallint(6) DEFAULT NULL, - cablecond enum('unknown','new','good','normal','bad','repairable','defect') NOT NULL default 'unknown', + cablecond enum('unknown','new','excellent','good','fair','bad','repairable','defect') NOT NULL default 'unknown', remarks varchar(150) DEFAULT NULL, PRIMARY KEY (cableid), INDEX ix_cablename (vid, cablename) @@ -222,11 +222,13 @@ CREATE TABLE provisions ( sid smallint(6) UNSIGNED DEFAULT NULL, boxid smallint(6) UNSIGNED NOT NULL DEFAULT 1, number smallint(6) UNSIGNED NOT NULL DEFAULT 1, + target smallint(6) UNSIGNED DEFAULT NULL, -- for shopping list weight float(5,2) UNSIGNED DEFAULT NULL, weight_net float(5,2) UNSIGNED DEFAULT NULL, unit tinyint(3) DEFAULT NULL, storedate date DEFAULT CURRENT_DATE, shelflife date DEFAULT NULL, + remarks varchar(150) DEFAULT NULL, PRIMARY KEY (provid) ) ENGINE=InnoDB; @@ -283,6 +285,7 @@ CREATE TABLE company ( customerno varchar(20), contractno varchar(20), remarks varchar(150) DEFAULT NULL, + flags set('deleted','historic') DEFAULT NULL, PRIMARY KEY (compid), UNIQUE INDEX ix_compname (compname, comptype) ) ENGINE=InnoDB; diff --git a/webgui/box.php b/webgui/box.php index ec65943..bdf6437 100644 --- a/webgui/box.php +++ b/webgui/box.php @@ -171,6 +171,11 @@ $box = $sth->fetch(PDO::FETCH_OBJ); echo '

', $box->label, "

\n"; +// Bootstrap grid +echo '
'; +echo '
'; +echo '
'; + echo '', "\n"; echo '\n"; echo '\n"; @@ -184,6 +189,46 @@ echo "
', _('Box type'),"", ($opt_boxtype[$box->boxtype] ?? ''), "
', _('Content'),"", $box->content, "
\n"; form_view_buttons($g_scriptname, $id); +echo '
'; // Column break +echo '
', "\n"; + +echo '
', "\n"; +echo '
', _('Images'), "
\n"; +echo '
', "\n"; + +$sql = "SELECT d.docid, d.title " + . "FROM docref AS r INNER JOIN document AS d using (docid) " + . "WHERE d.doctype='picture' AND r.reftype='box' AND r.refid=? " + . "ORDER BY d.title"; +$sth = $pdo->prepare($sql); +$sth->execute([$id]); +$res = $sth->fetchAll(); +// TODO hübsche Darstellung +$doccount = 0; +foreach ($res as $row) { + $doccount += 1; + echo '
'; + echo ''; +// echo ''; + echo '', $row['title'], ''; + echo "\n"; + // additionally direct download and go to document details page + echo '
'; + echo ' '; + echo ''; + echo "
\n"; + echo "\n"; // card-body +echo "
\n"; // card + +echo '
'; // col +echo '
'; // row +echo '
'; // container + // Inventory in box // WIP $sql = "SELECT invid, invname, weight, number FROM inventory WHERE conttype='box' AND boxid=?"; diff --git a/webgui/company.php b/webgui/company.php index 350db6e..0aa05ab 100644 --- a/webgui/company.php +++ b/webgui/company.php @@ -63,6 +63,8 @@ switch ($submit = form_get_action()) { $p[':customerno'] = gpc_get_string($_POST, 'customerno', 20); $p[':contractno'] = gpc_get_string($_POST, 'contractno', 20); $p[':remarks'] = gpc_get_string($_POST, 'remarks', 150); + $allowed = db_load_enum('company', 'flags'); + $p[':flags'] = gpc_get_set($_POST, 'flags', $allowed, true, NULL); db_exec_update('company', $p, 'compid'); $action = ACT_VIEW; break; @@ -136,7 +138,7 @@ $page = gpc_get_int($_REQUEST, 'p', 1); $rows_pp = gpc_get_int($_REQUEST, 'n', $user->rows_pp); $lastpage = ceil($numrows/$rows_pp); -$sql = "SELECT compid, compname, comptype, remarks " +$sql = "SELECT compid, compname, comptype, remarks, flags " . "FROM company"; if ($where) $sql .= ' WHERE ' . $where; $sql .= $order; @@ -212,6 +214,14 @@ foreach ($res as $row) { echo "\n"; echo '', $i; echo '', "\n"; + // icons for some flags + $flags = explode(',', $row['flags']); + if (in_array('historic', $flags)) { + echo ''; + } + if (in_array('deleted', $flags)) { + echo ''; + } echo "\n"; echo "", $row['compname'], "\n"; echo "", $opt_comptype[$row['comptype']], "\n"; @@ -251,7 +261,7 @@ elseif ($action == ACT_VIEW): // ========== VARIANT: view single record ===================================== $sql = "SELECT compname, comptype, comptype2, shortname, street, zip, city," - . " country, contact, phone, email, web, customerno, contractno, remarks " + . " country, contact, phone, email, web, customerno, contractno, remarks, flags " . "FROM company " . "WHERE compid=?"; $sth = $pdo->prepare($sql); @@ -283,6 +293,7 @@ echo make_weblink($company->web), ' ', $company->web, "\n"; echo '', _('Customer no.'),"", $company->customerno, "\n"; echo '', _('Contract no.'),"", $company->contractno, "\n"; echo '', _('Remarks'),"", $company->remarks, "\n"; +echo '', _('Flags'),"", $company->flags, "\n"; echo "\n"; form_view_buttons($g_scriptname, $id); @@ -330,7 +341,7 @@ elseif ($action == ACT_EDIT): echo '

', _('Edit Company'), "

\n"; $sql = "SELECT compname, comptype, comptype2, street, zip, city, country," - . " contact, phone, email, web, customerno, contractno, remarks " + . " contact, phone, email, web, customerno, contractno, remarks, flags " . "FROM company " . "WHERE compid=?"; $sth = $pdo->prepare($sql); @@ -409,6 +420,10 @@ form_create_select('comptype2', _('Secondary company type'), $g_opt_none + $opt_
+flags)); +?> diff --git a/webgui/documents.php b/webgui/documents.php index d7156c3..4eb8de2 100644 --- a/webgui/documents.php +++ b/webgui/documents.php @@ -6,6 +6,14 @@ * SPDX-License-Identifier: WTFPL ******************************************************************************/ +/* +doctype icons + generic: file-earmark + image: file-earmark-image + drawing: file-earmark-easel + pdf: file-earmark-pdf +*/ + require 'globals.inc'; require 'lib/gpc.inc'; require 'lib/fileutils.inc'; @@ -143,6 +151,12 @@ switch ($submit = form_get_action()) { break; case 'delete': + // check user rights + if ($user->role == ROLE_SAILOR) { + $g_error->Add(_('User level allows no deletion!')); + $action = ACT_VIEW; + break; + } // Security token needed! if (gpc_get_string($_POST, 'token', 16) != $_SESSION['token']) { $g_error->Add(_('Delete prohibited, invalid security token!')); @@ -189,21 +203,18 @@ switch ($submit = form_get_action()) { $p[':docid'] = $id; $p[':refid'] = gpc_get_int($_POST, 'refid'); $p[':reftype'] = gpc_get_enum($_POST, 'reftype', $opt_reftype, 'equipment'); - /* $sql = "INSERT INTO docref " - . " (docid, refid, reftype) " - . "VALUES " - . " (:docid, :refid, :reftype)"; - $sth = $pdo->prepare($sql); - $sth->bindValue(':docid', $id, PDO::PARAM_INT); - $sth->bindValue(':refid', $refid, PDO::PARAM_INT); - $sth->bindValue(':reftype', $reftype, PDO::PARAM_STR); - $sth->execute(); */ db_exec_insert('docref', $p); $action = ACT_VIEW; break; case 'delref': // remove only link, not critical so get without token is ok + // check user rights + if ($user->role == ROLE_SAILOR) { + $g_error->Add(_('User level allows no deletion!')); + $action = ACT_VIEW; + break; + } $drid = gpc_get_int($_GET, 'drid'); $sql = "DELETE FROM docref WHERE drid=?"; $sth = $pdo->prepare($sql); @@ -582,6 +593,18 @@ foreach ($sth->fetchAll() as $row) { $compids[] = $row['refid']; } +// Boxes +$boxids = array(); +$sql = "SELECT drid, reftype, refid, CONCAT_WS(' - ', label, NULLIF(content, '')) AS target " + . "FROM docref INNER JOIN box ON (docref.reftype='box' AND docref.refid=box.boxid) " + . "WHERE docid=?"; +$sth = $pdo->prepare($sql); +$sth->execute([$id]); +foreach ($sth->fetchAll() as $row) { + $references[] = $row; + $boxids[] = $row['refid']; +} + echo '', "\n"; echo "\n"; echo ""; @@ -600,6 +623,8 @@ foreach ($references as $ref) { echo ''; } elseif ($ref['reftype'] == 'company') { echo ''; + } elseif ($ref['reftype'] == 'box') { + echo ''; } echo ""; echo ""; @@ -616,18 +641,12 @@ echo '

', _('Add new reference'), "

\n"; // enum('vessel','box','equipment','project','task','user','company') // +// Reference options +$opt_reference = db_load_enum('docref', 'reftype', lookup:true, as_dict:true); // Equipment options // Do not include equipment that has already been referenced in the list! -$opt_equipment = array(); -$sql = "SELECT eid, ename FROM equipment WHERE vid=? ORDER BY ename"; -$sth = $pdo->prepare($sql); -$sth->execute([$user->vid]); -foreach ($sth->fetchAll() as $row) { - if (!in_array($row['eid'], $eids)) { - $opt_equipment[$row['eid']] = $row['ename']; - } -} +$opt_equipment = db_get_opt_equip($user->vid, exclude:$eids) ?> @@ -656,8 +675,6 @@ foreach ($sth->fetchAll() as $row) { $opt_company[$row['compid']] = $row['compname']; } } - - ?> @@ -673,6 +690,23 @@ foreach ($opt_company as $k => $v) { +vid, exclude:$boxids) +?> + + + + + + +\n"; echo "\n"; echo "\n"; echo "\n"; @@ -624,7 +637,7 @@ foreach ($sth->fetchAll() as $row) { } $sql = "SELECT eid, ename, model, serial, weight, price, purchdate," - . " supplier, manufacturer, ecat, shortname, remarks " + . " supplier, manufacturer, ecat, shortname, remarks, flags " . "FROM equipment " . "WHERE eid=?"; $sth = $pdo->prepare($sql); @@ -671,6 +684,10 @@ form_create_select('category', _('Category'), $g_opt_unknown + $opt_ecat, $equip +flags)); +?> diff --git a/webgui/globals.inc b/webgui/globals.inc index 49d8ddc..5d98c32 100644 --- a/webgui/globals.inc +++ b/webgui/globals.inc @@ -39,6 +39,11 @@ define ('ACT_UNLINK', 11); define ('ACT_MAIL', 12); define ('ACT_VIEW_LIST', 13); +define('ROLE_VESSEL', 'vessel'); +define('ROLE_CAPTAIN', 'captain'); +define('ROLE_HELMSMAN', 'helmsman'); +define('ROLE_SAILOR', 'sailor'); + // ========== PAGE START CODE ================================================= // global version string @@ -396,8 +401,8 @@ function db_exec_insert($table, $params) { global $pdo; global $g_error; $keys = array_keys($params); - $fields = join(',', array_map(function($s) { return ltrim($s, ':'); }, $keys)); - $pnames = join(',', $keys); + $fields = join(', ', array_map(function($s) { return ltrim($s, ':'); }, $keys)); + $pnames = join(', ', $keys); $sql = "INSERT INTO $table ($fields) VALUES ($pnames)"; // $sth = $pdo->prepare("INSERT INTO $table ($fields) VALUES ($pnames)"); $sth = $pdo->prepare($sql); @@ -433,7 +438,7 @@ function db_exec_update($table, $params, $pk) { unset($fields[':'.$pk]); $where = "$pk=:$pk"; } - $fieldlist = join(',', array_map(fn($s) => ltrim($s, ':') . '=' . $s, array_keys($fields))); + $fieldlist = join(', ', array_map(fn($s) => ltrim($s, ':') . '=' . $s, array_keys($fields))); $sql = "UPDATE $table SET $fieldlist WHERE $where"; $sth = $pdo->prepare($sql); try { @@ -526,12 +531,15 @@ function get_enum($enum) { 'drawing' => _('Drawing'), 'equipment' => _('Equipment'), 'estimated' => _('Estimated'), + 'excellent' => _('Excellent'), + 'fair' => _('Fair'), 'finished' => _('Finished'), 'fixed' => _('Fixed'), 'fuse' => _('Fuse'), 'generic' => _('Generic'), 'good' => _('Good'), 'high' => _('High'), + 'historic' => _('Historic'), 'invoice' => _('Invoice'), 'locked' => _('Locked'), 'low' => _('Low'), @@ -806,7 +814,7 @@ function db_get_opt_storage($vid) { return $list; } -function db_get_opt_box($vid) { +function db_get_opt_box($vid, $exclude=[]) { global $pdo; global $g_error; $list = array(); @@ -821,12 +829,14 @@ function db_get_opt_box($vid) { $g_error->Add($e->getMessage()); } foreach ($sth->fetchAll(PDO::FETCH_NUM) as $rec) { - $list[$rec[0]] = $rec[1] . ' - '. $rec[2]; + if (! in_array($rec[0], $exclude)) { + $list[$rec[0]] = $rec[1] . ($rec[2] ? ' - '. $rec[2] : ''); + } } return $list; } -function db_get_opt_equip($vid, $default=NULL) { +function db_get_opt_equip($vid, $default=NULL, $exclude=[]) { global $pdo; global $g_error; if (isset($default)) { @@ -842,7 +852,9 @@ function db_get_opt_equip($vid, $default=NULL) { $g_error->Add($e->getMessage()); } foreach ($sth->fetchAll(PDO::FETCH_NUM) as $rec) { - $list[$rec[0]] = $rec[1]; + if (! in_array($rec[0], $exclude)) { + $list[$rec[0]] = $rec[1]; + } } return $list; } @@ -1050,11 +1062,21 @@ function form_create_select($fieldname, $label, $optlist, $selval=NULL, $multipl echo "\n"; } -function form_create_checks($fieldname, $label, $optlist, $selected) { - echo '
', "\n"; - echo '\n"; - print_r($optlist); - echo "
\n"; +function form_create_checks($fieldname, $label, $optlist, $selected = []) { + echo '
'; + echo '', $label, "\n"; + echo '
'; + foreach ($optlist as $k => $v) { + echo '
'; + $checked = in_array($k, $selected, true) ? ' checked' : ''; + echo ''; + echo '
'; + } + echo '
'; + echo '
'; } // TODO DEPRECATED for touch multiple adjacent buttuns are not well suited. @@ -1418,7 +1440,7 @@ function make_weblink($dest) { } elseif (!in_array($scheme, ['http', 'https'], true)) { return ''; } - return ''; + return ''; } function make_maillink($dest) { diff --git a/webgui/img/pwa-192.png b/webgui/img/pwa-192.png new file mode 100644 index 0000000000000000000000000000000000000000..9429b13cef569f434d6cb4c40eff8d91b9faddcd GIT binary patch literal 14314 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 Y2b2@7@ir6O>Hq)$07*qoM6N<$f_Ql@H2?qr literal 0 HcmV?d00001 diff --git a/webgui/img/pwa-512.png b/webgui/img/pwa-512.png new file mode 100644 index 0000000000000000000000000000000000000000..85175f18eacc0479a5313321679bfa5f810ce217 GIT binary patch literal 43498 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 N)K#>U>mk+={|}wrw5R|8 literal 0 HcmV?d00001 diff --git a/webgui/index.php b/webgui/index.php index 1767ded..3e0222a 100644 --- a/webgui/index.php +++ b/webgui/index.php @@ -242,7 +242,11 @@ if (isset($vessel->loa)) { $h = round($row['wy'] * $f); $x = round($row['x'] * $f - $w / 2.0); $y = round($row['y'] * $f + $shape['height'] / 2.0 - $h / 2.0); - $rect = $g->addChild('rect'); + + $a = $g->addChild('a'); + $a->addAttribute('href', 'storage.php?f=view&id=' . $row['sid']); + + $rect = $a->addChild('rect'); $rect->addChild('title', $row['sname']); $rect->addAttribute('x', $x); $rect->addAttribute('y', $y); diff --git a/webgui/inventory.php b/webgui/inventory.php index 0a4ae2b..8888bc8 100644 --- a/webgui/inventory.php +++ b/webgui/inventory.php @@ -121,7 +121,7 @@ if ($action == ACT_DEFAULT): page_caption_search($pagetitle); -$flt = db_get_filter($user->id, 201, ['cond','name','txt']); +$flt = db_get_filter($user->id, 201, ['stor', 'cond','txt']); /* The only way to find out whether the inventory is on the current boat is to use @@ -301,7 +301,7 @@ echo '

', _('Add Inventory'), "

\n";
- +
@@ -310,12 +310,14 @@ echo '

', _('Add Inventory'), "

\n";
id, 201, ['stor','cond','txt']); +form_create_select('sid', _('Storage'), $g_opt_none + $opt_storage, $flt->stor); form_create_select('boxid', _('Box'), $g_opt_none + $opt_box); ?>
@@ -371,7 +373,10 @@ echo '
\n"; echo "\n"; diff --git a/webgui/lib/db.inc b/webgui/lib/db.inc new file mode 100644 index 0000000..a54699e --- /dev/null +++ b/webgui/lib/db.inc @@ -0,0 +1,10 @@ +\n" "Language-Team: LANGUAGE \n" @@ -16,58 +16,59 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: box.php:19 index.php:352 +#: box.php:19 index.php:353 globals.inc:1536 msgid "Boxes" msgstr "Kisten" #: box.php:70 checklist.php:59 maintenance.php:66 note.php:71 projects.php:96 -#: settings.php:45 storage.php:92 task.php:110 +#: settings.php:54 storage.php:92 task.php:111 #, php-format msgid "Unknown function '%s'!" msgstr "Unbekannte Funktion '%s'!" -#: box.php:94 box.php:134 box.php:250 storage.php:165 +#: box.php:94 box.php:134 box.php:295 storage.php:165 msgid "Label" msgstr "Etikett" -#: box.php:95 cable.php:177 cable.php:206 cable.php:239 company.php:203 -#: company.php:266 documents.php:374 documents.php:589 fuse.php:156 +#: box.php:95 cable.php:177 cable.php:206 cable.php:239 company.php:205 +#: company.php:276 documents.php:385 documents.php:612 fuse.php:156 #: fuse.php:207 fuse.php:232 note.php:104 note.php:179 storage.php:206 -#: storage.php:300 +#: storage.php:320 msgid "Type" msgstr "Typ" -#: box.php:96 box.php:177 box.php:259 cable.php:131 cable.php:212 cable.php:262 +#: box.php:96 box.php:182 box.php:304 cable.php:131 cable.php:212 cable.php:262 #: dropdown.php:44 dropdown.php:187 dropdown.php:235 storage.php:166 #: storage.php:233 tag.php:119 tag.php:181 tag.php:265 msgid "Color" msgstr "Farbe" -#: box.php:97 box.php:148 box.php:176 box.php:255 storage.php:167 +#: box.php:97 box.php:148 box.php:181 box.php:300 storage.php:167 msgid "Content" msgstr "Inhalt" -#: box.php:98 box.php:178 box.php:203 cable.php:211 equipment.php:451 -#: index.php:360 index.php:376 inventory.php:379 provisions.php:272 +#: box.php:98 box.php:183 box.php:248 cable.php:211 equipment.php:464 +#: index.php:361 index.php:377 inventory.php:381 provisions.php:284 msgid "Weight" msgstr "Gewicht" -#: box.php:106 box.php:180 box.php:210 cable.php:141 company.php:214 -#: company.php:299 documents.php:388 documents.php:600 documents.php:602 -#: dropdown.php:156 equipment.php:376 equipment.php:447 equipment.php:545 -#: equipment.php:568 equipment.php:590 fuse.php:167 inventory.php:273 -#: maintenance.php:190 measurement.php:227 projects.php:210 projects.php:258 -#: projects.php:346 provisions.php:195 storage.php:131 storage.php:175 -#: storage.php:252 tag.php:128 task.php:231 globals.inc:1049 +#: box.php:106 box.php:185 box.php:255 cable.php:141 company.php:216 +#: company.php:310 documents.php:399 documents.php:623 documents.php:625 +#: documents.php:627 dropdown.php:156 equipment.php:378 equipment.php:460 +#: equipment.php:558 equipment.php:581 equipment.php:603 fuse.php:167 +#: inventory.php:273 maintenance.php:190 measurement.php:227 projects.php:210 +#: projects.php:258 projects.php:346 provisions.php:198 storage.php:131 +#: storage.php:175 storage.php:252 storage.php:271 tag.php:128 task.php:248 +#: globals.inc:1085 msgid "View" msgstr "Ansehen" -#: box.php:115 cable.php:151 company.php:221 documents.php:396 dropdown.php:162 -#: equipment.php:386 equipment_js.php:247 fuse.php:176 index.php:317 +#: box.php:115 cable.php:151 company.php:231 documents.php:407 dropdown.php:162 +#: equipment.php:399 equipment_js.php:247 fuse.php:176 index.php:318 #: inventory.php:284 maintenance.php:197 maintenance.php:318 #: measurement.php:235 projects.php:219 projects.php:264 projects.php:351 -#: provisions.php:214 storage.php:143 storage.php:182 tag.php:136 task.php:239 -#: task.php:315 globals.inc:1050 globals.inc:1066 +#: provisions.php:219 storage.php:143 storage.php:182 tag.php:136 task.php:256 +#: task.php:332 globals.inc:1086 globals.inc:1102 msgid "Edit" msgstr "Bearbeiten" @@ -75,141 +76,158 @@ msgstr "Bearbeiten" msgid "Add Box" msgstr "Kiste hinzufügen" -#: box.php:138 box.php:179 box.php:266 index.php:400 inventory.php:208 -#: inventory.php:314 inventory.php:318 inventory.php:372 inventory.php:422 -#: provisions.php:250 provisions.php:278 provisions.php:326 storage.php:12 -#: globals.inc:542 +#: box.php:138 box.php:184 box.php:311 inventory.php:208 inventory.php:313 +#: inventory.php:320 inventory.php:374 inventory.php:424 provisions.php:260 +#: provisions.php:290 provisions.php:344 storage.php:12 storage.php:225 +#: globals.inc:564 globals.inc:1532 msgid "Storage" msgstr "Stauraum" -#: box.php:152 box.php:182 box.php:268 cable.php:214 cable.php:269 -#: company.php:204 company.php:285 company.php:409 documents.php:419 -#: documents.php:527 documents.php:744 equipment.php:358 equipment.php:418 -#: equipment.php:456 equipment.php:671 equipment_js.php:69 fuse.php:237 -#: index.php:438 index.php:558 inventory.php:383 inventory.php:450 +#: box.php:152 box.php:187 box.php:313 cable.php:214 cable.php:269 +#: company.php:206 company.php:295 company.php:420 documents.php:430 +#: documents.php:538 documents.php:778 equipment.php:360 equipment.php:431 +#: equipment.php:469 equipment.php:684 equipment_js.php:69 fuse.php:237 +#: index.php:445 index.php:555 inventory.php:385 inventory.php:452 #: maintenance.php:180 maintenance.php:280 maintenance.php:350 projects.php:176 #: projects.php:200 projects.php:290 projects.php:317 projects.php:403 -#: storage.php:122 storage.php:234 storage.php:340 +#: provisions.php:291 provisions.php:347 storage.php:122 storage.php:234 +#: storage.php:360 msgid "Remarks" msgstr "Bemerkungen" -#: box.php:156 company.php:245 company.php:412 documents.php:444 -#: documents.php:747 equipment.php:422 equipment.php:674 equipment_js.php:116 -#: equipment_js.php:283 index.php:442 inventory.php:322 maintenance.php:238 +#: box.php:156 company.php:255 company.php:427 documents.php:455 +#: documents.php:781 equipment.php:435 equipment.php:691 equipment_js.php:116 +#: equipment_js.php:283 index.php:449 inventory.php:324 maintenance.php:238 #: measurement.php:284 note.php:158 projects.php:293 projects.php:406 -#: provisions.php:252 settings.php:125 storage.php:208 storage.php:343 -#: task.php:269 globals.inc:1076 globals.inc:1083 +#: provisions.php:262 settings.php:146 storage.php:208 storage.php:363 +#: task.php:286 globals.inc:1112 globals.inc:1119 msgid "Save" msgstr "Speichern" -#: box.php:157 company.php:246 company.php:413 company.php:439 -#: documents.php:445 documents.php:748 dropdown.php:214 dropdown.php:281 -#: equipment.php:423 equipment.php:675 equipment_js.php:117 -#: equipment_js.php:251 equipment_js.php:284 index.php:443 inventory.php:323 +#: box.php:157 company.php:256 company.php:428 company.php:454 +#: documents.php:456 documents.php:782 dropdown.php:214 dropdown.php:281 +#: equipment.php:436 equipment.php:692 equipment_js.php:117 +#: equipment_js.php:251 equipment_js.php:284 index.php:450 inventory.php:325 #: maintenance.php:239 measurement.php:285 note.php:159 projects.php:294 -#: projects.php:407 provisions.php:253 search.php:36 settings.php:126 -#: storage.php:209 storage.php:344 task.php:270 globals.inc:1070 -#: globals.inc:1077 globals.inc:1084 globals.inc:1094 +#: projects.php:407 provisions.php:263 provisions.php:385 search.php:36 +#: settings.php:147 storage.php:209 storage.php:364 task.php:287 +#: globals.inc:1106 globals.inc:1113 globals.inc:1120 globals.inc:1130 msgid "Back" msgstr "Zurück" -#: box.php:175 box.php:253 inventory.php:369 +#: box.php:180 box.php:298 inventory.php:371 msgid "Box type" msgstr "Kistentyp" -#: box.php:194 +#: box.php:196 +msgid "Images" +msgstr "Bilder" + +#: box.php:217 +msgid "View image details" +msgstr "Bilddetails ansehen" + +#: box.php:218 +msgid "Download image" +msgstr "Bild herunterladen" + +#: box.php:223 +msgid "No referenced images" +msgstr "Keine verknüpften Bilder" + +#: box.php:239 msgid "Inventory in box" msgstr "Inventar in der Kiste" -#: box.php:201 index.php:374 inventory.php:12 search.php:80 globals.inc:1460 +#: box.php:246 index.php:375 inventory.php:12 search.php:80 globals.inc:1500 msgid "Inventory" msgstr "Inventar" -#: box.php:202 dropdown.php:150 inventory.php:261 inventory.php:307 -#: inventory.php:378 inventory.php:412 provisions.php:180 provisions.php:238 -#: provisions.php:271 provisions.php:302 +#: box.php:247 dropdown.php:150 inventory.php:261 inventory.php:307 +#: inventory.php:380 inventory.php:414 provisions.php:183 provisions.php:248 +#: provisions.php:282 provisions.php:316 msgid "Number" msgstr "Anzahl" -#: box.php:230 +#: box.php:275 msgid "Box is empty" msgstr "Kiste ist leer" -#: box.php:243 documents.php:337 inventory.php:19 inventory.php:194 -#: maintenance.php:87 measurement.php:174 globals.inc:130 globals.inc:131 +#: box.php:288 documents.php:348 inventory.php:19 inventory.php:194 +#: maintenance.php:87 measurement.php:174 globals.inc:135 globals.inc:136 msgid "― none ―" msgstr "― keine ―" -#: box.php:245 +#: box.php:290 msgid "Edit Box" msgstr "Kiste bearbeiten" -#: box.php:263 equipment.php:655 inventory.php:416 provisions.php:306 +#: box.php:308 equipment.php:668 inventory.php:418 provisions.php:324 msgid "Weight, kg" msgstr "Gewicht, kg" -#: box.php:282 cable.php:298 checklist.php:170 company.php:450 -#: documents.php:781 dropdown.php:287 equipment.php:701 equipment_js.php:293 -#: fuse.php:290 index.php:569 inventory.php:478 maintenance.php:371 -#: measurement.php:369 note.php:226 projects.php:419 provisions.php:340 -#: settings.php:132 storage.php:370 tag.php:294 task.php:398 +#: box.php:327 cable.php:298 checklist.php:170 company.php:465 +#: documents.php:815 dropdown.php:287 equipment.php:718 equipment_js.php:293 +#: fuse.php:290 index.php:566 inventory.php:480 maintenance.php:371 +#: measurement.php:369 note.php:226 projects.php:419 provisions.php:391 +#: settings.php:153 storage.php:390 tag.php:294 task.php:415 msgid "Unknown function call: Please report to system development!" msgstr "Unbekannter Funktionsaufruf: Bitte der Systementwickelung melden!" -#: cable.php:12 index.php:409 +#: cable.php:12 globals.inc:1540 msgid "Cables" msgstr "Kabel" -#: cable.php:70 company.php:73 documents.php:148 equipment.php:84 fuse.php:71 +#: cable.php:70 company.php:75 documents.php:162 equipment.php:86 fuse.php:71 #: inventory.php:96 measurement.php:116 note.php:49 projects.php:86 -#: provisions.php:73 storage.php:60 tag.php:57 task.php:87 +#: provisions.php:76 storage.php:60 tag.php:57 task.php:88 msgid "Delete prohibited, invalid security token!" msgstr "Löschen verboten, ungültiger Sicherheitstoken!" -#: cable.php:79 company.php:85 documents.php:216 dropdown.php:113 -#: equipment.php:219 fuse.php:82 index.php:89 inventory.php:108 -#: measurement.php:125 provisions.php:82 tag.php:68 +#: cable.php:79 company.php:87 documents.php:227 dropdown.php:113 +#: equipment.php:221 fuse.php:82 index.php:90 inventory.php:108 +#: measurement.php:125 provisions.php:85 tag.php:68 #, php-format msgid "Unknown function!" msgstr "Unbekannte Funktion!" -#: cable.php:110 company.php:186 documents.php:357 equipment.php:337 +#: cable.php:110 company.php:188 documents.php:368 equipment.php:339 #: fuse.php:135 inventory.php:244 maintenance.php:114 measurement.php:187 -#: projects.php:181 provisions.php:164 tag.php:101 task.php:201 +#: projects.php:181 provisions.php:167 tag.php:101 task.php:218 msgid "Apply" msgstr "Anwenden" -#: cable.php:110 company.php:186 documents.php:357 equipment.php:337 +#: cable.php:110 company.php:188 documents.php:368 equipment.php:339 #: fuse.php:135 inventory.php:244 maintenance.php:114 measurement.php:187 -#: projects.php:181 provisions.php:164 tag.php:101 task.php:201 +#: projects.php:181 provisions.php:167 tag.php:101 task.php:218 msgid "Go" msgstr "Start" -#: cable.php:111 company.php:187 documents.php:358 equipment.php:338 +#: cable.php:111 company.php:189 documents.php:369 equipment.php:340 #: fuse.php:136 inventory.php:245 maintenance.php:115 measurement.php:188 -#: projects.php:182 provisions.php:165 tag.php:102 task.php:202 +#: projects.php:182 provisions.php:168 tag.php:102 task.php:219 msgid "Reset filter to defaults" msgstr "Filter auf Standard zurücksetzen" -#: cable.php:111 company.php:187 documents.php:358 equipment.php:338 +#: cable.php:111 company.php:189 documents.php:369 equipment.php:340 #: fuse.php:136 inventory.php:245 maintenance.php:115 measurement.php:188 -#: projects.php:182 provisions.php:165 tag.php:102 task.php:202 +#: projects.php:182 provisions.php:168 tag.php:102 task.php:219 msgid "Clear" msgstr "Löschen" -#: cable.php:126 cable.php:205 fuse.php:235 globals.inc:504 +#: cable.php:126 cable.php:205 fuse.php:235 globals.inc:523 msgid "Cable" msgstr "Kabel" -#: cable.php:127 cable.php:169 cable.php:235 checklist.php:153 company.php:202 -#: company.php:241 company.php:264 company.php:344 dropdown.php:185 -#: dropdown.php:233 equipment.php:406 equipment.php:638 equipment_js.php:101 -#: equipment_js.php:268 index.php:430 inventory.php:259 inventory.php:303 -#: inventory.php:408 measurement.php:256 measurement.php:303 +#: cable.php:127 cable.php:169 cable.php:235 checklist.php:153 company.php:204 +#: company.php:251 company.php:274 company.php:355 dropdown.php:185 +#: dropdown.php:233 equipment.php:419 equipment.php:651 equipment_js.php:101 +#: equipment_js.php:268 index.php:437 inventory.php:259 inventory.php:303 +#: inventory.php:410 measurement.php:256 measurement.php:303 #: measurement.php:333 projects.php:169 projects.php:196 projects.php:245 -#: projects.php:283 projects.php:310 projects.php:377 provisions.php:234 -#: provisions.php:298 storage.php:120 storage.php:202 storage.php:296 -#: tag.php:156 task.php:348 +#: projects.php:283 projects.php:310 projects.php:377 provisions.php:244 +#: provisions.php:312 storage.php:120 storage.php:202 storage.php:316 +#: tag.php:156 task.php:365 msgid "Name" msgstr "Name" @@ -226,7 +244,7 @@ msgid "Cross section" msgstr "Querschnitt" #: cable.php:132 cable.php:213 cable.php:266 inventory.php:222 -#: inventory.php:262 inventory.php:382 inventory.php:434 +#: inventory.php:262 inventory.php:384 inventory.php:436 msgid "Condition" msgstr "Zustand" @@ -270,18 +288,17 @@ msgstr "Kabel löschen" msgid "Tag is not used anywhere" msgstr "Unbenutzte Tags" -#: checklist.php:12 index.php:411 +#: checklist.php:12 globals.inc:1548 msgid "Checklists" msgstr "Checklisten" -#: checklist.php:81 checklist.php:108 checklist.php:125 documents.php:376 -#: documents.php:415 documents.php:526 documents.php:726 +#: checklist.php:81 checklist.php:108 checklist.php:125 documents.php:387 +#: documents.php:426 documents.php:537 documents.php:760 msgid "Title" msgstr "Titel" #: checklist.php:82 checklist.php:126 checklist.php:157 maintenance.php:282 #: projects.php:173 projects.php:199 projects.php:246 projects.php:316 -#: task.php:193 msgid "State" msgstr "Status" @@ -301,115 +318,128 @@ msgstr "Checkliste bearbeiten" msgid "Delete checklist" msgstr "Lösche Checkliste" -#: company.php:12 documents.php:665 globals.inc:508 +#: company.php:12 documents.php:682 globals.inc:527 msgid "Company" msgstr "Firma" -#: company.php:80 +#: company.php:82 #, php-format msgid "Deleted company no. %d" msgstr "Firma Nr. %d gelöscht" -#: company.php:159 documents.php:310 inventory.php:193 inventory.php:226 -#: maintenance.php:86 measurement.php:173 globals.inc:129 +#: company.php:161 documents.php:321 inventory.php:193 inventory.php:226 +#: maintenance.php:86 measurement.php:173 globals.inc:134 msgid "― all ―" msgstr "― alle ―" -#: company.php:237 +#: company.php:220 +msgid "Historic company" +msgstr "Historische Firma" + +#: company.php:223 equipment.php:385 globals.inc:529 +msgid "Deleted" +msgstr "Gelöscht" + +#: company.php:247 msgid "Add Company" msgstr "Firma hinzufügen" -#: company.php:244 company.php:352 +#: company.php:254 company.php:363 msgid "Company type" msgstr "Firmenart" -#: company.php:265 company.php:348 equipment.php:445 equipment.php:642 +#: company.php:275 company.php:359 equipment.php:458 equipment.php:655 msgid "Short name" msgstr "Kurzbezeichnung" -#: company.php:267 +#: company.php:277 msgid "Secondary type" msgstr "Sekundärer Typ" -#: company.php:268 company.php:369 +#: company.php:278 company.php:380 msgid "Street" msgstr "Straße" -#: company.php:269 +#: company.php:279 msgid "Zip, City" msgstr "PLZ, Ort" -#: company.php:270 company.php:381 +#: company.php:280 company.php:392 msgid "Country" msgstr "Land" -#: company.php:271 company.php:385 +#: company.php:281 company.php:396 msgid "Contact" msgstr "Ansprechparter" -#: company.php:273 company.php:389 +#: company.php:283 company.php:400 msgid "Phone" msgstr "Telefon" -#: company.php:276 company.php:393 +#: company.php:286 company.php:404 msgid "Email" msgstr "Email" -#: company.php:279 company.php:397 +#: company.php:289 company.php:408 msgid "Web" msgstr "Web" -#: company.php:283 company.php:401 +#: company.php:293 company.php:412 msgid "Customer no." msgstr "Kundennr." -#: company.php:284 company.php:405 +#: company.php:294 company.php:416 msgid "Contract no." msgstr "Kontraktnr." -#: company.php:304 +#: company.php:296 company.php:425 dropdown.php:189 equipment.php:333 +#: equipment.php:470 equipment.php:689 +msgid "Flags" +msgstr "" + +#: company.php:315 msgid "Not referenced in any equipment" msgstr "In keiner Ausrüstung benutzt" -#: company.php:314 +#: company.php:325 msgid "Invoices" msgstr "Rechnungen" -#: company.php:324 +#: company.php:335 msgid "No invoices" msgstr "Keine Rechnungen" -#: company.php:330 +#: company.php:341 msgid "Edit Company" msgstr "Firma bearbeiten" -#: company.php:366 +#: company.php:377 msgid "Secondary company type" msgstr "Sekundärer Firmentyp" -#: company.php:373 +#: company.php:384 msgid "Zip" msgstr "PLZ" -#: company.php:377 +#: company.php:388 msgid "City" msgstr "Stadt" -#: company.php:425 +#: company.php:440 msgid "Delete Company" msgstr "Firma löschen" -#: company.php:426 documents.php:768 equipment.php:690 inventory.php:468 -#: note.php:217 storage.php:359 +#: company.php:441 documents.php:802 equipment.php:707 inventory.php:470 +#: note.php:217 storage.php:379 #, php-format msgid "Record no. %d" msgstr "Datensatz Nr. %d" -#: company.php:438 +#: company.php:453 msgid "Company can not be deleted as there are equipment-references!" msgstr "Firma kann nicht gelöscht werden da Ausrüstung zugeordnet ist!" -#: company.php:442 +#: company.php:457 msgid "" "Deleting a company is final. There is no way back. Only delete if you are " "absolute sure." @@ -425,176 +455,185 @@ msgstr "Neuer GD Imagestream kann nicht initialisiert werden" msgid "Resource not found!" msgstr "Resource nicht gefunden!" -#: documents.php:13 index.php:380 task.php:326 globals.inc:1464 +#: documents.php:21 index.php:381 task.php:343 globals.inc:1516 msgid "Documents" msgstr "Dokumente" -#: documents.php:53 +#: documents.php:61 msgid "Invalid file upload parameters." msgstr "Ungültige Dateiupload-Einstellungen" -#: documents.php:58 +#: documents.php:66 msgid "Exceeded filesize limit." msgstr "Größenlimit für Datei überschritten" -#: documents.php:63 +#: documents.php:71 msgid "No file for upload submitted. Try again by selecting a file first." msgstr "" "Keine Datei für den Upload angegeben. Beim nächsten Versuch zuerst Datei " "auswählen." -#: documents.php:75 equipment.php:127 +#: documents.php:83 equipment.php:129 #, php-format msgid "Mimetype '%s' not allowed for upload." msgstr "Dateityp '%s' nicht zum Hochladen zugelassen." -#: documents.php:80 +#: documents.php:88 #, php-format msgid "Mimetype mismatch: '%s'." msgstr "Konflikt beim Dateityp: '%s'" -#: documents.php:95 +#: documents.php:103 msgid "Document already exists!" msgstr "Dokument existiert bereits!" -#: documents.php:101 equipment.php:135 +#: documents.php:109 equipment.php:137 #, php-format msgid "File to big: %s.%s" msgstr "Datei zu groß: %s.%s" -#: documents.php:169 +#: documents.php:156 documents.php:214 +msgid "User level allows no deletion!" +msgstr "Benutzerlevel erlaubt keine Löschungen!" + +#: documents.php:183 #, php-format msgid "Removed %d references" msgstr "%d Referenzen entfernt" -#: documents.php:174 +#: documents.php:188 #, php-format msgid "Deleted document %s" msgstr "Dokument %s gelöscht" -#: documents.php:180 +#: documents.php:194 #, php-format msgid "SQL-Error: %s" msgstr "SQL-Fehler: %s" -#: documents.php:211 +#: documents.php:222 msgid "Removed document reference" msgstr "Dokumentreferenz wurde entfernt" -#: documents.php:334 note.php:103 +#: documents.php:345 note.php:103 msgid "Reference" msgstr "Referenz" -#: documents.php:375 documents.php:523 documents.php:722 +#: documents.php:386 documents.php:534 documents.php:756 msgid "Filename" msgstr "Dateiname" -#: documents.php:377 +#: documents.php:388 msgid "Links" msgstr "Verknüpfungen" -#: documents.php:411 +#: documents.php:422 msgid "Add Document" msgstr "Dokument hinzufügen" -#: documents.php:423 +#: documents.php:434 msgid "Document" msgstr "Dokument" -#: documents.php:426 +#: documents.php:437 msgid "Clear selection" msgstr "Auswah leeren" -#: documents.php:462 +#: documents.php:473 msgid "View Document" msgstr "Dokument ansehen" -#: documents.php:467 documents.php:737 +#: documents.php:478 documents.php:771 msgid "Document type" msgstr "Dokumentenart" -#: documents.php:470 +#: documents.php:481 msgid "Preview" msgstr "Vorschau" -#: documents.php:504 globals.inc:512 +#: documents.php:515 globals.inc:531 msgid "Drawing" msgstr "Zeichnung" -#: documents.php:511 +#: documents.php:522 msgid "PDF" msgstr "" -#: documents.php:513 +#: documents.php:524 msgid "Download" msgstr "" -#: documents.php:513 +#: documents.php:524 #, php-format msgid "%d Pages" msgstr "%d Seiten" -#: documents.php:522 +#: documents.php:533 msgid "Mimetype" msgstr "" -#: documents.php:524 +#: documents.php:535 msgid "File size" msgstr "Dateigröße" -#: documents.php:525 +#: documents.php:536 msgid "Upload date" msgstr "Uploaddatum" -#: documents.php:546 +#: documents.php:557 msgid "Document references" msgstr "Dokumentreferenzen" -#: documents.php:590 +#: documents.php:613 msgid "Used by" msgstr "Benutzt von" -#: documents.php:608 +#: documents.php:633 msgid "Remove reference" msgstr "Referenz entfernen" -#: documents.php:615 +#: documents.php:640 msgid "Add new reference" msgstr "Neue Referenz hinzufügen" -#: documents.php:635 equipment.php:13 equipment_js.php:14 fuse.php:236 -#: index.php:358 inventory.php:448 maintenance.php:95 maintenance.php:179 +#: documents.php:654 equipment.php:13 equipment_js.php:14 fuse.php:236 +#: index.php:359 inventory.php:450 maintenance.php:95 maintenance.php:179 #: maintenance.php:225 maintenance.php:274 maintenance.php:348 #: measurement.php:281 measurement.php:312 measurement.php:358 search.php:52 -#: globals.inc:513 globals.inc:1459 +#: globals.inc:532 globals.inc:1496 msgid "Equipment" msgstr "Ausrüstung" -#: documents.php:691 globals.inc:547 +#: documents.php:700 inventory.php:314 inventory.php:321 inventory.php:425 +#: storage.php:155 globals.inc:522 +msgid "Box" +msgstr "Kiste" + +#: documents.php:725 globals.inc:569 msgid "Vessel" msgstr "Yacht" -#: documents.php:705 +#: documents.php:739 msgid "Edit Document" msgstr "Dokument bearbeiten" -#: documents.php:733 globals.inc:518 +#: documents.php:767 globals.inc:539 msgid "Generic" msgstr "Allgemein" -#: documents.php:734 manual.php:10 globals.inc:524 +#: documents.php:768 manual.php:10 globals.inc:546 msgid "Manual" msgstr "Handbuch" -#: documents.php:735 globals.inc:521 +#: documents.php:769 globals.inc:543 msgid "Invoice" msgstr "Rechnung" -#: documents.php:767 +#: documents.php:801 msgid "Delete Document" msgstr "Lösche Dokument" -#: documents.php:773 +#: documents.php:807 msgid "" "Deleting a document item is final. There is no way back. Only delete if you " "are absolute sure." @@ -606,9 +645,9 @@ msgstr "" msgid "Lists" msgstr "Listen" -#: dropdown.php:31 dropdown.php:149 equipment.php:353 equipment_js.php:65 +#: dropdown.php:31 dropdown.php:149 equipment.php:355 equipment_js.php:65 #: fuse.php:130 fuse.php:159 fuse.php:204 fuse.php:231 fuse.php:261 -#: provisions.php:179 tag.php:118 tag.php:160 tag.php:182 tag.php:261 +#: provisions.php:182 tag.php:118 tag.php:160 tag.php:182 tag.php:261 msgid "Description" msgstr "Beschreibung" @@ -645,169 +684,173 @@ msgstr "Liste anzeigen: %s" msgid "Short" msgstr "Kurzbez." -#: dropdown.php:189 equipment.php:331 equipment.php:457 -msgid "Flags" -msgstr "" - #: dropdown.php:223 #, php-format msgid "Edit List: %s" msgstr "Liste bearbeiten: %s" -#: dropdown.php:280 equipment_js.php:93 globals.inc:1060 +#: dropdown.php:280 equipment_js.php:93 globals.inc:1096 msgid "Add" msgstr "Hinzufügen" -#: equipment.php:102 +#: equipment.php:104 #, php-format msgid "Deleted equipment no. %d" msgstr "Lösche Ausrüstung Nr. %d" -#: equipment.php:104 +#: equipment.php:106 #, php-format msgid "%d document links were removed" msgstr "%d Dokumentverknüpfungen wurden entfernt." -#: equipment.php:112 +#: equipment.php:114 msgid "No files for upload submitted" msgstr "Keine Dateien zum Hochladen angegeben" -#: equipment.php:131 +#: equipment.php:133 msgid "Filetype not allowed for upload:" msgstr "Dateityp nicht zum Hochladen zugelassen:" -#: equipment.php:149 +#: equipment.php:151 #, php-format msgid "Image scaled down to %dx%d" msgstr "Bild herunterskaliert auf %dx%d" -#: equipment.php:167 +#: equipment.php:169 #, php-format msgid "Internal error: Unknown mimetype %s!" msgstr "Interner Fehler: Unbekannter Mimetype %s!" -#: equipment.php:175 +#: equipment.php:177 msgid "Storage limit exceeded. Image not uploaded!" msgstr "Speicherlimit überschritten. Bild wurde nicht hochgeladen!" -#: equipment.php:313 +#: equipment.php:315 msgctxt "male" msgid "― none ―" msgstr "― keiner ―" -#: equipment.php:320 equipment.php:410 equipment.php:455 equipment.php:668 -#: provisions.php:156 provisions.php:275 provisions.php:315 +#: equipment.php:322 equipment.php:423 equipment.php:468 equipment.php:681 +#: provisions.php:159 provisions.php:287 provisions.php:333 msgid "Category" msgstr "Kategorie" -#: equipment.php:321 equipment.php:354 equipment.php:411 equipment.php:446 -#: equipment.php:645 +#: equipment.php:323 equipment.php:356 equipment.php:424 equipment.php:459 +#: equipment.php:658 msgid "Manufacturer" msgstr "Hersteller" -#: equipment.php:322 equipment.php:454 equipment.php:667 +#: equipment.php:324 equipment.php:467 equipment.php:680 msgid "Supplier" msgstr "Lieferant" -#: equipment.php:325 +#: equipment.php:327 msgid "Text" msgstr "" -#: equipment.php:355 equipment.php:414 equipment.php:449 equipment.php:647 +#: equipment.php:357 equipment.php:427 equipment.php:462 equipment.php:660 #: equipment_js.php:67 equipment_js.php:109 equipment_js.php:138 -#: equipment_js.php:276 index.php:434 index.php:508 +#: equipment_js.php:276 index.php:441 index.php:505 msgid "Model" msgstr "Modell" -#: equipment.php:356 equipment.php:450 equipment.php:651 equipment_js.php:68 +#: equipment.php:358 equipment.php:463 equipment.php:664 equipment_js.php:68 #: equipment_js.php:113 equipment_js.php:139 equipment_js.php:280 msgid "Serial" msgstr "Seriennummer" -#: equipment.php:357 +#: equipment.php:359 msgid "Age" msgstr "Alter" -#: equipment.php:369 +#: equipment.php:371 #, php-format msgid "%dm" msgstr "" -#: equipment.php:371 +#: equipment.php:373 #, php-format msgid "%dy" msgstr "" -#: equipment.php:403 equipment_js.php:98 +#: equipment.php:382 globals.inc:554 +msgid "Ordered" +msgstr "Bestellt" + +#: equipment.php:388 globals.inc:561 +msgid "Removed" +msgstr "Entfernt" + +#: equipment.php:416 equipment_js.php:98 msgid "Add Equipment" msgstr "Ausrüstung hinzufügen" -#: equipment.php:452 inventory.php:380 +#: equipment.php:465 inventory.php:382 msgid "Price" msgstr "Preis" -#: equipment.php:453 equipment.php:663 inventory.php:381 inventory.php:430 +#: equipment.php:466 equipment.php:676 inventory.php:383 inventory.php:432 msgid "Purchase date" msgstr "Kaufdatum" -#: equipment.php:464 +#: equipment.php:477 msgid "Images and documents" msgstr "Bilder und Dokumente" -#: equipment.php:512 +#: equipment.php:525 msgid "No referenced documents" msgstr "Keine verknüpften Dokumente" -#: equipment.php:520 +#: equipment.php:533 msgid "Add Image" msgstr "Bild hinzufügen" -#: equipment.php:536 +#: equipment.php:549 msgid "Maintenances" msgstr "Wartungen" -#: equipment.php:550 +#: equipment.php:563 msgid "No maintenance records found." msgstr "Keine Wartungsdatensätze gefunden." -#: equipment.php:554 +#: equipment.php:567 msgid "Add maintenance" msgstr "Wartung hinzufügen" -#: equipment.php:558 index.php:408 measurement.php:23 +#: equipment.php:571 measurement.php:23 msgid "Measurements" msgstr "Maße/Messungen" -#: equipment.php:573 +#: equipment.php:586 msgid "No measurement records found." msgstr "Keine Maße/Messungen gefunden." -#: equipment.php:577 measurement.php:251 +#: equipment.php:590 measurement.php:251 msgid "Add measurement" msgstr "Messung/Maß hinzufügen" -#: equipment.php:581 +#: equipment.php:594 msgid "Spare parts" msgstr "Ersatzteile" -#: equipment.php:595 +#: equipment.php:608 msgid "No spare parts found." msgstr "Keine Ersatzteile gefunden." -#: equipment.php:634 equipment_js.php:265 +#: equipment.php:647 equipment_js.php:265 msgid "Edit Equipment" msgstr "Ausrüstung bearbeiten" -#: equipment.php:659 inventory.php:426 +#: equipment.php:672 inventory.php:428 #, php-format msgid "Price, %s" msgstr "Preis, %s" -#: equipment.php:688 +#: equipment.php:705 msgid "Delete equipment" msgstr "Ausrüstung löschen" -#: equipment.php:694 +#: equipment.php:711 msgid "" "Deleting an equipment item is final. There is no way back. Only delete if " "you are absolute sure." @@ -825,11 +868,11 @@ msgstr "Marke" msgid "%d records" msgstr "%d Datensätze" -#: equipment_js.php:249 globals.inc:1068 globals.inc:1093 +#: equipment_js.php:249 globals.inc:1104 globals.inc:1129 msgid "Delete" msgstr "Löschen" -#: fuse.php:12 index.php:410 +#: fuse.php:12 globals.inc:1544 msgid "Fuses" msgstr "Sicherungen" @@ -862,7 +905,7 @@ msgstr "Stromstärke, Ampere" msgid "View fuse" msgstr "Sicherung ansehen" -#: fuse.php:230 globals.inc:517 +#: fuse.php:230 globals.inc:538 msgid "Fuse" msgstr "Sicherung" @@ -882,162 +925,142 @@ msgstr "Die Sicherung ist ungenutzt" msgid "Ghost" msgstr "" -#: index.php:12 +#: index.php:13 msgid "Start" msgstr "Start" -#: index.php:34 +#: index.php:35 #, php-format msgid "Selected vessel %d: %s" msgstr "Ausgewähltes Boot %d: %s" -#: index.php:40 index.php:61 +#: index.php:41 index.php:62 msgid "Access denied. You are not the captain." msgstr "Zugriff verweigert. Sie sind nicht der Kapitän." -#: index.php:55 +#: index.php:56 #, php-format msgid "Selected new vessel %d" msgstr "Neues Boot %d ausgewählt" -#: index.php:103 +#: index.php:104 msgid "Yacht data" msgstr "Yachtdaten" -#: index.php:105 globals.inc:546 +#: index.php:106 globals.inc:568 msgid "User" msgstr "Benutzer" -#: index.php:150 +#: index.php:151 msgid "Select" msgstr "Auswählen" -#: index.php:151 +#: index.php:152 msgid "Add yacht" msgstr "Yacht hinzufügen" -#: index.php:163 +#: index.php:164 msgid "Custom-build" msgstr "Eigenbau" -#: index.php:168 +#: index.php:169 #, php-format msgid "Built by %s" msgstr "Gebaut von %s" -#: index.php:302 +#: index.php:303 msgid "Boat data" msgstr "Bootsdaten" -#: index.php:304 +#: index.php:305 msgid "Loa" msgstr "LüA" -#: index.php:305 +#: index.php:306 msgid "Lwl" msgstr "LWL" -#: index.php:306 index.php:520 +#: index.php:307 index.php:517 msgid "Beam" msgstr "Breite" -#: index.php:307 index.php:524 +#: index.php:308 index.php:521 msgid "Draught" msgstr "Tiefgang" -#: index.php:308 index.php:528 +#: index.php:309 index.php:525 msgid "Draught, min." msgstr "Tiefgang, min." -#: index.php:309 index.php:532 +#: index.php:310 index.php:529 msgid "Displacement" msgstr "Verdrängung" -#: index.php:310 index.php:536 +#: index.php:311 index.php:533 msgid "Ballast" msgstr "Ballast" -#: index.php:311 index.php:540 +#: index.php:312 index.php:537 msgid "Belt position aft" msgstr "Gurtposition achtern" -#: index.php:312 index.php:544 +#: index.php:313 index.php:541 msgid "Belt position bow" msgstr "Gurtposition vorne" -#: index.php:328 +#: index.php:329 msgid "Statistics" msgstr "Statistik" -#: index.php:344 +#: index.php:345 msgid "Storage type" msgstr "Stauraumart" -#: index.php:359 index.php:375 index.php:381 +#: index.php:360 index.php:376 index.php:382 msgid "Count" msgstr "Anzahl" -#: index.php:396 +#: index.php:397 msgid "Base data" msgstr "Stammdaten" -#: index.php:398 -msgid "Selection lists" -msgstr "Auswahllisten" - -#: index.php:399 inventory.php:263 tag.php:12 globals.inc:1101 -msgid "Tags" -msgstr "" - -#: index.php:401 -msgid "Companies" -msgstr "Firmen" - -#: index.php:404 +#: index.php:409 msgid "Additional modules" msgstr "Zusatzmodule" -#: index.php:406 settings.php:12 -msgid "Settings" -msgstr "Einstellungen" - -#: index.php:407 search.php:102 -msgid "Tasks" -msgstr "Aufgaben" - -#: index.php:425 +#: index.php:432 msgid "Add additional yacht" msgstr "Zusätzliche Yacht hinzufügen" -#: index.php:484 +#: index.php:481 msgid "― Custom-built ―" msgstr "― Eigenbau ―" -#: index.php:500 +#: index.php:497 msgid "Edit Yacht" msgstr "Yacht bearbeiten" -#: index.php:504 +#: index.php:501 msgid "Vesselname" msgstr "Yachtname" -#: index.php:512 +#: index.php:509 msgid "LoA" msgstr "LüA" -#: index.php:516 +#: index.php:513 msgid "LwL" msgstr "LWL" -#: index.php:552 +#: index.php:549 msgid "Shape file" msgstr "Rumpfform-Datei" -#: index.php:553 +#: index.php:550 msgid "Shipyard" msgstr "Werft" -#: index.php:554 +#: index.php:551 msgid "Default Storage" msgstr "Standard-Stauraum" @@ -1046,10 +1069,14 @@ msgstr "Standard-Stauraum" msgid "Deleted inventory no. %d" msgstr "Inventar Nr. %d gelöscht" -#: inventory.php:260 inventory.php:372 +#: inventory.php:260 inventory.php:374 msgid "Container" msgstr "Behälter" +#: inventory.php:263 tag.php:12 globals.inc:1137 globals.inc:1552 +msgid "Tags" +msgstr "" + #: inventory.php:281 msgid "No tags assigned" msgstr "Keine Tags zugeordnet" @@ -1058,33 +1085,28 @@ msgstr "Keine Tags zugeordnet" msgid "Add Inventory" msgstr "Inventar hinzufügen" -#: inventory.php:311 inventory.php:421 +#: inventory.php:311 inventory.php:423 msgid "Container type" msgstr "Behälterart" -#: inventory.php:313 inventory.php:319 inventory.php:423 storage.php:155 -#: globals.inc:503 -msgid "Box" -msgstr "Kiste" - -#: inventory.php:373 +#: inventory.php:375 #, php-format msgid "%s in %s" msgstr "" -#: inventory.php:377 +#: inventory.php:379 msgid "Location ID" msgstr "Position (x, y, z)" -#: inventory.php:404 +#: inventory.php:406 msgid "Edit Inventory" msgstr "Inventar bearbeiten" -#: inventory.php:467 +#: inventory.php:469 msgid "Delete Inventory" msgstr "Inventar löschen" -#: inventory.php:471 +#: inventory.php:473 msgid "" "Deleting an inventory item is final. There is no way back. Only delete if " "you are absolute sure." @@ -1105,7 +1127,7 @@ msgstr "Benutzername:" msgid "Password:" msgstr "Kennwort:" -#: login.php:68 globals.inc:211 +#: login.php:68 globals.inc:216 msgid "Error" msgstr "Fehler" @@ -1145,7 +1167,7 @@ msgstr "" msgid "New login" msgstr "Neue Anmeldung" -#: maintenance.php:12 globals.inc:1462 +#: maintenance.php:12 globals.inc:1508 msgid "Maintenance" msgstr "Wartung" @@ -1166,7 +1188,7 @@ msgstr "Wartung hinzufügen" msgid "View Maintenance" msgstr "Wartung anzeigen" -#: maintenance.php:263 globals.inc:500 +#: maintenance.php:263 globals.inc:519 msgid "n/a" msgstr "" @@ -1178,7 +1200,7 @@ msgstr "Serie" msgid "No documents found." msgstr "Keine Dokumente gefunden." -#: maintenance.php:306 search.php:124 task.php:303 +#: maintenance.php:306 search.php:124 task.php:320 msgid "Annotations" msgstr "Notizen" @@ -1186,7 +1208,7 @@ msgstr "Notizen" msgid "No annotations for this maintenance" msgstr "Keine Notizen für diese Wartung" -#: maintenance.php:326 task.php:323 +#: maintenance.php:326 task.php:340 msgid "Add note" msgstr "Notiz hinzufügen" @@ -1194,7 +1216,8 @@ msgstr "Notiz hinzufügen" msgid "Edit Maintenance" msgstr "Wartung bearbeiten" -#: maintenance.php:358 projects.php:400 task.php:219 task.php:297 task.php:373 +#: maintenance.php:358 projects.php:400 task.php:214 task.php:236 task.php:314 +#: task.php:390 msgid "Status" msgstr "Status" @@ -1214,11 +1237,11 @@ msgstr "" msgid "3D" msgstr "" -#: measurement.php:34 task.php:16 task.php:291 +#: measurement.php:34 task.php:16 task.php:308 msgid "unassigned" msgstr "nicht zugeordnet" -#: measurement.php:214 measurement.php:300 +#: measurement.php:214 measurement.php:300 globals.inc:1528 msgid "Measurement" msgstr "Messung" @@ -1232,8 +1255,8 @@ msgid "Measured" msgstr "Gemessen" #: measurement.php:217 measurement.php:279 measurement.php:304 -#: measurement.php:356 provisions.php:181 provisions.php:241 provisions.php:274 -#: provisions.php:314 +#: measurement.php:356 provisions.php:184 provisions.php:251 provisions.php:286 +#: provisions.php:332 msgid "Unit" msgstr "Einheit" @@ -1270,7 +1293,7 @@ msgstr "Datum" msgid "Edit measurement" msgstr "Messung/Maß bearbeiten" -#: note.php:67 task.php:104 +#: note.php:67 task.php:105 msgid "Note deleted." msgstr "Notiz gelöscht." @@ -1320,7 +1343,7 @@ msgstr "" "Löschen einer Notiz ist endgültig. Es gibt keinen Weg zurück. Nur löschen " "wenn Sie sich absolut sicher sind." -#: projects.php:12 globals.inc:1463 +#: projects.php:12 globals.inc:1512 msgid "Projects" msgstr "Projekte" @@ -1344,7 +1367,7 @@ msgstr "Aufgaben die keinem Projekt zugeordnet sind" msgid "Add Project" msgstr "Projekt hinzufügen" -#: projects.php:287 projects.php:311 projects.php:381 task.php:298 task.php:374 +#: projects.php:287 projects.php:311 projects.php:381 task.php:315 task.php:391 msgid "Responsible" msgstr "Verantwortlich" @@ -1364,8 +1387,8 @@ msgstr "Zugeordnete Aufgaben" msgid "No assigned tasks found." msgstr "Keine zugeordneten Aufgaben gefunden." -#: projects.php:337 task.php:12 task.php:216 task.php:265 task.php:290 -#: globals.inc:543 +#: projects.php:337 task.php:12 task.php:233 task.php:282 task.php:307 +#: globals.inc:565 globals.inc:1524 msgid "Task" msgstr "Aufgabe" @@ -1395,91 +1418,116 @@ msgstr "Kosten endgültig, %s" msgid "Delete Project" msgstr "Lösche Projekt" -#: provisions.php:12 globals.inc:1461 +#: provisions.php:12 globals.inc:1504 msgid "Provisions" msgstr "Proviant" -#: provisions.php:182 +#: provisions.php:185 msgid "Stored" msgstr "Eingelagert" -#: provisions.php:183 +#: provisions.php:186 msgid "Best before" msgstr "Haltbar bis" -#: provisions.php:230 +#: provisions.php:234 provisions.php:366 +msgid "Shopping list" +msgstr "Einkaufsliste" + +#: provisions.php:240 msgid "Add provisions" msgstr "Proviant hinzufügen" -#: provisions.php:243 provisions.php:276 provisions.php:318 +#: provisions.php:253 provisions.php:288 provisions.php:336 msgid "Storedate" msgstr "Einlagerdatum" -#: provisions.php:247 provisions.php:277 provisions.php:322 +#: provisions.php:257 provisions.php:289 provisions.php:340 msgid "Shelflife" msgstr "Haltbarkeitsdatum" -#: provisions.php:273 +#: provisions.php:283 provisions.php:320 +msgid "Target" +msgstr "Soll-Menge" + +#: provisions.php:285 msgid "Weight net" msgstr "Nettogewicht" -#: provisions.php:293 +#: provisions.php:307 msgid "Edit provision" msgstr "Proviant bearbeiten" -#: provisions.php:310 +#: provisions.php:328 msgid "Weight net, kg" msgstr "Nettogewicht, kg" -#: provisions.php:335 +#: provisions.php:358 msgid "Delete provisions" msgstr "Proviant löschen" -#: search.php:12 search.php:32 globals.inc:1287 +#: provisions.php:384 +msgid "Use" +msgstr "Benutzen" + +#: search.php:12 search.php:32 globals.inc:1323 msgid "Search" msgstr "Suche" -#: settings.php:75 +#: search.php:102 +msgid "Tasks" +msgstr "Aufgaben" + +#: settings.php:12 globals.inc:1556 +msgid "Settings" +msgstr "Einstellungen" + +#: settings.php:84 msgid "YYYY-MM-DD" msgstr "" -#: settings.php:76 +#: settings.php:85 msgid "YYYY/MM/DD" msgstr "" -#: settings.php:77 +#: settings.php:86 msgid "DD.MM.YYYY" msgstr "" -#: settings.php:78 +#: settings.php:87 msgid "DD/MM/YYYY" msgstr "" -#: settings.php:79 +#: settings.php:88 msgid "MM/DD/YYYY" msgstr "" -#: settings.php:100 +#: settings.php:109 msgid "for current user" msgstr "für aktuellen Benutzer" -#: settings.php:102 +#: settings.php:120 +#, php-format +msgid "Menu %d" +msgstr "" + +#: settings.php:123 msgid "Date format" msgstr "Datumsformat" -#: settings.php:105 +#: settings.php:126 msgid "Number of rows per page" msgstr "Anzahl Zeilen je Seite" -#: settings.php:112 +#: settings.php:133 msgid "global for all users" msgstr "global für alle Benutzer" -#: settings.php:114 +#: settings.php:135 msgid "Maximal image width" msgstr "Maximale Bildbreite" -#: settings.php:118 +#: settings.php:139 msgid "Maximal image height" msgstr "Maximale Bildhöhe" @@ -1508,7 +1556,7 @@ msgstr "Stauraum hinzufügen" msgid "Typ" msgstr "Art" -#: storage.php:229 storage.php:335 +#: storage.php:229 storage.php:355 msgid "Capacity" msgstr "Kapazität" @@ -1532,39 +1580,47 @@ msgstr "Kisten im Stauraum" msgid "No boxes contained" msgstr "Keine Kisten enthalten" -#: storage.php:260 +#: storage.php:261 +msgid "Inventory in storage" +msgstr "Inventar im Stauraum" + +#: storage.php:276 +msgid "No inventory contained" +msgstr "Kein Inventar enthalten" + +#: storage.php:280 msgid "Provisions in storage" msgstr "Proviant im Stauraum" -#: storage.php:277 +#: storage.php:297 msgid "No provisions contained" msgstr "Kein Proviant enthalten" -#: storage.php:283 +#: storage.php:303 msgid "Edit Storage" msgstr "Stauraum bearbeiten" -#: storage.php:303 +#: storage.php:323 msgid "Position (x, y, z) in mm" msgstr "Position (x, y, z) in mm" -#: storage.php:317 +#: storage.php:337 msgid "Width (x, y, z) in mm" msgstr "Maße (x, y, z) in mm" -#: storage.php:331 +#: storage.php:351 msgid "Angle, deg." msgstr "Winkel, Grad" -#: storage.php:338 +#: storage.php:358 msgid "Capacity Unit" msgstr "Kapazitätseinheit" -#: storage.php:357 +#: storage.php:377 msgid "Delete Storage" msgstr "Stauraum löschen" -#: storage.php:363 +#: storage.php:383 msgid "" "Deleting a storage is final. There is no way back. Only delete if you are " "absolute sure." @@ -1592,7 +1648,7 @@ msgstr "Tag-Nutzung" msgid "Related tags" msgstr "Zugeordnete Tags" -#: tag.php:240 task.php:327 +#: tag.php:240 task.php:344 msgid "Not yet implemented" msgstr "Noch nicht implementiert" @@ -1604,64 +1660,64 @@ msgstr "Tag bearbeiten" msgid "Delete tag" msgstr "Tag löschen" -#: task.php:102 +#: task.php:103 msgid "Task deleted" msgstr "Aufgabe gelöscht" -#: task.php:192 task.php:218 task.php:292 task.php:354 +#: task.php:205 task.php:235 task.php:309 task.php:371 msgid "Priority" msgstr "Priorität" -#: task.php:217 task.php:262 task.php:291 task.php:353 globals.inc:538 +#: task.php:234 task.php:279 task.php:308 task.php:370 globals.inc:560 msgid "Project" msgstr "Projekt" -#: task.php:255 +#: task.php:272 msgid "Add Task" msgstr "Aufgabe hinzufügen" -#: task.php:288 +#: task.php:305 msgid "View Task" msgstr "Aufgabe anzeigen" -#: task.php:292 +#: task.php:309 msgid "none" msgstr "keine" -#: task.php:293 task.php:357 +#: task.php:310 task.php:374 msgid "Plan date" msgstr "Plandatum" -#: task.php:294 task.php:361 +#: task.php:311 task.php:378 msgid "Due date" msgstr "Fälligkeitsdatum" -#: task.php:295 task.php:365 +#: task.php:312 task.php:382 msgid "Started at" msgstr "Gestartet am" -#: task.php:296 task.php:369 +#: task.php:313 task.php:386 msgid "Finished at" msgstr "Fertiggestellt am" -#: task.php:319 +#: task.php:336 msgid "No annotations for this task" msgstr "Keine Notizen für diese Aufgabe" -#: task.php:342 +#: task.php:359 msgid "Edit Task" msgstr "Aufgabe bearbeiten" -#: task.php:387 +#: task.php:404 msgid "Delete Task" msgstr "Aufgabe löschen" -#: task.php:388 +#: task.php:405 #, php-format msgid "Task no. %d" msgstr "Aufgabe Nr.: %d" -#: task.php:391 +#: task.php:408 msgid "" "Deleting a task item is final. There is no way back. Only delete if you are " "absolute sure." @@ -1669,252 +1725,260 @@ msgstr "" "Löschen einer Aufgabe ist endgültig. Es gibt keinen Weg zurück. Nur löschen " "wenn Sie sich absolut sicher sind." -#: globals.inc:132 +#: globals.inc:137 msgid "― unknown ―" msgstr "― unbekannt ―" -#: globals.inc:150 +#: globals.inc:155 msgid "Information" msgstr "" -#: globals.inc:189 +#: globals.inc:194 msgid "Success" msgstr "Erfolg" -#: globals.inc:200 +#: globals.inc:205 msgid "Warning" msgstr "Warnung" -#: globals.inc:261 +#: globals.inc:268 msgid "Username or password was empty" msgstr "Benutzername oder Kennwort war leer" -#: globals.inc:272 +#: globals.inc:279 msgid "User account does not exist" msgstr "Benutzer existiert nicht" -#: globals.inc:281 +#: globals.inc:288 msgid "Username or password invalid" msgstr "Benutzername oder Kennwort ungültig" -#: globals.inc:304 +#: globals.inc:311 msgid "User not logged in" msgstr "Benutzer ist nicht angemeldet" -#: globals.inc:501 +#: globals.inc:520 msgid "Active" msgstr "Aktiv" -#: globals.inc:502 +#: globals.inc:521 msgid "Bad" msgstr "Schlecht" -#: globals.inc:505 +#: globals.inc:524 msgid "Catamaran" msgstr "Katamaran" -#: globals.inc:506 +#: globals.inc:525 msgid "Completed" msgstr "erledigt" -#: globals.inc:507 +#: globals.inc:526 msgid "Closed" msgstr "Geschlossen" -#: globals.inc:509 +#: globals.inc:528 msgid "Defect" msgstr "Defekt" -#: globals.inc:510 -msgid "Deleted" -msgstr "Gelöscht" - -#: globals.inc:511 +#: globals.inc:530 msgid "Done" msgstr "Fertig" -#: globals.inc:514 +#: globals.inc:533 msgid "Estimated" msgstr "Geschätzt" -#: globals.inc:515 +#: globals.inc:534 +msgid "Excellent" +msgstr "Sehr gut" + +#: globals.inc:535 +msgid "Fair" +msgstr "Normal" + +#: globals.inc:536 msgid "Finished" msgstr "Fertig" -#: globals.inc:516 +#: globals.inc:537 msgid "Fixed" msgstr "Fixiert" -#: globals.inc:519 +#: globals.inc:540 msgid "Good" msgstr "Gut" -#: globals.inc:520 +#: globals.inc:541 msgid "High" msgstr "Hoch" -#: globals.inc:522 +#: globals.inc:542 +msgid "Historic" +msgstr "Historisch" + +#: globals.inc:544 msgid "Locked" msgstr "Gesperrt" -#: globals.inc:523 +#: globals.inc:545 msgid "Low" msgstr "Niedrig" -#: globals.inc:525 +#: globals.inc:547 msgid "Medium" msgstr "Mittel" -#: globals.inc:526 +#: globals.inc:548 msgid "Monohull" msgstr "" -#: globals.inc:527 +#: globals.inc:549 msgid "New" msgstr "Neu" -#: globals.inc:528 +#: globals.inc:550 msgid "None" msgstr "Keine" -#: globals.inc:529 +#: globals.inc:551 msgid "Normal" msgstr "Normal" -#: globals.inc:530 +#: globals.inc:552 msgid "Ongoing" msgstr "Laufend" -#: globals.inc:531 +#: globals.inc:553 msgid "Open" msgstr "Offen" -#: globals.inc:532 -msgid "Ordered" -msgstr "Bestellt" - -#: globals.inc:533 +#: globals.inc:555 msgid "Paused" msgstr "Pausiert" -#: globals.inc:534 +#: globals.inc:556 msgid "Pending" msgstr "Ausstehend" -#: globals.inc:535 +#: globals.inc:557 msgid "Picture" msgstr "Bild" -#: globals.inc:536 +#: globals.inc:558 msgid "Planned" msgstr "Geplant" -#: globals.inc:537 +#: globals.inc:559 msgid "Precise" msgstr "Präzise" -#: globals.inc:539 -msgid "Removed" -msgstr "Entfernt" - -#: globals.inc:540 +#: globals.inc:562 msgid "Repairable" msgstr "Reparierbar" -#: globals.inc:541 +#: globals.inc:563 msgid "Rough" msgstr "Grob" -#: globals.inc:544 +#: globals.inc:566 msgid "Trimaran" msgstr "" -#: globals.inc:545 +#: globals.inc:567 msgid "Unknown" msgstr "Unbekannt" -#: globals.inc:548 +#: globals.inc:570 msgid "waiting" msgstr "wartend" -#: globals.inc:945 +#: globals.inc:971 msgid "No default storage defined for current vessel" msgstr "Kein Standardstauraum für die aktuelle Yacht definiert" -#: globals.inc:960 +#: globals.inc:986 #, php-format msgid "Selected fallback storage '%s'" msgstr "Ausgewählter Stauraum als Fallback '%s'" -#: globals.inc:1104 +#: globals.inc:1140 msgid "Tag assignment" msgstr "Tag-Zuordnung" -#: globals.inc:1108 +#: globals.inc:1144 msgid "(Separate by comma)" msgstr "(Getrennt mit Komma)" -#: globals.inc:1190 +#: globals.inc:1226 #, php-format msgid "%d B" msgstr "" -#: globals.inc:1192 +#: globals.inc:1228 #, php-format msgid "%.1f kB" msgstr "" -#: globals.inc:1194 +#: globals.inc:1230 #, php-format msgid "%.1f MB" msgstr "" -#: globals.inc:1199 globals.inc:1208 +#: globals.inc:1235 globals.inc:1244 #, php-format msgid "%d Byte" msgstr "" -#: globals.inc:1201 +#: globals.inc:1237 #, php-format msgid "%.1f kByte" msgstr "" -#: globals.inc:1203 +#: globals.inc:1239 #, php-format msgid "%.1f MByte" msgstr "" -#: globals.inc:1210 +#: globals.inc:1246 #, php-format msgid "approx. %.1f kByte" msgstr "ca. %.1f kByte" -#: globals.inc:1212 +#: globals.inc:1248 #, php-format msgid "approx. %.1f MByte" msgstr "ca. %.1f MByte" -#: globals.inc:1315 globals.inc:1318 +#: globals.inc:1351 globals.inc:1354 msgid "First" msgstr "Erster" -#: globals.inc:1316 globals.inc:1319 +#: globals.inc:1352 globals.inc:1355 msgid "Previous" msgstr "Zurück" -#: globals.inc:1353 globals.inc:1356 +#: globals.inc:1389 globals.inc:1392 msgid "Next" msgstr "Vor" -#: globals.inc:1354 globals.inc:1357 +#: globals.inc:1390 globals.inc:1393 msgid "Last" msgstr "Letzter" -#: globals.inc:1371 +#: globals.inc:1407 #, php-format msgid "Records %d to %d of %d" msgstr "Datensätze %d bis %d von %d" -#: globals.inc:1373 +#: globals.inc:1409 msgid "No records found" msgstr "Keine Datensätze gefunden." + +#: globals.inc:1520 +msgid "Companies" +msgstr "Firmen" + +#: globals.inc:1560 +msgid "Selection lists" +msgstr "Auswahllisten" diff --git a/webgui/locale/de_DE/LC_MESSAGES/yms.mo b/webgui/locale/de_DE/LC_MESSAGES/yms.mo index 3b865915be6f76b00b6880df0b9f8c7f8de3a1d6..a2fd9cbe987c75d77f224abfc24d6d9bb40fcce8 100644 GIT binary patch delta 9476 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 delta 8825 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 diff --git a/webgui/manifest.json b/webgui/manifest.json new file mode 100644 index 0000000..f83e089 --- /dev/null +++ b/webgui/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Shopping list", + "short_name": "Shopping", + "start_url": "/", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#0d6efd", + "icons": [ + { + "src": "img/pwa-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "img/pwa-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/webgui/manual.php b/webgui/manual.php index b84c9f3..80e7f3f 100644 --- a/webgui/manual.php +++ b/webgui/manual.php @@ -134,7 +134,8 @@ Es handelt sich um die Eingabemöglichkeit in ein einzelnes Textfeld.

Benutzer können nicht über die Web-GUI eingerichtet werden.

Eine Kennwortänderung ist ebenfalls nicht über die Web-GUI möglich.

Es gibt die Berechtigungsebenen Kapitän (captain), -Steuermann (helmsman) und Matrose (sailor). +Steuermann (helmsman) und Matrose (sailor).

+

Jeder Benutzer kann das Hauptmenü entsprechend seinen Anforderungen einstellen.

Stammdaten

Diese Daten ändern sich nicht sehr häufig, sind aber für den Betrieb diff --git a/webgui/provisions.php b/webgui/provisions.php index 3e0a8f7..c866aa9 100644 --- a/webgui/provisions.php +++ b/webgui/provisions.php @@ -1,7 +1,7 @@ ', "\n"; echo "\n"; echo "

\n"; - echo "\n"; + echo '\n"; echo "\n"; echo "\n"; echo "\n"; @@ -224,6 +229,11 @@ echo $pagination; form_add_button($g_scriptname); +// Shopping list button +echo '
', "\n"; +echo ' ',_('Shopping list'), "\n"; +echo "
\n"; + elseif ($action == ACT_ADD): // ========== VARIANT: add record ============================================= @@ -258,7 +268,8 @@ echo '

', _('Add provisions'), "

\n"; elseif ($action == ACT_VIEW): // ========== VARIANT: view single record ===================================== -$sql = "SELECT provname, provcat, number, unit, weight, weight_net, storedate, shelflife, sid " +$sql = "SELECT provname, provcat, number, target, unit, weight, weight_net," + . " storedate, shelflife, sid, remarks " . "FROM provisions " . "WHERE provid=?"; $sth = $pdo->prepare($sql); @@ -269,13 +280,15 @@ echo '

', $prov->provname, "

\n"; echo '
", get_enum($ref['reftype']), "
", $i; echo '', "\n"; + // icons for some flags + $flags = explode(',', $row['flags']); + if (in_array('ordered', $flags)) { + echo ''; + } + if (in_array('deleted', $flags)) { + echo ''; + } + if (in_array('removed', $flags)) { + echo ''; + } echo "", $row['ename'], "", ($opt_manufacturer[$row['manufacturer']] ?? ''), "
', _('Box type'),"", $inventory->contty // Container with link echo '
', $inventory->conttype == 'storage' ? _('Storage') : _('Container'); echo '', sprintf(_('%s in %s'), $box['label'], $storagename); -// TODO insert link +// link to box +if ($inventory->conttype == 'box') { + echo '', "\n"; +} echo "
", _('Location ID'), "", $inventory->locationid, "
", ! isset($row['sid']) ? ' ' : '', $row['provname'], "", $row['number'], "', $row['number']; + if ($row['target']) echo ' (', $row['target'], ')'; + echo "", $opt_unit[$row['unit']], "", $row['storedate'], "", $row['shelflife'], "
', "\n"; echo '\n"; +echo "\n"; echo "\n"; echo "\n"; echo '\n"; echo '\n"; echo '\n"; -echo '\n"; +echo '\n"; echo '\n"; +echo '\n"; echo "
', _('Number'),"", $prov->number, "
", _('Target'), "", $prov->target, "
", _('Weight'), "", format_float($prov->weight, 2, 'kg'), "
", _('Weight net'), "", format_float($prov->weight_net, 2, 'kg'), "
', _('Unit'),"", $opt_unit[$prov->unit], "
', _('Category'),"", $opt_category[$prov->provcat] ?? 'n/a', "
', _('Storedate'),"", $prov->storedate, "
', _('Shelflife'),"$prov->shelflife
', _('Shelflife'),"", $prov->shelflife, "
', _('Storage'),"", ($opt_storage[$prov->sid] ?? ''), "
', _('Remarks'),"", nl2br($prov->remarks), "
\n"; form_view_buttons($g_scriptname, $id); @@ -283,7 +296,8 @@ form_view_buttons($g_scriptname, $id); elseif ($action == ACT_EDIT): // ========== VARIANT: edit single record ===================================== -$sql = "SELECT provname, provcat, number, weight, weight_net, unit, storedate, shelflife, sid " +$sql = "SELECT provname, provcat, number, target, unit, weight, weight_net," + . " storedate, shelflife, sid, remarks " . "FROM provisions " . "WHERE provid=?"; $sth = $pdo->prepare($sql); @@ -302,6 +316,10 @@ echo '

', _('Edit provision'), "

\n";
+
+ + +
@@ -324,7 +342,12 @@ form_create_select('provcat', _('Category'), $g_opt_none + $opt_category, $prov-
sid); - +?> +
+ + +
+\n"; @@ -334,6 +357,34 @@ elseif ($action == ACT_DELETE): echo '

', _('Delete provisions'), "

\n"; +?> +

Not yet implemented!

+', _('Shopping list'), "\n"; + +$sql = "SELECT provid, provname, unit, target - number AS buy " + . "FROM provisions " + . "WHERE target IS NOT NULL AND number < target " + . "ORDER BY provcat, provname"; +$sth = $pdo->query($sql); +$res = $sth->fetchAll(); +echo "
";
+foreach ($res as $row) {
+    echo $row['provname'];
+    echo ' ';
+    echo $row['buy'];
+    echo ' ';
+    echo $opt_unit[$row['unit']], "\n";
+}
+echo "
"; +echo '
', "\n"; +echo ' ',_('Use'), "\n"; +echo ' ',_('Back'), "\n"; +echo "
\n"; + else: // ========== ERROR UNKNOWN VARIANT =========================================== diff --git a/webgui/shapes/bavaria34.svg b/webgui/shapes/bavaria34.svg index 5916743..5644535 100644 --- a/webgui/shapes/bavaria34.svg +++ b/webgui/shapes/bavaria34.svg @@ -7,7 +7,9 @@ xml:space="preserve" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg"> + Bavaria 34 + Etap 23Etap 23Etap 23Thomas Hooge + d="M 141.09882,38.437352 H 64.500753" + id="path1051-5-20-3-5-3-6-7-5-6-2-9" /> diff --git a/webgui/shopping.php b/webgui/shopping.php new file mode 100644 index 0000000..f425a62 --- /dev/null +++ b/webgui/shopping.php @@ -0,0 +1,75 @@ + +query($sql); +$res = $sth->fetchAll(PDO::FETCH_ASSOC); + +// aktuelle Einkaufsliste laden +// localStorage.setItem("liste", JSON.stringify(meineListe)); +// let liste = JSON.parse(localStorage.getItem("liste")); +//$liste = getEinkaufsliste(); +?> + + +Shopping list + + + + + + + + + +

YMS Einkaufsliste

+ + + +

Offen

+
+Loading ... +
+ +

Erledigt

+
+Empty. +
+ + + diff --git a/webgui/storage.php b/webgui/storage.php index 8ddaa18..a054b91 100644 --- a/webgui/storage.php +++ b/webgui/storage.php @@ -222,7 +222,7 @@ $sql = "SELECT sid, sname, stype, capacity, capaunit, x, y, z, wx, wy, wz, angle $sth = $pdo->prepare($sql); $sth->execute([$id]); $storage = $sth->fetch(PDO::FETCH_OBJ); -echo '

', $storage->sname, "

\n"; +echo '

', _('Storage'), ': ', $storage->sname, "

\n"; echo '', "\n"; echo '\n"; @@ -257,6 +257,26 @@ if (count($res) > 0) { echo '

', _('No boxes contained'), "

\n"; } +// show assigned inventory here +echo '

', _('Inventory in storage'), "

\n"; +$sql = "SELECT invid, invname FROM inventory WHERE conttype='storage' and sid=?"; +$sth = $pdo->prepare($sql); +$sth->execute([$id]); +$res = $sth->fetchall(); +if (count($res) > 0) { + echo '
', _('Typ'),"", $opt_stype[$storage->stype], "
'; + foreach ($res as $row) { + echo ""; + echo '"; + echo ''; + echo "\n"; + } + echo "
', $row['invname'], "
\n"; +} else { + echo '

', _('No inventory contained'), "

\n"; +} + +// show assigned provisions here echo '

', _('Provisions in storage'), "

\n"; $sql = "SELECT provid, provname, number, unit, storedate, shelflife FROM provisions WHERE sid=?"; diff --git a/webgui/task.php b/webgui/task.php index 449f58b..439da43 100644 --- a/webgui/task.php +++ b/webgui/task.php @@ -31,8 +31,9 @@ switch ($submit = form_get_action()) { case 'filter': $flt = array(); $flt['prio'] = gpc_get_enum($_POST, 'flt_prio', array_merge(array_keys($opt_priority), ['-2', '-1'])); - $flt['stat'] = gpc_get_enum($_POST, 'flt_stat', array_merge(array_keys($opt_state), ['-2', '-1'])); $flt['txt'] = gpc_get_string($_POST, 'flt_txt'); + $allowed = db_load_enum('task', 'taskstate'); + $flt['stat'] = gpc_get_set($_POST, 'flt_stat', $allowed); db_save_filter($flt, 206); $action = ACT_DEFAULT; break; @@ -138,10 +139,22 @@ if (strlen($flt->prio) > 2 ) { } elseif ($flt->prio == -1) { $w[] = 'priority IS NULL'; } -if (strlen($flt->stat) > 2 ) { +/*if (strlen($flt->stat) > 2 ) { $w[] = 'taskstate=:taskstate'; $p[':taskstate'] = $flt->stat; +} */ +$parts = ["taskstate=''", 'taskstate IS NULL']; +foreach ($flt->stat as $f) { + $parts[] = "FIND_IN_SET('$f', taskstate)"; } +if (!empty($parts)) { + if (count($parts) > 1) { + $w[] = '(' . join(' OR ', $parts) . ')'; + } else { + $w[] = $parts[0]; + } +} + $where = join(' AND ', $w); $order = ' ORDER BY t.taskid'; @@ -190,12 +203,16 @@ $res = $sth->fetchAll();
prio); -filter_create_select('flt_stat', _('State'), $g_opt_all + $opt_state, $flt->stat); +//filter_create_select('flt_stat', _('State'), $g_opt_all + $opt_state, $flt->stat); ?>
+stat); +?>