Author: ashish
Date: Fri May 29 09:43:39 2009 New Revision: 779907 URL: http://svn.apache.org/viewvc?rev=779907&view=rev Log: Here comes the first pass to create order in OFBiz from the notification message coming from the google checkout server. For more details please have a look on the jira issue: OFBIZ-2545 (Create Order and Party information using google notification) This is collaborative effort from Andrew Zeneski, Vivek Mishra, Arun Patidar, Anurag Singh Sengar & Me. Thanks guys for giving a good head start to this feature. More exciting features are coming soon in this area, so please stay tuned. Thanks ! Added: ofbiz/trunk/specialpurpose/googlecheckout/servicedef/secas.xml (with props) ofbiz/trunk/specialpurpose/googlecheckout/servicedef/services_request.xml (with props) ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleCheckoutHelper.java (with props) ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleRequestServices.java (with props) Modified: ofbiz/trunk/specialpurpose/googlecheckout/build.xml ofbiz/trunk/specialpurpose/googlecheckout/ofbiz-component.xml ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleCheckoutResponseEvents.java Modified: ofbiz/trunk/specialpurpose/googlecheckout/build.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/googlecheckout/build.xml?rev=779907&r1=779906&r2=779907&view=diff ============================================================================== --- ofbiz/trunk/specialpurpose/googlecheckout/build.xml (original) +++ ofbiz/trunk/specialpurpose/googlecheckout/build.xml Fri May 29 09:43:39 2009 @@ -29,7 +29,7 @@ <property name="name" value="ofbiz-googlecheckout"/> <path id="local.class.path"> - <!--<fileset dir="${lib.dir}" includes="*.jar"/>--> + <fileset dir="${lib.dir}" includes="*.jar"/> <fileset dir="../../framework/base/lib" includes="*.jar"/> <fileset dir="../../framework/base/lib/commons" includes="*.jar"/> <fileset dir="../../framework/base/lib/j2eespecs" includes="*.jar"/> @@ -45,6 +45,9 @@ <fileset dir="../../framework/webapp/build/lib" includes="*.jar"/> <fileset dir="../../framework/common/build/lib" includes="*.jar"/> <fileset dir="../../applications/product/build/lib" includes="*.jar"/> + <fileset dir="../../applications/party/build/lib" includes="*.jar"/> + <fileset dir="../../applications/order/build/lib" includes="*.jar"/> + </path> <!-- ================================================================== --> Modified: ofbiz/trunk/specialpurpose/googlecheckout/ofbiz-component.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/googlecheckout/ofbiz-component.xml?rev=779907&r1=779906&r2=779907&view=diff ============================================================================== --- ofbiz/trunk/specialpurpose/googlecheckout/ofbiz-component.xml (original) +++ ofbiz/trunk/specialpurpose/googlecheckout/ofbiz-component.xml Fri May 29 09:43:39 2009 @@ -23,6 +23,7 @@ xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/ofbiz-component.xsd"> <resource-loader name="main" type="component"/> <classpath type="dir" location="config"/> + <classpath type="jar" location="lib/*"/> <classpath type="jar" location="build/lib/*"/> <entity-resource type="data" reader-name="seed" loader="main" location="data/GoogleCheckoutTypeData.xml"/> Added: ofbiz/trunk/specialpurpose/googlecheckout/servicedef/secas.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/googlecheckout/servicedef/secas.xml?rev=779907&view=auto ============================================================================== --- ofbiz/trunk/specialpurpose/googlecheckout/servicedef/secas.xml (added) +++ ofbiz/trunk/specialpurpose/googlecheckout/servicedef/secas.xml Fri May 29 09:43:39 2009 @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<service-eca xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/service-eca.xsd"> + + <!-- payment related services --> + <eca service="authOrderPayments" event="commit" run-on-failure="false" run-on-error="false"> + <action service="sendGoogleAuthorizeRequest" mode="sync"/> + </eca> + <eca service="captureOrderPayments" event="commit" run-on-failure="false" run-on-error="false"> + <action service="sendGoogleChargeRequest" mode="sync"/> + </eca> + + <!-- order related services --> + <eca service="changeOrderStatus" event="commit" run-on-error="false"> + <condition field-name="statusId" operator="equals" value="ORDER_CANCELLED"/> + <action service="sendGoogleOrderCancelRequest" mode="sync"/> + </eca> + <eca service="changeOrderItemStatus" event="commit" run-on-failure="false" run-on-error="false"> + <condition field-name="statusId" operator="equals" value="ITEM_CANCELLED"/> + <action service="sendGoogleOrderItemCancelRequest" mode="sync" result-to-context="true" ignore-failure="false"/> + </eca> + + <!-- return related services --> + <eca service="updateReturnHeader" event="in-validate" run-on-failure="false" run-on-error="false"> + <condition field-name="statusId" operator="equals" value="RETURN_COMPLETED"/> + <condition field-name="currentStatusId" operator="not-equals" value="RETURN_COMPLETED"/> + <action service="sendGoogleReturnRequest" mode="sync"/> + </eca> + + <!-- shipment related services --> + <eca service="updateShipment" event="commit" run-on-failure="false" run-on-error="false"> + <condition-field field-name="statusId" operator="not-equals" to-field-name="oldStatusId"/> + <condition field-name="statusId" operator="equals" value="SHIPMENT_SHIPPED"/> + <action service="sendGoogleShipRequest" mode="sync"/> + </eca> + </service-eca> \ No newline at end of file Propchange: ofbiz/trunk/specialpurpose/googlecheckout/servicedef/secas.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/specialpurpose/googlecheckout/servicedef/secas.xml ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/trunk/specialpurpose/googlecheckout/servicedef/secas.xml ------------------------------------------------------------------------------ svn:mime-type = text/xml Added: ofbiz/trunk/specialpurpose/googlecheckout/servicedef/services_request.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/googlecheckout/servicedef/services_request.xml?rev=779907&view=auto ============================================================================== --- ofbiz/trunk/specialpurpose/googlecheckout/servicedef/services_request.xml (added) +++ ofbiz/trunk/specialpurpose/googlecheckout/servicedef/services_request.xml Fri May 29 09:43:39 2009 @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<services xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/services.xsd"> + + <!-- create order request notification --> + <service name="sendGoogleOrderNumberRequest" engine="java" invoke="sendOrderNumberRequest" + location="org.ofbiz.googlecheckout.GoogleRequestServices"> + <attribute name="orderId" type="String" mode="IN" optional="false"/> + </service> + + <!-- payment notifications --> + <service name="sendGoogleAuthorizeRequest" engine="java" invoke="sendAuthorizeRequest" + location="org.ofbiz.googlecheckout.GoogleRequestServices"> + <attribute name="orderId" type="String" mode="IN" optional="false"/> + </service> + <service name="sendGoogleChargeRequest" engine="java" invoke="sendChargeRequest" + location="org.ofbiz.googlecheckout.GoogleRequestServices"> + <attribute name="orderId" type="String" mode="IN" optional="false"/> + </service> + + <!-- returns --> + <service name="sendGoogleReturnRequest" engine="java" invoke="sendReturnRequest" + location="org.ofbiz.googlecheckout.GoogleRequestServices"> + <attribute name="returnId" type="String" mode="IN" optional="false"/> + </service> + + <!-- cancel notification --> + <service name="sendGoogleOrderCancelRequest" engine="java" invoke="sendOrderCancelRequest" + location="org.ofbiz.googlecheckout.GoogleRequestServices"> + <attribute name="orderId" type="String" mode="IN" optional="false"/> + </service> + <service name="sendGoogleOrderItemCancelRequest" engine="java" invoke="sendOrderItemCancelRequest" + location="org.ofbiz.googlecheckout.GoogleRequestServices"> + <attribute name="orderId" type="String" mode="IN" optional="false"/> + <attribute name="orderItemSeqId" type="String" mode="IN" optional="false"/> + </service> + + <!-- shipment notification --> + <service name="sendGoogleShipRequest" engine="java" invoke="sendShipRequest" + location="org.ofbiz.googlecheckout.GoogleRequestServices"> + <attribute name="shipmentId" type="String" mode="IN" optional="false"/> + </service> + + <!-- archive order requests --> + <service name="sendGoogleArchiveOrderRequest" engine="java" invoke="sendArchiveOrderRequest" + location="org.ofbiz.googlecheckout.GoogleRequestServices"> + <attribute name="orderId" type="String" mode="IN" optional="false"/> + </service> + <service name="sendGoogleUnarchiveOrderRequest" engine="java" invoke="sendUnarchiveOrderRequest" + location="org.ofbiz.googlecheckout.GoogleRequestServices"> + <attribute name="orderId" type="String" mode="IN" optional="false"/> + </service> + + </services> \ No newline at end of file Propchange: ofbiz/trunk/specialpurpose/googlecheckout/servicedef/services_request.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/specialpurpose/googlecheckout/servicedef/services_request.xml ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/trunk/specialpurpose/googlecheckout/servicedef/services_request.xml ------------------------------------------------------------------------------ svn:mime-type = text/xml Added: ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleCheckoutHelper.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleCheckoutHelper.java?rev=779907&view=auto ============================================================================== --- ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleCheckoutHelper.java (added) +++ ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleCheckoutHelper.java Fri May 29 09:43:39 2009 @@ -0,0 +1,489 @@ +/** +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +**/ + +package org.ofbiz.googlecheckout; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import javolution.util.FastMap; + +import org.ofbiz.base.util.Debug; +import org.ofbiz.base.util.GeneralException; +import org.ofbiz.base.util.UtilMisc; +import org.ofbiz.base.util.UtilValidate; +import org.ofbiz.entity.GenericDelegator; +import org.ofbiz.entity.GenericEntityException; +import org.ofbiz.entity.GenericValue; +import org.ofbiz.entity.util.EntityUtil; +import org.ofbiz.order.order.OrderChangeHelper; +import org.ofbiz.order.shoppingcart.CheckOutHelper; +import org.ofbiz.order.shoppingcart.ItemNotFoundException; +import org.ofbiz.order.shoppingcart.ShoppingCart; +import org.ofbiz.order.shoppingcart.ShoppingCartItem; +import org.ofbiz.party.party.PartyWorker; +import org.ofbiz.service.LocalDispatcher; +import org.ofbiz.service.ServiceUtil; + +import com.google.checkout.CheckoutException; +import com.google.checkout.checkout.Item; +import com.google.checkout.notification.Address; +import com.google.checkout.notification.MerchantCodes; +import com.google.checkout.notification.NewOrderNotification; +import com.google.checkout.notification.OrderAdjustment; +import com.google.checkout.notification.Shipping; +import com.google.checkout.notification.StructuredName; +import com.google.checkout.orderprocessing.AddMerchantOrderNumberRequest; + +public class GoogleCheckoutHelper { + + private static final String module = GoogleCheckoutHelper.class.getName(); + + public static final String SALES_CHANNEL = "GC_SALES_CHANNEL"; + public static final String ORDER_TYPE = "SALES_ORDER"; + public static final String PAYMENT_METHOD = "EXT_GOOGLE_CHECKOUT"; + + public static final int SHIPPING_ADDRESS = 10; + public static final int BILLING_ADDRESS = 50; + + protected LocalDispatcher dispatcher; + protected GenericDelegator delegator; + protected GenericValue system; + + public GoogleCheckoutHelper(LocalDispatcher dispatcher, GenericDelegator delegator) { + this.dispatcher = dispatcher; + this.delegator = delegator; + + try { + system = delegator.findOne("UserLogin", true, "userLoginId", "system"); + } catch (GenericEntityException e) { + Debug.logError(e, module); + system = delegator.makeValue("UserLogin"); + system.set("userLoginId", "system"); + system.set("partyId", "admin"); + system.set("isSystem", "Y"); + } + } + + @SuppressWarnings("unchecked") + public void createOrder(NewOrderNotification info, String productStoreId, String websiteId, String currencyUom, Locale locale) throws GeneralException { + // get the google order number + String externalId = info.getGoogleOrderNumber(); + + // check and make sure this order doesn't already exist + List<GenericValue> existingOrder = delegator.findByAnd("OrderHeader", UtilMisc.toMap("externalId", externalId)); + if (existingOrder != null && existingOrder.size() > 0) { + throw new GeneralException("Google order #" + externalId + " already exists."); + } + + // Initialize the shopping cart + ShoppingCart cart = new ShoppingCart(delegator, productStoreId, websiteId, locale, currencyUom); + cart.setUserLogin(system, dispatcher); + cart.setOrderType(ORDER_TYPE); + cart.setChannelType(SALES_CHANNEL); + //cart.setOrderDate(UtilDateTime.toTimestamp(info.getTimestamp().())); + cart.setExternalId(externalId); + + Debug.logInfo("Created shopping cart for Google order: ", module); + Debug.logInfo("-- WebSite : " + websiteId, module); + Debug.logInfo("-- Product Store : " + productStoreId, module); + Debug.logInfo("-- Locale : " + locale.toString(), module); + Debug.logInfo("-- Google Order # : " + externalId, module); + + // set the customer information + Address shippingAddress = info.getBuyerShippingAddress(); + Address billingAddress = info.getBuyerBillingAddress(); + String[] partyInfo = getPartyInfo(shippingAddress, billingAddress); + if (partyInfo == null || partyInfo.length != 3) { + throw new GeneralException("Unable to parse/create party information, invalid number of parameters returned"); + } + + cart.setOrderPartyId(partyInfo[0]); + cart.setPlacingCustomerPartyId(partyInfo[0]); + cart.setShippingContactMechId(partyInfo[1]); + + // contact info + String shippingEmail = shippingAddress.getEmail(); + if (UtilValidate.isNotEmpty(shippingEmail)) { + setContactInfo(cart, "PRIMARY_EMAIL", shippingEmail); + } + String billingEmail = billingAddress.getEmail(); + if (UtilValidate.isNotEmpty(billingEmail)) { + setContactInfo(cart, "BILLING_EMAIL", billingEmail); + } + String shippingPhone = shippingAddress.getPhone(); + if (UtilValidate.isNotEmpty(shippingPhone)) { + setContactInfo(cart, "PHONE_SHIPPING", shippingPhone); + } + String billingPhone = billingAddress.getPhone(); + if (UtilValidate.isNotEmpty(billingPhone)) { + setContactInfo(cart, "PHONE_BILLING", billingPhone); + } + + // set the order items + Collection<Item> items = info.getShoppingCart().getItems(); + for (Item item : items) { + try { + addItem(cart, item, null, 0); + } catch (ItemNotFoundException e) { + // TODO: handle items not found + Debug.logWarning(e, "Item was not found : " + item.getMerchantItemId(), module); + } + } + + // handle the adjustments + OrderAdjustment adjustment = info.getOrderAdjustment(); + addAdjustments(cart, adjustment); + + // ship group info + Shipping shipping = info.getOrderAdjustment().getShipping(); + addShipInfo(cart, shipping); + + // set the cart payment method + cart.addPayment(PAYMENT_METHOD); + + // validate the payment methods + CheckOutHelper coh = new CheckOutHelper(dispatcher, delegator, cart); + Map validateResp = coh.validatePaymentMethods(); + if (ServiceUtil.isError(validateResp)) { + throw new GeneralException(ServiceUtil.getErrorMessage(validateResp)); + } + + // create the order & process payments + Map createResp = coh.createOrder(system); + String orderId = cart.getOrderId(); + if (ServiceUtil.isError(createResp)) { + throw new GeneralException(ServiceUtil.getErrorMessage(createResp)); + } + + // approve the order + OrderChangeHelper.approveOrder(dispatcher, system, orderId, cart.getHoldOrder()); + + // notify google of our order number + // TODO: enable this + /* + try { + dispatcher.runAsync("sendGoogleOrderNumberRequest", true, UtilMisc.toMap("orderId", orderId)); + } catch (GeneralException e) { + Debug.logError(e, module); + } + */ + } + + protected void addItem(ShoppingCart cart, Item item, String productCatalogId, int groupIdx) throws GeneralException { + String productId = item.getMerchantItemId(); + BigDecimal qty = new BigDecimal(item.getQuantity()); + BigDecimal price = new BigDecimal(item.getUnitPriceAmount()); + price = price.setScale(ShoppingCart.scale, ShoppingCart.rounding); + + HashMap<Object, Object> attrs = new HashMap<Object, Object>(); + attrs.put("shipGroup", groupIdx); + + int idx = cart.addItemToEnd(productId, null, qty, null, null, attrs, productCatalogId, null, dispatcher, Boolean.FALSE, Boolean.TRUE, Boolean.TRUE, Boolean.TRUE); + ShoppingCartItem cartItem = cart.findCartItem(idx); + cartItem.setQuantity(qty, dispatcher, cart, true, false); + + // locate the price verify it matches the expected price + BigDecimal cartPrice = cartItem.getBasePrice(); + cartPrice = cartPrice.setScale(ShoppingCart.scale, ShoppingCart.rounding); + + if (price.doubleValue() != cartPrice.doubleValue()) { + // does not match; honor the price but hold the order for manual review + cartItem.setIsModifiedPrice(true); + cartItem.setBasePrice(price); + cart.setHoldOrder(true); + cart.addInternalOrderNote("Price received [" + price + "] (for item # " + productId + ") from Google Checkout does not match the price in the database [" + cartPrice + "]. Order is held for manual review."); + } + + // assign the item to its ship group + cart.setItemShipGroupQty(cartItem, qty, groupIdx); + } + + @SuppressWarnings("unchecked") + protected void addAdjustments(ShoppingCart cart, OrderAdjustment adjustment) { + // handle shipping + Shipping shipping = adjustment.getShipping(); + BigDecimal shipAmount = new BigDecimal(shipping.getShippingCost()); + GenericValue shipAdj = delegator.makeValue("OrderAdjustment", FastMap.newInstance()); + shipAdj.set("orderAdjustmentTypeId", "SHIPPING_CHARGES"); + shipAdj.set("amount", shipAmount); + cart.addAdjustment(shipAdj); + + // handle tax + BigDecimal taxAmount = new BigDecimal(adjustment.getTotalTax()); + GenericValue taxAdj = delegator.makeValue("OrderAdjustment", FastMap.newInstance()); + taxAdj.set("orderAdjustmentTypeId", "SALES_TAX"); + taxAdj.set("amount", taxAmount); + cart.addAdjustment(taxAdj); + + // handle promotions + Collection<MerchantCodes> merchantCodes = adjustment.getMerchantCodes(); + for (MerchantCodes codes : merchantCodes) { + GenericValue promoAdj = delegator.makeValue("OrderAdjustment", FastMap.newInstance()); + promoAdj.set("orderAdjustmentTypeId", "PROMOTION_ADJUSTMENT"); + promoAdj.set("description", "Promotion Code: " + codes.getCode()); + promoAdj.set("comments", "Google Promotion: " + codes.getMessage()); + promoAdj.set("amount", new BigDecimal(-1 * (codes.getAppliedAmount()))); // multiply by -1 + cart.addAdjustment(promoAdj); + } + } + + protected void addShipInfo(ShoppingCart cart, Shipping shipping) { + String shippingName = shipping.getShippingName(); + + // TODO parse the shipping method and get a valid OFBiz shipping method + // FOR NOW - Just use some dummy info + String shipmentMethodTypeId = shippingName; + String carrierPartyId = "_NA_"; + Boolean maySplit = Boolean.FALSE; + + if (shipmentMethodTypeId != null) { + cart.setShipmentMethodTypeId(shipmentMethodTypeId); + cart.setCarrierPartyId(carrierPartyId); + cart.setMaySplit(maySplit); + } else { + Debug.logWarning("No valid fulfillment method found! No shipping info set!", module); + } + } + + protected String[] getPartyInfo(Address shipAddr, Address billAddr) throws GeneralException { + String shipCmId = null; + String billCmId = null; + String partyId = null; + + // look for an existing shipping address + List<GenericValue> shipInfo = PartyWorker.findMatchingPartyAndPostalAddress(delegator, shipAddr.getAddress1(), + (UtilValidate.isEmpty(shipAddr.getAddress2()) ? null : shipAddr.getAddress2()), shipAddr.getCity(), shipAddr.getRegion(), + shipAddr.getPostalCode(), null, shipAddr.getCountryCode(), shipAddr.getStructuredName().getFirstName(), + null, shipAddr.getStructuredName().getLastName()); + if (shipInfo != null && shipInfo.size() > 0) { + GenericValue first = EntityUtil.getFirst(shipInfo); + shipCmId = first.getString("contactMechId"); + partyId = first.getString("partyId"); + Debug.logInfo("Existing shipping address found : " + shipCmId + " (party: " + partyId + ")", module); + } + + // look for an existing billing address + List<GenericValue> billInfo = PartyWorker.findMatchingPartyAndPostalAddress(delegator, billAddr.getAddress1(), + (UtilValidate.isEmpty(billAddr.getAddress2()) ? null : billAddr.getAddress2()), billAddr.getCity(), billAddr.getRegion(), + billAddr.getPostalCode(), null, billAddr.getCountryCode(), billAddr.getStructuredName().getFirstName(), + null, billAddr.getStructuredName().getLastName()); + if (billInfo != null && billInfo.size() > 0) { + GenericValue first = EntityUtil.getFirst(billInfo); + billCmId = first.getString("contactMechId"); + if (partyId == null) { + partyId = first.getString("partyId"); + } else { + String billPartyId = first.getString("partyId"); + if (!billPartyId.equals(partyId)) { + // address found for a different partyID -- probably a duplicate + Debug.logWarning("Duplicate partyId found : " + billPartyId + " -> " + partyId, module); + } + } + Debug.logInfo("Existing billing address found : " + billCmId + " (party: " + partyId + ")", module); + } + + // create the party if necessary + if (partyId == null) { + partyId = createPerson(shipAddr.getStructuredName()); + } + + // create the shipping address if necessary + if (shipCmId == null) { + shipCmId = createPartyAddress(partyId, shipAddr); + addPurposeToAddress(partyId, shipCmId, SHIPPING_ADDRESS); + } + + // create the billing address if necessary + if (billCmId == null) { + // check the billing address again (in case it was just created) + billInfo = PartyWorker.findMatchingPartyAndPostalAddress(delegator, billAddr.getAddress1(), + billAddr.getAddress2(), billAddr.getCity(), billAddr.getRegion(), + billAddr.getPostalCode(), null, billAddr.getCountryCode(), billAddr.getStructuredName().getFirstName(), + null, billAddr.getStructuredName().getLastName()); + if (billInfo != null && billInfo.size() > 0) { + GenericValue first = EntityUtil.getFirst(billInfo); + billCmId = first.getString("contactMechId"); + } else { + billCmId = createPartyAddress(partyId, shipAddr); + addPurposeToAddress(partyId, billCmId, BILLING_ADDRESS); + } + } + + return new String[] { partyId, shipCmId, billCmId }; + } + + protected String createPerson(StructuredName name) throws GeneralException { + Map<String, Object> personMap = FastMap.newInstance(); + personMap.put("firstName", name.getFirstName()); + personMap.put("lastName", name.getLastName()); + personMap.put("userLogin", system); + + Map<String, Object> personResp = dispatcher.runSync("createPerson", personMap); + if (ServiceUtil.isError(personResp)) { + throw new GeneralException("Unable to create new customer account: " + ServiceUtil.getErrorMessage(personResp)); + } + String partyId = (String) personResp.get("partyId"); + + Debug.logInfo("New party created : " + partyId, module); + return partyId; + } + + protected String createPartyAddress(String partyId, Address addr) throws GeneralException { + // check for zip+4 + String postalCode = addr.getPostalCode(); + String postalCodeExt = null; + if (postalCode.length() == 10 && postalCode.indexOf("-") != -1) { + String[] strSplit = postalCode.split("-", 2); + postalCode = strSplit[0]; + postalCodeExt = strSplit[1]; + } + + // prepare the create address map + Map<String, Object> addrMap = FastMap.newInstance(); + addrMap.put("partyId", partyId); + addrMap.put("toName", addr.getContactName()); + addrMap.put("address1", addr.getAddress1()); + addrMap.put("address2", addr.getAddress2()); + addrMap.put("city", addr.getCity()); + addrMap.put("stateProvinceGeoId",addr.getRegion()); + addrMap.put("countryGeoId", addr.getCountryCode()); + addrMap.put("postalCode", postalCode); + addrMap.put("postalCodeExt", postalCodeExt); + addrMap.put("allowSolicitation", "Y"); + addrMap.put("contactMechPurposeTypeId", "GENERAL_LOCATION"); + addrMap.put("userLogin", system); // run as the system user + + // invoke the create address service + Map<String, Object> addrResp = dispatcher.runSync("createPartyPostalAddress", addrMap); + if (ServiceUtil.isError(addrResp)) { + throw new GeneralException("Unable to create new customer address record: " + + ServiceUtil.getErrorMessage(addrResp)); + } + String contactMechId = (String) addrResp.get("contactMechId"); + + Debug.logInfo("Created new address for partyId [" + partyId + "] :" + contactMechId, module); + return contactMechId; + } + + protected void addPurposeToAddress(String partyId, String contactMechId, int addrType) throws GeneralException { + // convert the int to a purpose type ID + String contactMechPurposeTypeId = getAddressType(addrType); + + // check to make sure the purpose doesn't already exist + List<GenericValue> values = delegator.findByAnd("PartyContactMechPurpose", UtilMisc.toMap("partyId", partyId, + "contactMechId", contactMechId, "contactMechPurposeTypeId", contactMechPurposeTypeId)); + + if (values == null || values.size() == 0) { + Map<String, Object> addPurposeMap = FastMap.newInstance(); + addPurposeMap.put("contactMechId", contactMechId); + addPurposeMap.put("partyId", partyId); + addPurposeMap.put("contactMechPurposeTypeId", contactMechPurposeTypeId); + addPurposeMap.put("userLogin", system); + + Map<String, Object> addPurposeResp = dispatcher.runSync("createPartyContactMechPurpose", addPurposeMap); + if (addPurposeResp != null && ServiceUtil.isError(addPurposeResp)) { + throw new GeneralException(ServiceUtil.getErrorMessage(addPurposeResp)); + } + } + } + + protected String getAddressType(int addrType) { + String contactMechPurposeTypeId = "GENERAL_LOCATION"; + switch(addrType) { + case SHIPPING_ADDRESS: + contactMechPurposeTypeId = "SHIPPING_LOCATION"; + break; + case BILLING_ADDRESS: + contactMechPurposeTypeId = "BILLING_LOCATION"; + break; + } + return contactMechPurposeTypeId; + } + + protected void setContactInfo(ShoppingCart cart, String contactMechPurposeTypeId, String infoString) throws GeneralException { + Map<String, Object> lookupMap = FastMap.newInstance(); + String cmId = null; + + String entityName = "PartyAndContactMech"; + if (contactMechPurposeTypeId.startsWith("PHONE_")) { + lookupMap.put("partyId", cart.getOrderPartyId()); + lookupMap.put("contactNumber", infoString); + entityName = "PartyAndTelecomNumber"; + } else if (contactMechPurposeTypeId.endsWith("_EMAIL")) { + lookupMap.put("partyId", cart.getOrderPartyId()); + lookupMap.put("infoString", infoString); + } else { + throw new GeneralException("Invalid contact mech type"); + } + + List<GenericValue> cmLookup; + try { + cmLookup = delegator.findByAnd(entityName, lookupMap, UtilMisc.toList("-fromDate")); + cmLookup = EntityUtil.filterByDate(cmLookup); + } catch (GenericEntityException e) { + Debug.logError(e, module); + throw e; + } + + if (cmLookup != null && cmLookup.size() > 0) { + GenericValue v = EntityUtil.getFirst(cmLookup); + if (v != null) { + cmId = v.getString("contactMechId"); + } + } else { + // create it + lookupMap.put("contactMechPurposeTypeId", contactMechPurposeTypeId); + lookupMap.put("userLogin", system); + Map<String, Object> createResp = null; + if (contactMechPurposeTypeId.startsWith("PHONE_")) { + try { + createResp = dispatcher.runSync("createPartyTelecomNumber", lookupMap); + } catch (GeneralException e) { + Debug.logError(e, module); + throw e; + } + } else if (contactMechPurposeTypeId.endsWith("_EMAIL")) { + lookupMap.put("emailAddress", lookupMap.get("infoString")); + lookupMap.put("allowSolicitation", "Y"); + try { + createResp = dispatcher.runSync("createPartyEmailAddress", lookupMap); + } catch (GeneralException e) { + Debug.logError(e, module); + throw e; + } + } + if (createResp == null || ServiceUtil.isError(createResp)) { + throw new GeneralException("Unable to create the request contact mech"); + } + + // get the created ID + cmId = (String) createResp.get("contactMechId"); + } + + if (cmId != null) { + cart.addContactMech(contactMechPurposeTypeId, cmId); + } + } + + // uses a unique order number each time so that the duplicate order check doesn't kick in +} \ No newline at end of file Propchange: ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleCheckoutHelper.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleCheckoutHelper.java ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleCheckoutHelper.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleCheckoutResponseEvents.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleCheckoutResponseEvents.java?rev=779907&r1=779906&r2=779907&view=diff ============================================================================== --- ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleCheckoutResponseEvents.java (original) +++ ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleCheckoutResponseEvents.java Fri May 29 09:43:39 2009 @@ -1,5 +1,3 @@ -package org.ofbiz.googlecheckout; - /** Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -18,8 +16,161 @@ specific language governing permissions and limitations under the License. **/ +package org.ofbiz.googlecheckout; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.util.Locale; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.ofbiz.base.util.Debug; +import org.ofbiz.base.util.GeneralException; +import org.ofbiz.base.util.UtilMisc; +import org.ofbiz.base.util.UtilValidate; +import org.ofbiz.entity.GenericDelegator; +import org.ofbiz.entity.GenericEntityException; +import org.ofbiz.entity.GenericValue; +import org.ofbiz.service.LocalDispatcher; +import org.w3c.dom.Document; + +import com.google.checkout.CheckoutException; +import com.google.checkout.notification.NewOrderNotification; +import com.google.checkout.util.Utils; public class GoogleCheckoutResponseEvents { + public static final String module = GoogleCheckoutResponseEvents.class.getName(); + + public static String checkNotification(HttpServletRequest request, HttpServletResponse response) { + LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher"); + GenericDelegator delegator = (GenericDelegator) request.getAttribute("delegator"); + + GoogleCheckoutHelper helper = new GoogleCheckoutHelper(dispatcher, delegator); + //String xmlString = helper.getTestResponseString(); // TODO: make this work with the info sent to the event + String xmlString = processGoogleCheckoutResponse(request,response); + // check and parse the document + Document document = null; + try { + document = Utils.newDocumentFromString(xmlString); + } catch (CheckoutException e) { + Debug.logError(e, module); + } + + // check the document type and process + if (document != null) { + String nodeValue = document.getDocumentElement().getNodeName(); + if ("new-order-notification".equals(nodeValue)) { + // handle create new order + NewOrderNotification info = new NewOrderNotification(document); + String serialNumber = info.getSerialNumber(); + try { + helper.createOrder(info, getProductStoreId(request), getWebsiteId(request), getCurrencyUom(request), getLocale(request)); + sendResponse(response, serialNumber, false); + } catch (GeneralException e) { + Debug.logError(e, module); + sendResponse(response, serialNumber, true); + return null; + } + } else { + Debug.logWarning("Unsupported document type submitted by Google; [" + nodeValue + "] has not yet been implemented.", module); + } + } + + return null; + } + public static String processGoogleCheckoutResponse(HttpServletRequest request, HttpServletResponse response) { + StringBuffer xmlBuff = new StringBuffer(); + try { + BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream())); + String inputLine; + while ((inputLine = in.readLine()) != null) { + xmlBuff.append(inputLine); + } + in.close(); + } catch (IOException e) { + Debug.logError(e, "Problems sending verification message", module); + } + + if(UtilValidate.isNotEmpty(xmlBuff.toString())) { + return xmlBuff.toString(); + } else { + return "error"; + } + } + private static void sendResponse(HttpServletResponse response, String serialNumber, boolean error) { + if (error) { + try { + response.sendError(500); + } catch (IOException e) { + Debug.logError(e, module); + } + } else { + PrintWriter out = null; + try { + out = response.getWriter(); + } catch (IOException e) { + Debug.logError(e, module); + } + if (out != null) { + out.println("<notification-acknowledgment xmlns=\"http://checkout.google.com/schema/2\" serial-number=\"" + serialNumber + "\"/>"); + out.close(); + } + } + } + + private static String getWebsiteId(HttpServletRequest request) { + return (String) request.getSession().getAttribute("webSiteId"); + } + + private static String getProductStoreId(HttpServletRequest request) { + GenericDelegator delegator = (GenericDelegator) request.getAttribute("delegator"); + String websiteId = getWebsiteId(request); + GenericValue website = null; + try { + website = delegator.findOne("WebSite", true, "webSiteId", websiteId); + } catch (GenericEntityException e) { + Debug.logError(e, module); + } + if (website != null) { + return website.getString("productStoreId"); + } + return null; + } + + private static String getCurrencyUom(HttpServletRequest request) { + GenericDelegator delegator = (GenericDelegator) request.getAttribute("delegator"); + String productStoreId = getProductStoreId(request); + GenericValue productStore = null; + try { + productStore = delegator.findOne("ProductStore", true, "productStoreId", productStoreId); + } catch (GenericEntityException e) { + Debug.logError(e, module); + } + if (productStore != null) { + return productStore.getString("defaultCurrencyUomId"); + } + return null; + } + private static Locale getLocale(HttpServletRequest request) { + GenericDelegator delegator = (GenericDelegator) request.getAttribute("delegator"); + String productStoreId = getProductStoreId(request); + GenericValue productStore = null; + try { + productStore = delegator.findOne("ProductStore", true, "productStoreId", productStoreId); + } catch (GenericEntityException e) { + Debug.logError(e, module); + } + if (productStore != null) { + String localeStr = productStore.getString("defaultLocaleString"); + if (localeStr != null) { + return UtilMisc.parseLocale(localeStr); + } + } + return null; + } } Added: ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleRequestServices.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleRequestServices.java?rev=779907&view=auto ============================================================================== --- ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleRequestServices.java (added) +++ ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleRequestServices.java Fri May 29 09:43:39 2009 @@ -0,0 +1,304 @@ +/** +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +**/ + +package org.ofbiz.googlecheckout; + +import java.util.List; +import java.util.Map; + +import org.ofbiz.base.util.Debug; +import org.ofbiz.base.util.GeneralException; +import org.ofbiz.base.util.UtilMisc; +import org.ofbiz.base.util.UtilValidate; +import org.ofbiz.entity.GenericDelegator; +import org.ofbiz.entity.GenericEntityException; +import org.ofbiz.entity.GenericValue; +import org.ofbiz.entity.util.EntityUtil; +import org.ofbiz.service.DispatchContext; +import org.ofbiz.service.ServiceUtil; + +import com.google.checkout.CheckoutException; +import com.google.checkout.MerchantInfo; +import com.google.checkout.orderprocessing.AddMerchantOrderNumberRequest; +import com.google.checkout.orderprocessing.ArchiveOrderRequest; +import com.google.checkout.orderprocessing.AuthorizeOrderRequest; +import com.google.checkout.orderprocessing.CancelOrderRequest; +import com.google.checkout.orderprocessing.ChargeOrderRequest; +import com.google.checkout.orderprocessing.RefundOrderRequest; +import com.google.checkout.orderprocessing.UnarchiveOrderRequest; +import com.google.checkout.orderprocessing.lineitem.CancelItemsRequest; +import com.google.checkout.orderprocessing.lineitem.ShipItemsRequest; + +public class GoogleRequestServices { + + private static final String module = GoogleRequestServices.class.getName(); + + public static Map<String, Object> sendOrderNumberRequest(DispatchContext dctx, Map<String, ? extends Object> context) { + GenericDelegator delegator = dctx.getDelegator(); + String orderId = (String) context.get("orderId"); + GenericValue order = findGoogleOrder(delegator, orderId); + if (order != null) { + MerchantInfo mInfo = getMerchantInfo(); + String externalId = order.getString("externalId"); + if (UtilValidate.isNotEmpty(externalId)) { + AddMerchantOrderNumberRequest aor = new AddMerchantOrderNumberRequest(mInfo, externalId, orderId); + try { + aor.send(); + } catch (CheckoutException e) { + Debug.logError(e, module); + } + } + } + + return ServiceUtil.returnSuccess(); + } + + public static Map<String, Object> sendAuthorizeRequest(DispatchContext dctx, Map<String, ? extends Object> context) { + GenericDelegator delegator = dctx.getDelegator(); + String orderId = (String) context.get("orderId"); + GenericValue order = findGoogleOrder(delegator, orderId); + if (order != null) { + MerchantInfo mInfo = getMerchantInfo(); + String externalId = order.getString("externalId"); + if (UtilValidate.isNotEmpty(externalId)) { + AuthorizeOrderRequest aor = new AuthorizeOrderRequest(mInfo, externalId); + try { + aor.send(); + } catch (CheckoutException e) { + Debug.logError(e, module); + } + } + } + + return ServiceUtil.returnSuccess(); + } + + // trigger on captureOrderPayments + public static Map<String, Object> sendChargeRequest(DispatchContext dctx, Map<String, ? extends Object> context) { + GenericDelegator delegator = dctx.getDelegator(); + String orderId = (String) context.get("orderId"); + GenericValue order = findGoogleOrder(delegator, orderId); + if (order != null) { + MerchantInfo mInfo = getMerchantInfo(); + String externalId = order.getString("externalId"); + if (UtilValidate.isNotEmpty(externalId)) { + Double amountToCharge = (Double) context.get("captureAmount"); + + ChargeOrderRequest cor = new ChargeOrderRequest(mInfo, externalId, amountToCharge.floatValue()); + try { + cor.send(); + } catch (CheckoutException e) { + Debug.logError(e, module); + } + } + } + + return ServiceUtil.returnSuccess(); + } + + // NOT IMPLEMENTED + public static Map<String, Object> sendReturnRequest(DispatchContext dctx, Map<String, ? extends Object> context) { + // Implement to use ReturnItemsRequest - send each item being returned + + // Check to see if the return is a refund return -- if so also send a RefundOrderRequest + + return ServiceUtil.returnSuccess(); + } + + public static Map<String, Object> sendShipRequest(DispatchContext dctx, Map<String, ? extends Object> context) { + GenericDelegator delegator = dctx.getDelegator(); + String shipmentId = (String) context.get("shipmentId"); + try { + sendItemsShipped(delegator, shipmentId); + } catch (GeneralException e) { + // TODO: handle the error + } + + return ServiceUtil.returnSuccess(); + } + + public static Map<String, Object> sendOrderCancelRequest(DispatchContext dctx, Map<String, ? extends Object> context) { + GenericDelegator delegator = dctx.getDelegator(); + String orderId = (String) context.get("orderId"); + GenericValue order = findGoogleOrder(delegator, orderId); + if (order != null) { + MerchantInfo mInfo = getMerchantInfo(); + String externalId = order.getString("externalId"); + if (UtilValidate.isNotEmpty(externalId)) { + CancelOrderRequest cor = new CancelOrderRequest(mInfo, externalId, "Order Cancelled", ""); // TODO: configure the reason and comment + try { + cor.send(); + } catch (CheckoutException e) { + Debug.logError(e, module); + } + } + } + + return ServiceUtil.returnSuccess(); + } + + public static Map<String, Object> sendOrderItemCancelRequest(DispatchContext dctx, Map<String, ? extends Object> context) { + GenericDelegator delegator = dctx.getDelegator(); + String orderId = (String) context.get("orderId"); + String orderItemSeqId = (String) context.get("orderItemSeqId"); + GenericValue order = findGoogleOrder(delegator, orderId); + if (order != null) { + GenericValue orderItem = null; + try { + orderItem = delegator.findOne("OrderItem", UtilMisc.toMap("orderId", orderId, "orderItemSeqId", orderItemSeqId), false); + } catch (GenericEntityException e) { + Debug.logError(e, module); + } + + if (orderItem != null) { + MerchantInfo mInfo = getMerchantInfo(); + String externalId = order.getString("externalId"); + if (UtilValidate.isNotEmpty(externalId)) { + CancelItemsRequest cir = new CancelItemsRequest(mInfo, externalId, "Item Cancelled", ""); // TODO: configure the reason and comment + cir.addItem(orderItem.getString("productId")); + try { + cir.send(); + } catch (CheckoutException e) { + Debug.logError(e, module); + } + } + } + } + + return ServiceUtil.returnSuccess(); + } + + public static Map<String, Object> sendArchiveOrderRequest(DispatchContext dctx, Map<String, ? extends Object> context) { + GenericDelegator delegator = dctx.getDelegator(); + String orderId = (String) context.get("orderId"); + GenericValue order = findGoogleOrder(delegator, orderId); + if (order != null) { + MerchantInfo mInfo = getMerchantInfo(); + String externalId = order.getString("externalId"); + if (UtilValidate.isNotEmpty(externalId)) { + ArchiveOrderRequest aor = new ArchiveOrderRequest(mInfo, externalId); + try { + aor.send(); + } catch (CheckoutException e) { + Debug.logError(e, module); + } + } + } + + return ServiceUtil.returnSuccess(); + } + + public static Map<String, Object> sendUnarchiveOrderRequest(DispatchContext dctx, Map<String, ? extends Object> context) { + GenericDelegator delegator = dctx.getDelegator(); + String orderId = (String) context.get("orderId"); + GenericValue order = findGoogleOrder(delegator, orderId); + if (order != null) { + MerchantInfo mInfo = getMerchantInfo(); + String externalId = order.getString("externalId"); + if (UtilValidate.isNotEmpty(externalId)) { + UnarchiveOrderRequest uor = new UnarchiveOrderRequest(mInfo, externalId); + try { + uor.send(); + } catch (CheckoutException e) { + Debug.logError(e, module); + } + } + } + + return ServiceUtil.returnSuccess(); + } + + private static void sendItemsShipped(GenericDelegator delegator, String shipmentId) throws GeneralException { + List<GenericValue> issued = delegator.findByAnd("ItemIssuance", UtilMisc.toMap("shipmentId", shipmentId)); + if (issued != null && issued.size() > 0) { + for (GenericValue issue : issued) { + String shipmentItemSeqId = issue.getString("shipmentItemSeqId"); + String productId = issue.getString("productId"); + String orderId = issue.getString("orderId"); + GenericValue order = findGoogleOrder(delegator, orderId); + String externalId = order.getString("externalId"); + + if (externalId != null) { + // locate the shipment package content record + Map<String, ? extends Object> spcLup = UtilMisc.toMap("shipmentId", shipmentId, "shipmentItemSeqId", shipmentItemSeqId); + + List<GenericValue> spc = delegator.findByAnd("ShipmentPackageContent", spcLup); + GenericValue packageContent = EntityUtil.getFirst(spc); + String carrier = null; + + if (packageContent != null) { + GenericValue shipPackage = packageContent.getRelatedOne("ShipmentPackage"); + + if (shipPackage != null) { + List<GenericValue> prs = shipPackage.getRelated("ShipmentPackageRouteSeg"); + GenericValue packageRoute = EntityUtil.getFirst(prs); + + if (packageRoute != null) { + List<GenericValue> srs = packageRoute.getRelated("ShipmentRouteSegment"); + GenericValue route = EntityUtil.getFirst(srs); + String track = packageRoute.getString("trackingCode"); + + if (route != null) { + carrier = route.getString("carrierPartyId"); + if (UtilValidate.isEmpty(track)) { + track = route.getString("trackingIdNumber"); + } + + try { + ShipItemsRequest isr = new ShipItemsRequest(getMerchantInfo(), externalId); + isr.addItemShippingInformation(productId, carrier, track); + isr.send(); + } catch (CheckoutException e) { + Debug.logError(e, module); + throw new GeneralException(e); + } + } + } + } + } + } + } + } + } + + public static GenericValue findGoogleOrder(GenericDelegator delegator, String orderId) { + GenericValue order = null; + try { + order = delegator.findOne("OrderHeader", false, "orderId", orderId); + } catch (GenericEntityException e) { + Debug.logError(e, module); + } + + if (order != null) { + String salesChannel = order.getString("salesChannelEnumId"); + if (GoogleCheckoutHelper.SALES_CHANNEL.equals(salesChannel)) { + return order; + } + } + + return null; + } + + public static MerchantInfo getMerchantInfo() { + // TODO: implement this to pull data from the properties file + MerchantInfo info = null; + + return info; + } +} Propchange: ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleRequestServices.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleRequestServices.java ------------------------------------------------------------------------------ svn:keywords = Date Rev Author URL Id Propchange: ofbiz/trunk/specialpurpose/googlecheckout/src/org/ofbiz/googlecheckout/GoogleRequestServices.java ------------------------------------------------------------------------------ svn:mime-type = text/plain |
Free forum by Nabble | Edit this page |