📄 zipsalesservices.java
字号:
} 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 + -