From d8e504cc390420e0c53e46e7f4bdc63a571ecae9 Mon Sep 17 00:00:00 2001
From: einhverfr <einhverfr@4979c152-3d1c-0410-bac9-87ea11338e46>
Date: Wed, 18 Jul 2007 19:46:29 +0000
Subject: Applying Victor's patch for invoice reversals

git-svn-id: https://ledger-smb.svn.sourceforge.net/svnroot/ledger-smb/branches/1.2@1424 4979c152-3d1c-0410-bac9-87ea11338e46
---
 LedgerSMB/IR.pm | 50 ++++++++++++++++++++++++++++++++++++++++++++------
 LedgerSMB/IS.pm | 24 +++++++++++++++++++++---
 2 files changed, 65 insertions(+), 9 deletions(-)

diff --git a/LedgerSMB/IR.pm b/LedgerSMB/IR.pm
index 93b627e2..d9da72a9 100755
--- a/LedgerSMB/IR.pm
+++ b/LedgerSMB/IR.pm
@@ -274,10 +274,9 @@ sub post_invoice {
 
             if ( $form->{"inventory_accno_id_$i"} ) {
 
-                #start patch bug 1749690 ###########################################################################################################
+                my $totalqty = $form->{"qty_$i"};
 		# if this is a exit for the product 
 		if($form->{"qty_$i"}<0) {
-                    # check for unallocated entries at the same price to match our entry
                     $query = qq|
 				  SELECT i.id, i.qty, i.allocated, a.transdate
 			    	    FROM invoice i
@@ -298,8 +297,49 @@ sub post_invoice {
                         $allocated += $qty;
                         last if ( ( $totalqty -= $qty ) >= 0 );
             	    }
-		}
-                # stop patch bug 1749690 ###########################################################################################################
+ 		} else {
+ 		    # start patch bug 1755355 ###############################################################################
+ 		    # check for unallocated entries atthe same price to match our entry
+ 		    $query = qq|
+ 		                SELECT i.id, i.qty, i.allocated, a.transdate
+ 		                FROM invoice i
+ 		                JOIN parts p ON (p.id = i.parts_id)
+ 		                JOIN ap a ON (a.id = i.trans_id)
+ 		                WHERE i.parts_id = ? AND (i.qty + i.allocated) > 0 AND i.sellprice = ?
+ 		                ORDER BY transdate|;
+                     $sth = $dbh->prepare($query);
+ 		    $sth->execute( $form->{"id_$i"}, $form->{"sellprice_$i"}) || $form->dberror($query);
+ 		    while ( my $ref = $sth->fetchrow_hashref(NAME_lc) ) {
+ 			$form->db_parse_numeric(sth=>$sth, hashref => $ref);
+ 		        my $qty = $ref->{qty} + $ref->{allocated};
+ 		        if ( ( $qty - $totalqty ) > 0 ) { $qty = $totalqty; }
+ 		        # update allocated for sold item
+ 			$form->update_balance( $dbh, "invoice", "allocated", qq|id = $ref->{id}|, $qty * -1 );
+ 		        $allocated += $qty;
+ 		        last if ( ( $totalqty -= $qty ) <= 0 );
+ 		    }
+ 		} else {
+ 		    # start patch bug 1755355 ###############################################################################
+ 		    # check for unallocated entries atthe same price to match our entry
+ 		    $query = qq|
+ 		                SELECT i.id, i.qty, i.allocated, a.transdate
+ 		                FROM invoice i
+ 		                JOIN parts p ON (p.id = i.parts_id)
+ 		                JOIN ap a ON (a.id = i.trans_id)
+ 		                WHERE i.parts_id = ? AND (i.qty + i.allocated) > 0 AND i.sellprice = ?
+ 		                ORDER BY transdate|;
+                     $sth = $dbh->prepare($query);
+ 		    $sth->execute( $form->{"id_$i"}, $form->{"sellprice_$i"}) || $form->dberror($query);
+ 		    while ( my $ref = $sth->fetchrow_hashref(NAME_lc) ) {
+ 			$form->db_parse_numeric(sth=>$sth, hashref => $ref);
+ 		        my $qty = $ref->{qty} + $ref->{allocated};
+ 		        if ( ( $qty - $totalqty ) > 0 ) { $qty = $totalqty; }
+ 		        # update allocated for sold item
+ 			$form->update_balance( $dbh, "invoice", "allocated", qq|id = $ref->{id}|, $qty * -1 );
+ 		        $allocated += $qty;
+ 		        last if ( ( $totalqty -= $qty ) <= 0 );
+ 		    }
+                }
 
         	# add purchase to inventory
                 push @{ $form->{acc_trans}{lineitems} },
@@ -337,8 +377,6 @@ sub post_invoice {
                 $sth->execute( $form->{"id_$i"} )
                   || $form->dberror($query);
 
-                my $totalqty = $form->{"qty_$i"};
-
                 while ( my $ref = $sth->fetchrow_hashref(NAME_lc) ) {
                     $form->db_parse_numeric(sth=>$sth, hashref => $ref);
 
diff --git a/LedgerSMB/IS.pm b/LedgerSMB/IS.pm
index 3307bff2..5232b02b 100755
--- a/LedgerSMB/IS.pm
+++ b/LedgerSMB/IS.pm
@@ -1053,9 +1053,27 @@ sub post_invoice {
                     ) unless $form->{shipped};
                     
 		    if($form->{"qty_$i"}>0) {
-                        $allocated =
-                            &cogs( $dbh, $form, $form->{"id_$i"}, 
-                                   $form->{"qty_$i"}, $project_id );
+                         $query = qq|
+                               SELECT i.id, i.qty, i.allocated, a.transdate
+                               FROM invoice i
+                               JOIN parts p ON (p.id = i.parts_id)
+                               JOIN ar a ON (a.id = i.trans_id)
+                               WHERE i.parts_id = ? 
+                                     AND (i.qty + i.allocated) < 0 
+                                     AND i.sellprice = ?
+                               ORDER BY transdate|;
+                         $sth = $dbh->prepare($query);
+                         $sth->execute( $form->{"id_$i"}, $form->{"sellprice_$i"}) || $form->dberror($query);
+                         my $totalqty = $form->{"qty_$i"};
+                         while ( my $ref = $sth->fetchrow_hashref(NAME_lc) ) {
+                     	    $form->db_parse_numeric(sth=>$sth, hashref => $ref);
+                     	    my $qty = $ref->{qty} + $ref->{allocated};
+                     	    if ( ( $qty + $totalqty ) < 0 ) { $qty = -$totalqty; }
+                     	    # update allocated for sold item
+                     	    $form->update_balance( $dbh, "invoice", "allocated", qq|id = $ref->{id}|, (-1)*$qty);
+                     	    $allocated += $qty;
+                     	    last if ( ( $totalqty += $qty ) <= 0 );
+                         }
                     } else {
 			my $total_inventory = 0;
 			$query = qq|
-- 
cgit v1.2.3