📄 zipsalesservices.java
字号:
if (orderShippingAmount.doubleValue() > 0) { List taxList = getItemTaxList(delegator, null, postalCode, city, 0.00, orderShippingAmount.doubleValue(), false); orderAdjustments.addAll(taxList); } } catch (GeneralException e) { return ServiceUtil.returnError(e.getMessage()); } Map result = ServiceUtil.returnSuccess(); result.put("orderAdjustments", orderAdjustments); result.put("itemAdjustments", itemAdjustments); return result; } private static List getItemTaxList(GenericDelegator delegator, GenericValue item, String zipCode, String city, double itemAmount, double shippingAmount, boolean isUseTax) throws GeneralException { List adjustments = new ArrayList(); // check the item for tax status if (item != null && item.get("taxable") != null && "N".equals(item.getString("taxable"))) { // item not taxable return adjustments; } // lookup the records List zipLookup = delegator.findByAnd("ZipSalesTaxLookup", UtilMisc.toMap("zipCode", zipCode), UtilMisc.toList("-fromDate")); if (zipLookup == null || zipLookup.size() == 0) { throw new GeneralException("The zip code entered is not valid."); } // the filtered list List taxLookup = null; // only do filtering if there are more then one zip code found if (zipLookup != null && zipLookup.size() > 1) { // first filter by city List cityLookup = EntityUtil.filterByAnd(zipLookup, UtilMisc.toMap("city", city.toUpperCase())); if (cityLookup != null && cityLookup.size() > 0) { if (cityLookup.size() > 1) { // filter by county List countyLookup = EntityUtil.filterByAnd(taxLookup, UtilMisc.toMap("countyDefault", "Y")); if (countyLookup != null && countyLookup.size() > 0) { // use the county default taxLookup = countyLookup; } else { // no county default; just use the first city taxLookup = cityLookup; } } else { // just one city found; use that one taxLookup = cityLookup; } } else { // no city found; lookup default city List defaultLookup = EntityUtil.filterByAnd(zipLookup, UtilMisc.toMap("generalDefault", "Y")); if (defaultLookup != null && defaultLookup.size() > 0) { // use the default city lookup taxLookup = defaultLookup; } else { // no default found; just use the first from the zip lookup taxLookup = zipLookup; } } } else { // zero or 1 zip code found; use it taxLookup = zipLookup; } // get the first one GenericValue taxEntry = null; if (taxLookup != null && taxLookup.size() > 0) { taxEntry = (GenericValue) taxLookup.iterator().next(); } if (taxEntry == null) { Debug.logWarning("No tax entry found for : " + zipCode + " / " + city + " - " + itemAmount, module); return adjustments; } String fieldName = "comboSalesTax"; if (isUseTax) { fieldName = "comboUseTax"; } Double comboTaxRate = taxEntry.getDouble(fieldName); if (comboTaxRate == null) { Debug.logWarning("No Combo Tax Rate In Field " + fieldName + " @ " + zipCode + " / " + city + " - " + itemAmount, module); return adjustments; } // get state code String stateCode = taxEntry.getString("stateCode"); // check if shipping is exempt boolean taxShipping = true; // look up the rules List ruleLookup = null; try { ruleLookup = delegator.findByAnd("ZipSalesRuleLookup", UtilMisc.toMap("stateCode", stateCode), UtilMisc.toList("-fromDate")); } catch (GenericEntityException e) { Debug.logError(e, module); } // filter out city if (ruleLookup != null && ruleLookup.size() > 1) { ruleLookup = EntityUtil.filterByAnd(ruleLookup, UtilMisc.toMap("city", city.toUpperCase())); } // no county captured; so filter by date if (ruleLookup != null && ruleLookup.size() > 1) { ruleLookup = EntityUtil.filterByDate(ruleLookup); } if (ruleLookup != null) { Iterator ruleIterator = ruleLookup.iterator(); while (ruleIterator.hasNext()) { if (!taxShipping) { // if we found an rule which passes no need to contine (all rules are ||) break; } GenericValue rule = (GenericValue) ruleIterator.next(); String idCode = rule.getString("idCode"); String taxable = rule.getString("taxable"); String condition = rule.getString("shipCond"); if ("T".equals(taxable)) { // this record is taxable continue; } else { // except if conditions are met boolean qualify = false; if (condition != null && condition.length() > 0) { char[] conditions = condition.toCharArray(); for (int i = 0; i < conditions.length; i++) { switch (conditions[i]) { case 'A' : // SHIPPING CHARGE SEPARATELY STATED ON INVOICE qualify = true; // OFBiz does this by default break; case 'B' : // SHIPPING CHARGE SEPARATED ON INVOICE FROM HANDLING OR SIMILAR CHARGES qualify = false; // we do not support this currently break; case 'C' : // ITEM NOT SOLD FOR GUARANTEED SHIPPED PRICE qualify = false; // we don't support this currently break; case 'D' : // SHIPPING CHARGE IS COST ONLY qualify = false; // we assume a handling charge is included break; case 'E' : // SHIPPED DIRECTLY TO PURCHASER qualify = true; // this is true, unless gifts do not count? break; case 'F' : // SHIPPED VIA COMMON CARRIER qualify = true; // best guess default break; case 'G' : // SHIPPED VIA CONTRACT CARRIER qualify = false; // best guess default break; case 'H' : // SHIPPED VIA VENDOR EQUIPMENT qualify = false; // best guess default break; case 'I' : // SHIPPED F.O.B. ORIGIN qualify = false; // no clue break; case 'J' : // SHIPPED F.O.B. DESTINATION qualify = false; // no clue break; case 'K' : // F.O.B. IS PURCHASERS OPTION qualify = false; // no clue break; case 'L' : // SHIPPING ORIGINATES OR TERMINATES IN DIFFERENT STATES qualify = true; // not determined at order time, no way to know break; case 'M' : // PROOF OF VENDOR ACTING AS SHIPPING AGENT FOR PURCHASER qualify = false; // no clue break; case 'N' : // SHIPPED FROM VENDOR LOCATION qualify = true; // sure why not break; case 'O' : // SHIPPING IS BY PURCHASER OPTION qualify = false; // most online stores require shipping break; case 'P' : // CREDIT ALLOWED FOR SHIPPING CHARGE PAID BY PURCHASER TO CARRIER qualify = false; // best guess default break; default: break; } } } if (qualify) { if (isUseTax) { if (idCode.indexOf('U') > 0) { taxShipping = false; } } else { if (idCode.indexOf('S') > 0) { taxShipping = false; } } } } } } double taxableAmount = itemAmount; if (taxShipping) { //Debug.log("Taxing shipping", module); taxableAmount += shippingAmount; } else { Debug.log("Shipping is not taxable", module); } // calc tax amount double taxRate = comboTaxRate.doubleValue(); double taxCalc = taxableAmount * taxRate; // format the number Double taxAmount = new Double(formatCurrency(taxCalc)); adjustments.add(delegator.makeValue("OrderAdjustment", UtilMisc.toMap("amount", taxAmount, "orderAdjustmentTypeId", "SALES_TAX", "comments", new Double(taxRate).toString(), "description", "Sales Tax (" + stateCode + ")"))); return adjustments; } // formatting methods private static Timestamp parseDate(String dateString, Timestamp useWhenNull) { Timestamp ts = null; if (dateString != null) { try { ts = new Timestamp(dateFormat.parse(dateString).getTime()); } catch (ParseException e) { Debug.logError(e, module); } } if (ts != null) { return ts; } else { return useWhenNull; } } private static String formatCurrency(double currency) { return curFormat.format(currency); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -