svn commit: r814130 [2/2] - /ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r814130 [2/2] - /ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java

lektran

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java?rev=814130&r1=814129&r2=814130&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java Sat Sep 12 10:19:11 2009
@@ -21,25 +21,23 @@
 import java.math.BigDecimal;
 import java.sql.Timestamp;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
-import javolution.util.FastList;
 
+import javolution.util.FastList;
 import javolution.util.FastMap;
 
 import org.apache.commons.collections.CollectionUtils;
-import org.ofbiz.accounting.payment.BillingAccountWorker;
-import org.ofbiz.accounting.payment.PaymentWorker;
 import org.ofbiz.accounting.payment.PaymentGatewayServices;
+import org.ofbiz.accounting.payment.PaymentWorker;
 import org.ofbiz.accounting.util.UtilAccounting;
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.UtilDateTime;
 import org.ofbiz.base.util.UtilFormatOut;
+import org.ofbiz.base.util.UtilGenerics;
 import org.ofbiz.base.util.UtilMisc;
 import org.ofbiz.base.util.UtilNumber;
 import org.ofbiz.base.util.UtilProperties;
@@ -47,12 +45,11 @@
 import org.ofbiz.entity.GenericDelegator;
 import org.ofbiz.entity.GenericEntityException;
 import org.ofbiz.entity.GenericValue;
-import org.ofbiz.entity.util.EntityFindOptions;
-import org.ofbiz.entity.util.EntityUtil;
 import org.ofbiz.entity.condition.EntityCondition;
-import org.ofbiz.entity.condition.EntityOperator;
 import org.ofbiz.entity.condition.EntityExpr;
-import org.ofbiz.entity.condition.EntityConditionList;
+import org.ofbiz.entity.condition.EntityOperator;
+import org.ofbiz.entity.util.EntityFindOptions;
+import org.ofbiz.entity.util.EntityUtil;
 import org.ofbiz.order.order.OrderReadHelper;
 import org.ofbiz.product.product.ProductWorker;
 import org.ofbiz.service.DispatchContext;
@@ -102,22 +99,22 @@
     public static String module = InvoiceServices.class.getName();
 
     // set some BigDecimal properties
-    private static BigDecimal ZERO = BigDecimal.ZERO;
-    private static int decimals = UtilNumber.getBigDecimalScale("invoice.decimals");
-    private static int rounding = UtilNumber.getBigDecimalRoundingMode("invoice.rounding");
-    private static int taxDecimals = UtilNumber.getBigDecimalScale("salestax.calc.decimals");
-    private static int taxRounding = UtilNumber.getBigDecimalRoundingMode("salestax.rounding");
-    public static final int taxCalcScale = UtilNumber.getBigDecimalScale("salestax.calc.decimals");
+    private static final BigDecimal ZERO = BigDecimal.ZERO;
+    private static final int DECIMALS = UtilNumber.getBigDecimalScale("invoice.decimals");
+    private static final int ROUNDING = UtilNumber.getBigDecimalRoundingMode("invoice.rounding");
+    private static final int TAX_DECIMALS = UtilNumber.getBigDecimalScale("salestax.calc.decimals");
+    private static final int TAX_ROUNDING = UtilNumber.getBigDecimalRoundingMode("salestax.rounding");
+    public static final int TAX_CALC_SCALE = UtilNumber.getBigDecimalScale("salestax.calc.decimals");
     private static final int INVOICE_ITEM_SEQUENCE_ID_DIGITS = 5; // this is the number of digits used for invoiceItemSeqId: 00001, 00002...
 
     public static final String resource = "AccountingUiLabels";
 
     // service to create an invoice for a complete order by the system userid
-    public static Map createInvoiceForOrderAllItems(DispatchContext dctx, Map context) {
+    public static Map<String, Object> createInvoiceForOrderAllItems(DispatchContext dctx, Map<String, Object> context) {
         GenericDelegator delegator = dctx.getDelegator();
         LocalDispatcher dispatcher = dctx.getDispatcher();
         try {
-            List orderItems = delegator.findByAnd("OrderItem", UtilMisc.toMap("orderId", (String) context.get("orderId")));
+            List<GenericValue> orderItems = delegator.findByAnd("OrderItem", UtilMisc.toMap("orderId", (String) context.get("orderId")));
             if (orderItems.size() > 0) {
                 context.put("billItems", orderItems);
             }
@@ -141,22 +138,23 @@
     }
 
     /* Service to create an invoice for an order */
-    public static Map createInvoiceForOrder(DispatchContext dctx, Map context) {
+    public static Map<String, Object> createInvoiceForOrder(DispatchContext dctx, Map<String, Object> context) {
         GenericDelegator delegator = dctx.getDelegator();
         LocalDispatcher dispatcher = dctx.getDispatcher();
         GenericValue userLogin = (GenericValue) context.get("userLogin");
         Locale locale = (Locale) context.get("locale");
 
-        if (decimals == -1 || rounding == -1) {
+        if (DECIMALS == -1 || ROUNDING == -1) {
             return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingAritmeticPropertiesNotConfigured",locale));
         }
 
         String orderId = (String) context.get("orderId");
-        List billItems = (List) context.get("billItems");
+        List<GenericValue> billItems = UtilGenerics.checkList(context.get("billItems"));
         String invoiceId = (String) context.get("invoiceId");
+        // FIXME: This variable is never read, what is its purpose?
         boolean previousInvoiceFound = false;
 
-        if (billItems == null || billItems.size() == 0) {
+        if (UtilValidate.isEmpty(billItems)) {
             Debug.logVerbose("No order items to invoice; not creating invoice; returning success", module);
             return ServiceUtil.returnSuccess(UtilProperties.getMessage(resource,"AccountingNoOrderItemsToInvoice",locale));
         }
@@ -201,7 +199,7 @@
 
             // Set the precision depending on the type of invoice
             int invoiceTypeDecimals = UtilNumber.getBigDecimalScale("invoice." + invoiceType + ".decimals");
-            if (invoiceTypeDecimals == -1) invoiceTypeDecimals = decimals;
+            if (invoiceTypeDecimals == -1) invoiceTypeDecimals = DECIMALS;
 
             // Make an order read helper from the order
             OrderReadHelper orh = new OrderReadHelper(orderHeader);
@@ -248,7 +246,7 @@
 
             // create the invoice record
             if (UtilValidate.isEmpty(invoiceId)) {
-                Map createInvoiceContext = FastMap.newInstance();
+                Map<String, Object> createInvoiceContext = FastMap.newInstance();
                 createInvoiceContext.put("partyId", billToCustomerPartyId);
                 createInvoiceContext.put("partyIdFrom", billFromVendorPartyId);
                 createInvoiceContext.put("billingAccountId", billingAccountId);
@@ -261,7 +259,7 @@
                 createInvoiceContext.put("userLogin", userLogin);
 
                 // store the invoice first
-                Map createInvoiceResult = dispatcher.runSync("createInvoice", createInvoiceContext);
+                Map<String, Object> createInvoiceResult = dispatcher.runSync("createInvoice", createInvoiceContext);
                 if (ServiceUtil.isError(createInvoiceResult)) {
                     return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingInvoiceFromOrder",locale), null, null, createInvoiceResult);
                 }
@@ -271,30 +269,26 @@
             }
 
             // order roles to invoice roles
-            List orderRoles = orderHeader.getRelated("OrderRole");
-            if (orderRoles != null) {
-                Iterator orderRolesIt = orderRoles.iterator();
-                Map createInvoiceRoleContext = FastMap.newInstance();
-                createInvoiceRoleContext.put("invoiceId", invoiceId);
-                createInvoiceRoleContext.put("userLogin", userLogin);
-                while (orderRolesIt.hasNext()) {
-                    GenericValue orderRole = (GenericValue)orderRolesIt.next();
-                    createInvoiceRoleContext.put("partyId", orderRole.getString("partyId"));
-                    createInvoiceRoleContext.put("roleTypeId", orderRole.getString("roleTypeId"));
-                    Map createInvoiceRoleResult = dispatcher.runSync("createInvoiceRole", createInvoiceRoleContext);
-                    if (ServiceUtil.isError(createInvoiceRoleResult)) {
-                        return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingInvoiceFromOrder",locale), null, null, createInvoiceRoleResult);
-                    }
+            List<GenericValue> orderRoles = orderHeader.getRelated("OrderRole");
+            Map<String, Object> createInvoiceRoleContext = FastMap.newInstance();
+            createInvoiceRoleContext.put("invoiceId", invoiceId);
+            createInvoiceRoleContext.put("userLogin", userLogin);
+            for (GenericValue orderRole : orderRoles) {
+                createInvoiceRoleContext.put("partyId", orderRole.getString("partyId"));
+                createInvoiceRoleContext.put("roleTypeId", orderRole.getString("roleTypeId"));
+                Map<String, Object> createInvoiceRoleResult = dispatcher.runSync("createInvoiceRole", createInvoiceRoleContext);
+                if (ServiceUtil.isError(createInvoiceRoleResult)) {
+                    return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingInvoiceFromOrder",locale), null, null, createInvoiceRoleResult);
                 }
             }
 
             // order terms to invoice terms.
             // TODO: it might be nice to filter OrderTerms to only copy over financial terms.
-            List orderTerms = orh.getOrderTerms();
+            List<GenericValue> orderTerms = orh.getOrderTerms();
             createInvoiceTerms(delegator, dispatcher, invoiceId, orderTerms, userLogin, locale);
 
             // billing accounts
-            List billingAccountTerms = null;
+            // List billingAccountTerms = null;
             // for billing accounts we will use related information
             if (billingAccount != null) {
                 /*
@@ -307,14 +301,12 @@
                 createInvoiceTerms(delegator, dispatcher, invoiceId, billingAccountTerms, userLogin, locale);
                 */
                 // set the invoice bill_to_customer from the billing account
-                List billToRoles = billingAccount.getRelated("BillingAccountRole", UtilMisc.toMap("roleTypeId", "BILL_TO_CUSTOMER"), null);
-                Iterator billToIter = billToRoles.iterator();
-                while (billToIter.hasNext()) {
-                    GenericValue billToRole = (GenericValue) billToIter.next();
+                List<GenericValue> billToRoles = billingAccount.getRelated("BillingAccountRole", UtilMisc.toMap("roleTypeId", "BILL_TO_CUSTOMER"), null);
+                for (GenericValue billToRole : billToRoles) {
                     if (!(billToRole.getString("partyId").equals(billToCustomerPartyId))) {
-                        Map createInvoiceRoleContext = UtilMisc.toMap("invoiceId", invoiceId, "partyId", billToRole.get("partyId"),
+                        createInvoiceRoleContext = UtilMisc.toMap("invoiceId", invoiceId, "partyId", billToRole.get("partyId"),
                                                                            "roleTypeId", "BILL_TO_CUSTOMER", "userLogin", userLogin);
-                        Map createInvoiceRoleResult = dispatcher.runSync("createInvoiceRole", createInvoiceRoleContext);
+                        Map<String, Object> createInvoiceRoleResult = dispatcher.runSync("createInvoiceRole", createInvoiceRoleContext);
                         if (ServiceUtil.isError(createInvoiceRoleResult)) {
                             return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingInvoiceRoleFromOrder",locale), null, null, createInvoiceRoleResult);
                         }
@@ -323,22 +315,20 @@
 
                 // set the bill-to contact mech as the contact mech of the billing account
                 if (UtilValidate.isNotEmpty(billingAccount.getString("contactMechId"))) {
-                    Map createBillToContactMechContext = UtilMisc.toMap("invoiceId", invoiceId, "contactMechId", billingAccount.getString("contactMechId"),
+                    Map<String, Object> createBillToContactMechContext = UtilMisc.toMap("invoiceId", invoiceId, "contactMechId", billingAccount.getString("contactMechId"),
                                                                        "contactMechPurposeTypeId", "BILLING_LOCATION", "userLogin", userLogin);
-                    Map createBillToContactMechResult = dispatcher.runSync("createInvoiceContactMech", createBillToContactMechContext);
+                    Map<String, Object> createBillToContactMechResult = dispatcher.runSync("createInvoiceContactMech", createBillToContactMechContext);
                     if (ServiceUtil.isError(createBillToContactMechResult)) {
                         return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingInvoiceContactMechFromOrder",locale), null, null, createBillToContactMechResult);
                     }
                 }
             } else {
-                List billingLocations = orh.getBillingLocations();
+                List<GenericValue> billingLocations = orh.getBillingLocations();
                 if (UtilValidate.isNotEmpty(billingLocations)) {
-                    Iterator bli = billingLocations.iterator();
-                    while (bli.hasNext()) {
-                        GenericValue ocm = (GenericValue) bli.next();
-                        Map createBillToContactMechContext = UtilMisc.toMap("invoiceId", invoiceId, "contactMechId", ocm.getString("contactMechId"),
+                    for (GenericValue ocm : billingLocations) {
+                        Map<String, Object> createBillToContactMechContext = UtilMisc.toMap("invoiceId", invoiceId, "contactMechId", ocm.getString("contactMechId"),
                                                                            "contactMechPurposeTypeId", "BILLING_LOCATION", "userLogin", userLogin);
-                        Map createBillToContactMechResult = dispatcher.runSync("createInvoiceContactMech", createBillToContactMechContext);
+                        Map<String, Object> createBillToContactMechResult = dispatcher.runSync("createInvoiceContactMech", createBillToContactMechContext);
                         if (ServiceUtil.isError(createBillToContactMechResult)) {
                             return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingInvoiceContactMechFromOrder",locale), null, null, createBillToContactMechResult);
                         }
@@ -357,7 +347,7 @@
                 // for purchase orders, the pay to address is the BILLING_LOCATION of the vendor
                 GenericValue billFromVendor = orh.getPartyFromRole("BILL_FROM_VENDOR");
                 if (billFromVendor != null) {
-                    List billingContactMechs = billFromVendor.getRelatedOne("Party").getRelatedByAnd("PartyContactMechPurpose",
+                    List<GenericValue> billingContactMechs = billFromVendor.getRelatedOne("Party").getRelatedByAnd("PartyContactMechPurpose",
                             UtilMisc.toMap("contactMechPurposeTypeId", "BILLING_LOCATION"));
                     if ((billingContactMechs != null) && (billingContactMechs.size() > 0)) {
                         payToAddress = (GenericValue) billingContactMechs.get(0);
@@ -368,9 +358,9 @@
                 payToAddress = PaymentWorker.getPaymentAddress(delegator, productStore.getString("payToPartyId"));
             }
             if (payToAddress != null) {
-                Map createPayToContactMechContext = UtilMisc.toMap("invoiceId", invoiceId, "contactMechId", payToAddress.getString("contactMechId"),
+                Map<String, Object> createPayToContactMechContext = UtilMisc.toMap("invoiceId", invoiceId, "contactMechId", payToAddress.getString("contactMechId"),
                                                                    "contactMechPurposeTypeId", "PAYMENT_LOCATION", "userLogin", userLogin);
-                Map createPayToContactMechResult = dispatcher.runSync("createInvoiceContactMech", createPayToContactMechContext);
+                Map<String, Object> createPayToContactMechResult = dispatcher.runSync("createInvoiceContactMech", createPayToContactMechContext);
                 if (ServiceUtil.isError(createPayToContactMechResult)) {
                     return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingInvoiceContactMechFromOrder",locale), null, null, createPayToContactMechResult);
                 }
@@ -381,289 +371,281 @@
             String invoiceItemSeqId = UtilFormatOut.formatPaddedNumber(invoiceItemSeqNum, INVOICE_ITEM_SEQUENCE_ID_DIGITS);
 
             // create the item records
-            if (billItems != null) {
-                Iterator itemIter = billItems.iterator();
-                while (itemIter.hasNext()) {
-                    GenericValue itemIssuance = null;
-                    GenericValue orderItem = null;
-                    GenericValue shipmentReceipt = null;
-                    GenericValue currentValue = (GenericValue) itemIter.next();
-                    if ("ItemIssuance".equals(currentValue.getEntityName())) {
-                        itemIssuance = currentValue;
-                    } else if ("OrderItem".equals(currentValue.getEntityName())) {
-                        orderItem = currentValue;
-                    } else if ("ShipmentReceipt".equals(currentValue.getEntityName())) {
-                        shipmentReceipt = currentValue;
-                    } else {
-                        Debug.logError("Unexpected entity " + currentValue + " of type " + currentValue.getEntityName(), module);
-                    }
+            for (GenericValue currentValue : billItems) {
+                GenericValue itemIssuance = null;
+                GenericValue orderItem = null;
+                GenericValue shipmentReceipt = null;
+                if ("ItemIssuance".equals(currentValue.getEntityName())) {
+                    itemIssuance = currentValue;
+                } else if ("OrderItem".equals(currentValue.getEntityName())) {
+                    orderItem = currentValue;
+                } else if ("ShipmentReceipt".equals(currentValue.getEntityName())) {
+                    shipmentReceipt = currentValue;
+                } else {
+                    Debug.logError("Unexpected entity " + currentValue + " of type " + currentValue.getEntityName(), module);
+                }
 
-                    if (orderItem == null && itemIssuance != null) {
-                        orderItem = itemIssuance.getRelatedOne("OrderItem");
-                    } else if ((orderItem == null) && (shipmentReceipt != null)) {
-                        orderItem = shipmentReceipt.getRelatedOne("OrderItem");
-                    } else if ((orderItem == null) && (itemIssuance == null) && (shipmentReceipt == 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");
-                    }
-
-                    // get some quantities
-                    BigDecimal orderedQuantity = orderItem.getBigDecimal("quantity");
-                    BigDecimal billingQuantity = null;
-                    if (itemIssuance != null) {
-                        billingQuantity = itemIssuance.getBigDecimal("quantity");
-                        BigDecimal cancelQty = itemIssuance.getBigDecimal("cancelQuantity");
-                        if (cancelQty == null) {
-                            cancelQty = ZERO;
-                        }
-                        billingQuantity = billingQuantity.subtract(cancelQty).setScale(decimals, rounding);
-                    } else if (shipmentReceipt != null) {
-                        billingQuantity = shipmentReceipt.getBigDecimal("quantityAccepted");
-                    } else {
-                        billingQuantity = orderedQuantity;
-                    }
-                    if (orderedQuantity == null) orderedQuantity = ZERO;
-                    if (billingQuantity == null) billingQuantity = ZERO;
+                if (orderItem == null && itemIssuance != null) {
+                    orderItem = itemIssuance.getRelatedOne("OrderItem");
+                } else if ((orderItem == null) && (shipmentReceipt != null)) {
+                    orderItem = shipmentReceipt.getRelatedOne("OrderItem");
+                } else if ((orderItem == null) && (itemIssuance == null) && (shipmentReceipt == 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");
+                }
+
+                // get some quantities
+                BigDecimal orderedQuantity = orderItem.getBigDecimal("quantity");
+                BigDecimal billingQuantity = null;
+                if (itemIssuance != null) {
+                    billingQuantity = itemIssuance.getBigDecimal("quantity");
+                    BigDecimal cancelQty = itemIssuance.getBigDecimal("cancelQuantity");
+                    if (cancelQty == null) {
+                        cancelQty = ZERO;
+                    }
+                    billingQuantity = billingQuantity.subtract(cancelQty).setScale(DECIMALS, ROUNDING);
+                } else if (shipmentReceipt != null) {
+                    billingQuantity = shipmentReceipt.getBigDecimal("quantityAccepted");
+                } else {
+                    billingQuantity = orderedQuantity;
+                }
+                if (orderedQuantity == null) orderedQuantity = ZERO;
+                if (billingQuantity == null) billingQuantity = ZERO;
 
-                    // check if shipping applies to this item.  Shipping is calculated for sales invoices, not purchase invoices.
-                    boolean shippingApplies = false;
-                    if ((product != null) && (ProductWorker.shippingApplies(product)) && (invoiceType.equals("SALES_INVOICE"))) {
-                        shippingApplies = true;
-                    }
+                // check if shipping applies to this item.  Shipping is calculated for sales invoices, not purchase invoices.
+                boolean shippingApplies = false;
+                if ((product != null) && (ProductWorker.shippingApplies(product)) && (invoiceType.equals("SALES_INVOICE"))) {
+                    shippingApplies = true;
+                }
 
-                    BigDecimal billingAmount = orderItem.getBigDecimal("unitPrice").setScale(invoiceTypeDecimals, rounding);
+                BigDecimal billingAmount = orderItem.getBigDecimal("unitPrice").setScale(invoiceTypeDecimals, ROUNDING);
 
-                    Map createInvoiceItemContext = FastMap.newInstance();
-                    createInvoiceItemContext.put("invoiceId", invoiceId);
-                    createInvoiceItemContext.put("invoiceItemSeqId", invoiceItemSeqId);
-                    createInvoiceItemContext.put("invoiceItemTypeId", getInvoiceItemType(delegator, (orderItem.getString("orderItemTypeId")), (product == null ? null : product.getString("productTypeId")), invoiceType, "INV_FPROD_ITEM"));
-                    createInvoiceItemContext.put("description", orderItem.get("itemDescription"));
-                    createInvoiceItemContext.put("quantity", billingQuantity);
-                    createInvoiceItemContext.put("amount", billingAmount);
-                    createInvoiceItemContext.put("productId", orderItem.get("productId"));
-                    createInvoiceItemContext.put("productFeatureId", orderItem.get("productFeatureId"));
-                    createInvoiceItemContext.put("overrideGlAccountId", orderItem.get("overrideGlAccountId"));
-                    //createInvoiceItemContext.put("uomId", "");
-                    createInvoiceItemContext.put("userLogin", userLogin);
+                Map<String, Object> createInvoiceItemContext = FastMap.newInstance();
+                createInvoiceItemContext.put("invoiceId", invoiceId);
+                createInvoiceItemContext.put("invoiceItemSeqId", invoiceItemSeqId);
+                createInvoiceItemContext.put("invoiceItemTypeId", getInvoiceItemType(delegator, (orderItem.getString("orderItemTypeId")), (product == null ? null : product.getString("productTypeId")), invoiceType, "INV_FPROD_ITEM"));
+                createInvoiceItemContext.put("description", orderItem.get("itemDescription"));
+                createInvoiceItemContext.put("quantity", billingQuantity);
+                createInvoiceItemContext.put("amount", billingAmount);
+                createInvoiceItemContext.put("productId", orderItem.get("productId"));
+                createInvoiceItemContext.put("productFeatureId", orderItem.get("productFeatureId"));
+                createInvoiceItemContext.put("overrideGlAccountId", orderItem.get("overrideGlAccountId"));
+                //createInvoiceItemContext.put("uomId", "");
+                createInvoiceItemContext.put("userLogin", userLogin);
 
-                    String itemIssuanceId = null;
-                    if (itemIssuance != null && itemIssuance.get("inventoryItemId") != null) {
-                        itemIssuanceId = itemIssuance.getString("itemIssuanceId");
-                        createInvoiceItemContext.put("inventoryItemId", itemIssuance.get("inventoryItemId"));
-                    }
-                    // similarly, tax only for purchase invoices
-                    if ((product != null) && (invoiceType.equals("SALES_INVOICE"))) {
-                        createInvoiceItemContext.put("taxableFlag", product.get("taxable"));
-                    }
+                String itemIssuanceId = null;
+                if (itemIssuance != null && itemIssuance.get("inventoryItemId") != null) {
+                    itemIssuanceId = itemIssuance.getString("itemIssuanceId");
+                    createInvoiceItemContext.put("inventoryItemId", itemIssuance.get("inventoryItemId"));
+                }
+                // similarly, tax only for purchase invoices
+                if ((product != null) && (invoiceType.equals("SALES_INVOICE"))) {
+                    createInvoiceItemContext.put("taxableFlag", product.get("taxable"));
+                }
 
-                    Map createInvoiceItemResult = dispatcher.runSync("createInvoiceItem", createInvoiceItemContext);
-                    if (ServiceUtil.isError(createInvoiceItemResult)) {
-                        return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingInvoiceItemFromOrder",locale), null, null, createInvoiceItemResult);
-                    }
+                Map<String, Object> createInvoiceItemResult = dispatcher.runSync("createInvoiceItem", createInvoiceItemContext);
+                if (ServiceUtil.isError(createInvoiceItemResult)) {
+                    return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingInvoiceItemFromOrder",locale), null, null, createInvoiceItemResult);
+                }
 
-                    // this item total
-                    BigDecimal thisAmount = billingAmount.multiply(billingQuantity).setScale(invoiceTypeDecimals, rounding);
+                // this item total
+                BigDecimal thisAmount = billingAmount.multiply(billingQuantity).setScale(invoiceTypeDecimals, ROUNDING);
 
-                    // add to the ship amount only if it applies to this item
-                    if (shippingApplies) {
-                        invoiceShipProRateAmount = invoiceShipProRateAmount.add(thisAmount).setScale(invoiceTypeDecimals, rounding);
-                    }
+                // add to the ship amount only if it applies to this item
+                if (shippingApplies) {
+                    invoiceShipProRateAmount = invoiceShipProRateAmount.add(thisAmount).setScale(invoiceTypeDecimals, ROUNDING);
+                }
 
-                    // increment the invoice subtotal
-                    invoiceSubTotal = invoiceSubTotal.add(thisAmount).setScale(100, rounding);
+                // increment the invoice subtotal
+                invoiceSubTotal = invoiceSubTotal.add(thisAmount).setScale(100, ROUNDING);
 
-                    // increment the invoice quantity
-                    invoiceQuantity = invoiceQuantity.add(billingQuantity).setScale(invoiceTypeDecimals, rounding);
+                // increment the invoice quantity
+                invoiceQuantity = invoiceQuantity.add(billingQuantity).setScale(invoiceTypeDecimals, ROUNDING);
 
-                    // create the OrderItemBilling record
-                    Map createOrderItemBillingContext = FastMap.newInstance();
-                    createOrderItemBillingContext.put("invoiceId", invoiceId);
-                    createOrderItemBillingContext.put("invoiceItemSeqId", invoiceItemSeqId);
-                    createOrderItemBillingContext.put("orderId", orderItem.get("orderId"));
-                    createOrderItemBillingContext.put("orderItemSeqId", orderItem.get("orderItemSeqId"));
-                    createOrderItemBillingContext.put("itemIssuanceId", itemIssuanceId);
-                    createOrderItemBillingContext.put("quantity", billingQuantity);
-                    createOrderItemBillingContext.put("amount", billingAmount);
-                    createOrderItemBillingContext.put("userLogin", userLogin);
-                    if ((shipmentReceipt != null) && (shipmentReceipt.getString("receiptId") != null)) {
-                        createOrderItemBillingContext.put("shipmentReceiptId", shipmentReceipt.getString("receiptId"));
-                    }
+                // create the OrderItemBilling record
+                Map<String, Object> createOrderItemBillingContext = FastMap.newInstance();
+                createOrderItemBillingContext.put("invoiceId", invoiceId);
+                createOrderItemBillingContext.put("invoiceItemSeqId", invoiceItemSeqId);
+                createOrderItemBillingContext.put("orderId", orderItem.get("orderId"));
+                createOrderItemBillingContext.put("orderItemSeqId", orderItem.get("orderItemSeqId"));
+                createOrderItemBillingContext.put("itemIssuanceId", itemIssuanceId);
+                createOrderItemBillingContext.put("quantity", billingQuantity);
+                createOrderItemBillingContext.put("amount", billingAmount);
+                createOrderItemBillingContext.put("userLogin", userLogin);
+                if ((shipmentReceipt != null) && (shipmentReceipt.getString("receiptId") != null)) {
+                    createOrderItemBillingContext.put("shipmentReceiptId", shipmentReceipt.getString("receiptId"));
+                }
 
-                    Map createOrderItemBillingResult = dispatcher.runSync("createOrderItemBilling", createOrderItemBillingContext);
-                    if (ServiceUtil.isError(createOrderItemBillingResult)) {
-                        return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingOrderItemBillingFromOrder",locale), null, null, createOrderItemBillingResult);
-                    }
+                Map<String, Object> createOrderItemBillingResult = dispatcher.runSync("createOrderItemBilling", createOrderItemBillingContext);
+                if (ServiceUtil.isError(createOrderItemBillingResult)) {
+                    return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingOrderItemBillingFromOrder",locale), null, null, createOrderItemBillingResult);
+                }
 
-                    if ("ItemIssuance".equals(currentValue.getEntityName())) {
-                        List<GenericValue> shipmentItemBillings = delegator.findByAnd("ShipmentItemBilling", UtilMisc.toMap("shipmentId", currentValue.get("shipmentId")));
-                        if (UtilValidate.isEmpty(shipmentItemBillings)) {
+                if ("ItemIssuance".equals(currentValue.getEntityName())) {
+                    List<GenericValue> shipmentItemBillings = delegator.findByAnd("ShipmentItemBilling", UtilMisc.toMap("shipmentId", currentValue.get("shipmentId")));
+                    if (UtilValidate.isEmpty(shipmentItemBillings)) {
 
-                            // create the ShipmentItemBilling record
-                            GenericValue shipmentItemBilling = delegator.makeValue("ShipmentItemBilling", UtilMisc.toMap("invoiceId", invoiceId, "invoiceItemSeqId", invoiceItemSeqId));
-                            shipmentItemBilling.put("shipmentId", currentValue.get("shipmentId"));
-                            shipmentItemBilling.put("shipmentItemSeqId", currentValue.get("shipmentItemSeqId"));
-                            shipmentItemBilling.create();
-                        }
+                        // create the ShipmentItemBilling record
+                        GenericValue shipmentItemBilling = delegator.makeValue("ShipmentItemBilling", UtilMisc.toMap("invoiceId", invoiceId, "invoiceItemSeqId", invoiceItemSeqId));
+                        shipmentItemBilling.put("shipmentId", currentValue.get("shipmentId"));
+                        shipmentItemBilling.put("shipmentItemSeqId", currentValue.get("shipmentItemSeqId"));
+                        shipmentItemBilling.create();
                     }
+                }
 
-                    String parentInvoiceItemSeqId = invoiceItemSeqId;
-                    // increment the counter
-                    invoiceItemSeqNum++;
-                    invoiceItemSeqId = UtilFormatOut.formatPaddedNumber(invoiceItemSeqNum, INVOICE_ITEM_SEQUENCE_ID_DIGITS);
+                String parentInvoiceItemSeqId = invoiceItemSeqId;
+                // increment the counter
+                invoiceItemSeqNum++;
+                invoiceItemSeqId = UtilFormatOut.formatPaddedNumber(invoiceItemSeqNum, INVOICE_ITEM_SEQUENCE_ID_DIGITS);
 
-                    // Get the original order item from the DB, in case the quantity has been overridden
-                    GenericValue originalOrderItem = delegator.findByPrimaryKey("OrderItem", UtilMisc.toMap("orderId", orderId, "orderItemSeqId", orderItem.getString("orderItemSeqId")));
+                // Get the original order item from the DB, in case the quantity has been overridden
+                GenericValue originalOrderItem = delegator.findByPrimaryKey("OrderItem", UtilMisc.toMap("orderId", orderId, "orderItemSeqId", orderItem.getString("orderItemSeqId")));
 
-                    // create the item adjustment as line items
-                    List itemAdjustments = OrderReadHelper.getOrderItemAdjustmentList(orderItem, orh.getAdjustments());
-                    Iterator itemAdjIter = itemAdjustments.iterator();
-                    while (itemAdjIter.hasNext()) {
-                        GenericValue adj = (GenericValue) itemAdjIter.next();
+                // create the item adjustment as line items
+                List<GenericValue> itemAdjustments = OrderReadHelper.getOrderItemAdjustmentList(orderItem, orh.getAdjustments());
+                for (GenericValue adj : itemAdjustments) {
 
-                        // Check against OrderAdjustmentBilling to see how much of this adjustment has already been invoiced
-                        BigDecimal adjAlreadyInvoicedAmount = null;
-                        try {
-                            Map checkResult = dispatcher.runSync("calculateInvoicedAdjustmentTotal", UtilMisc.toMap("orderAdjustment", adj));
-                            adjAlreadyInvoicedAmount = (BigDecimal) checkResult.get("invoicedTotal");
-                        } catch (GenericServiceException e) {
-                            String errMsg = UtilProperties.getMessage(resource, "AccountingTroubleCallingCalculateInvoicedAdjustmentTotalService", locale);
-                            Debug.logError(e, errMsg, module);
-                            return ServiceUtil.returnError(errMsg);
-                        }
+                    // Check against OrderAdjustmentBilling to see how much of this adjustment has already been invoiced
+                    BigDecimal adjAlreadyInvoicedAmount = null;
+                    try {
+                        Map<String, Object> checkResult = dispatcher.runSync("calculateInvoicedAdjustmentTotal", UtilMisc.toMap("orderAdjustment", adj));
+                        adjAlreadyInvoicedAmount = (BigDecimal) checkResult.get("invoicedTotal");
+                    } catch (GenericServiceException e) {
+                        String errMsg = UtilProperties.getMessage(resource, "AccountingTroubleCallingCalculateInvoicedAdjustmentTotalService", locale);
+                        Debug.logError(e, errMsg, module);
+                        return ServiceUtil.returnError(errMsg);
+                    }
 
-                        // If the absolute invoiced amount >= the abs of the adjustment amount, the full amount has already been invoiced,
-                        //  so skip this adjustment
-                        if (adj.get("amount") == null) { // JLR 17/4/7 : fix a bug coming from POS in case of use of a discount (on item(s) or sale, item(s) here) and a cash amount higher than total (hence issuing change)
-                            continue;
+                    // If the absolute invoiced amount >= the abs of the adjustment amount, the full amount has already been invoiced,
+                    //  so skip this adjustment
+                    if (adj.get("amount") == null) { // JLR 17/4/7 : fix a bug coming from POS in case of use of a discount (on item(s) or sale, item(s) here) and a cash amount higher than total (hence issuing change)
+                        continue;
+                    }
+                    if (adjAlreadyInvoicedAmount.abs().compareTo(adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, ROUNDING).abs()) > 0) {
+                        continue;
+                    }
+
+                    BigDecimal amount = ZERO;
+                    if (adj.get("amount") != null) {
+                        // pro-rate the amount
+                        // set decimals = 100 means we don't round this intermediate value, which is very important
+                        amount = adj.getBigDecimal("amount").divide(originalOrderItem.getBigDecimal("quantity"), 100, ROUNDING);
+                        amount = amount.multiply(billingQuantity);
+                        // Tax needs to be rounded differently from other order adjustments
+                        if (adj.getString("orderAdjustmentTypeId").equals("SALES_TAX")) {
+                            amount = amount.setScale(TAX_DECIMALS, TAX_ROUNDING);
+                        } else {
+                            amount = amount.setScale(invoiceTypeDecimals, ROUNDING);
                         }
-                        if (adjAlreadyInvoicedAmount.abs().compareTo(adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, rounding).abs()) > 0) {
-                            continue;
+                    } else if (adj.get("sourcePercentage") != null) {
+                        // pro-rate the amount
+                        // set decimals = 100 means we don't round this intermediate value, which is very important
+                        BigDecimal percent = adj.getBigDecimal("sourcePercentage");
+                        percent = percent.divide(new BigDecimal(100), 100, ROUNDING);
+                        amount = billingAmount.multiply(percent);
+                        amount = amount.divide(originalOrderItem.getBigDecimal("quantity"), 100, ROUNDING);
+                        amount = amount.multiply(billingQuantity);
+                        amount = amount.setScale(invoiceTypeDecimals, ROUNDING);
+                    }
+                    if (amount.signum() != 0) {
+                        Map<String, Object> createInvoiceItemAdjContext = FastMap.newInstance();
+                        createInvoiceItemAdjContext.put("invoiceId", invoiceId);
+                        createInvoiceItemAdjContext.put("invoiceItemSeqId", invoiceItemSeqId);
+                        createInvoiceItemAdjContext.put("invoiceItemTypeId", getInvoiceItemType(delegator, adj.getString("orderAdjustmentTypeId"), null, invoiceType, "INVOICE_ITM_ADJ"));
+                        createInvoiceItemAdjContext.put("quantity", BigDecimal.ONE);
+                        createInvoiceItemAdjContext.put("amount", amount);
+                        createInvoiceItemAdjContext.put("productId", orderItem.get("productId"));
+                        createInvoiceItemAdjContext.put("productFeatureId", orderItem.get("productFeatureId"));
+                        createInvoiceItemAdjContext.put("overrideGlAccountId", adj.get("overrideGlAccountId"));
+                        createInvoiceItemAdjContext.put("parentInvoiceId", invoiceId);
+                        createInvoiceItemAdjContext.put("parentInvoiceItemSeqId", parentInvoiceItemSeqId);
+                        //createInvoiceItemAdjContext.put("uomId", "");
+                        createInvoiceItemAdjContext.put("userLogin", userLogin);
+                        createInvoiceItemAdjContext.put("taxAuthPartyId", adj.get("taxAuthPartyId"));
+                        createInvoiceItemAdjContext.put("taxAuthGeoId", adj.get("taxAuthGeoId"));
+                        createInvoiceItemAdjContext.put("taxAuthorityRateSeqId", adj.get("taxAuthorityRateSeqId"));
+
+                        // some adjustments fill out the comments field instead
+                        String description = (UtilValidate.isEmpty(adj.getString("description")) ? adj.getString("comments") : adj.getString("description"));
+                        createInvoiceItemAdjContext.put("description", description);
+
+                        // invoice items for sales tax are not taxable themselves
+                        // TODO: This is not an ideal solution. Instead, we need to use OrderAdjustment.includeInTax when it is implemented
+                        if (!(adj.getString("orderAdjustmentTypeId").equals("SALES_TAX"))) {
+                            createInvoiceItemAdjContext.put("taxableFlag", product.get("taxable"));
+                        }
+
+                        // If the OrderAdjustment is associated to a ProductPromo,
+                        // and the field ProductPromo.overrideOrgPartyId is set,
+                        // copy the value to InvoiceItem.overrideOrgPartyId: this
+                        // represent an organization override for the payToPartyId
+                        if (UtilValidate.isNotEmpty(adj.getString("productPromoId"))) {
+                            try {
+                                GenericValue productPromo = adj.getRelatedOne("ProductPromo");
+                                if (UtilValidate.isNotEmpty(productPromo.getString("overrideOrgPartyId"))) {
+                                    createInvoiceItemAdjContext.put("overrideOrgPartyId", productPromo.getString("overrideOrgPartyId"));
+                                }
+                            } catch (GenericEntityException e) {
+                                Debug.logError(e, "Error looking up ProductPromo with id [" + adj.getString("productPromoId") + "]", module);
+                            }
                         }
 
-                        BigDecimal amount = ZERO;
-                        if (adj.get("amount") != null) {
-                            // pro-rate the amount
-                            // set decimals = 100 means we don't round this intermediate value, which is very important
-                            amount = adj.getBigDecimal("amount").divide(originalOrderItem.getBigDecimal("quantity"), 100, rounding);
-                            amount = amount.multiply(billingQuantity);
-                            // Tax needs to be rounded differently from other order adjustments
-                            if (adj.getString("orderAdjustmentTypeId").equals("SALES_TAX")) {
-                                amount = amount.setScale(taxDecimals, taxRounding);
-                            } else {
-                                amount = amount.setScale(invoiceTypeDecimals, rounding);
-                            }
-                        } else if (adj.get("sourcePercentage") != null) {
-                            // pro-rate the amount
-                            // set decimals = 100 means we don't round this intermediate value, which is very important
-                            BigDecimal percent = adj.getBigDecimal("sourcePercentage");
-                            percent = percent.divide(new BigDecimal(100), 100, rounding);
-                            amount = billingAmount.multiply(percent);
-                            amount = amount.divide(originalOrderItem.getBigDecimal("quantity"), 100, rounding);
-                            amount = amount.multiply(billingQuantity);
-                            amount = amount.setScale(invoiceTypeDecimals, rounding);
-                        }
-                        if (amount.signum() != 0) {
-                            Map createInvoiceItemAdjContext = FastMap.newInstance();
-                            createInvoiceItemAdjContext.put("invoiceId", invoiceId);
-                            createInvoiceItemAdjContext.put("invoiceItemSeqId", invoiceItemSeqId);
-                            createInvoiceItemAdjContext.put("invoiceItemTypeId", getInvoiceItemType(delegator, adj.getString("orderAdjustmentTypeId"), null, invoiceType, "INVOICE_ITM_ADJ"));
-                            createInvoiceItemAdjContext.put("quantity", BigDecimal.ONE);
-                            createInvoiceItemAdjContext.put("amount", amount);
-                            createInvoiceItemAdjContext.put("productId", orderItem.get("productId"));
-                            createInvoiceItemAdjContext.put("productFeatureId", orderItem.get("productFeatureId"));
-                            createInvoiceItemAdjContext.put("overrideGlAccountId", adj.get("overrideGlAccountId"));
-                            createInvoiceItemAdjContext.put("parentInvoiceId", invoiceId);
-                            createInvoiceItemAdjContext.put("parentInvoiceItemSeqId", parentInvoiceItemSeqId);
-                            //createInvoiceItemAdjContext.put("uomId", "");
-                            createInvoiceItemAdjContext.put("userLogin", userLogin);
-                            createInvoiceItemAdjContext.put("taxAuthPartyId", adj.get("taxAuthPartyId"));
-                            createInvoiceItemAdjContext.put("taxAuthGeoId", adj.get("taxAuthGeoId"));
-                            createInvoiceItemAdjContext.put("taxAuthorityRateSeqId", adj.get("taxAuthorityRateSeqId"));
-
-                            // some adjustments fill out the comments field instead
-                            String description = (UtilValidate.isEmpty(adj.getString("description")) ? adj.getString("comments") : adj.getString("description"));
-                            createInvoiceItemAdjContext.put("description", description);
-
-                            // invoice items for sales tax are not taxable themselves
-                            // TODO: This is not an ideal solution. Instead, we need to use OrderAdjustment.includeInTax when it is implemented
-                            if (!(adj.getString("orderAdjustmentTypeId").equals("SALES_TAX"))) {
-                                createInvoiceItemAdjContext.put("taxableFlag", product.get("taxable"));
-                            }
+                        Map<String, Object> createInvoiceItemAdjResult = dispatcher.runSync("createInvoiceItem", createInvoiceItemAdjContext);
+                        if (ServiceUtil.isError(createInvoiceItemAdjResult)) {
+                            return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingInvoiceItemFromOrder",locale), null, null, createInvoiceItemAdjResult);
+                        }
 
-                            // If the OrderAdjustment is associated to a ProductPromo,
-                            // and the field ProductPromo.overrideOrgPartyId is set,
-                            // copy the value to InvoiceItem.overrideOrgPartyId: this
-                            // represent an organization override for the payToPartyId
-                            if (UtilValidate.isNotEmpty(adj.getString("productPromoId"))) {
-                                try {
-                                    GenericValue productPromo = adj.getRelatedOne("ProductPromo");
-                                    if (UtilValidate.isNotEmpty(productPromo.getString("overrideOrgPartyId"))) {
-                                        createInvoiceItemAdjContext.put("overrideOrgPartyId", productPromo.getString("overrideOrgPartyId"));
-                                    }
-                                } catch (GenericEntityException e) {
-                                    Debug.logError(e, "Error looking up ProductPromo with id [" + adj.getString("productPromoId") + "]", module);
-                                }
-                            }
+                        // Create the OrderAdjustmentBilling record
+                        Map<String, Object> createOrderAdjustmentBillingContext = FastMap.newInstance();
+                        createOrderAdjustmentBillingContext.put("orderAdjustmentId", adj.getString("orderAdjustmentId"));
+                        createOrderAdjustmentBillingContext.put("invoiceId", invoiceId);
+                        createOrderAdjustmentBillingContext.put("invoiceItemSeqId", invoiceItemSeqId);
+                        createOrderAdjustmentBillingContext.put("amount", amount);
+                        createOrderAdjustmentBillingContext.put("userLogin", userLogin);
 
-                            Map createInvoiceItemAdjResult = dispatcher.runSync("createInvoiceItem", createInvoiceItemAdjContext);
-                            if (ServiceUtil.isError(createInvoiceItemAdjResult)) {
-                                return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingInvoiceItemFromOrder",locale), null, null, createInvoiceItemAdjResult);
-                            }
+                        Map<String, Object> createOrderAdjustmentBillingResult = dispatcher.runSync("createOrderAdjustmentBilling", createOrderAdjustmentBillingContext);
+                        if (ServiceUtil.isError(createOrderAdjustmentBillingResult)) {
+                            return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingOrderAdjustmentBillingFromOrder",locale), null, null, createOrderAdjustmentBillingContext);
+                        }
 
-                            // Create the OrderAdjustmentBilling record
-                            Map createOrderAdjustmentBillingContext = FastMap.newInstance();
-                            createOrderAdjustmentBillingContext.put("orderAdjustmentId", adj.getString("orderAdjustmentId"));
-                            createOrderAdjustmentBillingContext.put("invoiceId", invoiceId);
-                            createOrderAdjustmentBillingContext.put("invoiceItemSeqId", invoiceItemSeqId);
-                            createOrderAdjustmentBillingContext.put("amount", amount);
-                            createOrderAdjustmentBillingContext.put("userLogin", userLogin);
-
-                            Map createOrderAdjustmentBillingResult = dispatcher.runSync("createOrderAdjustmentBilling", createOrderAdjustmentBillingContext);
-                            if (ServiceUtil.isError(createOrderAdjustmentBillingResult)) {
-                                return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingOrderAdjustmentBillingFromOrder",locale), null, null, createOrderAdjustmentBillingContext);
-                            }
+                        // this adjustment amount
+                        BigDecimal thisAdjAmount = amount;
 
-                            // this adjustment amount
-                            BigDecimal thisAdjAmount = amount;
+                        // adjustments only apply to totals when they are not tax or shipping adjustments
+                        if (!"SALES_TAX".equals(adj.getString("orderAdjustmentTypeId")) &&
+                                !"SHIPPING_ADJUSTMENT".equals(adj.getString("orderAdjustmentTypeId"))) {
+                            // increment the invoice subtotal
+                            invoiceSubTotal = invoiceSubTotal.add(thisAdjAmount).setScale(100, ROUNDING);
 
-                            // adjustments only apply to totals when they are not tax or shipping adjustments
-                            if (!"SALES_TAX".equals(adj.getString("orderAdjustmentTypeId")) &&
-                                    !"SHIPPING_ADJUSTMENT".equals(adj.getString("orderAdjustmentTypeId"))) {
-                                // increment the invoice subtotal
-                                invoiceSubTotal = invoiceSubTotal.add(thisAdjAmount).setScale(100, rounding);
-
-                                // add to the ship amount only if it applies to this item
-                                if (shippingApplies) {
-                                    invoiceShipProRateAmount = invoiceShipProRateAmount.add(thisAdjAmount).setScale(invoiceTypeDecimals, rounding);
-                                }
+                            // add to the ship amount only if it applies to this item
+                            if (shippingApplies) {
+                                invoiceShipProRateAmount = invoiceShipProRateAmount.add(thisAdjAmount).setScale(invoiceTypeDecimals, ROUNDING);
                             }
-
-                            // increment the counter
-                            invoiceItemSeqNum++;
-                            invoiceItemSeqId = UtilFormatOut.formatPaddedNumber(invoiceItemSeqNum, INVOICE_ITEM_SEQUENCE_ID_DIGITS);
                         }
+
+                        // increment the counter
+                        invoiceItemSeqNum++;
+                        invoiceItemSeqId = UtilFormatOut.formatPaddedNumber(invoiceItemSeqNum, INVOICE_ITEM_SEQUENCE_ID_DIGITS);
                     }
                 }
             }
 
             // create header adjustments as line items -- always to tax/shipping last
-            Map shipAdjustments = new HashMap();
-            Map taxAdjustments = new HashMap();
+            Map<GenericValue, BigDecimal> shipAdjustments = FastMap.newInstance();
+            Map<GenericValue, BigDecimal> taxAdjustments = FastMap.newInstance();
 
-            List headerAdjustments = orh.getOrderHeaderAdjustments();
-            Iterator headerAdjIter = headerAdjustments.iterator();
-            while (headerAdjIter.hasNext()) {
-                GenericValue adj = (GenericValue) headerAdjIter.next();
+            List<GenericValue> headerAdjustments = orh.getOrderHeaderAdjustments();
+            for (GenericValue adj : headerAdjustments) {
 
                 // Check against OrderAdjustmentBilling to see how much of this adjustment has already been invoiced
                 BigDecimal adjAlreadyInvoicedAmount = null;
                 try {
-                    Map checkResult = dispatcher.runSync("calculateInvoicedAdjustmentTotal", UtilMisc.toMap("orderAdjustment", adj));
-                    adjAlreadyInvoicedAmount = ((BigDecimal) checkResult.get("invoicedTotal")).setScale(invoiceTypeDecimals, rounding);
+                    Map<String, Object> checkResult = dispatcher.runSync("calculateInvoicedAdjustmentTotal", UtilMisc.toMap("orderAdjustment", adj));
+                    adjAlreadyInvoicedAmount = ((BigDecimal) checkResult.get("invoicedTotal")).setScale(invoiceTypeDecimals, ROUNDING);
                 } catch (GenericServiceException e) {
                     String errMsg = UtilProperties.getMessage(resource, "AccountingTroubleCallingCalculateInvoicedAdjustmentTotalService", locale);
                     Debug.logError(e, errMsg, module);
@@ -675,7 +657,7 @@
                 if (null == adj.get("amount")) { // JLR 17/4/7 : fix a bug coming from POS in case of use of a discount (on item(s) or sale, sale here) and a cash amount higher than total (hence issuing change)
                     continue;
                 }
-                if (adjAlreadyInvoicedAmount.abs().compareTo(adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, rounding).abs()) > 0) {
+                if (adjAlreadyInvoicedAmount.abs().compareTo(adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, ROUNDING).abs()) > 0) {
                     continue;
                 }
 
@@ -687,7 +669,7 @@
                     // these will effect the shipping pro-rate (unless commented)
                     // other adjustment type
                     BigDecimal adjAmount = calcHeaderAdj(delegator, adj, invoiceType, invoiceId, invoiceItemSeqId,
-                            orderSubTotal, invoiceSubTotal, adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, rounding), invoiceTypeDecimals, rounding, userLogin, dispatcher, locale);
+                            orderSubTotal, invoiceSubTotal, adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, ROUNDING), invoiceTypeDecimals, ROUNDING, userLogin, dispatcher, locale);
                     // invoiceShipProRateAmount += adjAmount;
                     // do adjustments compound or are they based off subtotal? Here we will (unless commented)
                     // invoiceSubTotal += adjAmount;
@@ -700,9 +682,7 @@
 
             // 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
-            Iterator shipAdjIter = shipAdjustments.keySet().iterator();
-            while (shipAdjIter.hasNext()) {
-                GenericValue adj = (GenericValue) shipAdjIter.next();
+            for (GenericValue adj : shipAdjustments.keySet()) {
                 BigDecimal adjAlreadyInvoicedAmount = (BigDecimal) shipAdjustments.get(adj);
 
                 if ("N".equalsIgnoreCase(prorateShipping)) {
@@ -713,9 +693,9 @@
 
                     // The base amount in this case is the adjustment amount minus the total already invoiced for that adjustment, since
                     //  it won't be prorated
-                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, rounding).subtract(adjAlreadyInvoicedAmount);
+                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, ROUNDING).subtract(adjAlreadyInvoicedAmount);
                     BigDecimal adjAmount = calcHeaderAdj(delegator, adj, invoiceType, invoiceId, invoiceItemSeqId,
-                            divisor, multiplier, baseAmount, invoiceTypeDecimals, rounding, userLogin, dispatcher, locale);
+                            divisor, multiplier, baseAmount, invoiceTypeDecimals, ROUNDING, userLogin, dispatcher, locale);
                 } else {
 
                     // Pro-rate the shipping amount based on shippable information
@@ -723,9 +703,9 @@
                     BigDecimal multiplier = invoiceShipProRateAmount;
 
                     // The base amount in this case is the adjustment amount, since we want to prorate based on the full amount
-                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, rounding);
+                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, ROUNDING);
                     BigDecimal adjAmount = calcHeaderAdj(delegator, adj, invoiceType, invoiceId, invoiceItemSeqId,
-                            divisor, multiplier, baseAmount, invoiceTypeDecimals, rounding, userLogin, dispatcher, locale);
+                            divisor, multiplier, baseAmount, invoiceTypeDecimals, ROUNDING, userLogin, dispatcher, locale);
                 }
 
                 // Increment the counter
@@ -738,9 +718,7 @@
             if (prorateTaxes == null) {
                 prorateTaxes = "Y";
             }
-            Iterator taxAdjIter = taxAdjustments.keySet().iterator();
-            while (taxAdjIter.hasNext()) {
-                GenericValue adj = (GenericValue) taxAdjIter.next();
+            for (GenericValue adj : taxAdjustments.keySet()) {
                 BigDecimal adjAlreadyInvoicedAmount = (BigDecimal) taxAdjustments.get(adj);
                 BigDecimal adjAmount = null;
 
@@ -753,9 +731,9 @@
                     // The base amount in this case is the adjustment amount minus the total already invoiced for that adjustment, since
                     //  it won't be prorated
                     //  Note this should use invoice decimals & rounding instead of taxDecimals and taxRounding for tax adjustments, because it will be added to the invoice
-                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, rounding).subtract(adjAlreadyInvoicedAmount);
+                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, ROUNDING).subtract(adjAlreadyInvoicedAmount);
                     adjAmount = calcHeaderAdj(delegator, adj, invoiceType, invoiceId, invoiceItemSeqId,
-                             divisor, multiplier, baseAmount, invoiceTypeDecimals, rounding, userLogin, dispatcher, locale);
+                             divisor, multiplier, baseAmount, invoiceTypeDecimals, ROUNDING, userLogin, dispatcher, locale);
                 } else {
 
                     // Pro-rate the tax amount based on shippable information
@@ -764,11 +742,11 @@
 
                     // The base amount in this case is the adjustment amount, since we want to prorate based on the full amount
                     //  Note this should use invoice decimals & rounding instead of taxDecimals and taxRounding for tax adjustments, because it will be added to the invoice
-                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, rounding);
+                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, ROUNDING);
                     adjAmount = calcHeaderAdj(delegator, adj, invoiceType, invoiceId, invoiceItemSeqId,
-                            divisor, multiplier, baseAmount, invoiceTypeDecimals, rounding, userLogin, dispatcher, locale);
+                            divisor, multiplier, baseAmount, invoiceTypeDecimals, ROUNDING, userLogin, dispatcher, locale);
                 }
-                invoiceSubTotal = invoiceSubTotal.add(adjAmount).setScale(invoiceTypeDecimals, rounding);
+                invoiceSubTotal = invoiceSubTotal.add(adjAmount).setScale(invoiceTypeDecimals, ROUNDING);
 
                 // Increment the counter
                 invoiceItemSeqNum++;
@@ -776,31 +754,25 @@
             }
 
             // check for previous order payments
-            List orderPaymentPrefs = delegator.findByAnd("OrderPaymentPreference", UtilMisc.toMap("orderId", orderId));
-            List currentPayments = FastList.newInstance();
-            Iterator opi = orderPaymentPrefs.iterator();
-            while (opi.hasNext()) {
-                GenericValue paymentPref = (GenericValue) opi.next();
-                List payments = paymentPref.getRelated("Payment");
+            List<GenericValue> orderPaymentPrefs = delegator.findByAnd("OrderPaymentPreference", UtilMisc.toMap("orderId", orderId));
+            List<GenericValue> currentPayments = FastList.newInstance();
+            for (GenericValue paymentPref : orderPaymentPrefs) {
+                List<GenericValue> payments = paymentPref.getRelated("Payment");
                 currentPayments.addAll(payments);
             }
-            if (currentPayments.size() > 0) {
-                // apply these payments to the invoice if they have any remaining amount to apply
-                Iterator cpi = currentPayments.iterator();
-                while (cpi.hasNext()) {
-                    GenericValue payment = (GenericValue) cpi.next();
-                    BigDecimal notApplied = PaymentWorker.getPaymentNotApplied(payment);
-                    if (notApplied.signum() > 0) {
-                        Map appl = new HashMap();
-                        appl.put("paymentId", payment.get("paymentId"));
-                        appl.put("invoiceId", invoiceId);
-                        appl.put("billingAccountId", billingAccountId);
-                        appl.put("amountApplied", notApplied);
-                        appl.put("userLogin", userLogin);
-                        Map createPayApplResult = dispatcher.runSync("createPaymentApplication", appl);
-                        if (ServiceUtil.isError(createPayApplResult)) {
-                            return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingInvoiceFromOrder",locale), null, null, createPayApplResult);
-                        }
+            // apply these payments to the invoice if they have any remaining amount to apply
+            for (GenericValue payment : currentPayments) {
+                BigDecimal notApplied = PaymentWorker.getPaymentNotApplied(payment);
+                if (notApplied.signum() > 0) {
+                    Map<String, Object> appl = FastMap.newInstance();
+                    appl.put("paymentId", payment.get("paymentId"));
+                    appl.put("invoiceId", invoiceId);
+                    appl.put("billingAccountId", billingAccountId);
+                    appl.put("amountApplied", notApplied);
+                    appl.put("userLogin", userLogin);
+                    Map<String, Object> createPayApplResult = dispatcher.runSync("createPaymentApplication", appl);
+                    if (ServiceUtil.isError(createPayApplResult)) {
+                        return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingInvoiceFromOrder",locale), null, null, createPayApplResult);
                     }
                 }
             }
@@ -809,50 +781,50 @@
             String autoApproveInvoice = productStore != null ? productStore.getString("autoApproveInvoice") : "Y";
             if (!"N".equals(autoApproveInvoice)) {
                 String nextStatusId = "PURCHASE_INVOICE".equals(invoiceType) ? "INVOICE_IN_PROCESS" : "INVOICE_READY";
-                Map setInvoiceStatusResult = dispatcher.runSync("setInvoiceStatus", UtilMisc.<String, Object>toMap("invoiceId", invoiceId, "statusId", nextStatusId, "userLogin", userLogin));
+                Map<String, Object> setInvoiceStatusResult = dispatcher.runSync("setInvoiceStatus", UtilMisc.<String, Object>toMap("invoiceId", invoiceId, "statusId", nextStatusId, "userLogin", userLogin));
                 if (ServiceUtil.isError(setInvoiceStatusResult)) {
                     return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingErrorCreatingInvoiceFromOrder",locale), null, null, setInvoiceStatusResult);
                 }
             }
 
-            Map resp = ServiceUtil.returnSuccess();
+            Map<String, Object> resp = ServiceUtil.returnSuccess();
             resp.put("invoiceId", invoiceId);
             resp.put("invoiceTypeId", invoiceType);
             return resp;
         } catch (GenericEntityException e) {
-            String errMsg = UtilProperties.getMessage(resource,"AccountingEntityDataProblemCreatingInvoiceFromOrderItems",UtilMisc.toMap("reason",e.toString()),locale);
+            String errMsg = UtilProperties.getMessage(resource, "AccountingEntityDataProblemCreatingInvoiceFromOrderItems", UtilMisc.toMap("reason", e.toString()), locale);
             Debug.logError(e, errMsg, module);
             return ServiceUtil.returnError(errMsg);
         } catch (GenericServiceException e) {
-            String errMsg = UtilProperties.getMessage(resource,"AccountingServiceOtherProblemCreatingInvoiceFromOrderItems",UtilMisc.toMap("reason",e.toString()),locale);
+            String errMsg = UtilProperties.getMessage(resource, "AccountingServiceOtherProblemCreatingInvoiceFromOrderItems", UtilMisc.toMap("reason", e.toString()), locale);
             Debug.logError(e, errMsg, module);
             return ServiceUtil.returnError(errMsg);
         }
     }
 
     // Service for creating commission invoices
-    public static Map createCommissionInvoices(DispatchContext dctx, Map context) {
+    public static Map<String, Object> createCommissionInvoices(DispatchContext dctx, Map<String, Object> context) {
         GenericDelegator delegator = dctx.getDelegator();
         LocalDispatcher dispatcher = dctx.getDispatcher();
         GenericValue userLogin = (GenericValue) context.get("userLogin");
         Locale locale = (Locale) context.get("locale");
-        List<String> salesInvoiceIds = (List) context.get("invoiceIds");
-        List<Map> invoicesCreated = FastList.newInstance();
-        Map commissionParties = FastMap.newInstance();
+        List<String> salesInvoiceIds = UtilGenerics.checkList(context.get("invoiceIds"));
+        List<Map<String, String>> invoicesCreated = FastList.newInstance();
+        Map<String, List<Map<String, Object>>> commissionParties = FastMap.newInstance();
         for (String salesInvoiceId : salesInvoiceIds) {
-            List<String> salesRepPartyIds = (List) context.get("partyIds");
+            List<String> salesRepPartyIds = UtilGenerics.checkList(context.get("partyIds"));
             BigDecimal amountTotal =  InvoiceWorker.getInvoiceTotal(delegator, salesInvoiceId);
             if (amountTotal.signum() == 0) {
                 Debug.logWarning("Invoice [" + salesInvoiceId + "] has an amount total of [" + amountTotal + "], so no commission invoice will be created", module);
                 return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingInvoiceCommissionZeroInvoiceAmount",locale));
             }
-            BigDecimal appliedFraction = amountTotal.divide(amountTotal, 12, rounding);
+            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>();
             try {
-                List invoiceRoleConds = UtilMisc.toList(
+                List<EntityExpr> invoiceRoleConds = UtilMisc.toList(
                         EntityCondition.makeCondition("invoiceId", EntityOperator.EQUALS, salesInvoiceId),
                         EntityCondition.makeCondition("roleTypeId", EntityOperator.EQUALS, "BILL_FROM_VENDOR"));
                 billFromVendorInvoiceRoles = EntityUtil.getFieldListFromEntityList(delegator.findList("InvoiceRole", EntityCondition.makeCondition(invoiceRoleConds, EntityOperator.AND), null, null, null, false), "partyId", true);
@@ -868,7 +840,7 @@
                 } else {
                     List<String> salesInvoiceRolePartyIds = EntityUtil.getFieldListFromEntityList(delegator.findList("InvoiceRole", EntityCondition.makeCondition(invoiceRoleConds, EntityOperator.AND), null, null, null, false), "partyId", true);
                     if (UtilValidate.isNotEmpty(salesInvoiceRolePartyIds)) {
-                        salesRepPartyIds = (List) CollectionUtils.intersection(salesRepPartyIds, salesInvoiceRolePartyIds);
+                        salesRepPartyIds = UtilGenerics.checkList(CollectionUtils.intersection(salesRepPartyIds, salesInvoiceRolePartyIds));
                     }
                 }
                 invoice = delegator.findOne("Invoice", UtilMisc.toMap("invoiceId", salesInvoiceId), false);
@@ -896,7 +868,7 @@
                 String invoiceId = invoiceItem.getString("invoiceId");
                 // Determine commission parties for this invoiceItem
                 if (productId != null && productId.length() > 0) {
-                    Map resultMap = null;
+                    Map<String, Object> resultMap = null;
                     try {
                         resultMap = dispatcher.runSync("getCommissionForProduct", UtilMisc.<String, Object>toMap(
                                 "productId", productId,
@@ -911,9 +883,9 @@
                     }
                     // build a Map of partyIds (both to and from) in a commission and the amounts
                     // Note that getCommissionForProduct returns a List of Maps with a lot values.  See services.xml definition for reference.
-                    List<Map> itemCommissions = (List) resultMap.get("commissions");
+                    List<Map<String, Object>> itemCommissions = UtilGenerics.checkList(resultMap.get("commissions"));
                     if (UtilValidate.isNotEmpty(itemCommissions)) {
-                        for (Map commissionMap : itemCommissions) {
+                        for (Map<String, Object> commissionMap : itemCommissions) {
                             commissionMap.put("invoice", invoice);
                             commissionMap.put("appliedFraction", appliedFraction);
                             if (!billFromVendorInvoiceRoles.contains(commissionMap.get("partyIdFrom")) || !salesRepPartyIds.contains(commissionMap.get("partyIdTo"))) {
@@ -923,7 +895,7 @@
                             if (!commissionParties.containsKey(partyIdFromTo)) {
                                 commissionParties.put(partyIdFromTo, UtilMisc.toList(commissionMap));
                             } else {
-                                ((List)commissionParties.get(partyIdFromTo)).add(commissionMap);
+                                (commissionParties.get(partyIdFromTo)).add(commissionMap);
                             }
                         }
                     }
@@ -932,10 +904,9 @@
         }
         Timestamp now = UtilDateTime.nowTimestamp();
         // Create invoice for each commission receiving party
-        for (Object commissionParty : commissionParties.entrySet()) {
-            Map.Entry pair = (Map.Entry)commissionParty;
-            List toStore = FastList.newInstance();
-            List<Map> commList = (List)pair.getValue();
+        for (Map.Entry<String, List<Map<String, Object>>> commissionParty : commissionParties.entrySet()) {
+            List<GenericValue> toStore = FastList.newInstance();
+            List<Map<String, Object>> commList = commissionParty.getValue();
             // get the billing parties
             if (UtilValidate.isEmpty(commList)) {
                 continue;
@@ -948,7 +919,7 @@
             Long days = (Long) (commList.get(0)).get("days");
             // create the invoice record
             // To and From are in commission's sense, opposite for invoice
-            Map createInvoiceMap = FastMap.newInstance();
+            Map<String, Object> createInvoiceMap = FastMap.newInstance();
             createInvoiceMap.put("partyId", partyIdBillTo);
             createInvoiceMap.put("partyIdFrom", partyIdBillFrom);
             createInvoiceMap.put("invoiceDate", now);
@@ -962,7 +933,7 @@
             createInvoiceMap.put("currencyUomId", invoice.getString("currencyUomId"));
             createInvoiceMap.put("userLogin", userLogin);
             // store the invoice first
-            Map createInvoiceResult = null;
+            Map<String, Object> createInvoiceResult = null;
             try {
                 createInvoiceResult = dispatcher.runSync("createInvoice", createInvoiceMap);
             } catch (GenericServiceException e) {
@@ -970,7 +941,7 @@
             }
             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
-            List partyContactMechPurposeConds = UtilMisc.toList(
+            List<EntityExpr> partyContactMechPurposeConds = UtilMisc.toList(
                     EntityCondition.makeCondition("partyId", EntityOperator.EQUALS, partyIdBillTo),
                     EntityCondition.makeCondition("contactMechPurposeTypeId", EntityOperator.EQUALS, "BILLING_LOCATION"));
             List<GenericValue> partyContactMechPurposes = new ArrayList<GenericValue>();
@@ -1006,14 +977,14 @@
                 toStore.add(invoiceContactMech);
             }
             // create the item records
-            for (Map commissionMap : commList) {
+            for (Map<String, Object> commissionMap : commList) {
                 BigDecimal elemAmount = ((BigDecimal)commissionMap.get("commission")).multiply(appliedFraction);
                 BigDecimal quantity = (BigDecimal)commissionMap.get("quantity");
                 String invoiceIdFrom = (String)commissionMap.get("invoiceId");
                 String invoiceItemSeqIdFrom = (String)commissionMap.get("invoiceItemSeqId");
-                elemAmount = elemAmount.setScale(decimals, rounding);
-                Map resMap = null;
-                Map invoiceItemAssocResultMap = null;
+                elemAmount = elemAmount.setScale(DECIMALS, ROUNDING);
+                Map<String, Object> resMap = null;
+                Map<String, Object> invoiceItemAssocResultMap = null;
                 try {
                     resMap = dispatcher.runSync("createInvoiceItem", UtilMisc.toMap(
                             "invoiceId", invoiceId,
@@ -1051,24 +1022,22 @@
             }
             invoicesCreated.add(UtilMisc.toMap("commissionInvoiceId",invoiceId, "salesRepresentative ",partyIdBillFrom));
         }
-        Map result = ServiceUtil.returnSuccess("Created Commission invoices for each commission receiving parties " + invoicesCreated);
+        Map<String, Object> result = ServiceUtil.returnSuccess("Created Commission invoices for each commission receiving parties " + invoicesCreated);
         Debug.logInfo("Created Commission invoices for each commission receiving parties " + invoicesCreated, module);
         result.put("invoicesCreated", invoicesCreated);
         return result;
     }
 
-    public static Map readyInvoices(DispatchContext dctx, Map context) {
+    public static Map<String, Object> readyInvoices(DispatchContext dctx, Map<String, Object> context) {
         LocalDispatcher dispatcher = dctx.getDispatcher();
         GenericValue userLogin = (GenericValue) context.get("userLogin");
         Locale locale = (Locale) context.get("locale");
         // Get invoices to make ready
-        List invoicesCreated = (List) context.get("invoicesCreated");
+        List<String> invoicesCreated = UtilGenerics.checkList(context.get("invoicesCreated"));
         String nextStatusId = "INVOICE_READY";
-        Iterator it = invoicesCreated.iterator();
         try {
-            while (it.hasNext()) {
-                String invoiceId = (String) it.next();
-                Map setInvoiceStatusResult = dispatcher.runSync("setInvoiceStatus", UtilMisc.<String, Object>toMap("invoiceId", invoiceId, "statusId", nextStatusId, "userLogin", userLogin));
+            for (String invoiceId : invoicesCreated) {
+                Map<String, Object> setInvoiceStatusResult = dispatcher.runSync("setInvoiceStatus", UtilMisc.<String, Object>toMap("invoiceId", invoiceId, "statusId", nextStatusId, "userLogin", userLogin));
                 if (ServiceUtil.isError(setInvoiceStatusResult)) {
                     return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingInvoiceCommissionError",locale), null, null, setInvoiceStatusResult);
                 }
@@ -1081,27 +1050,27 @@
         return ServiceUtil.returnSuccess();
     }
 
-    public static Map createInvoicesFromShipment(DispatchContext dctx, Map context) {
+    public static Map<String, Object> createInvoicesFromShipment(DispatchContext dctx, Map<String, Object> context) {
         //GenericDelegator delegator = dctx.getDelegator();
         LocalDispatcher dispatcher = dctx.getDispatcher();
         String shipmentId = (String) context.get("shipmentId");
         Locale locale = (Locale) context.get("locale");
-        List invoicesCreated = new ArrayList();
+        List<String> invoicesCreated = FastList.newInstance();
 
-        Map serviceContext = UtilMisc.toMap("shipmentIds", UtilMisc.toList(shipmentId), "eventDate", context.get("eventDate"), "userLogin", context.get("userLogin"));
+        Map<String, Object> serviceContext = UtilMisc.toMap("shipmentIds", UtilMisc.toList(shipmentId), "eventDate", context.get("eventDate"), "userLogin", context.get("userLogin"));
         try {
-            Map result = dispatcher.runSync("createInvoicesFromShipments", serviceContext);
-            invoicesCreated = (List) result.get("invoicesCreated");
+            Map<String, Object> result = dispatcher.runSync("createInvoicesFromShipments", serviceContext);
+            invoicesCreated = UtilGenerics.checkList(result.get("invoicesCreated"));
         } catch (GenericServiceException e) {
             Debug.logError(e, "Trouble calling createInvoicesFromShipment service; invoice not created for shipment [" + shipmentId + "]", module);
             return ServiceUtil.returnError(UtilProperties.getMessage(resource,"AccountingTroubleCallingCreateInvoicesFromShipmentService",UtilMisc.toMap("shipmentId",shipmentId),locale));
         }
-        Map response = ServiceUtil.returnSuccess();
+        Map<String, Object> response = ServiceUtil.returnSuccess();
         response.put("invoicesCreated", invoicesCreated);
         return response;
     }
 
-    public static Map setInvoicesToReadyFromShipment(DispatchContext dctx, Map context) {
+    public static Map<String, Object> setInvoicesToReadyFromShipment(DispatchContext dctx, Map<String, Object> context) {
         GenericDelegator delegator = dctx.getDelegator();
         LocalDispatcher dispatcher = dctx.getDispatcher();
         String shipmentId = (String) context.get("shipmentId");
@@ -1139,14 +1108,14 @@
         // The orders can now be placed in separate groups, each for
         // 1. The group of orders for which payment is already captured. No grouping and action required.
         // 2. The group of orders for which invoice is IN-Process status.
-        Map ordersWithInProcessInvoice = FastMap.newInstance();
+        Map<String, Object> ordersWithInProcessInvoice = FastMap.newInstance();
 
         for (GenericValue itemIssuance : itemIssuances) {
             String orderId = itemIssuance.getString("orderId");
-            Map billFields = FastMap.newInstance();
+            Map<String, Object> billFields = FastMap.newInstance();
             billFields.put("orderId", orderId);
 
-            List orderItemBillings = FastList.newInstance();
+            List<GenericValue> orderItemBillings = FastList.newInstance();
             try {
                 orderItemBillings = delegator.findByAnd("OrderItemBilling", billFields);
             } catch (GenericEntityException e) {
@@ -1174,13 +1143,11 @@
         }
 
      // For In-Process invoice, move the status to ready and capture the payment
-        Set invoicesInProcess = ordersWithInProcessInvoice.keySet();
-        Iterator iter = invoicesInProcess.iterator();
-        while (iter.hasNext()) {
-            String orderId = (String) iter.next();
+        Set<String> invoicesInProcess = ordersWithInProcessInvoice.keySet();
+        for (String orderId : invoicesInProcess) {
             GenericValue invoice = (GenericValue) ordersWithInProcessInvoice.get(orderId);
             String invoiceId = invoice.getString("invoiceId");
-            Map setInvoiceStatusResult = FastMap.newInstance();
+            Map<String, Object> setInvoiceStatusResult = FastMap.newInstance();
             try {
                 setInvoiceStatusResult = dispatcher.runSync("setInvoiceStatus", UtilMisc.<String, Object>toMap("invoiceId", invoiceId, "statusId", "INVOICE_READY", "userLogin", userLogin));
             } catch (GenericServiceException e) {
@@ -1194,14 +1161,14 @@
         return ServiceUtil.returnSuccess();
     }
 
-    public static Map createSalesInvoicesFromDropShipment(DispatchContext dctx, Map context) {
+    public static Map<String, Object> createSalesInvoicesFromDropShipment(DispatchContext dctx, Map<String, Object> context) {
         LocalDispatcher dispatcher = dctx.getDispatcher();
         String shipmentId = (String) context.get("shipmentId");
         Locale locale = (Locale) context.get("locale");
 
-        Map serviceContext = UtilMisc.toMap("shipmentIds", UtilMisc.toList(shipmentId), "createSalesInvoicesForDropShipments", Boolean.TRUE, "userLogin", context.get("userLogin"));
+        Map<String, Object> serviceContext = UtilMisc.toMap("shipmentIds", UtilMisc.toList(shipmentId), "createSalesInvoicesForDropShipments", Boolean.TRUE, "userLogin", context.get("userLogin"));
 
-        Map serviceResult;
+        Map<String, Object> serviceResult;
         try {
             serviceResult = dispatcher.runSync("createInvoicesFromShipments", serviceContext);
         } catch (GenericServiceException e) {
@@ -1213,10 +1180,10 @@
         return serviceResult;
     }
 
-    public static Map createInvoicesFromShipments(DispatchContext dctx, Map context) {
+    public static Map<String, Object> createInvoicesFromShipments(DispatchContext dctx, Map context) {
         GenericDelegator delegator = dctx.getDelegator();
         LocalDispatcher dispatcher = dctx.getDispatcher();
-        List shipmentIds = (List) context.get("shipmentIds");
+        List<String> shipmentIds = UtilGenerics.checkList(context.get("shipmentIds"));
         Locale locale = (Locale) context.get("locale");
         Boolean createSalesInvoicesForDropShipments = (Boolean) context.get("createSalesInvoicesForDropShipments");
         if (UtilValidate.isEmpty(createSalesInvoicesForDropShipments)) createSalesInvoicesForDropShipments = Boolean.FALSE;
@@ -1225,11 +1192,10 @@
         boolean purchaseShipmentFound = false;
         boolean dropShipmentFound = false;
 
-        List invoicesCreated = new ArrayList();
+        List<String> invoicesCreated = FastList.newInstance();
 
         //DEJ20060520: not used? planned to be used? List shipmentIdList = new LinkedList();
-        for (int i = 0; i < shipmentIds.size(); i++) {
-            String tmpShipmentId = (String)shipmentIds.get(i);
+        for (String tmpShipmentId : shipmentIds) {
             try {
                 GenericValue shipment = delegator.findByPrimaryKey("Shipment", UtilMisc.toMap("shipmentId", tmpShipmentId));
                 if ((shipment.getString("shipmentTypeId") != null) && (shipment.getString("shipmentTypeId").equals("PURCHASE_SHIPMENT"))) {
@@ -1253,13 +1219,13 @@
 
         // get the items of the shipment.  They can come from ItemIssuance if the shipment were from a sales order, ShipmentReceipt
         // if it were a purchase order or from the order items of the (possibly linked) orders if the shipment is a drop shipment
-        List items = null;
-        List orderItemAssocs = null;
+        List<GenericValue> items = null;
+        List<GenericValue> orderItemAssocs = null;
         try {
             if (purchaseShipmentFound) {
                 items = delegator.findList("ShipmentReceipt", shipmentIdsCond, null, UtilMisc.toList("shipmentId"), null, false);
                 // filter out items which have been received but are not actually owned by an internal organization, so they should not be on a purchase invoice
-                Iterator itemsIter = items.iterator();
+                Iterator<GenericValue> itemsIter = items.iterator();
                 while (itemsIter.hasNext()) {
                     GenericValue item = (GenericValue) itemsIter.next();
                     GenericValue inventoryItem = item.getRelatedOne("InventoryItem");
@@ -1270,10 +1236,10 @@
                 }
             } else if (dropShipmentFound) {
 
-                List shipments = delegator.findList("Shipment", shipmentIdsCond, null, null, null, false);
+                List<GenericValue> shipments = delegator.findList("Shipment", shipmentIdsCond, null, null, null, false);
 
                 // Get the list of purchase order IDs related to the shipments
-                List purchaseOrderIds = EntityUtil.getFieldListFromEntityList(shipments, "primaryOrderId", true);

[... 1078 lines stripped ...]