Author: mbrohl
Date: Sat Oct  7 09:59:47 2017
New Revision: 1811405

URL: http://svn.apache.org/viewvc?rev=1811405&view=rev
Log:
Improved: Fixing defects reported by FindBugs, package 
org.apache.ofbiz.accounting.invoice.
(OFBIZ-9541)

Thanks Karsten Tymann for reporting and providing the patch.

Modified:
    
ofbiz/ofbiz-framework/trunk/applications/accounting/src/main/java/org/apache/ofbiz/accounting/invoice/InvoiceServices.java
    
ofbiz/ofbiz-framework/trunk/applications/accounting/src/main/java/org/apache/ofbiz/accounting/invoice/InvoiceWorker.java

Modified: 
ofbiz/ofbiz-framework/trunk/applications/accounting/src/main/java/org/apache/ofbiz/accounting/invoice/InvoiceServices.java
URL: 
http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/applications/accounting/src/main/java/org/apache/ofbiz/accounting/invoice/InvoiceServices.java?rev=1811405&r1=1811404&r2=1811405&view=diff
==============================================================================
--- 
ofbiz/ofbiz-framework/trunk/applications/accounting/src/main/java/org/apache/ofbiz/accounting/invoice/InvoiceServices.java
 (original)
+++ 
ofbiz/ofbiz-framework/trunk/applications/accounting/src/main/java/org/apache/ofbiz/accounting/invoice/InvoiceServices.java
 Sat Oct  7 09:59:47 2017
@@ -32,6 +32,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 
 import org.apache.commons.collections4.CollectionUtils;
@@ -104,7 +105,7 @@ import org.apache.ofbiz.service.ServiceU
  */
 public class InvoiceServices {
 
-    public static String module = InvoiceServices.class.getName();
+    public static final String module = InvoiceServices.class.getName();
 
     // set some BigDecimal properties
     private static final BigDecimal ZERO = BigDecimal.ZERO;
@@ -386,11 +387,14 @@ public class InvoiceServices {
                     orderItem = itemIssuance.getRelatedOne("OrderItem", false);
                 } else if ((orderItem == null) && (shipmentReceipt != null)) {
                     orderItem = shipmentReceipt.getRelatedOne("OrderItem", 
false);
-                } else if ((orderItem == null) && (itemIssuance == null) && 
(shipmentReceipt == null)) {
+                } 
+                
+                if (orderItem == null) {
                     Debug.logError("Cannot create invoice when orderItem, 
itemIssuance, and shipmentReceipt are all null", module);
                     return 
ServiceUtil.returnError(UtilProperties.getMessage(resource,
                             
"AccountingIllegalValuesPassedToCreateInvoiceService", locale));
                 }
+                
                 GenericValue product = null;
                 if (orderItem.get("productId") != null) {
                     product = orderItem.getRelatedOne("Product", false);
@@ -763,9 +767,10 @@ public class InvoiceServices {
 
             // next do the shipping adjustments.  Note that we do not want to 
add these to the invoiceSubTotal or orderSubTotal for pro-rating tax later, as 
that would cause
             // numerator/denominator problems when the shipping is not 
pro-rated but rather charged all on the first invoice
-            for (GenericValue adj : shipAdjustments.keySet()) {
-                BigDecimal adjAlreadyInvoicedAmount = shipAdjustments.get(adj);
-
+            for (Map.Entry<GenericValue, BigDecimal> set : 
shipAdjustments.entrySet()) {
+                BigDecimal adjAlreadyInvoicedAmount = set.getValue();
+                GenericValue adj = set.getKey();
+                
                 if ("N".equalsIgnoreCase(prorateShipping)) {
 
                     // Set the divisor and multiplier to 1 to avoid prorating
@@ -918,8 +923,8 @@ public class InvoiceServices {
             BigDecimal appliedFraction = amountTotal.divide(amountTotal, 12, 
ROUNDING);
             GenericValue invoice = null;
             boolean isReturn = false;
-            List<String> billFromVendorInvoiceRoles = new ArrayList<String>();
-            List<GenericValue> invoiceItems = new ArrayList<GenericValue>();
+            List<String> billFromVendorInvoiceRoles;
+            List<GenericValue> invoiceItems;
             try {
                 List<EntityExpr> invoiceRoleConds = UtilMisc.toList(
                         EntityCondition.makeCondition("invoiceId", 
EntityOperator.EQUALS, salesInvoiceId),
@@ -960,8 +965,7 @@ public class InvoiceServices {
             // Determine commissions for various parties.
             for (GenericValue invoiceItem : invoiceItems) {
                 BigDecimal amount = ZERO;
-                BigDecimal quantity = ZERO;
-                quantity = invoiceItem.getBigDecimal("quantity");
+                BigDecimal quantity = invoiceItem.getBigDecimal("quantity");
                 amount = invoiceItem.getBigDecimal("amount");
                 amount = isReturn ? amount.negate() : amount;
                 String productId = invoiceItem.getString("productId");
@@ -1034,12 +1038,12 @@ public class InvoiceServices {
             createInvoiceMap.put("currencyUomId", 
invoice.getString("currencyUomId"));
             createInvoiceMap.put("userLogin", userLogin);
             // store the invoice first
-            Map<String, Object> createInvoiceResult = null;
+            Map<String, Object> createInvoiceResult;
             try {
                 createInvoiceResult = dispatcher.runSync("createInvoice", 
createInvoiceMap);
             } catch (GenericServiceException e) {
                 return 
ServiceUtil.returnError(UtilProperties.getMessage(resource,
-                        "AccountingInvoiceCommissionError", locale), null, 
null, createInvoiceResult);
+                        "AccountingInvoiceCommissionError", locale), null, 
null, null);
             }
             String invoiceId = (String) createInvoiceResult.get("invoiceId");
             // create the bill-from (or pay-to) contact mech as the primary 
PAYMENT_LOCATION of the party from the store
@@ -1154,7 +1158,7 @@ public class InvoiceServices {
         LocalDispatcher dispatcher = dctx.getDispatcher();
         String shipmentId = (String) context.get("shipmentId");
         Locale locale = (Locale) context.get("locale");
-        List<String> invoicesCreated = new LinkedList<String>();
+        List<String> invoicesCreated;
         Map<String, Object> response = ServiceUtil.returnSuccess();
         GenericValue orderShipment = null;
         String invoicePerShipment = null;
@@ -1222,7 +1226,7 @@ public class InvoiceServices {
             return ServiceUtil.returnError(UtilProperties.getMessage(resource, 
"AccountingShipmentNotFound", locale));
         }
 
-        List<GenericValue> itemIssuances = new LinkedList<GenericValue>();
+        List<GenericValue> itemIssuances;
         try {
             itemIssuances = EntityQuery.use(delegator).select("orderId", 
"shipmentId")
                     .from("ItemIssuance").where("shipmentId", 
shipmentId).orderBy("orderId").distinct().queryList();
@@ -1275,7 +1279,7 @@ public class InvoiceServices {
      // For In-Process invoice, move the status to ready and capture the 
payment
         for (GenericValue invoice : ordersWithInProcessInvoice.values()) {
             String invoiceId = invoice.getString("invoiceId");
-            Map<String, Object> setInvoiceStatusResult = new HashMap<String, 
Object>();
+            Map<String, Object> setInvoiceStatusResult;
             try {
                 setInvoiceStatusResult = 
dispatcher.runSync("setInvoiceStatus", UtilMisc.<String, 
Object>toMap("invoiceId", invoiceId, "statusId", "INVOICE_READY", "userLogin", 
userLogin));
             } catch (GenericServiceException e) {
@@ -1451,11 +1455,10 @@ public class InvoiceServices {
         }
 
         // make sure we aren't billing items already invoiced i.e. items 
billed as digital (FINDIG)
-        Set<String> orders = shippedOrderItems.keySet();
-        for (String orderId : orders) {
-
+        for (Entry<String, List<GenericValue>> order : 
shippedOrderItems.entrySet()) {
+            String orderId = order.getKey();
             // we'll only use this list to figure out which ones to send
-            List<GenericValue> billItems = shippedOrderItems.get(orderId);
+            List<GenericValue> billItems = order.getValue();
 
             // a new list to be used to pass to the create invoice service
             List<GenericValue> toBillItems = new LinkedList<GenericValue>();
@@ -1533,6 +1536,9 @@ public class InvoiceServices {
                         billAvail = ZERO;
                     } else {
                         // now have been billed
+                        if(issueQty == null){
+                            issueQty = ZERO;
+                        }
                         billAvail = 
billAvail.subtract(issueQty).setScale(DECIMALS, ROUNDING);
                     }
 
@@ -2612,10 +2618,6 @@ public class InvoiceServices {
         // Payment.....
         BigDecimal paymentApplyAvailable = ZERO;
         // amount available on the payment reduced by the already applied 
amounts
-        BigDecimal amountAppliedMax = ZERO;
-        // the maximum that can be applied taking 
payment,invoice,invoiceitem,billing account in concideration
-        // if maxApplied is missing, this value can be used,
-        // Payment this should be checked after the invoice checking because 
it is possible the currency is changed
         GenericValue payment = null;
         String currencyUomId = null;
         if (paymentId == null || paymentId.equals("")) {
@@ -2629,6 +2631,7 @@ public class InvoiceServices {
             if (payment == null) {
                 errorMessageList.add(UtilProperties.getMessage(resource, 
                         "AccountingPaymentRecordNotFound", 
UtilMisc.toMap("paymentId", paymentId), locale));
+                return ServiceUtil.returnError(errorMessageList);
             }
             paymentApplyAvailable = 
payment.getBigDecimal("amount").subtract(PaymentWorker.getPaymentApplied(payment)).setScale(DECIMALS,ROUNDING);
 
@@ -2643,12 +2646,6 @@ public class InvoiceServices {
 
             currencyUomId = payment.getString("currencyUomId");
 
-            // if the amount to apply is 0 give it amount the payment still 
need
-            // to apply
-            if (amountApplied.signum() == 0) {
-                amountAppliedMax = paymentApplyAvailable;
-            }
-
         }
 
         // the "TO" Payment.....
@@ -2663,6 +2660,7 @@ public class InvoiceServices {
             if (toPayment == null) {
                 errorMessageList.add(UtilProperties.getMessage(resource, 
                         "AccountingPaymentRecordNotFound", 
UtilMisc.toMap("paymentId", toPaymentId), locale));
+                return ServiceUtil.returnError(errorMessageList);
             }
             toPaymentApplyAvailable = 
toPayment.getBigDecimal("amount").subtract(PaymentWorker.getPaymentApplied(toPayment)).setScale(DECIMALS,ROUNDING);
 
@@ -2675,11 +2673,6 @@ public class InvoiceServices {
                         "AccountingPaymentConfirmed", 
UtilMisc.toMap("paymentId", paymentId), locale));
             }
 
-            // if the amount to apply is less then required by the payment 
reduce it
-            if (amountAppliedMax.compareTo(toPaymentApplyAvailable) > 0) {
-                amountAppliedMax = toPaymentApplyAvailable;
-            }
-
             if (paymentApplicationId == null) {
                 // only check for new application records, update on existing 
records is checked in the paymentApplication section
                 if (toPaymentApplyAvailable.signum() == 0) {
@@ -2738,6 +2731,7 @@ public class InvoiceServices {
             if (billingAccount == null) {
                 errorMessageList.add(UtilProperties.getMessage(resource, 
                         "AccountingBillingAccountNotFound", 
UtilMisc.toMap("billingAccountId", billingAccountId), locale));
+                return ServiceUtil.returnError(errorMessageList);
             }
             // check the currency
             if (billingAccount.get("accountCurrencyUomId") != null && 
currencyUomId != null &&
@@ -2791,20 +2785,12 @@ public class InvoiceServices {
                         }
                     }
                     paymentApplyAvailable = 
payment.getBigDecimal("actualCurrencyAmount").subtract(PaymentWorker.getPaymentApplied(payment)).setScale(DECIMALS,ROUNDING);
-                    if (amountApplied.signum() == 0) {
-                        amountAppliedMax = paymentApplyAvailable;
-                    }
                 }
 
                 // check if the invoice already covered by payments
                 BigDecimal invoiceTotal = 
InvoiceWorker.getInvoiceTotal(invoice);
                 invoiceApplyAvailable = 
InvoiceWorker.getInvoiceNotApplied(invoice);
 
-                // adjust the amountAppliedMax value if required....
-                if (invoiceApplyAvailable.compareTo(amountAppliedMax) < 0) {
-                    amountAppliedMax = invoiceApplyAvailable;
-                }
-
                 if (invoiceTotal.signum() == 0) {
                     errorMessageList.add(UtilProperties.getMessage(resource,
                             "AccountingInvoiceTotalZero", 
UtilMisc.toMap("invoiceId", invoiceId), locale));
@@ -2986,7 +2972,7 @@ public class InvoiceServices {
                                         UtilMisc.<String, 
Object>toMap("tooMuch", newInvoiceApplyAvailable.negate(),
                                                 "invoiceId", invoiceId), 
locale));
                             }
-                        } else if (invoiceItemSeqId != null && 
paymentApplication.get("invoiceItemSeqId") == null) {
+                        } else if (paymentApplication.get("invoiceItemSeqId") 
== null) {
                             // check if the item number changed from a null 
value to
                             // a real Item number
                             newInvoiceItemApplyAvailable = 
invoiceItemApplyAvailable.subtract(amountApplied).setScale(DECIMALS, ROUNDING);
@@ -3268,22 +3254,16 @@ public class InvoiceServices {
 
         // if no paymentApplicationId supplied create a new record with the 
data
         // supplied...
-        if (paymentApplicationId == null && amountApplied != null) {
-            paymentApplication.set("paymentApplicationId", 
paymentApplicationId);
-            paymentApplication.set("invoiceId", invoiceId);
-            paymentApplication.set("invoiceItemSeqId", invoiceItemSeqId);
-            paymentApplication.set("paymentId", paymentId);
-            paymentApplication.set("toPaymentId", toPaymentId);
-            paymentApplication.set("amountApplied", amountApplied);
-            paymentApplication.set("billingAccountId", billingAccountId);
-            paymentApplication.set("taxAuthGeoId", taxAuthGeoId);
-            return storePaymentApplication(delegator, 
paymentApplication,locale);
-        }
+        paymentApplication.set("paymentApplicationId", paymentApplicationId);
+        paymentApplication.set("invoiceId", invoiceId);
+        paymentApplication.set("invoiceItemSeqId", invoiceItemSeqId);
+        paymentApplication.set("paymentId", paymentId);
+        paymentApplication.set("toPaymentId", toPaymentId);
+        paymentApplication.set("amountApplied", amountApplied);
+        paymentApplication.set("billingAccountId", billingAccountId);
+        paymentApplication.set("taxAuthGeoId", taxAuthGeoId);
+        return storePaymentApplication(delegator, paymentApplication,locale);
 
-        // should never come here...
-        errorMessageList.add(UtilProperties.getMessage(resource, 
"AccountingPaymentApplicationParameterUnsuitable", locale));
-        errorMessageList.add(UtilProperties.getMessage(resource, 
"AccountingPaymentApplicationParameterListUnsuitable", 
UtilMisc.toMap("invoiceId", invoiceId, "invoiceItemSeqId", invoiceItemSeqId, 
"paymentId", paymentId, "toPaymentId", toPaymentId, "paymentApplicationId", 
paymentApplicationId, "amountApplied", amountApplied), locale));
-        return ServiceUtil.returnError(errorMessageList);
     }
 
     public static Map<String, Object> 
calculateInvoicedAdjustmentTotal(DispatchContext dctx, Map<String, Object> 
context) {
@@ -3445,22 +3425,23 @@ public class InvoiceServices {
         LocalDispatcher dispatcher = dctx.getDispatcher();
         GenericValue userLogin = (GenericValue) context.get("userLogin");
         ByteBuffer fileBytes = (ByteBuffer) context.get("uploadedFile");
+        
+        if (fileBytes == null) {
+            return ServiceUtil.returnError(UtilProperties.getMessage(resource, 
"AccountingUploadedFileDataNotFound", locale));
+        }
+        
         String organizationPartyId = (String) 
context.get("organizationPartyId");
         String encoding = System.getProperty("file.encoding");
         String csvString = 
Charset.forName(encoding).decode(fileBytes).toString();
         final BufferedReader csvReader = new BufferedReader(new 
StringReader(csvString));
         CSVFormat fmt = CSVFormat.DEFAULT.withHeader();
-        List<String> errMsgs = new LinkedList<String>();
-        List<String> newErrMsgs = new LinkedList<String>();
+        List<String> errMsgs = new LinkedList<>();
+        List<String> newErrMsgs;
         String lastInvoiceId = null;
         String currentInvoiceId = null;
         String newInvoiceId = null;
         int invoicesCreated = 0;
 
-        if (fileBytes == null) {
-            return ServiceUtil.returnError(UtilProperties.getMessage(resource, 
"AccountingUploadedFileDataNotFound", locale));
-        }
-
         try {
             for (final CSVRecord rec : fmt.parse(csvReader)) {
                 currentInvoiceId =  rec.get("invoiceId");
@@ -3487,8 +3468,8 @@ public class InvoiceServices {
                     }
 
                     // invoice validation
-                    try {
-                        newErrMsgs = new LinkedList<String>();
+                    newErrMsgs = new LinkedList<>();
+                    try {     
                         if (UtilValidate.isEmpty(invoice.get("partyIdFrom"))) {
                             newErrMsgs.add("Line number " + 
rec.getRecordNumber() + ": Mandatory Party Id From and Party Id From Trans 
missing for invoice: " + currentInvoiceId);
                         } else if 
(EntityQuery.use(delegator).from("Party").where("partyId", 
invoice.get("partyIdFrom")).queryOne() == null) {
@@ -3553,8 +3534,8 @@ public class InvoiceServices {
                         invoiceItem.put("productId", 
rec.get("productIdTrans"));
                     }
                     // invoice item validation
+                    newErrMsgs = new LinkedList<>();
                     try {
-                        newErrMsgs = new LinkedList<String>();
                         if 
(UtilValidate.isEmpty(invoiceItem.get("invoiceItemSeqId"))) {
                             newErrMsgs.add("Line number " + 
rec.getRecordNumber() + ": Mandatory item sequence Id missing for invoice: " + 
currentInvoiceId);
                         } 
@@ -3564,6 +3545,7 @@ public class InvoiceServices {
                             newErrMsgs.add("Line number " + 
rec.getRecordNumber() + ": InvoiceItem Item type id: " + 
invoiceItem.get("invoiceItemTypeId") + " not found for invoice: " + 
currentInvoiceId + " Item seqId:" + invoiceItem.get("invoiceItemSeqId"));
                         } 
                         if (UtilValidate.isEmpty(invoiceItem.get("productId")) 
&& UtilValidate.isEmpty(invoiceItem.get("description"))) {
+                            newErrMsgs.add("Line number " + 
rec.getRecordNumber() + ": no Product Id given, no description given");
                         }                    
                         if 
(UtilValidate.isNotEmpty(invoiceItem.get("productId")) && 
EntityQuery.use(delegator).from("Product").where("productId", 
invoiceItem.get("productId")).queryOne() == null) {
                             newErrMsgs.add("Line number " + 
rec.getRecordNumber() + ": Product Id: " + invoiceItem.get("productId") + " not 
found for invoice: " + currentInvoiceId + " Item seqId:" + 
invoiceItem.get("invoiceItemSeqId"));

Modified: 
ofbiz/ofbiz-framework/trunk/applications/accounting/src/main/java/org/apache/ofbiz/accounting/invoice/InvoiceWorker.java
URL: 
http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/applications/accounting/src/main/java/org/apache/ofbiz/accounting/invoice/InvoiceWorker.java?rev=1811405&r1=1811404&r2=1811405&view=diff
==============================================================================
--- 
ofbiz/ofbiz-framework/trunk/applications/accounting/src/main/java/org/apache/ofbiz/accounting/invoice/InvoiceWorker.java
 (original)
+++ 
ofbiz/ofbiz-framework/trunk/applications/accounting/src/main/java/org/apache/ofbiz/accounting/invoice/InvoiceWorker.java
 Sat Oct  7 09:59:47 2017
@@ -161,8 +161,7 @@ public final class InvoiceWorker {
       */
      public static BigDecimal getInvoiceTotal(GenericValue invoice, Boolean 
actualCurrency) {
         BigDecimal invoiceTotal = ZERO;
-        BigDecimal invoiceTaxTotal = ZERO;
-        invoiceTaxTotal = InvoiceWorker.getInvoiceTaxTotal(invoice);
+        BigDecimal invoiceTaxTotal = InvoiceWorker.getInvoiceTaxTotal(invoice);
 
         List<GenericValue> invoiceItems = null;
         try {


Reply via email to