[wiaflos-devel] COMMIT - r223 - trunk/wiaflos/server

svn at linuxrulz.org svn at linuxrulz.org
Sun Aug 10 17:19:31 GMT 2008


Author: nkukard
Date: 2008-08-10 17:19:31 +0000 (Sun, 10 Aug 2008)
New Revision: 223

Modified:
   trunk/wiaflos/server/Receipting.pm
Log:
* Added support to allocate receipts to client account transactions


Modified: trunk/wiaflos/server/Receipting.pm
===================================================================
--- trunk/wiaflos/server/Receipting.pm	2008-08-10 17:18:37 UTC (rev 222)
+++ trunk/wiaflos/server/Receipting.pm	2008-08-10 17:19:31 UTC (rev 223)
@@ -90,7 +90,7 @@
 
 
 
-# Check if receipt ref exists
+# Check if receipt number exists
 sub receiptNumberExists
 {
 	my $number = shift;
@@ -219,17 +219,28 @@
 
 
    	# Pull in invoice data
-	$item->{'InvoiceID'} = $rawData->{'InvoiceID'};
+	if (defined($rawData->{'InvoiceID'})) {
+		$item->{'InvoiceID'} = $rawData->{'InvoiceID'};
 	
-	my $data;
-	$data->{'ID'} = $rawData->{'InvoiceID'};
-	my $invoice = wiaflos::server::Invoicing::getInvoice($data);
-	$item->{'InvoiceNumber'} = $invoice->{'Number'};
+		my $data;
+		$data->{'ID'} = $rawData->{'InvoiceID'};
+		my $invoice = wiaflos::server::Invoicing::getInvoice($data);
+		$item->{'InvoiceNumber'} = $invoice->{'Number'};
+
+	# Pull in transaction data
+	} elsif (defined($rawData->{'AccountTransactionID'})) {
+		$item->{'AccountTransactionID'} = $rawData->{'AccountTransactionID'};
 	
+		my $data;
+		$data->{'ID'} = $rawData->{'AccountTransactionID'};
+		my $transaction = wiaflos::server::Clients::getAccountTransaction($data);
+		$item->{'AccountTransactionNumber'} = $transaction->{'Number'};
+	}
+	
 	# And the receipt
 	$item->{'ReceiptID'} = $rawData->{'ReceiptID'};
 	
-	$data = undef;
+	my $data;
 	$data->{'ID'} = $rawData->{'ReceiptID'};
 	my $receipt = getReceipt($data);
 	$item->{'ReceiptNumber'} = $receipt->{'Number'};
@@ -237,7 +248,7 @@
 
 	$item->{'Amount'} = $rawData->{'Amount'};
 	
-	$item->{'Posted'} = defined($rawData->{'InvoiceTransactionID'}) ? 1 : 0;
+	$item->{'Posted'} = (defined($rawData->{'InvoiceTransactionID'}) || defined($rawData->{'AccountTransactionAllocationID'})) ? 1 : 0;
 
 	return $item;
 }
@@ -545,12 +556,16 @@
 }
 
 
-
-# Create allocation
-# Parameters:
-#		ReceiptNumber	- Receipt number
-#		InvoiceNumber	- Invoice number
-#		Amount		- Amount
+# @fn createReceiptAllocation($data)
+# Create a receipt allocation
+#
+# @param data Hash ref with the below elements
+# @li ReceiptNumber - Receipt number to create allocation for
+# @li InvoiceNumber - Invoice number to allocate to
+# @li TransactionNumber - Transaction number to allocate to
+# @li Amount - Amount to allocate
+#
+# @return Receipt allocation ID on success < 1 on error
 sub createReceiptAllocation
 {
 	my ($detail) = @_;
@@ -563,8 +578,19 @@
 	}
 
 	# Verify invoice number
-	if (!defined($detail->{'InvoiceNumber'}) || $detail->{'InvoiceNumber'} eq "") {
-		setError("No (or invalid) invoice number provided for receipt allocation");
+	if (defined($detail->{'InvoiceNumber'})) {
+		if ($detail->{'InvoiceNumber'} eq "") {
+			setError("No (or invalid) invoice number provided for receipt allocation");
+			return ERR_PARAM;
+		}
+	# or transaction number
+	} elsif (defined($detail->{'TransactionNumber'})) {
+		if ($detail->{'TransactionNumber'} eq "") {
+			setError("No (or invalid) transaction number provided for receipt allocation");
+			return ERR_PARAM;
+		}
+	} else {
+		setError("No invoice or transaction number provided for receipt allocation");
 		return ERR_PARAM;
 	}
 
@@ -596,19 +622,53 @@
 		return ERR_POSTED; 
 	}
 
-	# Grab invoice
 	$data = undef;
-	$data->{'Number'} = $detail->{'InvoiceNumber'};
-	my $invoice = wiaflos::server::Invoicing::getInvoice($data);
-	if (ref $invoice ne "HASH") {
-		setError(wiaflos::server::Invoicing::Error());
-		return $invoice;
-	}
+	my @extraCols;
+	my @extraData;
 
-	# Check if invoice is posted or not
-	if ($invoice->{'Posted'} ne "1") {
-		setError("Cannot allocate an amount from receipt '".$receipt->{'Number'}."' to invoice '".$invoice->{'Number'}."' as the invoice is not posted");
-		return ERR_POSTED; 
+	# Grab invoice
+	if ($detail->{'InvoiceNumber'}) {
+		$data->{'Number'} = $detail->{'InvoiceNumber'};
+		my $invoice = wiaflos::server::Invoicing::getInvoice($data);
+		if (ref($invoice) ne "HASH") {
+			setError(wiaflos::server::Invoicing::Error());
+			return $invoice;
+		}
+
+		# Check if invoice is posted or not
+		if ($invoice->{'Posted'} ne "1") {
+			setError("Cannot allocate an amount from receipt '".$receipt->{'Number'}."' to invoice '".$invoice->{'Number'}.
+					"' as the invoice is not posted");
+			return ERR_POSTED; 
+		}
+		push(@extraCols,'InvoiceID');
+		push(@extraData,DBQuote($invoice->{'ID'}));
+
+	# Grab transaction
+	} elsif ($detail->{'TransactionNumber'}) {
+		$data->{'Number'} = $detail->{'TransactionNumber'};
+		my $transaction = wiaflos::server::Clients::getAccountTransaction($data);
+		if (ref($transaction) ne "HASH") {
+			setError(wiaflos::server::Clients::Error());
+			return $transaction;
+		}
+
+		# Check if transaction is posted or not
+		if ($transaction->{'Posted'} ne "1") {
+			setError("Cannot allocate an amount from receipt '".$receipt->{'Number'}."' to transaction '".$transaction->{'Number'}.
+					"' as the transaction is not posted");
+			return ERR_POSTED; 
+		}
+
+		# Check if transaction is closed or not
+		if ($transaction->{'Closed'} eq "1") {
+			setError("Cannot allocate an amount from receipt '".$receipt->{'Number'}."' to transaction '".$transaction->{'Number'}.
+					"' as the transaction is closed");
+			return ERR_POSTED; 
+		}
+		
+		push(@extraCols,'AccountTransactionID');
+		push(@extraData,DBQuote($transaction->{'ID'}));
 	}
 
 
@@ -632,15 +692,19 @@
 		return ERR_OVERALLOC;
 	}
 
+	# Pull in extra data
+	my $extraCols = ',' . join(',', at extraCols);
+	my $extraData = ',' . join(',', at extraData);
+
 	# Create receipt allocation
 	my $sth = DBDo("
 		INSERT INTO receipt_allocations
-				(ReceiptID,InvoiceID,Amount) 
+				(ReceiptID,Amount$extraCols)
 			VALUES
 				(
 					".DBQuote($receipt->{'ID'}).",
-					".DBQuote($invoice->{'ID'}).",
 					".DBQuote($detail->{'Amount'})."
+					$extraData
 				)
 	");
 	if (!$sth) {
@@ -660,7 +724,11 @@
 # Parameters:
 #		ReceiptNumber	- Receipt number
 #		ReceiptID	- Receipt ID
+#
 #		InvoiceID	-  invoice ID
+#
+#		AccountTransactionNumber - Transaction number
+#		AccountTransactionID - Transaction ID
 sub getReceiptAllocations
 {
 	my ($detail) = @_;
@@ -691,6 +759,22 @@
 	} elsif (defined($detail->{'InvoiceID'}) && $detail->{'InvoiceID'} ne "") {
 		$query .= "InvoiceID = ".DBQuote($detail->{'InvoiceID'});
 
+	# Transaction ID mode
+	} elsif (defined($detail->{'AccountTransactionID'}) && $detail->{'AccountTransactionID'} ne "") {
+		$query .= "AccountTransactionID = ".DBQuote($detail->{'AccountTransactionID'});
+
+	# Transaction number mode
+	} elsif (defined($detail->{'AccountTransactionNumber'}) && $detail->{'AccountTransactionNumber'} ne "") {
+		my $transactionID;
+
+		# Check if transaction exists
+		if (($transactionID = wiaflos::server::Clients::getTransactionIDFromNumber($detail->{'TransactionNumber'})) < 1) {
+			setError(Error());
+			return $transactionID;
+		}
+		
+		$query .= "AccountTransactionID = ".DBQuote($transactionID);
+
 	} else {
 		setError("No acceptable parameters provided to return receipt allocations");
 		return ERR_PARAM;
@@ -699,7 +783,7 @@
 	# Return list of receipt allocations
 	my $sth = DBSelect("
 		SELECT 
-			ID, InvoiceID, ReceiptID, Amount, InvoiceTransactionID
+			ID, ReceiptID, Amount, InvoiceID, InvoiceTransactionID, AccountTransactionID, AccountTransactionAllocationID
 		FROM
 			receipt_allocations
 		WHERE
@@ -739,7 +823,7 @@
 	# Return allocation
 	my $sth = DBSelect("
 		SELECT 
-			ID, ReceiptID, InvoiceID, Amount, InvoiceTransactionID
+			ID, ReceiptID, Amount, InvoiceID, InvoiceTransactionID, AccountTransactionID, AccountTransactionAllocationID
 		FROM
 			receipt_allocations
 		WHERE
@@ -800,49 +884,106 @@
 		return $receipt;
 	}
 
-	# Grab invoice
-	$data = undef;
-	$data->{'ID'} = $allocation->{'InvoiceID'};
-	my $invoice = wiaflos::server::Invoicing::getInvoice($data);
-	if (ref $invoice ne "HASH") {
-		setError(wiaflos::server::Invoicing::Error());
-		return $invoice;
-	}
+	# We use this at the end of the function to contain the ID of the thing we're posting the allocation against
+	my $allocationAgainstID;
 
-	# Make sure invoice is not paid
-	if ($invoice->{'Paid'} ne "0") {
-		setError("Invoice '".$invoice->{'Number'}."' already paid");
-		return ERR_PAID;
-	}
+	# Check if its an invoice
+	if (defined($allocation->{'InvoiceID'})) {
+		# Grab invoice
+		$data = undef;
+		$data->{'ID'} = $allocation->{'InvoiceID'};
+		my $invoice = wiaflos::server::Invoicing::getInvoice($data);
+		if (ref $invoice ne "HASH") {
+			setError(wiaflos::server::Invoicing::Error());
+			return $invoice;
+		}
 
-	# Make sure invoice is posted
-	if ($invoice->{'Posted'} ne "1") {
-		setError("Invoice '".$invoice->{'Number'}."' not posted");
-		return ERR_POSTED;
-	}
+		# Make sure invoice is not paid
+		if ($invoice->{'Paid'} ne "0") {
+			setError("Invoice '".$invoice->{'Number'}."' already paid");
+			return ERR_PAID;
+		}
 
-	# Grab invoice allocations
-	$data = undef;
-	$data->{'InvoiceID'} = $allocation->{'InvoiceID'};
-	my $invoiceAllocations = getReceiptAllocations($data);
-	if (ref $invoiceAllocations ne "ARRAY") {
-		setError(Error());
-		return $invoiceAllocations;
-	}
-	# Add up invoice balance
-	my $invoiceBalance = Math::BigFloat->new($invoice->{'Total'});
-	foreach my $alloc (@{$invoiceAllocations}) {
-		if ($alloc->{'Posted'} eq "1") {
-			$invoiceBalance->bsub($alloc->{'Amount'});
+		# Make sure invoice is posted
+		if ($invoice->{'Posted'} ne "1") {
+			setError("Invoice '".$invoice->{'Number'}."' not posted");
+			return ERR_POSTED;
 		}
+
+		# Grab invoice allocations
+		$data = undef;
+		$data->{'InvoiceID'} = $allocation->{'InvoiceID'};
+		my $invoiceAllocations = getReceiptAllocations($data);
+		if (ref $invoiceAllocations ne "ARRAY") {
+			setError(Error());
+			return $invoiceAllocations;
+		}
+		# Add up invoice balance
+		my $invoiceBalance = Math::BigFloat->new($invoice->{'Total'});
+		foreach my $alloc (@{$invoiceAllocations}) {
+			if ($alloc->{'Posted'} eq "1") {
+				$invoiceBalance->bsub($alloc->{'Amount'});
+			}
+		}
+		# Check invoice balance if its negative, this is if we've overallocated
+		$invoiceBalance->bsub($allocation->{'Amount'});
+		if ($invoiceBalance->is_neg()) {
+			setError("Posting the allocation will end up in a balance of '".$invoiceBalance->bstr()."' on invoice '".$invoice->{'Number'}."'");
+			return ERR_OVERALLOC;
+		}
+	
+		$allocationAgainstID = $invoice->{'ID'};
+
+	# Or if its a account transaction
+	} elsif (defined($allocation->{'AccountTransactionID'})) {
+		# Grab account transaction
+		$data = undef;
+		$data->{'ID'} = $allocation->{'AccountTransactionID'};
+		my $transaction = wiaflos::server::Clients::getAccountTransaction($data);
+		if (ref($transaction) ne "HASH") {
+			setError(wiaflos::server::Invoicing::Error());
+			return $transaction;
+		}
+
+		# Make sure transaction is posted
+		if ($transaction->{'Posted'} ne "1") {
+			setError("Account transaction '".$transaction->{'Number'}."' not posted");
+			return ERR_POSTED;
+		}
+		
+		# Make sure transaction is not closed
+		if ($transaction->{'Closed'} eq "1") {
+			setError("Account transaction '".$transaction->{'Number'}."' already closed");
+			return ERR_PAID;
+		}
+
+		# Grab transaction allocations
+		$data = undef;
+		$data->{'AccountTransactionID'} = $transaction->{'ID'};
+		my $transactionAllocations = getReceiptAllocations($data);
+		if (ref($transactionAllocations) ne "ARRAY") {
+			setError(Error());
+			return $transactionAllocations;
+		}
+		# Add up transaction balance
+		my $transactionBalance = Math::BigFloat->new($transaction->{'Amount'});
+		foreach my $alloc (@{$transactionAllocations}) {
+			if ($alloc->{'Posted'} eq "1") {
+				$transactionBalance->bsub($alloc->{'Amount'});
+			}
+		}
+		# Check transaction balance if its negative, this is if we've overallocated
+		$transactionBalance->bsub($allocation->{'Amount'});
+		if ($transactionBalance->is_neg()) {
+			setError("Posting the allocation will end up in a balance of '".$transactionBalance->bstr().
+					"' on account transaction '".$transaction->{'Number'}."'");
+			return ERR_OVERALLOC;
+		}
+		
+		$allocationAgainstID = $transaction->{'ID'};
 	}
-	# Check invoice balance if its negative, this is if we've overallocated
-	$invoiceBalance->bsub($allocation->{'Amount'});
-	if ($invoiceBalance->is_neg()) {
-		setError("Posting the allocation will end up in a balance of '".$invoiceBalance->bstr()."' on invoice '".$invoice->{'Number'}."'");
-		return ERR_OVERALLOC;
-	}
 
+
 	# Grab receipt allocations
 	$data = undef;
 	$data->{'ReceiptID'} = $receipt->{'ID'};
@@ -885,23 +1026,41 @@
 		}
 	}
 
-	# Create invoice transaction
+	# Stuff we need for below
 	$data = undef;
-	$data->{'ID'} = $invoice->{'ID'};
+	$data->{'ID'} = $allocationAgainstID;
 	$data->{'Amount'} = Math::BigFloat->new($allocation->{'Amount'})->bneg();
 	$data->{'ReceiptAllocationID'} = $allocation->{'ID'};
-	my $invoiceTransactionID = wiaflos::server::Invoicing::allocateInvoiceTransaction($data);
-	if ($invoiceTransactionID < 1) {
-		setError(wiaflos::server::Invoicing::Error());
-		DBRollback();
-		return $invoiceTransactionID;
+
+	my $extraSQL;
+
+	# Create invoice transaction
+	if (defined($allocation->{'InvoiceID'})) {
+		my $invoiceTransactionID = wiaflos::server::Invoicing::allocateInvoiceTransaction($data);
+		if ($invoiceTransactionID < 1) {
+			setError(wiaflos::server::Invoicing::Error());
+			DBRollback();
+			return $invoiceTransactionID;
+		}
+		$extraSQL = "InvoiceTransactionID = ".DBQuote($invoiceTransactionID);
+
+	# Or, if its an account transaction, an account transaction allocation entry
+	} elsif (defined($allocation->{'AccountTransactionID'})) {
+		my $accountTransactionAllocationID = wiaflos::server::Clients::linkAccountTransactionAllocation($data);
+		if ($accountTransactionAllocationID < 1) {
+			setError(wiaflos::server::Invoicing::Error());
+			DBRollback();
+			return $accountTransactionAllocationID;
+		}
+		$extraSQL = "AccountTransactionAllocationID = ".DBQuote($accountTransactionAllocationID);
 	}
 	
 	# Post allocation
 	my $sth = DBDo("
-		UPDATE receipt_allocations
+		UPDATE 
+			receipt_allocations
 		SET
-			InvoiceTransactionID = ".DBQuote($invoiceTransactionID)."
+			$extraSQL
 		WHERE
 			ID = ".DBQuote($allocation->{'ID'})."
 	");



More information about the wiaflos-devel mailing list