Merge branch 'master' of git@lx-office.linet-services.de:lx-office-erp
authorSven Schöling <s.schoeling@linet-services.de>
Wed, 19 Jan 2011 09:59:01 +0000 (10:59 +0100)
committerSven Schöling <s.schoeling@linet-services.de>
Wed, 19 Jan 2011 09:59:01 +0000 (10:59 +0100)
SL/CT.pm
SL/CVar.pm
SL/IC.pm
SL/IS.pm
SL/TransNumber.pm
bin/mozilla/ar.pl
bin/mozilla/invoice_io.pl
bin/mozilla/io.pl
bin/mozilla/is.pl
bin/mozilla/oe.pl
sql/Pg-upgrade2/invalid_entries_in_custom_variables_validity.sql [new file with mode: 0644]

index 3c17ca5..58a4600 100644 (file)
--- a/SL/CT.pm
+++ b/SL/CT.pm
@@ -44,6 +44,7 @@ use SL::CVar;
 use SL::DBUtils;
 use SL::FU;
 use SL::Notes;
+use SL::TransNumber;
 
 use strict;
 
@@ -261,21 +262,12 @@ sub save_customer {
     }
 
   } else {
-    if (!$form->{customernumber} && $form->{business}) {
-      $form->{customernumber} =
-        $form->update_business($myconfig, $form->{business}, $dbh);
-    }
-    if (!$form->{customernumber}) {
-      $form->{customernumber} =
-        $form->update_defaults($myconfig, "customernumber", $dbh);
-    }
-
-    $query  = qq|SELECT c.id FROM customer c WHERE c.customernumber = ?|;
-    ($f_id) = selectrow_query($form, $dbh, $query, $form->{customernumber});
-    if ($f_id ne "") {
-      $main::lxdebug->leave_sub();
-      return 3;
-    }
+    my $customernumber      = SL::TransNumber->new(type        => 'customer',
+                                                   dbh         => $dbh,
+                                                   number      => $form->{customernumber},
+                                                   business_id => $form->{business},
+                                                   save        => 1);
+    $form->{customernumber} = $customernumber->create_unique unless $customernumber->is_unique;
 
     $query = qq|SELECT nextval('id')|;
     ($form->{id}) = selectrow_query($form, $dbh, $query);
@@ -488,9 +480,11 @@ sub save_vendor {
     $query = qq|INSERT INTO vendor (id, name) VALUES (?, '')|;
     do_query($form, $dbh, $query, $form->{id});
 
-    if ( !$form->{vendornumber} ) {
-      $form->{vendornumber} = $form->update_defaults( $myconfig, "vendornumber", $dbh );
-    }
+    my $vendornumber      = SL::TransNumber->new(type   => 'vendor',
+                                                 dbh    => $dbh,
+                                                 number => $form->{vendornumber},
+                                                 save   => 1);
+    $form->{vendornumber} = $vendornumber->create_unique unless $vendornumber->is_unique;
   }
 
   $query =
index 0de9a4b..779bfc3 100644 (file)
@@ -338,10 +338,13 @@ sub save_custom_variables {
 
     do_statement($form, $sth, $query, @values);
 
-    my $valid_index = "$params{name_prefix}cvar_$config->{name}$params{name_postfix}_valid";
-    $self->save_custom_variables_validity(trans_id => $params{trans_id}, config_id => $config->{id},
-      validity => ($params{variables}{$valid_index} || $params{always_valid} ? 1 : 0)
-    );
+    if ($params{save_validity}) {
+      my $valid_index = "$params{name_prefix}cvar_$config->{name}$params{name_postfix}_valid";
+      $self->save_custom_variables_validity(trans_id  => $params{trans_id},
+                                            config_id => $config->{id},
+                                            validity  => ($params{variables}{$valid_index} || $params{always_valid} ? 1 : 0)
+                                           );
+    }
   }
 
   $sth->finish();
index ac3d6f2..b6007d9 100644 (file)
--- a/SL/IC.pm
+++ b/SL/IC.pm
@@ -583,10 +583,11 @@ sub save {
     }
   }
 
-  CVar->save_custom_variables('dbh'       => $dbh,
-                              'module'    => 'IC',
-                              'trans_id'  => $form->{id},
-                              'variables' => $form);
+  CVar->save_custom_variables(dbh           => $dbh,
+                              module        => 'IC',
+                              trans_id      => $form->{id},
+                              variables     => $form,
+                              save_validity => 1);
 
   # commit
   my $rc = $dbh->commit;
index 3b031bd..666d8bc 100644 (file)
--- a/SL/IS.pm
+++ b/SL/IS.pm
@@ -1997,6 +1997,10 @@ sub get_pricegroups_for_parts {
     my ($price, $selectedpricegroup_id) = split(/--/, $form->{"sellprice_pg_$i"});
 
     my $pricegroup_old = $form->{"pricegroup_old_$i"};
+
+    # sellprice has format 13,0000 or 0,00000, can't check for 0 numerically
+    my $sellprice = $form->{"sellprice_$i"};
+    my $pricegroup_id = $form->{"pricegroup_id_$i"};
     $form->{"new_pricegroup_$i"} = $selectedpricegroup_id;
     $form->{"old_pricegroup_$i"} = $pricegroup_old;
 
@@ -2075,10 +2079,27 @@ sub get_pricegroups_for_parts {
       $pkr->{price} = $form->format_amount($myconfig, $pkr->{price}, 5);
 
       if ($selectedpricegroup_id eq undef) {
-        if ($pkr->{pricegroup_id} eq $form->{customer_klass}) {
-
+        # new entries in article list, either old invoice was loaded (edit) or a new article was added
+        # Case A: open old invoice, no pricegroup selected
+        # Case B: add new article to invoice, no pricegroup selected
+
+        # to distinguish case A and B the variable pricegroup_id_$i is used
+        # for new articles this variable isn't defined, for loaded articles it is
+        # sellprice can't be used, as it already has 0,00 set
+        
+        if ($pkr->{pricegroup_id} eq $form->{"pricegroup_id_$i"} and defined $form->{"pricegroup_id_$i"}) {
+          # Case A
           $pkr->{selected}  = ' selected';
 
+        } elsif ($pkr->{pricegroup_id} eq $form->{customer_klass} 
+                 and not defined $form->{"pricegroup_id_$i"} 
+                 and $pkr->{price} != 0    # only use customer pricegroup price if it has a value, else use default_sellprice
+                                           # for the case where pricegroup prices haven't been set
+                ) {
+          # Case B: use default pricegroup of customer
+
+          $pkr->{selected}  = ' selected'; # unless $form->{selected};
+
           # no customer pricesgroup set
           if ($pkr->{price} == $pkr->{default_sellprice}) {
 
@@ -2087,29 +2108,34 @@ sub get_pricegroups_for_parts {
           } else {
 
 # this sub should not set anything and only return. --sschoeling, 20090506
-#            $form->{"sellprice_$i"} = $pkr->{price};
+# is this correct? put in again... -- grichardson 20110119
+            $form->{"sellprice_$i"} = $pkr->{price};
           }
 
-        } elsif ($pkr->{price} == $pkr->{default_sellprice}) {
+        } elsif ($pkr->{price} == $pkr->{default_sellprice} and $pkr->{default_sellprice} != 0) {
           $pkr->{price}    = $form->{"sellprice_$i"};
           $pkr->{selected} = ' selected';
         }
-      } else {
+      }
+
+      # existing article: pricegroup or price changed
+      if ($selectedpricegroup_id or $selectedpricegroup_id == 0) {
         if ($selectedpricegroup_id ne $pricegroup_old) {
+          # pricegroup has changed
           if ($pkr->{pricegroup_id} eq $selectedpricegroup_id) {
             $pkr->{selected}  = ' selected';
           }
-        } elsif (    (   $form->parse_amount($myconfig, $price_new)
-                      != $form->parse_amount($myconfig, $form->{"sellprice_$i"}))
-                 and ($price_new ne 0)) {
+        } elsif (($price_new != $form->{"sellprice_$i"}) and ($price_new ne 0) and defined $price_new) {
+          # sellprice has changed
+          # when loading existing invoices $price_new is NULL
           if ($pkr->{pricegroup_id} == 0) {
             $pkr->{price}     = $form->{"sellprice_$i"};
             $pkr->{selected}  = ' selected';
           }
         } elsif ($pkr->{pricegroup_id} eq $selectedpricegroup_id) {
+          # neither sellprice nor pricegroup changed
           $pkr->{selected}  = ' selected';
-          if (    ($pkr->{pricegroup_id} == 0)
-              and ($pkr->{price} == $form->{"sellprice_$i"})) {
+          if (    ($pkr->{pricegroup_id} == 0) and ($pkr->{price} == $form->{"sellprice_$i"})) {
             # $pkr->{price}                         = $form->{"sellprice_$i"};
           } else {
             $pkr->{price} = $form->{"sellprice_$i"};
index 14795e4..9aed126 100644 (file)
@@ -11,16 +11,9 @@ use SL::DBUtils;
 
 use Rose::Object::MakeMethods::Generic
 (
- scalar => [ qw(type id number save dbh dbh_provided) ],
+ scalar => [ qw(type id number save dbh dbh_provided business_id) ],
 );
 
-# has 'type'         => ( is => 'rw', required => 1 );
-# has 'id'           => ( is => 'rw' );
-# has 'number'       => ( is => 'rw' );
-# has 'save'         => ( is => 'rw', default  => 1 );
-# has 'dbh'          => ( is => 'rw' );
-# has 'dbh_provided' => ( is => 'rw' );
-
 Readonly my @SUPPORTED_TYPES => qw(invoice credit_note customer vendor sales_delivery_order purchase_delivery_order sales_order purchase_order sales_quotation request_quotation);
 
 sub new {
@@ -32,6 +25,7 @@ sub new {
   $self->dbh_provided($self->dbh);
   $self->dbh($::form->get_standard_dbh) if !$self->dbh;
   $self->save(1) unless defined $self->save;
+  $self->business_id(undef) if $self->type ne 'customer';
 
   return $self;
 }
@@ -112,7 +106,9 @@ sub create_unique {
   my $form    = $main::form;
   my %filters = $self->_get_filters();
 
+  $self->dbh->begin_work;
   do_query($form, $self->dbh, qq|LOCK TABLE defaults|);
+  do_query($form, $self->dbh, qq|LOCK TABLE business|) if $self->business_id;
 
   my $where = $filters{where} ? ' WHERE ' . $filters{where} : '';
   my $query = <<SQL;
@@ -123,8 +119,10 @@ SQL
 
   my %numbers_in_use = selectall_as_map($form, $self->dbh, $query, $filters{trans_number}, 'in_use');
 
-  my ($number)   = selectfirst_array_query($form, $self->dbh, qq|SELECT $filters{numberfield} FROM defaults|);
-  $number      ||= '';
+  my $number;
+  ($number)   = selectfirst_array_query($form, $self->dbh, qq|SELECT customernumberinit FROM business WHERE id = ?|, $self->business_id) if $self->business_id;
+  ($number)   = selectfirst_array_query($form, $self->dbh, qq|SELECT $filters{numberfield} FROM defaults|)                               if !$number;
+  $number   ||= '';
 
   do {
     if ($number =~ m/\d+$/) {
@@ -138,7 +136,11 @@ SQL
   } while ($numbers_in_use{$number});
 
   if ($self->save) {
-    do_query($form, $self->dbh, qq|UPDATE defaults SET $filters{numberfield} = ?|, $number);
+    if ($self->business_id) {
+      do_query($form, $self->dbh, qq|UPDATE business SET customernumberinit = ? WHERE id = ?|, $number, $self->business_id);
+    } else {
+      do_query($form, $self->dbh, qq|UPDATE defaults SET $filters{numberfield} = ?|, $number);
+    }
     $self->dbh->commit if !$self->dbh_provided;
   }
 
index 585301c..3d4fe26 100644 (file)
@@ -271,17 +271,9 @@ sub form_header {
   $form->{exchangerate} = $form->{forex} if $form->{forex};
 
   # format amounts
-  $form->{exchangerate} =
-    $form->format_amount(\%myconfig, $form->{exchangerate});
-
-  if ($form->{exchangerate} == 0) {
-    $form->{exchangerate} = "";
-  }
-
-  $form->{creditlimit} =
-    $form->format_amount(\%myconfig, $form->{creditlimit}, 0, "0");
-  $form->{creditremaining} =
-    $form->format_amount(\%myconfig, $form->{creditremaining}, 0, "0");
+  $form->{exchangerate}    = $form->{exchangerate} ? $form->format_amount(\%myconfig, $form->{exchangerate}) : '';
+  $form->{creditlimit}     = $form->format_amount(\%myconfig, $form->{creditlimit}, 0, "0");
+  $form->{creditremaining} = $form->format_amount(\%myconfig, $form->{creditremaining}, 0, "0");
 
   $exchangerate = qq|
 <input type=hidden name=forex value=$form->{forex}>
index 8c803fb..9527686 100644 (file)
@@ -126,7 +126,8 @@ sub set_pricegroup {
         if ($item->{selected} && ($pricegroup_id != 0)) {
           $form->{"pricegroup_old_$j"} = $pricegroup_id;
           $form->{"price_new_$j"}      = $price;
-          $form->{"sellprice_$j"}      = $price;
+          # edit: don't change the sellprice here
+          # $form->{"sellprice_$j"}      = $price;   # this must only be updated for existing articles, not new ones
         }
         if ($pricegroup_id == 0) {
           $form->{"price_new_$j"} = $form->{"sellprice_$j"};
index 9260981..3ec65da 100644 (file)
@@ -288,9 +288,11 @@ sub display_row {
       # for last row and report
       # set pricegroup drop down list from report menu
       if ($form->{"sellprice_$i"} != 0) {
+        # remember the pricegroup_id in pricegroup_old
+        # but don't overwrite it
         $form->{"pricegroup_old_$i"} = $form->{"pricegroup_id_$i"};
         my $default_option           = $form->{"sellprice_$i"}.'--'.$form->{"pricegroup_id_$i"};
-        $column_data{sellprice_pg}   = NTI($cgi->popup_menu("sellpricepg_$i", [ $default_option ], $default_option, { $default_option => $form->{"pricegroup_$i"} || '' }));
+        $column_data{sellprice_pg}   = NTI($cgi->popup_menu("sellprice_pg_$i", [ $default_option ], $default_option, { $default_option => $form->{"pricegroup_$i"} || '' }));
       } else {
         $column_data{sellprice_pg} = qq|&nbsp;|;
       }
index aeba187..740002b 100644 (file)
@@ -266,7 +266,13 @@ sub prepare_invoice {
 
     # get pricegroups for parts
     IS->get_pricegroups_for_parts(\%myconfig, \%$form);
-    set_pricegroup($_) for 1 .. $form->{rowcount};
+
+    # Problem: set_pricegroup resets the sellprice of old invoices to the price
+    # currently defined in the pricegroup, which is a problem if the price has
+    # changed, as the old invoice gets the new price
+    # set_pricegroup must never be called, when an old invoice is initially loaded
+
+    # set_pricegroup($_) for 1 .. $form->{rowcount};
   }
   $main::lxdebug->leave_sub();
 }
@@ -780,6 +786,11 @@ sub use_as_template {
   $form->{paidaccounts} = 1;
   $form->{rowcount}--;
   $form->{invdate} = $form->current_date(\%myconfig);
+
+  # remember pricegroups for "use as template"
+  IS->get_pricegroups_for_parts(\%myconfig, \%$form);
+  set_pricegroup($_) for 1 .. $form->{rowcount};
+
   &display_form;
 
   $main::lxdebug->leave_sub();
index b7d8653..0e469d8 100644 (file)
@@ -1419,6 +1419,10 @@ sub invoice {
 
   }
 
+  #  show pricegroup in newly loaded invoice when creating invoice from quotation/order
+  IS->get_pricegroups_for_parts(\%myconfig, \%$form);
+  set_pricegroup($_) for 1 .. $form->{rowcount};
+
   &display_form;
 
   $main::lxdebug->leave_sub();
diff --git a/sql/Pg-upgrade2/invalid_entries_in_custom_variables_validity.sql b/sql/Pg-upgrade2/invalid_entries_in_custom_variables_validity.sql
new file mode 100644 (file)
index 0000000..62dd944
--- /dev/null
@@ -0,0 +1,9 @@
+-- @tag: invalid_entries_in_custom_variables_validity
+-- @description: Ungültige Einträge in custom_variables_validity bereinigen
+-- @depends: release_2_6_1
+-- @charset: utf-8
+DELETE FROM custom_variables_validity
+WHERE trans_id NOT IN (
+  SELECT id
+  FROM parts
+);