
in.succinct.plugins.ecommerce.integration.fedex.ShipWebServiceClient Maven / Gradle / Ivy
package in.succinct.plugins.ecommerce.integration.fedex;
import com.fedex.ship.stub.Address;
import com.fedex.ship.stub.AssociatedShipmentDetail;
import com.fedex.ship.stub.ClientDetail;
import com.fedex.ship.stub.CodCollectionType;
import com.fedex.ship.stub.CodDetail;
import com.fedex.ship.stub.CommercialInvoice;
import com.fedex.ship.stub.Commodity;
import com.fedex.ship.stub.CompletedPackageDetail;
import com.fedex.ship.stub.CompletedShipmentDetail;
import com.fedex.ship.stub.Contact;
import com.fedex.ship.stub.ContactAndAddress;
import com.fedex.ship.stub.CustomerReference;
import com.fedex.ship.stub.CustomerReferenceType;
import com.fedex.ship.stub.CustomsClearanceDetail;
import com.fedex.ship.stub.Dimensions;
import com.fedex.ship.stub.DropoffType;
import com.fedex.ship.stub.FreightBaseCharge;
import com.fedex.ship.stub.FreightRateDetail;
import com.fedex.ship.stub.FreightRateNotation;
import com.fedex.ship.stub.InternationalDocumentContentType;
import com.fedex.ship.stub.LabelFormatType;
import com.fedex.ship.stub.LabelSpecification;
import com.fedex.ship.stub.LinearUnits;
import com.fedex.ship.stub.Money;
import com.fedex.ship.stub.Notification;
import com.fedex.ship.stub.NotificationSeverityType;
import com.fedex.ship.stub.PackageOperationalDetail;
import com.fedex.ship.stub.PackageRateDetail;
import com.fedex.ship.stub.PackageRating;
import com.fedex.ship.stub.PackagingType;
import com.fedex.ship.stub.Party;
import com.fedex.ship.stub.Payment;
import com.fedex.ship.stub.PaymentType;
import com.fedex.ship.stub.Payor;
import com.fedex.ship.stub.ProcessShipmentReply;
import com.fedex.ship.stub.ProcessShipmentRequest;
import com.fedex.ship.stub.PurposeOfShipmentType;
import com.fedex.ship.stub.RequestedPackageLineItem;
import com.fedex.ship.stub.RequestedShipment;
import com.fedex.ship.stub.ServiceType;
import com.fedex.ship.stub.ShipPortType;
import com.fedex.ship.stub.ShipServiceLocator;
import com.fedex.ship.stub.ShipmentOperationalDetail;
import com.fedex.ship.stub.ShipmentRateDetail;
import com.fedex.ship.stub.ShipmentRating;
import com.fedex.ship.stub.ShipmentSpecialServiceType;
import com.fedex.ship.stub.ShipmentSpecialServicesRequested;
import com.fedex.ship.stub.ShippingDocument;
import com.fedex.ship.stub.ShippingDocumentImageType;
import com.fedex.ship.stub.ShippingDocumentPart;
import com.fedex.ship.stub.Surcharge;
import com.fedex.ship.stub.TrackingId;
import com.fedex.ship.stub.TransactionDetail;
import com.fedex.ship.stub.VersionId;
import com.fedex.ship.stub.WebAuthenticationCredential;
import com.fedex.ship.stub.WebAuthenticationDetail;
import com.fedex.ship.stub.Weight;
import com.fedex.ship.stub.WeightUnits;
import com.venky.core.log.SWFLogger;
import com.venky.core.math.DoubleHolder;
import com.venky.core.math.DoubleUtils;
import com.venky.core.string.StringUtil;
import com.venky.core.util.Bucket;
import com.venky.core.util.ObjectUtil;
import com.venky.swf.db.Database;
import com.venky.swf.db.JdbcTypeHelper.TypeConverter;
import com.venky.swf.db.annotations.column.ui.mimes.MimeType;
import com.venky.swf.routing.Config;
import in.succinct.plugins.ecommerce.db.model.catalog.Item;
import in.succinct.plugins.ecommerce.db.model.catalog.ItemCategory;
import in.succinct.plugins.ecommerce.db.model.catalog.MasterItemCategoryValue;
import in.succinct.plugins.ecommerce.db.model.catalog.UnitOfMeasure;
import in.succinct.plugins.ecommerce.db.model.catalog.UnitOfMeasureConversionTable;
import in.succinct.plugins.ecommerce.db.model.inventory.Sku;
import in.succinct.plugins.ecommerce.db.model.order.Manifest;
import in.succinct.plugins.ecommerce.db.model.order.Order;
import in.succinct.plugins.ecommerce.db.model.order.OrderAddress;
import in.succinct.plugins.ecommerce.db.model.order.OrderAttribute;
import in.succinct.plugins.ecommerce.db.model.order.OrderLine;
import in.succinct.plugins.ecommerce.db.model.order.OrderPrint;
import in.succinct.plugins.ecommerce.db.model.participation.Facility;
import in.succinct.plugins.ecommerce.db.model.participation.PreferredCarrier;
import org.apache.axis.types.NonNegativeInteger;
import org.apache.axis.types.PositiveInteger;
import java.io.ByteArrayInputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.stream.Collectors;
/**
* Sample code to call the FedEx Ship Service
*
* com.fedex.ship.stub is generated via WSDL2Java, like this:
*
* java org.apache.axis.wsdl.WSDL2Java -w -p com.fedex.ship.stub http://www.fedex.com/...../ShipService?wsdl
*
*
* This sample code has been tested with JDK 7 and Apache Axis 1.4
*/
//
//Sample code to call the FedEx Ship Service - GDE Express Domestic India Shipment
//
public class ShipWebServiceClient {
//
Order order = null;
Manifest manifest = null;
PreferredCarrier carrier = null;
public ShipWebServiceClient(Order order) {
this.order = order;
this.manifest = getManifest(order);
this.carrier = getCourier(manifest);
// manifestedLinesMap loaded in getManifest
}
public void ship(){
if (!carrier.getName().equalsIgnoreCase("FedEx")){
return;
}
ProcessShipmentRequest request = buildRequest(); // Build a request object
//
try {
// Initialize the service
ShipServiceLocator service;
ShipPortType port;
//
service = new ShipServiceLocator();
updateEndPoint(service);
port = service.getShipServicePort();
//
ProcessShipmentReply reply = port.processShipment(request); // This is the call to the ship web service passing in a request object and returning a reply object
//
if (isResponseOk(reply.getHighestSeverity())) // check if the call was successful
{
writeServiceOutput(reply);
}
printNotifications(reply.getNotifications());
//
} catch (Exception e) {
cat.log(Level.WARNING,e.getMessage(),e);
}
}
public Manifest getManifest(Order order) {
if (!ObjectUtil.equals(Order.FULFILLMENT_STATUS_MANIFESTED, order.getFulfillmentStatus())) {
throw new RuntimeException("Order is " + order.getFulfillmentStatus() + " cannot manifest.");
}
String manifestId = order.getAttribute("manifest_id").getValue();
Manifest manifest = Database.getTable(Manifest.class).get(Long.valueOf(manifestId));
return manifest;
}
//
private ProcessShipmentRequest buildRequest() {
ProcessShipmentRequest request = new ProcessShipmentRequest(); // Build a request object
request.setClientDetail(createClientDetail());
request.setWebAuthenticationDetail(createWebAuthenticationDetail());
//
TransactionDetail transactionDetail = new TransactionDetail();
transactionDetail.setCustomerTransactionId(String.valueOf(order.getId())); // The client will get the same value back in the response
request.setTransactionDetail(transactionDetail);
//
VersionId versionId = new VersionId("ship", 23, 0, 0);
request.setVersion(versionId);
//
RequestedShipment requestedShipment = new RequestedShipment();
requestedShipment.setShipTimestamp(Calendar.getInstance()); // Ship date and time
requestedShipment.setDropoffType(DropoffType.REGULAR_PICKUP);
requestedShipment.setServiceType(ServiceType.FEDEX_EXPRESS_SAVER); // Service types are STANDARD_OVERNIGHT, PRIORITY_OVERNIGHT, FEDEX_GROUND ...
requestedShipment.setPackagingType(PackagingType.YOUR_PACKAGING); // Packaging type FEDEX_BOX, FEDEX_PAK, FEDEX_TUBE, YOUR_PACKAGING, ...
//
requestedShipment.setShipper(addShipper()); // Sender information
//
requestedShipment.setRecipient(addRecipient());
//
requestedShipment.setShippingChargesPayment(addShippingChargesPayment());
//
//No Special Serivces needed.
//requestedShipment.setSpecialServicesRequested(addShipmentSpecialServicesRequested());
//
//Not Required as Domestic
requestedShipment.setCustomsClearanceDetail(addCustomsClearanceDetail());
//
requestedShipment.setLabelSpecification(addLabelSpecification());
//
requestedShipment.setPackageCount(new NonNegativeInteger("1"));
//
List packageLineItems = new ArrayList<>();
OrderLine box = null;
Bucket weight = new Bucket();
for (OrderLine ol :order.getOrderLines()){
ItemCategory bundleCategory = ol.getSku().getItem().getItemCategory("BUNDLE_CATEGORY");
if (ol.getManifestedQuantity() > 0 && bundleCategory != null && bundleCategory.getMasterItemCategoryValue().getAllowedValue().endsWith("Shipping Box")){
box = ol;
//packageLineItems.add(addRequestedPackageLineItem(ol));
}
Sku sku = ol.getSku();
double wt = ol.getManifestedQuantity() *
UnitOfMeasureConversionTable.convert(sku.getWeight(), UnitOfMeasure.MEASURES_WEIGHT, sku.getWeightUOM(), UnitOfMeasure.getWeightMeasure(UnitOfMeasure.KILOGRAMS));
weight.increment(wt);
}
if (box != null){
packageLineItems.add(addRequestedPackageLineItem(box,weight));
}else {
packageLineItems.add(addRequestedPackageLineItem(null,weight));
}
requestedShipment.setRequestedPackageLineItems(packageLineItems.toArray(new RequestedPackageLineItem[]{}));
request.setRequestedShipment(requestedShipment);
cat.warning("Input:\n" + AxisObjectUtil.serializeAxisObject(request));
//
return request;
}
//
private void writeServiceOutput(ProcessShipmentReply reply) throws Exception {
try {
cat.info("Output:\n" + AxisObjectUtil.serializeAxisObject(reply));
cat.info(reply.getTransactionDetail().getCustomerTransactionId());
CompletedShipmentDetail csd = reply.getCompletedShipmentDetail();
String masterTrackingNumber = printMasterTrackingNumber(csd);
Map map = order.getAttributeMap();
OrderAttribute attr = map.get("tracking_number");
attr.setValue(masterTrackingNumber);
printShipmentOperationalDetails(csd.getOperationalDetail());
printShipmentRating(csd.getShipmentRating(),map);
CompletedPackageDetail cpd[] = csd.getCompletedPackageDetails();
printPackageDetails(cpd);
saveShipmentDocumentsToFile(csd.getShipmentDocuments(), masterTrackingNumber);
getAssociatedShipmentLabels(csd.getAssociatedShipments());
order.saveAttributeMap(map);
} catch (Exception e) {
cat.log(Level.WARNING,e.getMessage(),e);
} finally {
//
}
}
private boolean isResponseOk(NotificationSeverityType notificationSeverityType) {
if (notificationSeverityType == null) {
return false;
}
if (notificationSeverityType.equals(NotificationSeverityType.WARNING) ||
notificationSeverityType.equals(NotificationSeverityType.NOTE) ||
notificationSeverityType.equals(NotificationSeverityType.SUCCESS)) {
return true;
}
return false;
}
SWFLogger cat = Config.instance().getLogger(getClass().getName());
private void printNotifications(Notification[] notifications) {
cat.info("Notifications:");
if (notifications == null || notifications.length == 0) {
cat.info(" No notifications returned");
}
for (int i = 0; i < notifications.length; i++) {
Notification n = notifications[i];
cat.warning(" Notification no. " + i + ": ");
if (n == null) {
continue;
}
NotificationSeverityType nst = n.getSeverity();
cat.warning(" Severity: " + (nst == null ? "null" : nst.getValue()));
cat.warning(" Code: " + n.getCode());
cat.warning(" Message: " + n.getMessage());
cat.warning(" Source: " + n.getSource());
}
}
private void printMoney(Money money, String description, String space) {
if (money != null) {
cat.info(space + description + ": " + money.getAmount() + " " + money.getCurrency());
}
}
private void printWeight(Weight weight, String description, String space) {
if (weight != null) {
cat.info(space + description + ": " + weight.getValue() + " " + weight.getUnits());
}
}
private Money addMoney(String currency, Double value) {
Money money = new Money();
money.setCurrency(currency);
money.setAmount(new BigDecimal(value));
return money;
}
private Weight addPackageWeight(Double packageWeight, WeightUnits weightUnits) {
Weight weight = new Weight();
weight.setUnits(weightUnits);
weight.setValue(new DoubleHolder(packageWeight,3).getHeldDouble());
cat.info("Package Weight = " + packageWeight) ;
return weight;
}
private Dimensions addPackageDimensions(Integer length, Integer height, Integer width, LinearUnits linearUnits) {
Dimensions dimensions = new Dimensions();
dimensions.setLength(new NonNegativeInteger(length.toString()));
dimensions.setHeight(new NonNegativeInteger(height.toString()));
dimensions.setWidth(new NonNegativeInteger(width.toString()));
dimensions.setUnits(linearUnits);
return dimensions;
}
private void printString(String value, String description, String space) {
if (value != null) {
cat.info(space + description + ": " + value);
}
}
//Shipment level reply information
private void printShipmentOperationalDetails(ShipmentOperationalDetail shipmentOperationalDetail) {
if (shipmentOperationalDetail != null) {
cat.info("Routing Details");
printString(shipmentOperationalDetail.getUrsaPrefixCode(), "URSA Prefix", " ");
if (shipmentOperationalDetail.getCommitDay() != null)
printString(shipmentOperationalDetail.getCommitDay().getValue(), "Service Commitment", " ");
printString(shipmentOperationalDetail.getAirportId(), "Airport Id", " ");
if (shipmentOperationalDetail.getDeliveryDay() != null)
printString(shipmentOperationalDetail.getDeliveryDay().getValue(), "Delivery Day", " ");
}
}
private void printShipmentRating(ShipmentRating shipmentRating, Map map) {
if (shipmentRating != null) {
cat.info("Shipment Rate Details");
ShipmentRateDetail[] srd = shipmentRating.getShipmentRateDetails();
for (int j = 0; j < srd.length; j++) {
map.get(carrier.getName()+"-RateType").setValue(srd[j].getRateType().getValue());
map.get(carrier.getName()+"-BillingWeight").setValue(srd[j].getTotalBillingWeight().getValue().toString());
Money money = srd[j].getTotalBaseCharge();
map.get(carrier.getName()+"-BaseCharge").setValue(money.getAmount().toString() + " " + money.getCurrency()) ;
money = srd[j].getTotalNetCharge();
map.get(carrier.getName()+"-NetCharge").setValue(money.getAmount().toString() + " " + money.getCurrency()) ;
money = srd[j].getTotalSurcharges();
map.get(carrier.getName()+ "-TotalSurcharge").setValue(money.getAmount().toString() + " " + money.getCurrency());
cat.info(" Rate Type: " + srd[j].getRateType().getValue());
printWeight(srd[j].getTotalBillingWeight(), "Shipment Billing Weight", " ");
printMoney(srd[j].getTotalBaseCharge(), "Shipment Base Charge", " ");
printMoney(srd[j].getTotalNetCharge(), "Shipment Net Charge", " ");
printMoney(srd[j].getTotalSurcharges(), "Shipment Total Surcharge", " ");
if (null != srd[j].getSurcharges()) {
cat.info(" Surcharge Details");
Surcharge[] s = srd[j].getSurcharges();
for (int k = 0; k < s.length; k++) {
printMoney(s[k].getAmount(), s[k].getSurchargeType().getValue(), " ");
}
}
printFreightDetail(srd[j].getFreightRateDetail());
}
}
}
//Package level reply information
private void printPackageOperationalDetails(PackageOperationalDetail packageOperationalDetail) {
if (packageOperationalDetail != null) {
cat.info(" Routing Details");
printString(packageOperationalDetail.getAstraHandlingText(), "Astra", " ");
printString(packageOperationalDetail.getGroundServiceCode(), "Ground Service Code", " ");
}
}
private void printPackageDetails(CompletedPackageDetail[] cpd) throws Exception {
if (cpd != null) {
cat.info("Package Details");
for (int i = 0; i < cpd.length; i++) { // Package details / Rating information for each package
String trackingNumber = cpd[i].getTrackingIds()[0].getTrackingNumber();
printTrackingNumbers(cpd[i]);
//
printPackageRating(cpd[i].getPackageRating());
// Write label buffer to file
ShippingDocument sd = cpd[i].getLabel();
saveLabelToFile(sd, trackingNumber);
printPackageOperationalDetails(cpd[i].getOperationalDetail());
}
}
}
private void printPackageRating(PackageRating packageRating) {
if (packageRating != null) {
cat.info("Package Rate Details");
PackageRateDetail[] prd = packageRating.getPackageRateDetails();
for (int j = 0; j < prd.length; j++) {
cat.info(" Rate Type: " + prd[j].getRateType().getValue());
printWeight(prd[j].getBillingWeight(), "Billing Weight", " ");
printMoney(prd[j].getBaseCharge(), "Base Charge", " ");
printMoney(prd[j].getNetCharge(), "Net Charge", " ");
printMoney(prd[j].getTotalSurcharges(), "Total Surcharge", " ");
if (null != prd[j].getSurcharges()) {
cat.info(" Surcharge Details");
Surcharge[] s = prd[j].getSurcharges();
for (int k = 0; k < s.length; k++) {
printMoney(s[k].getAmount(), s[k].getSurchargeType().getValue(), " ");
}
}
}
}
}
private void printTrackingNumbers(CompletedPackageDetail completedPackageDetail) {
if (completedPackageDetail.getTrackingIds() != null) {
TrackingId[] trackingId = completedPackageDetail.getTrackingIds();
for (int i = 0; i < trackingId.length; i++) {
String trackNumber = trackingId[i].getTrackingNumber();
String trackType = trackingId[i].getTrackingIdType().getValue();
String formId = trackingId[i].getFormId();
printString(trackNumber, trackType + " tracking number", " ");
printString(formId, "Form Id", " ");
}
}
}
private String getPayorAccountNumber() {
// See if payor account number is set as system property,
// if not default it to "XXX"
String payorAccountNumber = carrier.getAccountNumber();
if (payorAccountNumber == null) {
payorAccountNumber = "XXX"; // Replace "XXX" with the payor account number
}
return payorAccountNumber;
}
private Party addShipper() {
Party shipperParty = new Party(); // Sender information
Contact shipperContact = new Contact();
Facility facility = manifest.getPreferredCarrier().getFacility();
shipperContact.setPersonName(facility.getName());
shipperContact.setCompanyName(facility.getCompany().getName());
shipperContact.setPhoneNumber(facility.getPhoneNumber());
Address shipperAddress = new Address();
StringBuilder addressLine1 = new StringBuilder();
StringBuilder addressLine2 = new StringBuilder();
if (!ObjectUtil.isVoid(facility.getAddressLine1())){
addressLine1.append(facility.getAddressLine1());
}
if (!ObjectUtil.isVoid(facility.getAddressLine2())){
if (addressLine1.length() >0 ){
addressLine1.append(",");
}
addressLine1.append(facility.getAddressLine2());
}
if (!ObjectUtil.isVoid(facility.getAddressLine3())){
addressLine2.append(facility.getAddressLine3());
}
if (!ObjectUtil.isVoid(facility.getAddressLine4())){
if (addressLine2.length() >0 ){
addressLine2.append(",");
}
addressLine2.append(facility.getAddressLine4());
}
shipperAddress.setStreetLines(new String[]{addressLine1.toString(),addressLine2.toString()});
shipperAddress.setCity(facility.getCity().getName());
shipperAddress.setStateOrProvinceCode(facility.getState().getCode());
shipperAddress.setPostalCode(facility.getPinCode().getPinCode());
shipperAddress.setCountryCode(facility.getCountry().getIsoCode());
shipperAddress.setCountryName(facility.getCountry().getName());
shipperAddress.setResidential(false);
shipperParty.setContact(shipperContact);
shipperParty.setAddress(shipperAddress);
return shipperParty;
}
private Party addRecipient() {
Party recipient = new Party(); // Recipient information
List addresses = order.getAddresses().stream().filter(oa -> oa.getAddressType().equals(OrderAddress.ADDRESS_TYPE_SHIP_TO)).collect(Collectors.toList());
if (addresses.isEmpty()) {
throw new RuntimeException("No Shipto Address found for order " + order.getId());
}
OrderAddress shipTo = addresses.get(0);
Contact contactRecip = new Contact();
contactRecip.setPersonName(StringUtil.valueOf(shipTo.getFirstName()) + " " + StringUtil.valueOf(shipTo.getLastName()));
contactRecip.setCompanyName("");
contactRecip.setPhoneNumber(shipTo.getPhoneNumber());
recipient.setContact(contactRecip);
//
Address addressRecip = new Address();
StringBuilder addressLine1 = new StringBuilder();
StringBuilder addressLine2 = new StringBuilder();
if (!ObjectUtil.isVoid(shipTo.getAddressLine1())){
addressLine1.append(shipTo.getAddressLine1());
}
if (!ObjectUtil.isVoid(shipTo.getAddressLine2())){
if (addressLine1.length() >0 ){
addressLine1.append(",");
}
addressLine1.append(shipTo.getAddressLine2());
}
if (!ObjectUtil.isVoid(shipTo.getAddressLine3())){
addressLine2.append(shipTo.getAddressLine3());
}
if (!ObjectUtil.isVoid(shipTo.getAddressLine4())){
if (addressLine2.length() >0 ){
addressLine2.append(",");
}
addressLine2.append(shipTo.getAddressLine4());
}
addressRecip.setStreetLines(new String[]{addressLine1.toString(),addressLine2.toString()});
addressRecip.setCity(shipTo.getCity().getName());
addressRecip.setStateOrProvinceCode(shipTo.getState().getCode());
addressRecip.setPostalCode(shipTo.getPinCode().getPinCode());
addressRecip.setCountryCode(shipTo.getCountry().getIsoCode());
addressRecip.setCountryName(shipTo.getCountry().getName());
addressRecip.setResidential(new Boolean(true));
recipient.setAddress(addressRecip);
return recipient;
}
private ContactAndAddress addFinancialInstitutionParty() {
ContactAndAddress contactAndAddress = new ContactAndAddress(); // Recipient information
Contact contactRecip = new Contact();
contactRecip.setPersonName("Recipient Name");
contactRecip.setCompanyName("Recipient Company Name");
contactRecip.setPhoneNumber("1234567890");
contactAndAddress.setContact(contactRecip);
//
Address addressRecip = new Address();
addressRecip.setStreetLines(new String[]{"1 RECIPIENT STREET"});
addressRecip.setCity("NEWDELHI");
addressRecip.setStateOrProvinceCode("DL");
addressRecip.setPostalCode("110010");
addressRecip.setCountryCode("IN");
addressRecip.setCountryName("INDIA");
addressRecip.setResidential(new Boolean(false));
contactAndAddress.setAddress(addressRecip);
return contactAndAddress;
}
private Payment addShippingChargesPayment() {
Payment payment = new Payment(); // Payment information
payment.setPaymentType(PaymentType.SENDER);
Payor payor = new Payor();
Party responsibleParty = new Party();
responsibleParty.setAccountNumber(getPayorAccountNumber());
Address responsiblePartyAddress = new Address();
responsiblePartyAddress.setCountryCode("IN");
responsibleParty.setAddress(responsiblePartyAddress);
responsibleParty.setContact(new Contact());
payor.setResponsibleParty(responsibleParty);
payment.setPayor(payor);
return payment;
}
private Payment addDutiesPayment() {
Payment payment = new Payment(); // Payment information
if (carrier.isTaxesPaidBySender()){
payment.setPaymentType(PaymentType.SENDER);
}else {
payment.setPaymentType(PaymentType.RECIPIENT);
}
Payor payor = new Payor();
Party responsibleParty = addShipper();
payor.setResponsibleParty(responsibleParty);
responsibleParty.setAccountNumber(getPayorAccountNumber());
payment.setPayor(payor);
return payment;
}
private class ObjectHolder {
T value;
ObjectHolder(T value) {
this.value = value;
}
}
private RequestedPackageLineItem addRequestedPackageLineItem(OrderLine ol, Bucket weight) {
RequestedPackageLineItem requestedPackageLineItem = new RequestedPackageLineItem();
requestedPackageLineItem.setSequenceNumber(new PositiveInteger("1"));
requestedPackageLineItem.setGroupPackageCount(new NonNegativeInteger("1"));
if (ol != null){
Sku sku = ol.getSku();
double l = Math.ceil(UnitOfMeasureConversionTable.convert(sku.getLength(), UnitOfMeasure.MEASURES_LENGTH, sku.getLengthUOM(), UnitOfMeasure.getLengthMeasure(UnitOfMeasure.CENTIMETERS)));
double w = Math.ceil(UnitOfMeasureConversionTable.convert(sku.getWidth(), UnitOfMeasure.MEASURES_LENGTH, sku.getWidthUOM(), UnitOfMeasure.getLengthMeasure(UnitOfMeasure.CENTIMETERS)));
double h = Math.ceil(ol.getManifestedQuantity() * UnitOfMeasureConversionTable.convert(sku.getHeight(), UnitOfMeasure.MEASURES_LENGTH, sku.getHeightUOM(), UnitOfMeasure.getLengthMeasure(UnitOfMeasure.CENTIMETERS)));
requestedPackageLineItem.setDimensions(addPackageDimensions((int)l,(int)h,(int)w, LinearUnits.CM));
}
double wt = weight.doubleValue();
requestedPackageLineItem.setWeight(addPackageWeight(wt, WeightUnits.KG));
requestedPackageLineItem.setCustomerReferences(new CustomerReference[]{
addCustomerReference(CustomerReferenceType.CUSTOMER_REFERENCE.getValue(), String.valueOf(order.getReference())),
addCustomerReference(CustomerReferenceType.INVOICE_NUMBER.getValue(), order.getOrderNumber()),
addCustomerReference(CustomerReferenceType.P_O_NUMBER.getValue(), "B2C" ), //order.getOrderNumber()
addCustomerReference(CustomerReferenceType.DEPARTMENT_NUMBER.getValue(),carrier.isTaxesPaidBySender()? "BILL D/T: SENDER" : "BILL D/T: RECEIPIENT"),
});
return requestedPackageLineItem;
}
private ShipmentSpecialServicesRequested addShipmentSpecialServicesRequested() {
ShipmentSpecialServicesRequested shipmentSpecialServicesRequested = new ShipmentSpecialServicesRequested();
ShipmentSpecialServiceType shipmentSpecialServiceType[] = new ShipmentSpecialServiceType[1];
shipmentSpecialServiceType[0] = ShipmentSpecialServiceType.COD;
shipmentSpecialServicesRequested.setSpecialServiceTypes(shipmentSpecialServiceType);
CodDetail codDetail = new CodDetail();
codDetail.setCollectionType(CodCollectionType.CASH);
Money codMoney = new Money();
codMoney.setCurrency("INR");
codMoney.setAmount(new BigDecimal(400));
codDetail.setCodCollectionAmount(codMoney);
codDetail.setFinancialInstitutionContactAndAddress(addFinancialInstitutionParty());
codDetail.setRemitToName("Remitter");
shipmentSpecialServicesRequested.setCodDetail(codDetail);
return shipmentSpecialServicesRequested;
}
private CustomerReference addCustomerReference(String customerReferenceType, String customerReferenceValue) {
CustomerReference customerReference = new CustomerReference();
customerReference.setCustomerReferenceType(CustomerReferenceType.fromString(customerReferenceType));
customerReference.setValue(customerReferenceValue);
return customerReference;
}
private LabelSpecification addLabelSpecification() {
LabelSpecification labelSpecification = new LabelSpecification(); // Label specification
labelSpecification.setImageType(ShippingDocumentImageType.PNG);// Image types PDF, PNG, DPL, ...
labelSpecification.setLabelFormatType(LabelFormatType.COMMON2D); //LABEL_DATA_ONLY, COMMON2D
//labelSpecification.setLabelStockType(LabelStockType.value2); // STOCK_4X6.75_LEADING_DOC_TAB
//labelSpecification.setLabelPrintingOrientation(LabelPrintingOrientationType.TOP_EDGE_OF_TEXT_FIRST);
return labelSpecification;
}
private CustomsClearanceDetail addCustomsClearanceDetail() {
TypeConverter converter = order.getReflector().getJdbcTypeHelper().getTypeRef(Double.class).getTypeConverter();
order.setSellingPrice(converter.valueOf(order.getSellingPrice()));
CustomsClearanceDetail customs = new CustomsClearanceDetail(); // International details
customs.setDutiesPayment(addDutiesPayment());
customs.setCustomsValue(addMoney("INR", new DoubleHolder(Math.max(order.getSellingPrice(),1),2).getHeldDouble().doubleValue()));
customs.setDocumentContent(InternationalDocumentContentType.NON_DOCUMENTS);
customs.setCommercialInvoice(addCommercialInvoice());
List commodities = new ArrayList<>();
order.getOrderLines().forEach(ol->{
ol.setSellingPrice(converter.valueOf(ol.getSellingPrice()));
if (ol.getManifestedQuantity() > 0){
ItemCategory category = ol.getSku().getItem().getItemCategory("BUNDLE_CATEGORY");
if (category != null && ObjectUtil.equals(category.getMasterItemCategoryValue().getAllowedValue(),"Big Shipping Box")){
if (DoubleUtils.equals(order.getSellingPrice(),0)){
commodities.add(addCommodity(ol,1.0));
return;
}
}
commodities.add(addCommodity(ol,ol.getSellingPrice()));
}
});
if (!commodities.isEmpty()){
customs.setCommodities(commodities.toArray(new Commodity[]{}));// Commodity details
}
return customs;
}
private CommercialInvoice addCommercialInvoice() {
CommercialInvoice commercialInvoice = new CommercialInvoice();
commercialInvoice.setPurpose(PurposeOfShipmentType.SOLD);
/*
commercialInvoice.setCustomerReferences(new CustomerReference[]{
addCustomerReference(CustomerReferenceType.CUSTOMER_REFERENCE.getValue(), order.getReference()),
});
*/
return commercialInvoice;
}
private Commodity addCommodity(OrderLine ol,double price) {
Commodity commodity = new Commodity();
commodity.setNumberOfPieces(new NonNegativeInteger("1"));
Item item = ol.getSku().getItem();
ItemCategory itemCategory = item.getItemCategory("BUNDLE_CATEGORY");
if (itemCategory != null){
MasterItemCategoryValue value = itemCategory.getMasterItemCategoryValue();
if (value != null){
commodity.setDescription(value.getAllowedValue());
}
}
if (ObjectUtil.isVoid(commodity.getDescription())) {
commodity.setDescription(item.getName());
}
commodity.setCountryOfManufacture("IN");
commodity.setWeight(new Weight());
Bucket wt = new Bucket();
wt.increment(ol.getManifestedQuantity() * UnitOfMeasureConversionTable.convert(
ol.getReflector().getJdbcTypeHelper().getTypeRef(Double.class).getTypeConverter().valueOf(ol.getSku().getWeight()) ,
UnitOfMeasure.MEASURES_WEIGHT,ol.getSku().getWeightUOM().getName(),UnitOfMeasure.KILOGRAMS));
commodity.getWeight().setValue(new BigDecimal(wt.doubleValue()));
commodity.getWeight().setUnits(WeightUnits.KG);
commodity.setQuantity(new BigDecimal(ol.getManifestedQuantity()));
commodity.setQuantityUnits("EA");
commodity.setUnitPrice(new Money());
commodity.getUnitPrice().setAmount(new DoubleHolder(price/ol.getManifestedQuantity(), 2).getHeldDouble());
commodity.getUnitPrice().setCurrency("INR");
commodity.setCustomsValue(new Money());
commodity.getCustomsValue().setAmount(new DoubleHolder(price,2).getHeldDouble());
commodity.getCustomsValue().setCurrency("INR");
commodity.setCountryOfManufacture("IN");
ItemCategory hsn = ol.getSku().getItem().getItemCategory("HSN");
if (hsn != null){
String hsnCode = hsn.getMasterItemCategoryValue().getAllowedValue();
commodity.setHarmonizedCode(hsnCode);
}else {
//throw new RuntimeException("HSN Code not configured for item " + ol.getSku().getItem().getName());
}
cat.info("Commodity Weight " + ol.getId() + " = " +wt.doubleValue()) ;
return commodity;
}
private void printFreightDetail(FreightRateDetail freightRateDetail) {
if (freightRateDetail != null) {
cat.info(" Freight Details");
printFreightNotations(freightRateDetail);
printFreightBaseCharges(freightRateDetail);
}
}
private void printFreightNotations(FreightRateDetail frd) {
if (null != frd.getNotations()) {
cat.info(" Notations");
FreightRateNotation notations[] = frd.getNotations();
for (int n = 0; n < notations.length; n++) {
printString(notations[n].getCode(), "Code", " ");
printString(notations[n].getDescription(), "Notification", " ");
}
}
}
private void printFreightBaseCharges(FreightRateDetail frd) {
if (null != frd.getBaseCharges()) {
FreightBaseCharge baseCharges[] = frd.getBaseCharges();
for (int i = 0; i < baseCharges.length; i++) {
cat.info(" Freight Rate Details");
printString(baseCharges[i].getDescription(), "Description", " ");
printString(baseCharges[i].getFreightClass().getValue(), "Freight Class", " ");
printString(baseCharges[i].getRatedAsClass().getValue(), "Rated Class", " ");
printWeight(baseCharges[i].getWeight(), "Weight", " ");
printString(baseCharges[i].getChargeBasis().getValue(), "Charge Basis", " ");
printMoney(baseCharges[i].getChargeRate(), "Charge Rate", " ");
printMoney(baseCharges[i].getExtendedAmount(), "Extended Amount", " ");
printString(baseCharges[i].getNmfcCode(), "NMFC Code", " ");
}
}
}
private String printMasterTrackingNumber(CompletedShipmentDetail csd) {
String trackingNumber = "";
if (null != csd.getMasterTrackingId()) {
trackingNumber = csd.getMasterTrackingId().getTrackingNumber();
cat.info("Master Tracking Number");
cat.info(" Type: "
+ csd.getMasterTrackingId().getTrackingIdType());
cat.info(" Tracking Number: "
+ trackingNumber);
}
return trackingNumber;
}
//Saving and displaying shipping documents (labels)
private void saveLabelToFile(ShippingDocument shippingDocument, String trackingNumber) throws Exception {
ShippingDocumentPart[] sdparts = shippingDocument.getParts();
for (int a = 0; a < sdparts.length; a++) {
ShippingDocumentPart sdpart = sdparts[a];
String shippingDocumentType = shippingDocument.getType().getValue();
OrderPrint print = Database.getTable(OrderPrint.class).newRecord();
print.setOrderId(order.getId());
print.setDocumentType(OrderPrint.DOCUMENT_TYPE_CARRIER_LABEL);
print.setDocumentId(shippingDocumentType);
print.setImageContentType(MimeType.IMAGE_PNG.toString());
print.setImageContentName(shippingDocumentType + "." + trackingNumber + ".png");
print.setImage(new ByteArrayInputStream(sdpart.getImage()));
print.setImageContentSize(sdpart.getImage().length);
print.save();
}
}
private void saveShipmentDocumentsToFile(ShippingDocument[] shippingDocument, String trackingNumber) throws Exception {
if (shippingDocument != null) {
for (int i = 0; i < shippingDocument.length; i++) {
ShippingDocumentPart[] sdparts = shippingDocument[i].getParts();
for (int a = 0; a < sdparts.length; a++) {
ShippingDocumentPart sdpart = sdparts[a];
String labelName = shippingDocument[i].getType().getValue();
OrderPrint print = Database.getTable(OrderPrint.class).newRecord();
print.setOrderId(order.getId());
print.setDocumentType(OrderPrint.DOCUMENT_TYPE_CARRIER_LABEL);
print.setDocumentId(labelName);
print.setImageContentType(MimeType.IMAGE_PNG.toString());
print.setImageContentName(labelName + "." + trackingNumber + "_" + a + ".png");
print.setImage(new ByteArrayInputStream(sdpart.getImage()));
print.setImageContentSize(sdpart.getImage().length);
print.save();
}
}
}
}
private void getAssociatedShipmentLabels(AssociatedShipmentDetail[] associatedShipmentDetail) throws Exception {
if (associatedShipmentDetail != null) {
for (int j = 0; j < associatedShipmentDetail.length; j++) {
if (associatedShipmentDetail[j].getLabel() != null && associatedShipmentDetail[j].getType() != null) {
String trackingNumber = associatedShipmentDetail[j].getTrackingId().getTrackingNumber();
String associatedShipmentType = associatedShipmentDetail[j].getType().getValue();
ShippingDocument associatedShipmentLabel = associatedShipmentDetail[j].getLabel();
saveAssociatedShipmentLabelToFile(associatedShipmentLabel, trackingNumber, associatedShipmentType);
}
}
}
}
private void saveAssociatedShipmentLabelToFile(ShippingDocument shippingDocument, String trackingNumber, String labelName) throws Exception {
ShippingDocumentPart[] sdparts = shippingDocument.getParts();
for (int a = 0; a < sdparts.length; a++) {
ShippingDocumentPart sdpart = sdparts[a];
OrderPrint print = Database.getTable(OrderPrint.class).newRecord();
print.setOrderId(order.getId());
print.setDocumentType(OrderPrint.DOCUMENT_TYPE_CARRIER_LABEL);
print.setDocumentId(labelName);
print.setImageContentType(MimeType.IMAGE_PNG.toString());
print.setImageContentName(labelName + "." + trackingNumber + "_" + a + ".png");
print.setImage(new ByteArrayInputStream(sdpart.getImage()));
print.save();
}
}
private PreferredCarrier getCourier(Manifest manifest) {
return manifest.getPreferredCarrier();
}
private ClientDetail createClientDetail() {
ClientDetail clientDetail = new ClientDetail();
String accountNumber = carrier.getAccountNumber();
String meterNumber = carrier.getMeterNumber();
clientDetail.setAccountNumber(accountNumber);
clientDetail.setMeterNumber(meterNumber);
return clientDetail;
}
private WebAuthenticationDetail createWebAuthenticationDetail() {
WebAuthenticationCredential userCredential = new WebAuthenticationCredential();
userCredential.setKey(carrier.getApiKey());
userCredential.setPassword(carrier.getPassword());
WebAuthenticationCredential parentCredential = null;
Boolean useParentCredential = false; //Set this value to true is using a parent credential
if (useParentCredential) {
String parentKey = System.getProperty("parentkey");
String parentPassword = System.getProperty("parentpassword");
//
// See if the parentkey and parentpassword properties are set,
// if set use those values, otherwise default them to "XXX"
//
if (parentKey == null) {
parentKey = "XXX"; // Replace "XXX" with clients parent key
}
if (parentPassword == null) {
parentPassword = "XXX"; // Replace "XXX" with clients parent password
}
parentCredential = new WebAuthenticationCredential();
parentCredential.setKey(parentKey);
parentCredential.setPassword(parentPassword);
}
return new WebAuthenticationDetail(parentCredential, userCredential);
}
private void updateEndPoint(ShipServiceLocator serviceLocator) {
String endPoint = carrier.getIntegrationEndPoint() + "/ship";
if (endPoint != null) {
serviceLocator.setShipServicePortEndpointAddress(endPoint);
}
}
}