Preisgruppen: Bernds parse_amount wieder eingeführt
[kivitendo-erp.git] / SL / IS.pm
index f9f8046..918ca19 100644 (file)
--- a/SL/IS.pm
+++ b/SL/IS.pm
@@ -46,6 +46,7 @@ use SL::GenericTranslations;
 use SL::MoreCommon;
 use SL::IC;
 use SL::IO;
+use SL::TransNumber;
 use Data::Dumper;
 
 use strict;
@@ -515,7 +516,7 @@ sub post_invoice {
   my ($self, $myconfig, $form, $provided_dbh, $payments_only) = @_;
 
   # connect to database, turn off autocommit
-  my $dbh = $provided_dbh ? $provided_dbh : $form->dbconnect_noauto($myconfig);
+  my $dbh = $provided_dbh ? $provided_dbh : $form->get_standard_dbh;
 
   my ($query, $sth, $null, $project_id, @values);
   my $exchangerate = 0;
@@ -538,6 +539,9 @@ sub post_invoice {
       &reverse_invoice($dbh, $form);
 
     } else {
+      my $trans_number   = SL::TransNumber->new(type => $form->{type}, dbh => $dbh, number => $form->{invnumber}, save => 1);
+      $form->{invnumber} = $trans_number->create_unique unless $trans_number->is_unique;
+
       $query = qq|SELECT nextval('glid')|;
       ($form->{"id"}) = selectrow_query($form, $dbh, $query);
 
@@ -1277,7 +1281,7 @@ sub cogs {
 
     # total expenses and inventory
     # sellprice is the cost of the item
-    my $linetotal = $form->round_amount(($ref->{sellprice} * $qty) / ( ($ref->{price_factor} ̣|| 1) * ( $basefactor || 1 )), 2);
+    my $linetotal = $form->round_amount(($ref->{sellprice} * $qty) / ( ($ref->{price_factor} || 1) * ( $basefactor || 1 )), 2);
 
     if (!$main::eur) {
       $ref->{expense_accno} = ($form->{"expense_accno_$row"}) ? $form->{"expense_accno_$row"} : $ref->{expense_accno};
@@ -1373,6 +1377,20 @@ sub delete_invoice {
 
   my @values = (conv_i($form->{id}));
 
+  # Falls wir ein Storno haben, müssen zwei Felder in der stornierten Rechnung wieder
+  # zurückgesetzt werden. Vgl:
+  #  id | storno | storno_id |  paid   |  amount   
+  #----+--------+-----------+---------+-----------
+  # 18 | f      |           | 0.00000 | 119.00000
+  # ZU:
+  # 18 | t      |           |  119.00000 |  119.00000
+  #
+  if($form->{storno}){
+    # storno_id auslesen und korrigieren
+    my ($invoice_id) = selectfirst_array_query($form, $dbh, qq|SELECT storno_id FROM ar WHERE id = ?|,@values);
+    do_query($form, $dbh, qq|UPDATE ar SET storno = 'f', paid = 0 WHERE id = ?|, $invoice_id);
+  }
+
   # delete AR record
   do_query($form, $dbh, qq|DELETE FROM ar WHERE id = ?|, @values);
 
@@ -1979,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;
 
@@ -2057,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}) {
 
@@ -2069,29 +2108,36 @@ 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';
         }
       }
 
+      # 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 (($price_new != $form->{"sellprice_$i"}) and ($price_new ne 0)) {
+        } elsif ( ($form->parse_amount($myconfig, $price_new)
+                 != $form->parse_amount($myconfig, $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"};