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 ...] |
Free forum by Nabble | Edit this page |