[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