public void TestShipmentDetailed()
        {
            var shipment = ShipmentFluent <Shipment> .Create()
                           .ToAddress((Address)AddressFluent <Address> .Create()
                                      .AddressLines("643 Greenway RD")
                                      .PostalCode("28607")
                                      .CountryCode("US")
                                      .Verify() // calls the service for address validation - will populate city and state from the zip
                                      )
                           .MinimalAddressValidation("true")
                           //.ShipperRatePlan(Globals.DefaultSession.GetConfigItem("RatePlan")) // use if you have a custom rate plan
                           .FromAddress((Address)AddressFluent <Address> .Create()
                                        .Company("Pitney Bowes Inc.")
                                        .AddressLines("27 Waterview Drive")
                                        .Residential(false)
                                        .CityTown("Shelton")
                                        .StateProvince("CT")
                                        .PostalCode("06484")
                                        .CountryCode("US")
                                        .Person("Paul Wright", "203-555-1213", "*****@*****.**")
                                        )
                           .Parcel((Parcel)ParcelFluent <Parcel> .Create()
                                   .Dimension(12, 12, 10)
                                   .Weight(16m, UnitOfWeight.OZ)
                                   )
                           .Rates(RatesArrayFluent <Rates> .Create()
                                  .USPSPriority <Rates, Parameter>()
                                  .InductionPostalCode("06484")
                                  )
                           .Documents((List <IDocument>)DocumentsArrayFluent <Document> .Create()
                                      .ShippingLabel(ContentType.BASE64, Size.DOC_4X6, FileFormat.ZPL2)
                                      )
                           .ShipmentOptions(ShipmentOptionsArrayFluent <ShipmentOptions> .Create()
                                            .ShipperId(Globals.DefaultSession.GetConfigItem("ShipperID"))
                                            .AddToManifest()
                                            )
                           .TransactionId(Guid.NewGuid().ToString().Substring(15));


            var label = Api.CreateShipment((Shipment)shipment).GetAwaiter().GetResult();

            Assert.NotNull(label);
            Assert.True(label.Success);
            Assert.NotNull(label.ResponseObject as Shipment);
            Assert.NotNull(label.APIResponse.ParcelTrackingNumber);
            Assert.True(label.APIResponse.ParcelTrackingNumber != string.Empty);

            // var trackingRequest = new TrackingRequest
            // {
            //     Carrier = Carrier.USPS,
            //     TrackingNumber = label.APIResponse.ParcelTrackingNumber
            // };
            // var trackingResponse = Api.Tracking<TrackingStatus>(trackingRequest).GetAwaiter().GetResult();

            // Parcel Reprint
            var reprintRequest = new ReprintShipmentRequest()
            {
                Shipment = label.APIResponse.ShipmentId
            };

            var reprintResponse = Api.ReprintShipment <Shipment>(reprintRequest).GetAwaiter().GetResult();

            Assert.NotNull(reprintResponse);
            Assert.True(reprintResponse.Success);
            Assert.NotNull(reprintResponse.ResponseObject as Shipment);
            Assert.NotNull(reprintResponse.APIResponse.ParcelTrackingNumber);
            Assert.True(reprintResponse.APIResponse.ParcelTrackingNumber != string.Empty);

            using (var labelStream = new MemoryStream())
            {
                foreach (var d in reprintResponse.APIResponse.Documents)
                {
                    if (d.ContentType == ContentType.BASE64 && d.FileFormat == FileFormat.PNG)
                    {
                        // Multiple page png document
                        Api.WriteToStream(d, null,

                                          (stream, page) => // callback for each page
                        {
                            // append to the memory stream
                            return(labelStream);
                        },
                                          disposeStream: false
                                          ).GetAwaiter().GetResult();
                    }
                    else
                    {
                        Api.WriteToStream(d, labelStream).GetAwaiter().GetResult();
                    }
                }
                Assert.True(labelStream.Length > 0);
            }

            // manifest
            var manifest = ManifestFluent <Manifest> .Create()
                           .Carrier(Carrier.USPS)
                           .FromAddress(((Shipment)shipment).FromAddress)
                           .InductionPostalCode("06484")
                           .SubmissionDate(DateTime.Now)
                           .AddParameter <Parameter>(ManifestParameter.SHIPPER_ID, Globals.DefaultSession.GetConfigItem("ShipperID"))
                           .TransactionId(Guid.NewGuid().ToString().Substring(15));

            var manifestResponse = Api.CreateManifest <Manifest>(manifest).GetAwaiter().GetResult();

            Assert.NotNull(manifestResponse);
            if (manifestResponse.Success)
            {
                Assert.NotNull(manifestResponse.ResponseObject);
            }
            else
            {
                // making a shipment available to manifest seems to be an async process and the shipment just created might
                // not be available
                Assert.True(manifestResponse.Errors.Count == 1);
                Assert.True(manifestResponse.Errors[0].ErrorCode == "1110019");
            }

            using (var manifestStream = new MemoryStream())
            {
                foreach (var d in manifestResponse.APIResponse.Documents)
                {
                    Api.WriteToStream(d, manifestStream).GetAwaiter().GetResult();
                }
                Assert.True(manifestStream.Length > 0);
            }

            // Cancel the label

            var cancelRequest = new CancelShipmentRequest
            {
                Carrier          = Carrier.USPS,
                CancelInitiator  = CancelInitiator.SHIPPER,
                TransactionId    = Guid.NewGuid().ToString().Substring(15),
                ShipmentToCancel = label.APIResponse.ShipmentId
            };
            var cancelResponse = Api.CancelShipment(cancelRequest).GetAwaiter().GetResult();

            Assert.NotNull(cancelResponse);
            Assert.True(cancelResponse.Success);
            Assert.NotNull(cancelResponse.ResponseObject);
        }
Exemple #2
0
        static void Main(string[] args)
        {
            #region Example program setup
            SetupConfigProvider();
            SetupApiKey();
            #endregion

            #region ConfigureFramework

            var sandbox = new Session()
            {
                EndPoint = "https://api-sandbox.pitneybowes.com", Requester = new ShippingApiHttpRequest()
            };

            // Initialize framework

            // Hook in your concrete classes
            Model.RegisterSerializationTypes(sandbox.SerializationRegistry);

            // Hook in your config provider
            sandbox.GetConfigItem = (s) => Configuration[s];

            // Hook in your logger
            sandbox.LogWarning     = (s) => Logger.LogWarning(s);
            sandbox.LogError       = (s) => Logger.LogError(s);
            sandbox.LogConfigError = (s) => Logger.LogCritical(s);
            sandbox.LogDebug       = (s) => Logger.LogInformation(s);

            // Hook in your secure API key decryption
            sandbox.GetApiSecret = GetApiKey;

            if (Configuration["Mock"] == "true")
            {
                sandbox.Requester = new ShippingAPIMock();
            }

            Globals.DefaultSession = sandbox;
            #endregion
            #region CreateShipment

            try
            {
                // Create shipment
                var shipment = ShipmentFluent <Shipment> .Create()
                               .ToAddress((Address)AddressFluent <Address> .Create()
                                          .AddressLines("643 Greenway RD")
                                          .PostalCode("28607")
                                          .CountryCode("US")
                                          .Verify() // calls the service for address validation - will populate city and state from the zip
                                          )
                               .MinimalAddressValidation("true")
                               //.ShipperRatePlan(Globals.DefaultSession.GetConfigItem("RatePlan")) // use if you have a custom rate plan
                               .FromAddress((Address)AddressFluent <Address> .Create()
                                            .Company("Pitney Bowes Inc.")
                                            .AddressLines("27 Waterview Drive")
                                            .Residential(false)
                                            .CityTown("Shelton")
                                            .StateProvince("CT")
                                            .PostalCode("06484")
                                            .CountryCode("US")
                                            .Person("Paul Wright", "203-555-1213", "*****@*****.**")
                                            )
                               .Parcel((Parcel)ParcelFluent <Parcel> .Create()
                                       .Dimension(12, 12, 10)
                                       .Weight(16m, UnitOfWeight.OZ)
                                       )
                               .Rates(RatesArrayFluent <Rates> .Create()
                                      .USPSPriority <Rates, Parameter>()
                                      .InductionPostalCode("06484")
                                      )
                               .Documents((List <IDocument>)DocumentsArrayFluent <Document> .Create()
                                          .ShippingLabel(ContentType.BASE64, Size.DOC_4X6, FileFormat.ZPL2)
                                          )
                               .ShipmentOptions(ShipmentOptionsArrayFluent <ShipmentOptions> .Create()
                                                .ShipperId(sandbox.GetConfigItem("ShipperID"))
                                                .AddToManifest()
                                                )
                               .TransactionId(Guid.NewGuid().ToString().Substring(15));


                var label = Api.CreateShipment((Shipment)shipment).GetAwaiter().GetResult();

                #endregion
                #region UseShipment
                if (label.Success)
                {
                    Console.WriteLine(label.APIResponse.ParcelTrackingNumber);

                    // Tracking

                    var trackingRequest = new TrackingRequest
                    {
                        Carrier        = Carrier.USPS,
                        TrackingNumber = label.APIResponse.ParcelTrackingNumber
                    };
                    var trackingResponse = Api.Tracking <TrackingStatus>(trackingRequest).GetAwaiter().GetResult();

                    // Parcel Reprint
                    var reprintRequest = new ReprintShipmentRequest()
                    {
                        Shipment = label.APIResponse.ShipmentId
                    };

                    var reprintResponse = Api.ReprintShipment <Shipment>(reprintRequest).GetAwaiter().GetResult();

                    // Write the label to disk
                    foreach (var d in reprintResponse.APIResponse.Documents)
                    {
                        if (d.ContentType == ContentType.BASE64 && d.FileFormat == FileFormat.PNG)
                        {
                            // Multiple page png document
                            Api.WriteToStream(d, null,

                                              (stream, page) => // callback for each page
                            {
                                // create a new file

                                if (stream != null)
                                {
                                    stream.Dispose();
                                }
                                string fileName = string.Format("{0}{1}p{2}.{3}", Path.GetTempPath(), reprintResponse.APIResponse.ShipmentId, page.ToString(), d.FileFormat.ToString());
                                Console.WriteLine("Document written to " + fileName);
                                return(new FileStream(fileName, FileMode.OpenOrCreate));
                            },
                                              disposeStream: true
                                              ).GetAwaiter().GetResult();
                        }
                        else
                        {
                            string fileName = string.Format("{0}{1}.{2}", Path.GetTempPath(), reprintResponse.APIResponse.ShipmentId, d.FileFormat.ToString());
                            using (StreamWriter sw = new StreamWriter(fileName))
                            {
                                Api.WriteToStream(d, sw.BaseStream).GetAwaiter().GetResult();
                                Console.WriteLine("Document written to " + fileName);
                            }
                        }
                    }
                }
                #endregion
                #region CreateManifest

                // Create the manifest

                var manifest = ManifestFluent <Manifest> .Create()
                               .Carrier(Carrier.USPS)
                               .FromAddress(((Shipment)shipment).FromAddress)
                               .InductionPostalCode("06484")
                               .SubmissionDate(DateTime.Now)
                               .AddParameter <Parameter>(ManifestParameter.SHIPPER_ID, sandbox.GetConfigItem("ShipperID"))
                               .TransactionId(Guid.NewGuid().ToString().Substring(15));

                var manifestResponse = Api.CreateManifest <Manifest>(manifest).GetAwaiter().GetResult();
                #endregion
                #region UseManifest
                if (manifestResponse.Success)
                {
                    foreach (var d in manifestResponse.APIResponse.Documents)
                    {
                        string fileName = string.Format("{0}{1}.{2}", Path.GetTempPath(), manifestResponse.APIResponse.ManifestId, d.FileFormat.ToString());
                        try
                        {
                            using (StreamWriter sw = new StreamWriter(fileName))
                            {
                                Api.WriteToStream(d, sw.BaseStream).GetAwaiter().GetResult();
                                Console.WriteLine("Document written to " + fileName);
                            }
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e.Message);
                        }
                    }
                }
                #endregion
                #region SchedulePickup
                // Schedule a pickup

                var pickup = PickupFluent <Pickup> .Create()
                             .Carrier(Carrier.USPS)
                             .PackageLocation(PackageLocation.MailRoom)
                             .PickupAddress(((Shipment)shipment).FromAddress)
                             .PickupDate(DateTime.Now.AddDays(1))
                             .AddPickupSummary <PickupCount, ParcelWeight>(PickupService.PM, 1, 16M, UnitOfWeight.OZ)
                             .TransactionId(Guid.NewGuid().ToString().Substring(15));

                var pickupResponse = Api.Schedule <Pickup>(pickup).GetAwaiter().GetResult();
                #endregion
                #region UsePickup
                // Cancel pickup

                if (pickupResponse.Success)
                {
                    pickup.Cancel();
                }

                // Cancel the label

                if (label.Success)
                {
                    var cancelRequest = new CancelShipmentRequest
                    {
                        Carrier          = Carrier.USPS,
                        CancelInitiator  = CancelInitiator.SHIPPER,
                        TransactionId    = Guid.NewGuid().ToString().Substring(15),
                        ShipmentToCancel = label.APIResponse.ShipmentId
                    };
                    var cancelResponse = Api.CancelShipment(cancelRequest).GetAwaiter().GetResult();
                }
                #endregion
                #region TransactionReports
                // Transaction report with IEnumerable

                var transactionsReportRequest = new ReportRequest()
                {
                    FromDate    = DateTimeOffset.Parse("6/30/2019"),
                    ToDate      = DateTimeOffset.Now,
                    DeveloperId = sandbox.GetConfigItem("DeveloperID")
                };
                foreach (var t in TransactionsReport <Transaction> .Report(transactionsReportRequest, x => x.CreditCardFee == null || x.CreditCardFee > 10.0M, maxPages: 2))
                {
                    Console.WriteLine(t.DestinationAddress);
                }

                // Transaction report with LINQ
                TransactionsReport <Transaction> report = new TransactionsReport <Transaction>(sandbox.GetConfigItem("DeveloperID"), maxPages: 2);
                var query = from transaction in report
                            where transaction.TransactionDateTime >= DateTimeOffset.Parse("6/30/2019") && transaction.TransactionDateTime <= DateTimeOffset.Now && transaction.TransactionType == TransactionType.POSTAGE_PRINT
                            select new { transaction.TransactionId };
                foreach (var obj in query)
                {
                    Console.WriteLine(obj);
                }

                #endregion
                #region CarrierRules

                // Download the carrier rules
                var req = new RatingServicesRequest()
                {
                    Carrier                = Carrier.USPS,
                    OriginCountryCode      = "US",
                    DestinationCountryCode = "US"
                };
                var res = CarrierRulesMethods.RatingServices(req).GetAwaiter().GetResult();
                if (res.Success)
                {
                    // validate a shipment
                    var v = new ShipmentValidator();
                    if (!v.Validate((Shipment)shipment, res.APIResponse))
                    {
                        Console.WriteLine("Shipment is not valid: {0}", v.Reason);
                    }

                    // do some interesting things with the rules
                    var ruleRep = new RuleReport
                    {
                        CarrierRules = new CarrierRule[1] {
                            res.APIResponse
                        }
                    };

                    // find possible services to fit a parcel
                    var to     = ((Shipment)shipment).ToAddress;
                    var from   = ((Shipment)shipment).FromAddress;
                    var parcel = ((Shipment)shipment).Parcel;

                    // match countries
                    ruleRep.CarrierRuleFilter = (rule) => rule.OriginCountry == from.CountryCode && rule.DestinationCountry == to.CountryCode;
                    // make sure parcel fits, is trackable and supports insurance, commercial base pricing
                    ruleRep.ParcelTypeRuleFilter = (rule) =>
                                                   rule.FitsDimensions(parcel.Dimension) &&
                                                   rule.HoldsWeight(parcel.Weight) &&
                                                   !(rule.Trackable == Trackable.NON_TRACKABLE) &&
                                                   rule.SpecialServiceRules.ContainsKey(SpecialServiceCodes.Ins) &&
                                                   rule.RateTypeId == "CONTRACT_RATES";

                    Shipment cheapestOption = null;
                    foreach (var ruleItem in ruleRep)
                    {
                        // create the shipment from looked up values
                        var newShipment = ShipmentFluent <Shipment> .Create()
                                          .ToAddress(to)
                                          .FromAddress(from)
                                          .MinimalAddressValidation("true")
                                          //.ShipperRatePlan(Globals.DefaultSession.GetConfigItem("RatePlan"))
                                          .Parcel(parcel)
                                          .Rates(RatesArrayFluent <Rates> .Create()
                                                 .Add()
                                                 .RateFromRule(ruleItem.Item1, ruleItem.Item2, ruleItem.Item3)
                                                 .SpecialServiceFromRule <Rates, SpecialServices>(ruleItem.Item4)
                                                 .SuggestedTrackingServiceFromRule <Rates, SpecialServices>(ruleItem.Item3)
                                                 .InductionPostalCode(from.PostalCode)
                                                 )
                                          .Documents((List <IDocument>)DocumentsArrayFluent <Document> .Create()
                                                     .ShippingLabel()
                                                     )
                                          .ShipmentOptions(ShipmentOptionsArrayFluent <ShipmentOptions> .Create()
                                                           .ShipperId(sandbox.GetConfigItem("ShipperID"))
                                                           .AddToManifest()
                                                           )
                                          .TransactionId(Guid.NewGuid().ToString().Substring(15));

                        // rate the parcel
                        var ratesResponse = Api.Rates <Shipment>((Shipment)newShipment).GetAwaiter().GetResult();
                        if (ratesResponse.Success)
                        {
                            if (cheapestOption == null || ratesResponse.APIResponse.Rates.First().TotalCarrierCharge < cheapestOption.Rates.First().TotalCarrierCharge)
                            {
                                cheapestOption = ratesResponse.APIResponse;
                            }
                            Console.WriteLine("{0},{1},{2},{3},{4},{5},{6} --- ${7}",
                                              ruleItem.Item1.Carrier,
                                              ruleItem.Item1.OriginCountry,
                                              ruleItem.Item1.DestinationCountry,
                                              ruleItem.Item2.ServiceId,
                                              ruleItem.Item3.ParcelType,
                                              ruleItem.Item3.RateTypeId,
                                              ruleItem.Item4 == null ? String.Empty : ruleItem.Item4.SpecialServiceId.ToString(),
                                              ratesResponse.APIResponse.Rates.First().TotalCarrierCharge);
                        }
                    }
                    //get the label
                    cheapestOption.TransactionId = Guid.NewGuid().ToString().Substring(15);
                    var newLabel = Api.CreateShipment(cheapestOption).GetAwaiter().GetResult();
                    if (newLabel.Success)
                    {
                        string fileName = string.Format("{0}{1}.{2}", Path.GetTempPath(), newLabel.APIResponse.ShipmentId, "PDF");
                        using (StreamWriter sw = new StreamWriter(fileName))
                        {
                            Api.WriteToStream(newLabel.APIResponse.Documents.First(), sw.BaseStream).GetAwaiter().GetResult();
                            Console.WriteLine("Document written to " + fileName);
                        }
                    }
                }
                foreach (var u in sandbox.Counters.Keys)
                {
                    Console.WriteLine(u);
                    Console.WriteLine("Errors: {0}", sandbox.Counters[u].ErrorCount);
                    foreach (var b in sandbox.Counters[u].CallHistogram.Keys)
                    {
                        Console.WriteLine("{0} {1}", 10 * b, sandbox.Counters[u].CallHistogram[b]);
                    }
                }
            }
            catch (ShippingAPIException e)
            {
                Console.WriteLine("ShippingAPI exception" + e.Message);
                if (e.ErrorResponse != null && e.ErrorResponse.Errors != null)
                {
                    foreach (var l in e.ErrorResponse.Errors)
                    {
                        Console.WriteLine(l.ErrorCode + " " + l.Message);
                    }
                }
            }

            #endregion
        }