<% 'Reference Dictionaries - used inside object (Where to place these?) function UPS_dctResponseStatusCode set UPS_dctResponseStatusCode = Server.CreateObject("Scripting.Dictionary") UPS_dctResponseStatusCode.Add "200", "Request Processed succesfully." UPS_dctResponseStatusCode.Add "240", "Request Processed, some warnings exist. Check XML." UPS_dctResponseStatusCode.Add "250", "Request could not be processed. Check XML." UPS_dctResponseStatusCode.Add "500", "UPS OnLine Toole unavailable; try again later." end function function UPS_dctPickupTypes set UPS_dctPickupTypes = Server.CreateObject("Scripting.Dictionary") UPS_dctPickupTypes.Add "1", "Daily Pickup" UPS_dctPickupTypes.Add "3", "Customer Counter" UPS_dctPickupTypes.Add "6", "One Time Pickup" UPS_dctPickupTypes.Add "7", "On Call Air Pickup®" UPS_dctPickupTypes.Add "19", "Letter Center" UPS_dctPickupTypes.Add "20", "Air Service Center" end function function UPS_dctPackageTypes set UPS_dctPackageTypes = Server.CreateObject("Scripting.Dictionary") UPS_dctPackageTypes.Add "0", "Unknown" UPS_dctPackageTypes.Add "1", "UPS Letter" UPS_dctPackageTypes.Add "2", "Package" UPS_dctPackageTypes.Add "3", "UPS Tube" UPS_dctPackageTypes.Add "4", "UPS Pak" UPS_dctPackageTypes.Add "21", "UPS Express Box" UPS_dctPackageTypes.Add "24", "UPS 25Kg Box®" UPS_dctPackageTypes.Add "25", "UPS 10Kg Box®" end function function UPS_dctServiceCodes set UPS_dctServiceCodes = Server.CreateObject("Scripting.Dictionary") UPS_dctServiceCodes.Add "1", "UPS Next Day Air" UPS_dctServiceCodes.Add "2", "UPS 2nd Day Air" UPS_dctServiceCodes.Add "3", "UPS Ground" UPS_dctServiceCodes.Add "7", "UPS Worldwide ExpressSM" UPS_dctServiceCodes.Add "8", "UPS Worldwide ExpeditedSM" UPS_dctServiceCodes.Add "11", "UPS Standard" UPS_dctServiceCodes.Add "12", "UPS 3 Day Select®" UPS_dctServiceCodes.Add "13", "UPS Next Day Air Saver®" UPS_dctServiceCodes.Add "14", "UPS Next Day Air® Early A.M.®" UPS_dctServiceCodes.Add "54", "UPS Worldwide Express PlusSM" UPS_dctServiceCodes.Add "59", "UPS 2nd Day Air A.M.®" UPS_dctServiceCodes.Add "64", "N/A" UPS_dctServiceCodes.Add "65", "UPS Express Saver" end function 'Fix leading 0 function SafeUPSCode(intCode) if intCode < 10 then SafeUPSCode = "0" & intCode else SafeUPSCode = intCode end if end function function UPS_CustomerClassificationCode(intPickUpType) 'Based upon UPS's "Rates & Service Selection" [Appendix B - Table 6] Rate Chart usage based on pickup type and customer classification set UPS_CustomerClassificationCode = Server.CreateObject("Scripting.Dictionary") if IsNumeric(intPickUpType) then intPickUpType = CInt(intPickUpType) select case intPickUpType case 1 UPS_CustomerClassificationCode.Add "1", "Wholesale" UPS_CustomerClassificationCode.Add "3", "Occasional" UPS_CustomerClassificationCode.Add "4", "Retail" case 3, 6, 7, 19, 20 UPS_CustomerClassificationCode.Add "1", "Occasional" UPS_CustomerClassificationCode.Add "3", "Occasional" UPS_CustomerClassificationCode.Add "4", "Occasional" case 11 UPS_CustomerClassificationCode.Add "1", "Retail" UPS_CustomerClassificationCode.Add "3", "Retail" UPS_CustomerClassificationCode.Add "4", "Retail" case 20 end select end if end function class UPSManager private strUserName private strPassword private strLicense private blnDebug private aryShipments() private intShipments 'Sets public property let UserName(strInput) if not blnDebug then strUserName = strInput end property public property let Password(strInput) if not blnDebug then strPassword = strInput end property public property let License(strInput) if not blnDebug then strLicense = strInput end property public property let Debug(blnInput) if not blnDebug then blnDebug = blnInput end property 'Gets ?Do we want this available? public property get UserName() UserName = strUserName end property public property get Password() Password = strPassword end property public property get License() License = strLicense end property 'Constructor private sub Class_Initialize() blnDebug = false intShipments = 0 end sub 'Destructor private sub Class_Terminate() dim i 'Kill the Packages for i=0 to (intShipments-1) set aryShipments(i) = nothing next end sub public sub AddShipment(objShipment) redim preserve aryShipments(intShipments) set aryShipments(intShipments) = objShipment intShipments = intShipments + 1 end sub 'Used for debugging purposes public sub SetDebug() blnDebug = true strUserName = "awsadmin" strPassword = "5fingers" strLicense = "3BA97C3A90D4B3D2" response.write "**************** DEBUG MODE *********************
" end sub public function Init(UserNameStr, PasswordStr, LicenseStr) if not blnDebug then strUserName = UserNameStr strPassword = PasswordStr strLicense = LicenseStr ' response.write "**************** " & strUserName & " *********************
" end if end function public function Process() dim objShipment Process = false if not IsNull(strUserName) and not IsNull(strPassword) and not IsNull(strLicense) then for each objShipment in aryShipments Process = ConsumeXML( objShipment, HTTPPost( GetXMLAccessRequest() & GetXMLRateRequest(objShipment) ) ) if Process = false then exit function end if next end if end function private function GetXMLAccessRequest() GetXMLAccessRequest = GetXMLAccessRequest & "" & vbcrlf GetXMLAccessRequest = GetXMLAccessRequest & "" & vbcrlf GetXMLAccessRequest = GetXMLAccessRequest & "" & strLicense & "" & vbcrlf GetXMLAccessRequest = GetXMLAccessRequest & "" & strUserName & "" & vbcrlf GetXMLAccessRequest = GetXMLAccessRequest & "" & strPassword & "" & vbcrlf GetXMLAccessRequest = GetXMLAccessRequest & "" & vbcrlf if blnDebug then response.write "-------------------------------REQUEST----------------------------
" response.write Server.HTMLEncode(GetXMLAccessRequest) & "
" end if end function private function GetXMLRateRequest(objShipment) dim objPackage GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "Rating and Service" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "1.0001" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "Rate" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "shop" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "01" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "
" & vbcrlf if not IsNull(objShipment.ShipperCity) then GetXMLRateRequest = GetXMLRateRequest & "" & objShipment.ShipperCity & "" & vbcrlf end if if not IsNull(objShipment.ShipperState) then GetXMLRateRequest = GetXMLRateRequest & "" & objShipment.ShipperState & "" & vbcrlf end if if not IsNull(objShipment.ShipperCountryCode) then GetXMLRateRequest = GetXMLRateRequest & "" & objShipment.ShipperCountryCode & "" & vbcrlf end if 'Postal code required GetXMLRateRequest = GetXMLRateRequest & "" & objShipment.ShipperPostalCode & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "
" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "
" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "
" & vbcrlf if objShipment.Residential then GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf end if if not IsNull(objShipment.ShipToCity) then GetXMLRateRequest = GetXMLRateRequest & "" & objShipment.ShipToCity & "" & vbcrlf end if if not IsNull(objShipment.ShipToState) then GetXMLRateRequest = GetXMLRateRequest & "" & objShipment.ShipToState & "" & vbcrlf end if if not IsNull(objShipment.ShipToCountryCode) then GetXMLRateRequest = GetXMLRateRequest & "" & objShipment.ShipToCountryCode & "" & vbcrlf end if 'Postal code required GetXMLRateRequest = GetXMLRateRequest & "" & objShipment.ShipToPostalCode & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "
" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "
" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & SafeUPSCode(objShipment.ServiceCode) & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf for each objPackage in objShipment.Packages GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & SafeUPSCode(objPackage.PackageType) & "" & vbcrlf 'GetXMLRateRequest = GetXMLRateRequest & "Package" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf 'GetXMLRateRequest = GetXMLRateRequest & "Rate Shopping" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & objPackage.TotalWeight & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf next GetXMLRateRequest = GetXMLRateRequest & "" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "
" & vbcrlf GetXMLRateRequest = GetXMLRateRequest & "
" & vbcrlf if blnDebug then response.write Server.HTMLEncode(GetXMLRateRequest) & "
" response.write "------------------------------------------------------------------
" end if end function private function HTTPPost(strRequest) dim objHTTP set objHTTP = Server.CreateObject("Msxml2.XMLHTTP") if not blnDebug then objHTTP.open "post", "https://www.ups.com/ups.app/xml/Rate", false else objHTTP.open "post", "https://wwwcie.ups.com/ups.app/xml/Rate", false end if '---------------- TEST xml file -------------------- 'Uncomment for live objHTTP.send(strRequest) '---------------- TEST xml file -------------------- set HTTPPost = objHTTP end function 'The mama XML parser private function ConsumeXML(objShipment, objHTTP) dim dctResponseStatusCodes dim intResponseCode dim objXMLDOM dim objDOMROOT dim objDOMLISTShipment dim objDOMNODE dim objXMLNode dim objUPSRate set dctResponseStatusCodes = UPS_dctResponseStatusCode '---------------- TEST xml file -------------------- 'Uncomment for live intResponseCode = objHTTP.status '---------------- TEST xml file -------------------- if blnDebug then response.write "-------------------------------RESPONSE----------------------------
" response.write "STATUS CODE: " & intResponseCode & "
" response.write "STATUS MESSAGE: " & dctResponseStatusCodes( CStr(intResponseCode) ) & "
" end if if intResponseCode = 200 then ConsumeXML = true else ConsumeXML = false '---------------- TEST xml file -------------------- 'Uncomment for live exit function '---------------- TEST xml file -------------------- end if if blnDebug then response.write Server.HTMLEncode(objHTTP.responseXML.xml) & "
" response.write "------------------------------------------------------------------
" end if '---------------- TEST xml file -------------------- 'Comment for live 'set objXMLDOM = Server.CreateObject("Msxml2.DOMDocument") 'objXMLDOM.async = false 'objXMLDOM.resolveExternals = false 'objXMLDOM.load("D:\projects\anniescharmcloset\FixIt\response.xml") 'Loading from saved xml for test '---------------- TEST xml file -------------------- 'Consume shipment info '---------------- TEST xml file -------------------- 'Uncomment for live set objXMLDOM = objHTTP.responseXML '---------------- TEST xml file -------------------- set objDOMROOT = objXMLDOM.documentElement set objDOMLISTShipment = objDOMROOT.selectNodes("RatedShipment") for each objDOMNODE in objDOMLISTShipment set objUPSRate = new UPSRate 'Set Service type set objXMLNode = objDOMNODE.selectSingleNode("Service/Code") objUPSRate.ServiceCode = objXMLNode.text 'Transportation Cost set objXMLNode = objDOMNODE.selectSingleNode("TransportationCharges/MonetaryValue") objUPSRate.TransportCost = objXMLNode.text 'Total Cost set objXMLNode = objDOMNODE.selectSingleNode("TotalCharges/MonetaryValue") objUPSRate.TotalCost = objXMLNode.text objShipment.AddUPSRate(objUPSRate) next 'Show Rates if blnDebug then response.write "residential = " & objShipment.Residential & "
" & vbcrlf for each objUPSRate in objShipment.UPSRates response.write objUPSRate.ServiceName & ": " & FormatCurrency(objUPSRate.TotalCost) & "
" next end if set dctResponseStatusCodes = nothing '---------------- TEST xml file -------------------- 'Comment for live 'response.end '---------------- TEST xml file -------------------- set objHTTP = nothing end function end class class Shipment private intServiceCode 'See UPS_dctServiceCodes private strServiceName 'See UPS_dctServiceCodes private intPickupType 'See UPS_dctPickupTypes private blnResidential 'If is true then the is added private strShipperCity private chrShipperState private chrShipperCountryCode private lngShipperPostalCode private strShipToCity private chrShipToState private chrShipToCountryCode private lngShipToPostalCode private aryPackages() private intPackages private aryUPSRates() private intUPSRates 'Sets public property let ServiceCode(intInput) dim dctServiceCodes if IsNumeric(intInput) then intServiceCode = CInt(intInput) set dctServiceCodes = UPS_dctServiceCodes strServiceName = dctServiceCodes( CStr(intServiceCode) ) set dctServiceCodes = nothing end if end property public property let PickupType(intInput) if IsNumeric(intInput) then intPickupType = CInt(intInput) end property public property let ShipperCity(strInput) strShipperCity = strInput end property public property let ShipperState(chrInput) chrShipperState = chrInput end property public property let ShipperCountryCode(chrInput) chrShipperCountryCode = chrInput end property public property let ShipperPostalCode(lngInput) if IsNumeric(lngInput) then lngShipperPostalCode = CLng(lngInput) end property public property let ShipToCity(strInput) strShipToCity = strInput end property public property let ShipToState(chrInput) chrShipToState = chrInput end property public property let ShipToCountryCode(chrInput) chrShipToCountryCode = chrInput end property public property let ShipToPostalCode(lngInput) if IsNumeric(lngInput) then lngShipToPostalCode = CLng(lngInput) end property public property let Residential(blnInput) blnResidential = CBool(blnInput) end property 'Gets public property get ShipperCity() ShipperCity = strShipperCity end property public property get ShipperState() ShipperState = chrShipperState end property public property get ShipperCountryCode() ShipperCountryCode = chrShipperCountryCode end property public property get ShipperPostalCode() ShipperPostalCode = lngShipperPostalCode end property public property get ShipToCity() ShipToCity = strShipToCity end property public property get ShipToState() ShipToState = chrShipToState end property public property get ShipToCountryCode() ShipToCountryCode = chrShipToCountryCode end property public property get ShipToPostalCode() ShipToPostalCode = lngShipToPostalCode end property public property get Residential() Residential = blnResidential end property public property get ServiceCode() ServiceCode = intServiceCode end property public property get ServiceName() ServiceName = strServiceName end property public property get Packages() Packages = aryPackages end property public property get UPSRates() UPSRates = aryUPSRates end property 'Constructor private sub Class_Initialize() 'Set defaults dim dctServiceCodes set dctServiceCodes = UPS_dctServiceCodes intServiceCode = 3 'UPS Ground strServiceName = dctServiceCodes( CStr(intServiceCode) ) intPickupType = 1 'Daily Pickup intPackages = 0 intUPSRates = 0 blnResidential = false set dctServiceCodes = nothing end sub 'Destructor private sub Class_Terminate() dim i 'Kill the Packages for i=0 to (intPackages-1) set aryPackages(i) = nothing next 'Kill the Rates for i=0 to (intUPSRates-1) set aryUPSRates(i) = nothing next end sub public sub AddPackage(objPackage) redim preserve aryPackages(intPackages) set aryPackages(intPackages) = objPackage intPackages = intPackages + 1 end sub public sub AddUPSRate(objRate) redim preserve aryUPSRates(intUPSRates) set aryUPSRates(intUPSRates) = objRate intUPSRates = intUPSRates + 1 end sub end class class Package private dblContentWeight 'lbs private dblPackagingWeight 'lbs private intPackageType 'See UPS_dctPackageTypes private dblLength 'inches private dblWidth 'inches private dblHeight 'inches private strDescription 'Sets public property let ContentWeight(dblInput) if IsNumeric(dblInput) then dblContentWeight = CDbl(dblInput) end property public property let PackagingWeight(dblInput) if IsNumeric(dblInput) then dblPackagingWeight = CDbl(dblInput) end property public property let Length(dblInput) if IsNumeric(dblInput) then dblLength = CDbl(dblInput) end property public property let Width(dblInput) if IsNumeric(dblInput) then dblWidth = CDbl(dblInput) end property public property let Height(dblInput) if IsNumeric(dblInput) then dblHeight = CDbl(dblInput) end property public property let PackageType(intInput) if IsNumeric(intInput) then intPackageType = CInt(intInput) end property public property let Description(strInput) strDescription = strInput end property 'Gets public property get ContentWeight() ContentWeight = dblContentWeight end property public property get PackagingWeight() PackagingWeight = dblPackagingWeight end property public property get Length() Length = dblLength end property public property get Width() Width = dblWidth end property public property get Height() Height = dblHeight end property public property get PackageType() PackageType = intPackageType end property public property get Description() Description = strDescription end property public property get TotalWeight() TotalWeight = dblContentWeight + dblPackagingWeight end property 'Constructor private sub Class_Initialize() 'Set Standard dimensions dblLength = 11 dblWidth = 9 dblHeight = 4 dblContentWeight = 1 dblPackagingWeight = 0.5 intPackageType = 2 strDescription = "Rate Shopping" end sub end class class UPSRate 'Modeled from UPS:RatedShipment (www.ups.com) private curTransportCost private curTotalCost private intServiceCode private strServiceName 'Sets public property let ServiceCode(intInput) dim dctServiceCodes if IsNumeric(intInput) then intServiceCode = CInt(intInput) set dctServiceCodes = UPS_dctServiceCodes strServiceName = dctServiceCodes( CStr(intServiceCode) ) set dctServiceCodes = nothing end if end property public property let TransportCost(curInput) if IsNumeric(curInput) then curTransportCost = CCur(curInput) end property public property let TotalCost(curInput) if IsNumeric(curInput) then curTotalCost = CCur(curInput) end property 'Gets public property get TransportCost() TransportCost = curTransportCost end property public property get TotalCost() TotalCost = curTotalCost end property public property get ServiceCode() ServiceCode = intServiceCode end property public property get ServiceName() ServiceName = strServiceName end property end class %>