Belegvorlagen: Anzeigen, Umbenennen, Löschen
authorMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 24 Jan 2017 15:04:10 +0000 (16:04 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 24 Jan 2017 16:41:17 +0000 (17:41 +0100)
SL/Controller/RecordTemplate.pm [new file with mode: 0644]
SL/DB/RecordTemplate.pm
js/kivi.RecordTemplate.js [new file with mode: 0644]
js/locale/de.js
locale/de/all
templates/webpages/record_template/dialog.html [new file with mode: 0644]

diff --git a/SL/Controller/RecordTemplate.pm b/SL/Controller/RecordTemplate.pm
new file mode 100644 (file)
index 0000000..a349378
--- /dev/null
@@ -0,0 +1,113 @@
+package SL::Controller::RecordTemplate;
+
+use strict;
+
+use base qw(SL::Controller::Base);
+
+use SL::Helper::Flash qw(flash);
+use SL::Locale::String qw(t8);
+use SL::DB::RecordTemplate;
+
+use Rose::Object::MakeMethods::Generic (
+  'scalar --get_set_init' => [ qw(template_type template templates data) ],
+);
+
+__PACKAGE__->run_before('check_auth');
+
+my %modules = (
+  ar_transaction => {
+    controller    => 'ar.pl',
+    load_action   => 'load_record_template',
+    save_action   => 'save_record_template',
+    form_selector => '#form',
+  },
+
+  ap_transaction => {
+    controller    => 'ap.pl',
+    load_action   => 'load_record_template',
+    save_action   => 'save_record_template',
+    form_selector => '#form',
+  },
+
+  gl_transaction => {
+    controller    => 'gl.pl',
+    load_action   => 'load_record_template',
+    save_action   => 'save_record_template',
+    form_selector => '#form',
+  },
+);
+
+#
+# actions
+#
+
+sub action_show_dialog {
+  my ($self) = @_;
+  $self
+    ->js
+    ->dialog->open({
+      html   => $self->dialog_html,
+      id     => 'record_template_dialog',
+      dialog => {
+        title => t8('Record templates'),
+      },
+    })
+    ->focus("#record_template_dialog_new_template_name")
+    ->render;
+}
+
+sub action_rename {
+  my ($self) = @_;
+
+  $self->template_type($self->template->template_type);
+  $self->template->update_attributes(template_name => $::form->{template_name});
+
+  $self
+    ->js
+    ->html('#record_template_dialog', $self->dialog_html)
+    ->focus("#record_template_dialog_new_template_name")
+    ->reinit_widgets
+    ->render;
+}
+
+sub action_delete {
+  my ($self) = @_;
+
+  $self->template_type($self->template->template_type);
+  $self->template->delete;
+
+  $self
+    ->js
+    ->html('#record_template_dialog', $self->dialog_html)
+    ->focus("#record_template_dialog_new_template_name")
+    ->reinit_widgets
+    ->render;
+}
+
+#
+# helpers
+#
+
+sub check_auth {
+  $::auth->assert('ap_transactions | ar_transactions | gl_transactions');
+}
+
+sub init_template_type { $::form->{template_type} or die 'need template_type'   }
+sub init_data          { $modules{ $_[0]->template_type }                       }
+sub init_template      { SL::DB::RecordTemplate->new(id => $::form->{id})->load }
+
+sub init_templates {
+  my ($self) = @_;
+
+  return scalar SL::DB::Manager::RecordTemplate->get_all_sorted(
+    where => [ template_type => $self->template_type ],
+  );
+}
+
+sub dialog_html {
+  my ($self) = @_;
+
+  return $self->render('record_template/dialog', { layout => 0, output => 0 });
+}
+
+1;
index f7cad09..1360c95 100644 (file)
@@ -3,6 +3,7 @@ package SL::DB::RecordTemplate;
 use strict;
 
 use DateTime::Format::Strptime;
+use List::Util qw(first);
 
 use SL::DB::MetaSetup::RecordTemplate;
 use SL::DB::Manager::RecordTemplate;
@@ -112,6 +113,12 @@ sub substitute_variables {
   }
 }
 
+sub template_name_to_use {
+  my ($self, @names) = @_;
+
+  return first { ($_ // '') ne '' } (@names, $self->template_name, $::locale->text('unnamed record template'));
+}
+
 1;
 __END__
 
diff --git a/js/kivi.RecordTemplate.js b/js/kivi.RecordTemplate.js
new file mode 100644 (file)
index 0000000..791bcba
--- /dev/null
@@ -0,0 +1,75 @@
+namespace('kivi.RecordTemplate', function(ns) {
+  'use strict';
+
+  ns.popup = function(template_type) {
+    $.get('controller.pl', {
+      action:        'RecordTemplate/show_dialog.js',
+      template_type: template_type,
+    }, kivi.eval_json_result);
+  };
+
+  ns.create = function() {
+    var new_name = $("#record_template_dialog_new_template_name").val();
+    if (new_name === '') {
+      alert(kivi.t8('Error: Name missing'));
+      return false;
+    }
+
+    kivi.RecordTemplate.save(undefined, new_name);
+  };
+
+  ns.save = function(id, name) {
+    var $type = $("#record_template_dialog_template_type");
+    var $form = $($type.data('form_selector'));
+
+    if (!$form) {
+      console.log("nothing found for form_selector " + $type.data("form_selector"));
+      return false;
+    }
+
+    var data = $form.serializeArray().filter(function(val) { return val.name !== 'action'; });
+    data.push({ name: 'action',                            value: $type.data('save_action') });
+    data.push({ name: 'record_template_id',                value: id });
+    data.push({ name: 'record_template_new_template_name', value: name });
+
+    $.post($type.data('controller'), data, kivi.eval_json_result);
+  };
+
+  ns.load = function(id) {
+    if (!confirm(kivi.t8('Do you really want to load this record template? All unsaved data will be lose.')))
+      return false;
+
+    var $type = $("#record_template_dialog_template_type");
+    var url   = encodeURIComponent($type.data('controller'))
+              + '?action=' + encodeURIComponent($type.data('load_action'))
+              + '&id='     + encodeURIComponent(id);
+
+    console.log(url);
+
+    window.location = url;
+  };
+
+  ns.rename = function(id) {
+    var current_name = $("#record_template_dialog_template_name_" + id).val();
+    var new_name     = prompt(kivi.t8("Please enter the new name:"), current_name);
+
+    if ((new_name === current_name) || !new_name || (new_name === ''))
+      return;
+
+    $.post('controller.pl', {
+      action: 'RecordTemplate/rename.js',
+      id: id,
+      template_name: new_name
+    }, kivi.eval_json_result);
+  };
+
+  ns.delete = function(id) {
+    if (!confirm(kivi.t8('Do you really want to delete this record template?')))
+      return;
+
+    $.post('controller.pl', {
+      action: 'RecordTemplate/delete.js',
+      id: id
+    }, kivi.eval_json_result);
+  };
+});
index 06b46f6..b50b1da 100644 (file)
@@ -36,6 +36,8 @@ namespace("kivi").setupLocale({
 "Do you really want do continue?":"Wollen Sie wirklich fortfahren?",
 "Do you really want to cancel?":"Wollen Sie wirklich abbrechen?",
 "Do you really want to delete this draft?":"Wollen Sie diesen Entwurf wirklich löschen?",
+"Do you really want to delete this record template?":"Wollen Sie diese Belegvorlage wirklich löschen?",
+"Do you really want to load this record template? All unsaved data will be lose.":"Wollen Sie diese Belegvorlage wirklich laden? Alle nicht gespeicherten Daten gehen dabei verloren.",
 "Do you really want to revert to this version?":"Wollen Sie wirklich auf diese Version zurücksetzen?",
 "Do you really want to save?":"Wollen Sie wirklich speichern?",
 "Do you want to set the account number \"#1\" to \"#2\" and the name \"#3\" to \"#4\"?":"Soll die Kontonummer \"#1\" zu \"#2\" und den Name \"#3\" zu \"#4\" geändert werden?",
@@ -46,6 +48,7 @@ namespace("kivi").setupLocale({
 "Edit project link":"Projektverknüpfung bearbeiten",
 "Edit text block":"Textblock bearbeiten",
 "Enter longdescription":"Langtext eingeben",
+"Error: Name missing":"Fehler: Name fehlt",
 "Function block actions":"Funktionsblockaktionen",
 "Hide all details":"Alle Details verbergen",
 "Hide details":"Details verbergen",
@@ -58,6 +61,7 @@ namespace("kivi").setupLocale({
 "Part picker":"Artikelauswahl",
 "Paste":"Einfügen",
 "Paste template":"Vorlage einfügen",
+"Please enter the new name:":"Bitte geben Sie den neuen Namen ein:",
 "Please select a customer.":"Bitte wählen Sie einen Kunden aus.",
 "Please select a vendor.":"Bitte wählen Sie einen Lieferanten aus.",
 "Price Types":"Preistypen",
index e7b5e6a..adac93f 100755 (executable)
@@ -203,6 +203,7 @@ $self->{texts} = {
   'Add new currency'            => 'Neue Währung hinzufügen',
   'Add new custom variable'     => 'Neue benutzerdefinierte Variable erfassen',
   'Add new price rule item'     => 'Neue Bedingung hinzufügen',
+  'Add new record template'     => 'Neue Belegvorlage hinzufügen',
   'Add note'                    => 'Notiz erfassen',
   'Add part'                    => 'Artikel hinzufügen',
   'Add partsgroup'              => 'Warengruppe hinzufügen',
@@ -978,7 +979,9 @@ $self->{texts} = {
   'Do you really want to delete this draft?' => 'Wollen Sie diesen Entwurf wirklich löschen?',
   'Do you really want to delete this invoice?' => 'Wollen Sie diese Rechnung wirklich löschen?',
   'Do you really want to delete this object?' => 'Wollen Sie dieses Objekt wirklich löschen?',
+  'Do you really want to delete this record template?' => 'Wollen Sie diese Belegvorlage wirklich löschen?',
   'Do you really want to delete this warehouse?' => 'Wollen Sie dieses Lager wirklich l&ouml;schen?',
+  'Do you really want to load this record template? All unsaved data will be lose.' => 'Wollen Sie diese Belegvorlage wirklich laden? Alle nicht gespeicherten Daten gehen dabei verloren.',
   'Do you really want to revert to this version?' => 'Wollen Sie wirklich auf diese Version zurücksetzen?',
   'Do you really want to save?' => 'Wollen Sie wirklich speichern?',
   'Do you want to <b>limit</b> your search?' => 'Wollen Sie Ihre Suche <b>spezialisieren</b>?',
@@ -1268,6 +1271,7 @@ $self->{texts} = {
   'Existing file on server'     => 'Auf dem Server existierende Datei',
   'Existing pending follow-ups for this item' => 'Noch nicht erledigte Wiedervorlagen f&uuml;r dieses Dokument',
   'Existing profiles'           => 'Existierende Profile',
+  'Existing templates'          => 'Vorhandene Belegvorlagen',
   'Exp. bill. date'             => 'Vorauss. Abr.datum',
   'Exp. netamount'              => 'Vorauss. Summe',
   'Expected Tax'                => 'Erwartete Steuern',
@@ -1662,6 +1666,7 @@ $self->{texts} = {
   'List of database upgrades to be applied:' => 'Liste der noch einzuspielenden Datenbankupgrades:',
   'List of tax zones'           => 'Liste der Steuerzonen',
   'List open SEPA exports'      => 'Noch nicht ausgeführte SEPA-Exporte anzeigen',
+  'Load'                        => 'Laden',
   'Load an existing draft'      => 'Einen bestehenden Entwurf laden',
   'Load letter draft'           => 'Briefentwurf laden',
   'Load profile'                => 'Profil laden',
@@ -1753,6 +1758,7 @@ $self->{texts} = {
   'Mobile2'                     => 'Mobil 2',
   'Model'                       => 'Lieferanten-Art-Nr.',
   'Model (with X being a number)' => 'Lieferanten-Art-Nr. (X ist eine fortlaufende Zahl)',
+  'Modification date'           => 'Änderungsdatum',
   'Module'                      => 'Modul',
   'Module home page'            => 'Modul-Webseite',
   'Module name'                 => 'Modulname',
@@ -2102,6 +2108,7 @@ $self->{texts} = {
   'Please enter the name for the new client.' => 'Bitte geben Sie einen Namen für den neuen Mandanten ein.',
   'Please enter the name for the new group.' => 'Bitte geben Sie den Namen für die neue Gruppe ein.',
   'Please enter the name of the database that will be used as the template for the new database:' => 'Bitte geben Sie den Namen der Datenbank an, die als Vorlage f&uuml;r die neue Datenbank benutzt wird:',
+  'Please enter the new name:'  => 'Bitte geben Sie den neuen Namen ein:',
   'Please enter the sales tax identification number.' => 'Bitte geben Sie die Umsatzsteueridentifikationsnummer an.',
   'Please enter the taxnumber in the client configuration.' => 'Bitte geben Sie in der Mandantenkonfiguration die Steuernummer an.',
   'Please enter values'         => 'Bitte Werte eingeben',
@@ -2305,6 +2312,7 @@ $self->{texts} = {
   'Record Vendor Invoice'       => 'Einkaufsrechnung erfassen',
   'Record in'                   => 'Buchen auf',
   'Record number'               => 'Belegnummer',
+  'Record templates'            => 'Belegvorlagen',
   'Record type to create'       => 'Anzulegender Belegtyp',
   'Recorded Tax'                => 'Gespeicherte Steuern',
   'Recorded taxkey'             => 'Gespeicherter Steuerschlüssel',
@@ -2335,6 +2343,7 @@ $self->{texts} = {
   'Removed spoolfiles!'         => 'Druckdateien entfernt!',
   'Removed text blocks: #1'     => 'Entfernte Textblöcke: #1',
   'Removing marked entries from queue ...' => 'Markierte Einträge werden von der Warteschlange entfernt ...',
+  'Rename'                      => 'Umbenennen',
   'Renumber sections and function blocks' => 'Abschnitte/Funktionsblöcke neu nummerieren',
   'Replace the orphaned currencies by other not orphaned currencies. To do so, please delete the currency in the textfields above and replace it by another currency. You could loose or change unintentionally exchangerates. Go on very carefully since you could destroy transactions.' => 'Ersetze die Währungen durch andere gültige Währungen. Wenn Sie sich hierfür entscheiden, ersetzen Sie bitte alle Währungen, die oben angegeben sind, durch Währungen, die in Ihrem System ordnungsgemäß eingetragen sind. Alle eingetragenen Wechselkurse für die verwaiste Währung werden dabei gelöscht. Bitte gehen Sie sehr vorsichtig vor, denn die betroffenen Buchungen können unter Umständen kaputt gehen.',
   'Report Positions'            => 'Berichte',
@@ -3147,6 +3156,7 @@ $self->{texts} = {
   'There are no entries that match the filter.' => 'Es gibt keine Einträge, auf die der Filter zutrifft.',
   'There are no items in stock.' => 'Dieser Artikel ist nicht eingelagert.',
   'There are no items on your TODO list at the moment.' => 'Ihre Aufgabenliste enth&auml;lt momentan keine Eintr&auml;ge.',
+  'There are no record templates yet.' => 'Es gibt noch keine Belegvorlagen.',
   'There are several options you can handle this problem, please select one:' => 'Bitte wählen Sie eine der folgenden Optionen, um mit dem Problem umzugehen:',
   'There are still transfers not matching the qty of the delivery order. Stock operations can not be changed later. Do you really want to proceed?' => 'Einige der Lagerbewegungen sind nicht vollständig und Lagerbewegungen können nachträglich nicht mehr verändert werden. Wollen Sie wirklich fortfahren?',
   'There are undefined currencies in your system.' => 'In Ihrer Datenbank wurden Währungen benutzt, die nicht ordnungsgemäß in den Währungen eingetragen wurden.',
diff --git a/templates/webpages/record_template/dialog.html b/templates/webpages/record_template/dialog.html
new file mode 100644 (file)
index 0000000..4131b9b
--- /dev/null
@@ -0,0 +1,56 @@
+[%- USE T8 %]
+[%- USE L %]
+[%- USE LxERP %]
+[%- USE HTML %][%- USE JavaScript -%]
+
+[% L.hidden_tag("", SELF.template_type, id="record_template_dialog_template_type",
+                "data-controller"=SELF.data.controller,
+                "data-load_action"=SELF.data.load_action,
+                "data-save_action"=SELF.data.save_action,
+                "data-form_selector"=SELF.data.form_selector) %]
+
+<h2 class="listheading">[% LxERP.t8("Add new record template") %]</h2>
+
+<p>
+ [% LxERP.t8("Name") %]:
+ [% L.input_tag("", "", id="record_template_dialog_new_template_name") %]
+ [% L.button_tag("kivi.RecordTemplate.create()", LxERP.t8("Save")) %]
+</p>
+
+[% SET templates = SELF.templates.as_list %]
+
+[% IF templates.size %]
+
+<h2 class="listheading">[% LxERP.t8("Existing templates") %]</h2>
+
+<table>
+ <thead>
+  <tr class="listheading">
+   <th>[% LxERP.t8("Action") %]</th>
+   <th>[% LxERP.t8("Name") %]</th>
+   <th>[% LxERP.t8("Modification date") %]</th>
+  </tr>
+ </thead>
+
+ <tbody>
+[% FOREACH template = templates %]
+  <tr class="listrow">
+   <td>
+    [% L.hidden_tag("", template.template_name, id="record_template_dialog_template_name_" _ template.id) %]
+    [% L.button_tag("kivi.RecordTemplate.load(" _ template.id _ ")", LxERP.t8("Load")) %]
+    [% L.button_tag("kivi.RecordTemplate.save(" _ template.id _ ")", LxERP.t8("Save")) %]
+    [% L.button_tag("kivi.RecordTemplate.rename(" _ template.id _ ")", LxERP.t8("Rename")) %]
+    [% L.button_tag("kivi.RecordTemplate.delete(" _ template.id _ ")", LxERP.t8("Delete")) %]
+   </td>
+   <td>[% HTML.escape(template.template_name) %]</td>
+   <td>[% HTML.escape(template.mtime.to_kivitendo) %] [% HTML.escape(template.mtime.to_kivitendo_time) %]</td>
+  </tr>
+[% END %]
+ </tbody>
+
+</table>
+[% ELSE %]
+
+<p>[% LxERP.t8("There are no record templates yet.") %]</p>
+
+[% END %]