Merge branch 'master' of vc.linet-services.de:public/lx-office-erp
authorSven Schöling <s.schoeling@linet-services.de>
Wed, 8 Feb 2012 09:37:29 +0000 (10:37 +0100)
committerSven Schöling <s.schoeling@linet-services.de>
Wed, 8 Feb 2012 09:37:29 +0000 (10:37 +0100)
13 files changed:
SL/Auth.pm
SL/CT.pm
SL/DN.pm
SL/IR.pm
SL/RP.pm
bin/mozilla/dn.pl
doc/changelog
locale/de/all
locale/en/all
sql/Pg-upgrade2/auth_enable_ct_all_edit.pl [new file with mode: 0644]
templates/webpages/dunning/show_dunning_bottom.html
templates/webpages/dunning/show_invoices.html
templates/webpages/report_generator/html_report.html

index d361a3d..870ead1 100644 (file)
@@ -947,7 +947,8 @@ sub all_rights_full {
     ["crm_notices",                    $locale->text("CRM notices")],
     ["crm_other",                      $locale->text("CRM other")],
     ["--master_data",                  $locale->text("Master Data")],
-    ["customer_vendor_edit",           $locale->text("Create and edit customers and vendors")],
+    ["customer_vendor_edit",           $locale->text("Create customers and vendors. Edit all vendors. Edit only customers where salesman equals employee (login)")],
+    ["customer_vendor_all_edit",       $locale->text("Create customers and vendors. Edit all vendors. Edit all customers")],
     ["part_service_assembly_edit",     $locale->text("Create and edit parts, services, assemblies")],
     ["project_edit",                   $locale->text("Create and edit projects")],
     ["--ar",                           $locale->text("AR")],
index 3be8ce9..b46ee09 100644 (file)
--- a/SL/CT.pm
+++ b/SL/CT.pm
@@ -769,6 +769,13 @@ sub search {
     push(@values, conv_i($form->{business_id}));
   }
 
+  # Nur Kunden finden, bei denen ich selber der Verkäufer bin
+  # Gilt nicht für Lieferanten
+  if ($cv eq 'customer' &&   !$main::auth->assert('customer_vendor_all_edit', 1)) {
+    $where .= qq| AND ct.salesman_id = (select id from employee where login= ?)|;
+    push(@values, $form->{login});
+  }
+
   my ($cvar_where, @cvar_values) = CVar->build_filter_query('module'         => 'CT',
                                                             'trans_id_field' => 'ct.id',
                                                             'filter'         => $form);
index a1db029..6d00f43 100644 (file)
--- a/SL/DN.pm
+++ b/SL/DN.pm
@@ -509,7 +509,7 @@ sub get_invoices {
 
   $query =
     qq|SELECT
-         a.id, a.ordnumber, a.transdate, a.invnumber, a.amount,
+         a.id, a.ordnumber, a.transdate, a.invnumber, a.amount, a.language_id,
          ct.name AS customername, a.customer_id, a.duedate,
          a.amount - a.paid AS open_amount,
 
@@ -669,7 +669,7 @@ sub get_dunning {
   my $sortorder = join ', ', map { "$_ $sortdir" } @{ $sort_columns{$sortkey} };
 
   my $query =
-    qq|SELECT a.id, a.ordnumber, a.invoice, a.transdate, a.invnumber, a.amount,
+    qq|SELECT a.id, a.ordnumber, a.invoice, a.transdate, a.invnumber, a.amount, a.language_id,
          ct.name AS customername, ct.id AS customer_id, a.duedate, da.fee,
          da.interest, dn.dunning_description, da.transdate AS dunning_date,
          da.duedate AS dunning_duedate, da.dunning_id, da.dunning_config_id,
index 7f4389f..edf55f1 100644 (file)
--- a/SL/IR.pm
+++ b/SL/IR.pm
@@ -207,9 +207,9 @@ sub post_invoice {
 
       next if $payments_only;
 
-      # update parts table
+      # update parts table by setting lastcost to current price, don't allow negative values by using abs
       $query = qq|UPDATE parts SET lastcost = ? WHERE id = ?|;
-      @values = ($form->{"sellprice_$i"}, conv_i($form->{"id_$i"}));
+      @values = (abs($form->{"sellprice_$i"}), conv_i($form->{"id_$i"}));
       do_query($form, $dbh, $query, @values);
 
       # check if we sold the item already and
index d371912..072c54b 100644 (file)
--- a/SL/RP.pm
+++ b/SL/RP.pm
@@ -521,7 +521,7 @@ sub get_accounts_g {
                      FROM acc_trans acc
                      INNER JOIN chart c ON (acc.chart_id = c.id AND c.link LIKE '%AR_paid%')
                      WHERE 1=1 $inwhere AND acc.trans_id = ac.trans_id)
-                  / (SELECT amount FROM ar WHERE id = ac.trans_id)
+                  / COALESCE((SELECT amount FROM ar WHERE id = ac.trans_id and amount != 0 ), 1)
                 ) AS amount, c.pos_eur
        FROM acc_trans ac
        LEFT JOIN chart c ON (c.id  = ac.chart_id)
index 6c3492b..4b6210b 100644 (file)
@@ -133,6 +133,10 @@ sub show_invoices {
       map { $_->{SELECTED} = $_->{id} == $row->{next_dunning_config_id} } @{ $row->{DUNNING_CONFIG } };
     }
     map { $row->{$_} = $form->format_amount(\%myconfig, $row->{$_} * 1, -2) } qw(amount open_amount fee interest);
+
+    if ($row->{'language_id'}) {
+      $row->{language} = SL::DB::Manager::Language->find_by('id' => $row->{'language_id'})->{'description'};
+    }
   }
 
   $form->get_lists('printers'  => 'printers',
@@ -150,6 +154,8 @@ sub show_invoices {
                                           'no_opendocument' => 1,);
 
   $form->header();
+  $form->{onload} = "document.getElementsByName('language_id')[0].disabled =
+        !document.getElementsByName('force_lang')[0].checked;";
   print $form->parse_html_template("dunning/show_invoices");
 
   $main::lxdebug->leave_sub();
@@ -199,6 +205,8 @@ sub save_dunning {
   my @rows = ();
   undef($form->{DUNNING_PDFS});
 
+  my $saved_language_id = $form->{language_id};
+
   if ($form->{groupinvoices}) {
     my %dunnings_for;
 
@@ -214,6 +222,7 @@ sub save_dunning {
       push @{ $level }, { "row"                    => $i,
                           "invoice_id"             => $form->{"inv_id_$i"},
                           "customer_id"            => $form->{"customer_id_$i"},
+                          "language_id"            => $form->{"language_id_$i"},
                           "next_dunning_config_id" => $form->{"next_dunning_config_id_$i"},
                           "email"                  => $form->{"email_$i"}, };
     }
@@ -221,7 +230,9 @@ sub save_dunning {
     foreach my $levels (values %dunnings_for) {
       foreach my $level (values %{ $levels }) {
         next unless scalar @{ $level };
-
+        if (!$form->{force_lang}) {
+          $form->{language_id} = @{$level}[0]->{language_id};
+        }
         DN->save_dunning(\%myconfig, $form, $level);
       }
     }
@@ -233,12 +244,18 @@ sub save_dunning {
       my $level = [ { "row"                    => $i,
                       "invoice_id"             => $form->{"inv_id_$i"},
                       "customer_id"            => $form->{"customer_id_$i"},
+                      "language_id"            => $form->{"language_id_$i"},
                       "next_dunning_config_id" => $form->{"next_dunning_config_id_$i"},
                       "email"                  => $form->{"email_$i"}, } ];
+      if (!$form->{force_lang}) {
+        $form->{language_id} = @{$level}[0]->{language_id};
+      }
       DN->save_dunning(\%myconfig, $form, $level);
     }
   }
 
+  $form->{language_id} = $saved_language_id;
+
   if($form->{DUNNING_PDFS}) {
     DN->melt_pdfs(\%myconfig, $form, $form->{copies});
   }
@@ -352,6 +369,7 @@ sub show_dunning {
     'checkbox'            => { 'text' => '', 'visible' => 'HTML' },
     'dunning_description' => { 'text' => $locale->text('Dunning Level') },
     'customername'        => { 'text' => $locale->text('Customername') },
+    'language'            => { 'text' => $locale->text('Language') },
     'invnumber'           => { 'text' => $locale->text('Invnumber') },
     'transdate'           => { 'text' => $locale->text('Invdate') },
     'duedate'             => { 'text' => $locale->text('Invoice Duedate') },
@@ -364,12 +382,12 @@ sub show_dunning {
   );
 
   $report->set_columns(%column_defs);
-  $report->set_column_order(qw(checkbox dunning_description customername invnumber transdate
+  $report->set_column_order(qw(checkbox dunning_description customername language invnumber transdate
                                duedate amount dunning_date dunning_duedate fee interest salesman));
   $report->set_sort_indicator($form->{sort}, $form->{sortdir});
 
   my $edit_url  = sub { build_std_url('script=' . ($_[0]->{invoice} ? 'is' : 'ar') . '.pl', 'action=edit', 'callback') . '&id=' . $::form->escape($_[0]->{id}) };
-  my $print_url = build_std_url('action=print_dunning', 'format=pdf', 'media=screen') . '&dunning_id=';
+  my $print_url = sub { build_std_url('action=print_dunning', 'format=pdf', 'media=screen', 'dunning_id='.$_[0]->{dunning_id}, 'language_id=' . $_[0]->{language_id}) };
   my $sort_url  = build_std_url('action=show_dunning', grep { $form->{$_} } @filter_field_list);
 
   foreach my $name (qw(dunning_description customername invnumber transdate duedate dunning_date dunning_duedate salesman)) {
@@ -396,6 +414,10 @@ sub show_dunning {
       $first_row_for_dunning = 1;
     }
 
+    if ($ref->{'language_id'}) {
+      $ref->{language} = SL::DB::Manager::Language->find_by('id' => $ref->{'language_id'})->{'description'};
+    }
+
     my $row = { };
     foreach my $column (keys %{ $ref }) {
       $row->{$column} = {
@@ -404,7 +426,7 @@ sub show_dunning {
         'align' => $alignment{$column},
 
         'link'  => (  $column eq 'invnumber'           ? $edit_url->($ref)
-                    : $column eq 'dunning_description' ? $print_url . E($ref->{dunning_id})
+                    : $column eq 'dunning_description' ? $print_url->($ref)
                     :                                    ''),
       };
     }
@@ -416,6 +438,13 @@ sub show_dunning {
       'align'    => 'center',
     };
 
+    if ($first_row_for_dunning) {
+      $row->{language} = {'raw_data' => $cgi->hidden('-name' => "language_id_$i", '-value' => $ref->{language_id})
+                                        . " $ref->{language}" };
+    } else {
+      $row->{language} = { };
+    }
+
     push @{ $current_dunning_rows }, $row;
 
     $previous_dunning_id   = $ref->{dunning_id};
@@ -432,6 +461,8 @@ sub show_dunning {
 
   $report->set_options_from_form();
 
+  $form->{onload} = "document.getElementsByName('language_id')[0].disabled =
+        !document.getElementsByName('force_lang')[0].checked;";
   $report->generate_with_headers();
 
   $main::lxdebug->leave_sub();
@@ -448,6 +479,7 @@ sub print_dunning {
   $form->{rowcount}     = 1;
   $form->{selected_1}   = 1;
   $form->{dunning_id_1} = $form->{dunning_id};
+  $form->{language_id_1} = $form->{language_id};
 
   print_multiple();
 
@@ -466,6 +498,7 @@ sub print_multiple {
   $form->{title} = $locale->text('Print dunnings');
 
   my @dunning_ids = map { $form->{"dunning_id_$_"} } grep { $form->{"selected_$_"} } (1..$form->{rowcount});
+  my @language_ids = map { $form->{"language_id_$_"} } grep { $form->{"selected_$_"} } (1..$form->{rowcount});
 
   if (!scalar @dunning_ids) {
     $form->error($locale->text('No dunnings have been selected for printing.'));
@@ -473,10 +506,17 @@ sub print_multiple {
 
   $form->{DUNNING_PDFS} = [];
 
+  my $saved_language_id = $form->{language_id};
+  my $i = 0;
   foreach my $dunning_id (@dunning_ids) {
+    if (!$form->{force_lang}) {
+      $form->{language_id} = $language_ids[$i];
+    }
     DN->print_invoice_for_fees(\%myconfig, $form, $dunning_id);
     DN->print_dunning(\%myconfig, $form, $dunning_id);
+    $i++;
   }
+  $form->{language_id} = $saved_language_id;
 
   if (scalar @{ $form->{DUNNING_PDFS} }) {
     $form->{dunning_id} = strftime("%Y%m%d", localtime time);
index e85c85e..65b4c23 100644 (file)
 - Mastertemplates für den Ausdruck sind in eigene Unterverzeichnisse gewandert.
   Dadurch wird das Hinzufügen neuer Vorlagensätze einfacher.
 
+- Zwei Rechterweiterung für 'eingeschränktere' Vertriebspartnerfunktion
+   Schreibschutz für Preise in Angebot und Suchfunktion in Stammdaten Kunden nur für Mitarbeiter freigeben, die auch
+   gleichzeitig als Verkäufer für den Kunden eingetragen sind. Rechtebeschreibung im Admin-Menü wie folgt:
+    * Preise und Rabatt in Formularen frei anpassen (falls deaktiviert,
+      wird allerdings NUR das textfield auf READONLY gesetzt / kann je nach Browserversion und technischen Fähigkeiten des Anwenders umgangen werden).
+    * Kunden und Lieferanten erfassen. Alle Lieferanten bearbeiten. Nur Kunden bearbeiten bei denen der Verkäufer gleich Bearbeiter (login) ist
 
   Kleinere neue Features und Detailverbesserungen:
   - á (LATIN SMALL LETTER A WITH ACUTE) wird in Latex-Vorlagen nicht mehr durch
index 7b1e4ab..4228c58 100644 (file)
@@ -447,7 +447,6 @@ $self->{texts} = {
   'Create a new payment term'   => 'Neue Zahlungsbedingungen anlegen',
   'Create a standard group'     => 'Eine Standard-Benutzergruppe anlegen',
   'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
-  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
   'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
   'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
   'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
@@ -462,6 +461,8 @@ $self->{texts} = {
   'Create bank collection via SEPA XML' => 'Bankeinzug via SEPA XML erstellen',
   'Create bank transfer'        => 'Überweisung erstellen',
   'Create bank transfer via SEPA XML' => 'Überweisung via SEPA XML erzeugen',
+  'Create customers and vendors. Edit all vendors. Edit all customers' => 'Kunden und Lieferanten erfassen. Alle Lieferanten bearbeiten. Alle Kunden bearbeiten',
+  'Create customers and vendors. Edit all vendors. Edit only customers where salesman equals employee (login)' => 'Kunden und Lieferanten erfassen. Alle Lieferanten bearbeiten. Nur Kunden bearbeiten bei denen der Verkäufer gleich Bearbeiter (login) ist',
   'Create invoice?'             => 'Rechnung erstellen?',
   'Create new'                  => 'Neu erfassen',
   'Create new business'         => 'Kunden-/Lieferantentyp erfassen',
@@ -731,7 +732,7 @@ $self->{texts} = {
   'Edit membership'             => 'Mitgliedschaft bearbeiten',
   'Edit note'                   => 'Notiz bearbeiten',
   'Edit payment term'           => 'Zahlungsbedingungen bearbeiten',
-  'Edit prices and discount (if not used, textfield is ONLY set readonly)' => 'Preise und Rabatt in Formularen frei anpassen (falls deaktiviert, wird allerdings NUR das textfield auf READONLY gesetzt / kann je nach Browserversion und technischen Fähigkeiten des Anwenders noch gehackt werden).',
+  'Edit prices and discount (if not used, textfield is ONLY set readonly)' => 'Preise und Rabatt in Formularen frei anpassen (falls deaktiviert, wird allerdings NUR das textfield auf READONLY gesetzt / kann je nach Browserversion und technischen Fähigkeiten des Anwenders noch umgangen werden)',
   'Edit rights'                 => 'Rechte bearbeiten',
   'Edit templates'              => 'Vorlagen bearbeiten',
   'Edit the Delivery Order'     => 'Lieferschein bearbeiten',
@@ -1279,6 +1280,7 @@ $self->{texts} = {
   'Output Number Format'        => 'Zahlenformat (Ausgabe)',
   'Outputformat'                => 'Ausgabeformat',
   'Overdue sales quotations and requests for quotations' => 'Überfällige Angebote und Preisanfragen',
+  'Override invoice language'   => 'Diese Sprache verwenden',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF'                         => 'PDF',
   'PDF (OpenDocument/OASIS)'    => 'PDF (OpenDocument/OASIS)',
index 4fc79c1..91b5d5d 100644 (file)
@@ -1180,6 +1180,7 @@ $self->{texts} = {
   'Output Number Format'        => '',
   'Outputformat'                => '',
   'Overdue sales quotations and requests for quotations' => '',
+  'Override invoice language'   => '',
   'Own Product'                 => '',
   'PAYMENT POSTED'              => '',
   'PDF'                         => '',
diff --git a/sql/Pg-upgrade2/auth_enable_ct_all_edit.pl b/sql/Pg-upgrade2/auth_enable_ct_all_edit.pl
new file mode 100644 (file)
index 0000000..0579675
--- /dev/null
@@ -0,0 +1,51 @@
+# @tag: auth_enable_ct_all_edit
+# @description: Zusätzliches Recht alle Kunden / Lieferanten editieren, war bisher standardmäßig IMMER so und kann jetzt deaktiviert werden
+#               falls es deaktiviert wird, kann ich den Kunden / Lieferanten nur editieren wenn ich selber als Verkäufer eingetragen bin
+# @depends: release_2_6_3
+# @charset: utf-8
+
+use utf8;
+use strict;
+use Data::Dumper;
+die("This script cannot be run from the command line.") unless ($main::form);
+
+sub mydberror {
+  my ($msg) = @_;
+  die($dbup_locale->text("Database update error:") .
+      "<br>$msg<br>" . $DBI::errstr);
+}
+
+sub do_update {
+  my $dbh   = $main::auth->dbconnect();
+  my $query = <<SQL;
+    SELECT id
+    FROM auth."group"
+    WHERE NOT EXISTS(
+      SELECT group_id
+      FROM auth.group_rights
+      WHERE (auth.group_rights.group_id = auth."group".id)
+        AND (auth.group_rights."right"  = 'customer_vendor_all_edit')
+    )
+SQL
+
+  my @group_ids = selectall_array_query($form, $dbh, $query);
+  if (@group_ids) {
+    $query = <<SQL;
+      INSERT INTO auth.group_rights (group_id, "right",          granted)
+      VALUES                        (?,        'customer_vendor_all_edit', TRUE)
+SQL
+    my $sth = prepare_query($form, $dbh, $query);
+
+    foreach my $id (@group_ids) {
+      do_statement($form, $sth, $query, $id);
+    }
+
+    $sth->finish();
+    $dbh->commit();
+  }
+
+  return 1;
+}
+
+return do_update();
+
index 0f452a4..f3eca31 100644 (file)
@@ -1,7 +1,11 @@
 [%- USE T8 %]
 [% USE HTML %]  <input type="hidden" name="rowcount" value="[% rowcount %]">
 
-  <p>[% PRINT_OPTIONS %]</p>
+  <p>
+    <input type="checkbox" name="force_lang" size="6" value="1" onclick="document.getElementsByName('language_id')[0].disabled = !document.getElementsByName('force_lang')[0].checked;">
+    [% 'Override invoice language' | T8 %]
+    [% PRINT_OPTIONS %]
+  </p>
 
   <p>
    [% 'Dunnings' | $T8 %]<br>
index cd8c434..2f99cc6 100644 (file)
@@ -4,7 +4,8 @@
 [% L.javascript_tag('jquery.checkall') %]
 [% SET all_active = 1 %][% FOREACH row = DUNNINGS %][% IF !row.active %][% SET all_active = 0 %][% LAST %][% END %][% END %]
 [% SET all_email = 1 %][% FOREACH row = DUNNINGS %][% IF !row.email %][% SET all_email = 0 %][% LAST %][% END %][% END %]
-<body>
+<body [% IF onload %] onload="[% onload %]"[% END %]>
+
  <script type="text/javascript" src="js/common.js"></script>
  <script type="text/javascript" src="js/dunning.js"></script>
 
@@ -28,6 +29,7 @@
    </th>
 
    <th class="listheading">[% 'Customername' | $T8 %]</th>
+   <th class="listheading">[% 'Language' | $T8 %]</th>
    <th class="listheading">[% 'Invno.' | $T8 %]</th>
    <th class="listheading">[% 'Invdate' | $T8 %]</th>
    <th class="listheading">[% 'Inv. Duedate' | $T8 %]</th>
@@ -57,6 +59,7 @@
      <td><input type="checkbox" name="active_[% loop.count %]" value="1" [% IF row.active %]checked[% END %]></td>
      <td><input type="checkbox" name="email_[% loop.count %]" value="1" [% IF row.email %]checked[% END %]></td>
      <td><input type="hidden" name="customername_[% loop.count %]" size="6" value="[% HTML.escape(row.customername) %]">[% HTML.escape(row.customername) %]</td>
+     <td><input type="hidden" name="language_id_[% loop.count %]" size="6" value="[% HTML.escape(row.language_id) %]">[% HTML.escape(row.language) %]</td>
      <td>
       <input type="hidden" name="invnumber_[% loop.count %]" size="6" value="[% HTML.escape(row.invnumber) %]">
       <a href="is.pl?action=edit&type=invoice&id=[% row.id | url %]">[% HTML.escape(row.invnumber) %]</a>
@@ -74,6 +77,8 @@
 
   <hr size=3 noshade>
 
+  <input type="checkbox" name="force_lang" size="6" value="1" onclick="document.getElementsByName('language_id')[0].disabled = !document.getElementsByName('force_lang')[0].checked;">
+  [% 'Override invoice language' | T8 %]
   [% PRINT_OPTIONS %]
 
   <br>
index 8b2d253..8c6250e 100644 (file)
@@ -1,5 +1,5 @@
 [%- USE T8 %]
-[% USE HTML %]<body>
+[% USE HTML %]<body[% IF onload %] onload="[% onload %]"[% END %]>
 
  <style type="text/css">
   <!--